@xyo-network/xl1-protocol-sdk 1.5.28 → 1.5.30

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.
Files changed (64) hide show
  1. package/dist/neutral/index.mjs +261 -14
  2. package/dist/neutral/index.mjs.map +1 -1
  3. package/dist/types/block/hydrateBlock.d.ts +12 -0
  4. package/dist/types/block/hydrateBlock.d.ts.map +1 -0
  5. package/dist/types/block/index.d.ts +3 -0
  6. package/dist/types/block/index.d.ts.map +1 -0
  7. package/dist/types/block/primitives/frames/BlockNumberRange.d.ts +2 -0
  8. package/dist/types/block/primitives/frames/BlockNumberRange.d.ts.map +1 -0
  9. package/dist/types/block/primitives/frames/calculateFramesFromRange.d.ts +6 -0
  10. package/dist/types/block/primitives/frames/calculateFramesFromRange.d.ts.map +1 -0
  11. package/dist/types/block/primitives/frames/deepCalculateFramesFromRange.d.ts +3 -0
  12. package/dist/types/block/primitives/frames/deepCalculateFramesFromRange.d.ts.map +1 -0
  13. package/dist/types/block/primitives/frames/index.d.ts +3 -0
  14. package/dist/types/block/primitives/frames/index.d.ts.map +1 -0
  15. package/dist/types/block/primitives/frames/loadFrameSummaries.d.ts +5 -0
  16. package/dist/types/block/primitives/frames/loadFrameSummaries.d.ts.map +1 -0
  17. package/dist/types/block/primitives/frames/stepHashFramesFromBlock.d.ts +5 -0
  18. package/dist/types/block/primitives/frames/stepHashFramesFromBlock.d.ts.map +1 -0
  19. package/dist/types/block/primitives/index.d.ts +2 -0
  20. package/dist/types/block/primitives/index.d.ts.map +1 -0
  21. package/dist/types/index.d.ts +1 -0
  22. package/dist/types/index.d.ts.map +1 -1
  23. package/dist/types/instances/block/BlockFields.d.ts +0 -2
  24. package/dist/types/instances/block/BlockFields.d.ts.map +1 -1
  25. package/dist/types/instances/block/HydratedBlock.d.ts +0 -1
  26. package/dist/types/instances/block/HydratedBlock.d.ts.map +1 -1
  27. package/dist/types/instances/transaction/TransactionFields.d.ts +5 -0
  28. package/dist/types/instances/transaction/TransactionFields.d.ts.map +1 -1
  29. package/dist/types/transaction/index.d.ts +1 -1
  30. package/dist/types/transaction/index.d.ts.map +1 -1
  31. package/dist/types/transaction/primitives/index.d.ts +5 -0
  32. package/dist/types/transaction/primitives/index.d.ts.map +1 -0
  33. package/dist/types/transaction/primitives/transactionBlockByteCount.d.ts +4 -0
  34. package/dist/types/transaction/primitives/transactionBlockByteCount.d.ts.map +1 -0
  35. package/dist/types/transaction/primitives/transactionElevatedPayloads.d.ts +6 -0
  36. package/dist/types/transaction/primitives/transactionElevatedPayloads.d.ts.map +1 -0
  37. package/dist/types/transaction/primitives/transactionOperations.d.ts +3 -0
  38. package/dist/types/transaction/primitives/transactionOperations.d.ts.map +1 -0
  39. package/dist/types/transaction/primitives/transactionRequiredGas.d.ts +6 -0
  40. package/dist/types/transaction/primitives/transactionRequiredGas.d.ts.map +1 -0
  41. package/package.json +18 -15
  42. package/src/block/hydrateBlock.ts +83 -0
  43. package/src/block/index.ts +2 -0
  44. package/src/block/primitives/frames/BlockNumberRange.ts +1 -0
  45. package/src/block/primitives/frames/calculateFramesFromRange.ts +29 -0
  46. package/src/block/primitives/frames/deepCalculateFramesFromRange.ts +27 -0
  47. package/src/block/primitives/frames/index.ts +2 -0
  48. package/src/block/primitives/frames/loadFrameSummaries.ts +12 -0
  49. package/src/block/primitives/frames/stepHashFramesFromBlock.ts +72 -0
  50. package/src/block/primitives/index.ts +1 -0
  51. package/src/index.ts +1 -0
  52. package/src/instances/block/BlockFields.ts +0 -4
  53. package/src/instances/block/HydratedBlock.ts +1 -3
  54. package/src/instances/transaction/TransactionFields.ts +6 -0
  55. package/src/transaction/index.ts +1 -1
  56. package/src/transaction/primitives/index.ts +4 -0
  57. package/src/transaction/primitives/transactionBlockByteCount.ts +10 -0
  58. package/src/transaction/primitives/transactionElevatedPayloads.ts +16 -0
  59. package/src/transaction/primitives/transactionOperations.ts +11 -0
  60. package/src/transaction/primitives/transactionRequiredGas.ts +21 -0
  61. package/dist/types/transaction/transactionRequiredGas.d.ts +0 -4
  62. package/dist/types/transaction/transactionRequiredGas.d.ts.map +0 -1
  63. package/knip.config.ts +0 -15
  64. package/src/transaction/transactionRequiredGas.ts +0 -13
@@ -1,8 +1,190 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
 
4
- // src/transaction/buildTransaction.ts
4
+ // src/block/hydrateBlock.ts
5
+ import { filterAs } from "@xylabs/array";
5
6
  import { assertEx } from "@xylabs/assert";
