@dedot/contracts 0.0.1-next.cfee875e.21 → 0.0.1-next.d731b849.13

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
@@ -1,13 +1,16 @@
1
1
  import { ISubstrateClient } from '@dedot/api';
2
2
  import { AccountId32, AccountId32Like } from '@dedot/codecs';
3
+ import { IEventRecord } from '@dedot/types';
3
4
  import { TypinkRegistry } from './TypinkRegistry.js';
4
- import { ContractMetadata, GenericContractApi } from './types/index.js';
5
+ import { ContractEvent, ContractMetadata, GenericContractApi } from './types/index.js';
5
6
  export declare class Contract<ContractApi extends GenericContractApi = GenericContractApi> {
6
7
  #private;
7
- constructor(api: ISubstrateClient, address: AccountId32Like, metadata: ContractMetadata | string);
8
+ constructor(api: ISubstrateClient, metadata: ContractMetadata | string, address: AccountId32Like);
9
+ decodeEvent(eventRecord: IEventRecord): ContractEvent;
8
10
  get metadata(): ContractMetadata;
9
11
  get address(): AccountId32;
10
12
  get registry(): TypinkRegistry;
11
13
  get query(): ContractApi['query'];
12
14
  get tx(): ContractApi['tx'];
15
+ get events(): ContractApi['events'];
13
16
  }
package/Contract.js CHANGED
@@ -1,19 +1,22 @@
1
1
  import { AccountId32 } from '@dedot/codecs';
2
2
  import { TypinkRegistry } from './TypinkRegistry.js';
3
- import { QueryExecutor, TxExecutor } from './executor/index.js';
3
+ import { EventExecutor, QueryExecutor, TxExecutor } from './executor/index.js';
4
4
  import { ensureSupportContractsPallet, newProxyChain, parseRawMetadata } from './utils.js';
