Skip to content

Commit ef29d1e

Browse files
Utilize BalanceChangeReason in tracing
1 parent f30479f commit ef29d1e

33 files changed

+875
-85
lines changed

core/tracing/hooks.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,102 @@ const (
232232
// account within the same tx (captured at end of tx).
233233
// Note it doesn't account for a self-destruct which appoints itself as recipient.
234234
BalanceDecreaseSelfdestructBurn BalanceChangeReason = 14
235+
236+
// Arbitrum specific
237+
BalanceIncreaseDeposit BalanceChangeReason = 15
238+
BalanceDecreaseWithdrawToL1 BalanceChangeReason = 16
239+
BalanceIncreaseL1PosterFee BalanceChangeReason = 17
240+
BalanceIncreaseInfraFee BalanceChangeReason = 18
241+
BalanceIncreaseNetworkFee BalanceChangeReason = 19
242+
BalanceIncreaseRetryTxPrepaid BalanceChangeReason = 20
243+
BalanceDecreaseRetryTxUndoRefund BalanceChangeReason = 21
244+
245+
BalanceChangeTransferRetryTxToEscrow BalanceChangeReason = 22
246+
BalanceChangeTransferRetryTxFromEscrow BalanceChangeReason = 23
247+
248+
BalanceChangeTransferRetryableToFeeRefundAddr BalanceChangeReason = 24
249+
BalanceChangeTransferRetryableToEscrow BalanceChangeReason = 25
250+
251+
BalanceChangeTransferRetryableToInfra BalanceChangeReason = 26
252+
BalanceChangeTransferRetryableFromInfra BalanceChangeReason = 27
253+
BalanceChangeTransferRetryableToNetwork BalanceChangeReason = 28
254+
BalanceChangeTransferRetryableFromNetwork BalanceChangeReason = 29
255+
256+
BalanceChangeTransferBatchposterReward BalanceChangeReason = 30
257+
BalanceChangeTransferBatchposterRefund BalanceChangeReason = 31
258+
259+
// Stylus
260+
BalanceChangeTransferActivationFee BalanceChangeReason = 32
261+
BalanceChangeTransferActivationReimburse BalanceChangeReason = 33
235262
)
236263

264+
func (b BalanceChangeReason) String(prev, new *big.Int) string {
265+
var reason string
266+
267+
prependString := func() string {
268+
if prev == nil || new == nil {
269+
return ""
270+
}
271+
if new.Cmp(prev) == 1 {
272+
return "balance increase due to a "
273+
} else if new.Cmp(prev) == -1 {
274+
return "balance decrease due to a "
275+
}
276+
return ""
277+
}
278+
279+
switch b {
280+
case BalanceChangeTransfer:
281+
reason = prependString() + "transfer via a call"
282+
case BalanceIncreaseDeposit:
283+
reason = "balance increase via a deposit"
284+
case BalanceDecreaseWithdrawToL1:
285+
reason = "balance decrease via a withdrawal to L1"
286+
case BalanceIncreaseL1PosterFee:
287+
reason = "balance increase via a fee collection for L1 posting"
288+
case BalanceIncreaseInfraFee:
289+
reason = "balance increase via a fee collection by infrastructure fee account"
290+
case BalanceIncreaseNetworkFee:
291+
reason = "balance increase via a fee collection by network fee account"
292+
// ArbitrumRetryTx
293+
case BalanceIncreaseRetryTxPrepaid:
294+
reason = "balance increase by prepaid value for a tx of ArbitrumRetryTx type"
295+
case BalanceDecreaseRetryTxUndoRefund:
296+
reason = "balance decrease by undoing Geth's refund for a tx of ArbitrumRetryTx type"
297+
case BalanceChangeTransferRetryTxToEscrow:
298+
reason = prependString() + "transfer to escrow in a tx of ArbitrumRetryTx type"
299+
case BalanceChangeTransferRetryTxFromEscrow:
300+
reason = prependString() + "transfer from escrow in a tx of ArbitrumRetryTx type"
301+
// ArbitrumSubmitRetryableTx
302+
case BalanceChangeTransferRetryableToFeeRefundAddr:
303+
reason = prependString() + "transfer to FeeRefundAddr in a tx of ArbitrumSubmitRetryableTx type"
304+
case BalanceChangeTransferRetryableToEscrow:
305+
reason = prependString() + "transfer to escrow in a tx of ArbitrumSubmitRetryableTx type"
306+
case BalanceChangeTransferRetryableToInfra:
307+
reason = prependString() + "transfer to infrastructure fee account in a tx of ArbitrumSubmitRetryableTx type"
308+
case BalanceChangeTransferRetryableFromInfra:
309+
reason = prependString() + "transfer from infrastructure fee account in a tx of ArbitrumSubmitRetryableTx type"
310+
case BalanceChangeTransferRetryableToNetwork:
311+
reason = prependString() + "transfer to network fee account in a tx of ArbitrumSubmitRetryableTx type"
312+
case BalanceChangeTransferRetryableFromNetwork:
313+
reason = prependString() + "transfer from network fee account in a tx of ArbitrumSubmitRetryableTx type"
314+
// Batchposter
315+
case BalanceChangeTransferBatchposterReward:
316+
reason = prependString() + "transfer from L1PricerFundsPoolAddress as batchPosterReward"
317+
case BalanceChangeTransferBatchposterRefund:
318+
reason = prependString() + "transfer from L1PricerFundsPoolAddress as batchPosterRefund"
319+
// Stylus
320+
case BalanceChangeTransferActivationFee:
321+
reason = prependString() + "transfer of activation fee to network fee account"
322+
case BalanceChangeTransferActivationReimburse:
323+
reason = prependString() + "transfer of reimburse amount after charging the activation fee"
324+
default:
325+
reason = "unspecified"
326+
}
327+
328+
return reason
329+
}
330+
237331
// GasChangeReason is used to indicate the reason for a gas change, useful
238332
// for tracing and reporting.
239333
//

