From e0344731ae0347282c30fc4de43fa638b591bdbe Mon Sep 17 00:00:00 2001 From: srdtrk Date: Sun, 23 Jun 2024 16:04:43 +0400 Subject: [PATCH] feat: basic tests passing --- contracts/test/SP1ICS07Tendermint.t.sol | 137 ++++++++++++++++++------ 1 file changed, 103 insertions(+), 34 deletions(-) diff --git a/contracts/test/SP1ICS07Tendermint.t.sol b/contracts/test/SP1ICS07Tendermint.t.sol index 280d772..eec0302 100644 --- a/contracts/test/SP1ICS07Tendermint.t.sol +++ b/contracts/test/SP1ICS07Tendermint.t.sol @@ -1,60 +1,129 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.25; +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; -import {Test, console} from "forge-std/Test.sol"; +import "forge-std/console.sol"; +import {Test} from "forge-std/Test.sol"; import {stdJson} from "forge-std/StdJson.sol"; +import {ICS07Tendermint} from "ibc-lite-shared/ics07-tendermint/ICS07Tendermint.sol"; import {SP1ICS07Tendermint} from "../src/SP1ICS07Tendermint.sol"; import {SP1Verifier} from "@sp1-contracts/SP1Verifier.sol"; +import {SP1MockVerifier} from "@sp1-contracts/SP1MockVerifier.sol"; -struct SP1ProofFixtureJson { - uint32 a; - uint32 b; - uint32 n; - bytes proof; - bytes publicValues; +struct SP1TendermintFixtureJson { + bytes trustedClientState; + bytes trustedConsensusState; + bytes targetConsensusState; + uint64 targetHeight; bytes32 vkey; + bytes publicValues; + bytes proof; } -contract SP1ICS07TendermintTest is Test { +contract SP1TendermintTest is Test { using stdJson for string; - SP1ICS07Tendermint public ics07Tendermint; + // TODO: Test non-mock ics07Tendermint, once we have a way to generate the fixture. + // SP1ICS07Tendermint public ics07Tendermint; + SP1ICS07Tendermint public mockIcs07Tendermint; - function loadFixture() public view returns (SP1ProofFixtureJson memory) { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/src/fixtures/fixture.json"); - string memory json = vm.readFile(path); - bytes memory jsonBytes = json.parseRaw("."); - return abi.decode(jsonBytes, (SP1ProofFixtureJson)); - } - - // TODO: fix after some rust code function setUp() public { - SP1ProofFixtureJson memory fixture = loadFixture(); + /* + SP1TendermintFixtureJson memory fixture = loadFixture("fixture.json"); SP1Verifier verifier = new SP1Verifier(); ics07Tendermint = new SP1ICS07Tendermint( fixture.vkey, - address(verifier) + address(verifier), + fixture.trustedClientState, + fixture.trustedConsensusState + ); + */ + + SP1TendermintFixtureJson memory mockFixture = loadFixture( + "mock_fixture.json" + ); + SP1MockVerifier mockVerifier = new SP1MockVerifier(); + mockIcs07Tendermint = new SP1ICS07Tendermint( + mockFixture.vkey, + address(mockVerifier), + mockFixture.trustedClientState, + mockFixture.trustedConsensusState + ); + } + + function loadFixture( + string memory fileName + ) public view returns (SP1TendermintFixtureJson memory) { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/fixtures/", fileName); + string memory json = vm.readFile(path); + bytes memory trustedClientState = json.readBytes(".trustedClientState"); + bytes memory trustedConsensusState = json.readBytes( + ".trustedConsensusState" + ); + bytes memory targetConsensusState = json.readBytes( + ".targetConsensusState" ); + uint64 targetHeight = uint64(json.readUint(".targetHeight")); + bytes32 vkey = json.readBytes32(".vkey"); + bytes memory publicValues = json.readBytes(".publicValues"); + bytes memory proof = json.readBytes(".proof"); + + SP1TendermintFixtureJson memory fixture = SP1TendermintFixtureJson({ + trustedClientState: trustedClientState, + trustedConsensusState: trustedConsensusState, + targetConsensusState: targetConsensusState, + targetHeight: targetHeight, + vkey: vkey, + publicValues: publicValues, + proof: proof + }); + + return fixture; } - function test_ValidSP1ICS07TendermintProof() public view { - SP1ProofFixtureJson memory fixture = loadFixture(); - (uint32 n, uint32 a, uint32 b) = ics07Tendermint.verifyIcs07Proof( - fixture.proof, + // Confirm that submitting an empty proof passes the mock verifier. + function test_ValidMockTendermint() public { + SP1TendermintFixtureJson memory fixture = loadFixture( + "mock_fixture.json" + ); + + ( + string memory chain_id, + ICS07Tendermint.TrustThreshold memory trust_level, + ICS07Tendermint.Height memory latest_height, + uint64 trusting_period, + uint64 unbonding_period, + bool is_frozen + ) = mockIcs07Tendermint.clientState(); + + assert(keccak256(bytes(chain_id)) == keccak256(bytes("mocha-4"))); + assert(trust_level.numerator == 1); + assert(trust_level.denominator == 3); + assert(latest_height.revision_number == 4); + assert(latest_height.revision_height == 2110658); + assert(trusting_period == 1_209_600_000_000_000); + assert(unbonding_period == 1_209_600_000_000_000); + assert(is_frozen == false); + + mockIcs07Tendermint.verifyIcs07UpdateClientProof( + bytes(""), fixture.publicValues ); - assert(n == fixture.n); - assert(a == fixture.a); - assert(b == fixture.b); } - function testFail_InvalidSP1ICS07TendermintProof() public view { - SP1ProofFixtureJson memory fixture = loadFixture(); + // Confirm that submitting a non-empty proof with the mock verifier fails. This typically + // indicates that the user has passed in a real proof to the mock verifier. + function testFail_Invalid_MockTendermint() public { + SP1TendermintFixtureJson memory fixture = loadFixture( + "mock_fixture.json" + ); - // Create a fake proof. - bytes memory fakeProof = new bytes(fixture.proof.length); + mockIcs07Tendermint.verifyIcs07UpdateClientProof( + bytes("aa"), + fixture.publicValues + ); - ics07Tendermint.verifyIcs07Proof(fakeProof, fixture.publicValues); + // assert(mockIcs07Tendermint.latestHeader() == fixture.targetHeaderHash); + // assert(mockIcs07Tendermint.latestHeight() == fixture.targetHeight); } }