OKRW 프리컴파일
원화 페그 스테이블코인(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), ABISetupFailed(string)와 같은 공유 오류는 모두 여기서 상속됩니다.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를 호출할 수 있습니다. 수신자와 금액을 먼저 검사하며(0 주소는 InvalidAddress, 0 금액은 InvalidAmount로 revert), 그다음 다른 호출자는 모듈 소유 커스텀 오류 UnauthorizedMinter(caller, authorizedMinter)로 revert됩니다. 이 오류는 실패한 호출자와 현재 지정된 발행자를 함께 전달하여 관측성을 확보합니다. 발행자 회전은 컨소시엄 거버넌스 작업이며 dApp 통합 범위에는 포함되지 않습니다. 발행자 주소는 런타임에서 안정적입니다.// 런타임에서 현재 지정된 발행자를 읽습니다.
OkrwParams memory params = IOkrw(0x1000000000000000000000000000000000000001).getParams();
address minter = params.minter; // 지정된 발행자
string memory denom = params.mintDenom; // "atokrw" 공유 오류 리팩터링 이후의 오류 표면
이 프리컴파일은 더 이상 자체
InvalidAddress(address) / InvalidAmount(uint256) 오류를 선언하지 않습니다. 두 오류는 각각 IPrecompile.InvalidAddress(string bad)와 IPrecompile.InvalidAmount(string amount)로 revert되며, 페이로드는 문제가 된 값을 문자열로 렌더링한 것이지 원본 타입이 아닙니다. 디코딩할 수 없는 calldata(알 수 없는 selector, 또는 mint(address, uint256)의 인자를 담기에 짧은 calldata)는 ABISetupFailed(string reason)로 revert됩니다. amount 뒤에 붙은 바이트는 무시되며, InvalidNumberOfArgs와 UnknownMethod는 상속되어 있지만 이런 경우에 발생하지 않습니다. 그 밖에 mint 호출에서 노출될 수 있는 상속 오류에는 SDKUnauthorized, EventEmitFailed가 있습니다. 전체 카탈로그와 디코딩 방법은 precompile-shared-errors를 참고합니다. 소스에는 amount가 nil이거나 음수일 때의 일반 문자열 revert("amount must not be nil", "amount must not be negative")도 있지만, ABI 디코더가 항상 음수가 아닌 uint256을 돌려주므로 어떤 호출도 이 경로에 도달하지 않습니다.// 리팩터링 이후 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: "ABISetupFailed", inputs: [{ name: "reason", type: "string" }] },
{ type: "error", name: "SDKUnauthorized", inputs: [] },
] as const; 단위
amount는 OKRW의 소수점 18자리 base denom인 atokrw 단위입니다(1 OKRW = 10^18 atokrw). 따라서 1,000만 OKRW 발행은 호출 시 10_000_000 * 10**18입니다. OkrwParams의 mintDenom 필드는 온체인 denom 문자열(테스트넷에서 "atokrw")을 보고합니다. 컴포넌트가 비 EVM 값 계층에서 연산을 구성해야 할 때 사용합니다.import {IOkrw} from "@maroo-chain/contracts/precompiles/okrw/IOkrw.sol";
IOkrw okrw = IOkrw(0x1000000000000000000000000000000000000001);
address recipient = 0x8F3ac2B1d9E74c05A6B18FE27Dc4913e5A0F7b62;
// 1,000만 OKRW를 atokrw 기본 단위로 표현합니다.
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하여 호출 전체가 원자적으로 롤백됩니다.