precompile

package
v2.0.0-rc.14 Latest Latest
Warning

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

Go to latest
Published: Nov 18, 2024 License: Apache-2.0 Imports: 22 Imported by: 0

README

Sample Hardhat Project

This project demonstrates a basic Hardhat use case. It comes with a sample contract, a test for that contract, and a Hardhat Ignition module that deploys that contract.

Try running some of the following tasks:

npx hardhat help
npx hardhat test
REPORT_GAS=true npx hardhat test
npx hardhat node
npx hardhat ignition deploy ./ignition/modules/Lock.js

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

Constants

This section is empty.

Variables

View Source
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.

View Source
var PrecompileAddr_Oracle = gethcommon.HexToAddress("0x0000000000000000000000000000000000000801")

Precompile address for "Oracle.sol", the contract that enables queries for exchange rates

View Source
var PrecompileAddr_Wasm = gethcommon.HexToAddress("0x0000000000000000000000000000000000000802")

Precompile address for "Wasm.sol",

Functions

func ErrArgTypeValidation

func ErrArgTypeValidation(solidityHint string, arg any) error

Error short-hand for type validation

func ErrInvalidArgs

func ErrInvalidArgs(err error) error

Error when parsing method arguments

func ErrMethodCalled

func ErrMethodCalled(method *gethabi.Method, wrapped error) error

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

Wasm: A struct embedding keepers for read and write operations in Wasm, such as execute, query, and instantiate.

type WasmBankCoin

type WasmBankCoin struct {
	Denom  string   `json:"denom"`
	Amount *big.Int `json:"amount"`
}

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.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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