Using @maroo-chain/contracts in Your Project
Install the @maroo-chain/contracts npm package, import the Solidity precompile interfaces, and consume the pre-generated TypeScript ABIs from ethers or viem.
Install the package
Add the package to your Hardhat or Foundry project. The package name is scoped —
@maroo-chain/contracts. (The earlier unscoped name maroo-contracts is deprecated; do not install it.)# npm
npm install @maroo-chain/contracts
# pnpm
pnpm add @maroo-chain/contracts
# yarn
yarn add @maroo-chain/contracts Import a Solidity interface
Solidity files are exposed under the
precompiles/ subpath. Import the precompile interface directly into your contract and instantiate it at the fixed precompile address.// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.22;
import "@maroo-chain/contracts/precompiles/pcl/IPcl.sol";
contract PolicyReader {
address constant PCL = 0x1000000000000000000000000000000000000005;
function getGlobalPolicies() external view returns (GlobalPolicyConfig memory) {
return IPcl(PCL).globalPolicies();
}
} Note: If you use Foundry, add `@maroo-chain/contracts/=node_modules/@maroo-chain/contracts/` to `remappings.txt` so the import path resolves.
Use the typed ABI from ethers v6
The package ships per-precompile typed ABIs as named exports under
@maroo-chain/contracts/abi/precompiles/<module>/<Interface>. Import the ABI and pass it to new ethers.Contract(...).import { JsonRpcProvider, Contract } from "ethers";
import { iPclAbi } from "@maroo-chain/contracts/abi/precompiles/pcl/IPcl";
const PCL = "0x1000000000000000000000000000000000000005";
const provider = new JsonRpcProvider("https://rpc-testnet.maroo.io");
const pcl = new Contract(PCL, iPclAbi, provider);
const admin = await pcl.policyAdmin.staticCall();
console.log("Policy Admin:", admin); Use the typed ABI from viem
The same named ABI export works with viem's
getContract helper. viem infers the function signatures from the typed ABI, so reads and writes are fully typed.import { createPublicClient, http, getContract } from "viem";
import { iPclAbi } from "@maroo-chain/contracts/abi/precompiles/pcl/IPcl";
const client = createPublicClient({
transport: http("https://rpc-testnet.maroo.io"),
});
const pcl = getContract({
address: "0x1000000000000000000000000000000000000005",
abi: iPclAbi,
client,
});
const admin = await pcl.read.policyAdmin();
console.log("Policy Admin:", admin); Available precompile interfaces
The package currently exports four precompile interfaces. Each has both a Solidity source under
The ABIs are generated with wagmi from the Hardhat-compiled artifacts and ship in both ESM (
precompiles/<module>/I<Name>.sol and a typed ABI under abi/precompiles/<module>/I<Name>:| Interface | Solidity import | ABI import |
|---|---|---|
IOkrw | @maroo-chain/contracts/precompiles/okrw/IOkrw.sol | @maroo-chain/contracts/abi/precompiles/okrw/IOkrw |
IPcl | @maroo-chain/contracts/precompiles/pcl/IPcl.sol | @maroo-chain/contracts/abi/precompiles/pcl/IPcl |
IEas | @maroo-chain/contracts/precompiles/eas/IEas.sol | @maroo-chain/contracts/abi/precompiles/eas/IEas |
IAgent | @maroo-chain/contracts/precompiles/agent/IAgent.sol | @maroo-chain/contracts/abi/precompiles/agent/IAgent |
The ABIs are generated with wagmi from the Hardhat-compiled artifacts and ship in both ESM (
.js) and CommonJS (.cjs) flavors with .d.ts type declarations.// All four typed ABIs in one place
import { iOkrwAbi } from "@maroo-chain/contracts/abi/precompiles/okrw/IOkrw";
import { iPclAbi } from "@maroo-chain/contracts/abi/precompiles/pcl/IPcl";
import { iEasAbi } from "@maroo-chain/contracts/abi/precompiles/eas/IEas";
import { iAgentAbi } from "@maroo-chain/contracts/abi/precompiles/agent/IAgent";