From aad0f0f3b9949ed5ba74afd7eba3f0bd5fb0e769 Mon Sep 17 00:00:00 2001 From: Francisco de Borja Aranda Castillejo Date: Fri, 11 Oct 2024 20:05:15 +0200 Subject: [PATCH] refactor(staking): do not execute write functions on staticcall --- precompiles/staking/staking.go | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/precompiles/staking/staking.go b/precompiles/staking/staking.go index 7ef467b039..5f95e54571 100644 --- a/precompiles/staking/staking.go +++ b/precompiles/staking/staking.go @@ -380,7 +380,7 @@ func (c *Contract) MoveStake( // Run is the entrypoint of the precompiled contract, it switches over the input method, // and execute them accordingly. -func (c *Contract) Run(evm *vm.EVM, contract *vm.Contract, _ bool) ([]byte, error) { +func (c *Contract) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) ([]byte, error) { method, err := ABI.MethodById(contract.Input[:4]) if err != nil { return nil, err @@ -415,6 +415,12 @@ func (c *Contract) Run(evm *vm.EVM, contract *vm.Contract, _ bool) ([]byte, erro } return res, nil case StakeMethodName: + if readOnly { + return nil, ptypes.ErrUnexpected{ + Got: "method not allowed in read-only mode: " + method.Name, + } + } + var res []byte execErr := stateDB.ExecuteNativeAction(contract.Address(), nil, func(ctx sdk.Context) error { res, err = c.Stake(ctx, evm, contract, method, args) @@ -425,6 +431,12 @@ func (c *Contract) Run(evm *vm.EVM, contract *vm.Contract, _ bool) ([]byte, erro } return res, nil case UnstakeMethodName: + if readOnly { + return nil, ptypes.ErrUnexpected{ + Got: "method not allowed in read-only mode: " + method.Name, + } + } + var res []byte execErr := stateDB.ExecuteNativeAction(contract.Address(), nil, func(ctx sdk.Context) error { res, err = c.Unstake(ctx, evm, contract, method, args) @@ -435,6 +447,12 @@ func (c *Contract) Run(evm *vm.EVM, contract *vm.Contract, _ bool) ([]byte, erro } return res, nil case MoveStakeMethodName: + if readOnly { + return nil, ptypes.ErrUnexpected{ + Got: "method not allowed in read-only mode: " + method.Name, + } + } + var res []byte execErr := stateDB.ExecuteNativeAction(contract.Address(), nil, func(ctx sdk.Context) error { res, err = c.MoveStake(ctx, evm, contract, method, args)