스마트 컨트랙트에서 OKRW 발행하기
프리컴파일을 사용하여 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 유동성을 관리하는 애플리케이션을 구축하는 데 기본이 됩니다.