Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/tara/EthClient.sol
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,9 @@ contract EthClient is IBridgeLightClient, OwnableUpgradeable, UUPSUpgradeable {
bytes memory br = StorageProof.verify(stateRoot, ethBridgeAddress, account_proof, bridgeRootKey, storage_proof);
bytes32 br32 = bytes32(br);
if (br.length != 32) {
revert InvalidBridgeRoot(br32);
// it is possible that the bridge root is smaller than 32 bytes, so offset the value
uint256 offset = 32 - br.length;
br32 >>= offset * 8;
}

lastEpoch = epoch;
Expand Down
44 changes: 44 additions & 0 deletions test/MainnetEthClient.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.17;

import {Test} from "forge-std/Test.sol";
import {StorageProof} from "beacon-light-client/src/trie/StorageProof.sol";
import {State} from "beacon-light-client/src/trie/State.sol";
import {SecureMerkleTrie} from "beacon-light-client/src/trie/SecureMerkleTrie.sol";
import {RLPDecode} from "beacon-light-client/src/rlp/RLPDecode.sol";
import {console} from "forge-std/console.sol";
import {EthClient} from "../src/tara/EthClient.sol";
import {BeaconLightClient} from "beacon-light-client/src/BeaconLightClient.sol";
import {BeaconClientMock} from "./utils/LightClientMocks.sol";

contract EthClientMock is EthClient {
constructor(address clientMock, address ba) {
bridgeRootsMappingPosition = 0x0000000000000000000000000000000000000000000000000000000000000002;
client = BeaconLightClient(clientMock);
ethBridgeAddress = ba;
_disableInitializers();
}

function setLastEpoch(uint256 epoch) public {
lastEpoch = epoch;
}
}

contract MainnetEthClientTest is Test {
using State for bytes;
using RLPDecode for bytes;
using RLPDecode for RLPDecode.RLPItem;

BeaconClientMock lightClient = new BeaconClientMock();

function test_shortBridgeRootRegression() public {
lightClient.set_merkle_root(0x630e364c93cb3532b621e565ddcf04eb4cd2843e5d12abbdd60e1f09b9442b10);
address bridgeAddress = 0x359CF536b1fd6248ebAd1449E1B3727caB33A01d;
EthClientMock ethClient = new EthClientMock(address(lightClient), bridgeAddress);
ethClient.setLastEpoch(80);
bytes memory data =
hex"00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001120000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000e8000000000000000000000000000000000000000000000000000000000000010200000000000000000000000000000000000000000000000000000000000000214f90211a0037b1a63c1d7e0feee6f1522e486fd2fa207c4c223016e11dd120ca994e42b2ea0a8600483111f5d9e68ff71aa8b211b9f7b8f481bdf7eea4dd10f79d0410dfd2fa03068199a49eb1b06122ba038fc2bab32adf1d456e93b04fe7dc826433304f4e6a092357aeadd9f54f0c800a3d34d4cb948d88344a2abd158d050e742a428942987a04d7d3b776f64a1123e1c0e936ea1fe26d88453a927e665ac9edec15a8ce8848aa0ebc18462042b0cec3a171cb7bab35b9c937d725c1d721a2cf5164688df3f1375a0b43f33b1f1ad45004f1a24424c8d2b19c7978fd3129a9865463c354a8d9d3185a014a388d0a6c13a2d3e34351d88fc0ed8323eb519a87d79ddaddd16162d63054da0e537bc7a90b56ad6deb801efab7cc9e033773f96694f3c5144ff8c1e6dd289f6a0a754b93871cef389041070cc2518820f3fb168af04c1a5b3fc80f6f3bc641d0ba0db2c7c2016cd4166a3898fd040bb16178e4b45f416e03ea0d7820fbc90c7eaf3a08b8ce36bee084ee9bf5f5071e30cf7464ea9118f6e030ef8c121ff087eddb2fca06ba3e7eb3997b06065e31bb45c59b91355f4c21af3ff23b4677103f2b3c6a0a8a0aecd467615203421405b7119d4af2c67326543268460a434e1aecbddbaa51f43a02f4e237b548e7fbf95288cde64e547272d6c25472d02c14ffc5ec405c4c990f6a0828c344bd729eee4f712bbc7806b947e2c6552cc0bff0d48bd938047f632a7c7800000000000000000000000000000000000000000000000000000000000000000000000000000000000000214f90211a0b511a9e7cb33bc1db428deb8b56c647389c2328b97dfc8c2c079d42b8ce626a9a0d4f34c146253aa2878752c50daddda6de69af1eb1e1aaac5c97cf8acc36231b1a075a8f9680c7d3e9606797861072db52a97cbf2b54b7f578b25b155f39bd2968aa07dd81987fabe0c12ae5ea166a6d00f69c9bff50749c741a01115f3e31cff3687a0993fce89e507428ebfee75c37a306edd719d79dec29b2c9fcd4bfaedb657088ca0967530cf06aaeee15cdbecb5658fabfc313d1495ae792c7953bfd2f032bfe100a0c5cfa1c3f5d7aba5afb535e260c70c4acd322600a06fa2b9fd55aac44b26fca7a091caea74bf825af6d3bf8e5d4b26c1bc3b5899e2f0736ebde73078df566d4296a0cad6f487b4d2841142af00a5c893c1deba7da78b758d549c1c9ec220b25fca22a0bd584651ffe17217bb3082328fa5a90d8bd9560ff44bcb812e2781b8bbe029fba0681de6623e84c092301ba8db4b72f1d4ee389d2543cc9e3baa5475d9c19fc96ba05a213881ad98cbf60843ef234a0c4d8a63060bb148d2989a5776eab644f5f214a041b4fb26f48becb039acae352571daf64377ccca17b3554c163d917849628b58a041aef21544a654c52235a22fdc6161d536d3ef0364947a73300ee68cd028f8e7a02ac9114abe53d5d2827f50b10d0223f496db7c278722372dbba1ed3859ac3b9fa01d678a30d7fdb5ccc7f74479f5dd32b378c6c3a5991844369ac83cae8b6521e5800000000000000000000000000000000000000000000000000000000000000000000000000000000000000214f90211a0c0c0e7123c5f9ef46f0f09e468f640d7f6dcc6648af7ca73fccbfa9c8dfe0313a0b18084b1004f79e403cf406d5ad8ff89c1178ced8c026359e9db17bee7b6920da07217d9a960fb59fabb3d3618aee9158b6ed53af6d5a5f4efeada9e20d69e7c95a0e7024b9947cbc1f29f2bc4b9d3fc8deb4a70d15fe8fecdf769ae9a2f3f1a37a6a0b8069df3f74c021bb41e62302dc9be469cfd508ff52efd80f47415c212f62a36a03c433b84efd7325e3aeff3027bc3b1405a3229183b72af310ac2e80d2fbc8b8da0e3e062aff57c7f2fb8682e76558b034410db5a6601c9ddf9f0df498457f8d043a01dc03868da0986b60a290c35166cd2667c639fffab5a3613d822d6ad436d8187a0f8c389a428af5d19d7ce41260ca46a7029436b4c329efc857096b56d4e9ae0e4a091629e42a2d08168f2d1b2480ac41ac07e0be592bf99702fca9d477348d9d7b2a0f4cadb2a361e3f798c1a39e3e760ee9eabc979680114d7f904853df4a7704787a01eddba0c1a1b7ce0e688c847195d402be689b291346830a611af4e5b58ecf8dca0a0f0e1faba1d11271cba6424e15f7c3e2e6287ece25509a9e89520bea26ad26ba0072534c6a1b246f3f0c8b4d5db6bc1db2283448a4a354b459c96ffa2e5e55a57a05b3d1163cb77eeb526e726bdafb01d25cdfe484cc21bcd0fd0b057acd0fbb752a044ace89b62f33adcb4f1bb83c4a569059f8eeacc9ba54fec898105b545f586da800000000000000000000000000000000000000000000000000000000000000000000000000000000000000214f90211a0f26a5719637cb1ae0c36b2b9b74f99fa0e572274e6f12cfcac81290acb4e3129a06760a70c11ad734893edec674f7a81b4deb3f626aa69e36b1fc4772f8fca7eaca065d86d69f76f3042c689110a8e7c4dcfcaee359b7c5c36ac7f24de4bc250e252a01543d9fe34debf6f24c1f80faa3593d308bcb67b79c9d39bf0aad43de1a92080a0cd2c2e0678e96ebac83ef4fd5a9b15a9400374ffeb4bd8cf01ac82f103891d72a070f88eea808ca24619350570459f65b21ee1f1965c1ea4d1b96c6f450174f704a01b9e2783e6bca96101f60d733807db5ff2e44e70dc0d5b29162fbb2940eb9426a0b963ad6720373dc56b8f5d4c00443e9be14cbcd8cd0b55b05a2eae551519806da0de6b52edf0704a76d5d56d9d0449eebb0481ee25aeb19284b6f44e05e7b944d3a0514081ccf6e73d08af2a835b6e97e96e6fcef17b0e11015ee014f1d564828248a0c313c51c37a82091e76996e60935bdac1c3543e2e8f411471bc16d747067f8bfa08acb029c823dd3c9043f1ccfb6f5f023cfcb28e97d68d759cb44331fb67ee166a04afa7c42b8c80bc53f6b3c51ab5009d723bef31b8dc3bebfbd54dc921e6d5470a0674682927494f57de69e8c0e4e3d3492845e2452d7880cdabc2c7194daa843d4a0cb0b2a9de947f39f7414d971410d5cba0e8dbdb76c18a47e74984e422c3f04eca0dccd15be53459afe3489775259c4c086127b81c20df715564f8256c49a5e1c60800000000000000000000000000000000000000000000000000000000000000000000000000000000000000214f90211a083730f6c78884712183a5375444801fce066cf08dae2d5cbd9b2e7d554def251a03fce2af5a76154356bc9542a50f12f15357b26d43949fdc645fd7f404a7de80da0179d9060e12e311ecfb28bf204b0240ba96e16fe7ea6937c6e985b6b075684e8a000aedfb9b47e71037bf611db4e95e59cccd30e532f7cd204434ba10a3ad75e4fa0d5ca5fff53530d6fda50fd848f9b9a2eef457149e4a3b072f4da23de305932f3a0c9581cd15a530d8a02b3728105a4b5192d99400eddff0bb3ee46c1054ac4e7c3a001aa9cbef003532a47c155ba5c29be34c1e0755ffb6cb6162df3322677d58505a01070bbd25a5fa4a3c5e65a9d48a89c64162e1db750e30638cccecb49159decbda02aefd78833cd3e11766b3dcf16a976aba417db39206f7d22acfbf2e2db6d4f24a0f1929977a870c2a3d454722a458778171c06111b3ac225f93b40f9b750051a58a0a9006e8a63ac66a502188df77e5853c771d4e06be354ff2dfa205800f487cca9a055bde6fb2e1dd6cd48728e54a604b233c3669931c4a6fb72cdc3811d20c7027ba00412019f388183a0cddd3a72331dba74f5de66d76a45da37242e55042da99acfa07439df9a20aaa217bd693ba09c90a6c1e0857d2751acc68a238b593d3997927fa09389024d1ae66c41a0e74e440221266f18f567b35b9b16426d518ad63953f96ea05efa1d202624b04cc8342e0148dba3d3982ada8ebaca43d7de364add9ba76c1b800000000000000000000000000000000000000000000000000000000000000000000000000000000000000214f90211a0d7751b9ce4ee19805bc121b5769125cf8933a85895d008904bcb10a5d4c21b09a0a9079ac5e535cda33d98e5fd3bc3a940fb1481a6f79fefa9f6d3ec8d186b965aa0b9874f71d4aec9b158d7c68f55152e59cada59bc1d03216505ac649953e7d86aa08262fca7bf611c4b933a01ca08ee3dad45629fd4d4a9a68aaee4a4427d30e9dca0b5cf033be6455e3d803805fc5c5e32cbaf2c431aaf9fc0144b85a9fd1a22e4b7a0524b6de89136802622b2dbddb3801b54d5eff4537bba54e3e47603ee20886565a0292dfbde8bd664449938db61d2cda2183bf9f04b009949b896a84fb28f98ed84a093360ddff19db54be075e5da4fbaa179cd58a9825442efe429d6629da0776acfa02643357dc355ec6db27670bfb36d9e8a0690109698a985810058be05a5c2b797a0fdb399296d82d81f727e2d74ce44e1066d8b5d72765a2b6807bdf01dd95a2dfba09f3ba9e9d431d96354227e29decb1de1182043a0c8ea1459e477285f86534418a089ff13dfd3720bfab943df22f356cf9a5aa0dd9b729d0a8216990a71282e6a84a0ed260fd42aa3315fbad1b335fe000170673449f8f6a49fed040b6b177fe6284da031a5ab15e5e167a9bb510b17e6eff3af5ccd232f49009e08923c28e1b2d3805aa006836b5abf7833101e0cf3f0b2192dbfe76112c18c8499b4495ef825824eeaa6a08633b9a776b8ed4296fb2cee5c3c81e9160cac8cc231a6148723f83e4eb88a23800000000000000000000000000000000000000000000000000000000000000000000000000000000000000174f90171a03686f3b1aea051b98302cf4be45bcf08108c2fd6a6fa7e62fe5632ef348715eba029ad6acd6975e7acb16d8649969586e814348e404b8f947488ca38c656d2093fa0bf71b96a682496d0294453ad996d78615b1a9f429b455bf374e0b8c4a6e5b3258080a0189c5323300cc793e752a119c267896c6b66d0b9e179b27c938ed4a66a730b6ea091166fa63b47c3363bbee83d971e6fa273d079fe30953234d2a09e53db610a6580a02a5cf59aa675f46ec3ba549640b67930f78a9a1bfcbf502efb692b3bb58e0b09a05f6ed35b465442b424244e8c5b7292fb2b5eb3c9b114c022a8821e8fa0b1854680a0bb7c4a4651ae367f963ae1b465c8b70754e9f5269c315b84dc2c6ca4962669a7a0af8c76ee40e862350aadb6907d8b4ce9fa8f7d419950e666d6fee55b0e26604580a01e09efaaca8dee830b2bd2589ed821f824fd44a0ff30dd729f12ce4fdb8c62d7a092cb93e3a867313be5064ae1b10ab7fab723101dea01060183e25ec217ebbed9800000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f86e9d3f9cce8180453f8696ad70445e2ee1fddee297caf082afb1341e5ec3f7b84ef84c01880dfeb3e1b2eb2a62a0d0cce1163461c04b0ac9bf0b12896b5d2b8529f74328ff93e428c9853b39b2a3a04c07834949bf24137130bf0a8c2e9ad706751644d5f01b8a55477810a41174e9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000214f90211a06edb50853b261f88e455bacbfa92e746c90a781f38c23803d1541d551cb6f580a0a9e029bf9358c480db8e08b73119be54daaac3331b8e972e896e0c1b36da9a96a0d3bf99375b2f3ebae509811ad2e961d6ebf5ab618c3fa8dc582d8e8dde0f88b7a0d0fd84aeb22e17c5a960a36953b8961eb501d99f4f07cba210a3acfffefdb979a0d60f3dbc1cdd6eecd5b6af584c897fb914fb0c908ad2736a8730409674e272b8a0d2ffb4bb793023ff0ecde2047fe7a8d582cacd19057c11b6a373728a68e4b7e3a0b26befe9fb00909b4627c8c9a580b2a9fbb2eeb4f63734d4006a5b140f3745aba066226f81cc20f914947ca7a5b70a16653a685d8608865b8514b0a3360b46b862a0ec4866e1db135d0308853ab85cbe0ce1835ee7146daa422f4023b78eb3157d6aa0a22aaecf43f5d6f67eb37aae0a34737d7b7eb330528f995a4ba0f931264ca3f9a02474a8521f10b5d34508c6ea4319112ff87d4b94aa8ebc7d19e682532c3403eaa00539b5855d56f7eddd125c249b44b1575240351112be51429c34d8cc68b187cca0b4e2e264eb4332fda40c6fc4aaa936a6b1e45ce0ee42d14b2fa707069636086ca052d65463780ce18b1b63b8b2ca1ba4f4ef6d871765ebc5759ac2ae851ede5bf8a0918b14c70b5f47ed00c42f35512d0867a06f68a80440a40fd512ec56435e3209a0a26febf0bdb32ef558179c5c702fc4244dafb967786fab01aa97f57f21be29a9800000000000000000000000000000000000000000000000000000000000000000000000000000000000000134f90131a07c0c31f1659452bd10afbc52323fffa6c5e34c086fa2d31cb4aaf2443fb8b40aa00325477ed03233425c1c99f7db100c7151b6b01fdcb1845052c04f3a236feed980a039aa34f05cdea66dbcb85a1d4daf92a40e7579c0eb424549fd86e1fe028bdd04a0109c69d8d665b966f4b60e0c3b99388990ed6f7a49918bfafd967e2005cd9c05a043ada040af721a621f70cf5cae81ee2a09de1ada03492fdb9721835e08d40044a0a779ec53db479f50c90302a8bbb023374269f16d4de7e99ca843cb902b7240b18080808080a0f4384a5dd4586d3e524dd9650a5ed5c0bf224114bef7ded9c7baaa32cec27e72a0eaeb822c80a91491e6cc12d64cf946558e74eff2a62914bc42faf34ba841937a80a0273097ccdc1b8a5d0e185f79fb1ceed5033fe1490ec790aabf0e27d90a5d817f800000000000000000000000000000000000000000000000000000000000000000000000000000000000000053f851a0ab70dbb1922c0464f2539297e951d76844666921bb2592431095df2491d2b4df8080808080808080808080808080a0c12dc211246fd33ae70c84880b7d4142137318649df78587738bd219b6a0783380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043f8419f3256a510f1e1784f1b5ed5d5a257d9e7901458d4e12efb522003536d585a54a09f864f5566563fa9ca384592bdd030195c0dcf43edba309b9bdf15073cb35fae0000000000000000000000000000000000000000000000000000000000";
(bytes[] memory acc_proof, bytes[] memory storage_proof) = abi.decode(data, (bytes[], bytes[]));
ethClient.processBridgeRoot(acc_proof, storage_proof);
}
}