@xyo-network/chain-wrappers 1.3.27 → 1.3.29

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,6 +1,157 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
 
4
+ // src/block/IndexedHydratedBlockRangeStore.ts
5
+ import { assertEx } from "@xylabs/assert";
6
+ import { BaseEmitter } from "@xylabs/events";
7
+ import { exists } from "@xylabs/exists";
8
+ import { isDefined } from "@xylabs/typeof";
9
+ import { hydrateBlock } from "@xyo-network/chain-protocol";
10
+ import { asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol";
11
+ import { Semaphore } from "async-mutex";
12
+ var BlockNumberIndexSemaphoreLocks = 10;
13
+ var IndexedHydratedBlockRangeStore = class _IndexedHydratedBlockRangeStore extends BaseEmitter {
14
+ static {
15
+ __name(this, "IndexedHydratedBlockRangeStore");
16
+ }
17
+ _blockNumberIndex = /* @__PURE__ */ new Map();
18
+ _blockNumberIndexSemaphore = new Semaphore(BlockNumberIndexSemaphoreLocks);
19
+ _firstNumber;
20
+ _lastNumber;
21
+ constructor(params, firstNumber, lastNumber) {
22
+ super(params);
23
+ this._firstNumber = firstNumber;
24
+ this._lastNumber = lastNumber;
25
+ }
26
+ get count() {
27
+ return this._lastNumber - this._firstNumber + 1;
28
+ }
29
+ get numberRange() {
30
+ return [
31
+ this._firstNumber,
32
+ this._lastNumber
33
+ ];
34
+ }
35
+ get range() {
36
+ return [
37
+ this.params.first,
38
+ this.params.last
39
+ ];
40
+ }
41
+ static async create(params) {
42
+ const firstBlock = asBlockBoundWitness((await params.sourceArchivist.get([
43
+ params.first
44
+ ])).at(0) ?? (await params.snapshotArchivist.get([
45
+ params.first
46
+ ])).at(0), {});
47
+ const firstBlockExisting = assertEx(firstBlock, () => "First block not found");
48
+ const lastBlock = asBlockBoundWitness((await params.sourceArchivist.get([
49
+ params.last
50
+ ])).at(0) ?? (await params.snapshotArchivist.get([
51
+ params.last
52
+ ])).at(0), {});
53
+ const lastBlockExisting = assertEx(lastBlock, () => "Last block not found");
54
+ const result = new _IndexedHydratedBlockRangeStore(params, firstBlockExisting.block, lastBlockExisting.block);
55
+ result.createSubscriptions();
56
+ await result.index();
57
+ return result;
58
+ }
59
+ async first() {
60
+ return assertEx(await this.fromHash(this.params.first), () => "First block not found");
61
+ }
62
+ async fromHash(hash) {
63
+ const block = await hydrateBlock(this.params.sourceArchivist, hash) ?? await hydrateBlock(this.params.snapshotArchivist, hash);
64
+ if (isDefined(block) && block[0].block <= this._lastNumber && block[0].block >= this._firstNumber) {
65
+ return block;
66
+ }
67
+ }
68
+ fromNumber(number) {
69
+ const hash = this._blockNumberIndex.get(number);
70
+ if (isDefined(hash)) {
71
+ return this.fromHash(hash);
72
+ }
73
+ }
74
+ async last() {
75
+ return assertEx(await this.fromHash(this.params.last), () => "Last block not found");
76
+ }
77
+ async next(from, count) {
78
+ const nextBlockNumber = from[0].block + 1;
79
+ if (nextBlockNumber > this._lastNumber) {
80
+ return isDefined(count) ? [] : void 0;
81
+ }
82
+ if (isDefined(count)) {
83
+ if (count === 0) {
84
+ return [];
85
+ }
86
+ const nextBlock = await this.fromNumber(nextBlockNumber);
87
+ if (isDefined(nextBlock)) {
88
+ return [
89
+ nextBlock,
90
+ ...await this.next(nextBlock, count - 1)
91
+ ].filter(exists);
92
+ } else {
93
+ if (from[0].block < this._lastNumber) {
94
+ throw new Error(`Next block [${nextBlockNumber}] not found, but should be in range`);
95
+ }
96
+ return [];
97
+ }
98
+ } else {
99
+ return await this.fromNumber(nextBlockNumber);
100
+ }
101
+ }
102
+ async prev(from, count) {
103
+ const prevBlockNumber = from[0].block - 1;
104
+ if (prevBlockNumber < this._firstNumber) {
105
+ return isDefined(count) ? [] : void 0;
106
+ }
107
+ if (isDefined(count)) {
108
+ if (count === 0) {
109
+ return [];
110
+ }
111
+ const prevBlock = await this.fromNumber(prevBlockNumber);
112
+ if (isDefined(prevBlock)) {
113
+ return [
114
+ ...await this.next(prevBlock, count - 1),
115
+ prevBlock
116
+ ].filter(exists);
117
+ } else {
118
+ if (from[0].block > this._firstNumber) {
119
+ throw new Error(`Prev block [${prevBlockNumber}] not found, but should be in range`);
120
+ }
121
+ return [];
122
+ }
123
+ } else {
124
+ return await this.fromNumber(prevBlockNumber);
125
+ }
126
+ }
127
+ createSubscriptions() {
128
+ this.params.sourceArchivist.on("deleted", async ({ payloads }) => {
129
+ await this.params.snapshotArchivist.insert(payloads);
130
+ });
131
+ }
132
+ async index() {
133
+ await this._blockNumberIndexSemaphore.acquire(BlockNumberIndexSemaphoreLocks);
134
+ try {
135
+ this._blockNumberIndex.clear();
136
+ let blockToIndex = this.params.last;
137
+ let firstFound = false;
138
+ while (!firstFound) {
139
+ const payload = assertEx((await this.params.sourceArchivist.get([
140
+ blockToIndex
141
+ ])).at(0), () => "Block payload not found");
142
+ const block = assertEx(asBlockBoundWitnessWithStorageMeta(payload), () => "Payload is not a Block");
143
+ if (block.block < this._firstNumber || block.block > this._lastNumber) {
144
+ throw new Error(`Block [${block.block}] is out of range`);
145
+ }
146
+ this._blockNumberIndex.set(block.block, block._hash);
147
+ firstFound = block.block === this._firstNumber;
148
+ }
149
+ } finally {
150
+ this._blockNumberIndexSemaphore.release(BlockNumberIndexSemaphoreLocks);
151
+ }
152
+ }
153
+ };
154
+
4
155
  // src/lib/createSignatureWrappers.ts
5
156
  import { PayloadBuilder } from "@xyo-network/payload-builder";
6
157
 
@@ -347,6 +498,7 @@ var SignedHydratedBlockWrapper = class _SignedHydratedBlockWrapper extends Hydra
347
498
  export {
348
499
  FeesWrapper,
349
500
  HydratedTransactionWrapper,
501
+ IndexedHydratedBlockRangeStore,
350
502
  SignatureWrapper,
351
503
  SignedHydratedBlockWrapper,
352
504
  SignedHydratedTransactionWrapper
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/createSignatureWrappers.ts","../../src/Signature.ts","../../src/block/HydratedBlock.ts","../../src/transaction/SignedHydratedTransaction.ts","../../src/transaction/HydratedTransaction.ts","../../src/Fees.ts","../../src/block/SignedHydratedBlock.ts"],"sourcesContent":["import type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { SignatureInstance } from '@xyo-network/xl1-protocol-sdk'\n\nimport { SignatureWrapper } from '../Signature.ts'\n\nexport const createSignatureWrappers = async (bw: BoundWitness): Promise<SignatureInstance[]> => {\n const signatures: SignatureInstance[] = []\n const hash = await PayloadBuilder.dataHash(bw)\n for (let i = 0; i < bw.$signatures.length; i++) {\n signatures.push(\n new SignatureWrapper(bw.$signatures[i], bw.addresses[i], hash),\n )\n }\n return signatures\n}\n","import { toArrayBuffer } from '@xylabs/arraybuffer'\nimport type {\n Address, Hash, Hex,\n} from '@xylabs/hex'\nimport { BoundWitnessValidator } from '@xyo-network/boundwitness-validator'\nimport type { SignatureInstance } from '@xyo-network/xl1-protocol-sdk'\n\nexport class SignatureWrapper implements SignatureInstance {\n address: Address\n hash: Hash\n signature: Hex\n\n constructor(signature: Hex, address: Address, hash: Hash) {\n this.signature = signature\n this.address = address\n this.hash = hash\n }\n\n static async validate(hash: Hash, address: Address, signature: Hex): Promise<Error[]> {\n return await BoundWitnessValidator.validateSignature(toArrayBuffer(hash), toArrayBuffer(address), toArrayBuffer(signature))\n }\n\n async validate(): Promise<Error[]> {\n return await SignatureWrapper.validate(this.address, this.hash, this.signature)\n }\n}\n","import { hexToBigInt } from '@xylabs/hex'\nimport { XYO_ZERO_ADDRESS } from '@xyo-network/chain-utils'\nimport { validateHydratedBlock } from '@xyo-network/chain-validation'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WithHashStorageMeta } from '@xyo-network/payload-model'\nimport type {\n AllowedBlockPayload,\n HydratedBlock, SignedHydratedTransaction, Transfer,\n} from '@xyo-network/xl1-protocol'\nimport {\n isAllowedBlockPayloadWithHashStorageMeta,\n isSignedTransactionBoundWitnessWithStorageMeta,\n isTransfer,\n} from '@xyo-network/xl1-protocol'\nimport type { HydratedBlockInstance, SignedHydratedTransactionInstance } from '@xyo-network/xl1-protocol-sdk'\n\nimport { SignedHydratedTransactionWrapper } from '../transaction/SignedHydratedTransaction.ts'\n\nconst sumTransfers = (payload: Transfer) => {\n let total = 0n\n for (let i of Object.values(payload.transfers)) {\n total += hexToBigInt(i)\n }\n return total\n}\n\nexport class HydratedBlockWrapper<T extends HydratedBlock> implements HydratedBlockInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]> {\n data: [WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]\n protected allPayloadsCache: WithHashStorageMeta<WithHashStorageMeta<T[1][number]>>[] = []\n protected publicPayloadsCache: WithHashStorageMeta<WithHashStorageMeta<T[1][number] & AllowedBlockPayload>>[] = []\n protected transactionsCache: SignedHydratedTransactionInstance[] = []\n\n protected constructor(data: [WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]) {\n this.data = data\n }\n\n get boundWitness() {\n return this.data[0]\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 privatePayloadCount(): number {\n return this.data[1].length - this.publicPayloadCount\n }\n\n get publicPayloadCount(): number {\n return this.allPayloadsCache.length\n }\n\n get publicPayloads(): (T[1][number] & AllowedBlockPayload)[] {\n return [...this.publicPayloadsCache]\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 transactionCount(): number {\n return this.transactionsCache.length\n }\n\n get transactions(): SignedHydratedTransactionInstance[] {\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 transaction(index: number): SignedHydratedTransactionInstance | undefined {\n return this.transactionsCache.at(index)\n }\n\n async validate(): Promise<Error[]> {\n return await validateHydratedBlock(this.data)\n }\n\n protected async parse(validate = false): Promise<HydratedBlockInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<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: SignedHydratedTransaction = [payload, allPayloads.filter(\n p => payload.payload_hashes.includes(p._hash) || payload.payload_hashes.includes(p._dataHash),\n )]\n this.transactionsCache.push(await SignedHydratedTransactionWrapper.parse(hydratedTransaction))\n } else {\n this.allPayloadsCache.push(payload)\n }\n }\n for (const hash of this.data[0].payload_hashes) {\n const payload = this.allPayloadsCache.find(p => p._hash === hash)\n if (payload) {\n if (isAllowedBlockPayloadWithHashStorageMeta(payload)) {\n this.publicPayloadsCache.push(payload)\n } else {\n throw new Error('Disallowed payload type')\n }\n }\n }\n if (validate) {\n await this.validate()\n }\n return this\n }\n}\n","import { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WithHashStorageMeta } from '@xyo-network/payload-model'\nimport type { SignedHydratedTransaction } from '@xyo-network/xl1-protocol'\nimport type { SignatureInstance, SignedHydratedTransactionInstance } from '@xyo-network/xl1-protocol-sdk'\n\nimport { createSignatureWrappers } from '../lib/createSignatureWrappers.ts'\nimport { HydratedTransactionWrapper } from './HydratedTransaction.ts'\n\nexport class SignedHydratedTransactionWrapper<T extends SignedHydratedTransaction> extends HydratedTransactionWrapper<T>\n implements SignedHydratedTransactionInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]> {\n private _signatureCache: SignatureInstance[] = []\n\n get signatureCount(): number {\n return this._signatureCache.length\n }\n\n get signatures(): SignatureInstance[] {\n return [...this._signatureCache]\n }\n\n static override async parse<T extends SignedHydratedTransaction>(transaction: T, validate = false):\n Promise<SignedHydratedTransactionInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]>> {\n const wrapper = new SignedHydratedTransactionWrapper<T>([\n await PayloadBuilder.addStorageMeta(transaction[0]),\n await PayloadBuilder.addStorageMeta(transaction[1]),\n ])\n return await wrapper.parse(validate)\n }\n\n signature(index: number): SignatureInstance | undefined {\n return this._signatureCache[index]\n }\n\n override async validate(): Promise<Error[]> {\n const errors: Error[] = []\n errors.push(\n ...(await Promise.all(this._signatureCache.map(signature => signature.validate()))).flat(),\n ...(await super.validate()),\n )\n return errors\n }\n\n protected override async parse(validate = false):\n Promise<SignedHydratedTransactionInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]>> {\n this._signatureCache = await createSignatureWrappers(this.data[0])\n await super.parse(validate)\n return this\n }\n}\n","import { hexToBigInt } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport { tryExtractElevatedHashes, tryExtractElevatedHashesFromScript } from '@xyo-network/chain-protocol'\nimport { XYO_ZERO_ADDRESS } from '@xyo-network/chain-utils'\nimport { validateTransaction } from '@xyo-network/chain-validation'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload, WithHashStorageMeta } from '@xyo-network/payload-model'\nimport type {\n AllowedBlockPayload, HydratedTransaction, HydratedTransactionWithHashStorageMeta, Transfer,\n} from '@xyo-network/xl1-protocol'\nimport { isTransfer } from '@xyo-network/xl1-protocol'\nimport {\n type HydratedTransactionInstance, type TransactionFeesInstance, transactionRequiredGas,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport { FeesWrapper } from '../Fees.ts'\n\nconst sumTransfers = (payload: Transfer) => {\n let total = 0n\n for (let i of Object.values(payload.transfers)) {\n total += hexToBigInt(i)\n }\n return total\n}\n\nexport class HydratedTransactionWrapper<T extends HydratedTransaction> implements HydratedTransactionInstance<[WithHashStorageMeta<T[0]>,\n WithHashStorageMeta<T[1][number]>[]]> {\n data: HydratedTransactionWithHashStorageMeta<T>\n fees: TransactionFeesInstance\n\n protected payloadsCache: WithHashStorageMeta<Payload>[] = []\n\n protected constructor(data: HydratedTransactionWithHashStorageMeta<T>) {\n this.data = data\n this.fees = new FeesWrapper(\n this.boundWitness.fees,\n )\n }\n\n get boundWitness() {\n return this.data[0]\n }\n\n get elevatedPayloadCount(): number {\n const { script } = this.data[0]\n return script ? tryExtractElevatedHashesFromScript(script).length : 0\n }\n\n get elevatedPayloads(): WithHashStorageMeta<AllowedBlockPayload>[] {\n return tryExtractElevatedHashes(this.data)\n }\n\n get from() {\n return this.data[0].from\n }\n\n get payloadCount(): number {\n return this.payloadsCache.length\n }\n\n get payloads(): WithHashStorageMeta<WithHashStorageMeta<T[1][number]>>[] {\n return [...this.payloadsCache]\n }\n\n static async parse<T extends HydratedTransaction>(transaction: T, validate = false): Promise<HydratedTransactionInstance<[WithHashStorageMeta<T[0]>,\n WithHashStorageMeta<T[1][number]>[]]>> {\n const wrapper = new HydratedTransactionWrapper<T>(\n [\n await PayloadBuilder.addStorageMeta(transaction[0]),\n await PayloadBuilder.addStorageMeta(transaction[1]),\n ],\n )\n const parsed = await wrapper.parse()\n if (validate) {\n const errors = await wrapper.validate()\n if (errors.length > 0) {\n throw new Error(`Block validation failed: ${errors.join(', ')}`)\n }\n }\n return parsed\n }\n\n elevatedPayload(index: number): WithHashStorageMeta<AllowedBlockPayload & T[1][number]> | undefined {\n return this.elevatedPayloads.at(index)\n }\n\n gasRequired(): bigint {\n return transactionRequiredGas(this.data)\n }\n\n payload(index: number): WithHashStorageMeta<Payload> | undefined {\n return this.payloads.at(index)\n }\n\n reward(): bigint {\n return this.payloadsCache.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 validate(): Promisable<Error[]> {\n return validateTransaction(this.data)\n }\n\n protected async parse(validate = false): Promise<HydratedTransactionInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]>> {\n const transactionPayloads = await PayloadBuilder.addStorageMeta(this.data[1])\n for (const payload of transactionPayloads) {\n this.payloadsCache.push(payload)\n }\n if (validate) {\n await this.validate()\n }\n return this\n }\n}\n","import { hexToBigInt } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport type { TransactionFeesBigInt, TransactionFeesHex } from '@xyo-network/xl1-protocol'\nimport type { TransactionFeesInstance } from '@xyo-network/xl1-protocol-sdk'\n\nexport class FeesWrapper implements TransactionFeesInstance {\n base: bigint\n gasLimit: bigint\n gasPrice: bigint\n priority: bigint\n\n constructor({\n base, gasLimit, gasPrice, priority,\n }: TransactionFeesHex | TransactionFeesBigInt) {\n this.base = typeof base === 'bigint' ? base : hexToBigInt(base)\n this.gasLimit = typeof gasLimit === 'bigint' ? gasLimit : hexToBigInt(gasLimit)\n this.gasPrice = typeof gasPrice === 'bigint' ? gasPrice : hexToBigInt(gasPrice)\n this.priority = typeof priority === 'bigint' ? priority : hexToBigInt(priority)\n }\n\n static validate({\n base, gasLimit, gasPrice, priority,\n }: TransactionFeesHex | TransactionFeesBigInt): Promisable<Error[]> {\n const errors: Error[] = []\n const baseValue = typeof base === 'bigint' ? base : hexToBigInt(base)\n const gasLimitValue = typeof gasLimit === 'bigint' ? gasLimit : hexToBigInt(gasLimit)\n const gasPriceValue = typeof gasPrice === 'bigint' ? gasPrice : hexToBigInt(gasPrice)\n const priorityValue = typeof priority === 'bigint' ? priority : hexToBigInt(priority)\n if (baseValue <= 0n) {\n errors.push(new Error('Base fee cannot be negative or zero'))\n }\n if (gasLimitValue < 0n) {\n errors.push(new Error('Gas limit cannot be negative'))\n }\n if (gasPriceValue < 0n) {\n errors.push(new Error('Gas price cannot be negative'))\n }\n if (priorityValue < 0n) {\n errors.push(new Error('Priority cannot be negative'))\n }\n return errors\n }\n\n async validate(): Promise<Error[]> {\n return await FeesWrapper.validate({\n base: this.base, gasLimit: this.gasLimit, gasPrice: this.gasPrice, priority: this.priority,\n })\n }\n}\n","import type { WithHashStorageMeta } from '@xyo-network/payload-model'\nimport type { SignedHydratedBlock } from '@xyo-network/xl1-protocol'\nimport type { SignatureInstance, SignedHydratedBlockInstance } from '@xyo-network/xl1-protocol-sdk'\n\nimport { createSignatureWrappers } from '../lib/createSignatureWrappers.ts'\nimport { HydratedBlockWrapper } from './HydratedBlock.ts'\n\nexport class SignedHydratedBlockWrapper<T extends SignedHydratedBlock> extends HydratedBlockWrapper<T>\n implements SignedHydratedBlockInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]> {\n private _signatureCache: SignatureInstance[] = []\n\n get signatureCount(): number {\n return this._signatureCache.length\n }\n\n get signatures(): SignatureInstance[] {\n return [...this._signatureCache]\n }\n\n static override async parse<T extends SignedHydratedBlock>(block: T, validate = false):\n Promise<SignedHydratedBlockInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]>> {\n const wrapper = new SignedHydratedBlockWrapper<T>(block)\n return await wrapper.parse(validate)\n }\n\n signature(index: number): SignatureInstance | undefined {\n return this._signatureCache[index]\n }\n\n override async validate(): Promise<Error[]> {\n const errors: Error[] = []\n errors.push(\n ...(await Promise.all(this._signatureCache.map(signature => signature.validate()))).flat(),\n ...(await super.validate()),\n )\n return errors\n }\n\n protected override async parse(validate = false): Promise<SignedHydratedBlockInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]>> {\n this._signatureCache = await createSignatureWrappers(this.data[0])\n await super.parse(validate)\n return this\n }\n}\n"],"mappings":"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","names":["PayloadBuilder","toArrayBuffer","BoundWitnessValidator","SignatureWrapper","address","hash","signature","constructor","validate","BoundWitnessValidator","validateSignature","toArrayBuffer","createSignatureWrappers","bw","signatures","hash","PayloadBuilder","dataHash","i","$signatures","length","push","SignatureWrapper","addresses","hexToBigInt","XYO_ZERO_ADDRESS","validateHydratedBlock","PayloadBuilder","isAllowedBlockPayloadWithHashStorageMeta","isSignedTransactionBoundWitnessWithStorageMeta","isTransfer","PayloadBuilder","hexToBigInt","tryExtractElevatedHashes","tryExtractElevatedHashesFromScript","XYO_ZERO_ADDRESS","validateTransaction","PayloadBuilder","isTransfer","transactionRequiredGas","hexToBigInt","FeesWrapper","base","gasLimit","gasPrice","priority","constructor","hexToBigInt","validate","errors","baseValue","gasLimitValue","gasPriceValue","priorityValue","push","Error","sumTransfers","payload","total","i","Object","values","transfers","hexToBigInt","HydratedTransactionWrapper","data","fees","payloadsCache","FeesWrapper","boundWitness","elevatedPayloadCount","script","tryExtractElevatedHashesFromScript","length","elevatedPayloads","tryExtractElevatedHashes","from","payloadCount","payloads","parse","transaction","validate","wrapper","PayloadBuilder","addStorageMeta","parsed","errors","Error","join","elevatedPayload","index","at","gasRequired","transactionRequiredGas","reward","reduce","acc","isTransfer","XYO_ZERO_ADDRESS","validateTransaction","transactionPayloads","push","SignedHydratedTransactionWrapper","HydratedTransactionWrapper","_signatureCache","signatureCount","length","signatures","parse","transaction","validate","wrapper","PayloadBuilder","addStorageMeta","signature","index","errors","push","Promise","all","map","flat","createSignatureWrappers","data","sumTransfers","payload","total","i","Object","values","transfers","hexToBigInt","HydratedBlockWrapper","data","allPayloadsCache","publicPayloadsCache","transactionsCache","boundWitness","payloadCount","length","payloads","privatePayloadCount","publicPayloadCount","publicPayloads","reward","reduce","acc","isTransfer","from","XYO_ZERO_ADDRESS","transactionCount","transactions","parse","block","validate","wrapper","index","at","transaction","validateHydratedBlock","allPayloads","PayloadBuilder","addStorageMeta","isSignedTransactionBoundWitnessWithStorageMeta","hydratedTransaction","filter","p","payload_hashes","includes","_hash","_dataHash","push","SignedHydratedTransactionWrapper","hash","find","isAllowedBlockPayloadWithHashStorageMeta","Error","SignedHydratedBlockWrapper","HydratedBlockWrapper","_signatureCache","signatureCount","length","signatures","parse","block","validate","wrapper","signature","index","errors","push","Promise","all","map","flat","createSignatureWrappers","data"]}
1
+ {"version":3,"sources":["../../src/block/IndexedHydratedBlockRangeStore.ts","../../src/lib/createSignatureWrappers.ts","../../src/Signature.ts","../../src/block/HydratedBlock.ts","../../src/transaction/SignedHydratedTransaction.ts","../../src/transaction/HydratedTransaction.ts","../../src/Fees.ts","../../src/block/SignedHydratedBlock.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport type { BaseParams } from '@xylabs/base'\nimport { BaseEmitter } from '@xylabs/events'\nimport { exists } from '@xylabs/exists'\nimport type { Hash } from '@xylabs/hex'\nimport type { EmptyObject } from '@xylabs/object'\nimport type { Promisable } from '@xylabs/promise'\nimport { isDefined } from '@xylabs/typeof'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { hydrateBlock } from '@xyo-network/chain-protocol'\nimport {\n asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta, type HydratedBlock,\n} from '@xyo-network/xl1-protocol'\nimport type { BlockWindowInstance } 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 block = (await hydrateBlock(this.params.sourceArchivist, hash))\n ?? (await hydrateBlock(this.params.snapshotArchivist, 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","import type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { SignatureInstance } from '@xyo-network/xl1-protocol-sdk'\n\nimport { SignatureWrapper } from '../Signature.ts'\n\nexport const createSignatureWrappers = async (bw: BoundWitness): Promise<SignatureInstance[]> => {\n const signatures: SignatureInstance[] = []\n const hash = await PayloadBuilder.dataHash(bw)\n for (let i = 0; i < bw.$signatures.length; i++) {\n signatures.push(\n new SignatureWrapper(bw.$signatures[i], bw.addresses[i], hash),\n )\n }\n return signatures\n}\n","import { toArrayBuffer } from '@xylabs/arraybuffer'\nimport type {\n Address, Hash, Hex,\n} from '@xylabs/hex'\nimport { BoundWitnessValidator } from '@xyo-network/boundwitness-validator'\nimport type { SignatureInstance } from '@xyo-network/xl1-protocol-sdk'\n\nexport class SignatureWrapper implements SignatureInstance {\n address: Address\n hash: Hash\n signature: Hex\n\n constructor(signature: Hex, address: Address, hash: Hash) {\n this.signature = signature\n this.address = address\n this.hash = hash\n }\n\n static async validate(hash: Hash, address: Address, signature: Hex): Promise<Error[]> {\n return await BoundWitnessValidator.validateSignature(toArrayBuffer(hash), toArrayBuffer(address), toArrayBuffer(signature))\n }\n\n async validate(): Promise<Error[]> {\n return await SignatureWrapper.validate(this.address, this.hash, this.signature)\n }\n}\n","import { hexToBigInt } from '@xylabs/hex'\nimport { XYO_ZERO_ADDRESS } from '@xyo-network/chain-utils'\nimport { validateHydratedBlock } from '@xyo-network/chain-validation'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WithHashStorageMeta } from '@xyo-network/payload-model'\nimport type {\n AllowedBlockPayload,\n HydratedBlock, SignedHydratedTransaction, Transfer,\n} from '@xyo-network/xl1-protocol'\nimport {\n isAllowedBlockPayloadWithHashStorageMeta,\n isSignedTransactionBoundWitnessWithStorageMeta,\n isTransfer,\n} from '@xyo-network/xl1-protocol'\nimport type { HydratedBlockInstance, SignedHydratedTransactionInstance } from '@xyo-network/xl1-protocol-sdk'\n\nimport { SignedHydratedTransactionWrapper } from '../transaction/SignedHydratedTransaction.ts'\n\nconst sumTransfers = (payload: Transfer) => {\n let total = 0n\n for (let i of Object.values(payload.transfers)) {\n total += hexToBigInt(i)\n }\n return total\n}\n\nexport class HydratedBlockWrapper<T extends HydratedBlock> implements HydratedBlockInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]> {\n data: [WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]\n protected allPayloadsCache: WithHashStorageMeta<WithHashStorageMeta<T[1][number]>>[] = []\n protected publicPayloadsCache: WithHashStorageMeta<WithHashStorageMeta<T[1][number] & AllowedBlockPayload>>[] = []\n protected transactionsCache: SignedHydratedTransactionInstance[] = []\n\n protected constructor(data: [WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]) {\n this.data = data\n }\n\n get boundWitness() {\n return this.data[0]\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 privatePayloadCount(): number {\n return this.data[1].length - this.publicPayloadCount\n }\n\n get publicPayloadCount(): number {\n return this.allPayloadsCache.length\n }\n\n get publicPayloads(): (T[1][number] & AllowedBlockPayload)[] {\n return [...this.publicPayloadsCache]\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 transactionCount(): number {\n return this.transactionsCache.length\n }\n\n get transactions(): SignedHydratedTransactionInstance[] {\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 transaction(index: number): SignedHydratedTransactionInstance | undefined {\n return this.transactionsCache.at(index)\n }\n\n async validate(): Promise<Error[]> {\n return await validateHydratedBlock(this.data)\n }\n\n protected async parse(validate = false): Promise<HydratedBlockInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<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: SignedHydratedTransaction = [payload, allPayloads.filter(\n p => payload.payload_hashes.includes(p._hash) || payload.payload_hashes.includes(p._dataHash),\n )]\n this.transactionsCache.push(await SignedHydratedTransactionWrapper.parse(hydratedTransaction))\n } else {\n this.allPayloadsCache.push(payload)\n }\n }\n for (const hash of this.data[0].payload_hashes) {\n const payload = this.allPayloadsCache.find(p => p._hash === hash)\n if (payload) {\n if (isAllowedBlockPayloadWithHashStorageMeta(payload)) {\n this.publicPayloadsCache.push(payload)\n } else {\n throw new Error('Disallowed payload type')\n }\n }\n }\n if (validate) {\n await this.validate()\n }\n return this\n }\n}\n","import { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WithHashStorageMeta } from '@xyo-network/payload-model'\nimport type { SignedHydratedTransaction } from '@xyo-network/xl1-protocol'\nimport type { SignatureInstance, SignedHydratedTransactionInstance } from '@xyo-network/xl1-protocol-sdk'\n\nimport { createSignatureWrappers } from '../lib/createSignatureWrappers.ts'\nimport { HydratedTransactionWrapper } from './HydratedTransaction.ts'\n\nexport class SignedHydratedTransactionWrapper<T extends SignedHydratedTransaction> extends HydratedTransactionWrapper<T>\n implements SignedHydratedTransactionInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]> {\n private _signatureCache: SignatureInstance[] = []\n\n get signatureCount(): number {\n return this._signatureCache.length\n }\n\n get signatures(): SignatureInstance[] {\n return [...this._signatureCache]\n }\n\n static override async parse<T extends SignedHydratedTransaction>(transaction: T, validate = false):\n Promise<SignedHydratedTransactionInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]>> {\n const wrapper = new SignedHydratedTransactionWrapper<T>([\n await PayloadBuilder.addStorageMeta(transaction[0]),\n await PayloadBuilder.addStorageMeta(transaction[1]),\n ])\n return await wrapper.parse(validate)\n }\n\n signature(index: number): SignatureInstance | undefined {\n return this._signatureCache[index]\n }\n\n override async validate(): Promise<Error[]> {\n const errors: Error[] = []\n errors.push(\n ...(await Promise.all(this._signatureCache.map(signature => signature.validate()))).flat(),\n ...(await super.validate()),\n )\n return errors\n }\n\n protected override async parse(validate = false):\n Promise<SignedHydratedTransactionInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]>> {\n this._signatureCache = await createSignatureWrappers(this.data[0])\n await super.parse(validate)\n return this\n }\n}\n","import { hexToBigInt } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport { tryExtractElevatedHashes, tryExtractElevatedHashesFromScript } from '@xyo-network/chain-protocol'\nimport { XYO_ZERO_ADDRESS } from '@xyo-network/chain-utils'\nimport { validateTransaction } from '@xyo-network/chain-validation'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload, WithHashStorageMeta } from '@xyo-network/payload-model'\nimport type {\n AllowedBlockPayload, HydratedTransaction, HydratedTransactionWithHashStorageMeta, Transfer,\n} from '@xyo-network/xl1-protocol'\nimport { isTransfer } from '@xyo-network/xl1-protocol'\nimport {\n type HydratedTransactionInstance, type TransactionFeesInstance, transactionRequiredGas,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport { FeesWrapper } from '../Fees.ts'\n\nconst sumTransfers = (payload: Transfer) => {\n let total = 0n\n for (let i of Object.values(payload.transfers)) {\n total += hexToBigInt(i)\n }\n return total\n}\n\nexport class HydratedTransactionWrapper<T extends HydratedTransaction> implements HydratedTransactionInstance<[WithHashStorageMeta<T[0]>,\n WithHashStorageMeta<T[1][number]>[]]> {\n data: HydratedTransactionWithHashStorageMeta<T>\n fees: TransactionFeesInstance\n\n protected payloadsCache: WithHashStorageMeta<Payload>[] = []\n\n protected constructor(data: HydratedTransactionWithHashStorageMeta<T>) {\n this.data = data\n this.fees = new FeesWrapper(\n this.boundWitness.fees,\n )\n }\n\n get boundWitness() {\n return this.data[0]\n }\n\n get elevatedPayloadCount(): number {\n const { script } = this.data[0]\n return script ? tryExtractElevatedHashesFromScript(script).length : 0\n }\n\n get elevatedPayloads(): WithHashStorageMeta<AllowedBlockPayload>[] {\n return tryExtractElevatedHashes(this.data)\n }\n\n get from() {\n return this.data[0].from\n }\n\n get payloadCount(): number {\n return this.payloadsCache.length\n }\n\n get payloads(): WithHashStorageMeta<WithHashStorageMeta<T[1][number]>>[] {\n return [...this.payloadsCache]\n }\n\n static async parse<T extends HydratedTransaction>(transaction: T, validate = false): Promise<HydratedTransactionInstance<[WithHashStorageMeta<T[0]>,\n WithHashStorageMeta<T[1][number]>[]]>> {\n const wrapper = new HydratedTransactionWrapper<T>(\n [\n await PayloadBuilder.addStorageMeta(transaction[0]),\n await PayloadBuilder.addStorageMeta(transaction[1]),\n ],\n )\n const parsed = await wrapper.parse()\n if (validate) {\n const errors = await wrapper.validate()\n if (errors.length > 0) {\n throw new Error(`Block validation failed: ${errors.join(', ')}`)\n }\n }\n return parsed\n }\n\n elevatedPayload(index: number): WithHashStorageMeta<AllowedBlockPayload & T[1][number]> | undefined {\n return this.elevatedPayloads.at(index)\n }\n\n gasRequired(): bigint {\n return transactionRequiredGas(this.data)\n }\n\n payload(index: number): WithHashStorageMeta<Payload> | undefined {\n return this.payloads.at(index)\n }\n\n reward(): bigint {\n return this.payloadsCache.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 validate(): Promisable<Error[]> {\n return validateTransaction(this.data)\n }\n\n protected async parse(validate = false): Promise<HydratedTransactionInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]>> {\n const transactionPayloads = await PayloadBuilder.addStorageMeta(this.data[1])\n for (const payload of transactionPayloads) {\n this.payloadsCache.push(payload)\n }\n if (validate) {\n await this.validate()\n }\n return this\n }\n}\n","import { hexToBigInt } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport type { TransactionFeesBigInt, TransactionFeesHex } from '@xyo-network/xl1-protocol'\nimport type { TransactionFeesInstance } from '@xyo-network/xl1-protocol-sdk'\n\nexport class FeesWrapper implements TransactionFeesInstance {\n base: bigint\n gasLimit: bigint\n gasPrice: bigint\n priority: bigint\n\n constructor({\n base, gasLimit, gasPrice, priority,\n }: TransactionFeesHex | TransactionFeesBigInt) {\n this.base = typeof base === 'bigint' ? base : hexToBigInt(base)\n this.gasLimit = typeof gasLimit === 'bigint' ? gasLimit : hexToBigInt(gasLimit)\n this.gasPrice = typeof gasPrice === 'bigint' ? gasPrice : hexToBigInt(gasPrice)\n this.priority = typeof priority === 'bigint' ? priority : hexToBigInt(priority)\n }\n\n static validate({\n base, gasLimit, gasPrice, priority,\n }: TransactionFeesHex | TransactionFeesBigInt): Promisable<Error[]> {\n const errors: Error[] = []\n const baseValue = typeof base === 'bigint' ? base : hexToBigInt(base)\n const gasLimitValue = typeof gasLimit === 'bigint' ? gasLimit : hexToBigInt(gasLimit)\n const gasPriceValue = typeof gasPrice === 'bigint' ? gasPrice : hexToBigInt(gasPrice)\n const priorityValue = typeof priority === 'bigint' ? priority : hexToBigInt(priority)\n if (baseValue <= 0n) {\n errors.push(new Error('Base fee cannot be negative or zero'))\n }\n if (gasLimitValue < 0n) {\n errors.push(new Error('Gas limit cannot be negative'))\n }\n if (gasPriceValue < 0n) {\n errors.push(new Error('Gas price cannot be negative'))\n }\n if (priorityValue < 0n) {\n errors.push(new Error('Priority cannot be negative'))\n }\n return errors\n }\n\n async validate(): Promise<Error[]> {\n return await FeesWrapper.validate({\n base: this.base, gasLimit: this.gasLimit, gasPrice: this.gasPrice, priority: this.priority,\n })\n }\n}\n","import type { WithHashStorageMeta } from '@xyo-network/payload-model'\nimport type { SignedHydratedBlock } from '@xyo-network/xl1-protocol'\nimport type { SignatureInstance, SignedHydratedBlockInstance } from '@xyo-network/xl1-protocol-sdk'\n\nimport { createSignatureWrappers } from '../lib/createSignatureWrappers.ts'\nimport { HydratedBlockWrapper } from './HydratedBlock.ts'\n\nexport class SignedHydratedBlockWrapper<T extends SignedHydratedBlock> extends HydratedBlockWrapper<T>\n implements SignedHydratedBlockInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]> {\n private _signatureCache: SignatureInstance[] = []\n\n get signatureCount(): number {\n return this._signatureCache.length\n }\n\n get signatures(): SignatureInstance[] {\n return [...this._signatureCache]\n }\n\n static override async parse<T extends SignedHydratedBlock>(block: T, validate = false):\n Promise<SignedHydratedBlockInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]>> {\n const wrapper = new SignedHydratedBlockWrapper<T>(block)\n return await wrapper.parse(validate)\n }\n\n signature(index: number): SignatureInstance | undefined {\n return this._signatureCache[index]\n }\n\n override async validate(): Promise<Error[]> {\n const errors: Error[] = []\n errors.push(\n ...(await Promise.all(this._signatureCache.map(signature => signature.validate()))).flat(),\n ...(await super.validate()),\n )\n return errors\n }\n\n protected override async parse(validate = false): Promise<SignedHydratedBlockInstance<[WithHashStorageMeta<T[0]>, WithHashStorageMeta<T[1][number]>[]]>> {\n this._signatureCache = await createSignatureWrappers(this.data[0])\n await super.parse(validate)\n return this\n }\n}\n"],"mappings":"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","names":["assertEx","BaseEmitter","exists","isDefined","hydrateBlock","asBlockBoundWitness","asBlockBoundWitnessWithStorageMeta","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","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","PayloadBuilder","toArrayBuffer","BoundWitnessValidator","SignatureWrapper","address","hash","signature","constructor","validate","BoundWitnessValidator","validateSignature","toArrayBuffer","createSignatureWrappers","bw","signatures","hash","PayloadBuilder","dataHash","i","$signatures","length","push","SignatureWrapper","addresses","hexToBigInt","XYO_ZERO_ADDRESS","validateHydratedBlock","PayloadBuilder","isAllowedBlockPayloadWithHashStorageMeta","isSignedTransactionBoundWitnessWithStorageMeta","isTransfer","PayloadBuilder","hexToBigInt","tryExtractElevatedHashes","tryExtractElevatedHashesFromScript","XYO_ZERO_ADDRESS","validateTransaction","PayloadBuilder","isTransfer","transactionRequiredGas","hexToBigInt","FeesWrapper","base","gasLimit","gasPrice","priority","constructor","hexToBigInt","validate","errors","baseValue","gasLimitValue","gasPriceValue","priorityValue","push","Error","sumTransfers","payload","total","i","Object","values","transfers","hexToBigInt","HydratedTransactionWrapper","data","fees","payloadsCache","FeesWrapper","boundWitness","elevatedPayloadCount","script","tryExtractElevatedHashesFromScript","length","elevatedPayloads","tryExtractElevatedHashes","from","payloadCount","payloads","parse","transaction","validate","wrapper","PayloadBuilder","addStorageMeta","parsed","errors","Error","join","elevatedPayload","index","at","gasRequired","transactionRequiredGas","reward","reduce","acc","isTransfer","XYO_ZERO_ADDRESS","validateTransaction","transactionPayloads","push","SignedHydratedTransactionWrapper","HydratedTransactionWrapper","_signatureCache","signatureCount","length","signatures","parse","transaction","validate","wrapper","PayloadBuilder","addStorageMeta","signature","index","errors","push","Promise","all","map","flat","createSignatureWrappers","data","sumTransfers","payload","total","i","Object","values","transfers","hexToBigInt","HydratedBlockWrapper","data","allPayloadsCache","publicPayloadsCache","transactionsCache","boundWitness","payloadCount","length","payloads","privatePayloadCount","publicPayloadCount","publicPayloads","reward","reduce","acc","isTransfer","from","XYO_ZERO_ADDRESS","transactionCount","transactions","parse","block","validate","wrapper","index","at","transaction","validateHydratedBlock","allPayloads","PayloadBuilder","addStorageMeta","isSignedTransactionBoundWitnessWithStorageMeta","hydratedTransaction","filter","p","payload_hashes","includes","_hash","_dataHash","push","SignedHydratedTransactionWrapper","hash","find","isAllowedBlockPayloadWithHashStorageMeta","Error","SignedHydratedBlockWrapper","HydratedBlockWrapper","_signatureCache","signatureCount","length","signatures","parse","block","validate","wrapper","signature","index","errors","push","Promise","all","map","flat","createSignatureWrappers","data"]}
@@ -0,0 +1,10 @@
1
+ import { type Address } from '@xylabs/hex';
2
+ import type { Promisable } from '@xylabs/promise';
3
+ import type { AddressInstance } from '@xyo-network/xl1-protocol-sdk';
4
+ export declare class AddressWrapper implements AddressInstance {
5
+ address: Address;
6
+ constructor(address: Address);
7
+ static validate(address: Address): Promisable<Error[]>;
8
+ validate(): Promise<Error[]>;
9
+ }
10
+ //# sourceMappingURL=Address.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Address.d.ts","sourceRoot":"","sources":["../../src/Address.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAEb,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAEpE,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,EAAE,OAAO,CAAA;gBAEJ,OAAO,EAAE,OAAO;IAI5B,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;IAIhD,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;CAGnC"}
@@ -0,0 +1,12 @@
1
+ import { type Address } from '@xylabs/hex';
2
+ import type { Promisable } from '@xylabs/promise';
3
+ import type { AddressStateInstance, BlockWindowInstance } from '@xyo-network/xl1-protocol-sdk';
4
+ import { AddressWrapper } from './Address.ts';
5
+ export declare class AddressStateWrapper extends AddressWrapper implements AddressStateInstance {
6
+ blockWindow: BlockWindowInstance;
7
+ constructor(address: Address, blockWindow: BlockWindowInstance);
8
+ static validate(address: Address): Promisable<Error[]>;
9
+ balance(): Promisable<bigint>;
10
+ validate(): Promise<Error[]>;
11
+ }
12
+ //# sourceMappingURL=AddressState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddressState.d.ts","sourceRoot":"","sources":["../../src/AddressState.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAEb,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAE9F,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,qBAAa,mBAAoB,SAAQ,cAAe,YAAW,oBAAoB;IACrF,WAAW,EAAE,mBAAmB,CAAA;gBAEpB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,mBAAmB;WAK9C,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;IAI/D,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC;IAId,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;CAG5C"}
@@ -0,0 +1,24 @@
1
+ import type { Hash } from '@xylabs/hex';
2
+ import type { Promisable } from '@xylabs/promise';
3
+ import type { HydratedBlock } from '@xyo-network/xl1-protocol';
4
+ import type { BlockWindowInstance } from '@xyo-network/xl1-protocol-sdk';
5
+ export interface HydratedBlockRangeStore extends BlockWindowInstance {
6
+ first(): Promisable<HydratedBlock>;
7
+ fromHash(hash: Hash): Promisable<HydratedBlock>;
8
+ fromNumber(number: number): Promisable<HydratedBlock>;
9
+ last(): Promisable<HydratedBlock>;
10
+ next(): Promisable<HydratedBlock>;
11
+ next(count: number): Promisable<HydratedBlock[]>;
12
+ prev(): Promisable<HydratedBlock>;
13
+ prev(count: number): Promisable<HydratedBlock[]>;
14
+ }
15
+ export declare class BlockWindowWrapper implements BlockWindowInstance {
16
+ private _store;
17
+ constructor(store: HydratedBlockRangeStore);
18
+ get count(): number;
19
+ get numberRange(): [number, number];
20
+ get range(): [Lowercase<string>, Lowercase<string>];
21
+ static validate(_store: HydratedBlockRangeStore): Promisable<Error[]>;
22
+ validate(): Promise<Error[]>;
23
+ }
24
+ //# sourceMappingURL=BlockWindow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockWindow.d.ts","sourceRoot":"","sources":["../../src/BlockWindow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAExE,MAAM,WAAW,uBAAwB,SAAQ,mBAAmB;IAClE,KAAK,IAAI,UAAU,CAAC,aAAa,CAAC,CAAA;IAClC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,CAAC,aAAa,CAAC,CAAA;IAC/C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,aAAa,CAAC,CAAA;IACrD,IAAI,IAAI,UAAU,CAAC,aAAa,CAAC,CAAA;IACjC,IAAI,IAAI,UAAU,CAAC,aAAa,CAAC,CAAA;IACjC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC,aAAa,EAAE,CAAC,CAAA;IAChD,IAAI,IAAI,UAAU,CAAC,aAAa,CAAC,CAAA;IACjC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC,aAAa,EAAE,CAAC,CAAA;CACjD;AAED,qBAAa,kBAAmB,YAAW,mBAAmB;IAC5D,OAAO,CAAC,MAAM,CAAyB;gBAE3B,KAAK,EAAE,uBAAuB;IAI1C,IAAI,KAAK,WAER;IAED,IAAI,WAAW,qBAEd;IAED,IAAI,KAAK,2CAER;IAED,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;IAI/D,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;CAGnC"}
@@ -0,0 +1,12 @@
1
+ import type { Address } from '@xylabs/hex';
2
+ import type { Promisable } from '@xylabs/promise';
3
+ import type { HydratedBlockRangeStore } from './BlockWindow.ts';
4
+ export interface BlockWindowBalanceCacheInstance {
5
+ balance(address: Address): Promisable<bigint>;
6
+ }
7
+ export declare class BlockWindowBalanceCache implements BlockWindowBalanceCacheInstance {
8
+ private _store;
9
+ constructor(store: HydratedBlockRangeStore);
10
+ balance(_address: Address): Promisable<bigint>;
11
+ }
12
+ //# sourceMappingURL=BlockWindowBalanceCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockWindowBalanceCache.d.ts","sourceRoot":"","sources":["../../src/BlockWindowBalanceCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAE/D,MAAM,WAAW,+BAA+B;IAC9C,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;CAC9C;AAED,qBAAa,uBAAwB,YAAW,+BAA+B;IAC7E,OAAO,CAAC,MAAM,CAAyB;gBAE3B,KAAK,EAAE,uBAAuB;IAI1C,OAAO,CAAC,QAAQ,EAAE,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC;CAG/C"}
@@ -0,0 +1,53 @@
1
+ import type { BaseParams } from '@xylabs/base';
2
+ import { BaseEmitter } from '@xylabs/events';
3
+ import type { Hash } from '@xylabs/hex';
4
+ import type { EmptyObject } from '@xylabs/object';
5
+ import type { Promisable } from '@xylabs/promise';
6
+ import type { ArchivistInstance } from '@xyo-network/archivist-model';
7
+ import { type HydratedBlock } from '@xyo-network/xl1-protocol';
8
+ import type { BlockWindowInstance } from '@xyo-network/xl1-protocol-sdk';
9
+ export type HydratedBlockStoreParams<TAdditionalParams extends EmptyObject = EmptyObject> = BaseParams<{
10
+ sourceArchivist: ArchivistInstance;
11
+ } & TAdditionalParams>;
12
+ export interface HydratedBlockStoreInstance {
13
+ fromHash(hash: Hash): Promisable<HydratedBlock | undefined>;
14
+ }
15
+ export interface IndexedHydratedBlockStoreInstance extends HydratedBlockStoreInstance {
16
+ fromNumber(number: number): Promisable<HydratedBlock | undefined>;
17
+ }
18
+ export interface HydratedBlockRangeStoreParams extends HydratedBlockStoreParams<{
19
+ first: Hash;
20
+ last: Hash;
21
+ snapshotArchivist: ArchivistInstance;
22
+ }> {
23
+ }
24
+ export interface IndexedHydratedBlockRangeStoreInstance extends BlockWindowInstance, IndexedHydratedBlockStoreInstance {
25
+ first(): Promisable<HydratedBlock>;
26
+ last(): Promisable<HydratedBlock>;
27
+ next(from: HydratedBlock): Promisable<HydratedBlock | undefined>;
28
+ next(from: HydratedBlock, count: number): Promisable<HydratedBlock[]>;
29
+ prev(from: HydratedBlock): Promisable<HydratedBlock | undefined>;
30
+ prev(from: HydratedBlock, count: number): Promisable<HydratedBlock[]>;
31
+ }
32
+ export declare class IndexedHydratedBlockRangeStore extends BaseEmitter<HydratedBlockRangeStoreParams> implements IndexedHydratedBlockRangeStoreInstance {
33
+ private _blockNumberIndex;
34
+ private _blockNumberIndexSemaphore;
35
+ private _firstNumber;
36
+ private _lastNumber;
37
+ protected constructor(params: HydratedBlockRangeStoreParams, firstNumber: number, lastNumber: number);
38
+ get count(): number;
39
+ get numberRange(): [number, number];
40
+ get range(): [Hash, Hash];
41
+ static create(params: HydratedBlockRangeStoreParams): Promise<IndexedHydratedBlockRangeStore>;
42
+ first(): Promise<HydratedBlock>;
43
+ fromHash(hash: Hash): Promise<HydratedBlock | undefined>;
44
+ fromNumber(number: number): Promisable<HydratedBlock | undefined>;
45
+ last(): Promise<HydratedBlock>;
46
+ next(from: HydratedBlock): Promise<HydratedBlock | undefined>;
47
+ next(from: HydratedBlock, count: number): Promise<HydratedBlock[]>;
48
+ prev(from: HydratedBlock): Promise<HydratedBlock | undefined>;
49
+ prev(from: HydratedBlock, count: number): Promise<HydratedBlock[]>;
50
+ private createSubscriptions;
51
+ private index;
52
+ }
53
+ //# sourceMappingURL=IndexedHydratedBlockRangeStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexedHydratedBlockRangeStore.d.ts","sourceRoot":"","sources":["../../../src/block/IndexedHydratedBlockRangeStore.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
+ export * from './IndexedHydratedBlockRangeStore.ts';
1
2
  export * from './SignedHydratedBlock.ts';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/block/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/block/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAA;AACnD,cAAc,0BAA0B,CAAA"}
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.3.27",
4
+ "version": "1.3.29",
5
5
  "description": "XYO Layer One SDK Wrappers",
