diff --git a/src/services/node/NodeTransactionPoolService.spec.ts b/src/services/node/NodeTransactionPoolService.spec.ts index e50076b91..6efc323bc 100644 --- a/src/services/node/NodeTransactionPoolService.spec.ts +++ b/src/services/node/NodeTransactionPoolService.spec.ts @@ -22,8 +22,6 @@ import { // blockHash789629, defaultMockApi, pendingExtrinsics, - queryInfoBalancesTransfer, - queryInfoCouncilVote, } from '../test-helpers/mock'; import transactionPoolResponse from '../test-helpers/responses/node/transactionPool.json'; import transactionPoolWithTipResponse from '../test-helpers/responses/node/transactionPoolWithTip.json'; @@ -99,7 +97,6 @@ describe('NodeTransactionPoolService', () => { ]); (defaultMockApi.rpc.author as any).pendingExtrinsics = () => Promise.resolve().then(() => pool); - (defaultMockApi.rpc.payment as any).queryInfo = queryInfoCouncilVote; expect( sanitizeNumbers( @@ -108,7 +105,6 @@ describe('NodeTransactionPoolService', () => { ).toStrictEqual(transactionPoolWithTipOperationalResponse); (defaultMockApi.rpc.author as any).pendingExtrinsics = pendingExtrinsics; - (defaultMockApi.rpc.payment as any).queryInfo = queryInfoBalancesTransfer; }); }); }); diff --git a/src/services/node/NodeTransactionPoolService.ts b/src/services/node/NodeTransactionPoolService.ts index 656066184..b5786a693 100644 --- a/src/services/node/NodeTransactionPoolService.ts +++ b/src/services/node/NodeTransactionPoolService.ts @@ -14,7 +14,13 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import { DispatchClass, Extrinsic, Weight } from '@polkadot/types/interfaces'; +import { u64 } from '@polkadot/types'; +import { + DispatchClass, + Extrinsic, + Weight, + WeightV2, +} from '@polkadot/types/interfaces'; import BN from 'bn.js'; import { INodeTransactionPool } from '../../types/responses'; @@ -62,11 +68,12 @@ export class NodeTransactionPoolService extends AbstractService { private async extractExtrinsicInfo(ext: Extrinsic) { const { api } = this; const { hash, tip } = ext; + const u8a = ext.toU8a(); const { class: c, partialFee, weight, - } = await api.rpc.payment.queryInfo(ext.toHex()); + } = await api.call.transactionPaymentApi.queryInfo(u8a, u8a.length); const priority = await this.computeExtPriority(ext, c, weight); return { @@ -102,12 +109,22 @@ export class NodeTransactionPoolService extends AbstractService { const BN_ONE = new BN(1); const sanitizedClass = this.defineDispatchClassType(dispatchClass); - const maxBlockWeight = - api.consts.system.blockWeights.maxBlock.refTime.unwrap(); + // Check which versions of Weight we are using by checking to see if refTime exists. + const versionedWeight = weight['refTime'] + ? (weight as unknown as WeightV2).refTime.unwrap().toBn() + : weight.toBn(); + const maxBlockWeight = api.consts.system.blockWeights.maxBlock.refTime + ? api.consts.system.blockWeights.maxBlock.refTime.unwrap() + : (api.consts.system.blockWeights.maxBlock as unknown as u64); const maxLength: BN = new BN( api.consts.system.blockLength.max[sanitizedClass] ); - const boundedWeight = BN.min(BN.max(weight.toBn(), BN_ONE), maxBlockWeight); + + const boundedWeight = BN.min( + BN.max(versionedWeight, BN_ONE), + new BN(maxBlockWeight) + ); + const boundedLength = BN.min(BN.max(new BN(len), BN_ONE), maxLength); const maxTxPerBlockWeight = maxBlockWeight.toBn().div(boundedWeight); const maxTxPerBlockLength = maxLength.div(boundedLength); @@ -127,9 +144,9 @@ export class NodeTransactionPoolService extends AbstractService { break; } case 'operational': { - const { inclusionFee } = await api.rpc.payment.queryFeeDetails( - ext.toHex() - ); + const u8a = ext.toU8a(); + const { inclusionFee } = + await api.call.transactionPaymentApi.queryFeeDetails(u8a, u8a.length); const { operationalFeeMultiplier } = api.consts.transactionPayment; if (inclusionFee.isNone) { diff --git a/src/services/test-helpers/mock/mockApi.ts b/src/services/test-helpers/mock/mockApi.ts index 865090348..1d70c2d1d 100644 --- a/src/services/test-helpers/mock/mockApi.ts +++ b/src/services/test-helpers/mock/mockApi.ts @@ -15,7 +15,7 @@ // along with this program. If not, see . import { ApiPromise } from '@polkadot/api'; -import { Vec } from '@polkadot/types'; +import { GenericExtrinsic, Vec } from '@polkadot/types'; import { Option } from '@polkadot/types/codec'; import { AccountId, @@ -159,29 +159,23 @@ const queryFeeDetails = () => }); }); -export const queryInfoBalancesTransfer = ( - _extrinsic: string, - _hash: Hash +const runtimeDispatchInfo = polkadotRegistry.createType('RuntimeDispatchInfo', { + weight: 195000000, + class: 'Normal', + partialFee: 149000000, +}); + +export const queryInfoCall = ( + _extrinsic: GenericExtrinsic, + _length: Uint8Array ): Promise => - Promise.resolve().then(() => - polkadotRegistry.createType('RuntimeDispatchInfo', { - weight: 195000000, - class: 'Normal', - partialFee: 149000000, - }) - ); + Promise.resolve().then(() => runtimeDispatchInfo); -export const queryInfoCouncilVote = ( +export const queryInfoAt = ( _extrinsic: string, _hash: Hash ): Promise => - Promise.resolve().then(() => - polkadotRegistry.createType('RuntimeDispatchInfo', { - weight: 158324000, - class: 'Operational', - partialFee: 153000018, - }) - ); + Promise.resolve().then(() => runtimeDispatchInfo); export const submitExtrinsic = (_extrinsic: string): Promise => Promise.resolve().then(() => polkadotRegistry.createType('Hash')); @@ -249,6 +243,12 @@ const traceBlock = () => */ export const defaultMockApi = { runtimeVersion, + call: { + transactionPaymentApi: { + queryInfo: queryInfoCall, + queryFeeDetails, + }, + }, consts: { system: { blockLength: { @@ -260,9 +260,7 @@ export const defaultMockApi = { }, blockWeights: { baseBlock: new BN(5481991000), - maxBlock: { - refTime: polkadotRegistry.createType('Compact', 15), - }, + maxBlock: polkadotRegistry.createType('u64', 15), perClass: { normal: { baseExtrinsic: new BN(85212000), @@ -317,7 +315,7 @@ export const defaultMockApi = { properties, }, payment: { - queryInfo: queryInfoBalancesTransfer, + queryInfo: queryInfoAt, queryFeeDetails, }, author: { diff --git a/src/services/test-helpers/responses/node/transactionPoolWithTipOperational.json b/src/services/test-helpers/responses/node/transactionPoolWithTipOperational.json index 4d8b28f6d..149f68794 100644 --- a/src/services/test-helpers/responses/node/transactionPoolWithTipOperational.json +++ b/src/services/test-helpers/responses/node/transactionPoolWithTipOperational.json @@ -4,8 +4,8 @@ "encodedExtrinsic": "0x350284004adf51a47b72795366d52285e329229c836ea7bbfe139dbe8fa0700c4f86fc5601fc44dcd1994c111671b3577b02e391be8aff10f7ccf766f3189859ea343db041779a67f9357cba0ba051f83d63e45e7a88b5e2ca642181592052acd9f4ccc8821501c107000f03f2af187bbc8a4a2b5a28c2a3c2d85bf7e5b1700cbf1207a8e4c1eb7d8e7e4037350301", "hash": "0x3275363a9fda2dd41f03689bd47bba64e01fa3e5b558d8b4bbeb0df70cdceb73", "tip": "0", - "priority": "765000101", - "partialFee": "153000018" + "priority": "1", + "partialFee": "149000000" } ] } diff --git a/src/services/transaction/TransactionFeeEstimateService.spec.ts b/src/services/transaction/TransactionFeeEstimateService.spec.ts index c81b2415f..4e0cf470b 100644 --- a/src/services/transaction/TransactionFeeEstimateService.spec.ts +++ b/src/services/transaction/TransactionFeeEstimateService.spec.ts @@ -27,7 +27,7 @@ import { balancesTransferValid, blockHash789629, defaultMockApi, - queryInfoBalancesTransfer, + queryInfoAt, } from '../test-helpers/mock'; import invalidResponse from '../test-helpers/responses/transaction/feeEstimateInvalid.json'; import validRpcResponse from '../test-helpers/responses/transaction/feeEstimateValidRpcCall.json'; @@ -112,7 +112,7 @@ describe('TransactionFeeEstimateService', () => { ) ).rejects.toStrictEqual(invalidResponse); - (mockApi.rpc.payment as any).queryInfo = queryInfoBalancesTransfer; + (mockApi.rpc.payment as any).queryInfo = queryInfoAt; (mockApiAt.call.transactionPaymentApi.queryInfo as unknown) = queryInfoCallAt; });