@polkadot-api/view-builder 0.2.2 → 0.3.1

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.
@@ -0,0 +1,2 @@
1
+ export { getViewBuilder } from './view-builder.mjs';
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,116 @@
1
+ import { mapStringRecord, toHex as toHex$1 } from '@polkadot-api/utils';
2
+ import * as scale from '@polkadot-api/substrate-bindings';
3
+
4
+ const toHex = toHex$1;
5
+ const createInputValueDecoder = (dec, rest) => scale.createDecoder((_bytes) => {
6
+ const bytes = _bytes;
7
+ const start = bytes.i;
8
+ const value = dec(bytes);
9
+ const input = toHex(new Uint8Array(bytes.buffer.slice(start, bytes.i)));
10
+ return { ...rest, value, input };
11
+ });
12
+ const primitiveShapedDecoder = (codec, input, rest) => {
13
+ const decoder = createInputValueDecoder(input, { codec, ...rest });
14
+ return Object.assign(decoder, {
15
+ shape: { codec }
16
+ });
17
+ };
18
+ const complexShapedDecoder = (shape, input, rest) => {
19
+ const decoder = createInputValueDecoder(input, { codec: shape.codec, ...rest });
20
+ return Object.assign(decoder, {
21
+ shape
22
+ });
23
+ };
24
+ const AccountIdShaped = (ss58Prefix = 42) => {
25
+ const enhanced = scale.enhanceDecoder(
26
+ scale.AccountId(ss58Prefix).dec,
27
+ (address) => ({
28
+ address,
29
+ ss58Prefix
30
+ })
31
+ );
32
+ return primitiveShapedDecoder("AccountId", enhanced, {});
33
+ };
34
+ const BytesArray = (len) => primitiveShapedDecoder("BytesArray", scale.Hex.dec(len), { len });
35
+ const _primitives = [
36
+ "_void",
37
+ "bool",
38
+ "char",
39
+ "str",
40
+ "u8",
41
+ "u16",
42
+ "u32",
43
+ "i8",
44
+ "i16",
45
+ "i32",
46
+ "u64",
47
+ "u128",
48
+ "u256",
49
+ "i64",
50
+ "i128",
51
+ "i256",
52
+ "compactNumber",
53
+ "compactBn",
54
+ "bitSequence",
55
+ "ethAccount"
56
+ ];
57
+ const corePrimitives = Object.fromEntries(
58
+ _primitives.map((x) => [x, primitiveShapedDecoder(x, scale[x].dec)])
59
+ );
60
+ const primitives = {
61
+ ...corePrimitives,
62
+ Bytes: primitiveShapedDecoder("Bytes", scale.Hex.dec()),
63
+ BytesArray,
64
+ AccountId: AccountIdShaped()
65
+ };
66
+ const Sequence = (input) => complexShapedDecoder(
67
+ { codec: "Sequence", shape: input.shape },
68
+ scale.Vector.dec(input)
69
+ );
70
+ const ArrayDec = (input, len) => complexShapedDecoder(
71
+ { codec: "Array", shape: input.shape, len },
72
+ scale.Vector.dec(input, len)
73
+ );
74
+ const TupleDec = (...input) => complexShapedDecoder(
75
+ { codec: "Tuple", shape: input.map((x) => x.shape) },
76
+ scale.Tuple.dec(...input)
77
+ );
78
+ const StructDec = (input) => complexShapedDecoder(
79
+ { codec: "Struct", shape: mapStringRecord(input, (x) => x.shape) },
80
+ scale.Struct.dec(input)
81
+ );
82
+ const EnumDec = (input, args) => complexShapedDecoder(
83
+ { codec: "Enum", shape: mapStringRecord(input, (x) => x.shape) },
84
+ scale.Variant.dec(input, args)
85
+ );
86
+ const OptionDec = (input) => complexShapedDecoder(
87
+ { codec: "Option", shape: input.shape },
88
+ scale.Option.dec(input)
89
+ );
90
+ const ResultDec = (ok, ko) => complexShapedDecoder(
91
+ { codec: "Result", shape: { ok: ok.shape, ko: ko.shape } },
92
+ scale.Result.dec(ok, ko)
93
+ );
94
+ const selfDecoder = (value) => {
95
+ let cache = (x) => {
96
+ const decoder = value();
97
+ const result2 = decoder;
98
+ cache = decoder;
99
+ return result2(x);
100
+ };
101
+ const result = (x) => cache(x);
102
+ result.shape = { codec: "_void" };
103
+ return result;
104
+ };
105
+ const complex = {
106
+ Sequence,
107
+ Array: ArrayDec,
108
+ Tuple: TupleDec,
109
+ Struct: StructDec,
110
+ Enum: EnumDec,
111
+ Option: OptionDec,
112
+ Result: ResultDec
113
+ };
114
+
115
+ export { AccountIdShaped, OptionDec, ResultDec, complex, primitives, selfDecoder };
116
+ //# sourceMappingURL=shaped-decoders.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shaped-decoders.mjs","sources":["../../src/shaped-decoders.ts"],"sourcesContent":["import { toHex as _toHex, mapStringRecord } from \"@polkadot-api/utils\"\nimport * as scale from \"@polkadot-api/substrate-bindings\"\nimport type {\n Decoder,\n HexString,\n StringRecord,\n} from \"@polkadot-api/substrate-bindings\"\nimport {\n ArrayDecoded,\n ArrayShape,\n BytesArrayDecoded,\n ComplexDecoded,\n ComplexShape,\n Decoded,\n EnumDecoded,\n EnumShape,\n OptionDecoded,\n OptionShape,\n PrimitiveDecoded,\n ResultDecoded,\n ResultShape,\n SequenceDecoded,\n SequenceShape,\n StructDecoded,\n StructShape,\n TupleDecoded,\n TupleShape,\n} from \"./types\"\n\nconst toHex = _toHex as (input: Uint8Array) => HexString\n\ntype Extras = \"docs\" | \"path\" | \"innerDocs\"\nexport type WithoutExtra<T extends {}> = Omit<T, Extras>\ntype PrimitiveCodec = PrimitiveDecoded[\"codec\"]\ntype ComplexCodec = ComplexDecoded[\"codec\"]\n\nexport type WithShapeWithoutExtra<T extends PrimitiveDecoded> = Decoder<\n WithoutExtra<T>\n> & {\n shape: { codec: T[\"codec\"] }\n}\ntype PrimitiveShapeDecoder = WithShapeWithoutExtra<PrimitiveDecoded>\n\ntype SequenceShapedDecoder = Decoder<WithoutExtra<SequenceDecoded>> & {\n shape: SequenceShape\n}\ntype ArrayShapedDecoder = Decoder<WithoutExtra<ArrayDecoded>> & {\n shape: ArrayShape\n}\ntype TupleShapedDecoder = Decoder<WithoutExtra<TupleDecoded>> & {\n shape: TupleShape\n}\ntype StructShapedDecoder = Decoder<WithoutExtra<StructDecoded>> & {\n shape: StructShape\n}\n\ntype OptionShapedDecoder = Decoder<WithoutExtra<OptionDecoded>> & {\n shape: OptionShape\n}\n\ntype ResultShapedDecoder = Decoder<WithoutExtra<ResultDecoded>> & {\n shape: ResultShape\n}\n\ntype EnumShapedDecoder = Decoder<WithoutExtra<EnumDecoded>> & {\n shape: EnumShape\n}\ntype ComplexShapedDecoder =\n | SequenceShapedDecoder\n | ArrayShapedDecoder\n | TupleShapedDecoder\n | StructShapedDecoder\n | OptionShapedDecoder\n | ResultShapedDecoder\n | EnumShapedDecoder\n\nexport type ShapedDecoder = PrimitiveShapeDecoder | ComplexShapedDecoder\n\ntype PrimitiveDecodedValue<C extends PrimitiveCodec> = (PrimitiveDecoded & {\n codec: C\n})[\"value\"]\ntype PrimitiveDecodedRest<C extends PrimitiveCodec> = Omit<\n PrimitiveDecoded & { codec: C },\n \"value\" | \"input\" | \"codec\" | Extras\n>\n\ntype ComplexDecodedValue<C extends ComplexCodec> = (ComplexDecoded & {\n codec: C\n})[\"value\"]\ntype ComplexDecodedRest<C extends ComplexCodec> = Omit<\n ComplexDecoded & { codec: C },\n \"value\" | \"input\" | \"codec\" | Extras\n>\n\nconst createInputValueDecoder = <T, Rest extends { codec: Decoded[\"codec\"] }>(\n dec: Decoder<T>,\n rest: Rest,\n): Decoder<\n Rest & {\n input: HexString\n value: T\n }\n> =>\n scale.createDecoder((_bytes) => {\n const bytes = _bytes as Uint8Array & { i: number; v: DataView }\n const start = bytes.i\n const value = dec(bytes)\n const input = toHex(new Uint8Array(bytes.buffer.slice(start, bytes.i)))\n return { ...rest, value, input }\n })\n\nconst primitiveShapedDecoder = <C extends PrimitiveCodec>(\n codec: C,\n input: Decoder<PrimitiveDecodedValue<C>>,\n rest?: PrimitiveDecodedRest<C>,\n): WithShapeWithoutExtra<\n PrimitiveDecoded & {\n codec: C\n }\n> => {\n const decoder: Decoder<WithoutExtra<PrimitiveDecoded>> =\n createInputValueDecoder(input, { codec, ...rest })\n\n return Object.assign(decoder, {\n shape: { codec },\n }) as any\n}\n\nconst complexShapedDecoder = <Shape extends ComplexShape>(\n shape: Shape,\n input: Decoder<ComplexDecodedValue<Shape[\"codec\"]>>,\n rest?: ComplexDecodedRest<Shape[\"codec\"]>,\n): Decoder<\n WithoutExtra<\n ComplexDecoded & {\n codec: Shape[\"codec\"]\n }\n >\n> & {\n shape: Shape\n} => {\n const decoder: Decoder<WithoutExtra<ComplexDecoded>> =\n createInputValueDecoder(input, { codec: shape.codec, ...rest })\n\n return Object.assign(decoder, {\n shape,\n })\n}\n\nexport const AccountIdShaped = (ss58Prefix = 42) => {\n const enhanced = scale.enhanceDecoder(\n scale.AccountId(ss58Prefix).dec,\n (address) => ({\n address,\n ss58Prefix,\n }),\n )\n\n return primitiveShapedDecoder(\"AccountId\", enhanced, {})\n}\n\nconst BytesArray = (len: number): WithShapeWithoutExtra<BytesArrayDecoded> =>\n primitiveShapedDecoder(\"BytesArray\", scale.Hex.dec(len), { len })\n\nconst _primitives = [\n \"_void\",\n \"bool\",\n \"char\",\n \"str\",\n \"u8\",\n \"u16\",\n \"u32\",\n \"i8\",\n \"i16\",\n \"i32\",\n \"u64\",\n \"u128\",\n \"u256\",\n \"i64\",\n \"i128\",\n \"i256\",\n \"compactNumber\",\n \"compactBn\",\n \"bitSequence\",\n \"ethAccount\",\n] as const\n\ntype PrimitivesList = typeof _primitives\ntype PrimitivesKeys = PrimitivesList[number]\n\nconst corePrimitives: {\n [P in PrimitivesKeys]: WithShapeWithoutExtra<\n PrimitiveDecoded & {\n codec: P\n }\n >\n} = Object.fromEntries(\n _primitives.map((x) => [x, primitiveShapedDecoder(x, scale[x].dec)]),\n) as any\n\nexport const primitives = {\n ...corePrimitives,\n Bytes: primitiveShapedDecoder(\"Bytes\", scale.Hex.dec()),\n BytesArray,\n AccountId: AccountIdShaped(),\n}\n\nconst Sequence = (input: ShapedDecoder): SequenceShapedDecoder =>\n complexShapedDecoder(\n { codec: \"Sequence\", shape: input.shape },\n scale.Vector.dec(input as any),\n )\n\nconst ArrayDec = (input: ShapedDecoder, len: number): ArrayShapedDecoder =>\n complexShapedDecoder(\n { codec: \"Array\", shape: input.shape, len },\n scale.Vector.dec(input as any, len),\n )\n\nconst TupleDec = (...input: Array<ShapedDecoder>): TupleShapedDecoder =>\n complexShapedDecoder(\n { codec: \"Tuple\", shape: input.map((x) => x.shape) },\n scale.Tuple.dec(...(input as Array<Decoder<any>>)),\n )\n\nconst StructDec = (input: StringRecord<ShapedDecoder>): StructShapedDecoder =>\n complexShapedDecoder(\n { codec: \"Struct\", shape: mapStringRecord(input, (x) => x.shape) },\n scale.Struct.dec(input as {}),\n )\n\nconst EnumDec = (\n input: StringRecord<ShapedDecoder>,\n args?: number[],\n): EnumShapedDecoder =>\n complexShapedDecoder(\n { codec: \"Enum\", shape: mapStringRecord(input, (x) => x.shape) },\n scale.Variant.dec(input as {}, args as any),\n )\n\nexport const OptionDec = (input: ShapedDecoder): OptionShapedDecoder =>\n complexShapedDecoder(\n { codec: \"Option\", shape: input.shape },\n scale.Option.dec(input as any) as any,\n )\n\nexport const ResultDec = (\n ok: ShapedDecoder,\n ko: ShapedDecoder,\n): ResultShapedDecoder =>\n complexShapedDecoder(\n { codec: \"Result\", shape: { ok: ok.shape, ko: ko.shape } },\n scale.Result.dec(ok as Decoder<any>, ko as Decoder<any>) as any,\n )\n\nexport const selfDecoder = (value: () => ShapedDecoder): ShapedDecoder => {\n let cache: Decoder<any> = (x) => {\n const decoder = value()\n const result = decoder\n cache = decoder\n return result(x)\n }\n\n const result = ((x) => cache(x)) as ShapedDecoder\n result.shape = { codec: \"_void\" }\n return result\n}\n\nexport const complex = {\n Sequence,\n Array: ArrayDec,\n Tuple: TupleDec,\n Struct: StructDec,\n Enum: EnumDec,\n Option: OptionDec,\n Result: ResultDec,\n}\n"],"names":["_toHex","result"],"mappings":"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"}
@@ -1,167 +1,30 @@
1
- // src/view-builder.ts
2
- import { mapObject, mapStringRecord as mapStringRecord2 } from "@polkadot-api/utils";
3
- import {
4
- createDecoder as createDecoder2,
5
- u8,
6
- enhanceDecoder as enhanceDecoder2
7
- } from "@polkadot-api/substrate-bindings";
8
- import { getLookupFn } from "@polkadot-api/metadata-builders";
1
+ import { createDecoder, u8, enhanceDecoder } from '@polkadot-api/substrate-bindings';
2
+ import { mapObject, mapStringRecord } from '@polkadot-api/utils';
3
+ import { complex, AccountIdShaped, primitives, selfDecoder } from './shaped-decoders.mjs';
4
+ import { withCache } from './with-cache.mjs';
9
5
 
