Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions giga/executor/precompiles/failfast.go
Original file line number Diff line number Diff line change
@@ -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
}
}
11 changes: 11 additions & 0 deletions giga/executor/utils/errors.go
Original file line number Diff line number Diff line change
@@ -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)
}
7 changes: 7 additions & 0 deletions giga/executor/vm/geth/vm.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand All @@ -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)
}
Loading