From e2a96bbd42449ccebb700ce31ea19a46ad0f7f3a Mon Sep 17 00:00:00 2001 From: Yi Sun Date: Tue, 6 Feb 2024 03:45:53 -0500 Subject: [PATCH] feat: update imports --- remappings.txt | 1 + src/test/AxiomTest.sol | 52 +++---- src/test/AxiomVm.sol | 238 ++++++++------------------------ test/AverageBalance.t.sol | 71 ++-------- test/example/AverageBalance.sol | 2 +- 5 files changed, 97 insertions(+), 267 deletions(-) create mode 100644 remappings.txt diff --git a/remappings.txt b/remappings.txt new file mode 100644 index 0000000..48c8abb --- /dev/null +++ b/remappings.txt @@ -0,0 +1 @@ +@axiom-crypto/v2-periphery/=lib/axiom-v2-periphery/src \ No newline at end of file diff --git a/src/test/AxiomTest.sol b/src/test/AxiomTest.sol index 6c6520c..628b224 100644 --- a/src/test/AxiomTest.sol +++ b/src/test/AxiomTest.sol @@ -5,10 +5,10 @@ import "forge-std/Test.sol"; import "forge-std/console.sol"; import "./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} from "@axiom-crypto/v2-periphery/client/AxiomV2Addresses.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 } from "@axiom-crypto/v2-periphery/client/AxiomV2Addresses.sol"; abstract contract AxiomTest is Test { address public axiomV2CoreAddress; @@ -19,10 +19,7 @@ abstract contract AxiomTest is Test { AxiomVm axiomVm; - 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); @@ -39,21 +36,15 @@ abstract contract AxiomTest is Test { "AxiomV2Query not yet deployed at forkBlock" ); } else { - axiomV2CoreAddress = AxiomV2Addresses.axiomV2CoreMockAddress( - chainId - ); - axiomV2QueryAddress = AxiomV2Addresses.axiomV2QueryMockAddress( - chainId - ); + 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" ); } @@ -66,18 +57,17 @@ abstract contract AxiomTest is Test { axiomVm = new AxiomVm(axiomV2QueryAddress, urlOrAlias); } - function query( - bytes32 _querySchema, - bytes memory input, - address callbackTarget - ) internal view returns (Query memory) { - return - Query({ - querySchema: _querySchema, - input: input, - callbackTarget: callbackTarget, - axiomVm: axiomVm, - outputString: "" - }); + function query(bytes32 _querySchema, bytes memory input, address callbackTarget) + internal + view + returns (Query memory) + { + return Query({ + querySchema: _querySchema, + input: input, + callbackTarget: callbackTarget, + axiomVm: axiomVm, + outputString: "" + }); } } diff --git a/src/test/AxiomVm.sol b/src/test/AxiomVm.sol index 3429644..33c3d80 100644 --- a/src/test/AxiomVm.sol +++ b/src/test/AxiomVm.sol @@ -4,9 +4,9 @@ pragma solidity ^0.8.0; import "forge-std/Test.sol"; import "forge-std/console.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} from "@axiom-crypto/v2-periphery/client/AxiomV2Addresses.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 } from "@axiom-crypto/v2-periphery/client/AxiomV2Addresses.sol"; struct QueryArgs { uint64 sourceChainId; @@ -41,26 +41,17 @@ struct Query { library Axiom { function send(Query memory self) internal returns (bytes32[] memory) { - self.outputString = self.axiomVm.getArgsAndSendQuery( - self.querySchema, - self.input, - self.callbackTarget - ); + self.outputString = self.axiomVm.getArgsAndSendQuery(self.querySchema, self.input, self.callbackTarget); return fulfill(self); } function fulfill(Query memory self) internal returns (bytes32[] memory) { - return - fulfill( - self, - bytes(""), - IAxiomV2Query.AxiomV2FeeData({ - maxFeePerGas: 25 gwei, - callbackGasLimit: 1_000_000, - overrideAxiomQueryFee: 0 - }), - msg.sender - ); + return fulfill( + self, + bytes(""), + IAxiomV2Query.AxiomV2FeeData({ maxFeePerGas: 25 gwei, callbackGasLimit: 1_000_000, overrideAxiomQueryFee: 0 }), + msg.sender + ); } function fulfill( @@ -70,12 +61,7 @@ library Axiom { address caller ) internal returns (bytes32[] memory) { FulfillCallbackArgs memory args = self.axiomVm.fulfillCallbackArgs( - self.querySchema, - self.input, - self.callbackTarget, - callbackExtraData, - feeData, - caller + self.querySchema, self.input, self.callbackTarget, callbackExtraData, feeData, caller ); self.axiomVm.prankCallback(args); return args.axiomResults; @@ -85,18 +71,13 @@ library Axiom { contract AxiomVm is Test { /// @dev Axiom CLI version to use string constant CLI_VERSION = "2.0"; - string private constant CLI_VERSION_CHECK_CMD = - string( - abi.encodePacked( - "npm list @axiom-crypto/client | grep -q '@axiom-crypto/client@", - CLI_VERSION, - "' && echo 1 || echo 0" - ) - ); + string private constant CLI_VERSION_CHECK_CMD = string( + abi.encodePacked( + "npm list @axiom-crypto/client | grep -q '@axiom-crypto/client@", CLI_VERSION, "' && echo 1 || echo 0" + ) + ); string private constant CLI_VERSION_ERROR = - string( - abi.encodePacked("Axiom client v", CLI_VERSION, ".x not installed") - ); + string(abi.encodePacked("Axiom client v", CLI_VERSION, ".x not installed")); string urlOrAlias; @@ -114,10 +95,7 @@ contract AxiomVm is Test { * @param input path to the input file * @return querySchema */ - function readCircuit( - string memory _circuitPath, - bytes memory input - ) public returns (bytes32 querySchema) { + function readCircuit(string memory _circuitPath, bytes memory input) public returns (bytes32 querySchema) { _validateAxiomSetup(); string[] memory cli = new string[](6); cli[0] = "node"; @@ -148,36 +126,21 @@ contract AxiomVm is Test { bytes memory callbackExtraData, IAxiomV2Query.AxiomV2FeeData memory feeData ) public returns (QueryArgs memory args, string memory queryString) { - queryString = _run( - querySchema, - input, - callbackTarget, - callbackExtraData, - feeData - ); + queryString = _run(querySchema, input, callbackTarget, callbackExtraData, feeData); args = parseQueryArgs(queryString); } - function sendQueryArgs( - bytes32 querySchema, - bytes memory input, - address callbackTarget - ) public returns (QueryArgs memory args, string memory queryString) { - IAxiomV2Query.AxiomV2FeeData memory feeData = IAxiomV2Query - .AxiomV2FeeData({ - maxFeePerGas: 25 gwei, - callbackGasLimit: 1_000_000, - overrideAxiomQueryFee: 0 - }); + function sendQueryArgs(bytes32 querySchema, bytes memory input, address callbackTarget) + public + returns (QueryArgs memory args, string memory queryString) + { + IAxiomV2Query.AxiomV2FeeData memory feeData = IAxiomV2Query.AxiomV2FeeData({ + maxFeePerGas: 25 gwei, + callbackGasLimit: 1_000_000, + overrideAxiomQueryFee: 0 + }); bytes memory callbackExtraData = bytes(""); - return - sendQueryArgs( - querySchema, - input, - callbackTarget, - callbackExtraData, - feeData - ); + return sendQueryArgs(querySchema, input, callbackTarget, callbackExtraData, feeData); } /** @@ -200,15 +163,9 @@ contract AxiomVm is Test { args = FulfillCallbackArgs({ sourceChainId: sourceChainId, caller: caller, - querySchema: abi.decode( - vm.parseJson(compiledStrings[querySchema], ".querySchema"), - (bytes32) - ), + querySchema: abi.decode(vm.parseJson(compiledStrings[querySchema], ".querySchema"), (bytes32)), queryId: vm.parseJsonUint(_queryString, ".queryId"), - axiomResults: abi.decode( - vm.parseJson(_queryString, ".computeResults"), - (bytes32[]) - ), + axiomResults: abi.decode(vm.parseJson(_queryString, ".computeResults"), (bytes32[])), callbackExtraData: _query.callback.extraData, gasLimit: feeData.callbackGasLimit, callbackTarget: callbackTarget @@ -232,21 +189,8 @@ contract AxiomVm is Test { IAxiomV2Query.AxiomV2FeeData memory feeData, address caller ) public returns (FulfillCallbackArgs memory args) { - string memory queryString = _run( - querySchema, - input, - callbackTarget, - callbackExtraData, - feeData - ); - return - fulfillCallbackArgs( - querySchema, - queryString, - callbackTarget, - feeData, - caller - ); + string memory queryString = _run(querySchema, input, callbackTarget, callbackExtraData, feeData); + return fulfillCallbackArgs(querySchema, queryString, callbackTarget, feeData, caller); } /** @@ -255,13 +199,8 @@ contract AxiomVm is Test { */ function prankCallback(FulfillCallbackArgs memory args) public { vm.prank(axiomV2QueryAddress); - IAxiomV2Client(args.callbackTarget).axiomV2Callback{gas: args.gasLimit}( - args.sourceChainId, - args.caller, - args.querySchema, - args.queryId, - args.axiomResults, - args.callbackExtraData + IAxiomV2Client(args.callbackTarget).axiomV2Callback{ gas: args.gasLimit }( + args.sourceChainId, args.caller, args.querySchema, args.queryId, args.axiomResults, args.callbackExtraData ); } @@ -281,14 +220,8 @@ contract AxiomVm is Test { IAxiomV2Query.AxiomV2FeeData memory feeData, address caller ) public { - FulfillCallbackArgs memory args = fulfillCallbackArgs( - querySchema, - input, - callbackTarget, - callbackExtraData, - feeData, - caller - ); + FulfillCallbackArgs memory args = + fulfillCallbackArgs(querySchema, input, callbackTarget, callbackExtraData, feeData, caller); prankCallback(args); } @@ -298,15 +231,8 @@ contract AxiomVm is Test { */ function prankOffchainCallback(FulfillCallbackArgs memory args) public { vm.prank(axiomV2QueryAddress); - IAxiomV2Client(args.callbackTarget).axiomV2OffchainCallback{ - gas: args.gasLimit - }( - args.sourceChainId, - args.caller, - args.querySchema, - args.queryId, - args.axiomResults, - args.callbackExtraData + IAxiomV2Client(args.callbackTarget).axiomV2OffchainCallback{ gas: args.gasLimit }( + args.sourceChainId, args.caller, args.querySchema, args.queryId, args.axiomResults, args.callbackExtraData ); } @@ -326,14 +252,8 @@ contract AxiomVm is Test { IAxiomV2Query.AxiomV2FeeData memory feeData, address caller ) public { - FulfillCallbackArgs memory args = fulfillCallbackArgs( - querySchema, - input, - callbackTarget, - callbackExtraData, - feeData, - caller - ); + FulfillCallbackArgs memory args = + fulfillCallbackArgs(querySchema, input, callbackTarget, callbackExtraData, feeData, caller); prankOffchainCallback(args); } @@ -342,19 +262,14 @@ contract AxiomVm is Test { * @param input path to the input file * @param callbackTarget the callback contract address */ - function getArgsAndSendQuery( - bytes32 querySchema, - bytes memory input, - address callbackTarget - ) public returns (string memory queryString) { - (QueryArgs memory args, string memory _queryString) = sendQueryArgs( - querySchema, - input, - callbackTarget - ); + function getArgsAndSendQuery(bytes32 querySchema, bytes memory input, address callbackTarget) + public + returns (string memory queryString) + { + (QueryArgs memory args, string memory _queryString) = sendQueryArgs(querySchema, input, callbackTarget); queryString = _queryString; vm.prank(msg.sender); - IAxiomV2Query(axiomV2QueryAddress).sendQuery{value: args.value}( + IAxiomV2Query(axiomV2QueryAddress).sendQuery{ value: args.value }( args.sourceChainId, args.dataQueryHash, args.computeQuery, @@ -394,10 +309,7 @@ contract AxiomVm is Test { IAxiomV2Query.AxiomV2FeeData memory feeData ) internal returns (string memory output) { _validateAxiomSetup(); - require( - bytes(compiledStrings[querySchema]).length > 0, - "Circuit has not been compiled. Run `compile` first." - ); + require(bytes(compiledStrings[querySchema]).length > 0, "Circuit has not been compiled. Run `compile` first."); string[] memory cli = new string[](13); cli[0] = "node"; cli[1] = "dist/index.js"; @@ -422,51 +334,21 @@ contract AxiomVm is Test { * @param _queryString the string output from the CLI * @return args the AxiomQuery */ - function parseQueryArgs( - string memory _queryString - ) public pure returns (QueryArgs memory args) { - args.sourceChainId = uint64( - vm.parseJsonUint(_queryString, ".args.sourceChainId") - ); - args.dataQueryHash = vm.parseJsonBytes32( - _queryString, - ".args.dataQueryHash" - ); + function parseQueryArgs(string memory _queryString) public pure returns (QueryArgs memory args) { + args.sourceChainId = uint64(vm.parseJsonUint(_queryString, ".args.sourceChainId")); + args.dataQueryHash = vm.parseJsonBytes32(_queryString, ".args.dataQueryHash"); - args.computeQuery.k = uint8( - vm.parseJsonUint(_queryString, ".args.computeQuery.k") - ); - args.computeQuery.resultLen = uint16( - vm.parseJsonUint(_queryString, ".args.computeQuery.resultLen") - ); - args.computeQuery.vkey = vm.parseJsonBytes32Array( - _queryString, - ".args.computeQuery.vkey" - ); - args.computeQuery.computeProof = vm.parseJsonBytes( - _queryString, - ".args.computeQuery.computeProof" - ); + args.computeQuery.k = uint8(vm.parseJsonUint(_queryString, ".args.computeQuery.k")); + args.computeQuery.resultLen = uint16(vm.parseJsonUint(_queryString, ".args.computeQuery.resultLen")); + args.computeQuery.vkey = vm.parseJsonBytes32Array(_queryString, ".args.computeQuery.vkey"); + args.computeQuery.computeProof = vm.parseJsonBytes(_queryString, ".args.computeQuery.computeProof"); - args.callback.target = vm.parseJsonAddress( - _queryString, - ".args.callback.target" - ); - args.callback.extraData = vm.parseJsonBytes( - _queryString, - ".args.callback.extraData" - ); + args.callback.target = vm.parseJsonAddress(_queryString, ".args.callback.target"); + args.callback.extraData = vm.parseJsonBytes(_queryString, ".args.callback.extraData"); - args.feeData.maxFeePerGas = uint64( - vm.parseJsonUint(_queryString, ".args.feeData.maxFeePerGas") - ); - args.feeData.callbackGasLimit = uint32( - vm.parseJsonUint(_queryString, ".args.feeData.callbackGasLimit") - ); - args.feeData.overrideAxiomQueryFee = vm.parseJsonUint( - _queryString, - ".args.feeData.overrideAxiomQueryFee" - ); + args.feeData.maxFeePerGas = uint64(vm.parseJsonUint(_queryString, ".args.feeData.maxFeePerGas")); + args.feeData.callbackGasLimit = uint32(vm.parseJsonUint(_queryString, ".args.feeData.callbackGasLimit")); + args.feeData.overrideAxiomQueryFee = vm.parseJsonUint(_queryString, ".args.feeData.overrideAxiomQueryFee"); args.userSalt = vm.parseJsonBytes32(_queryString, ".args.userSalt"); args.refundee = vm.parseJsonAddress(_queryString, ".args.refundee"); diff --git a/test/AverageBalance.t.sol b/test/AverageBalance.t.sol index 993c8f8..f6c90a7 100644 --- a/test/AverageBalance.t.sol +++ b/test/AverageBalance.t.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.19; import "../src/test/AxiomTest.sol"; -import {AverageBalance} from "./example/AverageBalance.sol"; +import { AverageBalance } from "./example/AverageBalance.sol"; contract AverageBalanceTest is AxiomTest { using Axiom for Query; @@ -23,21 +23,10 @@ contract AverageBalanceTest is AxiomTest { function setUp() public { _createSelectForkAndSetupAxiom("sepolia", 5_103_100); - defaultInput = Input({ - blockNumber: 4205938, - _address: uint256( - uint160(0x8018fe32fCFd3d166E8b4c4E37105318A84BA11b) - ) - }); - querySchema = axiomVm.readCircuit( - "test/circuit/average.circuit.ts", - abi.encode(defaultInput) - ); - averageBalance = new AverageBalance( - axiomV2QueryAddress, - uint64(block.chainid), - querySchema - ); + defaultInput = + Input({ blockNumber: 4_205_938, _address: uint256(uint160(0x8018fe32fCFd3d166E8b4c4E37105318A84BA11b)) }); + querySchema = axiomVm.readCircuit("test/circuit/average.circuit.ts", abi.encode(defaultInput)); + averageBalance = new AverageBalance(axiomV2QueryAddress, uint64(block.chainid), querySchema); feeData = IAxiomV2Query.AxiomV2FeeData({ maxFeePerGas: 25 gwei, @@ -48,11 +37,7 @@ contract AverageBalanceTest is AxiomTest { } function test_e2e_example() public { - Query memory q = query( - querySchema, - abi.encode(defaultInput), - address(averageBalance) - ); + Query memory q = query(querySchema, abi.encode(defaultInput), address(averageBalance)); bytes32[] memory results = q.send(); assertEq(results.length, 3); uint256 blockNumber = uint256(results[0]); @@ -62,22 +47,14 @@ contract AverageBalanceTest is AxiomTest { } function test_SendQuery() public { - axiomVm.getArgsAndSendQuery( - querySchema, - abi.encode(defaultInput), - address(averageBalance) - ); + axiomVm.getArgsAndSendQuery(querySchema, abi.encode(defaultInput), address(averageBalance)); } function test_SendQueryWithArgs() public { - (QueryArgs memory args, ) = axiomVm.sendQueryArgs( - querySchema, - abi.encode(defaultInput), - address(averageBalance), - callbackExtraData, - feeData + (QueryArgs memory args,) = axiomVm.sendQueryArgs( + querySchema, abi.encode(defaultInput), address(averageBalance), callbackExtraData, feeData ); - axiomV2Query.sendQuery{value: args.value}( + axiomV2Query.sendQuery{ value: args.value }( args.sourceChainId, args.dataQueryHash, args.computeQuery, @@ -91,46 +68,26 @@ contract AverageBalanceTest is AxiomTest { function test_callback() public { axiomVm.prankCallback( - querySchema, - abi.encode(defaultInput), - address(averageBalance), - callbackExtraData, - feeData, - msg.sender + querySchema, abi.encode(defaultInput), address(averageBalance), callbackExtraData, feeData, msg.sender ); } function test_callbackWithArgs() public { FulfillCallbackArgs memory args = axiomVm.fulfillCallbackArgs( - querySchema, - abi.encode(defaultInput), - address(averageBalance), - callbackExtraData, - feeData, - msg.sender + querySchema, abi.encode(defaultInput), address(averageBalance), callbackExtraData, feeData, msg.sender ); axiomVm.prankCallback(args); } function test_offchainCallback() public { axiomVm.prankOffchainCallback( - querySchema, - abi.encode(defaultInput), - address(averageBalance), - callbackExtraData, - feeData, - msg.sender + querySchema, abi.encode(defaultInput), address(averageBalance), callbackExtraData, feeData, msg.sender ); } function test_offchainCallbackWithArgs() public { FulfillCallbackArgs memory args = axiomVm.fulfillCallbackArgs( - querySchema, - abi.encode(defaultInput), - address(averageBalance), - callbackExtraData, - feeData, - msg.sender + querySchema, abi.encode(defaultInput), address(averageBalance), callbackExtraData, feeData, msg.sender ); axiomVm.prankOffchainCallback(args); } diff --git a/test/example/AverageBalance.sol b/test/example/AverageBalance.sol index f79d316..1b1be74 100644 --- a/test/example/AverageBalance.sol +++ b/test/example/AverageBalance.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import { AxiomV2Client } from "../../src/client/AxiomV2Client.sol"; +import { AxiomV2Client } from "@axiom-crypto/v2-periphery/client/AxiomV2Client.sol"; contract AverageBalance is AxiomV2Client { /// @dev The unique identifier of the circuit accepted by this contract.