polkadot-api 0.0.0-prerelease-do-not-use

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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/bin/cli.mjs +11 -0
  4. package/dist/index.d.mts +269 -0
  5. package/dist/index.d.ts +269 -0
  6. package/dist/index.js +916 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/index.mjs +929 -0
  9. package/dist/index.mjs.map +1 -0
  10. package/dist/logs-provider/logs-provider.d.mts +1 -0
  11. package/dist/logs-provider/logs-provider.d.ts +1 -0
  12. package/dist/logs-provider/logs-provider.js +21 -0
  13. package/dist/logs-provider/logs-provider.js.map +1 -0
  14. package/dist/logs-provider/logs-provider.mjs +3 -0
  15. package/dist/logs-provider/logs-provider.mjs.map +1 -0
  16. package/dist/logs-provider/min/logs-provider.d.ts +1 -0
  17. package/dist/logs-provider/min/logs-provider.js +2 -0
  18. package/dist/logs-provider/min/logs-provider.js.map +1 -0
  19. package/dist/min/index.d.ts +269 -0
  20. package/dist/min/index.js +2 -0
  21. package/dist/min/index.js.map +1 -0
  22. package/dist/pjs-signer/min/pjs-signer.d.ts +1 -0
  23. package/dist/pjs-signer/min/pjs-signer.js +2 -0
  24. package/dist/pjs-signer/min/pjs-signer.js.map +1 -0
  25. package/dist/pjs-signer/pjs-signer.d.mts +1 -0
  26. package/dist/pjs-signer/pjs-signer.d.ts +1 -0
  27. package/dist/pjs-signer/pjs-signer.js +21 -0
  28. package/dist/pjs-signer/pjs-signer.js.map +1 -0
  29. package/dist/pjs-signer/pjs-signer.mjs +3 -0
  30. package/dist/pjs-signer/pjs-signer.mjs.map +1 -0
  31. package/dist/sc-provider/min/sc-provider.d.ts +1 -0
  32. package/dist/sc-provider/min/sc-provider.js +2 -0
  33. package/dist/sc-provider/min/sc-provider.js.map +1 -0
  34. package/dist/sc-provider/sc-provider.d.mts +1 -0
  35. package/dist/sc-provider/sc-provider.d.ts +1 -0
  36. package/dist/sc-provider/sc-provider.js +21 -0
  37. package/dist/sc-provider/sc-provider.js.map +1 -0
  38. package/dist/sc-provider/sc-provider.mjs +3 -0
  39. package/dist/sc-provider/sc-provider.mjs.map +1 -0
  40. package/dist/signer/min/signer.d.ts +1 -0
  41. package/dist/signer/min/signer.js +2 -0
  42. package/dist/signer/min/signer.js.map +1 -0
  43. package/dist/signer/signer.d.mts +1 -0
  44. package/dist/signer/signer.d.ts +1 -0
  45. package/dist/signer/signer.js +21 -0
  46. package/dist/signer/signer.js.map +1 -0
  47. package/dist/signer/signer.mjs +3 -0
  48. package/dist/signer/signer.mjs.map +1 -0
  49. package/dist/sm-provider/min/sm-provider.d.ts +1 -0
  50. package/dist/sm-provider/min/sm-provider.js +2 -0
  51. package/dist/sm-provider/min/sm-provider.js.map +1 -0
  52. package/dist/sm-provider/sm-provider.d.mts +1 -0
  53. package/dist/sm-provider/sm-provider.d.ts +1 -0
  54. package/dist/sm-provider/sm-provider.js +21 -0
  55. package/dist/sm-provider/sm-provider.js.map +1 -0
  56. package/dist/sm-provider/sm-provider.mjs +3 -0
  57. package/dist/sm-provider/sm-provider.mjs.map +1 -0
  58. package/dist/ws-provider-node/min/ws-provider-node.d.ts +1 -0
  59. package/dist/ws-provider-node/min/ws-provider-node.js +2 -0
  60. package/dist/ws-provider-node/min/ws-provider-node.js.map +1 -0
  61. package/dist/ws-provider-node/ws-provider-node.d.mts +1 -0
  62. package/dist/ws-provider-node/ws-provider-node.d.ts +1 -0
  63. package/dist/ws-provider-node/ws-provider-node.js +21 -0
  64. package/dist/ws-provider-node/ws-provider-node.js.map +1 -0
  65. package/dist/ws-provider-node/ws-provider-node.mjs +3 -0
  66. package/dist/ws-provider-node/ws-provider-node.mjs.map +1 -0
  67. package/dist/ws-provider-web/min/ws-provider-web.d.ts +1 -0
  68. package/dist/ws-provider-web/min/ws-provider-web.js +2 -0
  69. package/dist/ws-provider-web/min/ws-provider-web.js.map +1 -0
  70. package/dist/ws-provider-web/ws-provider-web.d.mts +1 -0
  71. package/dist/ws-provider-web/ws-provider-web.d.ts +1 -0
  72. package/dist/ws-provider-web/ws-provider-web.js +21 -0
  73. package/dist/ws-provider-web/ws-provider-web.js.map +1 -0
  74. package/dist/ws-provider-web/ws-provider-web.mjs +3 -0
  75. package/dist/ws-provider-web/ws-provider-web.mjs.map +1 -0
  76. package/logs-provider/package.json +8 -0
  77. package/package.json +192 -0
  78. package/pjs-signer/package.json +8 -0
  79. package/sc-provider/package.json +8 -0
  80. package/signer/package.json +8 -0
  81. package/sm-provider/package.json +8 -0
  82. package/ws-provider-node/package.json +8 -0
  83. package/ws-provider-web/package.json +8 -0
