Skip to content

Commit f25d66d

Browse files
authored
Merge pull request #219 from hack-a-chain-software/tokens-and-guards
Tokens query; guards improvement; coinbase handling for mainnet01 and testnet04
2 parents 4a5c779 + 66e9704 commit f25d66d

File tree

15 files changed

+377
-43
lines changed

15 files changed

+377
-43
lines changed

backfill/process/process_events.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ func PrepareEvents(network string, payload fetch.ProcessedPayload, transactionsI
4040
}
4141
}
4242

43+
// TODO: This will be removed after TransactionDetails migration
44+
// if network == "mainnet01" {
45+
// return events, nil
46+
// }
47+
4348
coinbaseDecoded, err := decodeCoinbase(string(payload.Coinbase))
4449
if err != nil {
4550
return nil, fmt.Errorf("decoding Coinbase JSON of block: %w", err)

backfill/process/process_transactions.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,11 @@ func PrepareTransactions(network string, blockId int64, payload fetch.ProcessedP
138138
transactionRecords = append(transactionRecords, transactionRecord)
139139
}
140140

141+
// TODO: This will be removed after TransactionDetails migration
142+
// if network == "mainnet01" {
143+
// return transactionRecords, nil
144+
// }
145+
141146
coinbaseTx, err := processCoinbaseTransaction(string(payload.Coinbase), blockId, block.CreationTime, int64(block.ChainId))
142147

143148
if err != nil {

backfill/process/process_transfers.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ func PrepareTransfers(network string, payload fetch.ProcessedPayload, transactio
2020
transfers = append(transfers, nftTransfers...)
2121
}
2222

23+
// TODO: This will be removed after TransactionDetails migration
24+
// if network == "mainnet01" {
25+
// return transfers, nil
26+
// }
27+
2328
coinbaseDecoded, err := decodeCoinbase(string(payload.Coinbase))
2429
if err != nil {
2530
return nil, fmt.Errorf("decoding Coinbase JSON of block: %w", err)

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

Lines changed: 113 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,23 @@ export type ExecutionPayload = {
152152
export type FungibleAccount = Node & {
153153
__typename?: 'FungibleAccount';
154154
accountName: Scalars['String']['output'];
155+
/**
156+
* Uses "length" multiplier which scales with the number of items in the returned array.
157+
* Each chain account requires a separate database lookup, so complexity = 5 × array_length.
158+
* Example: 3 chain accounts = 5 × 3 = 15 complexity points.
159+
* This pattern is ideal for array fields where complexity scales linearly with result size.
160+
*/
155161
chainAccounts: Array<FungibleChainAccount>;
156162
fungibleName: Scalars['String']['output'];
157163
id: Scalars['ID']['output'];
158164
totalBalance: Scalars['Decimal']['output'];
159-
/** Default page size is 20. */
165+
/**
166+
* Default page size is 20.
167+
* Uses "first" multiplier to control pagination complexity.
168+
* Transactions are expensive operations requiring joins, so base value is higher.
169+
* Example: requesting 20 transactions = 10 × 20 = 200 complexity points.
170+
*/
160171
transactions: FungibleAccountTransactionsConnection;
161-
/** Default page size is 20. */
162172
transfers: FungibleAccountTransfersConnection;
163173
};
164174

@@ -468,10 +478,7 @@ export type Query = {
468478
fungibleAccount?: Maybe<FungibleAccount>;
469479
/** Retrieve an account by public key. */
470480
fungibleAccountsByPublicKey: Array<FungibleAccount>;
471-
/**
472-
* Retrieve an account by its name and fungible, such as coin, on a specific chain.
473-
* @deprecated deprecated, use Query.fungibleChainAccounts
474-
*/
481+
/** Retrieve an account by its name and fungible, such as coin, on a specific chain. */
475482
fungibleChainAccount?: Maybe<FungibleChainAccount>;
476483
/** Retrieve an account by its name and fungible, such as coin, on a specific chain. */
477484
fungibleChainAccounts?: Maybe<Array<FungibleChainAccount>>;
@@ -506,6 +513,7 @@ export type Query = {
506513
nonFungibleChainAccount?: Maybe<NonFungibleChainAccount>;
507514
/** Execute arbitrary Pact code via a local call without gas-estimation or signature-verification (e.g. (+ 1 2) or (coin.get-details <account>)). */
508515
pactQuery: Array<PactQueryResponse>;
516+
tokens?: Maybe<QueryTokensConnection>;
509517
/** Retrieve one transaction by its unique key. Throws an error if multiple transactions are found. */
510518
transaction?: Maybe<Transaction>;
511519
/**
@@ -621,6 +629,13 @@ export type QueryPactQueryArgs = {
621629
pactQuery: Array<PactQuery>;
622630
};
623631

632+
export type QueryTokensArgs = {
633+
after?: InputMaybe<Scalars['String']['input']>;
634+
before?: InputMaybe<Scalars['String']['input']>;
635+
first?: InputMaybe<Scalars['Int']['input']>;
636+
last?: InputMaybe<Scalars['Int']['input']>;
637+
};
638+
624639
export type QueryTransactionArgs = {
625640
blockHash?: InputMaybe<Scalars['String']['input']>;
626641
minimumDepth?: InputMaybe<Scalars['Int']['input']>;
@@ -664,7 +679,7 @@ export type QueryTransfersArgs = {
664679

665680
export type QueryBlocksFromDepthConnection = {
666681
__typename?: 'QueryBlocksFromDepthConnection';
667-
edges: Array<Maybe<QueryBlocksFromDepthConnectionEdge>>;
682+
edges: Array<QueryBlocksFromDepthConnectionEdge>;
668683
pageInfo: PageInfo;
669684
};
670685

@@ -676,7 +691,7 @@ export type QueryBlocksFromDepthConnectionEdge = {
676691

677692
export type QueryBlocksFromHeightConnection = {
678693
__typename?: 'QueryBlocksFromHeightConnection';
679-
edges: Array<Maybe<QueryBlocksFromHeightConnectionEdge>>;
694+
edges: Array<QueryBlocksFromHeightConnectionEdge>;
680695
pageInfo: PageInfo;
681696
};
682697

@@ -711,9 +726,21 @@ export type QueryEventsConnectionEdge = {
711726
node: Event;
712727
};
713728

729+
export type QueryTokensConnection = {
730+
__typename?: 'QueryTokensConnection';
731+
edges: Array<QueryTokensEdge>;
732+
pageInfo: PageInfo;
733+
};
734+
735+
export type QueryTokensEdge = {
736+
__typename?: 'QueryTokensEdge';
737+
cursor: Scalars['String']['output'];
738+
node: Token;
739+
};
740+
714741
export type QueryTransactionsByPublicKeyConnection = {
715742
__typename?: 'QueryTransactionsByPublicKeyConnection';
716-
edges: Array<Maybe<QueryTransactionsByPublicKeyConnectionEdge>>;
743+
edges: Array<QueryTransactionsByPublicKeyConnectionEdge>;
717744
pageInfo: PageInfo;
718745
totalCount: Scalars['Int']['output'];
719746
};
@@ -812,6 +839,13 @@ export type SubscriptionTransactionArgs = {
812839
requestKey: Scalars['String']['input'];
813840
};
814841

842+
export type Token = {
843+
__typename?: 'Token';
844+
chainId: Scalars['String']['output'];
845+
id: Scalars['ID']['output'];
846+
name: Scalars['String']['output'];
847+
};
848+
815849
/** A transaction. */
816850
export type Transaction = Node & {
817851
__typename?: 'Transaction';
@@ -1260,15 +1294,15 @@ export type ResolversTypes = {
12601294
Query: ResolverTypeWrapper<{}>;
12611295
QueryBlocksFromDepthConnection: ResolverTypeWrapper<
12621296
Omit<QueryBlocksFromDepthConnection, 'edges'> & {
1263-
edges: Array<Maybe<ResolversTypes['QueryBlocksFromDepthConnectionEdge']>>;
1297+
edges: Array<ResolversTypes['QueryBlocksFromDepthConnectionEdge']>;
12641298
}
12651299
>;
12661300
QueryBlocksFromDepthConnectionEdge: ResolverTypeWrapper<
12671301
Omit<QueryBlocksFromDepthConnectionEdge, 'node'> & { node: ResolversTypes['Block'] }
12681302
>;
12691303
QueryBlocksFromHeightConnection: ResolverTypeWrapper<
12701304
Omit<QueryBlocksFromHeightConnection, 'edges'> & {
1271-
edges: Array<Maybe<ResolversTypes['QueryBlocksFromHeightConnectionEdge']>>;
1305+
edges: Array<ResolversTypes['QueryBlocksFromHeightConnectionEdge']>;
12721306
}
12731307
>;
12741308
QueryBlocksFromHeightConnectionEdge: ResolverTypeWrapper<
@@ -1290,9 +1324,11 @@ export type ResolversTypes = {
12901324
QueryEventsConnectionEdge: ResolverTypeWrapper<
12911325
Omit<QueryEventsConnectionEdge, 'node'> & { node: ResolversTypes['Event'] }
12921326
>;
1327+
QueryTokensConnection: ResolverTypeWrapper<QueryTokensConnection>;
1328+
QueryTokensEdge: ResolverTypeWrapper<QueryTokensEdge>;
12931329
QueryTransactionsByPublicKeyConnection: ResolverTypeWrapper<
12941330
Omit<QueryTransactionsByPublicKeyConnection, 'edges'> & {
1295-
edges: Array<Maybe<ResolversTypes['QueryTransactionsByPublicKeyConnectionEdge']>>;
1331+
edges: Array<ResolversTypes['QueryTransactionsByPublicKeyConnectionEdge']>;
12961332
}
12971333
>;
12981334
QueryTransactionsByPublicKeyConnectionEdge: ResolverTypeWrapper<
@@ -1320,6 +1356,7 @@ export type ResolversTypes = {
13201356
Signer: ResolverTypeWrapper<Signer>;
13211357
String: ResolverTypeWrapper<Scalars['String']['output']>;
13221358
Subscription: ResolverTypeWrapper<{}>;
1359+
Token: ResolverTypeWrapper<Token>;
13231360
Transaction: ResolverTypeWrapper<
13241361
Omit<Transaction, 'cmd' | 'orphanedTransactions' | 'result'> & {
13251362
cmd: ResolversTypes['TransactionCommand'];
@@ -1495,13 +1532,13 @@ export type ResolversParentTypes = {
14951532
PageInfo: PageInfo;
14961533
Query: {};
14971534
QueryBlocksFromDepthConnection: Omit<QueryBlocksFromDepthConnection, 'edges'> & {
1498-
edges: Array<Maybe<ResolversParentTypes['QueryBlocksFromDepthConnectionEdge']>>;
1535+
edges: Array<ResolversParentTypes['QueryBlocksFromDepthConnectionEdge']>;
14991536
};
15001537
QueryBlocksFromDepthConnectionEdge: Omit<QueryBlocksFromDepthConnectionEdge, 'node'> & {
15011538
node: ResolversParentTypes['Block'];
15021539
};
15031540
QueryBlocksFromHeightConnection: Omit<QueryBlocksFromHeightConnection, 'edges'> & {
1504-
edges: Array<Maybe<ResolversParentTypes['QueryBlocksFromHeightConnectionEdge']>>;
1541+
edges: Array<ResolversParentTypes['QueryBlocksFromHeightConnectionEdge']>;
15051542
};
15061543
QueryBlocksFromHeightConnectionEdge: Omit<QueryBlocksFromHeightConnectionEdge, 'node'> & {
15071544
node: ResolversParentTypes['Block'];
@@ -1519,8 +1556,10 @@ export type ResolversParentTypes = {
15191556
QueryEventsConnectionEdge: Omit<QueryEventsConnectionEdge, 'node'> & {
15201557
node: ResolversParentTypes['Event'];
15211558
};
1559+
QueryTokensConnection: QueryTokensConnection;
1560+
QueryTokensEdge: QueryTokensEdge;
15221561
QueryTransactionsByPublicKeyConnection: Omit<QueryTransactionsByPublicKeyConnection, 'edges'> & {
1523-
edges: Array<Maybe<ResolversParentTypes['QueryTransactionsByPublicKeyConnectionEdge']>>;
1562+
edges: Array<ResolversParentTypes['QueryTransactionsByPublicKeyConnectionEdge']>;
15241563
};
15251564
QueryTransactionsByPublicKeyConnectionEdge: Omit<
15261565
QueryTransactionsByPublicKeyConnectionEdge,
@@ -1542,6 +1581,7 @@ export type ResolversParentTypes = {
15421581
Signer: Signer;
15431582
String: Scalars['String']['output'];
15441583
Subscription: {};
1584+
Token: Token;
15451585
Transaction: Omit<Transaction, 'cmd' | 'orphanedTransactions' | 'result'> & {
15461586
cmd: ResolversParentTypes['TransactionCommand'];
15471587
orphanedTransactions?: Maybe<Array<Maybe<ResolversParentTypes['Transaction']>>>;
@@ -1583,6 +1623,18 @@ export type ResolversParentTypes = {
15831623
UserGuard: UserGuard;
15841624
};
15851625

1626+
export type ComplexityDirectiveArgs = {
1627+
multipliers?: Maybe<Array<Scalars['String']['input']>>;
1628+
value: Scalars['Int']['input'];
1629+
};
1630+
1631+
export type ComplexityDirectiveResolver<
1632+
Result,
1633+
Parent,
1634+
ContextType = any,
1635+
Args = ComplexityDirectiveArgs,
1636+
> = DirectiveResolverFn<Result, Parent, ContextType, Args>;
1637+
15861638
export interface BigIntScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['BigInt'], any> {
15871639
name: 'BigInt';
15881640
}
@@ -2229,6 +2281,12 @@ export type QueryResolvers<
22292281
ContextType,
22302282
RequireFields<QueryPactQueryArgs, 'pactQuery'>
22312283
>;
2284+
tokens?: Resolver<
2285+
Maybe<ResolversTypes['QueryTokensConnection']>,
2286+
ParentType,
2287+
ContextType,
2288+
Partial<QueryTokensArgs>
2289+
>;
22322290
transaction?: Resolver<
22332291
Maybe<ResolversTypes['Transaction']>,
22342292
ParentType,
@@ -2261,7 +2319,7 @@ export type QueryBlocksFromDepthConnectionResolvers<
22612319
ResolversParentTypes['QueryBlocksFromDepthConnection'] = ResolversParentTypes['QueryBlocksFromDepthConnection'],
22622320
> = {
22632321
edges?: Resolver<
2264-
Array<Maybe<ResolversTypes['QueryBlocksFromDepthConnectionEdge']>>,
2322+
Array<ResolversTypes['QueryBlocksFromDepthConnectionEdge']>,
22652323
ParentType,
22662324
ContextType
22672325
>;
@@ -2285,7 +2343,7 @@ export type QueryBlocksFromHeightConnectionResolvers<
22852343
ResolversParentTypes['QueryBlocksFromHeightConnection'] = ResolversParentTypes['QueryBlocksFromHeightConnection'],
22862344
> = {
22872345
edges?: Resolver<
2288-
Array<Maybe<ResolversTypes['QueryBlocksFromHeightConnectionEdge']>>,
2346+
Array<ResolversTypes['QueryBlocksFromHeightConnectionEdge']>,
22892347
ParentType,
22902348
ContextType
22912349
>;
@@ -2348,13 +2406,33 @@ export type QueryEventsConnectionEdgeResolvers<
23482406
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
23492407
};
23502408

2409+
export type QueryTokensConnectionResolvers<
2410+
ContextType = any,
2411+
ParentType extends
2412+
ResolversParentTypes['QueryTokensConnection'] = ResolversParentTypes['QueryTokensConnection'],
2413+
> = {
2414+
edges?: Resolver<Array<ResolversTypes['QueryTokensEdge']>, ParentType, ContextType>;
2415+
pageInfo?: Resolver<ResolversTypes['PageInfo'], ParentType, ContextType>;
2416+
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2417+
};
2418+
2419+
export type QueryTokensEdgeResolvers<
2420+
ContextType = any,
2421+
ParentType extends
2422+
ResolversParentTypes['QueryTokensEdge'] = ResolversParentTypes['QueryTokensEdge'],
2423+
> = {
2424+
cursor?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2425+
node?: Resolver<ResolversTypes['Token'], ParentType, ContextType>;
2426+
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2427+
};
2428+
23512429
export type QueryTransactionsByPublicKeyConnectionResolvers<
23522430
ContextType = any,
23532431
ParentType extends
23542432
ResolversParentTypes['QueryTransactionsByPublicKeyConnection'] = ResolversParentTypes['QueryTransactionsByPublicKeyConnection'],
23552433
> = {
23562434
edges?: Resolver<
2357-
Array<Maybe<ResolversTypes['QueryTransactionsByPublicKeyConnectionEdge']>>,
2435+
Array<ResolversTypes['QueryTransactionsByPublicKeyConnectionEdge']>,
23582436
ParentType,
23592437
ContextType
23602438
>;
@@ -2476,6 +2554,16 @@ export type SubscriptionResolvers<
24762554
>;
24772555
};
24782556

2557+
export type TokenResolvers<
2558+
ContextType = any,
2559+
ParentType extends ResolversParentTypes['Token'] = ResolversParentTypes['Token'],
2560+
> = {
2561+
chainId?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2562+
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
2563+
name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2564+
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2565+
};
2566+
24792567
export type TransactionResolvers<
24802568
ContextType = any,
24812569
ParentType extends ResolversParentTypes['Transaction'] = ResolversParentTypes['Transaction'],
@@ -2731,6 +2819,8 @@ export type Resolvers<ContextType = any> = {
27312819
QueryCompletedBlockHeightsConnectionEdge?: QueryCompletedBlockHeightsConnectionEdgeResolvers<ContextType>;
27322820
QueryEventsConnection?: QueryEventsConnectionResolvers<ContextType>;
27332821
QueryEventsConnectionEdge?: QueryEventsConnectionEdgeResolvers<ContextType>;
2822+
QueryTokensConnection?: QueryTokensConnectionResolvers<ContextType>;
2823+
QueryTokensEdge?: QueryTokensEdgeResolvers<ContextType>;
27342824
QueryTransactionsByPublicKeyConnection?: QueryTransactionsByPublicKeyConnectionResolvers<ContextType>;
27352825
QueryTransactionsByPublicKeyConnectionEdge?: QueryTransactionsByPublicKeyConnectionEdgeResolvers<ContextType>;
27362826
QueryTransactionsConnection?: QueryTransactionsConnectionResolvers<ContextType>;
@@ -2740,6 +2830,7 @@ export type Resolvers<ContextType = any> = {
27402830
RawGuard?: RawGuardResolvers<ContextType>;
27412831
Signer?: SignerResolvers<ContextType>;
27422832
Subscription?: SubscriptionResolvers<ContextType>;
2833+
Token?: TokenResolvers<ContextType>;
27432834
Transaction?: TransactionResolvers<ContextType>;
27442835
TransactionCapability?: TransactionCapabilityResolvers<ContextType>;
27452836
TransactionCommand?: TransactionCommandResolvers<ContextType>;
@@ -2756,3 +2847,7 @@ export type Resolvers<ContextType = any> = {
27562847
Transfer?: TransferResolvers<ContextType>;
27572848
UserGuard?: UserGuardResolvers<ContextType>;
27582849
};
2850+
2851+
export type DirectiveResolvers<ContextType = any> = {
2852+
complexity?: ComplexityDirectiveResolver<any, any, ContextType>;
2853+
};

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,9 @@ type Query {
272272
last: Int
273273
requestKey: String
274274
): QueryTransfersConnection! @complexity(value: 10, multipliers: ["first", "last"])
275+
276+
tokens(after: String, before: String, first: Int, last: Int): QueryTokensConnection!
277+
@complexity(value: 10, multipliers: ["first", "last"])
275278
}
276279

277280
"""
@@ -1033,3 +1036,19 @@ type RawGuard implements IGuard {
10331036
predicate: String! @deprecated(reason: "deprecated, use KeysetGuard.predicate")
10341037
raw: String!
10351038
}
1039+
1040+
type QueryTokensConnection {
1041+
edges: [QueryTokensEdge!]!
1042+
pageInfo: PageInfo!
1043+
}
1044+
1045+
type QueryTokensEdge {
1046+
cursor: String!
1047+
node: Token!
1048+
}
1049+
1050+
type Token {
1051+
id: ID!
1052+
name: String!
1053+
chainId: String!
1054+
}

0 commit comments

Comments
 (0)