diff --git a/src/routers/api.js b/src/routers/api.js index 1953df3..81d7bbb 100644 --- a/src/routers/api.js +++ b/src/routers/api.js @@ -7,8 +7,7 @@ const axios = require ('axios'); const {BN, BN_ONE, BN_ZERO, BN_MILLION, hexToU8a} = require("@polkadot/util") const config = require("../../config"); const generateCertificate = require('./generate-certificate') -const { fetchAllCongressSpendings } = require('../utils/spendings'); -const { getLastWeekEraPaidEvents } = require("../utils/explorer"); +const { getLastWeekEraPaidEvents, fetchAllCongressSpendings } = require("../utils/explorer"); const { stringify } = require('csv-stringify/sync'); const pako = require('pako'); diff --git a/src/utils/explorer.js b/src/utils/explorer.js index 5376a8f..594c45f 100644 --- a/src/utils/explorer.js +++ b/src/utils/explorer.js @@ -3,35 +3,160 @@ const axios = require("axios"); const config = require("../../config"); +const CONGRESS_ADDRESS = "5EYCAe5g8CDuMsTief7QBxfvzDFEfws6ueXTUhsbx5V81nGH"; + const eraPaidEventsQuery = ` query EraPaidEvents { - events( - orderBy: BLOCK_NUMBER_DESC, - first: 28, - filter: { - method: { equalTo: "EraPaid" }, - section: { equalTo: "staking" } - } - ) { - nodes { - data - } - } + events( + orderBy: BLOCK_NUMBER_DESC, + first: 28, + filter: { + method: { equalTo: "EraPaid" }, + section: { equalTo: "staking" } + } + ) { + nodes { + data + } + } } `; const getApi = () => axios.create({ - baseURL: config.EXPLORER_API_URL, + baseURL: config.EXPLORER_API_URL, }); const getLastWeekEraPaidEvents = async () => { - const { data } = await getApi().post('', { - query: eraPaidEventsQuery - }); - return data.data.events.nodes.map(v => v.data); + const { data } = await getApi().post('', { + query: eraPaidEventsQuery + }); + return data.data.events.nodes.map(v => v.data); }; + +async function queryAllPages(query, variables, key) { + let allData = []; + let after = undefined; + while (true) { + const result = await fetch(config.EXPLORER_API_URL, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ query, variables: { after, ...variables } }), + }); + const data = await result.json(); + allData.push(data.data[key].nodes); + if (data.data[key].pageInfo.hasNextPage) { + after = data.data[key].pageInfo.endCursor; + } else { + break; + } + } + return allData; +} + +async function getLLMSpendings() { + const data = await queryAllPages( + ` + query LLM($after: Cursor, $userId: String) { + merits(first: 50, after: $after, filter: { fromId: { equalTo: $userId } }) { + nodes { + id + toId + value + remark + block { + number + timestamp + } + } + pageInfo { + hasNextPage, + endCursor + } + } + } + `, + { userId: CONGRESS_ADDRESS }, + "merits" + ); + return data.flat().map((v) => ({ asset: "LLM", ...v })); +} + +async function getAssetsSpendings() { + const data = await queryAllPages( + ` + query Assets($after: Cursor, $userId: String) { + assetTransfers(first: 50, after: $after, filter: { asset: { notEqualTo: "1" }, fromId: { equalTo: $userId } }) { + nodes { + id + asset + toId + value + remark + block { + number + timestamp + } + } + pageInfo { + hasNextPage, + endCursor + } + } + } + `, + { userId: CONGRESS_ADDRESS }, + "assetTransfers" + ); + return data.flat(); +} + +async function getLLDSpendings() { + const data = await queryAllPages( + ` + query LLD($after: Cursor, $userId: String) { + transfers(first: 50, after: $after, filter: { fromId: { equalTo: $userId } }) { + nodes { + id + toId + value + remark + block { + number + timestamp + } + } + pageInfo { + hasNextPage, + endCursor + } + } + } + `, + { userId: CONGRESS_ADDRESS }, + "transfers" + ); + return data.flat().map((v) => ({ asset: "LLD", ...v })); +} + +async function fetchAllCongressSpendings() { + const allSpendings = [ + await getLLDSpendings(), + await getLLMSpendings(), + await getAssetsSpendings(), + ] + .flat() + .sort((a, b) => + parseInt(a.block.number) > parseInt(b.block.number) ? -1 : 1 + ); + + return allSpendings; +} + module.exports = { - getLastWeekEraPaidEvents, + fetchAllCongressSpendings, + getLastWeekEraPaidEvents, } \ No newline at end of file diff --git a/src/utils/spendings.js b/src/utils/spendings.js deleted file mode 100644 index 4f10b7d..0000000 --- a/src/utils/spendings.js +++ /dev/null @@ -1,128 +0,0 @@ -const config = require("../../config"); - -const CONGRESS_ADDRESS = "5EYCAe5g8CDuMsTief7QBxfvzDFEfws6ueXTUhsbx5V81nGH"; - -async function queryAllPages(query, variables, key) { - let allData = []; - let after = undefined; - while (true) { - const result = await fetch(config.EXPLORER_API_URL, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ query, variables: { after, ...variables } }), - }); - const data = await result.json(); - allData.push(data.data[key].nodes); - if (data.data[key].pageInfo.hasNextPage) { - after = data.data[key].pageInfo.endCursor; - } else { - break; - } - } - return allData; -} - -async function getLLMSpendings() { - const data = await queryAllPages( - ` - query LLM($after: Cursor, $userId: String) { - merits(first: 50, after: $after, filter: { fromId: { equalTo: $userId } }) { - nodes { - id - toId - value - remark - block { - number - timestamp - } - } - pageInfo { - hasNextPage, - endCursor - } - } - } - `, - { userId: CONGRESS_ADDRESS }, - "merits" - ); - return data.flat().map((v) => ({ asset: "LLM", ...v })); -} - -async function getAssetsSpendings() { - const data = await queryAllPages( - ` - query Assets($after: Cursor, $userId: String) { - assetTransfers(first: 50, after: $after, filter: { asset: { notEqualTo: "1" }, fromId: { equalTo: $userId } }) { - nodes { - id - asset - toId - value - remark - block { - number - timestamp - } - } - pageInfo { - hasNextPage, - endCursor - } - } - } - `, - { userId: CONGRESS_ADDRESS }, - "assetTransfers" - ); - return data.flat(); -} - -async function getLLDSpendings() { - const data = await queryAllPages( - ` - query LLD($after: Cursor, $userId: String) { - transfers(first: 50, after: $after, filter: { fromId: { equalTo: $userId } }) { - nodes { - id - toId - value - remark - block { - number - timestamp - } - } - pageInfo { - hasNextPage, - endCursor - } - } - } - `, - { userId: CONGRESS_ADDRESS }, - "transfers" - ); - return data.flat().map((v) => ({ asset: "LLD", ...v })); -} - -async function fetchAllCongressSpendings() { - const allSpendings = [ - await getLLDSpendings(), - await getLLMSpendings(), - await getAssetsSpendings(), - ] - .flat() - .sort((a, b) => - parseInt(a.block.number) > parseInt(b.block.number) ? -1 : 1 - ); - - return allSpendings; -} - -module.exports = { - fetchAllCongressSpendings, -};