diff --git a/indexer/src/kadena-server/config/graphql-types.ts b/indexer/src/kadena-server/config/graphql-types.ts index 236a6145..2e34bb6e 100644 --- a/indexer/src/kadena-server/config/graphql-types.ts +++ b/indexer/src/kadena-server/config/graphql-types.ts @@ -798,6 +798,8 @@ export type Query = { * At least one of accountName, fungibleName, blockHash, or requestKey must be provided. */ transactions: QueryTransactionsConnection; + /** Retrieve all transactions by a given pact code. */ + transactionsByPactCode: QueryTransactionsByPactCodeConnection; /** Retrieve all transactions by a given public key. */ transactionsByPublicKey: QueryTransactionsByPublicKeyConnection; /** Retrieve transfers. Default page size is 20. */ @@ -998,6 +1000,14 @@ export type QueryTransactionsArgs = { requestKey?: InputMaybe; }; +export type QueryTransactionsByPactCodeArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + pactCode: Scalars['String']['input']; +}; + export type QueryTransactionsByPublicKeyArgs = { after?: InputMaybe; before?: InputMaybe; @@ -1108,6 +1118,18 @@ export type QueryTokensEdge = { node: Token; }; +export type QueryTransactionsByPactCodeConnection = { + __typename?: 'QueryTransactionsByPactCodeConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type QueryTransactionsByPactCodeConnectionEdge = { + __typename?: 'QueryTransactionsByPactCodeConnectionEdge'; + cursor: Scalars['String']['output']; + node: TransactionSummary; +}; + export type QueryTransactionsByPublicKeyConnection = { __typename?: 'QueryTransactionsByPublicKeyConnection'; edges: Array; @@ -1377,6 +1399,19 @@ export type TransactionSignature = { sig: Scalars['String']['output']; }; +export type TransactionSummary = { + __typename?: 'TransactionSummary'; + canonical: Scalars['Boolean']['output']; + chainId: Scalars['String']['output']; + creationTime: Scalars['String']['output']; + gas: Scalars['String']['output']; + gasLimit: Scalars['String']['output']; + gasPrice: Scalars['String']['output']; + height: Scalars['String']['output']; + requestKey: Scalars['String']['output']; + sender: Scalars['String']['output']; +}; + /** A transfer of funds from a fungible between two accounts. */ export type Transfer = Node & { __typename?: 'Transfer'; @@ -1779,6 +1814,8 @@ export type ResolversTypes = { QueryPoolsConnectionEdge: ResolverTypeWrapper; QueryTokensConnection: ResolverTypeWrapper; QueryTokensEdge: ResolverTypeWrapper; + QueryTransactionsByPactCodeConnection: ResolverTypeWrapper; + QueryTransactionsByPactCodeConnectionEdge: ResolverTypeWrapper; QueryTransactionsByPublicKeyConnection: ResolverTypeWrapper< Omit & { edges: Array; @@ -1856,6 +1893,7 @@ export type ResolversTypes = { Omit & { node: ResolversTypes['Transfer'] } >; TransactionSignature: ResolverTypeWrapper; + TransactionSummary: ResolverTypeWrapper; Transfer: ResolverTypeWrapper< Omit & { block: ResolversTypes['Block']; @@ -2047,6 +2085,8 @@ export type ResolversParentTypes = { QueryPoolsConnectionEdge: QueryPoolsConnectionEdge; QueryTokensConnection: QueryTokensConnection; QueryTokensEdge: QueryTokensEdge; + QueryTransactionsByPactCodeConnection: QueryTransactionsByPactCodeConnection; + QueryTransactionsByPactCodeConnectionEdge: QueryTransactionsByPactCodeConnectionEdge; QueryTransactionsByPublicKeyConnection: Omit & { edges: Array; }; @@ -2105,6 +2145,7 @@ export type ResolversParentTypes = { 'node' > & { node: ResolversParentTypes['Transfer'] }; TransactionSignature: TransactionSignature; + TransactionSummary: TransactionSummary; Transfer: Omit & { block: ResolversParentTypes['Block']; crossChainTransfer?: Maybe; @@ -3094,6 +3135,12 @@ export type QueryResolvers< ContextType, Partial >; + transactionsByPactCode?: Resolver< + ResolversTypes['QueryTransactionsByPactCodeConnection'], + ParentType, + ContextType, + RequireFields + >; transactionsByPublicKey?: Resolver< ResolversTypes['QueryTransactionsByPublicKeyConnection'], ParentType, @@ -3264,6 +3311,30 @@ export type QueryTokensEdgeResolvers< __isTypeOf?: IsTypeOfResolverFn; }; +export type QueryTransactionsByPactCodeConnectionResolvers< + ContextType = any, + ParentType extends + ResolversParentTypes['QueryTransactionsByPactCodeConnection'] = ResolversParentTypes['QueryTransactionsByPactCodeConnection'], +> = { + edges?: Resolver< + Array, + ParentType, + ContextType + >; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type QueryTransactionsByPactCodeConnectionEdgeResolvers< + ContextType = any, + ParentType extends + ResolversParentTypes['QueryTransactionsByPactCodeConnectionEdge'] = ResolversParentTypes['QueryTransactionsByPactCodeConnectionEdge'], +> = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + export type QueryTransactionsByPublicKeyConnectionResolvers< ContextType = any, ParentType extends @@ -3595,6 +3666,23 @@ export type TransactionSignatureResolvers< __isTypeOf?: IsTypeOfResolverFn; }; +export type TransactionSummaryResolvers< + ContextType = any, + ParentType extends + ResolversParentTypes['TransactionSummary'] = ResolversParentTypes['TransactionSummary'], +> = { + canonical?: Resolver; + chainId?: Resolver; + creationTime?: Resolver; + gas?: Resolver; + gasLimit?: Resolver; + gasPrice?: Resolver; + height?: Resolver; + requestKey?: Resolver; + sender?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + export type TransferResolvers< ContextType = any, ParentType extends ResolversParentTypes['Transfer'] = ResolversParentTypes['Transfer'], @@ -3701,6 +3789,8 @@ export type Resolvers = { QueryPoolsConnectionEdge?: QueryPoolsConnectionEdgeResolvers; QueryTokensConnection?: QueryTokensConnectionResolvers; QueryTokensEdge?: QueryTokensEdgeResolvers; + QueryTransactionsByPactCodeConnection?: QueryTransactionsByPactCodeConnectionResolvers; + QueryTransactionsByPactCodeConnectionEdge?: QueryTransactionsByPactCodeConnectionEdgeResolvers; QueryTransactionsByPublicKeyConnection?: QueryTransactionsByPublicKeyConnectionResolvers; QueryTransactionsByPublicKeyConnectionEdge?: QueryTransactionsByPublicKeyConnectionEdgeResolvers; QueryTransactionsConnection?: QueryTransactionsConnectionResolvers; @@ -3725,6 +3815,7 @@ export type Resolvers = { TransactionResultTransfersConnection?: TransactionResultTransfersConnectionResolvers; TransactionResultTransfersConnectionEdge?: TransactionResultTransfersConnectionEdgeResolvers; TransactionSignature?: TransactionSignatureResolvers; + TransactionSummary?: TransactionSummaryResolvers; Transfer?: TransferResolvers; UserGuard?: UserGuardResolvers; }; diff --git a/indexer/src/kadena-server/config/schema.graphql b/indexer/src/kadena-server/config/schema.graphql index f284dc5f..5e8bb3ce 100644 --- a/indexer/src/kadena-server/config/schema.graphql +++ b/indexer/src/kadena-server/config/schema.graphql @@ -338,6 +338,17 @@ type Query { publicKey: String! ): QueryTransactionsByPublicKeyConnection! @complexity(value: 1, multipliers: ["first", "last"]) + """ + Retrieve all transactions by a given pact code. + """ + transactionsByPactCode( + after: String + before: String + first: Int + last: Int + pactCode: String! + ): QueryTransactionsByPactCodeConnection! @complexity(value: 1, multipliers: ["first", "last"]) + """ Retrieve transfers. Default page size is 20. """ @@ -432,6 +443,28 @@ type Query { tokenPrices(protocolAddress: String): [TokenPrice!]! @complexity(value: 1) } +type QueryTransactionsByPactCodeConnection { + edges: [QueryTransactionsByPactCodeConnectionEdge!]! + pageInfo: PageInfo! +} + +type QueryTransactionsByPactCodeConnectionEdge { + cursor: String! + node: TransactionSummary! +} + +type TransactionSummary { + requestKey: String! + height: String! + chainId: String! + canonical: Boolean! + creationTime: String! + sender: String! + gas: String! + gasLimit: String! + gasPrice: String! +} + """ Connection type for balance query results. """ diff --git a/indexer/src/kadena-server/repository/application/transaction-repository.ts b/indexer/src/kadena-server/repository/application/transaction-repository.ts index 6f47cbc5..d17c7996 100644 --- a/indexer/src/kadena-server/repository/application/transaction-repository.ts +++ b/indexer/src/kadena-server/repository/application/transaction-repository.ts @@ -25,6 +25,10 @@ import { ConnectionEdge } from '../types'; */ export type GetTransactionsParams = GetTransactionsCountParams & PaginationsParams; +export type GetTransactionsByPactCodeParams = PaginationsParams & { + pactCode: string; +}; + /** * Parameters for fetching transactions by a specific public key. * Extends pagination parameters to support page-based data access. @@ -109,6 +113,18 @@ export type TransactionOutput = Omit & { blockHeight: number; }; +export type TransactionByPactCodeOutput = { + creationTime: string; + requestKey: string; + chainId: string; + height: string; + canonical: boolean; + gas: string; + gasLimit: string; + gasPrice: string; + sender: string; +}; + /** * Transaction metadata as returned by the repository. * Direct mapping to the GraphQL TransactionMeta type. @@ -138,6 +154,18 @@ export default interface TransactionRepository { edges: ConnectionEdge[]; }>; + /** + * Retrieves transactions by pact code with pagination. + * + * @param params - Pact code and pagination parameters + * @returns Promise resolving to paginated transaction results + */ + + getTransactionsByPactCode(params: GetTransactionsByPactCodeParams): Promise<{ + pageInfo: PageInfo; + edges: ConnectionEdge[]; + }>; + /** * Retrieves the last transactions based on specified parameters. * diff --git a/indexer/src/kadena-server/repository/infra/query-builders/transaction-query-builder.ts b/indexer/src/kadena-server/repository/infra/query-builders/transaction-query-builder.ts index 29d7fb4b..e88237c6 100644 --- a/indexer/src/kadena-server/repository/infra/query-builders/transaction-query-builder.ts +++ b/indexer/src/kadena-server/repository/infra/query-builders/transaction-query-builder.ts @@ -421,14 +421,8 @@ export default class TransactionQueryBuilder { limit: number; transactionCode: string; }) { - let whereCondition = `\nWHERE td.code::text LIKE '%' || $2::text || '%' AND b.canonical = $3`; - let queryParams: (string | number | boolean)[] = [params.limit, params.transactionCode, true]; - - if (!params.after && !params.before && params.order === 'DESC') { - const currentTime = Date.now() - 10000000; - queryParams.push(currentTime, 0); - whereCondition += `\nAND t.creationtime > $${queryParams.length - 1} AND t.id > $${queryParams.length}`; - } + let whereCondition = `\nWHERE td.code::text LIKE '%' || $2 || '%' AND t.sender != 'coinbase'`; + let queryParams: (string | number | boolean)[] = [params.limit, params.transactionCode]; if (params.after) { const [creationTime, id] = params.after.split(':'); @@ -442,38 +436,24 @@ export default class TransactionQueryBuilder { } const query = ` - WITH filtered_transactions AS ( - SELECT t.*, td.code, td.nonce, td.sigs, td.continuation, td.pactid, td.proof, td.rollback, td.gas, td.step, td.data, b.height, b.hash as "blockHash" - FROM "Transactions" t - JOIN "TransactionDetails" td ON t.id = td."transactionId" - JOIN "Blocks" b ON b.id = t."blockId" - ${whereCondition} - ORDER BY t.creationtime ${params.order}, t.id ${params.order} - ) SELECT t.id AS id, - t.creationtime AS "creationTime", - t.hash AS "hashTransaction", - t.nonce AS "nonceTransaction", - t.sigs AS sigs, - t.continuation AS continuation, - t.num_events AS "eventCount", - t.pactid AS "pactId", - t.proof AS proof, - t.rollback AS rollback, - t.txid AS txid, - t.height AS "height", - t."blockHash" AS "blockHash", + t.requestkey AS "requestKey", t."chainId" AS "chainId", - t.gas AS "gas", - t.step AS step, - t.data AS data, - t.code AS code, - t.logs AS "logs", + t.creationtime AS "creationTime", + t.sender AS "sender", + td.gas AS "gas", + td.gaslimit AS "gasLimit", + td.gasprice AS "gasPrice", t.result AS "result", - t.requestkey AS "requestKey" - FROM filtered_transactions t - LIMIT $1 + b.height AS "height", + b.canonical AS "canonical" + FROM "TransactionDetails" td + JOIN "Transactions" t ON t.id = td."transactionId" + JOIN "Blocks" b ON b.id = t."blockId" + ${whereCondition} + ORDER BY t.creationtime ${params.order}, t.id ${params.order} + LIMIT $1 `; return { query, queryParams }; diff --git a/indexer/src/kadena-server/repository/infra/repository/transaction-db-repository.ts b/indexer/src/kadena-server/repository/infra/repository/transaction-db-repository.ts index aa73dc6e..1c6be118 100644 --- a/indexer/src/kadena-server/repository/infra/repository/transaction-db-repository.ts +++ b/indexer/src/kadena-server/repository/infra/repository/transaction-db-repository.ts @@ -20,6 +20,7 @@ import { rootPgPool } from '../../../../config/database'; import TransactionRepository, { GetSignersParams, + GetTransactionsByPactCodeParams, GetTransactionsByPublicKeyParams, GetTransactionsByRequestKey, GetTransactionsCountParams, @@ -126,28 +127,6 @@ export default class TransactionDbRepository implements TransactionRepository { return pageInfo; } - if (rest.transactionCode) { - const { query, queryParams } = this.queryBuilder.buildTransactionByCodeQuery({ - after, - before, - order, - limit, - transactionCode: rest.transactionCode, - }); - - // Execute the query with the constructed parameters - const { rows } = await rootPgPool.query(query, queryParams); - - // Transform database rows into GraphQL-compatible edges with cursors - const edges = rows.map(row => ({ - cursor: `${row.creationTime.toString()}:${row.id.toString()}`, - node: transactionValidator.validate(row), - })); - - const pageInfo = getPageInfo({ edges, order, limit, after, before }); - return pageInfo; - } - const maxHeightQuery = `SELECT max(height) FROM "Blocks"`; const maxHeightFromDb = (await rootPgPool.query(maxHeightQuery)).rows[0].max; // If no minimumDepth is specified, we can use the normal query approach @@ -273,6 +252,41 @@ export default class TransactionDbRepository implements TransactionRepository { return lastTransactions; } + /** + * Retrieves transactions by pact code with pagination. + * + * @param params - Pact code and pagination parameters + * @returns Promise resolving to paginated transaction results + */ + async getTransactionsByPactCode(params: GetTransactionsByPactCodeParams) { + const { after: afterEncoded, before: beforeEncoded, first, last, pactCode } = params; + + // Process pagination parameters + const { limit, order, after, before } = getPaginationParams({ + after: afterEncoded, + before: beforeEncoded, + first, + last, + }); + + const { query, queryParams } = this.queryBuilder.buildTransactionByCodeQuery({ + after, + before, + order, + limit, + transactionCode: pactCode, + }); + + const { rows } = await rootPgPool.query(query, queryParams); + + // Create edges for paginated result and apply sorting + const edges = rows.slice(0, limit).map(tx => ({ + cursor: `${tx.creationTime.toString()}:${tx.id.toString()}`, + node: tx, + })); + + return getPageInfo({ edges, order, limit, after, before }); + } /** * Retrieves a transaction associated with a specific transfer. * This method finds the transaction that contains a specific transfer by ID. diff --git a/indexer/src/kadena-server/resolvers/index.ts b/indexer/src/kadena-server/resolvers/index.ts index ee222519..b12fa8ea 100644 --- a/indexer/src/kadena-server/resolvers/index.ts +++ b/indexer/src/kadena-server/resolvers/index.ts @@ -103,6 +103,7 @@ import { totalCountNonFungibleAccountTransfersConnectionResolver } from '@/kaden import { transfersNonFungibleChainAccountResolver } from '@/kadena-server/resolvers/fields/non-fungible-chain-account/transfers-non-fungible-chain-account-resolver'; import { totalCountNonFungibleChainAccountTransfersConnectionResolver } from '@/kadena-server/resolvers/fields/non-fungible-chain-account/transfers-connection/total-count-non-fungible-chain-account-transfers-connection-resolver'; import { totalCountQueryBlocksFromHeightConnectionResolver } from '@/kadena-server/resolvers/fields/query-blocks-from-height-connection/total-count-query-blocks-from-height-connection-resolver'; +import { transactionsByPactCodeQueryResolver } from '@/kadena-server/resolvers/query/transactions-by-pact-code-query-resolver'; /** * Complete resolver map for the GraphQL API * @@ -152,6 +153,7 @@ export const resolvers: Resolvers = { pools: poolsQueryResolver, transaction: transactionQueryResolver, transactions: transactionsQueryResolver, + transactionsByPactCode: transactionsByPactCodeQueryResolver, transactionsByPublicKey: transactionsByPublicKeyQueryResolver, transfers: transfersQueryResolver, tokens: tokensQueryResolver, diff --git a/indexer/src/kadena-server/resolvers/query/transactions-by-pact-code-query-resolver.ts b/indexer/src/kadena-server/resolvers/query/transactions-by-pact-code-query-resolver.ts new file mode 100644 index 00000000..ec529ff7 --- /dev/null +++ b/indexer/src/kadena-server/resolvers/query/transactions-by-pact-code-query-resolver.ts @@ -0,0 +1,8 @@ +import { ResolverContext } from '../../config/apollo-server-config'; +import { QueryResolvers } from '../../config/graphql-types'; + +export const transactionsByPactCodeQueryResolver: QueryResolvers['transactionsByPactCode'] = + async (_parent, args, context) => { + const output = await context.transactionRepository.getTransactionsByPactCode(args); + return output; + }; diff --git a/indexer/tests/integration/builders/transactions-by-pact-code.builders.ts b/indexer/tests/integration/builders/transactions-by-pact-code.builders.ts new file mode 100644 index 00000000..b77c02f8 --- /dev/null +++ b/indexer/tests/integration/builders/transactions-by-pact-code.builders.ts @@ -0,0 +1,40 @@ +import { gql } from 'graphql-request'; + +export const getTransactionsByPactCodeQuery = (params: any): string => { + if (Object.keys(params).length === 0) { + throw new Error('No parameters provided to getTransactionsByPactCodeQuery.'); + } + + const query = Object.entries(params) + .map(([key, value]) => `${key}: ${typeof value === 'string' ? `"${value}"` : value}`) + .join(', '); + + const queryGql = gql` + query { + transactionsByPactCode(${query}) { + pageInfo { + endCursor + hasNextPage + hasPreviousPage + startCursor + } + edges { + cursor + node { + creationTime + requestKey + chainId + height + canonical + gas + gasLimit + gasPrice + sender + } + } + } + } + `; + + return queryGql; +}; diff --git a/indexer/tests/integration/fixtures/transactions-by-pact-code/transactions-by-pact-code.fixture.001.ts b/indexer/tests/integration/fixtures/transactions-by-pact-code/transactions-by-pact-code.fixture.001.ts new file mode 100644 index 00000000..fd3a95d5 --- /dev/null +++ b/indexer/tests/integration/fixtures/transactions-by-pact-code/transactions-by-pact-code.fixture.001.ts @@ -0,0 +1,294 @@ +export const transactionsByPactCodeFixture001 = { + data: { + transactionsByPactCode: { + pageInfo: { + endCursor: 'MTc1NDg0MTE2NzozMTMxOTUxNjI=', + hasNextPage: true, + hasPreviousPage: true, + startCursor: 'MTc1NTExMTcyNDozMTM5NDkyODI=', + }, + edges: [ + { + cursor: 'MTc1NTExMTcyNDozMTM5NDkyODI=', + node: { + canonical: true, + chainId: '2', + creationTime: '1755111724', + gas: '15529', + gasLimit: '80300', + gasPrice: '0.0000001', + height: '6087403', + requestKey: 'NSsHVpnOi0c67Q0GzqJsrC_IW7m1xR2UHifq3Ki4Mj8', + sender: 'k:1801d7f61f01e5f4dd61b851bf58d78dbb4e7e47822b5c3fe1cacf2085e6caef', + }, + }, + { + cursor: 'MTc1NTEwNjY1NDozMTM5MzU2OTU=', + node: { + canonical: true, + chainId: '2', + creationTime: '1755106654', + gas: '49555', + gasLimit: '80300', + gasPrice: '0.0000001', + height: '6087235', + requestKey: 'f2AxAh6jUJIVPidn_fgRzddi0MKHsM_IRiQmbglq0Fs', + sender: 'k:22dab5d2f1e393e428eb7515879436662f7b4f7868767ddb1becc77b39e33d1b', + }, + }, + { + cursor: 'MTc1NTEwNjU4OTozMTM5MzU1MDU=', + node: { + canonical: true, + chainId: '2', + creationTime: '1755106589', + gas: '14780', + gasLimit: '80300', + gasPrice: '0.0000001', + height: '6087231', + requestKey: '30f3l3eJul_JacnaAcQxB6ppqnPlcPPEc_lzBne4eTk', + sender: 'k:22dab5d2f1e393e428eb7515879436662f7b4f7868767ddb1becc77b39e33d1b', + }, + }, + { + cursor: 'MTc1NTA2OTI2NTozMTM4NDAyOTA=', + node: { + canonical: true, + chainId: '8', + creationTime: '1755069265', + gas: '26097', + gasLimit: '150000', + gasPrice: '0.00000001', + height: '6085989', + requestKey: 'kPdQSS2VwlABYDcWL96GRgxtLH6RX3aZsvR9byPG2rI', + sender: 'k:4f40ed48b79aef0ceccbf4c649c8d3c142acecc85076a971e7b3b3d53286a67d', + }, + }, + { + cursor: 'MTc1NTA1MTYyODozMTM3ODY3NTM=', + node: { + canonical: true, + chainId: '0', + creationTime: '1755051628', + gas: '399', + gasLimit: '1000', + gasPrice: '0.0000001', + height: '6085392', + requestKey: 'ohL27SAJfuo-DnV6BVivKap7KIYh3HsNjhAfXQ3CywY', + sender: 'k:622ffb74b3cfd91a45e3031a11f59f1ff93bfe14da87c1b33b6612530fa924c2', + }, + }, + { + cursor: 'MTc1NTA0NDg0MjozMTM3NjE4MzA=', + node: { + canonical: true, + chainId: '2', + creationTime: '1755044842', + gas: '107271', + gasLimit: '120000', + gasPrice: '0.00000001', + height: '6085164', + requestKey: 'B1PkDUZAHmnAo4Qz_0l4HYhxoF1aV5acZgShmhMPKuE', + sender: 'k:35fe76ea8f40caa2bb660b3236132f339dfdac2586a3d2a9d63ea96ee91202ad', + }, + }, + { + cursor: 'MTc1NTAzMDg5NjozMTM3MjUzNzY=', + node: { + canonical: true, + chainId: '2', + creationTime: '1755030896', + gas: '106981', + gasLimit: '120000', + gasPrice: '0.00000001', + height: '6084703', + requestKey: '4VMDAjkppoI_wYhZboWDACoCvRvnb3W7aQZWr8aYyLM', + sender: 'k:35fe76ea8f40caa2bb660b3236132f339dfdac2586a3d2a9d63ea96ee91202ad', + }, + }, + { + cursor: 'MTc1NTAyOTA0NTozMTM3MjExMTY=', + node: { + canonical: true, + chainId: '0', + creationTime: '1755029045', + gas: '399', + gasLimit: '1000', + gasPrice: '0.0000001', + height: '6084649', + requestKey: 'MBd1dydPzHm5BtrEi6qpebIGext5zdYWv3HbsP2heY4', + sender: 'k:2cb99920f6b2af1e87d43ab32124c5df210d89110d127b7250f8508b8cbffd73', + }, + }, + { + cursor: 'MTc1NTAyODIzNzozMTM3MTkwNDI=', + node: { + canonical: true, + chainId: '2', + creationTime: '1755028237', + gas: '106981', + gasLimit: '120000', + gasPrice: '0.00000001', + height: '6084622', + requestKey: '32tEuE6o8kVbPX_ECaGlo5PPQmd8CpUgHOb0-OEkPUI', + sender: 'k:35fe76ea8f40caa2bb660b3236132f339dfdac2586a3d2a9d63ea96ee91202ad', + }, + }, + { + cursor: 'MTc1NTAwODI3MDozMTM2NjU5ODE=', + node: { + canonical: true, + chainId: '8', + creationTime: '1755008270', + gas: '550', + gasLimit: '5000', + gasPrice: '0.000001', + height: '6083959', + requestKey: 'rnZa6aAIkabL5BbTLbRJ8s2f-ZrZimipGC7AYpTeNTw', + sender: 'k:470ea61ff9130e156f3c3f4789ab2c43fb334ea89cbeb75fe5161ed2fd2b7cd1', + }, + }, + { + cursor: 'MTc1NTAwODI1MjozMTM2NjU5NjA=', + node: { + canonical: true, + chainId: '8', + creationTime: '1755008252', + gas: '550', + gasLimit: '5000', + gasPrice: '0.000001', + height: '6083958', + requestKey: 'iooWHKROOdziDTcIu6r0iQV_6GKfx3fgwoB-zPLGyx4', + sender: 'k:470ea61ff9130e156f3c3f4789ab2c43fb334ea89cbeb75fe5161ed2fd2b7cd1', + }, + }, + { + cursor: 'MTc1NTAwODIzNzozMTM2NjU4NDg=', + node: { + canonical: true, + chainId: '8', + creationTime: '1755008237', + gas: '550', + gasLimit: '5000', + gasPrice: '0.000001', + height: '6083957', + requestKey: 'XHybf013hk7yIB1_R3lrtXsdQZEkOMj-xYpggfNLo0E', + sender: 'k:470ea61ff9130e156f3c3f4789ab2c43fb334ea89cbeb75fe5161ed2fd2b7cd1', + }, + }, + { + cursor: 'MTc1NTAwODIxMzozMTM2NjU4NDc=', + node: { + canonical: true, + chainId: '8', + creationTime: '1755008213', + gas: '550', + gasLimit: '5000', + gasPrice: '0.000001', + height: '6083957', + requestKey: '12mFMyBLvdPZm9Y-zvSaUFLXi2NnBno6H5vnO0KgixQ', + sender: 'k:470ea61ff9130e156f3c3f4789ab2c43fb334ea89cbeb75fe5161ed2fd2b7cd1', + }, + }, + { + cursor: 'MTc1NTAwODE1MzozMTM2NjU3MjI=', + node: { + canonical: true, + chainId: '8', + creationTime: '1755008153', + gas: '550', + gasLimit: '5000', + gasPrice: '0.000001', + height: '6083953', + requestKey: 'ipHJE3ewcE66G42XJ-vk9MJ3hLedN56GcfnXI4gRnvY', + sender: 'k:470ea61ff9130e156f3c3f4789ab2c43fb334ea89cbeb75fe5161ed2fd2b7cd1', + }, + }, + { + cursor: 'MTc1NTAwODEzOTozMTM2NjU3MTg=', + node: { + canonical: true, + chainId: '8', + creationTime: '1755008139', + gas: '550', + gasLimit: '5000', + gasPrice: '0.000001', + height: '6083953', + requestKey: '_LCLZ9jbBR7Qd-Ph3sQ7xNwmwoBFhH52YBYwghaRF3E', + sender: 'k:470ea61ff9130e156f3c3f4789ab2c43fb334ea89cbeb75fe5161ed2fd2b7cd1', + }, + }, + { + cursor: 'MTc1NTAwODExMDozMTM2NjU3MTc=', + node: { + canonical: true, + chainId: '8', + creationTime: '1755008110', + gas: '550', + gasLimit: '5000', + gasPrice: '0.000001', + height: '6083953', + requestKey: 'xJC_ErFBcf3Vu_MYZAq-PYmA1i2IkUC0Sf36M9pYPdk', + sender: 'k:470ea61ff9130e156f3c3f4789ab2c43fb334ea89cbeb75fe5161ed2fd2b7cd1', + }, + }, + { + cursor: 'MTc1NDk2OTM0MjozMTM1NjIxMzI=', + node: { + canonical: true, + chainId: '0', + creationTime: '1754969342', + gas: '399', + gasLimit: '1000', + gasPrice: '0.0000001', + height: '6082659', + requestKey: 'yrD6mTO-gEy55Xc3ORQAMdUXnIk0g0-HQYS9OIFGNAM', + sender: 'k:0221bf3b1c74095b9b3c08cd06d5326e7034e7a0826672806bc7f375770a86d0', + }, + }, + { + cursor: 'MTc1NDkzOTMwNjozMTM0NzE0Njg=', + node: { + canonical: true, + chainId: '0', + creationTime: '1754939306', + gas: '399', + gasLimit: '1000', + gasPrice: '0.0000001', + height: '6081657', + requestKey: 'Aob-u1aOSJFgrVijD9R7dD3mPOcW03sQ4SXJ6bK35OU', + sender: 'k:942b29a22c1e24f66410195ee0d9d0e8c752e4a5ab70e465866f8707ba4ee837', + }, + }, + { + cursor: 'MTc1NDkyMTUzNTozMTM0MjQzNjg=', + node: { + canonical: true, + chainId: '2', + creationTime: '1754921535', + gas: '49555', + gasLimit: '80300', + gasPrice: '0.0000001', + height: '6081065', + requestKey: '0-EhQQPDfy7I5FwSeNd4VhGz_yV6_6aG4_f3bFizE8A', + sender: 'k:22dab5d2f1e393e428eb7515879436662f7b4f7868767ddb1becc77b39e33d1b', + }, + }, + { + cursor: 'MTc1NDg0MTE2NzozMTMxOTUxNjI=', + node: { + canonical: true, + chainId: '0', + creationTime: '1754841167', + gas: '206', + gasLimit: '1000', + gasPrice: '0.0000001', + height: '6078390', + requestKey: 'fuaIBUoWjIG4JFbznXbLJ5v4AOZnEenxatx_GfUE_Kc', + sender: 'k:570a9d82acf68a4bdb0a803ae56f892d4328e1ad0630618efb11128469bd80f3', + }, + }, + ], + }, + }, +}; diff --git a/indexer/tests/integration/queries/transactions-by-pact-code.query.test.ts b/indexer/tests/integration/queries/transactions-by-pact-code.query.test.ts new file mode 100644 index 00000000..6464f320 --- /dev/null +++ b/indexer/tests/integration/queries/transactions-by-pact-code.query.test.ts @@ -0,0 +1,18 @@ +import { GraphQLClient } from 'graphql-request'; +import { getTransactionsByPactCodeQuery } from '../builders/transactions-by-pact-code.builders'; + +import { transactionsByPactCodeFixture001 } from '../fixtures/transactions-by-pact-code/transactions-by-pact-code.fixture.001'; + +const client = new GraphQLClient(process.env.API_URL ?? 'http://localhost:3001/graphql'); + +describe('TransactionsByPactCode', () => { + it('#001 - code', async () => { + const query = getTransactionsByPactCodeQuery({ + pactCode: 'burn', + after: 'MTc1NTExMTc5NTozMTM5NDk0MTg=', + first: 20, + }); + const data = await client.request(query); + expect(transactionsByPactCodeFixture001.data).toMatchObject(data); + }); +}); diff --git a/indexer/tests/integration/queries/transactions.query.test.ts b/indexer/tests/integration/queries/transactions.query.test.ts index 8436ddc9..05215b32 100644 --- a/indexer/tests/integration/queries/transactions.query.test.ts +++ b/indexer/tests/integration/queries/transactions.query.test.ts @@ -213,14 +213,4 @@ describe('Transactions', () => { const data = await client.request(query); expect(transactionsFixture018.data).toMatchObject(data); }); - - it('#019 - code', async () => { - const query = getTransactionsQuery({ - code: 'create', - after: 'MTc1NTUxOTMxNzozMTUwOTk1NzU=', - first: 25, - }); - const data = await client.request(query); - expect(transactionsFixture019.data).toMatchObject(data); - }); });