@polkadot-api/ink-contracts 0.5.2-canary.f1c6573 → 0.6.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.
@@ -113,4 +113,4 @@ const first = (codecs) => createCodec(
113
113
  );
114
114
 
115
115
  export { getInkDynamicBuilder };
116
- //# sourceMappingURL=dynamic-builders.mjs.map
116
+ //# sourceMappingURL=dynamic-builders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-builders.js","sources":["../src/dynamic-builders.ts"],"sourcesContent":["import { getLookupCodecBuilder } from \"@polkadot-api/metadata-builders\"\nimport { Binary, Variant } from \"@polkadot-api/substrate-bindings\"\nimport {\n _void,\n Bytes,\n Codec,\n CodecType,\n createCodec,\n enhanceCodec,\n StringRecord,\n Struct,\n Tuple,\n} from \"@polkadot-api/substrate-bindings\"\nimport { InkMetadataLookup } from \"./get-lookup\"\nimport {\n EventParamSpec,\n EventSpecV5,\n MessageParamSpec,\n TypeSpec,\n} from \"./metadata-types\"\n\nexport const getInkDynamicBuilder = (metadataLookup: InkMetadataLookup) => {\n const { metadata } = metadataLookup\n\n const buildDefinition = getLookupCodecBuilder(metadataLookup)\n\n const buildStorage = (name = \"\") => {\n const storageEntry = metadataLookup.storage[name]\n if (!storageEntry)\n throw new Error(`Storage entry ${name ? name : \"{root}\"} not found`)\n\n const keyCodec =\n storageEntry.key == null ? _void : buildDefinition(storageEntry.key)\n return {\n key: prependBytes(keyCodec, storageEntry.keyPrefix),\n value: buildDefinition(storageEntry.typeId),\n }\n }\n\n const buildCallable = (callable: {\n selector: string\n args: Array<MessageParamSpec>\n returnType: TypeSpec\n }) => {\n const argsCodec = Struct(\n Object.fromEntries(\n callable.args.map((param) => [\n param.label,\n buildDefinition(param.type.type),\n ]),\n ) as StringRecord<Codec<any>>,\n )\n\n return {\n call: prependBytes(argsCodec, callable.selector),\n value: buildDefinition(callable.returnType.type),\n }\n }\n\n const buildConstructor = (label: string) => {\n const constr = metadata.spec.constructors.find((c) => c.label === label)\n if (!constr) {\n throw new Error(`Constructor ${label} not found`)\n }\n\n return buildCallable(constr)\n }\n\n const buildMessage = (label: string) => {\n const message = metadata.spec.messages.find((c) => c.label === label)\n if (!message) {\n throw new Error(`Message ${label} not found`)\n }\n\n return buildCallable(message)\n }\n\n const buildEventCodec = (event: { args: EventParamSpec[] }) =>\n Struct(\n Object.fromEntries(\n event.args.map((param) => [\n param.label,\n buildDefinition(param.type.type),\n ]),\n ) as StringRecord<Codec<any>>,\n )\n\n const buildEvent = (signatureTopic: string | undefined) => {\n const events = metadata.spec.events as EventSpecV5[]\n\n const withType = <T>(codec: Codec<T>, type: string) =>\n enhanceCodec<T, { type: string; value: T }>(\n codec,\n (evt) => evt.value,\n (value) => ({ type, value }),\n )\n\n if (signatureTopic) {\n const event = events.find((evt) => evt.signature_topic === signatureTopic)\n return event ? withType(buildEventCodec(event), event.label) : null\n }\n\n const candidates = events.filter(\n (evt) => evt.signature_topic === signatureTopic,\n )\n return candidates.length\n ? first(candidates.map((c) => withType(buildEventCodec(c), c.label)))\n : null\n }\n\n const buildEvents = () =>\n Variant(\n Object.fromEntries(\n metadata.spec.events.map((evt) => [evt.label, buildEventCodec(evt)]),\n ) as unknown as StringRecord<Codec<any>>,\n )\n\n return {\n buildConstructor,\n buildMessage,\n buildStorage,\n buildEvents,\n buildEvent,\n }\n}\n\nexport type InkDynamicBuilder = ReturnType<typeof getInkDynamicBuilder>\n\nconst prependBytes = <T>(codec: Codec<T>, hex: string) => {\n const bytes = Binary.fromHex(hex)\n const wrappedCodec = Tuple(Bytes(bytes.length), codec)\n return enhanceCodec(\n wrappedCodec,\n (value: CodecType<typeof codec>): CodecType<typeof wrappedCodec> => [\n bytes,\n value,\n ],\n ([, value]) => value,\n )\n}\n\nconst first = <T>(codecs: Codec<T>[]) =>\n createCodec<T>(\n (x) => {\n for (const codec of codecs) {\n try {\n codec.enc(x)\n } catch (_) {}\n }\n throw new Error(\"Unable to encode\")\n },\n (x) => {\n for (const codec of codecs) {\n try {\n codec.dec(x)\n } catch (_) {}\n }\n throw new Error(\"Unable to decode\")\n },\n )\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { denormalizeLookup } from '@polkadot-api/metadata-builders';
2
2
  import { v14Lookup, Binary } from '@polkadot-api/substrate-bindings';
3
3
  import { toHex } from '@polkadot-api/utils';
4
- import { pjsTypes } from './metadata-pjs-types.mjs';
4
+ import { pjsTypes } from './metadata-pjs-types.js';
5
5
 
