eth_getStorageAt - Scroll

Returns the value from a storage position at a given address, or in other words, returns the state of the contract's storage, which may not be exposed via the contract's methods.

Parameters

  • DATA, 20 Bytes - Address of the storage.
  • QUANTITY - Integer of the position in the storage.
  • QUANTITY|TAG - Integer block number, or the string "latest", "earliest" or "pending", see the default block parameter.

Returns

DATA - The value at this storage position.

Example

Calculating the correct position depends on the storage to retrieve. Consider the following contract deployed at 0x295a70b2de5e3953354a6a8344e616ed314d7251 by address 0x391694e7e0b0cce554cb130d723a9d27458f9298.

contract Storage {
    uint pos0;
    mapping(address => uint) pos1;

    function Storage() {
        pos0 = 1234;
        pos1[msg.sender] = 5678;
    }
}	

Retrieving the value of pos0 is straight forward:

Request

curl --location --request POST 'https://scroll-alpha.unifra.io/v1/your-api-key' \
--header 'Content-Type: application/json' \
--data-raw '{
    "jsonrpc":"2.0",
    "method":"eth_getStorageAt",
    "params":["0xE06F3c8076dcf99Bc7b9f7a552fE9D18e4c5e85c", "0x0", "latest"],
    "id":1
}'

Result

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": "0x0000000000000000000000000000000000000000000000000000000000000000"
}

Retrieving an element of the map is harder. The position of an element in the map is calculated with:

keccack(LeftPad32(key, 0), LeftPad32(map position, 0))

This means to retrieve the storage on

pos1[“0x391694e7e0b0cce554cb130d723a9d27458f9298”] we need to calculate the position with:

keccak(
	decodeHex(
		"000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" +
			"0000000000000000000000000000000000000000000000000000000000000001"
	)
);

The geth console which comes with the web3 library can be used to make the calculation:

> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001"
undefined
> web3.sha3(key, {"encoding": "hex"})
"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9"

Now to fetch the storage:

Request

curl https://eth-mainnet.unifra.io/v1/your-api-key \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "latest"], "id": 1}'

Result

{
	"jsonrpc": "2.0",
	"id": 1,
	"result": "0x000000000000000000000000000000000000000000000000000000000000162e"
}
Path Params
string
required
Body Params
string
Defaults to { "method": "debug_traceCall", "params": [ { "from": "0xe84118e2b5c74f9610377e86c840ac70f8ca925d", "to": "0xd9880690bd717189cc3fbe7b9020f27fae7ac76f", "value": "0xb1a2bc2ec50000", "gas": "0x226dc", "gasUsed": "0x20b84", "data": "0x5ae401dc00000000000000000000000000000000000000000000000000000000643925d800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf000000000000000000000000a1ea0b2354f5a344110af2b6ad68e75545009a03000000000000000000000000a0d71b9877f44c744546d649147e3f1e70a9376000000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000e84118e2b5c74f9610377e86c840ac70f8ca925d00000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000008b76dd55b0c2f4f5113000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, "0x13d5d0", { "tracer": "callTracer", "tracerConfig": { "onlyTopCall": false, "withLog": true } } ], "id": 1, "jsonrpc": "2.0" }
Responses

Language
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json