From af6241fe415d17eaf5e031a39819f43d22b2b1a0 Mon Sep 17 00:00:00 2001 From: Jaco Date: Fri, 21 Jan 2022 13:26:11 +0200 Subject: [PATCH] Expose contract.{query, tx}.method.meta --- CHANGELOG.md | 1 + packages/api-contract/src/Abi/index.ts | 1 + packages/api-contract/src/base/Contract.ts | 24 ++++++++++++++-------- packages/api-contract/src/base/types.ts | 8 ++++++-- packages/api-contract/src/types.ts | 1 + 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9e803efb0af..033095b62705 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Changes: - Add `.multi` support on `api.at(...).
.` - Add support for ink! metadata V3 with payable constructors - Cleanup ink! metadata parsing, allowing for easier extension +- Expose `contract.{query, tx}..meta`, aligning with API - Fix storage metadata, aligning method with decorated name - Adjust typegen, only using exportInterface - Added Kusama/Polkadot 9151 upgrade block (known types) diff --git a/packages/api-contract/src/Abi/index.ts b/packages/api-contract/src/Abi/index.ts index 897b4e018832..2f1aeba350ad 100644 --- a/packages/api-contract/src/Abi/index.ts +++ b/packages/api-contract/src/Abi/index.ts @@ -205,6 +205,7 @@ export class Abi { identifier, index, method: stringCamelCase(identifier), + path: identifier.split('::').map((s) => stringCamelCase(s)), selector: spec.selector, toU8a: (params: unknown[]) => this.#encodeArgs(spec, args, params) diff --git a/packages/api-contract/src/base/Contract.ts b/packages/api-contract/src/base/Contract.ts index ce70542a2668..17e5f5275de9 100644 --- a/packages/api-contract/src/base/Contract.ts +++ b/packages/api-contract/src/base/Contract.ts @@ -29,18 +29,26 @@ const ERROR_NO_CALL = 'Your node does not expose the contracts.call RPC. This is const l = logger('Contract'); -function createQuery (fn: (origin: string | AccountId | Uint8Array, options: ContractOptions, params: unknown[]) => ContractCallResult): ContractQuery { - return (origin: string | AccountId | Uint8Array, options: bigint | string | number | BN | ContractOptions, ...params: unknown[]): ContractCallResult => +function withMeta (meta: AbiMessage, creator: Omit): T { + (creator as T).meta = meta; + + return creator as T; +} + +function createQuery (meta: AbiMessage, fn: (origin: string | AccountId | Uint8Array, options: ContractOptions, params: unknown[]) => ContractCallResult): ContractQuery { + return withMeta(meta, (origin: string | AccountId | Uint8Array, options: bigint | string | number | BN | ContractOptions, ...params: unknown[]): ContractCallResult => isOptions(options) ? fn(origin, options, params) - : fn(origin, ...extractOptions(options, params)); + : fn(origin, ...extractOptions(options, params)) + ); } -function createTx (fn: (options: ContractOptions, params: unknown[]) => SubmittableExtrinsic): ContractTx { - return (options: bigint | string | number | BN | ContractOptions, ...params: unknown[]): SubmittableExtrinsic => +function createTx (meta: AbiMessage, fn: (options: ContractOptions, params: unknown[]) => SubmittableExtrinsic): ContractTx { + return withMeta(meta, (options: bigint | string | number | BN | ContractOptions, ...params: unknown[]): SubmittableExtrinsic => isOptions(options) ? fn(options, params) - : fn(...extractOptions(options, params)); + : fn(...extractOptions(options, params)) + ); } export class ContractSubmittableResult extends SubmittableResult { @@ -70,11 +78,11 @@ export class Contract extends Base { this.abi.messages.forEach((m): void => { if (isUndefined(this.#tx[m.method])) { - this.#tx[m.method] = createTx((o, p) => this.#exec(m, o, p)); + this.#tx[m.method] = createTx(m, (o, p) => this.#exec(m, o, p)); } if (isUndefined(this.#query[m.method])) { - this.#query[m.method] = createQuery((f, o, p) => this.#read(m, o, p).send(f)); + this.#query[m.method] = createQuery(m, (f, o, p) => this.#read(m, o, p).send(f)); } }); } diff --git a/packages/api-contract/src/base/types.ts b/packages/api-contract/src/base/types.ts index a494ac47a049..f1b56c861a43 100644 --- a/packages/api-contract/src/base/types.ts +++ b/packages/api-contract/src/base/types.ts @@ -14,13 +14,17 @@ export interface BlueprintDeploy { (value: bigint | string | number | BN, gasLimit: bigint | string | number | BN, ...params: unknown[]): SubmittableExtrinsic; } -export interface ContractQuery { +export interface MessageMeta { + readonly meta: AbiMessage; +} + +export interface ContractQuery extends MessageMeta { (origin: AccountId | string | Uint8Array, options: ContractOptions, ...params: unknown[]): ContractCallResult; // @deprecated Use options form (to be dropped in a major update) (origin: AccountId | string | Uint8Array, value: bigint | BN | string | number, gasLimit: bigint | BN | string | number, ...params: unknown[]): ContractCallResult; } -export interface ContractTx { +export interface ContractTx extends MessageMeta { (options: ContractOptions, ...params: unknown[]): SubmittableExtrinsic; // @deprecated Use options form (to be dropped in a major update) (value: bigint | BN | string | number, gasLimit: bigint | BN | string | number, ...params: unknown[]): SubmittableExtrinsic; diff --git a/packages/api-contract/src/types.ts b/packages/api-contract/src/types.ts index c523e4c7d79d..6a13492cc7a2 100644 --- a/packages/api-contract/src/types.ts +++ b/packages/api-contract/src/types.ts @@ -40,6 +40,7 @@ export interface AbiMessage { isMutating?: boolean; isPayable?: boolean; method: string; + path: string[]; returnType?: TypeDef | null; selector: ContractSelector; toU8a: (params: unknown[]) => Uint8Array;