polkadot-api 1.21.0 → 1.21.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { getCli, ink, update, remove, generate, add } from '@polkadot-api/cli';
3
3
 
4
- var version = "1.21.0";
4
+ var version = "1.21.2";
5
5
 
6
6
  getCli({
7
7
  add,
@@ -85,7 +85,7 @@ const getNonce$ = (chainHead, from) => {
85
85
  map(({ blocks, best }) => {
86
86
  const bestBlock = blocks.get(best);
87
87
  return [...blocks.values()].filter(
88
- (v) => !v.unpinnable && v.children.size === 0 && v.number >= bestBlock.number
88
+ (v) => !v.pruned && v.children.size === 0 && v.number >= bestBlock.number
89
89
  ).map((v) => v.hash);
90
90
  }),
91
91
  switchMap(getHeadsNonce$),
@@ -1 +1 @@
1
- {"version":3,"file":"create-tx.mjs","sources":["../../../src/tx/create-tx.ts"],"sourcesContent":["import { BlockInfo, ChainHead$ } from \"@polkadot-api/observable-client\"\nimport type { PolkadotSigner } from \"@polkadot-api/polkadot-signer\"\nimport { HexString, u16, u32, u64, u8 } from \"@polkadot-api/substrate-bindings\"\nimport { fromHex, toHex } from \"@polkadot-api/utils\"\nimport {\n Observable,\n catchError,\n combineLatest,\n distinctUntilChanged,\n map,\n mergeMap,\n of,\n scan,\n startWith,\n switchMap,\n take,\n} from \"rxjs\"\nimport { getSignExtensionsCreator } from \"./signed-extensions\"\nimport { CustomSignedExtensionValues } from \"./types\"\n\ntype HintedSignedExtensions = Partial<{\n tip: bigint\n mortality: { mortal: false } | { mortal: true; period: number }\n asset: Uint8Array\n nonce: number\n}>\n\nconst NONCE_RUNTIME_CALL = \"AccountNonceApi_account_nonce\"\nconst lenToDecoder = {\n 1: u8.dec,\n 2: u16.dec,\n 4: u32.dec,\n 8: u64.dec,\n}\n\nconst getNonceAtBlock$ = (\n call$: ChainHead$[\"call$\"],\n from: HexString,\n at: string,\n) =>\n call$(at, NONCE_RUNTIME_CALL, from).pipe(\n map((result) => {\n const bytes = fromHex(result)\n const decoder = lenToDecoder[bytes.length as 2 | 4 | 8]\n if (!decoder)\n throw new Error(`${NONCE_RUNTIME_CALL} retrieved wrong data`)\n return decoder(bytes)\n }),\n )\n\nexport const createTx: (\n chainHead: ChainHead$,\n signer: PolkadotSigner,\n callData: Uint8Array,\n atBlock: BlockInfo,\n customSignExt: Record<string, CustomSignedExtensionValues>,\n hinted?: HintedSignedExtensions,\n) => Observable<Uint8Array> = (\n chainHead,\n signer,\n callData,\n atBlock,\n customSignedExtensions,\n hinted = {},\n) =>\n combineLatest([\n hinted.nonce\n ? of(hinted.nonce)\n : getNonce$(chainHead, toHex(signer.publicKey)),\n chainHead.getRuntimeContext$(atBlock.hash),\n chainHead.genesis$,\n ]).pipe(\n take(1),\n mergeMap(([nonce, ctx, genesis]) => {\n const signExtCreator = getSignExtensionsCreator(\n fromHex(genesis),\n ctx.lookup,\n ctx.dynamicBuilder,\n )\n\n const mortality: HintedSignedExtensions[\"mortality\"] =\n hinted.mortality ?? { period: 64, mortal: true }\n\n const signExtensions = signExtCreator({\n nonce: nonce as number,\n tip: hinted.tip ?? 0n,\n mortality: mortality.mortal\n ? {\n mortal: true,\n period: mortality.period,\n startAtBlock: {\n height: atBlock.number,\n hash: atBlock.hash,\n },\n }\n : { mortal: false },\n customSignedExtensions,\n asset: hinted.asset,\n })\n\n return signer.signTx(\n callData,\n signExtensions,\n ctx.metadataRaw,\n atBlock.number,\n )\n }),\n )\n\nconst getNonce$ = (chainHead: ChainHead$, from: HexString) => {\n const followHead$ = (head: string) =>\n chainHead.newBlocks$.pipe(\n scan((acc, block) => (block.parent === acc ? block.hash : acc), head),\n startWith(head),\n distinctUntilChanged(),\n )\n const followNonce$ = (head: string) =>\n followHead$(head).pipe(\n take(2),\n switchMap((hash) => getNonceAtBlock$(chainHead.call$, from, hash)),\n )\n const getHeadsNonce$ = (heads: string[]) =>\n combineLatest(\n heads.map((head) =>\n followNonce$(head).pipe(\n map((value) => ({\n success: true as const,\n value,\n })),\n catchError((err) =>\n of({\n success: false as const,\n value: err,\n }),\n ),\n ),\n ),\n ).pipe(take(1))\n\n return chainHead.pinnedBlocks$.pipe(\n take(1),\n map(({ blocks, best }) => {\n // Grab only the heads: those blocks above the best that don't have children and are not getting pruned\n const bestBlock = blocks.get(best)!\n return [...blocks.values()]\n .filter(\n (v) =>\n !v.unpinnable &&\n v.children.size === 0 &&\n v.number >= bestBlock.number,\n )\n .map((v) => v.hash)\n }),\n switchMap(getHeadsNonce$),\n map((result) => {\n const winner = result.reduce(\n (acc: bigint | number | null, v) =>\n v.success ? (v.value >= (acc ?? 0) ? v.value : acc) : acc,\n null,\n )\n\n if (winner == null) {\n // We must have at least one error\n throw result[0].value\n }\n return winner\n }),\n )\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-tx.mjs","sources":["../../../src/tx/create-tx.ts"],"sourcesContent":["import { BlockInfo, ChainHead$ } from \"@polkadot-api/observable-client\"\nimport type { PolkadotSigner } from \"@polkadot-api/polkadot-signer\"\nimport { HexString, u16, u32, u64, u8 } from \"@polkadot-api/substrate-bindings\"\nimport { fromHex, toHex } from \"@polkadot-api/utils\"\nimport {\n Observable,\n catchError,\n combineLatest,\n distinctUntilChanged,\n map,\n mergeMap,\n of,\n scan,\n startWith,\n switchMap,\n take,\n} from \"rxjs\"\nimport { getSignExtensionsCreator } from \"./signed-extensions\"\nimport { CustomSignedExtensionValues } from \"./types\"\n\ntype HintedSignedExtensions = Partial<{\n tip: bigint\n mortality: { mortal: false } | { mortal: true; period: number }\n asset: Uint8Array\n nonce: number\n}>\n\nconst NONCE_RUNTIME_CALL = \"AccountNonceApi_account_nonce\"\nconst lenToDecoder = {\n 1: u8.dec,\n 2: u16.dec,\n 4: u32.dec,\n 8: u64.dec,\n}\n\nconst getNonceAtBlock$ = (\n call$: ChainHead$[\"call$\"],\n from: HexString,\n at: string,\n) =>\n call$(at, NONCE_RUNTIME_CALL, from).pipe(\n map((result) => {\n const bytes = fromHex(result)\n const decoder = lenToDecoder[bytes.length as 2 | 4 | 8]\n if (!decoder)\n throw new Error(`${NONCE_RUNTIME_CALL} retrieved wrong data`)\n return decoder(bytes)\n }),\n )\n\nexport const createTx: (\n chainHead: ChainHead$,\n signer: PolkadotSigner,\n callData: Uint8Array,\n atBlock: BlockInfo,\n customSignExt: Record<string, CustomSignedExtensionValues>,\n hinted?: HintedSignedExtensions,\n) => Observable<Uint8Array> = (\n chainHead,\n signer,\n callData,\n atBlock,\n customSignedExtensions,\n hinted = {},\n) =>\n combineLatest([\n hinted.nonce\n ? of(hinted.nonce)\n : getNonce$(chainHead, toHex(signer.publicKey)),\n chainHead.getRuntimeContext$(atBlock.hash),\n chainHead.genesis$,\n ]).pipe(\n take(1),\n mergeMap(([nonce, ctx, genesis]) => {\n const signExtCreator = getSignExtensionsCreator(\n fromHex(genesis),\n ctx.lookup,\n ctx.dynamicBuilder,\n )\n\n const mortality: HintedSignedExtensions[\"mortality\"] =\n hinted.mortality ?? { period: 64, mortal: true }\n\n const signExtensions = signExtCreator({\n nonce: nonce as number,\n tip: hinted.tip ?? 0n,\n mortality: mortality.mortal\n ? {\n mortal: true,\n period: mortality.period,\n startAtBlock: {\n height: atBlock.number,\n hash: atBlock.hash,\n },\n }\n : { mortal: false },\n customSignedExtensions,\n asset: hinted.asset,\n })\n\n return signer.signTx(\n callData,\n signExtensions,\n ctx.metadataRaw,\n atBlock.number,\n )\n }),\n )\n\nconst getNonce$ = (chainHead: ChainHead$, from: HexString) => {\n const followHead$ = (head: string) =>\n chainHead.newBlocks$.pipe(\n scan((acc, block) => (block.parent === acc ? block.hash : acc), head),\n startWith(head),\n distinctUntilChanged(),\n )\n const followNonce$ = (head: string) =>\n followHead$(head).pipe(\n take(2),\n switchMap((hash) => getNonceAtBlock$(chainHead.call$, from, hash)),\n )\n const getHeadsNonce$ = (heads: string[]) =>\n combineLatest(\n heads.map((head) =>\n followNonce$(head).pipe(\n map((value) => ({\n success: true as const,\n value,\n })),\n catchError((err) =>\n of({\n success: false as const,\n value: err,\n }),\n ),\n ),\n ),\n ).pipe(take(1))\n\n return chainHead.pinnedBlocks$.pipe(\n take(1),\n map(({ blocks, best }) => {\n // Grab only the heads: those blocks above the best that don't have children and are not getting pruned\n const bestBlock = blocks.get(best)!\n return [...blocks.values()]\n .filter(\n (v) =>\n !v.pruned && v.children.size === 0 && v.number >= bestBlock.number,\n )\n .map((v) => v.hash)\n }),\n switchMap(getHeadsNonce$),\n map((result) => {\n const winner = result.reduce(\n (acc: bigint | number | null, v) =>\n v.success ? (v.value >= (acc ?? 0) ? v.value : acc) : acc,\n null,\n )\n\n if (winner == null) {\n // We must have at least one error\n throw result[0].value\n }\n return winner\n }),\n )\n}\n"],"names":[],"mappings":"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"}
@@ -122,7 +122,7 @@ const submit$ = (chainHead, broadcastTx$, tx, emitSign = false) => chainHead.has
122
122
  };
123
123
  const getTipsFromHeight = (height) => {
124
124
  let tips = [...pinnedBlocks.blocks.values()].filter(
125
- (block) => !block.unpinnable && !block.children.size
125
+ (block) => !block.pruned && !block.children.size
126
126
  );
127
127
  const higherTip = Math.max(...tips.map(({ number }) => number));
128
128
  tips = tips.filter(({ number }) => number >= higherTip - 1);
@@ -1 +1 @@
1
- {"version":3,"file":"submit-fns.mjs","sources":["../../../src/tx/submit-fns.ts"],"sourcesContent":["import {\n Binary,\n HexString,\n ResultPayload,\n} from \"@polkadot-api/substrate-bindings\"\nimport {\n EMPTY,\n Observable,\n concat,\n defer,\n distinctUntilChanged,\n endWith,\n filter,\n ignoreElements,\n lastValueFrom,\n map,\n merge,\n mergeMap,\n of,\n race,\n take,\n takeWhile,\n} from \"rxjs\"\nimport {\n BlockInfo,\n ChainHead$,\n PinnedBlocks,\n SystemEvent,\n} from \"@polkadot-api/observable-client\"\nimport { AnalyzedBlock } from \"@polkadot-api/observable-client\"\nimport { TxEvent, TxEventsPayload, TxFinalizedPayload } from \"./types\"\nimport { continueWith } from \"@/utils\"\nimport { fromHex, toHex } from \"@polkadot-api/utils\"\n\nconst computeState = (\n analized$: Observable<AnalyzedBlock>,\n blocks$: Observable<PinnedBlocks>,\n) =>\n new Observable<\n | {\n found: true\n hash: string\n number: number\n index: number\n events: any\n }\n | { found: false; validity: ResultPayload<any, any> | null }\n >((observer) => {\n const analyzedBlocks = new Map<string, AnalyzedBlock>()\n let pinnedBlocks: PinnedBlocks\n let latestState:\n | {\n found: true\n hash: string\n number: number\n index: number\n events: any\n }\n | { found: false; validity: ResultPayload<any, any> | null }\n\n const computeNextState = () => {\n let current: string = pinnedBlocks.best\n let analyzed: AnalyzedBlock | undefined = analyzedBlocks.get(current)\n let analyzedNumber = pinnedBlocks.blocks.get(current)!.number\n\n while (!analyzed) {\n const block = pinnedBlocks.blocks.get(current)\n if (!block) break\n analyzed = analyzedBlocks.get((current = block.parent))\n analyzedNumber--\n }\n\n if (!analyzed) return // this shouldn't happen, though\n\n const isFinalized =\n analyzedNumber <=\n pinnedBlocks.blocks.get(pinnedBlocks.finalized)!.number\n\n const found = analyzed.found.type\n if (found && latestState?.found && latestState.hash === analyzed.hash) {\n if (isFinalized) observer.complete()\n return\n }\n\n observer.next(\n (latestState = analyzed.found.type\n ? {\n found: found as true,\n hash: analyzed.hash,\n number: analyzedNumber,\n index: analyzed.found.index,\n events: analyzed.found.events,\n }\n : {\n found: found as false,\n validity: analyzed.found.validity,\n }),\n )\n\n if (isFinalized) {\n if (found) observer.complete()\n else if (analyzed.found.validity?.success === false)\n observer.error(new InvalidTxError(analyzed.found.validity.value))\n }\n }\n\n const subscription = blocks$\n .pipe(\n distinctUntilChanged(\n (a, b) => a.finalized === b.finalized && a.best === b.best,\n ),\n )\n .subscribe({\n next: (pinned: PinnedBlocks) => {\n pinnedBlocks = pinned\n if (analyzedBlocks.size === 0) return\n computeNextState()\n },\n error(e) {\n observer.error(e)\n },\n })\n\n subscription.add(\n analized$.subscribe({\n next: (block) => {\n analyzedBlocks.set(block.hash, block)\n computeNextState()\n },\n error(e) {\n observer.error(e)\n },\n }),\n )\n\n return subscription\n }).pipe(distinctUntilChanged((a, b) => a === b))\n\nconst getTxSuccessFromSystemEvents = (\n systemEvents: Array<SystemEvent>,\n txIdx: number,\n): Omit<TxEventsPayload, \"block\"> => {\n const events = systemEvents\n .filter((x) => x.phase.type === \"ApplyExtrinsic\" && x.phase.value === txIdx)\n .map((x) => ({ ...x.event, topics: x.topics }))\n\n const lastEvent = events[events.length - 1]\n if (\n lastEvent.type === \"System\" &&\n lastEvent.value.type === \"ExtrinsicFailed\"\n ) {\n return {\n ok: false,\n events,\n dispatchError: lastEvent.value.value.dispatch_error,\n }\n }\n\n return { ok: true, events }\n}\n\n/*\ntype TransactionValidityError = Enum<{\n Invalid: Enum<{\n Call: undefined\n Payment: undefined\n Future: undefined\n Stale: undefined\n BadProof: undefined\n AncientBirthBlock: undefined\n ExhaustsResources: undefined\n Custom: number\n BadMandatory: undefined\n MandatoryValidation: undefined\n BadSigner: undefined\n }>\n Unknown: Enum<{\n CannotLookup: undefined\n NoUnsignedValidator: undefined\n Custom: number\n }>\n}>\n*/\nexport class InvalidTxError extends Error {\n error: any // likely to be a `TransactionValidityError`\n constructor(e: any) {\n super(\n JSON.stringify(\n e,\n (_, value) => {\n if (typeof value === \"bigint\") return value.toString()\n return value instanceof Binary ? value.asHex() : value\n },\n 2,\n ),\n )\n this.name = \"InvalidTxError\"\n this.error = e\n }\n}\n\nexport const submit$ = (\n chainHead: ChainHead$,\n broadcastTx$: (tx: string) => Observable<never>,\n tx: HexString,\n emitSign = false,\n): Observable<TxEvent> =>\n chainHead.hasher$.pipe(\n mergeMap((hasher) => {\n const txHash = toHex(hasher(fromHex(tx)))\n const getTxEvent = <\n Type extends TxEvent[\"type\"],\n Rest extends Omit<TxEvent & { type: Type }, \"type\" | \"txHash\">,\n >(\n type: Type,\n rest: Rest,\n ): TxEvent & { type: Type } =>\n ({\n type,\n txHash,\n ...rest,\n }) as any\n\n const pinnedBlocks = chainHead.pinnedBlocks$.state\n const getHeightFromMortality = (\n mortality:\n | {\n mortal: false\n }\n | {\n mortal: true\n period: number\n phase: number\n },\n ) => {\n if (!mortality.mortal) return 0\n const { phase, period } = mortality\n const topNumber = pinnedBlocks.blocks.get(pinnedBlocks.best)!.number\n return (\n Math.floor((Math.max(topNumber, phase) - phase) / period) * period +\n phase\n )\n }\n\n const getTipsFromHeight = (height: number): BlockInfo[] => {\n let tips: BlockInfo[] = [...pinnedBlocks.blocks.values()].filter(\n (block) => !block.unpinnable && !block.children.size,\n )\n const higherTip = Math.max(...tips.map(({ number }) => number))\n // take only tips \"with chance to become canonical\"\n tips = tips.filter(({ number }) => number >= higherTip - 1)\n\n const finalized = pinnedBlocks.blocks.get(pinnedBlocks.finalized)!\n tips = finalized.children ? [finalized, ...tips] : tips\n\n return tips.filter((x) => x.number >= height)\n }\n\n const validateTxAt$ = ({ hash }: BlockInfo) =>\n chainHead.validateTx$(hash, tx)\n const validate$: Observable<never> = defer(() =>\n pinnedBlocks.finalizedRuntime.runtime.pipe(\n map((r) => r.getMortalityFromTx(tx)),\n map(getHeightFromMortality),\n map(getTipsFromHeight),\n mergeMap((blocksToValidate) => {\n let err: InvalidTxError\n return merge(\n ...blocksToValidate.map((b) =>\n race(\n validateTxAt$(b),\n chainHead.finalized$.pipe(\n takeWhile((finalized) => {\n if (finalized.number < b.number) return true\n let curr = finalized\n while (curr.number > b.number) {\n const parent = pinnedBlocks.blocks.get(curr.parent)\n if (!parent) return false\n curr = parent\n }\n return curr.hash === finalized.hash\n }),\n ignoreElements(),\n endWith({ success: null }),\n ),\n ),\n ),\n ).pipe(\n filter((v, idx) => {\n // save first error\n if (v.success === false) err ??= new InvalidTxError(v.value)\n\n if (v.success) return true\n if (idx === blocksToValidate.length - 1 && err) throw err\n return false\n }),\n take(1),\n )\n }),\n ignoreElements(),\n ),\n )\n\n const track$ = new Observable<AnalyzedBlock>((observer) => {\n const subscription = chainHead.trackTx$(tx).subscribe(observer)\n subscription.add(\n broadcastTx$(tx).subscribe({\n error(e) {\n observer.error(e)\n },\n }),\n )\n return subscription\n })\n\n const bestBlockState$ = computeState(\n track$,\n chainHead.pinnedBlocks$,\n ).pipe(\n map((x) => {\n if (!x.found)\n return getTxEvent(\"txBestBlocksState\", {\n found: false,\n isValid: x.validity?.success !== false,\n })\n\n return getTxEvent(\"txBestBlocksState\", {\n found: true,\n block: {\n index: x.index,\n number: x.number,\n hash: x.hash,\n },\n ...getTxSuccessFromSystemEvents(x.events, x.index),\n })\n }),\n )\n\n return concat(\n emitSign ? of(getTxEvent(\"signed\", {})) : EMPTY,\n validate$,\n of(getTxEvent(\"broadcasted\", {})),\n bestBlockState$.pipe(\n continueWith(({ found, type, ...rest }) =>\n found ? of(getTxEvent(\"finalized\", rest as any)) : EMPTY,\n ),\n ),\n )\n }),\n )\n\nexport const submit = async (\n chainHead: ChainHead$,\n broadcastTx$: (tx: string) => Observable<never>,\n transaction: HexString,\n _at?: HexString,\n): Promise<TxFinalizedPayload> =>\n lastValueFrom(submit$(chainHead, broadcastTx$, transaction)).then((x) => {\n if (x.type !== \"finalized\") throw null\n const result: TxFinalizedPayload = { ...x }\n delete (result as any).type\n return result\n })\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"submit-fns.mjs","sources":["../../../src/tx/submit-fns.ts"],"sourcesContent":["import {\n Binary,\n HexString,\n ResultPayload,\n} from \"@polkadot-api/substrate-bindings\"\nimport {\n EMPTY,\n Observable,\n concat,\n defer,\n distinctUntilChanged,\n endWith,\n filter,\n ignoreElements,\n lastValueFrom,\n map,\n merge,\n mergeMap,\n of,\n race,\n take,\n takeWhile,\n} from \"rxjs\"\nimport {\n BlockInfo,\n ChainHead$,\n PinnedBlocks,\n SystemEvent,\n} from \"@polkadot-api/observable-client\"\nimport { AnalyzedBlock } from \"@polkadot-api/observable-client\"\nimport { TxEvent, TxEventsPayload, TxFinalizedPayload } from \"./types\"\nimport { continueWith } from \"@/utils\"\nimport { fromHex, toHex } from \"@polkadot-api/utils\"\n\nconst computeState = (\n analized$: Observable<AnalyzedBlock>,\n blocks$: Observable<PinnedBlocks>,\n) =>\n new Observable<\n | {\n found: true\n hash: string\n number: number\n index: number\n events: any\n }\n | { found: false; validity: ResultPayload<any, any> | null }\n >((observer) => {\n const analyzedBlocks = new Map<string, AnalyzedBlock>()\n let pinnedBlocks: PinnedBlocks\n let latestState:\n | {\n found: true\n hash: string\n number: number\n index: number\n events: any\n }\n | { found: false; validity: ResultPayload<any, any> | null }\n\n const computeNextState = () => {\n let current: string = pinnedBlocks.best\n let analyzed: AnalyzedBlock | undefined = analyzedBlocks.get(current)\n let analyzedNumber = pinnedBlocks.blocks.get(current)!.number\n\n while (!analyzed) {\n const block = pinnedBlocks.blocks.get(current)\n if (!block) break\n analyzed = analyzedBlocks.get((current = block.parent))\n analyzedNumber--\n }\n\n if (!analyzed) return // this shouldn't happen, though\n\n const isFinalized =\n analyzedNumber <=\n pinnedBlocks.blocks.get(pinnedBlocks.finalized)!.number\n\n const found = analyzed.found.type\n if (found && latestState?.found && latestState.hash === analyzed.hash) {\n if (isFinalized) observer.complete()\n return\n }\n\n observer.next(\n (latestState = analyzed.found.type\n ? {\n found: found as true,\n hash: analyzed.hash,\n number: analyzedNumber,\n index: analyzed.found.index,\n events: analyzed.found.events,\n }\n : {\n found: found as false,\n validity: analyzed.found.validity,\n }),\n )\n\n if (isFinalized) {\n if (found) observer.complete()\n else if (analyzed.found.validity?.success === false)\n observer.error(new InvalidTxError(analyzed.found.validity.value))\n }\n }\n\n const subscription = blocks$\n .pipe(\n distinctUntilChanged(\n (a, b) => a.finalized === b.finalized && a.best === b.best,\n ),\n )\n .subscribe({\n next: (pinned: PinnedBlocks) => {\n pinnedBlocks = pinned\n if (analyzedBlocks.size === 0) return\n computeNextState()\n },\n error(e) {\n observer.error(e)\n },\n })\n\n subscription.add(\n analized$.subscribe({\n next: (block) => {\n analyzedBlocks.set(block.hash, block)\n computeNextState()\n },\n error(e) {\n observer.error(e)\n },\n }),\n )\n\n return subscription\n }).pipe(distinctUntilChanged((a, b) => a === b))\n\nconst getTxSuccessFromSystemEvents = (\n systemEvents: Array<SystemEvent>,\n txIdx: number,\n): Omit<TxEventsPayload, \"block\"> => {\n const events = systemEvents\n .filter((x) => x.phase.type === \"ApplyExtrinsic\" && x.phase.value === txIdx)\n .map((x) => ({ ...x.event, topics: x.topics }))\n\n const lastEvent = events[events.length - 1]\n if (\n lastEvent.type === \"System\" &&\n lastEvent.value.type === \"ExtrinsicFailed\"\n ) {\n return {\n ok: false,\n events,\n dispatchError: lastEvent.value.value.dispatch_error,\n }\n }\n\n return { ok: true, events }\n}\n\n/*\ntype TransactionValidityError = Enum<{\n Invalid: Enum<{\n Call: undefined\n Payment: undefined\n Future: undefined\n Stale: undefined\n BadProof: undefined\n AncientBirthBlock: undefined\n ExhaustsResources: undefined\n Custom: number\n BadMandatory: undefined\n MandatoryValidation: undefined\n BadSigner: undefined\n }>\n Unknown: Enum<{\n CannotLookup: undefined\n NoUnsignedValidator: undefined\n Custom: number\n }>\n}>\n*/\nexport class InvalidTxError extends Error {\n error: any // likely to be a `TransactionValidityError`\n constructor(e: any) {\n super(\n JSON.stringify(\n e,\n (_, value) => {\n if (typeof value === \"bigint\") return value.toString()\n return value instanceof Binary ? value.asHex() : value\n },\n 2,\n ),\n )\n this.name = \"InvalidTxError\"\n this.error = e\n }\n}\n\nexport const submit$ = (\n chainHead: ChainHead$,\n broadcastTx$: (tx: string) => Observable<never>,\n tx: HexString,\n emitSign = false,\n): Observable<TxEvent> =>\n chainHead.hasher$.pipe(\n mergeMap((hasher) => {\n const txHash = toHex(hasher(fromHex(tx)))\n const getTxEvent = <\n Type extends TxEvent[\"type\"],\n Rest extends Omit<TxEvent & { type: Type }, \"type\" | \"txHash\">,\n >(\n type: Type,\n rest: Rest,\n ): TxEvent & { type: Type } =>\n ({\n type,\n txHash,\n ...rest,\n }) as any\n\n const pinnedBlocks = chainHead.pinnedBlocks$.state\n const getHeightFromMortality = (\n mortality:\n | {\n mortal: false\n }\n | {\n mortal: true\n period: number\n phase: number\n },\n ) => {\n if (!mortality.mortal) return 0\n const { phase, period } = mortality\n const topNumber = pinnedBlocks.blocks.get(pinnedBlocks.best)!.number\n return (\n Math.floor((Math.max(topNumber, phase) - phase) / period) * period +\n phase\n )\n }\n\n const getTipsFromHeight = (height: number): BlockInfo[] => {\n let tips: BlockInfo[] = [...pinnedBlocks.blocks.values()].filter(\n (block) => !block.pruned && !block.children.size,\n )\n const higherTip = Math.max(...tips.map(({ number }) => number))\n // take only tips \"with chance to become canonical\"\n tips = tips.filter(({ number }) => number >= higherTip - 1)\n\n const finalized = pinnedBlocks.blocks.get(pinnedBlocks.finalized)!\n tips = finalized.children ? [finalized, ...tips] : tips\n\n return tips.filter((x) => x.number >= height)\n }\n\n const validateTxAt$ = ({ hash }: BlockInfo) =>\n chainHead.validateTx$(hash, tx)\n const validate$: Observable<never> = defer(() =>\n pinnedBlocks.finalizedRuntime.runtime.pipe(\n map((r) => r.getMortalityFromTx(tx)),\n map(getHeightFromMortality),\n map(getTipsFromHeight),\n mergeMap((blocksToValidate) => {\n let err: InvalidTxError\n return merge(\n ...blocksToValidate.map((b) =>\n race(\n validateTxAt$(b),\n chainHead.finalized$.pipe(\n takeWhile((finalized) => {\n if (finalized.number < b.number) return true\n let curr = finalized\n while (curr.number > b.number) {\n const parent = pinnedBlocks.blocks.get(curr.parent)\n if (!parent) return false\n curr = parent\n }\n return curr.hash === finalized.hash\n }),\n ignoreElements(),\n endWith({ success: null }),\n ),\n ),\n ),\n ).pipe(\n filter((v, idx) => {\n // save first error\n if (v.success === false) err ??= new InvalidTxError(v.value)\n\n if (v.success) return true\n if (idx === blocksToValidate.length - 1 && err) throw err\n return false\n }),\n take(1),\n )\n }),\n ignoreElements(),\n ),\n )\n\n const track$ = new Observable<AnalyzedBlock>((observer) => {\n const subscription = chainHead.trackTx$(tx).subscribe(observer)\n subscription.add(\n broadcastTx$(tx).subscribe({\n error(e) {\n observer.error(e)\n },\n }),\n )\n return subscription\n })\n\n const bestBlockState$ = computeState(\n track$,\n chainHead.pinnedBlocks$,\n ).pipe(\n map((x) => {\n if (!x.found)\n return getTxEvent(\"txBestBlocksState\", {\n found: false,\n isValid: x.validity?.success !== false,\n })\n\n return getTxEvent(\"txBestBlocksState\", {\n found: true,\n block: {\n index: x.index,\n number: x.number,\n hash: x.hash,\n },\n ...getTxSuccessFromSystemEvents(x.events, x.index),\n })\n }),\n )\n\n return concat(\n emitSign ? of(getTxEvent(\"signed\", {})) : EMPTY,\n validate$,\n of(getTxEvent(\"broadcasted\", {})),\n bestBlockState$.pipe(\n continueWith(({ found, type, ...rest }) =>\n found ? of(getTxEvent(\"finalized\", rest as any)) : EMPTY,\n ),\n ),\n )\n }),\n )\n\nexport const submit = async (\n chainHead: ChainHead$,\n broadcastTx$: (tx: string) => Observable<never>,\n transaction: HexString,\n _at?: HexString,\n): Promise<TxFinalizedPayload> =>\n lastValueFrom(submit$(chainHead, broadcastTx$, transaction)).then((x) => {\n if (x.type !== \"finalized\") throw null\n const result: TxFinalizedPayload = { ...x }\n delete (result as any).type\n return result\n })\n"],"names":[],"mappings":";;;;;;;;;;;AAkCA,MAAM,eAAe,CACnB,SAAA,EACA,YAEA,IAAI,UAAA,CASF,CAAC,QAAA,KAAa;AACd,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAA2B;AACtD,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,WAAA;AAUJ,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,IAAI,UAAkB,YAAA,CAAa,IAAA;AACnC,IAAA,IAAI,QAAA,GAAsC,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AACpE,IAAA,IAAI,cAAA,GAAiB,YAAA,CAAa,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,CAAG,MAAA;AAEvD,IAAA,OAAO,CAAC,QAAA,EAAU;AAChB,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAC7C,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,QAAA,GAAW,cAAA,CAAe,GAAA,CAAK,OAAA,GAAU,KAAA,CAAM,MAAO,CAAA;AACtD,MAAA,cAAA,EAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAM,cACJ,cAAA,IACA,YAAA,CAAa,OAAO,GAAA,CAAI,YAAA,CAAa,SAAS,CAAA,CAAG,MAAA;AAEnD,IAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,CAAM,IAAA;AAC7B,IAAA,IAAI,SAAS,WAAA,EAAa,KAAA,IAAS,WAAA,CAAY,IAAA,KAAS,SAAS,IAAA,EAAM;AACrE,MAAA,IAAI,WAAA,WAAsB,QAAA,EAAS;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAA;AAAA,MACN,WAAA,GAAc,QAAA,CAAS,KAAA,CAAM,IAAA,GAC1B;AAAA,QACE,KAAA;AAAA,QACA,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,MAAA,EAAQ,cAAA;AAAA,QACR,KAAA,EAAO,SAAS,KAAA,CAAM,KAAA;AAAA,QACtB,MAAA,EAAQ,SAAS,KAAA,CAAM;AAAA,OACzB,GACA;AAAA,QACE,KAAA;AAAA,QACA,QAAA,EAAU,SAAS,KAAA,CAAM;AAAA;AAC3B,KACN;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAI,KAAA,WAAgB,QAAA,EAAS;AAAA,WAAA,IACpB,QAAA,CAAS,KAAA,CAAM,QAAA,EAAU,OAAA,KAAY,KAAA;AAC5C,QAAA,QAAA,CAAS,MAAM,IAAI,cAAA,CAAe,SAAS,KAAA,CAAM,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IACpE;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAe,OAAA,CAClB,IAAA;AAAA,IACC,oBAAA;AAAA,MACE,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,cAAc,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE;AAAA;AACxD,IAED,SAAA,CAAU;AAAA,IACT,IAAA,EAAM,CAAC,MAAA,KAAyB;AAC9B,MAAA,YAAA,GAAe,MAAA;AACf,MAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC/B,MAAA,gBAAA,EAAiB;AAAA,IACnB,CAAA;AAAA,IACA,MAAM,CAAA,EAAG;AACP,MAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,IAClB;AAAA,GACD,CAAA;AAEH,EAAA,YAAA,CAAa,GAAA;AAAA,IACX,UAAU,SAAA,CAAU;AAAA,MAClB,IAAA,EAAM,CAAC,KAAA,KAAU;AACf,QAAA,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AACpC,QAAA,gBAAA,EAAiB;AAAA,MACnB,CAAA;AAAA,MACA,MAAM,CAAA,EAAG;AACP,QAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,MAClB;AAAA,KACD;AAAA,GACH;AAEA,EAAA,OAAO,YAAA;AACT,CAAC,CAAA,CAAE,KAAK,oBAAA,CAAqB,CAAC,GAAG,CAAA,KAAM,CAAA,KAAM,CAAC,CAAC,CAAA;AAEjD,MAAM,4BAAA,GAA+B,CACnC,YAAA,EACA,KAAA,KACmC;AACnC,EAAA,MAAM,MAAA,GAAS,YAAA,CACZ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,KAAA,CAAM,IAAA,KAAS,gBAAA,IAAoB,CAAA,CAAE,KAAA,CAAM,KAAA,KAAU,KAAK,CAAA,CAC1E,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,CAAA;AAEhD,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAC1C,EAAA,IACE,UAAU,IAAA,KAAS,QAAA,IACnB,SAAA,CAAU,KAAA,CAAM,SAAS,iBAAA,EACzB;AACA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA;AAAA,MACA,aAAA,EAAe,SAAA,CAAU,KAAA,CAAM,KAAA,CAAM;AAAA,KACvC;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAO;AAC5B,CAAA;AAwBO,MAAM,uBAAuB,KAAA,CAAM;AAAA;AAAA,EAExC,YAAY,CAAA,EAAQ;AAClB,IAAA,KAAA;AAAA,MACE,IAAA,CAAK,SAAA;AAAA,QACH,CAAA;AAAA,QACA,CAAC,GAAG,KAAA,KAAU;AACZ,UAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,MAAM,QAAA,EAAS;AACrD,UAAA,OAAO,KAAA,YAAiB,MAAA,GAAS,KAAA,CAAM,KAAA,EAAM,GAAI,KAAA;AAAA,QACnD,CAAA;AAAA,QACA;AAAA;AACF,KACF;AAXF,IAAA,aAAA,CAAA,IAAA,EAAA,OAAA,CAAA;AAYE,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AAAA,EACf;AACF;AAEO,MAAM,OAAA,GAAU,CACrB,SAAA,EACA,YAAA,EACA,IACA,QAAA,GAAW,KAAA,KAEX,UAAU,OAAA,CAAQ,IAAA;AAAA,EAChB,QAAA,CAAS,CAAC,MAAA,KAAW;AACnB,IAAA,MAAM,SAAS,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAC,CAAC,CAAA;AACxC,IAAA,MAAM,UAAA,GAAa,CAIjB,IAAA,EACA,IAAA,MAEC;AAAA,MACC,IAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAG;AAAA,KACL,CAAA;AAEF,IAAA,MAAM,YAAA,GAAe,UAAU,aAAA,CAAc,KAAA;AAC7C,IAAA,MAAM,sBAAA,GAAyB,CAC7B,SAAA,KASG;AACH,MAAA,IAAI,CAAC,SAAA,CAAU,MAAA,EAAQ,OAAO,CAAA;AAC9B,MAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,SAAA;AAC1B,MAAA,MAAM,YAAY,YAAA,CAAa,MAAA,CAAO,GAAA,CAAI,YAAA,CAAa,IAAI,CAAA,CAAG,MAAA;AAC9D,MAAA,OACE,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,KAAK,CAAA,GAAI,KAAA,IAAS,MAAM,CAAA,GAAI,MAAA,GAC5D,KAAA;AAAA,IAEJ,CAAA;AAEA,IAAA,MAAM,iBAAA,GAAoB,CAAC,MAAA,KAAgC;AACzD,MAAA,IAAI,OAAoB,CAAC,GAAG,aAAa,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,QACxD,CAAC,KAAA,KAAU,CAAC,MAAM,MAAA,IAAU,CAAC,MAAM,QAAA,CAAS;AAAA,OAC9C;AACA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,EAAE,MAAA,EAAO,KAAM,MAAM,CAAC,CAAA;AAE9D,MAAA,IAAA,GAAO,IAAA,CAAK,OAAO,CAAC,EAAE,QAAO,KAAM,MAAA,IAAU,YAAY,CAAC,CAAA;AAE1D,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,MAAA,CAAO,GAAA,CAAI,aAAa,SAAS,CAAA;AAChE,MAAA,IAAA,GAAO,UAAU,QAAA,GAAW,CAAC,SAAA,EAAW,GAAG,IAAI,CAAA,GAAI,IAAA;AAEnD,MAAA,OAAO,KAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,MAAM,CAAA;AAAA,IAC9C,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,EAAE,IAAA,OACvB,SAAA,CAAU,WAAA,CAAY,MAAM,EAAE,CAAA;AAChC,IAAA,MAAM,SAAA,GAA+B,KAAA;AAAA,MAAM,MACzC,YAAA,CAAa,gBAAA,CAAiB,OAAA,CAAQ,IAAA;AAAA,QACpC,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,QACnC,IAAI,sBAAsB,CAAA;AAAA,QAC1B,IAAI,iBAAiB,CAAA;AAAA,QACrB,QAAA,CAAS,CAAC,gBAAA,KAAqB;AAC7B,UAAA,IAAI,GAAA;AACJ,UAAA,OAAO,KAAA;AAAA,YACL,GAAG,gBAAA,CAAiB,GAAA;AAAA,cAAI,CAAC,CAAA,KACvB,IAAA;AAAA,gBACE,cAAc,CAAC,CAAA;AAAA,gBACf,UAAU,UAAA,CAAW,IAAA;AAAA,kBACnB,SAAA,CAAU,CAAC,SAAA,KAAc;AACvB,oBAAA,IAAI,SAAA,CAAU,MAAA,GAAS,CAAA,CAAE,MAAA,EAAQ,OAAO,IAAA;AACxC,oBAAA,IAAI,IAAA,GAAO,SAAA;AACX,oBAAA,OAAO,IAAA,CAAK,MAAA,GAAS,CAAA,CAAE,MAAA,EAAQ;AAC7B,sBAAA,MAAM,MAAA,GAAS,YAAA,CAAa,MAAA,CAAO,GAAA,CAAI,KAAK,MAAM,CAAA;AAClD,sBAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,sBAAA,IAAA,GAAO,MAAA;AAAA,oBACT;AACA,oBAAA,OAAO,IAAA,CAAK,SAAS,SAAA,CAAU,IAAA;AAAA,kBACjC,CAAC,CAAA;AAAA,kBACD,cAAA,EAAe;AAAA,kBACf,OAAA,CAAQ,EAAE,OAAA,EAAS,IAAA,EAAM;AAAA;AAC3B;AACF;AACF,WACF,CAAE,IAAA;AAAA,YACA,MAAA,CAAO,CAAC,CAAA,EAAG,GAAA,KAAQ;AAEjB,cAAA,IAAI,EAAE,OAAA,KAAY,KAAA,gBAAe,IAAI,cAAA,CAAe,EAAE,KAAK,CAAA,CAAA;AAE3D,cAAA,IAAI,CAAA,CAAE,SAAS,OAAO,IAAA;AACtB,cAAA,IAAI,GAAA,KAAQ,gBAAA,CAAiB,MAAA,GAAS,CAAA,IAAK,KAAK,MAAM,GAAA;AACtD,cAAA,OAAO,KAAA;AAAA,YACT,CAAC,CAAA;AAAA,YACD,KAAK,CAAC;AAAA,WACR;AAAA,QACF,CAAC,CAAA;AAAA,QACD,cAAA;AAAe;AACjB,KACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAA0B,CAAC,QAAA,KAAa;AACzD,MAAA,MAAM,eAAe,SAAA,CAAU,QAAA,CAAS,EAAE,CAAA,CAAE,UAAU,QAAQ,CAAA;AAC9D,MAAA,YAAA,CAAa,GAAA;AAAA,QACX,YAAA,CAAa,EAAE,CAAA,CAAE,SAAA,CAAU;AAAA,UACzB,MAAM,CAAA,EAAG;AACP,YAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,UAClB;AAAA,SACD;AAAA,OACH;AACA,MAAA,OAAO,YAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,MAAM,eAAA,GAAkB,YAAA;AAAA,MACtB,MAAA;AAAA,MACA,SAAA,CAAU;AAAA,KACZ,CAAE,IAAA;AAAA,MACA,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,QAAA,IAAI,CAAC,CAAA,CAAE,KAAA;AACL,UAAA,OAAO,WAAW,mBAAA,EAAqB;AAAA,YACrC,KAAA,EAAO,KAAA;AAAA,YACP,OAAA,EAAS,CAAA,CAAE,QAAA,EAAU,OAAA,KAAY;AAAA,WAClC,CAAA;AAEH,QAAA,OAAO,WAAW,mBAAA,EAAqB;AAAA,UACrC,KAAA,EAAO,IAAA;AAAA,UACP,KAAA,EAAO;AAAA,YACL,OAAO,CAAA,CAAE,KAAA;AAAA,YACT,QAAQ,CAAA,CAAE,MAAA;AAAA,YACV,MAAM,CAAA,CAAE;AAAA,WACV;AAAA,UACA,GAAG,4BAAA,CAA6B,CAAA,CAAE,MAAA,EAAQ,EAAE,KAAK;AAAA,SAClD,CAAA;AAAA,MACH,CAAC;AAAA,KACH;AAEA,IAAA,OAAO,MAAA;AAAA,MACL,WAAW,EAAA,CAAG,UAAA,CAAW,UAAU,EAAE,CAAC,CAAA,GAAI,KAAA;AAAA,MAC1C,SAAA;AAAA,MACA,EAAA,CAAG,UAAA,CAAW,aAAA,EAAe,EAAE,CAAC,CAAA;AAAA,MAChC,eAAA,CAAgB,IAAA;AAAA,QACd,YAAA;AAAA,UAAa,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,GAAG,IAAA,EAAK,KACnC,KAAA,GAAQ,EAAA,CAAG,UAAA,CAAW,WAAA,EAAa,IAAW,CAAC,CAAA,GAAI;AAAA;AACrD;AACF,KACF;AAAA,EACF,CAAC;AACH;AAEK,MAAM,MAAA,GAAS,OACpB,SAAA,EACA,YAAA,EACA,aACA,GAAA,KAEA,aAAA,CAAc,OAAA,CAAQ,SAAA,EAAW,cAAc,WAAW,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM;AACvE,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,WAAA,EAAa,MAAM,IAAA;AAClC,EAAA,MAAM,MAAA,GAA6B,EAAE,GAAG,CAAA,EAAE;AAC1C,EAAA,OAAQ,MAAA,CAAe,IAAA;AACvB,EAAA,OAAO,MAAA;AACT,CAAC;;;;"}
package/dist/index.js CHANGED
@@ -846,7 +846,7 @@ const getNonce$ = (chainHead, from) => {
846
846
  rxjs.map(({ blocks, best }) => {
847
847
  const bestBlock = blocks.get(best);
848
848
  return [...blocks.values()].filter(
849
- (v) => !v.unpinnable && v.children.size === 0 && v.number >= bestBlock.number
849
+ (v) => !v.pruned && v.children.size === 0 && v.number >= bestBlock.number
850
850
  ).map((v) => v.hash);
851
851
  }),
852
852
  rxjs.switchMap(getHeadsNonce$),
@@ -979,7 +979,7 @@ const submit$ = (chainHead, broadcastTx$, tx, emitSign = false) => chainHead.has
979
979
  };
980
980
  const getTipsFromHeight = (height) => {
981
981
  let tips = [...pinnedBlocks.blocks.values()].filter(
982
- (block) => !block.unpinnable && !block.children.size
982
+ (block) => !block.pruned && !block.children.size
983
983
  );
984
984
  const higherTip = Math.max(...tips.map(({ number }) => number));
985
985
  tips = tips.filter(({ number }) => number >= higherTip - 1);