배포된 컨트랙트 (테스트넷)
마루 테스트넷의 정식 컨트랙트 주소 목록입니다. 유틸리티, 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처럼 트랜잭션의
OKRW의 컨트랙트 진입점은 IOkrw 프리컴파일 하나입니다.
value / msg.value로 옮기고, 잔액은 eth_getBalance / address.balance로 읽습니다. 테스트넷에는 OKRW의 ERC20 표현이 없습니다. x/erc20에 등록된 토큰 페어가 없고, maroo 소스의 기본 genesis가 쓰는 네이티브 ERC20 주소 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE에는 테스트넷에서 코드가 없습니다. 이 주소로 보낸 ERC20 호출은 빈 데이터를 돌려주고, 트랜잭션은 아무것도 옮기지 않은 채 성공합니다. 따라서 approve / transferFrom에 기대는 DEX 라우터, 볼트, 지갑 흐름은 네이티브(payable) 경로를 따로 마련해야 합니다.OKRW의 컨트랙트 진입점은 IOkrw 프리컴파일 하나입니다.
| 진입점 | 주소 | 용도 |
|---|---|---|
| IOkrw 프리컴파일 | 0x1000000000000000000000000000000000000001 | getParams, 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를 참고합니다.| 프리컴파일 | 주소 | 목적 |
|---|---|---|
IOkrw | 0x1000000000000000000000000000000000000001 | OKRW mint·params |
IPcl | 0x1000000000000000000000000000000000000005 | 프로그래머블 컴플라이언스 레이어 |
IEas | 0x1000000000000000000000000000000000000009 | EAS 디스커버리(getParams) |
IAgent | 0x100000000000000000000000000000000000000A | 에이전트 디스커버리·역방향 조회 |
IPrivacy | 0x100000000000000000000000000000000000000b | 은닉 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로 배포되어 있으므로 하드코딩 대신
KYC / KYB attestation은 EAS 컨트랙트(표준 EAS 인터페이스)에서 발행·저장되고, Indexer는 recipient·schema별 조회 테이블을 유지합니다. PCL의 attestation 검사인
두 레지스트리 모두 고정 주소의 preinstall이며 dApp마다 배포하는 것이 아닙니다. 마루 테스트넷에서는 v0.4.0 업그레이드(블록 6,372,905)로 설치되었고,
IEas.getParams()로 정식 주소를 조회합니다.| 컨트랙트 | 주소 | 익스플로러 검증 |
|---|---|---|
| SchemaRegistry | 0x1000000000000000000000000000000000000006 | ✓ |
| EAS | 0x1000000000000000000000000000000000000007 | ✓ |
| Indexer | 0x1000000000000000000000000000000000000008 | ✓ |
KYC / KYB attestation은 EAS 컨트랙트(표준 EAS 인터페이스)에서 발행·저장되고, Indexer는 recipient·schema별 조회 테이블을 유지합니다. PCL의 attestation 검사인
EAS_POLICY는 이 두 컨트랙트를 정책 파라미터에 담긴 주소(easContract, indexContract)로 읽습니다. 따라서 이 두 값은 IEas.getParams()가 반환하는 eas, indexer 주소로 지정합니다. 0x…09의 EAS 프리컴파일은 이 세 주소만 반환합니다.| 컨트랙트 | 주소 | 익스플로러 검증 |
|---|---|---|
| ERC-8004 IdentityRegistry | 0x8004000000000000000000000000000000000001 | ✓ |
| ERC-8004 ReputationRegistry | 0x8004000000000000000000000000000000000002 | ✓ |
두 레지스트리 모두 고정 주소의 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/ 범용 유틸리티
| 컨트랙트 | 주소 | 익스플로러 검증 |
|---|---|---|
| Multicall3 | 0xcA11bde05977b3631167028862bE2a173976CA11 | ✓ |
| Create2 deployer | 0x4e59b44847b379578588920ca78fbf26c0b4956c | — |
| Safe singleton factory | 0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7 | — |
| 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.9 | 0x433709009B8330FDa32311DF1C2AFA402eD8D009 | — |
| EntryPoint v0.8 | 0x4337084d9e255ff0702461cf8895ce9e3b5ff108 | ✓ |
| SimpleAccountFactory | 0x13E9ed32155810FDbd067D4522C492D6f68E5944 | ✓ |
| Simple7702Account | 0x4Cd241E8d1510e30b2076397afc7508Ae59C66c9 | ✓ |
새 스마트 계정을 만들려면 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 |
| Staking | 0x0000000000000000000000000000000000000800 |
| Distribution | 0x0000000000000000000000000000000000000801 |
| Bank | 0x0000000000000000000000000000000000000804 |
| Gov | 0x0000000000000000000000000000000000000805 |
| Slashing | 0x0000000000000000000000000000000000000806 |
체인의 EVM 런타임에서 그대로 제공되며 마루 테스트넷에서 활성화되어 있습니다. 마루 프리컴파일과 마찬가지로 EVM 바이트코드는 없습니다. Gov 프리컴파일은 Solidity에서 거버넌스에 참여할 때의 진입점입니다. 예를 들어
vote로 제안에 투표합니다.마무리
코드베이스의 단일 모듈에 이 주소들을 고정합니다(위 스니펫이 좋은 템플릿입니다). 마루 프리컴파일 주소는 네트워크 간에 안정적이며, EAS preinstall 주소는
IEas.getParams()로, ERC-8004 레지스트리 주소는 IAgent.getParams()로 런타임에 해결합니다.