@polkadot-api/ink-contracts 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 Josep M Sobrepere
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @polkadot-api/ink-contracts
2
+
3
+ This package reads Ink! metadata files to extract its information, and generates types and SCALE codecs for the types defined in the metadata.
@@ -0,0 +1,114 @@
1
+ import { getLookupCodecBuilder } from '@polkadot-api/metadata-builders';
2
+ import { Variant, Binary } from '@polkadot-api/substrate-bindings';
3
+ import { Struct, Vector, Tuple, Option, Enum, Bytes, enhanceCodec } from 'scale-ts';
4
+
5
+ const getInkDynamicBuilder = (metadataLookup) => {
6
+ const { metadata } = metadataLookup;
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
+ );
51
+ };
52
+ const buildStorageRoot = () => buildLayout(metadata.storage);
53
+ const buildCallable = (callable) => {
54
+ const selectorBytes = Binary.fromHex(callable.selector).asBytes();
55
+ const argsCodec = Struct(
56
+ Object.fromEntries(
57
+ callable.args.map((param) => [
58
+ param.label,
59
+ buildDefinition(param.type.type)
60
+ ])
61
+ )
62
+ );
63
+ const callCodec = Tuple(Bytes(4), argsCodec);
64
+ return {
65
+ call: enhanceCodec(
66
+ callCodec,
67
+ (value) => [
68
+ selectorBytes,
69
+ value
70
+ ],
71
+ ([, value]) => value
72
+ ),
73
+ value: buildDefinition(callable.returnType.type)
74
+ };
75
+ };
76
+ const buildConstructor = (label) => {
77
+ const constr = metadata.spec.constructors.find((c) => c.label === label);
78
+ if (!constr) {
79
+ throw new Error(`Constructor ${label} not found`);
80
+ }
81
+ return buildCallable(constr);
82
+ };
83
+ const buildMessage = (label) => {
84
+ const message = metadata.spec.messages.find((c) => c.label === label);
85
+ if (!message) {
86
+ throw new Error(`Message ${label} not found`);
87
+ }
88
+ return buildCallable(message);
89
+ };
90
+ const buildEvent = () => Variant(
91
+ Object.fromEntries(
92
+ metadata.spec.events.map((evt) => [
93
+ evt.label,
94
+ Struct(
95
+ Object.fromEntries(
96
+ evt.args.map((param) => [
97
+ param.label,
98
+ buildDefinition(param.type.type)
99
+ ])
100
+ )
101
+ )
102
+ ])
103
+ )
104
+ );
105
+ return {
106
+ buildConstructor,
107
+ buildMessage,
108
+ buildStorageRoot,
109
+ buildEvent
110
+ };
111
+ };
112
+
113
+ export { getInkDynamicBuilder };
114
+ //# sourceMappingURL=dynamic-builders.mjs.map
@@ -0,0 +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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"}
@@ -0,0 +1,18 @@
1
+ import { denormalizeLookup } from '@polkadot-api/metadata-builders';
2
+ import { v14Lookup } from '@polkadot-api/substrate-bindings';
3
+ import { pjsTypes } from './metadata-pjs-types.mjs';
4
+
5
+ const getInkLookup = (metadata) => {
6
+ const encoded = pjsTypes.enc(metadata.types);
7
+ const decoded = v14Lookup.dec(encoded);
8
+ const accountTypeId = metadata.spec.environment.accountId.type;
9
+ const accountIdEntry = decoded.find((e) => e.id === accountTypeId);
10
+ if (accountIdEntry) {
11
+ accountIdEntry.path = ["AccountId32"];
12
+ }
13
+ const getLookupEntryDef = denormalizeLookup(decoded);
14
+ return Object.assign(getLookupEntryDef, { metadata });
15
+ };
16
+
17
+ export { getInkLookup };
18
+ //# sourceMappingURL=get-lookup.mjs.map
@@ -0,0 +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;;;;"}
@@ -0,0 +1,4 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -0,0 +1,52 @@
1
+ import { Binary } from '@polkadot-api/substrate-bindings';
2
+ import { getInkLookup } from './get-lookup.mjs';
3
+ import { getInkDynamicBuilder } from './dynamic-builders.mjs';
4
+
5
+ const getInkClient = (inkContract) => {
6
+ const lookup = getInkLookup(inkContract.metadata);
7
+ const builder = getInkDynamicBuilder(lookup);
8
+ return {
9
+ constructor: buildCallable(builder.buildConstructor),
10
+ message: buildCallable(builder.buildMessage),
11
+ storage: buildStorage(lookup, builder.buildStorageRoot),
12
+ event: buildEvent(builder.buildEvent)
13
+ };
14
+ };
15
+ const buildCallable = (builder) => (label) => {
16
+ const codecs = builder(label);
17
+ return {
18
+ encode: (value) => Binary.fromBytes(codecs.call.enc(value || {})),
19
+ decode: (response) => codecs.value.dec(response.data.asBytes())
20
+ };
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;
26
+ return {
27
+ rootKey,
28
+ decodeRoot: (rootStorage) => builder().dec(rootStorage.asBytes())
29
+ };
30
+ };
31
+ const buildEvent = (decoder) => {
32
+ const decode = (value) => decoder().dec(value.data.asBytes());
33
+ return {
34
+ decode,
35
+ filter: (address, events = []) => events.map((v) => "event" in v ? v.event : v).filter(
36
+ (v) => v.type === "Contracts" && v.value.type === "ContractEmitted" && v.value.value.contract === address
37
+ ).map((v) => {
38
+ try {
39
+ return decode(v.value.value);
40
+ } catch (ex) {
41
+ console.error(
42
+ `Contract ${address} emitted an incompatible event`,
43
+ v.value.value
44
+ );
45
+ throw ex;
46
+ }
47
+ })
48
+ };
49
+ };
50
+
51
+ export { getInkClient };
52
+ //# sourceMappingURL=ink-client.mjs.map
@@ -0,0 +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;;;;"}
@@ -0,0 +1,122 @@
1
+ import { compactNumber } from '@polkadot-api/substrate-bindings';
2
+ import { Option, str, Struct, u32, u8, Vector, enhanceCodec, Enum, _void } from 'scale-ts';
3
+
4
+ const Variant = (inner) => enhanceCodec(
5
+ Enum(inner),
6
+ (value) => {
7
+ if (typeof value === "string") {
8
+ return {
9
+ tag: value,
10
+ value: void 0
11
+ };
12
+ }
13
+ const [tag, val] = Object.entries(value)[0];
14
+ return {
15
+ tag,
16
+ value: val
17
+ };
18
+ },
19
+ (value) => {
20
+ return {
21
+ [value.tag]: value.value
22
+ };
23
+ }
24
+ );
25
+ const PjsVector = (inner, size) => enhanceCodec(
26
+ Vector(inner, size),
27
+ (value) => value ?? [],
28
+ (v) => v
29
+ );
30
+ const oStr = Option(str);
31
+ const docs = PjsVector(str);
32
+ const primitive = Variant({
33
+ bool: _void,
34
+ char: _void,
35
+ str: _void,
36
+ u8: _void,
37
+ u16: _void,
38
+ u32: _void,
39
+ u64: _void,
40
+ u128: _void,
41
+ u256: _void,
42
+ i8: _void,
43
+ i16: _void,
44
+ i32: _void,
45
+ i64: _void,
46
+ i128: _void,
47
+ i256: _void
48
+ });
49
+ const fields = PjsVector(
50
+ Struct({
51
+ name: oStr,
52
+ type: compactNumber,
53
+ typeName: oStr,
54
+ docs
55
+ })
56
+ );
57
+ const arr = Struct({
58
+ len: u32,
59
+ type: compactNumber
60
+ });
61
+ const bitSequence = Struct({
62
+ bitStoreType: compactNumber,
63
+ bitOrderType: compactNumber
64
+ });
65
+ const variants = PjsVector(
66
+ Struct({
67
+ name: str,
68
+ fields,
69
+ index: u8,
70
+ docs
71
+ })
72
+ );
73
+ const def = Variant({
74
+ composite: Struct({
75
+ fields
76
+ }),
77
+ variant: Struct({
78
+ variants
79
+ }),
80
+ sequence: Struct({
81
+ type: compactNumber
82
+ }),
83
+ array: arr,
84
+ tuple: Vector(compactNumber),
85
+ primitive,
86
+ compact: compactNumber,
87
+ bitSequence
88
+ });
89
+ const param = Struct({
90
+ name: str,
91
+ type: Option(compactNumber)
92
+ });
93
+ const params = PjsVector(param);
94
+ const metadataEntry = Struct({
95
+ id: compactNumber,
96
+ path: docs,
97
+ params,
98
+ def,
99
+ docs
100
+ });
101
+ const entry = enhanceCodec(
102
+ metadataEntry,
103
+ (value) => ({
104
+ id: value.id,
105
+ path: value.type.path,
106
+ params: value.type.params ?? [],
107
+ def: value.type.def,
108
+ docs: []
109
+ }),
110
+ (value) => ({
111
+ id: value.id,
112
+ type: {
113
+ def: value.def,
114
+ path: value.path,
115
+ params: value.params
116
+ }
117
+ })
118
+ );
119
+ const pjsTypes = PjsVector(entry);
120
+
121
+ export { pjsTypes };
122
+ //# sourceMappingURL=metadata-pjs-types.mjs.map
@@ -0,0 +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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"}
@@ -0,0 +1,300 @@
1
+ import { CodecType, Codec, StringRecord } from 'scale-ts';
2
+ import { LookupEntry } from '@polkadot-api/metadata-builders';
3
+ import { Binary } from '@polkadot-api/substrate-bindings';
4
+
5
+ type PjsVariant<O extends StringRecord<Codec<any>>> = {
6
+ [K in keyof O]: {
7
+ [KK in K]: CodecType<O[K]>;
8
+ };
9
+ }[keyof O];
10
+ declare const pjsTypes: Codec<{
11
+ id: number;
12
+ type: {
13
+ def: PjsVariant<{
14
+ composite: Codec<{
15
+ fields: {
16
+ name: string | undefined;
17
+ type: number;
18
+ typeName: string | undefined;
19
+ docs: string[];
20
+ }[];
21
+ }>;
22
+ variant: Codec<{
23
+ variants: {
24
+ name: string;
25
+ fields: {
26
+ name: string | undefined;
27
+ type: number;
28
+ typeName: string | undefined;
29
+ docs: string[];
30
+ }[];
31
+ index: number;
32
+ docs: string[];
33
+ }[];
34
+ }>;
35
+ sequence: Codec<{
36
+ type: number;
37
+ }>;
38
+ array: Codec<{
39
+ len: number;
40
+ type: number;
41
+ }>;
42
+ tuple: Codec<number[]>;
43
+ primitive: Codec<PjsVariant<{
44
+ bool: Codec<undefined>;
45
+ char: Codec<undefined>;
46
+ str: Codec<undefined>;
47
+ u8: Codec<undefined>;
48
+ u16: Codec<undefined>;
49
+ u32: Codec<undefined>;
50
+ u64: Codec<undefined>;
51
+ u128: Codec<undefined>;
52
+ u256: Codec<undefined>;
53
+ i8: Codec<undefined>;
54
+ i16: Codec<undefined>;
55
+ i32: Codec<undefined>;
56
+ i64: Codec<undefined>;
57
+ i128: Codec<undefined>;
58
+ i256: Codec<undefined>;
59
+ }>>;
60
+ compact: Codec<number>;
61
+ bitSequence: Codec<{
62
+ bitStoreType: number;
63
+ bitOrderType: number;
64
+ }>;
65
+ }>;
66
+ path: string[];
67
+ params: {
68
+ name: string;
69
+ type: number | undefined;
70
+ }[];
71
+ };
72
+ }[]>;
73
+ type PjsTypes = CodecType<typeof pjsTypes>;
74
+
75
+ interface InkMetadataV4 {
76
+ spec: InkSpecV4;
77
+ storage: RootLayout;
78
+ types: PjsTypes;
79
+ version: "4";
80
+ }
81
+ interface InkSpecV4 {
82
+ constructors: ConstructorSpec[];
83
+ messages: MessageSpec[];
84
+ environment: EnvironmentSpecV4;
85
+ events: EventSpecV4[];
86
+ lang_error: TypeSpec;
87
+ }
88
+ interface InkMetadataV5 {
89
+ spec: InkSpecV5;
90
+ storage: RootLayout;
91
+ types: PjsTypes;
92
+ version: 5;
93
+ }
94
+ type InkMetadata = InkMetadataV4 | InkMetadataV5;
95
+ interface InkSpecV5 {
96
+ constructors: ConstructorSpec[];
97
+ messages: MessageSpec[];
98
+ environment: EnvironmentSpecV5;
99
+ events: EventSpecV5[];
100
+ lang_error: TypeSpec;
101
+ }
102
+ interface ConstructorSpec {
103
+ label: string;
104
+ selector: string;
105
+ payable: boolean;
106
+ default: boolean;
107
+ args: Array<MessageParamSpec>;
108
+ returnType: TypeSpec;
109
+ docs: string[];
110
+ }
111
+ interface MessageSpec {
112
+ label: string;
113
+ selector: string;
114
+ mutates: boolean;
115
+ payable: boolean;
116
+ args: Array<MessageParamSpec>;
117
+ returnType: TypeSpec;
118
+ docs: string[];
119
+ default: boolean;
120
+ }
121
+ interface EnvironmentSpecV4 {
122
+ accountId: TypeSpec;
123
+ balance: TypeSpec;
124
+ timestamp: TypeSpec;
125
+ blockNumber: TypeSpec;
126
+ chainExtension: TypeSpec;
127
+ maxEventTopics: number;
128
+ }
129
+ interface EnvironmentSpecV5 extends EnvironmentSpecV4 {
130
+ staticBufferSize: number;
131
+ }
132
+ interface MessageParamSpec {
133
+ label: string;
134
+ type: TypeSpec;
135
+ }
136
+ interface EventSpecV4 {
137
+ label: string;
138
+ args: EventParamSpec[];
139
+ docs: string[];
140
+ }
141
+ interface EventSpecV5 extends EventSpecV4 {
142
+ modulePath: string;
143
+ signatureTopic?: string;
144
+ }
145
+ interface EventParamSpec {
146
+ label: string;
147
+ indexed: number;
148
+ type: TypeSpec;
149
+ docs: string[];
150
+ }
151
+ interface TypeSpec {
152
+ type: number;
153
+ displayName: string[];
154
+ }
155
+ type Layout = LeafLayout | RootLayout | HashLayout | ArrayLayout | StructLayout | EnumLayout;
156
+ interface LeafLayout {
157
+ leaf: {
158
+ key: string;
159
+ ty: number;
160
+ };
161
+ }
162
+ interface RootLayout {
163
+ root: {
164
+ root_key: string;
165
+ layout: Layout;
166
+ };
167
+ }
168
+ interface HashLayout {
169
+ hash: {
170
+ offset: string;
171
+ strategy: {
172
+ hasher: "Blake2x256" | "Sha2x256" | "Keccak256";
173
+ prefix: string;
174
+ postfix: string;
175
+ };
176
+ layout: Layout;
177
+ };
178
+ }
179
+ interface ArrayLayout {
180
+ array: {
181
+ offset: string;
182
+ len: number;
183
+ layout: Layout;
184
+ };
185
+ }
186
+ interface StructLayout {
187
+ struct: {
188
+ name: string;
189
+ fields: Array<FieldLayout>;
190
+ };
191
+ }
192
+ interface EnumLayout {
193
+ enum: {
194
+ name: string;
195
+ dispatchKey: string;
196
+ variants: Record<number, {
197
+ name: string;
198
+ fields: Array<FieldLayout>;
199
+ }>;
200
+ };
201
+ }
202
+ interface FieldLayout {
203
+ name: string;
204
+ layout: Layout;
205
+ }
206
+
207
+ interface InkMetadataLookup {
208
+ (id: number): LookupEntry;
209
+ metadata: InkMetadata;
210
+ }
211
+ declare const getInkLookup: (metadata: InkMetadata) => ((id: number) => LookupEntry) & {
212
+ metadata: InkMetadata;
213
+ };
214
+
215
+ declare const getInkDynamicBuilder: (metadataLookup: InkMetadataLookup) => {
216
+ buildConstructor: (label: string) => {
217
+ call: Codec<{
218
+ [x: symbol]: never;
219
+ [x: number]: never;
220
+ [x: string]: any;
221
+ }>;
222
+ value: Codec<any>;
223
+ };
224
+ buildMessage: (label: string) => {
225
+ call: Codec<{
226
+ [x: symbol]: never;
227
+ [x: number]: never;
228
+ [x: string]: any;
229
+ }>;
230
+ value: Codec<any>;
231
+ };
232
+ buildStorageRoot: () => Codec<any>;
233
+ buildEvent: () => Codec<{
234
+ type: string;
235
+ value: any;
236
+ }>;
237
+ };
238
+ type InkDynamicBuilder = ReturnType<typeof getInkDynamicBuilder>;
239
+
240
+ type Event = {
241
+ type: string;
242
+ value: unknown;
243
+ };
244
+ interface InkDescriptors<S, M extends InkCallableDescriptor, C extends InkCallableDescriptor, E extends Event> {
245
+ metadata: InkMetadata;
246
+ __types: {
247
+ storage: S;
248
+ messages: M;
249
+ constructors: C;
250
+ event: E;
251
+ };
252
+ }
253
+ type InkCallableDescriptor = Record<string, {
254
+ message: StringRecord<unknown>;
255
+ response: StringRecord<unknown>;
256
+ }>;
257
+
258
+ type InkCallableInterface<T extends InkCallableDescriptor> = <L extends string & keyof T>(label: L) => {
259
+ encode: {} extends T[L]["message"] ? (value?: T[L]["message"]) => Binary : (value: T[L]["message"]) => Binary;
260
+ decode: (value: {
261
+ data: Binary;
262
+ }) => T[L]["response"];
263
+ };
264
+ interface InkStorageInterface<S> {
265
+ rootKey: Binary;
266
+ decodeRoot: (rootStorage: Binary) => S;
267
+ }
268
+ type GenericEvent = {
269
+ type: "Contracts";
270
+ value: {
271
+ type: "ContractEmitted";
272
+ value: {
273
+ contract: string;
274
+ data: Binary;
275
+ };
276
+ } | {
277
+ type: string;
278
+ value: unknown;
279
+ };
280
+ } | {
281
+ type: string;
282
+ value: unknown;
283
+ };
284
+ interface InkEventInterface<E> {
285
+ decode: (value: {
286
+ data: Binary;
287
+ }) => E;
288
+ filter: (address: string, events?: Array<GenericEvent | {
289
+ event: GenericEvent;
290
+ }>) => E[];
291
+ }
292
+ interface InkClient<D extends InkDescriptors<unknown, InkCallableDescriptor, InkCallableDescriptor, Event>> {
293
+ constructor: InkCallableInterface<D["__types"]["constructors"]>;
294
+ message: InkCallableInterface<D["__types"]["messages"]>;
295
+ storage: InkStorageInterface<D["__types"]["storage"]>;
296
+ event: InkEventInterface<D["__types"]["event"]>;
297
+ }
298
+ declare const getInkClient: <D extends InkDescriptors<unknown, InkCallableDescriptor, InkCallableDescriptor, Event>>(inkContract: D) => InkClient<D>;
299
+
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 };
package/dist/index.js ADDED
@@ -0,0 +1,293 @@
1
+ 'use strict';
2
+
3
+ var metadataBuilders = require('@polkadot-api/metadata-builders');
4
+ var substrateBindings = require('@polkadot-api/substrate-bindings');
5
+ var scaleTs = require('scale-ts');
6
+
7
+ const getInkDynamicBuilder = (metadataLookup) => {
8
+ const { metadata } = metadataLookup;
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
+ );
53
+ };
54
+ const buildStorageRoot = () => buildLayout(metadata.storage);
55
+ const buildCallable = (callable) => {
56
+ const selectorBytes = substrateBindings.Binary.fromHex(callable.selector).asBytes();
57
+ const argsCodec = scaleTs.Struct(
58
+ Object.fromEntries(
59
+ callable.args.map((param) => [
60
+ param.label,
61
+ buildDefinition(param.type.type)
62
+ ])
63
+ )
64
+ );
65
+ const callCodec = scaleTs.Tuple(scaleTs.Bytes(4), argsCodec);
66
+ return {
67
+ call: scaleTs.enhanceCodec(
68
+ callCodec,
69
+ (value) => [
70
+ selectorBytes,
71
+ value
72
+ ],
73
+ ([, value]) => value
74
+ ),
75
+ value: buildDefinition(callable.returnType.type)
76
+ };
77
+ };
78
+ const buildConstructor = (label) => {
79
+ const constr = metadata.spec.constructors.find((c) => c.label === label);
80
+ if (!constr) {
81
+ throw new Error(`Constructor ${label} not found`);
82
+ }
83
+ return buildCallable(constr);
84
+ };
85
+ const buildMessage = (label) => {
86
+ const message = metadata.spec.messages.find((c) => c.label === label);
87
+ if (!message) {
88
+ throw new Error(`Message ${label} not found`);
89
+ }
90
+ return buildCallable(message);
91
+ };
92
+ const buildEvent = () => substrateBindings.Variant(
93
+ Object.fromEntries(
94
+ metadata.spec.events.map((evt) => [
95
+ evt.label,
96
+ scaleTs.Struct(
97
+ Object.fromEntries(
98
+ evt.args.map((param) => [
99
+ param.label,
100
+ buildDefinition(param.type.type)
101
+ ])
102
+ )
103
+ )
104
+ ])
105
+ )
106
+ );
107
+ return {
108
+ buildConstructor,
109
+ buildMessage,
110
+ buildStorageRoot,
111
+ buildEvent
112
+ };
113
+ };
114
+
115
+ const Variant = (inner) => scaleTs.enhanceCodec(
116
+ scaleTs.Enum(inner),
117
+ (value) => {
118
+ if (typeof value === "string") {
119
+ return {
120
+ tag: value,
121
+ value: void 0
122
+ };
123
+ }
124
+ const [tag, val] = Object.entries(value)[0];
125
+ return {
126
+ tag,
127
+ value: val
128
+ };
129
+ },
130
+ (value) => {
131
+ return {
132
+ [value.tag]: value.value
133
+ };
134
+ }
135
+ );
136
+ const PjsVector = (inner, size) => scaleTs.enhanceCodec(
137
+ scaleTs.Vector(inner, size),
138
+ (value) => value ?? [],
139
+ (v) => v
140
+ );
141
+ const oStr = scaleTs.Option(scaleTs.str);
142
+ const docs = PjsVector(scaleTs.str);
143
+ const primitive = Variant({
144
+ bool: scaleTs._void,
145
+ char: scaleTs._void,
146
+ str: scaleTs._void,
147
+ u8: scaleTs._void,
148
+ u16: scaleTs._void,
149
+ u32: scaleTs._void,
150
+ u64: scaleTs._void,
151
+ u128: scaleTs._void,
152
+ u256: scaleTs._void,
153
+ i8: scaleTs._void,
154
+ i16: scaleTs._void,
155
+ i32: scaleTs._void,
156
+ i64: scaleTs._void,
157
+ i128: scaleTs._void,
158
+ i256: scaleTs._void
159
+ });
160
+ const fields = PjsVector(
161
+ scaleTs.Struct({
162
+ name: oStr,
163
+ type: substrateBindings.compactNumber,
164
+ typeName: oStr,
165
+ docs
166
+ })
167
+ );
168
+ const arr = scaleTs.Struct({
169
+ len: scaleTs.u32,
170
+ type: substrateBindings.compactNumber
171
+ });
172
+ const bitSequence = scaleTs.Struct({
173
+ bitStoreType: substrateBindings.compactNumber,
174
+ bitOrderType: substrateBindings.compactNumber
175
+ });
176
+ const variants = PjsVector(
177
+ scaleTs.Struct({
178
+ name: scaleTs.str,
179
+ fields,
180
+ index: scaleTs.u8,
181
+ docs
182
+ })
183
+ );
184
+ const def = Variant({
185
+ composite: scaleTs.Struct({
186
+ fields
187
+ }),
188
+ variant: scaleTs.Struct({
189
+ variants
190
+ }),
191
+ sequence: scaleTs.Struct({
192
+ type: substrateBindings.compactNumber
193
+ }),
194
+ array: arr,
195
+ tuple: scaleTs.Vector(substrateBindings.compactNumber),
196
+ primitive,
197
+ compact: substrateBindings.compactNumber,
198
+ bitSequence
199
+ });
200
+ const param = scaleTs.Struct({
201
+ name: scaleTs.str,
202
+ type: scaleTs.Option(substrateBindings.compactNumber)
203
+ });
204
+ const params = PjsVector(param);
205
+ const metadataEntry = scaleTs.Struct({
206
+ id: substrateBindings.compactNumber,
207
+ path: docs,
208
+ params,
209
+ def,
210
+ docs
211
+ });
212
+ const entry = scaleTs.enhanceCodec(
213
+ metadataEntry,
214
+ (value) => ({
215
+ id: value.id,
216
+ path: value.type.path,
217
+ params: value.type.params ?? [],
218
+ def: value.type.def,
219
+ docs: []
220
+ }),
221
+ (value) => ({
222
+ id: value.id,
223
+ type: {
224
+ def: value.def,
225
+ path: value.path,
226
+ params: value.params
227
+ }
228
+ })
229
+ );
230
+ const pjsTypes = PjsVector(entry);
231
+
232
+ const getInkLookup = (metadata) => {
233
+ const encoded = pjsTypes.enc(metadata.types);
234
+ const decoded = substrateBindings.v14Lookup.dec(encoded);
235
+ const accountTypeId = metadata.spec.environment.accountId.type;
236
+ const accountIdEntry = decoded.find((e) => e.id === accountTypeId);
237
+ if (accountIdEntry) {
238
+ accountIdEntry.path = ["AccountId32"];
239
+ }
240
+ const getLookupEntryDef = metadataBuilders.denormalizeLookup(decoded);
241
+ return Object.assign(getLookupEntryDef, { metadata });
242
+ };
243
+
244
+ const getInkClient = (inkContract) => {
245
+ const lookup = getInkLookup(inkContract.metadata);
246
+ const builder = getInkDynamicBuilder(lookup);
247
+ return {
248
+ constructor: buildCallable(builder.buildConstructor),
249
+ message: buildCallable(builder.buildMessage),
250
+ storage: buildStorage(lookup, builder.buildStorageRoot),
251
+ event: buildEvent(builder.buildEvent)
252
+ };
253
+ };
254
+ const buildCallable = (builder) => (label) => {
255
+ const codecs = builder(label);
256
+ return {
257
+ encode: (value) => substrateBindings.Binary.fromBytes(codecs.call.enc(value || {})),
258
+ decode: (response) => codecs.value.dec(response.data.asBytes())
259
+ };
260
+ };
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;
265
+ return {
266
+ rootKey,
267
+ decodeRoot: (rootStorage) => builder().dec(rootStorage.asBytes())
268
+ };
269
+ };
270
+ const buildEvent = (decoder) => {
271
+ const decode = (value) => decoder().dec(value.data.asBytes());
272
+ return {
273
+ decode,
274
+ filter: (address, events = []) => events.map((v) => "event" in v ? v.event : v).filter(
275
+ (v) => v.type === "Contracts" && v.value.type === "ContractEmitted" && v.value.value.contract === address
276
+ ).map((v) => {
277
+ try {
278
+ return decode(v.value.value);
279
+ } catch (ex) {
280
+ console.error(
281
+ `Contract ${address} emitted an incompatible event`,
282
+ v.value.value
283
+ );
284
+ throw ex;
285
+ }
286
+ })
287
+ };
288
+ };
289
+
290
+ exports.getInkClient = getInkClient;
291
+ exports.getInkDynamicBuilder = getInkDynamicBuilder;
292
+ exports.getInkLookup = getInkLookup;
293
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@polkadot-api/ink-contracts",
3
+ "version": "0.1.0",
4
+ "author": "Victor Oliva (https://github.com/voliva)",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/polkadot-api/polkadot-api.git"
8
+ },
9
+ "license": "MIT",
10
+ "sideEffects": false,
11
+ "exports": {
12
+ ".": {
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",
26
+ "default": "./dist/index.js"
27
+ },
28
+ "./package.json": "./package.json"
29
+ },
30
+ "main": "./dist/index.js",
31
+ "module": "./dist/esm/index.mjs",
32
+ "browser": "./dist/esm/index.mjs",
33
+ "types": "./dist/index.d.ts",
34
+ "files": [
35
+ "dist"
36
+ ],
37
+ "dependencies": {
38
+ "scale-ts": "^1.6.0",
39
+ "@polkadot-api/metadata-builders": "0.8.2",
40
+ "@polkadot-api/substrate-bindings": "0.9.2",
41
+ "@polkadot-api/utils": "0.1.2"
42
+ },
43
+ "scripts": {
44
+ "build-core": "tsc --noEmit && rollup -c ../../rollup.config.js",
45
+ "build": "pnpm build-core",
46
+ "test": "echo 'no tests'",
47
+ "lint": "prettier --check README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\"",
48
+ "format": "prettier --write README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\""
49
+ }
50
+ }