Skip to main content

Axiom Foundry Cheatcodes

We have provided test utilities for Axiom smart contract clients in the form of cheatcodes for Foundry tests.

Installation

Using these cheatcodes requires Node and NPM to be installed (for the Axiom JavaScript cheatcodes to run).

To install in a Foundry project, run:

forge install axiom-crypto/axiom-std

and add @axiom-crypto/axiom-std/=lib/axiom-std/src in remappings.txt.

Cheatcode Library Reference

Our cheatcode library consists of AxiomTest.sol and AxiomVm.sol, both of which are in @axiom-crypto/axiom-std/src. Usage of these cheatcodes requires Foundry fork tests.

AxiomTest.sol

This base test contract extends forge-std/Test.sol and is a drop-in replacement which provides access to Axiom-specific cheatcodes via the axiomVm contract. To write a new test contract, extend AxiomTest and initialize it by calling the _createSelectForkAndSetupAxiom cheatcode at the start of your setUp() function in your test contract.

_createSelectForkAndSetupAxiom

Initializes the cheatcodes on a local fork with network given by urlOrAlias at block height forkBlock. This function initializes axiomV2Core and axiomV2Query contracts with deployed addresses, and initializes the axiomVm object for future use.

query

Generates a Query struct from a querySchema, ABI-encoded AxiomInput struct, and a callbackTarget address, which can then be used to test sending/fulfilling queries. Can optionally set callbackExtraData, feeData, and caller via a function overload.

AxiomVm.sol

Axiom cheatcodes are implemented via an instance of the AxiomVm contract stored in AxiomTest and available to Foundry tests via the axiomVm object.

readCircuit

Compiles an Axiom client circuit located at circuitPath. Returns the querySchema associated to your client circuit.

sendQueryArgs

Runs the Axiom client circuit located at circuitPath on the inputs at inputPath and returns arguments for sending queries to AxiomV2Query using sendQuery with the specified callback, callbackExtraData, and feeData.

getArgsAndSendQuery

Convenience function to generate sendQuery arguments with sendQueryArgs and send a query to AxiomV2Query using a pranked call from caller.

fulfillCallbackArgs

Runs the Axiom client circuit located at circuitPath on the inputs at inputPath and returns arguments for pranking a callback with the specified callback, callbackExtraData, and feeData for a query initiated by caller. The pranked arguments to the Axiom callback will reflect the correct outputs from the Axiom client circuit.

prankCallback

Convenience function to generate pranked arguments for an Axiom callback and actually prank the callback to axiomV2Callback from AxiomV2Query for an on-chain query. We provide two versions of prankCallback, one which takes argument outputs from fulfillCallbackArgs and one which accepts the inputs for fulfillCallbackArgs.

prankOffchainCallback

Conveninece function which is the analogue of prankCallback for the axiomV2OffchainCallback callback.

Axiom library (in AxiomVm.sol)

Cheatcodes available on the Query struct, by using it as a library for the Query struct.

send

Sends a constructed query to AxiomV2Query.

prankFulfill

Function to generate pranked arguments for an on-chain submitted Axiom query and then actually prank the axiomV2Callback callback fulfillment from the AxiomV2Query contract. Must be called after first sending the query.