diff --git a/giga/executor/precompiles/failfast.go b/giga/executor/precompiles/failfast.go new file mode 100644 index 0000000000..c0b2e67a87 --- /dev/null +++ b/giga/executor/precompiles/failfast.go @@ -0,0 +1,61 @@ +package precompiles + +import ( + "errors" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/sei-protocol/sei-chain/precompiles/addr" + "github.com/sei-protocol/sei-chain/precompiles/bank" + "github.com/sei-protocol/sei-chain/precompiles/distribution" + "github.com/sei-protocol/sei-chain/precompiles/gov" + "github.com/sei-protocol/sei-chain/precompiles/ibc" + "github.com/sei-protocol/sei-chain/precompiles/json" + "github.com/sei-protocol/sei-chain/precompiles/oracle" + "github.com/sei-protocol/sei-chain/precompiles/p256" + "github.com/sei-protocol/sei-chain/precompiles/pointer" + "github.com/sei-protocol/sei-chain/precompiles/pointerview" + "github.com/sei-protocol/sei-chain/precompiles/solo" + "github.com/sei-protocol/sei-chain/precompiles/staking" + "github.com/sei-protocol/sei-chain/precompiles/wasmd" +) + +var FailFastPrecompileAddresses = []common.Address{ + common.HexToAddress(bank.BankAddress), + common.HexToAddress(wasmd.WasmdAddress), + common.HexToAddress(json.JSONAddress), + common.HexToAddress(addr.AddrAddress), + common.HexToAddress(staking.StakingAddress), + common.HexToAddress(gov.GovAddress), + common.HexToAddress(distribution.DistrAddress), + common.HexToAddress(oracle.OracleAddress), + common.HexToAddress(ibc.IBCAddress), + common.HexToAddress(pointerview.PointerViewAddress), + common.HexToAddress(pointer.PointerAddress), + common.HexToAddress(solo.SoloAddress), + common.HexToAddress(p256.P256VerifyAddress), +} + +var ErrInvalidPrecompileCall = errors.New("invalid precompile call") + +type FailFastPrecompile struct{} + +var FailFastSingleton vm.PrecompiledContract = &FailFastPrecompile{} + +func (p *FailFastPrecompile) RequiredGas(input []byte) uint64 { + return 0 +} + +func (p *FailFastPrecompile) Run(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, value *big.Int, readOnly bool, isFromDelegateCall bool, hooks *tracing.Hooks) ([]byte, error) { + return nil, ErrInvalidPrecompileCall +} + +var AllCustomPrecompilesFailFast = map[common.Address]vm.PrecompiledContract{} + +func init() { + for _, addr := range FailFastPrecompileAddresses { + AllCustomPrecompilesFailFast[addr] = FailFastSingleton + } +} diff --git a/giga/executor/utils/errors.go b/giga/executor/utils/errors.go new file mode 100644 index 0000000000..18c057776e --- /dev/null +++ b/giga/executor/utils/errors.go @@ -0,0 +1,11 @@ +package utils + +import ( + "errors" + + "github.com/sei-protocol/sei-chain/giga/executor/precompiles" +) + +func ShouldExecutionAbort(err error) bool { + return errors.Is(err, precompiles.ErrInvalidPrecompileCall) +} diff --git a/giga/executor/vm/geth/vm.go b/giga/executor/vm/geth/vm.go index ab5e10d946..213aa24dec 100644 --- a/giga/executor/vm/geth/vm.go +++ b/giga/executor/vm/geth/vm.go @@ -3,7 +3,9 @@ package geth import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" "github.com/holiman/uint256" + "github.com/sei-protocol/sei-chain/giga/executor/precompiles" "github.com/sei-protocol/sei-chain/giga/executor/types" ) @@ -26,3 +28,8 @@ func (v *VMImpl) Call(sender types.Address, to types.Address, input []byte, gas ret, gasLeft, err = v.evm.Call(common.Address(sender), common.Address(to), input, gas, new(uint256.Int).SetBytes(value[:])) return ret, gasLeft, err } + +// To be called by an exported EVM create function which knows how to instantiate params like statedb. +func createEVMWithFailFastPrecompile(blockContext vm.BlockContext, statedb vm.StateDB, chainConfig *params.ChainConfig, vmConfig vm.Config) *vm.EVM { + return vm.NewEVM(blockContext, statedb, chainConfig, vmConfig, precompiles.AllCustomPrecompilesFailFast) +}