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);
}
-
- _approve에서는 내가 토큰을 양도할 상대방(spender)에게 양도할 값(amount)를 allowances에 기록
- owner가 spender에게 양도 설정한 토큰의 양을 확인
allowance는 입력한 두개의 주소값에 대한 _allowances값, 다시말해 owner가 spender에게 토큰을 등록한 양을 반환 - 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 |
댓글