eth/tracers/internal/tracetest/calltrace_test.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,19 @@ type arbitrumTransfer struct {
5353
Value string `json:"value"`
5454
}
5555

56+
type balanceChange struct {
57+
Addr string `json:"addr"`
58+
Prev string `json:"prev"`
59+
New string `json:"new"`
60+
Reason string `json:"reason"`
61+
}
62+
5663
// callTrace is the result of a callTracer run.
5764
type callTrace struct {
5865
// Arbitrum: we add these here due to the tracer returning the top frame
5966
BeforeEVMTransfers *[]arbitrumTransfer `json:"beforeEVMTransfers,omitempty"`
6067
AfterEVMTransfers *[]arbitrumTransfer `json:"afterEVMTransfers,omitempty"`
68+
BalanceChanges *[]balanceChange `json:"balanceChanges,omitempty"`
6169

6270
From common.Address `json:"from"`
6371
Gas *hexutil.Uint64 `json:"gas"`
@@ -301,13 +309,13 @@ func TestInternals(t *testing.T) {
301309
byte(vm.CALL),
302310
},
303311
tracer: mkTracer("callTracer", nil),
304-
want: fmt.Sprintf(`{"beforeEVMTransfers":[{"purpose":"feePayment","from":"%s","to":null,"value":"0x13880"}],"afterEVMTransfers":[{"purpose":"gasRefund","from":null,"to":"%s","value":"0xe3a8"},{"purpose":"tip","from":null,"to":"0x0000000000000000000000000000000000000000","value":"0x54d8"}],"from":"%s","gas":"0x13880","gasUsed":"0x54d8","to":"0x00000000000000000000000000000000deadbeef","input":"0x","calls":[{"from":"0x00000000000000000000000000000000deadbeef","gas":"0xe01a","gasUsed":"0x0","to":"0x00000000000000000000000000000000000000ff","input":"0x","value":"0x0","type":"CALL"}],"value":"0x0","type":"CALL"}`, origin.Hex(), origin.Hex(), originHex),
312+
want: fmt.Sprintf(`{"beforeEVMTransfers":[{"purpose":"feePayment","from":"%s","to":null,"value":"0x13880"}],"afterEVMTransfers":[{"purpose":"gasRefund","from":null,"to":"%s","value":"0xe3a8"},{"purpose":"tip","from":null,"to":"0x0000000000000000000000000000000000000000","value":"0x54d8"}],"balanceChanges":[{"addr":"%s","prev":"0x1c6bf52634000","new":"0x1c6bf52620780","reason":"unspecified"},{"addr":"%s","prev":"0x1c6bf52620780","new":"0x1c6bf5262eb28","reason":"unspecified"},{"addr":"0x0000000000000000000000000000000000000000","prev":"0x0","new":"0x54d8","reason":"unspecified"}],"from":"%s","gas":"0x13880","gasUsed":"0x54d8","to":"0x00000000000000000000000000000000deadbeef","input":"0x","calls":[{"from":"0x00000000000000000000000000000000deadbeef","gas":"0xe01a","gasUsed":"0x0","to":"0x00000000000000000000000000000000000000ff","input":"0x","value":"0x0","type":"CALL"}],"value":"0x0","type":"CALL"}`, origin.Hex(), origin.Hex(), origin.Hex(), origin.Hex(), originHex),
305313
},
306314
{
307315
name: "Stack depletion in LOG0",
308316
code: []byte{byte(vm.LOG3)},
309317
tracer: mkTracer("callTracer", json.RawMessage(`{ "withLog": true }`)),
310-
want: fmt.Sprintf(`{"beforeEVMTransfers":[{"purpose":"feePayment","from":"%s","to":null,"value":"0x13880"}],"afterEVMTransfers":[{"purpose":"gasRefund","from":null,"to":"%s","value":"0x0"},{"purpose":"tip","from":null,"to":"0x0000000000000000000000000000000000000000","value":"0x13880"}],"from":"%s","gas":"0x13880","gasUsed":"0x13880","to":"0x00000000000000000000000000000000deadbeef","input":"0x","error":"stack underflow (0 \u003c=\u003e 5)","value":"0x0","type":"CALL"}`, origin.Hex(), origin.Hex(), originHex),
318+
want: fmt.Sprintf(`{"beforeEVMTransfers":[{"purpose":"feePayment","from":"%s","to":null,"value":"0x13880"}],"afterEVMTransfers":[{"purpose":"gasRefund","from":null,"to":"%s","value":"0x0"},{"purpose":"tip","from":null,"to":"0x0000000000000000000000000000000000000000","value":"0x13880"}],"balanceChanges":[{"addr":"%s","prev":"0x1c6bf52634000","new":"0x1c6bf52620780","reason":"unspecified"},{"addr":"0x0000000000000000000000000000000000000000","prev":"0x0","new":"0x13880","reason":"unspecified"}],"from":"%s","gas":"0x13880","gasUsed":"0x13880","to":"0x00000000000000000000000000000000deadbeef","input":"0x","error":"stack underflow (0 \u003c=\u003e 5)","value":"0x0","type":"CALL"}`, origin.Hex(), origin.Hex(), origin.Hex(), originHex),
311319
},
312320
{
313321
name: "Mem expansion in LOG0",
@@ -320,7 +328,7 @@ func TestInternals(t *testing.T) {
320328
byte(vm.LOG0),
321329
},
322330
tracer: mkTracer("callTracer", json.RawMessage(`{ "withLog": true }`)),
323-
want: fmt.Sprintf(`{"beforeEVMTransfers":[{"purpose":"feePayment","from":"%s","to":null,"value":"0x13880"}],"afterEVMTransfers":[{"purpose":"gasRefund","from":null,"to":"%s","value":"0xdce2"},{"purpose":"tip","from":null,"to":"0x0000000000000000000000000000000000000000","value":"0x5b9e"}],"from":"%s","gas":"0x13880","gasUsed":"0x5b9e","to":"0x00000000000000000000000000000000deadbeef","input":"0x","logs":[{"address":"0x00000000000000000000000000000000deadbeef","topics":[],"data":"0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","position":"0x0"}],"value":"0x0","type":"CALL"}`, origin.Hex(), origin.Hex(), originHex),
331+
want: fmt.Sprintf(`{"beforeEVMTransfers":[{"purpose":"feePayment","from":"%s","to":null,"value":"0x13880"}],"afterEVMTransfers":[{"purpose":"gasRefund","from":null,"to":"%s","value":"0xdce2"},{"purpose":"tip","from":null,"to":"0x0000000000000000000000000000000000000000","value":"0x5b9e"}],"balanceChanges":[{"addr":"%s","prev":"0x1c6bf52634000","new":"0x1c6bf52620780","reason":"unspecified"},{"addr":"%s","prev":"0x1c6bf52620780","new":"0x1c6bf5262e462","reason":"unspecified"},{"addr":"0x0000000000000000000000000000000000000000","prev":"0x0","new":"0x5b9e","reason":"unspecified"}],"from":"%s","gas":"0x13880","gasUsed":"0x5b9e","to":"0x00000000000000000000000000000000deadbeef","input":"0x","logs":[{"address":"0x00000000000000000000000000000000deadbeef","topics":[],"data":"0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","position":"0x0"}],"value":"0x0","type":"CALL"}`, origin.Hex(), origin.Hex(), origin.Hex(), origin.Hex(), originHex),
324332
},
325333
{
326334
// Leads to OOM on the prestate tracer

eth/tracers/internal/tracetest/testdata/call_tracer/blob_tx.json

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,17 +56,15 @@
5656
},
5757
"input": "0x03f8b1820539806485174876e800825208940c2c51a0990aee1d73c1228de1586883415575088080c083020000f842a00100c9fbdf97f747e85847b4f3fff408f89c26842f77c882858bf2c89923849aa00138e3896f3c27f2389147507f8bcec52028b0efca6ee842ed83c9158873943880a0dbac3f97a532c9b00e6239b29036245a5bfbb96940b9d848634661abee98b945a03eec8525f261c2e79798f7b45a5d6ccaefa24576d53ba5023e919b86841c0675",
5858
"result": {
59-
"beforeEVMTransfers":
60-
[
59+
"beforeEVMTransfers": [
6160
{
6261
"purpose": "feePayment",
6362
"from": "0x0c2c51a0990AeE1d73C1228de158688341557508",
6463
"to": null,
6564
"value": "0x2de364958"
6665
}
6766
],
68-
"afterEVMTransfers":
69-
[
67+
"afterEVMTransfers": [
7068
{
7169
"purpose": "gasRefund",
7270
"from": null,
@@ -80,6 +78,20 @@
8078
"value": "0x200b20"
8179
}
8280
],
81+
"balanceChanges": [
82+
{
83+
"addr": "0x0c2c51a0990AeE1d73C1228de158688341557508",
84+
"prev": "0xde0b6b3a7640000",
85+
"new": "0xde0b6b0c92db6a8",
86+
"reason": "unspecified"
87+
},
88+
{
89+
"addr": "0x0000000000000000000000000000000000000000",
90+
"prev": "0x272e0528",
91+
"new": "0x274e1048",
92+
"reason": "unspecified"
93+
}
94+
],
8395
"from": "0x0c2c51a0990aee1d73c1228de158688341557508",
8496
"gas": "0x5208",
8597
"gasUsed": "0x5208",
@@ -88,4 +100,4 @@
88100
"value": "0x0",
89101
"type": "CALL"
90102
}
91-
}
103+
}

