diff --git a/core/vm/evm.go b/core/vm/evm.go index ff6ce40c62..95a1227436 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -183,8 +183,10 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas if evm.Config.Tracer != nil { if evm.depth == 0 { evm.Config.Tracer.CaptureStart(caller.Address(), addr, false, input, gas, value) + evm.Config.Tracer.OnGasChange(0, gas, GasChangeCallInitialBalance) defer func(startGas uint64) { // Lazy evaluation of the parameters - evm.Config.Tracer.CaptureEnd(ret, startGas-gas, err) + evm.Config.Tracer.OnGasChange(leftOverGas, 0, GasChangeCallLeftOverReturned) + evm.Config.Tracer.CaptureEnd(ret, startGas-leftOverGas, err) }(gas) } else { // Handle tracer events for entering and exiting a call frame @@ -192,7 +194,7 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas evm.Config.Tracer.OnGasChange(0, gas, GasChangeCallInitialBalance) defer func(startGas uint64) { evm.Config.Tracer.OnGasChange(leftOverGas, 0, GasChangeCallLeftOverReturned) - evm.Config.Tracer.CaptureExit(ret, startGas-gas, err) + evm.Config.Tracer.CaptureExit(ret, startGas-leftOverGas, err) }(gas) } } @@ -267,7 +269,7 @@ func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, evm.Config.Tracer.OnGasChange(0, gas, GasChangeCallInitialBalance) defer func(startGas uint64) { evm.Config.Tracer.OnGasChange(leftOverGas, 0, GasChangeCallLeftOverReturned) - evm.Config.Tracer.CaptureExit(ret, startGas-gas, err) + evm.Config.Tracer.CaptureExit(ret, startGas-leftOverGas, err) }(gas) } // Fail if we're trying to execute above the call depth limit @@ -324,7 +326,7 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by evm.Config.Tracer.OnGasChange(0, gas, GasChangeCallInitialBalance) defer func(startGas uint64) { evm.Config.Tracer.OnGasChange(leftOverGas, 0, GasChangeCallLeftOverReturned) - evm.Config.Tracer.CaptureExit(ret, startGas-gas, err) + evm.Config.Tracer.CaptureExit(ret, startGas-leftOverGas, err) }(gas) } // Fail if we're trying to execute above the call depth limit @@ -368,7 +370,7 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte evm.Config.Tracer.OnGasChange(0, gas, GasChangeCallInitialBalance) defer func(startGas uint64) { evm.Config.Tracer.OnGasChange(leftOverGas, 0, GasChangeCallLeftOverReturned) - evm.Config.Tracer.CaptureExit(ret, startGas-gas, err) + evm.Config.Tracer.CaptureExit(ret, startGas-leftOverGas, err) }(gas) } // Fail if we're trying to execute above the call depth limit @@ -431,20 +433,22 @@ func (c *codeAndHash) Hash() common.Hash { } // create creates a new contract using code as deployment code. -func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, value *big.Int, address common.Address, typ OpCode) (ret []byte, createAddress common.Address, leftoverGas uint64, err error) { +func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, value *big.Int, address common.Address, typ OpCode) (ret []byte, createAddress common.Address, leftOverGas uint64, err error) { if evm.Config.Tracer != nil { if evm.depth == 0 { evm.Config.Tracer.CaptureStart(caller.Address(), address, true, codeAndHash.code, gas, value) - defer func() { - evm.Config.Tracer.CaptureEnd(ret, gas-leftoverGas, err) - }() + evm.Config.Tracer.OnGasChange(0, gas, GasChangeCallInitialBalance) + defer func(startGas uint64) { + evm.Config.Tracer.OnGasChange(leftOverGas, 0, GasChangeCallLeftOverReturned) + evm.Config.Tracer.CaptureEnd(ret, startGas-leftOverGas, err) + }(gas) } else { evm.Config.Tracer.CaptureEnter(typ, caller.Address(), address, codeAndHash.code, gas, value) evm.Config.Tracer.OnGasChange(0, gas, GasChangeCallInitialBalance) - defer func() { - evm.Config.Tracer.OnGasChange(leftoverGas, 0, GasChangeCallLeftOverReturned) - evm.Config.Tracer.CaptureExit(ret, gas-leftoverGas, err) - }() + defer func(startGas uint64) { + evm.Config.Tracer.OnGasChange(leftOverGas, 0, GasChangeCallLeftOverReturned) + evm.Config.Tracer.CaptureExit(ret, startGas-leftOverGas, err) + }(gas) } } // Depth check execution. Fail if we're trying to execute above the