배포된 컨트랙트 (테스트넷)

resources

마루 테스트넷의 정식 컨트랙트 주소 목록입니다. 유틸리티, AA, EAS, ERC-8004, 상속된 EVM 프리컴파일, 마루 프리컴파일을 포함합니다.

마루 테스트넷에서 사용할 수 있는 컨트랙트와 프리컴파일의 정식 주소 목록입니다. 마루 프리컴파일의 인터페이스와 ABI는 npm 패키지 @maroo-chain/contracts에, ERC-8004 IdentityRegistry와 ReputationRegistry의 ABI는 @maroo-chain/viem의 identityRegistryAbi와 reputationRegistryAbi에 들어 있습니다. 마루 프리컴파일의 메인넷 주소는 이 목록과 동일합니다(마루 프리컴파일은 0x10.. 접두사를 사용하며 네트워크 간에 변하지 않습니다). 컨트랙트 표의 '익스플로러 검증' 열은 테스트넷 익스플로러(https://explorer-testnet.maroo.io)에서 해당 주소의 소스 코드가 검증되었는지를 나타냅니다. ✓는 검증된 소스가 있다는 뜻이고, —는 없다는 뜻입니다.

OKRW — 네이티브 코인

마루 테스트넷에서 OKRW는 체인의 네이티브 코인이자 가스 토큰입니다. ETH처럼 트랜잭션의 value / msg.value로 옮기고, 잔액은 eth_getBalance / address.balance로 읽습니다. 테스트넷에는 OKRW의 ERC20 표현이 없습니다. x/erc20에 등록된 토큰 페어가 없고, maroo 소스의 기본 genesis가 쓰는 네이티브 ERC20 주소 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE에는 테스트넷에서 코드가 없습니다. 이 주소로 보낸 ERC20 호출은 빈 데이터를 돌려주고, 트랜잭션은 아무것도 옮기지 않은 채 성공합니다. 따라서 approve / transferFrom에 기대는 DEX 라우터, 볼트, 지갑 흐름은 네이티브(payable) 경로를 따로 마련해야 합니다.

OKRW의 컨트랙트 진입점은 IOkrw 프리컴파일 하나입니다.

진입점주소용도
IOkrw 프리컴파일0x1000000000000000000000000000000000000001getParams, mint(승인된 발행자만 호출 가능 — 다른 주소의 유효한 호출은 UnauthorizedMinter로 revert)
import {IOkrw, OkrwParams} from "@maroo-chain/contracts/precompiles/okrw/IOkrw.sol";

// OKRW는 네이티브 코인으로 이동합니다. 토큰 컨트랙트를 거치지 않습니다.
function pay(address payable to) external payable {
    (bool ok, ) = to.call{value: msg.value}("");
    require(ok, "OKRW transfer failed");
}

// 프리컴파일의 조회 기능: 발행 권한자와 네이티브 denom 문자열을 돌려줍니다.
function okrwParams() external view returns (address minter, string memory mintDenom) {
    OkrwParams memory p = IOkrw(0x1000000000000000000000000000000000000001).getParams();
    return (p.minter, p.mintDenom);
}
참고: Cosmos 코인 문자열, denom을 키로 쓰는 PCL 정책, privacy 금액처럼 네이티브 denom 문자열이 필요하다면 런타임에 읽습니다. 위 프리컴파일의 getParams().mintDenom이나 https://api-testnet.maroo.io/cosmos/evm/vm/v1/params의 evm_denom을 사용합니다. 테스트넷에서는 atokrw(표시 단위 tokrw)이며, maroo 소스의 기본값 aokrw는 쓰이지 않습니다.

마루 프리컴파일

다음 프리컴파일 주소는 테스트넷과 메인넷에서 동일합니다. @maroo-chain/contracts/precompiles/...의 인터페이스를 가져와 호출합니다. 프리컴파일에는 EVM 바이트코드가 없으므로(eth_getCode가 0x를 반환), Solidity에서 반환값이 없는 함수는 저수준 call로 호출합니다. maroo-architecture를 참고합니다.

프리컴파일주소목적
IOkrw0x1000000000000000000000000000000000000001OKRW mint·params
IPcl0x1000000000000000000000000000000000000005프로그래머블 컴플라이언스 레이어
IEas0x1000000000000000000000000000000000000009EAS 디스커버리(getParams)
IAgent0x100000000000000000000000000000000000000A에이전트 디스커버리·역방향 조회
IPrivacy0x100000000000000000000000000000000000000b은닉 OKRW (예치 / 전송 / 인출)

프리컴파일별 인터페이스와 호출 예제는 각 개요 페이지 okrw-precompile-overview, pcl-precompile-overview, eas-precompile-overview, agent-precompile-overview, privacy-precompile-overview에서 확인할 수 있습니다.
export const ADDR = {
  OKRW_PRECOMPILE: "0x1000000000000000000000000000000000000001",
  PCL:             "0x1000000000000000000000000000000000000005",
  EAS_PRECOMPILE:  "0x1000000000000000000000000000000000000009",
  AGENT:           "0x100000000000000000000000000000000000000A",
  PRIVACY:         "0x100000000000000000000000000000000000000b",
  // ERC-8004 IdentityRegistry preinstall
  ERC8004_IDENTITY:"0x8004000000000000000000000000000000000001",
} as const;

EAS와 ERC-8004 preinstall

실제 EAS attestation 컨트랙트, SchemaRegistry, Indexer는 preinstall로 배포되어 있으므로 하드코딩 대신 IEas.getParams()로 정식 주소를 조회합니다.

컨트랙트주소익스플로러 검증
SchemaRegistry0x1000000000000000000000000000000000000006✓
EAS0x1000000000000000000000000000000000000007✓
Indexer0x1000000000000000000000000000000000000008✓

KYC / KYB attestation은 EAS 컨트랙트(표준 EAS 인터페이스)에서 발행·저장되고, Indexer는 recipient·schema별 조회 테이블을 유지합니다. PCL의 attestation 검사인 EAS_POLICY는 이 두 컨트랙트를 정책 파라미터에 담긴 주소(easContract, indexContract)로 읽습니다. 따라서 이 두 값은 IEas.getParams()가 반환하는 eas, indexer 주소로 지정합니다. 0x…09의 EAS 프리컴파일은 이 세 주소만 반환합니다.

컨트랙트주소익스플로러 검증
ERC-8004 IdentityRegistry0x8004000000000000000000000000000000000001✓
ERC-8004 ReputationRegistry0x8004000000000000000000000000000000000002✓

두 레지스트리 모두 고정 주소의 preinstall이며 dApp마다 배포하는 것이 아닙니다. 마루 테스트넷에서는 v0.4.0 업그레이드(블록 6,372,905)로 설치되었고, IAgent.getParams()가 두 주소를 반환합니다. Validation 레지스트리는 없습니다.
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",
});

