IOkrw.mint

mint(address recipient, uint256 amount) external returns (bool)

amount로 지정된 수량의 OKRW 토큰을 발행하여 recipient 주소로 입금합니다. 이 함수는 x/okrw 모듈 파라미터에서 체인 수준으로 지정된 발행자 주소만 호출할 수 있습니다. 다른 주소에서 호출하면 사용자 정의 오류로 revert됩니다.

파라미터

이름 타입 필수 설명
recipient address 새로 발행된 OKRW를 받을 주소입니다. 0 주소일 수 없습니다.
amount uint256 발행할 OKRW 수량으로, 체인의 base denom인 aokrw(소수점 18자리) 단위로 지정합니다. 단위 정의는 concepts/core/okrw-precompile-overview 페이지를 참조합니다. 0보다 커야 합니다.

반환값

타입: bool

성공적으로 실행되면 true를 반환합니다. 실패 시 false를 반환하지 않고 revert됩니다.

에러

코드 이름 설명
UnauthorizedMinter UnauthorizedMinter 호출의 msg.sender가 지정된 발행자가 아니면 revert됩니다. callerauthorizedMinter 주소를 반환합니다.
InvalidAddress InvalidAddress 제공된 recipient 주소가 유효하지 않거나(예: 0 주소) caller 주소를 체인 측 계정으로 정규화할 수 없는 경우 revert됩니다. 유효하지 않은 addr을 반환합니다.
InvalidAmount InvalidAmount amount가 0인 경우 revert됩니다. 참고: 현재 구현은 이 경우 일반적인 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 오류를 우아하게 처리하는 방법을 보여줍니다. 이렇게 하면 컨트랙트가 전체적으로 revert되지 않고 실패에 대응할 수 있습니다.

// ...
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) {
        // Decode the 4-byte error selector from the revert payload.
        // bytes memory slicing isn't supported in Solidity, so use assembly.
        bytes4 selector;
        assembly { selector := mload(add(lowLevelData, 32)) }

        if (selector == IOkrw.UnauthorizedMinter.selector) {
            // Strip the selector and decode the remaining args.
            bytes memory args = new bytes(lowLevelData.length - 4);
            for (uint i = 0; i < args.length; i++) args[i] = lowLevelData[i + 4];
            (address caller, address authorizedMinter) = abi.decode(args, (address, address));
            // Handle unauthorized error, e.g., emit an event
            revert("Unauthorized minter caught");
        } else {
            revert("Unknown custom error");
        }
    }
}

Ethers.js로 호출 및 오류 처리

이 클라이언트 측 예제는 mint 함수를 호출하고, 트랜잭션이 revert되면 사용자 정의 오류 데이터를 파싱하는 방법을 보여줍니다. 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...", "1500000");
ESC
검색어를 입력하세요