Deployed Contracts (Testnet)

resources

Canonical contract addresses on Maroo Testnet — utilities, AA, EAS, ERC-8004, inherited EVM precompiles, and Maroo precompiles, including the native OKRW ERC20 representation.

Stable addresses for the contracts and precompiles available on Maroo Testnet. Most are also published on the npm package @maroo-chain/contracts so you can import the ABIs directly. Mainnet addresses for Maroo precompiles match these (the four Maroo precompiles use 0x10.. prefixes and stay constant across networks).

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.

SurfaceAddressUse for
IOkrw precompile0x1000000000000000000000000000000000000001mint, getParams
Native ERC20 representation0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeEStandard ERC20 (transfer, approve, balanceOf, …)
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IOkrw} from "@maroo-chain/contracts/precompiles/okrw/IOkrw.sol";

address router    = 0x2c7f09B81a6D3FF1e5A0d4c6bC2a8f7E19dc3a4B;
address recipient = 0x8F3ac2B1d9E74c05A6B18FE27Dc4913e5A0F7b62;

// 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
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.

PrecompileAddressPurpose
IOkrw0x1000000000000000000000000000000000000001OKRW mint / params
IPcl0x1000000000000000000000000000000000000005Programmable Compliance Layer
IEas0x1000000000000000000000000000000000000009EAS discovery (getParams)
IAgent0x100000000000000000000000000000000000000AAgent 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",
});

Conclusion

Pin these addresses in a single module of your codebase (the snippet above is a good template). The four Maroo precompiles plus the OKRW ERC20 address are stable across networks; only EAS preinstall addresses are resolved at runtime via IEas.getParams().
ESC
Type to search