eth/tracers/internal/tracetest/testdata/call_tracer/create.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,20 @@
6868
"value": "0x2a0383e2a65c00"
6969
}
7070
],
71+
"balanceChanges": [
72+
{
73+
"addr": "0x13e4ACeFE6a6700604929946E70E6443E4E73447",
74+
"prev": "0xcf3e0938579f000",
75+
"new": "0xcc9dd0fa2d39400",
76+
"reason": "unspecified"
77+
},
78+
{
79+
"addr": "0xD049bfd667cB46Aa3Ef5Df0dA3e57DB3Be39E511",
80+
"prev": "0x0",
81+
"new": "0x2a0383e2a65c00",
82+
"reason": "unspecified"
83+
}
84+
],
7185
"from": "0x13e4acefe6a6700604929946e70e6443e4e73447",
7286
"gas": "0x897be",
7387
"gasUsed": "0x897be",
@@ -77,4 +91,4 @@
7791
"type": "CREATE",
7892
"value": "0x0"
7993
}
80-
}
94+
}

eth/tracers/internal/tracetest/testdata/call_tracer/deep_calls.json

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,27 @@
131131
"value": "0x700fefccd9800"
132132
}
133133
],
134-
"calls": [
134+
"balanceChanges": [
135+
{
136+
"addr": "0x70C9217D814985faEF62B124420F8dFbdDD96433",
137+
"prev": "0x4ef436dcbda6cd4a",
138+
"new": "0x4ee2736385c64d4a",
139+
"reason": "unspecified"
140+
},
141+
{
142+
"addr": "0x70C9217D814985faEF62B124420F8dFbdDD96433",
143+
"prev": "0x4ee2736385c64d4a",
144+
"new": "0x4eed35ddc0d9354a",
145+
"reason": "unspecified"
146+
},
147+
{
148+
"addr": "0x1977C248e1014Cc103929Dd7f154199C916E39Ec",
149+
"prev": "0x0",
150+
"new": "0x700fefccd9800",
151+
"reason": "unspecified"
152+
}
153+
],
154+
"calls": [
135155
{
136156
"from": "0xc212e03b9e060e36facad5fd8f4435412ca22e6b",
137157
"gas": "0x31217",
@@ -428,4 +448,4 @@
428448
"type": "CALL",
429449
"value": "0x0"
430450
}
431-
}
451+
}

