From b7db9a27bd2fbfe591e57a9e01db81b22366a613 Mon Sep 17 00:00:00 2001 From: Tony Chen Date: Wed, 7 Jan 2026 11:38:12 +0800 Subject: [PATCH 1/2] Add failfast precompile to detect interop --- giga/executor/precompiles/failfast.go | 34 +++++++++++++++++++++++++++ giga/executor/utils/errors.go | 11 +++++++++ giga/executor/vm/geth/vm.go | 7 ++++++ 3 files changed, 52 insertions(+) create mode 100644 giga/executor/precompiles/failfast.go create mode 100644 giga/executor/utils/errors.go diff --git a/giga/executor/precompiles/failfast.go b/giga/executor/precompiles/failfast.go new file mode 100644 index 0000000000..53340c3271 --- /dev/null +++ b/giga/executor/precompiles/failfast.go @@ -0,0 +1,34 @@ +package precompiles + +import ( + "errors" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" +) + +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 := 0x1001; addr <= 0x100C; addr++ { + evmAddr := common.HexToAddress(fmt.Sprintf("0x%X", addr)) + AllCustomPrecompilesFailFast[evmAddr] = 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) +} From 2edce7a2babc92eb22b21abe9ecc91fb27d215fc Mon Sep 17 00:00:00 2001 From: Tony Chen Date: Fri, 9 Jan 2026 11:19:29 +0800 Subject: [PATCH 2/2] make fail fast addresses explicit --- giga/executor/precompiles/failfast.go | 35 ++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/giga/executor/precompiles/failfast.go b/giga/executor/precompiles/failfast.go index 53340c3271..c0b2e67a87 100644 --- a/giga/executor/precompiles/failfast.go +++ b/giga/executor/precompiles/failfast.go @@ -2,14 +2,42 @@ package precompiles import ( "errors" - "fmt" "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{} @@ -27,8 +55,7 @@ func (p *FailFastPrecompile) Run(evm *vm.EVM, caller common.Address, callingCont var AllCustomPrecompilesFailFast = map[common.Address]vm.PrecompiledContract{} func init() { - for addr := 0x1001; addr <= 0x100C; addr++ { - evmAddr := common.HexToAddress(fmt.Sprintf("0x%X", addr)) - AllCustomPrecompilesFailFast[evmAddr] = FailFastSingleton + for _, addr := range FailFastPrecompileAddresses { + AllCustomPrecompilesFailFast[addr] = FailFastSingleton } }