From 0dbb5792c395b31458d2b6670f59cb1450b70050 Mon Sep 17 00:00:00 2001 From: Darioush Jalali Date: Wed, 18 Sep 2024 11:18:25 -0400 Subject: [PATCH] inline call to CallExpert --- core/vm/evm.go | 18 ------------------ core/vm/instructions.go | 23 ++++++++++++++++++++++- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/core/vm/evm.go b/core/vm/evm.go index 2cf83878be..0eb7ec12df 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -345,24 +345,6 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas return ret, gas, err } -// This allows the user transfer balance of a specified coinId in addition to a normal Call(). -func (evm *EVM) CallExpert(caller ContractRef, addr common.Address, input []byte, gas uint64, value *uint256.Int, coinID common.Hash, value2 *big.Int) (ret []byte, leftOverGas uint64, err error) { - transfer := evm.Context.Transfer - defer func() { evm.Context.Transfer = transfer }() - - evm.Context.Transfer = func(db StateDB, from, to common.Address, amount *uint256.Int) { - // Restore the original function after this is called once - defer func() { evm.Context.Transfer = transfer }() - transfer(db, from, to, amount) - evm.Context.TransferMultiCoin(db, from, to, coinID, value2) - } - - if value2.Sign() != 0 && !evm.Context.CanTransferMC(evm.StateDB, caller.Address(), addr, coinID, value2) { - return nil, gas, vmerrs.ErrInsufficientBalance - } - return evm.Call(caller, addr, input, gas, value) -} - // CallCode executes the contract associated with the addr with the given input // as parameters. It also handles any necessary value transfer required and takes // the necessary steps to create accounts and reverses the state in case of an diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 7e7c3a504f..da670ea858 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -732,7 +732,28 @@ func opCallExpert(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) if !value.IsZero() { gas += params.CallStipend } - ret, returnGas, err := interpreter.evm.CallExpert(scope.Contract, toAddr, args, gas, &value, coinID, bigVal2) + + evm := interpreter.evm + transfer := evm.Context.Transfer + defer func() { evm.Context.Transfer = transfer }() + + evm.Context.Transfer = func(db StateDB, from, to common.Address, amount *uint256.Int) { + // Restore the original function after this is called once + defer func() { evm.Context.Transfer = transfer }() + transfer(db, from, to, amount) + evm.Context.TransferMultiCoin(db, from, to, coinID, bigVal2) + } + + var ( + ret []byte + returnGas uint64 + err error + ) + if value2.Sign() != 0 && !evm.Context.CanTransferMC(evm.StateDB, scope.Contract.Address(), toAddr, coinID, bigVal2) { + ret, returnGas, err = nil, gas, vmerrs.ErrInsufficientBalance + } else { + ret, returnGas, err = evm.Call(scope.Contract, toAddr, args, gas, &value) + } if err != nil { temp.Clear() } else {