From 5382cb60b052dddf1e4e60bb77a23ecf327c5c97 Mon Sep 17 00:00:00 2001 From: Jaco Date: Mon, 15 Aug 2022 09:48:24 +0200 Subject: [PATCH] Use call.transactionPaymentApi.queryInfo (#5160) * Use call.transactionPaymentApi.queryInfo * Asserts for availability --- CHANGELOG.md | 7 ++++++ packages/api-base/src/types/api.ts | 6 +++-- packages/api/src/base/Decorate.ts | 2 ++ packages/api/src/submittable/createClass.ts | 25 ++++++++++++++++----- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c36c7cce41..388f5fd18a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # CHANGELOG +## master + +Changes: + +- Replace `rpc.payment.queryInfo` usage with `call.transactionPaymentApi.queryInfo` + + ## 9.2.1 Aug 13, 2022 - **Important** If using `import { WellKnownChain } from '@polkadot/rpc-provider'` it is recommended that you rather use `ScProvider.WellKnownChain` (the import may be dropped in a future major version) diff --git a/packages/api-base/src/types/api.ts b/packages/api-base/src/types/api.ts index b80dbd138b..ff052435b2 100644 --- a/packages/api-base/src/types/api.ts +++ b/packages/api-base/src/types/api.ts @@ -10,7 +10,7 @@ import type { Registry, Signer } from '@polkadot/types/types'; // A smaller interface of ApiRx, used in derive and in SubmittableExtrinsic export interface ApiInterfaceRx { - call: QueryableCalls<'rxjs'>, + call: QueryableCalls<'rxjs'>; consts: QueryableConsts<'rxjs'>; extrinsicType: number; genesisHash?: Hash; @@ -19,9 +19,11 @@ export interface ApiInterfaceRx { runtimeMetadata: Metadata; runtimeVersion: RuntimeVersion; query: QueryableStorage<'rxjs'>; - queryAt: (blockHash: Uint8Array | string, knownVersion?: RuntimeVersion) => Observable>; queryMulti: QueryableStorageMulti<'rxjs'>; rpc: DecoratedRpc<'rxjs', RpcInterface>; tx: SubmittableExtrinsics<'rxjs'>; signer?: Signer; + + callAt: (blockHash: Uint8Array | string, knownVersion?: RuntimeVersion) => Observable>; + queryAt: (blockHash: Uint8Array | string, knownVersion?: RuntimeVersion) => Observable>; } diff --git a/packages/api/src/base/Decorate.ts b/packages/api/src/base/Decorate.ts index f03b1860a6..fe087d31b3 100644 --- a/packages/api/src/base/Decorate.ts +++ b/packages/api/src/base/Decorate.ts @@ -160,6 +160,8 @@ export abstract class Decorate extends Events { this.#instanceId = `${++instanceCounter}`; this.#registry = options.source?.registry || options.registry || new TypeRegistry(); + this._rx.callAt = (blockHash: Uint8Array | string, knownVersion?: RuntimeVersion) => + from(this.at(blockHash, knownVersion)).pipe(map((a) => a.rx.call)); this._rx.queryAt = (blockHash: Uint8Array | string, knownVersion?: RuntimeVersion) => from(this.at(blockHash, knownVersion)).pipe(map((a) => a.rx.query)); this._rx.registry = this.#registry; diff --git a/packages/api/src/submittable/createClass.ts b/packages/api/src/submittable/createClass.ts index 3cf4548488..d9b278a483 100644 --- a/packages/api/src/submittable/createClass.ts +++ b/packages/api/src/submittable/createClass.ts @@ -102,6 +102,10 @@ export function createClass ({ api, apiType, blockHas // dry run an extrinsic public dryRun (account: AddressOrPair, optionsOrHash?: Partial | Uint8Array | string): SubmittableDryRunResult { + if (!api.rpc.system || !api.rpc.system.dryRun) { + throw new Error('The system.dryRun RPC call is not available in your environment'); + } + if (blockHash || isString(optionsOrHash) || isU8a(optionsOrHash)) { // eslint-disable-next-line @typescript-eslint/no-unsafe-return return decorateMethod( @@ -120,11 +124,21 @@ export function createClass ({ api, apiType, blockHas // calculate the payment info for this transaction (if signed and submitted) public paymentInfo (account: AddressOrPair, optionsOrHash?: Partial | Uint8Array | string): SubmittablePaymentResult { + if (!api.call.transactionPaymentApi || !api.call.transactionPaymentApi.queryInfo) { + throw new Error('The transactionPaymentApi.queryInfo runtime call is not available in your environment'); + } + if (blockHash || isString(optionsOrHash) || isU8a(optionsOrHash)) { // eslint-disable-next-line @typescript-eslint/no-unsafe-return return decorateMethod( (): Observable => - api.rpc.payment.queryInfo(this.toHex(), blockHash || optionsOrHash as string) + api.callAt(blockHash || optionsOrHash as string).pipe( + switchMap((callAt): Observable => { + const u8a = this.toU8a(); + + return callAt.transactionPaymentApi.queryInfo(u8a, u8a.length); + }) + ) ); } @@ -140,12 +154,11 @@ export function createClass ({ api, apiType, blockHas // setup our options (same way as in signAndSend) const eraOptions = makeEraOptions(api, this.registry, allOptions, signingInfo); const signOptions = makeSignOptions(api, eraOptions, {}); + const u8a = this.isSigned + ? api.tx(this).signFake(address, signOptions).toU8a() + : this.signFake(address, signOptions).toU8a(); - return api.rpc.payment.queryInfo( - this.isSigned - ? api.tx(this).signFake(address, signOptions).toHex() - : this.signFake(address, signOptions).toHex() - ); + return api.call.transactionPaymentApi.queryInfo(u8a, u8a.length); }) ) )();