프로젝트에서 @maroo-chain/contracts 사용하기

integration

@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);

제공되는 프리컴파일 인터페이스

현재 패키지는 네 가지 프리컴파일 인터페이스를 제공합니다. 각각 precompiles/<module>/I<Name>.sol에 Solidity 소스가, abi/precompiles/<module>/I<Name>에 타입 ABI가 있습니다.

인터페이스Solidity importABI 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";
소스: maroo
ESC
검색어를 입력하세요