From 06fc03e275757cb4b358a728882d43142d4e0be8 Mon Sep 17 00:00:00 2001 From: bigq Date: Thu, 27 Jul 2023 16:11:53 +0200 Subject: [PATCH] feat: init fork tests from Fork.t.sol instead from cli --- .github/workflows/forge.yml | 2 +- foundry.toml | 20 ++++++++----- package.json | 2 +- test/base/BaseTest.t.sol | 40 ------------------------- test/fork/Fork.t.sol | 52 +++++++++++++++++++++++++++++++++ test/fork/SismoConnectE2E.t.sol | 43 +++++++++++++++------------ 6 files changed, 90 insertions(+), 69 deletions(-) delete mode 100644 test/base/BaseTest.t.sol create mode 100644 test/fork/Fork.t.sol diff --git a/.github/workflows/forge.yml b/.github/workflows/forge.yml index 0174bb5..abc6aa5 100644 --- a/.github/workflows/forge.yml +++ b/.github/workflows/forge.yml @@ -24,4 +24,4 @@ jobs: run: forge build - name: Run Forge tests - run: forge test --fork-url https://gateway.tenderly.co/public/polygon-mumbai -vvvv \ No newline at end of file + run: forge test -vvvv \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index 4d9fd31..49a3eae 100644 --- a/foundry.toml +++ b/foundry.toml @@ -6,12 +6,16 @@ fs_permissions = [{ access = "read-write", path = "./"}] bytecode_hash="none" -[fmt] -ignore = ["test/libs/SimoConnectLib.t.sol"] - [rpc_endpoints] -polygon = "${RPC_URL}" -gnosis = "${RPC_URL}" -goerli = "${RPC_URL}" -mumbai = "${RPC_URL}" -mainnet = "${RPC_URL}" +arbitrum_one = "https://arb-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" +arbitrum_goerli = "https://arb-goerli.g.alchemy.com/v2/${ALCHEMY_API_KEY}" +goerli = "https://eth-goerli.g.alchemy.com/v2/${ALCHEMY_API_KEY}" +gnosis = "https://rpc.gnosischain.com" +localhost = "http://localhost:8545" +mainnet = "https://eth-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" +mumbai = "https://polygon-mumbai.g.alchemy.com/v2/${ALCHEMY_API_KEY}" +optimism = "https://opt-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" +optimism_goerli = "https://opt-goerli.g.alchemy.com/v2/${ALCHEMY_API_KEY}" +polygon = "https://polygon-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" +scroll_testnet_goerli = "https://alpha-rpc.scroll.io/l2" +sepolia = "https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}" diff --git a/package.json b/package.json index 68806c9..f9573d9 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "prettier-plugin-solidity": "^1.0.0-beta.13" }, "scripts": { - "test": "forge test --fork-url https://gateway.tenderly.co/public/polygon-mumbai", + "test": "forge test", "lint": "prettier --write **.sol" } } diff --git a/test/base/BaseTest.t.sol b/test/base/BaseTest.t.sol deleted file mode 100644 index 01dd142..0000000 --- a/test/base/BaseTest.t.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; - -import "forge-std/Test.sol"; -import "forge-std/console.sol"; -import {IAddressesProvider, AuthRequestBuilder, ClaimRequestBuilder, SignatureBuilder, RequestBuilder} from "src/SismoConnectLib.sol"; - -interface IAvailableRootsRegistry { - event RegisteredRoot(uint256 root); - - function registerRoot(uint256 root) external; - - function owner() external view returns (address); -} - -contract BaseTest is Test { - IAddressesProvider sismoAddressesProvider = - IAddressesProvider(0x3Cd5334eB64ebBd4003b72022CC25465f1BFcEe6); - IAvailableRootsRegistry availableRootsRegistry = - IAvailableRootsRegistry( - sismoAddressesProvider.get(string("sismoConnectAvailableRootsRegistry")) - ); - - AuthRequestBuilder authRequestBuilder = - AuthRequestBuilder(sismoAddressesProvider.get(string("authRequestBuilder-v1.1"))); - ClaimRequestBuilder claimRequestBuilder = - ClaimRequestBuilder(sismoAddressesProvider.get(string("claimRequestBuilder-v1.1"))); - SignatureBuilder signatureBuilder = - SignatureBuilder(sismoAddressesProvider.get(string("signatureBuilder-v1.1"))); - RequestBuilder requestBuilder = - RequestBuilder(sismoAddressesProvider.get(string("requestBuilder-v1.1"))); - - function _registerTreeRoot(uint256 root) internal { - address rootsRegistryOwner = availableRootsRegistry.owner(); - // prank to the rootsRegistryOwner - vm.startPrank(rootsRegistryOwner); - availableRootsRegistry.registerRoot(root); - vm.stopPrank(); - } -} diff --git a/test/fork/Fork.t.sol b/test/fork/Fork.t.sol new file mode 100644 index 0000000..cf35343 --- /dev/null +++ b/test/fork/Fork.t.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +import "forge-std/Test.sol"; +import "forge-std/console.sol"; +import {IAddressesProvider, AuthRequestBuilder, ClaimRequestBuilder, SignatureBuilder, RequestBuilder} from "src/SismoConnectLib.sol"; + +interface IAvailableRootsRegistry { + event RegisteredRoot(uint256 root); + + function registerRoot(uint256 root) external; + + function owner() external view returns (address); +} + +contract ForkTest is Test { + IAddressesProvider sismoAddressesProvider; + IAvailableRootsRegistry availableRootsRegistry; + + AuthRequestBuilder authRequestBuilder; + ClaimRequestBuilder claimRequestBuilder; + SignatureBuilder signatureBuilder; + RequestBuilder requestBuilder; + + function setUp() public virtual { + vm.createSelectFork({urlOrAlias: "mainnet"}); + + sismoAddressesProvider = IAddressesProvider(0x3Cd5334eB64ebBd4003b72022CC25465f1BFcEe6); + availableRootsRegistry = IAvailableRootsRegistry( + sismoAddressesProvider.get(string("sismoConnectAvailableRootsRegistry")) + ); + + authRequestBuilder = AuthRequestBuilder( + sismoAddressesProvider.get(string("authRequestBuilder-v1.1")) + ); + claimRequestBuilder = ClaimRequestBuilder( + sismoAddressesProvider.get(string("claimRequestBuilder-v1.1")) + ); + signatureBuilder = SignatureBuilder( + sismoAddressesProvider.get(string("signatureBuilder-v1.1")) + ); + requestBuilder = RequestBuilder(sismoAddressesProvider.get(string("requestBuilder-v1.1"))); + } + + function _registerTreeRoot(uint256 root) internal { + address rootsRegistryOwner = availableRootsRegistry.owner(); + // prank to the rootsRegistryOwner + vm.startPrank(rootsRegistryOwner); + availableRootsRegistry.registerRoot(root); + vm.stopPrank(); + } +} diff --git a/test/fork/SismoConnectE2E.t.sol b/test/fork/SismoConnectE2E.t.sol index c738919..5862218 100644 --- a/test/fork/SismoConnectE2E.t.sol +++ b/test/fork/SismoConnectE2E.t.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.17; import "forge-std/console.sol"; import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import {BaseTest} from "../base/BaseTest.t.sol"; +import {ForkTest} from "./Fork.t.sol"; import {CheatSheet} from "test/misc/CheatSheet.sol"; import {Proofs} from "./proofs/Proofs.sol"; import {ResponseBuilder, ResponseWithoutProofs} from "test/utils/ResponseBuilderLib.sol"; @@ -18,12 +18,10 @@ import "src/utils/Fmt.sol"; // E2E tests for SismoConnect Solidity Library // These tests are fork tests made with proofs generated from the Vault App -contract SismoConnectE2E is BaseTest { +contract SismoConnectE2E_ForkTest is ForkTest { using ResponseBuilder for SismoConnectResponse; using ResponseBuilder for ResponseWithoutProofs; - Proofs proofs = new Proofs(); - SismoConnectHarness sismoConnect; address user = 0x7def1d6D28D6bDa49E69fa89aD75d160BEcBa3AE; @@ -46,6 +44,7 @@ contract SismoConnectE2E is BaseTest { ClaimRequest claimRequest; AuthRequest authRequest; SignatureRequest signature; + Proofs proofs; bytes16 immutable APP_ID_ZK_DROP = 0x11b1de449c6c4adb0b5775b3868b28b3; bytes16 immutable SISMO_CONTRIBUTORS_GROUP_ID = 0xe9ed316946d3d98dfcd829a53ec9822e; @@ -53,11 +52,14 @@ contract SismoConnectE2E is BaseTest { CheatSheet cheatsheet; - function setUp() public { + function setUp() public virtual override { + ForkTest.setUp(); + sismoConnect = new SismoConnectHarness(DEFAULT_APP_ID, DEFAULT_IS_IMPERSONATION_MODE); claimRequest = sismoConnect.exposed_buildClaim({groupId: 0xe9ed316946d3d98dfcd829a53ec9822e}); authRequest = sismoConnect.exposed_buildAuth({authType: AuthType.VAULT}); signature = sismoConnect.exposed_buildSignature({message: abi.encode(user)}); + proofs = new Proofs(); zkdrop = new ZKDropERC721({ appId: APP_ID_ZK_DROP, @@ -73,7 +75,7 @@ contract SismoConnectE2E is BaseTest { _registerTreeRoot(proofs.getRoot()); } - function test_SismoConnectLibWithOnlyClaimAndMessage() public view { + function testFork_SismoConnectLibWithOnlyClaimAndMessage() public view { (, bytes memory responseEncoded) = proofs.getResponseWithOneClaimAndSignature(); sismoConnect.exposed_verify({ @@ -85,7 +87,7 @@ contract SismoConnectE2E is BaseTest { }); } - function test_SismoConnectLibWithTwoClaimsAndMessage() public view { + function testFork_SismoConnectLibWithTwoClaimsAndMessage() public view { (, bytes memory responseEncoded) = proofs.getResponseWithTwoClaimsAndSignature(); ClaimRequest[] memory claims = new ClaimRequest[](2); @@ -101,7 +103,7 @@ contract SismoConnectE2E is BaseTest { }); } - function test_SismoConnectLibWithOnlyOneAuth() public { + function testFork_SismoConnectLibWithOnlyOneAuth() public { (, bytes memory responseEncoded) = proofs.getResponseWithOnlyOneAuthAndMessage(); SismoConnectRequest memory request = requestBuilder.build({ @@ -116,7 +118,7 @@ contract SismoConnectE2E is BaseTest { assertTrue(verifiedResult.auths[0].userId != 0); } - function test_SismoConnectLibWithClaimAndAuth() public { + function testFork_SismoConnectLibWithClaimAndAuth() public { (, bytes memory responseEncoded) = proofs.getResponseWithOneClaimOneAuthAndOneMessage(); SismoConnectRequest memory request = requestBuilder.build({ auth: sismoConnect.exposed_buildAuth({authType: AuthType.VAULT}), @@ -131,7 +133,7 @@ contract SismoConnectE2E is BaseTest { assertTrue(verifiedResult.auths[0].userId != 0); } - function test_ClaimAndAuthWithSignedMessageZKDROP() public { + function testFork_ClaimAndAuthWithSignedMessageZKDROP() public { // address that reverts if not modulo SNARK_FIELD after hashing the signedMessage for the circuit // should keep this address for testing purposes user = 0x7def1d6D28D6bDa49E69fa89aD75d160BEcBa3AE; @@ -144,7 +146,7 @@ contract SismoConnectE2E is BaseTest { zkdrop.claimWithSismoConnect(responseEncoded, user); } - function test_TwoClaimsOneVaultAuthWithSignature() public view { + function testFork_TwoClaimsOneVaultAuthWithSignature() public view { ClaimRequest[] memory claims = new ClaimRequest[](2); claims[0] = claimRequestBuilder.build({groupId: 0xe9ed316946d3d98dfcd829a53ec9822e}); claims[1] = claimRequestBuilder.build({groupId: 0x02d241fdb9d4330c564ffc0a36af05f6}); @@ -167,7 +169,7 @@ contract SismoConnectE2E is BaseTest { console.log("Claims in Verified result: %s", verifiedResult.claims.length); } - function test_ThreeClaimsOneVaultAuthWithSignatureOneClaimOptional() public view { + function testFork_ThreeClaimsOneVaultAuthWithSignatureOneClaimOptional() public view { ClaimRequest[] memory claims = new ClaimRequest[](3); claims[0] = claimRequestBuilder.build({groupId: 0xe9ed316946d3d98dfcd829a53ec9822e}); claims[1] = claimRequestBuilder.build({groupId: 0x02d241fdb9d4330c564ffc0a36af05f6}); @@ -195,7 +197,10 @@ contract SismoConnectE2E is BaseTest { console.log("Claims in Verified result: %s", verifiedResult.claims.length); } - function test_ThreeClaimsOneVaultAuthOneTwitterAuthWithSignatureOneClaimOptional() public view { + function testFork_ThreeClaimsOneVaultAuthOneTwitterAuthWithSignatureOneClaimOptional() + public + view + { ClaimRequest[] memory claims = new ClaimRequest[](3); claims[0] = claimRequestBuilder.build({groupId: 0xe9ed316946d3d98dfcd829a53ec9822e}); claims[1] = claimRequestBuilder.build({groupId: 0x02d241fdb9d4330c564ffc0a36af05f6}); @@ -228,7 +233,7 @@ contract SismoConnectE2E is BaseTest { console.log("Claims in Verified result: %s", verifiedResult.claims.length); } - function test_OneClaimOneOptionalTwitterAuthOneGithubAuthWithSignature() public view { + function testFork_OneClaimOneOptionalTwitterAuthOneGithubAuthWithSignature() public view { ClaimRequest[] memory claims = new ClaimRequest[](1); claims[0] = claimRequestBuilder.build({groupId: 0xe9ed316946d3d98dfcd829a53ec9822e}); @@ -256,7 +261,7 @@ contract SismoConnectE2E is BaseTest { console.log("Claims in Verified result: %s", verifiedResult.claims.length); } - function test_GitHubAuth() public view { + function testFork_GitHubAuth() public view { (, bytes memory encodedResponse) = proofs.getResponseWithGitHubAuth(); SismoConnectRequest memory request = requestBuilder.build({ @@ -267,7 +272,7 @@ contract SismoConnectE2E is BaseTest { sismoConnect.exposed_verify({responseBytes: encodedResponse, request: request}); } - function test_GitHubAuthWithoutSignature() public view { + function testFork_GitHubAuthWithoutSignature() public view { (, bytes memory encodedResponse) = proofs.getResponseWithGitHubAuthWithoutSignature(); SismoConnectRequest memory request = requestBuilder.build({ @@ -277,7 +282,7 @@ contract SismoConnectE2E is BaseTest { sismoConnect.exposed_verify({responseBytes: encodedResponse, request: request}); } - function test_withProxy() public { + function testFork_withProxy() public { SignatureRequest memory signatureRequest = sismoConnect.exposed_buildSignature({ message: abi.encode(user) }); @@ -317,7 +322,7 @@ contract SismoConnectE2E is BaseTest { upgradeable.exposed_verify({responseBytes: responseEncoded, signature: signatureRequest}); } - function test_RevertWithInvalidSismoIdentifier() public { + function testFork_RevertWithInvalidSismoIdentifier() public { (SismoConnectResponse memory response, ) = proofs.getResponseWithGitHubAuthWithoutSignature(); // specify in the response that the proof comes from a telegram ownership @@ -339,7 +344,7 @@ contract SismoConnectE2E is BaseTest { sismoConnect.exposed_verify({responseBytes: abi.encode(response), request: request}); } - function test_CheatSheet() public view { + function testFork_CheatSheet() public view { bytes memory responseBytes = proofs.getCheatSheetResponse(); cheatsheet.verifySismoConnectResponse(responseBytes); }