본문 바로가기
WATTO 프로젝트/컨트렉트

NWT_Token

by gun_poo 2022. 2. 12.

WATTO project 에서 NFT를 구매 할 수 있는 코인

 

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.10;

import "../node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "../node_modules/@openzeppelin/contracts/access/Ownable.sol";

contract NWTToken is ERC20, Ownable {
 

constructor() ERC20("NWToken", "NWT") {
}
function mintToken(address to, uint256 amount) public onlyAuthorized returns (bool) { // NFT 구매할 FT 토큰
require(to != address(0x0));
require(amount > 0);
_mint(to, amount);
 
return true;
}

function approveToken(address owner,address spender) public {
uint256 amount = balanceOf(owner);
_approve(owner,spender,amount);
}

function multiMintToken(address[] calldata toArr, uint256[] calldata amountArr) public onlyAuthorized returns (bool) {
require(toArr.length == amountArr.length);
for (uint256 i=0; i<toArr.length; i++) {
require(toArr[i] != address(0x0));
require(amountArr[i] > 0);
_mint(toArr[i], amountArr[i]);
_approve(toArr[i], msg.sender, allowance(toArr[i], msg.sender) + amountArr[i]);
}
return true;
   }
}

function mintToken 내 ERC-20 

ERC-20

function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");

_beforeTokenTransfer(address(0), account, amount);

_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);

_afterTokenTransfer(address(0), account, amount);
}
 
  • 토큰 총 공급량을 늘리기 위해 추가적으로 토큰을 신규 발행하는 함수
  • 토큰을 받는 주소는 0 주소가 아니여야한다
  • 토큰을 신규로 발행한다 = 총 공급량과 토큰을 받을 주소의 잔고를 발행 수량만큼 추가한다.
    • _totalSupply = _totalSupply.add(amount)
    • _balances[account] = _balances[account].add(amoutn)
  • 0 주소에서 토큰을 받을 계정으로 토큰을 전송한다는 의미
    • _beforeTokenTransfer(address(0), account, amount);
    • emit Transfer(address(0), account, amount);
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
 
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
  • _beforeTokenTransfer : 토큰 전송 전에 호출되는 후크
  • _afterTokenTransfer : 토큰 전송 후 호출되는 후크
    • 내가 해석하기로는 상태를 정의 시켜주는 용도로 해석했다.
    • 토큰 전송 전에 beforeTokenTransfer로 초기상태를 정의하고
    • 토큰 전송 후에 afterTokenTransfer로 처리 후 상태를 정의해준다.

function approveToken 내 ERC-20

 

function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
  •  owner가 가지고 있는 토큰의 보유량 확인
    매핑된 값인 _balances에서 입력한 address인 account가 가지고있는 토큰의 수를 리턴한다.
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");

_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
    1. _approve에서는 내가 토큰을 양도할 상대방(spender)에게 양도할 값(amount)를 allowances에 기록
    2. owner가 spender에게 양도 설정한 토큰의 양을 확인
      allowance는 입력한 두개의 주소값에 대한 _allowances값, 다시말해 owner가 spender에게 토큰을 등록한 양을 반환
    3. Approval event를 호출하여 기록 (양도가 실제로 이루어진 것이 아니라, 양도를 할 주소와 양을 정한것)

 

 

'WATTO 프로젝트 > 컨트렉트' 카테고리의 다른 글

NFT 경매  (0) 2022.02.13
NFT 컨트렉트  (0) 2022.02.13
Token_Swap  (0) 2022.02.13
WT_Token  (0) 2022.02.12
사용 컨트렉트 소개  (0) 2022.02.12

댓글