@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 +21 -0
- package/README.md +3 -0
- package/dist/esm/dynamic-builders.mjs +114 -0
- package/dist/esm/dynamic-builders.mjs.map +1 -0
- package/dist/esm/get-lookup.mjs +18 -0
- package/dist/esm/get-lookup.mjs.map +1 -0
- package/dist/esm/index.mjs +4 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/ink-client.mjs +52 -0
- package/dist/esm/ink-client.mjs.map +1 -0
- package/dist/esm/metadata-pjs-types.mjs +122 -0
- package/dist/esm/metadata-pjs-types.mjs.map +1 -0
- package/dist/index.d.ts +300 -0
- package/dist/index.js +293 -0
- package/dist/index.js.map +1 -0
- package/package.json +50 -0
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,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 @@
|
|
|
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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|