OKRW 프리컴파일

component core

원화 페그 스테이블코인(OKRW)의 네이티브 발행 인터페이스입니다. 권한이 필요한 단일 메서드 mint(address, uint256)을 제공합니다.

OKRW 프리컴파일은 마루의 핵심 네이티브 프리컴파일 중 하나로, 고정 주소 0x1000000000000000000000000000000000000001에 배치됩니다. 지정된 발행자 주소가 새로운 OKRW를 발행할 때 사용하는 권한 필요 메서드 mint 하나만 공개합니다. 전송, 잔액 조회, 어토런스는 이 프리컴파일에 없습니다. OKRW는 네이티브 가스 토큰이므로 이러한 동작은 표준 EVM 값 의미(msg.value, address.balance, eth_getBalance)를 사용합니다. 인터페이스가 IOkrw is IPrecompile이므로 IPrecompile에서 상속된 공유 오류(잘못된 인자 개수, 알 수 없는 메서드, SDK 계층 오류, EVM 경계 오류)도 모듈 소유 오류 UnauthorizedMinter와 함께 이 프리컴파일에서 노출될 수 있습니다.

아키텍처

graph TD
    A[dApp / Designated Minter] -- "mint(to, amount)" --> B[IOkrw Precompile @ 0x10...01];
    B -- Mint event --> C[Indexers / Wallets];
    A2[Any dApp] -- "getParams()" --> B;

    classDef evm fill:#0096AA,stroke:#0096AA,color:#fff;
    classDef precompile fill:#FF8C50,stroke:#FF8C50,color:#fff;
    class A,C,A2 evm;
    class B precompile;

지정된 발행자가 IOkrw 프리컴파일의 mint를 호출하면 Mint 이벤트가 발행됩니다. getParams는 설정된 minter와 mintDenom을 노출합니다. 이후 OKRW는 일반 EVM 잔액처럼 네이티브 값으로 이동합니다.

인터페이스 개요

Solidity 인터페이스 전체가 한 화면에 들어갑니다. is IPrecompile 상속에 주목합니다. InvalidAddress(string), InvalidAmount(string), UnknownMethod, InvalidNumberOfArgs와 같은 공유 오류는 모두 여기서 상속됩니다.
import {IPrecompile} from "@maroo-chain/contracts/precompiles/common/interfaces/IPrecompile.sol";

interface IOkrw is IPrecompile {
    error UnauthorizedMinter(address caller, address authorizedMinter);

    function getParams() external view returns (OkrwParams memory params);
    function mint(address recipient, uint256 amount) external returns (bool);

    event Mint(address indexed minter, address indexed recipient, uint256 amount);
}

struct OkrwParams {
    address minter;
    string mintDenom;
}

권한 모델

OkrwParams.minter에 저장된 주소(거버넌스로 회전되는 체인 파라미터)만 mint를 호출할 수 있습니다. 그 외 호출자는 모듈 소유 커스텀 오류 UnauthorizedMinter(caller, authorizedMinter)로 revert됩니다. 이 오류는 실패한 호출자와 현재 지정된 발행자를 함께 전달하여 관측성을 확보합니다. 발행자 회전은 컨소시엄 거버넌스 작업이며 dApp 통합 범위에는 포함되지 않습니다. 발행자 주소는 런타임에서 안정적입니다.
// 런타임에서 현재 지정된 발행자를 읽습니다.
OkrwParams memory params = IOkrw(0x1000000000000000000000000000000000000001).getParams();
address minter = params.minter;      // 지정된 발행자
string memory denom = params.mintDenom; // "aokrw"

공유 오류 리팩터링 이후의 오류 표면

이 프리컴파일은 더 이상 자체 InvalidAddress(address) / InvalidAmount(uint256) 오류를 선언하지 않습니다. 두 오류는 각각 IPrecompile.InvalidAddress(string bad)IPrecompile.InvalidAmount(string amount)로 revert되며, 페이로드는 문제가 된 값을 문자열로 렌더링한 것이지 원본 타입이 아닙니다. 이 외에도 mint 호출에서 노출될 수 있는 상속 오류에는 InvalidNumberOfArgs, UnknownMethod, SDKUnauthorized, EventEmitFailed이 있습니다. 전체 카탈로그와 디코딩 방법은 precompile-shared-errors를 참고합니다. nil이거나 음수인 amount 입력(저수준 ABI 조작으로만 도달 가능)은 일반 문자열("amount must not be nil", "amount must not be negative")로 revert되며 디코딩 가능한 커스텀 오류가 아닙니다.
// 리팩터링 이후 OKRW.mint의 모든 revert를 디코드하기 위한 최소 ABI입니다.
const okrwErrorsAbi = [
  { type: "error", name: "UnauthorizedMinter",
    inputs: [{ name: "caller", type: "address" }, { name: "authorizedMinter", type: "address" }] },
  { type: "error", name: "InvalidAddress", inputs: [{ name: "bad", type: "string" }] },
  { type: "error", name: "InvalidAmount", inputs: [{ name: "amount", type: "string" }] },
  { type: "error", name: "InvalidNumberOfArgs",
    inputs: [{ name: "expected", type: "uint256" }, { name: "got", type: "uint256" }] },
  { type: "error", name: "UnknownMethod", inputs: [{ name: "methodName", type: "string" }] },
  { type: "error", name: "SDKUnauthorized", inputs: [] },
] as const;

단위

amount는 OKRW의 소수점 18자리 base denom인 aokrw 단위입니다(1 OKRW = 10^18 aokrw). 따라서 1,000만 OKRW 발행은 호출 시 10_000_000 10*18입니다. OkrwParamsmintDenom 필드는 온체인 denom 문자열(운영 환경에서 "aokrw")을 보고합니다. 컴포넌트가 비 EVM 값 계층에서 연산을 구성해야 할 때 사용합니다.
import {IOkrw} from "@maroo-chain/contracts/precompiles/okrw/IOkrw.sol";

IOkrw okrw = IOkrw(0x1000000000000000000000000000000000000001);
address recipient = 0x8F3ac2B1d9E74c05A6B18FE27Dc4913e5A0F7b62;

// 1,000만 OKRW를 aokrw 기본 단위로 표현합니다.
uint256 amount = 10_000_000 ether; // 10_000_000 * 10**18
okrw.mint(recipient, amount);

이벤트 발행

mint가 성공하면 일반 EVM 로그로 Mint(address indexed minter, address indexed recipient, uint256 amount)가 발행됩니다. 인덱서는 프리컴파일 주소로 필터링한 eth_getLogs로 구독할 수 있습니다. 상태 변경 이후 내부 이벤트 발행이 실패하는 드문 경우(인프라 장애)에는 프리컴파일이 상속 오류 EventEmitFailed(string eventKind, string reason)로 revert하여 호출 전체가 원자적으로 롤백됩니다.
ESC
검색어를 입력하세요