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.

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, …)
// 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.

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",
});
ESC
Type to search