ABI 가져오기

@maroo-chain/contracts는 마루 프리컴파일 인터페이스(IOkrw, IPcl, IEas, IAgent, IPrivacy)를 모두 Solidity 소스와 타입이 지정된 ABI로 제공합니다(작성 시점 버전 0.0.9). 루트 import는 없으므로 전체 경로를 씁니다.

  • Solidity: @maroo-chain/contracts/precompiles/<name>/I<Name>.sol
  • TypeScript: @maroo-chain/contracts/abi/precompiles/<name>/I<Name>(moduleResolution이 node16, nodenext, bundler 중 하나여야 합니다)


iAgentAbi에는 모든 프리컴파일이 공유하는 오류 33개가 먼저 나오고, 두 함수 getParams와 getAgentIds는 맨 끝에 있습니다. ERC-8004 레지스트리 ABI는 이 패키지에 없으며, @maroo-chain/viem의 identityRegistryAbi와 reputationRegistryAbi를 씁니다.
// npm install @maroo-chain/contracts viem
import { createPublicClient, getContract, http } 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();

Foundry remapping

Solidity 소스가 cosmos-evm-contracts를 import하지만, 패키지는 이를 의존성으로 선언하지 않습니다. 함께 설치하고(npm install @maroo-chain/contracts cosmos-evm-contracts) remappings.txt에 두 줄을 모두 추가합니다.
@maroo-chain/contracts/=node_modules/@maroo-chain/contracts/
cosmos-evm-contracts/=node_modules/cosmos-evm-contracts/

범용 유틸리티

컨트랙트주소익스플로러 검증
Multicall30xcA11bde05977b3631167028862bE2a173976CA11✓
Create2 deployer0x4e59b44847b379578588920ca78fbf26c0b4956c—
Safe singleton factory0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7—
EIP-2935 히스토리0x0000F90827F1C53a10cb7A02335B175320002935—