6
6
  "homepage": "https://xylabs.com",
7
7
  "bugs": {
@@ -35,22 +35,30 @@
35
35
  },
36
36
  "dependencies": {
37
37
  "@xylabs/arraybuffer": "^4.9.18",
38
+ "@xylabs/assert": "^4.9.18",
39
+ "@xylabs/base": "^4.9.18",
40
+ "@xylabs/events": "^4.9.18",
41
+ "@xylabs/exists": "^4.9.18",
38
42
  "@xylabs/hex": "^4.9.18",
43
+ "@xylabs/object": "^4.9.18",
39
44
  "@xylabs/promise": "^4.9.18",
40
- "@xyo-network/boundwitness-model": "^3.15.10",
41
- "@xyo-network/boundwitness-validator": "^3.15.10",
42
- "@xyo-network/chain-protocol": "^1.3.27",
43
- "@xyo-network/chain-utils": "^1.3.27",
44
- "@xyo-network/chain-validation": "^1.3.27",
45
- "@xyo-network/payload-builder": "^3.15.10",
46
- "@xyo-network/payload-model": "^3.15.10",
45
+ "@xylabs/typeof": "^4.9.18",
46
+ "@xyo-network/archivist-model": "^3.16.0",
47
+ "@xyo-network/boundwitness-model": "^3.16.0",
48
+ "@xyo-network/boundwitness-validator": "^3.16.0",
49
+ "@xyo-network/chain-protocol": "^1.3.29",
50
+ "@xyo-network/chain-utils": "^1.3.29",
51
+ "@xyo-network/chain-validation": "^1.3.29",
52
+ "@xyo-network/payload-builder": "^3.16.0",
53
+ "@xyo-network/payload-model": "^3.16.0",
47
54
  "@xyo-network/xl1-protocol": "^1.3.17",
48
- "@xyo-network/xl1-protocol-sdk": "^1.3.27"
55
+ "@xyo-network/xl1-protocol-sdk": "^1.3.29",
56
+ "async-mutex": "^0.5.0"
49
57
  },