eth/tracers/internal/tracetest/testdata/call_tracer/delegatecall.json

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,26 @@
8484
"value": "0x371a55e8d6800"
8585
}
8686
],
87+
"balanceChanges": [
88+
{
89+
"addr": "0xA529806c67cc6486d4D62024471772F47F6FD672",
90+
"prev": "0x67820e39ac8fe9800",
91+
"new": "0x6774bb9ec2a789800",
92+
"reason": "unspecified"
93+
},
94+
{
95+
"addr": "0xA529806c67cc6486d4D62024471772F47F6FD672",
96+
"prev": "0x6774bb9ec2a789800",
97+
"new": "0x6781d71f56a713000",
98+
"reason": "unspecified"
99+
},
100+
{
101+
"addr": "0x5659922cE141EedBC2733678f9806c77b4eEBEE8",
102+
"prev": "0x0",
103+
"new": "0x371a55e8d6800",
104+
"reason": "unspecified"
105+
}
106+
],
87107
"calls": [
88108
{
89109
"calls": [
@@ -116,4 +136,4 @@
116136
"type": "CALL",
117137
"value": "0x0"
118138
}
119-
}
139+
}

eth/tracers/internal/tracetest/testdata/call_tracer/inner_create_oog_outer_throw.json

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,21 @@
7676
"value": "0x2aa1efb94e0000"
7777
}
7878
],
79-
"calls": [
79+
"balanceChanges": [
80+
{
81+
"addr": "0xE4A13Bc304682a903e9472F469C33801dd18d9E8",
82+
"prev": "0x33c763c929f62c4f",
83+
"new": "0x339cc1d970a82c4f",
84+
"reason": "unspecified"
85+
},
86+
{
87+
"addr": "0x1585936b53834b021f68CC13eEeFdEc2EfC8e724",
88+
"prev": "0x0",
89+
"new": "0x2aa1efb94e0000",
90+
"reason": "unspecified"
91+
}
92+
],
93+
"calls": [
8094
{
8195
"error": "contract creation code storage out of gas",
8296
"from": "0x1d3ddf7caf024f253487e18bc4a15b1a360c170a",
@@ -96,4 +110,4 @@
96110
"type": "CALL",
97111
"value": "0x0"
98112
}
99-
}
113+
}

