728x90
1. 초기 설정
트러플 초기 설정
npx truffle init
truffle-config.js
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "7722",
},
},
compilers: {
solc: {
version: "0.8.17",
},
},
};
가나쉬 실행
npx ganache-cli --chainId 7722 --networkId 7722
2. 스마트 컨트랙트
(1) contracts/ERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract ERC20{
// 표준토큰 규격
string public name; // 토큰의 이름
string public symbol; // 토큰의 단위
uint public decimals = 18; // 소수점자리
uint public totalSupply; //총 발행량
mapping(address=>uint) public balances;
mapping(address=>mapping(address=>uint)) public allowance;
function balanceOf(address _account) view external returns(uint){
return balances[_account];
}
// 잔액을 전송하는 함수
function transfer(address _recipient, uint _amount) external returns(bool){
balances[msg.sender] -= _amount;
balances[_recipient] += _amount;
emit Transfer(msg.sender,_recipient,_amount);
return true;
}
function approve(address _spender, uint _amount) external returns(bool){
allowance[msg.sender][_spender] = _amount;
emit Approval(msg.sender,_spender,_amount);
return true;
}
function transferFrom(address _sender,address _recipient,uint _amount) external returns(bool){
require(allowance[_sender][msg.sender] >= _amount);
allowance[_sender][msg.sender] -= _amount;
balances[_sender] -= _amount;
balances[_recipient] += _amount;
emit Transfer(_sender,_recipient,_amount);
return true;
}
function mint(uint _amount) internal{
balances[msg.sender] += _amount;
totalSupply += _amount;
// address(0) from 값이 필요 없기 때문에 null로 넣어준것
emit Transfer(address(0), msg.sender, _amount);
}
// 토큰 소각
function burn(uint amount) external{
balances[msg.sender] -= amount;
totalSupply -= amount;
// address(0) to 값이 필요 없어서 null
emit Transfer(msg.sender,address(0),amount);
}
// Transfser 이벤트 함수 등록
event Transfer(address from, address to,uint value);
event Approval(address owner,address spender,uint value);
}
(2) contracts/SEOKToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import "./ERC20.sol";
// 컨트랙트 SEOKToken에 상송id로 ERC20를 상속
contract SEOKToken is ERC20{
address public owner; // 이 컨트랙트의 배포자가 할당될 상태 변수
uint256 public ethCanBuy = 200; // 1ETH당 200토큰을 정해줄 상태 변수
constructor(string memory _name,string memory _symbol, uint _amount){
owner = msg.sender;
name = _name;
symbol = _symbol;
mint(_amount * (10 ** uint256(decimals)));
}
receive() external payable{
require(msg.value != 0);
uint amount = msg.value * ethCanBuy;
require(balances[owner] >= amount);
balances[owner] -= amount;
balances[msg.sender] += amount;
if(msg.sender == owner){
mint(amount);
}
emit Transfer(owner,msg.sender,amount);
}
}
ERC20 토큰을 발행시 변수나 함수명은 이미 정해져 있다.
3. 배포
/migrations/2_deployed_SEOKToken.js
const SEOKToken = artifacts.require("SEOKToken");
module.exports = function (deployer) {
deployer.deploy(SEOKToken, "SEOKToken", "STK", 10000);
};
npx truffle migration
4. 토큰 확인
메타마스크에서 네트워크 설정시 chain ID는 처음 가나쉬를 실행했던 chain ID 7722를 입력해준다.
빌드된 json에서 CA값 찾은후 토큰추가
CA에 이더를 보내면 그 가격만큼 토큰을 받을 수 있다.
728x90
'개발 > BlockChain' 카테고리의 다른 글
[BlockChain] localhost에서 remix 연동 (0) | 2022.12.06 |
---|---|
[BlockChain] ERC20 Token - openzeppelin 사용 (0) | 2022.12.06 |
[BlockChain] 사과 판매 앱 만들기 (0) | 2022.12.06 |
[BlockChain] 스마트컨트랙트로 투표 Dapp 만들기 (0) | 2022.12.06 |
[BlockChain] 메타마스크 토큰추가 (0) | 2022.12.06 |