From 4dd2b8cdaa86e2bf67c814ef85022d22dd084830 Mon Sep 17 00:00:00 2001 From: roshan <19766713+rpalakkal@users.noreply.github.com> Date: Mon, 1 Apr 2024 13:46:38 -0400 Subject: [PATCH] feat: base test --- src/AxiomCli.sol | 3 +- src/AxiomTest.sol | 98 +++++++++++++++++++++++++--------------- src/AxiomV2Addresses.sol | 1 + test/Array.t.sol | 6 ++- test/Base.t.sol | 48 ++++++++++++++++++++ 5 files changed, 117 insertions(+), 39 deletions(-) create mode 100644 test/Base.t.sol diff --git a/src/AxiomCli.sol b/src/AxiomCli.sol index 69210d6..228c0c1 100644 --- a/src/AxiomCli.sol +++ b/src/AxiomCli.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.0; library AxiomCli { - /// @dev The SHA256 hash of the Axiom CLI binary bytes public constant CLI_SHASUM = hex"f0f355f27f363bab6acb092fabeeffcf63b80ba08a7bd13577317a6732a90ff7"; -} \ No newline at end of file +} diff --git a/src/AxiomTest.sol b/src/AxiomTest.sol index f42e37f..beb7195 100644 --- a/src/AxiomTest.sol +++ b/src/AxiomTest.sol @@ -5,11 +5,11 @@ import "forge-std/Test.sol"; import "forge-std/console.sol"; // 🧩 MODULES -import { AxiomVm, Query, Axiom, QueryArgs, FulfillCallbackArgs } from "./AxiomVm.sol"; -import { IAxiomV2Core } from "@axiom-crypto/v2-periphery/interfaces/core/IAxiomV2Core.sol"; -import { IAxiomV2Query } from "@axiom-crypto/v2-periphery/interfaces/query/IAxiomV2Query.sol"; -import { IAxiomV2Client } from "@axiom-crypto/v2-periphery/interfaces/client/IAxiomV2Client.sol"; -import { AxiomV2Addresses, MAINNET_CHAIN_ID, SEPOLIA_CHAIN_ID, BASE_SEPOLIA_CHAIN_ID } from "./AxiomV2Addresses.sol"; +import {AxiomVm, Query, Axiom, QueryArgs, FulfillCallbackArgs} from "./AxiomVm.sol"; +import {IAxiomV2Core} from "@axiom-crypto/v2-periphery/interfaces/core/IAxiomV2Core.sol"; +import {IAxiomV2Query} from "@axiom-crypto/v2-periphery/interfaces/query/IAxiomV2Query.sol"; +import {IAxiomV2Client} from "@axiom-crypto/v2-periphery/interfaces/client/IAxiomV2Client.sol"; +import {AxiomV2Addresses, MAINNET_CHAIN_ID, SEPOLIA_CHAIN_ID, BASE_SEPOLIA_CHAIN_ID, BASE_CHAIN_ID} from "./AxiomV2Addresses.sol"; // ⭐️ TEST /// @title AxiomTest @@ -32,10 +32,12 @@ abstract contract AxiomTest is Test { AxiomVm axiomVm; /// @dev Dummy address for AxiomV2Core used when Axiom is not yet deployed on a chain - address public constant DUMMY_AXIOM_V2_CORE_ADDRESS = 0xDeaDBEefDeaDBEEfdEadBEEFdEaDbEefCCcccccc; + address public constant DUMMY_AXIOM_V2_CORE_ADDRESS = + 0xDeaDBEefDeaDBEEfdEadBEEFdEaDbEefCCcccccc; /// @dev Dummy address for AxiomV2Query used when Axiom is not yet deployed on a chain - address public constant DUMMY_AXIOM_V2_QUERY_ADDRESS = 0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF; + address public constant DUMMY_AXIOM_V2_QUERY_ADDRESS = + 0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF; /// @dev Event emitted when a query is initiated on-chain event QueryInitiatedOnchain( @@ -61,7 +63,10 @@ abstract contract AxiomTest is Test { /// @dev Create a forked test environment and set up Axiom contracts /// @param urlOrAlias The URL or alias of the fork to create /// @param forkBlock The block number to fork from - function _createSelectForkAndSetupAxiom(string memory urlOrAlias, uint256 forkBlock) internal { + function _createSelectForkAndSetupAxiom( + string memory urlOrAlias, + uint256 forkBlock + ) internal { vm.createSelectFork(urlOrAlias, forkBlock); uint64 chainId = uint64(block.chainid); @@ -79,16 +84,24 @@ abstract contract AxiomTest is Test { ); axiomV2Core = IAxiomV2Core(axiomV2CoreAddress); axiomV2Query = IAxiomV2Query(axiomV2QueryAddress); - } else if (chainId == SEPOLIA_CHAIN_ID || chainId == BASE_SEPOLIA_CHAIN_ID) { - axiomV2CoreAddress = AxiomV2Addresses.axiomV2CoreMockAddress(chainId); - axiomV2QueryAddress = AxiomV2Addresses.axiomV2QueryMockAddress(chainId); + } else if ( + chainId == SEPOLIA_CHAIN_ID || chainId == BASE_SEPOLIA_CHAIN_ID + ) { + axiomV2CoreAddress = AxiomV2Addresses.axiomV2CoreMockAddress( + chainId + ); + axiomV2QueryAddress = AxiomV2Addresses.axiomV2QueryMockAddress( + chainId + ); require( - forkBlock >= AxiomV2Addresses.axiomV2CoreMockDeployBlock(chainId), + forkBlock >= + AxiomV2Addresses.axiomV2CoreMockDeployBlock(chainId), "AxiomV2CoreMock not yet deployed at forkBlock" ); require( - forkBlock >= AxiomV2Addresses.axiomV2QueryMockDeployBlock(chainId), + forkBlock >= + AxiomV2Addresses.axiomV2QueryMockDeployBlock(chainId), "AxiomV2QueryMock not yet deployed at forkBlock" ); axiomV2Core = IAxiomV2Core(axiomV2CoreAddress); @@ -108,19 +121,31 @@ abstract contract AxiomTest is Test { /// @param _querySchema The query schema to use /// @param input The input data for the query /// @param callbackTarget The address of the contract to send a callback to - function query(bytes32 _querySchema, bytes memory input, address callbackTarget) - internal - view - returns (Query memory) - { - return query( - _querySchema, - input, - callbackTarget, - bytes(""), - IAxiomV2Query.AxiomV2FeeData({ maxFeePerGas: 25 gwei, callbackGasLimit: 1_000_000, overrideAxiomQueryFee: 0 }), - msg.sender - ); + function query( + bytes32 _querySchema, + bytes memory input, + address callbackTarget + ) internal view returns (Query memory) { + uint64 maxFeePerGas = 25 gwei; + if ( + block.chainid == BASE_CHAIN_ID || + block.chainid == BASE_SEPOLIA_CHAIN_ID + ) { + maxFeePerGas = 0.75 gwei; + } + return + query( + _querySchema, + input, + callbackTarget, + bytes(""), + IAxiomV2Query.AxiomV2FeeData({ + maxFeePerGas: maxFeePerGas, + callbackGasLimit: 1_000_000, + overrideAxiomQueryFee: 0 + }), + msg.sender + ); } /// @dev Create a query into Axiom with advanced parameters @@ -138,15 +163,16 @@ abstract contract AxiomTest is Test { IAxiomV2Query.AxiomV2FeeData memory feeData, address caller ) internal view returns (Query memory) { - return Query({ - querySchema: _querySchema, - input: input, - callbackTarget: callbackTarget, - callbackExtraData: callbackExtraData, - feeData: feeData, - axiomVm: axiomVm, - outputString: "", - caller: caller - }); + return + Query({ + querySchema: _querySchema, + input: input, + callbackTarget: callbackTarget, + callbackExtraData: callbackExtraData, + feeData: feeData, + axiomVm: axiomVm, + outputString: "", + caller: caller + }); } } diff --git a/src/AxiomV2Addresses.sol b/src/AxiomV2Addresses.sol index 1dff546..828a12f 100644 --- a/src/AxiomV2Addresses.sol +++ b/src/AxiomV2Addresses.sol @@ -7,6 +7,7 @@ import { } from "@axiom-crypto/v2-periphery/libraries/configuration/AxiomV2Configuration.sol"; uint64 constant BASE_SEPOLIA_CHAIN_ID = 84_532; +uint64 constant BASE_CHAIN_ID = 8453; /// @title AxiomV2Addresses /// @notice AxiomV2Addresses is a library that contains the addresses of deployed Axiom V2 contracts diff --git a/test/Array.t.sol b/test/Array.t.sol index 7055808..6d8e3b2 100644 --- a/test/Array.t.sol +++ b/test/Array.t.sol @@ -24,7 +24,11 @@ contract ArrayTest is AxiomTest { blockNumbers[i] = 4_205_938; slots[i] = i; } - input = AxiomInput({ blockNumbers: blockNumbers, slots: slots, _address: address(0x8018fe32fCFd3d166E8b4c4E37105318A84BA11b)}); + input = AxiomInput({ + blockNumbers: blockNumbers, + slots: slots, + _address: address(0x8018fe32fCFd3d166E8b4c4E37105318A84BA11b) + }); querySchema = axiomVm.readCircuit("test/circuit/array.circuit.ts"); } diff --git a/test/Base.t.sol b/test/Base.t.sol new file mode 100644 index 0000000..55f03a0 --- /dev/null +++ b/test/Base.t.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "../src/AxiomTest.sol"; + +contract ArrayTest is AxiomTest { + using Axiom for Query; + + struct AxiomInput { + uint64[] blockNumbers; + uint256[] slots; + address _address; + } + + AxiomInput public input; + bytes32 public querySchema; + + function setUp() public { + _createSelectForkAndSetupAxiom("base", BASE_CHAIN_ID); + + uint64[] memory blockNumbers = new uint64[](3); + uint256[] memory slots = new uint256[](3); + for (uint256 i = 0; i < 3; i++) { + blockNumbers[i] = 4_205_938; + slots[i] = i; + } + input = AxiomInput({ + blockNumbers: blockNumbers, + slots: slots, + _address: address(0x8018fe32fCFd3d166E8b4c4E37105318A84BA11b) + }); + + querySchema = axiomVm.readCircuit("test/circuit/array.circuit.ts"); + } + + /// @dev Simple demonstration of testing an Axiom client contract using Axiom cheatcodes + function test_simple_example() public { + // create a query into Axiom with default parameters + Query memory q = query( + querySchema, + abi.encode(input), + address(0x8018fe32fCFd3d166E8b4c4E37105318A84BA11b) + ); + + // send the query to Axiom + q.send(); + } +}