Documentation ¶
Overview ¶
Package precompile implements custom precompiles for the Nibiru EVM.
Precompiles are special, built-in contract interfaces that exist at predefined addresses and run custom logic outside of what is possible in standard Solidity contracts. This package extends the default Ethereum precompiles with Nibiru-specific functionality.
Key components:
- InitPrecompiles: Initializes and returns a map of precompiled contracts.
- PrecompileFunToken: Implements the FunToken precompile for ERC20-to-bank transfers.
The package also provides utility functions for working with precompiles, such as "ABIMethodByID" and "OnRunStart" for common precompile execution setup.
Index ¶
- Variables
- func ErrArgTypeValidation(solidityHint string, arg any) error
- func ErrInvalidArgs(err error) error
- func ErrMethodCalled(method *gethabi.Method, wrapped error) error
- func ErrPrecompileRun(err error, p vm.PrecompiledContract) error
- func HandleOutOfGasPanic(err *error) func()
- func InitPrecompiles(k keepers.PublicKeepers) (precompiles map[gethcommon.Address]vm.PrecompiledContract)
- func PrecompileFunToken(keepers keepers.PublicKeepers) vm.PrecompiledContract
- func PrecompileOracle(keepers keepers.PublicKeepers) vm.PrecompiledContract
- func PrecompileWasm(keepers keepers.PublicKeepers) vm.PrecompiledContract
- type OnRunStartResult
- type PrecompileMethod
- type Wasm
- type WasmBankCoin
Constants ¶
This section is empty.
Variables ¶
var PrecompileAddr_FunToken = gethcommon.HexToAddress("0x0000000000000000000000000000000000000800")
Precompile address for "IFunToken.sol", the contract that enables transfers of ERC20 tokens to "nibi" addresses as bank coins using the ERC20's `FunToken` mapping.
var PrecompileAddr_Oracle = gethcommon.HexToAddress("0x0000000000000000000000000000000000000801")
Precompile address for "Oracle.sol", the contract that enables queries for exchange rates
var PrecompileAddr_Wasm = gethcommon.HexToAddress("0x0000000000000000000000000000000000000802")
Precompile address for "Wasm.sol",
Functions ¶
func ErrArgTypeValidation ¶
Error short-hand for type validation
func ErrPrecompileRun ¶
func ErrPrecompileRun(err error, p vm.PrecompiledContract) error
ErrPrecompileRun is error function intended for use in a `defer` pattern, which modifies the input error in the event that its value becomes non-nil. This creates a concise way to prepend extra information to the original error.
func HandleOutOfGasPanic ¶
func HandleOutOfGasPanic(err *error) func()
func InitPrecompiles ¶
func InitPrecompiles( k keepers.PublicKeepers, ) (precompiles map[gethcommon.Address]vm.PrecompiledContract)
InitPrecompiles initializes and returns a map of precompiled contracts for the EVM. It combines default Ethereum precompiles with custom Nibiru precompiles.
Parameters:
- k: A keepers.PublicKeepers instance providing access to various blockchain state.
Returns:
- A map of Ethereum addresses to PrecompiledContract implementations.
func PrecompileFunToken ¶
func PrecompileFunToken(keepers keepers.PublicKeepers) vm.PrecompiledContract
func PrecompileOracle ¶
func PrecompileOracle(keepers keepers.PublicKeepers) vm.PrecompiledContract
func PrecompileWasm ¶
func PrecompileWasm(keepers keepers.PublicKeepers) vm.PrecompiledContract
Types ¶
type OnRunStartResult ¶
type OnRunStartResult struct { // Args contains the decoded (ABI unpacked) arguments passed to the contract // as input. Args []any // CacheCtx is a cached SDK context that allows isolated state // operations to occur that can be reverted by the EVM's [statedb.StateDB]. CacheCtx sdk.Context // Method is the ABI method for the precompiled contract call. Method *gethabi.Method StateDB *statedb.StateDB PrecompileJournalEntry statedb.PrecompileCalled }
func OnRunStart ¶
func OnRunStart( evm *vm.EVM, contractInput []byte, abi *gethabi.ABI, gasLimit uint64, ) (res OnRunStartResult, err error)
OnRunStart prepares the execution environment for a precompiled contract call. It handles decoding the input data according the to contract ABI, creates an isolated cache context for state changes, and sets up a snapshot for potential EVM "reverts".
Args:
- evm: Instance of the EVM executing the contract
- contract: Precompiled contract being called
- abi: gethabi.ABI defining the contract's invokable methods.
Example Usage:
```go func (p newPrecompile) Run( evm *vm.EVM, contract *vm.Contract, readonly bool ) (bz []byte, err error) { res, err := OnRunStart(evm, contract, p.ABI()) if err != nil { return nil, err } // ... // Use res.Ctx for state changes // Use res.StateDB.Commit() before any non-EVM state changes // to guarantee the context and [statedb.StateDB] are in sync. } ```
type PrecompileMethod ¶
type PrecompileMethod string
const ( FunTokenMethod_sendToBank PrecompileMethod = "sendToBank" FunTokenMethod_balance PrecompileMethod = "balance" FunTokenMethod_bankBalance PrecompileMethod = "bankBalance" FunTokenMethod_whoAmI PrecompileMethod = "whoAmI" )
const ( WasmMethod_execute PrecompileMethod = "execute" WasmMethod_query PrecompileMethod = "query" WasmMethod_instantiate PrecompileMethod = "instantiate" WasmMethod_executeMulti PrecompileMethod = "executeMulti" WasmMethod_queryRaw PrecompileMethod = "queryRaw" )
Contract methods from Wasm.sol
const (
OracleMethod_queryExchangeRate PrecompileMethod = "queryExchangeRate"
)
type Wasm ¶
type Wasm struct { *wasmkeeper.PermissionedKeeper wasmkeeper.Keeper }
Wasm: A struct embedding keepers for read and write operations in Wasm, such as execute, query, and instantiate.
type WasmBankCoin ¶
WasmBankCoin is a naked struct for the "BankCoin" type from Wasm.sol. The ABI parser requires an unnamed strict, so this type is only used in tests.