polkadot-api 1.20.0 → 1.20.2
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 +1 -1
- package/dist/esm/client.mjs +8 -6
- package/dist/esm/client.mjs.map +1 -1
- package/dist/esm/compatibility.mjs +10 -2
- package/dist/esm/compatibility.mjs.map +1 -1
- package/dist/esm/storage.mjs +3 -2
- package/dist/esm/storage.mjs.map +1 -1
- package/dist/index.js +20 -9
- package/dist/index.js.map +1 -1
- package/dist/umd/index.min.js +2 -2
- package/dist/umd/ink.min.js +1 -1
- package/dist/umd/pjs-signer.min.js +1 -1
- package/dist/umd/signer.min.js +1 -1
- package/dist/umd/ws-provider.min.js +1 -1
- package/dist/umd/ws-provider_web.min.js +1 -1
- package/package.json +14 -14
package/bin/cli.mjs
CHANGED
package/dist/esm/client.mjs
CHANGED
|
@@ -125,9 +125,10 @@ const createApi = (compatibilityToken, chainHead, broadcast$) => {
|
|
|
125
125
|
compatibilityHelper(
|
|
126
126
|
compatibilityToken,
|
|
127
127
|
(r) => r.getEntryPoint(OpType.Api, api, method),
|
|
128
|
-
(ctx) =>
|
|
129
|
-
ctx.lookup.metadata.apis.find((a) => a.name === api)
|
|
130
|
-
|
|
128
|
+
(ctx) => {
|
|
129
|
+
const item = ctx.lookup.metadata.apis.find((a) => a.name === api)?.methods.find((m) => m.name === method);
|
|
130
|
+
return item == null ? null : runtimeCallEntryPoint(item);
|
|
131
|
+
}
|
|
131
132
|
)
|
|
132
133
|
)
|
|
133
134
|
);
|
|
@@ -139,9 +140,10 @@ const createApi = (compatibilityToken, chainHead, broadcast$) => {
|
|
|
139
140
|
compatibilityHelper(
|
|
140
141
|
compatibilityToken,
|
|
141
142
|
(r) => r.getEntryPoint(OpType.ViewFns, pallet, entry),
|
|
142
|
-
(ctx) =>
|
|
143
|
-
ctx.lookup.metadata.pallets.find((a) => a.name === pallet)
|
|
144
|
-
|
|
143
|
+
(ctx) => {
|
|
144
|
+
const item = ctx.lookup.metadata.pallets.find((a) => a.name === pallet)?.viewFns.find((m) => m.name === entry);
|
|
145
|
+
return item == null ? null : runtimeCallEntryPoint(item);
|
|
146
|
+
}
|
|
145
147
|
)
|
|
146
148
|
)
|
|
147
149
|
);
|
package/dist/esm/client.mjs.map
CHANGED
|
@@ -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 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 } 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 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,4 +1,4 @@
|
|
|
1
|
-
import { EntryPointCodec, TypedefCodec, mapLookupToTypedef, CompatibilityLevel, valueIsCompatibleWithDest, entryPointsAreCompatible } from '@polkadot-api/metadata-compatibility';
|
|
1
|
+
import { EntryPointCodec, TypedefCodec, isStorageKeyCompatible, mapLookupToTypedef, CompatibilityLevel, valueIsCompatibleWithDest, entryPointsAreCompatible } from '@polkadot-api/metadata-compatibility';
|
|
2
2
|
import { Vector, Tuple } from '@polkadot-api/substrate-bindings';
|
|
3
3
|
import { filter, firstValueFrom, combineLatest, map } from 'rxjs';
|
|
4
4
|
|
|
@@ -163,6 +163,13 @@ const compatibilityHelper = (descriptors, getDescriptorEntryPoint, getRuntimeEnt
|
|
|
163
163
|
values
|
|
164
164
|
);
|
|
165
165
|
};
|
|
166
|
+
const storageKeysAreCompatible = (ctx, keys, nKeysDest) => {
|
|
167
|
+
const entryPoint = getRuntimeEntryPoint(ctx);
|
|
168
|
+
if (entryPoint == null) return false;
|
|
169
|
+
const getNode = (id) => getRuntimeTypedef(ctx, id);
|
|
170
|
+
const destNode = entryPoint.args.type === "lookup" ? getNode(entryPoint.args.value) : entryPoint.args.value;
|
|
171
|
+
return isStorageKeyCompatible(keys, nKeysDest, destNode, getNode);
|
|
172
|
+
};
|
|
166
173
|
return {
|
|
167
174
|
isCompatible,
|
|
168
175
|
getCompatibilityLevel,
|
|
@@ -172,7 +179,8 @@ const compatibilityHelper = (descriptors, getDescriptorEntryPoint, getRuntimeEnt
|
|
|
172
179
|
compatibleRuntime$,
|
|
173
180
|
argsAreCompatible,
|
|
174
181
|
valuesAreCompatible,
|
|
175
|
-
getRuntimeTypedef
|
|
182
|
+
getRuntimeTypedef,
|
|
183
|
+
storageKeysAreCompatible
|
|
176
184
|
};
|
|
177
185
|
};
|
|
178
186
|
const minCompatLevel = (levels) => Math.min(levels.args, levels.values);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compatibility.mjs","sources":["../../src/compatibility.ts"],"sourcesContent":["import { MetadataLookup } from \"@polkadot-api/metadata-builders\"\nimport {\n CompatibilityCache,\n CompatibilityLevel,\n EntryPoint,\n EntryPointCodec,\n TypedefCodec,\n TypedefNode,\n entryPointsAreCompatible,\n mapLookupToTypedef,\n valueIsCompatibleWithDest,\n} from \"@polkadot-api/metadata-compatibility\"\nimport { ChainHead$, RuntimeContext } from \"@polkadot-api/observable-client\"\nimport { Tuple, Vector } from \"@polkadot-api/substrate-bindings\"\nimport { Observable, combineLatest, filter, firstValueFrom, map } from \"rxjs\"\nimport { ChainDefinition } from \"./descriptors\"\n\nexport class RuntimeToken<D = unknown> {\n private constructor() {}\n\n // @ts-ignore\n protected _runtime(value: D) {}\n}\n\nexport class CompatibilityToken<D = unknown> {\n private constructor() {}\n\n // @ts-ignore\n protected _compatibility(value: D) {}\n}\n\ninterface RuntimeTokenApi {\n runtime: () => RuntimeContext\n}\ninterface CompatibilityTokenApi extends RuntimeTokenApi {\n typedefNodes: TypedefNode[]\n getEntryPoint: (opType: OpType, pallet: string, name: string) => EntryPoint\n}\nconst compatibilityTokenApi = new WeakMap<\n CompatibilityToken,\n CompatibilityTokenApi\n>()\nconst runtimeTokenApi = new WeakMap<RuntimeToken, RuntimeTokenApi>()\nexport const getCompatibilityApi = (\n token: RuntimeToken | CompatibilityToken,\n): RuntimeTokenApi | CompatibilityTokenApi =>\n token instanceof RuntimeToken\n ? runtimeTokenApi.get(token)!\n : compatibilityTokenApi.get(token)!\n\nexport const enum OpType {\n Storage = \"storage\",\n Tx = \"tx\",\n Event = \"events\",\n Const = \"constants\",\n ViewFns = \"viewFns\",\n Api = \"apis\",\n}\n\nconst EntryPointsCodec = Vector(EntryPointCodec)\nconst TypedefsCodec = Vector(TypedefCodec)\nconst TypesCodec = Tuple(EntryPointsCodec, TypedefsCodec)\n\nexport const createCompatibilityToken = <D extends ChainDefinition>(\n chainDefinition: D,\n chainHead: ChainHead$,\n): Promise<CompatibilityToken<D>> => {\n const awaitedRuntime = new Promise<() => RuntimeContext>(async (resolve) => {\n const loadedRuntime$ = chainHead.runtime$.pipe(filter((v) => v != null))\n\n let latest = await firstValueFrom(loadedRuntime$)\n loadedRuntime$.subscribe((v) => (latest = v))\n\n resolve(() => latest)\n })\n\n const promise = Promise.all([\n chainDefinition.metadataTypes.then(TypesCodec.dec),\n chainDefinition.descriptors,\n awaitedRuntime,\n ]).then(([[entryPoints, typedefNodes], descriptors, runtime]) => {\n const token = new (CompatibilityToken as any)()\n compatibilityTokenApi.set(token, {\n runtime,\n getEntryPoint(opType, pallet, name) {\n const idx = descriptors[opType]?.[pallet]?.[name]\n if (idx == null)\n throw new Error(\n `Descriptor for ${opType} ${pallet}.${name} does not exist`,\n )\n return entryPoints[idx]\n },\n typedefNodes,\n })\n\n return token\n })\n\n return promise\n}\n\nexport const createRuntimeToken = <D>(\n chainHead: ChainHead$,\n): Promise<RuntimeToken<D>> => {\n const awaitedRuntime = new Promise<() => RuntimeContext>(async (resolve) => {\n const loadedRuntime$ = chainHead.runtime$.pipe(filter((v) => v != null))\n\n let latest = await firstValueFrom(loadedRuntime$)\n loadedRuntime$.subscribe((v) => (latest = v))\n\n resolve(() => latest)\n })\n\n const promise = awaitedRuntime.then((runtime) => {\n const token = new (RuntimeToken as any)()\n runtimeTokenApi.set(token, {\n runtime,\n })\n return token\n })\n\n return promise\n}\n\n// metadataRaw -> cache\nconst metadataCache = new WeakMap<\n Uint8Array,\n {\n compat: CompatibilityCache\n lookup: MetadataLookup\n typeNodes: (TypedefNode | null)[]\n }\n>()\nconst getMetadataCache = (ctx: RuntimeContext) => {\n if (!metadataCache.has(ctx.metadataRaw)) {\n metadataCache.set(ctx.metadataRaw, {\n compat: new Map(),\n lookup: ctx.lookup,\n typeNodes: [],\n })\n }\n return metadataCache.get(ctx.metadataRaw)!\n}\nexport const compatibilityHelper = (\n descriptors: Promise<RuntimeToken | CompatibilityToken>,\n getDescriptorEntryPoint: (descriptorApi: CompatibilityTokenApi) => EntryPoint,\n getRuntimeEntryPoint: (ctx: RuntimeContext) => EntryPoint | null,\n) => {\n const getRuntimeTypedef = (ctx: RuntimeContext, id: number) => {\n const cache = getMetadataCache(ctx)\n return (cache.typeNodes[id] ||= mapLookupToTypedef(cache.lookup(id)))\n }\n\n function getCompatibilityLevels(\n descriptors: CompatibilityToken | RuntimeToken,\n /**\n * The `Runtime` of runtimeWithDescriptors already has a RuntimeContext,\n * which is the runtime of the finalized block.\n * But on some cases, the user wants to perform an action on a specific\n * block hash, which has a different RuntimeContext.\n */\n ctx?: RuntimeContext,\n ) {\n if (descriptors instanceof RuntimeToken) {\n return {\n args: CompatibilityLevel.Identical,\n values: CompatibilityLevel.Identical,\n }\n }\n const compatibilityApi = compatibilityTokenApi.get(descriptors)!\n ctx ||= compatibilityApi.runtime()\n const runtimeEntryPoint = getRuntimeEntryPoint(ctx)\n if (runtimeEntryPoint == null)\n return {\n args: CompatibilityLevel.Incompatible,\n values: CompatibilityLevel.Incompatible,\n }\n const descriptorNodes = compatibilityApi.typedefNodes\n\n const cache = getMetadataCache(ctx)\n\n const descriptorEntryPoint = getDescriptorEntryPoint(compatibilityApi)\n const result = entryPointsAreCompatible(\n descriptorEntryPoint,\n (id) => descriptorNodes[id],\n runtimeEntryPoint,\n (id) => getRuntimeTypedef(ctx, id),\n cache.compat,\n )\n return {\n args: result.args.level,\n values: result.values.level,\n }\n }\n\n const getCompatibilityLevel = withOptionalToken(descriptors, (runtime) =>\n minCompatLevel(getCompatibilityLevels(runtime)),\n )\n const isCompatible = withOptionalToken(\n descriptors,\n (threshold: CompatibilityLevel, runtime) =>\n getCompatibilityLevel(runtime) >= threshold,\n )\n\n const compatibleRuntime$ = (chainHead: ChainHead$, hash: string | null) =>\n combineLatest([descriptors, chainHead.getRuntimeContext$(hash)])\n\n const withCompatibleRuntime =\n <T>(chainHead: ChainHead$, mapper: (x: T) => string) =>\n (\n source$: Observable<T>,\n ): Observable<[T, CompatibilityToken | RuntimeToken, RuntimeContext]> =>\n combineLatest([\n source$.pipe(chainHead.withRuntime(mapper)),\n descriptors,\n ]).pipe(map(([[x, ctx], descriptors]) => [x, descriptors, ctx]))\n\n const argsAreCompatible = (\n descriptors: CompatibilityToken | RuntimeToken,\n ctx: RuntimeContext,\n args: unknown,\n ) => {\n if (descriptors instanceof RuntimeToken) return true\n const levels = getCompatibilityLevels(descriptors, ctx)\n if (levels.args === CompatibilityLevel.Incompatible) return false\n if (levels.args > CompatibilityLevel.Partial) return true\n // Although technically args could still be compatible, if the output will be incompatible we might as well just return false to skip sending the request.\n if (levels.values === CompatibilityLevel.Incompatible) return false\n\n const entryPoint = getRuntimeEntryPoint(ctx)\n if (entryPoint == null) return false\n\n return valueIsCompatibleWithDest(\n entryPoint.args,\n (id) => getRuntimeTypedef(ctx, id),\n args,\n )\n }\n const valuesAreCompatible = (\n descriptors: CompatibilityToken | RuntimeToken,\n ctx: RuntimeContext,\n values: unknown,\n ) => {\n if (descriptors instanceof RuntimeToken) return true\n const level = getCompatibilityLevels(descriptors, ctx).values\n if (level === CompatibilityLevel.Incompatible) return false\n if (level > CompatibilityLevel.Partial) return true\n\n const compatibilityApi = compatibilityTokenApi.get(descriptors)!\n\n const entryPoint = getDescriptorEntryPoint(compatibilityApi)\n\n return valueIsCompatibleWithDest(\n entryPoint.values,\n (id) => compatibilityApi.typedefNodes[id],\n values,\n )\n }\n\n return {\n isCompatible,\n getCompatibilityLevel,\n getCompatibilityLevels,\n descriptors,\n withCompatibleRuntime,\n compatibleRuntime$,\n argsAreCompatible,\n valuesAreCompatible,\n getRuntimeTypedef,\n }\n}\nexport type CompatibilityHelper = ReturnType<typeof compatibilityHelper>\n\nexport const minCompatLevel = (levels: {\n args: CompatibilityLevel\n values: CompatibilityLevel\n}) => Math.min(levels.args, levels.values)\n\nconst withOptionalToken =\n <T, D, A extends [...any[], CompatibilityToken | RuntimeToken]>(\n compatibilityToken: Promise<CompatibilityToken<D> | RuntimeToken<D>>,\n fn: (...args: A) => T,\n ): WithOptionalRuntime<T, D, A extends [...infer R, any] ? R : []> =>\n (...args: any): any => {\n const lastElement = args.at(-1)\n if (\n lastElement instanceof CompatibilityToken ||\n lastElement instanceof RuntimeToken\n ) {\n return fn(...args)\n }\n return compatibilityToken.then((token) => (fn as any)(...args, token))\n }\n\nexport type WithOptionalRuntime<T, D, A extends any[]> = {\n /**\n * Returns the result after waiting for the runtime to load.\n */\n (...args: A): Promise<T>\n /**\n * Returns the result synchronously with the loaded runtime.\n */\n (...args: [...A, runtime: CompatibilityToken<D> | RuntimeToken<D>]): T\n}\n\nexport interface CompatibilityFunctions<D> {\n /**\n * Returns the `CompatibilityLevel` for this call comparing the descriptors\n * generated on dev time with the current live metadata.\n */\n getCompatibilityLevel(): Promise<CompatibilityLevel>\n /**\n * Returns the `CompatibilityLevel` for this call comparing the descriptors\n * generated on dev time with the current live metadata.\n *\n * @param compatibilityToken CompatibilityToken awaited from\n * typedApi.compatibilityToken.\n */\n getCompatibilityLevel(\n compatibilityToken: CompatibilityToken<D>,\n ): CompatibilityLevel\n\n /**\n * Returns whether this call is compatible based on the CompatibilityLevel\n * threshold.\n *\n * @param threshold CompatibilityLevel threshold to use, inclusive.\n */\n isCompatible(threshold: CompatibilityLevel): Promise<boolean>\n\n /**\n * Returns whether this call is compatible based on the CompatibilityLevel\n * threshold.\n *\n * @param threshold CompatibilityLevel threshold to use,\n * inclusive.\n * @param compatibilityToken CompatibilityToken awaited from\n * typedApi.compatibilityToken.\n */\n isCompatible(\n threshold: CompatibilityLevel,\n compatibilityToken: CompatibilityToken<D>,\n ): boolean\n}\n"],"names":["OpType","descriptors"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"compatibility.mjs","sources":["../../src/compatibility.ts"],"sourcesContent":["import { MetadataLookup } from \"@polkadot-api/metadata-builders\"\nimport {\n CompatibilityCache,\n CompatibilityLevel,\n EntryPoint,\n EntryPointCodec,\n TypedefCodec,\n TypedefNode,\n entryPointsAreCompatible,\n isStorageKeyCompatible,\n mapLookupToTypedef,\n valueIsCompatibleWithDest,\n} from \"@polkadot-api/metadata-compatibility\"\nimport { ChainHead$, RuntimeContext } from \"@polkadot-api/observable-client\"\nimport { Tuple, Vector } from \"@polkadot-api/substrate-bindings\"\nimport { Observable, combineLatest, filter, firstValueFrom, map } from \"rxjs\"\nimport { ChainDefinition } from \"./descriptors\"\n\nexport class RuntimeToken<D = unknown> {\n private constructor() {}\n\n // @ts-ignore\n protected _runtime(value: D) {}\n}\n\nexport class CompatibilityToken<D = unknown> {\n private constructor() {}\n\n // @ts-ignore\n protected _compatibility(value: D) {}\n}\n\ninterface RuntimeTokenApi {\n runtime: () => RuntimeContext\n}\ninterface CompatibilityTokenApi extends RuntimeTokenApi {\n typedefNodes: TypedefNode[]\n getEntryPoint: (opType: OpType, pallet: string, name: string) => EntryPoint\n}\nconst compatibilityTokenApi = new WeakMap<\n CompatibilityToken,\n CompatibilityTokenApi\n>()\nconst runtimeTokenApi = new WeakMap<RuntimeToken, RuntimeTokenApi>()\nexport const getCompatibilityApi = (\n token: RuntimeToken | CompatibilityToken,\n): RuntimeTokenApi | CompatibilityTokenApi =>\n token instanceof RuntimeToken\n ? runtimeTokenApi.get(token)!\n : compatibilityTokenApi.get(token)!\n\nexport const enum OpType {\n Storage = \"storage\",\n Tx = \"tx\",\n Event = \"events\",\n Const = \"constants\",\n ViewFns = \"viewFns\",\n Api = \"apis\",\n}\n\nconst EntryPointsCodec = Vector(EntryPointCodec)\nconst TypedefsCodec = Vector(TypedefCodec)\nconst TypesCodec = Tuple(EntryPointsCodec, TypedefsCodec)\n\nexport const createCompatibilityToken = <D extends ChainDefinition>(\n chainDefinition: D,\n chainHead: ChainHead$,\n): Promise<CompatibilityToken<D>> => {\n const awaitedRuntime = new Promise<() => RuntimeContext>(async (resolve) => {\n const loadedRuntime$ = chainHead.runtime$.pipe(filter((v) => v != null))\n\n let latest = await firstValueFrom(loadedRuntime$)\n loadedRuntime$.subscribe((v) => (latest = v))\n\n resolve(() => latest)\n })\n\n const promise = Promise.all([\n chainDefinition.metadataTypes.then(TypesCodec.dec),\n chainDefinition.descriptors,\n awaitedRuntime,\n ]).then(([[entryPoints, typedefNodes], descriptors, runtime]) => {\n const token = new (CompatibilityToken as any)()\n compatibilityTokenApi.set(token, {\n runtime,\n getEntryPoint(opType, pallet, name) {\n const idx = descriptors[opType]?.[pallet]?.[name]\n if (idx == null)\n throw new Error(\n `Descriptor for ${opType} ${pallet}.${name} does not exist`,\n )\n return entryPoints[idx]\n },\n typedefNodes,\n })\n\n return token\n })\n\n return promise\n}\n\nexport const createRuntimeToken = <D>(\n chainHead: ChainHead$,\n): Promise<RuntimeToken<D>> => {\n const awaitedRuntime = new Promise<() => RuntimeContext>(async (resolve) => {\n const loadedRuntime$ = chainHead.runtime$.pipe(filter((v) => v != null))\n\n let latest = await firstValueFrom(loadedRuntime$)\n loadedRuntime$.subscribe((v) => (latest = v))\n\n resolve(() => latest)\n })\n\n const promise = awaitedRuntime.then((runtime) => {\n const token = new (RuntimeToken as any)()\n runtimeTokenApi.set(token, {\n runtime,\n })\n return token\n })\n\n return promise\n}\n\n// metadataRaw -> cache\nconst metadataCache = new WeakMap<\n Uint8Array,\n {\n compat: CompatibilityCache\n lookup: MetadataLookup\n typeNodes: (TypedefNode | null)[]\n }\n>()\nconst getMetadataCache = (ctx: RuntimeContext) => {\n if (!metadataCache.has(ctx.metadataRaw)) {\n metadataCache.set(ctx.metadataRaw, {\n compat: new Map(),\n lookup: ctx.lookup,\n typeNodes: [],\n })\n }\n return metadataCache.get(ctx.metadataRaw)!\n}\nexport const compatibilityHelper = (\n descriptors: Promise<RuntimeToken | CompatibilityToken>,\n getDescriptorEntryPoint: (descriptorApi: CompatibilityTokenApi) => EntryPoint,\n getRuntimeEntryPoint: (ctx: RuntimeContext) => EntryPoint | null,\n) => {\n const getRuntimeTypedef = (ctx: RuntimeContext, id: number) => {\n const cache = getMetadataCache(ctx)\n return (cache.typeNodes[id] ||= mapLookupToTypedef(cache.lookup(id)))\n }\n\n function getCompatibilityLevels(\n descriptors: CompatibilityToken | RuntimeToken,\n /**\n * The `Runtime` of runtimeWithDescriptors already has a RuntimeContext,\n * which is the runtime of the finalized block.\n * But on some cases, the user wants to perform an action on a specific\n * block hash, which has a different RuntimeContext.\n */\n ctx?: RuntimeContext,\n ) {\n if (descriptors instanceof RuntimeToken) {\n return {\n args: CompatibilityLevel.Identical,\n values: CompatibilityLevel.Identical,\n }\n }\n const compatibilityApi = compatibilityTokenApi.get(descriptors)!\n ctx ||= compatibilityApi.runtime()\n const runtimeEntryPoint = getRuntimeEntryPoint(ctx)\n if (runtimeEntryPoint == null)\n return {\n args: CompatibilityLevel.Incompatible,\n values: CompatibilityLevel.Incompatible,\n }\n const descriptorNodes = compatibilityApi.typedefNodes\n\n const cache = getMetadataCache(ctx)\n\n const descriptorEntryPoint = getDescriptorEntryPoint(compatibilityApi)\n const result = entryPointsAreCompatible(\n descriptorEntryPoint,\n (id) => descriptorNodes[id],\n runtimeEntryPoint,\n (id) => getRuntimeTypedef(ctx, id),\n cache.compat,\n )\n return {\n args: result.args.level,\n values: result.values.level,\n }\n }\n\n const getCompatibilityLevel = withOptionalToken(descriptors, (runtime) =>\n minCompatLevel(getCompatibilityLevels(runtime)),\n )\n const isCompatible = withOptionalToken(\n descriptors,\n (threshold: CompatibilityLevel, runtime) =>\n getCompatibilityLevel(runtime) >= threshold,\n )\n\n const compatibleRuntime$ = (chainHead: ChainHead$, hash: string | null) =>\n combineLatest([descriptors, chainHead.getRuntimeContext$(hash)])\n\n const withCompatibleRuntime =\n <T>(chainHead: ChainHead$, mapper: (x: T) => string) =>\n (\n source$: Observable<T>,\n ): Observable<[T, CompatibilityToken | RuntimeToken, RuntimeContext]> =>\n combineLatest([\n source$.pipe(chainHead.withRuntime(mapper)),\n descriptors,\n ]).pipe(map(([[x, ctx], descriptors]) => [x, descriptors, ctx]))\n\n const argsAreCompatible = (\n descriptors: CompatibilityToken | RuntimeToken,\n ctx: RuntimeContext,\n args: unknown,\n ) => {\n if (descriptors instanceof RuntimeToken) return true\n const levels = getCompatibilityLevels(descriptors, ctx)\n if (levels.args === CompatibilityLevel.Incompatible) return false\n if (levels.args > CompatibilityLevel.Partial) return true\n // Although technically args could still be compatible, if the output will be incompatible we might as well just return false to skip sending the request.\n if (levels.values === CompatibilityLevel.Incompatible) return false\n\n const entryPoint = getRuntimeEntryPoint(ctx)\n if (entryPoint == null) return false\n\n return valueIsCompatibleWithDest(\n entryPoint.args,\n (id) => getRuntimeTypedef(ctx, id),\n args,\n )\n }\n const valuesAreCompatible = (\n descriptors: CompatibilityToken | RuntimeToken,\n ctx: RuntimeContext,\n values: unknown,\n ) => {\n if (descriptors instanceof RuntimeToken) return true\n const level = getCompatibilityLevels(descriptors, ctx).values\n if (level === CompatibilityLevel.Incompatible) return false\n if (level > CompatibilityLevel.Partial) return true\n\n const compatibilityApi = compatibilityTokenApi.get(descriptors)!\n\n const entryPoint = getDescriptorEntryPoint(compatibilityApi)\n\n return valueIsCompatibleWithDest(\n entryPoint.values,\n (id) => compatibilityApi.typedefNodes[id],\n values,\n )\n }\n\n const storageKeysAreCompatible = (\n ctx: RuntimeContext,\n keys: unknown[],\n nKeysDest: number,\n ) => {\n const entryPoint = getRuntimeEntryPoint(ctx)\n if (entryPoint == null) return false\n\n const getNode = (id: number) => getRuntimeTypedef(ctx, id)\n const destNode =\n entryPoint.args.type === \"lookup\"\n ? getNode(entryPoint.args.value)\n : entryPoint.args.value\n\n return isStorageKeyCompatible(keys, nKeysDest, destNode, getNode)\n }\n\n return {\n isCompatible,\n getCompatibilityLevel,\n getCompatibilityLevels,\n descriptors,\n withCompatibleRuntime,\n compatibleRuntime$,\n argsAreCompatible,\n valuesAreCompatible,\n getRuntimeTypedef,\n storageKeysAreCompatible,\n }\n}\nexport type CompatibilityHelper = ReturnType<typeof compatibilityHelper>\n\nexport const minCompatLevel = (levels: {\n args: CompatibilityLevel\n values: CompatibilityLevel\n}) => Math.min(levels.args, levels.values)\n\nconst withOptionalToken =\n <T, D, A extends [...any[], CompatibilityToken | RuntimeToken]>(\n compatibilityToken: Promise<CompatibilityToken<D> | RuntimeToken<D>>,\n fn: (...args: A) => T,\n ): WithOptionalRuntime<T, D, A extends [...infer R, any] ? R : []> =>\n (...args: any): any => {\n const lastElement = args.at(-1)\n if (\n lastElement instanceof CompatibilityToken ||\n lastElement instanceof RuntimeToken\n ) {\n return fn(...args)\n }\n return compatibilityToken.then((token) => (fn as any)(...args, token))\n }\n\nexport type WithOptionalRuntime<T, D, A extends any[]> = {\n /**\n * Returns the result after waiting for the runtime to load.\n */\n (...args: A): Promise<T>\n /**\n * Returns the result synchronously with the loaded runtime.\n */\n (...args: [...A, runtime: CompatibilityToken<D> | RuntimeToken<D>]): T\n}\n\nexport interface CompatibilityFunctions<D> {\n /**\n * Returns the `CompatibilityLevel` for this call comparing the descriptors\n * generated on dev time with the current live metadata.\n */\n getCompatibilityLevel(): Promise<CompatibilityLevel>\n /**\n * Returns the `CompatibilityLevel` for this call comparing the descriptors\n * generated on dev time with the current live metadata.\n *\n * @param compatibilityToken CompatibilityToken awaited from\n * typedApi.compatibilityToken.\n */\n getCompatibilityLevel(\n compatibilityToken: CompatibilityToken<D>,\n ): CompatibilityLevel\n\n /**\n * Returns whether this call is compatible based on the CompatibilityLevel\n * threshold.\n *\n * @param threshold CompatibilityLevel threshold to use, inclusive.\n */\n isCompatible(threshold: CompatibilityLevel): Promise<boolean>\n\n /**\n * Returns whether this call is compatible based on the CompatibilityLevel\n * threshold.\n *\n * @param threshold CompatibilityLevel threshold to use,\n * inclusive.\n * @param compatibilityToken CompatibilityToken awaited from\n * typedApi.compatibilityToken.\n */\n isCompatible(\n threshold: CompatibilityLevel,\n compatibilityToken: CompatibilityToken<D>,\n ): boolean\n}\n"],"names":["OpType","descriptors"],"mappings":"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"}
|
package/dist/esm/storage.mjs
CHANGED
|
@@ -16,6 +16,7 @@ const createStorageEntry = (pallet, name, chainHead, getWatchEntries, {
|
|
|
16
16
|
getCompatibilityLevels,
|
|
17
17
|
descriptors: descriptorsPromise,
|
|
18
18
|
argsAreCompatible,
|
|
19
|
+
storageKeysAreCompatible,
|
|
19
20
|
valuesAreCompatible
|
|
20
21
|
}) => {
|
|
21
22
|
const isSystemNumber = pallet === "System" && name === "Number";
|
|
@@ -68,7 +69,7 @@ const createStorageEntry = (pallet, name, chainHead, getWatchEntries, {
|
|
|
68
69
|
const actualArgs = args.length === codecs.len ? args : args.slice(0, -1);
|
|
69
70
|
if (args !== actualArgs && !isLastArgOptional)
|
|
70
71
|
throw invalidArgs(args);
|
|
71
|
-
if (!
|
|
72
|
+
if (!storageKeysAreCompatible(ctx, actualArgs, codecs.len))
|
|
72
73
|
throw incompatibleError();
|
|
73
74
|
return codecs.keys.enc(...actualArgs);
|
|
74
75
|
},
|
|
@@ -76,7 +77,7 @@ const createStorageEntry = (pallet, name, chainHead, getWatchEntries, {
|
|
|
76
77
|
(data, ctx) => {
|
|
77
78
|
const codecs = getCodec(ctx);
|
|
78
79
|
const mapped = data === null ? codecs.fallback : codecs.value.dec(data);
|
|
79
|
-
if (!valuesAreCompatible(descriptors, ctx, mapped))
|
|
80
|
+
if (data !== null && !valuesAreCompatible(descriptors, ctx, mapped))
|
|
80
81
|
throw incompatibleError();
|
|
81
82
|
return { raw: data, mapped };
|
|
82
83
|
}
|
package/dist/esm/storage.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.mjs","sources":["../../src/storage.ts"],"sourcesContent":["import {\n firstValueFromWithSignal,\n isOptionalArg,\n lossLessExhaustMap,\n} from \"@/utils\"\nimport { CompatibilityLevel } from \"@polkadot-api/metadata-compatibility\"\nimport {\n BlockInfo,\n BlockNotPinnedError,\n ChainHead$,\n RuntimeContext,\n} from \"@polkadot-api/observable-client\"\nimport { FixedSizeBinary, HexString } from \"@polkadot-api/substrate-bindings\"\nimport { StorageItemInput, StorageResult } from \"@polkadot-api/substrate-client\"\nimport {\n Observable,\n OperatorFunction,\n catchError,\n combineLatestWith,\n distinctUntilChanged,\n filter,\n from,\n identity,\n map,\n mergeMap,\n pipe,\n shareReplay,\n take,\n} from \"rxjs\"\nimport {\n CompatibilityFunctions,\n CompatibilityHelper,\n CompatibilityToken,\n getCompatibilityApi,\n minCompatLevel,\n RuntimeToken,\n} from \"./compatibility\"\nimport { createWatchEntries } from \"./watch-entries\"\nimport { PullOptions } from \"./types\"\n\ntype WithCallOptions<Args extends Array<any>> = [\n ...args: Args,\n options?: PullOptions,\n]\n\ntype WithWatchOptions<Args extends Array<any>> = [\n ...args: Args,\n options?: { at: \"best\" },\n]\n\ntype PossibleParents<A extends Array<any>> = A extends [...infer Left, any]\n ? Left | PossibleParents<Left>\n : ArrayPossibleParents<A>\n\ntype AllPermutations<A extends Array<any>> = PossibleParents<A> | A\n\n// Fixed-size arrays values can't be extracted one-by-one, so that's a specific case\ntype ArrayPossibleParents<\n A extends Array<any>,\n Count extends Array<any> = [],\n R = [],\n> = A extends Array<infer T> & { length: infer L }\n ? number extends L\n ? Array<T> // Case variable-size array it's an unknown amount of entries\n : L extends Count[\"length\"]\n ? R\n : ArrayPossibleParents<A, [...Count, T], R | Count>\n : never\n\ntype GetKey<Args extends Array<any>, Unsafe> = Unsafe extends true\n ? {\n /**\n * Get the storage-key for this storage entry.\n *\n * @param args All keys needed for that storage entry.\n * @returns Promise that will resolve the hexadecimal value of the\n * storage key.\n */\n (...args: AllPermutations<Args>): Promise<HexString>\n /**\n * Get the storage-key for this storage entry.\n *\n * @param ...args All keys needed for that storage entry.\n * @param runtimeToken Token from got with `await\n * typedApi.runtimeToken`\n * @returns Synchronously returns the hexadecimal value of the\n * storage key.\n */\n (\n ...args: [...AllPermutations<Args>, runtimeToken: RuntimeToken]\n ): HexString\n }\n : {\n /**\n * Get the storage-key for this storage entry.\n *\n * @param args All keys needed for that storage entry.\n * @returns Promise that will resolve the hexadecimal value of the\n * storage key.\n */\n (...args: AllPermutations<Args>): Promise<HexString>\n /**\n * Get the storage-key for this storage entry.\n *\n * @param ...args All keys needed for that storage entry.\n * @param compatibilityToken Token from got with `await\n * typedApi.compatibilityToken`\n * @returns Synchronously returns the hexadecimal value of the\n * storage key.\n */\n (\n ...args: [\n ...AllPermutations<Args>,\n compatibilityToken: CompatibilityToken,\n ]\n ): HexString\n }\n\ntype StorageEntryWithoutKeys<Unsafe, D, Payload> = {\n /**\n * Get `Payload` (Promise-based) for the storage entry.\n *\n * @param options Optionally set which block to target (latest known\n * finalized is the default) and an AbortSignal.\n */\n getValue: (options?: PullOptions) => Promise<Payload>\n /**\n * Watch changes in `Payload` (observable-based) for the storage entry.\n *\n * @param bestOrFinalized Optionally choose which block to query and watch\n * changes, `best` or `finalized` (default)\n */\n watchValue: (bestOrFinalized?: \"best\" | \"finalized\") => Observable<Payload>\n getKey: GetKey<[], Unsafe>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport type StorageEntryWithKeys<\n Unsafe,\n D,\n Args extends Array<any>,\n Payload,\n ArgsOut extends Array<any>,\n> = {\n /**\n * Get `Payload` (Promise-based) for the storage entry with a specific set of\n * `Args`.\n *\n * @param args All keys needed for that storage entry.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n */\n getValue: (...args: [...WithCallOptions<Args>]) => Promise<Payload>\n /**\n * Watch changes in `Payload` (observable-based) for the storage entry.\n *\n * @param args All keys needed for that storage entry.\n * At the end, optionally choose which block to query and\n * watch changes, `best` or `finalized` (default)\n */\n watchValue: (\n ...args: [...Args, bestOrFinalized?: \"best\" | \"finalized\"]\n ) => Observable<Payload>\n /**\n * Get an Array of `Payload` (Promise-based) for the storage entry with\n * several sets of `Args`.\n *\n * @param keys Array of sets of keys needed for the storage entry.\n * @param options Optionally set which block to target (latest known\n * finalized is the default) and an AbortSignal.\n */\n getValues: (\n keys: Array<[...Args]>,\n options?: PullOptions,\n ) => Promise<Array<Payload>>\n /**\n * Get an Array of `Payload` (Promise-based) for the storage entry with a\n * subset of `Args`.\n *\n * @param args Subset of keys needed for the storage entry.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n * @example\n *\n * // this is a query with 3 keys\n * typedApi.query.Pallet.Query.getEntries({ at: \"best\" }) // no keys\n * typedApi.query.Pallet.Query.getEntries(arg1, { at: \"finalized\" }) // 1/3 keys\n * typedApi.query.Pallet.Query.getEntries(arg1, arg2, { at: \"0x12345678\" }) // 2/3 keys\n *\n */\n getEntries: (\n ...args: WithCallOptions<PossibleParents<Args>>\n ) => Promise<Array<{ keyArgs: ArgsOut; value: NonNullable<Payload> }>>\n /**\n * Watch changes (Observable-based) for the storage entries with a subset of\n * `Args`.\n *\n * @param args Subset of keys needed for the storage entry.\n * At the end, optionally set whether to watch against the\n * `best` block.\n * By default watches changes against the finalized block.\n * When watching changes against the \"best\" block, this API\n * gratiously handles the re-orgs and provides the deltas\n * based on the latest emission.\n * The observed value contains the following properties:\n * - `block`: the block in where the `deltas` took place -\n * `deltas`: `null` indicates that nothing has changed from\n * the latest emission.\n * If the value is not `null` then the `deleted` and `upsrted`\n * properties indicate the entries that have changed.\n * - `entries`: it's an immutable data-structure with the\n * latest entries.\n * @example\n *\n * typedApi.query.Staking.Nominators.watchEntries()\n * typedApi.query.Staking.Nominators.watchEntries({ at: \"best\" })\n *\n */\n watchEntries: (\n ...args: WithWatchOptions<PossibleParents<Args>>\n ) => Observable<{\n block: BlockInfo\n deltas: null | {\n deleted: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n upserted: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n }\n entries: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n }>\n\n getKey: GetKey<Args, Unsafe>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport type StorageEntry<\n Unsafe,\n D,\n Args extends Array<any>,\n ArgsOut extends Array<any>,\n Payload,\n> = Args extends []\n ? StorageEntryWithoutKeys<Unsafe, D, Payload>\n : StorageEntryWithKeys<Unsafe, D, Args, Payload, ArgsOut>\n\nexport type Storage$ = <Type extends StorageItemInput[\"type\"]>(\n hash: string | null,\n type: Type,\n key: string,\n childTrie: string | null,\n) => Observable<StorageResult<Type>>\n\nconst toMapped = map(<T>(x: { mapped: T }) => x.mapped)\nexport const createStorageEntry = (\n pallet: string,\n name: string,\n chainHead: ChainHead$,\n getWatchEntries: ReturnType<typeof createWatchEntries>,\n {\n isCompatible,\n getCompatibilityLevel,\n getCompatibilityLevels,\n descriptors: descriptorsPromise,\n argsAreCompatible,\n valuesAreCompatible,\n }: CompatibilityHelper,\n): StorageEntry<any, any, any, any, any> => {\n const isSystemNumber = pallet === \"System\" && name === \"Number\"\n const isBlockHash = pallet === \"System\" && name === \"BlockHash\"\n const sysNumberMapper$ = chainHead.runtime$.pipe(\n filter(Boolean),\n take(1),\n map(({ dynamicBuilder }) =>\n typeof dynamicBuilder\n .buildStorage(\"System\", \"Number\")\n .value.dec(new Uint8Array(32)) === \"bigint\"\n ? BigInt\n : identity,\n ),\n shareReplay(),\n )\n const bigIntOrNumber: OperatorFunction<number, number | bigint> = pipe(\n combineLatestWith(sysNumberMapper$),\n map(([input, mapper]) => mapper(input)),\n )\n\n const incompatibleError = () =>\n new Error(`Incompatible runtime entry Storage(${pallet}.${name})`)\n const invalidArgs = (args: Array<any>) =>\n new Error(`Invalid Arguments calling ${pallet}.${name}(${args})`)\n\n const getCodec = (ctx: RuntimeContext) => {\n try {\n return ctx.dynamicBuilder.buildStorage(pallet, name)\n } catch (e: any) {\n throw new Error(`Runtime entry Storage(${pallet}.${name}) not found`)\n }\n }\n\n const watchValue = (...args: Array<any>) => {\n const target = args[args.length - 1]\n const isBest = target === \"best\"\n const actualArgs =\n isBest || target === \"finalized\" ? args.slice(0, -1) : args\n\n return chainHead[isBest ? \"best$\" : \"finalized$\"].pipe(\n lossLessExhaustMap(() =>\n getRawValue$(...actualArgs, isBest ? { at: \"best\" } : {}),\n ),\n distinctUntilChanged((a, b) => a.raw === b.raw),\n toMapped,\n )\n }\n\n const getRawValue$ = (\n ...args: Array<any>\n ): Observable<{ raw: string | null; mapped: any }> => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { at: _at }: PullOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n const result$ = from(descriptorsPromise).pipe(\n mergeMap((descriptors) =>\n chainHead.storage$(\n at,\n \"value\",\n (ctx) => {\n const codecs = getCodec(ctx)\n const actualArgs =\n args.length === codecs.len ? args : args.slice(0, -1)\n if (args !== actualArgs && !isLastArgOptional)\n throw invalidArgs(args)\n if (!argsAreCompatible(descriptors, ctx, actualArgs))\n throw incompatibleError()\n return codecs.keys.enc(...actualArgs)\n },\n null,\n (data, ctx) => {\n const codecs = getCodec(ctx)\n const mapped =\n data === null ? codecs.fallback : codecs.value.dec(data)\n if (!valuesAreCompatible(descriptors, ctx, mapped))\n throw incompatibleError()\n return { raw: data, mapped }\n },\n ),\n ),\n chainHead.withHodl(at),\n )\n\n if (isSystemNumber)\n return chainHead.pinnedBlocks$.pipe(\n map((blocks) => {\n const hash =\n at === \"finalized\" || !at\n ? blocks.finalized\n : at === \"best\"\n ? blocks.best\n : at\n const block = blocks.blocks.get(hash)\n if (!block) {\n throw new BlockNotPinnedError(hash, \"System.Number\")\n }\n return block.number\n }),\n distinctUntilChanged(),\n bigIntOrNumber,\n map((mapped) => ({ raw: mapped.toString(), mapped })),\n catchError((e) => {\n if (e instanceof BlockNotPinnedError) return result$\n throw e\n }),\n )\n\n return isBlockHash && Number(args[0]) === 0\n ? chainHead.genesis$.pipe(\n map((raw) => ({ raw, mapped: FixedSizeBinary.fromHex(raw) })),\n )\n : result$\n }\n\n const getValue = async (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal }: PullOptions = isLastArgOptional ? lastArg : {}\n\n return firstValueFromWithSignal(\n getRawValue$(...args).pipe(toMapped),\n signal,\n )\n }\n\n const getEntries = async (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal, at: _at }: PullOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n const result$ = from(descriptorsPromise).pipe(\n mergeMap((descriptors) =>\n chainHead.storage$(\n at,\n \"descendantsValues\",\n (ctx) => {\n const codecs = getCodec(ctx)\n // TODO partial compatibility check for args that become optional\n if (\n minCompatLevel(getCompatibilityLevels(descriptors, ctx)) ===\n CompatibilityLevel.Incompatible\n )\n throw incompatibleError()\n\n if (args.length > codecs.len) throw invalidArgs(args)\n const actualArgs =\n args.length > 0 && isLastArgOptional ? args.slice(0, -1) : args\n if (args.length === codecs.len && actualArgs === args)\n throw invalidArgs(args)\n return codecs.keys.enc(...actualArgs)\n },\n null,\n (values, ctx) => {\n const codecs = getCodec(ctx)\n const decodedValues = values.map(({ key, value }) => ({\n keyArgs: codecs.keys.dec(key),\n value: codecs.value.dec(value),\n }))\n if (\n decodedValues.some(\n ({ value }) => !valuesAreCompatible(descriptors, ctx, value),\n )\n )\n throw incompatibleError()\n return decodedValues\n },\n ),\n ),\n chainHead.withHodl(at),\n )\n return firstValueFromWithSignal(result$, signal)\n }\n\n const getValues = (keyArgs: Array<Array<any>>, options?: PullOptions) =>\n Promise.all(\n keyArgs.map((args) => getValue(...(options ? [...args, options] : args))),\n )\n\n const watchEntries: any = (...args: Array<any>) => {\n const lastArg = args.at(-1)\n const isLastArgOptional = isOptionalArg(lastArg)\n\n return getWatchEntries(\n pallet,\n name,\n isLastArgOptional ? args.slice(0, -1) : args,\n isLastArgOptional && lastArg.at === \"best\",\n )\n }\n\n const getKey = (...args: Array<any>): Promise<string> | string => {\n const token = args.at(-1)\n if (token instanceof CompatibilityToken || token instanceof RuntimeToken) {\n const actualArgs = args.slice(0, -1)\n const ctx = getCompatibilityApi(token).runtime()\n if (!argsAreCompatible(token, ctx, actualArgs)) throw incompatibleError()\n return getCodec(ctx).keys.enc(...actualArgs)\n }\n return descriptorsPromise.then((x) => getKey(...args, x))\n }\n\n return {\n isCompatible,\n getCompatibilityLevel,\n getKey: getKey as GetKey<any, any>,\n getValue,\n getValues,\n getEntries,\n watchValue,\n watchEntries,\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storage.mjs","sources":["../../src/storage.ts"],"sourcesContent":["import {\n firstValueFromWithSignal,\n isOptionalArg,\n lossLessExhaustMap,\n} from \"@/utils\"\nimport { CompatibilityLevel } from \"@polkadot-api/metadata-compatibility\"\nimport {\n BlockInfo,\n BlockNotPinnedError,\n ChainHead$,\n RuntimeContext,\n} from \"@polkadot-api/observable-client\"\nimport { FixedSizeBinary, HexString } from \"@polkadot-api/substrate-bindings\"\nimport { StorageItemInput, StorageResult } from \"@polkadot-api/substrate-client\"\nimport {\n Observable,\n OperatorFunction,\n catchError,\n combineLatestWith,\n distinctUntilChanged,\n filter,\n from,\n identity,\n map,\n mergeMap,\n pipe,\n shareReplay,\n take,\n} from \"rxjs\"\nimport {\n CompatibilityFunctions,\n CompatibilityHelper,\n CompatibilityToken,\n getCompatibilityApi,\n minCompatLevel,\n RuntimeToken,\n} from \"./compatibility\"\nimport { createWatchEntries } from \"./watch-entries\"\nimport { PullOptions } from \"./types\"\n\ntype WithCallOptions<Args extends Array<any>> = [\n ...args: Args,\n options?: PullOptions,\n]\n\ntype WithWatchOptions<Args extends Array<any>> = [\n ...args: Args,\n options?: { at: \"best\" },\n]\n\ntype PossibleParents<A extends Array<any>> = A extends [...infer Left, any]\n ? Left | PossibleParents<Left>\n : ArrayPossibleParents<A>\n\ntype AllPermutations<A extends Array<any>> = PossibleParents<A> | A\n\n// Fixed-size arrays values can't be extracted one-by-one, so that's a specific case\ntype ArrayPossibleParents<\n A extends Array<any>,\n Count extends Array<any> = [],\n R = [],\n> = A extends Array<infer T> & { length: infer L }\n ? number extends L\n ? Array<T> // Case variable-size array it's an unknown amount of entries\n : L extends Count[\"length\"]\n ? R\n : ArrayPossibleParents<A, [...Count, T], R | Count>\n : never\n\ntype GetKey<Args extends Array<any>, Unsafe> = Unsafe extends true\n ? {\n /**\n * Get the storage-key for this storage entry.\n *\n * @param args All keys needed for that storage entry.\n * @returns Promise that will resolve the hexadecimal value of the\n * storage key.\n */\n (...args: AllPermutations<Args>): Promise<HexString>\n /**\n * Get the storage-key for this storage entry.\n *\n * @param ...args All keys needed for that storage entry.\n * @param runtimeToken Token from got with `await\n * typedApi.runtimeToken`\n * @returns Synchronously returns the hexadecimal value of the\n * storage key.\n */\n (\n ...args: [...AllPermutations<Args>, runtimeToken: RuntimeToken]\n ): HexString\n }\n : {\n /**\n * Get the storage-key for this storage entry.\n *\n * @param args All keys needed for that storage entry.\n * @returns Promise that will resolve the hexadecimal value of the\n * storage key.\n */\n (...args: AllPermutations<Args>): Promise<HexString>\n /**\n * Get the storage-key for this storage entry.\n *\n * @param ...args All keys needed for that storage entry.\n * @param compatibilityToken Token from got with `await\n * typedApi.compatibilityToken`\n * @returns Synchronously returns the hexadecimal value of the\n * storage key.\n */\n (\n ...args: [\n ...AllPermutations<Args>,\n compatibilityToken: CompatibilityToken,\n ]\n ): HexString\n }\n\ntype StorageEntryWithoutKeys<Unsafe, D, Payload> = {\n /**\n * Get `Payload` (Promise-based) for the storage entry.\n *\n * @param options Optionally set which block to target (latest known\n * finalized is the default) and an AbortSignal.\n */\n getValue: (options?: PullOptions) => Promise<Payload>\n /**\n * Watch changes in `Payload` (observable-based) for the storage entry.\n *\n * @param bestOrFinalized Optionally choose which block to query and watch\n * changes, `best` or `finalized` (default)\n */\n watchValue: (bestOrFinalized?: \"best\" | \"finalized\") => Observable<Payload>\n getKey: GetKey<[], Unsafe>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport type StorageEntryWithKeys<\n Unsafe,\n D,\n Args extends Array<any>,\n Payload,\n ArgsOut extends Array<any>,\n> = {\n /**\n * Get `Payload` (Promise-based) for the storage entry with a specific set of\n * `Args`.\n *\n * @param args All keys needed for that storage entry.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n */\n getValue: (...args: [...WithCallOptions<Args>]) => Promise<Payload>\n /**\n * Watch changes in `Payload` (observable-based) for the storage entry.\n *\n * @param args All keys needed for that storage entry.\n * At the end, optionally choose which block to query and\n * watch changes, `best` or `finalized` (default)\n */\n watchValue: (\n ...args: [...Args, bestOrFinalized?: \"best\" | \"finalized\"]\n ) => Observable<Payload>\n /**\n * Get an Array of `Payload` (Promise-based) for the storage entry with\n * several sets of `Args`.\n *\n * @param keys Array of sets of keys needed for the storage entry.\n * @param options Optionally set which block to target (latest known\n * finalized is the default) and an AbortSignal.\n */\n getValues: (\n keys: Array<[...Args]>,\n options?: PullOptions,\n ) => Promise<Array<Payload>>\n /**\n * Get an Array of `Payload` (Promise-based) for the storage entry with a\n * subset of `Args`.\n *\n * @param args Subset of keys needed for the storage entry.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n * @example\n *\n * // this is a query with 3 keys\n * typedApi.query.Pallet.Query.getEntries({ at: \"best\" }) // no keys\n * typedApi.query.Pallet.Query.getEntries(arg1, { at: \"finalized\" }) // 1/3 keys\n * typedApi.query.Pallet.Query.getEntries(arg1, arg2, { at: \"0x12345678\" }) // 2/3 keys\n *\n */\n getEntries: (\n ...args: WithCallOptions<PossibleParents<Args>>\n ) => Promise<Array<{ keyArgs: ArgsOut; value: NonNullable<Payload> }>>\n /**\n * Watch changes (Observable-based) for the storage entries with a subset of\n * `Args`.\n *\n * @param args Subset of keys needed for the storage entry.\n * At the end, optionally set whether to watch against the\n * `best` block.\n * By default watches changes against the finalized block.\n * When watching changes against the \"best\" block, this API\n * gratiously handles the re-orgs and provides the deltas\n * based on the latest emission.\n * The observed value contains the following properties:\n * - `block`: the block in where the `deltas` took place -\n * `deltas`: `null` indicates that nothing has changed from\n * the latest emission.\n * If the value is not `null` then the `deleted` and `upsrted`\n * properties indicate the entries that have changed.\n * - `entries`: it's an immutable data-structure with the\n * latest entries.\n * @example\n *\n * typedApi.query.Staking.Nominators.watchEntries()\n * typedApi.query.Staking.Nominators.watchEntries({ at: \"best\" })\n *\n */\n watchEntries: (\n ...args: WithWatchOptions<PossibleParents<Args>>\n ) => Observable<{\n block: BlockInfo\n deltas: null | {\n deleted: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n upserted: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n }\n entries: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n }>\n\n getKey: GetKey<Args, Unsafe>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport type StorageEntry<\n Unsafe,\n D,\n Args extends Array<any>,\n ArgsOut extends Array<any>,\n Payload,\n> = Args extends []\n ? StorageEntryWithoutKeys<Unsafe, D, Payload>\n : StorageEntryWithKeys<Unsafe, D, Args, Payload, ArgsOut>\n\nexport type Storage$ = <Type extends StorageItemInput[\"type\"]>(\n hash: string | null,\n type: Type,\n key: string,\n childTrie: string | null,\n) => Observable<StorageResult<Type>>\n\nconst toMapped = map(<T>(x: { mapped: T }) => x.mapped)\nexport const createStorageEntry = (\n pallet: string,\n name: string,\n chainHead: ChainHead$,\n getWatchEntries: ReturnType<typeof createWatchEntries>,\n {\n isCompatible,\n getCompatibilityLevel,\n getCompatibilityLevels,\n descriptors: descriptorsPromise,\n argsAreCompatible,\n storageKeysAreCompatible,\n valuesAreCompatible,\n }: CompatibilityHelper,\n): StorageEntry<any, any, any, any, any> => {\n const isSystemNumber = pallet === \"System\" && name === \"Number\"\n const isBlockHash = pallet === \"System\" && name === \"BlockHash\"\n const sysNumberMapper$ = chainHead.runtime$.pipe(\n filter(Boolean),\n take(1),\n map(({ dynamicBuilder }) =>\n typeof dynamicBuilder\n .buildStorage(\"System\", \"Number\")\n .value.dec(new Uint8Array(32)) === \"bigint\"\n ? BigInt\n : identity,\n ),\n shareReplay(),\n )\n const bigIntOrNumber: OperatorFunction<number, number | bigint> = pipe(\n combineLatestWith(sysNumberMapper$),\n map(([input, mapper]) => mapper(input)),\n )\n\n const incompatibleError = () =>\n new Error(`Incompatible runtime entry Storage(${pallet}.${name})`)\n const invalidArgs = (args: Array<any>) =>\n new Error(`Invalid Arguments calling ${pallet}.${name}(${args})`)\n\n const getCodec = (ctx: RuntimeContext) => {\n try {\n return ctx.dynamicBuilder.buildStorage(pallet, name)\n } catch (e: any) {\n throw new Error(`Runtime entry Storage(${pallet}.${name}) not found`)\n }\n }\n\n const watchValue = (...args: Array<any>) => {\n const target = args[args.length - 1]\n const isBest = target === \"best\"\n const actualArgs =\n isBest || target === \"finalized\" ? args.slice(0, -1) : args\n\n return chainHead[isBest ? \"best$\" : \"finalized$\"].pipe(\n lossLessExhaustMap(() =>\n getRawValue$(...actualArgs, isBest ? { at: \"best\" } : {}),\n ),\n distinctUntilChanged((a, b) => a.raw === b.raw),\n toMapped,\n )\n }\n\n const getRawValue$ = (\n ...args: Array<any>\n ): Observable<{ raw: string | null; mapped: any }> => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { at: _at }: PullOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n const result$ = from(descriptorsPromise).pipe(\n mergeMap((descriptors) =>\n chainHead.storage$(\n at,\n \"value\",\n (ctx) => {\n const codecs = getCodec(ctx)\n const actualArgs =\n args.length === codecs.len ? args : args.slice(0, -1)\n if (args !== actualArgs && !isLastArgOptional)\n throw invalidArgs(args)\n if (!storageKeysAreCompatible(ctx, actualArgs, codecs.len))\n throw incompatibleError()\n return codecs.keys.enc(...actualArgs)\n },\n null,\n (data, ctx) => {\n const codecs = getCodec(ctx)\n const mapped =\n data === null ? codecs.fallback : codecs.value.dec(data)\n if (data !== null && !valuesAreCompatible(descriptors, ctx, mapped))\n throw incompatibleError()\n return { raw: data, mapped }\n },\n ),\n ),\n chainHead.withHodl(at),\n )\n\n if (isSystemNumber)\n return chainHead.pinnedBlocks$.pipe(\n map((blocks) => {\n const hash =\n at === \"finalized\" || !at\n ? blocks.finalized\n : at === \"best\"\n ? blocks.best\n : at\n const block = blocks.blocks.get(hash)\n if (!block) {\n throw new BlockNotPinnedError(hash, \"System.Number\")\n }\n return block.number\n }),\n distinctUntilChanged(),\n bigIntOrNumber,\n map((mapped) => ({ raw: mapped.toString(), mapped })),\n catchError((e) => {\n if (e instanceof BlockNotPinnedError) return result$\n throw e\n }),\n )\n\n return isBlockHash && Number(args[0]) === 0\n ? chainHead.genesis$.pipe(\n map((raw) => ({ raw, mapped: FixedSizeBinary.fromHex(raw) })),\n )\n : result$\n }\n\n const getValue = async (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal }: PullOptions = isLastArgOptional ? lastArg : {}\n\n return firstValueFromWithSignal(\n getRawValue$(...args).pipe(toMapped),\n signal,\n )\n }\n\n const getEntries = async (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal, at: _at }: PullOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n const result$ = from(descriptorsPromise).pipe(\n mergeMap((descriptors) =>\n chainHead.storage$(\n at,\n \"descendantsValues\",\n (ctx) => {\n const codecs = getCodec(ctx)\n // TODO partial compatibility check for args that become optional\n if (\n minCompatLevel(getCompatibilityLevels(descriptors, ctx)) ===\n CompatibilityLevel.Incompatible\n )\n throw incompatibleError()\n\n if (args.length > codecs.len) throw invalidArgs(args)\n const actualArgs =\n args.length > 0 && isLastArgOptional ? args.slice(0, -1) : args\n if (args.length === codecs.len && actualArgs === args)\n throw invalidArgs(args)\n return codecs.keys.enc(...actualArgs)\n },\n null,\n (values, ctx) => {\n const codecs = getCodec(ctx)\n const decodedValues = values.map(({ key, value }) => ({\n keyArgs: codecs.keys.dec(key),\n value: codecs.value.dec(value),\n }))\n if (\n decodedValues.some(\n ({ value }) => !valuesAreCompatible(descriptors, ctx, value),\n )\n )\n throw incompatibleError()\n return decodedValues\n },\n ),\n ),\n chainHead.withHodl(at),\n )\n return firstValueFromWithSignal(result$, signal)\n }\n\n const getValues = (keyArgs: Array<Array<any>>, options?: PullOptions) =>\n Promise.all(\n keyArgs.map((args) => getValue(...(options ? [...args, options] : args))),\n )\n\n const watchEntries: any = (...args: Array<any>) => {\n const lastArg = args.at(-1)\n const isLastArgOptional = isOptionalArg(lastArg)\n\n return getWatchEntries(\n pallet,\n name,\n isLastArgOptional ? args.slice(0, -1) : args,\n isLastArgOptional && lastArg.at === \"best\",\n )\n }\n\n const getKey = (...args: Array<any>): Promise<string> | string => {\n const token = args.at(-1)\n if (token instanceof CompatibilityToken || token instanceof RuntimeToken) {\n const actualArgs = args.slice(0, -1)\n const ctx = getCompatibilityApi(token).runtime()\n if (!argsAreCompatible(token, ctx, actualArgs)) throw incompatibleError()\n return getCodec(ctx).keys.enc(...actualArgs)\n }\n return descriptorsPromise.then((x) => getKey(...args, x))\n }\n\n return {\n isCompatible,\n getCompatibilityLevel,\n getKey: getKey as GetKey<any, any>,\n getValue,\n getValues,\n getEntries,\n watchValue,\n watchEntries,\n }\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -172,6 +172,13 @@ const compatibilityHelper = (descriptors, getDescriptorEntryPoint, getRuntimeEnt
|
|
|
172
172
|
values
|
|
173
173
|
);
|
|
174
174
|
};
|
|
175
|
+
const storageKeysAreCompatible = (ctx, keys, nKeysDest) => {
|
|
176
|
+
const entryPoint = getRuntimeEntryPoint(ctx);
|
|
177
|
+
if (entryPoint == null) return false;
|
|
178
|
+
const getNode = (id) => getRuntimeTypedef(ctx, id);
|
|
179
|
+
const destNode = entryPoint.args.type === "lookup" ? getNode(entryPoint.args.value) : entryPoint.args.value;
|
|
180
|
+
return metadataCompatibility.isStorageKeyCompatible(keys, nKeysDest, destNode, getNode);
|
|
181
|
+
};
|
|
175
182
|
return {
|
|
176
183
|
isCompatible,
|
|
177
184
|
getCompatibilityLevel,
|
|
@@ -181,7 +188,8 @@ const compatibilityHelper = (descriptors, getDescriptorEntryPoint, getRuntimeEnt
|
|
|
181
188
|
compatibleRuntime$,
|
|
182
189
|
argsAreCompatible,
|
|
183
190
|
valuesAreCompatible,
|
|
184
|
-
getRuntimeTypedef
|
|
191
|
+
getRuntimeTypedef,
|
|
192
|
+
storageKeysAreCompatible
|
|
185
193
|
};
|
|
186
194
|
};
|
|
187
195
|
const minCompatLevel = (levels) => Math.min(levels.args, levels.values);
|
|
@@ -448,6 +456,7 @@ const createStorageEntry = (pallet, name, chainHead, getWatchEntries, {
|
|
|
448
456
|
getCompatibilityLevels,
|
|
449
457
|
descriptors: descriptorsPromise,
|
|
450
458
|
argsAreCompatible,
|
|
459
|
+
storageKeysAreCompatible,
|
|
451
460
|
valuesAreCompatible
|
|
452
461
|
}) => {
|
|
453
462
|
const isSystemNumber = pallet === "System" && name === "Number";
|
|
@@ -500,7 +509,7 @@ const createStorageEntry = (pallet, name, chainHead, getWatchEntries, {
|
|
|
500
509
|
const actualArgs = args.length === codecs.len ? args : args.slice(0, -1);
|
|
501
510
|
if (args !== actualArgs && !isLastArgOptional)
|
|
502
511
|
throw invalidArgs(args);
|
|
503
|
-
if (!
|
|
512
|
+
if (!storageKeysAreCompatible(ctx, actualArgs, codecs.len))
|
|
504
513
|
throw incompatibleError();
|
|
505
514
|
return codecs.keys.enc(...actualArgs);
|
|
506
515
|
},
|
|
@@ -508,7 +517,7 @@ const createStorageEntry = (pallet, name, chainHead, getWatchEntries, {
|
|
|
508
517
|
(data, ctx) => {
|
|
509
518
|
const codecs = getCodec(ctx);
|
|
510
519
|
const mapped = data === null ? codecs.fallback : codecs.value.dec(data);
|
|
511
|
-
if (!valuesAreCompatible(descriptors, ctx, mapped))
|
|
520
|
+
if (data !== null && !valuesAreCompatible(descriptors, ctx, mapped))
|
|
512
521
|
throw incompatibleError();
|
|
513
522
|
return { raw: data, mapped };
|
|
514
523
|
}
|
|
@@ -1639,9 +1648,10 @@ const createApi = (compatibilityToken, chainHead, broadcast$) => {
|
|
|
1639
1648
|
compatibilityHelper(
|
|
1640
1649
|
compatibilityToken,
|
|
1641
1650
|
(r) => r.getEntryPoint(OpType.Api, api, method),
|
|
1642
|
-
(ctx) =>
|
|
1643
|
-
ctx.lookup.metadata.apis.find((a) => a.name === api)
|
|
1644
|
-
|
|
1651
|
+
(ctx) => {
|
|
1652
|
+
const item = ctx.lookup.metadata.apis.find((a) => a.name === api)?.methods.find((m) => m.name === method);
|
|
1653
|
+
return item == null ? null : metadataCompatibility.runtimeCallEntryPoint(item);
|
|
1654
|
+
}
|
|
1645
1655
|
)
|
|
1646
1656
|
)
|
|
1647
1657
|
);
|
|
@@ -1653,9 +1663,10 @@ const createApi = (compatibilityToken, chainHead, broadcast$) => {
|
|
|
1653
1663
|
compatibilityHelper(
|
|
1654
1664
|
compatibilityToken,
|
|
1655
1665
|
(r) => r.getEntryPoint(OpType.ViewFns, pallet, entry),
|
|
1656
|
-
(ctx) =>
|
|
1657
|
-
ctx.lookup.metadata.pallets.find((a) => a.name === pallet)
|
|
1658
|
-
|
|
1666
|
+
(ctx) => {
|
|
1667
|
+
const item = ctx.lookup.metadata.pallets.find((a) => a.name === pallet)?.viewFns.find((m) => m.name === entry);
|
|
1668
|
+
return item == null ? null : metadataCompatibility.runtimeCallEntryPoint(item);
|
|
1669
|
+
}
|
|
1659
1670
|
)
|
|
1660
1671
|
)
|
|
1661
1672
|
);
|