7
+ import { asOptionalBlockBoundWitnessWithStorageMeta, asOptionalTransactionBoundWitnessWithStorageMeta, isTransactionBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol";
8
+ function allHashesPresent(hashes, payloads) {
9
+ const payloadHashes = new Set(payloads.map((p) => p._hash));
10
+ return hashes.every((hash) => payloadHashes.has(hash));
11
+ }
12
+ __name(allHashesPresent, "allHashesPresent");
13
+ var tryHydrateBlock = /* @__PURE__ */ __name(async (archivist, hash, maxDepth = 1, minDepth) => {
14
+ try {
15
+ return await hydrateBlock(archivist, hash, maxDepth, minDepth);
16
+ } catch (e) {
17
+ if (e instanceof Error) {
18
+ console.warn(`Failed to hydrate block ${hash}: ${e.message}`);
19
+ } else {
20
+ console.warn(`Failed to hydrate block ${hash}: ${e}`);
21
+ }
22
+ return void 0;
23
+ }
24
+ }, "tryHydrateBlock");
25
+ var hydrateBlock = /* @__PURE__ */ __name(async (archivist, hash, maxDepth = 1, minDepth) => {
26
+ if (minDepth === void 0) minDepth = maxDepth;
27
+ assertEx(maxDepth >= 0, () => "maxDepth must be greater than or equal to 0");
28
+ assertEx(minDepth >= 0, () => "minDepth must be greater than or equal to 0");
29
+ assertEx(maxDepth >= minDepth, () => "maxDepth must be greater than or equal to minDepth");
30
+ const bw = assertEx(filterAs(await archivist.get([
31
+ hash
32
+ ]), asOptionalBlockBoundWitnessWithStorageMeta).at(0), () => `block ${hash} not found`);
33
+ if (maxDepth === 0) return [
34
+ bw,
35
+ []
36
+ ];
37
+ const blkPayloads = await archivist.get(bw.payload_hashes);
38
+ if (minDepth === 1) assertEx(allHashesPresent(bw.payload_hashes, blkPayloads), () => `Unable to find all payloads for block ${hash}`);
39
+ if (maxDepth === 1) return [
40
+ bw,
41
+ blkPayloads
42
+ ];
43
+ const transactions = filterAs(blkPayloads, asOptionalTransactionBoundWitnessWithStorageMeta);
44
+ const transactionsPayloadHashes = transactions.flatMap((tx) => tx.payload_hashes);
45
+ const transactionsPayloads = await archivist.get(transactionsPayloadHashes);
46
+ assertEx(allHashesPresent(transactionsPayloadHashes, transactionsPayloads), () => `Unable to find all payloads for transactions in block ${hash}`);
47
+ const allPayloadsHashes = new Set([
48
+ ...blkPayloads,
49
+ ...transactionsPayloads
50
+ ].flatMap((p) => p._hash));
51
+ const allPayloads = await archivist.get([
52
+ ...allPayloadsHashes
53
+ ]);
54
+ const allPayloadsFiltered = allPayloads.filter((p) => allPayloadsHashes.has(p._hash));
55
+ if (maxDepth === 2) assertEx(allHashesPresent([
56
+ ...allPayloadsHashes
57
+ ], allPayloadsFiltered), () => `Unable to find all payloads for transactions in block ${hash}`);
58
+ return [
59
+ bw,
60
+ allPayloadsFiltered
61
+ ];
62
+ }, "hydrateBlock");
63
+ var flattenHydratedBlock = /* @__PURE__ */ __name((hydratedBlock) => {
64
+ const [blk, blkPayloads] = hydratedBlock;
65
+ return [
66
+ ...blkPayloads,
67
+ blk
68
+ ];
69
+ }, "flattenHydratedBlock");
70
+ var flattenHydratedBlocks = /* @__PURE__ */ __name((hydratedBlocks) => hydratedBlocks.flatMap((blk) => flattenHydratedBlock(blk)), "flattenHydratedBlocks");
71
+ var transactionsFromHydratedBlock = /* @__PURE__ */ __name((block) => {
72
+ return filterAs(block[1], asOptionalTransactionBoundWitnessWithStorageMeta);
73
+ }, "transactionsFromHydratedBlock");
74
+ var blockPayloadsFromHydratedBlock = /* @__PURE__ */ __name((block) => {
75
+ return block[0].payload_hashes.map((hash) => assertEx(block[1].find((p) => p._hash === hash), () => `missing payload ${hash}`)).filter((x) => !isTransactionBoundWitnessWithStorageMeta(x));
76
+ }, "blockPayloadsFromHydratedBlock");
77
+
78
+ // src/block/primitives/frames/stepHashFramesFromBlock.ts
79
+ import { assertEx as assertEx2 } from "@xylabs/assert";
80
+ import { isHash } from "@xylabs/hex";
81
+ import { isDefined } from "@xylabs/typeof";
82
+ import { isBlockBoundWitness, StepSizes } from "@xyo-network/xl1-protocol";
83
+ async function stepHashFramesFromBlockAtSize(archivist, head, sizeIndex) {
84
+ if (!Number.isInteger(sizeIndex) || sizeIndex < 0 || sizeIndex >= StepSizes.length) {
85
+ throw new Error(`Invalid sizeIndex: ${sizeIndex}`);
86
+ }
87
+ let currentHead = head;
88
+ const steps = [];
89
+ while (isHash(currentHead)) {
90
+ const [block] = await archivist.get([
91
+ currentHead
92
+ ]);
93
+ if (!isBlockBoundWitness(block)) {
94
+ throw new Error(`Block with hash ${currentHead} not found`);
95
+ }
96
+ let stepHash = block.step_hashes.at(sizeIndex);
97
+ while (isDefined(stepHash)) {
98
+ const [stepHashBlock] = await archivist.get([
99
+ stepHash
100
+ ]);
101
+ if (!isBlockBoundWitness(stepHashBlock)) {
102
+ throw new Error(`StepHashBlock with hash ${currentHead} not found`);
103
+ }
104
+ const [lastBlockInStep] = await archivist.get([
105
+ assertEx2(stepHashBlock.previous, () => "StepHashBlock must have a previous block")
106
+ ]);
107
+ if (!isBlockBoundWitness(lastBlockInStep)) {
108
+ throw new Error(`StepHashBlock with hash ${currentHead} not found`);
109
+ }
110
+ steps.push([
111
+ stepHash,
112
+ stepHashBlock.block - StepSizes[sizeIndex],
113
+ stepHashBlock.block - 1
114
+ ]);
115
+ stepHash = lastBlockInStep.step_hashes.at(sizeIndex);
116
+ }
117
+ }
118
+ return steps;
119
+ }
120
+ __name(stepHashFramesFromBlockAtSize, "stepHashFramesFromBlockAtSize");
121
+ async function stepHashFramesFromBlock(archivist, head) {
122
+ const [block] = await archivist.get([
123
+ head
124
+ ]);
125
+ if (!isBlockBoundWitness(block)) {
126
+ throw new Error(`Block with hash ${head} not found`);
127
+ }
128
+ let availableRanges = [
129
+ [
130
+ 0,
131
+ block.block
132
+ ]
133
+ ];
134
+ const foundRanges = [];
135
+ for (let i = StepSizes.length - 1; i >= 0; i--) {
136
+ const steps = await stepHashFramesFromBlockAtSize(archivist, head, i);
137
+ for (let step of steps) {
138
+ const [, start, end] = step;
139
+ if (availableRanges.some((range) => range[0] <= start && range[1] >= end)) {
140
+ foundRanges.push(step);
141
+ availableRanges = availableRanges.flatMap((range) => {
142
+ if (range[0] >= start && range[1] <= end) {
143
+ return [
144
+ [
145
+ range[0],
146
+ start - 1
147
+ ]
148
+ ];
149
+ } else if (range[0] < start && range[1] >= end) {
150
+ return [
151
+ [
152
+ range[0],
153
+ start - 1
154
+ ],
155
+ [
156
+ end + 1,
157
+ range[1]
158
+ ]
159
+ ];
160
+ } else if (range[0] < start && range[1] < end) {
161
+ return [
162
+ [
163
+ range[0],
164
+ start - 1
165
+ ]
166
+ ];
167
+ } else if (range[0] > start && range[1] > end) {
168
+ return [
169
+ [
170
+ end + 1,
171
+ range[1]
172
+ ]
173
+ ];
174
+ }
175
+ return [
176
+ range
177
+ ];
178
+ });
179
+ }
180
+ }
181
+ }
182
+ return foundRanges;
183
+ }
184
+ __name(stepHashFramesFromBlock, "stepHashFramesFromBlock");
185
+
186
+ // src/transaction/buildTransaction.ts
187
+ import { assertEx as assertEx3 } from "@xylabs/assert";
6
188
  import { toHex } from "@xylabs/hex";
7
189
  import { BoundWitnessBuilder } from "@xyo-network/boundwitness-builder";
8
190
  import { PayloadBuilder } from "@xyo-network/payload-builder";
@@ -30,7 +212,7 @@ async function buildTransaction(chain, elevatedPayloads, additionalPayloads, sig
30
212
  const [tx, txPayloads] = await new BoundWitnessBuilder().fields({
31
213
  ...txBoundWitnessFields,
32
214
  script,
33
- from: from ?? (Array.isArray(signer) ? assertEx(signer.at(0)?.address) : signer.address)
215
+ from: from ?? (Array.isArray(signer) ? assertEx3(signer.at(0)?.address) : signer.address)
34
216
  }).meta({
35
217
  $signatures: []
36
218
  }).payloads([
@@ -47,14 +229,14 @@ async function buildTransaction(chain, elevatedPayloads, additionalPayloads, sig
47
229
  __name(buildTransaction, "buildTransaction");
48
230
 
49
231
  // src/transaction/hydrateTransaction.ts
50
- import { assertEx as assertEx2 } from "@xylabs/assert";
232
+ import { assertEx as assertEx4 } from "@xylabs/assert";
51
233
  import { hydrateTypedBoundWitness, tryHydrateTypedBoundWitness } from "@xyo-network/archivist-model";
52
- import { isAllowedBlockPayload, isTransactionBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol";
234
+ import { isAllowedBlockPayload, isTransactionBoundWitnessWithStorageMeta as isTransactionBoundWitnessWithStorageMeta2 } from "@xyo-network/xl1-protocol";
53
235
  var tryHydrateTransaction = /* @__PURE__ */ __name(async (archivist, hash) => {
54
- return await tryHydrateTypedBoundWitness(archivist, hash, isTransactionBoundWitnessWithStorageMeta);
236
+ return await tryHydrateTypedBoundWitness(archivist, hash, isTransactionBoundWitnessWithStorageMeta2);
55
237
  }, "tryHydrateTransaction");
56
238
  var hydrateTransaction = /* @__PURE__ */ __name(async (archivist, hash) => {
57
- return await hydrateTypedBoundWitness(archivist, hash, isTransactionBoundWitnessWithStorageMeta);
239
+ return await hydrateTypedBoundWitness(archivist, hash, isTransactionBoundWitnessWithStorageMeta2);
58
240
  }, "hydrateTransaction");
59
241
  var flattenHydratedTransaction = /* @__PURE__ */ __name((hydratedTransaction) => {
60
242
  const [tx, txPayloads] = hydratedTransaction;
@@ -90,26 +272,91 @@ var tryHydrateElevatedTransaction = /* @__PURE__ */ __name(async (archivist, has
90
272
  return void 0;
91
273
  }, "tryHydrateElevatedTransaction");
92
274
  var hydrateElevatedTransaction = /* @__PURE__ */ __name(async (archivist, hash) => {
93
- return assertEx2(await tryHydrateElevatedTransaction(archivist, hash), () => "Hydration failed");
275
+ return assertEx4(await tryHydrateElevatedTransaction(archivist, hash), () => "Hydration failed");
94
276
  }, "hydrateElevatedTransaction");
95
277
 
96
- // src/transaction/transactionRequiredGas.ts
278
+ // src/transaction/primitives/transactionBlockByteCount.ts
279
+ import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
280
+ function transactionBlockByteCount([transaction, payloads]) {
281
+ const cleanTransaction = PayloadBuilder2.omitStorageMeta(transaction);
282
+ const transactionBytes = JSON.stringify(cleanTransaction).length;
283
+ const cleanPayloads = PayloadBuilder2.omitStorageMeta(payloads);
284
+ return cleanPayloads.reduce((acc, payload) => acc + JSON.stringify(payload).length, 0) + transactionBytes;
285
+ }
286
+ __name(transactionBlockByteCount, "transactionBlockByteCount");
287
+
288
+ // src/transaction/primitives/transactionElevatedPayloads.ts
289
+ import { asHash } from "@xylabs/hex";
290
+
291
+ // src/transaction/primitives/transactionOperations.ts
292
+ function crackOperation(operation) {
293
+ const parts = operation.split("|");
294
+ if (parts.length < 2) {
295
+ throw new Error(`Invalid operation format: ${operation}`);
296
+ }
297
+ return [
298
+ parts[0],
299
+ parts.slice(1)
300
+ ];
301
+ }
302
+ __name(crackOperation, "crackOperation");
303
+ function crackOperations(operations) {
304
+ return operations.map((op) => crackOperation(op));
305
+ }
306
+ __name(crackOperations, "crackOperations");
307
+
308
+ // src/transaction/primitives/transactionElevatedPayloads.ts
309
+ function transactionElevatedPayloadHashes(transaction) {
310
+ const elevateOperations = crackOperations(transaction.script ?? []).filter((op) => op[0] === "elevate");
311
+ return elevateOperations.map((op) => asHash(op[1][0], true));
312
+ }
313
+ __name(transactionElevatedPayloadHashes, "transactionElevatedPayloadHashes");
314
+ function transactionElevatedPayloads([transaction, payloads]) {
315
+ const hashes = transactionElevatedPayloadHashes(transaction);
316
+ const elevatedPayloads = payloads.filter((payload) => hashes.includes(payload._hash));
317
+ return elevatedPayloads;
318
+ }
319
+ __name(transactionElevatedPayloads, "transactionElevatedPayloads");
320
+
321
+ // src/transaction/primitives/transactionRequiredGas.ts
97
322
  import { AttoXL1, TransactionGasCosts } from "@xyo-network/xl1-protocol";
98
- function transactionRequiredGas([transaction, payloads]) {
99
- const characters = payloads.reduce((acc, payload) => acc + JSON.stringify(payload).length, 0);
100
- const hashes = transaction.payload_hashes.length + 1;
101
- const signatures = transaction.addresses.length + 1;
102
- const elevatedPayloads = (transaction.script ?? []).length;
103
- return AttoXL1(TransactionGasCosts.characterStorage * BigInt(characters) + TransactionGasCosts.hashValidation * BigInt(hashes) + TransactionGasCosts.signatureValidation * BigInt(signatures) + TransactionGasCosts.payloadValidation * BigInt(elevatedPayloads));
323
+ function transactionBytesRequiredGas([transaction, payloads]) {
324
+ const transactionBlockBytes = transactionBlockByteCount([
325
+ transaction,
326
+ payloads
327
+ ]);
328
+ return AttoXL1(TransactionGasCosts.characterStorage * BigInt(transactionBlockBytes));
329
+ }
330
+ __name(transactionBytesRequiredGas, "transactionBytesRequiredGas");
331
+ function transactionRequiredGas(hydratedTransaction) {
332
+ const elevatedPayloads = transactionElevatedPayloads(hydratedTransaction);
333
+ const hashes = elevatedPayloads.length + 1;
334
+ const signatures = hydratedTransaction[0].addresses.length;
335
+ return AttoXL1(transactionBytesRequiredGas(hydratedTransaction) + TransactionGasCosts.hashValidation * BigInt(hashes) + TransactionGasCosts.signatureValidation * BigInt(signatures) + TransactionGasCosts.payloadValidation * BigInt(elevatedPayloads.length));
104
336
  }
105
337
  __name(transactionRequiredGas, "transactionRequiredGas");
106
338
  export {
339
+ allHashesPresent,
340
+ blockPayloadsFromHydratedBlock,
107
341
  buildTransaction,
342
+ crackOperation,
343
+ crackOperations,
344
+ flattenHydratedBlock,
345
+ flattenHydratedBlocks,
108
346
  flattenHydratedTransaction,
109
347
  flattenHydratedTransactions,
348
+ hydrateBlock,
110
349
  hydrateElevatedTransaction,
111
350
  hydrateTransaction,
351
+ stepHashFramesFromBlock,
352
+ stepHashFramesFromBlockAtSize,
353
+ transactionBlockByteCount,
354
+ transactionBytesRequiredGas,
355
+ transactionElevatedPayloadHashes,
356
+ transactionElevatedPayloads,
112
357
  transactionRequiredGas,
358
+ transactionsFromHydratedBlock,
359
+ tryHydrateBlock,
113
360
  tryHydrateElevatedTransaction,
114
361
  tryHydrateTransaction
115
362
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/transaction/buildTransaction.ts","../../src/transaction/hydrateTransaction.ts","../../src/transaction/transactionRequiredGas.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport { toHex } from '@xylabs/hex'\nimport type { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport {\n type AllowedBlockPayload,\n defaultTransactionFees,\n type HydratedTransactionWithStorageMeta, type TransactionBoundWitness, type TransactionBoundWitnessFields, type TransactionFeesBigInt,\n} from '@xyo-network/xl1-protocol'\n\nexport async function buildTransaction(\n chain: Address,\n elevatedPayloads: AllowedBlockPayload[],\n additionalPayloads: Payload[],\n signer: AccountInstance | AccountInstance[],\n nbf: number,\n exp: number,\n from?: Address,\n fees: TransactionFeesBigInt = defaultTransactionFees,\n): Promise<HydratedTransactionWithStorageMeta> {\n if (from === undefined && Array.isArray(signer)) {\n throw new Error('from is required when signer is an array')\n }\n\n const txBoundWitnessFields: TransactionBoundWitnessFields = {\n chain,\n fees: {\n base: toHex(fees.base),\n gasLimit: toHex(fees.gasLimit),\n gasPrice: toHex(fees.gasPrice),\n priority: toHex(fees.priority),\n },\n nbf,\n exp,\n }\n\n const elevatedHashes = await PayloadBuilder.hashes(elevatedPayloads)\n const script: string[] = []\n for (const elevatedHash of elevatedHashes) {\n script.push(`elevate|${elevatedHash}`)\n }\n\n const [tx, txPayloads] = await new BoundWitnessBuilder<TransactionBoundWitness>()\n .fields({\n ...txBoundWitnessFields,\n script,\n from: from ?? (Array.isArray(signer) ? assertEx(signer.at(0)?.address) : signer.address),\n })\n .meta({ $signatures: [] })\n .payloads([...elevatedPayloads, ...additionalPayloads])\n .signers(Array.isArray(signer) ? signer : [signer])\n .build()\n\n return [await PayloadBuilder.addStorageMeta(tx), await PayloadBuilder.addStorageMeta(txPayloads)]\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Hash } from '@xylabs/hex'\nimport type { ReadArchivist } from '@xyo-network/archivist-model'\nimport { hydrateTypedBoundWitness, tryHydrateTypedBoundWitness } from '@xyo-network/archivist-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type {\n AllowedBlockPayload,\n HydratedTransaction, HydratedTransactionWithStorageMeta, TransactionBoundWitness,\n} from '@xyo-network/xl1-protocol'\nimport { isAllowedBlockPayload, isTransactionBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol'\n\nexport const tryHydrateTransaction = async (\n archivist: ReadArchivist,\n hash: Hash,\n): Promise<HydratedTransactionWithStorageMeta | undefined> => {\n return (await tryHydrateTypedBoundWitness<TransactionBoundWitness>(\n archivist,\n hash,\n isTransactionBoundWitnessWithStorageMeta,\n )) as HydratedTransactionWithStorageMeta | undefined\n}\n\nexport const hydrateTransaction = async (\n archivist: ReadArchivist,\n hash: Hash,\n): Promise<HydratedTransactionWithStorageMeta> => {\n return await hydrateTypedBoundWitness<TransactionBoundWitness>(\n archivist,\n hash,\n isTransactionBoundWitnessWithStorageMeta,\n ) as HydratedTransactionWithStorageMeta\n}\n\nexport const flattenHydratedTransaction = (hydratedTransaction: HydratedTransaction): Payload[] => {\n const [tx, txPayloads] = hydratedTransaction\n return [...txPayloads, tx]\n}\n\nexport const flattenHydratedTransactions = (hydratedTransactions: HydratedTransaction[]): Payload[] =>\n hydratedTransactions.flatMap(tx => flattenHydratedTransaction(tx))\n\nexport const tryHydrateElevatedTransaction = async (\n archivist: ReadArchivist,\n hash: Hash,\n): Promise<HydratedTransaction | undefined> => {\n const hydratedTransaction = await tryHydrateTransaction(archivist, hash)\n if (!hydratedTransaction) {\n return undefined\n }\n const [transaction, payloads] = hydratedTransaction\n const opCodes = (transaction.script ?? []).filter(operation => operation.startsWith('elevate|'))\n const elevatedPayloads: AllowedBlockPayload[] = []\n for (const opCode of opCodes) {\n const [code, hash] = opCode.split('|')\n if (code === 'elevated') {\n const elevatedPayload = payloads.find(payload => payload._hash === hash)\n if (isAllowedBlockPayload(elevatedPayload)) {\n elevatedPayloads.push(elevatedPayload)\n }\n }\n }\n if (opCodes.length === elevatedPayloads.length) {\n return [transaction, elevatedPayloads]\n }\n return undefined\n}\n\nexport const hydrateElevatedTransaction = async (\n archivist: ReadArchivist,\n hash: Hash,\n): Promise<HydratedTransaction> => {\n return assertEx(await tryHydrateElevatedTransaction(archivist, hash), () => 'Hydration failed')\n}\n","import type { HydratedTransaction } from '@xyo-network/xl1-protocol'\nimport { AttoXL1, TransactionGasCosts } from '@xyo-network/xl1-protocol'\n\nexport function transactionRequiredGas([transaction, payloads]: HydratedTransaction): AttoXL1 {\n const characters = payloads.reduce((acc: number, payload) => acc + JSON.stringify(payload).length, 0)\n const hashes = transaction.payload_hashes.length + 1 /* for transaction itself */\n const signatures = transaction.addresses.length + 1\n const elevatedPayloads = (transaction.script ?? []).length\n return AttoXL1(TransactionGasCosts.characterStorage * BigInt(characters)\n + TransactionGasCosts.hashValidation * BigInt(hashes)\n + TransactionGasCosts.signatureValidation * BigInt(signatures)\n + TransactionGasCosts.payloadValidation * BigInt(elevatedPayloads))\n}\n"],"mappings":"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","names":["assertEx","toHex","BoundWitnessBuilder","PayloadBuilder","defaultTransactionFees","buildTransaction","chain","elevatedPayloads","additionalPayloads","signer","nbf","exp","from","fees","defaultTransactionFees","undefined","Array","isArray","Error","txBoundWitnessFields","base","toHex","gasLimit","gasPrice","priority","elevatedHashes","PayloadBuilder","hashes","script","elevatedHash","push","tx","txPayloads","BoundWitnessBuilder","fields","assertEx","at","address","meta","$signatures","payloads","signers","build","addStorageMeta","assertEx","hydrateTypedBoundWitness","tryHydrateTypedBoundWitness","isAllowedBlockPayload","isTransactionBoundWitnessWithStorageMeta","tryHydrateTransaction","archivist","hash","tryHydrateTypedBoundWitness","isTransactionBoundWitnessWithStorageMeta","hydrateTransaction","hydrateTypedBoundWitness","flattenHydratedTransaction","hydratedTransaction","tx","txPayloads","flattenHydratedTransactions","hydratedTransactions","flatMap","tryHydrateElevatedTransaction","undefined","transaction","payloads","opCodes","script","filter","operation","startsWith","elevatedPayloads","opCode","code","split","elevatedPayload","find","payload","_hash","isAllowedBlockPayload","push","length","hydrateElevatedTransaction","assertEx","AttoXL1","TransactionGasCosts","transactionRequiredGas","transaction","payloads","characters","reduce","acc","payload","JSON","stringify","length","hashes","payload_hashes","signatures","addresses","elevatedPayloads","script","AttoXL1","TransactionGasCosts","characterStorage","BigInt","hashValidation","signatureValidation","payloadValidation"]}
1
+ {"version":3,"sources":["../../src/block/hydrateBlock.ts","../../src/block/primitives/frames/stepHashFramesFromBlock.ts","../../src/transaction/buildTransaction.ts","../../src/transaction/hydrateTransaction.ts","../../src/transaction/primitives/transactionBlockByteCount.ts","../../src/transaction/primitives/transactionElevatedPayloads.ts","../../src/transaction/primitives/transactionOperations.ts","../../src/transaction/primitives/transactionRequiredGas.ts"],"sourcesContent":["import { filterAs } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport type { Hash } from '@xylabs/hex'\nimport type { ReadArchivist } from '@xyo-network/archivist-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { HydratedBlock, TransactionBoundWitness } from '@xyo-network/xl1-protocol'\nimport {\n asOptionalBlockBoundWitnessWithStorageMeta, asOptionalTransactionBoundWitnessWithStorageMeta, isTransactionBoundWitnessWithStorageMeta,\n} from '@xyo-network/xl1-protocol'\n\nexport function allHashesPresent(hashes: Hash[], payloads: WithStorageMeta<Payload>[]): boolean {\n const payloadHashes = new Set(payloads.map(p => p._hash))\n return hashes.every(hash => payloadHashes.has(hash))\n}\n\nexport const tryHydrateBlock = async (\n archivist: ReadArchivist,\n hash: Hash,\n maxDepth: number = 1,\n minDepth?: number,\n): Promise<HydratedBlock | undefined> => {\n try {\n return await hydrateBlock(archivist, hash, maxDepth, minDepth)\n } catch (e) {\n if (e instanceof Error) {\n console.warn(`Failed to hydrate block ${hash}: ${e.message}`)\n } else {\n console.warn(`Failed to hydrate block ${hash}: ${e}`)\n }\n return undefined\n }\n}\n\nexport const hydrateBlock = async (\n archivist: ReadArchivist,\n hash: Hash,\n maxDepth: number = 1,\n minDepth?: number,\n): Promise<HydratedBlock> => {\n if (minDepth === undefined) minDepth = maxDepth\n assertEx(maxDepth >= 0, () => 'maxDepth must be greater than or equal to 0')\n assertEx(minDepth >= 0, () => 'minDepth must be greater than or equal to 0')\n assertEx(maxDepth >= minDepth, () => 'maxDepth must be greater than or equal to minDepth')\n const bw = assertEx(\n filterAs(await archivist.get([hash]), asOptionalBlockBoundWitnessWithStorageMeta).at(0),\n () => `block ${hash} not found`,\n )\n if (maxDepth === 0) return [bw, []]\n const blkPayloads = await archivist.get(bw.payload_hashes)\n if (minDepth === 1) assertEx(allHashesPresent(bw.payload_hashes, blkPayloads), () => `Unable to find all payloads for block ${hash}`)\n if (maxDepth === 1) return [bw, blkPayloads]\n const transactions = filterAs(blkPayloads, asOptionalTransactionBoundWitnessWithStorageMeta)\n const transactionsPayloadHashes = transactions.flatMap(tx => tx.payload_hashes)\n const transactionsPayloads = await archivist.get(transactionsPayloadHashes)\n assertEx(allHashesPresent(transactionsPayloadHashes, transactionsPayloads), () => `Unable to find all payloads for transactions in block ${hash}`)\n const allPayloadsHashes = new Set([...blkPayloads, ...transactionsPayloads].flatMap(p => p._hash))\n const allPayloads = await archivist.get([...allPayloadsHashes])\n const allPayloadsFiltered = allPayloads.filter(p => allPayloadsHashes.has(p._hash))\n if (maxDepth === 2) assertEx(allHashesPresent(\n [...allPayloadsHashes],\n allPayloadsFiltered,\n ), () => `Unable to find all payloads for transactions in block ${hash}`)\n return [bw, allPayloadsFiltered]\n}\n\nexport const flattenHydratedBlock = (hydratedBlock: HydratedBlock): WithStorageMeta<Payload>[] => {\n const [blk, blkPayloads] = hydratedBlock\n return [...blkPayloads, blk]\n}\n\nexport const flattenHydratedBlocks = (hydratedBlocks: HydratedBlock[]): WithStorageMeta<Payload>[] =>\n hydratedBlocks.flatMap(blk => flattenHydratedBlock(blk))\n\nexport const transactionsFromHydratedBlock = (block: HydratedBlock): WithStorageMeta<TransactionBoundWitness>[] => {\n return filterAs(block[1], asOptionalTransactionBoundWitnessWithStorageMeta)\n}\n\nexport const blockPayloadsFromHydratedBlock = (block: HydratedBlock): WithStorageMeta<Payload>[] => {\n return block[0].payload_hashes.map(hash => assertEx(\n block[1].find(p => p._hash === hash),\n () => `missing payload ${hash}`,\n )).filter(x => !isTransactionBoundWitnessWithStorageMeta(x))\n}\n","import { assertEx } from '@xylabs/assert'\nimport { type Hash, isHash } from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { isBlockBoundWitness, StepSizes } from '@xyo-network/xl1-protocol'\n\n// get the list of step frames for a block at a specific step size index\nexport async function stepHashFramesFromBlockAtSize(archivist: ArchivistInstance, head: Hash, sizeIndex: number) {\n if (!Number.isInteger(sizeIndex) || sizeIndex < 0 || sizeIndex >= StepSizes.length) {\n throw new Error(`Invalid sizeIndex: ${sizeIndex}`)\n }\n let currentHead = head\n const steps: [Hash, number, number][] = []\n while (isHash(currentHead)) {\n const [block] = await archivist.get([currentHead])\n if (!isBlockBoundWitness(block)) {\n throw new Error(`Block with hash ${currentHead} not found`)\n }\n let stepHash = block.step_hashes.at(sizeIndex)\n while (isDefined(stepHash)) {\n const [stepHashBlock] = await archivist.get([stepHash])\n if (!isBlockBoundWitness(stepHashBlock)) {\n throw new Error(`StepHashBlock with hash ${currentHead} not found`)\n }\n const [lastBlockInStep] = await archivist.get([assertEx(stepHashBlock.previous, () => 'StepHashBlock must have a previous block')])\n if (!isBlockBoundWitness(lastBlockInStep)) {\n throw new Error(`StepHashBlock with hash ${currentHead} not found`)\n }\n steps.push([stepHash, stepHashBlock.block - StepSizes[sizeIndex], stepHashBlock.block - 1])\n stepHash = lastBlockInStep.step_hashes.at(sizeIndex)\n }\n }\n return steps\n}\n\n// TODO: Figure out how to get ranges of smaller blocks for each available range\nexport async function stepHashFramesFromBlock(archivist: ArchivistInstance, head: Hash) {\n const [block] = await archivist.get([head])\n if (!isBlockBoundWitness(block)) {\n throw new Error(`Block with hash ${head} not found`)\n }\n let availableRanges: [number, number][] = [[0, block.block]]\n const foundRanges: [Hash, number, number][] = []\n // fit biggest to smallest\n for (let i = StepSizes.length - 1; i >= 0; i--) {\n const steps = await stepHashFramesFromBlockAtSize(archivist, head, i)\n for (let step of steps) {\n const [, start, end] = step\n if (availableRanges.some(range => range[0] <= start && range[1] >= end)) {\n foundRanges.push(step)\n availableRanges = availableRanges.flatMap((range) => {\n if (range[0] >= start && range[1] <= end) {\n // remove the range\n return [[range[0], start - 1]]\n } else if (range[0] < start && range[1] >= end) {\n // split the range\n return [[range[0], start - 1], [end + 1, range[1]]]\n } else if (range[0] < start && range[1] < end) {\n // adjust the end of the range\n return [[range[0], start - 1]]\n } else if (range[0] > start && range[1] > end) {\n // adjust the start of the range\n return [[end + 1, range[1]]]\n }\n // otherwise, return the range as is\n return [range]\n })\n }\n }\n }\n return foundRanges\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport { toHex } from '@xylabs/hex'\nimport type { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport {\n type AllowedBlockPayload,\n defaultTransactionFees,\n type HydratedTransactionWithStorageMeta, type TransactionBoundWitness, type TransactionBoundWitnessFields, type TransactionFeesBigInt,\n} from '@xyo-network/xl1-protocol'\n\nexport async function buildTransaction(\n chain: Address,\n elevatedPayloads: AllowedBlockPayload[],\n additionalPayloads: Payload[],\n signer: AccountInstance | AccountInstance[],\n nbf: number,\n exp: number,\n from?: Address,\n fees: TransactionFeesBigInt = defaultTransactionFees,\n): Promise<HydratedTransactionWithStorageMeta> {\n if (from === undefined && Array.isArray(signer)) {\n throw new Error('from is required when signer is an array')\n }\n\n const txBoundWitnessFields: TransactionBoundWitnessFields = {\n chain,\n fees: {\n base: toHex(fees.base),\n gasLimit: toHex(fees.gasLimit),\n gasPrice: toHex(fees.gasPrice),\n priority: toHex(fees.priority),\n },\n nbf,\n exp,\n }\n\n const elevatedHashes = await PayloadBuilder.hashes(elevatedPayloads)\n const script: string[] = []\n for (const elevatedHash of elevatedHashes) {\n script.push(`elevate|${elevatedHash}`)\n }\n\n const [tx, txPayloads] = await new BoundWitnessBuilder<TransactionBoundWitness>()\n .fields({\n ...txBoundWitnessFields,\n script,\n from: from ?? (Array.isArray(signer) ? assertEx(signer.at(0)?.address) : signer.address),\n })\n .meta({ $signatures: [] })\n .payloads([...elevatedPayloads, ...additionalPayloads])\n .signers(Array.isArray(signer) ? signer : [signer])\n .build()\n\n return [await PayloadBuilder.addStorageMeta(tx), await PayloadBuilder.addStorageMeta(txPayloads)]\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Hash } from '@xylabs/hex'\nimport type { ReadArchivist } from '@xyo-network/archivist-model'\nimport { hydrateTypedBoundWitness, tryHydrateTypedBoundWitness } from '@xyo-network/archivist-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type {\n AllowedBlockPayload,\n HydratedTransaction, HydratedTransactionWithStorageMeta, TransactionBoundWitness,\n} from '@xyo-network/xl1-protocol'\nimport { isAllowedBlockPayload, isTransactionBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol'\n\nexport const tryHydrateTransaction = async (\n archivist: ReadArchivist,\n hash: Hash,\n): Promise<HydratedTransactionWithStorageMeta | undefined> => {\n return (await tryHydrateTypedBoundWitness<TransactionBoundWitness>(\n archivist,\n hash,\n isTransactionBoundWitnessWithStorageMeta,\n )) as HydratedTransactionWithStorageMeta | undefined\n}\n\nexport const hydrateTransaction = async (\n archivist: ReadArchivist,\n hash: Hash,\n): Promise<HydratedTransactionWithStorageMeta> => {\n return await hydrateTypedBoundWitness<TransactionBoundWitness>(\n archivist,\n hash,\n isTransactionBoundWitnessWithStorageMeta,\n ) as HydratedTransactionWithStorageMeta\n}\n\nexport const flattenHydratedTransaction = (hydratedTransaction: HydratedTransaction): Payload[] => {\n const [tx, txPayloads] = hydratedTransaction\n return [...txPayloads, tx]\n}\n\nexport const flattenHydratedTransactions = (hydratedTransactions: HydratedTransaction[]): Payload[] =>\n hydratedTransactions.flatMap(tx => flattenHydratedTransaction(tx))\n\nexport const tryHydrateElevatedTransaction = async (\n archivist: ReadArchivist,\n hash: Hash,\n): Promise<HydratedTransaction | undefined> => {\n const hydratedTransaction = await tryHydrateTransaction(archivist, hash)\n if (!hydratedTransaction) {\n return undefined\n }\n const [transaction, payloads] = hydratedTransaction\n const opCodes = (transaction.script ?? []).filter(operation => operation.startsWith('elevate|'))\n const elevatedPayloads: AllowedBlockPayload[] = []\n for (const opCode of opCodes) {\n const [code, hash] = opCode.split('|')\n if (code === 'elevated') {\n const elevatedPayload = payloads.find(payload => payload._hash === hash)\n if (isAllowedBlockPayload(elevatedPayload)) {\n elevatedPayloads.push(elevatedPayload)\n }\n }\n }\n if (opCodes.length === elevatedPayloads.length) {\n return [transaction, elevatedPayloads]\n }\n return undefined\n}\n\nexport const hydrateElevatedTransaction = async (\n archivist: ReadArchivist,\n hash: Hash,\n): Promise<HydratedTransaction> => {\n return assertEx(await tryHydrateElevatedTransaction(archivist, hash), () => 'Hydration failed')\n}\n","import { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { HydratedTransaction } from '@xyo-network/xl1-protocol'\n\n/** The number of bytes that a transaction and its payloads will take up in a block */\nexport function transactionBlockByteCount([transaction, payloads]: HydratedTransaction): number {\n const cleanTransaction = PayloadBuilder.omitStorageMeta(transaction)\n const transactionBytes = JSON.stringify(cleanTransaction).length\n const cleanPayloads = PayloadBuilder.omitStorageMeta(payloads)\n return cleanPayloads.reduce((acc: number, payload) => acc + JSON.stringify(payload).length, 0) + transactionBytes\n}\n","import { asHash, type Hash } from '@xylabs/hex'\nimport type { Payload, WithHashStorageMeta } from '@xyo-network/payload-model'\nimport type { HydratedTransactionWithHashStorageMeta, TransactionBoundWitness } from '@xyo-network/xl1-protocol'\n\nimport { crackOperations } from './transactionOperations.ts'\n\nexport function transactionElevatedPayloadHashes(transaction: TransactionBoundWitness): Hash[] {\n const elevateOperations = crackOperations(transaction.script ?? []).filter(op => op[0] === 'elevate')\n return elevateOperations.map(op => asHash(op[1][0], true))\n}\n\nexport function transactionElevatedPayloads([transaction, payloads]: HydratedTransactionWithHashStorageMeta): WithHashStorageMeta<Payload>[] {\n const hashes = transactionElevatedPayloadHashes(transaction)\n const elevatedPayloads = payloads.filter(payload => hashes.includes(payload._hash))\n return elevatedPayloads\n}\n","export function crackOperation(operation: string): [string, string[]] {\n const parts = operation.split('|')\n if (parts.length < 2) {\n throw new Error(`Invalid operation format: ${operation}`)\n }\n return [parts[0], parts.slice(1)]\n}\n\nexport function crackOperations(operations: string[]): [string, string[]][] {\n return operations.map(op => crackOperation(op))\n}\n","import type { HydratedTransaction, HydratedTransactionWithHashStorageMeta } from '@xyo-network/xl1-protocol'\nimport { AttoXL1, TransactionGasCosts } from '@xyo-network/xl1-protocol'\n\nimport { transactionBlockByteCount } from './transactionBlockByteCount.ts'\nimport { transactionElevatedPayloads } from './transactionElevatedPayloads.ts'\n\n/** The required gas for the byte storage on the block chain for a transaction */\nexport function transactionBytesRequiredGas([transaction, payloads]: HydratedTransaction): AttoXL1 {\n const transactionBlockBytes = transactionBlockByteCount([transaction, payloads])\n return AttoXL1(TransactionGasCosts.characterStorage * BigInt(transactionBlockBytes))\n}\n\nexport function transactionRequiredGas(hydratedTransaction: HydratedTransactionWithHashStorageMeta): AttoXL1 {\n const elevatedPayloads = transactionElevatedPayloads(hydratedTransaction)\n const hashes = elevatedPayloads.length + 1 /* for transaction itself */\n const signatures = hydratedTransaction[0].addresses.length\n return AttoXL1(transactionBytesRequiredGas(hydratedTransaction)\n + TransactionGasCosts.hashValidation * BigInt(hashes)\n + TransactionGasCosts.signatureValidation * BigInt(signatures)\n + TransactionGasCosts.payloadValidation * BigInt(elevatedPayloads.length))\n}\n"],"mappings":"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","names":["filterAs","assertEx","asOptionalBlockBoundWitnessWithStorageMeta","asOptionalTransactionBoundWitnessWithStorageMeta","isTransactionBoundWitnessWithStorageMeta","allHashesPresent","hashes","payloads","payloadHashes","Set","map","p","_hash","every","hash","has","tryHydrateBlock","archivist","maxDepth","minDepth","hydrateBlock","e","Error","console","warn","message","undefined","assertEx","bw","filterAs","get","asOptionalBlockBoundWitnessWithStorageMeta","at","blkPayloads","payload_hashes","transactions","asOptionalTransactionBoundWitnessWithStorageMeta","transactionsPayloadHashes","flatMap","tx","transactionsPayloads","allPayloadsHashes","allPayloads","allPayloadsFiltered","filter","flattenHydratedBlock","hydratedBlock","blk","flattenHydratedBlocks","hydratedBlocks","transactionsFromHydratedBlock","block","blockPayloadsFromHydratedBlock","find","x","isTransactionBoundWitnessWithStorageMeta","assertEx","isHash","isDefined","isBlockBoundWitness","StepSizes","stepHashFramesFromBlockAtSize","archivist","head","sizeIndex","Number","isInteger","StepSizes","length","Error","currentHead","steps","isHash","block","get","isBlockBoundWitness","stepHash","step_hashes","at","isDefined","stepHashBlock","lastBlockInStep","assertEx","previous","push","stepHashFramesFromBlock","availableRanges","foundRanges","i","step","start","end","some","range","flatMap","assertEx","toHex","BoundWitnessBuilder","PayloadBuilder","defaultTransactionFees","buildTransaction","chain","elevatedPayloads","additionalPayloads","signer","nbf","exp","from","fees","defaultTransactionFees","undefined","Array","isArray","Error","txBoundWitnessFields","base","toHex","gasLimit","gasPrice","priority","elevatedHashes","PayloadBuilder","hashes","script","elevatedHash","push","tx","txPayloads","BoundWitnessBuilder","fields","assertEx","at","address","meta","$signatures","payloads","signers","build","addStorageMeta","assertEx","hydrateTypedBoundWitness","tryHydrateTypedBoundWitness","isAllowedBlockPayload","isTransactionBoundWitnessWithStorageMeta","tryHydrateTransaction","archivist","hash","tryHydrateTypedBoundWitness","isTransactionBoundWitnessWithStorageMeta","hydrateTransaction","hydrateTypedBoundWitness","flattenHydratedTransaction","hydratedTransaction","tx","txPayloads","flattenHydratedTransactions","hydratedTransactions","flatMap","tryHydrateElevatedTransaction","undefined","transaction","payloads","opCodes","script","filter","operation","startsWith","elevatedPayloads","opCode","code","split","elevatedPayload","find","payload","_hash","isAllowedBlockPayload","push","length","hydrateElevatedTransaction","assertEx","PayloadBuilder","transactionBlockByteCount","transaction","payloads","cleanTransaction","PayloadBuilder","omitStorageMeta","transactionBytes","JSON","stringify","length","cleanPayloads","reduce","acc","payload","asHash","crackOperation","operation","parts","split","length","Error","slice","crackOperations","operations","map","op","transactionElevatedPayloadHashes","transaction","elevateOperations","crackOperations","script","filter","op","map","asHash","transactionElevatedPayloads","payloads","hashes","elevatedPayloads","payload","includes","_hash","AttoXL1","TransactionGasCosts","transactionBytesRequiredGas","transaction","payloads","transactionBlockBytes","transactionBlockByteCount","AttoXL1","TransactionGasCosts","characterStorage","BigInt","transactionRequiredGas","hydratedTransaction","elevatedPayloads","transactionElevatedPayloads","hashes","length","signatures","addresses","hashValidation","signatureValidation","payloadValidation"]}
@@ -0,0 +1,12 @@
1
+ import type { Hash } from '@xylabs/hex';
2
+ import type { ReadArchivist } from '@xyo-network/archivist-model';
3
+ import type { Payload, WithStorageMeta } from '@xyo-network/payload-model';
4
+ import type { HydratedBlock, TransactionBoundWitness } from '@xyo-network/xl1-protocol';
5
+ export declare function allHashesPresent(hashes: Hash[], payloads: WithStorageMeta<Payload>[]): boolean;
6
+ export declare const tryHydrateBlock: (archivist: ReadArchivist, hash: Hash, maxDepth?: number, minDepth?: number) => Promise<HydratedBlock | undefined>;
7
+ export declare const hydrateBlock: (archivist: ReadArchivist, hash: Hash, maxDepth?: number, minDepth?: number) => Promise<HydratedBlock>;
8
+ export declare const flattenHydratedBlock: (hydratedBlock: HydratedBlock) => WithStorageMeta<Payload>[];
9
+ export declare const flattenHydratedBlocks: (hydratedBlocks: HydratedBlock[]) => WithStorageMeta<Payload>[];
10
+ export declare const transactionsFromHydratedBlock: (block: HydratedBlock) => WithStorageMeta<TransactionBoundWitness>[];
11
+ export declare const blockPayloadsFromHydratedBlock: (block: HydratedBlock) => WithStorageMeta<Payload>[];
12
+ //# sourceMappingURL=hydrateBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydrateBlock.d.ts","sourceRoot":"","sources":["../../../src/block/hydrateBlock.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAKvF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAG9F;AAED,eAAO,MAAM,eAAe,GAC1B,WAAW,aAAa,EACxB,MAAM,IAAI,EACV,WAAU,MAAU,EACpB,WAAW,MAAM,KAChB,OAAO,CAAC,aAAa,GAAG,SAAS,CAWnC,CAAA;AAED,eAAO,MAAM,YAAY,GACvB,WAAW,aAAa,EACxB,MAAM,IAAI,EACV,WAAU,MAAU,EACpB,WAAW,MAAM,KAChB,OAAO,CAAC,aAAa,CAyBvB,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,eAAe,aAAa,KAAG,eAAe,CAAC,OAAO,CAAC,EAG3F,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,gBAAgB,aAAa,EAAE,KAAG,eAAe,CAAC,OAAO,CAAC,EACtC,CAAA;AAE1D,eAAO,MAAM,6BAA6B,GAAI,OAAO,aAAa,KAAG,eAAe,CAAC,uBAAuB,CAAC,EAE5G,CAAA;AAED,eAAO,MAAM,8BAA8B,GAAI,OAAO,aAAa,KAAG,eAAe,CAAC,OAAO,CAAC,EAK7F,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './hydrateBlock.ts';
2
+ export * from './primitives/index.ts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/block/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export type BlockNumberRange = [number, number];
2
+ //# sourceMappingURL=BlockNumberRange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockNumberRange.d.ts","sourceRoot":"","sources":["../../../../../src/block/primitives/frames/BlockNumberRange.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { BlockNumberRange } from './BlockNumberRange.ts';
2
+ export declare function calculateFramesFromRange(range: BlockNumberRange, step: number): [
3
+ BlockNumberRange[],
4
+ BlockNumberRange[]
5
+ ];
6
+ //# sourceMappingURL=calculateFramesFromRange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculateFramesFromRange.d.ts","sourceRoot":"","sources":["../../../../../src/block/primitives/frames/calculateFramesFromRange.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG;IAE/E,gBAAgB,EAAE;IAElB,gBAAgB,EAAE;CAAC,CAoBpB"}
@@ -0,0 +1,3 @@
1
+ import type { BlockNumberRange } from './BlockNumberRange.ts';
2
+ export declare function deepCalculateFramesFromRange(range: BlockNumberRange, startingStep?: number): BlockNumberRange[];
3
+ //# sourceMappingURL=deepCalculateFramesFromRange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepCalculateFramesFromRange.d.ts","sourceRoot":"","sources":["../../../../../src/block/primitives/frames/deepCalculateFramesFromRange.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAG7D,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,gBAAgB,EAAE,YAAY,SAAyB,GAAG,gBAAgB,EAAE,CAqB/H"}
@@ -0,0 +1,3 @@
1
+ export * from './BlockNumberRange.ts';
2
+ export * from './stepHashFramesFromBlock.ts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/block/primitives/frames/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,8BAA8B,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { ArchivistInstance } from '@xyo-network/archivist-model';
2
+ import type { Payload } from '@xyo-network/payload-model';
3
+ import type { BlockNumberRange } from './BlockNumberRange.ts';
4
+ export declare function loadFrameSummaries(ranges: BlockNumberRange[], finalizedArchivist: ArchivistInstance, summaryArchivist: ArchivistInstance): Promise<Payload[]>;
5
+ //# sourceMappingURL=loadFrameSummaries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadFrameSummaries.d.ts","sourceRoot":"","sources":["../../../../../src/block/primitives/frames/loadFrameSummaries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,gBAAgB,EAAE,EAC1B,kBAAkB,EAAE,iBAAiB,EACrC,gBAAgB,EAAE,iBAAiB,GAClC,OAAO,CAAC,OAAO,EAAE,CAAC,CAEpB"}
@@ -0,0 +1,5 @@
1
+ import { type Hash } from '@xylabs/hex';
2
+ import type { ArchivistInstance } from '@xyo-network/archivist-model';
3
+ export declare function stepHashFramesFromBlockAtSize(archivist: ArchivistInstance, head: Hash, sizeIndex: number): Promise<[Lowercase<string>, number, number][]>;
4
+ export declare function stepHashFramesFromBlock(archivist: ArchivistInstance, head: Hash): Promise<[Lowercase<string>, number, number][]>;
5
+ //# sourceMappingURL=stepHashFramesFromBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepHashFramesFromBlock.d.ts","sourceRoot":"","sources":["../../../../../src/block/primitives/frames/stepHashFramesFromBlock.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAU,MAAM,aAAa,CAAA;AAE/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAIrE,wBAAsB,6BAA6B,CAAC,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kDA0B9G;AAGD,wBAAsB,uBAAuB,CAAC,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,kDAmCrF"}
@@ -0,0 +1,2 @@
1
+ export * from './frames/index.ts';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/block/primitives/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
@@ -1,3 +1,4 @@
1
+ export * from './block/index.ts';
1
2
  export * from './instances/index.ts';
2
3
  export * from './transaction/index.ts';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA"}
@@ -1,6 +1,4 @@
1
1
  export interface BlockFieldsInstance<TTransactionResult> {
2
- privatePayloadCount: number;
3
- publicPayloadCount: number;
4
2
  reward: bigint;
5
3
  transactionCount: number;
6
4
  transactions: TTransactionResult[];
@@ -1 +1 @@
1
- {"version":3,"file":"BlockFields.d.ts","sourceRoot":"","sources":["../../../../src/instances/block/BlockFields.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB,CAAC,kBAAkB;IACrD,mBAAmB,EAAE,MAAM,CAAA;IAE3B,kBAAkB,EAAE,MAAM,CAAA;IAE1B,MAAM,EAAE,MAAM,CAAA;IAEd,gBAAgB,EAAE,MAAM,CAAA;IAExB,YAAY,EAAE,kBAAkB,EAAE,CAAA;IAElC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAA;CAC3D"}
1
+ {"version":3,"file":"BlockFields.d.ts","sourceRoot":"","sources":["../../../../src/instances/block/BlockFields.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB,CAAC,kBAAkB;IACrD,MAAM,EAAE,MAAM,CAAA;IAEd,gBAAgB,EAAE,MAAM,CAAA;IAExB,YAAY,EAAE,kBAAkB,EAAE,CAAA;IAElC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAA;CAC3D"}
@@ -3,6 +3,5 @@ import type { HydratedBoundWitnessInstance } from '../HydratedBoundWitness.ts';
3
3
  import type { HydratedTransactionInstance } from '../transaction/index.ts';
4
4
  import type { BlockFieldsInstance } from './BlockFields.ts';
5
5
  export interface HydratedBlockInstance<T extends HydratedBlock = HydratedBlock> extends BlockFieldsInstance<HydratedTransactionInstance>, HydratedBoundWitnessInstance<T> {
6
- publicPayloads: T[1][number][];
7
6
  }
8
7
  //# sourceMappingURL=HydratedBlock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"HydratedBlock.d.ts","sourceRoot":"","sources":["../../../../src/instances/block/HydratedBlock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAA;AAC9E,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAE3D,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,CAAE,SAC9E,mBAAmB,CAAC,2BAA2B,CAAC,EAAE,4BAA4B,CAAC,CAAC,CAAC;IACjF,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAA;CAC/B"}
1
+ {"version":3,"file":"HydratedBlock.d.ts","sourceRoot":"","sources":["../../../../src/instances/block/HydratedBlock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAA;AAC9E,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAE3D,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,CAAE,SAC9E,mBAAmB,CAAC,2BAA2B,CAAC,EAAE,4BAA4B,CAAC,CAAC,CAAC;CAAG"}
@@ -1,9 +1,14 @@
1
+ import type { Hash } from '@xylabs/hex';
2
+ import type { Payload, Schema } from '@xyo-network/payload-model';
1
3
  import type { AllowedBlockPayload } from '@xyo-network/xl1-protocol';
2
4
  import type { TransactionFeesInstance } from '../Fees.ts';
3
5
  export interface TransactionFieldsInstance<TBlockPayload extends AllowedBlockPayload = AllowedBlockPayload> {
4
6
  elevatedPayloadCount: number;
5
7
  elevatedPayloads: TBlockPayload[];
8
+ externalPayloads: Record<Hash, Schema | Payload>;
6
9
  fees: TransactionFeesInstance;
10
+ privateExternalPayloads: Record<Hash, Schema>;
11
+ publicExternalPayloads: Payload[];
7
12
  elevatedPayload(index: number): TBlockPayload | undefined;
8
13
  reward(): bigint;
9
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionFields.d.ts","sourceRoot":"","sources":["../../../../src/instances/transaction/TransactionFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAEpE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAEzD,MAAM,WAAW,yBAAyB,CAAC,aAAa,SAAS,mBAAmB,GAAG,mBAAmB;IACxG,oBAAoB,EAAE,MAAM,CAAA;IAC5B,gBAAgB,EAAE,aAAa,EAAE,CAAA;IAEjC,IAAI,EAAE,uBAAuB,CAAA;IAE7B,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAA;IACzD,MAAM,IAAI,MAAM,CAAA;CACjB"}
1
+ {"version":3,"file":"TransactionFields.d.ts","sourceRoot":"","sources":["../../../../src/instances/transaction/TransactionFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAEpE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAEzD,MAAM,WAAW,yBAAyB,CAAC,aAAa,SAAS,mBAAmB,GAAG,mBAAmB;IACxG,oBAAoB,EAAE,MAAM,CAAA;IAC5B,gBAAgB,EAAE,aAAa,EAAE,CAAA;IACjC,gBAAgB,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAA;IAEhD,IAAI,EAAE,uBAAuB,CAAA;IAE7B,uBAAuB,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC7C,sBAAsB,EAAE,OAAO,EAAE,CAAA;IAEjC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAA;IACzD,MAAM,IAAI,MAAM,CAAA;CACjB"}
@@ -1,4 +1,4 @@
1
1
  export * from './buildTransaction.ts';
2
2
  export * from './hydrateTransaction.ts';
3
- export * from './transactionRequiredGas.ts';
3
+ export * from './primitives/index.ts';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transaction/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transaction/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA"}
@@ -0,0 +1,5 @@
1
+ export * from './transactionBlockByteCount.ts';
2
+ export * from './transactionElevatedPayloads.ts';
3
+ export * from './transactionOperations.ts';
4
+ export * from './transactionRequiredGas.ts';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/transaction/primitives/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAA;AAC9C,cAAc,kCAAkC,CAAA;AAChD,cAAc,4BAA4B,CAAA;AAC1C,cAAc,6BAA6B,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { HydratedTransaction } from '@xyo-network/xl1-protocol';
2
+ /** The number of bytes that a transaction and its payloads will take up in a block */
3
+ export declare function transactionBlockByteCount([transaction, payloads]: HydratedTransaction): number;
4
+ //# sourceMappingURL=transactionBlockByteCount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBlockByteCount.d.ts","sourceRoot":"","sources":["../../../../src/transaction/primitives/transactionBlockByteCount.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAEpE,sFAAsF;AACtF,wBAAgB,yBAAyB,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAK9F"}
@@ -0,0 +1,6 @@
1
+ import { type Hash } from '@xylabs/hex';
2
+ import type { Payload, WithHashStorageMeta } from '@xyo-network/payload-model';
3
+ import type { HydratedTransactionWithHashStorageMeta, TransactionBoundWitness } from '@xyo-network/xl1-protocol';
4
+ export declare function transactionElevatedPayloadHashes(transaction: TransactionBoundWitness): Hash[];
5
+ export declare function transactionElevatedPayloads([transaction, payloads]: HydratedTransactionWithHashStorageMeta): WithHashStorageMeta<Payload>[];
6
+ //# sourceMappingURL=transactionElevatedPayloads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionElevatedPayloads.d.ts","sourceRoot":"","sources":["../../../../src/transaction/primitives/transactionElevatedPayloads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,IAAI,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAC9E,OAAO,KAAK,EAAE,sCAAsC,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAIhH,wBAAgB,gCAAgC,CAAC,WAAW,EAAE,uBAAuB,GAAG,IAAI,EAAE,CAG7F;AAED,wBAAgB,2BAA2B,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,sCAAsC,GAAG,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAI3I"}
@@ -0,0 +1,3 @@
1
+ export declare function crackOperation(operation: string): [string, string[]];
2
+ export declare function crackOperations(operations: string[]): [string, string[]][];
3
+ //# sourceMappingURL=transactionOperations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionOperations.d.ts","sourceRoot":"","sources":["../../../../src/transaction/primitives/transactionOperations.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAMpE;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAE1E"}
@@ -0,0 +1,6 @@
1
+ import type { HydratedTransaction, HydratedTransactionWithHashStorageMeta } from '@xyo-network/xl1-protocol';
2
+ import { AttoXL1 } from '@xyo-network/xl1-protocol';
3
+ /** The required gas for the byte storage on the block chain for a transaction */
4
+ export declare function transactionBytesRequiredGas([transaction, payloads]: HydratedTransaction): AttoXL1;
5
+ export declare function transactionRequiredGas(hydratedTransaction: HydratedTransactionWithHashStorageMeta): AttoXL1;
6
+ //# sourceMappingURL=transactionRequiredGas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionRequiredGas.d.ts","sourceRoot":"","sources":["../../../../src/transaction/primitives/transactionRequiredGas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,sCAAsC,EAAE,MAAM,2BAA2B,CAAA;AAC5G,OAAO,EAAE,OAAO,EAAuB,MAAM,2BAA2B,CAAA;AAKxE,iFAAiF;AACjF,wBAAgB,2BAA2B,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAGjG;AAED,wBAAgB,sBAAsB,CAAC,mBAAmB,EAAE,sCAAsC,GAAG,OAAO,CAQ3G"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json.schemastore.org/package.json",
3
3
  "name": "@xyo-network/xl1-protocol-sdk",
4
- "version": "1.5.28",
4
+ "version": "1.5.30",
5
5
  "description": "XYO Layer One SDK Protocol",
6
6
  "homepage": "https://xylabs.com",
7
7
  "bugs": {
@@ -34,24 +34,27 @@
34
34
  "deploy3": "echo Deploy3 not allowed!"
35
35
  },
36
36
  "dependencies": {
37
- "@xylabs/assert": "^4.11.16",
38
- "@xylabs/hex": "^4.11.16",
39
- "@xylabs/object": "^4.11.16",
40
- "@xylabs/promise": "^4.11.16",
41
- "@xyo-network/account-model": "^3.18.5",
42
- "@xyo-network/archivist-model": "^3.18.5",
43
- "@xyo-network/boundwitness-builder": "^3.18.5",
44
- "@xyo-network/boundwitness-model": "^3.18.5",
45
- "@xyo-network/payload-builder": "^3.18.5",
46
- "@xyo-network/payload-model": "^3.18.5",
47
- "@xyo-network/xl1-protocol": "^1.4.19"
37
+ "@xylabs/array": "^4.11.20",
38
+ "@xylabs/assert": "^4.11.20",
39
+ "@xylabs/hex": "^4.11.20",
40
+ "@xylabs/object": "^4.11.20",
41
+ "@xylabs/promise": "^4.11.20",
42
+ "@xylabs/typeof": "^4.11.20",
43
+ "@xyo-network/account-model": "^3.18.8",
44
+ "@xyo-network/archivist-model": "^3.18.8",
45
+ "@xyo-network/boundwitness-builder": "^3.18.8",
46
+ "@xyo-network/boundwitness-model": "^3.18.8",
47
+ "@xyo-network/payload-builder": "^3.18.8",
48
+ "@xyo-network/payload-model": "^3.18.8",
49
+ "@xyo-network/xl1-protocol": "^1.4.25"
48
50
  },
49
51
  "devDependencies": {
50
- "@types/node": "^22.15.30",
52
+ "@types/node": "^24.0.1",
51
53
  "@xylabs/ts-scripts-yarn3": "^6.5.8",
52
54
  "@xylabs/tsconfig": "^6.5.8",
53
- "knip": "^5.60.2",
54
- "typescript": "^5.8.3"
55
+ "knip": "^5.61.0",
56
+ "typescript": "^5.8.3",
57
+ "vitest": "^3.2.3"
55
58
  },
56
59
  "engines": {
57
60
  "node": ">=22.3 <23"
@@ -0,0 +1,83 @@
1
+ import { filterAs } from '@xylabs/array'
2
+ import { assertEx } from '@xylabs/assert'
3
+ import type { Hash } from '@xylabs/hex'
4
+ import type { ReadArchivist } from '@xyo-network/archivist-model'
5
+ import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
6
+ import type { HydratedBlock, TransactionBoundWitness } from '@xyo-network/xl1-protocol'
7
+ import {
8
+ asOptionalBlockBoundWitnessWithStorageMeta, asOptionalTransactionBoundWitnessWithStorageMeta, isTransactionBoundWitnessWithStorageMeta,
9
+ } from '@xyo-network/xl1-protocol'
10
+
11
+ export function allHashesPresent(hashes: Hash[], payloads: WithStorageMeta<Payload>[]): boolean {
12
+ const payloadHashes = new Set(payloads.map(p => p._hash))
13
+ return hashes.every(hash => payloadHashes.has(hash))
14
+ }
15
+
16
+ export const tryHydrateBlock = async (
17
+ archivist: ReadArchivist,
18
+ hash: Hash,
19
+ maxDepth: number = 1,
20
+ minDepth?: number,
21
+ ): Promise<HydratedBlock | undefined> => {
22
+ try {
23
+ return await hydrateBlock(archivist, hash, maxDepth, minDepth)
24
+ } catch (e) {
25
+ if (e instanceof Error) {
26
+ console.warn(`Failed to hydrate block ${hash}: ${e.message}`)
27
+ } else {
28
+ console.warn(`Failed to hydrate block ${hash}: ${e}`)
29
+ }
30
+ return undefined
31
+ }
32
+ }
33
+
34
+ export const hydrateBlock = async (
35
+ archivist: ReadArchivist,
36
+ hash: Hash,
37
+ maxDepth: number = 1,
38
+ minDepth?: number,
39
+ ): Promise<HydratedBlock> => {
40
+ if (minDepth === undefined) minDepth = maxDepth
41
+ assertEx(maxDepth >= 0, () => 'maxDepth must be greater than or equal to 0')
42
+ assertEx(minDepth >= 0, () => 'minDepth must be greater than or equal to 0')
43
+ assertEx(maxDepth >= minDepth, () => 'maxDepth must be greater than or equal to minDepth')
44
+ const bw = assertEx(
45
+ filterAs(await archivist.get([hash]), asOptionalBlockBoundWitnessWithStorageMeta).at(0),
46
+ () => `block ${hash} not found`,
47
+ )
48
+ if (maxDepth === 0) return [bw, []]
49
+ const blkPayloads = await archivist.get(bw.payload_hashes)
50
+ if (minDepth === 1) assertEx(allHashesPresent(bw.payload_hashes, blkPayloads), () => `Unable to find all payloads for block ${hash}`)
51
+ if (maxDepth === 1) return [bw, blkPayloads]
52
+ const transactions = filterAs(blkPayloads, asOptionalTransactionBoundWitnessWithStorageMeta)
53
+ const transactionsPayloadHashes = transactions.flatMap(tx => tx.payload_hashes)
54
+ const transactionsPayloads = await archivist.get(transactionsPayloadHashes)
55
+ assertEx(allHashesPresent(transactionsPayloadHashes, transactionsPayloads), () => `Unable to find all payloads for transactions in block ${hash}`)
56
+ const allPayloadsHashes = new Set([...blkPayloads, ...transactionsPayloads].flatMap(p => p._hash))
57
+ const allPayloads = await archivist.get([...allPayloadsHashes])
58
+ const allPayloadsFiltered = allPayloads.filter(p => allPayloadsHashes.has(p._hash))
59
+ if (maxDepth === 2) assertEx(allHashesPresent(
60
+ [...allPayloadsHashes],
61
+ allPayloadsFiltered,
62
+ ), () => `Unable to find all payloads for transactions in block ${hash}`)
63
+ return [bw, allPayloadsFiltered]
64
+ }
65
+
66
+ export const flattenHydratedBlock = (hydratedBlock: HydratedBlock): WithStorageMeta<Payload>[] => {
67
+ const [blk, blkPayloads] = hydratedBlock
68
+ return [...blkPayloads, blk]
69
+ }
70
+
71
+ export const flattenHydratedBlocks = (hydratedBlocks: HydratedBlock[]): WithStorageMeta<Payload>[] =>
72
+ hydratedBlocks.flatMap(blk => flattenHydratedBlock(blk))
73
+
74
+ export const transactionsFromHydratedBlock = (block: HydratedBlock): WithStorageMeta<TransactionBoundWitness>[] => {
75
+ return filterAs(block[1], asOptionalTransactionBoundWitnessWithStorageMeta)
76
+ }
77
+
78
+ export const blockPayloadsFromHydratedBlock = (block: HydratedBlock): WithStorageMeta<Payload>[] => {
79
+ return block[0].payload_hashes.map(hash => assertEx(
80
+ block[1].find(p => p._hash === hash),
81
+ () => `missing payload ${hash}`,
82
+ )).filter(x => !isTransactionBoundWitnessWithStorageMeta(x))
83
+ }
@@ -0,0 +1,2 @@
1
+ export * from './hydrateBlock.ts'
2
+ export * from './primitives/index.ts'
@@ -0,0 +1 @@
1
+ export type BlockNumberRange = [number, number]
@@ -0,0 +1,29 @@
1
+ import { stepSizeV2 } from '@xyo-network/xl1-protocol'
2
+
3
+ import type { BlockNumberRange } from './BlockNumberRange.ts'
4
+
5
+ export function calculateFramesFromRange(range: BlockNumberRange, step: number): [
6
+ // ranges of fitted frames
7
+ BlockNumberRange[],
8
+ // ranges of remaining blocks
9
+ BlockNumberRange[]] {
10
+ const size = stepSizeV2(step)
11
+ let start = (Math.trunc(range[0] / size)) * size
12
+ const fitted: BlockNumberRange[] = []
13
+ const remaining: BlockNumberRange[] = []
14
+
15
+ // if the start is not aligned with the range, add a remaining block
16
+ if (start !== range[0]) {
17
+ start += size
18
+ remaining.push([range[0], Math.min(start - 1, range[1])])
19
+ }
20
+
21
+ for (let i = start; i <= range[1]; i += size) {
22
+ if ((i + size - 1) <= range[1]) {
23
+ fitted.push([i, Math.min(i + size - 1, range[1])])
24
+ } else {
25
+ remaining.push([i, range[1]])
26
+ }
27
+ }
28
+ return [fitted, remaining]
29
+ }
@@ -0,0 +1,27 @@
1
+ import { StepSizesV2 } from '@xyo-network/xl1-protocol'
2
+
3
+ import type { BlockNumberRange } from './BlockNumberRange.ts'
4
+ import { calculateFramesFromRange } from './calculateFramesFromRange.ts'
5
+
6
+ export function deepCalculateFramesFromRange(range: BlockNumberRange, startingStep = StepSizesV2.length - 1): BlockNumberRange[] {
7
+ const fitted: BlockNumberRange[] = []
8
+ let remaining: BlockNumberRange[] = [range]
9
+
10
+ for (let step = startingStep; step >= 0; step--) {
11
+ const newRemaining: BlockNumberRange[] = []
12
+ for (const range of remaining) {
13
+ const [newFittedFrames, newRemainingFrames] = calculateFramesFromRange(range, step)
14
+ fitted.push(...newFittedFrames)
15
+ newRemaining.push(...newRemainingFrames)
16
+ }
17
+ remaining = newRemaining
18
+ }
19
+
20
+ for (const range of remaining) {
21
+ for (let i = range[0]; i <= range[1]; i++) {
22
+ fitted.push([i, i]) // Add individual frames for remaining ranges
23
+ }
24
+ }
25
+
26
+ return fitted.toSorted((a, b) => a[0] - b[0]) // Sort by start of range
27
+ }
@@ -0,0 +1,2 @@
1
+ export * from './BlockNumberRange.ts'
2
+ export * from './stepHashFramesFromBlock.ts'
@@ -0,0 +1,12 @@
1
+ import type { ArchivistInstance } from '@xyo-network/archivist-model'
2
+ import type { Payload } from '@xyo-network/payload-model'
3
+
4
+ import type { BlockNumberRange } from './BlockNumberRange.ts'
5
+
6
+ export async function loadFrameSummaries(
7
+ ranges: BlockNumberRange[],
8
+ finalizedArchivist: ArchivistInstance,
9
+ summaryArchivist: ArchivistInstance,
10
+ ): Promise<Payload[]> {
11
+ return await Promise.resolve([])
12
+ }
@@ -0,0 +1,72 @@
1
+ import { assertEx } from '@xylabs/assert'
2
+ import { type Hash, isHash } from '@xylabs/hex'
3
+ import { isDefined } from '@xylabs/typeof'
4
+ import type { ArchivistInstance } from '@xyo-network/archivist-model'
5
+ import { isBlockBoundWitness, StepSizes } from '@xyo-network/xl1-protocol'
6
+
7
+ // get the list of step frames for a block at a specific step size index
8
+ export async function stepHashFramesFromBlockAtSize(archivist: ArchivistInstance, head: Hash, sizeIndex: number) {
9
+ if (!Number.isInteger(sizeIndex) || sizeIndex < 0 || sizeIndex >= StepSizes.length) {
10
+ throw new Error(`Invalid sizeIndex: ${sizeIndex}`)
11
+ }
12
+ let currentHead = head
13
+ const steps: [Hash, number, number][] = []
14
+ while (isHash(currentHead)) {
15
+ const [block] = await archivist.get([currentHead])
16
+ if (!isBlockBoundWitness(block)) {
17
+ throw new Error(`Block with hash ${currentHead} not found`)
18
+ }
19
+ let stepHash = block.step_hashes.at(sizeIndex)
20
+ while (isDefined(stepHash)) {
21
+ const [stepHashBlock] = await archivist.get([stepHash])
22
+ if (!isBlockBoundWitness(stepHashBlock)) {
23
+ throw new Error(`StepHashBlock with hash ${currentHead} not found`)
24
+ }
25
+ const [lastBlockInStep] = await archivist.get([assertEx(stepHashBlock.previous, () => 'StepHashBlock must have a previous block')])
26
+ if (!isBlockBoundWitness(lastBlockInStep)) {
27
+ throw new Error(`StepHashBlock with hash ${currentHead} not found`)
28
+ }
29
+ steps.push([stepHash, stepHashBlock.block - StepSizes[sizeIndex], stepHashBlock.block - 1])
30
+ stepHash = lastBlockInStep.step_hashes.at(sizeIndex)
31
+ }
32
+ }
33
+ return steps
34
+ }
35
+
36
+ // TODO: Figure out how to get ranges of smaller blocks for each available range
37
+ export async function stepHashFramesFromBlock(archivist: ArchivistInstance, head: Hash) {
38
+ const [block] = await archivist.get([head])
39
+ if (!isBlockBoundWitness(block)) {
40
+ throw new Error(`Block with hash ${head} not found`)
41
+ }
42
+ let availableRanges: [number, number][] = [[0, block.block]]
43
+ const foundRanges: [Hash, number, number][] = []
44
+ // fit biggest to smallest
45
+ for (let i = StepSizes.length - 1; i >= 0; i--) {
46
+ const steps = await stepHashFramesFromBlockAtSize(archivist, head, i)
47
+ for (let step of steps) {
48
+ const [, start, end] = step
49
+ if (availableRanges.some(range => range[0] <= start && range[1] >= end)) {
50
+ foundRanges.push(step)
51
+ availableRanges = availableRanges.flatMap((range) => {
52
+ if (range[0] >= start && range[1] <= end) {
53
+ // remove the range
54
+ return [[range[0], start - 1]]
55
+ } else if (range[0] < start && range[1] >= end) {
56
+ // split the range
57
+ return [[range[0], start - 1], [end + 1, range[1]]]
58
+ } else if (range[0] < start && range[1] < end) {
59
+ // adjust the end of the range
60
+ return [[range[0], start - 1]]
61
+ } else if (range[0] > start && range[1] > end) {
62
+ // adjust the start of the range
63
+ return [[end + 1, range[1]]]
64
+ }
65
+ // otherwise, return the range as is
66
+ return [range]
67
+ })
68
+ }
69
+ }
70
+ }
71
+ return foundRanges
72
+ }
@@ -0,0 +1 @@
1
+ export * from './frames/index.ts'
package/src/index.ts CHANGED
@@ -1,2 +1,3 @@
1
+ export * from './block/index.ts'
1
2
  export * from './instances/index.ts'
2
3
  export * from './transaction/index.ts'
@@ -1,8 +1,4 @@
1
1
  export interface BlockFieldsInstance<TTransactionResult> {
2
- privatePayloadCount: number
3
-
4
- publicPayloadCount: number
5
-
6
2
  reward: bigint
7
3
 
8
4
  transactionCount: number
@@ -5,6 +5,4 @@ import type { HydratedTransactionInstance } from '../transaction/index.ts'
5
5
  import type { BlockFieldsInstance } from './BlockFields.ts'
6
6
 
7
7
  export interface HydratedBlockInstance<T extends HydratedBlock = HydratedBlock> extends
8
- BlockFieldsInstance<HydratedTransactionInstance>, HydratedBoundWitnessInstance<T> {
9
- publicPayloads: T[1][number][]
10
- }
8
+ BlockFieldsInstance<HydratedTransactionInstance>, HydratedBoundWitnessInstance<T> {}
@@ -1,3 +1,5 @@
1
+ import type { Hash } from '@xylabs/hex'
2
+ import type { Payload, Schema } from '@xyo-network/payload-model'
1
3
  import type { AllowedBlockPayload } from '@xyo-network/xl1-protocol'
2
4
 
3
5
  import type { TransactionFeesInstance } from '../Fees.ts'
@@ -5,9 +7,13 @@ import type { TransactionFeesInstance } from '../Fees.ts'
5
7
  export interface TransactionFieldsInstance<TBlockPayload extends AllowedBlockPayload = AllowedBlockPayload> {
6
8
  elevatedPayloadCount: number
7
9
  elevatedPayloads: TBlockPayload[]
10
+ externalPayloads: Record<Hash, Schema | Payload>
8
11
 
9
12
  fees: TransactionFeesInstance
10
13
 
14
+ privateExternalPayloads: Record<Hash, Schema>
15
+ publicExternalPayloads: Payload[]
16
+
11
17
  elevatedPayload(index: number): TBlockPayload | undefined
12
18
  reward(): bigint
13
19
  }
@@ -1,3 +1,3 @@
1
1
  export * from './buildTransaction.ts'
2
2
  export * from './hydrateTransaction.ts'
3
- export * from './transactionRequiredGas.ts'
3
+ export * from './primitives/index.ts'
@@ -0,0 +1,4 @@
1
+ export * from './transactionBlockByteCount.ts'
2
+ export * from './transactionElevatedPayloads.ts'
3
+ export * from './transactionOperations.ts'
4
+ export * from './transactionRequiredGas.ts'
@@ -0,0 +1,10 @@
1
+ import { PayloadBuilder } from '@xyo-network/payload-builder'
2
+ import type { HydratedTransaction } from '@xyo-network/xl1-protocol'
3
+
4
+ /** The number of bytes that a transaction and its payloads will take up in a block */
5
+ export function transactionBlockByteCount([transaction, payloads]: HydratedTransaction): number {
6
+ const cleanTransaction = PayloadBuilder.omitStorageMeta(transaction)
7
+ const transactionBytes = JSON.stringify(cleanTransaction).length
8
+ const cleanPayloads = PayloadBuilder.omitStorageMeta(payloads)
9
+ return cleanPayloads.reduce((acc: number, payload) => acc + JSON.stringify(payload).length, 0) + transactionBytes
10
+ }
@@ -0,0 +1,16 @@
1
+ import { asHash, type Hash } from '@xylabs/hex'
2
+ import type { Payload, WithHashStorageMeta } from '@xyo-network/payload-model'
3
+ import type { HydratedTransactionWithHashStorageMeta, TransactionBoundWitness } from '@xyo-network/xl1-protocol'
4
+
5
+ import { crackOperations } from './transactionOperations.ts'
6
+
7
+ export function transactionElevatedPayloadHashes(transaction: TransactionBoundWitness): Hash[] {
8
+ const elevateOperations = crackOperations(transaction.script ?? []).filter(op => op[0] === 'elevate')
9
+ return elevateOperations.map(op => asHash(op[1][0], true))
10
+ }
11
+
12
+ export function transactionElevatedPayloads([transaction, payloads]: HydratedTransactionWithHashStorageMeta): WithHashStorageMeta<Payload>[] {
13
+ const hashes = transactionElevatedPayloadHashes(transaction)
14
+ const elevatedPayloads = payloads.filter(payload => hashes.includes(payload._hash))
15
+ return elevatedPayloads
16
+ }
@@ -0,0 +1,11 @@
1
+ export function crackOperation(operation: string): [string, string[]] {
2
+ const parts = operation.split('|')
3
+ if (parts.length < 2) {
4
+ throw new Error(`Invalid operation format: ${operation}`)
5
+ }
6
+ return [parts[0], parts.slice(1)]
7
+ }
8
+
9
+ export function crackOperations(operations: string[]): [string, string[]][] {
10
+ return operations.map(op => crackOperation(op))
11
+ }
@@ -0,0 +1,21 @@
1
+ import type { HydratedTransaction, HydratedTransactionWithHashStorageMeta } from '@xyo-network/xl1-protocol'
2
+ import { AttoXL1, TransactionGasCosts } from '@xyo-network/xl1-protocol'
3
+
4
+ import { transactionBlockByteCount } from './transactionBlockByteCount.ts'
5
+ import { transactionElevatedPayloads } from './transactionElevatedPayloads.ts'
6
+
7
+ /** The required gas for the byte storage on the block chain for a transaction */
8
+ export function transactionBytesRequiredGas([transaction, payloads]: HydratedTransaction): AttoXL1 {
9
+ const transactionBlockBytes = transactionBlockByteCount([transaction, payloads])
10
+ return AttoXL1(TransactionGasCosts.characterStorage * BigInt(transactionBlockBytes))
11
+ }
12
+
13
+ export function transactionRequiredGas(hydratedTransaction: HydratedTransactionWithHashStorageMeta): AttoXL1 {
14
+ const elevatedPayloads = transactionElevatedPayloads(hydratedTransaction)
15
+ const hashes = elevatedPayloads.length + 1 /* for transaction itself */
16
+ const signatures = hydratedTransaction[0].addresses.length
17
+ return AttoXL1(transactionBytesRequiredGas(hydratedTransaction)
18
+ + TransactionGasCosts.hashValidation * BigInt(hashes)
19
+ + TransactionGasCosts.signatureValidation * BigInt(signatures)
20
+ + TransactionGasCosts.payloadValidation * BigInt(elevatedPayloads.length))
21
+ }
@@ -1,4 +0,0 @@
1
- import type { HydratedTransaction } from '@xyo-network/xl1-protocol';
2
- import { AttoXL1 } from '@xyo-network/xl1-protocol';
3
- export declare function transactionRequiredGas([transaction, payloads]: HydratedTransaction): AttoXL1;
4
- //# sourceMappingURL=transactionRequiredGas.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transactionRequiredGas.d.ts","sourceRoot":"","sources":["../../../src/transaction/transactionRequiredGas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,EAAE,OAAO,EAAuB,MAAM,2BAA2B,CAAA;AAExE,wBAAgB,sBAAsB,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAS5F"}
package/knip.config.ts DELETED
@@ -1,15 +0,0 @@
1
- import type { KnipConfig } from 'knip'
2
-
3
- const config: KnipConfig = {
4
- entry: [
5
- 'src/index.ts',
6
- ],
7
- project: ['src/**/*.ts*'],
8
- typescript: {
9
- config: [
10
- 'tsconfig.json',
11
- ],
12
- },
13
- }
14
-
15
- export default config
@@ -1,13 +0,0 @@
1
- import type { HydratedTransaction } from '@xyo-network/xl1-protocol'
2
- import { AttoXL1, TransactionGasCosts } from '@xyo-network/xl1-protocol'
3
-
4
- export function transactionRequiredGas([transaction, payloads]: HydratedTransaction): AttoXL1 {
5
- const characters = payloads.reduce((acc: number, payload) => acc + JSON.stringify(payload).length, 0)
6
- const hashes = transaction.payload_hashes.length + 1 /* for transaction itself */
7
- const signatures = transaction.addresses.length + 1
8
- const elevatedPayloads = (transaction.script ?? []).length
9
- return AttoXL1(TransactionGasCosts.characterStorage * BigInt(characters)
10
- + TransactionGasCosts.hashValidation * BigInt(hashes)
11
- + TransactionGasCosts.signatureValidation * BigInt(signatures)
12
- + TransactionGasCosts.payloadValidation * BigInt(elevatedPayloads))
13
- }