From 637acc5fa10f0e179a4e0f61929a2611f0a55b23 Mon Sep 17 00:00:00 2001 From: Sina Mahmoodi Date: Thu, 13 Jul 2023 15:17:14 +0200 Subject: [PATCH] Finalise state after call, add selfdestruct test --- internal/ethapi/api.go | 1 + internal/ethapi/api_test.go | 54 +++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 2c35738552..ee8d42a952 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -1227,6 +1227,7 @@ func (s *BlockChainAPI) MulticallV1(ctx context.Context, blocks []CallBatch, blo } results[bi].Calls[i] = callRes gasUsed += result.UsedGas + state.Finalise(true) } results[bi].GasUsed = hexutil.Uint64(gasUsed) } diff --git a/internal/ethapi/api_test.go b/internal/ethapi/api_test.go index dae567deaa..09012be4f4 100644 --- a/internal/ethapi/api_test.go +++ b/internal/ethapi/api_test.go @@ -605,12 +605,21 @@ func TestMulticallV1(t *testing.T) { accounts = newAccounts(3) genBlocks = 10 signer = types.HomesteadSigner{} + cac = common.HexToAddress("0x0000000000000000000000000000000000000cac") genesis = &core.Genesis{ Config: params.TestChainConfig, Alloc: core.GenesisAlloc{ accounts[0].addr: {Balance: big.NewInt(params.Ether)}, accounts[1].addr: {Balance: big.NewInt(params.Ether)}, accounts[2].addr: {Balance: big.NewInt(params.Ether)}, + // Yul: + // object "Test" { + // code { + // let dad := 0x0000000000000000000000000000000000000dad + // selfdestruct(dad) + // } + // } + cac: {Balance: big.NewInt(params.Ether), Code: common.Hex2Bytes("610dad80ff")}, }, } ) @@ -1037,6 +1046,51 @@ func TestMulticallV1(t *testing.T) { }}, }}, }, + // Tests selfdestructed contract. + { + tag: latest, + blocks: []CallBatch{{ + Calls: []TransactionArgs{{ + From: &accounts[0].addr, + To: &cac, + }, { + From: &accounts[0].addr, + // Check that cac is selfdestructed and balance transferred to dad. + // object "Test" { + // code { + // let cac := 0x0000000000000000000000000000000000000cac + // let dad := 0x0000000000000000000000000000000000000dad + // if gt(balance(cac), 0) { + // revert(0, 0) + // } + // if gt(extcodesize(cac), 0) { + // revert(0, 0) + // } + // if eq(balance(dad), 0) { + // revert(0, 0) + // } + // } + // } + Input: hex2Bytes("610cac610dad600082311115601357600080fd5b6000823b1115602157600080fd5b6000813103602e57600080fd5b5050"), + }}, + }}, + want: []blockRes{{ + Number: "0xa", + Hash: "0x0000000000000000000000000000000000000000000000000000000000000000", + GasLimit: "0x47e7c4", + GasUsed: "0x1b83f", + FeeRecipient: "0x0000000000000000000000000000000000000000", + Calls: []callRes{{ + ReturnValue: "0x", + GasUsed: "0xd166", + Logs: []types.Log{}, + }, { + ReturnValue: "0x", + GasUsed: "0xe6d9", + Logs: []types.Log{}, + }}, + }}, + }, } for i, tc := range testSuite {