오늘은, 이전에 분석했던 ERC-1155 컨트랙트를 이용해서 토큰을 만들고
테스트넷에 배포, 확인해보았다.
먼저, ERC-1155 에는 ERC-20, ERC-721 과 다른 중요한 특징이 하나 있다.
하나의 컨트랙트에서 여러개의 토큰을 관리할 수 있다는 점.
ERC-20 의 경우, 토큰id 가 따로 존재하지 않았다.
ERC-721 의 경우, 토큰id 가 존재했지만 하나의 토큰id 에 하나의 토큰이었다.
이 둘의 특징을 보완해서 나온 것이 ERC-1155 라고 생각하면 쉬울 것 같다.
예를 들어, P2E 게임을 만들었다고 가정해보자.
이 게임에서 플레이어들이 사용 할 무기들을 토큰화 해서 관리한다고 한다면..
{
name : Sword,
tokenId : 1,
totalSupply : 10
}
{
name : Shield,
tokenId : 2,
totalSupply : 5
}
{
name : Bow,
tokenId : 3,
totalSupply : 3
}
위의 예시 처럼 관리할 수 있을 것이다. (실제 코드나 json 파일과는 다르다..)
Pinata 에 접속해 이미지 파일과 json 파일을 업로드 한다.
attributes 는 다음과 같이 단순하게 적었다.
{
"name": "red",
"description": "This color is red",
"image": "https://gateway.pinata.cloud/ipfs/****링크****"
}
그리고 Remix 로 이동해 컨트랙트를 작성했다.
먼저, 아래 라이브러리를 import 해서 사용한다.
ERC1155 컨트랙트를 상속 받아 사용한다.
contract RAINBOW is ERC1155
각 색깔마다의 토큰Id 값을 지정해준다.
uint public constant Red = 1;
uint public constant Yellow = 2;
uint public constant Green = 3;
uint public constant Blue = 4;
uint public constant Purple = 5;
컨스트럭터로 uri 를 설정해준다.
string public baseUri;
constructor(string memory _baseUri) ERC1155(_baseUri) {
baseUri = _baseUri;
_mint(msg.sender, Red, 5, "");
_mint(msg.sender, Yellow, 5, "");
_mint(msg.sender, Green, 5, "");
_mint(msg.sender, Blue, 5, "");
_mint(msg.sender, Purple, 5, "");
}
그리고, 설정한 uri, "/", tokenId, "json" 을 묶어서 하나의 각 토큰별 이미지 링크를 만든다.
function uri(uint tokenId) public override view returns(string memory) {
return string(abi.encodePacked(baseUri,"/",Strings.toString(tokenId),".json"));
}
민팅 함수와 balance 를 가져오는 함수를 만들어준다.
function mintToken(uint _id, uint _amount) public {
_mint(msg.sender, _id, _amount, "");
}
function getBatchAddresses(uint a) public view returns(address[] memory) {
address[] memory _list = new address[](a);
for(uint i=0; i<a; i++) {
_list[i] = msg.sender;
}
return _list;
}
function getBalanceOfBatch(uint[] memory _tokenIds) public view returns(uint[] memory) {
return balanceOfBatch(getBatchAddresses(_tokenIds.length), _tokenIds);
}
그리고 배포한다.
다른 5개의 ID 를 가진 토큰이 각 5개의 수량을 가지고 민팅되었다.
이는 컨스트럭터에 포함되어있던 _mint 함수 때문이다.
_mint(msg.sender, Red, 5, "");
여기서 빨강 토큰을 더 민팅해보았다.
빨강의 tokenId 는 1, 민팅량 5개로 설정.
트랜잭션이 컨펌되면, 갯수가 바뀌는 것을 볼 수 있다.