testnet
GitHub EN

스마트 컨트랙트에서 OKRW 발행하기

intermediate integration 45 min

프리컴파일을 사용하여 OKRW 토큰을 발행하는 스마트 컨트랙트를 생성, 배포 및 상호작용하는 방법에 대한 단계별 튜토리얼입니다.

학습 목표

  • Solidity에서 Maroo 프리컴파일과 인터페이스하는 방법.
  • OKRW를 발행할 수 있는 컨트랙트 작성 방법.
  • 로컬 테스트넷에서 컨트랙트를 발행자로 승인하도록 설정하는 방법.
  • Hardhat 스크립트를 사용하여 컨트랙트를 배포하고 호출하는 방법.
  • 발행 이벤트 및 잔액 변경을 확인하는 방법.

사전 요구사항

  • 실행 중인 Maroo 로컬 테스트넷 (`marood testnet`).
  • Solidity 및 Hardhat에 대한 기본 이해.

필요 도구

Node.js 18+Hardhatmarood CLI
이 튜토리얼에서는 간단한 'Faucet' 컨트랙트를 만듭니다. 이 컨트랙트는 요청하는 모든 주소에 고정된 양의 OKRW를 발행할 권한을 가지게 되며, Maroo에서 프로그래밍 방식의 발행 전체 라이프사이클을 보여줍니다.
1

1. 프로젝트 설정

먼저 새 Hardhat 프로젝트를 설정합니다. 터미널을 열고 다음 명령을 실행하세요:
terminal bash
mkdir maroo-faucet && cd maroo-faucet
npm init -y
npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox @openzeppelin/contracts
npx hardhat init # 'Create a TypeScript project' 선택
2

2. 스마트 컨트랙트 생성

프리컴파일과 상호작용하려면 IOkrw.sol 인터페이스가 필요합니다. 이 파일을 contracts 디렉토리에 생성하세요. 그런 다음 이 인터페이스를 사용하는 OkrwFaucet.sol 컨트랙트를 작성합니다.
contracts/IOkrw.sol solidity
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;

interface IOkrw {
    error UnauthorizedMinter(address caller, address authorizedMinter);
    error InvalidAddress(address addr);
    error InvalidAmount(uint256 amount);

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

    event Mint(address indexed minter, address indexed recipient, uint256 amount);
}
contracts/OkrwFaucet.sol solidity
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;

import "./IOkrw.sol";

contract OkrwFaucet {
    IOkrw constant okrw = IOkrw(0x1000000000000000000000000000000000000001);
    uint256 public immutable dripAmount = 100 * 10**18; // 100 OKRW

    event Dispensed(address indexed recipient, uint256 amount);

    function requestTokens() external {
        // 이 호출은 이 컨트랙트의 주소가 Maroo 네트워크에서
        // 공인된 발행자인 경우에만 성공합니다.
        bool success = okrw.mint(msg.sender, dripAmount);
        require(success, "Faucet: OKRW minting failed");
        emit Dispensed(msg.sender, dripAmount);
    }
}
3

3. Faucet 배포

이제 Faucet을 배포하기 위한 Hardhat 스크립트를 작성합니다. 이를 통해 다음 단계에 필요한 컨트랙트 주소를 얻을 수 있습니다.
scripts/deploy.ts typescript
import { ethers } from "hardhat";

async function main() {
  const Faucet = await ethers.getContractFactory("OkrwFaucet");
  const faucet = await Faucet.deploy();
  await faucet.waitForDeployment();
  const faucetAddress = await faucet.getAddress();
  console.log(`OkrwFaucet deployed to: ${faucetAddress}`);
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});
팁: 로컬 Maroo 노드에 연결하도록 `hardhat.config.ts`를 설정해야 합니다. 기본 RPC URL은 `http://127.0.0.1:8545`이고 체인 ID는 `9000`입니다.
4

4. Faucet을 발행자로 승인

OKRW 프리컴파일은 특정 주소만 발행하도록 허용합니다. 이제 새로 배포된 OkrwFaucet 컨트랙트를 승인해야 합니다. 배포 스크립트를 실행하고 컨트랙트 주소를 복사한 다음 marood CLI를 사용하여 x/okrw 모듈 파라미터를 업데이트합니다.
terminal bash
npx hardhat run scripts/deploy.ts --network localhost
# 출력된 주소 복사, 예: 0x5FbDB2315678afecb367f032d93F642f64180aa3
terminal bash
# 로컬 테스트넷 설정의 검증인 키 이름으로 교체
VALIDATOR_KEY_NAME="validator"

# 여기에 배포된 컨트랙트 주소 붙여넣기
CONTRACT_ADDR_HEX="0x5FbDB2315678afecb367f032d93F642f64180aa3"

# 트랜잭션을 위해 hex 주소를 bech32 형식으로 변환
CONTRACT_ADDR_BECH32=$(marood debug addr $CONTRACT_ADDR_HEX | grep "Bech32 Acc" | awk '{print $3}')

# 발행자 주소를 업데이트하는 트랜잭션 전송
marood tx okrw update-params --minter-address $CONTRACT_ADDR_BECH32 --from $VALIDATOR_KEY_NAME --chain-id maroo_9000-1 --keyring-backend test -y --broadcast-mode=block
5

5. 상호작용 및 확인

Faucet이 배포되고 승인되었으므로 이제 누구나 requestTokens()를 호출하여 100 OKRW를 받을 수 있습니다. 이를 위한 스크립트를 만들고 잔액 변경을 확인해 보겠습니다.
scripts/request.ts typescript
import { ethers } from "hardhat";

async function main() {
  const faucetAddress = "0x5FbDB2315678afecb367f032d93F642f64180aa3"; // 배포된 주소 붙여넣기
  const faucet = await ethers.getContractAt("OkrwFaucet", faucetAddress);
  const [signer] = await ethers.getSigners();

  console.log(`Requesting 100 OKRW for ${signer.address}...`);
  const tx = await faucet.requestTokens();
  const receipt = await tx.wait();
  console.log("Tokens requested! Tx hash:", receipt.hash);
}

main().catch(console.error);
terminal bash
# 요청 스크립트 실행
npx hardhat run scripts/request.ts --network localhost

# Hardhat 기본 계정(0xf39...2266)의 잔액 확인
marood query bank balances 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266

# 100000000000000000000aokrw 잔액을 확인해야 합니다.

마무리

축하합니다! 성공적으로 OKRW를 발행할 수 있는 스마트 컨트랙트를 만들고, Maroo 체인에서 이를 승인하도록 설정했으며, 이를 사용하여 토큰을 받았습니다. 이 패턴은 Maroo에서 OKRW 유동성을 관리하는 애플리케이션을 구축하는 데 기본이 됩니다.
소스: maroo
ESC
검색어를 입력하세요