polkadot-api 1.23.1 → 1.23.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.mjs +1 -1
- package/dist/esm/client.mjs +19 -16
- package/dist/esm/client.mjs.map +1 -1
- package/dist/esm/tx/signed-extensions/charge-asset-tx-enc.mjs +1 -1
- package/dist/esm/tx/signed-extensions/sign-extensions.mjs +1 -1
- package/dist/esm/tx/signed-extensions/sign-extensions.mjs.map +1 -1
- package/dist/esm/tx/submit-fns.mjs +1 -1
- package/dist/esm/tx/tx.mjs +3 -3
- package/dist/esm/utils/self-dependent.mjs +1 -1
- package/dist/esm/watch-entries.mjs +13 -20
- package/dist/esm/watch-entries.mjs.map +1 -1
- package/dist/index.js +32 -36
- 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 +15 -15
package/bin/cli.mjs
CHANGED
package/dist/esm/client.mjs
CHANGED
|
@@ -216,14 +216,8 @@ function createClient(provider, { getMetadata, setMetadata } = {}) {
|
|
|
216
216
|
)
|
|
217
217
|
};
|
|
218
218
|
const _request = rawClient.request;
|
|
219
|
-
let
|
|
220
|
-
const
|
|
221
|
-
const getChainToken = (chainDefinition) => {
|
|
222
|
-
const result2 = compatibilityToken.get(chainDefinition) || createCompatibilityToken(chainDefinition, chainHead);
|
|
223
|
-
compatibilityToken.set(chainDefinition, result2);
|
|
224
|
-
return result2;
|
|
225
|
-
};
|
|
226
|
-
const getRuntimeToken = () => runtimeToken ?? (runtimeToken = createRuntimeToken(chainHead));
|
|
219
|
+
let unsafeApi;
|
|
220
|
+
const typedApis = /* @__PURE__ */ new WeakMap();
|
|
227
221
|
const { broadcastTx$ } = client;
|
|
228
222
|
const getMetadata$ = (at) => chainHead.getRuntimeContext$(at).pipe(map((ctx) => ctx.metadataRaw));
|
|
229
223
|
const result = {
|
|
@@ -242,17 +236,26 @@ function createClient(provider, { getMetadata, setMetadata } = {}) {
|
|
|
242
236
|
submit: (...args) => submit(chainHead, broadcastTx$, ...args),
|
|
243
237
|
submitAndWatch: (tx) => submit$(chainHead, broadcastTx$, tx),
|
|
244
238
|
getTypedApi: (chainDefinition) => {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
239
|
+
if (typedApis.has(chainDefinition)) return typedApis.get(chainDefinition);
|
|
240
|
+
const compatibilityToken = createCompatibilityToken(
|
|
241
|
+
chainDefinition,
|
|
242
|
+
chainHead
|
|
243
|
+
);
|
|
244
|
+
const api = Object.assign(
|
|
245
|
+
createApi(compatibilityToken, chainHead, broadcastTx$),
|
|
246
|
+
{ compatibilityToken }
|
|
249
247
|
);
|
|
248
|
+
typedApis.set(chainDefinition, api);
|
|
249
|
+
return api;
|
|
250
250
|
},
|
|
251
251
|
getUnsafeApi: () => {
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
252
|
+
if (unsafeApi) return unsafeApi;
|
|
253
|
+
const runtimeToken = createRuntimeToken(chainHead);
|
|
254
|
+
unsafeApi = Object.assign(
|
|
255
|
+
createApi(runtimeToken, chainHead, broadcastTx$),
|
|
256
|
+
{ runtimeToken }
|
|
257
|
+
);
|
|
258
|
+
return unsafeApi;
|
|
256
259
|
},
|
|
257
260
|
rawQuery: (key, { at, signal } = {}) => firstValueFromWithSignal(
|
|
258
261
|
chainHead.storage$(at ?? null, "value", () => {
|
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\n const query = createProxyPath((pallet, name) =>\n createStorageEntry(\n pallet,\n name,\n chainHead,\n getWatchEntries,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Storage, pallet, name),\n // TODO this is way sub-optimal. Needs some rethought - maybe a builder for entry points?.\n (ctx) => {\n const item = getPallet(ctx, pallet)?.storage?.items.find(\n (s) => s.name === name,\n )\n return item == null ? null : storageEntryPoint(item)\n },\n ),\n ),\n )\n\n const getEnumEntry = (\n ctx: RuntimeContext,\n side: \"args\" | \"values\",\n id: number | undefined,\n name: string,\n ) => {\n if (id == null) return null\n const entry = ctx.lookup(id)\n if (entry.type !== \"enum\") throw new Error(\"Expected enum\")\n\n if (entry.value[name] == null) return null\n const node = enumValueEntryPointNode(entry.value[name])\n return {\n args: side === \"args\" ? node : voidEntryPointNode,\n values: side === \"args\" ? voidEntryPointNode : node,\n }\n }\n const tx = createProxyPath((pallet, name) =>\n createTxEntry(\n pallet,\n name,\n chainHead,\n broadcast$,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Tx, pallet, name),\n (ctx) =>\n getEnumEntry(ctx, \"args\", getPallet(ctx, pallet)?.calls?.type, name),\n ),\n true,\n ),\n )\n\n const event = createProxyPath((pallet, name) =>\n createEventEntry(\n pallet,\n name,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Event, pallet, name),\n (ctx) =>\n getEnumEntry(\n ctx,\n \"values\",\n getPallet(ctx, pallet)?.events?.type,\n name,\n ),\n ),\n ),\n )\n\n const constants = createProxyPath((pallet, name) =>\n createConstantEntry(\n pallet,\n name,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Const, pallet, name),\n (ctx) => {\n const item = getPallet(ctx, pallet)?.constants.find(\n (c) => c.name === name,\n )?.type\n return item == null ? null : singleValueEntryPoint(item)\n },\n ),\n ),\n )\n\n const apis = createProxyPath((api, method) =>\n createRuntimeCallEntry(\n api,\n method,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Api, api, method),\n (ctx) => {\n const item = ctx.lookup.metadata.apis\n .find((a) => a.name === api)\n ?.methods.find((m) => m.name === method)\n return item == null ? null : runtimeCallEntryPoint(item)\n },\n ),\n ),\n )\n const view = createProxyPath((pallet, entry) =>\n createViewFnEntry(\n pallet,\n entry,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.ViewFns, pallet, entry),\n (ctx) => {\n const item = ctx.lookup.metadata.pallets\n .find((a) => a.name === pallet)\n ?.viewFns.find((m) => m.name === entry)\n return item == null ? null : runtimeCallEntryPoint(item)\n },\n ),\n ),\n )\n\n const _callDataTx = (\n callData: Binary,\n token: CompatibilityToken | RuntimeToken,\n ) => {\n const { lookup, dynamicBuilder } = getCompatibilityApi(token).runtime()\n try {\n const decoded = dynamicBuilder\n .buildDefinition(lookup.call!)\n .dec(callData.asBytes())\n const pallet = decoded.type\n const call = decoded.value.type\n const args = decoded.value.value\n\n return createTxEntry(\n pallet,\n call,\n chainHead,\n broadcast$,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Tx, pallet, call),\n (ctx) =>\n getEnumEntry(\n ctx,\n \"args\",\n getPallet(ctx, pallet)?.calls?.type,\n call,\n ),\n ),\n false,\n )(args)\n } catch {\n throw new Error(\"createTx: invalid call data\")\n }\n }\n\n return {\n query,\n txFromCallData: (\n callData: Binary,\n token?: CompatibilityToken | RuntimeToken,\n ) =>\n token\n ? _callDataTx(callData, token)\n : compatibilityToken.then((t) => _callDataTx(callData, t)),\n tx,\n event,\n apis,\n constants,\n view,\n } as any\n}\n\nexport type CreateClientOptions = Partial<{\n getMetadata: (codeHash: HexString) => Promise<Uint8Array | null>\n setMetadata: (codeHash: HexString, metadata: Uint8Array) => void\n}>\n\n/**\n * This is the top-level export for `polkadot-api`.\n *\n * @param provider A `JsonRpcProvider` compliant with the [JSON-RPC\n * spec](https://paritytech.github.io/json-rpc-interface-spec/),\n * which must support the `chainHead`, `transaction` and\n * `chainSpec` groups.\n * @param options - *(Optional)* An object that allows customization of\n * metadata handling.\n * You can supply functions to retrieve and/or persist the\n * metadata associated with runtime `codeHash` values:\n *\n * - `getMetadata`: A function that, given a `codeHash` (the\n * `:code:` hash),\n * returns a `Promise` resolving to a `Uint8Array`\n * representing the metadata,\n * or `null` if unavailable.\n * - `setMetadata`: A function that accepts a `codeHash` and\n * its associated `Uint8Array` metadata,\n * allowing you to persist the metadata (e.g., in a cache or\n * local store).\n * @example\n *\n * import { getMetadata } from \"@polkadot-api/descriptors\"\n * import { createClient } from \"polkadot-api\"\n * import { getSmProvider } from \"polkadot-api/sm-provider\"\n * import { chainSpec } from \"polkadot-api/chains/polkadot\"\n * import { start } from \"polkadot-api/smoldot\"\n *\n * const smoldot = start()\n * const chain = await smoldot.addChain({ chainSpec })\n *\n * // Connect to the polkadot relay chain.\n * const client = createClient(getSmProvider(chain), { getMetadata })\n *\n */\nexport function createClient(\n provider: JsonRpcProvider,\n { getMetadata, setMetadata }: CreateClientOptions = {},\n): PolkadotClient {\n const rawClient: SubstrateClient = createRawClient(provider)\n const client = getObservableClient(rawClient, {\n getMetadata: getMetadata\n ? (codeHash: string) => from(getMetadata(codeHash))\n : undefined,\n setMetadata,\n })\n const { getChainSpecData } = rawClient\n\n const { genesis$, ..._chainHead } = client.chainHead$()\n const archive = client.archive(_chainHead.getRuntime$)\n const chainHead: ChainHead$ = {\n ..._chainHead,\n genesis$: defer(getChainSpecData).pipe(\n map(({ genesisHash }) => genesisHash),\n catchError(() => genesis$),\n shareReplay(1),\n ),\n storage$: withArchive(_chainHead.storage$, archive.storage$),\n body$: withArchive(_chainHead.body$, archive.body$),\n call$: withArchive(_chainHead.call$, archive.call$),\n header$: withArchive(_chainHead.header$, archive.header$),\n eventsAt$: withArchive(_chainHead.eventsAt$, archive.eventsAt$),\n storageQueries$: withArchive(\n _chainHead.storageQueries$,\n archive.storageQueries$,\n ),\n getRuntimeContext$: withArchive(\n _chainHead.getRuntimeContext$,\n archive.getRuntimeContext$,\n ),\n }\n\n const _request: <Reply = any, Params extends Array<any> = any[]>(\n method: string,\n params: Params,\n ) => Promise<Reply> = rawClient.request\n\n let runtimeToken: Promise<RuntimeToken>\n const compatibilityToken = new WeakMap<\n ChainDefinition,\n Promise<CompatibilityToken<any>>\n >()\n const getChainToken = (chainDefinition: ChainDefinition) => {\n const result =\n compatibilityToken.get(chainDefinition) ||\n createCompatibilityToken(chainDefinition, chainHead)\n compatibilityToken.set(chainDefinition, result)\n return result\n }\n const getRuntimeToken = <D>(): Promise<RuntimeToken<D>> =>\n (runtimeToken ??= createRuntimeToken(chainHead))\n const { broadcastTx$ } = client\n\n const getMetadata$ = (at: HexString) =>\n chainHead.getRuntimeContext$(at).pipe(map((ctx) => ctx.metadataRaw))\n\n const result: PolkadotClient = {\n getChainSpecData,\n\n getMetadata$,\n getMetadata: (atBlock: HexString, signal?: AbortSignal) =>\n firstValueFromWithSignal(getMetadata$(atBlock), signal),\n\n blocks$: chainHead.newBlocks$,\n hodlBlock: (block: HexString) => chainHead.holdBlock(block, true),\n\n finalizedBlock$: chainHead.finalized$,\n getFinalizedBlock: () => firstValueFrom(chainHead.finalized$),\n\n bestBlocks$: chainHead.bestBlocks$,\n getBestBlocks: () => firstValueFrom(chainHead.bestBlocks$),\n\n watchBlockBody: chainHead.body$,\n getBlockBody: (hash: string) => firstValueFrom(chainHead.body$(hash)),\n\n getBlockHeader: (hash?: string) =>\n firstValueFrom(chainHead.header$(hash ?? null)),\n\n submit: (...args) => submit(chainHead, broadcastTx$, ...args),\n submitAndWatch: (tx) => submit$(chainHead, broadcastTx$, tx),\n\n getTypedApi: <D extends ChainDefinition>(chainDefinition: D) => {\n const token = getChainToken(chainDefinition)\n return Object.assign(\n createApi<false, D>(token, chainHead, broadcastTx$),\n { compatibilityToken: token },\n )\n },\n\n getUnsafeApi: <D>() => {\n const token = getRuntimeToken()\n return Object.assign(createApi<true, D>(token, chainHead, broadcastTx$), {\n runtimeToken: token,\n })\n },\n\n rawQuery: (key, { at, signal } = {}) =>\n firstValueFromWithSignal(\n chainHead.storage$(at ?? null, \"value\", () => {\n const hex = key.match(HEX_REGEX)?.[1]\n return hex ? `0x${hex}` : Binary.fromText(key).asHex()\n }),\n signal,\n ),\n\n destroy: () => {\n chainHead.unfollow()\n client.destroy()\n },\n\n _request,\n }\n\n ;(result as any).___INTERNAL_DO_NOT_USE = chainHead\n\n return result\n}\n"],"names":["createRawClient","result"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.mjs","sources":["../../src/client.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport {\n enumValueEntryPointNode,\n runtimeCallEntryPoint,\n singleValueEntryPoint,\n storageEntryPoint,\n voidEntryPointNode,\n} from \"@polkadot-api/metadata-compatibility\"\nimport {\n ChainHead$,\n RuntimeContext,\n getObservableClient,\n withArchive,\n} from \"@polkadot-api/observable-client\"\nimport { Binary, HexString } from \"@polkadot-api/substrate-bindings\"\nimport {\n SubstrateClient,\n createClient as createRawClient,\n} from \"@polkadot-api/substrate-client\"\nimport {\n Observable,\n catchError,\n defer,\n firstValueFrom,\n from,\n map,\n shareReplay,\n} from \"rxjs\"\nimport {\n CompatibilityToken,\n OpType,\n RuntimeToken,\n compatibilityHelper,\n createCompatibilityToken,\n createRuntimeToken,\n getCompatibilityApi,\n} from \"./compatibility\"\nimport { createConstantEntry } from \"./constants\"\nimport { ChainDefinition } from \"./descriptors\"\nimport { createEventEntry } from \"./event\"\nimport { createRuntimeCallEntry } from \"./runtime-call\"\nimport { createStorageEntry } from \"./storage\"\nimport { createTxEntry, submit, submit$ } from \"./tx\"\nimport type { AnyApi, PolkadotClient, TypedApi, UnsafeApi } from \"./types\"\nimport { createWatchEntries } from \"./watch-entries\"\nimport { createViewFnEntry } from \"./viewFns\"\nimport { firstValueFromWithSignal } from \"./utils\"\n\nconst HEX_REGEX = /^(?:0x)?((?:[0-9a-fA-F][0-9a-fA-F])+)$/\n\nconst createApi = <Unsafe extends true | false, D>(\n compatibilityToken: Promise<CompatibilityToken | RuntimeToken>,\n chainHead: ChainHead$,\n broadcast$: (tx: string) => Observable<never>,\n): AnyApi<Unsafe, D> => {\n const target = {}\n const createProxy = (propCall: (prop: string) => unknown) =>\n new Proxy(target, {\n get(_, prop) {\n return propCall(prop as string)\n },\n })\n const createProxyPath = <T>(pathCall: (a: string, b: string) => T) => {\n const cache: Record<string, Record<string, T>> = {}\n return createProxy((a) => {\n if (!cache[a]) cache[a] = {}\n return createProxy((b) => {\n if (!cache[a][b]) cache[a][b] = pathCall(a, b)\n return cache[a][b]\n })\n }) as Record<string, Record<string, T>>\n }\n\n const getPallet = (ctx: RuntimeContext, name: string) =>\n ctx.lookup.metadata.pallets.find((p) => p.name === name)\n\n const getWatchEntries = createWatchEntries(\n chainHead.pinnedBlocks$,\n chainHead.storage$,\n chainHead.withRuntime,\n )\n\n const query = createProxyPath((pallet, name) =>\n createStorageEntry(\n pallet,\n name,\n chainHead,\n getWatchEntries,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Storage, pallet, name),\n // TODO this is way sub-optimal. Needs some rethought - maybe a builder for entry points?.\n (ctx) => {\n const item = getPallet(ctx, pallet)?.storage?.items.find(\n (s) => s.name === name,\n )\n return item == null ? null : storageEntryPoint(item)\n },\n ),\n ),\n )\n\n const getEnumEntry = (\n ctx: RuntimeContext,\n side: \"args\" | \"values\",\n id: number | undefined,\n name: string,\n ) => {\n if (id == null) return null\n const entry = ctx.lookup(id)\n if (entry.type !== \"enum\") throw new Error(\"Expected enum\")\n\n if (entry.value[name] == null) return null\n const node = enumValueEntryPointNode(entry.value[name])\n return {\n args: side === \"args\" ? node : voidEntryPointNode,\n values: side === \"args\" ? voidEntryPointNode : node,\n }\n }\n const tx = createProxyPath((pallet, name) =>\n createTxEntry(\n pallet,\n name,\n chainHead,\n broadcast$,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Tx, pallet, name),\n (ctx) =>\n getEnumEntry(ctx, \"args\", getPallet(ctx, pallet)?.calls?.type, name),\n ),\n true,\n ),\n )\n\n const event = createProxyPath((pallet, name) =>\n createEventEntry(\n pallet,\n name,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Event, pallet, name),\n (ctx) =>\n getEnumEntry(\n ctx,\n \"values\",\n getPallet(ctx, pallet)?.events?.type,\n name,\n ),\n ),\n ),\n )\n\n const constants = createProxyPath((pallet, name) =>\n createConstantEntry(\n pallet,\n name,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Const, pallet, name),\n (ctx) => {\n const item = getPallet(ctx, pallet)?.constants.find(\n (c) => c.name === name,\n )?.type\n return item == null ? null : singleValueEntryPoint(item)\n },\n ),\n ),\n )\n\n const apis = createProxyPath((api, method) =>\n createRuntimeCallEntry(\n api,\n method,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Api, api, method),\n (ctx) => {\n const item = ctx.lookup.metadata.apis\n .find((a) => a.name === api)\n ?.methods.find((m) => m.name === method)\n return item == null ? null : runtimeCallEntryPoint(item)\n },\n ),\n ),\n )\n const view = createProxyPath((pallet, entry) =>\n createViewFnEntry(\n pallet,\n entry,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.ViewFns, pallet, entry),\n (ctx) => {\n const item = ctx.lookup.metadata.pallets\n .find((a) => a.name === pallet)\n ?.viewFns.find((m) => m.name === entry)\n return item == null ? null : runtimeCallEntryPoint(item)\n },\n ),\n ),\n )\n\n const _callDataTx = (\n callData: Binary,\n token: CompatibilityToken | RuntimeToken,\n ) => {\n const { lookup, dynamicBuilder } = getCompatibilityApi(token).runtime()\n try {\n const decoded = dynamicBuilder\n .buildDefinition(lookup.call!)\n .dec(callData.asBytes())\n const pallet = decoded.type\n const call = decoded.value.type\n const args = decoded.value.value\n\n return createTxEntry(\n pallet,\n call,\n chainHead,\n broadcast$,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getEntryPoint(OpType.Tx, pallet, call),\n (ctx) =>\n getEnumEntry(\n ctx,\n \"args\",\n getPallet(ctx, pallet)?.calls?.type,\n call,\n ),\n ),\n false,\n )(args)\n } catch {\n throw new Error(\"createTx: invalid call data\")\n }\n }\n\n return {\n query,\n txFromCallData: (\n callData: Binary,\n token?: CompatibilityToken | RuntimeToken,\n ) =>\n token\n ? _callDataTx(callData, token)\n : compatibilityToken.then((t) => _callDataTx(callData, t)),\n tx,\n event,\n apis,\n constants,\n view,\n } as any\n}\n\nexport type CreateClientOptions = Partial<{\n getMetadata: (codeHash: HexString) => Promise<Uint8Array | null>\n setMetadata: (codeHash: HexString, metadata: Uint8Array) => void\n}>\n\n/**\n * This is the top-level export for `polkadot-api`.\n *\n * @param provider A `JsonRpcProvider` compliant with the [JSON-RPC\n * spec](https://paritytech.github.io/json-rpc-interface-spec/),\n * which must support the `chainHead`, `transaction` and\n * `chainSpec` groups.\n * @param options - *(Optional)* An object that allows customization of\n * metadata handling.\n * You can supply functions to retrieve and/or persist the\n * metadata associated with runtime `codeHash` values:\n *\n * - `getMetadata`: A function that, given a `codeHash` (the\n * `:code:` hash),\n * returns a `Promise` resolving to a `Uint8Array`\n * representing the metadata,\n * or `null` if unavailable.\n * - `setMetadata`: A function that accepts a `codeHash` and\n * its associated `Uint8Array` metadata,\n * allowing you to persist the metadata (e.g., in a cache or\n * local store).\n * @example\n *\n * import { getMetadata } from \"@polkadot-api/descriptors\"\n * import { createClient } from \"polkadot-api\"\n * import { getSmProvider } from \"polkadot-api/sm-provider\"\n * import { chainSpec } from \"polkadot-api/chains/polkadot\"\n * import { start } from \"polkadot-api/smoldot\"\n *\n * const smoldot = start()\n * const chain = await smoldot.addChain({ chainSpec })\n *\n * // Connect to the polkadot relay chain.\n * const client = createClient(getSmProvider(chain), { getMetadata })\n *\n */\nexport function createClient(\n provider: JsonRpcProvider,\n { getMetadata, setMetadata }: CreateClientOptions = {},\n): PolkadotClient {\n const rawClient: SubstrateClient = createRawClient(provider)\n const client = getObservableClient(rawClient, {\n getMetadata: getMetadata\n ? (codeHash: string) => from(getMetadata(codeHash))\n : undefined,\n setMetadata,\n })\n const { getChainSpecData } = rawClient\n\n const { genesis$, ..._chainHead } = client.chainHead$()\n const archive = client.archive(_chainHead.getRuntime$)\n const chainHead: ChainHead$ = {\n ..._chainHead,\n genesis$: defer(getChainSpecData).pipe(\n map(({ genesisHash }) => genesisHash),\n catchError(() => genesis$),\n shareReplay(1),\n ),\n storage$: withArchive(_chainHead.storage$, archive.storage$),\n body$: withArchive(_chainHead.body$, archive.body$),\n call$: withArchive(_chainHead.call$, archive.call$),\n header$: withArchive(_chainHead.header$, archive.header$),\n eventsAt$: withArchive(_chainHead.eventsAt$, archive.eventsAt$),\n storageQueries$: withArchive(\n _chainHead.storageQueries$,\n archive.storageQueries$,\n ),\n getRuntimeContext$: withArchive(\n _chainHead.getRuntimeContext$,\n archive.getRuntimeContext$,\n ),\n }\n\n const _request: <Reply = any, Params extends Array<any> = any[]>(\n method: string,\n params: Params,\n ) => Promise<Reply> = rawClient.request\n\n let unsafeApi: UnsafeApi<any>\n const typedApis = new WeakMap<ChainDefinition, TypedApi<any>>()\n\n const { broadcastTx$ } = client\n\n const getMetadata$ = (at: HexString) =>\n chainHead.getRuntimeContext$(at).pipe(map((ctx) => ctx.metadataRaw))\n\n const result: PolkadotClient = {\n getChainSpecData,\n\n getMetadata$,\n getMetadata: (atBlock: HexString, signal?: AbortSignal) =>\n firstValueFromWithSignal(getMetadata$(atBlock), signal),\n\n blocks$: chainHead.newBlocks$,\n hodlBlock: (block: HexString) => chainHead.holdBlock(block, true),\n\n finalizedBlock$: chainHead.finalized$,\n getFinalizedBlock: () => firstValueFrom(chainHead.finalized$),\n\n bestBlocks$: chainHead.bestBlocks$,\n getBestBlocks: () => firstValueFrom(chainHead.bestBlocks$),\n\n watchBlockBody: chainHead.body$,\n getBlockBody: (hash: string) => firstValueFrom(chainHead.body$(hash)),\n\n getBlockHeader: (hash?: string) =>\n firstValueFrom(chainHead.header$(hash ?? null)),\n\n submit: (...args) => submit(chainHead, broadcastTx$, ...args),\n submitAndWatch: (tx) => submit$(chainHead, broadcastTx$, tx),\n\n getTypedApi: <D extends ChainDefinition>(chainDefinition: D) => {\n if (typedApis.has(chainDefinition)) return typedApis.get(chainDefinition)!\n const compatibilityToken = createCompatibilityToken(\n chainDefinition,\n chainHead,\n )\n const api = Object.assign(\n createApi<false, D>(compatibilityToken, chainHead, broadcastTx$),\n { compatibilityToken },\n )\n typedApis.set(chainDefinition, api)\n return api as any\n },\n\n getUnsafeApi: <D>() => {\n if (unsafeApi) return unsafeApi\n const runtimeToken = createRuntimeToken(chainHead)\n unsafeApi = Object.assign(\n createApi<true, D>(runtimeToken, chainHead, broadcastTx$),\n { runtimeToken },\n )\n return unsafeApi as any\n },\n\n rawQuery: (key, { at, signal } = {}) =>\n firstValueFromWithSignal(\n chainHead.storage$(at ?? null, \"value\", () => {\n const hex = key.match(HEX_REGEX)?.[1]\n return hex ? `0x${hex}` : Binary.fromText(key).asHex()\n }),\n signal,\n ),\n\n destroy: () => {\n chainHead.unfollow()\n client.destroy()\n },\n\n _request,\n }\n\n ;(result as any).___INTERNAL_DO_NOT_USE = chainHead\n\n return result\n}\n"],"names":["createRawClient"],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ const both = (value2, additionalSigned2) => ({
|
|
|
19
19
|
});
|
|
20
20
|
const getSignExtensionsCreator = (genesis, lookupFn, dynamicBuilder) => {
|
|
21
21
|
const signedExtensionsEncoders = {};
|
|
22
|
-
lookupFn.metadata.extrinsic.signedExtensions.forEach(
|
|
22
|
+
lookupFn.metadata.extrinsic.signedExtensions[0].forEach(
|
|
23
23
|
({ identifier, type, additionalSigned: additionalSigned2 }) => {
|
|
24
24
|
signedExtensionsEncoders[identifier] = [type, additionalSigned2].map(
|
|
25
25
|
(x) => dynamicBuilder.buildDefinition(x)[0]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sign-extensions.mjs","sources":["../../../../src/tx/signed-extensions/sign-extensions.ts"],"sourcesContent":["import {\n getDynamicBuilder,\n MetadataLookup,\n} from \"@polkadot-api/metadata-builders\"\nimport { Encoder } from \"@polkadot-api/substrate-bindings\"\nimport { OfflineTxExtensions } from \"../types\"\nimport { fromHex, mapObject } from \"@polkadot-api/utils\"\nimport { getSystemVersionStruct } from \"./system-version\"\nimport { mortal } from \"./mortal-enc\"\nimport { ChargeAssetTxPaymentEnc } from \"./charge-asset-tx-enc\"\n\nconst empty = new Uint8Array()\nconst zero = Uint8Array.from([0])\ntype DynamicBuilder = ReturnType<typeof getDynamicBuilder>\n\nconst value = (value: Uint8Array) => ({\n value,\n additionalSigned: empty,\n})\nconst additionalSigned = (additionalSigned: Uint8Array) => ({\n value: empty,\n additionalSigned,\n})\nconst both = (value: Uint8Array, additionalSigned: Uint8Array) => ({\n value,\n additionalSigned,\n})\n\nexport const getSignExtensionsCreator = (\n genesis: Uint8Array,\n lookupFn: MetadataLookup,\n dynamicBuilder: DynamicBuilder,\n) => {\n const signedExtensionsEncoders: Record<string, [Encoder<any>, Encoder<any>]> =\n {}\n lookupFn.metadata.extrinsic.signedExtensions.forEach(\n ({ identifier, type, additionalSigned }) => {\n signedExtensionsEncoders[identifier] = [type, additionalSigned].map(\n (x) => dynamicBuilder.buildDefinition(x)[0],\n ) as [Encoder<any>, Encoder<any>]\n },\n )\n\n return <Asset>({\n mortality,\n tip = 0n,\n nonce,\n customSignedExtensions = {},\n ...rest\n }: OfflineTxExtensions<Asset>): Record<\n string,\n { identifier: string; value: Uint8Array; additionalSigned: Uint8Array }\n > => {\n const invalidKeys: string[] = []\n const systemVersion = getSystemVersionStruct(lookupFn, dynamicBuilder)\n const getFromCustomEntry = (key: string) => {\n const [valueEnc, additionalEnc] = signedExtensionsEncoders[key]\n const customEntry = customSignedExtensions[key] as any\n try {\n return mapObject(\n {\n value: valueEnc,\n additionalSigned: additionalEnc,\n },\n (encoder, key) => {\n const input = customEntry?.[key]\n // if the encoder is _void, then the input value is ignored, so no harm in passing `undefined`\n // only an `Option` encoder will accept `undefined` as an input without crashing\n return input instanceof Uint8Array ? input : encoder(input)\n },\n )\n } catch {\n // this means that a non optional custom signed-extension has not received its value\n if (customEntry) throw new Error(`Wrong input received for ${key}`)\n invalidKeys.push(key)\n return null\n }\n }\n\n const result = mapObject(\n signedExtensionsEncoders,\n ([valueEnc, additionalEnc], key) => {\n if (customSignedExtensions[key]) return getFromCustomEntry(key)\n\n switch (key) {\n case \"CheckNonce\":\n return value(valueEnc(nonce))\n\n case \"CheckMortality\":\n return mortality.mortal\n ? both(\n mortal({\n period: mortality.period,\n startAtBlock: mortality.startAtBlock.height,\n }),\n fromHex(mortality.startAtBlock.hash),\n )\n : both(zero, genesis)\n\n case \"ChargeTransactionPayment\":\n return value(valueEnc(tip))\n\n case \"ChargeAssetTxPayment\":\n return value(\n ChargeAssetTxPaymentEnc({\n tip,\n asset: (rest as any).asset,\n }),\n )\n\n case \"CheckGenesis\":\n return additionalSigned(genesis)\n\n case \"CheckMetadataHash\":\n return both(zero, zero)\n\n case \"CheckSpecVersion\":\n return additionalSigned(\n additionalEnc(systemVersion[\"spec_version\"]),\n )\n\n case \"CheckTxVersion\":\n return additionalSigned(\n additionalEnc(systemVersion[\"transaction_version\"]),\n )\n\n default:\n return getFromCustomEntry(key)\n }\n },\n )\n\n invalidKeys.forEach((key) => {\n delete result[key]\n })\n return mapObject(result, (x, identifier) => ({ ...x, identifier })) as any\n }\n}\n"],"names":["value","additionalSigned","key"],"mappings":";;;;;AAWA,MAAM,KAAA,GAAQ,IAAI,UAAA,EAAW;AAC7B,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AAGhC,MAAM,KAAA,GAAQ,CAACA,MAAAA,MAAuB;AAAA,EACpC,KAAA,EAAAA,MAAAA;AAAA,EACA,gBAAA,EAAkB;AACpB,CAAA,CAAA;AACA,MAAM,gBAAA,GAAmB,CAACC,iBAAAA,MAAkC;AAAA,EAC1D,KAAA,EAAO,KAAA;AAAA,EACP,gBAAA,EAAAA;AACF,CAAA,CAAA;AACA,MAAM,IAAA,GAAO,CAACD,MAAAA,EAAmBC,iBAAAA,MAAkC;AAAA,EACjE,KAAA,EAAAD,MAAAA;AAAA,EACA,gBAAA,EAAAC;AACF,CAAA,CAAA;AAEO,MAAM,wBAAA,GAA2B,CACtC,OAAA,EACA,QAAA,EACA,cAAA,KACG;AACH,EAAA,MAAM,2BACJ,EAAC;
|
|
1
|
+
{"version":3,"file":"sign-extensions.mjs","sources":["../../../../src/tx/signed-extensions/sign-extensions.ts"],"sourcesContent":["import {\n getDynamicBuilder,\n MetadataLookup,\n} from \"@polkadot-api/metadata-builders\"\nimport { Encoder } from \"@polkadot-api/substrate-bindings\"\nimport { OfflineTxExtensions } from \"../types\"\nimport { fromHex, mapObject } from \"@polkadot-api/utils\"\nimport { getSystemVersionStruct } from \"./system-version\"\nimport { mortal } from \"./mortal-enc\"\nimport { ChargeAssetTxPaymentEnc } from \"./charge-asset-tx-enc\"\n\nconst empty = new Uint8Array()\nconst zero = Uint8Array.from([0])\ntype DynamicBuilder = ReturnType<typeof getDynamicBuilder>\n\nconst value = (value: Uint8Array) => ({\n value,\n additionalSigned: empty,\n})\nconst additionalSigned = (additionalSigned: Uint8Array) => ({\n value: empty,\n additionalSigned,\n})\nconst both = (value: Uint8Array, additionalSigned: Uint8Array) => ({\n value,\n additionalSigned,\n})\n\nexport const getSignExtensionsCreator = (\n genesis: Uint8Array,\n lookupFn: MetadataLookup,\n dynamicBuilder: DynamicBuilder,\n) => {\n const signedExtensionsEncoders: Record<string, [Encoder<any>, Encoder<any>]> =\n {}\n // TODO: we need to adapt to multiple extension versions at some point\n lookupFn.metadata.extrinsic.signedExtensions[0].forEach(\n ({ identifier, type, additionalSigned }) => {\n signedExtensionsEncoders[identifier] = [type, additionalSigned].map(\n (x) => dynamicBuilder.buildDefinition(x)[0],\n ) as [Encoder<any>, Encoder<any>]\n },\n )\n\n return <Asset>({\n mortality,\n tip = 0n,\n nonce,\n customSignedExtensions = {},\n ...rest\n }: OfflineTxExtensions<Asset>): Record<\n string,\n { identifier: string; value: Uint8Array; additionalSigned: Uint8Array }\n > => {\n const invalidKeys: string[] = []\n const systemVersion = getSystemVersionStruct(lookupFn, dynamicBuilder)\n const getFromCustomEntry = (key: string) => {\n const [valueEnc, additionalEnc] = signedExtensionsEncoders[key]\n const customEntry = customSignedExtensions[key] as any\n try {\n return mapObject(\n {\n value: valueEnc,\n additionalSigned: additionalEnc,\n },\n (encoder, key) => {\n const input = customEntry?.[key]\n // if the encoder is _void, then the input value is ignored, so no harm in passing `undefined`\n // only an `Option` encoder will accept `undefined` as an input without crashing\n return input instanceof Uint8Array ? input : encoder(input)\n },\n )\n } catch {\n // this means that a non optional custom signed-extension has not received its value\n if (customEntry) throw new Error(`Wrong input received for ${key}`)\n invalidKeys.push(key)\n return null\n }\n }\n\n const result = mapObject(\n signedExtensionsEncoders,\n ([valueEnc, additionalEnc], key) => {\n if (customSignedExtensions[key]) return getFromCustomEntry(key)\n\n switch (key) {\n case \"CheckNonce\":\n return value(valueEnc(nonce))\n\n case \"CheckMortality\":\n return mortality.mortal\n ? both(\n mortal({\n period: mortality.period,\n startAtBlock: mortality.startAtBlock.height,\n }),\n fromHex(mortality.startAtBlock.hash),\n )\n : both(zero, genesis)\n\n case \"ChargeTransactionPayment\":\n return value(valueEnc(tip))\n\n case \"ChargeAssetTxPayment\":\n return value(\n ChargeAssetTxPaymentEnc({\n tip,\n asset: (rest as any).asset,\n }),\n )\n\n case \"CheckGenesis\":\n return additionalSigned(genesis)\n\n case \"CheckMetadataHash\":\n return both(zero, zero)\n\n case \"CheckSpecVersion\":\n return additionalSigned(\n additionalEnc(systemVersion[\"spec_version\"]),\n )\n\n case \"CheckTxVersion\":\n return additionalSigned(\n additionalEnc(systemVersion[\"transaction_version\"]),\n )\n\n default:\n return getFromCustomEntry(key)\n }\n },\n )\n\n invalidKeys.forEach((key) => {\n delete result[key]\n })\n return mapObject(result, (x, identifier) => ({ ...x, identifier })) as any\n }\n}\n"],"names":["value","additionalSigned","key"],"mappings":";;;;;AAWA,MAAM,KAAA,GAAQ,IAAI,UAAA,EAAW;AAC7B,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AAGhC,MAAM,KAAA,GAAQ,CAACA,MAAAA,MAAuB;AAAA,EACpC,KAAA,EAAAA,MAAAA;AAAA,EACA,gBAAA,EAAkB;AACpB,CAAA,CAAA;AACA,MAAM,gBAAA,GAAmB,CAACC,iBAAAA,MAAkC;AAAA,EAC1D,KAAA,EAAO,KAAA;AAAA,EACP,gBAAA,EAAAA;AACF,CAAA,CAAA;AACA,MAAM,IAAA,GAAO,CAACD,MAAAA,EAAmBC,iBAAAA,MAAkC;AAAA,EACjE,KAAA,EAAAD,MAAAA;AAAA,EACA,gBAAA,EAAAC;AACF,CAAA,CAAA;AAEO,MAAM,wBAAA,GAA2B,CACtC,OAAA,EACA,QAAA,EACA,cAAA,KACG;AACH,EAAA,MAAM,2BACJ,EAAC;AAEH,EAAA,QAAA,CAAS,QAAA,CAAS,SAAA,CAAU,gBAAA,CAAiB,CAAC,CAAA,CAAE,OAAA;AAAA,IAC9C,CAAC,EAAE,UAAA,EAAY,IAAA,EAAM,gBAAA,EAAAA,mBAAiB,KAAM;AAC1C,MAAA,wBAAA,CAAyB,UAAU,CAAA,GAAI,CAAC,IAAA,EAAMA,iBAAgB,CAAA,CAAE,GAAA;AAAA,QAC9D,CAAC,CAAA,KAAM,cAAA,CAAe,eAAA,CAAgB,CAAC,EAAE,CAAC;AAAA,OAC5C;AAAA,IACF;AAAA,GACF;AAEA,EAAA,OAAO,CAAQ;AAAA,IACb,SAAA;AAAA,IACA,GAAA,GAAM,EAAA;AAAA,IACN,KAAA;AAAA,IACA,yBAAyB,EAAC;AAAA,IAC1B,GAAG;AAAA,GACL,KAGK;AACH,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,MAAM,aAAA,GAAgB,sBAAA,CAAuB,QAAA,EAAU,cAAc,CAAA;AACrE,IAAA,MAAM,kBAAA,GAAqB,CAAC,GAAA,KAAgB;AAC1C,MAAA,MAAM,CAAC,QAAA,EAAU,aAAa,CAAA,GAAI,yBAAyB,GAAG,CAAA;AAC9D,MAAA,MAAM,WAAA,GAAc,uBAAuB,GAAG,CAAA;AAC9C,MAAA,IAAI;AACF,QAAA,OAAO,SAAA;AAAA,UACL;AAAA,YACE,KAAA,EAAO,QAAA;AAAA,YACP,gBAAA,EAAkB;AAAA,WACpB;AAAA,UACA,CAAC,SAASC,IAAAA,KAAQ;AAChB,YAAA,MAAM,KAAA,GAAQ,cAAcA,IAAG,CAAA;AAG/B,YAAA,OAAO,KAAA,YAAiB,UAAA,GAAa,KAAA,GAAQ,OAAA,CAAQ,KAAK,CAAA;AAAA,UAC5D;AAAA,SACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAEN,QAAA,IAAI,aAAa,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,GAAG,CAAA,CAAE,CAAA;AAClE,QAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,SAAA;AAAA,MACb,wBAAA;AAAA,MACA,CAAC,CAAC,QAAA,EAAU,aAAa,GAAG,GAAA,KAAQ;AAClC,QAAA,IAAI,sBAAA,CAAuB,GAAG,CAAA,EAAG,OAAO,mBAAmB,GAAG,CAAA;AAE9D,QAAA,QAAQ,GAAA;AAAK,UACX,KAAK,YAAA;AACH,YAAA,OAAO,KAAA,CAAM,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,UAE9B,KAAK,gBAAA;AACH,YAAA,OAAO,UAAU,MAAA,GACb,IAAA;AAAA,cACE,MAAA,CAAO;AAAA,gBACL,QAAQ,SAAA,CAAU,MAAA;AAAA,gBAClB,YAAA,EAAc,UAAU,YAAA,CAAa;AAAA,eACtC,CAAA;AAAA,cACD,OAAA,CAAQ,SAAA,CAAU,YAAA,CAAa,IAAI;AAAA,aACrC,GACA,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAAA,UAExB,KAAK,0BAAA;AACH,YAAA,OAAO,KAAA,CAAM,QAAA,CAAS,GAAG,CAAC,CAAA;AAAA,UAE5B,KAAK,sBAAA;AACH,YAAA,OAAO,KAAA;AAAA,cACL,uBAAA,CAAwB;AAAA,gBACtB,GAAA;AAAA,gBACA,OAAQ,IAAA,CAAa;AAAA,eACtB;AAAA,aACH;AAAA,UAEF,KAAK,cAAA;AACH,YAAA,OAAO,iBAAiB,OAAO,CAAA;AAAA,UAEjC,KAAK,mBAAA;AACH,YAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,UAExB,KAAK,kBAAA;AACH,YAAA,OAAO,gBAAA;AAAA,cACL,aAAA,CAAc,aAAA,CAAc,cAAc,CAAC;AAAA,aAC7C;AAAA,UAEF,KAAK,gBAAA;AACH,YAAA,OAAO,gBAAA;AAAA,cACL,aAAA,CAAc,aAAA,CAAc,qBAAqB,CAAC;AAAA,aACpD;AAAA,UAEF;AACE,YAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA;AACjC,MACF;AAAA,KACF;AAEA,IAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC3B,MAAA,OAAO,OAAO,GAAG,CAAA;AAAA,IACnB,CAAC,CAAA;AACD,IAAA,OAAO,SAAA,CAAU,QAAQ,CAAC,CAAA,EAAG,gBAAgB,EAAE,GAAG,CAAA,EAAG,UAAA,EAAW,CAAE,CAAA;AAAA,EACpE,CAAA;AACF;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Binary } from '@polkadot-api/substrate-bindings';
|
|
2
|
-
import {
|
|
2
|
+
import { mergeMap, defer, map, merge, race, takeWhile, ignoreElements, endWith, filter, take, Observable, concat, EMPTY, of, lastValueFrom, distinctUntilChanged } from 'rxjs';
|
|
3
3
|
import '@polkadot-api/observable-client';
|
|
4
4
|
import '../utils/shareLatest.mjs';
|
|
5
5
|
import { toHex, fromHex } from '@polkadot-api/utils';
|
package/dist/esm/tx/tx.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getPolkadotSigner } from '@polkadot-api/signer';
|
|
2
|
-
import { AccountId, Struct, u128, Variant, _void, compactBn, Enum, u32,
|
|
3
|
-
import {
|
|
4
|
-
import { firstValueFrom, mergeMap, map, take, throwError
|
|
2
|
+
import { AccountId, Struct, u128, Variant, _void, compactBn, Enum, u32, compact, Binary } from '@polkadot-api/substrate-bindings';
|
|
3
|
+
import { fromHex, toHex, mergeUint8 } from '@polkadot-api/utils';
|
|
4
|
+
import { firstValueFrom, mergeMap, map, combineLatest, take, throwError } from 'rxjs';
|
|
5
5
|
import { getCompatibilityApi } from '../compatibility.mjs';
|
|
6
6
|
import { createTx } from './create-tx.mjs';
|
|
7
7
|
import { submit, submit$ } from './submit-fns.mjs';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isBestOrFinalizedBlock, BlockNotPinnedError } from '@polkadot-api/observable-client';
|
|
2
|
-
import { distinctUntilChanged, take, map, withLatestFrom, merge, mergeMap, combineLatest,
|
|
2
|
+
import { distinctUntilChanged, take, map, withLatestFrom, merge, mergeMap, combineLatest, filter, startWith, pairwise, EMPTY, of, takeUntil, catchError, throwError } from 'rxjs';
|
|
3
3
|
import './utils/shareLatest.mjs';
|
|
4
4
|
import '@polkadot-api/utils';
|
|
5
5
|
import { lossLessExhaustMap } from './utils/lossLessExhaustMap.mjs';
|
|
@@ -87,6 +87,7 @@ const createWatchEntries = (blocks$, storage, withRuntime) => {
|
|
|
87
87
|
prev: prev && prev.block.hash,
|
|
88
88
|
rootHash,
|
|
89
89
|
block,
|
|
90
|
+
patcher,
|
|
90
91
|
...getDiff(
|
|
91
92
|
prev?.entries ?? [],
|
|
92
93
|
entries,
|
|
@@ -155,31 +156,23 @@ const createWatchEntries = (blocks$, storage, withRuntime) => {
|
|
|
155
156
|
);
|
|
156
157
|
const getBestOrFinalized = (isFinalized) => (pallet, entry, storageKey) => {
|
|
157
158
|
const memoryBlocks$ = getMemoryBlocks$(pallet, entry, storageKey);
|
|
158
|
-
const getPatcher = getPatcherFromRuntime(pallet, entry);
|
|
159
159
|
const prop = isFinalized ? "finalized" : "best";
|
|
160
160
|
return combineLatest([
|
|
161
|
-
memoryBlocks
|
|
161
|
+
memoryBlocks$,
|
|
162
162
|
blocks$.pipe(distinctUntilChanged((a, b) => a[prop] === b[prop]))
|
|
163
163
|
]).pipe(
|
|
164
|
-
map(
|
|
165
|
-
|
|
166
|
-
|
|
164
|
+
map(([state2, blocks]) => {
|
|
165
|
+
const update = findPrevious(blocks[prop], state2.blocks, blocks, true);
|
|
166
|
+
return update && { update, state: state2 };
|
|
167
|
+
}),
|
|
167
168
|
filter(Boolean),
|
|
168
|
-
distinctUntilChanged(),
|
|
169
|
+
distinctUntilChanged((a, b) => a.update === b.update),
|
|
169
170
|
startWith(null),
|
|
170
171
|
pairwise(),
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
prevUpdate,
|
|
176
|
-
latest,
|
|
177
|
-
memoryBlocks,
|
|
178
|
-
getPatcher(runtimeCtx)
|
|
179
|
-
]
|
|
180
|
-
),
|
|
181
|
-
mergeMap(([prevUpdate, latest, memoryBlocks, patcher]) => {
|
|
182
|
-
if (!prevUpdate) return [latest];
|
|
172
|
+
mergeMap(([prev, next]) => {
|
|
173
|
+
if (!prev) return [next.update];
|
|
174
|
+
const { update: prevUpdate } = prev;
|
|
175
|
+
const { state: memoryBlocks, update: latest } = next;
|
|
183
176
|
let ancestor = latest;
|
|
184
177
|
const updates = [];
|
|
185
178
|
while (ancestor && ancestor.block.number > prevUpdate.block.number) {
|
|
@@ -203,7 +196,7 @@ const createWatchEntries = (blocks$, storage, withRuntime) => {
|
|
|
203
196
|
...prevUpdate.rootHash === latest.rootHash ? {
|
|
204
197
|
entries: prevUpdate.entries,
|
|
205
198
|
deltas: null
|
|
206
|
-
} : getDiff(prevUpdate.entries, latest.entries, patcher)
|
|
199
|
+
} : getDiff(prevUpdate.entries, latest.entries, latest.patcher)
|
|
207
200
|
}
|
|
208
201
|
];
|
|
209
202
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch-entries.mjs","sources":["../../src/watch-entries.ts"],"sourcesContent":["import { HexString } from \"@polkadot-api/substrate-bindings\"\nimport type {\n PinnedBlocks,\n BlockInfo,\n ChainHead$,\n RuntimeContext,\n} from \"@polkadot-api/observable-client\"\nimport {\n BlockNotPinnedError,\n isBestOrFinalizedBlock,\n} from \"@polkadot-api/observable-client\"\nimport {\n catchError,\n combineLatest,\n delay,\n distinctUntilChanged,\n EMPTY,\n filter,\n map,\n merge,\n mergeMap,\n Observable,\n of,\n pairwise,\n startWith,\n take,\n takeUntil,\n throwError,\n withLatestFrom,\n} from \"rxjs\"\nimport { selfDependent, lossLessExhaustMap } from \"@/utils\"\nimport { state } from \"@rx-state/core\"\n\ninterface StorageEntry {\n key: HexString\n value: HexString\n dec: {\n args: Array<any>\n value: any\n }\n}\n\ntype Deltas = {\n upserted: Array<StorageEntry>\n deleted: Array<StorageEntry>\n}\n\ninterface MemoryBlock {\n prev: HexString | null\n block: BlockInfo\n rootHash: string\n entries: Array<StorageEntry>\n deltas: Deltas | null\n}\n\ntype MemoryBlocks = {\n blocks: Record<HexString, MemoryBlock>\n finalized: HexString\n}\n\nconst getDiff = (\n _prev: Array<StorageEntry>,\n _current: Array<StorageEntry>,\n patch: (input: StorageEntry) => StorageEntry,\n): Pick<MemoryBlock, \"entries\" | \"deltas\"> => {\n const current = new Map(_current.map((x) => [x.key, x]))\n const prev = new Map(_prev.map((x) => [x.key, x]))\n\n const upserted: Map<string, StorageEntry> = new Map()\n const deleted: Array<StorageEntry> = []\n\n _current.forEach((value) => {\n const { key } = value\n const prevVal = prev.get(key)\n if (!prevVal || prevVal.value !== value.value)\n upserted.set(key, patch(value))\n })\n\n _prev.forEach((x) => {\n if (!current.has(x.key)) deleted.push(x)\n })\n\n return {\n deltas: {\n deleted,\n upserted: [...upserted.values()],\n },\n entries: _current.map(({ key }) => upserted.get(key) ?? prev.get(key)!),\n }\n}\n\nconst findPrevious = (\n start: HexString,\n state: MemoryBlocks[\"blocks\"],\n pinned: PinnedBlocks,\n includeStart = false,\n) => {\n try {\n let target = includeStart ? start : pinned.blocks.get(start)!.parent\n while (target && !state[target]) target = pinned.blocks.get(target)!.parent!\n\n if (!target) return null\n return state[target]\n } catch {\n return null\n }\n}\n\nconst getPatcherFromRuntime =\n (pallet: string, entry: string) => (runtime: RuntimeContext) => {\n const { keys, value } = runtime.dynamicBuilder.buildStorage(pallet, entry)\n return (x: StorageEntry) => {\n x.dec = {\n value: value.dec(x.value),\n args: keys.dec(x.key),\n }\n return x\n }\n }\n\nexport const createWatchEntries = (\n blocks$: Observable<PinnedBlocks>,\n storage: ChainHead$[\"storage$\"],\n withRuntime: ChainHead$[\"withRuntime\"],\n) => {\n const getMemoryBlocks$ = state(\n (pallet: string, entry: string, storageKey: string) => {\n const getPatcher = getPatcherFromRuntime(pallet, entry)\n const getNextMemoryBlock$ = (\n prev: MemoryBlock | null,\n block: BlockInfo,\n ): Observable<MemoryBlock> => {\n const isNotCanonical$ = isBestOrFinalizedBlock(\n blocks$,\n block.hash,\n ).pipe(\n filter((x) => !x),\n take(1),\n )\n\n return storage(\n block.hash,\n \"closestDescendantMerkleValue\",\n () => storageKey,\n ).pipe(\n mergeMap((rootHash) => {\n if (rootHash === prev?.rootHash)\n return of({\n ...prev,\n block,\n deltas: null,\n prev: prev.block.hash,\n })\n\n return storage(\n block.hash,\n \"descendantsValues\",\n () => storageKey,\n ).pipe(\n withRuntime(() => block.hash),\n map(\n ([entries, runtimeCtx]) =>\n [entries, getPatcher(runtimeCtx)] as const,\n ),\n map(\n ([entries, patcher]): MemoryBlock => ({\n prev: prev && prev.block.hash,\n rootHash: rootHash!,\n block,\n ...getDiff(\n prev?.entries ?? [],\n entries as StorageEntry[],\n patcher,\n ),\n }),\n ),\n )\n }),\n takeUntil(isNotCanonical$),\n catchError((e) =>\n e instanceof BlockNotPinnedError ? EMPTY : throwError(() => e),\n ),\n )\n }\n\n const initial$ = blocks$.pipe(\n distinctUntilChanged((a, b) => a.finalized === b.finalized),\n lossLessExhaustMap(({ blocks, finalized }) =>\n getNextMemoryBlock$(null, blocks.get(finalized)!),\n ),\n take(1),\n map(\n (x): MemoryBlocks => ({\n blocks: { [x.block.hash]: x },\n finalized: x.block.hash,\n }),\n ),\n )\n\n const [_memoryBlocks$, connectMemoryBlocks] =\n selfDependent<MemoryBlocks>()\n const updates$ = blocks$.pipe(\n distinctUntilChanged((a, b) => a.best === b.best),\n withLatestFrom(_memoryBlocks$),\n lossLessExhaustMap(([pinned, memoryBlocks]) => {\n const { best } = pinned\n const { blocks } = memoryBlocks\n let target = !blocks[best] ? best : null\n if (!target) return EMPTY\n\n const previous = findPrevious(target, blocks, pinned)\n if (previous)\n return getNextMemoryBlock$(\n previous,\n pinned.blocks.get(target)!,\n ).pipe(\n map((x) => {\n blocks[target!] = x\n return memoryBlocks\n }),\n )\n\n // This means that there has been a stop event that the pinned-blocks\n // couldn't recover from. Therefore, we must \"start over\"\n target = pinned.finalized\n return getNextMemoryBlock$(\n blocks[memoryBlocks.finalized],\n pinned.blocks.get(target)!,\n ).pipe(\n map((x) => {\n x.prev = null\n return {\n blocks: { [target]: x },\n finalized: target,\n }\n }),\n )\n }),\n )\n\n return merge(initial$, updates$).pipe(connectMemoryBlocks())\n },\n )\n\n const getBestOrFinalized =\n (isFinalized: boolean) =>\n (pallet: string, entry: string, storageKey: string) => {\n const memoryBlocks$ = getMemoryBlocks$(pallet, entry, storageKey)\n const getPatcher = getPatcherFromRuntime(pallet, entry)\n\n const prop = isFinalized ? \"finalized\" : \"best\"\n\n return combineLatest([\n memoryBlocks$.pipe(delay(0)),\n blocks$.pipe(distinctUntilChanged((a, b) => a[prop] === b[prop])),\n ]).pipe(\n map(([state, blocks]) =>\n findPrevious(blocks[prop], state.blocks, blocks, true),\n ),\n filter(Boolean),\n distinctUntilChanged(),\n startWith(null),\n pairwise(),\n withLatestFrom(memoryBlocks$),\n withRuntime(([[, _latest]]) => _latest!.block.hash),\n map(\n ([[[prevUpdate, latest], memoryBlocks], runtimeCtx]) =>\n [\n prevUpdate,\n latest!,\n memoryBlocks,\n getPatcher(runtimeCtx),\n ] as const,\n ),\n mergeMap(([prevUpdate, latest, memoryBlocks, patcher]) => {\n if (!prevUpdate) return [latest]\n\n let ancestor: MemoryBlock | null = latest\n const updates: Array<MemoryBlock> = []\n while (ancestor && ancestor.block.number > prevUpdate.block.number) {\n updates.unshift(ancestor)\n ancestor = ancestor.prev ? memoryBlocks.blocks[ancestor.prev] : null\n }\n\n if (isFinalized) {\n memoryBlocks.finalized = latest.block.hash\n if (updates.length) {\n const { blocks } = memoryBlocks\n Object.keys(blocks).forEach((key) => {\n if (blocks[key].block.number < updates[0].block.number)\n delete blocks[key]\n })\n }\n }\n\n if (prevUpdate === ancestor) return updates\n\n // It's a re-org\n return [\n {\n ...latest,\n ...(prevUpdate.rootHash === latest.rootHash\n ? {\n entries: prevUpdate.entries,\n deltas: null,\n }\n : getDiff(prevUpdate.entries, latest.entries, patcher)),\n },\n ]\n }),\n )\n }\n\n const getFinalized$ = state(getBestOrFinalized(true))\n const getBest$ = state(getBestOrFinalized(false))\n\n return (pallet: string, entry: string, args: Array<any>, atBest: boolean) => {\n const fn = atBest ? getBest$ : getFinalized$\n const storageKey$ = blocks$.pipe(\n take(1),\n mergeMap(\n (b) =>\n b.runtimes[b.blocks.get(b[atBest ? \"best\" : \"finalized\"])!.runtime]\n .runtime,\n ),\n map((runtime) =>\n runtime.dynamicBuilder.buildStorage(pallet, entry).keys.enc(...args),\n ),\n )\n return storageKey$.pipe(\n take(1),\n mergeMap((storageKey) => fn(pallet, entry, storageKey)),\n map(({ block: { hash, number, parent }, deltas, entries }, idx) => {\n const actualDeltas =\n idx > 0 ? deltas : { deleted: [], upserted: entries }\n\n return {\n block: { hash, number, parent },\n entries: entries.map(toDec),\n deltas: actualDeltas && {\n deleted: actualDeltas.deleted.map(toDec),\n upserted: actualDeltas.upserted.map(toDec),\n },\n }\n }),\n )\n }\n}\n\nconst toDec = <T>(x: { dec: T }): T => x.dec\n"],"names":["state"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"watch-entries.mjs","sources":["../../src/watch-entries.ts"],"sourcesContent":["import { HexString } from \"@polkadot-api/substrate-bindings\"\nimport type {\n PinnedBlocks,\n BlockInfo,\n ChainHead$,\n RuntimeContext,\n} from \"@polkadot-api/observable-client\"\nimport {\n BlockNotPinnedError,\n isBestOrFinalizedBlock,\n} from \"@polkadot-api/observable-client\"\nimport {\n catchError,\n combineLatest,\n distinctUntilChanged,\n EMPTY,\n filter,\n map,\n merge,\n mergeMap,\n Observable,\n of,\n pairwise,\n startWith,\n take,\n takeUntil,\n throwError,\n withLatestFrom,\n} from \"rxjs\"\nimport { selfDependent, lossLessExhaustMap } from \"@/utils\"\nimport { state } from \"@rx-state/core\"\n\ninterface StorageEntry {\n key: HexString\n value: HexString\n dec: {\n args: Array<any>\n value: any\n }\n}\n\ntype Deltas = {\n upserted: Array<StorageEntry>\n deleted: Array<StorageEntry>\n}\n\ninterface MemoryBlock {\n prev: HexString | null\n block: BlockInfo\n rootHash: string\n entries: Array<StorageEntry>\n deltas: Deltas | null\n patcher: (input: StorageEntry) => StorageEntry\n}\n\ntype MemoryBlocks = {\n blocks: Record<HexString, MemoryBlock>\n finalized: HexString\n}\n\nconst getDiff = (\n _prev: Array<StorageEntry>,\n _current: Array<StorageEntry>,\n patch: (input: StorageEntry) => StorageEntry,\n): Pick<MemoryBlock, \"entries\" | \"deltas\"> => {\n const current = new Map(_current.map((x) => [x.key, x]))\n const prev = new Map(_prev.map((x) => [x.key, x]))\n\n const upserted: Map<string, StorageEntry> = new Map()\n const deleted: Array<StorageEntry> = []\n\n _current.forEach((value) => {\n const { key } = value\n const prevVal = prev.get(key)\n if (!prevVal || prevVal.value !== value.value)\n upserted.set(key, patch(value))\n })\n\n _prev.forEach((x) => {\n if (!current.has(x.key)) deleted.push(x)\n })\n\n return {\n deltas: {\n deleted,\n upserted: [...upserted.values()],\n },\n entries: _current.map(({ key }) => upserted.get(key) ?? prev.get(key)!),\n }\n}\n\nconst findPrevious = (\n start: HexString,\n state: MemoryBlocks[\"blocks\"],\n pinned: PinnedBlocks,\n includeStart = false,\n) => {\n try {\n let target = includeStart ? start : pinned.blocks.get(start)!.parent\n while (target && !state[target]) target = pinned.blocks.get(target)!.parent!\n\n if (!target) return null\n return state[target]\n } catch {\n return null\n }\n}\n\nconst getPatcherFromRuntime =\n (pallet: string, entry: string) => (runtime: RuntimeContext) => {\n const { keys, value } = runtime.dynamicBuilder.buildStorage(pallet, entry)\n return (x: StorageEntry) => {\n x.dec = {\n value: value.dec(x.value),\n args: keys.dec(x.key),\n }\n return x\n }\n }\n\nexport const createWatchEntries = (\n blocks$: Observable<PinnedBlocks>,\n storage: ChainHead$[\"storage$\"],\n withRuntime: ChainHead$[\"withRuntime\"],\n) => {\n const getMemoryBlocks$ = state(\n (pallet: string, entry: string, storageKey: string) => {\n const getPatcher = getPatcherFromRuntime(pallet, entry)\n const getNextMemoryBlock$ = (\n prev: MemoryBlock | null,\n block: BlockInfo,\n ): Observable<MemoryBlock> => {\n const isNotCanonical$ = isBestOrFinalizedBlock(\n blocks$,\n block.hash,\n ).pipe(\n filter((x) => !x),\n take(1),\n )\n\n return storage(\n block.hash,\n \"closestDescendantMerkleValue\",\n () => storageKey,\n ).pipe(\n mergeMap((rootHash) => {\n if (rootHash === prev?.rootHash)\n return of({\n ...prev,\n block,\n deltas: null,\n prev: prev.block.hash,\n })\n\n return storage(\n block.hash,\n \"descendantsValues\",\n () => storageKey,\n ).pipe(\n withRuntime(() => block.hash),\n map(\n ([entries, runtimeCtx]) =>\n [entries, getPatcher(runtimeCtx)] as const,\n ),\n map(\n ([entries, patcher]): MemoryBlock => ({\n prev: prev && prev.block.hash,\n rootHash: rootHash!,\n block,\n patcher,\n ...getDiff(\n prev?.entries ?? [],\n entries as StorageEntry[],\n patcher,\n ),\n }),\n ),\n )\n }),\n takeUntil(isNotCanonical$),\n catchError((e) =>\n e instanceof BlockNotPinnedError ? EMPTY : throwError(() => e),\n ),\n )\n }\n\n const initial$ = blocks$.pipe(\n distinctUntilChanged((a, b) => a.finalized === b.finalized),\n lossLessExhaustMap(({ blocks, finalized }) =>\n getNextMemoryBlock$(null, blocks.get(finalized)!),\n ),\n take(1),\n map(\n (x): MemoryBlocks => ({\n blocks: { [x.block.hash]: x },\n finalized: x.block.hash,\n }),\n ),\n )\n\n const [_memoryBlocks$, connectMemoryBlocks] =\n selfDependent<MemoryBlocks>()\n\n const updates$ = blocks$.pipe(\n distinctUntilChanged((a, b) => a.best === b.best),\n withLatestFrom(_memoryBlocks$),\n lossLessExhaustMap(([pinned, memoryBlocks]) => {\n const { best } = pinned\n const { blocks } = memoryBlocks\n let target = !blocks[best] ? best : null\n if (!target) return EMPTY\n\n const previous = findPrevious(target, blocks, pinned)\n if (previous)\n return getNextMemoryBlock$(\n previous,\n pinned.blocks.get(target)!,\n ).pipe(\n map((x) => {\n blocks[target!] = x\n return memoryBlocks\n }),\n )\n\n // This means that there has been a stop event that the pinned-blocks\n // couldn't recover from. Therefore, we must \"start over\"\n target = pinned.finalized\n return getNextMemoryBlock$(\n blocks[memoryBlocks.finalized],\n pinned.blocks.get(target)!,\n ).pipe(\n map((x) => {\n x.prev = null\n return {\n blocks: { [target]: x },\n finalized: target,\n }\n }),\n )\n }),\n )\n\n return merge(initial$, updates$).pipe(connectMemoryBlocks())\n },\n )\n\n const getBestOrFinalized =\n (isFinalized: boolean) =>\n (pallet: string, entry: string, storageKey: string) => {\n const memoryBlocks$ = getMemoryBlocks$(pallet, entry, storageKey)\n\n const prop = isFinalized ? \"finalized\" : \"best\"\n\n return combineLatest([\n memoryBlocks$,\n blocks$.pipe(distinctUntilChanged((a, b) => a[prop] === b[prop])),\n ]).pipe(\n map(([state, blocks]) => {\n const update = findPrevious(blocks[prop], state.blocks, blocks, true)\n return update && { update, state }\n }),\n filter(Boolean),\n distinctUntilChanged((a, b) => a.update === b.update),\n startWith(null),\n pairwise(),\n mergeMap(([prev, next]) => {\n if (!prev) return [next!.update]\n const { update: prevUpdate } = prev\n\n const { state: memoryBlocks, update: latest } = next!\n let ancestor: MemoryBlock | null = latest\n const updates: Array<MemoryBlock> = []\n while (ancestor && ancestor.block.number > prevUpdate.block.number) {\n updates.unshift(ancestor)\n ancestor = ancestor.prev ? memoryBlocks.blocks[ancestor.prev] : null\n }\n\n if (isFinalized) {\n memoryBlocks.finalized = latest.block.hash\n if (updates.length) {\n const { blocks } = memoryBlocks\n Object.keys(blocks).forEach((key) => {\n if (blocks[key].block.number < updates[0].block.number)\n delete blocks[key]\n })\n }\n }\n\n if (prevUpdate === ancestor) return updates\n\n // It's a re-org\n return [\n {\n ...latest,\n ...(prevUpdate.rootHash === latest.rootHash\n ? {\n entries: prevUpdate.entries,\n deltas: null,\n }\n : getDiff(prevUpdate.entries, latest.entries, latest.patcher)),\n },\n ]\n }),\n )\n }\n\n const getFinalized$ = state(getBestOrFinalized(true))\n const getBest$ = state(getBestOrFinalized(false))\n\n return (pallet: string, entry: string, args: Array<any>, atBest: boolean) => {\n const fn = atBest ? getBest$ : getFinalized$\n const storageKey$ = blocks$.pipe(\n take(1),\n mergeMap(\n (b) =>\n b.runtimes[b.blocks.get(b[atBest ? \"best\" : \"finalized\"])!.runtime]\n .runtime,\n ),\n map((runtime) =>\n runtime.dynamicBuilder.buildStorage(pallet, entry).keys.enc(...args),\n ),\n )\n return storageKey$.pipe(\n take(1),\n mergeMap((storageKey) => fn(pallet, entry, storageKey)),\n map(({ block: { hash, number, parent }, deltas, entries }, idx) => {\n const actualDeltas =\n idx > 0 ? deltas : { deleted: [], upserted: entries }\n\n return {\n block: { hash, number, parent },\n entries: entries.map(toDec),\n deltas: actualDeltas && {\n deleted: actualDeltas.deleted.map(toDec),\n upserted: actualDeltas.upserted.map(toDec),\n },\n }\n }),\n )\n }\n}\n\nconst toDec = <T>(x: { dec: T }): T => x.dec\n"],"names":["state"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -680,7 +680,7 @@ const both = (value2, additionalSigned2) => ({
|
|
|
680
680
|
});
|
|
681
681
|
const getSignExtensionsCreator = (genesis, lookupFn, dynamicBuilder) => {
|
|
682
682
|
const signedExtensionsEncoders = {};
|
|
683
|
-
lookupFn.metadata.extrinsic.signedExtensions.forEach(
|
|
683
|
+
lookupFn.metadata.extrinsic.signedExtensions[0].forEach(
|
|
684
684
|
({ identifier, type, additionalSigned: additionalSigned2 }) => {
|
|
685
685
|
signedExtensionsEncoders[identifier] = [type, additionalSigned2].map(
|
|
686
686
|
(x) => dynamicBuilder.buildDefinition(x)[0]
|
|
@@ -1324,6 +1324,7 @@ const createWatchEntries = (blocks$, storage, withRuntime) => {
|
|
|
1324
1324
|
prev: prev && prev.block.hash,
|
|
1325
1325
|
rootHash,
|
|
1326
1326
|
block,
|
|
1327
|
+
patcher,
|
|
1327
1328
|
...getDiff(
|
|
1328
1329
|
prev?.entries ?? [],
|
|
1329
1330
|
entries,
|
|
@@ -1392,31 +1393,23 @@ const createWatchEntries = (blocks$, storage, withRuntime) => {
|
|
|
1392
1393
|
);
|
|
1393
1394
|
const getBestOrFinalized = (isFinalized) => (pallet, entry, storageKey) => {
|
|
1394
1395
|
const memoryBlocks$ = getMemoryBlocks$(pallet, entry, storageKey);
|
|
1395
|
-
const getPatcher = getPatcherFromRuntime(pallet, entry);
|
|
1396
1396
|
const prop = isFinalized ? "finalized" : "best";
|
|
1397
1397
|
return rxjs.combineLatest([
|
|
1398
|
-
memoryBlocks
|
|
1398
|
+
memoryBlocks$,
|
|
1399
1399
|
blocks$.pipe(rxjs.distinctUntilChanged((a, b) => a[prop] === b[prop]))
|
|
1400
1400
|
]).pipe(
|
|
1401
|
-
rxjs.map(
|
|
1402
|
-
|
|
1403
|
-
|
|
1401
|
+
rxjs.map(([state2, blocks]) => {
|
|
1402
|
+
const update = findPrevious(blocks[prop], state2.blocks, blocks, true);
|
|
1403
|
+
return update && { update, state: state2 };
|
|
1404
|
+
}),
|
|
1404
1405
|
rxjs.filter(Boolean),
|
|
1405
|
-
rxjs.distinctUntilChanged(),
|
|
1406
|
+
rxjs.distinctUntilChanged((a, b) => a.update === b.update),
|
|
1406
1407
|
rxjs.startWith(null),
|
|
1407
1408
|
rxjs.pairwise(),
|
|
1408
|
-
rxjs.
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
prevUpdate,
|
|
1413
|
-
latest,
|
|
1414
|
-
memoryBlocks,
|
|
1415
|
-
getPatcher(runtimeCtx)
|
|
1416
|
-
]
|
|
1417
|
-
),
|
|
1418
|
-
rxjs.mergeMap(([prevUpdate, latest, memoryBlocks, patcher]) => {
|
|
1419
|
-
if (!prevUpdate) return [latest];
|
|
1409
|
+
rxjs.mergeMap(([prev, next]) => {
|
|
1410
|
+
if (!prev) return [next.update];
|
|
1411
|
+
const { update: prevUpdate } = prev;
|
|
1412
|
+
const { state: memoryBlocks, update: latest } = next;
|
|
1420
1413
|
let ancestor = latest;
|
|
1421
1414
|
const updates = [];
|
|
1422
1415
|
while (ancestor && ancestor.block.number > prevUpdate.block.number) {
|
|
@@ -1440,7 +1433,7 @@ const createWatchEntries = (blocks$, storage, withRuntime) => {
|
|
|
1440
1433
|
...prevUpdate.rootHash === latest.rootHash ? {
|
|
1441
1434
|
entries: prevUpdate.entries,
|
|
1442
1435
|
deltas: null
|
|
1443
|
-
} : getDiff(prevUpdate.entries, latest.entries, patcher)
|
|
1436
|
+
} : getDiff(prevUpdate.entries, latest.entries, latest.patcher)
|
|
1444
1437
|
}
|
|
1445
1438
|
];
|
|
1446
1439
|
})
|
|
@@ -1751,14 +1744,8 @@ function createClient(provider, { getMetadata, setMetadata } = {}) {
|
|
|
1751
1744
|
)
|
|
1752
1745
|
};
|
|
1753
1746
|
const _request = rawClient.request;
|
|
1754
|
-
let
|
|
1755
|
-
const
|
|
1756
|
-
const getChainToken = (chainDefinition) => {
|
|
1757
|
-
const result2 = compatibilityToken.get(chainDefinition) || createCompatibilityToken(chainDefinition, chainHead);
|
|
1758
|
-
compatibilityToken.set(chainDefinition, result2);
|
|
1759
|
-
return result2;
|
|
1760
|
-
};
|
|
1761
|
-
const getRuntimeToken = () => runtimeToken ?? (runtimeToken = createRuntimeToken(chainHead));
|
|
1747
|
+
let unsafeApi;
|
|
1748
|
+
const typedApis = /* @__PURE__ */ new WeakMap();
|
|
1762
1749
|
const { broadcastTx$ } = client;
|
|
1763
1750
|
const getMetadata$ = (at) => chainHead.getRuntimeContext$(at).pipe(rxjs.map((ctx) => ctx.metadataRaw));
|
|
1764
1751
|
const result = {
|
|
@@ -1777,17 +1764,26 @@ function createClient(provider, { getMetadata, setMetadata } = {}) {
|
|
|
1777
1764
|
submit: (...args) => submit(chainHead, broadcastTx$, ...args),
|
|
1778
1765
|
submitAndWatch: (tx) => submit$(chainHead, broadcastTx$, tx),
|
|
1779
1766
|
getTypedApi: (chainDefinition) => {
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1767
|
+
if (typedApis.has(chainDefinition)) return typedApis.get(chainDefinition);
|
|
1768
|
+
const compatibilityToken = createCompatibilityToken(
|
|
1769
|
+
chainDefinition,
|
|
1770
|
+
chainHead
|
|
1771
|
+
);
|
|
1772
|
+
const api = Object.assign(
|
|
1773
|
+
createApi(compatibilityToken, chainHead, broadcastTx$),
|
|
1774
|
+
{ compatibilityToken }
|
|
1784
1775
|
);
|
|
1776
|
+
typedApis.set(chainDefinition, api);
|
|
1777
|
+
return api;
|
|
1785
1778
|
},
|
|
1786
1779
|
getUnsafeApi: () => {
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1780
|
+
if (unsafeApi) return unsafeApi;
|
|
1781
|
+
const runtimeToken = createRuntimeToken(chainHead);
|
|
1782
|
+
unsafeApi = Object.assign(
|
|
1783
|
+
createApi(runtimeToken, chainHead, broadcastTx$),
|
|
1784
|
+
{ runtimeToken }
|
|
1785
|
+
);
|
|
1786
|
+
return unsafeApi;
|
|
1791
1787
|
},
|
|
1792
1788
|
rawQuery: (key, { at, signal } = {}) => firstValueFromWithSignal(
|
|
1793
1789
|
chainHead.storage$(at ?? null, "value", () => {
|