Skip to content

Commit 608e4c0

Browse files
committed
feat: created a query to get the token price based on its latest swap
1 parent fd7d635 commit 608e4c0

File tree

4 files changed

+71
-0
lines changed

4 files changed

+71
-0
lines changed

indexer/src/kadena-server/config/graphql-types.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,7 @@ export type Query = {
765765
* Example of the input needed for a type `code` query: `gasLimitEstimate(input: "{\"code\":\"(coin.details \\\"k:1234\\\")\",\"chainId\":\"3\"}")`
766766
*/
767767
gasLimitEstimate: Array<GasLimitEstimation>;
768+
getTokenPrice?: Maybe<TokenPriceInKda>;
768769
/** Get the configuration of the graph. */
769770
graphConfiguration: GraphConfiguration;
770771
/** Get the height of the block with the highest height. */
@@ -903,6 +904,10 @@ export type QueryGasLimitEstimateArgs = {
903904
input: Array<Scalars['String']['input']>;
904905
};
905906

907+
export type QueryGetTokenPriceArgs = {
908+
moduleName?: InputMaybe<Scalars['String']['input']>;
909+
};
910+
906911
export type QueryLiquidityPositionsArgs = {
907912
after?: InputMaybe<Scalars['String']['input']>;
908913
before?: InputMaybe<Scalars['String']['input']>;
@@ -1271,6 +1276,11 @@ export type TokenPrice = {
12711276
updatedAt: Scalars['DateTime']['output'];
12721277
};
12731278

1279+
export type TokenPriceInKda = {
1280+
__typename?: 'TokenPriceInKda';
1281+
amount?: Maybe<Scalars['Decimal']['output']>;
1282+
};
1283+
12741284
/** A transaction. */
12751285
export type Transaction = Node & {
12761286
__typename?: 'Transaction';
@@ -1850,6 +1860,7 @@ export type ResolversTypes = {
18501860
TimeFrame: TimeFrame;
18511861
Token: ResolverTypeWrapper<Token>;
18521862
TokenPrice: ResolverTypeWrapper<TokenPrice>;
1863+
TokenPriceInKda: ResolverTypeWrapper<TokenPriceInKda>;
18531864
Transaction: ResolverTypeWrapper<
18541865
Omit<Transaction, 'cmd' | 'orphanedTransactions' | 'result'> & {
18551866
cmd: ResolversTypes['TransactionCommand'];
@@ -2113,6 +2124,7 @@ export type ResolversParentTypes = {
21132124
Subscription: {};
21142125
Token: Token;
21152126
TokenPrice: TokenPrice;
2127+
TokenPriceInKda: TokenPriceInKda;
21162128
Transaction: Omit<Transaction, 'cmd' | 'orphanedTransactions' | 'result'> & {
21172129
cmd: ResolversParentTypes['TransactionCommand'];
21182130
orphanedTransactions?: Maybe<Array<Maybe<ResolversParentTypes['Transaction']>>>;
@@ -3049,6 +3061,12 @@ export type QueryResolvers<
30493061
ContextType,
30503062
RequireFields<QueryGasLimitEstimateArgs, 'input'>
30513063
>;
3064+
getTokenPrice?: Resolver<
3065+
Maybe<ResolversTypes['TokenPriceInKda']>,
3066+
ParentType,
3067+
ContextType,
3068+
Partial<QueryGetTokenPriceArgs>
3069+
>;
30523070
graphConfiguration?: Resolver<ResolversTypes['GraphConfiguration'], ParentType, ContextType>;
30533071
lastBlockHeight?: Resolver<Maybe<ResolversTypes['BigInt']>, ParentType, ContextType>;
30543072
liquidityPositions?: Resolver<
@@ -3495,6 +3513,15 @@ export type TokenPriceResolvers<
34953513
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
34963514
};
34973515

3516+
export type TokenPriceInKdaResolvers<
3517+
ContextType = any,
3518+
ParentType extends
3519+
ResolversParentTypes['TokenPriceInKda'] = ResolversParentTypes['TokenPriceInKda'],
3520+
> = {
3521+
amount?: Resolver<Maybe<ResolversTypes['Decimal']>, ParentType, ContextType>;
3522+
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
3523+
};
3524+
34983525
export type TransactionResolvers<
34993526
ContextType = any,
35003527
ParentType extends ResolversParentTypes['Transaction'] = ResolversParentTypes['Transaction'],
@@ -3804,6 +3831,7 @@ export type Resolvers<ContextType = any> = {
38043831
Subscription?: SubscriptionResolvers<ContextType>;
38053832
Token?: TokenResolvers<ContextType>;
38063833
TokenPrice?: TokenPriceResolvers<ContextType>;
3834+
TokenPriceInKda?: TokenPriceInKdaResolvers<ContextType>;
38073835
Transaction?: TransactionResolvers<ContextType>;
38083836
TransactionCapability?: TransactionCapabilityResolvers<ContextType>;
38093837
TransactionCommand?: TransactionCommandResolvers<ContextType>;

indexer/src/kadena-server/config/schema.graphql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,8 @@ type Query {
431431
protocolAddress: String
432432
): DexMetrics! @complexity(value: 1)
433433

434+
getTokenPrice(moduleName: String): TokenPriceInKda
435+
434436
"""
435437
Get price for a specific token
436438
"""
@@ -442,6 +444,10 @@ type Query {
442444
tokenPrices(protocolAddress: String): [TokenPrice!]! @complexity(value: 1)
443445
}
444446

447+
type TokenPriceInKda {
448+
amount: Decimal
449+
}
450+
445451
type QueryTransactionsByPactCodeConnection {
446452
edges: [QueryTransactionsByPactCodeConnectionEdge!]!
447453
pageInfo: PageInfo!

indexer/src/kadena-server/resolvers/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ import { transfersNonFungibleChainAccountResolver } from '@/kadena-server/resolv
104104
import { totalCountNonFungibleChainAccountTransfersConnectionResolver } from '@/kadena-server/resolvers/fields/non-fungible-chain-account/transfers-connection/total-count-non-fungible-chain-account-transfers-connection-resolver';
105105
import { totalCountQueryBlocksFromHeightConnectionResolver } from '@/kadena-server/resolvers/fields/query-blocks-from-height-connection/total-count-query-blocks-from-height-connection-resolver';
106106
import { transactionsByPactCodeQueryResolver } from '@/kadena-server/resolvers/query/transactions-by-pact-code-query-resolver';
107+
import { getTokenPriceQueryResolver } from '@/kadena-server/resolvers/query/get-token-price-resolver';
107108
/**
108109
* Complete resolver map for the GraphQL API
109110
*
@@ -157,6 +158,7 @@ export const resolvers: Resolvers<ResolverContext> = {
157158
transactionsByPublicKey: transactionsByPublicKeyQueryResolver,
158159
transfers: transfersQueryResolver,
159160
tokens: tokensQueryResolver,
161+
getTokenPrice: getTokenPriceQueryResolver,
160162
pool: poolQueryResolver,
161163
poolTransactions: poolTransactionsQueryResolver,
162164
liquidityPositions: liquidityPositionsQueryResolver,
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { rootPgPool } from '@/config/database';
2+
import { ResolverContext } from '@/kadena-server/config/apollo-server-config';
3+
import { QueryGetTokenPriceArgs, QueryResolvers } from '@/kadena-server/config/graphql-types';
4+
import Decimal from 'decimal.js';
5+
6+
export const getTokenPriceQueryResolver: QueryResolvers<ResolverContext>['getTokenPrice'] = async (
7+
_parent: unknown,
8+
args: QueryGetTokenPriceArgs,
9+
) => {
10+
const query = `
11+
SELECT t.result
12+
FROM public."Transactions" t
13+
WHERE t.result::text LIKE '%' || $1 || '%'
14+
ORDER BY t.creationtime DESC, t.id DESC
15+
LIMIT 1
16+
`;
17+
18+
const res: any = await rootPgPool.query(query, [args.moduleName]);
19+
20+
const data = res.rows?.[0]?.result?.data;
21+
if (!data?.[0]?.token || !data?.[1]?.token) {
22+
return null;
23+
}
24+
25+
const isFirstElementTheKdaToken = data?.[0]?.token === 'coin';
26+
const firstValue = data?.[0]?.amount?.decimal ?? data?.[0]?.amount?.integer ?? data?.[0]?.amount;
27+
const secondValue = data?.[1]?.amount?.decimal ?? data?.[1]?.amount?.integer ?? data?.[1]?.amount;
28+
29+
const kadenaValue = isFirstElementTheKdaToken ? firstValue : secondValue;
30+
const tokenValue = isFirstElementTheKdaToken ? secondValue : firstValue;
31+
const amount = new Decimal(tokenValue).div(new Decimal(kadenaValue)).toNumber();
32+
return {
33+
amount,
34+
};
35+
};

0 commit comments

Comments
 (0)