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 filter
evento 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.
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
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.
bajo albayrak
Rob Hitchens
mirg