Skip to content

Commit a95adc6

Browse files
authored
Merge pull request #190 from hack-a-chain-software/improvements
Improvements
2 parents 034e01d + 7cdcf27 commit a95adc6

28 files changed

+664
-248
lines changed

indexer/src/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@ import { useKadenaGraphqlServer } from "./kadena-server/server";
99
import { closeDatabase } from "./config/database";
1010
import { initializeDatabase } from "./config/init";
1111
import { startGuardsBackfill } from "./services/sync/guards";
12+
import { startBackfillCoinbaseTransactions } from "./services/sync/coinbase";
1213

1314
program
1415
.option("-s, --streaming", "Start streaming blockchain data")
1516
.option("-g, --oldGraphql", "Start GraphQL server based on Postgraphile")
1617
.option("-t, --graphql", "Start GraphQL server based on kadena schema")
1718
.option("-f, --guards", "Backfill the guards")
19+
// this option shouldn't be used if you initialize the indexer from the beginning
20+
.option("-c, --coinbase", "Backfill coinbase transactions")
1821
.option("-z, --database", "Init the database");
1922

2023
program.parse(process.argv);
@@ -37,6 +40,8 @@ async function main() {
3740
await startStreaming();
3841
} else if (options.guards) {
3942
await startGuardsBackfill();
43+
} else if (options.coinbase) {
44+
await startBackfillCoinbaseTransactions();
4045
} else if (options.oldGraphql) {
4146
await usePostgraphile();
4247
} else if (options.graphql) {

indexer/src/kadena-server/config/apollo-server-config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export type ResolverContext = {
4040
mempoolGateway: MempoolGateway;
4141
pactGateway: PactGateway;
4242
pubSub: PubSub;
43+
signal: AbortSignal;
4344
};
4445

4546
export const createGraphqlContext = () => {
@@ -56,6 +57,7 @@ export const createGraphqlContext = () => {
5657
mempoolGateway: new MempoolApiGateway(),
5758
pactGateway: new PactApiGateway(),
5859
pubSub: publishSubscribe,
60+
signal: new AbortController().signal,
5961
};
6062

6163
return Promise.resolve({

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

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -472,8 +472,13 @@ export type Query = {
472472
fungibleAccount?: Maybe<FungibleAccount>;
473473
/** Retrieve an account by public key. */
474474
fungibleAccountsByPublicKey: Array<FungibleAccount>;
475+
/**
476+
* Retrieve an account by its name and fungible, such as coin, on a specific chain.
477+
* @deprecated deprecated, use Query.fungibleChainAccounts
478+
*/
479+
fungibleChainAccount?: Maybe<FungibleChainAccount>;
475480
/** Retrieve an account by its name and fungible, such as coin, on a specific chain. */
476-
fungibleChainAccounts: Array<FungibleChainAccount>;
481+
fungibleChainAccounts?: Maybe<Array<FungibleChainAccount>>;
477482
/** Retrieve a chain account by public key. */
478483
fungibleChainAccountsByPublicKey: Array<FungibleChainAccount>;
479484
/**
@@ -585,6 +590,13 @@ export type QueryFungibleAccountsByPublicKeyArgs = {
585590
};
586591

587592

593+
export type QueryFungibleChainAccountArgs = {
594+
accountName: Scalars['String']['input'];
595+
chainId: Scalars['String']['input'];
596+
fungibleName?: InputMaybe<Scalars['String']['input']>;
597+
};
598+
599+
588600
export type QueryFungibleChainAccountsArgs = {
589601
accountName: Scalars['String']['input'];
590602
chainIds?: InputMaybe<Array<Scalars['String']['input']>>;
@@ -762,6 +774,16 @@ export type QueryTransfersConnectionEdge = {
762774
node: Transfer;
763775
};
764776

777+
/** DEPRECATED: a fallthrough IGuard type to cover non-KeysetGuard types. */
778+
export type RawGuard = IGuard & {
779+
__typename?: 'RawGuard';
780+
/** @deprecated deprecated, use KeysetGuard.keys */
781+
keys: Array<Scalars['String']['output']>;
782+
/** @deprecated deprecated, use KeysetGuard.predicate */
783+
predicate: Scalars['String']['output'];
784+
raw: Scalars['String']['output'];
785+
};
786+
765787
/** A signer for a specific transaction. */
766788
export type Signer = Node & {
767789
__typename?: 'Signer';
@@ -884,6 +906,11 @@ export type TransactionResult = {
884906
gas: Scalars['BigInt']['output'];
885907
/** The transaction result when it was successful. Formatted as raw JSON. */
886908
goodResult?: Maybe<Scalars['String']['output']>;
909+
/**
910+
* The height of the block this transaction belongs to.
911+
* @deprecated Use `block.height` instead.
912+
*/
913+
height: Scalars['BigInt']['output'];
887914
/** Identifier to retrieve the logs for the execution of the transaction. */
888915
logs?: Maybe<Scalars['String']['output']>;
889916
/** @deprecated Not used. */
@@ -968,6 +995,17 @@ export type Transfer = Node & {
968995
transaction?: Maybe<Transaction>;
969996
};
970997

998+
export type UserGuard = IGuard & {
999+
__typename?: 'UserGuard';
1000+
args: Array<Scalars['String']['output']>;
1001+
fun: Scalars['String']['output'];
1002+
/** @deprecated deprecated, use KeysetGuard.keys */
1003+
keys: Array<Scalars['String']['output']>;
1004+
/** @deprecated deprecated, use KeysetGuard.predicate */
1005+
predicate: Scalars['String']['output'];
1006+
raw: Scalars['String']['output'];
1007+
};
1008+
9711009

9721010

9731011
export type ResolverTypeWrapper<T> = Promise<T> | T;
@@ -1043,7 +1081,7 @@ export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {
10431081

10441082
/** Mapping of interface types */
10451083
export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {
1046-
IGuard: ( KeysetGuard );
1084+
IGuard: ( KeysetGuard ) | ( RawGuard ) | ( UserGuard );
10471085
Node: ( Omit<Block, 'events' | 'minerAccount' | 'parent' | 'transactions'> & { events: _RefType['BlockEventsConnection'], minerAccount: _RefType['FungibleChainAccount'], parent?: Maybe<_RefType['Block']>, transactions: _RefType['BlockTransactionsConnection'] } ) | ( Omit<Event, 'block' | 'transaction'> & { block: _RefType['Block'], transaction?: Maybe<_RefType['Transaction']> } ) | ( Omit<FungibleAccount, 'chainAccounts' | 'transactions' | 'transfers'> & { chainAccounts: Array<_RefType['FungibleChainAccount']>, transactions: _RefType['FungibleAccountTransactionsConnection'], transfers: _RefType['FungibleAccountTransfersConnection'] } ) | ( Omit<FungibleChainAccount, 'guard' | 'transactions' | 'transfers'> & { guard: _RefType['IGuard'], transactions: _RefType['FungibleChainAccountTransactionsConnection'], transfers: _RefType['FungibleChainAccountTransfersConnection'] } ) | ( Omit<NonFungibleAccount, 'chainAccounts' | 'nonFungibleTokenBalances' | 'transactions'> & { chainAccounts: Array<_RefType['NonFungibleChainAccount']>, nonFungibleTokenBalances: Array<_RefType['NonFungibleTokenBalance']>, transactions: _RefType['NonFungibleAccountTransactionsConnection'] } ) | ( Omit<NonFungibleChainAccount, 'nonFungibleTokenBalances' | 'transactions'> & { nonFungibleTokenBalances: Array<_RefType['NonFungibleTokenBalance']>, transactions: _RefType['NonFungibleChainAccountTransactionsConnection'] } ) | ( Omit<NonFungibleTokenBalance, 'guard'> & { guard: _RefType['IGuard'] } ) | ( Signer ) | ( Omit<Transaction, 'cmd' | 'orphanedTransactions' | 'result'> & { cmd: _RefType['TransactionCommand'], orphanedTransactions?: Maybe<Array<Maybe<_RefType['Transaction']>>>, result: _RefType['TransactionInfo'] } ) | ( Omit<Transfer, 'block' | 'crossChainTransfer' | 'transaction'> & { block: _RefType['Block'], crossChainTransfer?: Maybe<_RefType['Transfer']>, transaction?: Maybe<_RefType['Transaction']> } );
10481086
};
10491087

@@ -1109,6 +1147,7 @@ export type ResolversTypes = {
11091147
QueryTransactionsConnectionEdge: ResolverTypeWrapper<Omit<QueryTransactionsConnectionEdge, 'node'> & { node: ResolversTypes['Transaction'] }>;
11101148
QueryTransfersConnection: ResolverTypeWrapper<Omit<QueryTransfersConnection, 'edges'> & { edges: Array<ResolversTypes['QueryTransfersConnectionEdge']> }>;
11111149
QueryTransfersConnectionEdge: ResolverTypeWrapper<Omit<QueryTransfersConnectionEdge, 'node'> & { node: ResolversTypes['Transfer'] }>;
1150+
RawGuard: ResolverTypeWrapper<RawGuard>;
11121151
Signer: ResolverTypeWrapper<Signer>;
11131152
String: ResolverTypeWrapper<Scalars['String']['output']>;
11141153
Subscription: ResolverTypeWrapper<{}>;
@@ -1126,6 +1165,7 @@ export type ResolversTypes = {
11261165
TransactionResultTransfersConnectionEdge: ResolverTypeWrapper<Omit<TransactionResultTransfersConnectionEdge, 'node'> & { node: ResolversTypes['Transfer'] }>;
11271166
TransactionSignature: ResolverTypeWrapper<TransactionSignature>;
11281167
Transfer: ResolverTypeWrapper<Omit<Transfer, 'block' | 'crossChainTransfer' | 'transaction'> & { block: ResolversTypes['Block'], crossChainTransfer?: Maybe<ResolversTypes['Transfer']>, transaction?: Maybe<ResolversTypes['Transaction']> }>;
1168+
UserGuard: ResolverTypeWrapper<UserGuard>;
11291169
};
11301170

11311171
/** Mapping between all available schema types and the resolvers parents */
@@ -1190,6 +1230,7 @@ export type ResolversParentTypes = {
11901230
QueryTransactionsConnectionEdge: Omit<QueryTransactionsConnectionEdge, 'node'> & { node: ResolversParentTypes['Transaction'] };
11911231
QueryTransfersConnection: Omit<QueryTransfersConnection, 'edges'> & { edges: Array<ResolversParentTypes['QueryTransfersConnectionEdge']> };
11921232
QueryTransfersConnectionEdge: Omit<QueryTransfersConnectionEdge, 'node'> & { node: ResolversParentTypes['Transfer'] };
1233+
RawGuard: RawGuard;
11931234
Signer: Signer;
11941235
String: Scalars['String']['output'];
11951236
Subscription: {};
@@ -1207,6 +1248,7 @@ export type ResolversParentTypes = {
12071248
TransactionResultTransfersConnectionEdge: Omit<TransactionResultTransfersConnectionEdge, 'node'> & { node: ResolversParentTypes['Transfer'] };
12081249
TransactionSignature: TransactionSignature;
12091250
Transfer: Omit<Transfer, 'block' | 'crossChainTransfer' | 'transaction'> & { block: ResolversParentTypes['Block'], crossChainTransfer?: Maybe<ResolversParentTypes['Transfer']>, transaction?: Maybe<ResolversParentTypes['Transaction']> };
1251+
UserGuard: UserGuard;
12101252
};
12111253

12121254
export interface BigIntScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['BigInt'], any> {
@@ -1403,7 +1445,7 @@ export type GraphConfigurationResolvers<ContextType = any, ParentType extends Re
14031445
};
14041446

14051447
export type IGuardResolvers<ContextType = any, ParentType extends ResolversParentTypes['IGuard'] = ResolversParentTypes['IGuard']> = {
1406-
__resolveType: TypeResolveFn<'KeysetGuard', ParentType, ContextType>;
1448+
__resolveType: TypeResolveFn<'KeysetGuard' | 'RawGuard' | 'UserGuard', ParentType, ContextType>;
14071449
keys?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;
14081450
predicate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
14091451
raw?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
@@ -1527,7 +1569,8 @@ export type QueryResolvers<ContextType = any, ParentType extends ResolversParent
15271569
events?: Resolver<ResolversTypes['QueryEventsConnection'], ParentType, ContextType, RequireFields<QueryEventsArgs, 'qualifiedEventName'>>;
15281570
fungibleAccount?: Resolver<Maybe<ResolversTypes['FungibleAccount']>, ParentType, ContextType, RequireFields<QueryFungibleAccountArgs, 'accountName' | 'fungibleName'>>;
15291571
fungibleAccountsByPublicKey?: Resolver<Array<ResolversTypes['FungibleAccount']>, ParentType, ContextType, RequireFields<QueryFungibleAccountsByPublicKeyArgs, 'fungibleName' | 'publicKey'>>;
1530-
fungibleChainAccounts?: Resolver<Array<ResolversTypes['FungibleChainAccount']>, ParentType, ContextType, RequireFields<QueryFungibleChainAccountsArgs, 'accountName' | 'fungibleName'>>;
1572+
fungibleChainAccount?: Resolver<Maybe<ResolversTypes['FungibleChainAccount']>, ParentType, ContextType, RequireFields<QueryFungibleChainAccountArgs, 'accountName' | 'chainId' | 'fungibleName'>>;
1573+
fungibleChainAccounts?: Resolver<Maybe<Array<ResolversTypes['FungibleChainAccount']>>, ParentType, ContextType, RequireFields<QueryFungibleChainAccountsArgs, 'accountName' | 'fungibleName'>>;
15311574
fungibleChainAccountsByPublicKey?: Resolver<Array<ResolversTypes['FungibleChainAccount']>, ParentType, ContextType, RequireFields<QueryFungibleChainAccountsByPublicKeyArgs, 'chainId' | 'fungibleName' | 'publicKey'>>;
15321575
gasLimitEstimate?: Resolver<Array<ResolversTypes['GasLimitEstimation']>, ParentType, ContextType, RequireFields<QueryGasLimitEstimateArgs, 'input'>>;
15331576
graphConfiguration?: Resolver<ResolversTypes['GraphConfiguration'], ParentType, ContextType>;
@@ -1632,6 +1675,13 @@ export type QueryTransfersConnectionEdgeResolvers<ContextType = any, ParentType
16321675
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
16331676
};
16341677

1678+
export type RawGuardResolvers<ContextType = any, ParentType extends ResolversParentTypes['RawGuard'] = ResolversParentTypes['RawGuard']> = {
1679+
keys?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;
1680+
predicate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1681+
raw?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1682+
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1683+
};
1684+
16351685
export type SignerResolvers<ContextType = any, ParentType extends ResolversParentTypes['Signer'] = ResolversParentTypes['Signer']> = {
16361686
address?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
16371687
clist?: Resolver<Array<ResolversTypes['TransactionCapability']>, ParentType, ContextType>;
@@ -1705,6 +1755,7 @@ export type TransactionResultResolvers<ContextType = any, ParentType extends Res
17051755
events?: Resolver<ResolversTypes['TransactionResultEventsConnection'], ParentType, ContextType, Partial<TransactionResultEventsArgs>>;
17061756
gas?: Resolver<ResolversTypes['BigInt'], ParentType, ContextType>;
17071757
goodResult?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1758+
height?: Resolver<ResolversTypes['BigInt'], ParentType, ContextType>;
17081759
logs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
17091760
metadata?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
17101761
transactionId?: Resolver<Maybe<ResolversTypes['BigInt']>, ParentType, ContextType>;
@@ -1762,6 +1813,15 @@ export type TransferResolvers<ContextType = any, ParentType extends ResolversPar
17621813
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
17631814
};
17641815

1816+
export type UserGuardResolvers<ContextType = any, ParentType extends ResolversParentTypes['UserGuard'] = ResolversParentTypes['UserGuard']> = {
1817+
args?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;
1818+
fun?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1819+
keys?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;
1820+
predicate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1821+
raw?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1822+
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1823+
};
1824+
17651825
export type Resolvers<ContextType = any> = {
17661826
BigInt?: GraphQLScalarType;
17671827
Block?: BlockResolvers<ContextType>;
@@ -1817,6 +1877,7 @@ export type Resolvers<ContextType = any> = {
18171877
QueryTransactionsConnectionEdge?: QueryTransactionsConnectionEdgeResolvers<ContextType>;
18181878
QueryTransfersConnection?: QueryTransfersConnectionResolvers<ContextType>;
18191879
QueryTransfersConnectionEdge?: QueryTransfersConnectionEdgeResolvers<ContextType>;
1880+
RawGuard?: RawGuardResolvers<ContextType>;
18201881
Signer?: SignerResolvers<ContextType>;
18211882
Subscription?: SubscriptionResolvers<ContextType>;
18221883
Transaction?: TransactionResolvers<ContextType>;
@@ -1833,5 +1894,6 @@ export type Resolvers<ContextType = any> = {
18331894
TransactionResultTransfersConnectionEdge?: TransactionResultTransfersConnectionEdgeResolvers<ContextType>;
18341895
TransactionSignature?: TransactionSignatureResolvers<ContextType>;
18351896
Transfer?: TransferResolvers<ContextType>;
1897+
UserGuard?: UserGuardResolvers<ContextType>;
18361898
};
18371899

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

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,14 +135,24 @@ type Query {
135135
publicKey: String!
136136
): [FungibleAccount!]!
137137

138+
"""
139+
Retrieve an account by its name and fungible, such as coin, on a specific chain.
140+
"""
141+
fungibleChainAccount(
142+
accountName: String!
143+
chainId: String!
144+
fungibleName: String = "coin"
145+
): FungibleChainAccount
146+
@deprecated(reason: "deprecated, use Query.fungibleChainAccounts")
147+
138148
"""
139149
Retrieve an account by its name and fungible, such as coin, on a specific chain.
140150
"""
141151
fungibleChainAccounts(
142152
accountName: String!
143153
chainIds: [String!]
144154
fungibleName: String = "coin"
145-
): [FungibleChainAccount!]!
155+
): [FungibleChainAccount!]
146156

147157
"""
148158
Retrieve a chain account by public key.
@@ -732,6 +742,11 @@ type TransactionResult {
732742
logs: String
733743
transactionId: BigInt
734744

745+
"""
746+
The height of the block this transaction belongs to.
747+
"""
748+
height: BigInt! @deprecated(reason: "Use `block.height` instead.")
749+
735750
metadata: String! @deprecated(reason: "Not used.")
736751

737752
block: Block!
@@ -1021,3 +1036,22 @@ type KeysetGuard implements IGuard {
10211036
predicate: String!
10221037
raw: String!
10231038
}
1039+
1040+
type UserGuard implements IGuard {
1041+
args: [String!]!
1042+
fun: String!
1043+
keys: [String!]! @deprecated(reason: "deprecated, use KeysetGuard.keys")
1044+
predicate: String!
1045+
@deprecated(reason: "deprecated, use KeysetGuard.predicate")
1046+
raw: String!
1047+
}
1048+
1049+
"""
1050+
DEPRECATED: a fallthrough IGuard type to cover non-KeysetGuard types.
1051+
"""
1052+
type RawGuard implements IGuard {
1053+
keys: [String!]! @deprecated(reason: "deprecated, use KeysetGuard.keys")
1054+
predicate: String!
1055+
@deprecated(reason: "deprecated, use KeysetGuard.predicate")
1056+
raw: String!
1057+
}

indexer/src/kadena-server/domain/transaction/transaction-service.ts

Lines changed: 0 additions & 40 deletions
This file was deleted.

indexer/src/kadena-server/repository/application/block-repository.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
} from "../../config/graphql-types";
77
import { PaginationsParams } from "../pagination";
88
import { ConnectionEdge } from "../types";
9+
import { TransactionOutput } from "./transaction-repository";
910

1011
export interface GetBlocksFromDepthParams extends PaginationsParams {
1112
chainIds?: InputMaybe<string[]>;
@@ -24,6 +25,12 @@ export interface GetBlocksBetweenHeightsParams extends PaginationsParams {
2425
endHeight?: InputMaybe<number>;
2526
}
2627

28+
export interface GetLatestBlocksParams {
29+
creationTime: number;
30+
lastBlockId?: number;
31+
chainIds?: string[];
32+
}
33+
2734
export type BlockOutput = Omit<
2835
Block,
2936
"parent" | "events" | "minerAccount" | "transactions"
@@ -61,6 +68,12 @@ export default interface BlockRepository {
6168

6269
getTotalCountOfBlockEvents(blockHash: string): Promise<number>;
6370

71+
getLatestBlocks(params: GetLatestBlocksParams): Promise<BlockOutput[]>;
72+
73+
getTransactionsOrderedByBlockDepth(
74+
transactions: TransactionOutput[],
75+
): Promise<TransactionOutput[]>;
76+
6477
// dataloader
6578
getBlocksByEventIds(eventIds: string[]): Promise<BlockOutput[]>;
6679
getBlocksByTransactionIds(transactionIds: string[]): Promise<BlockOutput[]>;

indexer/src/kadena-server/repository/application/event-repository.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@ export interface GetEventParams {
3535
requestKey: string;
3636
}
3737

38+
export interface GetLastEventsParams {
39+
qualifiedEventName: string;
40+
lastEventId?: number;
41+
chainId?: string | null;
42+
minimumDepth?: number | null;
43+
}
44+
3845
export default interface EventRepository {
3946
getEvent(params: GetEventParams): Promise<EventOutput>;
4047
getBlockEvents(params: GetBlockEventsParams): Promise<{
@@ -51,7 +58,9 @@ export default interface EventRepository {
5158
}>;
5259
getTotalEventsCount(hash: GetTotalEventsCount): Promise<number>;
5360
getTotalTransactionEventsCount(
54-
hash: GetTotalTransactionEventsCount
61+
hash: GetTotalTransactionEventsCount,
5562
): Promise<number>;
5663
getTotalCountOfBlockEvents(hash: string): Promise<number>;
64+
getLastEventId(): Promise<number>;
65+
getLastEvents(params: GetLastEventsParams): Promise<EventOutput[]>;
5766
}

0 commit comments

Comments
 (0)