10
- // src/shaped-decoders.ts
11
- import { toHex as _toHex, mapStringRecord } from "@polkadot-api/utils";
12
- import * as scale from "@polkadot-api/substrate-bindings";
13
- var toHex = _toHex;
14
- var createInputValueDecoder = (dec, rest) => scale.createDecoder((_bytes) => {
15
- const bytes = _bytes;
16
- const start = bytes.i;
17
- const value = dec(bytes);
18
- const input = toHex(new Uint8Array(bytes.buffer.slice(start, bytes.i)));
19
- return { ...rest, value, input };
20
- });
21
- var primitiveShapedDecoder = (codec, input, rest) => {
22
- const decoder = createInputValueDecoder(input, { codec, ...rest });
23
- return Object.assign(decoder, {
24
- shape: { codec }
25
- });
26
- };
27
- var complexShapedDecoder = (shape, input, rest) => {
28
- const decoder = createInputValueDecoder(input, { codec: shape.codec, ...rest });
29
- return Object.assign(decoder, {
30
- shape
31
- });
32
- };
33
- var AccountIdShaped = (ss58Prefix = 42) => {
34
- const enhanced = scale.enhanceDecoder(
35
- scale.AccountId(ss58Prefix).dec,
36
- (address) => ({
37
- address,
38
- ss58Prefix
39
- })
40
- );
41
- return primitiveShapedDecoder("AccountId", enhanced, {});
42
- };
43
- var BytesArray = (len) => primitiveShapedDecoder("BytesArray", scale.Hex.dec(len), { len });
44
- var _primitives = [
45
- "_void",
46
- "bool",
47
- "char",
48
- "str",
49
- "u8",
50
- "u16",
51
- "u32",
52
- "i8",
53
- "i16",
54
- "i32",
55
- "u64",
56
- "u128",
57
- "u256",
58
- "i64",
59
- "i128",
60
- "i256",
61
- "compactNumber",
62
- "compactBn",
63
- "bitSequence",
64
- "ethAccount"
65
- ];
66
- var corePrimitives = Object.fromEntries(
67
- _primitives.map((x) => [x, primitiveShapedDecoder(x, scale[x].dec)])
68
- );
69
- var primitives = {
70
- ...corePrimitives,
71
- Bytes: primitiveShapedDecoder("Bytes", scale.Hex.dec()),
72
- BytesArray,
73
- AccountId: AccountIdShaped()
74
- };
75
- var Sequence = (input) => complexShapedDecoder(
76
- { codec: "Sequence", shape: input.shape },
77
- scale.Vector.dec(input)
78
- );
79
- var ArrayDec = (input, len) => complexShapedDecoder(
80
- { codec: "Array", shape: input.shape, len },
81
- scale.Vector.dec(input, len)
82
- );
83
- var TupleDec = (...input) => complexShapedDecoder(
84
- { codec: "Tuple", shape: input.map((x) => x.shape) },
85
- scale.Tuple.dec(...input)
86
- );
87
- var StructDec = (input) => complexShapedDecoder(
88
- { codec: "Struct", shape: mapStringRecord(input, (x) => x.shape) },
89
- scale.Struct.dec(input)
90
- );
91
- var EnumDec = (input, args) => complexShapedDecoder(
92
- { codec: "Enum", shape: mapStringRecord(input, (x) => x.shape) },
93
- scale.Variant.dec(input, args)
94
- );
95
- var OptionDec = (input) => complexShapedDecoder(
96
- { codec: "Option", shape: input.shape },
97
- scale.Option.dec(input)
98
- );
99
- var ResultDec = (ok, ko) => complexShapedDecoder(
100
- { codec: "Result", shape: { ok: ok.shape, ko: ko.shape } },
101
- scale.Result.dec(ok, ko)
102
- );
103
- var selfDecoder = (value) => {
104
- let cache = (x) => {
105
- const decoder = value();
106
- const result2 = decoder;
107
- cache = decoder;
108
- return result2(x);
109
- };
110
- const result = (x) => cache(x);
111
- result.shape = { codec: "_void" };
112
- return result;
113
- };
114
- var complex = {
115
- Sequence,
116
- Array: ArrayDec,
117
- Tuple: TupleDec,
118
- Struct: StructDec,
119
- Enum: EnumDec,
120
- Option: OptionDec,
121
- Result: ResultDec
122
- };
123
-
124
- // src/with-cache.ts
125
- var withCache = (fn, onEnterCircular, onExitCircular) => (input, cache, stack, ...rest) => {
126
- const { id } = input;
127
- if (cache.has(id)) return cache.get(id);
128
- if (stack.has(id)) {
129
- const res = onEnterCircular(() => cache.get(id), input, ...rest);
130
- cache.set(id, res);
131
- return res;
132
- }
133
- stack.add(id);
134
- let result = fn(input, cache, stack, ...rest);
135
- stack.delete(id);
136
- if (cache.has(id))
137
- result = onExitCircular(result, cache.get(id), input, ...rest);
138
- cache.set(id, result);
139
- return result;
140
- };
141
-
142
- // src/view-builder.ts
143
- var emptyTuple = complex.Tuple();
144
- var toUnshapedDecoder = (fn) => (...args) => {
6
+ const emptyTuple = complex.Tuple();
7
+ const toUnshapedDecoder = (fn) => (...args) => {
145
8
  const value = fn(...args);
146
9
  return {
147
10
  shape: value.shape,
148
11
  decoder: value
149
12
  };
150
13
  };
151
- var withProp = (input, propName, propValue) => {
152
- const decoder = enhanceDecoder2(input, (x) => ({
14
+ const withProp = (input, propName, propValue) => {
15
+ const decoder = enhanceDecoder(input, (x) => ({
153
16
  ...x,
154
17
  [propName]: propValue
155
18
  }));
156
19
  decoder.shape = input.shape;
157
20
  return decoder;
158
21
  };
159
- var addPath = (fn) => (input, cache, stack, lookupData, ...rest) => {
22
+ const addPath = (fn) => (input, cache, stack, lookupData, ...rest) => {
160
23
  const { path } = lookupData[input.id];
161
24
  const base = fn(input, cache, stack, lookupData, ...rest);
162
25
  return path.length ? withProp(base, "path", path) : base;
163
26
  };
164
- var _buildShapedDecoder = (input, cache, stack, lookupData, _accountId) => {
27
+ const _buildShapedDecoder = (input, cache, stack, lookupData, _accountId) => {
165
28
  if (input.type === "primitive") return primitives[input.value];
166
29
  if (input.type === "void") return primitives._void;
167
30
  if (input.type === "AccountId20") return primitives.ethAccount;
@@ -179,7 +42,7 @@ var _buildShapedDecoder = (input, cache, stack, lookupData, _accountId) => {
179
42
  };
180
43
  const buildTuple = (value, innerDocs) => withProp(complex.Tuple(...value.map(buildNext)), "innerDocs", innerDocs);
181
44
  const buildStruct = (value, innerDocs) => withProp(
182
- complex.Struct(mapStringRecord2(value, buildNext)),
45
+ complex.Struct(mapStringRecord(value, buildNext)),
183
46
  "innerDocs",
184
47
  innerDocs
185
48
  );
@@ -208,7 +71,7 @@ var _buildShapedDecoder = (input, cache, stack, lookupData, _accountId) => {
208
71
  const indexes = Object.values(input.value).map((x) => x.idx);
209
72
  const areIndexesSorted = indexes.every((idx, i) => idx === i);
210
73
  const withoutDocs = areIndexesSorted ? complex.Enum(inner) : complex.Enum(inner, indexes);
211
- const withDocs = enhanceDecoder2(withoutDocs, (val) => {
74
+ const withDocs = enhanceDecoder(withoutDocs, (val) => {
212
75
  const docs = input.innerDocs[val.value.type];
213
76
  return {
214
77
  ...val,
@@ -218,23 +81,22 @@ var _buildShapedDecoder = (input, cache, stack, lookupData, _accountId) => {
218
81
  withDocs.shape = withoutDocs.shape;
219
82
  return withDocs;
220
83
  };
221
- var withPath = addPath(_buildShapedDecoder);
222
- var buildShapedDecoder = withCache(withPath, selfDecoder, (outter, inner) => {
84
+ const withPath = addPath(_buildShapedDecoder);
85
+ const buildShapedDecoder = withCache(withPath, selfDecoder, (outter, inner) => {
223
86
  inner.shape = outter.shape;
224
87
  return outter;
225
88
  });
226
- var hexStrFromByte = (input) => `0x${input.toString(16).padEnd(2, "0")}`;
227
- var getViewBuilder = (metadata) => {
228
- const lookupData = metadata.lookup;
89
+ const hexStrFromByte = (input) => `0x${input.toString(16).padEnd(2, "0")}`;
90
+ const getViewBuilder = (getLookupEntryDef) => {
91
+ const { metadata } = getLookupEntryDef;
229
92
  const cache = /* @__PURE__ */ new Map();
230
93
  const getDecoder = (id) => buildShapedDecoder(
231
94
  getLookupEntryDef(id),
232
95
  cache,
233
96
  /* @__PURE__ */ new Set(),
234
- lookupData,
97
+ metadata.lookup,
235
98
  _accountId
236
99
  );
237
- const getLookupEntryDef = getLookupFn(lookupData);
238
100
  let _accountId = primitives.AccountId;
239
101
  const prefix = metadata.pallets.find((x) => x.name === "System")?.constants.find((x) => x.name === "SS58Prefix");
240
102
  if (prefix) {
@@ -245,7 +107,7 @@ var getViewBuilder = (metadata) => {
245
107
  }
246
108
  }
247
109
  const buildDefinition = toUnshapedDecoder(getDecoder);
248
- const callDecoder = createDecoder2((bytes) => {
110
+ const callDecoder = createDecoder((bytes) => {
249
111
  const palletIdx = u8.dec(bytes);
250
112
  const palletEntry = metadata.pallets.find((x) => x.index === palletIdx);
251
113
  if (!palletEntry) throw new Error("Invalid Pallet");
@@ -311,7 +173,6 @@ var getViewBuilder = (metadata) => {
311
173
  buildConstant
312
174
  };
313
175
  };
314
- export {
315
- getViewBuilder
316
- };
317
- //# sourceMappingURL=index.mjs.map
176
+
177
+ export { getViewBuilder };
178
+ //# sourceMappingURL=view-builder.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-builder.mjs","sources":["../../src/view-builder.ts"],"sourcesContent":["import type {\n EnumVar,\n LookupEntry,\n MetadataLookup,\n} from \"@polkadot-api/metadata-builders\"\nimport {\n Decoder,\n HexString,\n type StringRecord,\n type V14Lookup,\n createDecoder,\n enhanceDecoder,\n u8,\n} from \"@polkadot-api/substrate-bindings\"\nimport { mapObject, mapStringRecord } from \"@polkadot-api/utils\"\nimport {\n AccountIdShaped,\n ShapedDecoder,\n WithShapeWithoutExtra,\n WithoutExtra,\n complex,\n primitives,\n selfDecoder,\n} from \"./shaped-decoders\"\nimport {\n AccountIdDecoded,\n Decoded,\n DecodedCall,\n GetViewBuilder,\n PrimitiveDecoded,\n UnshapedDecoder,\n} from \"./types\"\nimport { withCache } from \"./with-cache\"\n\nconst emptyTuple = complex.Tuple()\n\nconst toUnshapedDecoder =\n <A extends Array<any>>(\n fn: (...args: A) => ShapedDecoder,\n ): ((...args: A) => UnshapedDecoder) =>\n (...args) => {\n const value = fn(...args)\n return {\n shape: value.shape,\n decoder: value as Decoder<Decoded>,\n }\n }\n\ntype WithProp<\n T extends Decoder<any> & { shape: any },\n PropName extends string,\n PropValue,\n> = T extends Decoder<infer D> & { shape: infer S }\n ? Decoder<\n D extends WithoutExtra<PrimitiveDecoded>\n ? PrimitiveDecoded\n : D & { [P in PropName]: PropValue }\n > & { shape: S }\n : T\n\nconst withProp = <PropName extends string, PropValue>(\n input: ShapedDecoder,\n propName: PropName,\n propValue: PropValue,\n): WithProp<ShapedDecoder, PropName, PropValue> => {\n const decoder = enhanceDecoder(input as Decoder<{}>, (x) => ({\n ...x,\n [propName]: propValue,\n })) as WithProp<ShapedDecoder, PropName, PropValue>\n decoder.shape = input.shape\n return decoder\n}\n\nconst addPath =\n <Other extends Array<any>>(\n fn: (\n input: LookupEntry,\n cache: Map<number, ShapedDecoder>,\n stack: Set<number>,\n lookupData: V14Lookup,\n ...rest: Other\n ) => ShapedDecoder,\n ): ((\n input: LookupEntry,\n cache: Map<number, ShapedDecoder>,\n stack: Set<number>,\n lookupData: V14Lookup,\n ...rest: Other\n ) => ShapedDecoder | WithProp<ShapedDecoder, \"path\", string[]>) =>\n (input, cache, stack, lookupData, ...rest) => {\n const { path } = lookupData[input.id]\n const base = fn(input, cache, stack, lookupData, ...rest)\n return path.length ? withProp(base, \"path\", path) : base\n }\n\nconst _buildShapedDecoder = (\n input: LookupEntry,\n cache: Map<number, ShapedDecoder>,\n stack: Set<number>,\n lookupData: V14Lookup,\n _accountId: WithShapeWithoutExtra<AccountIdDecoded>,\n): ShapedDecoder => {\n if (input.type === \"primitive\") return primitives[input.value]\n if (input.type === \"void\") return primitives._void\n if (input.type === \"AccountId20\") return primitives.ethAccount\n if (input.type === \"AccountId32\") return _accountId\n if (input.type === \"compact\")\n return input.isBig || input.isBig === null\n ? primitives.compactBn\n : primitives.compactNumber\n if (input.type === \"bitSequence\") return primitives.bitSequence\n\n if (\n input.type === \"sequence\" &&\n input.value.type === \"primitive\" &&\n input.value.value === \"u8\"\n ) {\n return primitives.Bytes\n }\n\n const buildNext = (nextInput: LookupEntry): ShapedDecoder =>\n buildShapedDecoder(nextInput, cache, stack, lookupData, _accountId)\n\n const buildVector = (inner: LookupEntry, len?: number) => {\n const _inner = buildNext(inner)\n return len ? complex.Array(_inner, len) : complex.Sequence(_inner)\n }\n\n const buildTuple = (value: LookupEntry[], innerDocs: string[][]) =>\n withProp(complex.Tuple(...value.map(buildNext)), \"innerDocs\", innerDocs)\n\n const buildStruct = (\n value: StringRecord<LookupEntry>,\n innerDocs: StringRecord<string[]>,\n ) =>\n withProp(\n complex.Struct(mapStringRecord(value, buildNext)),\n \"innerDocs\",\n innerDocs,\n )\n\n if (input.type === \"array\") {\n // Bytes case\n if (input.value.type === \"primitive\" && input.value.value === \"u8\") {\n return primitives.BytesArray(input.len)\n }\n\n return buildVector(input.value, input.len)\n }\n\n if (input.type === \"sequence\") return buildVector(input.value)\n if (input.type === \"tuple\") return buildTuple(input.value, input.innerDocs)\n if (input.type === \"struct\") return buildStruct(input.value, input.innerDocs)\n if (input.type === \"option\") return complex.Option(buildNext(input.value))\n\n if (input.type === \"result\")\n return complex.Result(buildNext(input.value.ok), buildNext(input.value.ko))\n\n // it has to be an enum by now\n const dependencies = Object.values(input.value).map((v) => {\n if (v.type === \"void\") return primitives._void\n if (v.type === \"lookupEntry\") {\n return buildNext(v.value)\n }\n return v.type === \"tuple\"\n ? buildTuple(v.value, v.innerDocs)\n : v.type === \"array\"\n ? buildVector(v.value, v.len)\n : buildStruct(v.value, v.innerDocs)\n })\n\n const inner = Object.fromEntries(\n Object.keys(input.value).map((key, idx) => [key, dependencies[idx]]),\n ) as StringRecord<ShapedDecoder>\n\n const indexes = Object.values(input.value).map((x) => x.idx)\n const areIndexesSorted = indexes.every((idx, i) => idx === i)\n\n const withoutDocs = areIndexesSorted\n ? complex.Enum(inner)\n : complex.Enum(inner, indexes as any)\n\n const withDocs = enhanceDecoder(withoutDocs, (val) => {\n const docs = input.innerDocs[val.value.type]\n return {\n ...val,\n docs,\n }\n }) as unknown as typeof withoutDocs\n withDocs.shape = withoutDocs.shape\n return withDocs\n}\n\nconst withPath = addPath(_buildShapedDecoder)\nconst buildShapedDecoder = withCache(withPath, selfDecoder, (outter, inner) => {\n inner.shape = outter.shape\n return outter\n})\n\nconst hexStrFromByte = (input: number) =>\n `0x${input.toString(16).padEnd(2, \"0\")}` as HexString\n\nexport const getViewBuilder: GetViewBuilder = (\n getLookupEntryDef: MetadataLookup,\n) => {\n const { metadata } = getLookupEntryDef\n const cache = new Map<number, ShapedDecoder>()\n\n const getDecoder = (id: number) =>\n buildShapedDecoder(\n getLookupEntryDef(id),\n cache,\n new Set(),\n metadata.lookup,\n _accountId,\n )\n\n let _accountId: WithShapeWithoutExtra<AccountIdDecoded> = primitives.AccountId\n\n const prefix = metadata.pallets\n .find((x) => x.name === \"System\")\n ?.constants.find((x) => x.name === \"SS58Prefix\")\n if (prefix) {\n try {\n const prefixVal = getDecoder(prefix.type)(prefix.value).value\n\n if (typeof prefixVal === \"number\") _accountId = AccountIdShaped(prefixVal)\n } catch (_) {}\n }\n\n const buildDefinition = toUnshapedDecoder(getDecoder)\n\n const callDecoder: Decoder<DecodedCall> = createDecoder((bytes) => {\n const palletIdx = u8.dec(bytes)\n\n const palletEntry = metadata.pallets.find((x) => x.index === palletIdx)\n if (!palletEntry) throw new Error(\"Invalid Pallet\")\n\n const pallet = {\n value: {\n name: palletEntry.name,\n idx: palletIdx,\n },\n input: hexStrFromByte(bytes[0]),\n }\n\n const callsDecoder = getDecoder(palletEntry.calls!)\n\n const decoded = callsDecoder(bytes)\n\n if (decoded.codec !== \"Enum\") throw null\n\n const call = {\n value: {\n name: decoded.value.type,\n idx: bytes[1],\n },\n input: hexStrFromByte(bytes[1]),\n docs: (decoded as any).docs as string[],\n }\n\n return {\n pallet,\n call,\n args: { value: decoded.value.value as any, shape: callsDecoder.shape },\n }\n })\n\n const buildEnumEntry = toUnshapedDecoder(\n (\n entry: EnumVar[\"value\"][keyof EnumVar[\"value\"]],\n forceTuple = false,\n ): ShapedDecoder => {\n if (entry.type === \"void\")\n return forceTuple ? emptyTuple : primitives._void\n\n if (entry.type === \"lookupEntry\") return getDecoder(entry.value.id)\n\n return entry.type === \"tuple\"\n ? complex.Tuple(\n ...Object.values(entry.value).map((l) => getDecoder(l.id)),\n )\n : entry.type === \"array\"\n ? complex.Array(getDecoder(entry.value.id), entry.len)\n : complex.Struct(\n mapObject(entry.value, (x) =>\n getDecoder(x.id),\n ) as StringRecord<ShapedDecoder>,\n )\n },\n )\n\n const buildVariant =\n (type: \"errors\" | \"events\" | \"calls\") =>\n (\n pallet: string,\n name: string,\n ): {\n view: UnshapedDecoder\n location: [number, number]\n } => {\n const palletEntry = metadata.pallets.find((x) => x.name === pallet)!\n\n const lookup = getLookupEntryDef(palletEntry[type]!)\n if (lookup.type !== \"enum\") throw null\n\n const event = lookup.value[name]\n\n return {\n location: [palletEntry.index, event.idx],\n view: buildEnumEntry(event, type === \"calls\"),\n }\n }\n\n const buildConstant = (pallet: string, constantName: string) => {\n const storageEntry = metadata.pallets\n .find((x) => x.name === pallet)!\n .constants!.find((s) => s.name === constantName)!\n\n return buildDefinition(storageEntry.type as number)\n }\n\n return {\n buildDefinition,\n callDecoder,\n\n buildEvent: buildVariant(\"events\"),\n buildError: buildVariant(\"errors\"),\n buildCall: buildVariant(\"calls\"),\n buildConstant,\n }\n}\n"],"names":["inner"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ const withCache = (fn, onEnterCircular, onExitCircular) => (input, cache, stack, ...rest) => {
2
+ const { id } = input;
3
+ if (cache.has(id)) return cache.get(id);
4
+ if (stack.has(id)) {
5
+ const res = onEnterCircular(() => cache.get(id), input, ...rest);
6
+ cache.set(id, res);
7
+ return res;
8
+ }
9
+ stack.add(id);
10
+ let result = fn(input, cache, stack, ...rest);
11
+ stack.delete(id);
12
+ if (cache.has(id))
13
+ result = onExitCircular(result, cache.get(id), input, ...rest);
14
+ cache.set(id, result);
15
+ return result;
16
+ };
17
+
18
+ export { withCache };
19
+ //# sourceMappingURL=with-cache.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-cache.mjs","sources":["../../src/with-cache.ts"],"sourcesContent":["import { LookupEntry } from \"@polkadot-api/metadata-builders\"\n\ntype FnWithStack<Other extends Array<any>, T> = (\n input: LookupEntry,\n cache: Map<number, T>,\n stack: Set<number>,\n ...rest: Other\n) => T\n\nexport const withCache =\n <Other extends Array<any>, T>(\n fn: FnWithStack<Other, T>,\n onEnterCircular: (\n cacheGetter: () => T,\n circular: LookupEntry,\n ...rest: Other\n ) => T,\n onExitCircular: (\n outter: T,\n inner: T,\n circular: LookupEntry,\n ...rest: Other\n ) => T,\n ): FnWithStack<Other, T> =>\n (input, cache, stack, ...rest) => {\n const { id } = input\n if (cache.has(id)) return cache.get(id)!\n\n if (stack.has(id)) {\n const res = onEnterCircular(() => cache.get(id)!, input, ...rest)\n cache.set(id, res)\n return res\n }\n\n stack.add(id)\n let result = fn(input, cache, stack, ...rest)\n stack.delete(id)\n\n if (cache.has(id))\n result = onExitCircular(result, cache.get(id)!, input, ...rest)\n\n cache.set(id, result)\n return result\n }\n"],"names":[],"mappings":"AASa,MAAA,SAAA,GACX,CACE,EACA,EAAA,eAAA,EAKA,mBAOF,CAAC,KAAA,EAAO,KAAO,EAAA,KAAA,EAAA,GAAU,IAAS,KAAA;AAChC,EAAM,MAAA,EAAE,IAAO,GAAA,KAAA,CAAA;AACf,EAAA,IAAI,MAAM,GAAI,CAAA,EAAE,GAAU,OAAA,KAAA,CAAM,IAAI,EAAE,CAAA,CAAA;AAEtC,EAAI,IAAA,KAAA,CAAM,GAAI,CAAA,EAAE,CAAG,EAAA;AACjB,IAAM,MAAA,GAAA,GAAM,gBAAgB,MAAM,KAAA,CAAM,IAAI,EAAE,CAAA,EAAI,KAAO,EAAA,GAAG,IAAI,CAAA,CAAA;AAChE,IAAM,KAAA,CAAA,GAAA,CAAI,IAAI,GAAG,CAAA,CAAA;AACjB,IAAO,OAAA,GAAA,CAAA;AAAA,GACT;AAEA,EAAA,KAAA,CAAM,IAAI,EAAE,CAAA,CAAA;AACZ,EAAA,IAAI,SAAS,EAAG,CAAA,KAAA,EAAO,KAAO,EAAA,KAAA,EAAO,GAAG,IAAI,CAAA,CAAA;AAC5C,EAAA,KAAA,CAAM,OAAO,EAAE,CAAA,CAAA;AAEf,EAAI,IAAA,KAAA,CAAM,IAAI,EAAE,CAAA;AACd,IAAS,MAAA,GAAA,cAAA,CAAe,QAAQ,KAAM,CAAA,GAAA,CAAI,EAAE,CAAI,EAAA,KAAA,EAAO,GAAG,IAAI,CAAA,CAAA;AAEhE,EAAM,KAAA,CAAA,GAAA,CAAI,IAAI,MAAM,CAAA,CAAA;AACpB,EAAO,OAAA,MAAA,CAAA;AACT;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { Decoder, V15, V14, HexString, ResultPayload, StringRecord } from '@polkadot-api/substrate-bindings';
1
+ import { MetadataLookup } from '@polkadot-api/metadata-builders';
2
+ import { Decoder, HexString, ResultPayload, StringRecord } from '@polkadot-api/substrate-bindings';
2
3
  export { Decoder, HexString, StringRecord, V14, V15 } from '@polkadot-api/substrate-bindings';
3
4
 
4
5
  type UnshapedDecoder = {
@@ -9,7 +10,7 @@ type VariantBasedBuild = (pallet: string, name: string) => {
9
10
  view: UnshapedDecoder;
10
11
  location: [number, number];
11
12
  };
12
- type GetViewBuilder = (metadata: V15 | V14) => {
13
+ type GetViewBuilder = (getLookupEntryDef: MetadataLookup) => {
13
14
  buildDefinition: (idx: number) => {
14
15
  shape: Shape;
15
16
  decoder: Decoder<Decoded>;