6
6
  const getInkLookup = (metadata) => {
7
7
  const encoded = pjsTypes.enc(metadata.types);
@@ -129,4 +129,4 @@ function getStorageLayout(metadata, lookup) {
129
129
  }
130
130
 
131
131
  export { getInkLookup };
132
- //# sourceMappingURL=get-lookup.mjs.map
132
+ //# sourceMappingURL=get-lookup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-lookup.js","sources":["../src/get-lookup.ts"],"sourcesContent":["import { denormalizeLookup, LookupEntry } from \"@polkadot-api/metadata-builders\"\nimport { Binary, V14Lookup, v14Lookup } from \"@polkadot-api/substrate-bindings\"\nimport { toHex } from \"@polkadot-api/utils\"\nimport { pjsTypes } from \"./metadata-pjs-types\"\nimport { InkMetadata, Layout } from \"./metadata-types\"\n\nexport interface InkMetadataLookup {\n (id: number): LookupEntry\n metadata: InkMetadata\n storage: StorageLayout\n}\n\nexport interface StorageEntryPoint {\n keyPrefix: string\n key: number | null\n typeId: number\n}\n\nexport type StorageLayout = Record<string, StorageEntryPoint>\n\nexport const getInkLookup = (metadata: InkMetadata): InkMetadataLookup => {\n // We can reuse dynamic-builder's lookup if we encode and re-decode the type\n // into V14Lookup, because both v14 metadata lookup and ink types use scale-info\n const encoded = pjsTypes.enc(metadata.types)\n const decoded = v14Lookup.dec(encoded)\n\n // Signal the lookup the AccountId type\n const accountTypeId = metadata.spec.environment.accountId.type\n const accountIdEntry = decoded.find((e) => e.id === accountTypeId)\n if (accountIdEntry) {\n accountIdEntry.path = [\"AccountId32\"]\n }\n\n const storage = getStorageLayout(metadata, decoded)\n const getLookupEntryDef = denormalizeLookup(decoded)\n\n return Object.assign(getLookupEntryDef, {\n metadata,\n lookup: decoded,\n storage,\n })\n}\n\nfunction getStorageLayout(metadata: InkMetadata, lookup: V14Lookup) {\n const result: StorageLayout = {}\n\n const readLayout = (node: Layout, path: string[] = []): number | null => {\n function addType(def: V14Lookup[number][\"def\"]) {\n const id = lookup.length\n lookup[id] = {\n id,\n docs: [],\n def,\n params: [],\n path: [],\n }\n return id\n }\n\n if (\"root\" in node) {\n // On version 4-, the keys in the storage were in big-endian.\n // For version 5+, the keys in storage are in scale, which is little-endian.\n // https://use.ink/faq/migrating-from-ink-4-to-5#metadata-storage-keys-encoding-change\n // https://github.com/use-ink/ink/pull/2048\n const keyPrefix =\n Number(metadata.version) === 4\n ? toHex(Binary.fromHex(node.root.root_key).reverse())\n : node.root.root_key\n\n const typeId = readLayout(node.root.layout, path)!\n if (node.root.ty != null) {\n function resolveType(id: number, path: string[]) {\n const type = metadata.types[id].type\n\n // A vector internally uses a Mapping, but we have to get it\n const fields =\n \"composite\" in type.def\n ? new Map(\n (type.def.composite.fields ?? []).map((v) => [\n v.name,\n v.type,\n ]),\n )\n : null\n const params = new Map(\n (type.params ?? []).map((v) => [v.name, v.type]),\n )\n\n if (\n params.size === 2 &&\n params.has(\"V\") &&\n fields &&\n fields.size === 2 &&\n fields.has(\"len\") &&\n fields.has(\"elements\")\n ) {\n // Vectors have length and elements as different entry points\n resolveType(fields.get(\"len\")!, [...path, \"len\"])\n resolveType(fields.get(\"elements\")!, path)\n return\n } else if (params.size === 3 && params.has(\"K\") && params.has(\"V\")) {\n // Mapping\n result[path.join(\".\")] = {\n keyPrefix,\n key: params.get(\"K\")!,\n typeId: params.get(\"V\")!,\n }\n } else if (params.size === 2 && params.has(\"V\")) {\n // Lazy\n result[path.join(\".\")] = {\n keyPrefix,\n key: null,\n typeId: params.get(\"V\")!,\n }\n }\n }\n resolveType(node.root.ty, path)\n }\n\n if (!result[path.join(\".\")]) {\n result[path.join(\".\")] = {\n keyPrefix,\n key: null,\n typeId,\n }\n }\n\n // Anyone addressing this node will encounter an empty type\n return addType({\n tag: \"composite\",\n value: [],\n })\n }\n if (\"leaf\" in node) {\n return node.leaf.ty\n }\n if (\"hash\" in node) {\n throw new Error(\"HashLayout not implemented\")\n }\n if (\"array\" in node) {\n const inner = readLayout(node.array.layout, path)\n\n return inner == null\n ? null\n : addType({\n tag: \"array\",\n value: {\n len: node.array.len,\n type: inner,\n },\n })\n }\n if (\"struct\" in node) {\n const inner = node.struct.fields\n .map((field) => ({\n name: field.name,\n type: readLayout(field.layout, [...path, field.name])!,\n typeName: undefined,\n docs: [],\n }))\n .filter((field) => field.type != null)\n\n return addType({\n tag: \"composite\",\n value: inner,\n })\n }\n\n const inner = Object.values(node.enum.variants).map((variant, index) => ({\n name: variant.name,\n fields: variant.fields\n .map((field) => ({\n name: field.name,\n type: readLayout(field.layout, [...path, variant.name, field.name])!,\n typeName: undefined,\n docs: [],\n }))\n .filter((v) => v.type !== null),\n index,\n docs: [],\n }))\n\n return addType({\n tag: \"variant\",\n value: inner,\n })\n }\n readLayout(metadata.storage)\n\n return result\n}\n"],"names":["resolveType","path","inner"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,504 +1,4 @@
1
- 'use strict';
2
-
3
- var metadataBuilders = require('@polkadot-api/metadata-builders');
4
- var substrateBindings = require('@polkadot-api/substrate-bindings');
5
- var utils = require('@polkadot-api/utils');
6
-
7
- const getInkDynamicBuilder = (metadataLookup) => {
8
- const { metadata } = metadataLookup;
9
- const buildDefinition = metadataBuilders.getLookupCodecBuilder(metadataLookup);
10
- const buildStorage = (name = "") => {
11
- const storageEntry = metadataLookup.storage[name];
12
- if (!storageEntry)
13
- throw new Error(`Storage entry ${name ? name : "{root}"} not found`);
14
- const keyCodec = storageEntry.key == null ? substrateBindings._void : buildDefinition(storageEntry.key);
15
- return {
16
- key: prependBytes(keyCodec, storageEntry.keyPrefix),
17
- value: buildDefinition(storageEntry.typeId)
18
- };
19
- };
20
- const buildCallable = (callable) => {
21
- const argsCodec = substrateBindings.Struct(
22
- Object.fromEntries(
23
- callable.args.map((param) => [
24
- param.label,
25
- buildDefinition(param.type.type)
26
- ])
27
- )
28
- );
29
- return {
30
- call: prependBytes(argsCodec, callable.selector),
31
- value: buildDefinition(callable.returnType.type)
32
- };
33
- };
34
- const buildConstructor = (label) => {
35
- const constr = metadata.spec.constructors.find((c) => c.label === label);
36
- if (!constr) {
37
- throw new Error(`Constructor ${label} not found`);
38
- }
39
- return buildCallable(constr);
40
- };
41
- const buildMessage = (label) => {
42
- const message = metadata.spec.messages.find((c) => c.label === label);
43
- if (!message) {
44
- throw new Error(`Message ${label} not found`);
45
- }
46
- return buildCallable(message);
47
- };
48
- const buildEventCodec = (event) => substrateBindings.Struct(
49
- Object.fromEntries(
50
- event.args.map((param) => [
51
- param.label,
52
- buildDefinition(param.type.type)
53
- ])
54
- )
55
- );
56
- const buildEvent = (signatureTopic) => {
57
- const events = metadata.spec.events;
58
- const withType = (codec, type) => substrateBindings.enhanceCodec(
59
- codec,
60
- (evt) => evt.value,
61
- (value) => ({ type, value })
62
- );
63
- if (signatureTopic) {
64
- const event = events.find((evt) => evt.signature_topic === signatureTopic);
65
- return event ? withType(buildEventCodec(event), event.label) : null;
66
- }
67
- const candidates = events.filter(
68
- (evt) => evt.signature_topic === signatureTopic
69
- );
70
- return candidates.length ? first(candidates.map((c) => withType(buildEventCodec(c), c.label))) : null;
71
- };
72
- const buildEvents = () => substrateBindings.Variant(
73
- Object.fromEntries(
74
- metadata.spec.events.map((evt) => [evt.label, buildEventCodec(evt)])
75
- )
76
- );
77
- return {
78
- buildConstructor,
79
- buildMessage,
80
- buildStorage,
81
- buildEvents,
82
- buildEvent
83
- };
84
- };
85
- const prependBytes = (codec, hex) => {
86
- const bytes = substrateBindings.Binary.fromHex(hex);
87
- const wrappedCodec = substrateBindings.Tuple(substrateBindings.Bytes(bytes.length), codec);
88
- return substrateBindings.enhanceCodec(
89
- wrappedCodec,
90
- (value) => [
91
- bytes,
92
- value
93
- ],
94
- ([, value]) => value
95
- );
96
- };
97
- const first = (codecs) => substrateBindings.createCodec(
98
- (x) => {
99
- for (const codec of codecs) {
100
- try {
101
- codec.enc(x);
102
- } catch (_) {
103
- }
104
- }
105
- throw new Error("Unable to encode");
106
- },
107
- (x) => {
108
- for (const codec of codecs) {
109
- try {
110
- codec.dec(x);
111
- } catch (_) {
112
- }
113
- }
114
- throw new Error("Unable to decode");
115
- }
116
- );
117
-
118
- const Variant = (inner) => substrateBindings.enhanceCodec(
119
- substrateBindings.ScaleEnum(inner),
120
- (value) => {
121
- if (typeof value === "string") {
122
- return {
123
- tag: value,
124
- value: void 0
125
- };
126
- }
127
- const [tag, val] = Object.entries(value)[0];
128
- return {
129
- tag,
130
- value: val
131
- };
132
- },
133
- (value) => {
134
- return {
135
- [value.tag]: value.value
136
- };
137
- }
138
- );
139
- const PjsVector = (inner, size) => substrateBindings.enhanceCodec(
140
- substrateBindings.Vector(inner, size),
141
- (value) => value ?? [],
142
- (v) => v
143
- );
144
- const oStr = substrateBindings.Option(substrateBindings.str);
145
- const docs = PjsVector(substrateBindings.str);
146
- const primitive = Variant({
147
- bool: substrateBindings._void,
148
- char: substrateBindings._void,
149
- str: substrateBindings._void,
150
- u8: substrateBindings._void,
151
- u16: substrateBindings._void,
152
- u32: substrateBindings._void,
153
- u64: substrateBindings._void,
154
- u128: substrateBindings._void,
155
- u256: substrateBindings._void,
156
- i8: substrateBindings._void,
157
- i16: substrateBindings._void,
158
- i32: substrateBindings._void,
159
- i64: substrateBindings._void,
160
- i128: substrateBindings._void,
161
- i256: substrateBindings._void
162
- });
163
- const fields = PjsVector(
164
- substrateBindings.Struct({
165
- name: oStr,
166
- type: substrateBindings.compactNumber,
167
- typeName: oStr,
168
- docs
169
- })
170
- );
171
- const arr = substrateBindings.Struct({
172
- len: substrateBindings.u32,
173
- type: substrateBindings.compactNumber
174
- });
175
- const bitSequence = substrateBindings.Struct({
176
- bitStoreType: substrateBindings.compactNumber,
177
- bitOrderType: substrateBindings.compactNumber
178
- });
179
- const variants = PjsVector(
180
- substrateBindings.Struct({
181
- name: substrateBindings.str,
182
- fields,
183
- index: substrateBindings.u8,
184
- docs
185
- })
186
- );
187
- const def = Variant({
188
- composite: substrateBindings.Struct({
189
- fields
190
- }),
191
- variant: substrateBindings.Struct({
192
- variants
193
- }),
194
- sequence: substrateBindings.Struct({
195
- type: substrateBindings.compactNumber
196
- }),
197
- array: arr,
198
- tuple: substrateBindings.Vector(substrateBindings.compactNumber),
199
- primitive,
200
- compact: substrateBindings.Struct({
201
- type: substrateBindings.compactNumber
202
- }),
203
- bitSequence
204
- });
205
- const param = substrateBindings.Struct({
206
- name: substrateBindings.str,
207
- type: substrateBindings.Option(substrateBindings.compactNumber)
208
- });
209
- const params = PjsVector(param);
210
- const metadataEntry = substrateBindings.Struct({
211
- id: substrateBindings.compactNumber,
212
- path: docs,
213
- params,
214
- def,
215
- docs
216
- });
217
- const entry = substrateBindings.enhanceCodec(
218
- metadataEntry,
219
- (value) => ({
220
- id: value.id,
221
- path: value.type.path,
222
- params: value.type.params ?? [],
223
- def: value.type.def,
224
- docs: []
225
- }),
226
- (value) => ({
227
- id: value.id,
228
- type: {
229
- def: value.def,
230
- path: value.path,
231
- params: value.params
232
- }
233
- })
234
- );
235
- const pjsTypes = PjsVector(entry);
236
-
237
- const getInkLookup = (metadata) => {
238
- const encoded = pjsTypes.enc(metadata.types);
239
- const decoded = substrateBindings.v14Lookup.dec(encoded);
240
- const accountTypeId = metadata.spec.environment.accountId.type;
241
- const accountIdEntry = decoded.find((e) => e.id === accountTypeId);
242
- if (accountIdEntry) {
243
- accountIdEntry.path = ["AccountId32"];
244
- }
245
- const storage = getStorageLayout(metadata, decoded);
246
- const getLookupEntryDef = metadataBuilders.denormalizeLookup(decoded);
247
- return Object.assign(getLookupEntryDef, {
248
- metadata,
249
- lookup: decoded,
250
- storage
251
- });
252
- };
253
- function getStorageLayout(metadata, lookup) {
254
- const result = {};
255
- const readLayout = (node, path = []) => {
256
- function addType(def) {
257
- const id = lookup.length;
258
- lookup[id] = {
259
- id,
260
- docs: [],
261
- def,
262
- params: [],
263
- path: []
264
- };
265
- return id;
266
- }
267
- if ("root" in node) {
268
- const keyPrefix = Number(metadata.version) === 4 ? utils.toHex(substrateBindings.Binary.fromHex(node.root.root_key).reverse()) : node.root.root_key;
269
- const typeId = readLayout(node.root.layout, path);
270
- if (node.root.ty != null) {
271
- let resolveType2 = function(id, path2) {
272
- const type = metadata.types[id].type;
273
- const fields = "composite" in type.def ? new Map(
274
- (type.def.composite.fields ?? []).map((v) => [
275
- v.name,
276
- v.type
277
- ])
278
- ) : null;
279
- const params = new Map(
280
- (type.params ?? []).map((v) => [v.name, v.type])
281
- );
282
- if (params.size === 2 && params.has("V") && fields && fields.size === 2 && fields.has("len") && fields.has("elements")) {
283
- resolveType2(fields.get("len"), [...path2, "len"]);
284
- resolveType2(fields.get("elements"), path2);
285
- return;
286
- } else if (params.size === 3 && params.has("K") && params.has("V")) {
287
- result[path2.join(".")] = {
288
- keyPrefix,
289
- key: params.get("K"),
290
- typeId: params.get("V")
291
- };
292
- } else if (params.size === 2 && params.has("V")) {
293
- result[path2.join(".")] = {
294
- keyPrefix,
295
- key: null,
296
- typeId: params.get("V")
297
- };
298
- }
299
- };
300
- resolveType2(node.root.ty, path);
301
- }
302
- if (!result[path.join(".")]) {
303
- result[path.join(".")] = {
304
- keyPrefix,
305
- key: null,
306
- typeId
307
- };
308
- }
309
- return addType({
310
- tag: "composite",
311
- value: []
312
- });
313
- }
314
- if ("leaf" in node) {
315
- return node.leaf.ty;
316
- }
317
- if ("hash" in node) {
318
- throw new Error("HashLayout not implemented");
319
- }
320
- if ("array" in node) {
321
- const inner2 = readLayout(node.array.layout, path);
322
- return inner2 == null ? null : addType({
323
- tag: "array",
324
- value: {
325
- len: node.array.len,
326
- type: inner2
327
- }
328
- });
329
- }
330
- if ("struct" in node) {
331
- const inner2 = node.struct.fields.map((field) => ({
332
- name: field.name,
333
- type: readLayout(field.layout, [...path, field.name]),
334
- typeName: void 0,
335
- docs: []
336
- })).filter((field) => field.type != null);
337
- return addType({
338
- tag: "composite",
339
- value: inner2
340
- });
341
- }
342
- const inner = Object.values(node.enum.variants).map((variant, index) => ({
343
- name: variant.name,
344
- fields: variant.fields.map((field) => ({
345
- name: field.name,
346
- type: readLayout(field.layout, [...path, variant.name, field.name]),
347
- typeName: void 0,
348
- docs: []
349
- })).filter((v) => v.type !== null),
350
- index,
351
- docs: []
352
- }));
353
- return addType({
354
- tag: "variant",
355
- value: inner
356
- });
357
- };
358
- readLayout(metadata.storage);
359
- return result;
360
- }
361
-
362
- const createInkClient = (inkContract) => {
363
- if (!inkContract.metadata) {
364
- throw new Error("Ink client needs the contract metadata");
365
- }
366
- const lookup = getInkLookup(inkContract.metadata);
367
- const builder = getInkDynamicBuilder(lookup);
368
- const constructorCodec = buildCallable(builder.buildConstructor);
369
- const messageCodec = buildCallable(builder.buildMessage);
370
- const findConstructor = (label) => {
371
- const result = lookup.metadata.spec.constructors.find(
372
- (c) => c.label === label
373
- );
374
- if (!result) {
375
- throw new Error(`Constructor ${label} not found`);
376
- }
377
- return result;
378
- };
379
- const findMessage = (label) => {
380
- const result = lookup.metadata.spec.messages.find((c) => c.label === label);
381
- if (!result) {
382
- throw new Error(`Message ${label} not found`);
383
- }
384
- return result;
385
- };
386
- const defaultConstructor = lookup.metadata.spec.constructors.find(
387
- (c) => c.default
388
- )?.label;
389
- const defaultMessage = lookup.metadata.spec.messages.find(
390
- (c) => c.default
391
- )?.label;
392
- return {
393
- constructor: (label) => ({
394
- attributes: getAttributes(findConstructor(label)),
395
- ...constructorCodec(label)
396
- }),
397
- defaultConstructor,
398
- message: (label) => ({
399
- attributes: getAttributes(findMessage(label)),
400
- ...messageCodec(label)
401
- }),
402
- defaultMessage,
403
- storage: buildStorage(builder.buildStorage),
404
- event: Number(lookup.metadata.version) === 4 ? buildEventV4(builder.buildEvents) : buildEventV5(lookup, builder.buildEvent)
405
- };
406
- };
407
- const inkClientCache = /* @__PURE__ */ new WeakMap();
408
- const getInkClient = (inkContract) => {
409
- const cached = inkClientCache.get(inkContract);
410
- if (cached) return cached;
411
- const client = createInkClient(inkContract);
412
- inkClientCache.set(inkContract, client);
413
- return client;
414
- };
415
- const getAttributes = (spec) => ({
416
- payable: spec.payable,
417
- default: spec.default,
418
- mutates: "mutates" in spec ? spec.mutates : true
419
- });
420
- const buildCallable = (builder) => (label) => {
421
- const codecs = builder(label);
422
- return {
423
- encode: (value) => codecs.call.enc(value || {}),
424
- decode: (response) => codecs.value.dec(response.data)
425
- };
426
- };
427
- const buildStorage = (builder) => (label) => {
428
- const codecs = builder(label);
429
- return {
430
- encode: (key) => codecs.key.enc(key),
431
- decode: (response) => codecs.value.dec(response)
432
- };
433
- };
434
- const buildEventV4 = (eventsDecoder) => {
435
- const decode = (value) => {
436
- return eventsDecoder().dec(value.data);
437
- };
438
- const filter = (address, events = []) => {
439
- const contractEvents = events.map((v) => "event" in v ? v.event : v).filter(
440
- (v) => v.type === "Contracts" && v.value.type === "ContractEmitted" && v.value.value.contract === address
441
- );
442
- return contractEvents.map((v) => {
443
- try {
444
- return decode(v.value.value);
445
- } catch (ex) {
446
- console.error(
447
- `Contract ${address} emitted an incompatible event`,
448
- v.value.value
449
- );
450
- throw ex;
451
- }
452
- });
453
- };
454
- return { decode, filter };
455
- };
456
- const buildEventV5 = (lookup, eventDecoder) => {
457
- const metadataEventTopics = new Set(
458
- lookup.metadata.spec.events.map((evt) => evt.signature_topic).filter((v) => v != null)
459
- );
460
- const hasAnonymousEvents = lookup.metadata.spec.events.some(
461
- (evt) => evt.signature_topic == null
462
- );
463
- const decode = (value, signatureTopic) => {
464
- if (signatureTopic != null) {
465
- if (!metadataEventTopics.has(signatureTopic)) {
466
- throw new Error(`Event with signature topic ${value} not found`);
467
- }
468
- return eventDecoder(signatureTopic).dec(value.data);
469
- }
470
- if (!hasAnonymousEvents) {
471
- throw new Error("Event signature topic required");
472
- }
473
- return eventDecoder(void 0).dec(value.data);
474
- };
475
- const filter = (address, events = []) => {
476
- const addrEq = (a) => (typeof a === "string" ? a : utils.toHex(a)) === address;
477
- const contractEvents = events.filter(
478
- (v) => (v.event.type === "Contracts" || v.event.type === "Revive") && v.event.value.type === "ContractEmitted" && addrEq(v.event.value.value.contract)
479
- );
480
- return contractEvents.map((v) => {
481
- const eventTopics = [
482
- ...v.topics,
483
- ...v.event.value?.value?.topics ?? []
484
- ];
485
- const suitableTopic = eventTopics.find(
486
- (topic) => metadataEventTopics.has(topic)
487
- );
488
- try {
489
- return decode(v.event.value.value, suitableTopic);
490
- } catch (ex) {
491
- return null;
492
- }
493
- }).filter((v) => v !== null);
494
- };
495
- return {
496
- decode,
497
- filter
498
- };
499
- };
500
-
501
- exports.getInkClient = getInkClient;
502
- exports.getInkDynamicBuilder = getInkDynamicBuilder;
503
- exports.getInkLookup = getInkLookup;
1
+ export { getInkDynamicBuilder } from './dynamic-builders.js';
2
+ export { getInkLookup } from './get-lookup.js';
3
+ export { getInkClient } from './ink-client.js';
504
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/dynamic-builders.ts","../src/metadata-pjs-types.ts","../src/get-lookup.ts","../src/ink-client.ts"],"sourcesContent":["import { getLookupCodecBuilder } from \"@polkadot-api/metadata-builders\"\nimport { Binary, Variant } from \"@polkadot-api/substrate-bindings\"\nimport {\n _void,\n Bytes,\n Codec,\n CodecType,\n createCodec,\n enhanceCodec,\n StringRecord,\n Struct,\n Tuple,\n} from \"@polkadot-api/substrate-bindings\"\nimport { InkMetadataLookup } from \"./get-lookup\"\nimport {\n EventParamSpec,\n EventSpecV5,\n MessageParamSpec,\n TypeSpec,\n} from \"./metadata-types\"\n\nexport const getInkDynamicBuilder = (metadataLookup: InkMetadataLookup) => {\n const { metadata } = metadataLookup\n\n const buildDefinition = getLookupCodecBuilder(metadataLookup)\n\n const buildStorage = (name = \"\") => {\n const storageEntry = metadataLookup.storage[name]\n if (!storageEntry)\n throw new Error(`Storage entry ${name ? name : \"{root}\"} not found`)\n\n const keyCodec =\n storageEntry.key == null ? _void : buildDefinition(storageEntry.key)\n return {\n key: prependBytes(keyCodec, storageEntry.keyPrefix),\n value: buildDefinition(storageEntry.typeId),\n }\n }\n\n const buildCallable = (callable: {\n selector: string\n args: Array<MessageParamSpec>\n returnType: TypeSpec\n }) => {\n const argsCodec = Struct(\n Object.fromEntries(\n callable.args.map((param) => [\n param.label,\n buildDefinition(param.type.type),\n ]),\n ) as StringRecord<Codec<any>>,\n )\n\n return {\n call: prependBytes(argsCodec, callable.selector),\n value: buildDefinition(callable.returnType.type),\n }\n }\n\n const buildConstructor = (label: string) => {\n const constr = metadata.spec.constructors.find((c) => c.label === label)\n if (!constr) {\n throw new Error(`Constructor ${label} not found`)\n }\n\n return buildCallable(constr)\n }\n\n const buildMessage = (label: string) => {\n const message = metadata.spec.messages.find((c) => c.label === label)\n if (!message) {\n throw new Error(`Message ${label} not found`)\n }\n\n return buildCallable(message)\n }\n\n const buildEventCodec = (event: { args: EventParamSpec[] }) =>\n Struct(\n Object.fromEntries(\n event.args.map((param) => [\n param.label,\n buildDefinition(param.type.type),\n ]),\n ) as StringRecord<Codec<any>>,\n )\n\n const buildEvent = (signatureTopic: string | undefined) => {\n const events = metadata.spec.events as EventSpecV5[]\n\n const withType = <T>(codec: Codec<T>, type: string) =>\n enhanceCodec<T, { type: string; value: T }>(\n codec,\n (evt) => evt.value,\n (value) => ({ type, value }),\n )\n\n if (signatureTopic) {\n const event = events.find((evt) => evt.signature_topic === signatureTopic)\n return event ? withType(buildEventCodec(event), event.label) : null\n }\n\n const candidates = events.filter(\n (evt) => evt.signature_topic === signatureTopic,\n )\n return candidates.length\n ? first(candidates.map((c) => withType(buildEventCodec(c), c.label)))\n : null\n }\n\n const buildEvents = () =>\n Variant(\n Object.fromEntries(\n metadata.spec.events.map((evt) => [evt.label, buildEventCodec(evt)]),\n ) as unknown as StringRecord<Codec<any>>,\n )\n\n return {\n buildConstructor,\n buildMessage,\n buildStorage,\n buildEvents,\n buildEvent,\n }\n}\n\nexport type InkDynamicBuilder = ReturnType<typeof getInkDynamicBuilder>\n\nconst prependBytes = <T>(codec: Codec<T>, hex: string) => {\n const bytes = Binary.fromHex(hex)\n const wrappedCodec = Tuple(Bytes(bytes.length), codec)\n return enhanceCodec(\n wrappedCodec,\n (value: CodecType<typeof codec>): CodecType<typeof wrappedCodec> => [\n bytes,\n value,\n ],\n ([, value]) => value,\n )\n}\n\nconst first = <T>(codecs: Codec<T>[]) =>\n createCodec<T>(\n (x) => {\n for (const codec of codecs) {\n try {\n codec.enc(x)\n } catch (_) {}\n }\n throw new Error(\"Unable to encode\")\n },\n (x) => {\n for (const codec of codecs) {\n try {\n codec.dec(x)\n } catch (_) {}\n }\n throw new Error(\"Unable to decode\")\n },\n )\n","import {\n _void,\n Codec,\n CodecType,\n compactNumber,\n enhanceCodec,\n Option,\n ScaleEnum,\n str,\n StringRecord,\n Struct,\n u32,\n u8,\n Vector,\n} from \"@polkadot-api/substrate-bindings\"\n\ntype PjsVariant<O extends StringRecord<Codec<any>>> = {\n [K in keyof O]: {\n [KK in K]: CodecType<O[K]>\n }\n}[keyof O]\nconst Variant = <O extends StringRecord<Codec<any>>>(inner: O) =>\n enhanceCodec(\n ScaleEnum(inner),\n (value: PjsVariant<O>) => {\n if (typeof value === \"string\") {\n return {\n tag: value,\n value: undefined,\n } as any\n }\n const [tag, val] = Object.entries(value)[0]\n\n return {\n tag: tag as keyof O,\n value: val,\n }\n },\n (value) => {\n return {\n [value.tag]: value.value,\n } as PjsVariant<O>\n },\n )\n\n// Seems like pjs can omit empty vectors\nconst PjsVector = <T>(inner: Codec<T>, size?: number) =>\n enhanceCodec(\n Vector(inner, size),\n (value: T[] | undefined) => value ?? [],\n (v) => v,\n )\n\nconst oStr = Option(str)\nconst docs = PjsVector(str)\n\nconst primitive = Variant({\n bool: _void,\n char: _void,\n str: _void,\n u8: _void,\n u16: _void,\n u32: _void,\n u64: _void,\n u128: _void,\n u256: _void,\n i8: _void,\n i16: _void,\n i32: _void,\n i64: _void,\n i128: _void,\n i256: _void,\n})\n\nconst fields = PjsVector(\n Struct({\n name: oStr,\n type: compactNumber,\n typeName: oStr,\n docs,\n }),\n)\n\nconst arr = Struct({\n len: u32,\n type: compactNumber,\n})\n\nconst bitSequence = Struct({\n bitStoreType: compactNumber,\n bitOrderType: compactNumber,\n})\n\nconst variants = PjsVector(\n Struct({\n name: str,\n fields,\n index: u8,\n docs,\n }),\n)\n\nconst def = Variant({\n composite: Struct({\n fields,\n }),\n variant: Struct({\n variants,\n }),\n sequence: Struct({\n type: compactNumber,\n }),\n array: arr,\n tuple: Vector(compactNumber),\n primitive,\n compact: Struct({\n type: compactNumber,\n }),\n bitSequence,\n})\n\nconst param = Struct({\n name: str,\n type: Option(compactNumber),\n})\nconst params = PjsVector(param)\n\nconst metadataEntry = Struct({\n id: compactNumber,\n path: docs,\n params,\n def,\n docs,\n})\n\nconst entry = enhanceCodec(\n metadataEntry,\n (value: {\n id: number\n type: {\n def: CodecType<typeof def>\n path: CodecType<typeof docs>\n params?: Array<{ name: string; type: number | undefined }>\n }\n }) => ({\n id: value.id,\n path: value.type.path,\n params: value.type.params ?? [],\n def: value.type.def,\n docs: [],\n }),\n (value) => ({\n id: value.id,\n type: {\n def: value.def,\n path: value.path,\n params: value.params,\n },\n }),\n)\n\nexport const pjsTypes = PjsVector(entry)\nexport type PjsTypes = CodecType<typeof pjsTypes>\n","import { denormalizeLookup, LookupEntry } from \"@polkadot-api/metadata-builders\"\nimport { Binary, V14Lookup, v14Lookup } from \"@polkadot-api/substrate-bindings\"\nimport { toHex } from \"@polkadot-api/utils\"\nimport { pjsTypes } from \"./metadata-pjs-types\"\nimport { InkMetadata, Layout } from \"./metadata-types\"\n\nexport interface InkMetadataLookup {\n (id: number): LookupEntry\n metadata: InkMetadata\n storage: StorageLayout\n}\n\nexport interface StorageEntryPoint {\n keyPrefix: string\n key: number | null\n typeId: number\n}\n\nexport type StorageLayout = Record<string, StorageEntryPoint>\n\nexport const getInkLookup = (metadata: InkMetadata): InkMetadataLookup => {\n // We can reuse dynamic-builder's lookup if we encode and re-decode the type\n // into V14Lookup, because both v14 metadata lookup and ink types use scale-info\n const encoded = pjsTypes.enc(metadata.types)\n const decoded = v14Lookup.dec(encoded)\n\n // Signal the lookup the AccountId type\n const accountTypeId = metadata.spec.environment.accountId.type\n const accountIdEntry = decoded.find((e) => e.id === accountTypeId)\n if (accountIdEntry) {\n accountIdEntry.path = [\"AccountId32\"]\n }\n\n const storage = getStorageLayout(metadata, decoded)\n const getLookupEntryDef = denormalizeLookup(decoded)\n\n return Object.assign(getLookupEntryDef, {\n metadata,\n lookup: decoded,\n storage,\n })\n}\n\nfunction getStorageLayout(metadata: InkMetadata, lookup: V14Lookup) {\n const result: StorageLayout = {}\n\n const readLayout = (node: Layout, path: string[] = []): number | null => {\n function addType(def: V14Lookup[number][\"def\"]) {\n const id = lookup.length\n lookup[id] = {\n id,\n docs: [],\n def,\n params: [],\n path: [],\n }\n return id\n }\n\n if (\"root\" in node) {\n // On version 4-, the keys in the storage were in big-endian.\n // For version 5+, the keys in storage are in scale, which is little-endian.\n // https://use.ink/faq/migrating-from-ink-4-to-5#metadata-storage-keys-encoding-change\n // https://github.com/use-ink/ink/pull/2048\n const keyPrefix =\n Number(metadata.version) === 4\n ? toHex(Binary.fromHex(node.root.root_key).reverse())\n : node.root.root_key\n\n const typeId = readLayout(node.root.layout, path)!\n if (node.root.ty != null) {\n function resolveType(id: number, path: string[]) {\n const type = metadata.types[id].type\n\n // A vector internally uses a Mapping, but we have to get it\n const fields =\n \"composite\" in type.def\n ? new Map(\n (type.def.composite.fields ?? []).map((v) => [\n v.name,\n v.type,\n ]),\n )\n : null\n const params = new Map(\n (type.params ?? []).map((v) => [v.name, v.type]),\n )\n\n if (\n params.size === 2 &&\n params.has(\"V\") &&\n fields &&\n fields.size === 2 &&\n fields.has(\"len\") &&\n fields.has(\"elements\")\n ) {\n // Vectors have length and elements as different entry points\n resolveType(fields.get(\"len\")!, [...path, \"len\"])\n resolveType(fields.get(\"elements\")!, path)\n return\n } else if (params.size === 3 && params.has(\"K\") && params.has(\"V\")) {\n // Mapping\n result[path.join(\".\")] = {\n keyPrefix,\n key: params.get(\"K\")!,\n typeId: params.get(\"V\")!,\n }\n } else if (params.size === 2 && params.has(\"V\")) {\n // Lazy\n result[path.join(\".\")] = {\n keyPrefix,\n key: null,\n typeId: params.get(\"V\")!,\n }\n }\n }\n resolveType(node.root.ty, path)\n }\n\n if (!result[path.join(\".\")]) {\n result[path.join(\".\")] = {\n keyPrefix,\n key: null,\n typeId,\n }\n }\n\n // Anyone addressing this node will encounter an empty type\n return addType({\n tag: \"composite\",\n value: [],\n })\n }\n if (\"leaf\" in node) {\n return node.leaf.ty\n }\n if (\"hash\" in node) {\n throw new Error(\"HashLayout not implemented\")\n }\n if (\"array\" in node) {\n const inner = readLayout(node.array.layout, path)\n\n return inner == null\n ? null\n : addType({\n tag: \"array\",\n value: {\n len: node.array.len,\n type: inner,\n },\n })\n }\n if (\"struct\" in node) {\n const inner = node.struct.fields\n .map((field) => ({\n name: field.name,\n type: readLayout(field.layout, [...path, field.name])!,\n typeName: undefined,\n docs: [],\n }))\n .filter((field) => field.type != null)\n\n return addType({\n tag: \"composite\",\n value: inner,\n })\n }\n\n const inner = Object.values(node.enum.variants).map((variant, index) => ({\n name: variant.name,\n fields: variant.fields\n .map((field) => ({\n name: field.name,\n type: readLayout(field.layout, [...path, variant.name, field.name])!,\n typeName: undefined,\n docs: [],\n }))\n .filter((v) => v.type !== null),\n index,\n docs: [],\n }))\n\n return addType({\n tag: \"variant\",\n value: inner,\n })\n }\n readLayout(metadata.storage)\n\n return result\n}\n","import { HexString } from \"@polkadot-api/substrate-bindings\"\nimport { toHex } from \"@polkadot-api/utils\"\nimport { getInkDynamicBuilder, InkDynamicBuilder } from \"./dynamic-builders\"\nimport { getInkLookup, InkMetadataLookup } from \"./get-lookup\"\nimport {\n Event,\n InkCallableDescriptor,\n InkDescriptors,\n InkStorageDescriptor,\n} from \"./ink-descriptors\"\nimport { ConstructorSpec, EventSpecV5, MessageSpec } from \"./metadata-types\"\n\nexport type InkCallableInterface<T extends InkCallableDescriptor> = <\n L extends string & keyof T,\n>(\n label: L,\n) => {\n encode: {} extends T[L][\"message\"]\n ? (value?: T[L][\"message\"]) => Uint8Array\n : (value: T[L][\"message\"]) => Uint8Array\n decode: (value: { data: Uint8Array }) => T[L][\"response\"]\n attributes: {\n payable: boolean\n default: boolean\n mutates: boolean\n }\n}\n\nexport type InkStorageInterface<S extends InkStorageDescriptor> =\n (\"\" extends keyof S\n ? () => {\n encode: S[\"\"][\"key\"] extends undefined\n ? (key?: undefined) => Uint8Array\n : (key: S[\"\"][\"key\"]) => Uint8Array\n decode: (data: Uint8Array) => S[\"\"][\"value\"]\n }\n : unknown) &\n (<L extends string & keyof S>(\n label: L,\n ) => {\n encode: S[L][\"key\"] extends undefined\n ? (key?: undefined) => Uint8Array\n : (key: S[L][\"key\"]) => Uint8Array\n decode: (data: Uint8Array) => S[L][\"value\"]\n })\n\nexport type GenericEvent =\n | {\n type: \"Contracts\"\n value:\n | {\n type: \"ContractEmitted\"\n value: {\n contract: string\n data: Uint8Array\n }\n }\n | { type: string; value: unknown }\n }\n | { type: string; value: unknown }\nexport interface InkEventInterface<E> {\n decode: (value: { data: Uint8Array }, signatureTopic?: string) => E\n filter: (\n address: string,\n events?: Array<{ event: GenericEvent; topics: HexString[] }>,\n ) => E[]\n}\n\ntype HasDefault<T> = \"default\" extends keyof T\n ? T[\"default\"] extends true\n ? true\n : false\n : false\ntype GetDefault<M> = keyof {\n [K in keyof M as HasDefault<M[K]> extends true ? K : never]: true\n}\n\n// T can be the default message or `never`.\n// Typescript doesn't like doing `extends never` (it works for the \"false\" case, but for the other it will always give back never)\n// One way of running around it is by checking whether an empty object extends an object with that key.\ntype WrapDefault<T extends string> = {} extends {\n [K in T]: K\n}\n ? string | undefined\n : T\n\nexport interface InkClient<\n D extends InkDescriptors<\n InkStorageDescriptor,\n InkCallableDescriptor,\n InkCallableDescriptor,\n Event\n >,\n> {\n constructor: InkCallableInterface<D[\"__types\"][\"constructors\"]>\n defaultConstructor: WrapDefault<GetDefault<D[\"__types\"][\"constructors\"]>>\n message: InkCallableInterface<D[\"__types\"][\"messages\"]>\n defaultMessage: WrapDefault<GetDefault<D[\"__types\"][\"messages\"]>>\n storage: InkStorageInterface<D[\"__types\"][\"storage\"]>\n event: InkEventInterface<D[\"__types\"][\"event\"]>\n}\n\nconst createInkClient = <\n D extends InkDescriptors<\n InkStorageDescriptor,\n InkCallableDescriptor,\n InkCallableDescriptor,\n Event\n >,\n>(\n inkContract: D,\n): InkClient<D> => {\n if (!inkContract.metadata) {\n throw new Error(\"Ink client needs the contract metadata\")\n }\n\n const lookup = getInkLookup(inkContract.metadata)\n const builder = getInkDynamicBuilder(lookup)\n\n const constructorCodec = buildCallable(builder.buildConstructor)\n const messageCodec = buildCallable(builder.buildMessage)\n\n const findConstructor = (label: string) => {\n const result = lookup.metadata.spec.constructors.find(\n (c) => c.label === label,\n )\n if (!result) {\n throw new Error(`Constructor ${label} not found`)\n }\n return result\n }\n const findMessage = (label: string) => {\n const result = lookup.metadata.spec.messages.find((c) => c.label === label)\n if (!result) {\n throw new Error(`Message ${label} not found`)\n }\n return result\n }\n\n const defaultConstructor: any = lookup.metadata.spec.constructors.find(\n (c) => c.default,\n )?.label\n const defaultMessage: any = lookup.metadata.spec.messages.find(\n (c) => c.default,\n )?.label\n\n return {\n constructor: (label) => ({\n attributes: getAttributes(findConstructor(label)),\n ...constructorCodec(label),\n }),\n defaultConstructor,\n message: (label) => ({\n attributes: getAttributes(findMessage(label)),\n ...messageCodec(label),\n }),\n defaultMessage,\n storage: buildStorage(builder.buildStorage),\n event:\n Number(lookup.metadata.version) === 4\n ? buildEventV4(builder.buildEvents)\n : buildEventV5(lookup, builder.buildEvent),\n }\n}\n\nconst inkClientCache = new WeakMap<\n InkDescriptors<any, any, any, any>,\n InkClient<any>\n>()\nexport const getInkClient = <\n D extends InkDescriptors<\n InkStorageDescriptor,\n InkCallableDescriptor,\n InkCallableDescriptor,\n Event\n >,\n>(\n inkContract: D,\n): InkClient<D> => {\n const cached = inkClientCache.get(inkContract)\n if (cached) return cached\n\n const client = createInkClient(inkContract)\n inkClientCache.set(inkContract, client)\n return client\n}\n\nconst getAttributes = (spec: ConstructorSpec | MessageSpec) => ({\n payable: spec.payable,\n default: spec.default,\n mutates: \"mutates\" in spec ? spec.mutates : true,\n})\n\nconst buildCallable =\n <T extends InkCallableDescriptor>(\n builder:\n | InkDynamicBuilder[\"buildConstructor\"]\n | InkDynamicBuilder[\"buildMessage\"],\n ) =>\n <L extends string & keyof T>(label: L) => {\n const codecs = builder(label)\n\n return {\n encode: (value?: T[L][\"message\"]) => codecs.call.enc(value || {}),\n decode: (response: { data: Uint8Array }) =>\n codecs.value.dec(response.data),\n }\n }\n\nconst buildStorage =\n <S extends InkStorageDescriptor>(\n builder: InkDynamicBuilder[\"buildStorage\"],\n ): InkStorageInterface<S> =>\n <L extends string & keyof S>(label?: L) => {\n const codecs = builder(label)\n\n return {\n encode: (key?: S[L][\"key\"]) => codecs.key.enc(key as any),\n decode: (response: Uint8Array) => codecs.value.dec(response),\n }\n }\n\nconst buildEventV4 = <E extends Event>(\n eventsDecoder: InkDynamicBuilder[\"buildEvents\"],\n): InkEventInterface<E> => {\n const decode: InkEventInterface<E>[\"decode\"] = (value) => {\n return eventsDecoder().dec(value.data) as E\n }\n const filter: InkEventInterface<E>[\"filter\"] = (address, events = []) => {\n const contractEvents = events\n .map((v) => (\"event\" in v ? v.event : v))\n .filter(\n (v: any) =>\n v.type === \"Contracts\" &&\n v.value.type === \"ContractEmitted\" &&\n v.value.value.contract === address,\n )\n return contractEvents.map((v: any) => {\n try {\n return decode(v.value.value)\n } catch (ex) {\n console.error(\n `Contract ${address} emitted an incompatible event`,\n v.value.value,\n )\n throw ex\n }\n })\n }\n return { decode, filter }\n}\n\nconst buildEventV5 = <E extends Event>(\n lookup: InkMetadataLookup,\n eventDecoder: InkDynamicBuilder[\"buildEvent\"],\n): InkEventInterface<E> => {\n const metadataEventTopics = new Set(\n lookup.metadata.spec.events\n .map((evt) => (evt as EventSpecV5).signature_topic)\n .filter((v) => v != null),\n )\n const hasAnonymousEvents = lookup.metadata.spec.events.some(\n (evt) => (evt as EventSpecV5).signature_topic == null,\n )\n\n const decode: InkEventInterface<E>[\"decode\"] = (value, signatureTopic) => {\n if (signatureTopic != null) {\n if (!metadataEventTopics.has(signatureTopic)) {\n throw new Error(`Event with signature topic ${value} not found`)\n }\n return eventDecoder(signatureTopic)!.dec(value.data) as E\n }\n if (!hasAnonymousEvents) {\n throw new Error(\"Event signature topic required\")\n }\n return eventDecoder(undefined)!.dec(value.data) as E\n }\n const filter: InkEventInterface<E>[\"filter\"] = (address, events = []) => {\n const addrEq = (a: string | Uint8Array) =>\n (typeof a === \"string\" ? a : toHex(a)) === address\n\n const contractEvents = events.filter(\n (v) =>\n (v.event.type === \"Contracts\" || v.event.type === \"Revive\") &&\n (v.event.value as any).type === \"ContractEmitted\" &&\n addrEq((v.event.value as any).value.contract),\n )\n\n return contractEvents\n .map((v) => {\n const eventTopics = [\n ...v.topics,\n ...(((v.event.value as any)?.value?.topics ?? []) as HexString[]),\n ]\n const suitableTopic = eventTopics.find((topic) =>\n metadataEventTopics.has(topic),\n )\n try {\n return decode((v.event.value as any).value, suitableTopic)\n } catch (ex) {\n return null\n }\n })\n .filter((v) => v !== null)\n }\n\n return {\n decode,\n filter,\n }\n}\n"],"names":["getLookupCodecBuilder","_void","Struct","enhanceCodec","Variant","Binary","Tuple","Bytes","createCodec","ScaleEnum","Vector","Option","str","compactNumber","u32","u8","v14Lookup","denormalizeLookup","toHex","resolveType","path","inner"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -1,6 +1,6 @@
1
1
  import { toHex } from '@polkadot-api/utils';
2
- import { getInkDynamicBuilder } from './dynamic-builders.mjs';
3
- import { getInkLookup } from './get-lookup.mjs';
2
+ import { getInkDynamicBuilder } from './dynamic-builders.js';
3
+ import { getInkLookup } from './get-lookup.js';
4
4
 
5
5
  const createInkClient = (inkContract) => {
6
6
  if (!inkContract.metadata) {
@@ -142,4 +142,4 @@ const buildEventV5 = (lookup, eventDecoder) => {
142
142
  };
143
143
 
144
144
  export { getInkClient };
145
- //# sourceMappingURL=ink-client.mjs.map
145
+ //# sourceMappingURL=ink-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ink-client.js","sources":["../src/ink-client.ts"],"sourcesContent":["import { HexString } from \"@polkadot-api/substrate-bindings\"\nimport { toHex } from \"@polkadot-api/utils\"\nimport { getInkDynamicBuilder, InkDynamicBuilder } from \"./dynamic-builders\"\nimport { getInkLookup, InkMetadataLookup } from \"./get-lookup\"\nimport {\n Event,\n InkCallableDescriptor,\n InkDescriptors,\n InkStorageDescriptor,\n} from \"./ink-descriptors\"\nimport { ConstructorSpec, EventSpecV5, MessageSpec } from \"./metadata-types\"\n\nexport type InkCallableInterface<T extends InkCallableDescriptor> = <\n L extends string & keyof T,\n>(\n label: L,\n) => {\n encode: {} extends T[L][\"message\"]\n ? (value?: T[L][\"message\"]) => Uint8Array\n : (value: T[L][\"message\"]) => Uint8Array\n decode: (value: { data: Uint8Array }) => T[L][\"response\"]\n attributes: {\n payable: boolean\n default: boolean\n mutates: boolean\n }\n}\n\nexport type InkStorageInterface<S extends InkStorageDescriptor> =\n (\"\" extends keyof S\n ? () => {\n encode: S[\"\"][\"key\"] extends undefined\n ? (key?: undefined) => Uint8Array\n : (key: S[\"\"][\"key\"]) => Uint8Array\n decode: (data: Uint8Array) => S[\"\"][\"value\"]\n }\n : unknown) &\n (<L extends string & keyof S>(\n label: L,\n ) => {\n encode: S[L][\"key\"] extends undefined\n ? (key?: undefined) => Uint8Array\n : (key: S[L][\"key\"]) => Uint8Array\n decode: (data: Uint8Array) => S[L][\"value\"]\n })\n\nexport type GenericEvent =\n | {\n type: \"Contracts\"\n value:\n | {\n type: \"ContractEmitted\"\n value: {\n contract: string\n data: Uint8Array\n }\n }\n | { type: string; value: unknown }\n }\n | { type: string; value: unknown }\nexport interface InkEventInterface<E> {\n decode: (value: { data: Uint8Array }, signatureTopic?: string) => E\n filter: (\n address: string,\n events?: Array<{ event: GenericEvent; topics: HexString[] }>,\n ) => E[]\n}\n\ntype HasDefault<T> = \"default\" extends keyof T\n ? T[\"default\"] extends true\n ? true\n : false\n : false\ntype GetDefault<M> = keyof {\n [K in keyof M as HasDefault<M[K]> extends true ? K : never]: true\n}\n\n// T can be the default message or `never`.\n// Typescript doesn't like doing `extends never` (it works for the \"false\" case, but for the other it will always give back never)\n// One way of running around it is by checking whether an empty object extends an object with that key.\ntype WrapDefault<T extends string> = {} extends {\n [K in T]: K\n}\n ? string | undefined\n : T\n\nexport interface InkClient<\n D extends InkDescriptors<\n InkStorageDescriptor,\n InkCallableDescriptor,\n InkCallableDescriptor,\n Event\n >,\n> {\n constructor: InkCallableInterface<D[\"__types\"][\"constructors\"]>\n defaultConstructor: WrapDefault<GetDefault<D[\"__types\"][\"constructors\"]>>\n message: InkCallableInterface<D[\"__types\"][\"messages\"]>\n defaultMessage: WrapDefault<GetDefault<D[\"__types\"][\"messages\"]>>\n storage: InkStorageInterface<D[\"__types\"][\"storage\"]>\n event: InkEventInterface<D[\"__types\"][\"event\"]>\n}\n\nconst createInkClient = <\n D extends InkDescriptors<\n InkStorageDescriptor,\n InkCallableDescriptor,\n InkCallableDescriptor,\n Event\n >,\n>(\n inkContract: D,\n): InkClient<D> => {\n if (!inkContract.metadata) {\n throw new Error(\"Ink client needs the contract metadata\")\n }\n\n const lookup = getInkLookup(inkContract.metadata)\n const builder = getInkDynamicBuilder(lookup)\n\n const constructorCodec = buildCallable(builder.buildConstructor)\n const messageCodec = buildCallable(builder.buildMessage)\n\n const findConstructor = (label: string) => {\n const result = lookup.metadata.spec.constructors.find(\n (c) => c.label === label,\n )\n if (!result) {\n throw new Error(`Constructor ${label} not found`)\n }\n return result\n }\n const findMessage = (label: string) => {\n const result = lookup.metadata.spec.messages.find((c) => c.label === label)\n if (!result) {\n throw new Error(`Message ${label} not found`)\n }\n return result\n }\n\n const defaultConstructor: any = lookup.metadata.spec.constructors.find(\n (c) => c.default,\n )?.label\n const defaultMessage: any = lookup.metadata.spec.messages.find(\n (c) => c.default,\n )?.label\n\n return {\n constructor: (label) => ({\n attributes: getAttributes(findConstructor(label)),\n ...constructorCodec(label),\n }),\n defaultConstructor,\n message: (label) => ({\n attributes: getAttributes(findMessage(label)),\n ...messageCodec(label),\n }),\n defaultMessage,\n storage: buildStorage(builder.buildStorage),\n event:\n Number(lookup.metadata.version) === 4\n ? buildEventV4(builder.buildEvents)\n : buildEventV5(lookup, builder.buildEvent),\n }\n}\n\nconst inkClientCache = new WeakMap<\n InkDescriptors<any, any, any, any>,\n InkClient<any>\n>()\nexport const getInkClient = <\n D extends InkDescriptors<\n InkStorageDescriptor,\n InkCallableDescriptor,\n InkCallableDescriptor,\n Event\n >,\n>(\n inkContract: D,\n): InkClient<D> => {\n const cached = inkClientCache.get(inkContract)\n if (cached) return cached\n\n const client = createInkClient(inkContract)\n inkClientCache.set(inkContract, client)\n return client\n}\n\nconst getAttributes = (spec: ConstructorSpec | MessageSpec) => ({\n payable: spec.payable,\n default: spec.default,\n mutates: \"mutates\" in spec ? spec.mutates : true,\n})\n\nconst buildCallable =\n <T extends InkCallableDescriptor>(\n builder:\n | InkDynamicBuilder[\"buildConstructor\"]\n | InkDynamicBuilder[\"buildMessage\"],\n ) =>\n <L extends string & keyof T>(label: L) => {\n const codecs = builder(label)\n\n return {\n encode: (value?: T[L][\"message\"]) => codecs.call.enc(value || {}),\n decode: (response: { data: Uint8Array }) =>\n codecs.value.dec(response.data),\n }\n }\n\nconst buildStorage =\n <S extends InkStorageDescriptor>(\n builder: InkDynamicBuilder[\"buildStorage\"],\n ): InkStorageInterface<S> =>\n <L extends string & keyof S>(label?: L) => {\n const codecs = builder(label)\n\n return {\n encode: (key?: S[L][\"key\"]) => codecs.key.enc(key as any),\n decode: (response: Uint8Array) => codecs.value.dec(response),\n }\n }\n\nconst buildEventV4 = <E extends Event>(\n eventsDecoder: InkDynamicBuilder[\"buildEvents\"],\n): InkEventInterface<E> => {\n const decode: InkEventInterface<E>[\"decode\"] = (value) => {\n return eventsDecoder().dec(value.data) as E\n }\n const filter: InkEventInterface<E>[\"filter\"] = (address, events = []) => {\n const contractEvents = events\n .map((v) => (\"event\" in v ? v.event : v))\n .filter(\n (v: any) =>\n v.type === \"Contracts\" &&\n v.value.type === \"ContractEmitted\" &&\n v.value.value.contract === address,\n )\n return contractEvents.map((v: any) => {\n try {\n return decode(v.value.value)\n } catch (ex) {\n console.error(\n `Contract ${address} emitted an incompatible event`,\n v.value.value,\n )\n throw ex\n }\n })\n }\n return { decode, filter }\n}\n\nconst buildEventV5 = <E extends Event>(\n lookup: InkMetadataLookup,\n eventDecoder: InkDynamicBuilder[\"buildEvent\"],\n): InkEventInterface<E> => {\n const metadataEventTopics = new Set(\n lookup.metadata.spec.events\n .map((evt) => (evt as EventSpecV5).signature_topic)\n .filter((v) => v != null),\n )\n const hasAnonymousEvents = lookup.metadata.spec.events.some(\n (evt) => (evt as EventSpecV5).signature_topic == null,\n )\n\n const decode: InkEventInterface<E>[\"decode\"] = (value, signatureTopic) => {\n if (signatureTopic != null) {\n if (!metadataEventTopics.has(signatureTopic)) {\n throw new Error(`Event with signature topic ${value} not found`)\n }\n return eventDecoder(signatureTopic)!.dec(value.data) as E\n }\n if (!hasAnonymousEvents) {\n throw new Error(\"Event signature topic required\")\n }\n return eventDecoder(undefined)!.dec(value.data) as E\n }\n const filter: InkEventInterface<E>[\"filter\"] = (address, events = []) => {\n const addrEq = (a: string | Uint8Array) =>\n (typeof a === \"string\" ? a : toHex(a)) === address\n\n const contractEvents = events.filter(\n (v) =>\n (v.event.type === \"Contracts\" || v.event.type === \"Revive\") &&\n (v.event.value as any).type === \"ContractEmitted\" &&\n addrEq((v.event.value as any).value.contract),\n )\n\n return contractEvents\n .map((v) => {\n const eventTopics = [\n ...v.topics,\n ...(((v.event.value as any)?.value?.topics ?? []) as HexString[]),\n ]\n const suitableTopic = eventTopics.find((topic) =>\n metadataEventTopics.has(topic),\n )\n try {\n return decode((v.event.value as any).value, suitableTopic)\n } catch (ex) {\n return null\n }\n })\n .filter((v) => v !== null)\n }\n\n return {\n decode,\n filter,\n }\n}\n"],"names":[],"mappings":"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"}
@@ -120,4 +120,4 @@ const entry = enhanceCodec(
120
120
  const pjsTypes = PjsVector(entry);
121
121
 
122
122
  export { pjsTypes };
123
- //# sourceMappingURL=metadata-pjs-types.mjs.map
123
+ //# sourceMappingURL=metadata-pjs-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-pjs-types.js","sources":["../src/metadata-pjs-types.ts"],"sourcesContent":["import {\n _void,\n Codec,\n CodecType,\n compactNumber,\n enhanceCodec,\n Option,\n ScaleEnum,\n str,\n StringRecord,\n Struct,\n u32,\n u8,\n Vector,\n} from \"@polkadot-api/substrate-bindings\"\n\ntype PjsVariant<O extends StringRecord<Codec<any>>> = {\n [K in keyof O]: {\n [KK in K]: CodecType<O[K]>\n }\n}[keyof O]\nconst Variant = <O extends StringRecord<Codec<any>>>(inner: O) =>\n enhanceCodec(\n ScaleEnum(inner),\n (value: PjsVariant<O>) => {\n if (typeof value === \"string\") {\n return {\n tag: value,\n value: undefined,\n } as any\n }\n const [tag, val] = Object.entries(value)[0]\n\n return {\n tag: tag as keyof O,\n value: val,\n }\n },\n (value) => {\n return {\n [value.tag]: value.value,\n } as PjsVariant<O>\n },\n )\n\n// Seems like pjs can omit empty vectors\nconst PjsVector = <T>(inner: Codec<T>, size?: number) =>\n enhanceCodec(\n Vector(inner, size),\n (value: T[] | undefined) => value ?? [],\n (v) => v,\n )\n\nconst oStr = Option(str)\nconst docs = PjsVector(str)\n\nconst primitive = Variant({\n bool: _void,\n char: _void,\n str: _void,\n u8: _void,\n u16: _void,\n u32: _void,\n u64: _void,\n u128: _void,\n u256: _void,\n i8: _void,\n i16: _void,\n i32: _void,\n i64: _void,\n i128: _void,\n i256: _void,\n})\n\nconst fields = PjsVector(\n Struct({\n name: oStr,\n type: compactNumber,\n typeName: oStr,\n docs,\n }),\n)\n\nconst arr = Struct({\n len: u32,\n type: compactNumber,\n})\n\nconst bitSequence = Struct({\n bitStoreType: compactNumber,\n bitOrderType: compactNumber,\n})\n\nconst variants = PjsVector(\n Struct({\n name: str,\n fields,\n index: u8,\n docs,\n }),\n)\n\nconst def = Variant({\n composite: Struct({\n fields,\n }),\n variant: Struct({\n variants,\n }),\n sequence: Struct({\n type: compactNumber,\n }),\n array: arr,\n tuple: Vector(compactNumber),\n primitive,\n compact: Struct({\n type: compactNumber,\n }),\n bitSequence,\n})\n\nconst param = Struct({\n name: str,\n type: Option(compactNumber),\n})\nconst params = PjsVector(param)\n\nconst metadataEntry = Struct({\n id: compactNumber,\n path: docs,\n params,\n def,\n docs,\n})\n\nconst entry = enhanceCodec(\n metadataEntry,\n (value: {\n id: number\n type: {\n def: CodecType<typeof def>\n path: CodecType<typeof docs>\n params?: Array<{ name: string; type: number | undefined }>\n }\n }) => ({\n id: value.id,\n path: value.type.path,\n params: value.type.params ?? [],\n def: value.type.def,\n docs: [],\n }),\n (value) => ({\n id: value.id,\n type: {\n def: value.def,\n path: value.path,\n params: value.params,\n },\n }),\n)\n\nexport const pjsTypes = PjsVector(entry)\nexport type PjsTypes = CodecType<typeof pjsTypes>\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polkadot-api/ink-contracts",
3
- "version": "0.5.2-canary.f1c6573",
3
+ "version": "0.6.0",
4
4
  "author": "Victor Oliva (https://github.com/voliva)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -8,36 +8,26 @@
8
8
  },
9
9
  "license": "MIT",
10
10
  "sideEffects": false,
11
+ "type": "module",
11
12
  "exports": {
12
13
  ".": {
13
- "node": {
14
- "production": {
15
- "import": "./dist/esm/index.mjs",
16
- "require": "./dist/min/index.js",
17
- "default": "./dist/index.js"
18
- },
19
- "import": "./dist/esm/index.mjs",
20
- "require": "./dist/index.js",
21
- "default": "./dist/index.js"
22
- },
23
- "module": "./dist/esm/index.mjs",
24
- "import": "./dist/esm/index.mjs",
25
- "require": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "module": "./dist/index.js",
16
+ "import": "./dist/index.js",
26
17
  "default": "./dist/index.js"
27
- },
28
- "./package.json": "./package.json"
18
+ }
29
19
  },
30
20
  "main": "./dist/index.js",
31
- "module": "./dist/esm/index.mjs",
32
- "browser": "./dist/esm/index.mjs",
21
+ "module": "./dist/index.js",
22
+ "browser": "./dist/index.js",
33
23
  "types": "./dist/index.d.ts",
34
24
  "files": [
35
25
  "dist"
36
26
  ],
37
27
  "dependencies": {
38
- "@polkadot-api/metadata-builders": "0.13.12-canary.f1c6573",
39
- "@polkadot-api/utils": "0.3.1-canary.f1c6573",
40
- "@polkadot-api/substrate-bindings": "0.19.1-canary.f1c6573"
28
+ "@polkadot-api/substrate-bindings": "0.20.0",
29
+ "@polkadot-api/metadata-builders": "0.14.0",
30
+ "@polkadot-api/utils": "0.4.0"
41
31
  },
42
32
  "scripts": {
43
33
  "build-core": "tsc --noEmit && rollup -c ../../rollup.config.js",
@@ -1 +0,0 @@
1
- {"version":3,"file":"dynamic-builders.mjs","sources":["../../src/dynamic-builders.ts"],"sourcesContent":["import { getLookupCodecBuilder } from \"@polkadot-api/metadata-builders\"\nimport { Binary, Variant } from \"@polkadot-api/substrate-bindings\"\nimport {\n _void,\n Bytes,\n Codec,\n CodecType,\n createCodec,\n enhanceCodec,\n StringRecord,\n Struct,\n Tuple,\n} from \"@polkadot-api/substrate-bindings\"\nimport { InkMetadataLookup } from \"./get-lookup\"\nimport {\n EventParamSpec,\n EventSpecV5,\n MessageParamSpec,\n TypeSpec,\n} from \"./metadata-types\"\n\nexport const getInkDynamicBuilder = (metadataLookup: InkMetadataLookup) => {\n const { metadata } = metadataLookup\n\n const buildDefinition = getLookupCodecBuilder(metadataLookup)\n\n const buildStorage = (name = \"\") => {\n const storageEntry = metadataLookup.storage[name]\n if (!storageEntry)\n throw new Error(`Storage entry ${name ? name : \"{root}\"} not found`)\n\n const keyCodec =\n storageEntry.key == null ? _void : buildDefinition(storageEntry.key)\n return {\n key: prependBytes(keyCodec, storageEntry.keyPrefix),\n value: buildDefinition(storageEntry.typeId),\n }\n }\n\n const buildCallable = (callable: {\n selector: string\n args: Array<MessageParamSpec>\n returnType: TypeSpec\n }) => {\n const argsCodec = Struct(\n Object.fromEntries(\n callable.args.map((param) => [\n param.label,\n buildDefinition(param.type.type),\n ]),\n ) as StringRecord<Codec<any>>,\n )\n\n return {\n call: prependBytes(argsCodec, callable.selector),\n value: buildDefinition(callable.returnType.type),\n }\n }\n\n const buildConstructor = (label: string) => {\n const constr = metadata.spec.constructors.find((c) => c.label === label)\n if (!constr) {\n throw new Error(`Constructor ${label} not found`)\n }\n\n return buildCallable(constr)\n }\n\n const buildMessage = (label: string) => {\n const message = metadata.spec.messages.find((c) => c.label === label)\n if (!message) {\n throw new Error(`Message ${label} not found`)\n }\n\n return buildCallable(message)\n }\n\n const buildEventCodec = (event: { args: EventParamSpec[] }) =>\n Struct(\n Object.fromEntries(\n event.args.map((param) => [\n param.label,\n buildDefinition(param.type.type),\n ]),\n ) as StringRecord<Codec<any>>,\n )\n\n const buildEvent = (signatureTopic: string | undefined) => {\n const events = metadata.spec.events as EventSpecV5[]\n\n const withType = <T>(codec: Codec<T>, type: string) =>\n enhanceCodec<T, { type: string; value: T }>(\n codec,\n (evt) => evt.value,\n (value) => ({ type, value }),\n )\n\n if (signatureTopic) {\n const event = events.find((evt) => evt.signature_topic === signatureTopic)\n return event ? withType(buildEventCodec(event), event.label) : null\n }\n\n const candidates = events.filter(\n (evt) => evt.signature_topic === signatureTopic,\n )\n return candidates.length\n ? first(candidates.map((c) => withType(buildEventCodec(c), c.label)))\n : null\n }\n\n const buildEvents = () =>\n Variant(\n Object.fromEntries(\n metadata.spec.events.map((evt) => [evt.label, buildEventCodec(evt)]),\n ) as unknown as StringRecord<Codec<any>>,\n )\n\n return {\n buildConstructor,\n buildMessage,\n buildStorage,\n buildEvents,\n buildEvent,\n }\n}\n\nexport type InkDynamicBuilder = ReturnType<typeof getInkDynamicBuilder>\n\nconst prependBytes = <T>(codec: Codec<T>, hex: string) => {\n const bytes = Binary.fromHex(hex)\n const wrappedCodec = Tuple(Bytes(bytes.length), codec)\n return enhanceCodec(\n wrappedCodec,\n (value: CodecType<typeof codec>): CodecType<typeof wrappedCodec> => [\n bytes,\n value,\n ],\n ([, value]) => value,\n )\n}\n\nconst first = <T>(codecs: Codec<T>[]) =>\n createCodec<T>(\n (x) => {\n for (const codec of codecs) {\n try {\n codec.enc(x)\n } catch (_) {}\n }\n throw new Error(\"Unable to encode\")\n },\n (x) => {\n for (const codec of codecs) {\n try {\n codec.dec(x)\n } catch (_) {}\n }\n throw new Error(\"Unable to decode\")\n },\n )\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-lookup.mjs","sources":["../../src/get-lookup.ts"],"sourcesContent":["import { denormalizeLookup, LookupEntry } from \"@polkadot-api/metadata-builders\"\nimport { Binary, V14Lookup, v14Lookup } from \"@polkadot-api/substrate-bindings\"\nimport { toHex } from \"@polkadot-api/utils\"\nimport { pjsTypes } from \"./metadata-pjs-types\"\nimport { InkMetadata, Layout } from \"./metadata-types\"\n\nexport interface InkMetadataLookup {\n (id: number): LookupEntry\n metadata: InkMetadata\n storage: StorageLayout\n}\n\nexport interface StorageEntryPoint {\n keyPrefix: string\n key: number | null\n typeId: number\n}\n\nexport type StorageLayout = Record<string, StorageEntryPoint>\n\nexport const getInkLookup = (metadata: InkMetadata): InkMetadataLookup => {\n // We can reuse dynamic-builder's lookup if we encode and re-decode the type\n // into V14Lookup, because both v14 metadata lookup and ink types use scale-info\n const encoded = pjsTypes.enc(metadata.types)\n const decoded = v14Lookup.dec(encoded)\n\n // Signal the lookup the AccountId type\n const accountTypeId = metadata.spec.environment.accountId.type\n const accountIdEntry = decoded.find((e) => e.id === accountTypeId)\n if (accountIdEntry) {\n accountIdEntry.path = [\"AccountId32\"]\n }\n\n const storage = getStorageLayout(metadata, decoded)\n const getLookupEntryDef = denormalizeLookup(decoded)\n\n return Object.assign(getLookupEntryDef, {\n metadata,\n lookup: decoded,\n storage,\n })\n}\n\nfunction getStorageLayout(metadata: InkMetadata, lookup: V14Lookup) {\n const result: StorageLayout = {}\n\n const readLayout = (node: Layout, path: string[] = []): number | null => {\n function addType(def: V14Lookup[number][\"def\"]) {\n const id = lookup.length\n lookup[id] = {\n id,\n docs: [],\n def,\n params: [],\n path: [],\n }\n return id\n }\n\n if (\"root\" in node) {\n // On version 4-, the keys in the storage were in big-endian.\n // For version 5+, the keys in storage are in scale, which is little-endian.\n // https://use.ink/faq/migrating-from-ink-4-to-5#metadata-storage-keys-encoding-change\n // https://github.com/use-ink/ink/pull/2048\n const keyPrefix =\n Number(metadata.version) === 4\n ? toHex(Binary.fromHex(node.root.root_key).reverse())\n : node.root.root_key\n\n const typeId = readLayout(node.root.layout, path)!\n if (node.root.ty != null) {\n function resolveType(id: number, path: string[]) {\n const type = metadata.types[id].type\n\n // A vector internally uses a Mapping, but we have to get it\n const fields =\n \"composite\" in type.def\n ? new Map(\n (type.def.composite.fields ?? []).map((v) => [\n v.name,\n v.type,\n ]),\n )\n : null\n const params = new Map(\n (type.params ?? []).map((v) => [v.name, v.type]),\n )\n\n if (\n params.size === 2 &&\n params.has(\"V\") &&\n fields &&\n fields.size === 2 &&\n fields.has(\"len\") &&\n fields.has(\"elements\")\n ) {\n // Vectors have length and elements as different entry points\n resolveType(fields.get(\"len\")!, [...path, \"len\"])\n resolveType(fields.get(\"elements\")!, path)\n return\n } else if (params.size === 3 && params.has(\"K\") && params.has(\"V\")) {\n // Mapping\n result[path.join(\".\")] = {\n keyPrefix,\n key: params.get(\"K\")!,\n typeId: params.get(\"V\")!,\n }\n } else if (params.size === 2 && params.has(\"V\")) {\n // Lazy\n result[path.join(\".\")] = {\n keyPrefix,\n key: null,\n typeId: params.get(\"V\")!,\n }\n }\n }\n resolveType(node.root.ty, path)\n }\n\n if (!result[path.join(\".\")]) {\n result[path.join(\".\")] = {\n keyPrefix,\n key: null,\n typeId,\n }\n }\n\n // Anyone addressing this node will encounter an empty type\n return addType({\n tag: \"composite\",\n value: [],\n })\n }\n if (\"leaf\" in node) {\n return node.leaf.ty\n }\n if (\"hash\" in node) {\n throw new Error(\"HashLayout not implemented\")\n }\n if (\"array\" in node) {\n const inner = readLayout(node.array.layout, path)\n\n return inner == null\n ? null\n : addType({\n tag: \"array\",\n value: {\n len: node.array.len,\n type: inner,\n },\n })\n }\n if (\"struct\" in node) {\n const inner = node.struct.fields\n .map((field) => ({\n name: field.name,\n type: readLayout(field.layout, [...path, field.name])!,\n typeName: undefined,\n docs: [],\n }))\n .filter((field) => field.type != null)\n\n return addType({\n tag: \"composite\",\n value: inner,\n })\n }\n\n const inner = Object.values(node.enum.variants).map((variant, index) => ({\n name: variant.name,\n fields: variant.fields\n .map((field) => ({\n name: field.name,\n type: readLayout(field.layout, [...path, variant.name, field.name])!,\n typeName: undefined,\n docs: [],\n }))\n .filter((v) => v.type !== null),\n index,\n docs: [],\n }))\n\n return addType({\n tag: \"variant\",\n value: inner,\n })\n }\n readLayout(metadata.storage)\n\n return result\n}\n"],"names":["resolveType","path","inner"],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- export { getInkDynamicBuilder } from './dynamic-builders.mjs';
2
- export { getInkLookup } from './get-lookup.mjs';
3
- export { getInkClient } from './ink-client.mjs';
4
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ink-client.mjs","sources":["../../src/ink-client.ts"],"sourcesContent":["import { HexString } from \"@polkadot-api/substrate-bindings\"\nimport { toHex } from \"@polkadot-api/utils\"\nimport { getInkDynamicBuilder, InkDynamicBuilder } from \"./dynamic-builders\"\nimport { getInkLookup, InkMetadataLookup } from \"./get-lookup\"\nimport {\n Event,\n InkCallableDescriptor,\n InkDescriptors,\n InkStorageDescriptor,\n} from \"./ink-descriptors\"\nimport { ConstructorSpec, EventSpecV5, MessageSpec } from \"./metadata-types\"\n\nexport type InkCallableInterface<T extends InkCallableDescriptor> = <\n L extends string & keyof T,\n>(\n label: L,\n) => {\n encode: {} extends T[L][\"message\"]\n ? (value?: T[L][\"message\"]) => Uint8Array\n : (value: T[L][\"message\"]) => Uint8Array\n decode: (value: { data: Uint8Array }) => T[L][\"response\"]\n attributes: {\n payable: boolean\n default: boolean\n mutates: boolean\n }\n}\n\nexport type InkStorageInterface<S extends InkStorageDescriptor> =\n (\"\" extends keyof S\n ? () => {\n encode: S[\"\"][\"key\"] extends undefined\n ? (key?: undefined) => Uint8Array\n : (key: S[\"\"][\"key\"]) => Uint8Array\n decode: (data: Uint8Array) => S[\"\"][\"value\"]\n }\n : unknown) &\n (<L extends string & keyof S>(\n label: L,\n ) => {\n encode: S[L][\"key\"] extends undefined\n ? (key?: undefined) => Uint8Array\n : (key: S[L][\"key\"]) => Uint8Array\n decode: (data: Uint8Array) => S[L][\"value\"]\n })\n\nexport type GenericEvent =\n | {\n type: \"Contracts\"\n value:\n | {\n type: \"ContractEmitted\"\n value: {\n contract: string\n data: Uint8Array\n }\n }\n | { type: string; value: unknown }\n }\n | { type: string; value: unknown }\nexport interface InkEventInterface<E> {\n decode: (value: { data: Uint8Array }, signatureTopic?: string) => E\n filter: (\n address: string,\n events?: Array<{ event: GenericEvent; topics: HexString[] }>,\n ) => E[]\n}\n\ntype HasDefault<T> = \"default\" extends keyof T\n ? T[\"default\"] extends true\n ? true\n : false\n : false\ntype GetDefault<M> = keyof {\n [K in keyof M as HasDefault<M[K]> extends true ? K : never]: true\n}\n\n// T can be the default message or `never`.\n// Typescript doesn't like doing `extends never` (it works for the \"false\" case, but for the other it will always give back never)\n// One way of running around it is by checking whether an empty object extends an object with that key.\ntype WrapDefault<T extends string> = {} extends {\n [K in T]: K\n}\n ? string | undefined\n : T\n\nexport interface InkClient<\n D extends InkDescriptors<\n InkStorageDescriptor,\n InkCallableDescriptor,\n InkCallableDescriptor,\n Event\n >,\n> {\n constructor: InkCallableInterface<D[\"__types\"][\"constructors\"]>\n defaultConstructor: WrapDefault<GetDefault<D[\"__types\"][\"constructors\"]>>\n message: InkCallableInterface<D[\"__types\"][\"messages\"]>\n defaultMessage: WrapDefault<GetDefault<D[\"__types\"][\"messages\"]>>\n storage: InkStorageInterface<D[\"__types\"][\"storage\"]>\n event: InkEventInterface<D[\"__types\"][\"event\"]>\n}\n\nconst createInkClient = <\n D extends InkDescriptors<\n InkStorageDescriptor,\n InkCallableDescriptor,\n InkCallableDescriptor,\n Event\n >,\n>(\n inkContract: D,\n): InkClient<D> => {\n if (!inkContract.metadata) {\n throw new Error(\"Ink client needs the contract metadata\")\n }\n\n const lookup = getInkLookup(inkContract.metadata)\n const builder = getInkDynamicBuilder(lookup)\n\n const constructorCodec = buildCallable(builder.buildConstructor)\n const messageCodec = buildCallable(builder.buildMessage)\n\n const findConstructor = (label: string) => {\n const result = lookup.metadata.spec.constructors.find(\n (c) => c.label === label,\n )\n if (!result) {\n throw new Error(`Constructor ${label} not found`)\n }\n return result\n }\n const findMessage = (label: string) => {\n const result = lookup.metadata.spec.messages.find((c) => c.label === label)\n if (!result) {\n throw new Error(`Message ${label} not found`)\n }\n return result\n }\n\n const defaultConstructor: any = lookup.metadata.spec.constructors.find(\n (c) => c.default,\n )?.label\n const defaultMessage: any = lookup.metadata.spec.messages.find(\n (c) => c.default,\n )?.label\n\n return {\n constructor: (label) => ({\n attributes: getAttributes(findConstructor(label)),\n ...constructorCodec(label),\n }),\n defaultConstructor,\n message: (label) => ({\n attributes: getAttributes(findMessage(label)),\n ...messageCodec(label),\n }),\n defaultMessage,\n storage: buildStorage(builder.buildStorage),\n event:\n Number(lookup.metadata.version) === 4\n ? buildEventV4(builder.buildEvents)\n : buildEventV5(lookup, builder.buildEvent),\n }\n}\n\nconst inkClientCache = new WeakMap<\n InkDescriptors<any, any, any, any>,\n InkClient<any>\n>()\nexport const getInkClient = <\n D extends InkDescriptors<\n InkStorageDescriptor,\n InkCallableDescriptor,\n InkCallableDescriptor,\n Event\n >,\n>(\n inkContract: D,\n): InkClient<D> => {\n const cached = inkClientCache.get(inkContract)\n if (cached) return cached\n\n const client = createInkClient(inkContract)\n inkClientCache.set(inkContract, client)\n return client\n}\n\nconst getAttributes = (spec: ConstructorSpec | MessageSpec) => ({\n payable: spec.payable,\n default: spec.default,\n mutates: \"mutates\" in spec ? spec.mutates : true,\n})\n\nconst buildCallable =\n <T extends InkCallableDescriptor>(\n builder:\n | InkDynamicBuilder[\"buildConstructor\"]\n | InkDynamicBuilder[\"buildMessage\"],\n ) =>\n <L extends string & keyof T>(label: L) => {\n const codecs = builder(label)\n\n return {\n encode: (value?: T[L][\"message\"]) => codecs.call.enc(value || {}),\n decode: (response: { data: Uint8Array }) =>\n codecs.value.dec(response.data),\n }\n }\n\nconst buildStorage =\n <S extends InkStorageDescriptor>(\n builder: InkDynamicBuilder[\"buildStorage\"],\n ): InkStorageInterface<S> =>\n <L extends string & keyof S>(label?: L) => {\n const codecs = builder(label)\n\n return {\n encode: (key?: S[L][\"key\"]) => codecs.key.enc(key as any),\n decode: (response: Uint8Array) => codecs.value.dec(response),\n }\n }\n\nconst buildEventV4 = <E extends Event>(\n eventsDecoder: InkDynamicBuilder[\"buildEvents\"],\n): InkEventInterface<E> => {\n const decode: InkEventInterface<E>[\"decode\"] = (value) => {\n return eventsDecoder().dec(value.data) as E\n }\n const filter: InkEventInterface<E>[\"filter\"] = (address, events = []) => {\n const contractEvents = events\n .map((v) => (\"event\" in v ? v.event : v))\n .filter(\n (v: any) =>\n v.type === \"Contracts\" &&\n v.value.type === \"ContractEmitted\" &&\n v.value.value.contract === address,\n )\n return contractEvents.map((v: any) => {\n try {\n return decode(v.value.value)\n } catch (ex) {\n console.error(\n `Contract ${address} emitted an incompatible event`,\n v.value.value,\n )\n throw ex\n }\n })\n }\n return { decode, filter }\n}\n\nconst buildEventV5 = <E extends Event>(\n lookup: InkMetadataLookup,\n eventDecoder: InkDynamicBuilder[\"buildEvent\"],\n): InkEventInterface<E> => {\n const metadataEventTopics = new Set(\n lookup.metadata.spec.events\n .map((evt) => (evt as EventSpecV5).signature_topic)\n .filter((v) => v != null),\n )\n const hasAnonymousEvents = lookup.metadata.spec.events.some(\n (evt) => (evt as EventSpecV5).signature_topic == null,\n )\n\n const decode: InkEventInterface<E>[\"decode\"] = (value, signatureTopic) => {\n if (signatureTopic != null) {\n if (!metadataEventTopics.has(signatureTopic)) {\n throw new Error(`Event with signature topic ${value} not found`)\n }\n return eventDecoder(signatureTopic)!.dec(value.data) as E\n }\n if (!hasAnonymousEvents) {\n throw new Error(\"Event signature topic required\")\n }\n return eventDecoder(undefined)!.dec(value.data) as E\n }\n const filter: InkEventInterface<E>[\"filter\"] = (address, events = []) => {\n const addrEq = (a: string | Uint8Array) =>\n (typeof a === \"string\" ? a : toHex(a)) === address\n\n const contractEvents = events.filter(\n (v) =>\n (v.event.type === \"Contracts\" || v.event.type === \"Revive\") &&\n (v.event.value as any).type === \"ContractEmitted\" &&\n addrEq((v.event.value as any).value.contract),\n )\n\n return contractEvents\n .map((v) => {\n const eventTopics = [\n ...v.topics,\n ...(((v.event.value as any)?.value?.topics ?? []) as HexString[]),\n ]\n const suitableTopic = eventTopics.find((topic) =>\n metadataEventTopics.has(topic),\n )\n try {\n return decode((v.event.value as any).value, suitableTopic)\n } catch (ex) {\n return null\n }\n })\n .filter((v) => v !== null)\n }\n\n return {\n decode,\n filter,\n }\n}\n"],"names":[],"mappings":";;;;AAsGA,MAAM,eAAA,GAAkB,CAQtB,WAAA,KACiB;AACjB,EAAA,IAAI,CAAC,YAAY,QAAA,EAAU;AACzB,IAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,EAC1D;AAEA,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,WAAA,CAAY,QAAQ,CAAA;AAChD,EAAA,MAAM,OAAA,GAAU,qBAAqB,MAAM,CAAA;AAE3C,EAAA,MAAM,gBAAA,GAAmB,aAAA,CAAc,OAAA,CAAQ,gBAAgB,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,OAAA,CAAQ,YAAY,CAAA;AAEvD,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAkB;AACzC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,IAAA;AAAA,MAC/C,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU;AAAA,KACrB;AACA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,KAAK,CAAA,UAAA,CAAY,CAAA;AAAA,IAClD;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAkB;AACrC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA;AAC1E,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,KAAK,CAAA,UAAA,CAAY,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,kBAAA,GAA0B,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,IAAA;AAAA,IAChE,CAAC,MAAM,CAAA,CAAE;AAAA,GACX,EAAG,KAAA;AACH,EAAA,MAAM,cAAA,GAAsB,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,IAAA;AAAA,IACxD,CAAC,MAAM,CAAA,CAAE;AAAA,GACX,EAAG,KAAA;AAEH,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,CAAC,KAAA,MAAW;AAAA,MACvB,UAAA,EAAY,aAAA,CAAc,eAAA,CAAgB,KAAK,CAAC,CAAA;AAAA,MAChD,GAAG,iBAAiB,KAAK;AAAA,KAC3B,CAAA;AAAA,IACA,kBAAA;AAAA,IACA,OAAA,EAAS,CAAC,KAAA,MAAW;AAAA,MACnB,UAAA,EAAY,aAAA,CAAc,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,MAC5C,GAAG,aAAa,KAAK;AAAA,KACvB,CAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA,EAAS,YAAA,CAAa,OAAA,CAAQ,YAAY,CAAA;AAAA,IAC1C,KAAA,EACE,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,KAAM,CAAA,GAChC,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA,GAChC,YAAA,CAAa,MAAA,EAAQ,QAAQ,UAAU;AAAA,GAC/C;AACF,CAAA;AAEA,MAAM,cAAA,uBAAqB,OAAA,EAGzB;AACK,MAAM,YAAA,GAAe,CAQ1B,WAAA,KACiB;AACjB,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA;AAC7C,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,MAAM,MAAA,GAAS,gBAAgB,WAAW,CAAA;AAC1C,EAAA,cAAA,CAAe,GAAA,CAAI,aAAa,MAAM,CAAA;AACtC,EAAA,OAAO,MAAA;AACT;AAEA,MAAM,aAAA,GAAgB,CAAC,IAAA,MAAyC;AAAA,EAC9D,SAAS,IAAA,CAAK,OAAA;AAAA,EACd,SAAS,IAAA,CAAK,OAAA;AAAA,EACd,OAAA,EAAS,SAAA,IAAa,IAAA,GAAO,IAAA,CAAK,OAAA,GAAU;AAC9C,CAAA,CAAA;AAEA,MAAM,aAAA,GACJ,CACE,OAAA,KAIF,CAA6B,KAAA,KAAa;AACxC,EAAA,MAAM,MAAA,GAAS,QAAQ,KAAK,CAAA;AAE5B,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,CAAC,KAAA,KAA4B,MAAA,CAAO,KAAK,GAAA,CAAI,KAAA,IAAS,EAAE,CAAA;AAAA,IAChE,QAAQ,CAAC,QAAA,KACP,OAAO,KAAA,CAAM,GAAA,CAAI,SAAS,IAAI;AAAA,GAClC;AACF,CAAA;AAEF,MAAM,YAAA,GACJ,CACE,OAAA,KAEF,CAA6B,KAAA,KAAc;AACzC,EAAA,MAAM,MAAA,GAAS,QAAQ,KAAK,CAAA;AAE5B,EAAA,OAAO;AAAA,IACL,QAAQ,CAAC,GAAA,KAAsB,MAAA,CAAO,GAAA,CAAI,IAAI,GAAU,CAAA;AAAA,IACxD,QAAQ,CAAC,QAAA,KAAyB,MAAA,CAAO,KAAA,CAAM,IAAI,QAAQ;AAAA,GAC7D;AACF,CAAA;AAEF,MAAM,YAAA,GAAe,CACnB,aAAA,KACyB;AACzB,EAAA,MAAM,MAAA,GAAyC,CAAC,KAAA,KAAU;AACxD,IAAA,OAAO,aAAA,EAAc,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAAA,EACvC,CAAA;AACA,EAAA,MAAM,MAAA,GAAyC,CAAC,OAAA,EAAS,MAAA,GAAS,EAAC,KAAM;AACvE,IAAA,MAAM,cAAA,GAAiB,MAAA,CACpB,GAAA,CAAI,CAAC,CAAA,KAAO,WAAW,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAE,CAAA,CACvC,MAAA;AAAA,MACC,CAAC,CAAA,KACC,CAAA,CAAE,IAAA,KAAS,WAAA,IACX,CAAA,CAAE,KAAA,CAAM,IAAA,KAAS,iBAAA,IACjB,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,QAAA,KAAa;AAAA,KAC/B;AACF,IAAA,OAAO,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,KAAW;AACpC,MAAA,IAAI;AACF,QAAA,OAAO,MAAA,CAAO,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA;AAAA,MAC7B,SAAS,EAAA,EAAI;AACX,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,YAAY,OAAO,CAAA,8BAAA,CAAA;AAAA,UACnB,EAAE,KAAA,CAAM;AAAA,SACV;AACA,QAAA,MAAM,EAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AACA,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAC1B,CAAA;AAEA,MAAM,YAAA,GAAe,CACnB,MAAA,EACA,YAAA,KACyB;AACzB,EAAA,MAAM,sBAAsB,IAAI,GAAA;AAAA,IAC9B,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,MAAA,CAClB,IAAI,CAAC,GAAA,KAAS,GAAA,CAAoB,eAAe,CAAA,CACjD,MAAA,CAAO,CAAC,CAAA,KAAM,KAAK,IAAI;AAAA,GAC5B;AACA,EAAA,MAAM,kBAAA,GAAqB,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,IACrD,CAAC,GAAA,KAAS,GAAA,CAAoB,eAAA,IAAmB;AAAA,GACnD;AAEA,EAAA,MAAM,MAAA,GAAyC,CAAC,KAAA,EAAO,cAAA,KAAmB;AACxE,IAAA,IAAI,kBAAkB,IAAA,EAAM;AAC1B,MAAA,IAAI,CAAC,mBAAA,CAAoB,GAAA,CAAI,cAAc,CAAA,EAAG;AAC5C,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,KAAK,CAAA,UAAA,CAAY,CAAA;AAAA,MACjE;AACA,MAAA,OAAO,YAAA,CAAa,cAAc,CAAA,CAAG,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,IACrD;AACA,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AACA,IAAA,OAAO,YAAA,CAAa,MAAS,CAAA,CAAG,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,EAChD,CAAA;AACA,EAAA,MAAM,MAAA,GAAyC,CAAC,OAAA,EAAS,MAAA,GAAS,EAAC,KAAM;AACvE,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAA,CACb,OAAO,MAAM,QAAA,GAAW,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,MAAO,OAAA;AAE7C,IAAA,MAAM,iBAAiB,MAAA,CAAO,MAAA;AAAA,MAC5B,CAAC,OACE,CAAA,CAAE,KAAA,CAAM,SAAS,WAAA,IAAe,CAAA,CAAE,MAAM,IAAA,KAAS,QAAA,KACjD,EAAE,KAAA,CAAM,KAAA,CAAc,SAAS,iBAAA,IAChC,MAAA,CAAQ,EAAE,KAAA,CAAM,KAAA,CAAc,MAAM,QAAQ;AAAA,KAChD;AAEA,IAAA,OAAO,cAAA,CACJ,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,GAAG,CAAA,CAAE,MAAA;AAAA,QACL,GAAM,CAAA,CAAE,KAAA,CAAM,KAAA,EAAe,KAAA,EAAO,UAAU;AAAC,OACjD;AACA,MAAA,MAAM,gBAAgB,WAAA,CAAY,IAAA;AAAA,QAAK,CAAC,KAAA,KACtC,mBAAA,CAAoB,GAAA,CAAI,KAAK;AAAA,OAC/B;AACA,MAAA,IAAI;AACF,QAAA,OAAO,MAAA,CAAQ,CAAA,CAAE,KAAA,CAAM,KAAA,CAAc,OAAO,aAAa,CAAA;AAAA,MAC3D,SAAS,EAAA,EAAI;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,IAAI,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadata-pjs-types.mjs","sources":["../../src/metadata-pjs-types.ts"],"sourcesContent":["import {\n _void,\n Codec,\n CodecType,\n compactNumber,\n enhanceCodec,\n Option,\n ScaleEnum,\n str,\n StringRecord,\n Struct,\n u32,\n u8,\n Vector,\n} from \"@polkadot-api/substrate-bindings\"\n\ntype PjsVariant<O extends StringRecord<Codec<any>>> = {\n [K in keyof O]: {\n [KK in K]: CodecType<O[K]>\n }\n}[keyof O]\nconst Variant = <O extends StringRecord<Codec<any>>>(inner: O) =>\n enhanceCodec(\n ScaleEnum(inner),\n (value: PjsVariant<O>) => {\n if (typeof value === \"string\") {\n return {\n tag: value,\n value: undefined,\n } as any\n }\n const [tag, val] = Object.entries(value)[0]\n\n return {\n tag: tag as keyof O,\n value: val,\n }\n },\n (value) => {\n return {\n [value.tag]: value.value,\n } as PjsVariant<O>\n },\n )\n\n// Seems like pjs can omit empty vectors\nconst PjsVector = <T>(inner: Codec<T>, size?: number) =>\n enhanceCodec(\n Vector(inner, size),\n (value: T[] | undefined) => value ?? [],\n (v) => v,\n )\n\nconst oStr = Option(str)\nconst docs = PjsVector(str)\n\nconst primitive = Variant({\n bool: _void,\n char: _void,\n str: _void,\n u8: _void,\n u16: _void,\n u32: _void,\n u64: _void,\n u128: _void,\n u256: _void,\n i8: _void,\n i16: _void,\n i32: _void,\n i64: _void,\n i128: _void,\n i256: _void,\n})\n\nconst fields = PjsVector(\n Struct({\n name: oStr,\n type: compactNumber,\n typeName: oStr,\n docs,\n }),\n)\n\nconst arr = Struct({\n len: u32,\n type: compactNumber,\n})\n\nconst bitSequence = Struct({\n bitStoreType: compactNumber,\n bitOrderType: compactNumber,\n})\n\nconst variants = PjsVector(\n Struct({\n name: str,\n fields,\n index: u8,\n docs,\n }),\n)\n\nconst def = Variant({\n composite: Struct({\n fields,\n }),\n variant: Struct({\n variants,\n }),\n sequence: Struct({\n type: compactNumber,\n }),\n array: arr,\n tuple: Vector(compactNumber),\n primitive,\n compact: Struct({\n type: compactNumber,\n }),\n bitSequence,\n})\n\nconst param = Struct({\n name: str,\n type: Option(compactNumber),\n})\nconst params = PjsVector(param)\n\nconst metadataEntry = Struct({\n id: compactNumber,\n path: docs,\n params,\n def,\n docs,\n})\n\nconst entry = enhanceCodec(\n metadataEntry,\n (value: {\n id: number\n type: {\n def: CodecType<typeof def>\n path: CodecType<typeof docs>\n params?: Array<{ name: string; type: number | undefined }>\n }\n }) => ({\n id: value.id,\n path: value.type.path,\n params: value.type.params ?? [],\n def: value.type.def,\n docs: [],\n }),\n (value) => ({\n id: value.id,\n type: {\n def: value.def,\n path: value.path,\n params: value.params,\n },\n }),\n)\n\nexport const pjsTypes = PjsVector(entry)\nexport type PjsTypes = CodecType<typeof pjsTypes>\n"],"names":[],"mappings":";;AAqBA,MAAM,OAAA,GAAU,CAAqC,KAAA,KACnD,YAAA;AAAA,EACE,UAAU,KAAK,CAAA;AAAA,EACf,CAAC,KAAA,KAAyB;AACxB,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,KAAA;AAAA,QACL,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AACA,IAAA,MAAM,CAAC,KAAK,GAAG,CAAA,GAAI,OAAO,OAAA,CAAQ,KAAK,EAAE,CAAC,CAAA;AAE1C,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AAAA,EACF,CAAA;AAAA,EACA,CAAC,KAAA,KAAU;AACT,IAAA,OAAO;AAAA,MACL,CAAC,KAAA,CAAM,GAAG,GAAG,KAAA,CAAM;AAAA,KACrB;AAAA,EACF;AACF,CAAA;AAGF,MAAM,SAAA,GAAY,CAAI,KAAA,EAAiB,IAAA,KACrC,YAAA;AAAA,EACE,MAAA,CAAO,OAAO,IAAI,CAAA;AAAA,EAClB,CAAC,KAAA,KAA2B,KAAA,IAAS,EAAC;AAAA,EACtC,CAAC,CAAA,KAAM;AACT,CAAA;AAEF,MAAM,IAAA,GAAO,OAAO,GAAG,CAAA;AACvB,MAAM,IAAA,GAAO,UAAU,GAAG,CAAA;AAE1B,MAAM,YAAY,OAAA,CAAQ;AAAA,EACxB,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM,KAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,KAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM,KAAA;AAAA,EACN,EAAA,EAAI,KAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAC,CAAA;AAED,MAAM,MAAA,GAAS,SAAA;AAAA,EACb,MAAA,CAAO;AAAA,IACL,IAAA,EAAM,IAAA;AAAA,IACN,IAAA,EAAM,aAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV;AAAA,GACD;AACH,CAAA;AAEA,MAAM,MAAM,MAAA,CAAO;AAAA,EACjB,GAAA,EAAK,GAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAC,CAAA;AAED,MAAM,cAAc,MAAA,CAAO;AAAA,EACzB,YAAA,EAAc,aAAA;AAAA,EACd,YAAA,EAAc;AAChB,CAAC,CAAA;AAED,MAAM,QAAA,GAAW,SAAA;AAAA,EACf,MAAA,CAAO;AAAA,IACL,IAAA,EAAM,GAAA;AAAA,IACN,MAAA;AAAA,IACA,KAAA,EAAO,EAAA;AAAA,IACP;AAAA,GACD;AACH,CAAA;AAEA,MAAM,MAAM,OAAA,CAAQ;AAAA,EAClB,WAAW,MAAA,CAAO;AAAA,IAChB;AAAA,GACD,CAAA;AAAA,EACD,SAAS,MAAA,CAAO;AAAA,IACd;AAAA,GACD,CAAA;AAAA,EACD,UAAU,MAAA,CAAO;AAAA,IACf,IAAA,EAAM;AAAA,GACP,CAAA;AAAA,EACD,KAAA,EAAO,GAAA;AAAA,EACP,KAAA,EAAO,OAAO,aAAa,CAAA;AAAA,EAC3B,SAAA;AAAA,EACA,SAAS,MAAA,CAAO;AAAA,IACd,IAAA,EAAM;AAAA,GACP,CAAA;AAAA,EACD;AACF,CAAC,CAAA;AAED,MAAM,QAAQ,MAAA,CAAO;AAAA,EACnB,IAAA,EAAM,GAAA;AAAA,EACN,IAAA,EAAM,OAAO,aAAa;AAC5B,CAAC,CAAA;AACD,MAAM,MAAA,GAAS,UAAU,KAAK,CAAA;AAE9B,MAAM,gBAAgB,MAAA,CAAO;AAAA,EAC3B,EAAA,EAAI,aAAA;AAAA,EACJ,IAAA,EAAM,IAAA;AAAA,EACN,MAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,MAAM,KAAA,GAAQ,YAAA;AAAA,EACZ,aAAA;AAAA,EACA,CAAC,KAAA,MAOM;AAAA,IACL,IAAI,KAAA,CAAM,EAAA;AAAA,IACV,IAAA,EAAM,MAAM,IAAA,CAAK,IAAA;AAAA,IACjB,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,MAAA,IAAU,EAAC;AAAA,IAC9B,GAAA,EAAK,MAAM,IAAA,CAAK,GAAA;AAAA,IAChB,MAAM;AAAC,GACT,CAAA;AAAA,EACA,CAAC,KAAA,MAAW;AAAA,IACV,IAAI,KAAA,CAAM,EAAA;AAAA,IACV,IAAA,EAAM;AAAA,MACJ,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,QAAQ,KAAA,CAAM;AAAA;AAChB,GACF;AACF,CAAA;AAEO,MAAM,QAAA,GAAW,UAAU,KAAK;;;;"}