evmtest

package
v2.16.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 2, 2026 License: BSD-2-Clause Imports: 40 Imported by: 0

Documentation

Overview

Copyright (c) 2023-2024 Nibi, Inc.

Copyright (c) 2023-2024 Nibi, Inc.

Index

Constants

View Source
const (
	// FunTokenGasLimitSendToEvm consists of gas for 3 calls:
	// 1. transfer erc20 from sender to module
	//    ~60_000 gas for regular erc20 transfer (our own ERC20Minter contract)
	//    could be higher for user created contracts, let's cap with 200_000
	// 2. mint native coin (made from erc20) or burn erc20 token (made from coin)
	//	  ~60_000 gas for either mint or burn
	// 3. send from module to account:
	//	  ~65_000 gas (bank send)
	FunTokenGasLimitSendToEvm uint64 = 400_000
)

Variables

View Source
var DefaultEthCallGasLimit = srvconfig.DefaultEthCallGasLimit
View Source
var MOCK_GETH_MESSAGE = core.Message{
	To:               nil,
	From:             evm.EVM_MODULE_ADDRESS,
	Nonce:            0,
	Value:            evm.Big0,
	GasLimit:         0,
	GasPrice:         evm.Big0,
	GasFeeCap:        evm.Big0,
	GasTipCap:        evm.Big0,
	Data:             []byte{},
	AccessList:       gethcore.AccessList{},
	SkipNonceChecks:  false,
	SkipFromEOACheck: false,
}
View Source
var NextNoOpAnteHandler sdk.AnteHandler = func(
	ctx sdk.Context, tx sdk.Tx, simulate bool,
) (newCtx sdk.Context, err error) {
	return ctx, nil
}

Functions

func AssertBankBalanceEqualWithDescription

func AssertBankBalanceEqualWithDescription(
	t *testing.T,
	deps TestDeps,
	denom string,
	account gethcommon.Address,
	expectedBalance *big.Int,
	description string,
)

func AssertERC20BalanceEqualWithDescription

func AssertERC20BalanceEqualWithDescription(
	t *testing.T,
	deps TestDeps,
	evmObj *vm.EVM,
	erc20, account gethcommon.Address,
	expectedBalance *big.Int,
	description string,
)

func BuildTx

func BuildTx(
	deps *TestDeps,
	ethExtentions bool,
	gasLimit uint64,
	fees sdk.Coins,
	msgs ...sdk.Msg,
) sdk.FeeTx

func CreateFunTokenForBankCoin

func CreateFunTokenForBankCoin(
	deps TestDeps, bankDenom string, s *suite.Suite,
) (funtoken evm.FunToken)

CreateFunTokenForBankCoin: Uses the "TestDeps.Sender" account to create a "FunToken" mapping for a new coin

func DeployAndExecuteERC20Transfer

func DeployAndExecuteERC20Transfer(
	deps *TestDeps, t *testing.T,
) (
	erc20Transfer *evm.MsgEthereumTx,
	predecessors []*evm.MsgEthereumTx,
	contractAddr gethcommon.Address,
)

DeployAndExecuteERC20Transfer deploys a test ERC-20, executes one transfer, and returns the transfer tx, the deploy tx (as a predecessor), and the contract address.

## Determinism: Why we use a fixed recipient address

Intrinsic gas charges depend on calldata bytes. Since Istanbul (EIP-2028), each zero byte is 4 gas and each non-zero byte is 16 gas (+12 per non-zero byte). In an ERC-20 transfer(address,uint256), the address occupies the last 20 bytes of a 32-byte word (left-padded with zeros). Random recipients change the count of non-zero bytes and make gas/gasUsed assertions flaky.

To keep tests stable, this helper uses a fixed recipient address whose byte pattern is constant. The intrinsic gas term is then reproducible.

References:

func EnsureNibiruPrefix added in v2.8.0

func EnsureNibiruPrefix()

Ensures that the Bech32 address prefix is configured to "nibi" instead of a another one like "cosmos", which will panic on Nibiru.

func ExecuteNibiTransfer

func ExecuteNibiTransfer(deps *TestDeps, t *testing.T) (*evm.MsgEthereumTx, *evm.MsgEthereumTxResponse)

ExecuteNibiTransfer executes nibi transfer

func GasLimitCreateContract

func GasLimitCreateContract() *big.Int

func GenerateEthTxMsgAndSigner

func GenerateEthTxMsgAndSigner(
	jsonTxArgs evm.JsonTxArgs, deps *TestDeps, sender EthPrivKeyAcc,
) (evmTxMsg *evm.MsgEthereumTx, gethSigner gethcore.Signer, krSigner keyring.Signer, err error)

GenerateEthTxMsgAndSigner estimates gas, sets gas limit and returns signer for the tx.

Usage:

```go
evmTxMsg, gethSigner, krSigner, _ := GenerateEthTxMsgAndSigner(
    jsonTxArgs, &deps, sender,
)
err := evmTxMsg.Sign(gethSigner, sender.KeyringSigner)
```

func HappyCreateContractTx

