polkadot-api 1.15.3 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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.15.3";
4
+ var version = "1.16.0";
5
5
 
6
6
  getCli({
7
7
  add,
@@ -226,6 +226,7 @@ function createClient(provider, { getMetadata, setMetadata } = {}) {
226
226
  return {
227
227
  getChainSpecData,
228
228
  blocks$: chainHead.newBlocks$,
229
+ hodlBlock: (block) => chainHead.holdBlock(block, true),
229
230
  finalizedBlock$: chainHead.finalized$,
230
231
  getFinalizedBlock: () => firstValueFrom(chainHead.finalized$),
231
232
  bestBlocks$: chainHead.bestBlocks$,
@@ -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 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 runtimeCallEntryPoint(\n ctx.lookup.metadata.apis\n .find((a) => a.name === api)!\n .methods.find((m) => m.name === method)!,\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 runtimeCallEntryPoint(\n ctx.lookup.metadata.pallets\n .find((a) => a.name === pallet)!\n .viewFns.find((m) => m.name === entry)!,\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 return {\n getChainSpecData,\n\n blocks$: chainHead.newBlocks$,\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"],"names":["createRawClient"],"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 } 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 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 runtimeCallEntryPoint(\n ctx.lookup.metadata.apis\n .find((a) => a.name === api)!\n .methods.find((m) => m.name === method)!,\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 runtimeCallEntryPoint(\n ctx.lookup.metadata.pallets\n .find((a) => a.name === pallet)!\n .viewFns.find((m) => m.name === entry)!,\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 return {\n getChainSpecData,\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"],"names":["createRawClient"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -955,6 +955,13 @@ interface PolkadotClient {
955
955
  * Observable of new blocks that have been discovered by the client.
956
956
  */
957
957
  blocks$: Observable<BlockInfo>;
958
+ /**
959
+ * Ensures that a block stays available, even after it has been finalized and
960
+ * no operations are running for that block.
961
+ *
962
+ * @returns A callback function to release the block.
963
+ */
964
+ hodlBlock: (blockHash: HexString) => () => void;
958
965
  /**
959
966
  * Observable to watch Block Body.
960
967
  *
package/dist/index.js CHANGED
@@ -1736,6 +1736,7 @@ function createClient(provider, { getMetadata, setMetadata } = {}) {
1736
1736
  return {
1737
1737
  getChainSpecData,
1738
1738
  blocks$: chainHead.newBlocks$,
1739
+ hodlBlock: (block) => chainHead.holdBlock(block, true),
1739
1740
  finalizedBlock$: chainHead.finalized$,
1740
1741
  getFinalizedBlock: () => rxjs.firstValueFrom(chainHead.finalized$),
1741
1742
  bestBlocks$: chainHead.bestBlocks$,