5
5
  export class Contract {
6
6
  #api;
7
7
  #registry;
8
8
  #address;
9
9
  #metadata;
10
- constructor(api, address, metadata) {
10
+ constructor(api, metadata, address) {
11
11
  ensureSupportContractsPallet(api);
12
12
  this.#api = api;
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
+ decodeEvent(eventRecord) {
18
+ return this.#registry.decodeEvent(eventRecord);
19
+ }
17
20
  get metadata() {
18
21
  return this.#metadata;
19
22
  }
@@ -29,4 +32,7 @@ export class Contract {
29
32
  get tx() {
30
33
  return newProxyChain(new TxExecutor(this.#api, this.#registry, this.#address));
31
34
  }
35
+ get events() {
36
+ return newProxyChain(new EventExecutor(this.#api, this.#registry, this.#address));
37
+ }
32
38
  }
@@ -1,7 +1,9 @@
1
1
  import { TypeRegistry } from '@dedot/codecs';
2
- import { ContractMetadata } from './types/index.js';
2
+ import { IEventRecord } from '@dedot/types';
3
+ import { ContractEvent, ContractMetadata } from './types/index.js';
3
4
  export declare class TypinkRegistry extends TypeRegistry {
4
5
  #private;
5
6
  constructor(metadata: ContractMetadata);
6
7
  get metadata(): ContractMetadata;
8
+ decodeEvent(eventRecord: IEventRecord): ContractEvent;
7
9
  }
package/TypinkRegistry.js CHANGED
@@ -1,4 +1,6 @@
1
1
  import { TypeRegistry } from '@dedot/codecs';
2
+ import * as $ from '@dedot/shape';
3
+ import { DedotError, assert, hexToU8a, stringCamelCase, stringPascalCase } from '@dedot/utils';
2
4
  import { extractContractTypes } from './utils.js';
3
5
  export class TypinkRegistry extends TypeRegistry {
4
6
  #metadata;
@@ -9,4 +11,61 @@ export class TypinkRegistry extends TypeRegistry {
9
11
  get metadata() {
10
12
  return this.#metadata;
11
13
  }
14
+ decodeEvent(eventRecord) {
15
+ const { version } = this.#metadata;
16
+ switch (version) {
17
+ case 5:
18
+ return this.#decodeEventV5(eventRecord);
19
+ case '4':
20
+ return this.#decodeEventV4(eventRecord);
21
+ default:
22
+ throw new DedotError('Unsupported metadata version!');
23
+ }
24
+ }
25
+ #isContractEmittedEvent(eventRecord) {
26
+ // @ts-ignore
27
+ return eventRecord.pallet === 'Contracts' && eventRecord.palletEvent.name === 'ContractEmitted';
28
+ }
29
+ #decodeEventV4(eventRecord) {
30
+ assert(this.#metadata.version === '4', 'Invalid metadata version!');
31
+ assert(this.#isContractEmittedEvent(eventRecord.event), 'Event Record is not valid!');
32
+ const data = hexToU8a(eventRecord.event.palletEvent.data.data);
33
+ const index = data.at(0);
34
+ assert(index !== undefined, 'Unable to decode event index!');
35
+ const event = this.#metadata.spec.events[index];
36
+ assert(event, `Event index not found: ${index.toString()}`);
37
+ return this.#tryDecodeEvent(event, data.subarray(1));
38
+ }
39
+ #decodeEventV5(eventRecord) {
40
+ assert(this.#metadata.version === 5, 'Invalid metadata version!');
41
+ assert(this.#isContractEmittedEvent(eventRecord.event), 'Event Record is not valid!');
42
+ const data = hexToU8a(eventRecord.event.palletEvent.data.data);
43
+ const signatureTopic = eventRecord.topics.at(0);
44
+ let eventMeta;
45
+ if (signatureTopic) {
46
+ eventMeta = this.#metadata.spec.events.find((one) => one.signature_topic === signatureTopic);
47
+ }
48
+ // TODO: Handle multiple anonymous events
49
+ // If `event` does not exist, it means it's an anonymous event
50
+ // that does not contain a signature topic in the metadata.
51
+ if (!eventMeta) {
52
+ const potentialEvents = this.#metadata.spec.events.filter((one) => !one.signature_topic && one.args.filter((arg) => arg.indexed).length === eventRecord.topics.length);
53
+ assert(potentialEvents.length === 1, 'Unable to determine event!');
54
+ eventMeta = potentialEvents[0];
55
+ }
56
+ return this.#tryDecodeEvent(eventMeta, data);
57
+ }
58
+ #tryDecodeEvent(eventMeta, raw) {
59
+ const { args, label } = eventMeta;
60
+ const eventCodecFrame = args.reduce((frame, arg) => {
61
+ const { label, type: { type }, } = arg;
62
+ const $codec = this.findCodec(type);
63
+ Object.assign(frame, { [stringCamelCase(label)]: $codec });
64
+ return frame;
65
+ }, {});
66
+ const $eventCodec = $.Struct(eventCodecFrame);
67
+ const data = $eventCodec.decode(raw);
68
+ const name = stringPascalCase(label);
69
+ return args.length ? { name, data } : { name };
70
+ }
12
71
  }
package/cjs/Contract.js CHANGED
@@ -10,13 +10,16 @@ class Contract {
10
10
  #registry;
11
11
  #address;
12
12
  #metadata;
13
- constructor(api, address, metadata) {
13
+ constructor(api, metadata, address) {
14
14
  (0, utils_js_1.ensureSupportContractsPallet)(api);
15
15
  this.#api = api;
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
+ decodeEvent(eventRecord) {
21
+ return this.#registry.decodeEvent(eventRecord);
22
+ }
20
23
  get metadata() {
21
24
  return this.#metadata;
22
25
  }
@@ -32,5 +35,8 @@ class Contract {
32
35
  get tx() {
33
36
  return (0, utils_js_1.newProxyChain)(new index_js_1.TxExecutor(this.#api, this.#registry, this.#address));
34
37
  }
38
+ get events() {
39
+ return (0, utils_js_1.newProxyChain)(new index_js_1.EventExecutor(this.#api, this.#registry, this.#address));
40
+ }
35
41
  }
36
42
  exports.Contract = Contract;
@@ -1,7 +1,32 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.TypinkRegistry = void 0;
4
27
  const codecs_1 = require("@dedot/codecs");
28
+ const $ = __importStar(require("@dedot/shape"));
29
+ const utils_1 = require("@dedot/utils");
5
30
  const utils_js_1 = require("./utils.js");
6
31
  class TypinkRegistry extends codecs_1.TypeRegistry {
7
32
  #metadata;
@@ -12,5 +37,62 @@ class TypinkRegistry extends codecs_1.TypeRegistry {
12
37
  get metadata() {
13
38
  return this.#metadata;
14
39
  }
40
+ decodeEvent(eventRecord) {
41
+ const { version } = this.#metadata;
42
+ switch (version) {
43
+ case 5:
44
+ return this.#decodeEventV5(eventRecord);
45
+ case '4':
46
+ return this.#decodeEventV4(eventRecord);
47
+ default:
48
+ throw new utils_1.DedotError('Unsupported metadata version!');
49
+ }
50
+ }
51
+ #isContractEmittedEvent(eventRecord) {
52
+ // @ts-ignore
53
+ return eventRecord.pallet === 'Contracts' && eventRecord.palletEvent.name === 'ContractEmitted';
54
+ }
55
+ #decodeEventV4(eventRecord) {
56
+ (0, utils_1.assert)(this.#metadata.version === '4', 'Invalid metadata version!');
57
+ (0, utils_1.assert)(this.#isContractEmittedEvent(eventRecord.event), 'Event Record is not valid!');
58
+ const data = (0, utils_1.hexToU8a)(eventRecord.event.palletEvent.data.data);
59
+ const index = data.at(0);
60
+ (0, utils_1.assert)(index !== undefined, 'Unable to decode event index!');
61
+ const event = this.#metadata.spec.events[index];
62
+ (0, utils_1.assert)(event, `Event index not found: ${index.toString()}`);
63
+ return this.#tryDecodeEvent(event, data.subarray(1));
64
+ }
65
+ #decodeEventV5(eventRecord) {
66
+ (0, utils_1.assert)(this.#metadata.version === 5, 'Invalid metadata version!');
67
+ (0, utils_1.assert)(this.#isContractEmittedEvent(eventRecord.event), 'Event Record is not valid!');
68
+ const data = (0, utils_1.hexToU8a)(eventRecord.event.palletEvent.data.data);
69
+ const signatureTopic = eventRecord.topics.at(0);
70
+ let eventMeta;
71
+ if (signatureTopic) {
72
+ eventMeta = this.#metadata.spec.events.find((one) => one.signature_topic === signatureTopic);
73
+ }
74
+ // TODO: Handle multiple anonymous events
75
+ // If `event` does not exist, it means it's an anonymous event
76
+ // that does not contain a signature topic in the metadata.
77
+ if (!eventMeta) {
78
+ const potentialEvents = this.#metadata.spec.events.filter((one) => !one.signature_topic && one.args.filter((arg) => arg.indexed).length === eventRecord.topics.length);
79
+ (0, utils_1.assert)(potentialEvents.length === 1, 'Unable to determine event!');
80
+ eventMeta = potentialEvents[0];
81
+ }
82
+ return this.#tryDecodeEvent(eventMeta, data);
83
+ }
84
+ #tryDecodeEvent(eventMeta, raw) {
85
+ const { args, label } = eventMeta;
86
+ const eventCodecFrame = args.reduce((frame, arg) => {
87
+ const { label, type: { type }, } = arg;
88
+ const $codec = this.findCodec(type);
89
+ Object.assign(frame, { [(0, utils_1.stringCamelCase)(label)]: $codec });
90
+ return frame;
91
+ }, {});
92
+ const $eventCodec = $.Struct(eventCodecFrame);
93
+ const data = $eventCodec.decode(raw);
94
+ const name = (0, utils_1.stringPascalCase)(label);
95
+ return args.length ? { name, data } : { name };
96
+ }
15
97
  }
16
98
  exports.TypinkRegistry = TypinkRegistry;
package/cjs/errors.js ADDED
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isContractInstantiateLangError = exports.isContractInstantiateDispatchError = exports.isContractInstantiateExecutionError = exports.isContractLangError = exports.isContractDispatchError = exports.isContractExecutionError = exports.ContractLangError = exports.ContractDispatchError = exports.ContractExecutionError = exports.ContractInstantiateLangError = exports.ContractInstantiateDispatchError = exports.ContractInstantiateExecutionError = void 0;
4
+ const utils_1 = require("@dedot/utils");
5
+ class ContractInstantiateExecutionError extends utils_1.DedotError {
6
+ raw;
7
+ constructor(raw) {
8
+ super();
9
+ this.raw = raw;
10
+ }
11
+ }
12
+ exports.ContractInstantiateExecutionError = ContractInstantiateExecutionError;
13
+ class ContractInstantiateDispatchError extends ContractInstantiateExecutionError {
14
+ err;
15
+ constructor(err, raw) {
16
+ super(raw);
17
+ this.err = err;
18
+ }
19
+ }
20
+ exports.ContractInstantiateDispatchError = ContractInstantiateDispatchError;
21
+ /*
22
+ * LangError represents an error which comes from the smart contracting language itself
23
+ * Ref: https://use.ink/faq/migrating-from-ink-3-to-4#:~:text=Add%20support%20for,equivalent%20LangError.
24
+ */
25
+ class ContractInstantiateLangError extends ContractInstantiateExecutionError {
26
+ err;
27
+ constructor(err, raw) {
28
+ super(raw);
29
+ this.err = err;
30
+ }
31
+ }
32
+ exports.ContractInstantiateLangError = ContractInstantiateLangError;
33
+ class ContractExecutionError extends utils_1.DedotError {
34
+ raw;
35
+ constructor(raw) {
36
+ super();
37
+ this.raw = raw;
38
+ }
39
+ }
40
+ exports.ContractExecutionError = ContractExecutionError;
41
+ class ContractDispatchError extends ContractExecutionError {
42
+ err;
43
+ constructor(err, raw) {
44
+ super(raw);
45
+ this.err = err;
46
+ }
47
+ }
48
+ exports.ContractDispatchError = ContractDispatchError;
49
+ /*
50
+ * LangError represents an error which comes from the smart contracting language itself
51
+ * Ref: https://use.ink/faq/migrating-from-ink-3-to-4#:~:text=Add%20support%20for,equivalent%20LangError.
52
+ */
53
+ class ContractLangError extends ContractExecutionError {
54
+ err;
55
+ constructor(err, raw) {
56
+ super(raw);
57
+ this.err = err;
58
+ }
59
+ }
60
+ exports.ContractLangError = ContractLangError;
61
+ function isContractExecutionError(e) {
62
+ return e instanceof ContractExecutionError;
63
+ }
64
+ exports.isContractExecutionError = isContractExecutionError;
65
+ function isContractDispatchError(e) {
66
+ return e instanceof ContractDispatchError;
67
+ }
68
+ exports.isContractDispatchError = isContractDispatchError;
69
+ function isContractLangError(e) {
70
+ return e instanceof ContractLangError;
71
+ }
72
+ exports.isContractLangError = isContractLangError;
73
+ function isContractInstantiateExecutionError(e) {
74
+ return e instanceof ContractInstantiateExecutionError;
75
+ }
76
+ exports.isContractInstantiateExecutionError = isContractInstantiateExecutionError;
77
+ function isContractInstantiateDispatchError(e) {
78
+ return e instanceof ContractInstantiateDispatchError;
79
+ }
80
+ exports.isContractInstantiateDispatchError = isContractInstantiateDispatchError;
81
+ function isContractInstantiateLangError(e) {
82
+ return e instanceof ContractInstantiateLangError;
83
+ }
84
+ exports.isContractInstantiateLangError = isContractInstantiateLangError;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ConstructorQueryExecutor = void 0;
4
4
  const utils_1 = require("@dedot/utils");
5
+ const errors_js_1 = require("../errors.js");
5
6
  const utils_js_1 = require("../utils.js");
6
7
  const Executor_js_1 = require("./Executor.js");
7
8
  class ConstructorQueryExecutor extends Executor_js_1.Executor {
@@ -13,7 +14,7 @@ class ConstructorQueryExecutor extends Executor_js_1.Executor {
13
14
  doExecute(constructor) {
14
15
  const meta = this.#findConstructorMeta(constructor);
15
16
  (0, utils_1.assert)(meta, `Constructor message not found: ${constructor}`);
16
- const callFn = (...params) => {
17
+ const callFn = async (...params) => {
17
18
  const { args } = meta;
18
19
  (0, utils_1.assert)(params.length === args.length + 1, `Expected ${args.length + 1} arguments, got ${params.length}`);
19
20
  const callOptions = params[args.length];
@@ -23,10 +24,22 @@ class ConstructorQueryExecutor extends Executor_js_1.Executor {
23
24
  const formattedInputs = args.map((arg, index) => this.tryEncode(arg, params[index]));
24
25
  const bytes = (0, utils_1.u8aToHex)((0, utils_1.concatU8a)((0, utils_1.hexToU8a)(meta.selector), ...formattedInputs));
25
26
  const code = {
26
- tag: (0, utils_1.isWasm)(this.code) ? 'Upload' : 'Existing',
27
+ type: (0, utils_1.isWasm)(this.code) ? 'Upload' : 'Existing',
27
28
  value: this.code,
28
29
  };
29
- return this.api.call.contractsApi.instantiate(caller, value, gasLimit, storageDepositLimit, code, bytes, salt);
30
+ const raw = await this.api.call.contractsApi.instantiate(caller, value, gasLimit, storageDepositLimit, code, bytes, salt);
31
+ if (raw.result.isErr) {
32
+ throw new errors_js_1.ContractInstantiateDispatchError(raw.result.err, raw);
33
+ }
34
+ const data = this.tryDecode(meta, raw.result.value.result.data);
35
+ if (data.isErr) {
36
+ throw new errors_js_1.ContractInstantiateLangError(data.err, raw);
37
+ }
38
+ return {
39
+ raw,
40
+ data: data.value,
41
+ address: raw.result.value.accountId,
42
+ };
30
43
  };
31
44
  callFn.meta = meta;
32
45
  return callFn;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventExecutor = void 0;
4
+ const Executor_js_1 = require("./Executor.js");
5
+ const utils_1 = require("@dedot/utils");
6
+ class EventExecutor extends Executor_js_1.Executor {
7
+ doExecute(eventName) {
8
+ const eventMeta = this.#findEventMeta(eventName);
9
+ (0, utils_1.assert)(eventMeta, "Contract event metadata not found!");
10
+ const is = (event) => {
11
+ return event.name === eventName;
12
+ };
13
+ const as = (event) => {
14
+ return is(event) ? event : undefined;
15
+ };
16
+ return {
17
+ is,
18
+ as,
19
+ meta: eventMeta,
20
+ };
21
+ }
22
+ #findEventMeta(eventName) {
23
+ return this.registry.metadata.spec.events.find(one => (0, utils_1.stringPascalCase)(one.label) === eventName);
24
+ }
25
+ }
26
+ exports.EventExecutor = EventExecutor;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.QueryExecutor = void 0;
4
4
  const utils_1 = require("@dedot/utils");
5
+ const errors_js_1 = require("../errors.js");
5
6
  const utils_js_1 = require("../utils.js");
6
7
  const Executor_js_1 = require("./Executor.js");
7
8
  class QueryExecutor extends Executor_js_1.Executor {
@@ -17,17 +18,17 @@ class QueryExecutor extends Executor_js_1.Executor {
17
18
  const formattedInputs = args.map((arg, index) => this.tryEncode(arg, params[index]));
18
19
  const bytes = (0, utils_1.u8aToHex)((0, utils_1.concatU8a)((0, utils_1.hexToU8a)(meta.selector), ...formattedInputs));
19
20
  const raw = await this.api.call.contractsApi.call(caller, this.address, value, gasLimit, storageDepositLimit, bytes);
20
- return (raw.result.isOk
21
- ? {
22
- isOk: true,
23
- data: this.tryDecode(meta, raw.result.value.data),
24
- raw,
25
- }
26
- : {
27
- isOk: false,
28
- err: raw.result.err,
29
- raw,
30
- });
21
+ if (raw.result.isErr) {
22
+ throw new errors_js_1.ContractDispatchError(raw.result.err, raw);
23
+ }
24
+ const data = this.tryDecode(meta, raw.result.value.data);
25
+ if (data.isErr) {
26
+ throw new errors_js_1.ContractLangError(data.err, raw);
27
+ }
28
+ return {
29
+ data: data.value,
30
+ raw,
31
+ };
31
32
  };
32
33
  callFn.meta = meta;
33
34
  return callFn;
@@ -18,3 +18,4 @@ __exportStar(require("./Executor.js"), exports);
18
18
  __exportStar(require("./TxExecutor.js"), exports);
19
19
  __exportStar(require("./QueryExecutor.js"), exports);
20
20
  __exportStar(require("./ConstructorTxExecutor.js"), exports);
21
+ __exportStar(require("./EventExecutor.js"), exports);
package/cjs/index.js CHANGED
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./utils.js"), exports);
18
+ __exportStar(require("./errors.js"), exports);
18
19
  __exportStar(require("./executor/index.js"), exports);
19
20
  __exportStar(require("./types/index.js"), exports);
20
21
  __exportStar(require("./TypinkRegistry.js"), exports);
package/cjs/utils.js CHANGED
@@ -6,7 +6,7 @@ const extractContractTypes = (contractMetadata) => {
6
6
  const { types } = contractMetadata;
7
7
  return types.map(({ type, id }) => ({
8
8
  id,
9
- type: (0, exports.normalizeContractTypeDef)(type.def),
9
+ typeDef: (0, exports.normalizeContractTypeDef)(type.def),
10
10
  params: [],
11
11
  path: type?.path || [],
12
12
  docs: [],
@@ -14,10 +14,10 @@ const extractContractTypes = (contractMetadata) => {
14
14
  };
15
15
  exports.extractContractTypes = extractContractTypes;
16
16
  const normalizeContractTypeDef = (def) => {
17
- let tag;
17
+ let type;
18
18
  let value;
19
19
  if (def.variant) {
20
- tag = 'Enum';
20
+ type = 'Enum';
21
21
  value = {
22
22
  members: def.variant.variants?.map((variant) => ({
23
23
  fields: variant.fields?.map((fields) => ({ typeId: fields.type, typeName: fields.typeName })) || [],
@@ -27,19 +27,19 @@ const normalizeContractTypeDef = (def) => {
27
27
  };
28
28
  }
29
29
  else if (def.tuple) {
30
- tag = 'Tuple';
30
+ type = 'Tuple';
31
31
  value = {
32
32
  fields: def.tuple,
33
33
  };
34
34
  }
35
35
  else if (def.sequence) {
36
- tag = 'Sequence';
36
+ type = 'Sequence';
37
37
  value = {
38
38
  typeParam: def.sequence.type,
39
39
  };
40
40
  }
41
41
  else if (def.composite) {
42
- tag = 'Struct';
42
+ type = 'Struct';
43
43
  value = {
44
44
  fields: def.composite.fields.map((one) => ({
45
45
  typeId: one.type,
@@ -49,13 +49,13 @@ const normalizeContractTypeDef = (def) => {
49
49
  };
50
50
  }
51
51
  else if (def.primitive) {
52
- tag = 'Primitive';
52
+ type = 'Primitive';
53
53
  value = {
54
54
  kind: def.primitive,
55
55
  };
56
56
  }
57
57
  else if (def.array) {
58
- tag = 'SizedVec';
58
+ type = 'SizedVec';
59
59
  value = {
60
60
  len: def.array.len,
61
61
  typeParam: def.array.type,
@@ -64,11 +64,11 @@ const normalizeContractTypeDef = (def) => {
64
64
  else {
65
65
  throw Error(`Invalid contract type def: ${JSON.stringify(def)}`);
66
66
  }
67
- return { tag, value };
67
+ return { type, value };
68
68
  };
69
69
  exports.normalizeContractTypeDef = normalizeContractTypeDef;
70
70
  const UNSUPPORTED_VERSIONS = ['V3', 'V2', 'V1'];
71
- const SUPPORTED_VERSIONS = ['5', '4'];
71
+ const SUPPORTED_VERSIONS = [5, '4'];
72
72
  const parseRawMetadata = (rawMetadata) => {
73
73
  const metadata = JSON.parse(rawMetadata);
74
74
  // This is for V1, V2, V3
package/errors.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ import { DispatchError } from '@dedot/codecs';
2
+ import { DedotError } from '@dedot/utils';
3
+ import { ContractCallResult, ContractInstantiateResult, GenericContractApi } from './types';
4
+ export declare class ContractInstantiateExecutionError<ContractApi extends GenericContractApi = GenericContractApi> extends DedotError {
5
+ raw: ContractInstantiateResult<ContractApi['types']['ChainApi']>;
6
+ constructor(raw: ContractInstantiateResult<ContractApi['types']['ChainApi']>);
7
+ }
8
+ export declare class ContractInstantiateDispatchError<ContractApi extends GenericContractApi = GenericContractApi> extends ContractInstantiateExecutionError<ContractApi> {
9
+ err: DispatchError;
10
+ constructor(err: DispatchError, raw: ContractInstantiateResult<ContractApi['types']['ChainApi']>);
11
+ }
12
+ export declare class ContractInstantiateLangError<ContractApi extends GenericContractApi = GenericContractApi> extends ContractInstantiateExecutionError<ContractApi> {
13
+ err: ContractApi['types']['LangError'];
14
+ constructor(err: ContractApi['types']['LangError'], raw: ContractInstantiateResult<ContractApi['types']['ChainApi']>);
15
+ }
16
+ export declare class ContractExecutionError<ContractApi extends GenericContractApi = GenericContractApi> extends DedotError {
17
+ raw: ContractCallResult<ContractApi['types']['ChainApi']>;
18
+ constructor(raw: ContractCallResult<ContractApi['types']['ChainApi']>);
19
+ }
20
+ export declare class ContractDispatchError<ContractApi extends GenericContractApi = GenericContractApi> extends ContractExecutionError<ContractApi> {
21
+ err: DispatchError;
22
+ constructor(err: DispatchError, raw: ContractCallResult<ContractApi['types']['ChainApi']>);
23
+ }
24
+ export declare class ContractLangError<ContractApi extends GenericContractApi = GenericContractApi> extends ContractExecutionError<ContractApi> {
25
+ err: ContractApi['types']['LangError'];
26
+ constructor(err: ContractApi['types']['LangError'], raw: ContractCallResult<ContractApi['types']['ChainApi']>);
27
+ }
28
+ export declare function isContractExecutionError<ContractApi extends GenericContractApi = GenericContractApi>(e: Error): e is ContractExecutionError<ContractApi>;
29
+ export declare function isContractDispatchError<ContractApi extends GenericContractApi = GenericContractApi>(e: Error): e is ContractDispatchError<ContractApi>;
30
+ export declare function isContractLangError<ContractApi extends GenericContractApi = GenericContractApi>(e: Error): e is ContractLangError<ContractApi>;
31
+ export declare function isContractInstantiateExecutionError<ContractApi extends GenericContractApi = GenericContractApi>(e: Error): e is ContractInstantiateExecutionError<ContractApi>;
32
+ export declare function isContractInstantiateDispatchError<ContractApi extends GenericContractApi = GenericContractApi>(e: Error): e is ContractInstantiateDispatchError<ContractApi>;
33
+ export declare function isContractInstantiateLangError<ContractApi extends GenericContractApi = GenericContractApi>(e: Error): e is ContractInstantiateLangError<ContractApi>;
package/errors.js ADDED
@@ -0,0 +1,69 @@
1
+ import { DedotError } from '@dedot/utils';
2
+ export class ContractInstantiateExecutionError extends DedotError {
3
+ raw;
4
+ constructor(raw) {
5
+ super();
6
+ this.raw = raw;
7
+ }
8
+ }
9
+ export class ContractInstantiateDispatchError extends ContractInstantiateExecutionError {
10
+ err;
11
+ constructor(err, raw) {
12
+ super(raw);
13
+ this.err = err;
14
+ }
15
+ }
16
+ /*
17
+ * LangError represents an error which comes from the smart contracting language itself
18
+ * Ref: https://use.ink/faq/migrating-from-ink-3-to-4#:~:text=Add%20support%20for,equivalent%20LangError.
19
+ */
20
+ export class ContractInstantiateLangError extends ContractInstantiateExecutionError {
21
+ err;
22
+ constructor(err, raw) {
23
+ super(raw);
24
+ this.err = err;
25
+ }
26
+ }
27
+ export class ContractExecutionError extends DedotError {
28
+ raw;
29
+ constructor(raw) {
30
+ super();
31
+ this.raw = raw;
32
+ }
33
+ }
34
+ export class ContractDispatchError extends ContractExecutionError {
35
+ err;
36
+ constructor(err, raw) {
37
+ super(raw);
38
+ this.err = err;
39
+ }
40
+ }
41
+ /*
42
+ * LangError represents an error which comes from the smart contracting language itself
43
+ * Ref: https://use.ink/faq/migrating-from-ink-3-to-4#:~:text=Add%20support%20for,equivalent%20LangError.
44
+ */
45
+ export class ContractLangError extends ContractExecutionError {
46
+ err;
47
+ constructor(err, raw) {
48
+ super(raw);
49
+ this.err = err;
50
+ }
51
+ }
52
+ export function isContractExecutionError(e) {
53
+ return e instanceof ContractExecutionError;
54
+ }
55
+ export function isContractDispatchError(e) {
56
+ return e instanceof ContractDispatchError;
57
+ }
58
+ export function isContractLangError(e) {
59
+ return e instanceof ContractLangError;
60
+ }
61
+ export function isContractInstantiateExecutionError(e) {
62
+ return e instanceof ContractInstantiateExecutionError;
63
+ }
64
+ export function isContractInstantiateDispatchError(e) {
65
+ return e instanceof ContractInstantiateDispatchError;
66
+ }
67
+ export function isContractInstantiateLangError(e) {
68
+ return e instanceof ContractInstantiateLangError;
69
+ }
@@ -1,4 +1,5 @@
1
1
  import { assert, concatU8a, hexToU8a, isWasm, u8aToHex } from '@dedot/utils';
2
+ import { ContractInstantiateDispatchError, ContractInstantiateLangError } from '../errors.js';
2
3
  import { normalizeLabel } from '../utils.js';
3
4
  import { Executor } from './Executor.js';
4
5
  export class ConstructorQueryExecutor extends Executor {
@@ -10,7 +11,7 @@ export class ConstructorQueryExecutor extends Executor {
10
11
  doExecute(constructor) {
11
12
  const meta = this.#findConstructorMeta(constructor);
12
13
  assert(meta, `Constructor message not found: ${constructor}`);
13
- const callFn = (...params) => {
14
+ const callFn = async (...params) => {
14
15
  const { args } = meta;
15
16
  assert(params.length === args.length + 1, `Expected ${args.length + 1} arguments, got ${params.length}`);
16
17
  const callOptions = params[args.length];
@@ -20,10 +21,22 @@ export class ConstructorQueryExecutor extends Executor {
20
21
  const formattedInputs = args.map((arg, index) => this.tryEncode(arg, params[index]));
21
22
  const bytes = u8aToHex(concatU8a(hexToU8a(meta.selector), ...formattedInputs));
22
23
  const code = {
23
- tag: isWasm(this.code) ? 'Upload' : 'Existing',
24
+ type: isWasm(this.code) ? 'Upload' : 'Existing',
24
25
  value: this.code,
25
26
  };
26
- return this.api.call.contractsApi.instantiate(caller, value, gasLimit, storageDepositLimit, code, bytes, salt);
27
+ const raw = await this.api.call.contractsApi.instantiate(caller, value, gasLimit, storageDepositLimit, code, bytes, salt);
28
+ if (raw.result.isErr) {
29
+ throw new ContractInstantiateDispatchError(raw.result.err, raw);
30
+ }
31
+ const data = this.tryDecode(meta, raw.result.value.result.data);
32
+ if (data.isErr) {
33
+ throw new ContractInstantiateLangError(data.err, raw);
34
+ }
35
+ return {
36
+ raw,
37
+ data: data.value,
38
+ address: raw.result.value.accountId,
39
+ };
27
40
  };
28
41
  callFn.meta = meta;
29
42
  return callFn;
@@ -0,0 +1,7 @@
1
+ import { GenericSubstrateApi } from "@dedot/types";
2
+ import { Executor } from "./Executor.js";
3
+ import { GenericContractEvent } from "../types/index.js";
4
+ export declare class EventExecutor<ChainApi extends GenericSubstrateApi> extends Executor<ChainApi> {
5
+ #private;
6
+ doExecute(eventName: string): GenericContractEvent;
7
+ }
@@ -0,0 +1,22 @@
1
+ import { Executor } from "./Executor.js";
2
+ import { assert, stringPascalCase } from "@dedot/utils";
3
+ export class EventExecutor extends Executor {
4
+ doExecute(eventName) {
5
+ const eventMeta = this.#findEventMeta(eventName);
6
+ assert(eventMeta, "Contract event metadata not found!");
7
+ const is = (event) => {
8
+ return event.name === eventName;
9
+ };
10
+ const as = (event) => {
11
+ return is(event) ? event : undefined;
12
+ };
13
+ return {
14
+ is,
15
+ as,
16
+ meta: eventMeta,
17
+ };
18
+ }
19
+ #findEventMeta(eventName) {
20
+ return this.registry.metadata.spec.events.find(one => stringPascalCase(one.label) === eventName);
21
+ }
22
+ }
@@ -1,4 +1,5 @@
1
1
  import { assert, concatU8a, hexToU8a, u8aToHex } from '@dedot/utils';
2
+ import { ContractDispatchError, ContractLangError } from '../errors.js';
2
3
  import { normalizeLabel } from '../utils.js';
3
4
  import { Executor } from './Executor.js';
4
5
  export class QueryExecutor extends Executor {
@@ -14,17 +15,17 @@ export class QueryExecutor extends Executor {
14
15
  const formattedInputs = args.map((arg, index) => this.tryEncode(arg, params[index]));
15
16
  const bytes = u8aToHex(concatU8a(hexToU8a(meta.selector), ...formattedInputs));
16
17
  const raw = await this.api.call.contractsApi.call(caller, this.address, value, gasLimit, storageDepositLimit, bytes);
17
- return (raw.result.isOk
18
- ? {
19
- isOk: true,
20
- data: this.tryDecode(meta, raw.result.value.data),
21
- raw,
22
- }
23
- : {
24
- isOk: false,
25
- err: raw.result.err,
26
- raw,
27
- });
18
+ if (raw.result.isErr) {
19
+ throw new ContractDispatchError(raw.result.err, raw);
20
+ }
21
+ const data = this.tryDecode(meta, raw.result.value.data);
22
+ if (data.isErr) {
23
+ throw new ContractLangError(data.err, raw);
24
+ }
25
+ return {
26
+ data: data.value,
27
+ raw,
28
+ };
28
29
  };
29
30
  callFn.meta = meta;
30
31
  return callFn;
@@ -2,3 +2,4 @@ export * from './Executor.js';
2
2
  export * from './TxExecutor.js';
3
3
  export * from './QueryExecutor.js';
4
4
  export * from './ConstructorTxExecutor.js';
5
+ export * from './EventExecutor.js';
package/executor/index.js CHANGED
@@ -2,3 +2,4 @@ export * from './Executor.js';
2
2
  export * from './TxExecutor.js';
3
3
  export * from './QueryExecutor.js';
4
4
  export * from './ConstructorTxExecutor.js';
5
+ export * from './EventExecutor.js';
package/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './utils.js';
2
+ export * from './errors.js';
2
3
  export * from './executor/index.js';
3
4
  export * from './types/index.js';
4
5
  export * from './TypinkRegistry.js';
package/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './utils.js';
2
+ export * from './errors.js';
2
3
  export * from './executor/index.js';
3
4
  export * from './types/index.js';
4
5
  export * from './TypinkRegistry.js';
package/package.json CHANGED
@@ -1,8 +1,14 @@
1
1
  {
2
2
  "name": "@dedot/contracts",
3
- "version": "0.0.1-next.cfee875e.21+cfee875",
3
+ "version": "0.0.1-next.d731b849.13+d731b84",
4
4
  "description": "Delightful ink! Contract APIs",
5
5
  "author": "Tung Vu <tung@coongcrafts.io>",
6
+ "homepage": "https://github.com/dedotdev/dedot/tree/main/packages/contracts",
7
+ "repository": {
8
+ "directory": "packages/contracts",
9
+ "type": "git",
10
+ "url": "https://github.com/dedotdev/dedot.git"
11
+ },
6
12
  "main": "./cjs/index.js",
7
13
  "sideEffects": false,
8
14
  "type": "module",
@@ -12,17 +18,17 @@
12
18
  "test": "vitest --watch=false"
13
19
  },
14
20
  "dependencies": {
15
- "@dedot/api": "0.0.1-next.cfee875e.21+cfee875",
16
- "@dedot/codecs": "0.0.1-next.cfee875e.21+cfee875",
17
- "@dedot/types": "0.0.1-next.cfee875e.21+cfee875",
18
- "@dedot/utils": "0.0.1-next.cfee875e.21+cfee875"
21
+ "@dedot/api": "0.0.1-next.d731b849.13+d731b84",
22
+ "@dedot/codecs": "0.0.1-next.d731b849.13+d731b84",
23
+ "@dedot/types": "0.0.1-next.d731b849.13+d731b84",
24
+ "@dedot/utils": "0.0.1-next.d731b849.13+d731b84"
19
25
  },
20
26
  "publishConfig": {
21
27
  "access": "public",
22
28
  "directory": "dist"
23
29
  },
24
30
  "license": "Apache-2.0",
25
- "gitHead": "cfee875eafba07e0fbb8a72556ca549a62ddceff",
31
+ "gitHead": "d731b849f66c92ca6fa69894e45792c49381d407",
26
32
  "module": "./index.js",
27
33
  "types": "./index.d.ts",
28
34
  "exports": {
package/types/index.d.ts CHANGED
@@ -1,19 +1,20 @@
1
1
  import { SubstrateApi } from '@dedot/api/chaintypes';
2
- import { AccountId32Like, BytesLike, DispatchError, Weight } from '@dedot/codecs';
2
+ import { AccountId32, AccountId32Like, BytesLike, Weight } from '@dedot/codecs';
3
3
  import { AnyFunc, AsyncMethod, GenericSubstrateApi, RpcVersion, VersionedGenericSubstrateApi } from '@dedot/types';
4
- import { ContractConstructorMessage, ContractMessage } from './shared.js';
5
- import { ContractMetadataV4 } from './v4.js';
6
- import { ContractMetadataV5 } from './v5.js';
4
+ import { ContractCallMessage, ContractConstructorMessage } from './shared.js';
5
+ import { ContractEventV4, ContractMetadataV4 } from './v4.js';
6
+ import { ContractEventV5, ContractMetadataV5 } from './v5.js';
7
7
  export * from './shared.js';
8
- export type GenericContractCallResult<DecodedData, ContractResult> = ({
9
- isOk: true;
8
+ export type ContractEventMeta = ContractEventV4 | ContractEventV5;
9
+ export type GenericContractCallResult<DecodedData = any, ContractResult = any> = {
10
10
  data: DecodedData;
11
- } | {
12
- isOk: false;
13
- err: DispatchError;
14
- }) & {
15
11
  raw: ContractResult;
16
12
  };
13
+ export type GenericConstructorCallResult<DecodedData = any, ContractResult = any> = {
14
+ data: DecodedData;
15
+ raw: ContractResult;
16
+ address: AccountId32;
17
+ };
17
18
  export type ContractCallResult<ChainApi extends GenericSubstrateApi> = Awaited<ReturnType<ChainApi['call']['contractsApi']['call']>>;
18
19
  export type ContractInstantiateResult<ChainApi extends GenericSubstrateApi> = Awaited<ReturnType<ChainApi['call']['contractsApi']['instantiate']>>;
19
20
  export type ContractSubmittableExtrinsic<ChainApi extends GenericSubstrateApi> = ReturnType<ChainApi['tx']['contracts']['call']>;
@@ -41,12 +42,12 @@ export type ContractTxOptions = CallOptions & {
41
42
  gasLimit: Weight;
42
43
  };
43
44
  export type GenericContractQueryCall<ChainApi extends GenericSubstrateApi, F extends AsyncMethod = (...args: any[]) => Promise<GenericContractCallResult<any, ContractCallResult<ChainApi>>>> = F & {
44
- meta: ContractMessage;
45
+ meta: ContractCallMessage;
45
46
  };
46
47
  export type GenericContractTxCall<ChainApi extends GenericSubstrateApi, F extends AnyFunc = (...args: any[]) => ContractSubmittableExtrinsic<ChainApi>> = F & {
47
- meta: ContractMessage;
48
+ meta: ContractCallMessage;
48
49
  };
49
- export type GenericConstructorQueryCall<ChainApi extends GenericSubstrateApi, F extends AsyncMethod = (...args: any[]) => Promise<ContractInstantiateResult<ChainApi>>> = F & {
50
+ export type GenericConstructorQueryCall<ChainApi extends GenericSubstrateApi, F extends AsyncMethod = (...args: any[]) => Promise<GenericConstructorCallResult<any, ContractInstantiateResult<ChainApi>>>> = F & {
50
51
  meta: ContractConstructorMessage;
51
52
  };
52
53
  export type GenericConstructorTxCall<ChainApi extends GenericSubstrateApi, F extends AnyFunc = (...args: any[]) => GenericInstantiateSubmittableExtrinsic<ChainApi>> = F & {
@@ -64,9 +65,29 @@ export interface GenericConstructorQuery<ChainApi extends GenericSubstrateApi> {
64
65
  export interface GenericConstructorTx<ChainApi extends GenericSubstrateApi> {
65
66
  [method: string]: GenericConstructorTxCall<ChainApi>;
66
67
  }
67
- export interface GenericContractApi<ChainApi extends VersionedGenericSubstrateApi = SubstrateApi> {
68
- query: GenericContractQuery<ChainApi[RpcVersion]>;
69
- tx: GenericContractTx<ChainApi[RpcVersion]>;
70
- constructorQuery: GenericConstructorQuery<ChainApi[RpcVersion]>;
71
- constructorTx: GenericConstructorTx<ChainApi[RpcVersion]>;
68
+ export type ContractEvent<EventName extends string = string, Data extends any = any> = Data extends undefined ? {
69
+ name: EventName;
70
+ } : {
71
+ name: EventName;
72
+ data: Data;
73
+ };
74
+ export interface GenericContractEvent<EventName extends string = string, Data extends any = any> {
75
+ is: (event: ContractEvent) => event is ContractEvent<EventName, Data>;
76
+ as: (event: ContractEvent) => ContractEvent<EventName, Data> | undefined;
77
+ meta: ContractEventMeta;
78
+ }
79
+ export interface GenericContractEvents<_ extends GenericSubstrateApi> {
80
+ [event: string]: GenericContractEvent;
81
+ }
82
+ export type GenericInkLangError = 'CouldNotReadInput' | any;
83
+ export interface GenericContractApi<Rv extends RpcVersion = RpcVersion, ChainApi extends VersionedGenericSubstrateApi = SubstrateApi> {
84
+ query: GenericContractQuery<ChainApi[Rv]>;
85
+ tx: GenericContractTx<ChainApi[Rv]>;
86
+ constructorQuery: GenericConstructorQuery<ChainApi[Rv]>;
87
+ constructorTx: GenericConstructorTx<ChainApi[Rv]>;
88
+ events: GenericContractEvents<ChainApi[Rv]>;
89
+ types: {
90
+ LangError: GenericInkLangError;
91
+ ChainApi: ChainApi[Rv];
92
+ };
72
93
  }
package/types/shared.d.ts CHANGED
@@ -28,7 +28,7 @@ export interface ContractTypeInfo {
28
28
  displayName: string[];
29
29
  type: number;
30
30
  }
31
- export interface Message {
31
+ export interface ContractMessage {
32
32
  args: ContractMessageArg[];
33
33
  default: boolean;
34
34
  docs: string[];
@@ -37,9 +37,9 @@ export interface Message {
37
37
  returnType: ContractTypeInfo;
38
38
  selector: string;
39
39
  }
40
- export interface ContractConstructorMessage extends Message {
40
+ export interface ContractConstructorMessage extends ContractMessage {
41
41
  }
42
- export interface ContractMessage extends Message {
42
+ export interface ContractCallMessage extends ContractMessage {
43
43
  mutates: boolean;
44
44
  }
45
45
  export interface ContractType {
@@ -98,3 +98,7 @@ export interface ContractStorage {
98
98
  root_key: string;
99
99
  };
100
100
  }
101
+ export interface ContractEventArg extends ContractMessageArg {
102
+ docs: string[];
103
+ indexed: boolean;
104
+ }
package/types/v4.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ContractConstructorMessage, ContractInformation, ContractMessage, ContractSource, ContractStorage, ContractType, ContractTypeInfo } from './shared.js';
1
+ import { ContractConstructorMessage, ContractEventArg, ContractInformation, ContractCallMessage, ContractSource, ContractStorage, ContractType, ContractTypeInfo } from './shared.js';
2
2
  export interface ContractMetadataV4 {
3
3
  source: ContractSource;
4
4
  contract: ContractInformation;
@@ -13,12 +13,12 @@ export interface ContractSpecV4 {
13
13
  environment: ContractEnvironmentV4;
14
14
  events: ContractEventV4[];
15
15
  lang_error: ContractTypeInfo;
16
- messages: ContractMessage[];
16
+ messages: ContractCallMessage[];
17
17
  }
18
18
  export interface ContractEventV4 {
19
- args: unknown[];
19
+ args: ContractEventArg[];
20
20
  docs: string[];
21
- label: string[];
21
+ label: string;
22
22
  }
23
23
  export interface ContractEnvironmentV4 {
24
24
  accountId: ContractTypeInfo;
package/types/v5.d.ts CHANGED
@@ -6,7 +6,7 @@ export interface ContractMetadataV5 {
6
6
  spec: ContractSpecV5;
7
7
  storage: ContractStorage;
8
8
  types: ContractType[];
9
- version: '5';
9
+ version: 5;
10
10
  }
11
11
  export interface ContractSpecV5 extends ContractSpecV4 {
12
12
  environment: ContractEnvironmentV5;
@@ -14,7 +14,7 @@ export interface ContractSpecV5 extends ContractSpecV4 {
14
14
  }
15
15
  export interface ContractEventV5 extends ContractEventV4 {
16
16
  module_path: string;
17
- signature_topic: string;
17
+ signature_topic?: string | null;
18
18
  }
19
19
  export interface ContractEnvironmentV5 extends ContractEnvironmentV4 {
20
20
  staticBufferSize: number;
package/utils.js CHANGED
@@ -3,17 +3,17 @@ export const extractContractTypes = (contractMetadata) => {
3
3
  const { types } = contractMetadata;
4
4
  return types.map(({ type, id }) => ({
5
5
  id,
6
- type: normalizeContractTypeDef(type.def),
6
+ typeDef: normalizeContractTypeDef(type.def),
7
7
  params: [],
8
8
  path: type?.path || [],
9
9
  docs: [],
10
10
  }));
11
11
  };
12
12
  export const normalizeContractTypeDef = (def) => {
13
- let tag;
13
+ let type;
14
14
  let value;
15
15
  if (def.variant) {
16
- tag = 'Enum';
16
+ type = 'Enum';
17
17
  value = {
18
18
  members: def.variant.variants?.map((variant) => ({
19
19
  fields: variant.fields?.map((fields) => ({ typeId: fields.type, typeName: fields.typeName })) || [],
@@ -23,19 +23,19 @@ export const normalizeContractTypeDef = (def) => {
23
23
  };
24
24
  }
25
25
  else if (def.tuple) {
26
- tag = 'Tuple';
26
+ type = 'Tuple';
27
27
  value = {
28
28
  fields: def.tuple,
29
29
  };
30
30
  }
31
31
  else if (def.sequence) {
32
- tag = 'Sequence';
32
+ type = 'Sequence';
33
33
  value = {
34
34
  typeParam: def.sequence.type,
35
35
  };
36
36
  }
37
37
  else if (def.composite) {
38
- tag = 'Struct';
38
+ type = 'Struct';
39
39
  value = {
40
40
  fields: def.composite.fields.map((one) => ({
41
41
  typeId: one.type,
@@ -45,13 +45,13 @@ export const normalizeContractTypeDef = (def) => {
45
45
  };
46
46
  }
47
47
  else if (def.primitive) {
48
- tag = 'Primitive';
48
+ type = 'Primitive';
49
49
  value = {
50
50
  kind: def.primitive,
51
51
  };
52
52
  }
53
53
  else if (def.array) {
54
- tag = 'SizedVec';
54
+ type = 'SizedVec';
55
55
  value = {
56
56
  len: def.array.len,
57
57
  typeParam: def.array.type,
@@ -60,10 +60,10 @@ export const normalizeContractTypeDef = (def) => {
60
60
  else {
61
61
  throw Error(`Invalid contract type def: ${JSON.stringify(def)}`);
62
62
  }
63
- return { tag, value };
63
+ return { type, value };
64
64
  };
65
65
  const UNSUPPORTED_VERSIONS = ['V3', 'V2', 'V1'];
66
- const SUPPORTED_VERSIONS = ['5', '4'];
66
+ const SUPPORTED_VERSIONS = [5, '4'];
67
67
  export const parseRawMetadata = (rawMetadata) => {
68
68
  const metadata = JSON.parse(rawMetadata);
69
69
  // This is for V1, V2, V3