polkadot-api 1.23.1 → 1.23.3

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/bin/cli.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { getCli, ink, update, remove, generate, add } from '@polkadot-api/cli';
3
3
 
4
- var version = "1.23.1";
4
+ var version = "1.23.3";
5
5
 
6
6
  getCli({
7
7
  add,
@@ -216,14 +216,8 @@ function createClient(provider, { getMetadata, setMetadata } = {}) {
216
216
  )
217
217
  };
218
218
  const _request = rawClient.request;
219
- let runtimeToken;
220
- const compatibilityToken = /* @__PURE__ */ new WeakMap();
221
- const getChainToken = (chainDefinition) => {
222
- const result2 = compatibilityToken.get(chainDefinition) || createCompatibilityToken(chainDefinition, chainHead);
223
- compatibilityToken.set(chainDefinition, result2);
224
- return result2;
225
- };
226
- const getRuntimeToken = () => runtimeToken ?? (runtimeToken = createRuntimeToken(chainHead));
219
+ let unsafeApi;
220
+ const typedApis = /* @__PURE__ */ new WeakMap();
227
221
  const { broadcastTx$ } = client;
228
222
  const getMetadata$ = (at) => chainHead.getRuntimeContext$(at).pipe(map((ctx) => ctx.metadataRaw));
229
223
  const result = {
@@ -242,17 +236,26 @@ function createClient(provider, { getMetadata, setMetadata } = {}) {
242
236
  submit: (...args) => submit(chainHead, broadcastTx$, ...args),
243
237
  submitAndWatch: (tx) => submit$(chainHead, broadcastTx$, tx),
244
238
  getTypedApi: (chainDefinition) => {
245
- const token = getChainToken(chainDefinition);
246
- return Object.assign(
247
- createApi(token, chainHead, broadcastTx$),
248
- { compatibilityToken: token }
239
+ if (typedApis.has(chainDefinition)) return typedApis.get(chainDefinition);
240
+ const compatibilityToken = createCompatibilityToken(
241
+ chainDefinition,
242
+ chainHead
243
+ );
244
+ const api = Object.assign(
245
+ createApi(compatibilityToken, chainHead, broadcastTx$),
246
+ { compatibilityToken }
249
247
  );
248
+ typedApis.set(chainDefinition, api);
249
+ return api;
250
250
  },
251
251
  getUnsafeApi: () => {
252
- const token = getRuntimeToken();
253
- return Object.assign(createApi(token, chainHead, broadcastTx$), {
254
- runtimeToken: token
255
- });
252
+ if (unsafeApi) return unsafeApi;
253
+ const runtimeToken = createRuntimeToken(chainHead);
254
+ unsafeApi = Object.assign(
255
+ createApi(runtimeToken, chainHead, broadcastTx$),
256
+ { runtimeToken }
257
+ );
258
+ return unsafeApi;
256
259
  },
257
260
  rawQuery: (key, { at, signal } = {}) => firstValueFromWithSignal(
258
261
  chainHead.storage$(at ?? null, "value", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"client.mjs","sources":["../../src/client.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport {\n enumValueEntryPointNode,\n runtimeCallEntryPoint,\n singleValueEntryPoint,\n storageEntryPoint,\n voidEntryPointNode,\n} from \"@polkadot-api/metadata-compatibility\"\nimport {\n ChainHead$,\n RuntimeContext,\n getObservableClient,\n withArchive,\n} from \"@polkadot-api/observable-client\"\nimport { Binary, HexString } from \"@polkadot-api/substrate-bindings\"\nimport {\n SubstrateClient,\n createClient as createRawClient,\n} from \"@polkadot-api/substrate-client\"\nimport {\n Observable,\n catchError,\n defer,\n firstValueFrom,\n from,\n map,\n shareReplay,\n} from \"rxjs\"\nimport {\n CompatibilityToken,\n OpType,\n RuntimeToken,\n compatibilityHelper,\n createCompatibilityToken,\n createRuntimeToken,\n getCompatibilityApi,\n} from \"./compatibility\"\nimport { createConstantEntry } from \"./constants\"\nimport { ChainDefinition } from \"./descriptors\"\nimport { createEventEntry } from \"./event\"\nimport { createRuntimeCallEntry } from \"./runtime-call\"\nimport { createStorageEntry } from \"./storage\"\nimport { createTxEntry, submit, submit$ } from \"./tx\"\nimport type { AnyApi, PolkadotClient } from \"./types\"\nimport { createWatchEntries } from \"./watch-entries\"\nimport { createViewFnEntry } from \"./viewFns\"\nimport { firstValueFromWithSignal } from \"./utils\"\n\nconst HEX_REGEX = /^(?:0x)?((?:[0-9a-fA-F][0-9a-fA-F])+)$/\n\nconst createApi = <Unsafe extends true | false, D>(\n compatibilityToken: Promise<CompatibilityToken | RuntimeToken>,\n chainHead: ChainHead$,\n broadcast$: (tx: string) => Observable<never>,\n): AnyApi<Unsafe, D> => {\n const target = {}\n const createProxy = (propCall: (prop: string) => unknown) =>\n new Proxy(target, {\n get(_, prop) {\n return propCall(prop as string)\n },\n })\n const createProxyPath = <T>(pathCall: (a: string, b: string) => T) => {\n const cache: Record<string, Record<string, T>> = {}\n return createProxy((a) => {\n if (!cache[a]) cache[a] = {}\n return createProxy((b) => {\n if (!cache[a][b]) cache[a][b] = pathCall(a, b)\n return cache[a][b]\n })\n }) as Record<string, Record<string, T>>\n }\n\n const getPallet = (ctx: RuntimeContext, name: string) =>\n ctx.lookup.metadata.pallets.find((p) => p.name === name)\n\n const getWatchEntries = createWatchEntries(\n chainHead.pinnedBlocks$,\n chainHead.storage$,\n chainHead.withRuntime,\n )\n\n const query = createProxyPath((pallet, name) =>\n createStorageEntry(\n pallet,\n name,\n chainHead,\n getWatchEntries,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Storage, pallet, name),\n // TODO this is way sub-optimal. Needs some rethought - maybe a builder for entry points?.\n (ctx) => {\n const item = getPallet(ctx, pallet)?.storage?.items.find(\n (s) => s.name === name,\n )\n return item == null ? null : storageEntryPoint(item)\n },\n ),\n ),\n )\n\n const getEnumEntry = (\n ctx: RuntimeContext,\n side: \"args\" | \"values\",\n id: number | undefined,\n name: string,\n ) => {\n if (id == null) return null\n const entry = ctx.lookup(id)\n if (entry.type !== \"enum\") throw new Error(\"Expected enum\")\n\n if (entry.value[name] == null) return null\n const node = enumValueEntryPointNode(entry.value[name])\n return {\n args: side === \"args\" ? node : voidEntryPointNode,\n values: side === \"args\" ? voidEntryPointNode : node,\n }\n }\n const tx = createProxyPath((pallet, name) =>\n createTxEntry(\n pallet,\n name,\n chainHead,\n broadcast$,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Tx, pallet, name),\n (ctx) =>\n getEnumEntry(ctx, \"args\", getPallet(ctx, pallet)?.calls?.type, name),\n ),\n true,\n ),\n )\n\n const event = createProxyPath((pallet, name) =>\n createEventEntry(\n pallet,\n name,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Event, pallet, name),\n (ctx) =>\n getEnumEntry(\n ctx,\n \"values\",\n getPallet(ctx, pallet)?.events?.type,\n name,\n ),\n ),\n ),\n )\n\n const constants = createProxyPath((pallet, name) =>\n createConstantEntry(\n pallet,\n name,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Const, pallet, name),\n (ctx) => {\n const item = getPallet(ctx, pallet)?.constants.find(\n (c) => c.name === name,\n )?.type\n return item == null ? null : singleValueEntryPoint(item)\n },\n ),\n ),\n )\n\n const apis = createProxyPath((api, method) =>\n createRuntimeCallEntry(\n api,\n method,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Api, api, method),\n (ctx) => {\n const item = ctx.lookup.metadata.apis\n .find((a) => a.name === api)\n ?.methods.find((m) => m.name === method)\n return item == null ? null : runtimeCallEntryPoint(item)\n },\n ),\n ),\n )\n const view = createProxyPath((pallet, entry) =>\n createViewFnEntry(\n pallet,\n entry,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.ViewFns, pallet, entry),\n (ctx) => {\n const item = ctx.lookup.metadata.pallets\n .find((a) => a.name === pallet)\n ?.viewFns.find((m) => m.name === entry)\n return item == null ? null : runtimeCallEntryPoint(item)\n },\n ),\n ),\n )\n\n const _callDataTx = (\n callData: Binary,\n token: CompatibilityToken | RuntimeToken,\n ) => {\n const { lookup, dynamicBuilder } = getCompatibilityApi(token).runtime()\n try {\n const decoded = dynamicBuilder\n .buildDefinition(lookup.call!)\n .dec(callData.asBytes())\n const pallet = decoded.type\n const call = decoded.value.type\n const args = decoded.value.value\n\n return createTxEntry(\n pallet,\n call,\n chainHead,\n broadcast$,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Tx, pallet, call),\n (ctx) =>\n getEnumEntry(\n ctx,\n \"args\",\n getPallet(ctx, pallet)?.calls?.type,\n call,\n ),\n ),\n false,\n )(args)\n } catch {\n throw new Error(\"createTx: invalid call data\")\n }\n }\n\n return {\n query,\n txFromCallData: (\n callData: Binary,\n token?: CompatibilityToken | RuntimeToken,\n ) =>\n token\n ? _callDataTx(callData, token)\n : compatibilityToken.then((t) => _callDataTx(callData, t)),\n tx,\n event,\n apis,\n constants,\n view,\n } as any\n}\n\nexport type CreateClientOptions = Partial<{\n getMetadata: (codeHash: HexString) => Promise<Uint8Array | null>\n setMetadata: (codeHash: HexString, metadata: Uint8Array) => void\n}>\n\n/**\n * This is the top-level export for `polkadot-api`.\n *\n * @param provider A `JsonRpcProvider` compliant with the [JSON-RPC\n * spec](https://paritytech.github.io/json-rpc-interface-spec/),\n * which must support the `chainHead`, `transaction` and\n * `chainSpec` groups.\n * @param options - *(Optional)* An object that allows customization of\n * metadata handling.\n * You can supply functions to retrieve and/or persist the\n * metadata associated with runtime `codeHash` values:\n *\n * - `getMetadata`: A function that, given a `codeHash` (the\n * `:code:` hash),\n * returns a `Promise` resolving to a `Uint8Array`\n * representing the metadata,\n * or `null` if unavailable.\n * - `setMetadata`: A function that accepts a `codeHash` and\n * its associated `Uint8Array` metadata,\n * allowing you to persist the metadata (e.g., in a cache or\n * local store).\n * @example\n *\n * import { getMetadata } from \"@polkadot-api/descriptors\"\n * import { createClient } from \"polkadot-api\"\n * import { getSmProvider } from \"polkadot-api/sm-provider\"\n * import { chainSpec } from \"polkadot-api/chains/polkadot\"\n * import { start } from \"polkadot-api/smoldot\"\n *\n * const smoldot = start()\n * const chain = await smoldot.addChain({ chainSpec })\n *\n * // Connect to the polkadot relay chain.\n * const client = createClient(getSmProvider(chain), { getMetadata })\n *\n */\nexport function createClient(\n provider: JsonRpcProvider,\n { getMetadata, setMetadata }: CreateClientOptions = {},\n): PolkadotClient {\n const rawClient: SubstrateClient = createRawClient(provider)\n const client = getObservableClient(rawClient, {\n getMetadata: getMetadata\n ? (codeHash: string) => from(getMetadata(codeHash))\n : undefined,\n setMetadata,\n })\n const { getChainSpecData } = rawClient\n\n const { genesis$, ..._chainHead } = client.chainHead$()\n const archive = client.archive(_chainHead.getRuntime$)\n const chainHead: ChainHead$ = {\n ..._chainHead,\n genesis$: defer(getChainSpecData).pipe(\n map(({ genesisHash }) => genesisHash),\n catchError(() => genesis$),\n shareReplay(1),\n ),\n storage$: withArchive(_chainHead.storage$, archive.storage$),\n body$: withArchive(_chainHead.body$, archive.body$),\n call$: withArchive(_chainHead.call$, archive.call$),\n header$: withArchive(_chainHead.header$, archive.header$),\n eventsAt$: withArchive(_chainHead.eventsAt$, archive.eventsAt$),\n storageQueries$: withArchive(\n _chainHead.storageQueries$,\n archive.storageQueries$,\n ),\n getRuntimeContext$: withArchive(\n _chainHead.getRuntimeContext$,\n archive.getRuntimeContext$,\n ),\n }\n\n const _request: <Reply = any, Params extends Array<any> = any[]>(\n method: string,\n params: Params,\n ) => Promise<Reply> = rawClient.request\n\n let runtimeToken: Promise<RuntimeToken>\n const compatibilityToken = new WeakMap<\n ChainDefinition,\n Promise<CompatibilityToken<any>>\n >()\n const getChainToken = (chainDefinition: ChainDefinition) => {\n const result =\n compatibilityToken.get(chainDefinition) ||\n createCompatibilityToken(chainDefinition, chainHead)\n compatibilityToken.set(chainDefinition, result)\n return result\n }\n const getRuntimeToken = <D>(): Promise<RuntimeToken<D>> =>\n (runtimeToken ??= createRuntimeToken(chainHead))\n const { broadcastTx$ } = client\n\n const getMetadata$ = (at: HexString) =>\n chainHead.getRuntimeContext$(at).pipe(map((ctx) => ctx.metadataRaw))\n\n const result: PolkadotClient = {\n getChainSpecData,\n\n getMetadata$,\n getMetadata: (atBlock: HexString, signal?: AbortSignal) =>\n firstValueFromWithSignal(getMetadata$(atBlock), signal),\n\n blocks$: chainHead.newBlocks$,\n hodlBlock: (block: HexString) => chainHead.holdBlock(block, true),\n\n finalizedBlock$: chainHead.finalized$,\n getFinalizedBlock: () => firstValueFrom(chainHead.finalized$),\n\n bestBlocks$: chainHead.bestBlocks$,\n getBestBlocks: () => firstValueFrom(chainHead.bestBlocks$),\n\n watchBlockBody: chainHead.body$,\n getBlockBody: (hash: string) => firstValueFrom(chainHead.body$(hash)),\n\n getBlockHeader: (hash?: string) =>\n firstValueFrom(chainHead.header$(hash ?? null)),\n\n submit: (...args) => submit(chainHead, broadcastTx$, ...args),\n submitAndWatch: (tx) => submit$(chainHead, broadcastTx$, tx),\n\n getTypedApi: <D extends ChainDefinition>(chainDefinition: D) => {\n const token = getChainToken(chainDefinition)\n return Object.assign(\n createApi<false, D>(token, chainHead, broadcastTx$),\n { compatibilityToken: token },\n )\n },\n\n getUnsafeApi: <D>() => {\n const token = getRuntimeToken()\n return Object.assign(createApi<true, D>(token, chainHead, broadcastTx$), {\n runtimeToken: token,\n })\n },\n\n rawQuery: (key, { at, signal } = {}) =>\n firstValueFromWithSignal(\n chainHead.storage$(at ?? null, \"value\", () => {\n const hex = key.match(HEX_REGEX)?.[1]\n return hex ? `0x${hex}` : Binary.fromText(key).asHex()\n }),\n signal,\n ),\n\n destroy: () => {\n chainHead.unfollow()\n client.destroy()\n },\n\n _request,\n }\n\n ;(result as any).___INTERNAL_DO_NOT_USE = chainHead\n\n return result\n}\n"],"names":["createRawClient","result"],"mappings":"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"}
1
+ {"version":3,"file":"client.mjs","sources":["../../src/client.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport {\n enumValueEntryPointNode,\n runtimeCallEntryPoint,\n singleValueEntryPoint,\n storageEntryPoint,\n voidEntryPointNode,\n} from \"@polkadot-api/metadata-compatibility\"\nimport {\n ChainHead$,\n RuntimeContext,\n getObservableClient,\n withArchive,\n} from \"@polkadot-api/observable-client\"\nimport { Binary, HexString } from \"@polkadot-api/substrate-bindings\"\nimport {\n SubstrateClient,\n createClient as createRawClient,\n} from \"@polkadot-api/substrate-client\"\nimport {\n Observable,\n catchError,\n defer,\n firstValueFrom,\n from,\n map,\n shareReplay,\n} from \"rxjs\"\nimport {\n CompatibilityToken,\n OpType,\n RuntimeToken,\n compatibilityHelper,\n createCompatibilityToken,\n createRuntimeToken,\n getCompatibilityApi,\n} from \"./compatibility\"\nimport { createConstantEntry } from \"./constants\"\nimport { ChainDefinition } from \"./descriptors\"\nimport { createEventEntry } from \"./event\"\nimport { createRuntimeCallEntry } from \"./runtime-call\"\nimport { createStorageEntry } from \"./storage\"\nimport { createTxEntry, submit, submit$ } from \"./tx\"\nimport type { AnyApi, PolkadotClient, TypedApi, UnsafeApi } from \"./types\"\nimport { createWatchEntries } from \"./watch-entries\"\nimport { createViewFnEntry } from \"./viewFns\"\nimport { firstValueFromWithSignal } from \"./utils\"\n\nconst HEX_REGEX = /^(?:0x)?((?:[0-9a-fA-F][0-9a-fA-F])+)$/\n\nconst createApi = <Unsafe extends true | false, D>(\n compatibilityToken: Promise<CompatibilityToken | RuntimeToken>,\n chainHead: ChainHead$,\n broadcast$: (tx: string) => Observable<never>,\n): AnyApi<Unsafe, D> => {\n const target = {}\n const createProxy = (propCall: (prop: string) => unknown) =>\n new Proxy(target, {\n get(_, prop) {\n return propCall(prop as string)\n },\n })\n const createProxyPath = <T>(pathCall: (a: string, b: string) => T) => {\n const cache: Record<string, Record<string, T>> = {}\n return createProxy((a) => {\n if (!cache[a]) cache[a] = {}\n return createProxy((b) => {\n if (!cache[a][b]) cache[a][b] = pathCall(a, b)\n return cache[a][b]\n })\n }) as Record<string, Record<string, T>>\n }\n\n const getPallet = (ctx: RuntimeContext, name: string) =>\n ctx.lookup.metadata.pallets.find((p) => p.name === name)\n\n const getWatchEntries = createWatchEntries(\n chainHead.pinnedBlocks$,\n chainHead.storage$,\n chainHead.withRuntime,\n )\n\n const query = createProxyPath((pallet, name) =>\n createStorageEntry(\n pallet,\n name,\n chainHead,\n getWatchEntries,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Storage, pallet, name),\n // TODO this is way sub-optimal. Needs some rethought - maybe a builder for entry points?.\n (ctx) => {\n const item = getPallet(ctx, pallet)?.storage?.items.find(\n (s) => s.name === name,\n )\n return item == null ? null : storageEntryPoint(item)\n },\n ),\n ),\n )\n\n const getEnumEntry = (\n ctx: RuntimeContext,\n side: \"args\" | \"values\",\n id: number | undefined,\n name: string,\n ) => {\n if (id == null) return null\n const entry = ctx.lookup(id)\n if (entry.type !== \"enum\") throw new Error(\"Expected enum\")\n\n if (entry.value[name] == null) return null\n const node = enumValueEntryPointNode(entry.value[name])\n return {\n args: side === \"args\" ? node : voidEntryPointNode,\n values: side === \"args\" ? voidEntryPointNode : node,\n }\n }\n const tx = createProxyPath((pallet, name) =>\n createTxEntry(\n pallet,\n name,\n chainHead,\n broadcast$,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Tx, pallet, name),\n (ctx) =>\n getEnumEntry(ctx, \"args\", getPallet(ctx, pallet)?.calls?.type, name),\n ),\n true,\n ),\n )\n\n const event = createProxyPath((pallet, name) =>\n createEventEntry(\n pallet,\n name,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Event, pallet, name),\n (ctx) =>\n getEnumEntry(\n ctx,\n \"values\",\n getPallet(ctx, pallet)?.events?.type,\n name,\n ),\n ),\n ),\n )\n\n const constants = createProxyPath((pallet, name) =>\n createConstantEntry(\n pallet,\n name,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Const, pallet, name),\n (ctx) => {\n const item = getPallet(ctx, pallet)?.constants.find(\n (c) => c.name === name,\n )?.type\n return item == null ? null : singleValueEntryPoint(item)\n },\n ),\n ),\n )\n\n const apis = createProxyPath((api, method) =>\n createRuntimeCallEntry(\n api,\n method,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Api, api, method),\n (ctx) => {\n const item = ctx.lookup.metadata.apis\n .find((a) => a.name === api)\n ?.methods.find((m) => m.name === method)\n return item == null ? null : runtimeCallEntryPoint(item)\n },\n ),\n ),\n )\n const view = createProxyPath((pallet, entry) =>\n createViewFnEntry(\n pallet,\n entry,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.ViewFns, pallet, entry),\n (ctx) => {\n const item = ctx.lookup.metadata.pallets\n .find((a) => a.name === pallet)\n ?.viewFns.find((m) => m.name === entry)\n return item == null ? null : runtimeCallEntryPoint(item)\n },\n ),\n ),\n )\n\n const _callDataTx = (\n callData: Binary,\n token: CompatibilityToken | RuntimeToken,\n ) => {\n const { lookup, dynamicBuilder } = getCompatibilityApi(token).runtime()\n try {\n const decoded = dynamicBuilder\n .buildDefinition(lookup.call!)\n .dec(callData.asBytes())\n const pallet = decoded.type\n const call = decoded.value.type\n const args = decoded.value.value\n\n return createTxEntry(\n pallet,\n call,\n chainHead,\n broadcast$,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Tx, pallet, call),\n (ctx) =>\n getEnumEntry(\n ctx,\n \"args\",\n getPallet(ctx, pallet)?.calls?.type,\n call,\n ),\n ),\n false,\n )(args)\n } catch {\n throw new Error(\"createTx: invalid call data\")\n }\n }\n\n return {\n query,\n txFromCallData: (\n callData: Binary,\n token?: CompatibilityToken | RuntimeToken,\n ) =>\n token\n ? _callDataTx(callData, token)\n : compatibilityToken.then((t) => _callDataTx(callData, t)),\n tx,\n event,\n apis,\n constants,\n view,\n } as any\n}\n\nexport type CreateClientOptions = Partial<{\n getMetadata: (codeHash: HexString) => Promise<Uint8Array | null>\n setMetadata: (codeHash: HexString, metadata: Uint8Array) => void\n}>\n\n/**\n * This is the top-level export for `polkadot-api`.\n *\n * @param provider A `JsonRpcProvider` compliant with the [JSON-RPC\n * spec](https://paritytech.github.io/json-rpc-interface-spec/),\n * which must support the `chainHead`, `transaction` and\n * `chainSpec` groups.\n * @param options - *(Optional)* An object that allows customization of\n * metadata handling.\n * You can supply functions to retrieve and/or persist the\n * metadata associated with runtime `codeHash` values:\n *\n * - `getMetadata`: A function that, given a `codeHash` (the\n * `:code:` hash),\n * returns a `Promise` resolving to a `Uint8Array`\n * representing the metadata,\n * or `null` if unavailable.\n * - `setMetadata`: A function that accepts a `codeHash` and\n * its associated `Uint8Array` metadata,\n * allowing you to persist the metadata (e.g., in a cache or\n * local store).\n * @example\n *\n * import { getMetadata } from \"@polkadot-api/descriptors\"\n * import { createClient } from \"polkadot-api\"\n * import { getSmProvider } from \"polkadot-api/sm-provider\"\n * import { chainSpec } from \"polkadot-api/chains/polkadot\"\n * import { start } from \"polkadot-api/smoldot\"\n *\n * const smoldot = start()\n * const chain = await smoldot.addChain({ chainSpec })\n *\n * // Connect to the polkadot relay chain.\n * const client = createClient(getSmProvider(chain), { getMetadata })\n *\n */\nexport function createClient(\n provider: JsonRpcProvider,\n { getMetadata, setMetadata }: CreateClientOptions = {},\n): PolkadotClient {\n const rawClient: SubstrateClient = createRawClient(provider)\n const client = getObservableClient(rawClient, {\n getMetadata: getMetadata\n ? (codeHash: string) => from(getMetadata(codeHash))\n : undefined,\n setMetadata,\n })\n const { getChainSpecData } = rawClient\n\n const { genesis$, ..._chainHead } = client.chainHead$()\n const archive = client.archive(_chainHead.getRuntime$)\n const chainHead: ChainHead$ = {\n ..._chainHead,\n genesis$: defer(getChainSpecData).pipe(\n map(({ genesisHash }) => genesisHash),\n catchError(() => genesis$),\n shareReplay(1),\n ),\n storage$: withArchive(_chainHead.storage$, archive.storage$),\n body$: withArchive(_chainHead.body$, archive.body$),\n call$: withArchive(_chainHead.call$, archive.call$),\n header$: withArchive(_chainHead.header$, archive.header$),\n eventsAt$: withArchive(_chainHead.eventsAt$, archive.eventsAt$),\n storageQueries$: withArchive(\n _chainHead.storageQueries$,\n archive.storageQueries$,\n ),\n getRuntimeContext$: withArchive(\n _chainHead.getRuntimeContext$,\n archive.getRuntimeContext$,\n ),\n }\n\n const _request: <Reply = any, Params extends Array<any> = any[]>(\n method: string,\n params: Params,\n ) => Promise<Reply> = rawClient.request\n\n let unsafeApi: UnsafeApi<any>\n const typedApis = new WeakMap<ChainDefinition, TypedApi<any>>()\n\n const { broadcastTx$ } = client\n\n const getMetadata$ = (at: HexString) =>\n chainHead.getRuntimeContext$(at).pipe(map((ctx) => ctx.metadataRaw))\n\n const result: PolkadotClient = {\n getChainSpecData,\n\n getMetadata$,\n getMetadata: (atBlock: HexString, signal?: AbortSignal) =>\n firstValueFromWithSignal(getMetadata$(atBlock), signal),\n\n blocks$: chainHead.newBlocks$,\n hodlBlock: (block: HexString) => chainHead.holdBlock(block, true),\n\n finalizedBlock$: chainHead.finalized$,\n getFinalizedBlock: () => firstValueFrom(chainHead.finalized$),\n\n bestBlocks$: chainHead.bestBlocks$,\n getBestBlocks: () => firstValueFrom(chainHead.bestBlocks$),\n\n watchBlockBody: chainHead.body$,\n getBlockBody: (hash: string) => firstValueFrom(chainHead.body$(hash)),\n\n getBlockHeader: (hash?: string) =>\n firstValueFrom(chainHead.header$(hash ?? null)),\n\n submit: (...args) => submit(chainHead, broadcastTx$, ...args),\n submitAndWatch: (tx) => submit$(chainHead, broadcastTx$, tx),\n\n getTypedApi: <D extends ChainDefinition>(chainDefinition: D) => {\n if (typedApis.has(chainDefinition)) return typedApis.get(chainDefinition)!\n const compatibilityToken = createCompatibilityToken(\n chainDefinition,\n chainHead,\n )\n const api = Object.assign(\n createApi<false, D>(compatibilityToken, chainHead, broadcastTx$),\n { compatibilityToken },\n )\n typedApis.set(chainDefinition, api)\n return api as any\n },\n\n getUnsafeApi: <D>() => {\n if (unsafeApi) return unsafeApi\n const runtimeToken = createRuntimeToken(chainHead)\n unsafeApi = Object.assign(\n createApi<true, D>(runtimeToken, chainHead, broadcastTx$),\n { runtimeToken },\n )\n return unsafeApi as any\n },\n\n rawQuery: (key, { at, signal } = {}) =>\n firstValueFromWithSignal(\n chainHead.storage$(at ?? null, \"value\", () => {\n const hex = key.match(HEX_REGEX)?.[1]\n return hex ? `0x${hex}` : Binary.fromText(key).asHex()\n }),\n signal,\n ),\n\n destroy: () => {\n chainHead.unfollow()\n client.destroy()\n },\n\n _request,\n }\n\n ;(result as any).___INTERNAL_DO_NOT_USE = chainHead\n\n return result\n}\n"],"names":["createRawClient"],"mappings":";;;;;;;;;;;;;;;;;;AAgDA,MAAM,SAAA,GAAY,wCAAA;AAElB,MAAM,SAAA,GAAY,CAChB,kBAAA,EACA,SAAA,EACA,UAAA,KACsB;AACtB,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,MAAM,WAAA,GAAc,CAAC,QAAA,KACnB,IAAI,MAAM,MAAA,EAAQ;AAAA,IAChB,GAAA,CAAI,GAAG,IAAA,EAAM;AACX,MAAA,OAAO,SAAS,IAAc,CAAA;AAAA,IAChC;AAAA,GACD,CAAA;AACH,EAAA,MAAM,eAAA,GAAkB,CAAI,QAAA,KAA0C;AACpE,IAAA,MAAM,QAA2C,EAAC;AAClD,IAAA,OAAO,WAAA,CAAY,CAAC,CAAA,KAAM;AACxB,MAAA,IAAI,CAAC,KAAA,CAAM,CAAC,GAAG,KAAA,CAAM,CAAC,IAAI,EAAC;AAC3B,MAAA,OAAO,WAAA,CAAY,CAAC,CAAA,KAAM;AACxB,QAAA,IAAI,CAAC,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,QAAA,CAAS,GAAG,CAAC,CAAA;AAC7C,QAAA,OAAO,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,MACnB,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,EAAqB,IAAA,KACtC,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAEzD,EAAA,MAAM,eAAA,GAAkB,kBAAA;AAAA,IACtB,SAAA,CAAU,aAAA;AAAA,IACV,SAAA,CAAU,QAAA;AAAA,IACV,SAAA,CAAU;AAAA,GACZ;AAEA,EAAA,MAAM,KAAA,GAAQ,eAAA;AAAA,IAAgB,CAAC,QAAQ,IAAA,KACrC,kBAAA;AAAA,MACE,MAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,mBAAA;AAAA,QACE,kBAAA;AAAA,QACA,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,MAAA,CAAO,OAAA,EAAS,QAAQ,IAAI,CAAA;AAAA;AAAA,QAEnD,CAAC,GAAA,KAAQ;AACP,UAAA,MAAM,OAAO,SAAA,CAAU,GAAA,EAAK,MAAM,CAAA,EAAG,SAAS,KAAA,CAAM,IAAA;AAAA,YAClD,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS;AAAA,WACpB;AACA,UAAA,OAAO,IAAA,IAAQ,IAAA,GAAO,IAAA,GAAO,iBAAA,CAAkB,IAAI,CAAA;AAAA,QACrD;AAAA;AACF;AACF,GACF;AAEA,EAAA,MAAM,YAAA,GAAe,CACnB,GAAA,EACA,IAAA,EACA,IACA,IAAA,KACG;AACH,IAAA,IAAI,EAAA,IAAM,MAAM,OAAO,IAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AAC3B,IAAA,IAAI,MAAM,IAAA,KAAS,MAAA,EAAQ,MAAM,IAAI,MAAM,eAAe,CAAA;AAE1D,IAAA,IAAI,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,IAAK,MAAM,OAAO,IAAA;AACtC,IAAA,MAAM,IAAA,GAAO,uBAAA,CAAwB,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,CAAA;AACtD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA,KAAS,MAAA,GAAS,IAAA,GAAO,kBAAA;AAAA,MAC/B,MAAA,EAAQ,IAAA,KAAS,MAAA,GAAS,kBAAA,GAAqB;AAAA,KACjD;AAAA,EACF,CAAA;AACA,EAAA,MAAM,EAAA,GAAK,eAAA;AAAA,IAAgB,CAAC,QAAQ,IAAA,KAClC,aAAA;AAAA,MACE,MAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,mBAAA;AAAA,QACE,kBAAA;AAAA,QACA,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,MAAA,CAAO,EAAA,EAAI,QAAQ,IAAI,CAAA;AAAA,QAC9C,CAAC,GAAA,KACC,YAAA,CAAa,GAAA,EAAK,MAAA,EAAQ,SAAA,CAAU,GAAA,EAAK,MAAM,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,IAAI;AAAA,OACvE;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,KAAA,GAAQ,eAAA;AAAA,IAAgB,CAAC,QAAQ,IAAA,KACrC,gBAAA;AAAA,MACE,MAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA,mBAAA;AAAA,QACE,kBAAA;AAAA,QACA,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,MAAA,CAAO,KAAA,EAAO,QAAQ,IAAI,CAAA;AAAA,QACjD,CAAC,GAAA,KACC,YAAA;AAAA,UACE,GAAA;AAAA,UACA,QAAA;AAAA,UACA,SAAA,CAAU,GAAA,EAAK,MAAM,CAAA,EAAG,MAAA,EAAQ,IAAA;AAAA,UAChC;AAAA;AACF;AACJ;AACF,GACF;AAEA,EAAA,MAAM,SAAA,GAAY,eAAA;AAAA,IAAgB,CAAC,QAAQ,IAAA,KACzC,mBAAA;AAAA,MACE,MAAA;AAAA,MACA,IAAA;AAAA,MACA,mBAAA;AAAA,QACE,kBAAA;AAAA,QACA,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,MAAA,CAAO,KAAA,EAAO,QAAQ,IAAI,CAAA;AAAA,QACjD,CAAC,GAAA,KAAQ;AACP,UAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,EAAK,MAAM,GAAG,SAAA,CAAU,IAAA;AAAA,YAC7C,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS;AAAA,WACpB,EAAG,IAAA;AACH,UAAA,OAAO,IAAA,IAAQ,IAAA,GAAO,IAAA,GAAO,qBAAA,CAAsB,IAAI,CAAA;AAAA,QACzD;AAAA;AACF;AACF,GACF;AAEA,EAAA,MAAM,IAAA,GAAO,eAAA;AAAA,IAAgB,CAAC,KAAK,MAAA,KACjC,sBAAA;AAAA,MACE,GAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,mBAAA;AAAA,QACE,kBAAA;AAAA,QACA,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,MAAA,CAAO,GAAA,EAAK,KAAK,MAAM,CAAA;AAAA,QAC9C,CAAC,GAAA,KAAQ;AACP,UAAA,MAAM,OAAO,GAAA,CAAI,MAAA,CAAO,SAAS,IAAA,CAC9B,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,GAAG,GACzB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,MAAM,CAAA;AACzC,UAAA,OAAO,IAAA,IAAQ,IAAA,GAAO,IAAA,GAAO,qBAAA,CAAsB,IAAI,CAAA;AAAA,QACzD;AAAA;AACF;AACF,GACF;AACA,EAAA,MAAM,IAAA,GAAO,eAAA;AAAA,IAAgB,CAAC,QAAQ,KAAA,KACpC,iBAAA;AAAA,MACE,MAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,mBAAA;AAAA,QACE,kBAAA;AAAA,QACA,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,MAAA,CAAO,OAAA,EAAS,QAAQ,KAAK,CAAA;AAAA,QACpD,CAAC,GAAA,KAAQ;AACP,UAAA,MAAM,OAAO,GAAA,CAAI,MAAA,CAAO,SAAS,OAAA,CAC9B,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,MAAM,GAC5B,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,KAAK,CAAA;AACxC,UAAA,OAAO,IAAA,IAAQ,IAAA,GAAO,IAAA,GAAO,qBAAA,CAAsB,IAAI,CAAA;AAAA,QACzD;AAAA;AACF;AACF,GACF;AAEA,EAAA,MAAM,WAAA,GAAc,CAClB,QAAA,EACA,KAAA,KACG;AACH,IAAA,MAAM,EAAE,MAAA,EAAQ,cAAA,KAAmB,mBAAA,CAAoB,KAAK,EAAE,OAAA,EAAQ;AACtE,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,eACb,eAAA,CAAgB,MAAA,CAAO,IAAK,CAAA,CAC5B,GAAA,CAAI,QAAA,CAAS,OAAA,EAAS,CAAA;AACzB,MAAA,MAAM,SAAS,OAAA,CAAQ,IAAA;AACvB,MAAA,MAAM,IAAA,GAAO,QAAQ,KAAA,CAAM,IAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,QAAQ,KAAA,CAAM,KAAA;AAE3B,MAAA,OAAO,aAAA;AAAA,QACL,MAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA;AAAA,QACA,mBAAA;AAAA,UACE,kBAAA;AAAA,UACA,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,MAAA,CAAO,EAAA,EAAI,QAAQ,IAAI,CAAA;AAAA,UAC9C,CAAC,GAAA,KACC,YAAA;AAAA,YACE,GAAA;AAAA,YACA,MAAA;AAAA,YACA,SAAA,CAAU,GAAA,EAAK,MAAM,CAAA,EAAG,KAAA,EAAO,IAAA;AAAA,YAC/B;AAAA;AACF,SACJ;AAAA,QACA;AAAA,QACA,IAAI,CAAA;AAAA,IACR,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,gBAAgB,CACd,QAAA,EACA,KAAA,KAEA,KAAA,GACI,YAAY,QAAA,EAAU,KAAK,CAAA,GAC3B,kBAAA,CAAmB,KAAK,CAAC,CAAA,KAAM,WAAA,CAAY,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,IAC7D,EAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;AA2CO,SAAS,aACd,QAAA,EACA,EAAE,aAAa,WAAA,EAAY,GAAyB,EAAC,EACrC;AAChB,EAAA,MAAM,SAAA,GAA6BA,eAAgB,QAAQ,CAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,oBAAoB,SAAA,EAAW;AAAA,IAC5C,WAAA,EAAa,cACT,CAAC,QAAA,KAAqB,KAAK,WAAA,CAAY,QAAQ,CAAC,CAAA,GAChD,MAAA;AAAA,IACJ;AAAA,GACD,CAAA;AACD,EAAA,MAAM,EAAE,kBAAiB,GAAI,SAAA;AAE7B,EAAA,MAAM,EAAE,QAAA,EAAU,GAAG,UAAA,EAAW,GAAI,OAAO,UAAA,EAAW;AACtD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,WAAW,CAAA;AACrD,EAAA,MAAM,SAAA,GAAwB;AAAA,IAC5B,GAAG,UAAA;AAAA,IACH,QAAA,EAAU,KAAA,CAAM,gBAAgB,CAAA,CAAE,IAAA;AAAA,MAChC,GAAA,CAAI,CAAC,EAAE,WAAA,OAAkB,WAAW,CAAA;AAAA,MACpC,UAAA,CAAW,MAAM,QAAQ,CAAA;AAAA,MACzB,YAAY,CAAC;AAAA,KACf;AAAA,IACA,QAAA,EAAU,WAAA,CAAY,UAAA,CAAW,QAAA,EAAU,QAAQ,QAAQ,CAAA;AAAA,IAC3D,KAAA,EAAO,WAAA,CAAY,UAAA,CAAW,KAAA,EAAO,QAAQ,KAAK,CAAA;AAAA,IAClD,KAAA,EAAO,WAAA,CAAY,UAAA,CAAW,KAAA,EAAO,QAAQ,KAAK,CAAA;AAAA,IAClD,OAAA,EAAS,WAAA,CAAY,UAAA,CAAW,OAAA,EAAS,QAAQ,OAAO,CAAA;AAAA,IACxD,SAAA,EAAW,WAAA,CAAY,UAAA,CAAW,SAAA,EAAW,QAAQ,SAAS,CAAA;AAAA,IAC9D,eAAA,EAAiB,WAAA;AAAA,MACf,UAAA,CAAW,eAAA;AAAA,MACX,OAAA,CAAQ;AAAA,KACV;AAAA,IACA,kBAAA,EAAoB,WAAA;AAAA,MAClB,UAAA,CAAW,kBAAA;AAAA,MACX,OAAA,CAAQ;AAAA;AACV,GACF;AAEA,EAAA,MAAM,WAGgB,SAAA,CAAU,OAAA;AAEhC,EAAA,IAAI,SAAA;AACJ,EAAA,MAAM,SAAA,uBAAgB,OAAA,EAAwC;AAE9D,EAAA,MAAM,EAAE,cAAa,GAAI,MAAA;AAEzB,EAAA,MAAM,YAAA,GAAe,CAAC,EAAA,KACpB,SAAA,CAAU,kBAAA,CAAmB,EAAE,CAAA,CAAE,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,WAAW,CAAC,CAAA;AAErE,EAAA,MAAM,MAAA,GAAyB;AAAA,IAC7B,gBAAA;AAAA,IAEA,YAAA;AAAA,IACA,WAAA,EAAa,CAAC,OAAA,EAAoB,MAAA,KAChC,yBAAyB,YAAA,CAAa,OAAO,GAAG,MAAM,CAAA;AAAA,IAExD,SAAS,SAAA,CAAU,UAAA;AAAA,IACnB,WAAW,CAAC,KAAA,KAAqB,SAAA,CAAU,SAAA,CAAU,OAAO,IAAI,CAAA;AAAA,IAEhE,iBAAiB,SAAA,CAAU,UAAA;AAAA,IAC3B,iBAAA,EAAmB,MAAM,cAAA,CAAe,SAAA,CAAU,UAAU,CAAA;AAAA,IAE5D,aAAa,SAAA,CAAU,WAAA;AAAA,IACvB,aAAA,EAAe,MAAM,cAAA,CAAe,SAAA,CAAU,WAAW,CAAA;AAAA,IAEzD,gBAAgB,SAAA,CAAU,KAAA;AAAA,IAC1B,cAAc,CAAC,IAAA,KAAiB,eAAe,SAAA,CAAU,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,IAEpE,cAAA,EAAgB,CAAC,IAAA,KACf,cAAA,CAAe,UAAU,OAAA,CAAQ,IAAA,IAAQ,IAAI,CAAC,CAAA;AAAA,IAEhD,QAAQ,CAAA,GAAI,IAAA,KAAS,OAAO,SAAA,EAAW,YAAA,EAAc,GAAG,IAAI,CAAA;AAAA,IAC5D,gBAAgB,CAAC,EAAA,KAAO,OAAA,CAAQ,SAAA,EAAW,cAAc,EAAE,CAAA;AAAA,IAE3D,WAAA,EAAa,CAA4B,eAAA,KAAuB;AAC9D,MAAA,IAAI,UAAU,GAAA,CAAI,eAAe,GAAG,OAAO,SAAA,CAAU,IAAI,eAAe,CAAA;AACxE,MAAA,MAAM,kBAAA,GAAqB,wBAAA;AAAA,QACzB,eAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,MAAM,MAAA,CAAO,MAAA;AAAA,QACjB,SAAA,CAAoB,kBAAA,EAAoB,SAAA,EAAW,YAAY,CAAA;AAAA,QAC/D,EAAE,kBAAA;AAAmB,OACvB;AACA,MAAA,SAAA,CAAU,GAAA,CAAI,iBAAiB,GAAG,CAAA;AAClC,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IAEA,cAAc,MAAS;AACrB,MAAA,IAAI,WAAW,OAAO,SAAA;AACtB,MAAA,MAAM,YAAA,GAAe,mBAAmB,SAAS,CAAA;AACjD,MAAA,SAAA,GAAY,MAAA,CAAO,MAAA;AAAA,QACjB,SAAA,CAAmB,YAAA,EAAc,SAAA,EAAW,YAAY,CAAA;AAAA,QACxD,EAAE,YAAA;AAAa,OACjB;AACA,MAAA,OAAO,SAAA;AAAA,IACT,CAAA;AAAA,IAEA,QAAA,EAAU,CAAC,GAAA,EAAK,EAAE,IAAI,MAAA,EAAO,GAAI,EAAC,KAChC,wBAAA;AAAA,MACE,SAAA,CAAU,QAAA,CAAS,EAAA,IAAM,IAAA,EAAM,SAAS,MAAM;AAC5C,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,SAAS,IAAI,CAAC,CAAA;AACpC,QAAA,OAAO,GAAA,GAAM,KAAK,GAAG,CAAA,CAAA,GAAK,OAAO,QAAA,CAAS,GAAG,EAAE,KAAA,EAAM;AAAA,MACvD,CAAC,CAAA;AAAA,MACD;AAAA,KACF;AAAA,IAEF,SAAS,MAAM;AACb,MAAA,SAAA,CAAU,QAAA,EAAS;AACnB,MAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,IACjB,CAAA;AAAA,IAEA;AAAA,GACF;AAEC,EAAC,OAAe,sBAAA,GAAyB,SAAA;AAE1C,EAAA,OAAO,MAAA;AACT;;;;"}
@@ -1,4 +1,4 @@
1
- import { Struct, Option, compact, Bytes } from '@polkadot-api/substrate-bindings';
1
+ import { Struct, compact, Option, Bytes } from '@polkadot-api/substrate-bindings';
2
2
 
3
3
  const [ChargeAssetTxPaymentEnc] = Struct({
4
4
  tip: compact,
@@ -19,7 +19,7 @@ const both = (value2, additionalSigned2) => ({
19
19
  });
20
20
  const getSignExtensionsCreator = (genesis, lookupFn, dynamicBuilder) => {
21
21
  const signedExtensionsEncoders = {};
22
- lookupFn.metadata.extrinsic.signedExtensions.forEach(
22
+ lookupFn.metadata.extrinsic.signedExtensions[0].forEach(
23
23
  ({ identifier, type, additionalSigned: additionalSigned2 }) => {
24
24
  signedExtensionsEncoders[identifier] = [type, additionalSigned2].map(
25
25
  (x) => dynamicBuilder.buildDefinition(x)[0]
@@ -1 +1 @@
1
- {"version":3,"file":"sign-extensions.mjs","sources":["../../../../src/tx/signed-extensions/sign-extensions.ts"],"sourcesContent":["import {\n getDynamicBuilder,\n MetadataLookup,\n} from \"@polkadot-api/metadata-builders\"\nimport { Encoder } from \"@polkadot-api/substrate-bindings\"\nimport { OfflineTxExtensions } from \"../types\"\nimport { fromHex, mapObject } from \"@polkadot-api/utils\"\nimport { getSystemVersionStruct } from \"./system-version\"\nimport { mortal } from \"./mortal-enc\"\nimport { ChargeAssetTxPaymentEnc } from \"./charge-asset-tx-enc\"\n\nconst empty = new Uint8Array()\nconst zero = Uint8Array.from([0])\ntype DynamicBuilder = ReturnType<typeof getDynamicBuilder>\n\nconst value = (value: Uint8Array) => ({\n value,\n additionalSigned: empty,\n})\nconst additionalSigned = (additionalSigned: Uint8Array) => ({\n value: empty,\n additionalSigned,\n})\nconst both = (value: Uint8Array, additionalSigned: Uint8Array) => ({\n value,\n additionalSigned,\n})\n\nexport const getSignExtensionsCreator = (\n genesis: Uint8Array,\n lookupFn: MetadataLookup,\n dynamicBuilder: DynamicBuilder,\n) => {\n const signedExtensionsEncoders: Record<string, [Encoder<any>, Encoder<any>]> =\n {}\n lookupFn.metadata.extrinsic.signedExtensions.forEach(\n ({ identifier, type, additionalSigned }) => {\n signedExtensionsEncoders[identifier] = [type, additionalSigned].map(\n (x) => dynamicBuilder.buildDefinition(x)[0],\n ) as [Encoder<any>, Encoder<any>]\n },\n )\n\n return <Asset>({\n mortality,\n tip = 0n,\n nonce,\n customSignedExtensions = {},\n ...rest\n }: OfflineTxExtensions<Asset>): Record<\n string,\n { identifier: string; value: Uint8Array; additionalSigned: Uint8Array }\n > => {\n const invalidKeys: string[] = []\n const systemVersion = getSystemVersionStruct(lookupFn, dynamicBuilder)\n const getFromCustomEntry = (key: string) => {\n const [valueEnc, additionalEnc] = signedExtensionsEncoders[key]\n const customEntry = customSignedExtensions[key] as any\n try {\n return mapObject(\n {\n value: valueEnc,\n additionalSigned: additionalEnc,\n },\n (encoder, key) => {\n const input = customEntry?.[key]\n // if the encoder is _void, then the input value is ignored, so no harm in passing `undefined`\n // only an `Option` encoder will accept `undefined` as an input without crashing\n return input instanceof Uint8Array ? input : encoder(input)\n },\n )\n } catch {\n // this means that a non optional custom signed-extension has not received its value\n if (customEntry) throw new Error(`Wrong input received for ${key}`)\n invalidKeys.push(key)\n return null\n }\n }\n\n const result = mapObject(\n signedExtensionsEncoders,\n ([valueEnc, additionalEnc], key) => {\n if (customSignedExtensions[key]) return getFromCustomEntry(key)\n\n switch (key) {\n case \"CheckNonce\":\n return value(valueEnc(nonce))\n\n case \"CheckMortality\":\n return mortality.mortal\n ? both(\n mortal({\n period: mortality.period,\n startAtBlock: mortality.startAtBlock.height,\n }),\n fromHex(mortality.startAtBlock.hash),\n )\n : both(zero, genesis)\n\n case \"ChargeTransactionPayment\":\n return value(valueEnc(tip))\n\n case \"ChargeAssetTxPayment\":\n return value(\n ChargeAssetTxPaymentEnc({\n tip,\n asset: (rest as any).asset,\n }),\n )\n\n case \"CheckGenesis\":\n return additionalSigned(genesis)\n\n case \"CheckMetadataHash\":\n return both(zero, zero)\n\n case \"CheckSpecVersion\":\n return additionalSigned(\n additionalEnc(systemVersion[\"spec_version\"]),\n )\n\n case \"CheckTxVersion\":\n return additionalSigned(\n additionalEnc(systemVersion[\"transaction_version\"]),\n )\n\n default:\n return getFromCustomEntry(key)\n }\n },\n )\n\n invalidKeys.forEach((key) => {\n delete result[key]\n })\n return mapObject(result, (x, identifier) => ({ ...x, identifier })) as any\n }\n}\n"],"names":["value","additionalSigned","key"],"mappings":"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"}
1
+ {"version":3,"file":"sign-extensions.mjs","sources":["../../../../src/tx/signed-extensions/sign-extensions.ts"],"sourcesContent":["import {\n getDynamicBuilder,\n MetadataLookup,\n} from \"@polkadot-api/metadata-builders\"\nimport { Encoder } from \"@polkadot-api/substrate-bindings\"\nimport { OfflineTxExtensions } from \"../types\"\nimport { fromHex, mapObject } from \"@polkadot-api/utils\"\nimport { getSystemVersionStruct } from \"./system-version\"\nimport { mortal } from \"./mortal-enc\"\nimport { ChargeAssetTxPaymentEnc } from \"./charge-asset-tx-enc\"\n\nconst empty = new Uint8Array()\nconst zero = Uint8Array.from([0])\ntype DynamicBuilder = ReturnType<typeof getDynamicBuilder>\n\nconst value = (value: Uint8Array) => ({\n value,\n additionalSigned: empty,\n})\nconst additionalSigned = (additionalSigned: Uint8Array) => ({\n value: empty,\n additionalSigned,\n})\nconst both = (value: Uint8Array, additionalSigned: Uint8Array) => ({\n value,\n additionalSigned,\n})\n\nexport const getSignExtensionsCreator = (\n genesis: Uint8Array,\n lookupFn: MetadataLookup,\n dynamicBuilder: DynamicBuilder,\n) => {\n const signedExtensionsEncoders: Record<string, [Encoder<any>, Encoder<any>]> =\n {}\n // TODO: we need to adapt to multiple extension versions at some point\n lookupFn.metadata.extrinsic.signedExtensions[0].forEach(\n ({ identifier, type, additionalSigned }) => {\n signedExtensionsEncoders[identifier] = [type, additionalSigned].map(\n (x) => dynamicBuilder.buildDefinition(x)[0],\n ) as [Encoder<any>, Encoder<any>]\n },\n )\n\n return <Asset>({\n mortality,\n tip = 0n,\n nonce,\n customSignedExtensions = {},\n ...rest\n }: OfflineTxExtensions<Asset>): Record<\n string,\n { identifier: string; value: Uint8Array; additionalSigned: Uint8Array }\n > => {\n const invalidKeys: string[] = []\n const systemVersion = getSystemVersionStruct(lookupFn, dynamicBuilder)\n const getFromCustomEntry = (key: string) => {\n const [valueEnc, additionalEnc] = signedExtensionsEncoders[key]\n const customEntry = customSignedExtensions[key] as any\n try {\n return mapObject(\n {\n value: valueEnc,\n additionalSigned: additionalEnc,\n },\n (encoder, key) => {\n const input = customEntry?.[key]\n // if the encoder is _void, then the input value is ignored, so no harm in passing `undefined`\n // only an `Option` encoder will accept `undefined` as an input without crashing\n return input instanceof Uint8Array ? input : encoder(input)\n },\n )\n } catch {\n // this means that a non optional custom signed-extension has not received its value\n if (customEntry) throw new Error(`Wrong input received for ${key}`)\n invalidKeys.push(key)\n return null\n }\n }\n\n const result = mapObject(\n signedExtensionsEncoders,\n ([valueEnc, additionalEnc], key) => {\n if (customSignedExtensions[key]) return getFromCustomEntry(key)\n\n switch (key) {\n case \"CheckNonce\":\n return value(valueEnc(nonce))\n\n case \"CheckMortality\":\n return mortality.mortal\n ? both(\n mortal({\n period: mortality.period,\n startAtBlock: mortality.startAtBlock.height,\n }),\n fromHex(mortality.startAtBlock.hash),\n )\n : both(zero, genesis)\n\n case \"ChargeTransactionPayment\":\n return value(valueEnc(tip))\n\n case \"ChargeAssetTxPayment\":\n return value(\n ChargeAssetTxPaymentEnc({\n tip,\n asset: (rest as any).asset,\n }),\n )\n\n case \"CheckGenesis\":\n return additionalSigned(genesis)\n\n case \"CheckMetadataHash\":\n return both(zero, zero)\n\n case \"CheckSpecVersion\":\n return additionalSigned(\n additionalEnc(systemVersion[\"spec_version\"]),\n )\n\n case \"CheckTxVersion\":\n return additionalSigned(\n additionalEnc(systemVersion[\"transaction_version\"]),\n )\n\n default:\n return getFromCustomEntry(key)\n }\n },\n )\n\n invalidKeys.forEach((key) => {\n delete result[key]\n })\n return mapObject(result, (x, identifier) => ({ ...x, identifier })) as any\n }\n}\n"],"names":["value","additionalSigned","key"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Binary } from '@polkadot-api/substrate-bindings';
2
- import { lastValueFrom, mergeMap, defer, map, merge, race, takeWhile, ignoreElements, endWith, filter, take, Observable, concat, of, EMPTY, distinctUntilChanged } from 'rxjs';
2
+ import { mergeMap, defer, map, merge, race, takeWhile, ignoreElements, endWith, filter, take, Observable, concat, EMPTY, of, lastValueFrom, distinctUntilChanged } from 'rxjs';
3
3
  import '@polkadot-api/observable-client';
4
4
  import '../utils/shareLatest.mjs';
5
5
  import { toHex, fromHex } from '@polkadot-api/utils';
@@ -1,7 +1,7 @@
1
1
  import { getPolkadotSigner } from '@polkadot-api/signer';
2
- import { AccountId, Struct, u128, Variant, _void, compactBn, Enum, u32, Binary, compact } from '@polkadot-api/substrate-bindings';
3
- import { toHex, fromHex, mergeUint8 } from '@polkadot-api/utils';
4
- import { firstValueFrom, mergeMap, map, take, throwError, combineLatest } from 'rxjs';
2
+ import { AccountId, Struct, u128, Variant, _void, compactBn, Enum, u32, compact, Binary } from '@polkadot-api/substrate-bindings';
3
+ import { fromHex, toHex, mergeUint8 } from '@polkadot-api/utils';
4
+ import { firstValueFrom, mergeMap, map, combineLatest, take, throwError } from 'rxjs';
5
5
  import { getCompatibilityApi } from '../compatibility.mjs';
6
6
  import { createTx } from './create-tx.mjs';
7
7
  import { submit, submit$ } from './submit-fns.mjs';
@@ -1,5 +1,5 @@
1
1
  import { BehaviorSubject, Subject } from 'rxjs';
2
- import { tap, switchAll } from 'rxjs/operators';
2
+ import { switchAll, tap } from 'rxjs/operators';
3
3
 
4
4
  const selfDependent = () => {
5
5
  const activeSubject = new BehaviorSubject(
@@ -1,5 +1,5 @@
1
1
  import { isBestOrFinalizedBlock, BlockNotPinnedError } from '@polkadot-api/observable-client';
2
- import { distinctUntilChanged, take, map, withLatestFrom, merge, mergeMap, combineLatest, delay, filter, startWith, pairwise, EMPTY, of, takeUntil, catchError, throwError } from 'rxjs';
2
+ import { distinctUntilChanged, take, map, withLatestFrom, merge, mergeMap, combineLatest, filter, startWith, pairwise, EMPTY, of, takeUntil, catchError, throwError } from 'rxjs';
3
3
  import './utils/shareLatest.mjs';
4
4
  import '@polkadot-api/utils';
5
5
  import { lossLessExhaustMap } from './utils/lossLessExhaustMap.mjs';
@@ -87,6 +87,7 @@ const createWatchEntries = (blocks$, storage, withRuntime) => {
87
87
  prev: prev && prev.block.hash,
88
88
  rootHash,
89
89
  block,
90
+ patcher,
90
91
  ...getDiff(
91
92
  prev?.entries ?? [],
92
93
  entries,
@@ -155,31 +156,23 @@ const createWatchEntries = (blocks$, storage, withRuntime) => {
155
156
  );
156
157
  const getBestOrFinalized = (isFinalized) => (pallet, entry, storageKey) => {
157
158
  const memoryBlocks$ = getMemoryBlocks$(pallet, entry, storageKey);
158
- const getPatcher = getPatcherFromRuntime(pallet, entry);
159
159
  const prop = isFinalized ? "finalized" : "best";
160
160
  return combineLatest([
161
- memoryBlocks$.pipe(delay(0)),
161
+ memoryBlocks$,
162
162
  blocks$.pipe(distinctUntilChanged((a, b) => a[prop] === b[prop]))
163
163
  ]).pipe(
164
- map(
165
- ([state2, blocks]) => findPrevious(blocks[prop], state2.blocks, blocks, true)
166
- ),
164
+ map(([state2, blocks]) => {
165
+ const update = findPrevious(blocks[prop], state2.blocks, blocks, true);
166
+ return update && { update, state: state2 };
167
+ }),
167
168
  filter(Boolean),
168
- distinctUntilChanged(),
169
+ distinctUntilChanged((a, b) => a.update === b.update),
169
170
  startWith(null),
170
171
  pairwise(),
171
- withLatestFrom(memoryBlocks$),
172
- withRuntime(([[, _latest]]) => _latest.block.hash),
173
- map(
174
- ([[[prevUpdate, latest], memoryBlocks], runtimeCtx]) => [
175
- prevUpdate,
176
- latest,
177
- memoryBlocks,
178
- getPatcher(runtimeCtx)
179
- ]
180
- ),
181
- mergeMap(([prevUpdate, latest, memoryBlocks, patcher]) => {
182
- if (!prevUpdate) return [latest];
172
+ mergeMap(([prev, next]) => {
173
+ if (!prev) return [next.update];
174
+ const { update: prevUpdate } = prev;
175
+ const { state: memoryBlocks, update: latest } = next;
183
176
  let ancestor = latest;
184
177
  const updates = [];
185
178
  while (ancestor && ancestor.block.number > prevUpdate.block.number) {
@@ -203,7 +196,7 @@ const createWatchEntries = (blocks$, storage, withRuntime) => {
203
196
  ...prevUpdate.rootHash === latest.rootHash ? {
204
197
  entries: prevUpdate.entries,
205
198
  deltas: null
206
- } : getDiff(prevUpdate.entries, latest.entries, patcher)
199
+ } : getDiff(prevUpdate.entries, latest.entries, latest.patcher)
207
200
  }
208
201
  ];
209
202
  })
@@ -1 +1 @@
1
- {"version":3,"file":"watch-entries.mjs","sources":["../../src/watch-entries.ts"],"sourcesContent":["import { HexString } from \"@polkadot-api/substrate-bindings\"\nimport type {\n PinnedBlocks,\n BlockInfo,\n ChainHead$,\n RuntimeContext,\n} from \"@polkadot-api/observable-client\"\nimport {\n BlockNotPinnedError,\n isBestOrFinalizedBlock,\n} from \"@polkadot-api/observable-client\"\nimport {\n catchError,\n combineLatest,\n delay,\n distinctUntilChanged,\n EMPTY,\n filter,\n map,\n merge,\n mergeMap,\n Observable,\n of,\n pairwise,\n startWith,\n take,\n takeUntil,\n throwError,\n withLatestFrom,\n} from \"rxjs\"\nimport { selfDependent, lossLessExhaustMap } from \"@/utils\"\nimport { state } from \"@rx-state/core\"\n\ninterface StorageEntry {\n key: HexString\n value: HexString\n dec: {\n args: Array<any>\n value: any\n }\n}\n\ntype Deltas = {\n upserted: Array<StorageEntry>\n deleted: Array<StorageEntry>\n}\n\ninterface MemoryBlock {\n prev: HexString | null\n block: BlockInfo\n rootHash: string\n entries: Array<StorageEntry>\n deltas: Deltas | null\n}\n\ntype MemoryBlocks = {\n blocks: Record<HexString, MemoryBlock>\n finalized: HexString\n}\n\nconst getDiff = (\n _prev: Array<StorageEntry>,\n _current: Array<StorageEntry>,\n patch: (input: StorageEntry) => StorageEntry,\n): Pick<MemoryBlock, \"entries\" | \"deltas\"> => {\n const current = new Map(_current.map((x) => [x.key, x]))\n const prev = new Map(_prev.map((x) => [x.key, x]))\n\n const upserted: Map<string, StorageEntry> = new Map()\n const deleted: Array<StorageEntry> = []\n\n _current.forEach((value) => {\n const { key } = value\n const prevVal = prev.get(key)\n if (!prevVal || prevVal.value !== value.value)\n upserted.set(key, patch(value))\n })\n\n _prev.forEach((x) => {\n if (!current.has(x.key)) deleted.push(x)\n })\n\n return {\n deltas: {\n deleted,\n upserted: [...upserted.values()],\n },\n entries: _current.map(({ key }) => upserted.get(key) ?? prev.get(key)!),\n }\n}\n\nconst findPrevious = (\n start: HexString,\n state: MemoryBlocks[\"blocks\"],\n pinned: PinnedBlocks,\n includeStart = false,\n) => {\n try {\n let target = includeStart ? start : pinned.blocks.get(start)!.parent\n while (target && !state[target]) target = pinned.blocks.get(target)!.parent!\n\n if (!target) return null\n return state[target]\n } catch {\n return null\n }\n}\n\nconst getPatcherFromRuntime =\n (pallet: string, entry: string) => (runtime: RuntimeContext) => {\n const { keys, value } = runtime.dynamicBuilder.buildStorage(pallet, entry)\n return (x: StorageEntry) => {\n x.dec = {\n value: value.dec(x.value),\n args: keys.dec(x.key),\n }\n return x\n }\n }\n\nexport const createWatchEntries = (\n blocks$: Observable<PinnedBlocks>,\n storage: ChainHead$[\"storage$\"],\n withRuntime: ChainHead$[\"withRuntime\"],\n) => {\n const getMemoryBlocks$ = state(\n (pallet: string, entry: string, storageKey: string) => {\n const getPatcher = getPatcherFromRuntime(pallet, entry)\n const getNextMemoryBlock$ = (\n prev: MemoryBlock | null,\n block: BlockInfo,\n ): Observable<MemoryBlock> => {\n const isNotCanonical$ = isBestOrFinalizedBlock(\n blocks$,\n block.hash,\n ).pipe(\n filter((x) => !x),\n take(1),\n )\n\n return storage(\n block.hash,\n \"closestDescendantMerkleValue\",\n () => storageKey,\n ).pipe(\n mergeMap((rootHash) => {\n if (rootHash === prev?.rootHash)\n return of({\n ...prev,\n block,\n deltas: null,\n prev: prev.block.hash,\n })\n\n return storage(\n block.hash,\n \"descendantsValues\",\n () => storageKey,\n ).pipe(\n withRuntime(() => block.hash),\n map(\n ([entries, runtimeCtx]) =>\n [entries, getPatcher(runtimeCtx)] as const,\n ),\n map(\n ([entries, patcher]): MemoryBlock => ({\n prev: prev && prev.block.hash,\n rootHash: rootHash!,\n block,\n ...getDiff(\n prev?.entries ?? [],\n entries as StorageEntry[],\n patcher,\n ),\n }),\n ),\n )\n }),\n takeUntil(isNotCanonical$),\n catchError((e) =>\n e instanceof BlockNotPinnedError ? EMPTY : throwError(() => e),\n ),\n )\n }\n\n const initial$ = blocks$.pipe(\n distinctUntilChanged((a, b) => a.finalized === b.finalized),\n lossLessExhaustMap(({ blocks, finalized }) =>\n getNextMemoryBlock$(null, blocks.get(finalized)!),\n ),\n take(1),\n map(\n (x): MemoryBlocks => ({\n blocks: { [x.block.hash]: x },\n finalized: x.block.hash,\n }),\n ),\n )\n\n const [_memoryBlocks$, connectMemoryBlocks] =\n selfDependent<MemoryBlocks>()\n const updates$ = blocks$.pipe(\n distinctUntilChanged((a, b) => a.best === b.best),\n withLatestFrom(_memoryBlocks$),\n lossLessExhaustMap(([pinned, memoryBlocks]) => {\n const { best } = pinned\n const { blocks } = memoryBlocks\n let target = !blocks[best] ? best : null\n if (!target) return EMPTY\n\n const previous = findPrevious(target, blocks, pinned)\n if (previous)\n return getNextMemoryBlock$(\n previous,\n pinned.blocks.get(target)!,\n ).pipe(\n map((x) => {\n blocks[target!] = x\n return memoryBlocks\n }),\n )\n\n // This means that there has been a stop event that the pinned-blocks\n // couldn't recover from. Therefore, we must \"start over\"\n target = pinned.finalized\n return getNextMemoryBlock$(\n blocks[memoryBlocks.finalized],\n pinned.blocks.get(target)!,\n ).pipe(\n map((x) => {\n x.prev = null\n return {\n blocks: { [target]: x },\n finalized: target,\n }\n }),\n )\n }),\n )\n\n return merge(initial$, updates$).pipe(connectMemoryBlocks())\n },\n )\n\n const getBestOrFinalized =\n (isFinalized: boolean) =>\n (pallet: string, entry: string, storageKey: string) => {\n const memoryBlocks$ = getMemoryBlocks$(pallet, entry, storageKey)\n const getPatcher = getPatcherFromRuntime(pallet, entry)\n\n const prop = isFinalized ? \"finalized\" : \"best\"\n\n return combineLatest([\n memoryBlocks$.pipe(delay(0)),\n blocks$.pipe(distinctUntilChanged((a, b) => a[prop] === b[prop])),\n ]).pipe(\n map(([state, blocks]) =>\n findPrevious(blocks[prop], state.blocks, blocks, true),\n ),\n filter(Boolean),\n distinctUntilChanged(),\n startWith(null),\n pairwise(),\n withLatestFrom(memoryBlocks$),\n withRuntime(([[, _latest]]) => _latest!.block.hash),\n map(\n ([[[prevUpdate, latest], memoryBlocks], runtimeCtx]) =>\n [\n prevUpdate,\n latest!,\n memoryBlocks,\n getPatcher(runtimeCtx),\n ] as const,\n ),\n mergeMap(([prevUpdate, latest, memoryBlocks, patcher]) => {\n if (!prevUpdate) return [latest]\n\n let ancestor: MemoryBlock | null = latest\n const updates: Array<MemoryBlock> = []\n while (ancestor && ancestor.block.number > prevUpdate.block.number) {\n updates.unshift(ancestor)\n ancestor = ancestor.prev ? memoryBlocks.blocks[ancestor.prev] : null\n }\n\n if (isFinalized) {\n memoryBlocks.finalized = latest.block.hash\n if (updates.length) {\n const { blocks } = memoryBlocks\n Object.keys(blocks).forEach((key) => {\n if (blocks[key].block.number < updates[0].block.number)\n delete blocks[key]\n })\n }\n }\n\n if (prevUpdate === ancestor) return updates\n\n // It's a re-org\n return [\n {\n ...latest,\n ...(prevUpdate.rootHash === latest.rootHash\n ? {\n entries: prevUpdate.entries,\n deltas: null,\n }\n : getDiff(prevUpdate.entries, latest.entries, patcher)),\n },\n ]\n }),\n )\n }\n\n const getFinalized$ = state(getBestOrFinalized(true))\n const getBest$ = state(getBestOrFinalized(false))\n\n return (pallet: string, entry: string, args: Array<any>, atBest: boolean) => {\n const fn = atBest ? getBest$ : getFinalized$\n const storageKey$ = blocks$.pipe(\n take(1),\n mergeMap(\n (b) =>\n b.runtimes[b.blocks.get(b[atBest ? \"best\" : \"finalized\"])!.runtime]\n .runtime,\n ),\n map((runtime) =>\n runtime.dynamicBuilder.buildStorage(pallet, entry).keys.enc(...args),\n ),\n )\n return storageKey$.pipe(\n take(1),\n mergeMap((storageKey) => fn(pallet, entry, storageKey)),\n map(({ block: { hash, number, parent }, deltas, entries }, idx) => {\n const actualDeltas =\n idx > 0 ? deltas : { deleted: [], upserted: entries }\n\n return {\n block: { hash, number, parent },\n entries: entries.map(toDec),\n deltas: actualDeltas && {\n deleted: actualDeltas.deleted.map(toDec),\n upserted: actualDeltas.upserted.map(toDec),\n },\n }\n }),\n )\n }\n}\n\nconst toDec = <T>(x: { dec: T }): T => x.dec\n"],"names":["state"],"mappings":"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"}
1
+ {"version":3,"file":"watch-entries.mjs","sources":["../../src/watch-entries.ts"],"sourcesContent":["import { HexString } from \"@polkadot-api/substrate-bindings\"\nimport type {\n PinnedBlocks,\n BlockInfo,\n ChainHead$,\n RuntimeContext,\n} from \"@polkadot-api/observable-client\"\nimport {\n BlockNotPinnedError,\n isBestOrFinalizedBlock,\n} from \"@polkadot-api/observable-client\"\nimport {\n catchError,\n combineLatest,\n distinctUntilChanged,\n EMPTY,\n filter,\n map,\n merge,\n mergeMap,\n Observable,\n of,\n pairwise,\n startWith,\n take,\n takeUntil,\n throwError,\n withLatestFrom,\n} from \"rxjs\"\nimport { selfDependent, lossLessExhaustMap } from \"@/utils\"\nimport { state } from \"@rx-state/core\"\n\ninterface StorageEntry {\n key: HexString\n value: HexString\n dec: {\n args: Array<any>\n value: any\n }\n}\n\ntype Deltas = {\n upserted: Array<StorageEntry>\n deleted: Array<StorageEntry>\n}\n\ninterface MemoryBlock {\n prev: HexString | null\n block: BlockInfo\n rootHash: string\n entries: Array<StorageEntry>\n deltas: Deltas | null\n patcher: (input: StorageEntry) => StorageEntry\n}\n\ntype MemoryBlocks = {\n blocks: Record<HexString, MemoryBlock>\n finalized: HexString\n}\n\nconst getDiff = (\n _prev: Array<StorageEntry>,\n _current: Array<StorageEntry>,\n patch: (input: StorageEntry) => StorageEntry,\n): Pick<MemoryBlock, \"entries\" | \"deltas\"> => {\n const current = new Map(_current.map((x) => [x.key, x]))\n const prev = new Map(_prev.map((x) => [x.key, x]))\n\n const upserted: Map<string, StorageEntry> = new Map()\n const deleted: Array<StorageEntry> = []\n\n _current.forEach((value) => {\n const { key } = value\n const prevVal = prev.get(key)\n if (!prevVal || prevVal.value !== value.value)\n upserted.set(key, patch(value))\n })\n\n _prev.forEach((x) => {\n if (!current.has(x.key)) deleted.push(x)\n })\n\n return {\n deltas: {\n deleted,\n upserted: [...upserted.values()],\n },\n entries: _current.map(({ key }) => upserted.get(key) ?? prev.get(key)!),\n }\n}\n\nconst findPrevious = (\n start: HexString,\n state: MemoryBlocks[\"blocks\"],\n pinned: PinnedBlocks,\n includeStart = false,\n) => {\n try {\n let target = includeStart ? start : pinned.blocks.get(start)!.parent\n while (target && !state[target]) target = pinned.blocks.get(target)!.parent!\n\n if (!target) return null\n return state[target]\n } catch {\n return null\n }\n}\n\nconst getPatcherFromRuntime =\n (pallet: string, entry: string) => (runtime: RuntimeContext) => {\n const { keys, value } = runtime.dynamicBuilder.buildStorage(pallet, entry)\n return (x: StorageEntry) => {\n x.dec = {\n value: value.dec(x.value),\n args: keys.dec(x.key),\n }\n return x\n }\n }\n\nexport const createWatchEntries = (\n blocks$: Observable<PinnedBlocks>,\n storage: ChainHead$[\"storage$\"],\n withRuntime: ChainHead$[\"withRuntime\"],\n) => {\n const getMemoryBlocks$ = state(\n (pallet: string, entry: string, storageKey: string) => {\n const getPatcher = getPatcherFromRuntime(pallet, entry)\n const getNextMemoryBlock$ = (\n prev: MemoryBlock | null,\n block: BlockInfo,\n ): Observable<MemoryBlock> => {\n const isNotCanonical$ = isBestOrFinalizedBlock(\n blocks$,\n block.hash,\n ).pipe(\n filter((x) => !x),\n take(1),\n )\n\n return storage(\n block.hash,\n \"closestDescendantMerkleValue\",\n () => storageKey,\n ).pipe(\n mergeMap((rootHash) => {\n if (rootHash === prev?.rootHash)\n return of({\n ...prev,\n block,\n deltas: null,\n prev: prev.block.hash,\n })\n\n return storage(\n block.hash,\n \"descendantsValues\",\n () => storageKey,\n ).pipe(\n withRuntime(() => block.hash),\n map(\n ([entries, runtimeCtx]) =>\n [entries, getPatcher(runtimeCtx)] as const,\n ),\n map(\n ([entries, patcher]): MemoryBlock => ({\n prev: prev && prev.block.hash,\n rootHash: rootHash!,\n block,\n patcher,\n ...getDiff(\n prev?.entries ?? [],\n entries as StorageEntry[],\n patcher,\n ),\n }),\n ),\n )\n }),\n takeUntil(isNotCanonical$),\n catchError((e) =>\n e instanceof BlockNotPinnedError ? EMPTY : throwError(() => e),\n ),\n )\n }\n\n const initial$ = blocks$.pipe(\n distinctUntilChanged((a, b) => a.finalized === b.finalized),\n lossLessExhaustMap(({ blocks, finalized }) =>\n getNextMemoryBlock$(null, blocks.get(finalized)!),\n ),\n take(1),\n map(\n (x): MemoryBlocks => ({\n blocks: { [x.block.hash]: x },\n finalized: x.block.hash,\n }),\n ),\n )\n\n const [_memoryBlocks$, connectMemoryBlocks] =\n selfDependent<MemoryBlocks>()\n\n const updates$ = blocks$.pipe(\n distinctUntilChanged((a, b) => a.best === b.best),\n withLatestFrom(_memoryBlocks$),\n lossLessExhaustMap(([pinned, memoryBlocks]) => {\n const { best } = pinned\n const { blocks } = memoryBlocks\n let target = !blocks[best] ? best : null\n if (!target) return EMPTY\n\n const previous = findPrevious(target, blocks, pinned)\n if (previous)\n return getNextMemoryBlock$(\n previous,\n pinned.blocks.get(target)!,\n ).pipe(\n map((x) => {\n blocks[target!] = x\n return memoryBlocks\n }),\n )\n\n // This means that there has been a stop event that the pinned-blocks\n // couldn't recover from. Therefore, we must \"start over\"\n target = pinned.finalized\n return getNextMemoryBlock$(\n blocks[memoryBlocks.finalized],\n pinned.blocks.get(target)!,\n ).pipe(\n map((x) => {\n x.prev = null\n return {\n blocks: { [target]: x },\n finalized: target,\n }\n }),\n )\n }),\n )\n\n return merge(initial$, updates$).pipe(connectMemoryBlocks())\n },\n )\n\n const getBestOrFinalized =\n (isFinalized: boolean) =>\n (pallet: string, entry: string, storageKey: string) => {\n const memoryBlocks$ = getMemoryBlocks$(pallet, entry, storageKey)\n\n const prop = isFinalized ? \"finalized\" : \"best\"\n\n return combineLatest([\n memoryBlocks$,\n blocks$.pipe(distinctUntilChanged((a, b) => a[prop] === b[prop])),\n ]).pipe(\n map(([state, blocks]) => {\n const update = findPrevious(blocks[prop], state.blocks, blocks, true)\n return update && { update, state }\n }),\n filter(Boolean),\n distinctUntilChanged((a, b) => a.update === b.update),\n startWith(null),\n pairwise(),\n mergeMap(([prev, next]) => {\n if (!prev) return [next!.update]\n const { update: prevUpdate } = prev\n\n const { state: memoryBlocks, update: latest } = next!\n let ancestor: MemoryBlock | null = latest\n const updates: Array<MemoryBlock> = []\n while (ancestor && ancestor.block.number > prevUpdate.block.number) {\n updates.unshift(ancestor)\n ancestor = ancestor.prev ? memoryBlocks.blocks[ancestor.prev] : null\n }\n\n if (isFinalized) {\n memoryBlocks.finalized = latest.block.hash\n if (updates.length) {\n const { blocks } = memoryBlocks\n Object.keys(blocks).forEach((key) => {\n if (blocks[key].block.number < updates[0].block.number)\n delete blocks[key]\n })\n }\n }\n\n if (prevUpdate === ancestor) return updates\n\n // It's a re-org\n return [\n {\n ...latest,\n ...(prevUpdate.rootHash === latest.rootHash\n ? {\n entries: prevUpdate.entries,\n deltas: null,\n }\n : getDiff(prevUpdate.entries, latest.entries, latest.patcher)),\n },\n ]\n }),\n )\n }\n\n const getFinalized$ = state(getBestOrFinalized(true))\n const getBest$ = state(getBestOrFinalized(false))\n\n return (pallet: string, entry: string, args: Array<any>, atBest: boolean) => {\n const fn = atBest ? getBest$ : getFinalized$\n const storageKey$ = blocks$.pipe(\n take(1),\n mergeMap(\n (b) =>\n b.runtimes[b.blocks.get(b[atBest ? \"best\" : \"finalized\"])!.runtime]\n .runtime,\n ),\n map((runtime) =>\n runtime.dynamicBuilder.buildStorage(pallet, entry).keys.enc(...args),\n ),\n )\n return storageKey$.pipe(\n take(1),\n mergeMap((storageKey) => fn(pallet, entry, storageKey)),\n map(({ block: { hash, number, parent }, deltas, entries }, idx) => {\n const actualDeltas =\n idx > 0 ? deltas : { deleted: [], upserted: entries }\n\n return {\n block: { hash, number, parent },\n entries: entries.map(toDec),\n deltas: actualDeltas && {\n deleted: actualDeltas.deleted.map(toDec),\n upserted: actualDeltas.upserted.map(toDec),\n },\n }\n }),\n )\n }\n}\n\nconst toDec = <T>(x: { dec: T }): T => x.dec\n"],"names":["state"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -680,7 +680,7 @@ const both = (value2, additionalSigned2) => ({
680
680
  });
681
681
  const getSignExtensionsCreator = (genesis, lookupFn, dynamicBuilder) => {
682
682
  const signedExtensionsEncoders = {};
683
- lookupFn.metadata.extrinsic.signedExtensions.forEach(
683
+ lookupFn.metadata.extrinsic.signedExtensions[0].forEach(
684
684
  ({ identifier, type, additionalSigned: additionalSigned2 }) => {
685
685
  signedExtensionsEncoders[identifier] = [type, additionalSigned2].map(
686
686
  (x) => dynamicBuilder.buildDefinition(x)[0]
@@ -1324,6 +1324,7 @@ const createWatchEntries = (blocks$, storage, withRuntime) => {
1324
1324
  prev: prev && prev.block.hash,
1325
1325
  rootHash,
1326
1326
  block,
1327
+ patcher,
1327
1328
  ...getDiff(
1328
1329
  prev?.entries ?? [],
1329
1330
  entries,
@@ -1392,31 +1393,23 @@ const createWatchEntries = (blocks$, storage, withRuntime) => {
1392
1393
  );
1393
1394
  const getBestOrFinalized = (isFinalized) => (pallet, entry, storageKey) => {
1394
1395
  const memoryBlocks$ = getMemoryBlocks$(pallet, entry, storageKey);
1395
- const getPatcher = getPatcherFromRuntime(pallet, entry);
1396
1396
  const prop = isFinalized ? "finalized" : "best";
1397
1397
  return rxjs.combineLatest([
1398
- memoryBlocks$.pipe(rxjs.delay(0)),
1398
+ memoryBlocks$,
1399
1399
  blocks$.pipe(rxjs.distinctUntilChanged((a, b) => a[prop] === b[prop]))
1400
1400
  ]).pipe(
1401
- rxjs.map(
1402
- ([state2, blocks]) => findPrevious(blocks[prop], state2.blocks, blocks, true)
1403
- ),
1401
+ rxjs.map(([state2, blocks]) => {
1402
+ const update = findPrevious(blocks[prop], state2.blocks, blocks, true);
1403
+ return update && { update, state: state2 };
1404
+ }),
1404
1405
  rxjs.filter(Boolean),
1405
- rxjs.distinctUntilChanged(),
1406
+ rxjs.distinctUntilChanged((a, b) => a.update === b.update),
1406
1407
  rxjs.startWith(null),
1407
1408
  rxjs.pairwise(),
1408
- rxjs.withLatestFrom(memoryBlocks$),
1409
- withRuntime(([[, _latest]]) => _latest.block.hash),
1410
- rxjs.map(
1411
- ([[[prevUpdate, latest], memoryBlocks], runtimeCtx]) => [
1412
- prevUpdate,
1413
- latest,
1414
- memoryBlocks,
1415
- getPatcher(runtimeCtx)
1416
- ]
1417
- ),
1418
- rxjs.mergeMap(([prevUpdate, latest, memoryBlocks, patcher]) => {
1419
- if (!prevUpdate) return [latest];
1409
+ rxjs.mergeMap(([prev, next]) => {
1410
+ if (!prev) return [next.update];
1411
+ const { update: prevUpdate } = prev;
1412
+ const { state: memoryBlocks, update: latest } = next;
1420
1413
  let ancestor = latest;
1421
1414
  const updates = [];
1422
1415
  while (ancestor && ancestor.block.number > prevUpdate.block.number) {
@@ -1440,7 +1433,7 @@ const createWatchEntries = (blocks$, storage, withRuntime) => {
1440
1433
  ...prevUpdate.rootHash === latest.rootHash ? {
1441
1434
  entries: prevUpdate.entries,
1442
1435
  deltas: null
1443
- } : getDiff(prevUpdate.entries, latest.entries, patcher)
1436
+ } : getDiff(prevUpdate.entries, latest.entries, latest.patcher)
1444
1437
  }
1445
1438
  ];
1446
1439
  })
@@ -1751,14 +1744,8 @@ function createClient(provider, { getMetadata, setMetadata } = {}) {
1751
1744
  )
1752
1745
  };
1753
1746
  const _request = rawClient.request;
1754
- let runtimeToken;
1755
- const compatibilityToken = /* @__PURE__ */ new WeakMap();
1756
- const getChainToken = (chainDefinition) => {
1757
- const result2 = compatibilityToken.get(chainDefinition) || createCompatibilityToken(chainDefinition, chainHead);
1758
- compatibilityToken.set(chainDefinition, result2);
1759
- return result2;
1760
- };
1761
- const getRuntimeToken = () => runtimeToken ?? (runtimeToken = createRuntimeToken(chainHead));
1747
+ let unsafeApi;
1748
+ const typedApis = /* @__PURE__ */ new WeakMap();
1762
1749
  const { broadcastTx$ } = client;
1763
1750
  const getMetadata$ = (at) => chainHead.getRuntimeContext$(at).pipe(rxjs.map((ctx) => ctx.metadataRaw));
1764
1751
  const result = {
@@ -1777,17 +1764,26 @@ function createClient(provider, { getMetadata, setMetadata } = {}) {
1777
1764
  submit: (...args) => submit(chainHead, broadcastTx$, ...args),
1778
1765
  submitAndWatch: (tx) => submit$(chainHead, broadcastTx$, tx),
1779
1766
  getTypedApi: (chainDefinition) => {
1780
- const token = getChainToken(chainDefinition);
1781
- return Object.assign(
1782
- createApi(token, chainHead, broadcastTx$),
1783
- { compatibilityToken: token }
1767
+ if (typedApis.has(chainDefinition)) return typedApis.get(chainDefinition);
1768
+ const compatibilityToken = createCompatibilityToken(
1769
+ chainDefinition,
1770
+ chainHead
1771
+ );
1772
+ const api = Object.assign(
1773
+ createApi(compatibilityToken, chainHead, broadcastTx$),
1774
+ { compatibilityToken }
1784
1775
  );
1776
+ typedApis.set(chainDefinition, api);
1777
+ return api;
1785
1778
  },
1786
1779
  getUnsafeApi: () => {
1787
- const token = getRuntimeToken();
1788
- return Object.assign(createApi(token, chainHead, broadcastTx$), {
1789
- runtimeToken: token
1790
- });
1780
+ if (unsafeApi) return unsafeApi;
1781
+ const runtimeToken = createRuntimeToken(chainHead);
1782
+ unsafeApi = Object.assign(
1783
+ createApi(runtimeToken, chainHead, broadcastTx$),
1784
+ { runtimeToken }
1785
+ );
1786
+ return unsafeApi;
1791
1787
  },
1792
1788
  rawQuery: (key, { at, signal } = {}) => firstValueFromWithSignal(
1793
1789
  chainHead.storage$(at ?? null, "value", () => {