core/vm: set tracer-observable value of a delegatecall to match parent value #26632 (#1317)

This is a breaking change in the tracing hooks API as well as semantics of the callTracer:

- CaptureEnter hook provided a nil value argument in case of DELEGATECALL. However to stay consistent with how delegate calls behave in EVM this hook is changed to pass in the value of the parent call.
- callTracer will return parent call's value for DELEGATECALL frames.

---------

Co-authored-by: Chris Ziogas <ziogaschr@gmail.com>
Co-authored-by: Sina Mahmoodi <itz.s1na@gmail.com>
This commit is contained in:
Daniel Liu 2025-09-09 10:41:48 +08:00 committed by GitHub
parent e1baea4d8b
commit 96a7ed54c6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 23 additions and 10 deletions

View file

@ -320,7 +320,11 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by
// Invoke tracer hooks that signal entering/exiting a call frame
if evm.Config.Tracer != nil {
evm.Config.Tracer.CaptureEnter(DELEGATECALL, caller.Address(), addr, input, gas, nil)
// NOTE: caller must, at all times be a contract. It should never happen
// that caller is something other than a Contract.
parent := caller.(*Contract)
// DELEGATECALL inherits value from parent call
evm.Config.Tracer.CaptureEnter(DELEGATECALL, caller.Address(), addr, input, gas, parent.value)
defer func(startGas uint64) {
evm.Config.Tracer.CaptureExit(ret, startGas-gas, err)
}(gas)

View file

@ -72,7 +72,8 @@
"input": "0x7d65837a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a529806c67cc6486d4d62024471772f47f6fd672",
"output": "0x0000000000000000000000000000000000000000000000000000000000000001",
"to": "0x42b02b5deeb78f34cd5ac896473b63e6c99a71a2",
"type": "DELEGATECALL"
"type": "DELEGATECALL",
"value": "0x0"
}
],
"from": "0x269296dddce321a6bcbaa2f0181127593d732cba",

View file

@ -165,7 +165,8 @@
"to": "0xef3487d24a0702703e04a26cef479e313c8fc7ae",
"input": "0x24d4e90a0000000000000000000000000000000000000000000000020000000000000000",
"output": "0x000000000000000000000000000000000000000000000000b17217f7d1cf79ab",
"type": "DELEGATECALL"
"type": "DELEGATECALL",
"value": "0x0"
},
{
"from": "0x8695e5e79dab06fbbb05f445316fa4edb0da30f0",
@ -174,7 +175,8 @@
"to": "0xef3487d24a0702703e04a26cef479e313c8fc7ae",
"input": "0x872fb2b5000000000000000000000000000000000000000000000000c330b3f7006420b8",
"output": "0x00000000000000000000000000000000000000000000000224bf7df2c80f0878",
"type": "DELEGATECALL"
"type": "DELEGATECALL",
"value": "0x0"
},
{
"from": "0x8695e5e79dab06fbbb05f445316fa4edb0da30f0",
@ -183,7 +185,8 @@
"to": "0xef3487d24a0702703e04a26cef479e313c8fc7ae",
"input": "0x872fb2b50000000000000000000000000000000000000000000000000000000000000000",
"output": "0x00000000000000000000000000000000000000000000000100000016aee6e8ef",
"type": "DELEGATECALL"
"type": "DELEGATECALL",
"value": "0x0"
},
{
"from": "0x8695e5e79dab06fbbb05f445316fa4edb0da30f0",
@ -192,7 +195,8 @@
"to": "0xef3487d24a0702703e04a26cef479e313c8fc7ae",
"input": "0x24d4e90a00000000000000000000000000000000000000000000000324bf7e0976f5f167",
"output": "0x0000000000000000000000000000000000000000000000012535c5e5f87ee0d2",
"type": "DELEGATECALL"
"type": "DELEGATECALL",
"value": "0x0"
},
{
"from": "0x8695e5e79dab06fbbb05f445316fa4edb0da30f0",
@ -201,7 +205,8 @@
"to": "0xef3487d24a0702703e04a26cef479e313c8fc7ae",
"input": "0x872fb2b5000000000000000000000000000000000000000000000000c330b3f7006420b8",
"output": "0x00000000000000000000000000000000000000000000000224bf7df2c80f0878",
"type": "DELEGATECALL"
"type": "DELEGATECALL",
"value": "0x0"
},
{
"from": "0x8695e5e79dab06fbbb05f445316fa4edb0da30f0",
@ -210,7 +215,8 @@
"to": "0xef3487d24a0702703e04a26cef479e313c8fc7ae",
"input": "0x872fb2b500000000000000000000000000000000000000000000000237d37fe5d297a500",
"output": "0x0000000000000000000000000000000000000000000000093088c407fcbbce38",
"type": "DELEGATECALL"
"type": "DELEGATECALL",
"value": "0x0"
},
{
"from": "0x8695e5e79dab06fbbb05f445316fa4edb0da30f0",
@ -219,7 +225,8 @@
"to": "0xef3487d24a0702703e04a26cef479e313c8fc7ae",
"input": "0x24d4e90a00000000000000000000000000000000000000000000000b554841fac4cad6b0",
"output": "0x0000000000000000000000000000000000000000000000026d7fc130d6a74cbe",
"type": "DELEGATECALL"
"type": "DELEGATECALL",
"value": "0x0"
}
],
"value": "0x0",
@ -387,7 +394,8 @@
"data": "0x000000000000000000000000000000000000000000000000de0b6b3a76400000"
}
],
"type": "DELEGATECALL"
"type": "DELEGATECALL",
"value": "0x0"
}
],
"value": "0x0",