반응형
NFT 민팅 하다보면 화이트리스트 스냅샷을 찍게 된다.
방법 1. https://tethrr.io/ 스냅샷 서비스를 이용한다.
장점: 이메일과 컨트랙트 주소만 입력하면 이메일로 홀더 목록을 전달해준다.
단점: 특정 시점을 지정할 수 없다. 정확한 화이트리스트 목록을 못 가져올 수 있다.
언제 쓰면 좋은가? 손쉽게 사용하고 홀더들로부터 화리 수정 요청을 받을 경우
방법 2. 스마트 컨트랙트에 홀더 리스트를 관리하는 배열을 만든다.
장점: 쿼리 한번으로 홀더 목록을 가져올 수 있다.
단점: Openzeppelin 에서 제공하는 라이브러리가 없어서 직접 개발해야 하고, 배열을 관리하는 로직으로 gas 비용이 늘어난다.
방법 3. 트랜잭션 중에 transfer 이벤트 목록을 가져와 홀더를 추적한다.
장점: 블록 기준으로 조회하기 때문에 정확하다. 특정 시점을 기준으로 조회할 수 있다.
단점: 조회하고자 하는 스마트 컨트랙트가 오래됐을 수록 가져와야하는 블록이 많아져 성능이 오래걸린다. 코딩을 해야 한다.
const CONTRACT_ACCOUNT = "0xE9e3F9cfc1A64DFca53614a0182CFAD56c10624F";
const CONTRACT_START = 6645906;
const INFURA_KEY = "55397e793412497fb349e0ff77f154f2";
const Web3 = require('web3'); // Use web3@1.0.0-beta.36+ https://github.com/ethereum/web3.js/issues/1916
const web3 = new Web3(new Web3.providers.HttpProvider('https://mainnet.infura.io/v3/' + INFURA_KEY));
const erc721 = require("@0xcert/ethereum-erc721/build/erc721.json").ERC721;
const contract = new web3.eth.Contract(erc721.abi, CONTRACT_ACCOUNT);
var idToOwner = {};
contract.getPastEvents('Transfer', {fromBlock: CONTRACT_START, toBlock: CONTRACT_START+60000}).then(events => {
events.forEach(event => {
idToOwner[event.returnValues._tokenId] = event.returnValues._to
});
console.log(idToOwner);
});
https://ethereum.stackexchange.com/questions/61565/list-holders-and-tokens-for-an-erc-721-contract
반응형
'블록체인 > 이더리움' 카테고리의 다른 글
msg.sender vs _msgSender() (0) | 2022.05.02 |
---|---|
오픈씨는 왜 WETH 를 사용할까? (0) | 2022.04.28 |
getPastEvents 함수의 방대한 결과값을 순차적으로 처리하는 방법 (0) | 2022.03.18 |
이더스캔에서 ERC721 토큰을 추적하는 방식 (2) | 2022.03.16 |
솔리디티의 Safe Math 기능과 Counters 객체 (0) | 2022.03.16 |