OKRW 모듈
네이티브 KRW 연동 스테이블코인 OKRW의 생성 및 파라미터를 관리합니다.
OKRW 발행은 마루의 네이티브 가스 토큰인 atokrw가 새로 생겨나는 방식을 정합니다. (스테이킹은 별도의 본드 단위인 atmaroo로 정산됩니다.) 의도적으로 단순한 설계입니다. 승인된 단일 민터 계정만 OKRW 프리컴파일로 새 OKRW를 발행할 수 있고, 그 계정은 온체인 거버넌스로만 바뀝니다.
주요 기능
통제된 발행
사전에 설정된 단일 계정, 즉 IOkrw.getParams()가 반환하는 minter만 새 OKRW를 발행할 수 있습니다.
단순성과 보안성
OKRW 프리컴파일은 mint와 조회 함수 getParams 두 가지만 제공하므로, 표면이 작고 공격 벡터도 적습니다.
아키텍처
graph TD
A["Governance"] -->|sets the authorized minter| B["OKRW parameters<br/>minter · mintDenom"]
C["Authorized minter"] -->|"IOkrw.mint(recipient, amount)"| D["OKRW precompile<br/>0x…0001"]
B -.->|caller checked against minter| D
D -->|credits atokrw| E["Recipient balance"]
classDef evm fill:#0096AA,stroke:#0096AA,color:#fff;
classDef precompile fill:#FF8C50,stroke:#FF8C50,color:#fff;
class A,B,C,E evm;
class D precompile; OKRW 발행 구조입니다. 거버넌스가 승인된 단일 민터를 정하고, 그 계정이 OKRW 프리컴파일에 보낸 IOkrw.mint 호출만 OKRW를 발행해 지급합니다.
발행 메커니즘
발행은
1. 수신자는 영 주소가 아니어야 합니다. 영 주소이면
2. 금액은 0이 아니어야 합니다. 0이면
3. 호출자는 승인된 단일 민터여야 합니다. 앞의 두 검사를 통과한 호출자가 민터가 아니면
호출이 성공하면 새로 발행된 OKRW가 같은 트랜잭션 안에서 수신자 잔액에 반영됩니다. 전체 시그니처, 오류, 예제는
0x1000000000000000000000000000000000000001의 OKRW 프리컴파일을 거칩니다. IOkrw.mint(recipient, amount)는 amount만큼 OKRW를 발행해 recipient에게 지급합니다. 금액 단위는 18자리 소수의 기본 단위인 atokrw입니다. 이 호출은 발행 전에 다음 세 가지를 확인합니다:1. 수신자는 영 주소가 아니어야 합니다. 영 주소이면
InvalidAddress(string bad)로 revert됩니다.2. 금액은 0이 아니어야 합니다. 0이면
InvalidAmount(string amount)로 revert됩니다.3. 호출자는 승인된 단일 민터여야 합니다. 앞의 두 검사를 통과한 호출자가 민터가 아니면
UnauthorizedMinter(address caller, address authorizedMinter)로 revert됩니다.호출이 성공하면 새로 발행된 OKRW가 같은 트랜잭션 안에서 수신자 잔액에 반영됩니다. 전체 시그니처, 오류, 예제는
okrw-mint를 참고합니다. 참고: 발행과 지급은 하나의 원자적 호출입니다. 수신자 잔액이 발행한 만큼 늘어나거나, 호출이 revert되어 아무것도 발행되지 않습니다.
파라미터 관리
발행을 좌우하는 설정은 두 가지입니다. 발행할 수 있는 단일 계정(
minter)과 발행하는 단위(mintDenom, 테스트넷에서는 atokrw)입니다. 컨트랙트는 두 값을 모두 IOkrw.getParams()로 읽습니다. 두 값은 dApp이나 민터 자신이 보낸 트랜잭션으로는 바뀌지 않으며, 온체인 거버넌스 투표가 통과해야만 바뀝니다. 따라서 누가 OKRW를 발행할 수 있는지와 기본 단위가 무엇인지는 커뮤니티가 통제합니다. 주의: 거버넌스 업데이트는 파라미터 전체를 교체하므로, 제안에는 바꾸려는 필드뿐 아니라 모든 필드를 담아야 합니다. 민터를 빈 값으로 두면 받아들여지지만, 이후 업데이트로 다시 지정할 때까지 발행이 막힙니다. 발행 단위가 비어 있거나 유효하지 않으면 검증에 실패해 업데이트 전체가 거부됩니다.