package/dist/index.mjs ADDED
@@ -0,0 +1,929 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __export = (target, all) => {
4
+ for (var name in all)
5
+ __defProp(target, name, { get: all[name], enumerable: true });
6
+ };
7
+ var __publicField = (obj, key, value) => {
8
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
9
+ return value;
10
+ };
11
+
12
+ // src/client.ts
13
+ import {
14
+ createClient as createRawClient
15
+ } from "@polkadot-api/substrate-client";
16
+ import { firstValueFrom as firstValueFrom4 } from "rxjs";
17
+
18
+ // src/constants.ts
19
+ import { firstValueFrom, map as map2 } from "rxjs";
20
+
21
+ // src/runtime.ts
22
+ import { combineLatest, filter, map } from "rxjs";
23
+ var Runtime = class {
24
+ constructor(ctx, checksums) {
25
+ __publicField(this, "_ctx");
26
+ __publicField(this, "_checksums");
27
+ this._ctx = ctx;
28
+ this._checksums = checksums;
29
+ }
30
+ };
31
+ function getRuntimeContext(runtime) {
32
+ return runtime._ctx;
33
+ }
34
+ function getImportedChecksum(runtime, idx) {
35
+ return runtime._checksums[idx];
36
+ }
37
+ var createRuntime = (ctx, checksums) => new Runtime(ctx, checksums);
38
+ var getRuntimeApi = (checksums, chainHead) => {
39
+ let latestRuntime;
40
+ let resolve = null;
41
+ latestRuntime = new Promise((res) => {
42
+ resolve = res;
43
+ });
44
+ const runtimeWithChecksums$ = combineLatest([chainHead.runtime$, checksums]);
45
+ runtimeWithChecksums$.subscribe(([x, checksums2]) => {
46
+ if (x) {
47
+ if (resolve) {
48
+ resolve(createRuntime(x, checksums2));
49
+ resolve = null;
50
+ } else {
51
+ latestRuntime = Promise.resolve(createRuntime(x, checksums2));
52
+ }
53
+ } else if (!resolve) {
54
+ latestRuntime = new Promise((res) => {
55
+ resolve = res;
56
+ });
57
+ }
58
+ });
59
+ const result = runtimeWithChecksums$.pipe(
60
+ filter(([x]) => Boolean(x)),
61
+ map(([x, checksums2]) => createRuntime(x, checksums2))
62
+ );
63
+ result.latest = () => latestRuntime;
64
+ return result;
65
+ };
66
+ var compatibilityHelper = (runtimeApi, checksumIdx) => (getChecksum) => {
67
+ function isCompatibleSync(runtime) {
68
+ const ctx = getRuntimeContext(runtime);
69
+ const checksum = getImportedChecksum(runtime, checksumIdx);
70
+ return getChecksum(ctx) === checksum;
71
+ }
72
+ const isCompatible = (runtime) => {
73
+ if (runtime) {
74
+ return isCompatibleSync(runtime);
75
+ }
76
+ return runtimeApi.latest().then(isCompatibleSync);
77
+ };
78
+ const waitChecksums = async () => {
79
+ const runtime = await runtimeApi.latest();
80
+ return (ctx) => getChecksum(ctx) === getImportedChecksum(runtime, checksumIdx);
81
+ };
82
+ const compatibleRuntime$ = (chainHead, hash, error) => combineLatest([chainHead.getRuntimeContext$(hash), waitChecksums()]).pipe(
83
+ map(([ctx, isCompatible2]) => {
84
+ if (!isCompatible2(ctx)) {
85
+ throw error();
86
+ }
87
+ return ctx;
88
+ })
89
+ );
90
+ const withCompatibleRuntime = (chainHead, mapper, error) => (source$) => combineLatest([
91
+ source$.pipe(chainHead.withRuntime(mapper)),
92
+ waitChecksums()
93
+ ]).pipe(
94
+ map(([[x, ctx], isCompatible2]) => {
95
+ if (!isCompatible2(ctx)) {
96
+ throw error();
97
+ }
98
+ return [x, ctx];
99
+ })
100
+ );
101
+ return {
102
+ isCompatible,
103
+ waitChecksums,
104
+ withCompatibleRuntime,
105
+ compatibleRuntime$
106
+ };
107
+ };
108
+
109
+ // src/constants.ts
110
+ var createConstantEntry = (palletName, name, chainHead, compatibilityHelper2) => {
111
+ const { isCompatible, compatibleRuntime$ } = compatibilityHelper2(
112
+ (ctx) => ctx.checksumBuilder.buildConstant(palletName, name)
113
+ );
114
+ const checksumError = () => new Error(`Incompatible runtime entry Constant(${palletName}.${name})`);
115
+ const cachedResults = /* @__PURE__ */ new WeakMap();
116
+ const getValueWithContext = (ctx) => {
117
+ if (cachedResults.has(ctx)) {
118
+ return cachedResults.get(ctx);
119
+ }
120
+ const pallet = ctx.metadata.pallets.find((p) => p.name === palletName);
121
+ const constant = pallet?.constants.find((c) => c.name === name);
122
+ const result = ctx.dynamicBuilder.buildConstant(palletName, name).dec(constant.value);
123
+ cachedResults.set(ctx, result);
124
+ return result;
125
+ };
126
+ const fn = (runtime) => {
127
+ if (runtime) {
128
+ if (!isCompatible(runtime))
129
+ throw checksumError();
130
+ return getValueWithContext(getRuntimeContext(runtime));
131
+ }
132
+ return firstValueFrom(
133
+ compatibleRuntime$(chainHead, null, checksumError).pipe(
134
+ map2(getValueWithContext)
135
+ )
136
+ );
137
+ };
138
+ return Object.assign(fn, { isCompatible });
139
+ };
140
+
141
+ // src/event.ts
142
+ import { firstValueFrom as firstValueFrom2, map as map3, mergeMap } from "rxjs";
143
+
144
+ // src/utils/shareLatest.ts
145
+ import { ReplaySubject, share } from "rxjs";
146
+ var shareLatest = share({
147
+ connector: () => new ReplaySubject(1),
148
+ resetOnError: true,
149
+ resetOnComplete: true,
150
+ resetOnRefCountZero: true
151
+ });
152
+
153
+ // src/utils/firstValueFromWithSignal.ts
154
+ import { AbortError } from "@polkadot-api/utils";
155
+ import { noop } from "rxjs";
156
+ function firstValueFromWithSignal(source, signal) {
157
+ return new Promise((resolve, reject) => {
158
+ let subscription = null;
159
+ let isDone = false;
160
+ const onAbort = signal ? () => {
161
+ subscription?.unsubscribe();
162
+ reject(new AbortError());
163
+ } : noop;
164
+ subscription = source.subscribe({
165
+ next: (value) => {
166
+ resolve(value);
167
+ subscription?.unsubscribe();
168
+ isDone = true;
169
+ },
170
+ error: (e) => {
171
+ signal?.removeEventListener("abort", onAbort);
172
+ reject(e);
173
+ },
174
+ complete: () => {
175
+ signal?.removeEventListener("abort", onAbort);
176
+ reject(new Error("Observable completed without emitting"));
177
+ }
178
+ });
179
+ if (!isDone)
180
+ signal?.addEventListener("abort", onAbort);
181
+ });
182
+ }
183
+
184
+ // src/utils/concatMapEager.ts
185
+ import { defer, Observable as Observable4 } from "rxjs";
186
+ var concatMapEager = (mapper, concurrent = Infinity) => (source$) => new Observable4((observer) => {
187
+ let topSubscription;
188
+ const queues = /* @__PURE__ */ new Map();
189
+ const innerSubscriptions = /* @__PURE__ */ new Map();
190
+ const results = /* @__PURE__ */ new Map();
191
+ let mapperIdx = 0;
192
+ let subscriptionIdx = 0;
193
+ let observerIdx = 0;
194
+ const nextSubscription = () => {
195
+ const inner$ = queues.get(subscriptionIdx);
196
+ if (!inner$) {
197
+ if (innerSubscriptions.size === 0 && (typeof topSubscription === "undefined" || topSubscription.closed)) {
198
+ observer.complete();
199
+ }
200
+ return;
201
+ }
202
+ const idx = subscriptionIdx++;
203
+ queues.delete(idx);
204
+ if (observerIdx !== idx) {
205
+ results.set(idx, []);
206
+ }
207
+ innerSubscriptions.set(
208
+ idx,
209
+ inner$.subscribe({
210
+ next(x) {
211
+ if (observerIdx === idx) {
212
+ observer.next(x);
213
+ } else {
214
+ results.get(idx).push(x);
215
+ }
216
+ },
217
+ complete() {
218
+ innerSubscriptions.delete(idx);
219
+ if (idx === observerIdx) {
220
+ observerIdx++;
221
+ while (results.has(observerIdx)) {
222
+ results.get(observerIdx).forEach((x) => observer.next(x));
223
+ results.delete(observerIdx);
224
+ if (innerSubscriptions.has(observerIdx)) {
225
+ break;
226
+ }
227
+ observerIdx++;
228
+ }
229
+ }
230
+ nextSubscription();
231
+ },
232
+ error(e) {
233
+ observer.error(e);
234
+ }
235
+ })
236
+ );
237
+ };
238
+ topSubscription = source$.subscribe({
239
+ next(outterValue) {
240
+ const idx = mapperIdx++;
241
+ queues.set(
242
+ idx,
243
+ defer(() => mapper(outterValue, idx))
244
+ );
245
+ if (innerSubscriptions.size < concurrent) {
246
+ nextSubscription();
247
+ }
248
+ },
249
+ error(e) {
250
+ observer.error(e);
251
+ },
252
+ complete() {
253
+ if (innerSubscriptions.size === 0) {
254
+ observer.complete();
255
+ }
256
+ }
257
+ });
258
+ return () => {
259
+ innerSubscriptions.forEach((subscription) => subscription.unsubscribe());
260
+ topSubscription.unsubscribe();
261
+ queues.clear();
262
+ results.clear();
263
+ };
264
+ });
265
+
266
+ // src/utils/lossLessExhaustMap.ts
267
+ import { Observable as Observable5 } from "rxjs";
268
+ var EMPTY_VALUE = Symbol("EMPTY_VALUE");
269
+ var lossLessExhaustMap = (mapper) => (source$) => new Observable5((observer) => {
270
+ let innerSubscription = null;
271
+ let queuedValue = EMPTY_VALUE;
272
+ let isOutterDone = false;
273
+ const setInnerSubscription = () => {
274
+ const observable = mapper(queuedValue);
275
+ queuedValue = EMPTY_VALUE;
276
+ innerSubscription = observable.subscribe({
277
+ next(vv) {
278
+ observer.next(vv);
279
+ },
280
+ error(ee) {
281
+ observer.error(ee);
282
+ },
283
+ complete() {
284
+ if (queuedValue !== EMPTY_VALUE)
285
+ setInnerSubscription();
286
+ else {
287
+ innerSubscription = null;
288
+ if (isOutterDone)
289
+ observer.complete();
290
+ }
291
+ }
292
+ });
293
+ };
294
+ const subscription = source$.subscribe({
295
+ next(v) {
296
+ queuedValue = v;
297
+ if (!innerSubscription)
298
+ setInnerSubscription();
299
+ },
300
+ error(e) {
301
+ observer.error(e);
302
+ },
303
+ complete() {
304
+ if (!innerSubscription)
305
+ observer.complete();
306
+ isOutterDone = true;
307
+ }
308
+ });
309
+ return () => {
310
+ innerSubscription?.unsubscribe();
311
+ subscription.unsubscribe();
312
+ };
313
+ });
314
+
315
+ // src/event.ts
316
+ var createEventEntry = (pallet, name, chainHead, compatibilityHelper2) => {
317
+ const { isCompatible, withCompatibleRuntime } = compatibilityHelper2(
318
+ (ctx) => ctx.checksumBuilder.buildEvent(pallet, name)
319
+ );
320
+ const checksumError = () => new Error(`Incompatible runtime entry Event(${pallet}.${name})`);
321
+ const shared$ = chainHead.finalized$.pipe(
322
+ withCompatibleRuntime(chainHead, (x) => x.hash, checksumError),
323
+ concatMapEager(
324
+ ([block]) => chainHead.eventsAt$(block.hash).pipe(
325
+ map3((events) => {
326
+ const winners = events.filter(
327
+ (e) => e.event.type === pallet && e.event.value.type === name
328
+ );
329
+ return winners.map((x) => {
330
+ return {
331
+ meta: {
332
+ phase: x.phase,
333
+ block
334
+ },
335
+ payload: x.event.value.value
336
+ };
337
+ });
338
+ })
339
+ )
340
+ ),
341
+ shareLatest
342
+ );
343
+ const watch = (f) => shared$.pipe(mergeMap((x) => f ? x.filter((d) => f(d.payload)) : x));
344
+ const pull = () => firstValueFrom2(shared$);
345
+ const filter2 = (events) => events.filter((e) => e.type === pallet && e.value.type === name).map((x) => x.value.value);
346
+ return { watch, pull, filter: filter2, isCompatible };
347
+ };
348
+
349
+ // src/client.ts
350
+ import { getObservableClient } from "@polkadot-api/observable-client";
351
+
352
+ // src/runtime-call.ts
353
+ import { toHex } from "@polkadot-api/utils";
354
+ import { map as map4, mergeMap as mergeMap2 } from "rxjs";
355
+ var isOptionalArg = (lastArg) => {
356
+ if (typeof lastArg !== "object")
357
+ return false;
358
+ return Object.keys(lastArg).every(
359
+ (k) => k === "at" && typeof lastArg.at === "string" || k === "signal" && lastArg.signal instanceof AbortSignal
360
+ );
361
+ };
362
+ var createRuntimeCallEntry = (api, method, chainHead, compatibilityHelper2) => {
363
+ const { isCompatible, compatibleRuntime$ } = compatibilityHelper2(
364
+ (ctx) => ctx.checksumBuilder.buildRuntimeCall(api, method)
365
+ );
366
+ const callName = `${api}_${method}`;
367
+ const checksumError = () => new Error(`Incompatible runtime entry RuntimeCall(${callName})`);
368
+ const fn = (...args) => {
369
+ const lastArg = args[args.length - 1];
370
+ const isLastArgOptional = isOptionalArg(lastArg);
371
+ const { signal, at: _at } = isLastArgOptional ? lastArg : {};
372
+ const at = _at ?? null;
373
+ const result$ = compatibleRuntime$(chainHead, at, checksumError).pipe(
374
+ mergeMap2((ctx) => {
375
+ const codecs = ctx.dynamicBuilder.buildRuntimeCall(api, method);
376
+ return chainHead.call$(at, callName, toHex(codecs.args.enc(args))).pipe(map4(codecs.value.dec));
377
+ })
378
+ );
379
+ return firstValueFromWithSignal(result$, signal);
380
+ };
381
+ return Object.assign(fn, { isCompatible });
382
+ };
383
+
384
+ // src/storage.ts
385
+ import { debounceTime, distinctUntilChanged, map as map5 } from "rxjs";
386
+ var isOptionalArg2 = (lastArg) => {
387
+ if (typeof lastArg !== "object")
388
+ return false;
389
+ return Object.keys(lastArg).every(
390
+ (k) => k === "at" && typeof lastArg.at === "string" || k === "signal" && lastArg.signal instanceof AbortSignal
391
+ );
392
+ };
393
+ var createStorageEntry = (pallet, name, chainHead, compatibilityHelper2) => {
394
+ const { isCompatible, waitChecksums, withCompatibleRuntime } = compatibilityHelper2((ctx) => ctx.checksumBuilder.buildStorage(pallet, name));
395
+ const checksumError = () => new Error(`Incompatible runtime entry Storage(${pallet}.${name})`);
396
+ const invalidArgs = (args) => new Error(`Invalid Arguments calling ${pallet}.${name}(${args})`);
397
+ const watchValue = (...args) => {
398
+ const lastArg = args[args.length - 1];
399
+ const actualArgs = lastArg === "best" || lastArg === "finalized" ? args.slice(0, -1) : args;
400
+ return chainHead[lastArg === "best" ? "best$" : "finalized$"].pipe(
401
+ debounceTime(0),
402
+ withCompatibleRuntime(chainHead, (x) => x.hash, checksumError),
403
+ lossLessExhaustMap(([block, ctx]) => {
404
+ const codecs = ctx.dynamicBuilder.buildStorage(pallet, name);
405
+ return chainHead.storage$(block.hash, "value", () => codecs.enc(...actualArgs)).pipe(map5((val) => ({ val, codecs })));
406
+ }),
407
+ distinctUntilChanged((a, b) => a.val === b.val),
408
+ map5(
409
+ ({ val, codecs }) => val === null ? codecs.fallback : codecs.dec(val)
410
+ )
411
+ );
412
+ };
413
+ const getValue = async (...args) => {
414
+ const lastArg = args[args.length - 1];
415
+ const isLastArgOptional = isOptionalArg2(lastArg);
416
+ const { signal, at: _at } = isLastArgOptional ? lastArg : {};
417
+ const at = _at ?? null;
418
+ const isCompatible2 = await waitChecksums();
419
+ const result$ = chainHead.storage$(
420
+ at,
421
+ "value",
422
+ (ctx) => {
423
+ const codecs = ctx.dynamicBuilder.buildStorage(pallet, name);
424
+ const actualArgs = args.length === codecs.len ? args : args.slice(0, -1);
425
+ if (args !== actualArgs && !isLastArgOptional)
426
+ throw invalidArgs(args);
427
+ if (!isCompatible2(ctx))
428
+ throw checksumError();
429
+ return codecs.enc(...actualArgs);
430
+ },
431
+ null,
432
+ (data, ctx) => {
433
+ const codecs = ctx.dynamicBuilder.buildStorage(pallet, name);
434
+ return data === null ? codecs.fallback : codecs.dec(data);
435
+ }
436
+ );
437
+ return firstValueFromWithSignal(result$, signal);
438
+ };
439
+ const getEntries = async (...args) => {
440
+ const lastArg = args[args.length - 1];
441
+ const isLastArgOptional = isOptionalArg2(lastArg);
442
+ const { signal, at: _at } = isLastArgOptional ? lastArg : {};
443
+ const at = _at ?? null;
444
+ const isCompatible2 = await waitChecksums();
445
+ const result$ = chainHead.storage$(
446
+ at,
447
+ "descendantsValues",
448
+ (ctx) => {
449
+ const codecs = ctx.dynamicBuilder.buildStorage(pallet, name);
450
+ if (args.length > codecs.len)
451
+ throw invalidArgs(args);
452
+ const actualArgs = args.length > 0 && isLastArgOptional ? args.slice(0, -1) : args;
453
+ if (args.length === codecs.len && actualArgs === args)
454
+ throw invalidArgs(args);
455
+ if (!isCompatible2(ctx))
456
+ throw checksumError();
457
+ return codecs.enc(...actualArgs);
458
+ },
459
+ null,
460
+ (values, ctx) => {
461
+ const codecs = ctx.dynamicBuilder.buildStorage(pallet, name);
462
+ return values.map(({ key, value }) => ({
463
+ keyArgs: codecs.keyDecoder(key),
464
+ value: codecs.dec(value)
465
+ }));
466
+ }
467
+ );
468
+ return firstValueFromWithSignal(result$, signal);
469
+ };
470
+ const getValues = (keyArgs, options) => Promise.all(
471
+ keyArgs.map((args) => getValue(...options ? [...args, options] : args))
472
+ );
473
+ return { isCompatible, getValue, getValues, getEntries, watchValue };
474
+ };
475
+
476
+ // src/tx.ts
477
+ import {
478
+ Binary,
479
+ Enum
480
+ } from "@polkadot-api/substrate-bindings";
481
+ import { mergeUint8, toHex as toHex2 } from "@polkadot-api/utils";
482
+ import {
483
+ Observable as Observable8,
484
+ concat,
485
+ firstValueFrom as firstValueFrom3,
486
+ lastValueFrom,
487
+ map as map6,
488
+ mergeMap as mergeMap3,
489
+ of,
490
+ startWith,
491
+ take,
492
+ withLatestFrom
493
+ } from "rxjs";
494
+ var getTxSuccessFromSystemEvents = (systemEvents, txIdx) => {
495
+ const events = systemEvents.filter((x) => x.phase.type === "ApplyExtrinsic" && x.phase.value === txIdx).map((x) => x.event);
496
+ const lastEvent = events[events.length - 1];
497
+ const ok = lastEvent.type === "System" && lastEvent.value.type === "ExtrinsicSuccess";
498
+ return { ok, events };
499
+ };
500
+ var getSubmitFns = (chainHead, client) => {
501
+ const tx$ = (tx) => concat(
502
+ chainHead.finalized$.pipe(
503
+ take(1),
504
+ mergeMap3((finalized) => chainHead.validateTx$(tx, finalized.hash)),
505
+ map6((isValid) => {
506
+ if (!isValid)
507
+ throw new Error("Invalid");
508
+ return { type: "broadcasted" };
509
+ })
510
+ ),
511
+ new Observable8((observer) => {
512
+ const subscription = chainHead.trackTx$(tx).subscribe(observer);
513
+ subscription.add(
514
+ client.broadcastTx$(tx).subscribe({
515
+ error(e) {
516
+ observer.error(e);
517
+ }
518
+ })
519
+ );
520
+ return subscription;
521
+ })
522
+ );
523
+ const submit$ = (transaction) => tx$(transaction).pipe(
524
+ mergeMap3((result) => {
525
+ return result.type !== "finalized" ? of(result) : chainHead.eventsAt$(result.block.hash).pipe(
526
+ map6((events) => ({
527
+ ...result,
528
+ ...getTxSuccessFromSystemEvents(
529
+ events,
530
+ Number(result.block.index)
531
+ )
532
+ }))
533
+ );
534
+ })
535
+ );
536
+ const submit = async (transaction) => lastValueFrom(submit$(transaction)).then((x) => {
537
+ if (x.type !== "finalized")
538
+ throw null;
539
+ const result = { ...x };
540
+ delete result.type;
541
+ return result;
542
+ });
543
+ return { submit$, submit };
544
+ };
545
+ var createTxEntry = (pallet, name, assetChecksum, chainHead, submits, signer, compatibilityHelper2) => {
546
+ const { isCompatible, compatibleRuntime$ } = compatibilityHelper2(
547
+ (ctx) => ctx.checksumBuilder.buildCall(pallet, name)
548
+ );
549
+ const checksumError = () => new Error(`Incompatible runtime entry Tx(${pallet}.${name})`);
550
+ const fn = (arg) => {
551
+ const getCallDataWithContext = ({ dynamicBuilder, asset: [assetEnc, assetCheck] }, arg2, hinted = {}) => {
552
+ let returnHinted = hinted;
553
+ if (hinted.asset) {
554
+ if (assetChecksum !== assetCheck)
555
+ throw new Error(`Incompatible runtime asset`);
556
+ returnHinted = { ...hinted, asset: assetEnc(hinted.asset) };
557
+ }
558
+ const { location, codec } = dynamicBuilder.buildCall(pallet, name);
559
+ return {
560
+ callData: Binary.fromBytes(
561
+ mergeUint8(new Uint8Array(location), codec.enc(arg2))
562
+ ),
563
+ hinted: returnHinted
564
+ };
565
+ };
566
+ const getCallData$ = (arg2, hinted = {}) => compatibleRuntime$(chainHead, null, checksumError).pipe(
567
+ map6((ctx) => getCallDataWithContext(ctx, arg2, hinted))
568
+ );
569
+ const getEncodedData = (runtime) => {
570
+ if (runtime) {
571
+ if (!isCompatible(runtime)) {
572
+ throw checksumError();
573
+ }
574
+ return getCallDataWithContext(getRuntimeContext(runtime), arg).callData;
575
+ }
576
+ return firstValueFrom3(getCallData$(arg).pipe(map6((x) => x.callData)));
577
+ };
578
+ const sign$ = (from, _hinted) => getCallData$(arg, _hinted).pipe(
579
+ withLatestFrom(chainHead.finalized$),
580
+ take(1),
581
+ mergeMap3(
582
+ ([{ callData, hinted }, finalized]) => signer(from, callData.asBytes(), finalized, hinted)
583
+ )
584
+ );
585
+ const sign = (from, _hinted) => firstValueFrom3(sign$(from, _hinted)).then(toHex2);
586
+ const signAndSubmit = (from, _hinted) => sign(from, _hinted).then(submits.submit);
587
+ const signSubmitAndWatch = (from, _hinted) => sign$(from, _hinted).pipe(
588
+ mergeMap3((result) => {
589
+ const tx = toHex2(result);
590
+ return submits.submit$(tx).pipe(startWith({ type: "signed", tx }));
591
+ })
592
+ );
593
+ return {
594
+ decodedCall: Enum(pallet, Enum(name, arg)),
595
+ getEncodedData,
596
+ sign,
597
+ signSubmitAndWatch,
598
+ signAndSubmit
599
+ };
600
+ };
601
+ return Object.assign(fn, { isCompatible });
602
+ };
603
+
604
+ // src/get-create-tx.ts
605
+ import { combineLatest as combineLatest2, mergeMap as mergeMap4, of as of6, take as take2 } from "rxjs";
606
+
607
+ // src/signed-extensions/user/ChargeTransactionPayment.ts
608
+ import { compactBn } from "@polkadot-api/substrate-bindings";
609
+ import { of as of3 } from "rxjs";
610
+
611
+ // src/signed-extensions/utils.ts
612
+ import { map as map7, noop as noop2, of as of2 } from "rxjs";
613
+ import {
614
+ Storage,
615
+ Twox64Concat,
616
+ u32
617
+ } from "@polkadot-api/substrate-bindings";
618
+ import { getDynamicBuilder, getLookupFn } from "@polkadot-api/metadata-builders";
619
+ import { fromHex } from "@polkadot-api/utils";
620
+ var empty = new Uint8Array();
621
+ var genesisHashStorageKey = Storage("System")("BlockHash", noop2, [
622
+ u32,
623
+ Twox64Concat
624
+ ]).enc(0);
625
+ var genesisHashFromCtx = (ctx) => ctx.chainHead.storage$(ctx.at, "value", () => genesisHashStorageKey, null).pipe(map7((result) => fromHex(result)));
626
+ var systemVersionProp$ = (propName, metadata) => {
627
+ const lookupFn = getLookupFn(metadata.lookup);
628
+ const dynamicBuilder = getDynamicBuilder(metadata);
629
+ const constant = metadata.pallets.find((x) => x.name === "System").constants.find((s) => s.name === "Version");
630
+ const systemVersion = lookupFn(constant.type);
631
+ const systemVersionDec = dynamicBuilder.buildDefinition(constant.type).dec;
632
+ if (systemVersion.type !== "struct")
633
+ throw new Error("not a struct");
634
+ const valueEnc = dynamicBuilder.buildDefinition(
635
+ systemVersion.value[propName].id
636
+ ).enc;
637
+ return of2(valueEnc(systemVersionDec(constant.value)[propName]));
638
+ };
639
+
640
+ // src/signed-extensions/user/ChargeTransactionPayment.ts
641
+ var ChargeTransactionPayment = (tip) => of3({
642
+ value: compactBn.enc(tip),
643
+ additionalSigned: empty
644
+ });
645
+
646
+ // src/signed-extensions/user/CheckMortality.ts
647
+ import { map as map8, of as of4 } from "rxjs";
648
+ import { Bytes, enhanceEncoder, u16 } from "@polkadot-api/substrate-bindings";
649
+ import { fromHex as fromHex2 } from "@polkadot-api/utils";
650
+ function trailingZeroes(n) {
651
+ let i = 0;
652
+ while (!(n & 1)) {
653
+ i++;
654
+ n >>= 1;
655
+ }
656
+ return i;
657
+ }
658
+ var mortal = enhanceEncoder(
659
+ Bytes(2).enc,
660
+ (value) => {
661
+ const factor = Math.max(value.period >> 12, 1);
662
+ const left = Math.min(Math.max(trailingZeroes(value.period) - 1, 1), 15);
663
+ const right = value.phase / factor << 4;
664
+ return u16.enc(left | right);
665
+ }
666
+ );
667
+ var zero = new Uint8Array([0]);
668
+ var CheckMortality = (input, ctx) => {
669
+ if (!input)
670
+ return genesisHashFromCtx(ctx).pipe(
671
+ map8((additionalSigned) => ({
672
+ additionalSigned,
673
+ value: zero
674
+ }))
675
+ );
676
+ const { period, blockNumber } = input;
677
+ return of4({
678
+ additionalSigned: fromHex2(ctx.at),
679
+ value: mortal({
680
+ period,
681
+ phase: blockNumber % period
682
+ })
683
+ });
684
+ };
685
+
686
+ // src/signed-extensions/user/ChargeAssetTxPayment.ts
687
+ import { of as of5 } from "rxjs";
688
+ import {
689
+ Bytes as Bytes2,
690
+ Option,
691
+ Struct,
692
+ compact
693
+ } from "@polkadot-api/substrate-bindings";
694
+ var encoder = Struct({
695
+ tip: compact,
696
+ asset: Option(Bytes2(Infinity))
697
+ }).enc;
698
+ var ChargeAssetTxPayment = (tip, asset) => of5({
699
+ value: encoder({
700
+ tip,
701
+ asset
702
+ }),
703
+ additionalSigned: empty
704
+ });
705
+
706
+ // src/signed-extensions/chain/index.ts
707
+ var chain_exports = {};
708
+ __export(chain_exports, {
709
+ CheckGenesis: () => CheckGenesis,
710
+ CheckNonce: () => CheckNonce,
711
+ CheckSpecVersion: () => CheckSpecVersion,
712
+ CheckTxVersion: () => CheckTxVersion
713
+ });
714
+
715
+ // src/signed-extensions/chain/CheckGenesis.ts
716
+ import { map as map9 } from "rxjs";
717
+ var CheckGenesis = (ctx) => genesisHashFromCtx(ctx).pipe(
718
+ map9((additionalSigned) => ({ value: empty, additionalSigned }))
719
+ );
720
+
721
+ // src/signed-extensions/chain/CheckNonce.ts
722
+ import { map as map10 } from "rxjs";
723
+ import { compact as compact2, u16 as u162, u32 as u322, u64, u8 } from "@polkadot-api/substrate-bindings";
724
+ import { fromHex as fromHex3, toHex as toHex3 } from "@polkadot-api/utils";
725
+ var lenToDecoder = {
726
+ 1: u8.dec,
727
+ 2: u162.dec,
728
+ 4: u322.dec,
729
+ 8: u64.dec
730
+ };
731
+ var CheckNonce = (ctx) => ctx.chainHead.call$(ctx.at, "AccountNonceApi_account_nonce", toHex3(ctx.from)).pipe(
732
+ map10((result) => {
733
+ const bytes = fromHex3(result);
734
+ const decoder = lenToDecoder[bytes.length];
735
+ if (!decoder)
736
+ throw new Error("AccountNonceApi_account_nonce retrieved wrong data");
737
+ return compact2.enc(decoder(bytes));
738
+ }),
739
+ map10((value) => ({ value, additionalSigned: empty }))
740
+ );
741
+
742
+ // src/signed-extensions/chain/CheckSpecVersion.ts
743
+ import { map as map11 } from "rxjs";
744
+ var CheckSpecVersion = ({ metadata }) => systemVersionProp$("spec_version", metadata).pipe(
745
+ map11((additionalSigned) => ({ additionalSigned, value: empty }))
746
+ );
747
+
748
+ // src/signed-extensions/chain/CheckTxVersion.ts
749
+ import { map as map12 } from "rxjs";
750
+ var CheckTxVersion = ({ metadata }) => systemVersionProp$("transaction_version", metadata).pipe(
751
+ map12((additionalSigned) => ({ additionalSigned, value: empty }))
752
+ );
753
+
754
+ // src/get-create-tx.ts
755
+ import { _void } from "@polkadot-api/substrate-bindings";
756
+ var getCreateTx = (chainHead) => {
757
+ return (signer, callData, atBlock, hinted) => {
758
+ return chainHead.getRuntimeContext$(atBlock.hash).pipe(
759
+ take2(1),
760
+ mergeMap4((ctx) => {
761
+ const signedExtensionsCtx = {
762
+ metadata: ctx.metadata,
763
+ chainHead,
764
+ callData,
765
+ at: atBlock.hash,
766
+ from: signer.publicKey
767
+ };
768
+ const mortality = hinted?.mortality?.mortal ? { period: hinted.mortality.period, blockNumber: atBlock.number } : void 0;
769
+ return combineLatest2(
770
+ ctx.metadata.extrinsic.signedExtensions.map(
771
+ ({ identifier, type, additionalSigned }) => {
772
+ if (identifier === "CheckMortality")
773
+ return CheckMortality(mortality, signedExtensionsCtx);
774
+ if (identifier === "ChargeTransactionPayment")
775
+ return ChargeTransactionPayment(hinted?.tip ?? 0n);
776
+ if (identifier === "ChargeAssetTxPayment")
777
+ return ChargeAssetTxPayment(hinted?.tip ?? 0n, hinted?.asset);
778
+ const fn = chain_exports[identifier];
779
+ if (!fn) {
780
+ if (ctx.dynamicBuilder.buildDefinition(type) === _void && ctx.dynamicBuilder.buildDefinition(additionalSigned) === _void)
781
+ return of6({
782
+ value: empty,
783
+ additionalSigned: empty
784
+ });
785
+ throw new Error(`Unsupported signed-extension: ${identifier}`);
786
+ }
787
+ return fn(signedExtensionsCtx);
788
+ }
789
+ )
790
+ ).pipe(
791
+ mergeMap4(
792
+ (signedExtensions) => signer.sign(
793
+ callData,
794
+ Object.fromEntries(
795
+ ctx.metadata.extrinsic.signedExtensions.map(
796
+ ({ identifier }, idx) => [
797
+ identifier,
798
+ { identifier, ...signedExtensions[idx] }
799
+ ]
800
+ )
801
+ ),
802
+ ctx.metadataRaw,
803
+ atBlock.number
804
+ )
805
+ )
806
+ );
807
+ })
808
+ );
809
+ };
810
+ };
811
+
812
+ // src/client.ts
813
+ var createTypedApi = (descriptors, createTxFromSigner, chainHead, submitFns) => {
814
+ const runtimeApi = getRuntimeApi(descriptors.checksums, chainHead);
815
+ const { pallets, apis: runtimeApis } = descriptors;
816
+ const query = {};
817
+ for (const pallet in pallets) {
818
+ query[pallet] || (query[pallet] = {});
819
+ const [stgEntries] = pallets[pallet];
820
+ for (const name in stgEntries) {
821
+ query[pallet][name] = createStorageEntry(
822
+ pallet,
823
+ name,
824
+ chainHead,
825
+ compatibilityHelper(runtimeApi, stgEntries[name])
826
+ );
827
+ }
828
+ }
829
+ const tx = {};
830
+ for (const pallet in pallets) {
831
+ tx[pallet] || (tx[pallet] = {});
832
+ const [, txEntries] = pallets[pallet];
833
+ for (const name in txEntries) {
834
+ tx[pallet][name] = createTxEntry(
835
+ pallet,
836
+ name,
837
+ descriptors.asset,
838
+ chainHead,
839
+ submitFns,
840
+ createTxFromSigner,
841
+ compatibilityHelper(runtimeApi, txEntries[name])
842
+ );
843
+ }
844
+ }
845
+ const events = {};
846
+ for (const pallet in pallets) {
847
+ events[pallet] || (events[pallet] = {});
848
+ const [, , evEntries] = pallets[pallet];
849
+ for (const name in evEntries) {
850
+ events[pallet][name] = createEventEntry(
851
+ pallet,
852
+ name,
853
+ chainHead,
854
+ compatibilityHelper(runtimeApi, evEntries[name])
855
+ );
856
+ }
857
+ }
858
+ const constants = {};
859
+ for (const pallet in pallets) {
860
+ constants[pallet] || (constants[pallet] = {});
861
+ const [, , , , ctEntries] = pallets[pallet];
862
+ for (const name in ctEntries) {
863
+ constants[pallet][name] = createConstantEntry(
864
+ pallet,
865
+ name,
866
+ chainHead,
867
+ compatibilityHelper(runtimeApi, ctEntries[name])
868
+ );
869
+ }
870
+ }
871
+ const apis = {};
872
+ for (const api in runtimeApis) {
873
+ apis[api] || (apis[api] = {});
874
+ const methods = runtimeApis[api];
875
+ for (const method in methods) {
876
+ apis[api][method] = createRuntimeCallEntry(
877
+ api,
878
+ method,
879
+ chainHead,
880
+ compatibilityHelper(runtimeApi, methods[method])
881
+ );
882
+ }
883
+ }
884
+ return {
885
+ query,
886
+ tx,
887
+ event: events,
888
+ apis,
889
+ constants,
890
+ runtime: runtimeApi
891
+ };
892
+ };
893
+ function createClient(provider) {
894
+ const rawClient = createRawClient(provider);
895
+ const client = getObservableClient(rawClient);
896
+ const chainHead = client.chainHead$();
897
+ const createTxFromSigner = getCreateTx(chainHead);
898
+ const submitFns = getSubmitFns(chainHead, client);
899
+ const { submit, submit$: submitAndWatch } = submitFns;
900
+ return {
901
+ finalized$: chainHead.finalized$,
902
+ bestBlocks$: chainHead.bestBlocks$,
903
+ getBlockHeader: (hash) => firstValueFrom4(chainHead.header$(hash ?? null)),
904
+ getBlockBody: chainHead.body$,
905
+ destroy: () => {
906
+ chainHead.unfollow();
907
+ client.destroy();
908
+ },
909
+ submit,
910
+ submitAndWatch,
911
+ getTypedApi: (descriptors) => createTypedApi(descriptors, createTxFromSigner, chainHead, submitFns)
912
+ };
913
+ }
914
+
915
+ // src/re-exports.ts
916
+ import {
917
+ AccountId,
918
+ Binary as Binary2,
919
+ Enum as Enum2,
920
+ _Enum
921
+ } from "@polkadot-api/substrate-bindings";
922
+ export {
923
+ AccountId,
924
+ Binary2 as Binary,
925
+ Enum2 as Enum,
926
+ _Enum,
927
+ createClient
928
+ };
929
+ //# sourceMappingURL=index.mjs.map