Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(protocol): update ric0 & sp1 verification contract #18269

Merged
merged 5 commits into from
Oct 21, 2024
Merged
Show file tree
Hide file tree
Changes from 2 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: 2 additions & 2 deletions packages/protocol/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@
"merkletreejs": "^0.4.0",
"optimism": "github:ethereum-optimism/optimism#v1.8.0",
"p256-verifier": "github:taikoxyz/p256-verifier#v0.1.0",
"risc0-ethereum": "github:risc0/risc0-ethereum#v1.0.0",
"risc0-ethereum": "github:risc0/risc0-ethereum#v1.1.2",
"solady": "github:Vectorized/solady#v0.0.231",
"sp1-contracts": "github:succinctlabs/sp1-contracts#v2.0.0"
"sp1-contracts": "github:succinctlabs/sp1-contracts#v3.0.0-rc3"
}
}
6 changes: 3 additions & 3 deletions packages/protocol/script/layer1/DeployProtocolOnL1.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ pragma solidity ^0.8.24;

import "@openzeppelin/contracts/utils/Strings.sol";
import "@risc0/contracts/groth16/RiscZeroGroth16Verifier.sol";
import { SP1Verifier as SP1Verifier200rc } from "@sp1-contracts/src/v2.0.0/SP1VerifierPlonk.sol";
import { SP1Verifier as SP1Verifier300rc } from "@sp1-contracts/src/v3.0.0-rc3/SP1VerifierPlonk.sol";
smtmfft marked this conversation as resolved.
Show resolved Hide resolved

// Actually this one is deployed already on mainnet, but we are now deploying our own (non via-ir)
// version. For mainnet, it is easier to go with one of:
Expand Down Expand Up @@ -416,8 +416,8 @@ contract DeployProtocolOnL1 is DeployCapability {
});

// Deploy sp1 plonk verifier
SP1Verifier200rc sp1Verifier200rc = new SP1Verifier200rc();
register(rollupAddressManager, "sp1_remote_verifier", address(sp1Verifier200rc));
SP1Verifier300rc sp1Verifier300rc = new SP1Verifier300rc();
smtmfft marked this conversation as resolved.
Show resolved Hide resolved
register(rollupAddressManager, "sp1_remote_verifier", address(sp1Verifier300rc));

