diff --git a/eth/tracers/internal/tracetest/supply_test.go b/eth/tracers/internal/tracetest/supply_test.go index 5ecb25718d..de1a9990a0 100644 --- a/eth/tracers/internal/tracetest/supply_test.go +++ b/eth/tracers/internal/tracetest/supply_test.go @@ -45,19 +45,19 @@ import ( type supplyInfoIssuance struct { GenesisAlloc *hexutil.Big `json:"genesisAlloc,omitempty"` - Reward *hexutil.Big `json:"reward"` - Withdrawals *hexutil.Big `json:"withdrawals"` + Reward *hexutil.Big `json:"reward,omitempty"` + Withdrawals *hexutil.Big `json:"withdrawals,omitempty"` } type supplyInfoBurn struct { - EIP1559 *hexutil.Big `json:"1559"` - Blob *hexutil.Big `json:"blob"` - Misc *hexutil.Big `json:"misc"` + EIP1559 *hexutil.Big `json:"1559,omitempty"` + Blob *hexutil.Big `json:"blob,omitempty"` + Misc *hexutil.Big `json:"misc,omitempty"` } type supplyInfo struct { - Issuance *supplyInfoIssuance `json:"issuance"` - Burn *supplyInfoBurn `json:"burn"` + Issuance *supplyInfoIssuance `json:"issuance,omitempty"` + Burn *supplyInfoBurn `json:"burn,omitempty"` // Block info Number uint64 `json:"blockNumber"` @@ -89,13 +89,6 @@ func TestSupplyGenesisAlloc(t *testing.T) { expected := supplyInfo{ Issuance: &supplyInfoIssuance{ GenesisAlloc: (*hexutil.Big)(new(big.Int).Mul(common.Big2, big.NewInt(params.Ether))), - Reward: (*hexutil.Big)(common.Big0), - Withdrawals: (*hexutil.Big)(common.Big0), - }, - Burn: &supplyInfoBurn{ - EIP1559: (*hexutil.Big)(common.Big0), - Blob: (*hexutil.Big)(common.Big0), - Misc: (*hexutil.Big)(common.Big0), }, Number: 0, Hash: common.HexToHash("0xbcc9466e9fc6a8b56f4b29ca353a421ff8b51a0c1a58ca4743b427605b08f2ca"), @@ -123,13 +116,7 @@ func TestSupplyRewards(t *testing.T) { expected := supplyInfo{ Issuance: &supplyInfoIssuance{ - Reward: (*hexutil.Big)(new(big.Int).Mul(common.Big2, big.NewInt(params.Ether))), - Withdrawals: (*hexutil.Big)(common.Big0), - }, - Burn: &supplyInfoBurn{ - EIP1559: (*hexutil.Big)(common.Big0), - Blob: (*hexutil.Big)(common.Big0), - Misc: (*hexutil.Big)(common.Big0), + Reward: (*hexutil.Big)(new(big.Int).Mul(common.Big2, big.NewInt(params.Ether))), }, Number: 1, Hash: common.HexToHash("0xcbb08370505be503dafedc4e96d139ea27aba3cbc580148568b8a307b3f51052"), @@ -193,13 +180,10 @@ func TestSupplyEip1559Burn(t *testing.T) { burn = new(big.Int).Mul(big.NewInt(21000), head.BaseFee) expected = supplyInfo{ Issuance: &supplyInfoIssuance{ - Reward: (*hexutil.Big)(reward), - Withdrawals: (*hexutil.Big)(common.Big0), + Reward: (*hexutil.Big)(reward), }, Burn: &supplyInfoBurn{ EIP1559: (*hexutil.Big)(burn), - Blob: (*hexutil.Big)(common.Big0), - Misc: (*hexutil.Big)(common.Big0), }, Number: 1, Hash: head.Hash(), @@ -238,14 +222,8 @@ func TestSupplyWithdrawals(t *testing.T) { head = chain.CurrentBlock() expected = supplyInfo{ Issuance: &supplyInfoIssuance{ - Reward: (*hexutil.Big)(common.Big0), Withdrawals: (*hexutil.Big)(big.NewInt(1337000000000)), }, - Burn: &supplyInfoBurn{ - EIP1559: (*hexutil.Big)(common.Big0), - Blob: (*hexutil.Big)(common.Big0), - Misc: (*hexutil.Big)(common.Big0), - }, Number: 1, Hash: head.Hash(), ParentHash: head.ParentHash, @@ -338,13 +316,8 @@ func TestSupplySelfdestruct(t *testing.T) { head := preCancunChain.CurrentBlock() // Check live trace output expected := supplyInfo{ - Issuance: &supplyInfoIssuance{ - Reward: (*hexutil.Big)(common.Big0), - Withdrawals: (*hexutil.Big)(common.Big0), - }, Burn: &supplyInfoBurn{ EIP1559: (*hexutil.Big)(big.NewInt(55289500000000)), - Blob: (*hexutil.Big)(common.Big0), Misc: (*hexutil.Big)(big.NewInt(5000000000)), }, Number: 1, @@ -384,14 +357,8 @@ func TestSupplySelfdestruct(t *testing.T) { // Check live trace output head = postCancunChain.CurrentBlock() expected = supplyInfo{ - Issuance: &supplyInfoIssuance{ - Reward: (*hexutil.Big)(common.Big0), - Withdrawals: (*hexutil.Big)(common.Big0), - }, Burn: &supplyInfoBurn{ EIP1559: (*hexutil.Big)(big.NewInt(55289500000000)), - Blob: (*hexutil.Big)(common.Big0), - Misc: (*hexutil.Big)(common.Big0), }, Number: 1, Hash: head.Hash(), @@ -535,13 +502,8 @@ func TestSupplySelfdestructItselfAndRevert(t *testing.T) { block := chain.GetBlockByNumber(1) expected := supplyInfo{ - Issuance: &supplyInfoIssuance{ - Reward: (*hexutil.Big)(common.Big0), - Withdrawals: (*hexutil.Big)(common.Big0), - }, Burn: &supplyInfoBurn{ EIP1559: (*hexutil.Big)(new(big.Int).Mul(block.BaseFee(), big.NewInt(int64(block.GasUsed())))), - Blob: (*hexutil.Big)(common.Big0), Misc: (*hexutil.Big)(eth5), // 5ETH burned from contract B }, Number: 1, diff --git a/eth/tracers/live/gen_supplyinfoburn.go b/eth/tracers/live/gen_supplyinfoburn.go index a8afe41527..d01eda3975 100644 --- a/eth/tracers/live/gen_supplyinfoburn.go +++ b/eth/tracers/live/gen_supplyinfoburn.go @@ -14,9 +14,9 @@ var _ = (*supplyInfoBurnMarshaling)(nil) // MarshalJSON marshals as JSON. func (s supplyInfoBurn) MarshalJSON() ([]byte, error) { type supplyInfoBurn struct { - EIP1559 *hexutil.Big `json:"1559"` - Blob *hexutil.Big `json:"blob"` - Misc *hexutil.Big `json:"misc"` + EIP1559 *hexutil.Big `json:"1559,omitempty"` + Blob *hexutil.Big `json:"blob,omitempty"` + Misc *hexutil.Big `json:"misc,omitempty"` } var enc supplyInfoBurn enc.EIP1559 = (*hexutil.Big)(s.EIP1559) @@ -28,9 +28,9 @@ func (s supplyInfoBurn) MarshalJSON() ([]byte, error) { // UnmarshalJSON unmarshals from JSON. func (s *supplyInfoBurn) UnmarshalJSON(input []byte) error { type supplyInfoBurn struct { - EIP1559 *hexutil.Big `json:"1559"` - Blob *hexutil.Big `json:"blob"` - Misc *hexutil.Big `json:"misc"` + EIP1559 *hexutil.Big `json:"1559,omitempty"` + Blob *hexutil.Big `json:"blob,omitempty"` + Misc *hexutil.Big `json:"misc,omitempty"` } var dec supplyInfoBurn if err := json.Unmarshal(input, &dec); err != nil { diff --git a/eth/tracers/live/gen_supplyinfoissuance.go b/eth/tracers/live/gen_supplyinfoissuance.go index 384353a58e..e2536ee325 100644 --- a/eth/tracers/live/gen_supplyinfoissuance.go +++ b/eth/tracers/live/gen_supplyinfoissuance.go @@ -15,8 +15,8 @@ var _ = (*supplyInfoIssuanceMarshaling)(nil) func (s supplyInfoIssuance) MarshalJSON() ([]byte, error) { type supplyInfoIssuance struct { GenesisAlloc *hexutil.Big `json:"genesisAlloc,omitempty"` - Reward *hexutil.Big `json:"reward"` - Withdrawals *hexutil.Big `json:"withdrawals"` + Reward *hexutil.Big `json:"reward,omitempty"` + Withdrawals *hexutil.Big `json:"withdrawals,omitempty"` } var enc supplyInfoIssuance enc.GenesisAlloc = (*hexutil.Big)(s.GenesisAlloc) @@ -29,8 +29,8 @@ func (s supplyInfoIssuance) MarshalJSON() ([]byte, error) { func (s *supplyInfoIssuance) UnmarshalJSON(input []byte) error { type supplyInfoIssuance struct { GenesisAlloc *hexutil.Big `json:"genesisAlloc,omitempty"` - Reward *hexutil.Big `json:"reward"` - Withdrawals *hexutil.Big `json:"withdrawals"` + Reward *hexutil.Big `json:"reward,omitempty"` + Withdrawals *hexutil.Big `json:"withdrawals,omitempty"` } var dec supplyInfoIssuance if err := json.Unmarshal(input, &dec); err != nil { diff --git a/eth/tracers/live/supply.go b/eth/tracers/live/supply.go index f3d9cd5e39..8963f2ba9e 100644 --- a/eth/tracers/live/supply.go +++ b/eth/tracers/live/supply.go @@ -24,8 +24,8 @@ func init() { type supplyInfoIssuance struct { GenesisAlloc *big.Int `json:"genesisAlloc,omitempty"` - Reward *big.Int `json:"reward"` - Withdrawals *big.Int `json:"withdrawals"` + Reward *big.Int `json:"reward,omitempty"` + Withdrawals *big.Int `json:"withdrawals,omitempty"` } //go:generate go run github.com/fjl/gencodec -type supplyInfoIssuance -field-override supplyInfoIssuanceMarshaling -out gen_supplyinfoissuance.go @@ -36,9 +36,9 @@ type supplyInfoIssuanceMarshaling struct { } type supplyInfoBurn struct { - EIP1559 *big.Int `json:"1559"` - Blob *big.Int `json:"blob"` - Misc *big.Int `json:"misc"` + EIP1559 *big.Int `json:"1559,omitempty"` + Blob *big.Int `json:"blob,omitempty"` + Misc *big.Int `json:"misc,omitempty"` } //go:generate go run github.com/fjl/gencodec -type supplyInfoBurn -field-override supplyInfoBurnMarshaling -out gen_supplyinfoburn.go @@ -49,8 +49,8 @@ type supplyInfoBurnMarshaling struct { } type supplyInfo struct { - Issuance *supplyInfoIssuance `json:"issuance"` - Burn *supplyInfoBurn `json:"burn"` + Issuance *supplyInfoIssuance `json:"issuance,omitempty"` + Burn *supplyInfoBurn `json:"burn,omitempty"` // Block info Number uint64 `json:"blockNumber"` @@ -116,9 +116,7 @@ func newSupplyInfo() supplyInfo { Withdrawals: big.NewInt(0), }, Burn: &supplyInfoBurn{ - EIP1559: big.NewInt(0), - Blob: big.NewInt(0), - Misc: big.NewInt(0), + Misc: big.NewInt(0), }, Number: 0, @@ -141,7 +139,9 @@ func (s *supply) OnBlockStart(ev tracing.BlockEvent) { // Calculate Burn for this block if ev.Block.BaseFee() != nil { burn := new(big.Int).Mul(new(big.Int).SetUint64(ev.Block.GasUsed()), ev.Block.BaseFee()) - s.delta.Burn.EIP1559.Add(s.delta.Burn.EIP1559, burn) + if burn.Sign() != 0 { + s.delta.Burn.EIP1559 = burn + } } // Blob burnt gas if blobGas := ev.Block.BlobGasUsed(); blobGas != nil && *blobGas > 0 && ev.Block.ExcessBlobGas() != nil { @@ -150,7 +150,7 @@ func (s *supply) OnBlockStart(ev tracing.BlockEvent) { baseFee = eip4844.CalcBlobFee(excess) burn = new(big.Int).Mul(new(big.Int).SetUint64(*blobGas), baseFee) ) - s.delta.Burn.Blob.Add(s.delta.Burn.Blob, burn) + s.delta.Burn.Blob = burn } } @@ -262,7 +262,34 @@ func (s *supply) OnClose() { } func (s *supply) write(data any) { - out, _ := json.Marshal(data) + supply, ok := data.(supplyInfo) + if !ok { + log.Warn("failed to cast supply tracer data on write to log file") + return + } + + // Remove empty fields + if supply.Issuance.Reward.Sign() == 0 { + supply.Issuance.Reward = nil + } + + if supply.Issuance.Withdrawals.Sign() == 0 { + supply.Issuance.Withdrawals = nil + } + + if supply.Issuance.GenesisAlloc == nil && supply.Issuance.Reward == nil && supply.Issuance.Withdrawals == nil { + supply.Issuance = nil + } + + if supply.Burn.Misc.Sign() == 0 { + supply.Burn.Misc = nil + } + + if supply.Burn.EIP1559 == nil && supply.Burn.Blob == nil && supply.Burn.Misc == nil { + supply.Burn = nil + } + + out, _ := json.Marshal(supply) if _, err := s.logger.Write(out); err != nil { log.Warn("failed to write to supply tracer log file", "error", err) }