Acepte el pago del token ERC20 usando web3.js

Acepto pagos de Ethereum y Bitcoin en un sitio comercial y conservo los saldos de los usuarios en una base de datos. Me gustaría poder recibir tokens ERC20 también (como Bancor) si es posible. No estoy creando un nuevo contrato de token, solo quiero aceptarlos como pago.

Como el 90% de las respuestas en la web, sugieren un filterevento de sondeo del Transfer(address,address,uint256)uso de web3.js. Corríjame si me equivoco, pero ¿cómo obtendré el TX correspondiente de ese pago de ese evento?

No tengo un conocimiento profundo sobre Ethereum y los contratos inteligentes.

Espejo: https://github.com/ethereum/web3.js/issues/1109

Ozgur, también estoy trabajando para un proyecto como el tuyo y realmente me pregunto si encontraste una solución para esto o no. Traté de encontrar tus datos de contacto, pero no hay nada más que tu perfil medio. ¿Podrías dejar tu correo electrónico, redes sociales? o algo para contactar con usted?
Esto realmente no responde la pregunta. Si tiene una pregunta diferente, puede hacerla haciendo clic en Preguntar . También puede agregar una recompensa para llamar más la atención sobre esta pregunta una vez que tenga suficiente reputación . - De la revisión
Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente reputación , podrá comentar cualquier publicación ; en su lugar, proporcione respuestas que no requieran aclaración por parte del autor de la pregunta . - De la revisión

Respuestas (3)

Al buscar eventos desde web3, este es el formato del resultado que obtiene cuando se llama a uno:

{ address: '0x9c0ac1e0f0a8e0b01c7b652d5fbe094ddff48b81',
  blockNumber: 704227,
  transactionHash: '0x5887ba4e15d51e1cfddf626ecf416a0002085a1e0929fffe1f90ad69d5040081',
  transactionIndex: 0,
  blockHash: '0x5f485133ec662f556d88affccc18a358375de160178c6cf7cc0cec678d833a2a',
  logIndex: 0,
  removed: false,
  event: 'ExampleEvent',
  args: 
   { argOne: BigNumber { s: 1, e: 0, c: [Array] },
     argTwo: '0x374623456fa2' } }

Entonces puede obtener el TX de result.transactionHash

Evento en contrato:

event ExampleEvent(uint argOne, bytes32 argTwo)

código web3:

import exampleContractObject from 'path/to/ExampleContract.json'

ExampleContract = web3.eth.contract(exampleContractObject.abi);
contractInstance = ExampleContract.at('0x9c0ac1e0f0a8e0b01c7b652d5fbe094ddff48b81');
exampleEvent = contractInstance.ExampleEvent();

exampleEvent.watch((err, result) => {
  // Do something 
}

EDITAR:

El evento de transferencia de tokens ERC20 se vería así:

{ address: '<contract_address>',
  blockNumber: <block_number>,
  transactionHash: '<transaction_hash>',
  transactionIndex: <tx_index_in_block,
  blockHash: '<block_hash>',
  logIndex: <log_index>,
  removed: <> ,
  event: 'Transfer',
  args: 
   { _from: <address>,
     _two: <address> ,
     _value: <uint256>} }

Para aceptar tokens como pago, todo lo que necesita es una cuenta de Ethereum. Los tokens se pueden enviar a cualquier dirección. Para recibirlos, las personas que poseen los tokens simplemente deben enviarlos en una transacción en la red. Supongo que quien implementó el contrato para acuñar los tokens probablemente también creó una interfaz de usuario frontal para acceder a la función transferTo() en su contrato de token.

Entonces, básicamente, si desea aceptar tokens como pago, todo lo que tiene que hacer es publicar su dirección de Ethereum y se pueden enviar. Si desea verificar cuántos tokens tiene, puede usar etherscan.io o puede escribir algún código en Solidity que verificará el saldo. Si el token cumple con ERC20, tendrá una función en el contrato a la que debería poder acceder que mostrará tokens para cualquier dirección determinada. Para acceder a esa función, necesitará el contrato ABI del equipo que lo implementó y luego escribir un poco de código Solidity.

Si lo único que te interesa es aceptar un pago con tokens, entonces la persona que tiene los tokens simplemente tiene que enviarlos en una transacción a tu cuenta y los habrás recibido.

Las cosas del filtro serían si está tratando de ver la cadena de bloques en busca de cualquier transferencia de tokens y mantener un saldo en su máquina local, o usando Metamask o algo así. Si desea conservar esos saldos en una base de datos local, probablemente tendrá que escribir un poco de código de Solidity y luego obtener la dirección del contrato y ABI para acceder a él.

Salud

¿Qué pasa con el hash de transacción? Ciertamente lo necesito porque mi infraestructura de pago actual depende de la validación basada en TX. Los persisto y los usuarios deben poder ver su historial de "depósito".
Además, no me sugiera servicios de terceros como etherscan.

La función que necesita para hacer esto es transfer(address, value). Debe ser el propietario del contrato para llamar a esta función. Puede realizar estos cambios localmente usando ganache y llamando al método de transferencia (dirección, valor) de su contrato. Si desea hacer esto directamente en el EVM, debe usar Infura que le brindará el enlace a la red en la que está ejecutando el contrato, por lo que podría llamar a las funciones de su contrato usando web3. Para esto debe llamar al código abi de su contrato para crear una instancia y luego llamar a las funciones del contrato.