Estoy tratando de encontrar un recuento de titulares de colección NFT (token ERC721). Por ejemplo, OpenSea y EtherScan tienen estos datos, pero no pude encontrar un método ERC721 nativo para lograrlo.
Cual es la mejor manera de hacer esto?
Gracias
La mejor manera sería usar el evento Transfer ya que para eso. Puede consultar todos los eventos de transferencia y filtrar por ID.
Sin embargo, también puede crear su function(id, address) que se llamará en cada transferencia nft, allí puede enviar a una matriz en una id -> address[] donde la matriz representa las direcciones de los píos que poseían eso NFT.
Y luego cree otra function(id) para devolver esa matriz según la identificación enviada a la función.
Bueno, después de unas horas más de investigación, encontré algunas soluciones y quería compartirlas.
Hay algunas maneras de hacer esto:
ERC721Enumerable , su estudio de caso es un poco más fácil. Porque puede encontrar el recuento de tokens usando totalSupply() para que pueda omitir la primera parte del código a continuación.Moralis . Devuelve el recuento de propietarios con una lista de direcciones y datos adicionales. Ver la respuesta ya existente async testGetOwnerCount({ }, payload) { // Connect the contract let nftContract = new ethers.Contract(nftContractAddress, ERC721.abi, signer); // First find the mint count which is equal to the token count const transferFilter = nftContract.filters.Transfer("0x0000000000000000000000000000000000000000", null, null) const tokens = await nftContract.queryFilter(transferFilter) const tokenCount = tokens.length; // Iterate over tokens and store owner addresses in an array let owners = [] for (let i = 0; i < tokenCount; i++) { // First, find the all transfers of the token // from null` to `null` so we get all the transfers of `tokenId` const transferFilter = nftContract.filters.Transfer(null, null, parseInt(tokens[i].args.tokenId)) const tokenTransfers = await nftContract.queryFilter(transferFilter) // `args.to` of the last element gives the current owner of issued token let lastTransfer = tokenTransfers[tokenTransfers.length - 1] let currentOwner = lastTransfer.args.to // If the address has already found before, don't add it... if (!owners.includes(currentOwner)) { owners.push(currentOwner) } } } Puede haber mejores formas de lograr esto, pero esta fue la mejor que pude encontrar, ya que quiero manejar todos los contratos, no solo aquellos que son ERC721Enumerable y no quiero usar otra herramienta.