Multicall3, Create2 deployer, Safe singleton factory는 정식 이더리움 주소에 있는 표준 배포본이므로 cross-chain 툴링이 별도 설정 없이 찾을 수 있습니다. EIP-2935 히스토리 컨트랙트도 정식 주소에 있지만, 마루 테스트넷에서는 get(blockNumber)가 해당 블록의 해시를 반환하지 않습니다. 블록 해시는 eth_getBlockByNumber로 읽거나, 최근 256개 블록이라면 blockhash()를 씁니다.

계정 추상화(ERC-4337, EIP-7702)

컨트랙트주소익스플로러 검증
EntryPoint v0.90x433709009B8330FDa32311DF1C2AFA402eD8D009—
EntryPoint v0.80x4337084d9e255ff0702461cf8895ce9e3b5ff108✓
SimpleAccountFactory0x13E9ed32155810FDbd067D4522C492D6f68E5944✓
Simple7702Account0x4Cd241E8d1510e30b2076397afc7508Ae59C66c9✓

새 스마트 계정을 만들려면 v0.9 표준 주소에 배포된 EntryPoint v0.9를 사용합니다. 이 EntryPoint의 SenderCreator(0x0A630a99Df908A81115A3022927Be82f9299987e)에는 코드가 있으며, 마루 테스트넷에서도 UserOperation의 initCode에 팩토리를 지정해 이 EntryPoint로 계정을 배포한 사례가 있습니다. 팩토리는 v0.9용으로 만든 것을 사용합니다. 여기 나열된 SimpleAccountFactory로는 계정을 만들 수 없습니다.

v0.8 조합으로는 마루 테스트넷에서 계정을 만들 수 없습니다. EntryPoint v0.8에는 코드가 있지만, 이 컨트랙트가 가리키는 SenderCreator(0x449ed7c3e6fee6a97311d4b55475df59c44add33)에는 코드가 없습니다. 그래서 initCode에 팩토리를 지정한 UserOperation은 EntryPoint v0.8에서 사유 없이 revert됩니다. 또 SimpleAccountFactory의 accountImplementation()과 senderCreator()가 모두 0 주소를 반환하므로, createAccount는 어떤 호출자가 부르든 only callable from SenderCreator로 revert되며 이 팩토리로는 계정을 만들 수 없습니다. initCode가 없는 UserOperation은 EntryPoint v0.8이 지금도 실행합니다. EIP-7702 위임 EOA가 보낸 UserOperation이 그 예입니다. Simple7702Account에는 코드가 있습니다(EIP-7702 delegate account 구현).

PCL의 신뢰하는 EntryPoint 목록(IPcl.getParams().entrypoints)에 EntryPoint v0.8과 v0.9가 들어 있습니다(이 목록에는 마루 테스트넷에 코드가 없는 EntryPoint v0.6 주소(0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789)도 있습니다). 따라서 PCL은 각 UserOperation을 배치를 제출한 번들러가 아니라 그 발신자인 스마트 계정을 기준으로 평가합니다. 번들러도 배치를 담은 바깥 트랜잭션의 발신자로서 여전히 검사됩니다.

상속된 EVM 프리컴파일

프리컴파일주소
P256(서명 검증)0x0000000000000000000000000000000000000100
Bech32(bech32 ↔ hex)0x0000000000000000000000000000000000000400
Staking0x0000000000000000000000000000000000000800
Distribution0x0000000000000000000000000000000000000801
Bank0x0000000000000000000000000000000000000804
Gov0x0000000000000000000000000000000000000805
Slashing0x0000000000000000000000000000000000000806

체인의 EVM 런타임에서 그대로 제공되며 마루 테스트넷에서 활성화되어 있습니다. 마루 프리컴파일과 마찬가지로 EVM 바이트코드는 없습니다. Gov 프리컴파일은 Solidity에서 거버넌스에 참여할 때의 진입점입니다. 예를 들어 vote로 제안에 투표합니다.

마무리

코드베이스의 단일 모듈에 이 주소들을 고정합니다(위 스니펫이 좋은 템플릿입니다). 마루 프리컴파일 주소는 네트워크 간에 안정적이며, EAS preinstall 주소는 IEas.getParams()로, ERC-8004 레지스트리 주소는 IAgent.getParams()로 런타임에 해결합니다.
ESC
검색어를 입력하세요