@dedot/contracts 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Contract.d.ts CHANGED
@@ -5,7 +5,8 @@ import { TypinkRegistry } from './TypinkRegistry.js';
5
5
  import { ContractEvent, ContractMetadata, GenericContractApi } from './types/index.js';
6
6
  export declare class Contract<ContractApi extends GenericContractApi = GenericContractApi> {
7
7
  #private;
8
- constructor(api: ISubstrateClient, metadata: ContractMetadata | string, address: AccountId32Like);
8
+ readonly client: ISubstrateClient<ContractApi['types']['ChainApi']>;
9
+ constructor(client: ISubstrateClient<ContractApi['types']['ChainApi']>, metadata: ContractMetadata | string, address: AccountId32Like);
9
10
  decodeEvent(eventRecord: IEventRecord): ContractEvent;
10
11
  decodeEvents(eventRecords: IEventRecord[]): ContractEvent[];
11
12
  get metadata(): ContractMetadata;
package/Contract.js CHANGED
@@ -3,22 +3,22 @@ import { TypinkRegistry } from './TypinkRegistry.js';
3
3
  import { EventExecutor, QueryExecutor, TxExecutor } from './executor/index.js';
4
4
  import { ensureSupportContractsPallet, newProxyChain, parseRawMetadata } from './utils.js';
5
5
  export class Contract {
6
- #api;
6
+ client;
7
7
  #registry;
8
8
  #address;
9
9
  #metadata;
10
- constructor(api, metadata, address) {
11
- ensureSupportContractsPallet(api);
12
- this.#api = api;
10
+ constructor(client, metadata, address) {
11
+ this.client = client;
12
+ ensureSupportContractsPallet(client);
13
13
  this.#address = new AccountId32(address);
14
14
  this.#metadata = typeof metadata === 'string' ? parseRawMetadata(metadata) : metadata;
15
15
  this.#registry = new TypinkRegistry(this.#metadata);
16
16
  }
17
17
  decodeEvent(eventRecord) {
18
- return this.#registry.decodeEvent(eventRecord);
18
+ return this.#registry.decodeEvent(eventRecord, this.address);
19
19
  }
20
20
  decodeEvents(eventRecords) {
21
- return this.#registry.decodeEvents(eventRecords);
21
+ return this.#registry.decodeEvents(eventRecords, this.address);
22
22
  }
23
23
  get metadata() {
24
24
  return this.#metadata;
@@ -30,12 +30,12 @@ export class Contract {
30
30
  return this.#registry;
31
31
  }
32
32
  get query() {
33
- return newProxyChain(new QueryExecutor(this.#api, this.#registry, this.#address));
33
+ return newProxyChain(new QueryExecutor(this.client, this.#registry, this.#address));
34
34
  }
35
35
  get tx() {
36
- return newProxyChain(new TxExecutor(this.#api, this.#registry, this.#address));
36
+ return newProxyChain(new TxExecutor(this.client, this.#registry, this.#address));
37
37
  }
38
38
  get events() {
39
- return newProxyChain(new EventExecutor(this.#api, this.#registry, this.#address));
39
+ return newProxyChain(new EventExecutor(this.client, this.#registry, this.#address));
40
40
  }
41
41
  }
@@ -4,7 +4,8 @@ import { TypinkRegistry } from './TypinkRegistry.js';
4
4
  import { ContractMetadata, GenericContractApi } from './types/index.js';
5
5
  export declare class ContractDeployer<ContractApi extends GenericContractApi = GenericContractApi> {
6
6
  #private;
7
- constructor(api: ISubstrateClient, metadata: ContractMetadata | string, codeHashOrWasm: Hash | Uint8Array | string);
7
+ readonly client: ISubstrateClient<ContractApi['types']['ChainApi']>;
8
+ constructor(client: ISubstrateClient<ContractApi['types']['ChainApi']>, metadata: ContractMetadata | string, codeHashOrWasm: Hash | Uint8Array | string);
8
9
  get metadata(): ContractMetadata;
9
10
  get registry(): TypinkRegistry;
10
11
  get tx(): ContractApi['constructorTx'];
@@ -3,13 +3,13 @@ import { ConstructorQueryExecutor } from './executor/ConstructorQueryExecutor.js
3
3
  import { ConstructorTxExecutor } from './executor/index.js';
4
4
  import { ensureSupportContractsPallet, newProxyChain, parseRawMetadata } from './utils.js';
5
5
  export class ContractDeployer {
6
- #api;
6
+ client;
7
7
  #metadata;
8
8
  #registry;
9
9
  #code;
10
- constructor(api, metadata, codeHashOrWasm) {
11
- ensureSupportContractsPallet(api);
12
- this.#api = api;
10
+ constructor(client, metadata, codeHashOrWasm) {
11
+ this.client = client;
12
+ ensureSupportContractsPallet(client);
13
13
  this.#metadata = typeof metadata === 'string' ? parseRawMetadata(metadata) : metadata;
14
14
  this.#registry = new TypinkRegistry(this.#metadata);
15
15
  this.#code = codeHashOrWasm;
@@ -21,9 +21,9 @@ export class ContractDeployer {
21
21
  return this.#registry;
22
22
  }
23
23
  get tx() {
24
- return newProxyChain(new ConstructorTxExecutor(this.#api, this.#registry, this.#code));
24
+ return newProxyChain(new ConstructorTxExecutor(this.client, this.#registry, this.#code));
25
25
  }
26
26
  get query() {
27
- return newProxyChain(new ConstructorQueryExecutor(this.#api, this.#registry, this.#code));
27
+ return newProxyChain(new ConstructorQueryExecutor(this.client, this.#registry, this.#code));
28
28
  }
29
29
  }
@@ -1,10 +1,10 @@
1
- import { TypeRegistry } from '@dedot/codecs';
1
+ import { AccountId32Like, TypeRegistry } from '@dedot/codecs';
2
2
  import { IEventRecord } from '@dedot/types';
3
3
  import { ContractEvent, ContractMetadata } from './types/index.js';
4
4
  export declare class TypinkRegistry extends TypeRegistry {
5
5
  #private;
6
6
  constructor(metadata: ContractMetadata);
7
7
  get metadata(): ContractMetadata;
8
- decodeEvents(records: IEventRecord[]): ContractEvent[];
9
- decodeEvent(eventRecord: IEventRecord): ContractEvent;
8
+ decodeEvents(records: IEventRecord[], contract?: AccountId32Like): ContractEvent[];
9
+ decodeEvent(eventRecord: IEventRecord, contract?: AccountId32Like): ContractEvent;
10
10
  }
package/TypinkRegistry.js CHANGED
@@ -1,4 +1,4 @@
1
- import { TypeRegistry } from '@dedot/codecs';
1
+ import { AccountId32, TypeRegistry } from '@dedot/codecs';
2
2
  import * as $ from '@dedot/shape';
3
3
  import { DedotError, assert, hexToU8a, stringCamelCase, stringPascalCase } from '@dedot/utils';
4
4
  import { extractContractTypes } from './utils.js';
@@ -11,12 +11,13 @@ export class TypinkRegistry extends TypeRegistry {
11
11
  get metadata() {
12
12
  return this.#metadata;
13
13
  }
14
- decodeEvents(records) {
14
+ decodeEvents(records, contract) {
15
15
  return records
16
- .filter(({ event }) => this.#isContractEmittedEvent(event)) // prettier-end-here
17
- .map((record) => this.decodeEvent(record));
16
+ .filter(({ event }) => this.#isContractEmittedEvent(event, contract)) // prettier-end-here
17
+ .map((record) => this.decodeEvent(record, contract));
18
18
  }
19
- decodeEvent(eventRecord) {
19
+ decodeEvent(eventRecord, contract) {
20
+ assert(this.#isContractEmittedEvent(eventRecord.event, contract), 'Invalid ContractEmitted Event');
20
21
  const { version } = this.#metadata;
21
22
  switch (version) {
22
23
  case 5:
@@ -27,13 +28,27 @@ export class TypinkRegistry extends TypeRegistry {
27
28
  throw new DedotError('Unsupported metadata version!');
28
29
  }
29
30
  }
30
- #isContractEmittedEvent(event) {
31
- // @ts-ignore
32
- return event.pallet === 'Contracts' && event.palletEvent.name === 'ContractEmitted';
31
+ #isContractEmittedEvent(event, contract) {
32
+ const eventMatched = event.pallet === 'Contracts' &&
33
+ typeof event.palletEvent === 'object' &&
34
+ event.palletEvent.name === 'ContractEmitted';
35
+ if (!eventMatched)
36
+ return false;
37
+ if (contract) {
38
+ // @ts-ignore
39
+ const emittedContract = event.palletEvent.data?.contract;
40
+ if (emittedContract instanceof AccountId32) {
41
+ return emittedContract.eq(contract);
42
+ }
43
+ else {
44
+ return false;
45
+ }
46
+ }
47
+ return true;
33
48
  }
34
49
  #decodeEventV4(eventRecord) {
35
50
  assert(this.#metadata.version === '4', 'Invalid metadata version!');
36
- assert(this.#isContractEmittedEvent(eventRecord.event), 'Event Record is not valid!');
51
+ assert(this.#isContractEmittedEvent(eventRecord.event), 'Invalid ContractEmitted Event');
37
52
  const data = hexToU8a(eventRecord.event.palletEvent.data.data);
38
53
  const index = data.at(0);
39
54
  assert(index !== undefined, 'Unable to decode event index!');
@@ -43,7 +58,7 @@ export class TypinkRegistry extends TypeRegistry {
43
58
  }
44
59
  #decodeEventV5(eventRecord) {
45
60
  assert(this.#metadata.version === 5, 'Invalid metadata version!');
46
- assert(this.#isContractEmittedEvent(eventRecord.event), 'Event Record is not valid!');
61
+ assert(this.#isContractEmittedEvent(eventRecord.event), 'Invalid ContractEmitted Event');
47
62
  const data = hexToU8a(eventRecord.event.palletEvent.data.data);
48
63
  const signatureTopic = eventRecord.topics.at(0);
49
64
  let eventMeta;
package/cjs/Contract.js CHANGED
@@ -6,22 +6,22 @@ const TypinkRegistry_js_1 = require("./TypinkRegistry.js");
6
6
  const index_js_1 = require("./executor/index.js");
7
7
  const utils_js_1 = require("./utils.js");
8
8
  class Contract {
9
- #api;
9
+ client;
10
10
  #registry;
11
11
  #address;
12
12
  #metadata;
13
- constructor(api, metadata, address) {
14
- (0, utils_js_1.ensureSupportContractsPallet)(api);
15
- this.#api = api;
13
+ constructor(client, metadata, address) {
14
+ this.client = client;
15
+ (0, utils_js_1.ensureSupportContractsPallet)(client);
16
16
  this.#address = new codecs_1.AccountId32(address);
17
17
  this.#metadata = typeof metadata === 'string' ? (0, utils_js_1.parseRawMetadata)(metadata) : metadata;
18
18
  this.#registry = new TypinkRegistry_js_1.TypinkRegistry(this.#metadata);
19
19
  }
20
20
  decodeEvent(eventRecord) {
21
- return this.#registry.decodeEvent(eventRecord);
21
+ return this.#registry.decodeEvent(eventRecord, this.address);
22
22
  }
23
23
  decodeEvents(eventRecords) {
24
- return this.#registry.decodeEvents(eventRecords);
24
+ return this.#registry.decodeEvents(eventRecords, this.address);
25
25
  }
26
26
  get metadata() {
27
27
  return this.#metadata;
@@ -33,13 +33,13 @@ class Contract {
33
33
  return this.#registry;
34
34
  }
35
35
  get query() {
36
- return (0, utils_js_1.newProxyChain)(new index_js_1.QueryExecutor(this.#api, this.#registry, this.#address));
36
+ return (0, utils_js_1.newProxyChain)(new index_js_1.QueryExecutor(this.client, this.#registry, this.#address));
37
37
  }
38
38
  get tx() {
39
- return (0, utils_js_1.newProxyChain)(new index_js_1.TxExecutor(this.#api, this.#registry, this.#address));
39
+ return (0, utils_js_1.newProxyChain)(new index_js_1.TxExecutor(this.client, this.#registry, this.#address));
40
40
  }
41
41
  get events() {
42
- return (0, utils_js_1.newProxyChain)(new index_js_1.EventExecutor(this.#api, this.#registry, this.#address));
42
+ return (0, utils_js_1.newProxyChain)(new index_js_1.EventExecutor(this.client, this.#registry, this.#address));
43
43
  }
44
44
  }
45
45
  exports.Contract = Contract;
@@ -6,13 +6,13 @@ const ConstructorQueryExecutor_js_1 = require("./executor/ConstructorQueryExecut
6
6
  const index_js_1 = require("./executor/index.js");
7
7
  const utils_js_1 = require("./utils.js");
8
8
  class ContractDeployer {
9
- #api;
9
+ client;
10
10
  #metadata;
11
11
  #registry;
12
12
  #code;
13
- constructor(api, metadata, codeHashOrWasm) {
14
- (0, utils_js_1.ensureSupportContractsPallet)(api);
15
- this.#api = api;
13
+ constructor(client, metadata, codeHashOrWasm) {
14
+ this.client = client;
15
+ (0, utils_js_1.ensureSupportContractsPallet)(client);
16
16
  this.#metadata = typeof metadata === 'string' ? (0, utils_js_1.parseRawMetadata)(metadata) : metadata;
17
17
  this.#registry = new TypinkRegistry_js_1.TypinkRegistry(this.#metadata);
18
18
  this.#code = codeHashOrWasm;
@@ -24,10 +24,10 @@ class ContractDeployer {
24
24
  return this.#registry;
25
25
  }
26
26
  get tx() {
27
- return (0, utils_js_1.newProxyChain)(new index_js_1.ConstructorTxExecutor(this.#api, this.#registry, this.#code));
27
+ return (0, utils_js_1.newProxyChain)(new index_js_1.ConstructorTxExecutor(this.client, this.#registry, this.#code));
28
28
  }
29
29
  get query() {
30
- return (0, utils_js_1.newProxyChain)(new ConstructorQueryExecutor_js_1.ConstructorQueryExecutor(this.#api, this.#registry, this.#code));
30
+ return (0, utils_js_1.newProxyChain)(new ConstructorQueryExecutor_js_1.ConstructorQueryExecutor(this.client, this.#registry, this.#code));
31
31
  }
32
32
  }
33
33
  exports.ContractDeployer = ContractDeployer;
@@ -37,12 +37,13 @@ class TypinkRegistry extends codecs_1.TypeRegistry {
37
37
  get metadata() {
38
38
  return this.#metadata;
39
39
  }
40
- decodeEvents(records) {
40
+ decodeEvents(records, contract) {
41
41
  return records
42
- .filter(({ event }) => this.#isContractEmittedEvent(event)) // prettier-end-here
43
- .map((record) => this.decodeEvent(record));
42
+ .filter(({ event }) => this.#isContractEmittedEvent(event, contract)) // prettier-end-here
43
+ .map((record) => this.decodeEvent(record, contract));
44
44
  }
45
- decodeEvent(eventRecord) {
45
+ decodeEvent(eventRecord, contract) {
46
+ (0, utils_1.assert)(this.#isContractEmittedEvent(eventRecord.event, contract), 'Invalid ContractEmitted Event');
46
47
  const { version } = this.#metadata;
47
48
  switch (version) {
48
49
  case 5:
@@ -53,13 +54,27 @@ class TypinkRegistry extends codecs_1.TypeRegistry {
53
54
  throw new utils_1.DedotError('Unsupported metadata version!');
54
55
  }
55
56
  }
56
- #isContractEmittedEvent(event) {
57
- // @ts-ignore
58
- return event.pallet === 'Contracts' && event.palletEvent.name === 'ContractEmitted';
57
+ #isContractEmittedEvent(event, contract) {
58
+ const eventMatched = event.pallet === 'Contracts' &&
59
+ typeof event.palletEvent === 'object' &&
60
+ event.palletEvent.name === 'ContractEmitted';
61
+ if (!eventMatched)
62
+ return false;
63
+ if (contract) {
64
+ // @ts-ignore
65
+ const emittedContract = event.palletEvent.data?.contract;
66
+ if (emittedContract instanceof codecs_1.AccountId32) {
67
+ return emittedContract.eq(contract);
68
+ }
69
+ else {
70
+ return false;
71
+ }
72
+ }
73
+ return true;
59
74
  }
60
75
  #decodeEventV4(eventRecord) {
61
76
  (0, utils_1.assert)(this.#metadata.version === '4', 'Invalid metadata version!');
62
- (0, utils_1.assert)(this.#isContractEmittedEvent(eventRecord.event), 'Event Record is not valid!');
77
+ (0, utils_1.assert)(this.#isContractEmittedEvent(eventRecord.event), 'Invalid ContractEmitted Event');
63
78
  const data = (0, utils_1.hexToU8a)(eventRecord.event.palletEvent.data.data);
64
79
  const index = data.at(0);
65
80
  (0, utils_1.assert)(index !== undefined, 'Unable to decode event index!');
@@ -69,7 +84,7 @@ class TypinkRegistry extends codecs_1.TypeRegistry {
69
84
  }
70
85
  #decodeEventV5(eventRecord) {
71
86
  (0, utils_1.assert)(this.#metadata.version === 5, 'Invalid metadata version!');
72
- (0, utils_1.assert)(this.#isContractEmittedEvent(eventRecord.event), 'Event Record is not valid!');
87
+ (0, utils_1.assert)(this.#isContractEmittedEvent(eventRecord.event), 'Invalid ContractEmitted Event');
73
88
  const data = (0, utils_1.hexToU8a)(eventRecord.event.palletEvent.data.data);
74
89
  const signatureTopic = eventRecord.topics.at(0);
75
90
  let eventMeta;
package/cjs/errors.js CHANGED
@@ -12,6 +12,7 @@ const utils_js_1 = require("./utils.js");
12
12
  * @extends DedotError
13
13
  */
14
14
  class ContractInstantiateError extends utils_1.DedotError {
15
+ name = 'ContractInstantiateError';
15
16
  /**
16
17
  * The raw result of the contract instantiation.
17
18
  */
@@ -36,6 +37,7 @@ exports.ContractInstantiateError = ContractInstantiateError;
36
37
  * @extends ContractInstantiateError
37
38
  */
38
39
  class ContractInstantiateDispatchError extends ContractInstantiateError {
40
+ name = 'ContractInstantiateDispatchError';
39
41
  /**
40
42
  * The error that occurred during the dispatch phase.
41
43
  */
@@ -49,6 +51,7 @@ class ContractInstantiateDispatchError extends ContractInstantiateError {
49
51
  constructor(err, raw) {
50
52
  super(raw);
51
53
  this.dispatchError = err;
54
+ this.message = `Dispatch error: ${JSON.stringify(err)}`;
52
55
  }
53
56
  }
54
57
  exports.ContractInstantiateDispatchError = ContractInstantiateDispatchError;
@@ -63,6 +66,7 @@ exports.ContractInstantiateDispatchError = ContractInstantiateDispatchError;
63
66
  * @extends ContractInstantiateError
64
67
  */
65
68
  class ContractInstantiateLangError extends ContractInstantiateError {
69
+ name = 'ContractInstantiateLangError';
66
70
  /**
67
71
  * The language-specific error that occurred during the instantiation.
68
72
  */
@@ -82,6 +86,7 @@ class ContractInstantiateLangError extends ContractInstantiateError {
82
86
  super(raw);
83
87
  this.langError = err;
84
88
  this.flags = (0, utils_js_1.toReturnFlags)(raw.result.value.result.flags.bits);
89
+ this.message = `Lange error: ${JSON.stringify(err)}`;
85
90
  }
86
91
  }
87
92
  exports.ContractInstantiateLangError = ContractInstantiateLangError;
@@ -94,6 +99,7 @@ exports.ContractInstantiateLangError = ContractInstantiateLangError;
94
99
  * @extends DedotError
95
100
  */
96
101
  class ContractExecutionError extends utils_1.DedotError {
102
+ name = 'ContractExecutionError';
97
103
  /**
98
104
  * The raw result of the contract call.
99
105
  */
@@ -118,6 +124,7 @@ exports.ContractExecutionError = ContractExecutionError;
118
124
  * @extends ContractExecutionError
119
125
  */
120
126
  class ContractDispatchError extends ContractExecutionError {
127
+ name = 'ContractDispatchError';
121
128
  /**
122
129
  * The error that occurred during the dispatch phase.
123
130
  */
@@ -131,6 +138,7 @@ class ContractDispatchError extends ContractExecutionError {
131
138
  constructor(err, raw) {
132
139
  super(raw);
133
140
  this.dispatchError = err;
141
+ this.message = `Dispatch error: ${JSON.stringify(err)}`;
134
142
  }
135
143
  }
136
144
  exports.ContractDispatchError = ContractDispatchError;
@@ -145,6 +153,7 @@ exports.ContractDispatchError = ContractDispatchError;
145
153
  * @extends ContractExecutionError
146
154
  */
147
155
  class ContractLangError extends ContractExecutionError {
156
+ name = 'ContractLangError';
148
157
  /**
149
158
  * The language-specific error that occurred during the execution.
150
159
  */
@@ -164,6 +173,7 @@ class ContractLangError extends ContractExecutionError {
164
173
  super(raw);
165
174
  this.langError = err;
166
175
  this.flags = (0, utils_js_1.toReturnFlags)(raw.result.value.flags.bits);
176
+ this.message = `Lange error: ${JSON.stringify(err)}`;
167
177
  }
168
178
  }
169
179
  exports.ContractLangError = ContractLangError;
@@ -7,8 +7,8 @@ const utils_js_1 = require("../utils.js");
7
7
  const Executor_js_1 = require("./Executor.js");
8
8
  class ConstructorQueryExecutor extends Executor_js_1.Executor {
9
9
  code;
10
- constructor(api, registry, code) {
11
- super(api, registry);
10
+ constructor(client, registry, code) {
11
+ super(client, registry);
12
12
  this.code = code;
13
13
  }
14
14
  doExecute(constructor) {
@@ -27,7 +27,7 @@ class ConstructorQueryExecutor extends Executor_js_1.Executor {
27
27
  type: (0, utils_1.isWasm)(this.code) ? 'Upload' : 'Existing',
28
28
  value: this.code,
29
29
  };
30
- const raw = await this.api.call.contractsApi.instantiate(caller, value, gasLimit, storageDepositLimit, code, bytes, salt);
30
+ const raw = await this.client.call.contractsApi.instantiate(caller, value, gasLimit, storageDepositLimit, code, bytes, salt);
31
31
  if (raw.result.isErr) {
32
32
  throw new errors_js_1.ContractInstantiateDispatchError(raw.result.err, raw);
33
33
  }
@@ -6,8 +6,8 @@ const utils_js_1 = require("../utils.js");
6
6
  const Executor_js_1 = require("./Executor.js");
7
7
  class ConstructorTxExecutor extends Executor_js_1.Executor {
8
8
  code;
9
- constructor(api, registry, code) {
10
- super(api, registry);
9
+ constructor(client, registry, code) {
10
+ super(client, registry);
11
11
  this.code = code;
12
12
  }
13
13
  doExecute(constructor) {
@@ -23,10 +23,11 @@ class ConstructorTxExecutor extends Executor_js_1.Executor {
23
23
  const formattedInputs = args.map((arg, index) => this.tryEncode(arg, params[index]));
24
24
  const bytes = (0, utils_1.u8aToHex)((0, utils_1.concatU8a)((0, utils_1.hexToU8a)(meta.selector), ...formattedInputs));
25
25
  if ((0, utils_1.isWasm)(this.code)) {
26
- return this.api.tx.contracts.instantiateWithCode(value, gasLimit, storageDepositLimit, this.code, bytes, salt);
26
+ return this.client.tx.contracts.instantiateWithCode(value, gasLimit, storageDepositLimit, this.code, bytes, salt);
27
27
  }
28
28
  else {
29
- return this.api.tx.contracts.instantiate(value, gasLimit, storageDepositLimit, this.code, bytes, salt);
29
+ return this.client.tx.contracts.instantiate(value, // prettier-end-here
30
+ gasLimit, storageDepositLimit, this.code, bytes, salt);
30
31
  }
31
32
  };
32
33
  callFn.meta = meta;
@@ -11,7 +11,7 @@ class EventExecutor extends Executor_js_1.Executor {
11
11
  const is = (event) => {
12
12
  if ((0, api_1.isEventRecord)(event)) {
13
13
  try {
14
- event = this.registry.decodeEvent(event);
14
+ event = this.registry.decodeEvent(event, this.address);
15
15
  }
16
16
  catch {
17
17
  return false;
@@ -23,7 +23,7 @@ class EventExecutor extends Executor_js_1.Executor {
23
23
  if (!events || events.length === 0)
24
24
  return undefined;
25
25
  if ((0, api_1.isEventRecord)(events[0])) {
26
- return this.registry.decodeEvents(events).find(is);
26
+ return this.registry.decodeEvents(events, this.address).find(is);
27
27
  }
28
28
  else {
29
29
  return events.find(is);
@@ -31,7 +31,7 @@ class EventExecutor extends Executor_js_1.Executor {
31
31
  };
32
32
  const filter = (events) => {
33
33
  if ((0, api_1.isEventRecord)(events[0])) {
34
- return this.registry.decodeEvents(events).filter(is);
34
+ return this.registry.decodeEvents(events, this.address).filter(is);
35
35
  }
36
36
  else {
37
37
  return events.filter(is);
@@ -3,28 +3,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Executor = void 0;
4
4
  const codecs_1 = require("@dedot/codecs");
5
5
  class Executor {
6
- #api;
7
- #registry;
6
+ client;
7
+ registry;
8
8
  #address;
9
- constructor(api, registry, address) {
10
- this.#api = api;
11
- this.#registry = registry;
9
+ constructor(client, registry, address) {
10
+ this.client = client;
11
+ this.registry = registry;
12
12
  if (address) {
13
13
  this.#address = new codecs_1.AccountId32(address);
14
14
  }
15
15
  }
16
- get api() {
17
- return this.#api;
18
- }
19
16
  get metadata() {
20
- return this.#registry.metadata;
17
+ return this.registry.metadata;
21
18
  }
22
19
  get address() {
23
20
  return this.#address;
24
21
  }
25
- get registry() {
26
- return this.#registry;
27
- }
28
22
  tryEncode(param, value) {
29
23
  const { type } = param.type;
30
24
  const $codec = this.registry.findCodec(type);
@@ -17,7 +17,7 @@ class QueryExecutor extends Executor_js_1.Executor {
17
17
  (0, utils_1.assert)(caller, 'Expected a valid caller address in ContractCallOptions');
18
18
  const formattedInputs = args.map((arg, index) => this.tryEncode(arg, params[index]));
19
19
  const bytes = (0, utils_1.u8aToHex)((0, utils_1.concatU8a)((0, utils_1.hexToU8a)(meta.selector), ...formattedInputs));
20
- const raw = await this.api.call.contractsApi.call(caller, this.address, value, gasLimit, storageDepositLimit, bytes);
20
+ const raw = await this.client.call.contractsApi.call(caller, this.address, value, gasLimit, storageDepositLimit, bytes);
21
21
  if (raw.result.isErr) {
22
22
  throw new errors_js_1.ContractDispatchError(raw.result.err, raw);
23
23
  }
@@ -16,7 +16,7 @@ class TxExecutor extends Executor_js_1.Executor {
16
16
  (0, utils_1.assert)(gasLimit, 'Expected a gas limit in ContractTxOptions');
17
17
  const formattedInputs = args.map((arg, index) => this.tryEncode(arg, params[index]));
18
18
  const bytes = (0, utils_1.u8aToHex)((0, utils_1.concatU8a)((0, utils_1.hexToU8a)(meta.selector), ...formattedInputs));
19
- return this.api.tx.contracts.call(this.address, value, gasLimit, storageDepositLimit, bytes);
19
+ return this.client.tx.contracts.call(this.address, value, gasLimit, storageDepositLimit, bytes);
20
20
  };
21
21
  callFn.meta = meta;
22
22
  return callFn;
package/cjs/utils.js CHANGED
@@ -91,9 +91,9 @@ function newProxyChain(carrier) {
91
91
  });
92
92
  }
93
93
  exports.newProxyChain = newProxyChain;
94
- function ensureSupportContractsPallet(api) {
94
+ function ensureSupportContractsPallet(client) {
95
95
  try {
96
- !!api.call.contractsApi.call.meta && !!api.tx.contracts.call.meta;
96
+ !!client.call.contractsApi.call.meta && !!client.tx.contracts.call.meta;
97
97
  }
98
98
  catch {
99
99
  throw new Error('Contracts pallet is not available');
package/errors.d.ts CHANGED
@@ -10,6 +10,7 @@ import { ContractCallResult, ContractInstantiateResult, GenericContractApi, Retu
10
10
  * @extends DedotError
11
11
  */
12
12
  export declare class ContractInstantiateError<ContractApi extends GenericContractApi = GenericContractApi> extends DedotError {
13
+ name: string;
13
14
  /**
14
15
  * The raw result of the contract instantiation.
15
16
  */
@@ -30,6 +31,7 @@ export declare class ContractInstantiateError<ContractApi extends GenericContrac
30
31
  * @extends ContractInstantiateError
31
32
  */
32
33
  export declare class ContractInstantiateDispatchError<ContractApi extends GenericContractApi = GenericContractApi> extends ContractInstantiateError<ContractApi> {
34
+ name: string;
33
35
  /**
34
36
  * The error that occurred during the dispatch phase.
35
37
  */
@@ -53,6 +55,7 @@ export declare class ContractInstantiateDispatchError<ContractApi extends Generi
53
55
  * @extends ContractInstantiateError
54
56
  */
55
57
  export declare class ContractInstantiateLangError<ContractApi extends GenericContractApi = GenericContractApi> extends ContractInstantiateError<ContractApi> {
58
+ name: string;
56
59
  /**
57
60
  * The language-specific error that occurred during the instantiation.
58
61
  */
@@ -78,6 +81,7 @@ export declare class ContractInstantiateLangError<ContractApi extends GenericCon
78
81
  * @extends DedotError
79
82
  */
80
83
  export declare class ContractExecutionError<ContractApi extends GenericContractApi = GenericContractApi> extends DedotError {
84
+ name: string;
81
85
  /**
82
86
  * The raw result of the contract call.
83
87
  */
@@ -98,6 +102,7 @@ export declare class ContractExecutionError<ContractApi extends GenericContractA
98
102
  * @extends ContractExecutionError
99
103
  */
100
104
  export declare class ContractDispatchError<ContractApi extends GenericContractApi = GenericContractApi> extends ContractExecutionError<ContractApi> {
105
+ name: string;
101
106
  /**
102
107
  * The error that occurred during the dispatch phase.
103
108
  */
@@ -121,6 +126,7 @@ export declare class ContractDispatchError<ContractApi extends GenericContractAp
121
126
  * @extends ContractExecutionError
122
127
  */
123
128
  export declare class ContractLangError<ContractApi extends GenericContractApi = GenericContractApi> extends ContractExecutionError<ContractApi> {
129
+ name: string;
124
130
  /**
125
131
  * The language-specific error that occurred during the execution.
126
132
  */
package/errors.js CHANGED
@@ -9,6 +9,7 @@ import { toReturnFlags } from './utils.js';
9
9
  * @extends DedotError
10
10
  */
11
11
  export class ContractInstantiateError extends DedotError {
12
+ name = 'ContractInstantiateError';
12
13
  /**
13
14
  * The raw result of the contract instantiation.
14
15
  */
@@ -32,6 +33,7 @@ export class ContractInstantiateError extends DedotError {
32
33
  * @extends ContractInstantiateError
33
34
  */
34
35
  export class ContractInstantiateDispatchError extends ContractInstantiateError {
36
+ name = 'ContractInstantiateDispatchError';
35
37
  /**
36
38
  * The error that occurred during the dispatch phase.
37
39
  */
@@ -45,6 +47,7 @@ export class ContractInstantiateDispatchError extends ContractInstantiateError {
45
47
  constructor(err, raw) {
46
48
  super(raw);
47
49
  this.dispatchError = err;
50
+ this.message = `Dispatch error: ${JSON.stringify(err)}`;
48
51
  }
49
52
  }
50
53
  /**
@@ -58,6 +61,7 @@ export class ContractInstantiateDispatchError extends ContractInstantiateError {
58
61
  * @extends ContractInstantiateError
59
62
  */
60
63
  export class ContractInstantiateLangError extends ContractInstantiateError {
64
+ name = 'ContractInstantiateLangError';
61
65
  /**
62
66
  * The language-specific error that occurred during the instantiation.
63
67
  */
@@ -77,6 +81,7 @@ export class ContractInstantiateLangError extends ContractInstantiateError {
77
81
  super(raw);
78
82
  this.langError = err;
79
83
  this.flags = toReturnFlags(raw.result.value.result.flags.bits);
84
+ this.message = `Lange error: ${JSON.stringify(err)}`;
80
85
  }
81
86
  }
82
87
  /**
@@ -88,6 +93,7 @@ export class ContractInstantiateLangError extends ContractInstantiateError {
88
93
  * @extends DedotError
89
94
  */
90
95
  export class ContractExecutionError extends DedotError {
96
+ name = 'ContractExecutionError';
91
97
  /**
92
98
  * The raw result of the contract call.
93
99
  */
@@ -111,6 +117,7 @@ export class ContractExecutionError extends DedotError {
111
117
  * @extends ContractExecutionError
112
118
  */
113
119
  export class ContractDispatchError extends ContractExecutionError {
120
+ name = 'ContractDispatchError';
114
121
  /**
115
122
  * The error that occurred during the dispatch phase.
116
123
  */
@@ -124,6 +131,7 @@ export class ContractDispatchError extends ContractExecutionError {
124
131
  constructor(err, raw) {
125
132
  super(raw);
126
133
  this.dispatchError = err;
134
+ this.message = `Dispatch error: ${JSON.stringify(err)}`;
127
135
  }
128
136
  }
129
137
  /**
@@ -137,6 +145,7 @@ export class ContractDispatchError extends ContractExecutionError {
137
145
  * @extends ContractExecutionError
138
146
  */
139
147
  export class ContractLangError extends ContractExecutionError {
148
+ name = 'ContractLangError';
140
149
  /**
141
150
  * The language-specific error that occurred during the execution.
142
151
  */
@@ -156,6 +165,7 @@ export class ContractLangError extends ContractExecutionError {
156
165
  super(raw);
157
166
  this.langError = err;
158
167
  this.flags = toReturnFlags(raw.result.value.flags.bits);
168
+ this.message = `Lange error: ${JSON.stringify(err)}`;
159
169
  }
160
170
  }
161
171
  /**
@@ -8,6 +8,6 @@ import { Executor } from './Executor.js';
8
8
  export declare class ConstructorQueryExecutor<ChainApi extends GenericSubstrateApi> extends Executor<ChainApi> {
9
9
  #private;
10
10
  protected readonly code: Hash | Uint8Array | HexString | string;
11
- constructor(api: ISubstrateClient<ChainApi>, registry: TypinkRegistry, code: Hash | Uint8Array | string);
11
+ constructor(client: ISubstrateClient<ChainApi>, registry: TypinkRegistry, code: Hash | Uint8Array | string);
12
12
  doExecute(constructor: string): GenericConstructorQueryCall<ChainApi>;
13
13
  }
@@ -4,8 +4,8 @@ import { normalizeLabel, toReturnFlags } from '../utils.js';
4
4
  import { Executor } from './Executor.js';
5
5
  export class ConstructorQueryExecutor extends Executor {
6
6
  code;
7
- constructor(api, registry, code) {
8
- super(api, registry);
7
+ constructor(client, registry, code) {
8
+ super(client, registry);
9
9
  this.code = code;
10
10
  }
11
11
  doExecute(constructor) {
@@ -24,7 +24,7 @@ export class ConstructorQueryExecutor extends Executor {
24
24
  type: isWasm(this.code) ? 'Upload' : 'Existing',
25
25
  value: this.code,
26
26
  };
27
- const raw = await this.api.call.contractsApi.instantiate(caller, value, gasLimit, storageDepositLimit, code, bytes, salt);
27
+ const raw = await this.client.call.contractsApi.instantiate(caller, value, gasLimit, storageDepositLimit, code, bytes, salt);
28
28
  if (raw.result.isErr) {
29
29
  throw new ContractInstantiateDispatchError(raw.result.err, raw);
30
30
  }
@@ -8,6 +8,6 @@ import { Executor } from './Executor.js';
8
8
  export declare class ConstructorTxExecutor<ChainApi extends GenericSubstrateApi> extends Executor<ChainApi> {
9
9
  #private;
10
10
  protected readonly code: Hash | Uint8Array | HexString | string;
11
- constructor(api: ISubstrateClient<ChainApi>, registry: TypinkRegistry, code: Hash | Uint8Array | string);
11
+ constructor(client: ISubstrateClient<ChainApi>, registry: TypinkRegistry, code: Hash | Uint8Array | string);
12
12
  doExecute(constructor: string): GenericConstructorTxCall<ChainApi>;
13
13
  }
@@ -3,8 +3,8 @@ import { normalizeLabel } from '../utils.js';
3
3
  import { Executor } from './Executor.js';
4
4
  export class ConstructorTxExecutor extends Executor {
5
5
  code;
6
- constructor(api, registry, code) {
7
- super(api, registry);
6
+ constructor(client, registry, code) {
7
+ super(client, registry);
8
8
  this.code = code;
9
9
  }
10
10
  doExecute(constructor) {
@@ -20,10 +20,11 @@ export class ConstructorTxExecutor extends Executor {
20
20
  const formattedInputs = args.map((arg, index) => this.tryEncode(arg, params[index]));
21
21
  const bytes = u8aToHex(concatU8a(hexToU8a(meta.selector), ...formattedInputs));
22
22
  if (isWasm(this.code)) {
23
- return this.api.tx.contracts.instantiateWithCode(value, gasLimit, storageDepositLimit, this.code, bytes, salt);
23
+ return this.client.tx.contracts.instantiateWithCode(value, gasLimit, storageDepositLimit, this.code, bytes, salt);
24
24
  }
25
25
  else {
26
- return this.api.tx.contracts.instantiate(value, gasLimit, storageDepositLimit, this.code, bytes, salt);
26
+ return this.client.tx.contracts.instantiate(value, // prettier-end-here
27
+ gasLimit, storageDepositLimit, this.code, bytes, salt);
27
28
  }
28
29
  };
29
30
  callFn.meta = meta;
@@ -8,7 +8,7 @@ export class EventExecutor extends Executor {
8
8
  const is = (event) => {
9
9
  if (isEventRecord(event)) {
10
10
  try {
11
- event = this.registry.decodeEvent(event);
11
+ event = this.registry.decodeEvent(event, this.address);
12
12
  }
13
13
  catch {
14
14
  return false;
@@ -20,7 +20,7 @@ export class EventExecutor extends Executor {
20
20
  if (!events || events.length === 0)
21
21
  return undefined;
22
22
  if (isEventRecord(events[0])) {
23
- return this.registry.decodeEvents(events).find(is);
23
+ return this.registry.decodeEvents(events, this.address).find(is);
24
24
  }
25
25
  else {
26
26
  return events.find(is);
@@ -28,7 +28,7 @@ export class EventExecutor extends Executor {
28
28
  };
29
29
  const filter = (events) => {
30
30
  if (isEventRecord(events[0])) {
31
- return this.registry.decodeEvents(events).filter(is);
31
+ return this.registry.decodeEvents(events, this.address).filter(is);
32
32
  }
33
33
  else {
34
34
  return events.filter(is);
@@ -1,17 +1,17 @@
1
1
  import { ISubstrateClient } from '@dedot/api';
2
2
  import { SubstrateApi } from '@dedot/api/chaintypes';
3
- import { AccountId32 } from '@dedot/codecs';
3
+ import { AccountId32, AccountId32Like } from '@dedot/codecs';
4
4
  import { GenericSubstrateApi, RpcVersion } from '@dedot/types';
5
5
  import { TypinkRegistry } from '../TypinkRegistry.js';
6
6
  import { ContractMessageArg, ContractMessage } from '../types/index.js';
7
7
  import { ContractMetadata } from '../types/index.js';
8
8
  export declare abstract class Executor<ChainApi extends GenericSubstrateApi = SubstrateApi[RpcVersion]> {
9
9
  #private;
10
- constructor(api: ISubstrateClient<ChainApi>, registry: TypinkRegistry, address?: AccountId32);
11
- get api(): ISubstrateClient<ChainApi>;
10
+ readonly client: ISubstrateClient<ChainApi>;
11
+ readonly registry: TypinkRegistry;
12
+ constructor(client: ISubstrateClient<ChainApi>, registry: TypinkRegistry, address?: AccountId32Like);
12
13
  get metadata(): ContractMetadata;
13
14
  get address(): AccountId32 | undefined;
14
- get registry(): TypinkRegistry;
15
15
  abstract doExecute(...paths: string[]): unknown;
16
16
  tryEncode(param: ContractMessageArg, value: any): Uint8Array;
17
17
  tryDecode(meta: ContractMessage, raw: any): unknown;
@@ -1,27 +1,21 @@
1
1
  import { AccountId32 } from '@dedot/codecs';
2
2
  export class Executor {
3
- #api;
4
- #registry;
3
+ client;
4
+ registry;
5
5
  #address;
6
- constructor(api, registry, address) {
7
- this.#api = api;
8
- this.#registry = registry;
6
+ constructor(client, registry, address) {
7
+ this.client = client;
8
+ this.registry = registry;
9
9
  if (address) {
10
10
  this.#address = new AccountId32(address);
11
11
  }
12
12
  }
13
- get api() {
14
- return this.#api;
15
- }
16
13
  get metadata() {
17
- return this.#registry.metadata;
14
+ return this.registry.metadata;
18
15
  }
19
16
  get address() {
20
17
  return this.#address;
21
18
  }
22
- get registry() {
23
- return this.#registry;
24
- }
25
19
  tryEncode(param, value) {
26
20
  const { type } = param.type;
27
21
  const $codec = this.registry.findCodec(type);
@@ -14,7 +14,7 @@ export class QueryExecutor extends Executor {
14
14
  assert(caller, 'Expected a valid caller address in ContractCallOptions');
15
15
  const formattedInputs = args.map((arg, index) => this.tryEncode(arg, params[index]));
16
16
  const bytes = u8aToHex(concatU8a(hexToU8a(meta.selector), ...formattedInputs));
17
- const raw = await this.api.call.contractsApi.call(caller, this.address, value, gasLimit, storageDepositLimit, bytes);
17
+ const raw = await this.client.call.contractsApi.call(caller, this.address, value, gasLimit, storageDepositLimit, bytes);
18
18
  if (raw.result.isErr) {
19
19
  throw new ContractDispatchError(raw.result.err, raw);
20
20
  }
@@ -13,7 +13,7 @@ export class TxExecutor extends Executor {
13
13
  assert(gasLimit, 'Expected a gas limit in ContractTxOptions');
14
14
  const formattedInputs = args.map((arg, index) => this.tryEncode(arg, params[index]));
15
15
  const bytes = u8aToHex(concatU8a(hexToU8a(meta.selector), ...formattedInputs));
16
- return this.api.tx.contracts.call(this.address, value, gasLimit, storageDepositLimit, bytes);
16
+ return this.client.tx.contracts.call(this.address, value, gasLimit, storageDepositLimit, bytes);
17
17
  };
18
18
  callFn.meta = meta;
19
19
  return callFn;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dedot/contracts",
3
- "version": "0.4.1",
3
+ "version": "0.5.0",
4
4
  "description": "Delightful ink! Contract APIs",
5
5
  "author": "Tung Vu <tung@coongcrafts.io>",
6
6
  "homepage": "https://github.com/dedotdev/dedot/tree/main/packages/contracts",
@@ -18,17 +18,17 @@
18
18
  "test": "vitest --watch=false"
19
19
  },
20
20
  "dependencies": {
21
- "@dedot/api": "0.4.1",
22
- "@dedot/codecs": "0.4.1",
23
- "@dedot/types": "0.4.1",
24
- "@dedot/utils": "0.4.1"
21
+ "@dedot/api": "0.5.0",
22
+ "@dedot/codecs": "0.5.0",
23
+ "@dedot/types": "0.5.0",
24
+ "@dedot/utils": "0.5.0"
25
25
  },
26
26
  "publishConfig": {
27
27
  "access": "public",
28
28
  "directory": "dist"
29
29
  },
30
30
  "license": "Apache-2.0",
31
- "gitHead": "05b2a88dd2c78b17d68f0dd211e50be79e79852e",
31
+ "gitHead": "968148ade63e07644094fc033be719b320e18a18",
32
32
  "module": "./index.js",
33
33
  "types": "./index.d.ts",
34
34
  "exports": {
package/utils.d.ts CHANGED
@@ -1,12 +1,13 @@
1
1
  import { ISubstrateClient } from '@dedot/api';
2
+ import { SubstrateApi } from '@dedot/api/chaintypes';
2
3
  import { PortableType, TypeDef } from '@dedot/codecs';
3
- import { GenericSubstrateApi } from '@dedot/types';
4
+ import { GenericSubstrateApi, RpcVersion } from '@dedot/types';
4
5
  import { Executor } from './executor/index.js';
5
6
  import { ContractMetadata, ContractTypeDef, ReturnFlags } from './types/index.js';
6
7
  export declare const extractContractTypes: (contractMetadata: ContractMetadata) => PortableType[];
7
8
  export declare const normalizeContractTypeDef: (def: ContractTypeDef) => TypeDef;
8
9
  export declare const parseRawMetadata: (rawMetadata: string) => ContractMetadata;
9
10
  export declare function newProxyChain<ChainApi extends GenericSubstrateApi>(carrier: Executor<ChainApi>): unknown;
10
- export declare function ensureSupportContractsPallet<ChainApi extends GenericSubstrateApi>(api: ISubstrateClient<ChainApi>): void;
11
+ export declare function ensureSupportContractsPallet(client: ISubstrateClient<SubstrateApi[RpcVersion]>): void;
11
12
  export declare function normalizeLabel(label?: string): string;
12
13
  export declare function toReturnFlags(bits: number): ReturnFlags;
package/utils.js CHANGED
@@ -84,9 +84,9 @@ export function newProxyChain(carrier) {
84
84
  },
85
85
  });
86
86
  }
87
- export function ensureSupportContractsPallet(api) {
87
+ export function ensureSupportContractsPallet(client) {
88
88
  try {
89
- !!api.call.contractsApi.call.meta && !!api.tx.contracts.call.meta;
89
+ !!client.call.contractsApi.call.meta && !!client.tx.contracts.call.meta;
90
90
  }
91
91
  catch {
92
92
  throw new Error('Contracts pallet is not available');