11

I'm sure this question was asked before, but I did not find any result that helped my problem.

How can I get the transactions (in and out) for a given account? I use nodejs and web3?

With this line I get the number of sent transactions:

web3.eth.getTransactionCount(accounts[i])

So at least web3 should know something about the account activity.

Is there an easy way to get the transactions of my accounts? Or did I miss something about it? Do I have to crawl the entire blockchain, block by block, to get my transactions?

  • 3
    There's actually an important distinction between knowing the number of transactions and actually fetching those txs. The "transaction count" is also the nonce for the account, which is needed to create new transactions and is part of the account's state, just like the balance. Past transactions are not part of the current state, so you need to actually filter through all of the past blocks to find them – Tjaden Hess Sep 29 '16 at 13:44
  • I have the same issue. Does anyone have snippet code of Java, using web3j? Thanks – Kiem Duong Nov 2 '18 at 5:10
10

This script has a getTransactionsByAccount. You need to modify it by prepending web3, for example use web3.eth.blockNumber instead of just eth.blockNumber (which works in the Geth console since the Geth console includes the web3 object).

Above will give the easy transactions, and more work will be needed for How to get contract internal transactions.

In addition to @Tjaden's comment, web3.eth.getTransactionCount(account) only gives the number of transactions originating from account.

  • Thank you. Before I asked, I found the script and pasted it into my editor. It didn't work and I hoped there is an easy way around finding why. No time to try now, but is it done when I add web3 or do have to define variables etc.? – Christoph Bergmann Sep 29 '16 at 18:31
  • 2
    web3 should be the only object you need; the other variables are passed into the getTransactionsByAccount function. – eth Oct 7 '16 at 1:15
  • If you're running the script in node, you must await each web3 call – arshbot Jun 26 '18 at 14:39
6

Simple transactions are not indexed. So you either need to iterate over all the blocks, use some kind of an off-chain index (e.g. etherscan.io), or build one up yourself and use it.

For example, you can use this heuristic approach without having to process the entire chain

var myAddr = '0xbb9bc244d798123fde783fcc1c72d3bb8c189413';
var currentBlock = eth.blockNumber;
var n = eth.getTransactionCount(myAddr, currentBlock);
var bal = eth.getBalance(myAddr, currentBlock);
for (var i=currentBlock; i >= 0 && (n > 0 || bal > 0); --i) {
    try {
        var block = eth.getBlock(i, true);
        if (block && block.transactions) {
            block.transactions.forEach(function(e) {
                if (myAddr == e.from) {
                    if (e.from != e.to)
                        bal = bal.plus(e.value);
                    console.log(i, e.from, e.to, e.value.toString(10));
                    --n;
                }
                if (myAddr == e.to) {
                    if (e.from != e.to)
                        bal = bal.minus(e.value);
                    console.log(i, e.from, e.to, e.value.toString(10));
                }
            });
        }
    } catch (e) { console.error("Error in block " + i, e); }
}

How does it work?

Using the available information about the current state (number of "from" transactions and the current balance), it goes back in time until at least so many "from" transactions have been found, and then continues going back until the balance reaches 0.

The inherent limitation is that 0-value transactions before the account was funded will not be found.


Contract events on the other hand, are indexed. So if you're developing a smart contract, you can make use of that.
Using web3 1.0.0 API:

web3.eth.getPastLogs({fromBlock:'0x0',address:'0x9e3319636e2126e3c0bc9e3134AEC5e1508A46c7'})
.then(res => {
  res.forEach(rec => {
    console.log(rec.blockNumber, rec.transactionHash, rec.topics);
  });
}).catch(err => console.log("getPastLogs failed", err));

Or via JSON RPC eth_getLogs.

4

check etherscan.io api you can get a list of all transactions easily as an alternative

https://etherscan.io/apis

http://api.etherscan.io/api?module=account&action=txlist&address=0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae&startblock=0&endblock=99999999&sort=asc&apikey=YourApiKeyToken

0

I did not find this method 'web3.eth.getTransactionsByAccount' in my console. as i see, there is no direct way to get transactions by account address, maybe you should crawl the entire blockchain by your way or you can use third party api.

  • That method doesn't exist in web3. What @eth was referring to was a script called getTransactionsByAccount. – arshbot Jun 26 '18 at 14:38
0
 web3.eth.getTransactionCount("0x8fFcABE2D92A76286b58f6C286980877C3C2C5C6")
 .then((b=console.log)=>{
    console.log(b)
    for(var i=0;i<b;i++){
            web3.eth.getBlock(b-i).then((Block)=>
            {

            a =[
                            Block.hash
                 ]
                     console.log(a);
                 var  iterator =a.values()
                 for (let elements of iterator) { 
             web3.eth.getTransactionFromBlock(elements).then(console.log)


                } 
             });
         }
         });

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.