From 0015f13b75f1649234a0a02508e6a4e75dfa8264 Mon Sep 17 00:00:00 2001 From: Vasyl Ivanchuk Date: Tue, 5 Dec 2023 14:29:41 +0200 Subject: [PATCH] feat: return gasUsed, gasPerPubdata, maxFeePerGas and maxPriorityFeePerGas fields for transaction (#109) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What ❔ Return `gasUsed`, `gasPerPubdata`, `maxFeePerGas` and `maxPriorityFeePerGas` fields for transaction. ## Why ❔ For better UX we want to show gas and fee related fields on UI so we need to return these fields from the API first. ## Checklist - [X] PR title corresponds to the body of PR (we generate changelog entries from PRs). - [X] Tests for the changes have been added / updated. --- .../api/account/account.controller.spec.ts | 4 +- .../transaction.controller.spec.ts | 7 +- packages/api/src/block/block.controller.ts | 6 +- packages/api/src/block/block.module.ts | 4 +- packages/api/src/block/block.service.spec.ts | 10 +- packages/api/src/block/block.service.ts | 16 +- ...blockDetail.dto.ts => blockDetails.dto.ts} | 2 +- ...etail.entity.ts => blockDetails.entity.ts} | 2 +- .../hexToDecimalNumber.transformer.spec.ts | 27 +++ .../hexToDecimalNumber.transformer.ts | 17 ++ .../src/transaction/dtos/transaction.dto.ts | 43 +++- .../dtos/transactionDetails.dto.ts | 11 + .../entities/transaction.entity.ts | 10 + .../entities/transactionDetails.entity.ts | 18 ++ .../src/transaction/transaction.controller.ts | 9 +- .../api/src/transaction/transaction.module.ts | 3 +- .../transaction/transaction.service.spec.ts | 51 ++++- .../src/transaction/transaction.service.ts | 12 +- packages/api/test/account-api.e2e-spec.ts | 6 +- packages/api/test/address.e2e-spec.ts | 6 +- packages/api/test/block-api.e2e-spec.ts | 6 +- packages/api/test/block.e2e-spec.ts | 6 +- packages/api/test/log-api.e2e-spec.ts | 6 +- packages/api/test/stats-api.e2e-spec.ts | 6 +- packages/api/test/stats.e2e-spec.ts | 6 +- packages/api/test/token-api.e2e-spec.ts | 6 +- packages/api/test/token.e2e-spec.ts | 6 +- packages/api/test/transaction-api.e2e-spec.ts | 6 +- packages/api/test/transaction.e2e-spec.ts | 191 +++++++++++++----- 29 files changed, 381 insertions(+), 122 deletions(-) rename packages/api/src/block/{blockDetail.dto.ts => blockDetails.dto.ts} (98%) rename packages/api/src/block/{blockDetail.entity.ts => blockDetails.entity.ts} (97%) create mode 100644 packages/api/src/common/transformers/hexToDecimalNumber.transformer.spec.ts create mode 100644 packages/api/src/common/transformers/hexToDecimalNumber.transformer.ts create mode 100644 packages/api/src/transaction/dtos/transactionDetails.dto.ts create mode 100644 packages/api/src/transaction/entities/transactionDetails.entity.ts diff --git a/packages/api/src/api/account/account.controller.spec.ts b/packages/api/src/api/account/account.controller.spec.ts index 912a81c166..f5b2f14c6e 100644 --- a/packages/api/src/api/account/account.controller.spec.ts +++ b/packages/api/src/api/account/account.controller.spec.ts @@ -3,7 +3,7 @@ import { mock } from "jest-mock-extended"; import { BadRequestException, Logger } from "@nestjs/common"; import { L2_ETH_TOKEN_ADDRESS } from "../../common/constants"; import { BlockService } from "../../block/block.service"; -import { BlockDetail } from "../../block/blockDetail.entity"; +import { BlockDetails } from "../../block/blockDetails.entity"; import { TransactionService } from "../../transaction/transaction.service"; import { BalanceService } from "../../balance/balance.service"; import { TransactionStatus } from "../../transaction/entities/transaction.entity"; @@ -629,7 +629,7 @@ describe("AccountController", () => { it("returns blocks list response when block by miner are found", async () => { jest .spyOn(blockServiceMock, "findMany") - .mockResolvedValue([{ number: 1, timestamp: new Date("2023-03-03") } as BlockDetail]); + .mockResolvedValue([{ number: 1, timestamp: new Date("2023-03-03") } as BlockDetails]); const response = await controller.getAccountMinedBlocks(address, { page: 1, offset: 10, diff --git a/packages/api/src/api/transaction/transaction.controller.spec.ts b/packages/api/src/api/transaction/transaction.controller.spec.ts index 5e85dddc84..a74a252aa0 100644 --- a/packages/api/src/api/transaction/transaction.controller.spec.ts +++ b/packages/api/src/api/transaction/transaction.controller.spec.ts @@ -3,7 +3,8 @@ import { mock } from "jest-mock-extended"; import { Logger } from "@nestjs/common"; import { TransactionService } from "../../transaction/transaction.service"; import { TransactionReceiptService } from "../../transaction/transactionReceipt.service"; -import { TransactionStatus, Transaction } from "../../transaction/entities/transaction.entity"; +import { TransactionStatus } from "../../transaction/entities/transaction.entity"; +import { TransactionDetails } from "../../transaction/entities/transactionDetails.entity"; import { TransactionReceipt } from "../../transaction/entities/transactionReceipt.entity"; import { ResponseStatus, ResponseMessage } from "../dtos/common/responseBase.dto"; import { TransactionController } from "./transaction.controller"; @@ -56,7 +57,7 @@ describe("TransactionController", () => { it("returns isError as 0 when transaction is successful", async () => { jest .spyOn(transactionServiceMock, "findOne") - .mockResolvedValue({ status: TransactionStatus.Included } as Transaction); + .mockResolvedValue({ status: TransactionStatus.Included } as TransactionDetails); const response = await controller.getTransactionStatus(transactionHash); expect(response).toEqual({ @@ -72,7 +73,7 @@ describe("TransactionController", () => { it("returns isError as 1 when transaction is failed", async () => { jest .spyOn(transactionServiceMock, "findOne") - .mockResolvedValue({ status: TransactionStatus.Failed } as Transaction); + .mockResolvedValue({ status: TransactionStatus.Failed } as TransactionDetails); const response = await controller.getTransactionStatus(transactionHash); expect(response).toEqual({ diff --git a/packages/api/src/block/block.controller.ts b/packages/api/src/block/block.controller.ts index 25488e4506..f9a3a4febf 100644 --- a/packages/api/src/block/block.controller.ts +++ b/packages/api/src/block/block.controller.ts @@ -14,7 +14,7 @@ import { PagingOptionsDto, ListFiltersDto } from "../common/dtos"; import { ApiListPageOkResponse } from "../common/decorators/apiListPageOkResponse"; import { BlockService } from "./block.service"; import { BlockDto } from "./block.dto"; -import { BlockDetailDto } from "./blockDetail.dto"; +import { BlockDetailsDto } from "./blockDetails.dto"; import { swagger } from "../config/featureFlags"; const entityName = "blocks"; @@ -48,12 +48,12 @@ export class BlockController { example: "1", description: "Block number", }) - @ApiOkResponse({ description: "Block was returned successfully", type: BlockDetailDto }) + @ApiOkResponse({ description: "Block was returned successfully", type: BlockDetailsDto }) @ApiBadRequestResponse({ description: "Block number is invalid" }) @ApiNotFoundResponse({ description: "Block with the specified number does not exist" }) public async getBlock( @Param("blockNumber", new ParseLimitedIntPipe({ min: 0 })) blockNumber: number - ): Promise { + ): Promise { const block = await this.blockService.findOne(blockNumber); if (!block) { throw new NotFoundException(); diff --git a/packages/api/src/block/block.module.ts b/packages/api/src/block/block.module.ts index cbca1ea4d3..05687a8292 100644 --- a/packages/api/src/block/block.module.ts +++ b/packages/api/src/block/block.module.ts @@ -3,10 +3,10 @@ import { TypeOrmModule } from "@nestjs/typeorm"; import { BlockService } from "../block/block.service"; import { BlockController } from "./block.controller"; import { Block } from "./block.entity"; -import { BlockDetail } from "./blockDetail.entity"; +import { BlockDetails } from "./blockDetails.entity"; @Module({ - imports: [TypeOrmModule.forFeature([Block, BlockDetail])], + imports: [TypeOrmModule.forFeature([Block, BlockDetails])], controllers: [BlockController], providers: [BlockService], exports: [BlockService], diff --git a/packages/api/src/block/block.service.spec.ts b/packages/api/src/block/block.service.spec.ts index 90884e8de7..b1d2c853da 100644 --- a/packages/api/src/block/block.service.spec.ts +++ b/packages/api/src/block/block.service.spec.ts @@ -6,7 +6,7 @@ import { Pagination, IPaginationMeta } from "nestjs-typeorm-paginate"; import * as utils from "../common/utils"; import { BlockService, FindManyOptions } from "./block.service"; import { Block } from "./block.entity"; -import { BlockDetail } from "./blockDetail.entity"; +import { BlockDetails } from "./blockDetails.entity"; jest.mock("../common/utils"); @@ -14,11 +14,11 @@ describe("BlockService", () => { let blockRecord; let service: BlockService; let repositoryMock: Repository; - let blockDetailRepositoryMock: Repository; + let blockDetailRepositoryMock: Repository; beforeEach(async () => { repositoryMock = mock>(); - blockDetailRepositoryMock = mock>(); + blockDetailRepositoryMock = mock>(); blockRecord = { number: 123, @@ -32,7 +32,7 @@ describe("BlockService", () => { useValue: repositoryMock, }, { - provide: getRepositoryToken(BlockDetail), + provide: getRepositoryToken(BlockDetails), useValue: blockDetailRepositoryMock, }, ], @@ -305,7 +305,7 @@ describe("BlockService", () => { let filterOptions: FindManyOptions; beforeEach(() => { - queryBuilderMock = mock>({ + queryBuilderMock = mock>({ getMany: jest.fn().mockResolvedValue([ { number: 1, diff --git a/packages/api/src/block/block.service.ts b/packages/api/src/block/block.service.ts index bc289d9886..ef5f37735c 100644 --- a/packages/api/src/block/block.service.ts +++ b/packages/api/src/block/block.service.ts @@ -5,13 +5,13 @@ import { Pagination } from "nestjs-typeorm-paginate"; import { paginate } from "../common/utils"; import { IPaginationOptions } from "../common/types"; import { Block } from "./block.entity"; -import { BlockDetail } from "./blockDetail.entity"; +import { BlockDetails } from "./blockDetails.entity"; export interface FindManyOptions { miner?: string; page?: number; offset?: number; - selectFields?: (keyof BlockDetail)[]; + selectFields?: (keyof BlockDetails)[]; } @Injectable() @@ -19,8 +19,8 @@ export class BlockService { public constructor( @InjectRepository(Block) private readonly blocksRepository: Repository, - @InjectRepository(BlockDetail) - private readonly blockDetailsRepository: Repository + @InjectRepository(BlockDetails) + private readonly blockDetailsRepository: Repository ) {} private getBlock(filterOptions: FindOptionsWhere, orderOptions: FindOptionsOrder): Promise { @@ -50,9 +50,9 @@ export class BlockService { public async findOne( number: number, - selectFields?: (keyof BlockDetail)[], - relations: FindOptionsRelations = { batch: true } - ): Promise { + selectFields?: (keyof BlockDetails)[], + relations: FindOptionsRelations = { batch: true } + ): Promise { return await this.blockDetailsRepository.findOne({ where: { number }, relations: relations, @@ -90,7 +90,7 @@ export class BlockService { return await paginate(queryBuilder, paginationOptions, () => this.count(filterOptions)); } - public async findMany({ miner, page = 1, offset = 10, selectFields }: FindManyOptions): Promise { + public async findMany({ miner, page = 1, offset = 10, selectFields }: FindManyOptions): Promise { const queryBuilder = this.blockDetailsRepository.createQueryBuilder("block"); queryBuilder.addSelect(selectFields); if (miner) { diff --git a/packages/api/src/block/blockDetail.dto.ts b/packages/api/src/block/blockDetails.dto.ts similarity index 98% rename from packages/api/src/block/blockDetail.dto.ts rename to packages/api/src/block/blockDetails.dto.ts index 6034d3c86b..d80673960e 100644 --- a/packages/api/src/block/blockDetail.dto.ts +++ b/packages/api/src/block/blockDetails.dto.ts @@ -1,7 +1,7 @@ import { ApiProperty } from "@nestjs/swagger"; import { BlockDto } from "./block.dto"; -export class BlockDetailDto extends BlockDto { +export class BlockDetailsDto extends BlockDto { @ApiProperty({ type: String, description: "The hash of the previous block", diff --git a/packages/api/src/block/blockDetail.entity.ts b/packages/api/src/block/blockDetails.entity.ts similarity index 97% rename from packages/api/src/block/blockDetail.entity.ts rename to packages/api/src/block/blockDetails.entity.ts index b5d81236eb..151f812a98 100644 --- a/packages/api/src/block/blockDetail.entity.ts +++ b/packages/api/src/block/blockDetails.entity.ts @@ -3,7 +3,7 @@ import { Block } from "./block.entity"; import { hexTransformer } from "../common/transformers/hex.transformer"; @Entity({ name: "blocks" }) -export class BlockDetail extends Block { +export class BlockDetails extends Block { @Column({ type: "bytea", transformer: hexTransformer, nullable: true }) public readonly parentHash?: string; diff --git a/packages/api/src/common/transformers/hexToDecimalNumber.transformer.spec.ts b/packages/api/src/common/transformers/hexToDecimalNumber.transformer.spec.ts new file mode 100644 index 0000000000..b53f7c9d9a --- /dev/null +++ b/packages/api/src/common/transformers/hexToDecimalNumber.transformer.spec.ts @@ -0,0 +1,27 @@ +import { hexToDecimalNumberTransformer } from "./hexToDecimalNumber.transformer"; + +describe("hexToDecimalNumberTransformer", () => { + describe("to", () => { + it("returns null for null input", () => { + const result = hexToDecimalNumberTransformer.to(null); + expect(result).toBeNull(); + }); + + it("returns hex representation of the decimal number string", () => { + const result = hexToDecimalNumberTransformer.to("800"); + expect(result).toBe("0x0320"); + }); + }); + + describe("from", () => { + it("returns null for null input", () => { + const result = hexToDecimalNumberTransformer.from(null); + expect(result).toBeNull(); + }); + + it("returns decimal representation of the hex number string", () => { + const result = hexToDecimalNumberTransformer.from("0x320"); + expect(result).toBe("800"); + }); + }); +}); diff --git a/packages/api/src/common/transformers/hexToDecimalNumber.transformer.ts b/packages/api/src/common/transformers/hexToDecimalNumber.transformer.ts new file mode 100644 index 0000000000..edb849a2a8 --- /dev/null +++ b/packages/api/src/common/transformers/hexToDecimalNumber.transformer.ts @@ -0,0 +1,17 @@ +import { BigNumber } from "ethers"; +import { ValueTransformer } from "typeorm"; + +export const hexToDecimalNumberTransformer: ValueTransformer = { + to(decimalNumberStr: string | null): string | null { + if (!decimalNumberStr) { + return null; + } + return BigNumber.from(decimalNumberStr).toHexString(); + }, + from(hexNumberStr: string | null): string | null { + if (!hexNumberStr) { + return null; + } + return BigNumber.from(hexNumberStr).toString(); + }, +}; diff --git a/packages/api/src/transaction/dtos/transaction.dto.ts b/packages/api/src/transaction/dtos/transaction.dto.ts index 94ee8676ad..8b77f54a1d 100644 --- a/packages/api/src/transaction/dtos/transaction.dto.ts +++ b/packages/api/src/transaction/dtos/transaction.dto.ts @@ -40,7 +40,7 @@ export class TransactionDto { @ApiProperty({ type: String, description: "The amount this transaction sent", - example: "0x2386f26fc10000", + example: "100000000", }) public readonly value: string; @@ -58,6 +58,47 @@ export class TransactionDto { }) public readonly nonce: number; + @ApiProperty({ + type: String, + description: "Gas price", + example: "100000000", + }) + public readonly gasPrice: string; + + @ApiProperty({ + type: String, + description: "Gas limit", + example: "100000000", + }) + public readonly gasLimit: string; + + @ApiProperty({ + type: String, + description: "Gas per pubdata limit", + example: "100000000", + examples: ["100000000", null], + required: false, + }) + public readonly gasPerPubdata?: string; + + @ApiProperty({ + type: String, + description: "Max fee per gas", + example: "100000000", + examples: ["100000000", null], + required: false, + }) + public readonly maxFeePerGas?: string; + + @ApiProperty({ + type: String, + description: "Max priority fee per gas", + example: "100000000", + examples: ["100000000", null], + required: false, + }) + public readonly maxPriorityFeePerGas?: string; + @ApiProperty({ type: Number, description: "The number (height) of the block this transaction was mined in", diff --git a/packages/api/src/transaction/dtos/transactionDetails.dto.ts b/packages/api/src/transaction/dtos/transactionDetails.dto.ts new file mode 100644 index 0000000000..0f18c8b72a --- /dev/null +++ b/packages/api/src/transaction/dtos/transactionDetails.dto.ts @@ -0,0 +1,11 @@ +import { ApiProperty } from "@nestjs/swagger"; +import { TransactionDto } from "./transaction.dto"; + +export class TransactionDetailsDto extends TransactionDto { + @ApiProperty({ + type: String, + description: "Gas used by the transaction", + example: "50000000", + }) + public readonly gasUsed: string; +} diff --git a/packages/api/src/transaction/entities/transaction.entity.ts b/packages/api/src/transaction/entities/transaction.entity.ts index 60a0ac0566..e4a1b357e8 100644 --- a/packages/api/src/transaction/entities/transaction.entity.ts +++ b/packages/api/src/transaction/entities/transaction.entity.ts @@ -3,6 +3,7 @@ import { BaseEntity } from "../../common/entities/base.entity"; import { normalizeAddressTransformer } from "../../common/transformers/normalizeAddress.transformer"; import { bigIntNumberTransformer } from "../../common/transformers/bigIntNumber.transformer"; import { hexTransformer } from "../../common/transformers/hex.transformer"; +import { hexToDecimalNumberTransformer } from "../../common/transformers/hexToDecimalNumber.transformer"; import { TransactionReceipt } from "./transactionReceipt.entity"; import { Transfer } from "../../transfer/transfer.entity"; import { Block } from "../../block/block.entity"; @@ -61,6 +62,15 @@ export class Transaction extends BaseEntity { @Column({ type: "varchar", length: 128 }) public readonly gasPrice: string; + @Column({ type: "varchar", length: 128, nullable: true, transformer: hexToDecimalNumberTransformer }) + public readonly gasPerPubdata?: string; + + @Column({ type: "varchar", length: 128, nullable: true }) + public readonly maxFeePerGas?: string; + + @Column({ type: "varchar", length: 128, nullable: true }) + public readonly maxPriorityFeePerGas?: string; + @ManyToOne(() => Block) @JoinColumn({ name: "blockNumber" }) public readonly block: Block; diff --git a/packages/api/src/transaction/entities/transactionDetails.entity.ts b/packages/api/src/transaction/entities/transactionDetails.entity.ts new file mode 100644 index 0000000000..1b8fdb9f4f --- /dev/null +++ b/packages/api/src/transaction/entities/transactionDetails.entity.ts @@ -0,0 +1,18 @@ +import { Entity } from "typeorm"; +import { Transaction } from "./transaction.entity"; + +@Entity({ name: "transactions" }) +export class TransactionDetails extends Transaction { + public get gasUsed(): string { + return this.transactionReceipt ? this.transactionReceipt.gasUsed : null; + } + + toJSON(): any { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { transactionReceipt, ...restFields } = super.toJSON(); + return { + ...restFields, + gasUsed: this.gasUsed, + }; + } +} diff --git a/packages/api/src/transaction/transaction.controller.ts b/packages/api/src/transaction/transaction.controller.ts index 087e73eecd..f8465723d9 100644 --- a/packages/api/src/transaction/transaction.controller.ts +++ b/packages/api/src/transaction/transaction.controller.ts @@ -14,6 +14,7 @@ import { buildDateFilter } from "../common/utils"; import { FilterTransactionsOptionsDto } from "./dtos/filterTransactionsOptions.dto"; import { TransferDto } from "../transfer/transfer.dto"; import { TransactionDto } from "./dtos/transaction.dto"; +import { TransactionDetailsDto } from "./dtos/transactionDetails.dto"; import { TransferService } from "../transfer/transfer.service"; import { LogDto } from "../log/log.dto"; import { LogService } from "../log/log.service"; @@ -72,12 +73,12 @@ export class TransactionController { @ApiNotFoundResponse({ description: "Transaction with the specified hash does not exist" }) public async getTransaction( @Param("transactionHash", new ParseTransactionHashPipe()) transactionHash: string - ): Promise { - const transaction = await this.transactionService.findOne(transactionHash); - if (!transaction) { + ): Promise { + const transactionDetail = await this.transactionService.findOne(transactionHash); + if (!transactionDetail) { throw new NotFoundException(); } - return transaction; + return transactionDetail; } @Get(":transactionHash/transfers") diff --git a/packages/api/src/transaction/transaction.module.ts b/packages/api/src/transaction/transaction.module.ts index 299313a968..b121a319bd 100644 --- a/packages/api/src/transaction/transaction.module.ts +++ b/packages/api/src/transaction/transaction.module.ts @@ -4,6 +4,7 @@ import { TransactionController } from "./transaction.controller"; import { TransactionService } from "./transaction.service"; import { TransactionReceiptService } from "./transactionReceipt.service"; import { Transaction } from "./entities/transaction.entity"; +import { TransactionDetails } from "./entities/transactionDetails.entity"; import { AddressTransaction } from "./entities/addressTransaction.entity"; import { TransactionReceipt } from "./entities/transactionReceipt.entity"; import { Batch } from "../batch/batch.entity"; @@ -13,7 +14,7 @@ import { LogModule } from "../log/log.module"; @Module({ imports: [ - TypeOrmModule.forFeature([Transaction, AddressTransaction, TransactionReceipt, Batch]), + TypeOrmModule.forFeature([Transaction, TransactionDetails, AddressTransaction, TransactionReceipt, Batch]), TransferModule, LogModule, CounterModule, diff --git a/packages/api/src/transaction/transaction.service.spec.ts b/packages/api/src/transaction/transaction.service.spec.ts index 788582b82f..b8c5e7e3cb 100644 --- a/packages/api/src/transaction/transaction.service.spec.ts +++ b/packages/api/src/transaction/transaction.service.spec.ts @@ -8,6 +8,7 @@ import { SortingOrder } from "../common/types"; import { CounterService } from "../counter/counter.service"; import { TransactionService, FilterTransactionsOptions } from "./transaction.service"; import { Transaction } from "./entities/transaction.entity"; +import { TransactionDetails } from "./entities/transactionDetails.entity"; import { AddressTransaction } from "./entities/addressTransaction.entity"; import { Batch } from "../batch/batch.entity"; @@ -17,6 +18,7 @@ describe("TransactionService", () => { let transaction; let service: TransactionService; let repositoryMock: typeorm.Repository; + let repositoryDetailMock: typeorm.Repository; let addressTransactionRepositoryMock: typeorm.Repository; let batchRepositoryMock: typeorm.Repository; let counterServiceMock: CounterService; @@ -25,6 +27,7 @@ describe("TransactionService", () => { beforeEach(async () => { counterServiceMock = mock(); repositoryMock = mock>(); + repositoryDetailMock = mock>(); addressTransactionRepositoryMock = mock>(); batchRepositoryMock = mock>(); transaction = { @@ -38,6 +41,10 @@ describe("TransactionService", () => { provide: getRepositoryToken(Transaction), useValue: repositoryMock, }, + { + provide: getRepositoryToken(TransactionDetails), + useValue: repositoryDetailMock, + }, { provide: getRepositoryToken(AddressTransaction), useValue: addressTransactionRepositoryMock, @@ -61,21 +68,45 @@ describe("TransactionService", () => { }); describe("findOne", () => { + let queryBuilderMock; + const hash = "txHash"; + beforeEach(() => { - (repositoryMock.findOne as jest.Mock).mockResolvedValue(transaction); + queryBuilderMock = mock>(); + (repositoryDetailMock.createQueryBuilder as jest.Mock).mockReturnValue(queryBuilderMock); + (queryBuilderMock.getOne as jest.Mock).mockResolvedValue(null); }); - it("queries transactions by specified transaction hash", async () => { - await service.findOne(transactionHash); - expect(repositoryMock.findOne).toHaveBeenCalledTimes(1); - expect(repositoryMock.findOne).toHaveBeenCalledWith({ - where: { hash: transactionHash }, - relations: { batch: true }, - }); + it("creates query builder with proper params", async () => { + await service.findOne(hash); + expect(repositoryDetailMock.createQueryBuilder).toHaveBeenCalledWith("transaction"); }); - it("returns transaction by hash", async () => { - const result = await service.findOne(transactionHash); + it("filters transactions by the specified hash", async () => { + await service.findOne(hash); + expect(queryBuilderMock.where).toHaveBeenCalledWith({ hash }); + }); + + it("joins batch record to get batch specific fields", async () => { + await service.findOne(hash); + expect(queryBuilderMock.leftJoinAndSelect).toHaveBeenCalledWith("transaction.batch", "batch"); + }); + + it("joins transactionReceipt record to get transactionReceipt specific fields", async () => { + await service.findOne(hash); + expect(queryBuilderMock.leftJoin).toHaveBeenCalledWith("transaction.transactionReceipt", "transactionReceipt"); + }); + + it("selects only needed transactionReceipt fields", async () => { + await service.findOne(hash); + expect(queryBuilderMock.addSelect).toHaveBeenCalledWith(["transactionReceipt.gasUsed"]); + }); + + it("returns paginated result", async () => { + const transaction = mock(); + (queryBuilderMock.getOne as jest.Mock).mockResolvedValue(transaction); + + const result = await service.findOne(hash); expect(result).toBe(transaction); }); }); diff --git a/packages/api/src/transaction/transaction.service.ts b/packages/api/src/transaction/transaction.service.ts index 32661d830d..a79376148f 100644 --- a/packages/api/src/transaction/transaction.service.ts +++ b/packages/api/src/transaction/transaction.service.ts @@ -5,6 +5,7 @@ import { Pagination } from "nestjs-typeorm-paginate"; import { paginate } from "../common/utils"; import { IPaginationOptions, CounterCriteria, SortingOrder } from "../common/types"; import { Transaction } from "./entities/transaction.entity"; +import { TransactionDetails } from "./entities/transactionDetails.entity"; import { AddressTransaction } from "./entities/addressTransaction.entity"; import { Batch } from "../batch/batch.entity"; import { CounterService } from "../counter/counter.service"; @@ -29,6 +30,8 @@ export class TransactionService { constructor( @InjectRepository(Transaction) private readonly transactionRepository: Repository, + @InjectRepository(TransactionDetails) + private readonly transactionDetailsRepository: Repository, @InjectRepository(AddressTransaction) private readonly addressTransactionRepository: Repository, @InjectRepository(Batch) @@ -36,8 +39,13 @@ export class TransactionService { private readonly counterService: CounterService ) {} - public async findOne(hash: string): Promise { - return await this.transactionRepository.findOne({ where: { hash }, relations: { batch: true } }); + public async findOne(hash: string): Promise { + const queryBuilder = this.transactionDetailsRepository.createQueryBuilder("transaction"); + queryBuilder.leftJoinAndSelect("transaction.batch", "batch"); + queryBuilder.leftJoin("transaction.transactionReceipt", "transactionReceipt"); + queryBuilder.addSelect(["transactionReceipt.gasUsed"]); + queryBuilder.where({ hash }); + return await queryBuilder.getOne(); } public async exists(hash: string): Promise { diff --git a/packages/api/test/account-api.e2e-spec.ts b/packages/api/test/account-api.e2e-spec.ts index 340d95cd58..f529cc56aa 100644 --- a/packages/api/test/account-api.e2e-spec.ts +++ b/packages/api/test/account-api.e2e-spec.ts @@ -4,7 +4,7 @@ import { getRepositoryToken } from "@nestjs/typeorm"; import * as request from "supertest"; import { Repository } from "typeorm"; import { BatchDetails } from "../src/batch/batchDetails.entity"; -import { BlockDetail } from "../src/block/blockDetail.entity"; +import { BlockDetails } from "../src/block/blockDetails.entity"; import { AddressTransaction } from "../src/transaction/entities/addressTransaction.entity"; import { Transaction } from "../src/transaction/entities/transaction.entity"; import { TransactionReceipt } from "../src/transaction/entities/transactionReceipt.entity"; @@ -23,7 +23,7 @@ describe("Account API (e2e)", () => { let addressTransferRepository: Repository; let transferRepository: Repository; let transactionReceiptRepository: Repository; - let blockRepository: Repository; + let blockRepository: Repository; let batchRepository: Repository; let tokenRepository: Repository; let balanceRepository: Repository; @@ -42,7 +42,7 @@ describe("Account API (e2e)", () => { addressTransferRepository = app.get>(getRepositoryToken(AddressTransfer)); transferRepository = app.get>(getRepositoryToken(Transfer)); transactionReceiptRepository = app.get>(getRepositoryToken(TransactionReceipt)); - blockRepository = app.get>(getRepositoryToken(BlockDetail)); + blockRepository = app.get>(getRepositoryToken(BlockDetails)); batchRepository = app.get>(getRepositoryToken(BatchDetails)); tokenRepository = app.get>(getRepositoryToken(Token)); balanceRepository = app.get>(getRepositoryToken(Balance)); diff --git a/packages/api/test/address.e2e-spec.ts b/packages/api/test/address.e2e-spec.ts index 68fc5ff46c..772878a9ee 100644 --- a/packages/api/test/address.e2e-spec.ts +++ b/packages/api/test/address.e2e-spec.ts @@ -7,7 +7,7 @@ import { AppModule } from "../src/app.module"; import { configureApp } from "../src/configureApp"; import { Address } from "../src/address/address.entity"; import { Balance } from "../src/balance/balance.entity"; -import { BlockDetail } from "../src/block/blockDetail.entity"; +import { BlockDetails } from "../src/block/blockDetails.entity"; import { Transaction } from "../src/transaction/entities/transaction.entity"; import { AddressTransaction } from "../src/transaction/entities/addressTransaction.entity"; import { TransactionReceipt } from "../src/transaction/entities/transactionReceipt.entity"; @@ -21,7 +21,7 @@ import { AddressTransfer } from "../src/transfer/addressTransfer.entity"; describe("AddressController (e2e)", () => { let app: INestApplication; let addressRepository: Repository
; - let blockRepository: Repository; + let blockRepository: Repository; let transactionRepository: Repository; let addressTransactionRepository: Repository; let transactionReceiptRepository: Repository; @@ -45,7 +45,7 @@ describe("AddressController (e2e)", () => { await app.init(); addressRepository = app.get>(getRepositoryToken(Address)); - blockRepository = app.get>(getRepositoryToken(BlockDetail)); + blockRepository = app.get>(getRepositoryToken(BlockDetails)); transactionRepository = app.get>(getRepositoryToken(Transaction)); addressTransactionRepository = app.get>(getRepositoryToken(AddressTransaction)); transactionReceiptRepository = app.get>(getRepositoryToken(TransactionReceipt)); diff --git a/packages/api/test/block-api.e2e-spec.ts b/packages/api/test/block-api.e2e-spec.ts index dab94a051e..c04f833be8 100644 --- a/packages/api/test/block-api.e2e-spec.ts +++ b/packages/api/test/block-api.e2e-spec.ts @@ -5,12 +5,12 @@ import { Repository } from "typeorm"; import { getRepositoryToken } from "@nestjs/typeorm"; import { AppModule } from "../src/app.module"; import { configureApp } from "../src/configureApp"; -import { BlockDetail } from "../src/block/blockDetail.entity"; +import { BlockDetails } from "../src/block/blockDetails.entity"; import { BatchDetails } from "../src/batch/batchDetails.entity"; describe("Block API (e2e)", () => { let app: INestApplication; - let blockRepository: Repository; + let blockRepository: Repository; let batchRepository: Repository; beforeAll(async () => { @@ -24,7 +24,7 @@ describe("Block API (e2e)", () => { await app.init(); - blockRepository = app.get>(getRepositoryToken(BlockDetail)); + blockRepository = app.get>(getRepositoryToken(BlockDetails)); batchRepository = app.get>(getRepositoryToken(BatchDetails)); for (let i = 0; i < 9; i++) { diff --git a/packages/api/test/block.e2e-spec.ts b/packages/api/test/block.e2e-spec.ts index c2bcf91129..3cf78d81e8 100644 --- a/packages/api/test/block.e2e-spec.ts +++ b/packages/api/test/block.e2e-spec.ts @@ -5,12 +5,12 @@ import { Repository } from "typeorm"; import { getRepositoryToken } from "@nestjs/typeorm"; import { AppModule } from "../src/app.module"; import { configureApp } from "../src/configureApp"; -import { BlockDetail } from "../src/block/blockDetail.entity"; +import { BlockDetails } from "../src/block/blockDetails.entity"; import { BatchDetails } from "../src/batch/batchDetails.entity"; describe("BlockController (e2e)", () => { let app: INestApplication; - let blockRepository: Repository; + let blockRepository: Repository; let batchRepository: Repository; beforeAll(async () => { @@ -24,7 +24,7 @@ describe("BlockController (e2e)", () => { await app.init(); - blockRepository = app.get>(getRepositoryToken(BlockDetail)); + blockRepository = app.get>(getRepositoryToken(BlockDetails)); batchRepository = app.get>(getRepositoryToken(BatchDetails)); for (let i = 0; i < 9; i++) { diff --git a/packages/api/test/log-api.e2e-spec.ts b/packages/api/test/log-api.e2e-spec.ts index f81f801a1e..ad04223e9e 100644 --- a/packages/api/test/log-api.e2e-spec.ts +++ b/packages/api/test/log-api.e2e-spec.ts @@ -4,7 +4,7 @@ import { getRepositoryToken } from "@nestjs/typeorm"; import * as request from "supertest"; import { Repository } from "typeorm"; import { BatchDetails } from "../src/batch/batchDetails.entity"; -import { BlockDetail } from "../src/block/blockDetail.entity"; +import { BlockDetails } from "../src/block/blockDetails.entity"; import { Log } from "../src/log/log.entity"; import { Transaction } from "../src/transaction/entities/transaction.entity"; import { TransactionReceipt } from "../src/transaction/entities/transactionReceipt.entity"; @@ -15,7 +15,7 @@ describe("Logs API (e2e)", () => { let app: INestApplication; let transactionRepository: Repository; let transactionReceiptRepository: Repository; - let blockRepository: Repository; + let blockRepository: Repository; let batchRepository: Repository; let logRepository: Repository; @@ -30,7 +30,7 @@ describe("Logs API (e2e)", () => { transactionRepository = app.get>(getRepositoryToken(Transaction)); transactionReceiptRepository = app.get>(getRepositoryToken(TransactionReceipt)); - blockRepository = app.get>(getRepositoryToken(BlockDetail)); + blockRepository = app.get>(getRepositoryToken(BlockDetails)); batchRepository = app.get>(getRepositoryToken(BatchDetails)); logRepository = app.get>(getRepositoryToken(Log)); diff --git a/packages/api/test/stats-api.e2e-spec.ts b/packages/api/test/stats-api.e2e-spec.ts index d9fec2f445..c805e8648c 100644 --- a/packages/api/test/stats-api.e2e-spec.ts +++ b/packages/api/test/stats-api.e2e-spec.ts @@ -4,14 +4,14 @@ import { getRepositoryToken } from "@nestjs/typeorm"; import * as request from "supertest"; import { Repository } from "typeorm"; import { BatchDetails } from "../src/batch/batchDetails.entity"; -import { BlockDetail } from "../src/block/blockDetail.entity"; +import { BlockDetails } from "../src/block/blockDetails.entity"; import { Token, ETH_TOKEN } from "../src/token/token.entity"; import { AppModule } from "../src/app.module"; import { configureApp } from "../src/configureApp"; describe("Stats API (e2e)", () => { let app: INestApplication; - let blockRepository: Repository; + let blockRepository: Repository; let batchRepository: Repository; let tokenRepository: Repository; @@ -24,7 +24,7 @@ describe("Stats API (e2e)", () => { configureApp(app); await app.init(); - blockRepository = app.get>(getRepositoryToken(BlockDetail)); + blockRepository = app.get>(getRepositoryToken(BlockDetails)); batchRepository = app.get>(getRepositoryToken(BatchDetails)); tokenRepository = app.get>(getRepositoryToken(Token)); diff --git a/packages/api/test/stats.e2e-spec.ts b/packages/api/test/stats.e2e-spec.ts index 291ce881dc..4666a6e379 100644 --- a/packages/api/test/stats.e2e-spec.ts +++ b/packages/api/test/stats.e2e-spec.ts @@ -6,14 +6,14 @@ import { getRepositoryToken } from "@nestjs/typeorm"; import { AppModule } from "../src/app.module"; import { configureApp } from "../src/configureApp"; import { BatchDetails } from "../src/batch/batchDetails.entity"; -import { BlockDetail } from "../src/block/blockDetail.entity"; +import { BlockDetails } from "../src/block/blockDetails.entity"; import { Transaction } from "../src/transaction/entities/transaction.entity"; import { Counter } from "../src/counter/counter.entity"; describe("StatsController (e2e)", () => { let app: INestApplication; let batchRepository: Repository; - let blockRepository: Repository; + let blockRepository: Repository; let transactionRepository: Repository; let counterRepository: Repository; @@ -29,7 +29,7 @@ describe("StatsController (e2e)", () => { await app.init(); batchRepository = app.get>(getRepositoryToken(BatchDetails)); - blockRepository = app.get>(getRepositoryToken(BlockDetail)); + blockRepository = app.get>(getRepositoryToken(BlockDetails)); transactionRepository = app.get>(getRepositoryToken(Transaction)); counterRepository = app.get>(getRepositoryToken(Counter)); diff --git a/packages/api/test/token-api.e2e-spec.ts b/packages/api/test/token-api.e2e-spec.ts index ce825b8535..f3735bc8e2 100644 --- a/packages/api/test/token-api.e2e-spec.ts +++ b/packages/api/test/token-api.e2e-spec.ts @@ -4,14 +4,14 @@ import { getRepositoryToken } from "@nestjs/typeorm"; import * as request from "supertest"; import { Repository } from "typeorm"; import { BatchDetails } from "../src/batch/batchDetails.entity"; -import { BlockDetail } from "../src/block/blockDetail.entity"; +import { BlockDetails } from "../src/block/blockDetails.entity"; import { Token, ETH_TOKEN } from "../src/token/token.entity"; import { AppModule } from "../src/app.module"; import { configureApp } from "../src/configureApp"; describe("Token API (e2e)", () => { let app: INestApplication; - let blockRepository: Repository; + let blockRepository: Repository; let batchRepository: Repository; let tokenRepository: Repository; @@ -24,7 +24,7 @@ describe("Token API (e2e)", () => { configureApp(app); await app.init(); - blockRepository = app.get>(getRepositoryToken(BlockDetail)); + blockRepository = app.get>(getRepositoryToken(BlockDetails)); batchRepository = app.get>(getRepositoryToken(BatchDetails)); tokenRepository = app.get>(getRepositoryToken(Token)); diff --git a/packages/api/test/token.e2e-spec.ts b/packages/api/test/token.e2e-spec.ts index 3ca44fae97..b307db3298 100644 --- a/packages/api/test/token.e2e-spec.ts +++ b/packages/api/test/token.e2e-spec.ts @@ -6,7 +6,7 @@ import { getRepositoryToken } from "@nestjs/typeorm"; import { AppModule } from "../src/app.module"; import { configureApp } from "../src/configureApp"; import { Token, TokenType, ETH_TOKEN } from "../src/token/token.entity"; -import { BlockDetail } from "../src/block/blockDetail.entity"; +import { BlockDetails } from "../src/block/blockDetails.entity"; import { Transaction } from "../src/transaction/entities/transaction.entity"; import { Transfer, TransferType } from "../src/transfer/transfer.entity"; import { BatchDetails } from "../src/batch/batchDetails.entity"; @@ -14,7 +14,7 @@ import { BatchDetails } from "../src/batch/batchDetails.entity"; describe("TokenController (e2e)", () => { let app: INestApplication; let tokenRepository: Repository; - let blockRepository: Repository; + let blockRepository: Repository; let transactionRepository: Repository; let transferRepository: Repository; let batchRepository: Repository; @@ -31,7 +31,7 @@ describe("TokenController (e2e)", () => { await app.init(); tokenRepository = app.get>(getRepositoryToken(Token)); - blockRepository = app.get>(getRepositoryToken(BlockDetail)); + blockRepository = app.get>(getRepositoryToken(BlockDetails)); transactionRepository = app.get>(getRepositoryToken(Transaction)); transferRepository = app.get>(getRepositoryToken(Transfer)); batchRepository = app.get>(getRepositoryToken(BatchDetails)); diff --git a/packages/api/test/transaction-api.e2e-spec.ts b/packages/api/test/transaction-api.e2e-spec.ts index 387de4330b..4fb83e5454 100644 --- a/packages/api/test/transaction-api.e2e-spec.ts +++ b/packages/api/test/transaction-api.e2e-spec.ts @@ -4,7 +4,7 @@ import { getRepositoryToken } from "@nestjs/typeorm"; import * as request from "supertest"; import { Repository } from "typeorm"; import { BatchDetails } from "../src/batch/batchDetails.entity"; -import { BlockDetail } from "../src/block/blockDetail.entity"; +import { BlockDetails } from "../src/block/blockDetails.entity"; import { Transaction } from "../src/transaction/entities/transaction.entity"; import { TransactionReceipt } from "../src/transaction/entities/transactionReceipt.entity"; import { AppModule } from "../src/app.module"; @@ -14,7 +14,7 @@ describe("Transaction API (e2e)", () => { let app: INestApplication; let transactionRepository: Repository; let transactionReceiptRepository: Repository; - let blockRepository: Repository; + let blockRepository: Repository; let batchRepository: Repository; beforeAll(async () => { @@ -28,7 +28,7 @@ describe("Transaction API (e2e)", () => { transactionRepository = app.get>(getRepositoryToken(Transaction)); transactionReceiptRepository = app.get>(getRepositoryToken(TransactionReceipt)); - blockRepository = app.get>(getRepositoryToken(BlockDetail)); + blockRepository = app.get>(getRepositoryToken(BlockDetails)); batchRepository = app.get>(getRepositoryToken(BatchDetails)); await batchRepository.insert({ diff --git a/packages/api/test/transaction.e2e-spec.ts b/packages/api/test/transaction.e2e-spec.ts index 37003bac45..e38111a34d 100644 --- a/packages/api/test/transaction.e2e-spec.ts +++ b/packages/api/test/transaction.e2e-spec.ts @@ -2,12 +2,14 @@ import { Test, TestingModule } from "@nestjs/testing"; import { INestApplication } from "@nestjs/common"; import * as request from "supertest"; import { Repository } from "typeorm"; +import { BigNumber } from "ethers"; import { getRepositoryToken } from "@nestjs/typeorm"; import { AppModule } from "../src/app.module"; import { configureApp } from "../src/configureApp"; import { Token, TokenType } from "../src/token/token.entity"; -import { BlockDetail } from "../src/block/blockDetail.entity"; +import { BlockDetails } from "../src/block/blockDetails.entity"; import { Transaction } from "../src/transaction/entities/transaction.entity"; +import { TransactionReceipt } from "../src/transaction/entities/transactionReceipt.entity"; import { ETH_TOKEN } from "../src/token/token.entity"; import { AddressTransaction } from "../src/transaction/entities/addressTransaction.entity"; import { Transfer, TransferType } from "../src/transfer/transfer.entity"; @@ -17,8 +19,9 @@ import { BatchDetails } from "../src/batch/batchDetails.entity"; describe("TransactionController (e2e)", () => { let app: INestApplication; let tokenRepository: Repository; - let blockRepository: Repository; + let blockRepository: Repository; let transactionRepository: Repository; + let transactionReceiptRepository: Repository; let addressTransactionRepository: Repository; let transferRepository: Repository; let logRepository: Repository; @@ -36,8 +39,9 @@ describe("TransactionController (e2e)", () => { await app.init(); tokenRepository = app.get>(getRepositoryToken(Token)); - blockRepository = app.get>(getRepositoryToken(BlockDetail)); + blockRepository = app.get>(getRepositoryToken(BlockDetails)); transactionRepository = app.get>(getRepositoryToken(Transaction)); + transactionReceiptRepository = app.get>(getRepositoryToken(TransactionReceipt)); addressTransactionRepository = app.get>(getRepositoryToken(AddressTransaction)); transferRepository = app.get>(getRepositoryToken(Transfer)); logRepository = app.get>(getRepositoryToken(Log)); @@ -125,6 +129,11 @@ describe("TransactionController (e2e)", () => { receivedAt: `2022-11-21T18:16:0${i}.000Z`, l1BatchNumber: i < 3 ? 1 : i, receiptStatus: i < 9 ? 1 : 0, + gasPrice: BigNumber.from(1000 + i).toString(), + gasLimit: BigNumber.from(2000 + i).toString(), + maxFeePerGas: BigNumber.from(3000 + i).toString(), + maxPriorityFeePerGas: BigNumber.from(4000 + i).toString(), + gasPerPubdata: BigNumber.from(5000 + i).toHexString(), }; await transactionRepository.insert(transactionSpec); @@ -137,6 +146,14 @@ describe("TransactionController (e2e)", () => { transactionIndex: transactionSpec.transactionIndex, }); } + + await transactionReceiptRepository.insert({ + transactionHash: transactionSpec.hash, + from: transactionSpec.from, + status: 1, + gasUsed: (7000 + i).toString(), + cumulativeGasUsed: (10000 + i).toString(), + }); } for (let i = 0; i < 20; i++) { @@ -208,6 +225,7 @@ describe("TransactionController (e2e)", () => { await tokenRepository.delete({}); await addressTransactionRepository.delete({}); await transactionRepository.delete({}); + await transactionReceiptRepository.delete({}); await blockRepository.delete({}); await batchRepository.delete({}); @@ -241,8 +259,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2009", + gasPrice: "1009", + gasPerPubdata: "5009", + maxFeePerGas: "3009", + maxPriorityFeePerGas: "4009", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e19", isL1BatchSealed: false, isL1Originated: true, @@ -264,8 +285,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: "0xeb5ead20476b91008c3b6e44005017e697de78e4fd868d99d2c58566655c5ab8", fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2008", + gasPrice: "1008", + gasPerPubdata: "5008", + maxFeePerGas: "3008", + maxPriorityFeePerGas: "4008", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e18", isL1BatchSealed: true, isL1Originated: true, @@ -287,8 +311,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: "0xeb5ead20476b91008c3b6e44005017e697de78e4fd868d99d2c58566655c5ab7", fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2007", + gasPrice: "1007", + gasPerPubdata: "5007", + maxFeePerGas: "3007", + maxPriorityFeePerGas: "4007", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e17", isL1BatchSealed: true, isL1Originated: true, @@ -310,8 +337,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2006", + gasPrice: "1006", + gasPerPubdata: "5006", + maxFeePerGas: "3006", + maxPriorityFeePerGas: "4006", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e16", isL1BatchSealed: true, isL1Originated: true, @@ -333,8 +363,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2005", + gasPrice: "1005", + gasPerPubdata: "5005", + maxFeePerGas: "3005", + maxPriorityFeePerGas: "4005", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e15", isL1BatchSealed: true, isL1Originated: true, @@ -356,8 +389,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasPrice: "1004", + gasLimit: "2004", + gasPerPubdata: "5004", + maxFeePerGas: "3004", + maxPriorityFeePerGas: "4004", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e14", isL1BatchSealed: true, isL1Originated: true, @@ -379,8 +415,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2003", + gasPrice: "1003", + gasPerPubdata: "5003", + maxFeePerGas: "3003", + maxPriorityFeePerGas: "4003", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e13", isL1BatchSealed: true, isL1Originated: true, @@ -402,8 +441,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasPrice: "1002", + gasLimit: "2002", + gasPerPubdata: "5002", + maxFeePerGas: "3002", + maxPriorityFeePerGas: "4002", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e12", isL1BatchSealed: false, isL1Originated: true, @@ -425,8 +467,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasPrice: "1001", + gasLimit: "2001", + gasPerPubdata: "5001", + maxFeePerGas: "3001", + maxPriorityFeePerGas: "4001", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e11", isL1BatchSealed: false, isL1Originated: true, @@ -448,8 +493,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2000", + gasPrice: "1000", + gasPerPubdata: "5000", + maxFeePerGas: "3000", + maxPriorityFeePerGas: "4000", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e10", isL1BatchSealed: false, isL1Originated: true, @@ -481,8 +529,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: "0xeb5ead20476b91008c3b6e44005017e697de78e4fd868d99d2c58566655c5ab8", fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2008", + gasPrice: "1008", + gasPerPubdata: "5008", + maxFeePerGas: "3008", + maxPriorityFeePerGas: "4008", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e18", isL1BatchSealed: true, isL1Originated: true, @@ -504,8 +555,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: "0xeb5ead20476b91008c3b6e44005017e697de78e4fd868d99d2c58566655c5ab7", fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2007", + gasPrice: "1007", + gasPerPubdata: "5007", + maxFeePerGas: "3007", + maxPriorityFeePerGas: "4007", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e17", isL1BatchSealed: true, isL1Originated: true, @@ -527,8 +581,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2006", + gasPrice: "1006", + gasPerPubdata: "5006", + maxFeePerGas: "3006", + maxPriorityFeePerGas: "4006", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e16", isL1BatchSealed: true, isL1Originated: true, @@ -606,8 +663,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2001", + gasPrice: "1001", + gasPerPubdata: "5001", + maxFeePerGas: "3001", + maxPriorityFeePerGas: "4001", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e11", isL1BatchSealed: false, isL1Originated: true, @@ -654,8 +714,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2001", + gasPrice: "1001", + gasPerPubdata: "5001", + maxFeePerGas: "3001", + maxPriorityFeePerGas: "4001", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e11", isL1BatchSealed: false, isL1Originated: true, @@ -702,8 +765,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: "0xeb5ead20476b91008c3b6e44005017e697de78e4fd868d99d2c58566655c5ab7", fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2007", + gasPrice: "1007", + gasPerPubdata: "5007", + maxFeePerGas: "3007", + maxPriorityFeePerGas: "4007", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e17", isL1BatchSealed: true, isL1Originated: true, @@ -725,8 +791,11 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2006", + gasPrice: "1006", + gasPerPubdata: "5006", + maxFeePerGas: "3006", + maxPriorityFeePerGas: "4006", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e16", isL1BatchSealed: true, isL1Originated: true, @@ -809,8 +878,12 @@ describe("TransactionController (e2e)", () => { executeTxHash: "0xeb5ead20476b91008c3b6e44005017e697de78e4fd868d99d2c58566655c5ab8", fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2008", + gasPrice: "1008", + gasUsed: "7008", + gasPerPubdata: "5008", + maxFeePerGas: "3008", + maxPriorityFeePerGas: "4008", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e18", isL1BatchSealed: true, isL1Originated: true, @@ -840,8 +913,12 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2005", + gasPrice: "1005", + gasUsed: "7005", + gasPerPubdata: "5005", + maxFeePerGas: "3005", + maxPriorityFeePerGas: "4005", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e15", isL1BatchSealed: true, isL1Originated: true, @@ -871,8 +948,12 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2003", + gasPrice: "1003", + gasUsed: "7003", + gasPerPubdata: "5003", + maxFeePerGas: "3003", + maxPriorityFeePerGas: "4003", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e13", isL1BatchSealed: true, isL1Originated: true, @@ -902,8 +983,12 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2000", + gasPrice: "1000", + gasUsed: "7000", + gasPerPubdata: "5000", + maxFeePerGas: "3000", + maxPriorityFeePerGas: "4000", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e10", isL1BatchSealed: true, isL1Originated: true, @@ -933,8 +1018,12 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2009", + gasPrice: "1009", + gasUsed: "7009", + gasPerPubdata: "5009", + maxFeePerGas: "3009", + maxPriorityFeePerGas: "4009", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e19", isL1BatchSealed: true, isL1Originated: true, @@ -964,8 +1053,12 @@ describe("TransactionController (e2e)", () => { executeTxHash: null, fee: "0x2386f26fc10000", from: "0xc7e0220d02d549c4846A6EC31D89C3B670Ebe35C", - gasLimit: "1000000", - gasPrice: "100", + gasLimit: "2000", + gasPrice: "1000", + gasUsed: "7000", + gasPerPubdata: "5000", + maxFeePerGas: "3000", + maxPriorityFeePerGas: "4000", hash: "0x8a008b8dbbc18035e56370abb820e736b705d68d6ac12b203603db8d9ea87e10", isL1BatchSealed: true, isL1Originated: true,