@xyo-network/chain-wrappers 1.16.24 → 1.16.25

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.
@@ -1,19 +1,15 @@
1
1
  import type { Hash, Hex } from '@xylabs/sdk-js';
2
2
  import type { WithHashMeta } from '@xyo-network/payload-model';
3
- import type { HydratedBlock } from '@xyo-network/xl1-protocol';
3
+ import type { HydratedBlockWithHashMeta } from '@xyo-network/xl1-protocol';
4
4
  import type { AccountBalanceViewer, HydratedBlockInstance, HydratedTransactionInstance, SignatureInstance } from '@xyo-network/xl1-protocol-sdk';
5
- export declare class HydratedBlockWrapper<T extends HydratedBlock> implements HydratedBlockInstance<[WithHashMeta<T[0]>, WithHashMeta<T[1][number]>[]]> {
5
+ export declare class HydratedBlockWrapper<T extends HydratedBlockWithHashMeta> implements HydratedBlockInstance<[WithHashMeta<T[0]>, WithHashMeta<T[1][number]>[]]> {
6
6
  data: [WithHashMeta<T[0]>, WithHashMeta<T[1][number]>[]];
7
- protected allPayloadsCache: WithHashMeta<WithHashMeta<T[1][number]>>[];
7
+ protected allPayloadsCache: WithHashMeta<T[1][number]>[];
8
8
  protected transactionsCache: HydratedTransactionInstance[];
9
9
  private _parseErrors;
10
10
  private _signatureCache;
11
11
  protected constructor(data: [WithHashMeta<T[0]>, WithHashMeta<T[1][number]>[]]);
12
- get block(): number & {
13
- readonly __blockNumber: true;
14
- } & {
15
- readonly __xl1BlockNumber: true;
16
- };
12
+ get block(): import("@xyo-network/xl1-protocol").XL1BlockNumber;
17
13
  get boundWitness(): WithHashMeta<T[0]>;
18
14
  get chain(): Hex;
19
15
  get parseErrors(): Error[];
@@ -25,7 +21,7 @@ export declare class HydratedBlockWrapper<T extends HydratedBlock> implements Hy
25
21
  get stepHashes(): Hash[];
26
22
  get transactionCount(): number;
27
23
  get transactions(): HydratedTransactionInstance[];
28
- static parse<T extends HydratedBlock>(block: T, validate?: boolean): Promise<HydratedBlockInstance>;
24
+ static parse<T extends HydratedBlockWithHashMeta>(block: T, validate?: boolean): Promise<HydratedBlockInstance>;
29
25
  payload(index: number): WithHashMeta<T[1][number]> | undefined;
30
26
  signature(index: number): SignatureInstance | undefined;
31
27
  transaction(index: number): HydratedTransactionInstance | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"HydratedBlock.d.ts","sourceRoot":"","sources":["../../../src/block/HydratedBlock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAI/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EACV,aAAa,EACd,MAAM,2BAA2B,CAAA;AAKlC,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EAAE,2BAA2B,EAAE,iBAAiB,EACtE,MAAM,+BAA+B,CAAA;AAWtC,qBAAa,oBAAoB,CAAC,CAAC,SAAS,aAAa,CAAE,YAAW,qBAAqB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7I,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAA;IACxD,SAAS,CAAC,gBAAgB,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAK;IAC3E,SAAS,CAAC,iBAAiB,EAAE,2BAA2B,EAAE,CAAK;IAC/D,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,eAAe,CAA0B;IAEjD,SAAS,aAAa,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;IAI9E,IAAI,KAAK;;;;MAER;IAED,IAAI,YAAY,uBAEf;IAED,IAAI,KAAK,IAAI,GAAG,CAEf;IAED,IAAI,WAAW,YAEd;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAE7B;IAED,IAAI,MAAM,IAAI,MAAM,CAOnB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,UAAU,IAAI,iBAAiB,EAAE,CAEpC;IAED,IAAI,UAAU,IAAI,IAAI,EAAE,CAEvB;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,YAAY,IAAI,2BAA2B,EAAE,CAEhD;WAEY,KAAK,CAAC,CAAC,SAAS,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAKvG,OAAO,CAAC,KAAK,EAAE,MAAM;IAIrB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIvD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,2BAA2B,GAAG,SAAS;IAI7D,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAI5B,aAAa,CAAC,QAAQ,EAAE;QAAE,cAAc,EAAE,oBAAoB,CAAA;KAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;cAIzE,KAAK,CAAC,QAAQ,UAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAkB5H"}
1
+ {"version":3,"file":"HydratedBlock.d.ts","sourceRoot":"","sources":["../../../src/block/HydratedBlock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAI/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EACV,yBAAyB,EAC1B,MAAM,2BAA2B,CAAA;AAKlC,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EAAE,2BAA2B,EAAE,iBAAiB,EACtE,MAAM,+BAA+B,CAAA;AAWtC,qBAAa,oBAAoB,CAAC,CAAC,SAAS,yBAAyB,CAAE,YAAW,qBAAqB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IACzJ,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAA;IACxD,SAAS,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAK;IAC7D,SAAS,CAAC,iBAAiB,EAAE,2BAA2B,EAAE,CAAK;IAC/D,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,eAAe,CAA0B;IAEjD,SAAS,aAAa,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;IAI9E,IAAI,KAAK,uDAER;IAED,IAAI,YAAY,uBAEf;IAED,IAAI,KAAK,IAAI,GAAG,CAEf;IAED,IAAI,WAAW,YAEd;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAE7B;IAED,IAAI,MAAM,IAAI,MAAM,CAOnB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,UAAU,IAAI,iBAAiB,EAAE,CAEpC;IAED,IAAI,UAAU,IAAI,IAAI,EAAE,CAEvB;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,YAAY,IAAI,2BAA2B,EAAE,CAEhD;WAEY,KAAK,CAAC,CAAC,SAAS,yBAAyB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAKnH,OAAO,CAAC,KAAK,EAAE,MAAM;IAIrB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIvD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,2BAA2B,GAAG,SAAS;IAI7D,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAI5B,aAAa,CAAC,QAAQ,EAAE;QAAE,cAAc,EAAE,oBAAoB,CAAA;KAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;cAIzE,KAAK,CAAC,QAAQ,UAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAkB5H"}
@@ -58,7 +58,7 @@ var HydratedBlockWrapper = class _HydratedBlockWrapper {
58
58
  ];
59
59
  }
60
60
  get stepHashes() {
61
- return this.data[0].step_hashes;
61
+ return this.data[0].step_hashes ?? [];
62
62
  }
63
63
  get transactionCount() {
64
64
  return this.transactionsCache.length;
@@ -145,13 +145,13 @@ var IndexedHydratedBlockRangeStore = class _IndexedHydratedBlockRangeStore exten
145
145
  params.first
146
146
  ])).at(0) ?? (await params.snapshotArchivist.get([
147
147
  params.first
148
- ])).at(0), {});
148
+ ])).at(0));
149
149
  const firstBlockExisting = assertEx(firstBlock, () => "First block not found");
