From c67256e2796bb474a47c6509c45a22c1be890711 Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Thu, 13 Feb 2025 15:20:57 +0900 Subject: [PATCH 1/7] add `?fullReceipt` query param to omit verbose output --- .../api-http/source/controllers/blocks.ts | 2 +- .../api-http/source/controllers/controller.ts | 28 ++++++++++++------- .../source/controllers/transactions.ts | 4 +-- packages/api-http/source/controllers/votes.ts | 4 +-- .../api-http/source/controllers/wallets.ts | 2 +- .../api-http/source/resources/transaction.ts | 10 +++++-- packages/api-http/source/routes/blocks.ts | 1 + .../api-http/source/routes/transactions.ts | 2 ++ packages/api-http/source/routes/votes.ts | 2 ++ packages/api-http/source/routes/wallets.ts | 4 +++ 10 files changed, 40 insertions(+), 19 deletions(-) diff --git a/packages/api-http/source/controllers/blocks.ts b/packages/api-http/source/controllers/blocks.ts index 9d59cb780..8fee32a7e 100644 --- a/packages/api-http/source/controllers/blocks.ts +++ b/packages/api-http/source/controllers/blocks.ts @@ -105,7 +105,7 @@ export class BlocksController extends Controller { ); return this.toPagination( - await this.enrichTransactionResult(transactions), + await this.enrichTransactionResult(transactions, { fullReceipt: request.query.fullReceipt }), TransactionResource, request.query.transform, ); diff --git a/packages/api-http/source/controllers/controller.ts b/packages/api-http/source/controllers/controller.ts index f9d953a37..4ff2bed87 100644 --- a/packages/api-http/source/controllers/controller.ts +++ b/packages/api-http/source/controllers/controller.ts @@ -50,13 +50,15 @@ export class Controller extends AbstractController { return configuration ?? ({} as Models.Configuration); } - protected async getReceipts(ids: string[]): Promise> { + protected async getReceipts(ids: string[], full = false): Promise> { const receiptRepository = this.receiptRepositoryFactory(); - const receipts = await receiptRepository - .createQueryBuilder() - .select(["Receipt.id", "Receipt.success", "Receipt.gasUsed", "Receipt.deployedContractAddress"]) - .whereInIds(ids) - .getMany(); + + let columns = ["Receipt.id", "Receipt.success", "Receipt.gasUsed", "Receipt.deployedContractAddress"]; + if (full) { + columns = [...columns, "Receipt.output", "Receipt.logs"]; + } + + const receipts = await receiptRepository.createQueryBuilder().select(columns).whereInIds(ids).getMany(); return receipts.reduce((accumulator, current) => { accumulator[current.id] = current; @@ -122,17 +124,22 @@ export class Controller extends AbstractController { protected async enrichTransactionResult( resultPage: Search.ResultsPage, - context?: { state?: Models.State }, + context?: { state?: Models.State; fullReceipt?: boolean }, ): Promise> { const [state, receipts] = await Promise.all([ context?.state ?? this.getState(), - this.getReceipts(resultPage.results.map((tx) => tx.id)), + this.getReceipts( + resultPage.results.map((tx) => tx.id), + context?.fullReceipt ?? false, + ), ]); return { ...resultPage, results: await Promise.all( - resultPage.results.map((tx) => this.enrichTransaction(tx, state, receipts[tx.id] ?? null)), + resultPage.results.map((tx) => + this.enrichTransaction(tx, state, receipts[tx.id] ?? null, context?.fullReceipt), + ), ), }; } @@ -141,10 +148,11 @@ export class Controller extends AbstractController { transaction: Models.Transaction, state?: Models.State, receipt?: Models.Receipt | null, + fullReceipt?: boolean, ): Promise { const [_state, receipts] = await Promise.all([ state ? state : this.getState(), - receipt !== undefined ? receipt : this.getReceipts([transaction.id]), + receipt !== undefined ? receipt : this.getReceipts([transaction.id], fullReceipt), ]); return { ...transaction, receipt: receipt ?? receipts?.[transaction.id] ?? undefined, state: _state }; diff --git a/packages/api-http/source/controllers/transactions.ts b/packages/api-http/source/controllers/transactions.ts index 2c5149121..d7ae53b74 100644 --- a/packages/api-http/source/controllers/transactions.ts +++ b/packages/api-http/source/controllers/transactions.ts @@ -35,7 +35,7 @@ export class TransactionsController extends Controller { ); return this.toPagination( - await this.enrichTransactionResult(transactions), + await this.enrichTransactionResult(transactions, { fullReceipt: request.query.fullReceipt }), TransactionResource, request.query.transform, ); @@ -73,7 +73,7 @@ export class TransactionsController extends Controller { } return this.respondWithResource( - await this.enrichTransaction(transaction), + await this.enrichTransaction(transaction, undefined, undefined, request.query.fullReceipt), TransactionResource, request.query.transform, ); diff --git a/packages/api-http/source/controllers/votes.ts b/packages/api-http/source/controllers/votes.ts index f82630f54..5f8f21d08 100644 --- a/packages/api-http/source/controllers/votes.ts +++ b/packages/api-http/source/controllers/votes.ts @@ -36,7 +36,7 @@ export class VotesController extends Controller { ); return this.toPagination( - await this.enrichTransactionResult(transactions), + await this.enrichTransactionResult(transactions, { fullReceipt: request.query.fullReceipt }), TransactionResource, request.query.transform, ); @@ -55,7 +55,7 @@ export class VotesController extends Controller { } return this.respondWithResource( - await this.enrichTransaction(transaction), + await this.enrichTransaction(transaction, undefined, undefined, request.query.fullReceipt), TransactionResource, request.query.transform, ); diff --git a/packages/api-http/source/controllers/wallets.ts b/packages/api-http/source/controllers/wallets.ts index b8b1afa95..f0c337733 100644 --- a/packages/api-http/source/controllers/wallets.ts +++ b/packages/api-http/source/controllers/wallets.ts @@ -120,7 +120,7 @@ export class WalletsController extends Controller { ); return this.toPagination( - await this.enrichTransactionResult(transactions), + await this.enrichTransactionResult(transactions, { fullReceipt: request.query.fullReceipt }), TransactionResource, request.query.transform, ); diff --git a/packages/api-http/source/resources/transaction.ts b/packages/api-http/source/resources/transaction.ts index 50ffb07e1..05690d42e 100644 --- a/packages/api-http/source/resources/transaction.ts +++ b/packages/api-http/source/resources/transaction.ts @@ -47,9 +47,13 @@ export class TransactionResource implements Contracts.Api.Resource { ...(resource.receipt ? { - deployedContractAddress: resource.receipt.deployedContractAddress ?? undefined, - gasUsed: resource.receipt.gasUsed, - success: resource.receipt.success, + receipt: { + deployedContractAddress: resource.receipt.deployedContractAddress ?? undefined, + gasUsed: resource.receipt.gasUsed, + success: resource.receipt.success, + output: resource.receipt.output, + logs: resource.receipt.logs, + }, } : {}), }; diff --git a/packages/api-http/source/routes/blocks.ts b/packages/api-http/source/routes/blocks.ts index b841fc9d2..94a2f0c41 100644 --- a/packages/api-http/source/routes/blocks.ts +++ b/packages/api-http/source/routes/blocks.ts @@ -91,6 +91,7 @@ export const register = (server: Contracts.Api.ApiServer): void => { ...server.app.schemas.transactionCriteriaSchemas, orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), + fullReceipt: Joi.bool().default(false), }) .concat(transactionSortingSchema) .concat(Schemas.pagination), diff --git a/packages/api-http/source/routes/transactions.ts b/packages/api-http/source/routes/transactions.ts index 3796426fe..df515fc0b 100644 --- a/packages/api-http/source/routes/transactions.ts +++ b/packages/api-http/source/routes/transactions.ts @@ -24,6 +24,7 @@ export const register = (server: Contracts.Api.ApiServer): void => { ...server.app.schemas.transactionCriteriaSchemas, orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), + fullReceipt: Joi.bool().default(false), }) .concat(transactionSortingSchema) .concat(Schemas.pagination), @@ -42,6 +43,7 @@ export const register = (server: Contracts.Api.ApiServer): void => { }), query: Joi.object({ transform: Joi.bool().default(true), + fullReceipt: Joi.bool().default(false), }), }, }, diff --git a/packages/api-http/source/routes/votes.ts b/packages/api-http/source/routes/votes.ts index 23de2a4b6..38f180c99 100644 --- a/packages/api-http/source/routes/votes.ts +++ b/packages/api-http/source/routes/votes.ts @@ -24,6 +24,7 @@ export const register = (server: Contracts.Api.ApiServer): void => { ...server.app.schemas.transactionCriteriaSchemas, orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), + fullReceipt: Joi.bool().default(false), }) .concat(transactionSortingSchema) .concat(Schemas.pagination), @@ -43,6 +44,7 @@ export const register = (server: Contracts.Api.ApiServer): void => { }), query: Joi.object({ transform: Joi.bool().default(true), + fullReceipt: Joi.bool().default(false), }), }, }, diff --git a/packages/api-http/source/routes/wallets.ts b/packages/api-http/source/routes/wallets.ts index 5c4157d75..f36afb0bc 100644 --- a/packages/api-http/source/routes/wallets.ts +++ b/packages/api-http/source/routes/wallets.ts @@ -88,6 +88,7 @@ export const register = (server: Contracts.Api.ApiServer): void => { ...server.app.schemas.transactionCriteriaSchemas, orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), + fullReceipt: Joi.bool().default(false), }) .concat(transactionSortingSchema) .concat(Schemas.pagination), @@ -113,6 +114,7 @@ export const register = (server: Contracts.Api.ApiServer): void => { ...server.app.schemas.transactionCriteriaSchemas, orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), + fullReceipt: Joi.bool().default(false), }) .concat(transactionSortingSchema) .concat(Schemas.pagination), @@ -138,6 +140,7 @@ export const register = (server: Contracts.Api.ApiServer): void => { ...server.app.schemas.transactionCriteriaSchemas, orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), + fullReceipt: Joi.bool().default(false), }) .concat(transactionSortingSchema) .concat(Schemas.pagination), @@ -163,6 +166,7 @@ export const register = (server: Contracts.Api.ApiServer): void => { ...server.app.schemas.transactionCriteriaSchemas, orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), + fullReceipt: Joi.bool().default(false), }) .concat(transactionSortingSchema) .concat(Schemas.pagination), From 6242ef0fa30b68ab639515db035da01af3760984 Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Thu, 13 Feb 2025 15:21:14 +0900 Subject: [PATCH 2/7] add `?fullReceipt` to receipts controller --- packages/api-http/source/controllers/receipts.ts | 15 +++++++++++++-- packages/api-http/source/routes/receipts.ts | 5 +++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/api-http/source/controllers/receipts.ts b/packages/api-http/source/controllers/receipts.ts index f0ade4307..c36263d0c 100644 --- a/packages/api-http/source/controllers/receipts.ts +++ b/packages/api-http/source/controllers/receipts.ts @@ -15,6 +15,7 @@ export class ReceiptsController extends Controller { const query = this.receiptRepositoryFactory() .createQueryBuilder("receipt") + .select(this.#getColumns(request.query.fullReceipt)) .innerJoin(Models.Transaction, "transaction", "receipt.id = transaction.id"); if (criteria.txHash) { @@ -58,8 +59,8 @@ export class ReceiptsController extends Controller { public async show(request: Hapi.Request) { const receipt = await this.receiptRepositoryFactory() - .createQueryBuilder() - .select() + .createQueryBuilder("receipt") + .select(this.#getColumns(request.query.fullReceipt)) .where("id = :id", { id: request.params.id }) .getOne(); @@ -76,6 +77,7 @@ export class ReceiptsController extends Controller { const query = this.receiptRepositoryFactory() .createQueryBuilder("receipt") + .select(this.#getColumns(request.query.fullReceipt)) .innerJoin(Models.Transaction, "transaction", "receipt.id = transaction.id") .where("receipt.deployedContractAddress IS NOT NULL"); @@ -114,4 +116,13 @@ export class ReceiptsController extends Controller { estimateTotalCount: false, }; } + + #getColumns(fullReceipt?: boolean): string[] { + let columns = ["receipt.id", "receipt.success", "receipt.gasUsed", "receipt.deployedContractAddress"]; + if (fullReceipt) { + columns = [...columns, "receipt.output", "receipt.logs"]; + } + + return columns; + } } diff --git a/packages/api-http/source/routes/receipts.ts b/packages/api-http/source/routes/receipts.ts index 0c13e6c30..60cd205b4 100644 --- a/packages/api-http/source/routes/receipts.ts +++ b/packages/api-http/source/routes/receipts.ts @@ -26,6 +26,7 @@ export const register = (server: Contracts.Api.ApiServer): void => { recipient: address, sender: walletId, txHash: transactionCriteriaSchemaObject.id, + fullReceipt: Joi.bool().default(true), }).concat(Schemas.pagination), }, }, @@ -40,6 +41,9 @@ export const register = (server: Contracts.Api.ApiServer): void => { params: Joi.object({ id: Joi.string().hex().length(64), }), + query: Joi.object({ + fullReceipt: Joi.bool().default(true), + }), }, }, path: "/receipts/{id}", @@ -57,6 +61,7 @@ export const register = (server: Contracts.Api.ApiServer): void => { validate: { query: Joi.object({ sender: walletId, + fullReceipt: Joi.bool().default(false), }).concat(Schemas.pagination), }, }, From eada9042f7cd3b32e755a072b76088aafe588d26 Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Thu, 13 Feb 2025 15:54:53 +0900 Subject: [PATCH 3/7] update integration tests --- .../integration/routes/receipts.test.ts | 23 ++++++------ .../api-http/source/controllers/controller.ts | 8 ++++- .../api-http/source/controllers/receipts.ts | 8 ++++- .../api-http/source/resources/transaction.ts | 1 + packages/api-http/test/fixtures/receipts.json | 10 ++++-- .../test/fixtures/receipts_result.json | 36 +++++++++++++++++++ packages/api-http/test/helpers/request.ts | 8 ++++- 7 files changed, 78 insertions(+), 16 deletions(-) create mode 100644 packages/api-http/test/fixtures/receipts_result.json diff --git a/packages/api-http/integration/routes/receipts.test.ts b/packages/api-http/integration/routes/receipts.test.ts index 06cc5f000..b07ac72ce 100644 --- a/packages/api-http/integration/routes/receipts.test.ts +++ b/packages/api-http/integration/routes/receipts.test.ts @@ -1,5 +1,6 @@ import { describe, Sandbox } from "../../../test-framework/source"; import receipts from "../../test/fixtures/receipts.json"; +import receiptsResult from "../../test/fixtures/receipts_result.json"; import receiptTransactions from "../../test/fixtures/receipt_transactions.json"; import receiptWallets from "../../test/fixtures/receipt_wallets.json"; import { ApiContext, prepareSandbox } from "../../test/helpers/prepare-sandbox"; @@ -10,7 +11,9 @@ describe<{ }>("Receipts", ({ it, afterAll, assert, afterEach, beforeAll, beforeEach, nock }) => { let apiContext: ApiContext; - const options = {}; + const options = { + fullReceipt: true, + }; beforeAll(async (context) => { nock.enableNetConnect(); @@ -42,11 +45,11 @@ describe<{ const testCases = [ { query: "", - result: receipts, + result: receiptsResult, }, { query: `?txHash=${receipts[0].id}`, - result: [receipts[0]], + result: [receiptsResult[0]], }, { query: "?txHash=0000000000000000000000000000000000000000000000000000000000000001", @@ -54,11 +57,11 @@ describe<{ }, { query: `?sender=${receiptTransactions[0].senderPublicKey}`, - result: receipts, + result: receiptsResult, }, { query: `?recipient=${receipts[1].deployedContractAddress}`, - result: [receipts[0]], + result: [receiptsResult[0]], }, ]; @@ -86,11 +89,11 @@ describe<{ }, { id: receipts[0].id, - result: receipts[0], + result: receiptsResult[0], }, { - id: receipts[receipts.length - 1].id, - result: receipts[receipts.length - 1], + id: receipts[receiptsResult.length - 1].id, + result: receiptsResult[receiptsResult.length - 1], }, ]; @@ -119,11 +122,11 @@ describe<{ const testCases = [ { query: "", - result: [receipts[1]], + result: [receiptsResult[1]], }, { query: `?sender=${receiptTransactions[0].senderPublicKey}`, - result: [receipts[1]], + result: [receiptsResult[1]], }, { query: `?sender=asdfgfg`, diff --git a/packages/api-http/source/controllers/controller.ts b/packages/api-http/source/controllers/controller.ts index 4ff2bed87..cade2e239 100644 --- a/packages/api-http/source/controllers/controller.ts +++ b/packages/api-http/source/controllers/controller.ts @@ -53,7 +53,13 @@ export class Controller extends AbstractController { protected async getReceipts(ids: string[], full = false): Promise> { const receiptRepository = this.receiptRepositoryFactory(); - let columns = ["Receipt.id", "Receipt.success", "Receipt.gasUsed", "Receipt.deployedContractAddress"]; + let columns = [ + "Receipt.id", + "Receipt.success", + "Receipt.gasUsed", + "Receipt.gasRefunded", + "Receipt.deployedContractAddress", + ]; if (full) { columns = [...columns, "Receipt.output", "Receipt.logs"]; } diff --git a/packages/api-http/source/controllers/receipts.ts b/packages/api-http/source/controllers/receipts.ts index c36263d0c..4ec3a6d78 100644 --- a/packages/api-http/source/controllers/receipts.ts +++ b/packages/api-http/source/controllers/receipts.ts @@ -118,7 +118,13 @@ export class ReceiptsController extends Controller { } #getColumns(fullReceipt?: boolean): string[] { - let columns = ["receipt.id", "receipt.success", "receipt.gasUsed", "receipt.deployedContractAddress"]; + let columns = [ + "receipt.id", + "receipt.success", + "receipt.gasUsed", + "receipt.gasRefunded", + "receipt.deployedContractAddress", + ]; if (fullReceipt) { columns = [...columns, "receipt.output", "receipt.logs"]; } diff --git a/packages/api-http/source/resources/transaction.ts b/packages/api-http/source/resources/transaction.ts index 05690d42e..f108ac085 100644 --- a/packages/api-http/source/resources/transaction.ts +++ b/packages/api-http/source/resources/transaction.ts @@ -50,6 +50,7 @@ export class TransactionResource implements Contracts.Api.Resource { receipt: { deployedContractAddress: resource.receipt.deployedContractAddress ?? undefined, gasUsed: resource.receipt.gasUsed, + gasRefunded: resource.receipt.gasRefunded, success: resource.receipt.success, output: resource.receipt.output, logs: resource.receipt.logs, diff --git a/packages/api-http/test/fixtures/receipts.json b/packages/api-http/test/fixtures/receipts.json index 95def1780..d7a4631d9 100644 --- a/packages/api-http/test/fixtures/receipts.json +++ b/packages/api-http/test/fixtures/receipts.json @@ -9,7 +9,9 @@ "logs": [ { "data": "0x000000000000000000000000db1a9acdd71eb5f846059034ef6d2cb144ccd1a9000000000000000000000000db1a9acdd71eb5f846059034ef6d2cb144ccd1a9", - "topics": ["0xce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2"], + "topics": [ + "0xce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2" + ], "address": "0x522B3294E6d06aA25Ad0f1B8891242E335D3B459" } ], @@ -25,10 +27,12 @@ "logs": [ { "data": "0x0000000000000000000000007b962da995bf5e0a7b10351b7a4381f7826504320000000000000000000000007b962da995bf5e0a7b10351b7a4381f782650432", - "topics": ["0xce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2"], + "topics": [ + "0xce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2" + ], "address": "0x522B3294E6d06aA25Ad0f1B8891242E335D3B459" } ], "output": "0x" } -] +] \ No newline at end of file diff --git a/packages/api-http/test/fixtures/receipts_result.json b/packages/api-http/test/fixtures/receipts_result.json new file mode 100644 index 000000000..d4bf57295 --- /dev/null +++ b/packages/api-http/test/fixtures/receipts_result.json @@ -0,0 +1,36 @@ +[ + { + "id": "d76eface634cab46ccc57f373a03e83cfbdaa7bedb84228ed8ce30bea128649a", + "success": true, + "gasUsed": 116802, + "gasRefunded": 0, + "deployedContractAddress": null, + "logs": [ + { + "data": "0x000000000000000000000000db1a9acdd71eb5f846059034ef6d2cb144ccd1a9000000000000000000000000db1a9acdd71eb5f846059034ef6d2cb144ccd1a9", + "topics": [ + "0xce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2" + ], + "address": "0x522B3294E6d06aA25Ad0f1B8891242E335D3B459" + } + ], + "output": "0x" + }, + { + "id": "29c12f5fc3c25323eec3bae1ddbe72a1113cba634e0079735a34074d4dc8ac0b", + "success": true, + "gasUsed": 116802, + "gasRefunded": 0, + "deployedContractAddress": "0x0a26D3630D5EC868767d7F4563Fab98D31601A6e", + "logs": [ + { + "data": "0x0000000000000000000000007b962da995bf5e0a7b10351b7a4381f7826504320000000000000000000000007b962da995bf5e0a7b10351b7a4381f782650432", + "topics": [ + "0xce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2" + ], + "address": "0x522B3294E6d06aA25Ad0f1B8891242E335D3B459" + } + ], + "output": "0x" + } +] \ No newline at end of file diff --git a/packages/api-http/test/helpers/request.ts b/packages/api-http/test/helpers/request.ts index 6248ceae1..54d1d28b8 100644 --- a/packages/api-http/test/helpers/request.ts +++ b/packages/api-http/test/helpers/request.ts @@ -12,7 +12,13 @@ export const request = async >( transform += path.includes("?") ? "&transform=false" : "?transform=false"; } - const response = await got(`http://localhost:4003/api/${path}${transform}`); + let fullReceipt = ""; + if (options?.fullReceipt !== undefined) { + fullReceipt += + (path.includes("?") || transform.includes("?") ? "&" : "?") + `fullReceipt=${options.fullReceipt}`; + } + + const response = await got(`http://localhost:4003/api/${path}${transform}${fullReceipt}`); const { statusCode, headers, body } = response; return { data: JSON.parse(body) as T, headers, statusCode }; }; From aec8c239a9c5c14cdcea03c320a6ab149c7f66de Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Thu, 13 Feb 2025 07:03:07 +0000 Subject: [PATCH 4/7] style: resolve style guide violations --- packages/api-http/source/resources/transaction.ts | 6 +++--- packages/api-http/source/routes/blocks.ts | 2 +- packages/api-http/source/routes/receipts.ts | 4 ++-- packages/api-http/source/routes/transactions.ts | 4 ++-- packages/api-http/source/routes/votes.ts | 4 ++-- packages/api-http/source/routes/wallets.ts | 8 ++++---- packages/api-http/test/fixtures/receipts.json | 10 +++------- packages/api-http/test/fixtures/receipts_result.json | 10 +++------- 8 files changed, 20 insertions(+), 28 deletions(-) diff --git a/packages/api-http/source/resources/transaction.ts b/packages/api-http/source/resources/transaction.ts index f108ac085..a1a74f7b6 100644 --- a/packages/api-http/source/resources/transaction.ts +++ b/packages/api-http/source/resources/transaction.ts @@ -49,11 +49,11 @@ export class TransactionResource implements Contracts.Api.Resource { ? { receipt: { deployedContractAddress: resource.receipt.deployedContractAddress ?? undefined, - gasUsed: resource.receipt.gasUsed, gasRefunded: resource.receipt.gasRefunded, - success: resource.receipt.success, - output: resource.receipt.output, + gasUsed: resource.receipt.gasUsed, logs: resource.receipt.logs, + output: resource.receipt.output, + success: resource.receipt.success, }, } : {}), diff --git a/packages/api-http/source/routes/blocks.ts b/packages/api-http/source/routes/blocks.ts index 94a2f0c41..d6b22b122 100644 --- a/packages/api-http/source/routes/blocks.ts +++ b/packages/api-http/source/routes/blocks.ts @@ -89,9 +89,9 @@ export const register = (server: Contracts.Api.ApiServer): void => { }), query: Joi.object({ ...server.app.schemas.transactionCriteriaSchemas, + fullReceipt: Joi.bool().default(false), orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), - fullReceipt: Joi.bool().default(false), }) .concat(transactionSortingSchema) .concat(Schemas.pagination), diff --git a/packages/api-http/source/routes/receipts.ts b/packages/api-http/source/routes/receipts.ts index 60cd205b4..314065fce 100644 --- a/packages/api-http/source/routes/receipts.ts +++ b/packages/api-http/source/routes/receipts.ts @@ -23,10 +23,10 @@ export const register = (server: Contracts.Api.ApiServer): void => { }, validate: { query: Joi.object({ + fullReceipt: Joi.bool().default(true), recipient: address, sender: walletId, txHash: transactionCriteriaSchemaObject.id, - fullReceipt: Joi.bool().default(true), }).concat(Schemas.pagination), }, }, @@ -60,8 +60,8 @@ export const register = (server: Contracts.Api.ApiServer): void => { }, validate: { query: Joi.object({ - sender: walletId, fullReceipt: Joi.bool().default(false), + sender: walletId, }).concat(Schemas.pagination), }, }, diff --git a/packages/api-http/source/routes/transactions.ts b/packages/api-http/source/routes/transactions.ts index df515fc0b..94b171530 100644 --- a/packages/api-http/source/routes/transactions.ts +++ b/packages/api-http/source/routes/transactions.ts @@ -22,9 +22,9 @@ export const register = (server: Contracts.Api.ApiServer): void => { validate: { query: Joi.object({ ...server.app.schemas.transactionCriteriaSchemas, + fullReceipt: Joi.bool().default(false), orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), - fullReceipt: Joi.bool().default(false), }) .concat(transactionSortingSchema) .concat(Schemas.pagination), @@ -42,8 +42,8 @@ export const register = (server: Contracts.Api.ApiServer): void => { id: Joi.string().hex().length(64), }), query: Joi.object({ - transform: Joi.bool().default(true), fullReceipt: Joi.bool().default(false), + transform: Joi.bool().default(true), }), }, }, diff --git a/packages/api-http/source/routes/votes.ts b/packages/api-http/source/routes/votes.ts index 38f180c99..7bb6fbdb0 100644 --- a/packages/api-http/source/routes/votes.ts +++ b/packages/api-http/source/routes/votes.ts @@ -22,9 +22,9 @@ export const register = (server: Contracts.Api.ApiServer): void => { validate: { query: Joi.object({ ...server.app.schemas.transactionCriteriaSchemas, + fullReceipt: Joi.bool().default(false), orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), - fullReceipt: Joi.bool().default(false), }) .concat(transactionSortingSchema) .concat(Schemas.pagination), @@ -43,8 +43,8 @@ export const register = (server: Contracts.Api.ApiServer): void => { id: transactionIdSchema, }), query: Joi.object({ - transform: Joi.bool().default(true), fullReceipt: Joi.bool().default(false), + transform: Joi.bool().default(true), }), }, }, diff --git a/packages/api-http/source/routes/wallets.ts b/packages/api-http/source/routes/wallets.ts index f36afb0bc..9ec7b0f6a 100644 --- a/packages/api-http/source/routes/wallets.ts +++ b/packages/api-http/source/routes/wallets.ts @@ -86,9 +86,9 @@ export const register = (server: Contracts.Api.ApiServer): void => { }), query: Joi.object({ ...server.app.schemas.transactionCriteriaSchemas, + fullReceipt: Joi.bool().default(false), orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), - fullReceipt: Joi.bool().default(false), }) .concat(transactionSortingSchema) .concat(Schemas.pagination), @@ -112,9 +112,9 @@ export const register = (server: Contracts.Api.ApiServer): void => { }), query: Joi.object({ ...server.app.schemas.transactionCriteriaSchemas, + fullReceipt: Joi.bool().default(false), orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), - fullReceipt: Joi.bool().default(false), }) .concat(transactionSortingSchema) .concat(Schemas.pagination), @@ -138,9 +138,9 @@ export const register = (server: Contracts.Api.ApiServer): void => { }), query: Joi.object({ ...server.app.schemas.transactionCriteriaSchemas, + fullReceipt: Joi.bool().default(false), orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), - fullReceipt: Joi.bool().default(false), }) .concat(transactionSortingSchema) .concat(Schemas.pagination), @@ -164,9 +164,9 @@ export const register = (server: Contracts.Api.ApiServer): void => { }), query: Joi.object({ ...server.app.schemas.transactionCriteriaSchemas, + fullReceipt: Joi.bool().default(false), orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), - fullReceipt: Joi.bool().default(false), }) .concat(transactionSortingSchema) .concat(Schemas.pagination), diff --git a/packages/api-http/test/fixtures/receipts.json b/packages/api-http/test/fixtures/receipts.json index d7a4631d9..95def1780 100644 --- a/packages/api-http/test/fixtures/receipts.json +++ b/packages/api-http/test/fixtures/receipts.json @@ -9,9 +9,7 @@ "logs": [ { "data": "0x000000000000000000000000db1a9acdd71eb5f846059034ef6d2cb144ccd1a9000000000000000000000000db1a9acdd71eb5f846059034ef6d2cb144ccd1a9", - "topics": [ - "0xce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2" - ], + "topics": ["0xce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2"], "address": "0x522B3294E6d06aA25Ad0f1B8891242E335D3B459" } ], @@ -27,12 +25,10 @@ "logs": [ { "data": "0x0000000000000000000000007b962da995bf5e0a7b10351b7a4381f7826504320000000000000000000000007b962da995bf5e0a7b10351b7a4381f782650432", - "topics": [ - "0xce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2" - ], + "topics": ["0xce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2"], "address": "0x522B3294E6d06aA25Ad0f1B8891242E335D3B459" } ], "output": "0x" } -] \ No newline at end of file +] diff --git a/packages/api-http/test/fixtures/receipts_result.json b/packages/api-http/test/fixtures/receipts_result.json index d4bf57295..c1fd0afd5 100644 --- a/packages/api-http/test/fixtures/receipts_result.json +++ b/packages/api-http/test/fixtures/receipts_result.json @@ -8,9 +8,7 @@ "logs": [ { "data": "0x000000000000000000000000db1a9acdd71eb5f846059034ef6d2cb144ccd1a9000000000000000000000000db1a9acdd71eb5f846059034ef6d2cb144ccd1a9", - "topics": [ - "0xce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2" - ], + "topics": ["0xce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2"], "address": "0x522B3294E6d06aA25Ad0f1B8891242E335D3B459" } ], @@ -25,12 +23,10 @@ "logs": [ { "data": "0x0000000000000000000000007b962da995bf5e0a7b10351b7a4381f7826504320000000000000000000000007b962da995bf5e0a7b10351b7a4381f782650432", - "topics": [ - "0xce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2" - ], + "topics": ["0xce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2"], "address": "0x522B3294E6d06aA25Ad0f1B8891242E335D3B459" } ], "output": "0x" } -] \ No newline at end of file +] From b9ba752af558132bcb8eb55c2fd3952918cafe14 Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Thu, 13 Feb 2025 16:14:37 +0900 Subject: [PATCH 5/7] fix fixture --- packages/api-http/test/fixtures/receipt_transactions.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/api-http/test/fixtures/receipt_transactions.json b/packages/api-http/test/fixtures/receipt_transactions.json index 201861d3c..99fa50678 100644 --- a/packages/api-http/test/fixtures/receipt_transactions.json +++ b/packages/api-http/test/fixtures/receipt_transactions.json @@ -19,6 +19,7 @@ "id": "d76eface634cab46ccc57f373a03e83cfbdaa7bedb84228ed8ce30bea128649a", "success": true, "gasUsed": 116802, + "gasRefunded": 0, "deployedContractAddress": null } }, @@ -42,7 +43,8 @@ "id": "29c12f5fc3c25323eec3bae1ddbe72a1113cba634e0079735a34074d4dc8ac0b", "success": true, "gasUsed": 116802, + "gasRefunded": 0, "deployedContractAddress": "0x0a26D3630D5EC868767d7F4563Fab98D31601A6e" } } -] +] \ No newline at end of file From cce4411398601d4b376f9e01222684bcca803537 Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Thu, 13 Feb 2025 07:16:40 +0000 Subject: [PATCH 6/7] style: resolve style guide violations --- packages/api-http/test/fixtures/receipt_transactions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api-http/test/fixtures/receipt_transactions.json b/packages/api-http/test/fixtures/receipt_transactions.json index 99fa50678..7f1656b25 100644 --- a/packages/api-http/test/fixtures/receipt_transactions.json +++ b/packages/api-http/test/fixtures/receipt_transactions.json @@ -47,4 +47,4 @@ "deployedContractAddress": "0x0a26D3630D5EC868767d7F4563Fab98D31601A6e" } } -] \ No newline at end of file +] From 2e0da36a6fcc007aab26452951dd2d066e48daef Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Thu, 13 Feb 2025 18:24:37 +0900 Subject: [PATCH 7/7] deduplicate column selection --- .../api-http/source/controllers/controller.ts | 32 ++++++++++++------- .../api-http/source/controllers/receipts.ts | 21 ++---------- 2 files changed, 23 insertions(+), 30 deletions(-) diff --git a/packages/api-http/source/controllers/controller.ts b/packages/api-http/source/controllers/controller.ts index cade2e239..702a02732 100644 --- a/packages/api-http/source/controllers/controller.ts +++ b/packages/api-http/source/controllers/controller.ts @@ -53,18 +53,11 @@ export class Controller extends AbstractController { protected async getReceipts(ids: string[], full = false): Promise> { const receiptRepository = this.receiptRepositoryFactory(); - let columns = [ - "Receipt.id", - "Receipt.success", - "Receipt.gasUsed", - "Receipt.gasRefunded", - "Receipt.deployedContractAddress", - ]; - if (full) { - columns = [...columns, "Receipt.output", "Receipt.logs"]; - } - - const receipts = await receiptRepository.createQueryBuilder().select(columns).whereInIds(ids).getMany(); + const receipts = await receiptRepository + .createQueryBuilder("receipt") + .select(this.getReceiptColumns(full)) + .whereInIds(ids) + .getMany(); return receipts.reduce((accumulator, current) => { accumulator[current.id] = current; @@ -169,4 +162,19 @@ export class Controller extends AbstractController { // NOTE: This assumes all block ids are sha256 and never a valid number below this threshold. return !isNaN(asHeight) && asHeight <= Number.MAX_SAFE_INTEGER ? { height: asHeight } : { id: idOrHeight }; } + + protected getReceiptColumns(fullReceipt?: boolean): string[] { + let columns = [ + "receipt.id", + "receipt.success", + "receipt.gasUsed", + "receipt.gasRefunded", + "receipt.deployedContractAddress", + ]; + if (fullReceipt) { + columns = [...columns, "receipt.output", "receipt.logs"]; + } + + return columns; + } } diff --git a/packages/api-http/source/controllers/receipts.ts b/packages/api-http/source/controllers/receipts.ts index 4ec3a6d78..4a9ca91e3 100644 --- a/packages/api-http/source/controllers/receipts.ts +++ b/packages/api-http/source/controllers/receipts.ts @@ -15,7 +15,7 @@ export class ReceiptsController extends Controller { const query = this.receiptRepositoryFactory() .createQueryBuilder("receipt") - .select(this.#getColumns(request.query.fullReceipt)) + .select(this.getReceiptColumns(request.query.fullReceipt)) .innerJoin(Models.Transaction, "transaction", "receipt.id = transaction.id"); if (criteria.txHash) { @@ -60,7 +60,7 @@ export class ReceiptsController extends Controller { public async show(request: Hapi.Request) { const receipt = await this.receiptRepositoryFactory() .createQueryBuilder("receipt") - .select(this.#getColumns(request.query.fullReceipt)) + .select(this.getReceiptColumns(request.query.fullReceipt)) .where("id = :id", { id: request.params.id }) .getOne(); @@ -77,7 +77,7 @@ export class ReceiptsController extends Controller { const query = this.receiptRepositoryFactory() .createQueryBuilder("receipt") - .select(this.#getColumns(request.query.fullReceipt)) + .select(this.getReceiptColumns(request.query.fullReceipt)) .innerJoin(Models.Transaction, "transaction", "receipt.id = transaction.id") .where("receipt.deployedContractAddress IS NOT NULL"); @@ -116,19 +116,4 @@ export class ReceiptsController extends Controller { estimateTotalCount: false, }; } - - #getColumns(fullReceipt?: boolean): string[] { - let columns = [ - "receipt.id", - "receipt.success", - "receipt.gasUsed", - "receipt.gasRefunded", - "receipt.deployedContractAddress", - ]; - if (fullReceipt) { - columns = [...columns, "receipt.output", "receipt.logs"]; - } - - return columns; - } }