Skip to content

Commit 7bf6405

Browse files
authored
feat: encapsulate ENABLE_TX_POOL flag in TransactionPoolService (#4581)
Signed-off-by: nikolay <n.atanasow94@gmail.com>
1 parent 4ea1929 commit 7bf6405

File tree

7 files changed

+61
-9
lines changed

7 files changed

+61
-9
lines changed

packages/relay/src/lib/precheck.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,7 @@ export class Precheck {
7474
this.gasPrice(parsedTx, networkGasPriceInWeiBars);
7575
const mirrorAccountInfo = await this.verifyAccount(parsedTx, requestDetails);
7676
const signerNonce =
77-
mirrorAccountInfo.ethereum_nonce +
78-
(ConfigService.get('ENABLE_TX_POOL') ? await this.transactionPoolService.getPendingCount(parsedTx.from!) : 0);
77+
mirrorAccountInfo.ethereum_nonce + (await this.transactionPoolService.getPendingCount(parsedTx.from!));
7978
this.nonce(parsedTx, signerNonce);
8079
this.balance(parsedTx, mirrorAccountInfo.balance);
8180
await this.receiverAccount(parsedTx, requestDetails);

packages/relay/src/lib/services/ethService/accountService/AccountService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ export class AccountService implements IAccountService {
319319
return constants.ZERO_HEX;
320320
} else if (this.common.blockTagIsLatestOrPending(blockNumOrTag)) {
321321
const mnNonce = await this.getAccountLatestEthereumNonce(address, requestDetails);
322-
if (ConfigService.get('ENABLE_TX_POOL') && blockNumOrTag == constants.BLOCK_PENDING) {
322+
if (blockNumOrTag == constants.BLOCK_PENDING) {
323323
return numberTo0x(Number(mnNonce) + (await this.transactionPoolService.getPendingCount(address)));
324324
}
325325
return mnNonce;

packages/relay/src/lib/services/ethService/transactionService/TransactionService.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -260,9 +260,7 @@ export class TransactionService implements ITransactionService {
260260
await this.validateRawTransaction(parsedTx, networkGasPriceInWeiBars, requestDetails);
261261

262262
// Save the transaction to the transaction pool before submitting it to the network
263-
if (ConfigService.get('ENABLE_TX_POOL')) {
264-
await this.transactionPoolService.saveTransaction(parsedTx.from!, parsedTx);
265-
}
263+
await this.transactionPoolService.saveTransaction(parsedTx.from!, parsedTx);
266264

267265
/**
268266
* Note: If the USE_ASYNC_TX_PROCESSING feature flag is enabled,
@@ -498,9 +496,7 @@ export class TransactionService implements ITransactionService {
498496
);
499497

500498
// Remove the transaction from the transaction pool after submission
501-
if (ConfigService.get('ENABLE_TX_POOL')) {
502-
await this.transactionPoolService.removeTransaction(originalCallerAddress, parsedTx.serialized);
503-
}
499+
await this.transactionPoolService.removeTransaction(originalCallerAddress, parsedTx.serialized);
504500

505501
sendRawTransactionError = error;
506502

packages/relay/src/lib/services/transactionPoolService/transactionPoolService.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// SPDX-License-Identifier: Apache-2.0
22

3+
import { ConfigService } from '@hashgraph/json-rpc-config-service/dist/services';
34
import { Transaction } from 'ethers';
45
import { Logger } from 'pino';
56

@@ -13,6 +14,13 @@ import {
1314
* Acts as a facade for the underlying storage layer and coordinates transaction lifecycle.
1415
*/
1516
export class TransactionPoolService implements ITransactionPoolService {
17+
/**
18+
* Return if the transaction pool is enabled based on ENABLE_TX_POOL env
19+
*/
20+
public static isEnabled(): boolean {
21+
return ConfigService.get('ENABLE_TX_POOL');
22+
}
23+
1624
/**
1725
* The logger used for logging transaction pool operations.
1826
*
@@ -46,6 +54,10 @@ export class TransactionPoolService implements ITransactionPoolService {
4654
* @returns A promise that resolves once the transaction is stored.
4755
*/
4856
async saveTransaction(address: string, tx: Transaction): Promise<void> {
57+
if (!TransactionPoolService.isEnabled()) {
58+
return;
59+
}
60+
4961
const addressLowerCased = address.toLowerCase();
5062
const rlpHex = tx.serialized;
5163

@@ -70,6 +82,10 @@ export class TransactionPoolService implements ITransactionPoolService {
7082
* @returns A promise that resolves to the new pending transaction count for the address.
7183
*/
7284
async removeTransaction(address: string, rlpHex: string): Promise<void> {
85+
if (!TransactionPoolService.isEnabled()) {
86+
return;
87+
}
88+
7389
const addressLowerCased = address.toLowerCase();
7490

7591
try {

packages/relay/tests/lib/eth/eth_sendRawTransaction.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { formatTransactionIdWithoutQueryParams } from '../../../src/formatters';
2323
import { SDKClient } from '../../../src/lib/clients';
2424
import constants from '../../../src/lib/constants';
2525
import { SDKClientError } from '../../../src/lib/errors/SDKClientError';
26+
import { TransactionPoolService } from '../../../src/lib/services';
2627
import { CacheService } from '../../../src/lib/services/cacheService/cacheService';
2728
import HAPIService from '../../../src/lib/services/hapiService/hapiService';
2829
import { HbarLimitService } from '../../../src/lib/services/hbarLimitService';
@@ -63,6 +64,15 @@ describe('@ethSendRawTransaction eth_sendRawTransaction spec', async function ()
6364
sdkClientStub = sinon.createStubInstance(SDKClient);
6465
getSdkClientStub = sinon.stub(hapiServiceInstance, 'getSDKClient').returns(sdkClientStub);
6566
restMock.onGet('network/fees').reply(200, JSON.stringify(DEFAULT_NETWORK_FEES));
67+
ethImpl['transactionService']['precheck']['transactionPoolService'] = new TransactionPoolService(
68+
{
69+
getList: sinon.stub(),
70+
addToList: sinon.stub(),
71+
removeFromList: sinon.stub(),
72+
removeAll: sinon.stub(),
73+
},
74+
pino({ level: 'silent' }),
75+
);
6676
});
6777

6878
this.afterEach(() => {

packages/relay/tests/lib/openrpc.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { HbarSpendingPlanRepository } from '../../src/lib/db/repositories/hbarLi
2424
import { IPAddressHbarSpendingPlanRepository } from '../../src/lib/db/repositories/hbarLimiter/ipAddressHbarSpendingPlanRepository';
2525
import { EthImpl } from '../../src/lib/eth';
2626
import { NetImpl } from '../../src/lib/net';
27+
import { TransactionPoolService } from '../../src/lib/services';
2728
import { CacheService } from '../../src/lib/services/cacheService/cacheService';
2829
import ClientService from '../../src/lib/services/hapiService/hapiService';
2930
import { HbarLimitService } from '../../src/lib/services/hbarLimitService';
@@ -129,6 +130,15 @@ describe('Open RPC Specification', function () {
129130
sdkClientStub = sinon.createStubInstance(SDKClient);
130131
sinon.stub(clientServiceInstance, 'getSDKClient').returns(sdkClientStub);
131132
ethImpl = new EthImpl(clientServiceInstance, mirrorNodeInstance, logger, '0x12a', cacheService);
133+
ethImpl['transactionService']['precheck']['transactionPoolService'] = new TransactionPoolService(
134+
{
135+
getList: sinon.stub(),
136+
addToList: sinon.stub(),
137+
removeFromList: sinon.stub(),
138+
removeAll: sinon.stub(),
139+
},
140+
pino({ level: 'silent' }),
141+
);
132142
ns = { eth: ethImpl, net: new NetImpl(), web3: new Web3Impl() };
133143

134144
// mocked data

packages/relay/tests/lib/services/transactionPoolService/transactionPoolService.spec.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,13 @@ import * as sinon from 'sinon';
77

88
import { TransactionPoolService } from '../../../../src/lib/services/transactionPoolService/transactionPoolService';
99
import { PendingTransactionStorage } from '../../../../src/lib/types/transactionPool';
10+
import { overrideEnvsInMochaDescribe, withOverriddenEnvsInMochaTest } from '../../../helpers';
1011

1112
describe('TransactionPoolService Test Suite', function () {
13+
overrideEnvsInMochaDescribe({
14+
ENABLE_TX_POOL: true,
15+
});
16+
1217
this.timeout(10000);
1318

1419
let logger: Logger;
@@ -59,6 +64,14 @@ describe('TransactionPoolService Test Suite', function () {
5964
});
6065

6166
describe('saveTransaction', () => {
67+
withOverriddenEnvsInMochaTest({ ENABLE_TX_POOL: false }, () => {
68+
it(`should not execute .addToList if ENABLE_TX_POOL is set to false`, async function () {
69+
mockStorage.addToList.resolves();
70+
await transactionPoolService.saveTransaction(testAddress, testTransaction);
71+
expect(mockStorage.addToList.notCalled).to.be.true;
72+
});
73+
});
74+
6275
it('should successfully save transaction to pool', async () => {
6376
mockStorage.addToList.resolves();
6477

@@ -89,6 +102,14 @@ describe('TransactionPoolService Test Suite', function () {
89102
});
90103

91104
describe('removeTransaction', () => {
105+
withOverriddenEnvsInMochaTest({ ENABLE_TX_POOL: false }, () => {
106+
it(`should not execute .removeFromList if ENABLE_TX_POOL is set to false`, async function () {
107+
mockStorage.removeFromList.resolves();
108+
await transactionPoolService.removeTransaction(testAddress, testTxHash);
109+
expect(mockStorage.removeFromList.notCalled).to.be.true;
110+
});
111+
});
112+
92113
it('should successfully remove transaction from pool', async () => {
93114
mockStorage.removeFromList.resolves();
94115

0 commit comments

Comments
 (0)