deployProxy({
name: "tier_zkvm_sp1",
Expand Down
6 changes: 3 additions & 3 deletions packages/protocol/script/layer1/DeploySP1Verifier.s.sol
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import { SP1Verifier as SP1Verifier200rc } from "@sp1-contracts/src/v2.0.0/SP1VerifierPlonk.sol";
import { SP1Verifier as SP1Verifier300rc } from "@sp1-contracts/src/v3.0.0-rc3/SP1VerifierPlonk.sol";
import "test/shared/DeployCapability.sol";
import "src/layer1/verifiers/SP1Verifier.sol";

Expand All @@ -16,8 +16,8 @@ contract DeploySP1Verifier is DeployCapability {
vm.startBroadcast(deployerPrivKey);

// Deploy sp1 plonk verifier
SP1Verifier200rc sp1Verifier200rc = new SP1Verifier200rc();
register(rollupAddressManager, "sp1_remote_verifier", address(sp1Verifier200rc));
SP1Verifier300rc sp1Verifier300rc = new SP1Verifier300rc();
register(rollupAddressManager, "sp1_remote_verifier", address(sp1Verifier300rc));

deployProxy({
name: "tier_zkvm_sp1",
Expand Down
5 changes: 5 additions & 0 deletions packages/protocol/script/layer1/config_dcap_sgx_verifier.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ if [ $# -eq 0 ]; then
exit 1
fi

# dev addresses of the verifier/attester/pemCertChain.
# export SGX_VERIFIER_ADDRESS=0xebB0DA61818F639f460F67940EB269b36d1F104E
# export ATTESTATION_ADDRESS=0xCFd1a900c9C0aB14443460b8F011d8076db636c2
# export PEM_CERTCHAIN_ADDRESS=0xaa22e95F5Bf27E07c02e6cc41A700597832FA30d

# Hekla addresses of the verifier/attester/pemCertChain.
export SGX_VERIFIER_ADDRESS=0x532EFBf6D62720D0B2a2Bb9d11066E8588cAE6D9
export ATTESTATION_ADDRESS=0xC6cD3878Fc56F2b2BaB0769C580fc230A95e1398
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ contract RiscZeroGroth16VerifierTest is TaikoL1TestBase {
);

rv.setImageIdTrusted(
bytes32(0x4f6beb0c538971a81491c22de3995c82e6fd7938d5090366d7b618d5f6df504d), true
bytes32(0x7669d1059d0dfa9537c2b3581569b8bc244495e6c406d07dea628bc8cf480392), true
);
}

Expand All @@ -44,9 +44,9 @@ contract RiscZeroGroth16VerifierTest is TaikoL1TestBase {
vm.startPrank(Emma);

bytes memory seal =
hex"310fe59815ffa3b596af0bdccd0aaa064495d5db94fe367414d3a9212c8ce17383717e531ced511d89956c7c8aa0cc8531dac8660093581c5ae19c48a39fc14fd98dc1050684083592dab0fd9a2482c47ab4833c4f9b9a6770a7ce439a4f0e94bc035809138a7566873e34d202708ce4858665202417e645aeb299d4f7633fead7c667562b9104bdc79a0c379145ca2431598beec20b75a722915ff0a872771652583f9206e75bd317e73b1af7705f70aa52c30bc33ea6792b9e080177502fe074b87beb1add2ebe112c7bd17667a418fd9ef6d8e89e606c5efff14b5df24f7aa40c5c4f2bcaaa6f206d2d1e15356c533c5210258a6f1b1d1d22cb63cff0323863d7fe3b";
hex"50bd1769220929ac1ac3f9d3a8a4e7f4bcec136f8ea44be5a7248785d83b13879b409b762480f0ca5f38b164091e2def50b35829e453d1418492c01cc1b924e851580fe208d3808a925ce28724f0a862b944074f5277c4bd4b3153c1a1ff87056740628008fcc8d7edef53215db823e4773334e6f5fe08fed84c7ebd005fe4f42b80891724044cadde535253739049d99abc1a91a4a987ad93b0fcedbdb2440c9c2d662101509acb5f869bdb2e15d2609aa1a6c6c1a5a83e04fb2f77d25163b5675351be2204a497f20d43277d211adcc66b730b5d8d7635bb4a456cbf9029904ef2493a0346cd8e1aa2c270a160bc28bca77336bf18fe91b9dc8790a15f1618188dafa9";
bytes32 imageId =
bytes32(0x4f6beb0c538971a81491c22de3995c82e6fd7938d5090366d7b618d5f6df504d);
bytes32(0x7669d1059d0dfa9537c2b3581569b8bc244495e6c406d07dea628bc8cf480392);
bytes32 journalDigest =
bytes32(0xa82287ae36a69b51f8013851b3814ff1243da5dfa071f6fd9b46b85445895553);

Expand Down Expand Up @@ -101,8 +101,8 @@ contract RiscZeroGroth16VerifierTest is TaikoL1TestBase {
function test_risc0_verifyBatchProof() public {
vm.startPrank(Emma);

bytes32 aggProofImageId = 0x83e7411adcc296e0a021ff032a868434aa2a519b9d11ad44d11d443832280b44;
bytes32 blkProofImageId = 0x28879b90699846864c97f8f32e1b12aabd8ce13135302345d6ad242fa81ab40d;
bytes32 aggProofImageId = 0x8e192ebe6872b47645367692838b2d697c467f5e4543d605b0ef7d10365fb11a;
bytes32 blkProofImageId = 0x7669d1059d0dfa9537c2b3581569b8bc244495e6c406d07dea628bc8cf480392;

// proof generation elf
rv.setImageIdTrusted(aggProofImageId, true);
Expand Down Expand Up @@ -145,7 +145,7 @@ contract RiscZeroGroth16VerifierTest is TaikoL1TestBase {
});

bytes memory seal =
hex"310fe59810425afc4ed2bae56dfd76e9045f6cd41da30ae8f07a239e86fdb157bf37b0f51b937cb8deccab0d201623d530d0800c208f66dad3f6a38bc1df34408994dec1179209a5f94411e015b20e723512150cfb7e295debeb7ef4f8186cddcf19ba6527ee0d2a0fb8825568682a2fe48e2f73fe9fa052379824751c3bd3f1353f44fe1857e07f5b4801846637b68eafb93aba0c8de8fdfffc76af62a513966f92d9750a977bce0568eb7438fa3497848bfce3e5fd815d9c24b4600e12d0d405d1fd76301ccf27547bddd49a2fa12d1a414f49c2030d0cdf29a87684964a171eefb7e82a5f86acbaacd8cd24d6c3bab06a568f4869087e825ee79237770f23315f3c5c";
hex"50bd176901a68e3f05b0e651b6e5ff18e5463be794699597908b42b9ac3195a464c2b67320fb89c8199909a5ef1ff32366d1047009f4758294090f4ce613129f64a9ff58109cf0f6cb0f22e194dab522a2938631b138f4afeb075117a05d1ad75093515e15de11d9b231b79be5d42b0c7921ba22d62a6594258745f3e5c2e10508741fd813581ea8fab28ee1d07cb1f2e84500e2993cff3ca2e37284cfb5cfec5fe301d92f4246b2dbffc17d2ef5d889f50b8f28c51d1bacd6b0c55399e574969bb0a77207ceda541460cfec3e0c315889d62c0c91c5cf0cecd515ada96712735e5cf0ea1664af11012004ba7cb6adea3751911c8afe5eb5979b1adf43da6f9c18837f3d";
// TierProof
TaikoData.TierProof memory proof = TaikoData.TierProof({
tier: 100,
Expand Down
15 changes: 7 additions & 8 deletions packages/protocol/test/layer1/verifiers/SP1PlonkVerifier.t.sol
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import { SP1Verifier as SP1PlonkVerifier } from "@sp1-contracts/src/v2.0.0/SP1VerifierPlonk.sol";
import { SP1Verifier as SP1PlonkVerifier } from "@sp1-contracts/src/v3.0.0-rc3/SP1VerifierPlonk.sol";
import "../based/TaikoL1TestBase.sol";

contract SP1PlonkVerifierTest is TaikoL1TestBase {
Expand Down Expand Up @@ -29,7 +29,7 @@ contract SP1PlonkVerifierTest is TaikoL1TestBase {
);

sp1.setProgramTrusted(
bytes32(0x00851c6ce0153ea4f7a6b8f9923ae1ad15d47476925777f4375d1a4b13137231), true
bytes32(0x00b6e596137c781eb0d53073d86d8a7ab56cffc5b5f04b5297ef2e62ac0c56bf), true
);
}

Expand All @@ -42,9 +42,8 @@ contract SP1PlonkVerifierTest is TaikoL1TestBase {
vm.startPrank(Emma);

bytes memory sp1Proof =
hex"4aca240a1f6e9f5f6927e5468a58a7ca24addf975aacc9293e89729bbb84f814725c911c2488230b0922c072f3261a6480dca80af7d3f1ac54aaef2d1929f06a89f92cb71fd0f2015f1bf32ae904e221d342e1efcbd2b1f2275acda3e2dc1e779297937903643bcbbe5a4f7261d091c264d47810e1a5ca2e1ba20b7b1b069567d3ba895d0e088f70848009522bb67c39c108eb1b29272902fbb5d18bb74b5c4085569879188b5c8f0730da420f6da4e656b66eb9a7ce01da7aff3efe9033e02df0549dc214195b64ca178b9e50b2b35c8449eeeef60a6a0056d9c6a525d5684a544088322a14f46d15740fe42ba83c8c6c57548c415610a545d6b2c7b4146a76a2c957ea2a1975915e864e420c006176e00e6ed26810e80d5c6cec4143daa50b61ec0cb207661ad396db21744b713c0454d78752e5e6eee2e9f5273f30322461fa32b2932d7c8a467de8fac07d8363238245369f3bd196e443ff90aec1754537019eaa4928ab7b0a34d973a5c15123d2820923153f47c0b742ebf1e8d952626a77aa957804446347f03aee26e4bddadba1a3b0f275b7271ff1cbcca1ca0756e22113165f2d0472fc2ac3fa2b4593b472c3333cef81bde5fddb31fed8a52fb450de3b74cd0ab415777a733c22d1aab02d794dac192ca2d3088a7b379dba8896c842bf599d15ab8792e980773a131bfdaa0ab4ff7dfae9c98fb5d6774a8007c3927ffd99ce1acd527de2273f9c1163019cfca98e9bea7a56ff0ca0e8cac93c2096860f6aff14ec69181f6554bca186646d1002a8c2ac0fbdde5d4440242360bb9344399a6429bebc7f97f56090217c091b0e655579d598e3979a1acc8a516cfee2dd43c3341c81a4163221e6a4980fdfb2af09d30c9fa18ad3fb9d10bf4d35fe48663dc597277c25927396fb8d8501b3829f8eccc672515d2a249dec90057d3fe53ca105851257092388f2823fecbf09a8ae35e4e0dcf0ec615366a4db47b7d7e1af480a431957268d2e5283a690f9168c215d481e07188c7bfd5bd227d034d74a035119410eb23b74bd2fb0711eefb7502fc61119161d207c42e88cf73640719305a753052f8665d2222b4ae696fa541c99ffcc9c38153a46675fbdf596d00104b4b0b41708da9b30c70462422bba87bdc2b011a8a302649b7249250ce71793cedfb3f5db1622a7ec48ba7ed576f9ced6b2c9c661e9bed64e6f484f1862b0cd71be2aa628";
bytes32 vKey = bytes32(0x00851c6ce0153ea4f7a6b8f9923ae1ad15d47476925777f4375d1a4b13137231);

hex"8fd4de722cab7cfc38b19720f0152ca6311a0a907219bf8dd0c449fe0b3e919f786053d124bd3e9bf8cfa21c98cbea4a43cf70c9c96af9a867a57277a763f5d19331cb772086bb134e1a27d16405dde7b59a654d2146a7d822fa9782e461b3cb4eb272000dc4d93a25a6be5cf1006217fb4be228102117d0a317052b4dd0434482ded2021ab08599ceadcf1cc15c9348dd32ec50d2b6c4b646e0c12472b266832b269d0926a6e6b95b473aa3fdce76052ca64818631c2bcdbe603ad8f87ed0bdd01ab9a00c2e00635547b918704c8ea4b5c7d3e1e8ddf7720f1f58178d10b254ce1090e20fcbdc1f89ccfc9ff88cc25ff96ebc683eed7f9792584446f923a7b30e0d248b133655fcdba58c2c6b8f4b79f4276211df7a78ef5ce97063fed0ebcbb005d47804fd8a75f57cc5f0524ce41601dcbbbc21f73eeac25cc28ec8b66f1e03e8a7202a878463c8ac8038639e4fd211be2b095055e8f06392e0c82c1bae65f791f0c92a6e77bec5e2b62812a9060949dbcca69f714c8b0cca0272d718c9c9b5d410cd2ebbdbb9a143dea6eeb17f39115475409169245f3b61b1c46a9ea6a3296797820c8892a15001619923a972ddbbd8c7dc16df8a698b63ff84f5b34236d464ab252495aebe4902046fb4879e5ca9be9a51b26d672718491adb533ab900b40ef3e70138310b399d6c544e35d4750d3ef44cfa8b721dcff6f5c55a5587da65c1216a26550a3e35dfa4bf583b90e99b3ac051901b689b17ac0390f6e49a334c62d6f1082cda2cafad0d059e00b61173d7ce925fbea86e03c8fe76d47d98ac2090e6051f4d0528029ff31747260bdd9692dc105bd598fb4816a45ef9e13705714fcdda1c19e82a87e5dbf0caff752ce3396a4ebe6d9399c4d422285bcfff0cdf81bddf19ffeb7b405da2dceb60e661c597226eaba2e753e81a92ad19cec6510bd82de50beeff70200e2241cf7fe9d8270c9a4779480c49995d5c99cd9ae7d5c1f9acdf1b4635b78b4a2d8975ce0f587eccce699f590594d837426c5bd59fc078f811ba2717e3816f83cb191077a3ccbb5cd09adf92ff69bcbc9fcaf0fd22bc0c573750251553c7f2cec501e12761e48a9c7377e307c5202ec5707ff6b9e41b3a3085380fc07b0fed0e3abf32aaa6922d7d9649f8a13a1083fe58ccfa9501757be0e85a2ecfd9c2bbeffce6922a421a2ccdca93c7632974a8c6618558e5a33eb4d8ed1d";
bytes32 vKey = bytes32(0x00b6e596137c781eb0d53073d86d8a7ab56cffc5b5f04b5297ef2e62ac0c56bf);
console2.logBytes(abi.encodePacked(vKey, sp1Proof));
// TierProof
TaikoData.TierProof memory proof =
Expand Down Expand Up @@ -105,11 +104,11 @@ contract SP1PlonkVerifierTest is TaikoL1TestBase {
// proof generation elf vk digest which is not a bn254 hash
// but a sha256 hash from the same Sp1Verifykey.
sp1.setProgramTrusted(
bytes32(0x25a022bd2d3ceba748620b63401e94bb156f195a0dc2cf445c2bdfc20358d393), true
bytes32(0x5b72cb095f1e07ac1aa60e7b06d8a7ab2b67fe2d57c12d4a2fde5cc52c0c56bf), true
);
// proof aggregation elf
sp1.setProgramTrusted(
bytes32(0x000b55d1eea2d844974b3449118e4221bdf44534897d530dd9ae54201a36ad97), true
bytes32(0x0041b4e466ae95d8e71c376eac1f45b8999d5eb1509b39edc12bf97521097880), true
);

vm.startPrank(address(L1));
Expand Down Expand Up @@ -149,7 +148,7 @@ contract SP1PlonkVerifierTest is TaikoL1TestBase {

// TierProof
bytes memory data =
hex"000b55d1eea2d844974b3449118e4221bdf44534897d530dd9ae54201a36ad9725a022bd2d3ceba748620b63401e94bb156f195a0dc2cf445c2bdfc20358d3934aca240a294f40587144c884ce9b2326d1b8e002218abeb9535dbfb27fde012f1eba3fba17ee609acf6acf73790d3063da18707342809998f3d8db3fcd5d094b29bb48d22ff04e45f4de3c6026cd67256e45ca562e786db8b36d51c1c5f2f862c993e38f0851ef22ac10ea44ae5b62899650d8a8bc76a983caef459e88c514e1cbd34aea1b6f71f91410d6365b9e635cb4c56b1f6b98eb883d7815273d49fff1c5a4addb0cca4a2f394210ff2d7fc1c33059201a663c9f38f01ef198ef345d4d3d3810b70c99d241029c4a099d3f5ab3b6f5602e04344cc55c821f97fcc163dd472b252119f2940b56f0eee79a0fd5062b20c3445c79d70c773d69abaeced5b68c25f5ae1c385a7f9e8d4c2bc24f9627fa814d8269f2cf73f704b3c46ea8dd0219d41db81e1dc0ac4f62d8d6b8715c5b1637d160c67cde18ee3c66c860830297cc875656120418336954c73523765728f31a0a0bdbf630ad9d937ddf9a1f8dbf88ca281a280e466fe7f8fe8c000826c01930b0d6af20210003b5eac307cd107dff2239340b36e4cbe03ffa0e3bf434aea3252b9b05504321916ac8110f83de55bc9635c62cb569714ad44343866aa1e60e3dd93c4789c0ae94207861bf09838f83cb32a9033d94d3a4d674fcc435cd1b86afd5260c0f6d1501737120d070b950aff9ce5e2821b54d7df5bc8fb28e4f4312f217e9bca61bde4b57cda1075f7bbaedbc259b0f6c6e92661ad9404e0bcb3f15b9839f09fa87d278c2f0f9d99e7eea9ff1f7f023b455edeac48de876a7943796ffba85f3bf1c662081e7e563255f4c268e8711123094ccd2d38b1d3f1ce2c485529b26ab6372fbc3638ffec3aeff657f21a8cf13152c305d2fb084234246dbad615832e98b8c63e8fe582a6fad6efb41642c0018100a1b2f3e2479cb09eaf1d86e530ad63d1d117430a87dcae5182540ad05fd1a17cd482143e3d18c0c82554c71b16c1a62cbad06037c0c61b9894717e681b12e42a110b132225dd8af852412f687ec229710fe17db56c28aad002d5d1313762864a7e8d79b65b9f59f3adcba9c82b891721f7c488d482d5b715f059e3d299602ea0e25424ef254362ac70781e66d35349755e76683c045f4824a6c3b38a9481ace0378d91f74a89cf1138c78f676a1a72931469f8016d9fe1246ae2ccf83422cfeb943fee210a39abcd0551f545f6929fce1722585de936142b2fe1736ccec";
hex"0041b4e466ae95d8e71c376eac1f45b8999d5eb1509b39edc12bf975210978805b72cb095f1e07ac1aa60e7b06d8a7ab2b67fe2d57c12d4a2fde5cc52c0c56bf8fd4de721f01f0d571dab506ab0a8c4b99f357f11b4fc8b47ab97c2efa686437fc053872083c9e70147649c2fbaa5e68e77b014a024b20206b865bd3a1c28ced4d21cba41de4ac423e9fd71b6a0193f33ebb9e06805e13d95032fe8862548800823b85b3132160d62dddcc882a51c62aab4ba196f6fcf09fd0943ef8153ac99f9982f01a30052e27bb82d88f5506537c18880f36219fe17751b562ecf6e08685cdafcafe2bec9ca35246370a51e4570ee437eca2d9fd373fc26f74dc3c5658ed6fc9a5c60a2245b77dd711b1a96992551bd101a9ce764dff8704c87f95f8d4669b8bf65c25c086d160405532b0eff81477135ae6b3ef791c7539ded4f525ab0c4d0bc179029836461907f0cf3c04d681395a10c8240ced3da9d30dfabd9ef5e4adb75dda11027bad2cc8e8b4ab2648137fa9bb44e6c21ec3cff40c1e356dd9e2d0db572f2f030b9e591c91cc5210beb693fc66ce5d51ecbb23b3f24af0e0e280ea1e62a3036d2da06fdcde9a0c8db3a3773e03e1476588ff54e47543e86f7cdaf37bbaa8124b1d2544e423be363a8a07aed33b1fd242631902f91bcdcf8405e59886d9ae073a20596079eb474c33bb9d14bc8d84d9cc6033b211ddbb97039734bedaccef163c7ac8df54a7760434563ad4e90a5526e9ac1e3535707cb1cb1867aa83e6ca0ecc4fd402eda1c35213f546e3d171c9660965c08e3d5f3e4de6d0163e0a18d922d56ba61565738167c49d8b1262c48ae47d749ab7ddbd7caf8a235115649ef32817e387937415e50aecb1e4614b183d4e8813e5809100e8b36843c9e29291d21b6e3309c6f534b3e6a40443d0efee93b2fceae0e2a39e59c95dbd672dbefb1827d46c1e9794a4bea891fa3fcd8403916185369c0c94fd4e93a45f53d2fe3b3e15e8d2114f9afcb7a3863d92a3259fb315d5c0bc9ad09e887e119de3e74a49b60bb47a4d3901835087c7fd1d9686fd83f81fc1eb7d0498b1c5f9a4d299af7ded192d8fe5e012fded12f7f7238926fa8b5207220d524756c49076abaf6e8327120e7bb56699fcd13d94cb50bc01e306552db7e8af06efbb954bff76efc844da0e14952b5b8480b0522296e67a8ebc2581bf8a8c6bcb36228949b483d8ce592cd2186c2c8ea51515ae38ceaac637dc170bb9a1755cdb3d94ffdeee7d0c5f78ecb60fb12b04f1951c38a5520feffe350aeb4046a1909d478f0605933fb5edfe50d9";
TaikoData.TierProof memory proof = TaikoData.TierProof({ tier: 0, data: data });

// `verifyProof()`
Expand Down
Loading