parent
9ee112b8c4
commit
252f2d468c
@ -0,0 +1,108 @@ |
||||
// SPDX-License-Identifier: MIT OR Apache-2.0 |
||||
pragma solidity >=0.8.0; |
||||
import {Test} from "forge-std/Test.sol"; |
||||
import "forge-std/StdJson.sol"; |
||||
import "../../contracts/libs/StateProofHelpers.sol"; |
||||
|
||||
/** |
||||
* @title Test of StateProofHelper |
||||
* @notice This test uses the JSON results from an RPC, such as https://www.quicknode.com/docs/ethereum/eth_getProof |
||||
* |
||||
* address: 0x3EF546F04a1B24EAF9dCe2ed4338A1b5c32e2a56 (TelepathyCcipReadhook on Sepolia) |
||||
* storageSlot: 0x0 (slot for TelepathyCcipReadhook.dispatched) |
||||
* blockNumber: 5322910 |
||||
* stateRoot: 0x03e88cdfbd9dc672604e797310dc332658844408a65fef43c83313f2cd19bb9b (sourced from https://etherscan.io/block/5322910, but also the hash of the 1st account proof) |
||||
* |
||||
* Alternatively, you can use cast index to access mappings: |
||||
* |
||||
* Get the the storage location for slot 0x0 (a nested mapping(address mailbox => mapping(uint256 messageNonce => messageId))) |
||||
* cast index address "0xd81BDE27ce1217C5DaF4dE611577667534f997B0" 0 |
||||
* |
||||
* Get the the index for nonce 0 at storage location calculated above |
||||
* cast index uint256 0 0xc975e4c05def9782b312ab471f3a24f2361ceeffb778cb5c7bbde5b1c4c53074 |
||||
*/ |
||||
contract StateProofHelpersTest is Test { |
||||
string proofsJson; |
||||
bytes[] accountProof; |
||||
bytes[] storageProof; |
||||
|
||||
address constant HOOK_ADDR = 0x3EF546F04a1B24EAF9dCe2ed4338A1b5c32e2a56; |
||||
bytes32 constant stateRoot = |
||||
bytes32( |
||||
0x03e88cdfbd9dc672604e797310dc332658844408a65fef43c83313f2cd19bb9b |
||||
); |
||||
|
||||
address constant MAILBOX_ADDR = 0xd81BDE27ce1217C5DaF4dE611577667534f997B0; |
||||
bytes constant MESSAGE_ID = |
||||
hex"31ede38d2e93c5aee49c836f329a626d8c6322abfbff3783e82e5759f870d7e9"; |
||||
uint256 constant ACCOUNT_PROOF_LENGTH = 7; |
||||
uint256 constant STORAGE_PROOF_LENGTH = 1; |
||||
uint256 constant DISPATCHED_SLOT = 0; |
||||
uint32 constant MESSAGE_NONCE = 0; |
||||
bytes32 constant EMPTY_BYTES32 = bytes32(""); |
||||
|
||||
function setUp() public virtual { |
||||
proofsJson = vm.readFile("./test/test-data/getProof-data.json"); |
||||
accountProof = getAccountProofs(); |
||||
storageProof = getStorageProofs(); |
||||
} |
||||
|
||||
function getAccountProofs() |
||||
public |
||||
view |
||||
returns (bytes[] memory accountProof_) |
||||
{ |
||||
accountProof_ = new bytes[](ACCOUNT_PROOF_LENGTH); |
||||
string memory prefix; |
||||
for (uint i = 0; i < ACCOUNT_PROOF_LENGTH; i++) { |
||||
prefix = string.concat( |
||||
".accountProof[", |
||||
string.concat(vm.toString(i), "]") |
||||
); |
||||
accountProof_[i] = stdJson.readBytes(proofsJson, prefix); |
||||
} |
||||
} |
||||
|
||||
function getStorageProofs() |
||||
public |
||||
view |
||||
returns (bytes[] memory storageProof_) |
||||
{ |
||||
storageProof_ = new bytes[](STORAGE_PROOF_LENGTH); |
||||
string memory prefix; |
||||
|
||||
for (uint i = 0; i < STORAGE_PROOF_LENGTH; i++) { |
||||
prefix = string.concat( |
||||
".storageProof[0].proof[", |
||||
string.concat(vm.toString(i), "]") |
||||
); |
||||
storageProof_[i] = stdJson.readBytes(proofsJson, prefix); |
||||
} |
||||
} |
||||
|
||||
function testStateProofHelpersTest_getStorageRoot_setsDeliveriesValue() |
||||
public |
||||
{ |
||||
// Calculate the storage root |
||||
bytes32 storageRoot = StorageProof.getStorageRoot( |
||||
HOOK_ADDR, |
||||
accountProof, |
||||
stateRoot |
||||
); |
||||
|
||||
// Calculate the dispatched slot |
||||
// mapping(address mailbox => mapping(uint256 messageNonce => messageId)) |
||||
bytes32 dispatchedSlot = keccak256( |
||||
abi.encode( |
||||
MESSAGE_NONCE, |
||||
keccak256(abi.encode(MAILBOX_ADDR, DISPATCHED_SLOT)) |
||||
) |
||||
); |
||||
bytes memory delivery = StorageProof.getStorageBytes( |
||||
keccak256(abi.encode(dispatchedSlot)), |
||||
storageProof, |
||||
storageRoot |
||||
); |
||||
assertTrue(keccak256(delivery) == keccak256(MESSAGE_ID)); |
||||
} |
||||
} |
Loading…
Reference in new issue