Skip to content

Commit

Permalink
feat: base test
Browse files Browse the repository at this point in the history
  • Loading branch information
rpalakkal committed Apr 1, 2024
1 parent 3294f0a commit 4dd2b8c
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 39 deletions.
3 changes: 1 addition & 2 deletions src/AxiomCli.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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";
}
}
98 changes: 62 additions & 36 deletions src/AxiomTest.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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(
Expand All @@ -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);

Expand All @@ -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);
Expand All @@ -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
Expand All @@ -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
});
}
}
1 change: 1 addition & 0 deletions src/AxiomV2Addresses.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 5 additions & 1 deletion test/Array.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
Expand Down
48 changes: 48 additions & 0 deletions test/Base.t.sol
Original file line number Diff line number Diff line change
@@ -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();
}
}

0 comments on commit 4dd2b8c

Please sign in to comment.