From fc4b806673247df9c7ce80bd00e8b2175712dbde Mon Sep 17 00:00:00 2001 From: Adam Hamrick Date: Tue, 8 Oct 2024 16:02:36 -0400 Subject: [PATCH] Adds Anvil Set Storage --- lib/client/rpc.go | 19 +++++++++++++++++++ lib/client/rpc_test.go | 18 ++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/lib/client/rpc.go b/lib/client/rpc.go index a982fa0ef..46b6dd1de 100644 --- a/lib/client/rpc.go +++ b/lib/client/rpc.go @@ -183,6 +183,25 @@ func (m *RPCClient) AnvilDropTransaction(params []interface{}) error { return nil } +// AnvilSetStorageAt sets storage at address +// API Reference https://book.getfoundry.sh/reference/anvil/ +func (m *RPCClient) AnvilSetStorageAt(params []interface{}) error { + rInt, err := rand.Int() + if err != nil { + return err + } + payload := map[string]interface{}{ + "jsonrpc": "2.0", + "method": "anvil_setStorageAt", + "params": params, + "id": rInt, + } + if _, err := m.client.R().SetBody(payload).Post(m.URL); err != nil { + return errors.Wrap(err, "anvil_setStorageAt") + } + return nil +} + type CurrentBlockResponse struct { Result string `json:"result"` } diff --git a/lib/client/rpc_test.go b/lib/client/rpc_test.go index 0f4b739bc..74132e5f4 100644 --- a/lib/client/rpc_test.go +++ b/lib/client/rpc_test.go @@ -130,6 +130,24 @@ func TestRPCAPI(t *testing.T) { t.Logf("status: %v", status) }) + t.Run("(anvil) test set storage at address", func(t *testing.T) { + ac, err := StartAnvil([]string{"--balance", "1", "--block-time", "5"}) + require.NoError(t, err) + client, err := ethclient.Dial(ac.URL) + require.NoError(t, err) + + randomAddress := common.HexToAddress("0x0d2026b3EE6eC71FC6746ADb6311F6d3Ba1C000B") + + anvilClient := NewRPCClient(ac.URL, nil) + err = anvilClient.AnvilSetStorageAt([]interface{}{randomAddress, "0x0", "0x420"}) + require.NoError(t, err) + status, err := client.StorageAt(context.Background(), randomAddress, common.HexToHash("0x0"), nil) + require.NoError(t, err) + require.Equal(t, "0x420", string(status)) + + t.Logf("status: %v", status) + }) + t.Run("(anvil) test we can shrink the block and control transaction inclusion", func(t *testing.T) { ac, err := StartAnvil([]string{"--balance", "1", "--block-time", "1"}) require.NoError(t, err)