@polkadot-api/ink-contracts 0.1.0 → 0.1.2

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.
@@ -1,57 +1,21 @@
1
1
  import { getLookupCodecBuilder } from '@polkadot-api/metadata-builders';
2
2
  import { Variant, Binary } from '@polkadot-api/substrate-bindings';
3
- import { Struct, Vector, Tuple, Option, Enum, Bytes, enhanceCodec } from 'scale-ts';
3
+ import { _void, Struct, Tuple, Bytes, enhanceCodec } from 'scale-ts';
4
4
 
5
5
  const getInkDynamicBuilder = (metadataLookup) => {
6
6
  const { metadata } = metadataLookup;
7
7
  const buildDefinition = getLookupCodecBuilder(metadataLookup);
8
- const buildLayout = (node) => {
9
- if ("root" in node) {
10
- return buildLayout(node.root.layout);
11
- }
12
- if ("leaf" in node) {
13
- return buildDefinition(node.leaf.ty);
14
- }
15
- if ("hash" in node) {
16
- throw new Error("HashLayout not implemented");
17
- }
18
- if ("array" in node) {
19
- return Vector(buildLayout(node.array.layout), node.array.len);
20
- }
21
- if ("struct" in node) {
22
- return Struct(
23
- Object.fromEntries(
24
- node.struct.fields.map((field) => [
25
- field.name,
26
- buildLayout(field.layout)
27
- ])
28
- )
29
- );
30
- }
31
- const variants = Object.values(node.enum.variants);
32
- if (node.enum.name === "Option" && variants.length === 2 && variants[0].name === "None" && variants[1].name === "Some") {
33
- const inner = variants[1].fields.length === 1 ? buildLayout(variants[1].fields[0].layout) : Tuple(...variants[1].fields.map((v) => buildLayout(v.layout)));
34
- return Option(inner);
35
- }
36
- return Enum(
37
- Object.fromEntries(
38
- Object.values(node.enum.variants).map((variant) => [
39
- variant.name,
40
- Struct(
41
- Object.fromEntries(
42
- variant.fields.map((field) => [
43
- field.name,
44
- buildLayout(field.layout)
45
- ])
46
- )
47
- )
48
- ])
49
- )
50
- );
8
+ const buildStorage = (name = "") => {
9
+ const storageEntry = metadataLookup.storage[name];
10
+ if (!storageEntry)
11
+ throw new Error(`Storage entry ${name ? name : "{root}"} not found`);
12
+ const keyCodec = storageEntry.key == null ? _void : buildDefinition(storageEntry.key);
13
+ return {
14
+ key: prependBytes(keyCodec, storageEntry.keyPrefix),
15
+ value: buildDefinition(storageEntry.typeId)
16
+ };
51
17
  };
52
- const buildStorageRoot = () => buildLayout(metadata.storage);
53
18
  const buildCallable = (callable) => {
54
- const selectorBytes = Binary.fromHex(callable.selector).asBytes();
55
19
  const argsCodec = Struct(
56
20
  Object.fromEntries(
57
21
  callable.args.map((param) => [
@@ -60,16 +24,8 @@ const getInkDynamicBuilder = (metadataLookup) => {
60
24
  ])
61
25
  )
62
26
  );
63
- const callCodec = Tuple(Bytes(4), argsCodec);
64
27
  return {
65
- call: enhanceCodec(
66
- callCodec,
67
- (value) => [
68
- selectorBytes,
69
- value
70
- ],
71
- ([, value]) => value
72
- ),
28
+ call: prependBytes(argsCodec, callable.selector),
73
29
  value: buildDefinition(callable.returnType.type)
74
30
  };
75
31
  };
@@ -105,10 +61,22 @@ const getInkDynamicBuilder = (metadataLookup) => {
105
61
  return {
106
62
  buildConstructor,
107
63
  buildMessage,
108
- buildStorageRoot,
64
+ buildStorage,
109
65
  buildEvent
110
66
  };
111
67
  };
68
+ const prependBytes = (codec, hex) => {
69
+ const bytes = Binary.fromHex(hex).asBytes();
70
+ const wrappedCodec = Tuple(Bytes(bytes.length), codec);
71
+ return enhanceCodec(
72
+ wrappedCodec,
73
+ (value) => [
74
+ bytes,
75
+ value
76
+ ],
77
+ ([, value]) => value
78
+ );
79
+ };
112
80
 
113
81
  export { getInkDynamicBuilder };
114
82
  //# sourceMappingURL=dynamic-builders.mjs.map
@@ -1 +1 @@
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 Bytes,\n Codec,\n CodecType,\n enhanceCodec,\n Enum,\n Option,\n StringRecord,\n Struct,\n Tuple,\n Vector,\n} from \"scale-ts\"\nimport { InkMetadataLookup } from \"./get-lookup\"\nimport { Layout, MessageParamSpec, TypeSpec } from \"./metadata-types\"\n\nexport const getInkDynamicBuilder = (metadataLookup: InkMetadataLookup) => {\n const { metadata } = metadataLookup\n\n const buildDefinition = getLookupCodecBuilder(metadataLookup)\n\n const buildLayout = (node: Layout): Codec<any> => {\n if (\"root\" in node) {\n return buildLayout(node.root.layout)\n }\n if (\"leaf\" in node) {\n return buildDefinition(node.leaf.ty)\n }\n if (\"hash\" in node) {\n throw new Error(\"HashLayout not implemented\")\n }\n if (\"array\" in node) {\n return Vector(buildLayout(node.array.layout), node.array.len)\n }\n if (\"struct\" in node) {\n return Struct(\n Object.fromEntries(\n node.struct.fields.map((field) => [\n field.name,\n buildLayout(field.layout),\n ]),\n ) as StringRecord<Codec<any>>,\n )\n }\n\n const variants = Object.values(node.enum.variants)\n if (\n node.enum.name === \"Option\" &&\n variants.length === 2 &&\n variants[0].name === \"None\" &&\n variants[1].name === \"Some\"\n ) {\n const inner =\n variants[1].fields.length === 1\n ? buildLayout(variants[1].fields[0].layout)\n : Tuple(...variants[1].fields.map((v) => buildLayout(v.layout)))\n return Option(inner)\n }\n\n return Enum(\n Object.fromEntries(\n Object.values(node.enum.variants).map((variant) => [\n variant.name,\n Struct(\n Object.fromEntries(\n variant.fields.map((field) => [\n field.name,\n buildLayout(field.layout),\n ]),\n ) as StringRecord<Codec<any>>,\n ),\n ]),\n ) as StringRecord<Codec<any>>,\n )\n }\n const buildStorageRoot = () => buildLayout(metadata.storage)\n\n const buildCallable = (callable: {\n selector: string\n args: Array<MessageParamSpec>\n returnType: TypeSpec\n }) => {\n const selectorBytes = Binary.fromHex(callable.selector).asBytes()\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 const callCodec = Tuple(Bytes(4), argsCodec)\n\n return {\n call: enhanceCodec(\n callCodec,\n (value: CodecType<typeof argsCodec>): CodecType<typeof callCodec> => [\n selectorBytes,\n value,\n ],\n ([, value]) => value,\n ),\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 buildEvent = () =>\n Variant(\n Object.fromEntries(\n metadata.spec.events.map((evt) => [\n evt.label,\n Struct(\n Object.fromEntries(\n evt.args.map((param) => [\n param.label,\n buildDefinition(param.type.type),\n ]),\n ) as StringRecord<Codec<any>>,\n ),\n ]),\n ) as StringRecord<Codec<any>>,\n )\n\n return {\n buildConstructor,\n buildMessage,\n buildStorageRoot,\n buildEvent,\n }\n}\n\nexport type InkDynamicBuilder = ReturnType<typeof getInkDynamicBuilder>\n"],"names":[],"mappings":"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"}
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 enhanceCodec,\n StringRecord,\n Struct,\n Tuple,\n} from \"scale-ts\"\nimport { InkMetadataLookup } from \"./get-lookup\"\nimport { MessageParamSpec, TypeSpec } 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 buildEvent = () =>\n Variant(\n Object.fromEntries(\n metadata.spec.events.map((evt) => [\n evt.label,\n Struct(\n Object.fromEntries(\n evt.args.map((param) => [\n param.label,\n buildDefinition(param.type.type),\n ]),\n ) as StringRecord<Codec<any>>,\n ),\n ]),\n ) as StringRecord<Codec<any>>,\n )\n\n return {\n buildConstructor,\n buildMessage,\n buildStorage,\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).asBytes()\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"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { denormalizeLookup } from '@polkadot-api/metadata-builders';
2
- import { v14Lookup } from '@polkadot-api/substrate-bindings';
2
+ import { v14Lookup, Binary } from '@polkadot-api/substrate-bindings';
3
3
  import { pjsTypes } from './metadata-pjs-types.mjs';
