Skip to content

Commit

Permalink
add transactions 'isScCall' filter support (#1440)
Browse files Browse the repository at this point in the history
* Enhance transaction and account APIs with 'isScCall' filter support

* Enhance TransferController API by adding 'isScCall' query filter for improved transaction detail retrieval

* Enhance ElasticIndexerHelper to support 'isScCall' filter for improved query capabilities

* fixes after review

* fixes after review
  • Loading branch information
cfaur09 authored Jan 28, 2025
1 parent a13ac87 commit 972ac97
Show file tree
Hide file tree
Showing 10 changed files with 64 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/common/indexer/elastic/elastic.indexer.helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,12 @@ export class ElasticIndexerHelper {
elasticQuery = elasticQuery.withMustMatchCondition('round', filter.round);
}

if (filter.isScCall !== undefined) {
elasticQuery = filter.isScCall
? elasticQuery.withMustCondition(QueryType.Match('isScCall', true))
: elasticQuery.withMustNotCondition(QueryType.Match('isScCall', true));
}

return elasticQuery;
}

Expand Down Expand Up @@ -629,6 +635,12 @@ export class ElasticIndexerHelper {
]));
}

if (filter.isScCall !== undefined) {
elasticQuery = filter.isScCall
? elasticQuery.withMustCondition(QueryType.Match('isScCall', true))
: elasticQuery.withMustNotCondition(QueryType.Match('isScCall', true));
}

return elasticQuery;
}

