From f834a854659d3d7e2b77ad17b4760c616ceb837c Mon Sep 17 00:00:00 2001 From: mmsqe Date: Fri, 3 Feb 2023 09:49:59 +0800 Subject: [PATCH] add CheckCaller --- x/evm/keeper/precompiles/bank.go | 26 +++++--------------------- x/evm/keeper/precompiles/utils.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 21 deletions(-) create mode 100644 x/evm/keeper/precompiles/utils.go diff --git a/x/evm/keeper/precompiles/bank.go b/x/evm/keeper/precompiles/bank.go index e2f36f6961..5e0228d78d 100644 --- a/x/evm/keeper/precompiles/bank.go +++ b/x/evm/keeper/precompiles/bank.go @@ -3,8 +3,6 @@ package precompiles import ( "errors" "math/big" - "runtime" - "strings" sdkmath "cosmossdk.io/math" "github.com/ethereum/go-ethereum/accounts/abi" @@ -90,23 +88,9 @@ func (bc *BankContract) RequiredGas(input []byte) uint64 { } func (bc *BankContract) Run(input []byte) ([]byte, error) { - layer := 2 - pc, _, _, _ := runtime.Caller(layer) - prefix := "github.com/ethereum/go-ethereum/core/vm.(*EVM)." - caller := runtime.FuncForPC(pc).Name() - readonly := false - if strings.Index(caller, prefix) == 0 { - fn := caller[len(prefix):] - switch fn { - case "Call": - readonly = false - case "CallCode": - case "DelegateCall": - case "StaticCall": - readonly = true - default: - return nil, errors.New("unknown caller") - } + readonly, err := CheckCaller() + if err != nil { + return nil, err } // parse input methodID := input[:4] @@ -147,8 +131,8 @@ func (bc *BankContract) Run(input []byte) ([]byte, error) { token := args[0].(common.Address) addr := args[1].(common.Address) // query from storage - amount := bc.bankKeeper.GetBalance(bc.ctx, sdk.AccAddress(addr.Bytes()), EVMDenom(token)).Amount.BigInt() - return BalanceOfMethod.Outputs.Pack(amount) + balance := bc.bankKeeper.GetBalance(bc.ctx, sdk.AccAddress(addr.Bytes()), EVMDenom(token)).Amount.BigInt() + return BalanceOfMethod.Outputs.Pack(balance) default: return nil, errors.New("unknown method") } diff --git a/x/evm/keeper/precompiles/utils.go b/x/evm/keeper/precompiles/utils.go new file mode 100644 index 0000000000..6e898277ed --- /dev/null +++ b/x/evm/keeper/precompiles/utils.go @@ -0,0 +1,29 @@ +package precompiles + +import ( + "errors" + "runtime" + "strings" +) + +func CheckCaller() (bool, error) { + layer := 2 + pc, _, _, _ := runtime.Caller(layer) + prefix := "github.com/ethereum/go-ethereum/core/vm.(*EVM)." + caller := runtime.FuncForPC(pc).Name() + readonly := false + if strings.Index(caller, prefix) == 0 { + fn := caller[len(prefix):] + switch fn { + case "Call": + readonly = false + case "CallCode": + case "DelegateCall": + case "StaticCall": + readonly = true + default: + return readonly, errors.New("unknown caller") + } + } + return readonly, nil +}