Skip to content

Commit f5ce395

Browse files
authored
Expose contract.{query, tx}.method.meta (#4485)
1 parent b986d4c commit f5ce395

File tree

5 files changed

+25
-10
lines changed

5 files changed

+25
-10
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Changes:
1212
- Add `.multi` support on `api.at(...).<section>.<method>`
1313
- Add support for ink! metadata V3 with payable constructors
1414
- Cleanup ink! metadata parsing, allowing for easier extension
15+
- Expose `contract.{query, tx}.<method>.meta`, aligning with API
1516
- Fix storage metadata, aligning method with decorated name
1617
- Adjust typegen, only using exportInterface
1718
- Added Kusama/Polkadot 9151 upgrade block (known types)

packages/api-contract/src/Abi/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ export class Abi {
205205
identifier,
206206
index,
207207
method: stringCamelCase(identifier),
208+
path: identifier.split('::').map((s) => stringCamelCase(s)),
208209
selector: spec.selector,
209210
toU8a: (params: unknown[]) =>
210211
this.#encodeArgs(spec, args, params)

packages/api-contract/src/base/Contract.ts

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,26 @@ const ERROR_NO_CALL = 'Your node does not expose the contracts.call RPC. This is
2929

3030
const l = logger('Contract');
3131

32-
function createQuery <ApiType extends ApiTypes> (fn: (origin: string | AccountId | Uint8Array, options: ContractOptions, params: unknown[]) => ContractCallResult<ApiType, ContractCallOutcome>): ContractQuery<ApiType> {
33-
return (origin: string | AccountId | Uint8Array, options: bigint | string | number | BN | ContractOptions, ...params: unknown[]): ContractCallResult<ApiType, ContractCallOutcome> =>
32+
function withMeta <T extends { meta: AbiMessage }> (meta: AbiMessage, creator: Omit<T, 'meta'>): T {
33+
(creator as T).meta = meta;
34+
35+
return creator as T;
36+
}
37+
38+
function createQuery <ApiType extends ApiTypes> (meta: AbiMessage, fn: (origin: string | AccountId | Uint8Array, options: ContractOptions, params: unknown[]) => ContractCallResult<ApiType, ContractCallOutcome>): ContractQuery<ApiType> {
39+
return withMeta(meta, (origin: string | AccountId | Uint8Array, options: bigint | string | number | BN | ContractOptions, ...params: unknown[]): ContractCallResult<ApiType, ContractCallOutcome> =>
3440
isOptions(options)
3541
? fn(origin, options, params)
36-
: fn(origin, ...extractOptions<ContractOptions>(options, params));
42+
: fn(origin, ...extractOptions<ContractOptions>(options, params))
43+
);
3744
}
3845

39-
function createTx <ApiType extends ApiTypes> (fn: (options: ContractOptions, params: unknown[]) => SubmittableExtrinsic<ApiType>): ContractTx<ApiType> {
40-
return (options: bigint | string | number | BN | ContractOptions, ...params: unknown[]): SubmittableExtrinsic<ApiType> =>
46+
function createTx <ApiType extends ApiTypes> (meta: AbiMessage, fn: (options: ContractOptions, params: unknown[]) => SubmittableExtrinsic<ApiType>): ContractTx<ApiType> {
47+
return withMeta(meta, (options: bigint | string | number | BN | ContractOptions, ...params: unknown[]): SubmittableExtrinsic<ApiType> =>
4148
isOptions(options)
4249
? fn(options, params)
43-
: fn(...extractOptions<ContractOptions>(options, params));
50+
: fn(...extractOptions<ContractOptions>(options, params))
51+
);
4452
}
4553

4654
export class ContractSubmittableResult extends SubmittableResult {
@@ -70,11 +78,11 @@ export class Contract<ApiType extends ApiTypes> extends Base<ApiType> {
7078

7179
this.abi.messages.forEach((m): void => {
7280
if (isUndefined(this.#tx[m.method])) {
73-
this.#tx[m.method] = createTx((o, p) => this.#exec(m, o, p));
81+
this.#tx[m.method] = createTx(m, (o, p) => this.#exec(m, o, p));
7482
}
7583

7684
if (isUndefined(this.#query[m.method])) {
77-
this.#query[m.method] = createQuery((f, o, p) => this.#read(m, o, p).send(f));
85+
this.#query[m.method] = createQuery(m, (f, o, p) => this.#read(m, o, p).send(f));
7886
}
7987
});
8088
}

packages/api-contract/src/base/types.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,17 @@ export interface BlueprintDeploy<ApiType extends ApiTypes> {
1414
(value: bigint | string | number | BN, gasLimit: bigint | string | number | BN, ...params: unknown[]): SubmittableExtrinsic<ApiType>;
1515
}
1616

17-
export interface ContractQuery<ApiType extends ApiTypes> {
17+
export interface MessageMeta {
18+
readonly meta: AbiMessage;
19+
}
20+
21+
export interface ContractQuery<ApiType extends ApiTypes> extends MessageMeta {
1822
(origin: AccountId | string | Uint8Array, options: ContractOptions, ...params: unknown[]): ContractCallResult<ApiType, ContractCallOutcome>;
1923
// @deprecated Use options form (to be dropped in a major update)
2024
(origin: AccountId | string | Uint8Array, value: bigint | BN | string | number, gasLimit: bigint | BN | string | number, ...params: unknown[]): ContractCallResult<ApiType, ContractCallOutcome>;
2125
}
2226

23-
export interface ContractTx<ApiType extends ApiTypes> {
27+
export interface ContractTx<ApiType extends ApiTypes> extends MessageMeta {
2428
(options: ContractOptions, ...params: unknown[]): SubmittableExtrinsic<ApiType>;
2529
// @deprecated Use options form (to be dropped in a major update)
2630
(value: bigint | BN | string | number, gasLimit: bigint | BN | string | number, ...params: unknown[]): SubmittableExtrinsic<ApiType>;

packages/api-contract/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export interface AbiMessage {
4040
isMutating?: boolean;
4141
isPayable?: boolean;
4242
method: string;
43+
path: string[];
4344
returnType?: TypeDef | null;
4445
selector: ContractSelector;
4546
toU8a: (params: unknown[]) => Uint8Array;

0 commit comments

Comments
 (0)