[Ethereum] Accept ERC20 token payment using web3.js

addresseserc-20paymentsweb3js

I'm accepting Ethereum and Bitcoin payments in an trading site and I persist user balances in a database. I'd like to be able to receive ERC20 tokens too (like Bancor) if possible. I am not creating new token contract, just want to accept them as payment.

As the %90 of the answers on the web, they suggest polling filter event of Transfer(address,address,uint256) using web3.js. Please correct me if I'm wrong, but how will I get corresponding TX of that payment from that event?

I don't have deep knowledge about Ethereum and smart contracts.

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

Best Answer

When watching for events from web3, this is the format of the result you get when one is called:

{ 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' } }

So you can just get the TX from result.transactionHash

Event in contract:

event ExampleEvent(uint argOne, bytes32 argTwo)

Web3 code:

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 
}

EDIT:

The Transfer event from ERC20 tokens would look like this:

{ 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>} }
Related Topic