Changes to the get_account_history, Filtering operations!

image.png

So there's recently been some changes in the account history API. Now it allows us to fetch account history (duh), But we can filter out specific operations making it much faster and customizable.

This is not fully implemented to all nodes yet, so it is experimental. I've used it on several nodes... https://api.hive.blog, https://api.deathwing.me, https://api.pharesim.me/ with direct request... but there is a block of code in hive-js 0.8.9 to pop extra parameters if the node isn't https://api.hive.blog.

@hiveio/hive-js/lib/api/transports/http.js

//SPECIAL CODE - can be removed after all API node operators upgrade to get the updated get_account_history api call
if (this.options.uri !== 'https://api.hive.blog' && data.method === 'get_account_history' && data.params.length >= 4) {
  //We are experimenting with a new version of get_account_history that can now take up to 5 params
  //but this is only deployed on api.hive.blog nodes, so if this particular request is going to a different
  //backend, just strip the extra parameters off the call to avoid breaking it. Once all API nodes have upgraded
  //this code can be removed.
  while (data.params.length > 3) {
    data.params.pop();
  }params = [api, data.method, data.params];
}
//END SPECIAL CODE

Guide

This feature requires two more parameters operation_filter_low and operation_filter_high in get_account_history request. we are going to use latest version of hive-js (0.8.9) in the tutorial below.

So firstly, to get things up, along with the normal hive-js library we need to import two more things from the lib's directory named chainTypes & makeBitMaskFilter. one of them carries the index of operations as how they are viewed on the blockchain and other being a function to create a BitMask of those indexes hence returning new parameters.

const hive = require("@hiveio/hive-js");
const chainTypes = require("@hiveio/hive-js/lib/auth/serializer/src/ChainTypes");
const makeBitMaskFilter = require("@hiveio/hive-js/lib/auth/serializer/src/makeBitMaskFilter");

Then to retrieve the new parameters, we choose which operations we need to filter from the history. we get the indexes of all operations from operation property in chainTypes and calling the makeBitMaskFilter function like this

const op = chainTypes.operations;
const filter = makeBitMaskFilter([
  op.curation_reward,
  op.author_reward,
  op.comment_reward,
  op.liquidity_reward
]);

console.log(filter); // [ '8444249301319680', null ]

The above code will return an array of two elements which can be used as two last parameters of our request.


Continuing this we will now make the final adjustment of setting the rpc node to https://api.hive.blog, otherwise it will remove the new parameters.

hive.api.setOptions({url: "https://api.hive.blog"});

After that, as usual we can make a request with hive.api.getAccountHistory() function but including new params like this.

hive.api.getAccountHistory(
  'ali-h',
  -1, 1000,
  filter[0],
  filter[1],
  function(err, result) {
  console.log(err, result);
});

Executing above code will return all the operations we used to create the BitMaskFilter in the last 1000 operations by the account ali-h, i.e. curation, author, comment and liquidity rewards.

This method (with hive-js) only works on https://api.hive.blog right now but there are other nodes that have already updated accordingly. so we can use any other library like axios to use this feature on them. Maybe in the next updates it will get out of the 'experimental' phase.

FULL CODE:

const hive = require("@hiveio/hive-js");
const chainTypes = require("@hiveio/hive-js/lib/auth/serializer/src/ChainTypes");
const makeBitMaskFilter = require("@hiveio/hive-js/lib/auth/serializer/src/makeBitMaskFilter");

const op = chainTypes.operations;
const filter = makeBitMaskFilter([
  op.curation_reward,
  op.author_reward,
  op.comment_reward,
  op.liquidity_reward
]);

hive.api.setOptions({url: "https://api.hive.blog"});

hive.api.getAccountHistory(
  'ali-h',
  -1, 1000,
  filter[0],
  filter[1],
  function(err, result) {
  console.log(err, result);
});

Links

Hive Profile
GitHub Profile
Discord: Ali H#7057

H2
H3
H4
3 columns
2 columns
1 column
2 Comments
Ecency