4
4
 
5
5
  const getInkLookup = (metadata) => {
@@ -10,9 +10,121 @@ const getInkLookup = (metadata) => {
10
10
  if (accountIdEntry) {
11
11
  accountIdEntry.path = ["AccountId32"];
12
12
  }
13
+ const storage = getStorageLayout(metadata, decoded);
13
14
  const getLookupEntryDef = denormalizeLookup(decoded);
14
- return Object.assign(getLookupEntryDef, { metadata });
15
+ return Object.assign(getLookupEntryDef, {
16
+ metadata,
17
+ lookup: decoded,
18
+ storage
19
+ });
15
20
  };
21
+ function getStorageLayout(metadata, lookup) {
22
+ const result = {};
23
+ const readLayout = (node, path = []) => {
24
+ function addType(def) {
25
+ const id = lookup.length;
26
+ lookup[id] = {
27
+ id,
28
+ docs: [],
29
+ def,
30
+ params: [],
31
+ path: []
32
+ };
33
+ return id;
34
+ }
35
+ if ("root" in node) {
36
+ const keyPrefix = Number(metadata.version) === 4 ? Binary.fromBytes(
37
+ Binary.fromHex(node.root.root_key).asBytes().reverse()
38
+ ).asHex() : node.root.root_key;
39
+ const typeId = readLayout(node.root.layout, path);
40
+ if (node.root.ty != null) {
41
+ let resolveType2 = function(id, path2) {
42
+ const type = metadata.types[id].type;
43
+ const fields = "composite" in type.def ? new Map(
44
+ (type.def.composite.fields ?? []).map((v) => [
45
+ v.name,
46
+ v.type
47
+ ])
48
+ ) : null;
49
+ const params = new Map(
50
+ (type.params ?? []).map((v) => [v.name, v.type])
51
+ );
52
+ if (params.size === 2 && params.has("V") && fields && fields.size === 2 && fields.has("len") && fields.has("elements")) {
53
+ resolveType2(fields.get("len"), [...path2, "len"]);
54
+ resolveType2(fields.get("elements"), path2);
55
+ return;
56
+ } else if (params.size === 3 && params.has("K") && params.has("V")) {
57
+ result[path2.join(".")] = {
58
+ keyPrefix,
59
+ key: params.get("K"),
60
+ typeId: params.get("V")
61
+ };
62
+ } else if (params.size === 2 && params.has("V")) {
63
+ result[path2.join(".")] = {
64
+ keyPrefix,
65
+ key: null,
66
+ typeId: params.get("V")
67
+ };
68
+ }
69
+ };
70
+ resolveType2(node.root.ty, path);
71
+ }
72
+ if (!result[path.join(".")]) {
73
+ result[path.join(".")] = {
74
+ keyPrefix,
75
+ key: null,
76
+ typeId
77
+ };
78
+ }
79
+ return null;
80
+ }
81
+ if ("leaf" in node) {
82
+ return node.leaf.ty;
83
+ }
84
+ if ("hash" in node) {
85
+ throw new Error("HashLayout not implemented");
86
+ }
87
+ if ("array" in node) {
88
+ const inner2 = readLayout(node.array.layout, path);
89
+ return inner2 == null ? null : addType({
90
+ tag: "array",
91
+ value: {
92
+ len: node.array.len,
93
+ type: inner2
94
+ }
95
+ });
96
+ }
97
+ if ("struct" in node) {
98
+ const inner2 = node.struct.fields.map((field) => ({
99
+ name: field.name,
100
+ type: readLayout(field.layout, [...path, field.name]),
101
+ typeName: void 0,
102
+ docs: []
103
+ })).filter((field) => field.type != null);
104
+ return addType({
105
+ tag: "composite",
106
+ value: inner2
107
+ });
108
+ }
109
+ const inner = Object.values(node.enum.variants).map((variant, index) => ({
110
+ name: variant.name,
111
+ fields: variant.fields.map((field) => ({
112
+ name: field.name,
113
+ type: readLayout(field.layout, [...path, variant.name, field.name]),
114
+ typeName: void 0,
115
+ docs: []
116
+ })).filter((v) => v.type !== null),
117
+ index,
118
+ docs: []
119
+ }));
120
+ return addType({
121
+ tag: "variant",
122
+ value: inner
123
+ });
124
+ };
125
+ readLayout(metadata.storage);
126
+ return result;
127
+ }
16
128
 
17
129
  export { getInkLookup };
18
130
  //# sourceMappingURL=get-lookup.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-lookup.mjs","sources":["../../src/get-lookup.ts"],"sourcesContent":["import { denormalizeLookup, LookupEntry } from \"@polkadot-api/metadata-builders\"\nimport { v14Lookup } from \"@polkadot-api/substrate-bindings\"\nimport { InkMetadata } from \"./metadata-types\"\nimport { pjsTypes } from \"./metadata-pjs-types\"\n\nexport interface InkMetadataLookup {\n (id: number): LookupEntry\n metadata: InkMetadata\n}\n\nexport const getInkLookup = (metadata: InkMetadata) => {\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 getLookupEntryDef = denormalizeLookup(decoded)\n\n return Object.assign(getLookupEntryDef, { metadata })\n}\n"],"names":[],"mappings":";;;;AAUa,MAAA,YAAA,GAAe,CAAC,QAA0B,KAAA;AAGrD,EAAA,MAAM,OAAU,GAAA,QAAA,CAAS,GAAI,CAAA,QAAA,CAAS,KAAK,CAAA,CAAA;AAC3C,EAAM,MAAA,OAAA,GAAU,SAAU,CAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AAGrC,EAAA,MAAM,aAAgB,GAAA,QAAA,CAAS,IAAK,CAAA,WAAA,CAAY,SAAU,CAAA,IAAA,CAAA;AAC1D,EAAA,MAAM,iBAAiB,OAAQ,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,OAAO,aAAa,CAAA,CAAA;AACjE,EAAA,IAAI,cAAgB,EAAA;AAClB,IAAe,cAAA,CAAA,IAAA,GAAO,CAAC,aAAa,CAAA,CAAA;AAAA,GACtC;AAEA,EAAM,MAAA,iBAAA,GAAoB,kBAAkB,OAAO,CAAA,CAAA;AAEnD,EAAA,OAAO,MAAO,CAAA,MAAA,CAAO,iBAAmB,EAAA,EAAE,UAAU,CAAA,CAAA;AACtD;;;;"}
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 { InkMetadata, Layout } from \"./metadata-types\"\nimport { pjsTypes } from \"./metadata-pjs-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 ? Binary.fromBytes(\n Binary.fromHex(node.root.root_key).asBytes().reverse(),\n ).asHex()\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 null\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,6 +1,6 @@
1
1
  import { Binary } from '@polkadot-api/substrate-bindings';
2
- import { getInkLookup } from './get-lookup.mjs';
3
2
  import { getInkDynamicBuilder } from './dynamic-builders.mjs';
3
+ import { getInkLookup } from './get-lookup.mjs';
4
4
 
5
5
  const getInkClient = (inkContract) => {
6
6
  const lookup = getInkLookup(inkContract.metadata);
@@ -8,7 +8,7 @@ const getInkClient = (inkContract) => {
8
8
  return {
9
9
  constructor: buildCallable(builder.buildConstructor),
10
10
  message: buildCallable(builder.buildMessage),
11
- storage: buildStorage(lookup, builder.buildStorageRoot),
11
+ storage: buildStorage(builder.buildStorage),
12
12
  event: buildEvent(builder.buildEvent)
13
13
  };
14
14
  };
@@ -19,13 +19,11 @@ const buildCallable = (builder) => (label) => {
19
19
  decode: (response) => codecs.value.dec(response.data.asBytes())
20
20
  };
21
21
  };
22
- const buildStorage = (lookup, builder) => {
23
- const { metadata } = lookup;
24
- const metadataRootKey = Binary.fromHex(metadata.storage.root.root_key);
25
- const rootKey = Number(metadata.version) === 4 ? Binary.fromBytes(metadataRootKey.asBytes().reverse()) : metadataRootKey;
22
+ const buildStorage = (builder) => (label) => {
23
+ const codecs = builder(label);
26
24
  return {
27
- rootKey,
28
- decodeRoot: (rootStorage) => builder().dec(rootStorage.asBytes())
25
+ encode: (key) => Binary.fromBytes(codecs.key.enc(key)),
26
+ decode: (response) => codecs.value.dec(response.asBytes())
29
27
  };
30
28
  };
31
29
  const buildEvent = (decoder) => {
@@ -1 +1 @@
1
- {"version":3,"file":"ink-client.mjs","sources":["../../src/ink-client.ts"],"sourcesContent":["import { Binary } from \"@polkadot-api/substrate-bindings\"\nimport { InkCallableDescriptor, InkDescriptors, Event } from \"./ink-descriptors\"\nimport { getInkLookup, InkMetadataLookup } from \"./get-lookup\"\nimport { getInkDynamicBuilder, InkDynamicBuilder } from \"./dynamic-builders\"\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\"]) => Binary\n : (value: T[L][\"message\"]) => Binary\n decode: (value: { data: Binary }) => T[L][\"response\"]\n}\n\nexport interface InkStorageInterface<S> {\n rootKey: Binary\n decodeRoot: (rootStorage: Binary) => S\n}\n\nexport type GenericEvent =\n | {\n type: \"Contracts\"\n value:\n | {\n type: \"ContractEmitted\"\n value: {\n contract: string\n data: Binary\n }\n }\n | { type: string; value: unknown }\n }\n | { type: string; value: unknown }\nexport interface InkEventInterface<E> {\n decode: (value: { data: Binary }) => E\n filter: (\n address: string,\n events?: Array<GenericEvent | { event: GenericEvent }>,\n ) => E[]\n}\n\nexport interface InkClient<\n D extends InkDescriptors<\n unknown,\n InkCallableDescriptor,\n InkCallableDescriptor,\n Event\n >,\n> {\n constructor: InkCallableInterface<D[\"__types\"][\"constructors\"]>\n message: InkCallableInterface<D[\"__types\"][\"messages\"]>\n storage: InkStorageInterface<D[\"__types\"][\"storage\"]>\n event: InkEventInterface<D[\"__types\"][\"event\"]>\n}\n\nexport const getInkClient = <\n D extends InkDescriptors<\n unknown,\n InkCallableDescriptor,\n InkCallableDescriptor,\n Event\n >,\n>(\n inkContract: D,\n): InkClient<D> => {\n const lookup = getInkLookup(inkContract.metadata)\n const builder = getInkDynamicBuilder(lookup)\n\n return {\n constructor: buildCallable(builder.buildConstructor),\n message: buildCallable(builder.buildMessage),\n storage: buildStorage(lookup, builder.buildStorageRoot),\n event: buildEvent(builder.buildEvent),\n }\n}\n\nconst buildCallable =\n <T extends InkCallableDescriptor>(\n builder:\n | InkDynamicBuilder[\"buildConstructor\"]\n | InkDynamicBuilder[\"buildMessage\"],\n ): InkCallableInterface<T> =>\n <L extends string & keyof T>(label: L) => {\n const codecs = builder(label)\n\n return {\n encode: (value?: T[L][\"message\"]) =>\n Binary.fromBytes(codecs.call.enc(value || {})),\n decode: (response) => codecs.value.dec(response.data.asBytes()),\n }\n }\n\nconst buildStorage = <S>(\n lookup: InkMetadataLookup,\n builder: InkDynamicBuilder[\"buildStorageRoot\"],\n): InkStorageInterface<S> => {\n const { metadata } = lookup\n const metadataRootKey = Binary.fromHex(metadata.storage.root.root_key)\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 rootKey =\n Number(metadata.version) === 4\n ? Binary.fromBytes(metadataRootKey.asBytes().reverse())\n : metadataRootKey\n return {\n rootKey,\n decodeRoot: (rootStorage) => builder().dec(rootStorage.asBytes()),\n }\n}\n\nconst buildEvent = <E extends Event>(\n decoder: InkDynamicBuilder[\"buildEvent\"],\n): InkEventInterface<E> => {\n const decode: InkEventInterface<E>[\"decode\"] = (value) =>\n decoder().dec(value.data.asBytes()) as E\n\n return {\n decode,\n filter: (address, events = []) =>\n 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 .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}\n"],"names":[],"mappings":";;;;AAyDa,MAAA,YAAA,GAAe,CAQ1B,WACiB,KAAA;AACjB,EAAM,MAAA,MAAA,GAAS,YAAa,CAAA,WAAA,CAAY,QAAQ,CAAA,CAAA;AAChD,EAAM,MAAA,OAAA,GAAU,qBAAqB,MAAM,CAAA,CAAA;AAE3C,EAAO,OAAA;AAAA,IACL,WAAA,EAAa,aAAc,CAAA,OAAA,CAAQ,gBAAgB,CAAA;AAAA,IACnD,OAAA,EAAS,aAAc,CAAA,OAAA,CAAQ,YAAY,CAAA;AAAA,IAC3C,OAAS,EAAA,YAAA,CAAa,MAAQ,EAAA,OAAA,CAAQ,gBAAgB,CAAA;AAAA,IACtD,KAAA,EAAO,UAAW,CAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,GACtC,CAAA;AACF,EAAA;AAEA,MAAM,aACJ,GAAA,CACE,OAIF,KAAA,CAA6B,KAAa,KAAA;AACxC,EAAM,MAAA,MAAA,GAAS,QAAQ,KAAK,CAAA,CAAA;AAE5B,EAAO,OAAA;AAAA,IACL,MAAA,EAAQ,CAAC,KAAA,KACP,MAAO,CAAA,SAAA,CAAU,MAAO,CAAA,IAAA,CAAK,GAAI,CAAA,KAAA,IAAS,EAAE,CAAC,CAAA;AAAA,IAC/C,MAAA,EAAQ,CAAC,QAAa,KAAA,MAAA,CAAO,MAAM,GAAI,CAAA,QAAA,CAAS,IAAK,CAAA,OAAA,EAAS,CAAA;AAAA,GAChE,CAAA;AACF,CAAA,CAAA;AAEF,MAAM,YAAA,GAAe,CACnB,MAAA,EACA,OAC2B,KAAA;AAC3B,EAAM,MAAA,EAAE,UAAa,GAAA,MAAA,CAAA;AACrB,EAAA,MAAM,kBAAkB,MAAO,CAAA,OAAA,CAAQ,QAAS,CAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA,CAAA;AAKrE,EAAA,MAAM,OACJ,GAAA,MAAA,CAAO,QAAS,CAAA,OAAO,CAAM,KAAA,CAAA,GACzB,MAAO,CAAA,SAAA,CAAU,eAAgB,CAAA,OAAA,EAAU,CAAA,OAAA,EAAS,CACpD,GAAA,eAAA,CAAA;AACN,EAAO,OAAA;AAAA,IACL,OAAA;AAAA,IACA,UAAA,EAAY,CAAC,WAAgB,KAAA,OAAA,GAAU,GAAI,CAAA,WAAA,CAAY,SAAS,CAAA;AAAA,GAClE,CAAA;AACF,CAAA,CAAA;AAEA,MAAM,UAAA,GAAa,CACjB,OACyB,KAAA;AACzB,EAAM,MAAA,MAAA,GAAyC,CAAC,KAC9C,KAAA,OAAA,GAAU,GAAI,CAAA,KAAA,CAAM,IAAK,CAAA,OAAA,EAAS,CAAA,CAAA;AAEpC,EAAO,OAAA;AAAA,IACL,MAAA;AAAA,IACA,MAAQ,EAAA,CAAC,OAAS,EAAA,MAAA,GAAS,EACzB,KAAA,MAAA,CACG,GAAI,CAAA,CAAC,MAAO,OAAW,IAAA,CAAA,GAAI,CAAE,CAAA,KAAA,GAAQ,CAAE,CACvC,CAAA,MAAA;AAAA,MACC,CAAC,CAAA,KACC,CAAE,CAAA,IAAA,KAAS,WACX,IAAA,CAAA,CAAE,KAAM,CAAA,IAAA,KAAS,iBACjB,IAAA,CAAA,CAAE,KAAM,CAAA,KAAA,CAAM,QAAa,KAAA,OAAA;AAAA,KAC/B,CACC,GAAI,CAAA,CAAC,CAAW,KAAA;AACf,MAAI,IAAA;AACF,QAAO,OAAA,MAAA,CAAO,CAAE,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,eACpB,EAAI,EAAA;AACX,QAAQ,OAAA,CAAA,KAAA;AAAA,UACN,YAAY,OAAO,CAAA,8BAAA,CAAA;AAAA,UACnB,EAAE,KAAM,CAAA,KAAA;AAAA,SACV,CAAA;AACA,QAAM,MAAA,EAAA,CAAA;AAAA,OACR;AAAA,KACD,CAAA;AAAA,GACP,CAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"ink-client.mjs","sources":["../../src/ink-client.ts"],"sourcesContent":["import { Binary } from \"@polkadot-api/substrate-bindings\"\nimport { getInkDynamicBuilder, InkDynamicBuilder } from \"./dynamic-builders\"\nimport { getInkLookup } from \"./get-lookup\"\nimport {\n Event,\n InkCallableDescriptor,\n InkDescriptors,\n InkStorageDescriptor,\n} from \"./ink-descriptors\"\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\"]) => Binary\n : (value: T[L][\"message\"]) => Binary\n decode: (value: { data: Binary }) => T[L][\"response\"]\n}\n\nexport type InkStorageInterface<S extends InkStorageDescriptor> =\n (\"\" extends keyof S\n ? () => {\n encode: S[\"\"][\"key\"] extends undefined\n ? (key?: undefined) => Binary\n : (key: S[\"\"][\"key\"]) => Binary\n decode: (data: Binary) => 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) => Binary\n : (key: S[L][\"key\"]) => Binary\n decode: (data: Binary) => 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: Binary\n }\n }\n | { type: string; value: unknown }\n }\n | { type: string; value: unknown }\nexport interface InkEventInterface<E> {\n decode: (value: { data: Binary }) => E\n filter: (\n address: string,\n events?: Array<GenericEvent | { event: GenericEvent }>,\n ) => E[]\n}\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 message: InkCallableInterface<D[\"__types\"][\"messages\"]>\n storage: InkStorageInterface<D[\"__types\"][\"storage\"]>\n event: InkEventInterface<D[\"__types\"][\"event\"]>\n}\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 lookup = getInkLookup(inkContract.metadata)\n const builder = getInkDynamicBuilder(lookup)\n\n return {\n constructor: buildCallable(builder.buildConstructor),\n message: buildCallable(builder.buildMessage),\n storage: buildStorage(builder.buildStorage),\n event: buildEvent(builder.buildEvent),\n }\n}\n\nconst buildCallable =\n <T extends InkCallableDescriptor>(\n builder:\n | InkDynamicBuilder[\"buildConstructor\"]\n | InkDynamicBuilder[\"buildMessage\"],\n ): InkCallableInterface<T> =>\n <L extends string & keyof T>(label: L) => {\n const codecs = builder(label)\n\n return {\n encode: (value?: T[L][\"message\"]) =>\n Binary.fromBytes(codecs.call.enc(value || {})),\n decode: (response) => codecs.value.dec(response.data.asBytes()),\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\"]) =>\n Binary.fromBytes(codecs.key.enc(key as any)),\n decode: (response: Binary) => codecs.value.dec(response.asBytes()),\n }\n }\n\nconst buildEvent = <E extends Event>(\n decoder: InkDynamicBuilder[\"buildEvent\"],\n): InkEventInterface<E> => {\n const decode: InkEventInterface<E>[\"decode\"] = (value) =>\n decoder().dec(value.data.asBytes()) as E\n\n return {\n decode,\n filter: (address, events = []) =>\n 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 .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}\n"],"names":[],"mappings":";;;;AA2Ea,MAAA,YAAA,GAAe,CAQ1B,WACiB,KAAA;AACjB,EAAM,MAAA,MAAA,GAAS,YAAa,CAAA,WAAA,CAAY,QAAQ,CAAA;AAChD,EAAM,MAAA,OAAA,GAAU,qBAAqB,MAAM,CAAA;AAE3C,EAAO,OAAA;AAAA,IACL,WAAA,EAAa,aAAc,CAAA,OAAA,CAAQ,gBAAgB,CAAA;AAAA,IACnD,OAAA,EAAS,aAAc,CAAA,OAAA,CAAQ,YAAY,CAAA;AAAA,IAC3C,OAAA,EAAS,YAAa,CAAA,OAAA,CAAQ,YAAY,CAAA;AAAA,IAC1C,KAAA,EAAO,UAAW,CAAA,OAAA,CAAQ,UAAU;AAAA,GACtC;AACF;AAEA,MAAM,aACJ,GAAA,CACE,OAIF,KAAA,CAA6B,KAAa,KAAA;AACxC,EAAM,MAAA,MAAA,GAAS,QAAQ,KAAK,CAAA;AAE5B,EAAO,OAAA;AAAA,IACL,MAAA,EAAQ,CAAC,KAAA,KACP,MAAO,CAAA,SAAA,CAAU,MAAO,CAAA,IAAA,CAAK,GAAI,CAAA,KAAA,IAAS,EAAE,CAAC,CAAA;AAAA,IAC/C,MAAA,EAAQ,CAAC,QAAa,KAAA,MAAA,CAAO,MAAM,GAAI,CAAA,QAAA,CAAS,IAAK,CAAA,OAAA,EAAS;AAAA,GAChE;AACF,CAAA;AAEF,MAAM,YACJ,GAAA,CACE,OAEF,KAAA,CAA6B,KAAc,KAAA;AACzC,EAAM,MAAA,MAAA,GAAS,QAAQ,KAAK,CAAA;AAE5B,EAAO,OAAA;AAAA,IACL,MAAA,EAAQ,CAAC,GACP,KAAA,MAAA,CAAO,UAAU,MAAO,CAAA,GAAA,CAAI,GAAI,CAAA,GAAU,CAAC,CAAA;AAAA,IAC7C,MAAA,EAAQ,CAAC,QAAqB,KAAA,MAAA,CAAO,MAAM,GAAI,CAAA,QAAA,CAAS,SAAS;AAAA,GACnE;AACF,CAAA;AAEF,MAAM,UAAA,GAAa,CACjB,OACyB,KAAA;AACzB,EAAM,MAAA,MAAA,GAAyC,CAAC,KAC9C,KAAA,OAAA,GAAU,GAAI,CAAA,KAAA,CAAM,IAAK,CAAA,OAAA,EAAS,CAAA;AAEpC,EAAO,OAAA;AAAA,IACL,MAAA;AAAA,IACA,MAAQ,EAAA,CAAC,OAAS,EAAA,MAAA,GAAS,EACzB,KAAA,MAAA,CACG,GAAI,CAAA,CAAC,MAAO,OAAW,IAAA,CAAA,GAAI,CAAE,CAAA,KAAA,GAAQ,CAAE,CACvC,CAAA,MAAA;AAAA,MACC,CAAC,CAAA,KACC,CAAE,CAAA,IAAA,KAAS,WACX,IAAA,CAAA,CAAE,KAAM,CAAA,IAAA,KAAS,iBACjB,IAAA,CAAA,CAAE,KAAM,CAAA,KAAA,CAAM,QAAa,KAAA;AAAA,KAC/B,CACC,GAAI,CAAA,CAAC,CAAW,KAAA;AACf,MAAI,IAAA;AACF,QAAO,OAAA,MAAA,CAAO,CAAE,CAAA,KAAA,CAAM,KAAK,CAAA;AAAA,eACpB,EAAI,EAAA;AACX,QAAQ,OAAA,CAAA,KAAA;AAAA,UACN,YAAY,OAAO,CAAA,8BAAA,CAAA;AAAA,UACnB,EAAE,KAAM,CAAA;AAAA,SACV;AACA,QAAM,MAAA,EAAA;AAAA;AACR,KACD;AAAA,GACP;AACF,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"metadata-pjs-types.mjs","sources":["../../src/metadata-pjs-types.ts"],"sourcesContent":["import { compactNumber } from \"@polkadot-api/substrate-bindings\"\nimport {\n _void,\n CodecType,\n str,\n Struct,\n u32,\n u8,\n Vector,\n Option,\n enhanceCodec,\n Enum,\n StringRecord,\n Codec,\n} from \"scale-ts\"\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 Enum(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: compactNumber,\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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"}
1
+ {"version":3,"file":"metadata-pjs-types.mjs","sources":["../../src/metadata-pjs-types.ts"],"sourcesContent":["import { compactNumber } from \"@polkadot-api/substrate-bindings\"\nimport {\n _void,\n CodecType,\n str,\n Struct,\n u32,\n u8,\n Vector,\n Option,\n enhanceCodec,\n Enum,\n StringRecord,\n Codec,\n} from \"scale-ts\"\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 Enum(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: compactNumber,\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/dist/index.d.ts CHANGED
@@ -163,6 +163,7 @@ interface RootLayout {
163
163
  root: {
164
164
  root_key: string;
165
165
  layout: Layout;
166
+ ty?: number;
166
167
  };
167
168
  }
168
169
  interface HashLayout {
@@ -207,10 +208,15 @@ interface FieldLayout {
207
208
  interface InkMetadataLookup {
208
209
  (id: number): LookupEntry;
209
210
  metadata: InkMetadata;
211
+ storage: StorageLayout;
210
212
  }
211
- declare const getInkLookup: (metadata: InkMetadata) => ((id: number) => LookupEntry) & {
212
- metadata: InkMetadata;
213
- };
213
+ interface StorageEntryPoint {
214
+ keyPrefix: string;
215
+ key: number | null;
216
+ typeId: number;
217
+ }
218
+ type StorageLayout = Record<string, StorageEntryPoint>;
219
+ declare const getInkLookup: (metadata: InkMetadata) => InkMetadataLookup;
214
220
 
215
221
  declare const getInkDynamicBuilder: (metadataLookup: InkMetadataLookup) => {
216
222
  buildConstructor: (label: string) => {
@@ -229,7 +235,10 @@ declare const getInkDynamicBuilder: (metadataLookup: InkMetadataLookup) => {
229
235
  }>;
230
236
  value: Codec<any>;
231
237
  };
232
- buildStorageRoot: () => Codec<any>;
238
+ buildStorage: (name?: string) => {
239
+ key: Codec<undefined>;
240
+ value: Codec<any>;
241
+ };
233
242
  buildEvent: () => Codec<{
234
243
  type: string;
235
244
  value: any;
@@ -241,7 +250,7 @@ type Event = {
241
250
  type: string;
242
251
  value: unknown;
243
252
  };
244
- interface InkDescriptors<S, M extends InkCallableDescriptor, C extends InkCallableDescriptor, E extends Event> {
253
+ interface InkDescriptors<S extends InkStorageDescriptor, M extends InkCallableDescriptor, C extends InkCallableDescriptor, E extends Event> {
245
254
  metadata: InkMetadata;
246
255
  __types: {
247
256
  storage: S;
@@ -254,6 +263,10 @@ type InkCallableDescriptor = Record<string, {
254
263
  message: StringRecord<unknown>;
255
264
  response: StringRecord<unknown>;
256
265
  }>;
266
+ type InkStorageDescriptor = Record<string, {
267
+ key: unknown;
268
+ value: unknown;
269
+ }>;
257
270
 
258
271
  type InkCallableInterface<T extends InkCallableDescriptor> = <L extends string & keyof T>(label: L) => {
259
272
  encode: {} extends T[L]["message"] ? (value?: T[L]["message"]) => Binary : (value: T[L]["message"]) => Binary;
@@ -261,10 +274,13 @@ type InkCallableInterface<T extends InkCallableDescriptor> = <L extends string &
261
274
  data: Binary;
262
275
  }) => T[L]["response"];
263
276
  };
264
- interface InkStorageInterface<S> {
265
- rootKey: Binary;
266
- decodeRoot: (rootStorage: Binary) => S;
267
- }
277
+ type InkStorageInterface<S extends InkStorageDescriptor> = ("" extends keyof S ? () => {
278
+ encode: S[""]["key"] extends undefined ? (key?: undefined) => Binary : (key: S[""]["key"]) => Binary;
279
+ decode: (data: Binary) => S[""]["value"];
280
+ } : unknown) & (<L extends string & keyof S>(label: L) => {
281
+ encode: S[L]["key"] extends undefined ? (key?: undefined) => Binary : (key: S[L]["key"]) => Binary;
282
+ decode: (data: Binary) => S[L]["value"];
283
+ });
268
284
  type GenericEvent = {
269
285
  type: "Contracts";
270
286
  value: {
@@ -289,12 +305,12 @@ interface InkEventInterface<E> {
289
305
  event: GenericEvent;
290
306
  }>) => E[];
291
307
  }
292
- interface InkClient<D extends InkDescriptors<unknown, InkCallableDescriptor, InkCallableDescriptor, Event>> {
308
+ interface InkClient<D extends InkDescriptors<InkStorageDescriptor, InkCallableDescriptor, InkCallableDescriptor, Event>> {
293
309
  constructor: InkCallableInterface<D["__types"]["constructors"]>;
294
310
  message: InkCallableInterface<D["__types"]["messages"]>;
295
311
  storage: InkStorageInterface<D["__types"]["storage"]>;
296
312
  event: InkEventInterface<D["__types"]["event"]>;
297
313
  }
298
- declare const getInkClient: <D extends InkDescriptors<unknown, InkCallableDescriptor, InkCallableDescriptor, Event>>(inkContract: D) => InkClient<D>;
314
+ declare const getInkClient: <D extends InkDescriptors<InkStorageDescriptor, InkCallableDescriptor, InkCallableDescriptor, Event>>(inkContract: D) => InkClient<D>;
299
315
 
300
- export { type ArrayLayout, type EnumLayout, type Event, type FieldLayout, type GenericEvent, type HashLayout, type InkCallableDescriptor, type InkCallableInterface, type InkClient, type InkDescriptors, type InkDynamicBuilder, type InkEventInterface, type InkMetadata, type InkMetadataLookup, type InkStorageInterface, type Layout, type LeafLayout, type MessageParamSpec, type RootLayout, type StructLayout, type TypeSpec, getInkClient, getInkDynamicBuilder, getInkLookup };
316
+ export { type ArrayLayout, type EnumLayout, type Event, type FieldLayout, type GenericEvent, type HashLayout, type InkCallableDescriptor, type InkCallableInterface, type InkClient, type InkDescriptors, type InkDynamicBuilder, type InkEventInterface, type InkMetadata, type InkMetadataLookup, type InkStorageDescriptor, type InkStorageInterface, type Layout, type LeafLayout, type MessageParamSpec, type RootLayout, type StorageEntryPoint, type StorageLayout, type StructLayout, type TypeSpec, getInkClient, getInkDynamicBuilder, getInkLookup };
package/dist/index.js CHANGED
@@ -7,53 +7,17 @@ var scaleTs = require('scale-ts');
7
7
  const getInkDynamicBuilder = (metadataLookup) => {
8
8
  const { metadata } = metadataLookup;
9
9
  const buildDefinition = metadataBuilders.getLookupCodecBuilder(metadataLookup);
10
- const buildLayout = (node) => {
11
- if ("root" in node) {
12
- return buildLayout(node.root.layout);
13
- }
14
- if ("leaf" in node) {
15
- return buildDefinition(node.leaf.ty);
16
- }
17
- if ("hash" in node) {
18
- throw new Error("HashLayout not implemented");
19
- }
20
- if ("array" in node) {
21
- return scaleTs.Vector(buildLayout(node.array.layout), node.array.len);
22
- }
23
- if ("struct" in node) {
24
- return scaleTs.Struct(
25
- Object.fromEntries(
26
- node.struct.fields.map((field) => [
27
- field.name,
28
- buildLayout(field.layout)
29
- ])
30
- )
31
- );
32
- }
33
- const variants = Object.values(node.enum.variants);
34
- if (node.enum.name === "Option" && variants.length === 2 && variants[0].name === "None" && variants[1].name === "Some") {
35
- const inner = variants[1].fields.length === 1 ? buildLayout(variants[1].fields[0].layout) : scaleTs.Tuple(...variants[1].fields.map((v) => buildLayout(v.layout)));
36
- return scaleTs.Option(inner);
37
- }
38
- return scaleTs.Enum(
39
- Object.fromEntries(
40
- Object.values(node.enum.variants).map((variant) => [
41
- variant.name,
42
- scaleTs.Struct(
43
- Object.fromEntries(
44
- variant.fields.map((field) => [
45
- field.name,
46
- buildLayout(field.layout)
47
- ])
48
- )
49
- )
50
- ])
51
- )
52
- );
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 ? scaleTs._void : buildDefinition(storageEntry.key);
15
+ return {
16
+ key: prependBytes(keyCodec, storageEntry.keyPrefix),
17
+ value: buildDefinition(storageEntry.typeId)
18
+ };
53
19
  };
54
- const buildStorageRoot = () => buildLayout(metadata.storage);
55
20
  const buildCallable = (callable) => {
56
- const selectorBytes = substrateBindings.Binary.fromHex(callable.selector).asBytes();
57
21
  const argsCodec = scaleTs.Struct(
58
22
  Object.fromEntries(
59
23
  callable.args.map((param) => [
@@ -62,16 +26,8 @@ const getInkDynamicBuilder = (metadataLookup) => {
62
26
  ])
63
27
  )
64
28
  );
65
- const callCodec = scaleTs.Tuple(scaleTs.Bytes(4), argsCodec);
66
29
  return {
67
- call: scaleTs.enhanceCodec(
68
- callCodec,
69
- (value) => [
70
- selectorBytes,
71
- value
72
- ],
73
- ([, value]) => value
74
- ),
30
+ call: prependBytes(argsCodec, callable.selector),
75
31
  value: buildDefinition(callable.returnType.type)
76
32
  };
77
33
  };
@@ -107,10 +63,22 @@ const getInkDynamicBuilder = (metadataLookup) => {
107
63
  return {
108
64
  buildConstructor,
109
65
  buildMessage,
110
- buildStorageRoot,
66
+ buildStorage,
111
67
  buildEvent
112
68
  };
113
69
  };
70
+ const prependBytes = (codec, hex) => {
71
+ const bytes = substrateBindings.Binary.fromHex(hex).asBytes();
72
+ const wrappedCodec = scaleTs.Tuple(scaleTs.Bytes(bytes.length), codec);
73
+ return scaleTs.enhanceCodec(
74
+ wrappedCodec,
75
+ (value) => [
76
+ bytes,
77
+ value
78
+ ],
79
+ ([, value]) => value
80
+ );
81
+ };
114
82
 
115
83
  const Variant = (inner) => scaleTs.enhanceCodec(
116
84
  scaleTs.Enum(inner),
@@ -237,9 +205,121 @@ const getInkLookup = (metadata) => {
237
205
  if (accountIdEntry) {
238
206
  accountIdEntry.path = ["AccountId32"];
239
207
  }
208
+ const storage = getStorageLayout(metadata, decoded);
240
209
  const getLookupEntryDef = metadataBuilders.denormalizeLookup(decoded);
241
- return Object.assign(getLookupEntryDef, { metadata });
210
+ return Object.assign(getLookupEntryDef, {
211
+ metadata,
212
+ lookup: decoded,
213
+ storage
214
+ });
242
215
  };
216
+ function getStorageLayout(metadata, lookup) {
217
+ const result = {};
218
+ const readLayout = (node, path = []) => {
219
+ function addType(def) {
220
+ const id = lookup.length;
221
+ lookup[id] = {
222
+ id,
223
+ docs: [],
224
+ def,
225
+ params: [],
226
+ path: []
227
+ };
228
+ return id;
229
+ }
230
+ if ("root" in node) {
231
+ const keyPrefix = Number(metadata.version) === 4 ? substrateBindings.Binary.fromBytes(
232
+ substrateBindings.Binary.fromHex(node.root.root_key).asBytes().reverse()
233
+ ).asHex() : node.root.root_key;
234
+ const typeId = readLayout(node.root.layout, path);
235
+ if (node.root.ty != null) {
236
+ let resolveType2 = function(id, path2) {
237
+ const type = metadata.types[id].type;
238
+ const fields = "composite" in type.def ? new Map(
239
+ (type.def.composite.fields ?? []).map((v) => [
240
+ v.name,
241
+ v.type
242
+ ])
243
+ ) : null;
244
+ const params = new Map(
245
+ (type.params ?? []).map((v) => [v.name, v.type])
246
+ );
247
+ if (params.size === 2 && params.has("V") && fields && fields.size === 2 && fields.has("len") && fields.has("elements")) {
248
+ resolveType2(fields.get("len"), [...path2, "len"]);
249
+ resolveType2(fields.get("elements"), path2);
250
+ return;
251
+ } else if (params.size === 3 && params.has("K") && params.has("V")) {
252
+ result[path2.join(".")] = {
253
+ keyPrefix,
254
+ key: params.get("K"),
255
+ typeId: params.get("V")
256
+ };
257
+ } else if (params.size === 2 && params.has("V")) {
258
+ result[path2.join(".")] = {
259
+ keyPrefix,
260
+ key: null,
261
+ typeId: params.get("V")
262
+ };
263
+ }
264
+ };
265
+ resolveType2(node.root.ty, path);
266
+ }
267
+ if (!result[path.join(".")]) {
268
+ result[path.join(".")] = {
269
+ keyPrefix,
270
+ key: null,
271
+ typeId
272
+ };
273
+ }
274
+ return null;
275
+ }
276
+ if ("leaf" in node) {
277
+ return node.leaf.ty;
278
+ }
279
+ if ("hash" in node) {
280
+ throw new Error("HashLayout not implemented");
281
+ }
282
+ if ("array" in node) {
283
+ const inner2 = readLayout(node.array.layout, path);
284
+ return inner2 == null ? null : addType({
285
+ tag: "array",
286
+ value: {
287
+ len: node.array.len,
288
+ type: inner2
289
+ }
290
+ });
291
+ }
292
+ if ("struct" in node) {
293
+ const inner2 = node.struct.fields.map((field) => ({
294
+ name: field.name,
295
+ type: readLayout(field.layout, [...path, field.name]),
296
+ typeName: void 0,
297
+ docs: []
298
+ })).filter((field) => field.type != null);
299
+ return addType({
300
+ tag: "composite",
301
+ value: inner2
302
+ });
303
+ }
304
+ const inner = Object.values(node.enum.variants).map((variant, index) => ({
305
+ name: variant.name,
306
+ fields: variant.fields.map((field) => ({
307
+ name: field.name,
308
+ type: readLayout(field.layout, [...path, variant.name, field.name]),
309
+ typeName: void 0,
310
+ docs: []
311
+ })).filter((v) => v.type !== null),
312
+ index,
313
+ docs: []
314
+ }));
315
+ return addType({
316
+ tag: "variant",
317
+ value: inner
318
+ });
319
+ };
320
+ readLayout(metadata.storage);
321
+ return result;
322
+ }
243
323
 
244
324
  const getInkClient = (inkContract) => {
245
325
  const lookup = getInkLookup(inkContract.metadata);
@@ -247,7 +327,7 @@ const getInkClient = (inkContract) => {
247
327
  return {
248
328
  constructor: buildCallable(builder.buildConstructor),
249
329
  message: buildCallable(builder.buildMessage),
250
- storage: buildStorage(lookup, builder.buildStorageRoot),
330
+ storage: buildStorage(builder.buildStorage),
251
331
  event: buildEvent(builder.buildEvent)
252
332
  };
253
333
  };
@@ -258,13 +338,11 @@ const buildCallable = (builder) => (label) => {
258
338
  decode: (response) => codecs.value.dec(response.data.asBytes())
259
339
  };
260
340
  };
261
- const buildStorage = (lookup, builder) => {
262
- const { metadata } = lookup;
263
- const metadataRootKey = substrateBindings.Binary.fromHex(metadata.storage.root.root_key);
264
- const rootKey = Number(metadata.version) === 4 ? substrateBindings.Binary.fromBytes(metadataRootKey.asBytes().reverse()) : metadataRootKey;
341
+ const buildStorage = (builder) => (label) => {
342
+ const codecs = builder(label);
265
343
  return {
266
- rootKey,
267
- decodeRoot: (rootStorage) => builder().dec(rootStorage.asBytes())
344
+ encode: (key) => substrateBindings.Binary.fromBytes(codecs.key.enc(key)),
345
+ decode: (response) => codecs.value.dec(response.asBytes())
268
346
  };
269
347
  };
270
348
  const buildEvent = (decoder) => {
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 Bytes,\n Codec,\n CodecType,\n enhanceCodec,\n Enum,\n Option,\n StringRecord,\n Struct,\n Tuple,\n Vector,\n} from \"scale-ts\"\nimport { InkMetadataLookup } from \"./get-lookup\"\nimport { Layout, MessageParamSpec, TypeSpec } from \"./metadata-types\"\n\nexport const getInkDynamicBuilder = (metadataLookup: InkMetadataLookup) => {\n const { metadata } = metadataLookup\n\n const buildDefinition = getLookupCodecBuilder(metadataLookup)\n\n const buildLayout = (node: Layout): Codec<any> => {\n if (\"root\" in node) {\n return buildLayout(node.root.layout)\n }\n if (\"leaf\" in node) {\n return buildDefinition(node.leaf.ty)\n }\n if (\"hash\" in node) {\n throw new Error(\"HashLayout not implemented\")\n }\n if (\"array\" in node) {\n return Vector(buildLayout(node.array.layout), node.array.len)\n }\n if (\"struct\" in node) {\n return Struct(\n Object.fromEntries(\n node.struct.fields.map((field) => [\n field.name,\n buildLayout(field.layout),\n ]),\n ) as StringRecord<Codec<any>>,\n )\n }\n\n const variants = Object.values(node.enum.variants)\n if (\n node.enum.name === \"Option\" &&\n variants.length === 2 &&\n variants[0].name === \"None\" &&\n variants[1].name === \"Some\"\n ) {\n const inner =\n variants[1].fields.length === 1\n ? buildLayout(variants[1].fields[0].layout)\n : Tuple(...variants[1].fields.map((v) => buildLayout(v.layout)))\n return Option(inner)\n }\n\n return Enum(\n Object.fromEntries(\n Object.values(node.enum.variants).map((variant) => [\n variant.name,\n Struct(\n Object.fromEntries(\n variant.fields.map((field) => [\n field.name,\n buildLayout(field.layout),\n ]),\n ) as StringRecord<Codec<any>>,\n ),\n ]),\n ) as StringRecord<Codec<any>>,\n )\n }\n const buildStorageRoot = () => buildLayout(metadata.storage)\n\n const buildCallable = (callable: {\n selector: string\n args: Array<MessageParamSpec>\n returnType: TypeSpec\n }) => {\n const selectorBytes = Binary.fromHex(callable.selector).asBytes()\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 const callCodec = Tuple(Bytes(4), argsCodec)\n\n return {\n call: enhanceCodec(\n callCodec,\n (value: CodecType<typeof argsCodec>): CodecType<typeof callCodec> => [\n selectorBytes,\n value,\n ],\n ([, value]) => value,\n ),\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 buildEvent = () =>\n Variant(\n Object.fromEntries(\n metadata.spec.events.map((evt) => [\n evt.label,\n Struct(\n Object.fromEntries(\n evt.args.map((param) => [\n param.label,\n buildDefinition(param.type.type),\n ]),\n ) as StringRecord<Codec<any>>,\n ),\n ]),\n ) as StringRecord<Codec<any>>,\n )\n\n return {\n buildConstructor,\n buildMessage,\n buildStorageRoot,\n buildEvent,\n }\n}\n\nexport type InkDynamicBuilder = ReturnType<typeof getInkDynamicBuilder>\n","import { compactNumber } from \"@polkadot-api/substrate-bindings\"\nimport {\n _void,\n CodecType,\n str,\n Struct,\n u32,\n u8,\n Vector,\n Option,\n enhanceCodec,\n Enum,\n StringRecord,\n Codec,\n} from \"scale-ts\"\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 Enum(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: compactNumber,\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 { v14Lookup } from \"@polkadot-api/substrate-bindings\"\nimport { InkMetadata } from \"./metadata-types\"\nimport { pjsTypes } from \"./metadata-pjs-types\"\n\nexport interface InkMetadataLookup {\n (id: number): LookupEntry\n metadata: InkMetadata\n}\n\nexport const getInkLookup = (metadata: InkMetadata) => {\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 getLookupEntryDef = denormalizeLookup(decoded)\n\n return Object.assign(getLookupEntryDef, { metadata })\n}\n","import { Binary } from \"@polkadot-api/substrate-bindings\"\nimport { InkCallableDescriptor, InkDescriptors, Event } from \"./ink-descriptors\"\nimport { getInkLookup, InkMetadataLookup } from \"./get-lookup\"\nimport { getInkDynamicBuilder, InkDynamicBuilder } from \"./dynamic-builders\"\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\"]) => Binary\n : (value: T[L][\"message\"]) => Binary\n decode: (value: { data: Binary }) => T[L][\"response\"]\n}\n\nexport interface InkStorageInterface<S> {\n rootKey: Binary\n decodeRoot: (rootStorage: Binary) => S\n}\n\nexport type GenericEvent =\n | {\n type: \"Contracts\"\n value:\n | {\n type: \"ContractEmitted\"\n value: {\n contract: string\n data: Binary\n }\n }\n | { type: string; value: unknown }\n }\n | { type: string; value: unknown }\nexport interface InkEventInterface<E> {\n decode: (value: { data: Binary }) => E\n filter: (\n address: string,\n events?: Array<GenericEvent | { event: GenericEvent }>,\n ) => E[]\n}\n\nexport interface InkClient<\n D extends InkDescriptors<\n unknown,\n InkCallableDescriptor,\n InkCallableDescriptor,\n Event\n >,\n> {\n constructor: InkCallableInterface<D[\"__types\"][\"constructors\"]>\n message: InkCallableInterface<D[\"__types\"][\"messages\"]>\n storage: InkStorageInterface<D[\"__types\"][\"storage\"]>\n event: InkEventInterface<D[\"__types\"][\"event\"]>\n}\n\nexport const getInkClient = <\n D extends InkDescriptors<\n unknown,\n InkCallableDescriptor,\n InkCallableDescriptor,\n Event\n >,\n>(\n inkContract: D,\n): InkClient<D> => {\n const lookup = getInkLookup(inkContract.metadata)\n const builder = getInkDynamicBuilder(lookup)\n\n return {\n constructor: buildCallable(builder.buildConstructor),\n message: buildCallable(builder.buildMessage),\n storage: buildStorage(lookup, builder.buildStorageRoot),\n event: buildEvent(builder.buildEvent),\n }\n}\n\nconst buildCallable =\n <T extends InkCallableDescriptor>(\n builder:\n | InkDynamicBuilder[\"buildConstructor\"]\n | InkDynamicBuilder[\"buildMessage\"],\n ): InkCallableInterface<T> =>\n <L extends string & keyof T>(label: L) => {\n const codecs = builder(label)\n\n return {\n encode: (value?: T[L][\"message\"]) =>\n Binary.fromBytes(codecs.call.enc(value || {})),\n decode: (response) => codecs.value.dec(response.data.asBytes()),\n }\n }\n\nconst buildStorage = <S>(\n lookup: InkMetadataLookup,\n builder: InkDynamicBuilder[\"buildStorageRoot\"],\n): InkStorageInterface<S> => {\n const { metadata } = lookup\n const metadataRootKey = Binary.fromHex(metadata.storage.root.root_key)\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 rootKey =\n Number(metadata.version) === 4\n ? Binary.fromBytes(metadataRootKey.asBytes().reverse())\n : metadataRootKey\n return {\n rootKey,\n decodeRoot: (rootStorage) => builder().dec(rootStorage.asBytes()),\n }\n}\n\nconst buildEvent = <E extends Event>(\n decoder: InkDynamicBuilder[\"buildEvent\"],\n): InkEventInterface<E> => {\n const decode: InkEventInterface<E>[\"decode\"] = (value) =>\n decoder().dec(value.data.asBytes()) as E\n\n return {\n decode,\n filter: (address, events = []) =>\n 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 .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}\n"],"names":["getLookupCodecBuilder","Vector","Struct","Tuple","Option","Enum","Binary","Bytes","enhanceCodec","Variant","str","_void","compactNumber","u32","u8","v14Lookup","denormalizeLookup"],"mappings":"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"}
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 enhanceCodec,\n StringRecord,\n Struct,\n Tuple,\n} from \"scale-ts\"\nimport { InkMetadataLookup } from \"./get-lookup\"\nimport { MessageParamSpec, TypeSpec } 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 buildEvent = () =>\n Variant(\n Object.fromEntries(\n metadata.spec.events.map((evt) => [\n evt.label,\n Struct(\n Object.fromEntries(\n evt.args.map((param) => [\n param.label,\n buildDefinition(param.type.type),\n ]),\n ) as StringRecord<Codec<any>>,\n ),\n ]),\n ) as StringRecord<Codec<any>>,\n )\n\n return {\n buildConstructor,\n buildMessage,\n buildStorage,\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).asBytes()\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","import { compactNumber } from \"@polkadot-api/substrate-bindings\"\nimport {\n _void,\n CodecType,\n str,\n Struct,\n u32,\n u8,\n Vector,\n Option,\n enhanceCodec,\n Enum,\n StringRecord,\n Codec,\n} from \"scale-ts\"\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 Enum(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: compactNumber,\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 { InkMetadata, Layout } from \"./metadata-types\"\nimport { pjsTypes } from \"./metadata-pjs-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 ? Binary.fromBytes(\n Binary.fromHex(node.root.root_key).asBytes().reverse(),\n ).asHex()\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 null\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 { Binary } from \"@polkadot-api/substrate-bindings\"\nimport { getInkDynamicBuilder, InkDynamicBuilder } from \"./dynamic-builders\"\nimport { getInkLookup } from \"./get-lookup\"\nimport {\n Event,\n InkCallableDescriptor,\n InkDescriptors,\n InkStorageDescriptor,\n} from \"./ink-descriptors\"\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\"]) => Binary\n : (value: T[L][\"message\"]) => Binary\n decode: (value: { data: Binary }) => T[L][\"response\"]\n}\n\nexport type InkStorageInterface<S extends InkStorageDescriptor> =\n (\"\" extends keyof S\n ? () => {\n encode: S[\"\"][\"key\"] extends undefined\n ? (key?: undefined) => Binary\n : (key: S[\"\"][\"key\"]) => Binary\n decode: (data: Binary) => 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) => Binary\n : (key: S[L][\"key\"]) => Binary\n decode: (data: Binary) => 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: Binary\n }\n }\n | { type: string; value: unknown }\n }\n | { type: string; value: unknown }\nexport interface InkEventInterface<E> {\n decode: (value: { data: Binary }) => E\n filter: (\n address: string,\n events?: Array<GenericEvent | { event: GenericEvent }>,\n ) => E[]\n}\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 message: InkCallableInterface<D[\"__types\"][\"messages\"]>\n storage: InkStorageInterface<D[\"__types\"][\"storage\"]>\n event: InkEventInterface<D[\"__types\"][\"event\"]>\n}\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 lookup = getInkLookup(inkContract.metadata)\n const builder = getInkDynamicBuilder(lookup)\n\n return {\n constructor: buildCallable(builder.buildConstructor),\n message: buildCallable(builder.buildMessage),\n storage: buildStorage(builder.buildStorage),\n event: buildEvent(builder.buildEvent),\n }\n}\n\nconst buildCallable =\n <T extends InkCallableDescriptor>(\n builder:\n | InkDynamicBuilder[\"buildConstructor\"]\n | InkDynamicBuilder[\"buildMessage\"],\n ): InkCallableInterface<T> =>\n <L extends string & keyof T>(label: L) => {\n const codecs = builder(label)\n\n return {\n encode: (value?: T[L][\"message\"]) =>\n Binary.fromBytes(codecs.call.enc(value || {})),\n decode: (response) => codecs.value.dec(response.data.asBytes()),\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\"]) =>\n Binary.fromBytes(codecs.key.enc(key as any)),\n decode: (response: Binary) => codecs.value.dec(response.asBytes()),\n }\n }\n\nconst buildEvent = <E extends Event>(\n decoder: InkDynamicBuilder[\"buildEvent\"],\n): InkEventInterface<E> => {\n const decode: InkEventInterface<E>[\"decode\"] = (value) =>\n decoder().dec(value.data.asBytes()) as E\n\n return {\n decode,\n filter: (address, events = []) =>\n 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 .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}\n"],"names":["getLookupCodecBuilder","_void","Struct","Variant","Binary","Tuple","Bytes","enhanceCodec","Enum","Vector","Option","str","compactNumber","u32","u8","v14Lookup","denormalizeLookup","resolveType","path","inner"],"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.1.0",
3
+ "version": "0.1.2",
4
4
  "author": "Victor Oliva (https://github.com/voliva)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -35,9 +35,9 @@
35
35
  "dist"
36
36
  ],
37
37
  "dependencies": {
38
- "scale-ts": "^1.6.0",
39
- "@polkadot-api/metadata-builders": "0.8.2",
40
- "@polkadot-api/substrate-bindings": "0.9.2",
38
+ "scale-ts": "^1.6.1",
39
+ "@polkadot-api/substrate-bindings": "0.9.3",
40
+ "@polkadot-api/metadata-builders": "0.9.1",
41
41
  "@polkadot-api/utils": "0.1.2"
42
42
  },
43
43
  "scripts": {