func HappyCreateContractTx(deps *TestDeps) *evm.MsgEthereumTx

func HappyTransferTx

func HappyTransferTx(deps *TestDeps, nonce uint64) *evm.MsgEthereumTx

func LogLiteEventErc20Transfer added in v2.8.0

func LogLiteEventErc20Transfer(
	contract gethcommon.Address,
	from, to gethcommon.Address, amt *big.Int,
) evm.LogLite

Constructs an ERC20 Transfer event

func LogLiteEventWnibiDeposit added in v2.8.0

func LogLiteEventWnibiDeposit(contract, dst gethcommon.Address, amt *big.Int) evm.LogLite

Constructs a WNIBI.sol Deposit event

func NewEthTxMsgAsCmt

func NewEthTxMsgAsCmt(t *testing.T) (
	txBz cmttypes.Tx,
	ethTxMsgs []*evm.MsgEthereumTx,
	clientCtx client.Context,
)

NewEthTxMsgAsCmt: Helper that returns an Ethereum tx msg converted into tx bytes used in the Consensus Engine.

func NewEthTxMsgFromTxData

func NewEthTxMsgFromTxData(
	deps *TestDeps,
	txType GethTxType,
	innerTxData []byte,
	nonce uint64,
	to *gethcommon.Address,
	value *big.Int,
	gas uint64,
	accessList gethcore.AccessList,
) (*evm.MsgEthereumTx, error)

NewEthTxMsgFromTxData creates an Ethereum transaction message based on the specified txType (Legacy, AccessList, or DynamicFee). This function populates transaction fields like nonce, recipient, value, and gas, with an optional access list for AccessList and DynamicFee types. The transaction is signed using the provided dependencies.

Parameters:

  • deps: Required dependencies including the sender address and signer.
  • txType: Transaction type (Legacy, AccessList, or DynamicFee).
  • innerTxData: Byte slice of transaction data (input).
  • nonce: Transaction nonce.
  • to: Recipient address.
  • value: ETH value (in wei) to transfer.
  • gas: Gas limit for the transaction.
  • accessList: Access list for AccessList and DynamicFee types.

Returns:

  • *evm.MsgEthereumTx: Ethereum transaction message ready for submission.
  • error: Any error encountered during creation or signing.

func NewEthTxMsgs

func NewEthTxMsgs(count uint64) (ethTxMsgs []*evm.MsgEthereumTx)

func NewMsgEthereumTx added in v2.8.0

func NewMsgEthereumTx(
	args ArgsEthTx,
) (msgEthereumTx *evm.MsgEthereumTx, err error)

func NewSigner

func NewSigner(sk cryptotypes.PrivKey) keyring.Signer

func NonEvmMsgTx

func NonEvmMsgTx(deps *TestDeps) sdk.Tx

func TxTemplateAccessListTx

func TxTemplateAccessListTx() *gethcore.AccessListTx

func TxTemplateDynamicFeeTx

func TxTemplateDynamicFeeTx() *gethcore.DynamicFeeTx

func TxTemplateLegacyTx

func TxTemplateLegacyTx() *gethcore.LegacyTx

func ValidLegacyTx

func ValidLegacyTx() *evm.LegacyTx

ValidLegacyTx: Useful initial condition for tests Exported only for use in tests.

Types

type ArgsCreateContract

type ArgsCreateContract struct {
	EthAcc        EthPrivKeyAcc
	EthChainIDInt *big.Int
	GasPrice      *big.Int
	Nonce         uint64
	GasLimit      *big.Int
}

ArgsCreateContract: Arguments to call with `CreateContractTxMsg` to make Ethereum transactions that create contracts.

It is recommended to use a gas price of `big.NewInt(1)` for simpler op code calculations in gas units.

type ArgsEthTx added in v2.8.0

type ArgsEthTx struct {
	CreateContract  *ArgsCreateContract
	ExecuteContract *ArgsExecuteContract
}

type ArgsExecuteContract

type ArgsExecuteContract struct {
	EthAcc          EthPrivKeyAcc
	EthChainIDInt   *big.Int
	ContractAddress *gethcommon.Address
	Data            []byte
	GasPrice        *big.Int
	Nonce           uint64
	GasLimit        *big.Int
}

ArgsExecuteContract: Arguments to call with `ExecuteContractTxMsg` to make Ethereum transactions that execute contracts.

type BalanceAssertNIBI added in v2.7.0

type BalanceAssertNIBI struct {
	Account      gethcommon.Address
	BalanceBank  *big.Int
	BalanceERC20 *big.Int
	Description  string
	EvmObj       *vm.EVM
}

func (BalanceAssertNIBI) Assert added in v2.7.0

func (bals BalanceAssertNIBI) Assert(t *testing.T, deps TestDeps)

type DeployContractResult

type DeployContractResult struct {
	TxResp       *evm.MsgEthereumTxResponse
	EthTxMsg     *evm.MsgEthereumTx
	ContractData embeds.CompiledEvmContract
	Nonce        uint64
	ContractAddr gethcommon.Address
}

func DeployContract