50
58
  "devDependencies": {
51
59
  "@types/node": "^22.15.18",
52
- "@xylabs/ts-scripts-yarn3": "^6.5.6",
53
- "@xylabs/tsconfig": "^6.5.6",
60
+ "@xylabs/ts-scripts-yarn3": "^6.5.7",
61
+ "@xylabs/tsconfig": "^6.5.7",
54
62
  "knip": "^5.56.0",
55
63
  "typescript": "^5.8.3"
56
64
  },
package/src/Address.ts ADDED
@@ -0,0 +1,22 @@
1
+ import {
2
+ type Address,
3
+ isAddress,
4
+ } from '@xylabs/hex'
5
+ import type { Promisable } from '@xylabs/promise'
6
+ import type { AddressInstance } from '@xyo-network/xl1-protocol-sdk'
7
+
8
+ export class AddressWrapper implements AddressInstance {
9
+ address: Address
10
+
11
+ constructor(address: Address) {
12
+ this.address = address
13
+ }
14
+
15
+ static validate(address: Address): Promisable<Error[]> {
16
+ return isAddress(address) ? [] : [new Error('Invalid address')]
17
+ }
18
+
19
+ async validate(): Promise<Error[]> {
20
+ return await AddressWrapper.validate(this.address)
21
+ }
22
+ }
@@ -0,0 +1,29 @@
1
+ import {
2
+ type Address,
3
+ isAddress,
4
+ } from '@xylabs/hex'
5
+ import type { Promisable } from '@xylabs/promise'
6
+ import type { AddressStateInstance, BlockWindowInstance } from '@xyo-network/xl1-protocol-sdk'
7
+
8
+ import { AddressWrapper } from './Address.ts'
9
+
10
+ export class AddressStateWrapper extends AddressWrapper implements AddressStateInstance {
11
+ blockWindow: BlockWindowInstance
12
+
13
+ constructor(address: Address, blockWindow: BlockWindowInstance) {
14
+ super(address)
15
+ this.blockWindow = blockWindow
16
+ }
17
+
18
+ static override validate(address: Address): Promisable<Error[]> {
19
+ return isAddress(address) ? [] : [new Error('Invalid address')]
20
+ }
21
+
22
+ balance(): Promisable<bigint> {
23
+ throw new Error('Method not implemented.')
24
+ }
25
+
26
+ override async validate(): Promise<Error[]> {
27
+ return await AddressWrapper.validate(this.address)
28
+ }
29
+ }
@@ -0,0 +1,43 @@
1
+ import type { Hash } from '@xylabs/hex'
2
+ import type { Promisable } from '@xylabs/promise'
3
+ import type { HydratedBlock } from '@xyo-network/xl1-protocol'
4
+ import type { BlockWindowInstance } from '@xyo-network/xl1-protocol-sdk'
5
+
6
+ export interface HydratedBlockRangeStore extends BlockWindowInstance {
7
+ first(): Promisable<HydratedBlock>
8
+ fromHash(hash: Hash): Promisable<HydratedBlock>
9
+ fromNumber(number: number): Promisable<HydratedBlock>
10
+ last(): Promisable<HydratedBlock>
11
+ next(): Promisable<HydratedBlock>
12
+ next(count: number): Promisable<HydratedBlock[]>
13
+ prev(): Promisable<HydratedBlock>
14
+ prev(count: number): Promisable<HydratedBlock[]>
15
+ }
16
+
17
+ export class BlockWindowWrapper implements BlockWindowInstance {
18
+ private _store: HydratedBlockRangeStore
19
+
20
+ constructor(store: HydratedBlockRangeStore) {
21
+ this._store = store
22
+ }
23
+
24
+ get count() {
25
+ return this._store.count
26
+ }
27
+
28
+ get numberRange() {
29
+ return this._store.numberRange
30
+ }
31
+
32
+ get range() {
33
+ return this._store.range
34
+ }
35
+
36
+ static validate(_store: HydratedBlockRangeStore): Promisable<Error[]> {
37
+ return [] // TODO: Implement validation logic
38
+ }
39
+
40
+ async validate(): Promise<Error[]> {
41
+ return await BlockWindowWrapper.validate(this._store)
42
+ }
43
+ }
@@ -0,0 +1,20 @@
1
+ import type { Address } from '@xylabs/hex'
2
+ import type { Promisable } from '@xylabs/promise'
3
+
4
+ import type { HydratedBlockRangeStore } from './BlockWindow.ts'
5
+
6
+ export interface BlockWindowBalanceCacheInstance {
7
+ balance(address: Address): Promisable<bigint>
8
+ }
9
+
10
+ export class BlockWindowBalanceCache implements BlockWindowBalanceCacheInstance {
11
+ private _store: HydratedBlockRangeStore
12
+
13
+ constructor(store: HydratedBlockRangeStore) {
14
+ this._store = store
15
+ }
16
+
17
+ balance(_address: Address): Promisable<bigint> {
18
+ throw new Error('Method not implemented.')
19
+ }
20
+ }
@@ -0,0 +1,188 @@
1
+ import { assertEx } from '@xylabs/assert'
2
+ import type { BaseParams } from '@xylabs/base'
3
+ import { BaseEmitter } from '@xylabs/events'
4
+ import { exists } from '@xylabs/exists'
5
+ import type { Hash } from '@xylabs/hex'
6
+ import type { EmptyObject } from '@xylabs/object'
7
+ import type { Promisable } from '@xylabs/promise'
8
+ import { isDefined } from '@xylabs/typeof'
9
+ import type { ArchivistInstance } from '@xyo-network/archivist-model'
10
+ import { hydrateBlock } from '@xyo-network/chain-protocol'
11
+ import {
12
+ asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta, type HydratedBlock,
13
+ } from '@xyo-network/xl1-protocol'
14
+ import type { BlockWindowInstance } from '@xyo-network/xl1-protocol-sdk'
15
+ import { Semaphore } from 'async-mutex'
16
+
17
+ export type HydratedBlockStoreParams<TAdditionalParams extends EmptyObject = EmptyObject> = BaseParams<{
18
+ sourceArchivist: ArchivistInstance
19
+ } & TAdditionalParams>
20
+
21
+ export interface HydratedBlockStoreInstance {
22
+ fromHash(hash: Hash): Promisable<HydratedBlock | undefined>
23
+ }
24
+
25
+ export interface IndexedHydratedBlockStoreInstance extends HydratedBlockStoreInstance {
26
+ fromNumber(number: number): Promisable<HydratedBlock | undefined>
27
+ }
28
+
29
+ export interface HydratedBlockRangeStoreParams extends HydratedBlockStoreParams<{
30
+ first: Hash
31
+ last: Hash
32
+ snapshotArchivist: ArchivistInstance
33
+ }> {}
34
+
35
+ export interface IndexedHydratedBlockRangeStoreInstance extends BlockWindowInstance, IndexedHydratedBlockStoreInstance {
36
+ first(): Promisable<HydratedBlock>
37
+ last(): Promisable<HydratedBlock>
38
+ next(from: HydratedBlock): Promisable<HydratedBlock | undefined>
39
+ next(from: HydratedBlock, count: number): Promisable<HydratedBlock[]>
40
+ prev(from: HydratedBlock): Promisable<HydratedBlock | undefined>
41
+ prev(from: HydratedBlock, count: number): Promisable<HydratedBlock[]>
42
+ }
43
+
44
+ const BlockNumberIndexSemaphoreLocks = 10 as const
45
+
46
+ // TODO: Allow/Require source/snapshot archivist to be BlockStores instead
47
+ export class IndexedHydratedBlockRangeStore extends BaseEmitter<HydratedBlockRangeStoreParams> implements IndexedHydratedBlockRangeStoreInstance {
48
+ private _blockNumberIndex: Map<number, Hash> = new Map()
49
+ private _blockNumberIndexSemaphore = new Semaphore(BlockNumberIndexSemaphoreLocks)
50
+ private _firstNumber: number
51
+ private _lastNumber: number
52
+
53
+ protected constructor(params: HydratedBlockRangeStoreParams, firstNumber: number, lastNumber: number) {
54
+ super(params)
55
+ this._firstNumber = firstNumber
56
+ this._lastNumber = lastNumber
57
+ }
58
+
59
+ get count(): number {
60
+ return this._lastNumber - this._firstNumber + 1
61
+ }
62
+
63
+ get numberRange(): [number, number] {
64
+ return [this._firstNumber, this._lastNumber]
65
+ }
66
+
67
+ get range(): [Hash, Hash] {
68
+ return [this.params.first, this.params.last]
69
+ }
70
+
71
+ static async create(params: HydratedBlockRangeStoreParams): Promise<IndexedHydratedBlockRangeStore> {
72
+ const firstBlock = asBlockBoundWitness((await params.sourceArchivist.get([params.first])).at(0)
73
+ ?? (await params.snapshotArchivist.get([params.first])).at(0), {})
74
+ const firstBlockExisting = assertEx(firstBlock, () => 'First block not found')
75
+
76
+ const lastBlock = asBlockBoundWitness((await params.sourceArchivist.get([params.last])).at(0)
77
+ ?? (await params.snapshotArchivist.get([params.last])).at(0), {})
78
+ const lastBlockExisting = assertEx(lastBlock, () => 'Last block not found')
79
+
80
+ // getting the block numbers here since can not get them in the constructor
81
+ const result = new IndexedHydratedBlockRangeStore(params, firstBlockExisting.block, lastBlockExisting.block)
82
+ result.createSubscriptions()
83
+ await result.index()
84
+ return result
85
+ }
86
+
87
+ async first(): Promise<HydratedBlock> {
88
+ return assertEx(await this.fromHash(this.params.first), () => 'First block not found')
89
+ }
90
+
91
+ async fromHash(hash: Hash): Promise<HydratedBlock | undefined> {
92
+ const block = (await hydrateBlock(this.params.sourceArchivist, hash))
93
+ ?? (await hydrateBlock(this.params.snapshotArchivist, hash))
94
+ if (isDefined(block) && (block[0].block <= this._lastNumber && block[0].block >= this._firstNumber)) {
95
+ return block
96
+ }
97
+ }
98
+
99
+ fromNumber(number: number): Promisable<HydratedBlock | undefined> {
100
+ const hash = this._blockNumberIndex.get(number)
101
+ if (isDefined(hash)) {
102
+ return this.fromHash(hash)
103
+ }
104
+ }
105
+
106
+ async last(): Promise<HydratedBlock> {
107
+ return assertEx(await this.fromHash(this.params.last), () => 'Last block not found')
108
+ }
109
+
110
+ async next(from: HydratedBlock): Promise<HydratedBlock | undefined>
111
+ async next(from: HydratedBlock, count: number): Promise<HydratedBlock[]>
112
+ async next(from: HydratedBlock, count?: number): Promise<HydratedBlock | HydratedBlock[] | undefined> {
113
+ const nextBlockNumber = from[0].block + 1
114
+ if (nextBlockNumber > this._lastNumber) {
115
+ return isDefined(count) ? [] : undefined
116
+ }
117
+ if (isDefined(count)) {
118
+ if (count === 0) {
119
+ return []
120
+ }
121
+ const nextBlock = await this.fromNumber(nextBlockNumber)
122
+
123
+ if (isDefined(nextBlock)) {
124
+ return [nextBlock, ...await this.next(nextBlock, count - 1)].filter(exists)
125
+ } else {
126
+ if (from[0].block < this._lastNumber) {
127
+ throw new Error(`Next block [${nextBlockNumber}] not found, but should be in range`)
128
+ }
129
+ return []
130
+ }
131
+ } else {
132
+ return await this.fromNumber(nextBlockNumber)
133
+ }
134
+ }
135
+
136
+ async prev(from: HydratedBlock): Promise<HydratedBlock | undefined>
137
+ async prev(from: HydratedBlock, count: number): Promise<HydratedBlock[]>
138
+ async prev(from: HydratedBlock, count?: number): Promise<HydratedBlock | HydratedBlock[] | undefined> {
139
+ const prevBlockNumber = from[0].block - 1
140
+ if (prevBlockNumber < this._firstNumber) {
141
+ return isDefined(count) ? [] : undefined
142
+ }
143
+ if (isDefined(count)) {
144
+ if (count === 0) {
145
+ return []
146
+ }
147
+ const prevBlock = await this.fromNumber(prevBlockNumber)
148
+ if (isDefined(prevBlock)) {
149
+ return [...await this.next(prevBlock, count - 1), prevBlock].filter(exists)
150
+ } else {
151
+ if (from[0].block > this._firstNumber) {
152
+ throw new Error(`Prev block [${prevBlockNumber}] not found, but should be in range`)
153
+ }
154
+ return []
155
+ }
156
+ } else {
157
+ return await this.fromNumber(prevBlockNumber)
158
+ }
159
+ }
160
+
161
+ private createSubscriptions(): void {
162
+ // we monitor deletes so that we can keep them if we need them for the window
163
+ this.params.sourceArchivist.on('deleted', async ({ payloads }) => {
164
+ await this.params.snapshotArchivist.insert(payloads)
165
+ })
166
+ }
167
+
168
+ private async index() {
169
+ // get all the locks (make exclusive)
170
+ await this._blockNumberIndexSemaphore.acquire(BlockNumberIndexSemaphoreLocks)
171
+ try {
172
+ this._blockNumberIndex.clear()
173
+ let blockToIndex: Hash = this.params.last
174
+ let firstFound = false
175
+ while (!firstFound) {
176
+ const payload = assertEx((await this.params.sourceArchivist.get([blockToIndex])).at(0), () => 'Block payload not found')
177
+ const block = assertEx(asBlockBoundWitnessWithStorageMeta(payload), () => 'Payload is not a Block')
178
+ if (block.block < this._firstNumber || block.block > this._lastNumber) {
179
+ throw new Error(`Block [${block.block}] is out of range`)
180
+ }
181
+ this._blockNumberIndex.set(block.block, block._hash)
182
+ firstFound = block.block === this._firstNumber
183
+ }
184
+ } finally {
185
+ this._blockNumberIndexSemaphore.release(BlockNumberIndexSemaphoreLocks)
186
+ }
187
+ }
188
+ }
@@ -1 +1,2 @@
1
+ export * from './IndexedHydratedBlockRangeStore.ts'
1
2
  export * from './SignedHydratedBlock.ts'