Obtener todas las transacciones ERC721 por una cuenta

Mi enfoque aquí fue escuchar el evento Transfer para un contrato (por ejemplo, Cryptokitties) filtrado por la cuenta indexada .

var contract = new web3.eth.Contract(kittyABI, kittyContractAddress, 
{from: account});
contract.events.Transfer(
  {filter: {from: account}}, fromBlock: 0},
  function(error, event){ console.log(event); })

El proveedor fue en un principio Metamask. Pero eso arrojó el error:The current provider doesn't support subscriptions

Así que me cambié a Infura. Infura tuvo un problema similar a menos que use websockets. El error desapareció y, en cambio, comencé a luchar con un problema de tiempo de espera. Después de mucho esfuerzo, parece que el enfoque websocket de Infura aún no funciona a la perfección. Entonces, estoy pensando en implementar mi propio nodo geth que simplemente ejecuta esa consulta. Pero antes de hacer eso, ¿hay algo que me esté perdiendo? El problema no debería ser tan difícil. Después de todo, he visto muchas billeteras ERC20.

No creo que haya otra manera que leer eventos.

Respuestas (1)

Un problema con la implementación de CryptoKitties de ERC721 es que los parámetros de eventos no están indexados:

event Transfer(address from, address to, uint256 tokenId)
event Approval(address owner, address approved, uint256 tokenId);

Esto hace que el filtrado sea una operación más costosa y provoque tiempos de espera. Dado que es parte del contrato, esto no se puede cambiar y afectará a su propio nodo.

El estándar final los tiene indexados y no tendrá problemas con las nuevas implementaciones que lo siguen.

Para CryptoKitties, una posible solución es indexar todos los eventos en una base de datos por separado.

Impresionante. Bueno saber. Extrañé esto por completo. :)