Expand Down
1 change: 1 addition & 0 deletions src/common/indexer/entities/transaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,5 @@ export interface Transaction {
relayer: string;
relayerSignature: string;
isRelayed: boolean;
isScCall: boolean;
}
14 changes: 14 additions & 0 deletions src/endpoints/accounts/account.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -882,6 +882,7 @@ export class AccountController {
@ApiQuery({ name: 'computeScamInfo', required: false, type: Boolean })
@ApiQuery({ name: 'senderOrReceiver', description: 'One address that current address interacted with', required: false })
@ApiQuery({ name: 'isRelayed', description: 'Returns isRelayed transactions details', required: false, type: Boolean })
@ApiQuery({ name: 'isScCall', description: 'Returns sc call transactions details', required: false, type: Boolean })
@ApiQuery({ name: 'withActionTransferValue', description: 'Returns value in USD and EGLD for transferred tokens within the action attribute', required: false })
@ApiQuery({ name: 'withRelayedScresults', description: 'If set to true, will include smart contract results that resemble relayed transactions', required: false, type: Boolean })
async getAccountTransactions(
Expand Down Expand Up @@ -910,6 +911,7 @@ export class AccountController {
@Query('withBlockInfo', ParseBoolPipe) withBlockInfo?: boolean,
@Query('senderOrReceiver', ParseAddressPipe) senderOrReceiver?: string,
@Query('isRelayed', ParseBoolPipe) isRelayed?: boolean,
@Query('isScCall', ParseBoolPipe) isScCall?: boolean,
@Query('withActionTransferValue', ParseBoolPipe) withActionTransferValue?: boolean,
@Query('withRelayedScresults', ParseBoolPipe) withRelayedScresults?: boolean,
) {
Expand All @@ -930,6 +932,7 @@ export class AccountController {
order,
senderOrReceiver,
isRelayed,
isScCall,
round,
withRelayedScresults,
});
Expand All @@ -954,6 +957,7 @@ export class AccountController {
@ApiQuery({ name: 'round', description: 'Round number', required: false })
@ApiQuery({ name: 'senderOrReceiver', description: 'One address that current address interacted with', required: false })
@ApiQuery({ name: 'isRelayed', description: 'Returns isRelayed transactions details', required: false, type: Boolean })
@ApiQuery({ name: 'isScCall', description: 'Returns sc call transactions details', required: false, type: Boolean })
@ApiQuery({ name: 'withRelayedScresults', description: 'If set to true, will include smart contract results that resemble relayed transactions', required: false, type: Boolean })
async getAccountTransactionsCount(
@Param('address', ParseAddressPipe) address: string,
Expand All @@ -971,6 +975,7 @@ export class AccountController {
@Query('round', ParseIntPipe) round?: number,
@Query('senderOrReceiver', ParseAddressPipe) senderOrReceiver?: string,
@Query('isRelayed', ParseBoolPipe) isRelayed?: boolean,
@Query('isScCall', ParseBoolPipe) isScCall?: boolean,
@Query('withRelayedScresults', ParseBoolPipe) withRelayedScresults?: boolean,

): Promise<number> {
Expand All @@ -989,6 +994,7 @@ export class AccountController {
after,
senderOrReceiver,
isRelayed,
isScCall,
round,
withRelayedScresults,
}), address);
Expand All @@ -1015,6 +1021,7 @@ export class AccountController {
@ApiQuery({ name: 'round', description: 'Round number', required: false })
@ApiQuery({ name: 'fields', description: 'List of fields to filter by', required: false, isArray: true, style: 'form', explode: false })
@ApiQuery({ name: 'relayer', description: 'Address of the relayer', required: false })
@ApiQuery({ name: 'isScCall', description: 'Returns sc call transactions details', required: false, type: Boolean })
@ApiQuery({ name: 'withScamInfo', description: 'Returns scam information', required: false, type: Boolean })
@ApiQuery({ name: 'withUsername', description: 'Integrates username in assets for all addresses present in the transactions', required: false, type: Boolean })
@ApiQuery({ name: 'withBlockInfo', description: 'Returns sender / receiver block details', required: false, type: Boolean })
Expand Down Expand Up @@ -1047,6 +1054,7 @@ export class AccountController {
@Query('withUsername', ParseBoolPipe) withUsername?: boolean,
@Query('withBlockInfo', ParseBoolPipe) withBlockInfo?: boolean,
@Query('senderOrReceiver', ParseAddressPipe) senderOrReceiver?: string,
@Query('isScCall', ParseBoolPipe) isScCall?: boolean,
@Query('withLogs', ParseBoolPipe) withLogs?: boolean,
@Query('withOperations', ParseBoolPipe) withOperations?: boolean,
@Query('withActionTransferValue', ParseBoolPipe) withActionTransferValue?: boolean,
Expand Down Expand Up @@ -1075,6 +1083,7 @@ export class AccountController {
round,
withRefunds,
withTxsRelayedByAddress,
isScCall,
}),
new QueryPagination({ from, size }),
options,
Expand All @@ -1097,6 +1106,7 @@ export class AccountController {
@ApiQuery({ name: 'before', description: 'Before timestamp', required: false })
@ApiQuery({ name: 'after', description: 'After timestamp', required: false })
@ApiQuery({ name: 'round', description: 'Round number', required: false })
@ApiQuery({ name: 'isScCall', description: 'Returns sc call transactions details', required: false, type: Boolean })
@ApiQuery({ name: 'senderOrReceiver', description: 'One address that current address interacted with', required: false })
@ApiQuery({ name: 'withRefunds', description: 'Include refund transactions', required: false })
async getAccountTransfersCount(
Expand All @@ -1114,6 +1124,7 @@ export class AccountController {
@Query('after', ParseIntPipe) after?: number,
@Query('round', ParseIntPipe) round?: number,
@Query('senderOrReceiver', ParseAddressPipe) senderOrReceiver?: string,
@Query('isScCall', ParseBoolPipe) isScCall?: boolean,
@Query('withRefunds', ParseBoolPipe) withRefunds?: boolean,
): Promise<number> {
return await this.transferService.getTransfersCount(new TransactionFilter({
Expand All @@ -1131,6 +1142,7 @@ export class AccountController {
after,
senderOrReceiver,
round,
isScCall,
withRefunds,
}));
}
Expand All @@ -1153,6 +1165,7 @@ export class AccountController {
@Query('round', ParseIntPipe) round?: number,
@Query('senderOrReceiver', ParseAddressPipe) senderOrReceiver?: string,
@Query('withRefunds', ParseBoolPipe) withRefunds?: boolean,
@Query('isScCall', ParseBoolPipe) isScCall?: boolean,
): Promise<number> {
return await this.transferService.getTransfersCount(new TransactionFilter({
address,
Expand All @@ -1170,6 +1183,7 @@ export class AccountController {
senderOrReceiver,
round,
withRefunds,
isScCall,
}));
}

Expand Down
14 changes: 14 additions & 0 deletions src/endpoints/tokens/token.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,7 @@ export class TokenController {
@ApiQuery({ name: 'order', description: 'Sort order (asc/desc)', required: false, enum: SortOrder })
@ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false })
@ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false })
@ApiQuery({ name: 'isScCall', description: 'Returns sc call transactions details', required: false, type: Boolean })
@ApiQuery({ name: 'withScResults', description: 'Return scResults for transactions', required: false, type: Boolean })
@ApiQuery({ name: 'withOperations', description: 'Return operations for transactions', required: false, type: Boolean })
@ApiQuery({ name: 'withLogs', description: 'Return logs for transactions', required: false, type: Boolean })
Expand All @@ -237,6 +238,7 @@ export class TokenController {
@Query('round', ParseIntPipe) round?: number,
@Query('order', new ParseEnumPipe(SortOrder)) order?: SortOrder,
@Query('fields', ParseArrayPipe) fields?: string[],
@Query('isScCall', ParseBoolPipe) isScCall?: boolean,
@Query('withScResults', ParseBoolPipe) withScResults?: boolean,
@Query('withOperations', ParseBoolPipe) withOperations?: boolean,
@Query('withLogs', ParseBoolPipe) withLogs?: boolean,
Expand Down Expand Up @@ -267,6 +269,7 @@ export class TokenController {
after,
order,
round,
isScCall,
withRelayedScresults,
});
TransactionFilter.validate(transactionFilter, size);
Expand Down Expand Up @@ -294,6 +297,7 @@ export class TokenController {
@ApiQuery({ name: 'before', description: 'Before timestamp', required: false })
@ApiQuery({ name: 'after', description: 'After timestamp', required: false })
@ApiQuery({ name: 'round', description: 'Filter by round number', required: false })
@ApiQuery({ name: 'isScCall', description: 'Returns sc call transactions details', required: false, type: Boolean })
@ApiQuery({ name: 'withRelayedScresults', description: 'If set to true, will include smart contract results that resemble relayed transactions', required: false, type: Boolean })
async getTokenTransactionsCount(
@Param('identifier', ParseTokenPipe) identifier: string,
Expand All @@ -308,6 +312,7 @@ export class TokenController {
@Query('after', ParseIntPipe) after?: number,
@Query('round', ParseIntPipe) round?: number,
@Query('withRelayedScresults', ParseBoolPipe) withRelayedScresults?: boolean,
@Query('isScCall', ParseBoolPipe) isScCall?: boolean,
) {
const isToken = await this.tokenService.isToken(identifier);
if (!isToken) {
Expand All @@ -327,6 +332,7 @@ export class TokenController {
after,
round,
withRelayedScresults,
isScCall,
}));
}

Expand Down Expand Up @@ -390,6 +396,7 @@ export class TokenController {
@ApiQuery({ name: 'after', description: 'After timestamp', required: false })
@ApiQuery({ name: 'round', description: 'Filter by round number', required: false })
@ApiQuery({ name: 'fields', description: 'List of fields to filter by', required: false, isArray: true, style: 'form', explode: false })
@ApiQuery({ name: 'isScCall', description: 'Returns sc call transactions details', required: false, type: Boolean })
@ApiQuery({ name: 'withScamInfo', description: 'Returns scam information', required: false, type: Boolean })
@ApiQuery({ name: 'withUsername', description: 'Integrates username in assets for all addresses present in the transactions', required: false, type: Boolean })
@ApiQuery({ name: 'withBlockInfo', description: 'Returns sender / receiver block details', required: false, type: Boolean })
Expand All @@ -411,6 +418,7 @@ export class TokenController {
@Query('round', ParseIntPipe) round?: number,
@Query('fields', ParseArrayPipe) fields?: string[],
@Query('order', new ParseEnumPipe(SortOrder)) order?: SortOrder,
@Query('isScCall', ParseBoolPipe) isScCall?: boolean,
@Query('withScamInfo', ParseBoolPipe) withScamInfo?: boolean,
@Query('withUsername', ParseBoolPipe) withUsername?: boolean,
@Query('withBlockInfo', ParseBoolPipe) withBlockInfo?: boolean,
Expand All @@ -437,6 +445,7 @@ export class TokenController {
after,
order,
round,
isScCall,
}),
new QueryPagination({ from, size }),
options,
Expand All @@ -458,6 +467,7 @@ export class TokenController {
@ApiQuery({ name: 'before', description: 'Before timestamp', required: false })
@ApiQuery({ name: 'after', description: 'After timestamp', required: false })
@ApiQuery({ name: 'round', description: 'Filter by round number', required: false })
@ApiQuery({ name: 'isScCall', description: 'Returns sc call transactions details', required: false, type: Boolean })
async getTokenTransfersCount(
@Param('identifier', ParseTokenPipe) identifier: string,
@Query('sender', ParseAddressArrayPipe) sender?: string[],
Expand All @@ -471,6 +481,7 @@ export class TokenController {
@Query('before', ParseIntPipe) before?: number,
@Query('after', ParseIntPipe) after?: number,
@Query('round', ParseIntPipe) round?: number,
@Query('isScCall', ParseBoolPipe) isScCall?: boolean,
): Promise<number> {
const isToken = await this.tokenService.isToken(identifier);
if (!isToken) {
Expand All @@ -490,6 +501,7 @@ export class TokenController {
before,
after,
round,
isScCall,
}));
}

Expand All @@ -508,6 +520,7 @@ export class TokenController {
@Query('before', ParseIntPipe) before?: number,
@Query('after', ParseIntPipe) after?: number,
@Query('round', ParseIntPipe) round?: number,
@Query('isScCall', ParseBoolPipe) isScCall?: boolean,
): Promise<number> {
const isToken = await this.tokenService.isToken(identifier);
if (!isToken) {
Expand All @@ -527,6 +540,7 @@ export class TokenController {
before,
after,
round,
isScCall,
}));
}

Expand Down
1 change: 1 addition & 0 deletions src/endpoints/transactions/entities/transaction.filter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export class TransactionFilter {
type?: TransactionType;
tokens?: string[];
senderOrReceiver?: string;
isScCall?: boolean;
isRelayed?: boolean;
relayer?: string;
round?: number;
Expand Down
3 changes: 3 additions & 0 deletions src/endpoints/transactions/entities/transaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,9 @@ export class Transaction {
@ApiProperty({ type: String, nullable: true, required: false })
relayerSignature: string | undefined = undefined;

@ApiProperty({ type: Boolean, nullable: true, required: false })
isScCall: boolean | undefined = undefined;

getDate(): Date | undefined {
if (this.timestamp) {
return new Date(this.timestamp * 1000);
Expand Down
8 changes: 8 additions & 0 deletions src/endpoints/transactions/transaction.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ export class TransactionController {
@ApiQuery({ name: 'withBlockInfo', description: 'Returns sender / receiver block details', required: false, type: Boolean })
@ApiQuery({ name: 'relayer', description: 'Search by a relayer address', required: false })
@ApiQuery({ name: 'isRelayed', description: 'Returns relayed transactions details', required: false, type: Boolean })
@ApiQuery({ name: 'isScCall', description: 'Returns sc call transactions details', required: false, type: Boolean })
@ApiQuery({ name: 'withActionTransferValue', description: 'Returns value in USD and EGLD for transferred tokens within the action attribute', required: false })
@ApiQuery({ name: 'withRelayedScresults', description: 'If set to true, will include smart contract results that resemble relayed transactions', required: false, type: Boolean })
getTransactions(
Expand Down Expand Up @@ -77,6 +78,7 @@ export class TransactionController {
@Query('withUsername', ParseBoolPipe) withUsername?: boolean,
@Query('withBlockInfo', ParseBoolPipe) withBlockInfo?: boolean,
@Query('isRelayed', ParseBoolPipe) isRelayed?: boolean,
@Query('isScCall', ParseBoolPipe) isScCall?: boolean,
@Query('withActionTransferValue', ParseBoolPipe) withActionTransferValue?: boolean,
@Query('withRelayedScresults', ParseBoolPipe) withRelayedScresults?: boolean,
) {
Expand All @@ -98,6 +100,7 @@ export class TransactionController {
order,
relayer,
isRelayed,
isScCall,
round,
withRelayedScresults: withRelayedScresults,
});
Expand Down Expand Up @@ -127,6 +130,7 @@ export class TransactionController {
@ApiQuery({ name: 'after', description: 'After timestamp', required: false })
@ApiQuery({ name: 'round', description: 'Round number', required: false })
@ApiQuery({ name: 'isRelayed', description: 'Returns relayed transactions details', required: false, type: Boolean })
@ApiQuery({ name: 'isScCall', description: 'Returns sc call transactions details', required: false, type: Boolean })
@ApiQuery({ name: 'relayer', description: 'Filter by a relayer address', required: false })
@ApiQuery({ name: 'withRelayedScresults', description: 'If set to true, will include smart contract results that resemble relayed transactions', required: false, type: Boolean })
getTransactionCount(
Expand All @@ -145,6 +149,7 @@ export class TransactionController {
@Query('round', ParseIntPipe) round?: number,
@Query('relayer', ParseAddressPipe) relayer?: string,
@Query('isRelayed', ParseBoolPipe) isRelayed?: boolean,
@Query('isScCall', ParseBoolPipe) isScCall?: boolean,
@Query('withRelayedScresults', ParseBoolPipe) withRelayedScresults?: boolean,
): Promise<number> {
return this.transactionService.getTransactionCount(new TransactionFilter({
Expand All @@ -162,6 +167,7 @@ export class TransactionController {
condition,
relayer,
isRelayed,
isScCall,
round,
withRelayedScresults: withRelayedScresults,
}));
Expand All @@ -185,6 +191,7 @@ export class TransactionController {
@Query('round', ParseIntPipe) round?: number,
@Query('relayer', ParseAddressPipe) relayer?: string,
@Query('isRelayed', ParseBoolPipe) isRelayed?: boolean,
@Query('isScCall', ParseBoolPipe) isScCall?: boolean,
@Query('withRelayedScresults', ParseBoolPipe) withRelayedScresults?: boolean,
): Promise<number> {
return this.transactionService.getTransactionCount(new TransactionFilter({
Expand All @@ -203,6 +210,7 @@ export class TransactionController {
isRelayed,
relayer,
round,
isScCall,
withRelayedScresults: withRelayedScresults,
}));
}
Expand Down
Loading

0 comments on commit 972ac97

Please sign in to comment.