Using @maroo-chain/contracts in Your Project

integration

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 precompiles/<module>/I<Name>.sol and a typed ABI under abi/precompiles/<module>/I<Name>:

InterfaceSolidity importABI 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";
Source: maroo
ESC
Type to search