150
150
  const lastBlock = asBlockBoundWitness((await params.sourceArchivist.get([
151
151
  params.last
152
152
  ])).at(0) ?? (await params.snapshotArchivist.get([
153
153
  params.last
154
- ])).at(0), {});
154
+ ])).at(0));
155
155
  const lastBlockExisting = assertEx(lastBlock, () => "Last block not found");
156
156
  const result = new _IndexedHydratedBlockRangeStore(params, firstBlockExisting.block, lastBlockExisting.block);
157
157
  result.createSubscriptions();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/block/HydratedBlock.ts","../../src/block/IndexedHydratedBlockRangeStore.ts","../../src/index.ts"],"sourcesContent":["import type { Hash, Hex } from '@xylabs/sdk-js'\nimport { hexToBigInt } from '@xylabs/sdk-js'\nimport { validateHydratedBlock, validateHydratedBlockState } from '@xyo-network/chain-validation'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WithHashMeta } from '@xyo-network/payload-model'\nimport type {\n HydratedBlock, SignedHydratedTransactionWithStorageMeta, Transfer,\n} from '@xyo-network/xl1-protocol'\nimport {\n isSignedTransactionBoundWitnessWithStorageMeta,\n isTransfer, XYO_ZERO_ADDRESS,\n} from '@xyo-network/xl1-protocol'\nimport type {\n AccountBalanceViewer,\n HydratedBlockInstance, HydratedTransactionInstance, SignatureInstance,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { createSignatureWrappers, HydratedTransactionWrapper } from '@xyo-network/xl1-wrappers'\n\nconst sumTransfers = (payload: Transfer) => {\n let total = 0n\n for (let i of Object.values(payload.transfers)) {\n total += hexToBigInt(i ?? '00' as Hex)\n }\n return total\n}\n\nexport class HydratedBlockWrapper<T extends HydratedBlock> implements HydratedBlockInstance<[WithHashMeta<T[0]>, WithHashMeta<T[1][number]>[]]> {\n data: [WithHashMeta<T[0]>, WithHashMeta<T[1][number]>[]]\n protected allPayloadsCache: WithHashMeta<WithHashMeta<T[1][number]>>[] = []\n protected transactionsCache: HydratedTransactionInstance[] = []\n private _parseErrors: Error[] = []\n private _signatureCache: SignatureInstance[] = []\n\n protected constructor(data: [WithHashMeta<T[0]>, WithHashMeta<T[1][number]>[]]) {\n this.data = data\n }\n\n get block() {\n return this.data[0].block\n }\n\n get boundWitness() {\n return this.data[0]\n }\n\n get chain(): Hex {\n return this.data[0].chain\n }\n\n get parseErrors() {\n return this._parseErrors\n }\n\n get payloadCount(): number {\n return this.allPayloadsCache.length\n }\n\n get payloads(): T[1][number][] {\n return [...this.allPayloadsCache]\n }\n\n get reward(): bigint {\n return this.allPayloadsCache.reduce((acc: bigint, payload) => acc + (\n isTransfer(payload)\n ? payload.from === XYO_ZERO_ADDRESS\n ? sumTransfers(payload)\n : 0n\n : 0n), 0n)\n }\n\n get signatureCount(): number {\n return this._signatureCache.length\n }\n\n get signatures(): SignatureInstance[] {\n return [...this._signatureCache]\n }\n\n get stepHashes(): Hash[] {\n return this.data[0].step_hashes\n }\n\n get transactionCount(): number {\n return this.transactionsCache.length\n }\n\n get transactions(): HydratedTransactionInstance[] {\n return this.transactionsCache\n }\n\n static async parse<T extends HydratedBlock>(block: T, validate = false): Promise<HydratedBlockInstance> {\n const wrapper = new HydratedBlockWrapper<T>(block)\n return await wrapper.parse(validate)\n }\n\n payload(index: number) {\n return this.data[1].at(index)\n }\n\n signature(index: number): SignatureInstance | undefined {\n return this._signatureCache[index]\n }\n\n transaction(index: number): HydratedTransactionInstance | undefined {\n return this.transactionsCache.at(index)\n }\n\n async validate(): Promise<Error[]> {\n return await validateHydratedBlock(this.data)\n }\n\n async validateState(services: { accountBalance: AccountBalanceViewer }): Promise<Error[]> {\n return await validateHydratedBlockState(this.data, this.chain, services)\n }\n\n protected async parse(validate = false): Promise<HydratedBlockInstance<[WithHashMeta<T[0]>, WithHashMeta<T[1][number]>[]]>> {\n const allPayloads = await PayloadBuilder.addStorageMeta(this.data[1])\n for (const payload of allPayloads) {\n if (isSignedTransactionBoundWitnessWithStorageMeta(payload)) {\n const hydratedTransaction: SignedHydratedTransactionWithStorageMeta = [payload, allPayloads.filter(\n p => payload.payload_hashes.includes(p._hash) || payload.payload_hashes.includes(p._dataHash),\n )]\n this.transactionsCache.push(await HydratedTransactionWrapper.parse(hydratedTransaction))\n } else {\n this.allPayloadsCache.push(payload)\n }\n }\n this._signatureCache = await createSignatureWrappers(this.data[0])\n if (validate) {\n this._parseErrors = await this.validate()\n }\n return this\n }\n}\n","import type {\n BaseParams, EmptyObject, Hash, Promisable,\n} from '@xylabs/sdk-js'\nimport {\n assertEx, BaseEmitter, exists, isDefined,\n} from '@xylabs/sdk-js'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport {\n asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta, type HydratedBlock,\n} from '@xyo-network/xl1-protocol'\nimport {\n type BlockWindowInstance, hydrateBlock, readPayloadMapFromStore,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Semaphore } from 'async-mutex'\n\nexport type HydratedBlockStoreParams<TAdditionalParams extends EmptyObject = EmptyObject> = BaseParams<{\n sourceArchivist: ArchivistInstance\n} & TAdditionalParams>\n\nexport interface HydratedBlockStoreInstance {\n fromHash(hash: Hash): Promisable<HydratedBlock | undefined>\n}\n\nexport interface IndexedHydratedBlockStoreInstance extends HydratedBlockStoreInstance {\n fromNumber(number: number): Promisable<HydratedBlock | undefined>\n}\n\nexport interface HydratedBlockRangeStoreParams extends HydratedBlockStoreParams<{\n first: Hash\n last: Hash\n snapshotArchivist: ArchivistInstance\n}> {}\n\nexport interface IndexedHydratedBlockRangeStoreInstance extends BlockWindowInstance, IndexedHydratedBlockStoreInstance {\n first(): Promisable<HydratedBlock>\n last(): Promisable<HydratedBlock>\n next(from: HydratedBlock): Promisable<HydratedBlock | undefined>\n next(from: HydratedBlock, count: number): Promisable<HydratedBlock[]>\n prev(from: HydratedBlock): Promisable<HydratedBlock | undefined>\n prev(from: HydratedBlock, count: number): Promisable<HydratedBlock[]>\n}\n\nconst BlockNumberIndexSemaphoreLocks = 10 as const\n\n// TODO: Allow/Require source/snapshot archivist to be BlockStores instead\nexport class IndexedHydratedBlockRangeStore extends BaseEmitter<HydratedBlockRangeStoreParams> implements IndexedHydratedBlockRangeStoreInstance {\n private _blockNumberIndex: Map<number, Hash> = new Map()\n private _blockNumberIndexSemaphore = new Semaphore(BlockNumberIndexSemaphoreLocks)\n private _firstNumber: number\n private _lastNumber: number\n\n protected constructor(params: HydratedBlockRangeStoreParams, firstNumber: number, lastNumber: number) {\n super(params)\n this._firstNumber = firstNumber\n this._lastNumber = lastNumber\n }\n\n get count(): number {\n return this._lastNumber - this._firstNumber + 1\n }\n\n get numberRange(): [number, number] {\n return [this._firstNumber, this._lastNumber]\n }\n\n get range(): [Hash, Hash] {\n return [this.params.first, this.params.last]\n }\n\n static async create(params: HydratedBlockRangeStoreParams): Promise<IndexedHydratedBlockRangeStore> {\n const firstBlock = asBlockBoundWitness((await params.sourceArchivist.get([params.first])).at(0)\n ?? (await params.snapshotArchivist.get([params.first])).at(0), {})\n const firstBlockExisting = assertEx(firstBlock, () => 'First block not found')\n\n const lastBlock = asBlockBoundWitness((await params.sourceArchivist.get([params.last])).at(0)\n ?? (await params.snapshotArchivist.get([params.last])).at(0), {})\n const lastBlockExisting = assertEx(lastBlock, () => 'Last block not found')\n\n // getting the block numbers here since can not get them in the constructor\n const result = new IndexedHydratedBlockRangeStore(params, firstBlockExisting.block, lastBlockExisting.block)\n result.createSubscriptions()\n await result.index()\n return result\n }\n\n async first(): Promise<HydratedBlock> {\n return assertEx(await this.fromHash(this.params.first), () => 'First block not found')\n }\n\n async fromHash(hash: Hash): Promise<HydratedBlock | undefined> {\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(this.params.sourceArchivist)\n const snapshotMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(this.params.snapshotArchivist)\n const block = (await hydrateBlock({ chainMap }, hash))\n ?? (await hydrateBlock({ chainMap: snapshotMap }, hash))\n if (isDefined(block) && (block[0].block <= this._lastNumber && block[0].block >= this._firstNumber)) {\n return block\n }\n }\n\n fromNumber(number: number): Promisable<HydratedBlock | undefined> {\n const hash = this._blockNumberIndex.get(number)\n if (isDefined(hash)) {\n return this.fromHash(hash)\n }\n }\n\n async last(): Promise<HydratedBlock> {\n return assertEx(await this.fromHash(this.params.last), () => 'Last block not found')\n }\n\n async next(from: HydratedBlock): Promise<HydratedBlock | undefined>\n async next(from: HydratedBlock, count: number): Promise<HydratedBlock[]>\n async next(from: HydratedBlock, count?: number): Promise<HydratedBlock | HydratedBlock[] | undefined> {\n const nextBlockNumber = from[0].block + 1\n if (nextBlockNumber > this._lastNumber) {\n return isDefined(count) ? [] : undefined\n }\n if (isDefined(count)) {\n if (count === 0) {\n return []\n }\n const nextBlock = await this.fromNumber(nextBlockNumber)\n\n if (isDefined(nextBlock)) {\n return [nextBlock, ...await this.next(nextBlock, count - 1)].filter(exists)\n } else {\n if (from[0].block < this._lastNumber) {\n throw new Error(`Next block [${nextBlockNumber}] not found, but should be in range`)\n }\n return []\n }\n } else {\n return await this.fromNumber(nextBlockNumber)\n }\n }\n\n async prev(from: HydratedBlock): Promise<HydratedBlock | undefined>\n async prev(from: HydratedBlock, count: number): Promise<HydratedBlock[]>\n async prev(from: HydratedBlock, count?: number): Promise<HydratedBlock | HydratedBlock[] | undefined> {\n const prevBlockNumber = from[0].block - 1\n if (prevBlockNumber < this._firstNumber) {\n return isDefined(count) ? [] : undefined\n }\n if (isDefined(count)) {\n if (count === 0) {\n return []\n }\n const prevBlock = await this.fromNumber(prevBlockNumber)\n if (isDefined(prevBlock)) {\n return [...await this.next(prevBlock, count - 1), prevBlock].filter(exists)\n } else {\n if (from[0].block > this._firstNumber) {\n throw new Error(`Prev block [${prevBlockNumber}] not found, but should be in range`)\n }\n return []\n }\n } else {\n return await this.fromNumber(prevBlockNumber)\n }\n }\n\n private createSubscriptions(): void {\n // we monitor deletes so that we can keep them if we need them for the window\n this.params.sourceArchivist.on('deleted', async ({ payloads }) => {\n await this.params.snapshotArchivist.insert(payloads)\n })\n }\n\n private async index() {\n // get all the locks (make exclusive)\n await this._blockNumberIndexSemaphore.acquire(BlockNumberIndexSemaphoreLocks)\n try {\n this._blockNumberIndex.clear()\n let blockToIndex: Hash = this.params.last\n let firstFound = false\n while (!firstFound) {\n const payload = assertEx((await this.params.sourceArchivist.get([blockToIndex])).at(0), () => 'Block payload not found')\n const block = assertEx(asBlockBoundWitnessWithStorageMeta(payload), () => 'Payload is not a Block')\n if (block.block < this._firstNumber || block.block > this._lastNumber) {\n throw new Error(`Block [${block.block}] is out of range`)\n }\n this._blockNumberIndex.set(block.block, block._hash)\n firstFound = block.block === this._firstNumber\n }\n } finally {\n this._blockNumberIndexSemaphore.release(BlockNumberIndexSemaphoreLocks)\n }\n }\n}\n","export * from './block/index.ts'\nexport * from '@xyo-network/xl1-wrappers'\n"],"mappings":"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","names":["hexToBigInt","validateHydratedBlock","validateHydratedBlockState","PayloadBuilder","isSignedTransactionBoundWitnessWithStorageMeta","isTransfer","XYO_ZERO_ADDRESS","createSignatureWrappers","HydratedTransactionWrapper","sumTransfers","payload","total","i","Object","values","transfers","hexToBigInt","HydratedBlockWrapper","data","allPayloadsCache","transactionsCache","_parseErrors","_signatureCache","block","boundWitness","chain","parseErrors","payloadCount","length","payloads","reward","reduce","acc","isTransfer","from","XYO_ZERO_ADDRESS","signatureCount","signatures","stepHashes","step_hashes","transactionCount","transactions","parse","validate","wrapper","index","at","signature","transaction","validateHydratedBlock","validateState","services","validateHydratedBlockState","allPayloads","PayloadBuilder","addStorageMeta","isSignedTransactionBoundWitnessWithStorageMeta","hydratedTransaction","filter","p","payload_hashes","includes","_hash","_dataHash","push","HydratedTransactionWrapper","createSignatureWrappers","assertEx","BaseEmitter","exists","isDefined","asBlockBoundWitness","asBlockBoundWitnessWithStorageMeta","hydrateBlock","readPayloadMapFromStore","Semaphore","BlockNumberIndexSemaphoreLocks","IndexedHydratedBlockRangeStore","BaseEmitter","_blockNumberIndex","Map","_blockNumberIndexSemaphore","Semaphore","_firstNumber","_lastNumber","params","firstNumber","lastNumber","count","numberRange","range","first","last","create","firstBlock","asBlockBoundWitness","sourceArchivist","get","at","snapshotArchivist","firstBlockExisting","assertEx","lastBlock","lastBlockExisting","result","block","createSubscriptions","index","fromHash","hash","chainMap","readPayloadMapFromStore","snapshotMap","hydrateBlock","isDefined","fromNumber","number","next","from","nextBlockNumber","undefined","nextBlock","filter","exists","Error","prev","prevBlockNumber","prevBlock","on","payloads","insert","acquire","clear","blockToIndex","firstFound","payload","asBlockBoundWitnessWithStorageMeta","set","_hash","release"]}
1
+ {"version":3,"sources":["../../src/block/HydratedBlock.ts","../../src/block/IndexedHydratedBlockRangeStore.ts","../../src/index.ts"],"sourcesContent":["import type { Hash, Hex } from '@xylabs/sdk-js'\nimport { hexToBigInt } from '@xylabs/sdk-js'\nimport { validateHydratedBlock, validateHydratedBlockState } from '@xyo-network/chain-validation'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WithHashMeta } from '@xyo-network/payload-model'\nimport type {\n HydratedBlockWithHashMeta, SignedHydratedTransactionWithStorageMeta, Transfer,\n} from '@xyo-network/xl1-protocol'\nimport {\n isSignedTransactionBoundWitnessWithStorageMeta,\n isTransfer, XYO_ZERO_ADDRESS,\n} from '@xyo-network/xl1-protocol'\nimport type {\n AccountBalanceViewer,\n HydratedBlockInstance, HydratedTransactionInstance, SignatureInstance,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { createSignatureWrappers, HydratedTransactionWrapper } from '@xyo-network/xl1-wrappers'\n\nconst sumTransfers = (payload: Transfer) => {\n let total = 0n\n for (let i of Object.values(payload.transfers)) {\n total += hexToBigInt(i ?? '00' as Hex)\n }\n return total\n}\n\nexport class HydratedBlockWrapper<T extends HydratedBlockWithHashMeta> implements HydratedBlockInstance<[WithHashMeta<T[0]>, WithHashMeta<T[1][number]>[]]> {\n data: [WithHashMeta<T[0]>, WithHashMeta<T[1][number]>[]]\n protected allPayloadsCache: WithHashMeta<T[1][number]>[] = []\n protected transactionsCache: HydratedTransactionInstance[] = []\n private _parseErrors: Error[] = []\n private _signatureCache: SignatureInstance[] = []\n\n protected constructor(data: [WithHashMeta<T[0]>, WithHashMeta<T[1][number]>[]]) {\n this.data = data\n }\n\n get block() {\n return this.data[0].block\n }\n\n get boundWitness() {\n return this.data[0]\n }\n\n get chain(): Hex {\n return this.data[0].chain\n }\n\n get parseErrors() {\n return this._parseErrors\n }\n\n get payloadCount(): number {\n return this.allPayloadsCache.length\n }\n\n get payloads(): T[1][number][] {\n return [...this.allPayloadsCache]\n }\n\n get reward(): bigint {\n return this.allPayloadsCache.reduce((acc: bigint, payload) => acc + (\n isTransfer(payload)\n ? payload.from === XYO_ZERO_ADDRESS\n ? sumTransfers(payload)\n : 0n\n : 0n), 0n)\n }\n\n get signatureCount(): number {\n return this._signatureCache.length\n }\n\n get signatures(): SignatureInstance[] {\n return [...this._signatureCache]\n }\n\n get stepHashes(): Hash[] {\n return this.data[0].step_hashes ?? []\n }\n\n get transactionCount(): number {\n return this.transactionsCache.length\n }\n\n get transactions(): HydratedTransactionInstance[] {\n return this.transactionsCache\n }\n\n static async parse<T extends HydratedBlockWithHashMeta>(block: T, validate = false): Promise<HydratedBlockInstance> {\n const wrapper = new HydratedBlockWrapper(block)\n return await wrapper.parse(validate)\n }\n\n payload(index: number) {\n return this.data[1].at(index)\n }\n\n signature(index: number): SignatureInstance | undefined {\n return this._signatureCache[index]\n }\n\n transaction(index: number): HydratedTransactionInstance | undefined {\n return this.transactionsCache.at(index)\n }\n\n async validate(): Promise<Error[]> {\n return await validateHydratedBlock(this.data)\n }\n\n async validateState(services: { accountBalance: AccountBalanceViewer }): Promise<Error[]> {\n return await validateHydratedBlockState(this.data, this.chain, services)\n }\n\n protected async parse(validate = false): Promise<HydratedBlockInstance<[WithHashMeta<T[0]>, WithHashMeta<T[1][number]>[]]>> {\n const allPayloads = await PayloadBuilder.addStorageMeta(this.data[1])\n for (const payload of allPayloads) {\n if (isSignedTransactionBoundWitnessWithStorageMeta(payload)) {\n const hydratedTransaction: SignedHydratedTransactionWithStorageMeta = [payload, allPayloads.filter(\n p => payload.payload_hashes.includes(p._hash) || payload.payload_hashes.includes(p._dataHash),\n )]\n this.transactionsCache.push(await HydratedTransactionWrapper.parse(hydratedTransaction))\n } else {\n this.allPayloadsCache.push(payload)\n }\n }\n this._signatureCache = await createSignatureWrappers(this.data[0])\n if (validate) {\n this._parseErrors = await this.validate()\n }\n return this\n }\n}\n","import type {\n BaseParams, EmptyObject, Hash, Promisable,\n} from '@xylabs/sdk-js'\nimport {\n assertEx, BaseEmitter, exists, isDefined,\n} from '@xylabs/sdk-js'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport {\n asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta, type HydratedBlock,\n} from '@xyo-network/xl1-protocol'\nimport {\n type BlockWindowInstance, hydrateBlock, readPayloadMapFromStore,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Semaphore } from 'async-mutex'\n\nexport type HydratedBlockStoreParams<TAdditionalParams extends EmptyObject = EmptyObject> = BaseParams<{\n sourceArchivist: ArchivistInstance\n} & TAdditionalParams>\n\nexport interface HydratedBlockStoreInstance {\n fromHash(hash: Hash): Promisable<HydratedBlock | undefined>\n}\n\nexport interface IndexedHydratedBlockStoreInstance extends HydratedBlockStoreInstance {\n fromNumber(number: number): Promisable<HydratedBlock | undefined>\n}\n\nexport interface HydratedBlockRangeStoreParams extends HydratedBlockStoreParams<{\n first: Hash\n last: Hash\n snapshotArchivist: ArchivistInstance\n}> {}\n\nexport interface IndexedHydratedBlockRangeStoreInstance extends BlockWindowInstance, IndexedHydratedBlockStoreInstance {\n first(): Promisable<HydratedBlock>\n last(): Promisable<HydratedBlock>\n next(from: HydratedBlock): Promisable<HydratedBlock | undefined>\n next(from: HydratedBlock, count: number): Promisable<HydratedBlock[]>\n prev(from: HydratedBlock): Promisable<HydratedBlock | undefined>\n prev(from: HydratedBlock, count: number): Promisable<HydratedBlock[]>\n}\n\nconst BlockNumberIndexSemaphoreLocks = 10 as const\n\n// TODO: Allow/Require source/snapshot archivist to be BlockStores instead\nexport class IndexedHydratedBlockRangeStore extends BaseEmitter<HydratedBlockRangeStoreParams> implements IndexedHydratedBlockRangeStoreInstance {\n private _blockNumberIndex: Map<number, Hash> = new Map()\n private _blockNumberIndexSemaphore = new Semaphore(BlockNumberIndexSemaphoreLocks)\n private _firstNumber: number\n private _lastNumber: number\n\n protected constructor(params: HydratedBlockRangeStoreParams, firstNumber: number, lastNumber: number) {\n super(params)\n this._firstNumber = firstNumber\n this._lastNumber = lastNumber\n }\n\n get count(): number {\n return this._lastNumber - this._firstNumber + 1\n }\n\n get numberRange(): [number, number] {\n return [this._firstNumber, this._lastNumber]\n }\n\n get range(): [Hash, Hash] {\n return [this.params.first, this.params.last]\n }\n\n static async create(params: HydratedBlockRangeStoreParams): Promise<IndexedHydratedBlockRangeStore> {\n const firstBlock = asBlockBoundWitness((await params.sourceArchivist.get([params.first])).at(0)\n ?? (await params.snapshotArchivist.get([params.first])).at(0))\n const firstBlockExisting = assertEx(firstBlock, () => 'First block not found')\n\n const lastBlock = asBlockBoundWitness((await params.sourceArchivist.get([params.last])).at(0)\n ?? (await params.snapshotArchivist.get([params.last])).at(0))\n const lastBlockExisting = assertEx(lastBlock, () => 'Last block not found')\n\n // getting the block numbers here since can not get them in the constructor\n const result = new IndexedHydratedBlockRangeStore(params, firstBlockExisting.block, lastBlockExisting.block)\n result.createSubscriptions()\n await result.index()\n return result\n }\n\n async first(): Promise<HydratedBlock> {\n return assertEx(await this.fromHash(this.params.first), () => 'First block not found')\n }\n\n async fromHash(hash: Hash): Promise<HydratedBlock | undefined> {\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(this.params.sourceArchivist)\n const snapshotMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(this.params.snapshotArchivist)\n const block = (await hydrateBlock({ chainMap }, hash))\n ?? (await hydrateBlock({ chainMap: snapshotMap }, hash))\n if (isDefined(block) && (block[0].block <= this._lastNumber && block[0].block >= this._firstNumber)) {\n return block\n }\n }\n\n fromNumber(number: number): Promisable<HydratedBlock | undefined> {\n const hash = this._blockNumberIndex.get(number)\n if (isDefined(hash)) {\n return this.fromHash(hash)\n }\n }\n\n async last(): Promise<HydratedBlock> {\n return assertEx(await this.fromHash(this.params.last), () => 'Last block not found')\n }\n\n async next(from: HydratedBlock): Promise<HydratedBlock | undefined>\n async next(from: HydratedBlock, count: number): Promise<HydratedBlock[]>\n async next(from: HydratedBlock, count?: number): Promise<HydratedBlock | HydratedBlock[] | undefined> {\n const nextBlockNumber = from[0].block + 1\n if (nextBlockNumber > this._lastNumber) {\n return isDefined(count) ? [] : undefined\n }\n if (isDefined(count)) {\n if (count === 0) {\n return []\n }\n const nextBlock = await this.fromNumber(nextBlockNumber)\n\n if (isDefined(nextBlock)) {\n return [nextBlock, ...await this.next(nextBlock, count - 1)].filter(exists)\n } else {\n if (from[0].block < this._lastNumber) {\n throw new Error(`Next block [${nextBlockNumber}] not found, but should be in range`)\n }\n return []\n }\n } else {\n return await this.fromNumber(nextBlockNumber)\n }\n }\n\n async prev(from: HydratedBlock): Promise<HydratedBlock | undefined>\n async prev(from: HydratedBlock, count: number): Promise<HydratedBlock[]>\n async prev(from: HydratedBlock, count?: number): Promise<HydratedBlock | HydratedBlock[] | undefined> {\n const prevBlockNumber = from[0].block - 1\n if (prevBlockNumber < this._firstNumber) {\n return isDefined(count) ? [] : undefined\n }\n if (isDefined(count)) {\n if (count === 0) {\n return []\n }\n const prevBlock = await this.fromNumber(prevBlockNumber)\n if (isDefined(prevBlock)) {\n return [...await this.next(prevBlock, count - 1), prevBlock].filter(exists)\n } else {\n if (from[0].block > this._firstNumber) {\n throw new Error(`Prev block [${prevBlockNumber}] not found, but should be in range`)\n }\n return []\n }\n } else {\n return await this.fromNumber(prevBlockNumber)\n }\n }\n\n private createSubscriptions(): void {\n // we monitor deletes so that we can keep them if we need them for the window\n this.params.sourceArchivist.on('deleted', async ({ payloads }) => {\n await this.params.snapshotArchivist.insert(payloads)\n })\n }\n\n private async index() {\n // get all the locks (make exclusive)\n await this._blockNumberIndexSemaphore.acquire(BlockNumberIndexSemaphoreLocks)\n try {\n this._blockNumberIndex.clear()\n let blockToIndex: Hash = this.params.last\n let firstFound = false\n while (!firstFound) {\n const payload = assertEx((await this.params.sourceArchivist.get([blockToIndex])).at(0), () => 'Block payload not found')\n const block = assertEx(asBlockBoundWitnessWithStorageMeta(payload), () => 'Payload is not a Block')\n if (block.block < this._firstNumber || block.block > this._lastNumber) {\n throw new Error(`Block [${block.block}] is out of range`)\n }\n this._blockNumberIndex.set(block.block, block._hash)\n firstFound = block.block === this._firstNumber\n }\n } finally {\n this._blockNumberIndexSemaphore.release(BlockNumberIndexSemaphoreLocks)\n }\n }\n}\n","export * from './block/index.ts'\nexport * from '@xyo-network/xl1-wrappers'\n"],"mappings":"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","names":["hexToBigInt","validateHydratedBlock","validateHydratedBlockState","PayloadBuilder","isSignedTransactionBoundWitnessWithStorageMeta","isTransfer","XYO_ZERO_ADDRESS","createSignatureWrappers","HydratedTransactionWrapper","sumTransfers","payload","total","i","Object","values","transfers","hexToBigInt","HydratedBlockWrapper","data","allPayloadsCache","transactionsCache","_parseErrors","_signatureCache","block","boundWitness","chain","parseErrors","payloadCount","length","payloads","reward","reduce","acc","isTransfer","from","XYO_ZERO_ADDRESS","signatureCount","signatures","stepHashes","step_hashes","transactionCount","transactions","parse","validate","wrapper","index","at","signature","transaction","validateHydratedBlock","validateState","services","validateHydratedBlockState","allPayloads","PayloadBuilder","addStorageMeta","isSignedTransactionBoundWitnessWithStorageMeta","hydratedTransaction","filter","p","payload_hashes","includes","_hash","_dataHash","push","HydratedTransactionWrapper","createSignatureWrappers","assertEx","BaseEmitter","exists","isDefined","asBlockBoundWitness","asBlockBoundWitnessWithStorageMeta","hydrateBlock","readPayloadMapFromStore","Semaphore","BlockNumberIndexSemaphoreLocks","IndexedHydratedBlockRangeStore","BaseEmitter","_blockNumberIndex","Map","_blockNumberIndexSemaphore","Semaphore","_firstNumber","_lastNumber","params","firstNumber","lastNumber","count","numberRange","range","first","last","create","firstBlock","asBlockBoundWitness","sourceArchivist","get","at","snapshotArchivist","firstBlockExisting","assertEx","lastBlock","lastBlockExisting","result","block","createSubscriptions","index","fromHash","hash","chainMap","readPayloadMapFromStore","snapshotMap","hydrateBlock","isDefined","fromNumber","number","next","from","nextBlockNumber","undefined","nextBlock","filter","exists","Error","prev","prevBlockNumber","prevBlock","on","payloads","insert","acquire","clear","blockToIndex","firstFound","payload","asBlockBoundWitnessWithStorageMeta","set","_hash","release"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json.schemastore.org/package.json",
3
3
  "name": "@xyo-network/chain-wrappers",
4
- "version": "1.16.24",
4
+ "version": "1.16.25",
5
5
  "description": "XYO Layer One SDK Wrappers",
6
6
  "homepage": "https://xylabs.com",
7
7
  "bugs": {
@@ -39,14 +39,14 @@
39
39
  "!**/*.test.*"
40
40
  ],
41
41
  "dependencies": {
42
- "@xylabs/sdk-js": "~5.0.39",
43
- "@xyo-network/archivist-model": "~5.1.24",
44
- "@xyo-network/chain-validation": "~1.16.24",
45
- "@xyo-network/payload-builder": "~5.1.24",
46
- "@xyo-network/payload-model": "~5.1.24",
47
- "@xyo-network/xl1-protocol": "~1.13.13",
48
- "@xyo-network/xl1-protocol-sdk": "~1.16.24",
49
- "@xyo-network/xl1-wrappers": "~1.16.24",
42
+ "@xylabs/sdk-js": "~5.0.42",
43
+ "@xyo-network/archivist-model": "~5.2.10",
44
+ "@xyo-network/chain-validation": "~1.16.25",
45
+ "@xyo-network/payload-builder": "~5.2.10",
46
+ "@xyo-network/payload-model": "~5.2.10",
47
+ "@xyo-network/xl1-protocol": "~1.14.13",
48
+ "@xyo-network/xl1-protocol-sdk": "~1.16.25",
49
+ "@xyo-network/xl1-wrappers": "~1.16.25",
50
50
  "async-mutex": "~0.5.0"
51
51
  },
52
52
  "devDependencies": {
@@ -4,7 +4,7 @@ import { validateHydratedBlock, validateHydratedBlockState } from '@xyo-network/
4
4
  import { PayloadBuilder } from '@xyo-network/payload-builder'
5
5
  import type { WithHashMeta } from '@xyo-network/payload-model'
6
6
  import type {
7
- HydratedBlock, SignedHydratedTransactionWithStorageMeta, Transfer,
7
+ HydratedBlockWithHashMeta, SignedHydratedTransactionWithStorageMeta, Transfer,
8
8
  } from '@xyo-network/xl1-protocol'
9
9
  import {
10
10
  isSignedTransactionBoundWitnessWithStorageMeta,
@@ -24,9 +24,9 @@ const sumTransfers = (payload: Transfer) => {
24
24
  return total
25
25
  }
26
26
 
27
- export class HydratedBlockWrapper<T extends HydratedBlock> implements HydratedBlockInstance<[WithHashMeta<T[0]>, WithHashMeta<T[1][number]>[]]> {
27
+ export class HydratedBlockWrapper<T extends HydratedBlockWithHashMeta> implements HydratedBlockInstance<[WithHashMeta<T[0]>, WithHashMeta<T[1][number]>[]]> {
28
28
  data: [WithHashMeta<T[0]>, WithHashMeta<T[1][number]>[]]
29
- protected allPayloadsCache: WithHashMeta<WithHashMeta<T[1][number]>>[] = []
29
+ protected allPayloadsCache: WithHashMeta<T[1][number]>[] = []
30
30
  protected transactionsCache: HydratedTransactionInstance[] = []
31
31
  private _parseErrors: Error[] = []
32
32
  private _signatureCache: SignatureInstance[] = []
@@ -77,7 +77,7 @@ export class HydratedBlockWrapper<T extends HydratedBlock> implements HydratedBl
77
77
  }
78
78
 
79
79
  get stepHashes(): Hash[] {
80
- return this.data[0].step_hashes
80
+ return this.data[0].step_hashes ?? []
81
81
  }
82
82
 
83
83
  get transactionCount(): number {
@@ -88,8 +88,8 @@ export class HydratedBlockWrapper<T extends HydratedBlock> implements HydratedBl
88
88
  return this.transactionsCache
89
89
  }
90
90
 
91
- static async parse<T extends HydratedBlock>(block: T, validate = false): Promise<HydratedBlockInstance> {
92
- const wrapper = new HydratedBlockWrapper<T>(block)
91
+ static async parse<T extends HydratedBlockWithHashMeta>(block: T, validate = false): Promise<HydratedBlockInstance> {
92
+ const wrapper = new HydratedBlockWrapper(block)
93
93
  return await wrapper.parse(validate)
94
94
  }
95
95
 
@@ -70,11 +70,11 @@ export class IndexedHydratedBlockRangeStore extends BaseEmitter<HydratedBlockRan
70
70
 
71
71
  static async create(params: HydratedBlockRangeStoreParams): Promise<IndexedHydratedBlockRangeStore> {
72
72
  const firstBlock = asBlockBoundWitness((await params.sourceArchivist.get([params.first])).at(0)
73
- ?? (await params.snapshotArchivist.get([params.first])).at(0), {})
73
+ ?? (await params.snapshotArchivist.get([params.first])).at(0))
74
74
  const firstBlockExisting = assertEx(firstBlock, () => 'First block not found')
75
75
 
76
76
  const lastBlock = asBlockBoundWitness((await params.sourceArchivist.get([params.last])).at(0)
77
- ?? (await params.snapshotArchivist.get([params.last])).at(0), {})
77
+ ?? (await params.snapshotArchivist.get([params.last])).at(0))
78
78
  const lastBlockExisting = assertEx(lastBlock, () => 'Last block not found')
79
79
 
80
80
  // getting the block numbers here since can not get them in the constructor