Deployed Contracts (Testnet)
Canonical contract addresses on Maroo Testnet — utilities, AA, EAS, ERC-8004, inherited EVM precompiles, and Maroo precompiles, including the native OKRW ERC20 representation.
OKRW — two EVM surfaces
OKRW is exposed at two fixed addresses. The IOkrw precompile handles Maroo-specific operations (
mint, getParams); the native ERC20 representation handles standard ERC20 calls (transfer, approve, transferFrom, balanceOf). Both ultimately move the same aokrw balance; pick the address whose API surface matches your call.| Surface | Address | Use for |
|---|---|---|
| IOkrw precompile | 0x1000000000000000000000000000000000000001 | mint, getParams |
| Native ERC20 representation | 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE | Standard ERC20 (transfer, approve, balanceOf, …) |
// Wallet / DEX integration — talk to the ERC20 address
IERC20 okrw = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
okrw.approve(router, 10_000_000 ether); // 10,000,000 OKRW
// Maroo-extension operations — talk to the IOkrw precompile
import "@maroo-chain/contracts/precompiles/okrw/IOkrw.sol";
IOkrw extn = IOkrw(0x1000000000000000000000000000000000000001);
extn.mint(recipient, 10_000_000 ether); Note: The ERC20 address is registered at genesis as a token pair mapping the `aokrw` base denom to its ERC20 surface. Off-the-shelf EVM tools (block explorers, wallets, DEX routers) work against this address with no Maroo-specific patches.
Maroo precompiles
These four precompile addresses are stable across testnet and mainnet. Use the interfaces from
@maroo-chain/contracts/precompiles/... to call them.| Precompile | Address | Purpose |
|---|---|---|
IOkrw | 0x1000000000000000000000000000000000000001 | OKRW mint / params |
IPcl | 0x1000000000000000000000000000000000000005 | Programmable Compliance Layer |
IEas | 0x1000000000000000000000000000000000000009 | EAS discovery (getParams) |
IAgent | 0x100000000000000000000000000000000000000A | Agent discovery + reverse lookup |
export const ADDR = {
OKRW_PRECOMPILE: "0x1000000000000000000000000000000000000001",
OKRW_ERC20: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
PCL: "0x1000000000000000000000000000000000000005",
EAS_PRECOMPILE: "0x1000000000000000000000000000000000000009",
AGENT: "0x100000000000000000000000000000000000000A",
// ERC-8004 IdentityRegistry preinstall
ERC8004_IDENTITY:"0x8004000000000000000000000000000000000001",
} as const; EAS and ERC-8004 preinstalls
The actual EAS attestation contract, SchemaRegistry, and Indexer are deployed as preinstalls — resolve their canonical addresses via
IEas.getParams() rather than hard-coding. The ERC-8004 IdentityRegistry is a separate preinstall at 0x8004000000000000000000000000000000000001.import { createPublicClient, http } from "viem";
const EAS_PRECOMPILE = "0x1000000000000000000000000000000000000009";
const easAbi = [{
name: "getParams", type: "function", stateMutability: "view",
inputs: [],
outputs: [{ type: "tuple", components: [
{ name: "schemaRegistry", type: "address" },
{ name: "eas", type: "address" },
{ name: "indexer", type: "address" },
]}],
}] as const;
const client = createPublicClient({ transport: http("https://rpc-testnet.maroo.io") });
const { eas, indexer, schemaRegistry } = await client.readContract({
address: EAS_PRECOMPILE,
abi: easAbi,
functionName: "getParams",
});