From ad99f11400cbd20ec28957aba0858efe909f5975 Mon Sep 17 00:00:00 2001 From: jay-dee7 Date: Tue, 7 Jun 2022 17:13:47 +0530 Subject: [PATCH 1/5] feat: Total Staked Coins API Signed-off-by: jay-dee7 --- src/handlers/totalStakedCoins.ts | 12 ++++++++++++ src/index.ts | 3 +++ 2 files changed, 15 insertions(+) create mode 100644 src/handlers/totalStakedCoins.ts diff --git a/src/handlers/totalStakedCoins.ts b/src/handlers/totalStakedCoins.ts new file mode 100644 index 00000000..ccdcd109 --- /dev/null +++ b/src/handlers/totalStakedCoins.ts @@ -0,0 +1,12 @@ +import { Request } from "itty-router"; +import { BigDipperApi } from "../api/bigDipperApi"; +import { ncheq_to_cheq_fixed } from "../helpers/currency"; +import { GraphQLClient } from "../helpers/graphql"; + +export async function handler(request: Request): Promise { + let gql_client = new GraphQLClient(GRAPHQL_API); + let bd_api = new BigDipperApi(gql_client); + + let total_staked_coins = await bd_api.get_total_staked_coins(); + return new Response(ncheq_to_cheq_fixed(Number(total_staked_coins))); +} diff --git a/src/index.ts b/src/index.ts index 851f9098..4ac6c0c9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,6 +6,7 @@ import { handler as liquidBalanceHandler } from "./handlers/liquidBalance"; import { handler as vestingBalanceHandler } from "./handlers/vestingBalance"; import { handler as vestedBalanceHandler } from "./handlers/vestedBalance"; import { handler as delegatorCount } from './handlers/delegatorCount'; +import { handler as totalStakedCoins } from "./handlers/totalStakedCoins"; addEventListener('fetch', (event: FetchEvent) => { const router = Router() @@ -25,6 +26,8 @@ function registerRoutes(router: Router) { router.get('/staking/delegators/:validator_address', delegatorCount); + router.get('/supply/staked', totalStakedCoins); + // 404 for all other requests router.all('*', () => new Response('Not Found.', { status: 404 })) } From 0b8edb087b36bce6e93c65ca01a440c461fe927c Mon Sep 17 00:00:00 2001 From: jay-dee7 Date: Tue, 7 Jun 2022 23:21:01 +0530 Subject: [PATCH 2/5] feat: Total delegators api Signed-off-by: jay-dee7 --- src/api/bigDipperApi.ts | 27 ++++++++++++++++++++++++++- src/handlers/totalDelegators.ts | 11 +++++++++++ src/index.ts | 3 ++- src/types/node.ts | 9 +++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 src/handlers/totalDelegators.ts diff --git a/src/api/bigDipperApi.ts b/src/api/bigDipperApi.ts index 6c67c2ec..d6ff22a8 100644 --- a/src/api/bigDipperApi.ts +++ b/src/api/bigDipperApi.ts @@ -1,6 +1,6 @@ import { GraphQLClient } from "../helpers/graphql"; import { Account } from "../types/bigDipper"; -import { Coin, ValidatorAggregateCountResponse } from "../types/node"; +import { Coin, Delegation, ValidatorAggregateCountResponse, ValidatorDetailResponse } from "../types/node"; export class BigDipperApi { constructor(public readonly graphql_client: GraphQLClient) { @@ -78,4 +78,29 @@ export class BigDipperApi { return resp.validator[0].delegations_aggregate.aggregate.count; } + + get_total_delegator_count = async (): Promise => { + const query = `query ValidatorDetails { + validator { + validatorStatuses: validator_statuses(order_by: {height: desc}, limit: 1) { + jailed + } + delegations { + delegatorAddress: delegator_address + } + } + }` + + const resp = await this.graphql_client.query(query); + const map = new Map(); + resp.validator.forEach((obj, i) => { + if (!obj.validatorStatuses[0]?.jailed) { + obj.delegations.forEach(delegation => { + map.set(delegation.delegatorAddress, true) + }) + } + }) + + return map.size + } } diff --git a/src/handlers/totalDelegators.ts b/src/handlers/totalDelegators.ts new file mode 100644 index 00000000..eb14f5e7 --- /dev/null +++ b/src/handlers/totalDelegators.ts @@ -0,0 +1,11 @@ +import { Request } from "itty-router"; +import { BigDipperApi } from "../api/bigDipperApi"; +import { GraphQLClient } from "../helpers/graphql"; + +export async function handler(request: Request): Promise { + let gql_client = new GraphQLClient(GRAPHQL_API); + let bd_api = new BigDipperApi(gql_client); + + const delegators = await bd_api.get_total_delegator_count(); + return new Response(JSON.stringify(delegators)); +} diff --git a/src/index.ts b/src/index.ts index 851f9098..df6a6db0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,6 +6,7 @@ import { handler as liquidBalanceHandler } from "./handlers/liquidBalance"; import { handler as vestingBalanceHandler } from "./handlers/vestingBalance"; import { handler as vestedBalanceHandler } from "./handlers/vestedBalance"; import { handler as delegatorCount } from './handlers/delegatorCount'; +import { handler as totalDelegators } from './handlers/totalDelegators'; addEventListener('fetch', (event: FetchEvent) => { const router = Router() @@ -18,13 +19,13 @@ function registerRoutes(router: Router) { router.get('/', totalSupplyHandler); router.get('/supply/total', totalSupplyHandler); router.get('/supply/circulating', circulatingSupplyHandler); + router.get('/staking/delegators/total', totalDelegators); router.get('/balances/total/:address', totalBalanceHandler); router.get('/balances/liquid/:address', liquidBalanceHandler); router.get('/balances/vesting/:address', vestingBalanceHandler); router.get('/balances/vested/:address', vestedBalanceHandler); router.get('/staking/delegators/:validator_address', delegatorCount); - // 404 for all other requests router.all('*', () => new Response('Not Found.', { status: 404 })) } diff --git a/src/types/node.ts b/src/types/node.ts index e07193ec..385f4f3e 100644 --- a/src/types/node.ts +++ b/src/types/node.ts @@ -47,3 +47,12 @@ export interface ValidatorAggregateCountResponse { } ] } + +export interface ValidatorDetailResponse { + validator: [ + { + validatorStatuses: [{ jailed: boolean }], + delegations: [{ delegatorAddress: string }] + } + ] +} From bdc2397f7bb3143a2c207d92117568a558e22dfb Mon Sep 17 00:00:00 2001 From: Ankur Banerjee Date: Tue, 7 Jun 2022 12:59:15 -0500 Subject: [PATCH 3/5] Update index.ts --- src/index.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 4ac6c0c9..10c44f91 100644 --- a/src/index.ts +++ b/src/index.ts @@ -24,8 +24,6 @@ function registerRoutes(router: Router) { router.get('/balances/vesting/:address', vestingBalanceHandler); router.get('/balances/vested/:address', vestedBalanceHandler); router.get('/staking/delegators/:validator_address', delegatorCount); - - router.get('/supply/staked', totalStakedCoins); // 404 for all other requests From 63941fb45498c18b716e3d129445b040aef7a8d8 Mon Sep 17 00:00:00 2001 From: jay-dee7 Date: Wed, 8 Jun 2022 13:04:04 +0530 Subject: [PATCH 4/5] fix: Replace Map with Set for removing duplicates Signed-off-by: jay-dee7 --- src/api/bigDipperApi.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/api/bigDipperApi.ts b/src/api/bigDipperApi.ts index d6ff22a8..dd2759e5 100644 --- a/src/api/bigDipperApi.ts +++ b/src/api/bigDipperApi.ts @@ -92,15 +92,15 @@ export class BigDipperApi { }` const resp = await this.graphql_client.query(query); - const map = new Map(); + const set = new Set(); resp.validator.forEach((obj, i) => { if (!obj.validatorStatuses[0]?.jailed) { obj.delegations.forEach(delegation => { - map.set(delegation.delegatorAddress, true) + set.add(delegation.delegatorAddress) }) } }) - return map.size + return set.size } } From 00dfb3746d30a7490be01737d67912b435100324 Mon Sep 17 00:00:00 2001 From: jay-dee7 Date: Thu, 9 Jun 2022 04:24:24 +0530 Subject: [PATCH 5/5] fix: Method for querying staked coins using GraphQL Signed-off-by: jay-dee7 --- src/api/bigDipperApi.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/api/bigDipperApi.ts b/src/api/bigDipperApi.ts index dd2759e5..7b980476 100644 --- a/src/api/bigDipperApi.ts +++ b/src/api/bigDipperApi.ts @@ -103,4 +103,15 @@ export class BigDipperApi { return set.size } + + get_total_staked_coins = async (): Promise => { + let query = `query StakingInfo{ + staking_pool { + bonded_tokens + } + }` + + const resp = await this.graphql_client.query<{ staking_pool: [{ "bonded_tokens": string }] }>(query); + return resp.staking_pool[0].bonded_tokens; + } }