eth/tracers/internal/tracetest/testdata/call_tracer/inner_instafail.json

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -72,22 +72,44 @@
7272
"value": "0x216e3433f7200"
7373
}
7474
],
75-
"type": "CALL",
75+
"balanceChanges": [
76+
{
77+
"addr": "0x66fdfd05e46126A07465aD24e40cc0597BC1ef31",
78+
"prev": "0x229ebbb36c3e0f20",
79+
"new": "0x229589d6991e3d20",
80+
"reason": "unspecified"
81+
},
82+
{
83+
"addr": "0x66fdfd05e46126A07465aD24e40cc0597BC1ef31",
84+
"prev": "0x229589d6991e3d20",
85+
"new": "0x229ca4d028fe9d20",
86+
"reason": "unspecified"
87+
},
88+
{
89+
"addr": "0xc822ef32e6d26E170B70Cf761e204c1806265914",
90+
"prev": "0x0",
91+
"new": "0x216e3433f7200",
92+
"reason": "unspecified"
93+
}
94+
],
95+
"type": "CALL",
7696
"from": "0x66fdfd05e46126a07465ad24e40cc0597bc1ef31",
7797
"to": "0x6c06b16512b332e6cd8293a2974872674716ce18",
7898
"value": "0x0",
7999
"gas": "0x1f97e",
80100
"gasUsed": "0x72de",
81101
"input": "0x2e1a7d4d00000000000000000000000000000000000000000000000014d1120d7b160000",
82-
"calls": [{
83-
"from":"0x6c06b16512b332e6cd8293a2974872674716ce18",
84-
"gas":"0x8fc",
85-
"gasUsed":"0x0",
86-
"to":"0x66fdfd05e46126a07465ad24e40cc0597bc1ef31",
87-
"input":"0x",
88-
"error":"insufficient balance for transfer",
89-
"value":"0x14d1120d7b160000",
90-
"type":"CALL"
91-
}]
102+
"calls": [
103+
{
104+
"from": "0x6c06b16512b332e6cd8293a2974872674716ce18",
105+
"gas": "0x8fc",
106+
"gasUsed": "0x0",
107+
"to": "0x66fdfd05e46126a07465ad24e40cc0597bc1ef31",
108+
"input": "0x",
109+
"error": "insufficient balance for transfer",
110+
"value": "0x14d1120d7b160000",
111+
"type": "CALL"
112+
}
113+
]
92114
}
93-
}
115+
}

0 commit comments

Comments
 (0)