func DeployContract(
	deps *TestDeps,
	contract embeds.CompiledEvmContract,
	args ...any,
) (result *DeployContractResult, err error)

type EthPrivKeyAcc

type EthPrivKeyAcc struct {
	EthAddr       gethcommon.Address
	NibiruAddr    sdk.AccAddress
	PrivKey       *ethsecp256k1.PrivKey
	KeyringSigner keyring.Signer
}

func NewEthPrivAcc

func NewEthPrivAcc() EthPrivKeyAcc

NewEthPrivAcc returns an Ethereum private key, its corresponding Eth address, Nibiru address, and keyring signer.

func NewEthPrivAccs

func NewEthPrivAccs(n int) []EthPrivKeyAcc

NewEthPrivAccs calls [NewEthAccInfo] n times.

type FunTokenBalanceAssert

type FunTokenBalanceAssert struct {
	Account      gethcommon.Address
	FunToken     evm.FunToken
	BalanceBank  *big.Int
	BalanceERC20 *big.Int
	Description  string
}

func (FunTokenBalanceAssert) Assert

func (bals FunTokenBalanceAssert) Assert(t *testing.T, deps TestDeps, evmObj *vm.EVM)

type GethTxType

type GethTxType = uint8

GethTxType represents different Ethereum transaction types as defined in go-ethereum, such as Legacy, AccessList, and DynamicFee transactions.

type Signer

type Signer struct {
	// contains filtered or unexported fields
}

Signer defines a type that is used on testing for signing MsgEthereumTx

func (Signer) Sign

func (s Signer) Sign(_ string, msg []byte) ([]byte, cryptotypes.PubKey, error)

Sign signs the message using the underlying private key

func (Signer) SignByAddress

func (s Signer) SignByAddress(address sdk.Address, msg []byte) ([]byte, cryptotypes.PubKey, error)

SignByAddress sign byte messages with a user key providing the address.

type TestDeps

type TestDeps struct {
	App       *app.NibiruApp
	EvmKeeper *evmstate.Keeper
	GenState  *evm.GenesisState
	Sender    EthPrivKeyAcc
	// contains filtered or unexported fields
}

func NewTestDeps

func NewTestDeps() TestDeps

func (*TestDeps) Commit added in v2.8.0

func (deps *TestDeps) Commit()

Commit mutates the *TestDeps, committing changes from the current *evmstate.SDB and resetting it to nil. You can think of this like saving previous changes and potentially starting a new Etheruem tx is starting because reverting the old state DB is no longer possible after *TestDeps.Commit

func (TestDeps) Ctx

func (deps TestDeps) Ctx() sdk.Context

Ctx returns the current EVM state DB context if one it is initialized and falls back to the initial ctx from when the TestDeps instance was constructed.

func (TestDeps) CtxInit added in v2.8.0

func (deps TestDeps) CtxInit() sdk.Context

CtxInit returns the initial context from when the TestDeps instance was constructed.

func (*TestDeps) DeployWNIBI added in v2.7.0

func (deps *TestDeps) DeployWNIBI(s *suite.Suite)

func (*TestDeps) GethSigner

func (deps *TestDeps) GethSigner() gethcore.Signer

func (TestDeps) GoCtx

func (deps TestDeps) GoCtx() context.Context

func (TestDeps) IsActiveStateTransition added in v2.8.0

func (deps TestDeps) IsActiveStateTransition() bool

func (TestDeps) IsEqualSDB added in v2.8.0

func (deps TestDeps) IsEqualSDB(otherSdb *evmstate.SDB) bool

func (*TestDeps) MimicEthereumTx added in v2.7.0

func (deps *TestDeps) MimicEthereumTx(
	s *suite.Suite,
	doTx func(evmObj *vm.EVM, sdb *evmstate.SDB),
)

func (TestDeps) NewEVM

func (deps TestDeps) NewEVM() (*vm.EVM, *evmstate.SDB)

func (*TestDeps) NewStateDB

func (deps *TestDeps) NewStateDB() *evmstate.SDB

NewStateDB returns the current *evmstate.SDB pointer for the *TestDeps instance. This function mutates the *TestDeps and initializes the state DB it one is not set already.

func (*TestDeps) RunUpgrade added in v2.7.0

func (deps *TestDeps) RunUpgrade(upgrade upgrades.Upgrade) error

func (*TestDeps) SetCtx added in v2.8.0

func (deps *TestDeps) SetCtx(ctx sdk.Context)

SetCtx overwrites the current context.

type TxTransferWei

type TxTransferWei struct {
	Deps      *TestDeps
	To        gethcommon.Address
	AmountWei *big.Int
	GasLimit  uint64
}

func (TxTransferWei) Build

func (tx TxTransferWei) Build() (evmTxMsg *evm.MsgEthereumTx, err error)

func (TxTransferWei) Run

func (tx TxTransferWei) Run() (evmResp *evm.MsgEthereumTxResponse, err error)

func (TxTransferWei) ToJsonTxArgs added in v2.8.0

func (tx TxTransferWei) ToJsonTxArgs() (jsonTxArgs *evm.JsonTxArgs, jsonBz []byte)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL