프로젝트에서 @maroo-chain/contracts 사용하기
@maroo-chain/contracts npm 패키지를 설치하고, Solidity 프리컴파일 인터페이스를 import하며, 사전 생성된 TypeScript ABI를 ethers나 viem에서 소비하는 방법을 설명합니다.
패키지 설치
Hardhat이나 Foundry 프로젝트에 패키지를 추가합니다. 패키지명은 스코프가 붙은
@maroo-chain/contracts입니다. (이전 비스코프 이름인 maroo-contracts는 더 이상 사용하지 않으니 설치하지 마십시오.)# npm
npm install @maroo-chain/contracts
# pnpm
pnpm add @maroo-chain/contracts
# yarn
yarn add @maroo-chain/contracts Solidity 인터페이스 import
Solidity 파일은
precompiles/ 서브패스로 노출됩니다. 컨트랙트에 프리컴파일 인터페이스를 직접 import하고 고정된 프리컴파일 주소로 인스턴스화합니다.// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.22;
import "@maroo-chain/contracts/precompiles/pcl/IPcl.sol";
contract PolicyReader {
address constant PCL = 0x1000000000000000000000000000000000000005;
function getGlobalPolicies() external view returns (GlobalPolicyConfig memory) {
return IPcl(PCL).globalPolicies();
}
} 참고: Foundry를 사용한다면 `remappings.txt`에 `@maroo-chain/contracts/=node_modules/@maroo-chain/contracts/`를 추가해 import 경로가 해석되도록 합니다.
ethers v6에서 타입 ABI 사용
패키지는
@maroo-chain/contracts/abi/precompiles/<module>/<Interface> 경로에 프리컴파일별 타입 ABI를 named export로 제공합니다. ABI를 import해 new ethers.Contract(...)에 전달합니다.import { JsonRpcProvider, Contract } from "ethers";
import { iPclAbi } from "@maroo-chain/contracts/abi/precompiles/pcl/IPcl";
const PCL = "0x1000000000000000000000000000000000000005";
const provider = new JsonRpcProvider("https://rpc-testnet.maroo.io");
const pcl = new Contract(PCL, iPclAbi, provider);
const admin = await pcl.policyAdmin.staticCall();
console.log("Policy Admin:", admin); viem에서 타입 ABI 사용
동일한 named ABI export를 viem의
getContract 헬퍼와 함께 쓸 수 있습니다. viem이 타입 ABI에서 함수 시그니처를 추론하므로 읽기와 쓰기 모두 타입이 적용됩니다.import { createPublicClient, http, getContract } 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();
console.log("Policy Admin:", admin); 제공되는 프리컴파일 인터페이스
현재 패키지는 네 가지 프리컴파일 인터페이스를 제공합니다. 각각
ABI는 Hardhat이 컴파일한 아티팩트로부터 wagmi가 생성하며, ESM(
precompiles/<module>/I<Name>.sol에 Solidity 소스가, abi/precompiles/<module>/I<Name>에 타입 ABI가 있습니다.| 인터페이스 | Solidity import | ABI import |
|---|---|---|
IOkrw | @maroo-chain/contracts/precompiles/okrw/IOkrw.sol | @maroo-chain/contracts/abi/precompiles/okrw/IOkrw |
IPcl | @maroo-chain/contracts/precompiles/pcl/IPcl.sol | @maroo-chain/contracts/abi/precompiles/pcl/IPcl |
IEas | @maroo-chain/contracts/precompiles/eas/IEas.sol | @maroo-chain/contracts/abi/precompiles/eas/IEas |
IAgent | @maroo-chain/contracts/precompiles/agent/IAgent.sol | @maroo-chain/contracts/abi/precompiles/agent/IAgent |
ABI는 Hardhat이 컴파일한 아티팩트로부터 wagmi가 생성하며, ESM(
.js)과 CommonJS(.cjs) 양쪽을 .d.ts 타입 선언과 함께 배포합니다.// 네 가지 타입 ABI를 한 곳에서
import { iOkrwAbi } from "@maroo-chain/contracts/abi/precompiles/okrw/IOkrw";
import { iPclAbi } from "@maroo-chain/contracts/abi/precompiles/pcl/IPcl";
import { iEasAbi } from "@maroo-chain/contracts/abi/precompiles/eas/IEas";
import { iAgentAbi } from "@maroo-chain/contracts/abi/precompiles/agent/IAgent";