I came up with a slightly different solution which filter's out nominators for a specific set of validator. I hope this helps someone out!
Note:
I wasn't able to parse the API's return value for
const nominators = await api.query.staking.nominators.entries();
so I wrote to json and parsed that instead as a temporary solution.
There is still a lot of parsing to do; if anybody comes up with a better solution please post it.
Here's my code:
/**
* Extracts all staking data for nominators which support the target_validaotrs.
* @param {ApiPromise} api the active polkadot.js api connection
* @param {Collection} target_validators validators whose nominators will be filtered
* @param {boolean} dump_json if true, write intermediate data to json and log filter message
* @returns a collection of staking data for each nominator supporting a target validator
*/
async function getNominatorStaking(api, target_validators, dump_json = false) {
const nominators = await api.query.staking.nominators.entries();
let nominatorData = nominators.map(entry => entry.map(data => data.toHuman()));
// Filter nominators for those that support target validators
const filteredNominators = nominatorData.filter(
n => containsTargets(n[1].targets, target_validators)
);
const filteredNominatorAddresses = filteredNominators.map(entry => entry[0][0]);
// Create chunks so as not to overload api
let apiChunkSize = 64;
const size = apiChunkSize;
var nominatorAddressesChuncked = [];
for (let i = 0; i < filteredNominatorAddresses.length; i += size) {
const chunk = filteredNominatorAddresses.slice(i, i + size);
nominatorAddressesChuncked.push(chunk);
}
// Fetch staking data for filtered nominators
const nominatorStakings = [];
for (const chunk of tdqm(nominatorAddressesChuncked)) {
nominatorStakings.push(...await api.derive.staking.accounts(chunk));
}
// Dump data to json if requested
if (dump_json) {
// Log information about filtering process
console.log(
filteredNominators.length +
" addresses filtered out of " +
nominatorData.length + ": " +
Math.floor(filteredNominators.length / nominatorData.length * 100) +
"%"
);
// Write json files
fs.writeFileSync(
'intermediaries/nominators.json',
JSON.stringify(nominatorData, null, 2)
);
fs.writeFileSync(
'intermediaries/filtered_nominators.json',
JSON.stringify(filteredNominators, null, 2)
);
fs.writeFileSync(
'intermediaries/filtered_nominator_stakings.json',
JSON.stringify(nominatorStakings, null, 2)
);
}
return nominatorStakings;
}