IOkrw.mint
mint(address recipient, uint256 amount) external returns (bool) amount로 지정된 수량의 OKRW 토큰을 발행하여 recipient 주소로 입금합니다. 이 함수는 x/okrw 모듈 파라미터에서 체인 수준으로 설정된 공인된 발행자 주소만이 성공적으로 호출할 수 있습니다. 다른 주소에서의 호출은 사용자 정의 오류와 함께 되돌려집니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
recipient | address | ✓ | 새로 발행된 OKRW를 받을 주소입니다. 0 주소일 수 없습니다. |
amount | uint256 | ✓ | 발행할 OKRW의 양으로, 가장 작은 단위(wei, 10^18)로 표시됩니다. 0보다 커야 합니다. |
반환값
타입:
bool 성공적으로 실행되면 true를 반환합니다. 실패 시 false를 반환하는 대신 함수가 되돌려집니다.
에러
| 코드 | 이름 | 설명 |
|---|---|---|
| UnauthorizedMinter | 호출의 `msg.sender`가 공인된 발행자가 아닐 경우 되돌려집니다. `caller`와 `authorizedMinter` 주소를 반환합니다. |
| InvalidAddress | 제공된 `recipient` 주소가 유효하지 않거나(예: 0 주소) `caller` 주소를 Cosmos 주소로 변환할 수 없는 경우 되돌려집니다. 유효하지 않은 `addr`을 반환합니다. |
| InvalidAmount | `amount`가 0일 경우 되돌려집니다. 참고: 현재 구현은 이 경우 일반적인 revert 사유를 반환합니다. |
예제
컨트랙트에서 기본 발행
이 예제는 `mint` 함수를 호출하는 컨트랙트를 보여줍니다. 이 호출이 성공하려면 `MinterContract`의 주소 자체가 `x/okrw` 모듈 파라미터에서 공인된 발행자로 설정되어야 합니다.
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
import "./IOkrw.sol";
contract MinterContract {
address constant OKRW_PRECOMPILE = 0x1000000000000000000000000000000000000001;
IOkrw okrw = IOkrw(OKRW_PRECOMPILE);
// This function will only succeed if this contract's address
// is the authorized minter on the Maroo network.
function mintOkrw(address to, uint256 amount) external {
bool success = okrw.mint(to, amount);
require(success, "OKRW minting failed");
}
} Solidity에서 사용자 정의 오류 처리
이 예제는 `try/catch` 블록을 사용하여 프리컴파일에서 발생할 수 있는 `UnauthorizedMinter` 오류를 정상적으로 처리하는 방법을 보여줍니다. 이를 통해 컨트랙트는 전체가 되돌려지는 대신 실패에 반응할 수 있습니다.
// ...
function safeMintOkrw(address to, uint256 amount) external {
try okrw.mint(to, amount) returns (bool success) {
require(success, "Mint returned false");
// Emit a local event or perform other logic
} catch (bytes memory lowLevelData) {
// Catch custom errors
if (lowLevelData.length == 68 && lowLevelData[0:4] == IOkrw.UnauthorizedMinter.selector) {
(address caller, address authorizedMinter) = abi.decode(lowLevelData[4:], (address, address));
// Handle unauthorized error, e.g., emit an event
revert("Unauthorized minter caught");
} else {
revert("Unknown custom error");
}
}
} Ethers.js로 호출 및 오류 처리
이 클라이언트 측 예제는 `mint` 함수를 호출하고 트랜잭션이 되돌려질 경우 사용자 정의 오류 데이터를 파싱하는 방법을 보여줍니다. 이는 dApp 인터페이스에서 사용자에게 명확한 피드백을 제공하는 데 유용합니다.
const { ethers } = require("ethers");
const okrwPrecompileAddress = "0x1000000000000000000000000000000000000001";
const okrwAbi = [
"function mint(address recipient, uint256 amount) external returns (bool)",
"error UnauthorizedMinter(address caller, address authorizedMinter)"
];
// Assume 'unauthorizedSigner' is an ethers.Signer for an account that is NOT the minter
const okrwContract = new ethers.Contract(okrwPrecompileAddress, okrwAbi, unauthorizedSigner);
async function attemptMint(recipient, amount) {
try {
const tx = await okrwContract.mint(recipient, ethers.parseEther(amount));
await tx.wait();
console.log("Minting successful!");
} catch (error) {
if (error.data) {
const decodedError = okrwContract.interface.parseError(error.data);
console.error(`Minting failed with error: ${decodedError.name}`);
console.error(`Args: ${decodedError.args}`);
} else {
console.error("An unknown error occurred:", error.message);
}
}
}
attemptMint("0xRecipientAddress...", "1000");