@shelby-protocol/sdk 0.3.0 → 0.4.0

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 (126) hide show
  1. package/dist/browser/index.d.ts +19 -10
  2. package/dist/browser/index.mjs +4200 -146
  3. package/dist/core/aptos-explorer.mjs +46 -5
  4. package/dist/core/blobs.mjs +12 -4
  5. package/dist/core/chunk.mjs +58 -9
  6. package/dist/core/clients/ShelbyBlobClient.d.ts +155 -83
  7. package/dist/core/clients/ShelbyBlobClient.mjs +1286 -17
  8. package/dist/core/clients/ShelbyClient.d.ts +39 -6
  9. package/dist/core/clients/ShelbyClient.mjs +3233 -23
  10. package/dist/core/clients/ShelbyClientConfig.d.ts +9 -1
  11. package/dist/core/clients/ShelbyClientConfig.mjs +0 -1
  12. package/dist/core/clients/ShelbyMetadataClient.d.ts +20 -6
  13. package/dist/core/clients/ShelbyMetadataClient.mjs +388 -6
  14. package/dist/core/clients/ShelbyMicropaymentChannelClient.d.ts +7 -7
  15. package/dist/core/clients/ShelbyMicropaymentChannelClient.mjs +894 -13
  16. package/dist/core/clients/ShelbyPlacementGroupClient.mjs +310 -8
  17. package/dist/core/clients/ShelbyRPCClient.d.ts +117 -25
  18. package/dist/core/clients/ShelbyRPCClient.mjs +1245 -12
  19. package/dist/core/clients/index.d.ts +4 -2
  20. package/dist/core/clients/index.mjs +3802 -39
  21. package/dist/core/clients/utils.mjs +65 -6
  22. package/dist/core/commitments.d.ts +12 -1
  23. package/dist/core/commitments.mjs +277 -11
  24. package/dist/core/constants.d.ts +3 -3
  25. package/dist/core/constants.mjs +39 -16
  26. package/dist/core/erasure/clay-codes.mjs +129 -4
  27. package/dist/core/erasure/constants.d.ts +16 -1
  28. package/dist/core/erasure/constants.mjs +48 -11
  29. package/dist/core/erasure/default.mjs +191 -9
  30. package/dist/core/erasure/index.d.ts +1 -1
  31. package/dist/core/erasure/index.mjs +281 -24
  32. package/dist/core/erasure/reed-solomon.mjs +68 -4
  33. package/dist/core/erasure/utils.mjs +0 -2
  34. package/dist/core/errors.d.ts +20 -1
  35. package/dist/core/errors.mjs +58 -8
  36. package/dist/core/index.d.ts +9 -9
  37. package/dist/core/index.mjs +4194 -146
  38. package/dist/core/layout.mjs +37 -5
  39. package/dist/core/networks.mjs +10 -5
  40. package/dist/core/operations/generated/sdk.d.ts +807 -42
  41. package/dist/core/operations/generated/sdk.mjs +267 -18
  42. package/dist/core/operations/index.d.ts +1 -1
  43. package/dist/core/operations/index.mjs +368 -24
  44. package/dist/core/promises.mjs +4 -4
  45. package/dist/core/rpc-responses.d.ts +1 -57
  46. package/dist/core/rpc-responses.mjs +14 -15
  47. package/dist/core/shelby-explorer.mjs +31 -6
  48. package/dist/core/sp/chunk_proof.d.ts +23 -0
  49. package/dist/core/sp/chunk_proof.mjs +113 -0
  50. package/dist/core/sp/index.d.ts +3 -0
  51. package/dist/core/sp/index.mjs +402 -0
  52. package/dist/core/sp/sp_write_client.d.ts +53 -0
  53. package/dist/core/sp/sp_write_client.mjs +302 -0
  54. package/dist/core/strings.mjs +0 -2
  55. package/dist/core/types/blobs.d.ts +24 -5
  56. package/dist/core/types/blobs.mjs +24 -1
  57. package/dist/core/types/index.d.ts +2 -2
  58. package/dist/core/types/index.mjs +275 -10
  59. package/dist/core/types/payments.d.ts +6 -6
  60. package/dist/core/types/payments.mjs +230 -5
  61. package/dist/core/types/placement_groups.mjs +0 -1
  62. package/dist/core/types/storage_providers.d.ts +32 -6
  63. package/dist/core/types/storage_providers.mjs +22 -1
  64. package/dist/core/utils.mjs +94 -8
  65. package/dist/gen/rpc_server_pb.d.ts +295 -0
  66. package/dist/gen/rpc_server_pb.mjs +28 -0
  67. package/dist/node/clients/ShelbyNodeClient.d.ts +2 -0
  68. package/dist/node/clients/ShelbyNodeClient.mjs +3237 -24
  69. package/dist/node/clients/index.d.ts +2 -0
  70. package/dist/node/clients/index.mjs +3236 -26
  71. package/dist/node/index.d.ts +9 -9
  72. package/dist/node/index.mjs +4217 -153
  73. package/dist/node/parallel/commitment_worker.d.ts +9 -0
  74. package/dist/node/parallel/commitment_worker.mjs +85 -0
  75. package/dist/node/parallel/commitment_worker_pool.d.ts +35 -0
  76. package/dist/node/parallel/commitment_worker_pool.mjs +339 -0
  77. package/dist/node/parallel/coverage_flush.d.ts +16 -0
  78. package/dist/node/parallel/coverage_flush.mjs +43 -0
  79. package/dist/node/parallel/default_commitment_worker_pool.d.ts +24 -0
  80. package/dist/node/parallel/default_commitment_worker_pool.mjs +355 -0
  81. package/dist/node/parallel/index.d.ts +12 -0
  82. package/dist/node/parallel/index.mjs +631 -0
  83. package/dist/node/parallel/parallel_commitments.d.ts +32 -0
  84. package/dist/node/parallel/parallel_commitments.mjs +614 -0
  85. package/dist/node/parallel/worker_pool.d.ts +74 -0
  86. package/dist/node/parallel/worker_pool.mjs +301 -0
  87. package/dist/node/testUtil.mjs +8 -4
  88. package/package.json +16 -5
  89. package/dist/chunk-3NRBHSMQ.mjs +0 -12
  90. package/dist/chunk-5BVSWXQJ.mjs +0 -801
  91. package/dist/chunk-6FJNAUU5.mjs +0 -278
  92. package/dist/chunk-6XSZRDLJ.mjs +0 -375
  93. package/dist/chunk-7P6ASYW6.mjs +0 -9
  94. package/dist/chunk-A4IG6GSE.mjs +0 -21
  95. package/dist/chunk-AD2G3QYD.mjs +0 -0
  96. package/dist/chunk-AUQDI5BS.mjs +0 -43
  97. package/dist/chunk-AY3HBWXA.mjs +0 -51
  98. package/dist/chunk-BDSW5PHM.mjs +0 -37
  99. package/dist/chunk-C6RQ3AEU.mjs +0 -51
  100. package/dist/chunk-CQ6QPIZK.mjs +0 -37
  101. package/dist/chunk-D6GQHO6G.mjs +0 -15
  102. package/dist/chunk-EM67QTMR.mjs +0 -0
  103. package/dist/chunk-I6NG5GNL.mjs +0 -8
  104. package/dist/chunk-JTXYKO3U.mjs +0 -38
  105. package/dist/chunk-KG2TMLEV.mjs +0 -207
  106. package/dist/chunk-M3CP5TFP.mjs +0 -39
  107. package/dist/chunk-M7W43K2Q.mjs +0 -505
  108. package/dist/chunk-MB7C7VQF.mjs +0 -0
  109. package/dist/chunk-MNCQBEMS.mjs +0 -55
  110. package/dist/chunk-MQUVYMNQ.mjs +0 -0
  111. package/dist/chunk-NEO7Z3ZQ.mjs +0 -49
  112. package/dist/chunk-NHWWORCH.mjs +0 -72
  113. package/dist/chunk-OEK24ON7.mjs +0 -135
  114. package/dist/chunk-QQ57OGQ2.mjs +0 -0
  115. package/dist/chunk-RNNJXTX2.mjs +0 -154
  116. package/dist/chunk-S6Q4OG7H.mjs +0 -83
  117. package/dist/chunk-TET3DJEO.mjs +0 -199
  118. package/dist/chunk-UEZNZBJO.mjs +0 -104
  119. package/dist/chunk-V46D5NBW.mjs +0 -11
  120. package/dist/chunk-V4B3GAMQ.mjs +0 -42
  121. package/dist/chunk-WFWRBNTW.mjs +0 -412
  122. package/dist/chunk-WTICJPDB.mjs +0 -0
  123. package/dist/chunk-XNEIWM4O.mjs +0 -0
  124. package/dist/chunk-Z4FZ7W6L.mjs +0 -39
  125. package/dist/chunk-Z7RFCADT.mjs +0 -0
  126. package/dist/chunk-ZHXCVRZX.mjs +0 -0
@@ -1,9 +1,68 @@
1
- import {
2
- getAptosConfig,
3
- getShelbyRPCBaseUrl
4
- } from "../../chunk-V4B3GAMQ.mjs";
5
- import "../../chunk-MNCQBEMS.mjs";
6
- import "../../chunk-7P6ASYW6.mjs";
1
+ // src/core/clients/utils.ts
2
+ import { AptosConfig } from "@aptos-labs/ts-sdk";
3
+
4
+ // src/core/constants.ts
5
+ import { Network } from "@aptos-labs/ts-sdk";
6
+ var NetworkToShelbyRPCBaseUrl = {
7
+ [Network.SHELBYNET]: "https://shelby.shelbynet.shelby.xyz/shelby",
8
+ [Network.NETNA]: void 0,
9
+ [Network.DEVNET]: void 0,
10
+ [Network.TESTNET]: "https://api.testnet.shelby.xyz/shelby",
11
+ [Network.MAINNET]: void 0,
12
+ [Network.LOCAL]: "http://localhost:9090",
13
+ [Network.CUSTOM]: void 0
14
+ };
15
+ var NetworkToShelbyBlobIndexerBaseUrl = {
16
+ [Network.SHELBYNET]: "https://api.shelbynet.aptoslabs.com/nocode/v1/public/alias/shelby/shelbynet/v1/graphql",
17
+ [Network.NETNA]: void 0,
18
+ [Network.DEVNET]: void 0,
19
+ [Network.TESTNET]: "https://api.testnet.aptoslabs.com/nocode/v1/public/alias/shelby/testnet/v1/graphql",
20
+ [Network.MAINNET]: void 0,
21
+ [Network.LOCAL]: "http://localhost:8091/v1/graphql",
22
+ [Network.CUSTOM]: void 0
23
+ };
24
+ var NetworkToGasStationBaseUrl = {
25
+ [Network.SHELBYNET]: "https://api.shelbynet.shelby.xyz/gs/v1",
26
+ [Network.NETNA]: void 0,
27
+ [Network.DEVNET]: void 0,
28
+ [Network.TESTNET]: "https://api.testnet.shelby.xyz/gs/v1",
29
+ [Network.MAINNET]: void 0,
30
+ [Network.LOCAL]: void 0,
31
+ [Network.CUSTOM]: void 0
32
+ };
33
+
34
+ // src/core/clients/utils.ts
35
+ var getAptosConfig = (config) => {
36
+ const baseFaucetConfig = config.faucet?.authToken ? { AUTH_TOKEN: config.faucet.authToken } : void 0;
37
+ if (config.aptos) {
38
+ return new AptosConfig({
39
+ // Spread user's aptos config first
40
+ ...config.aptos,
41
+ // Network from top-level is authoritative - cannot be overridden
42
+ network: config.network,
43
+ // Merge clientConfig with API_KEY default
44
+ clientConfig: {
45
+ API_KEY: config.apiKey,
46
+ ...config.aptos.clientConfig
47
+ },
48
+ // Merge faucetConfig: aptos config first, then base authToken (authoritative)
49
+ faucetConfig: {
50
+ ...config.aptos.faucetConfig,
51
+ ...baseFaucetConfig
52
+ }
53
+ });
54
+ }
55
+ return new AptosConfig({
56
+ network: config.network,
57
+ clientConfig: {
58
+ API_KEY: config.apiKey
59
+ },
60
+ faucetConfig: baseFaucetConfig
61
+ });
62
+ };
63
+ var getShelbyRPCBaseUrl = (config) => {
64
+ return config.rpc?.baseUrl ?? NetworkToShelbyRPCBaseUrl[config.network] ?? NetworkToShelbyRPCBaseUrl.testnet;
65
+ };
7
66
  export {
8
67
  getAptosConfig,
9
68
  getShelbyRPCBaseUrl
@@ -42,6 +42,17 @@ declare const ChunksetCommitmentSchema: z.ZodEffects<z.ZodObject<{
42
42
  }>;
43
43
  type ChunksetCommitment = z.infer<typeof ChunksetCommitmentSchema>;
44
44
  declare function expectedTotalChunksets(rawSize: number, chunksetSize?: number): number;
45
+ /**
46
+ * Expected number of 32-byte sibling hashes in a chunkset-to-blob inclusion proof.
47
+ *
48
+ * The blob merkle tree uses incremental odd-level zero-hash padding (see
49
+ * `generateMerkleRoot`). A single-chunkset blob is already the root, so the
50
+ * proof is empty (CLI sends header value `"NONE"`).
51
+ *
52
+ * For n > 1 chunksets, the proof length equals the number of levels from leaf
53
+ * to root, which is `ceil(log2(n))` — not `ceil(log2(n)) - 1`.
54
+ */
55
+ declare function expectedChunksetInclusionProofHashes(numChunksets: number): number;
45
56
  /**
46
57
  * Represents the (serializable) commitment schema for a single blob.
47
58
  */
@@ -124,4 +135,4 @@ declare function generateMerkleRoot(leafHashes: Hex[]): Promise<Hex>;
124
135
  */
125
136
  declare function generateCommitments(provider: ErasureCodingProvider, fullData: ReadableStream<Uint8Array> | Uint8Array, onChunk?: (chunksetIdx: number, chunkIdx: number, chunkData: Uint8Array) => Promise<void> | void): Promise<BlobCommitments>;
126
137
 
127
- export { type BlobCommitments, BlobCommitmentsSchema, COMMITMENT_SCHEMA_VERSION, type ChunksetCommitment, ChunksetCommitmentSchema, expectedTotalChunksets, generateCommitments, generateMerkleRoot };
138
+ export { type BlobCommitments, BlobCommitmentsSchema, COMMITMENT_SCHEMA_VERSION, type ChunksetCommitment, ChunksetCommitmentSchema, expectedChunksetInclusionProofHashes, expectedTotalChunksets, generateCommitments, generateMerkleRoot };
@@ -1,19 +1,285 @@
1
+ // src/core/commitments.ts
2
+ import { Hex as Hex2 } from "@aptos-labs/ts-sdk";
3
+ import { z } from "zod";
4
+
5
+ // src/core/erasure/constants.ts
6
+ var ERASURE_CODE_PARAMS = {
7
+ ["ClayCode_16Total_10Data_13Helper" /* ClayCode_16Total_10Data_13Helper */]: {
8
+ // total chunks (data + parity)
9
+ erasure_n: 16,
10
+ // data chunks
11
+ erasure_k: 10,
12
+ // helper nodes
13
+ erasure_d: 13,
14
+ // enum index
15
+ enumIndex: 0
16
+ },
17
+ ["ClayCode_4Total_2Data_3Helper" /* ClayCode_4Total_2Data_3Helper */]: {
18
+ // total chunks (data + parity)
19
+ erasure_n: 4,
20
+ // data chunks
21
+ erasure_k: 2,
22
+ // helper nodes
23
+ erasure_d: 3,
24
+ // enum index
25
+ enumIndex: 1
26
+ }
27
+ };
28
+ var DEFAULT_ERASURE_N = ERASURE_CODE_PARAMS["ClayCode_16Total_10Data_13Helper" /* ClayCode_16Total_10Data_13Helper */].erasure_n;
29
+ var DEFAULT_ERASURE_K = ERASURE_CODE_PARAMS["ClayCode_16Total_10Data_13Helper" /* ClayCode_16Total_10Data_13Helper */].erasure_k;
30
+ var DEFAULT_ERASURE_D = ERASURE_CODE_PARAMS["ClayCode_16Total_10Data_13Helper" /* ClayCode_16Total_10Data_13Helper */].erasure_d;
31
+ var DEFAULT_ERASURE_M = DEFAULT_ERASURE_N - DEFAULT_ERASURE_K;
32
+
33
+ // src/core/chunk.ts
34
+ var CHUNK_SIZE_PARAMS = {
35
+ ["ChunkSet10MiB_Chunk1MiB" /* ChunkSet10MiB_Chunk1MiB */]: {
36
+ // 1MiB
37
+ chunkSizeBytes: 1 * 1024 * 1024,
38
+ // 10MiB
39
+ chunksetSizeBytes: 10 * 1024 * 1024
40
+ },
41
+ ["ChunkSet2MiB_Chunk1MiB" /* ChunkSet2MiB_Chunk1MiB */]: {
42
+ // 1MiB
43
+ chunkSizeBytes: 1 * 1024 * 1024,
44
+ // 2MiB
45
+ chunksetSizeBytes: 2 * 1024 * 1024
46
+ }
47
+ };
48
+ var DEFAULT_CHUNK_SIZE_BYTES = CHUNK_SIZE_PARAMS["ChunkSet10MiB_Chunk1MiB" /* ChunkSet10MiB_Chunk1MiB */].chunkSizeBytes;
49
+ var DEFAULT_CHUNKSET_SIZE_BYTES = CHUNK_SIZE_PARAMS["ChunkSet10MiB_Chunk1MiB" /* ChunkSet10MiB_Chunk1MiB */].chunksetSizeBytes;
50
+ var ERASURE_CODE_AND_CHUNK_MAPPING = {
51
+ ["ClayCode_16Total_10Data_13Helper" /* ClayCode_16Total_10Data_13Helper */]: {
52
+ ...CHUNK_SIZE_PARAMS.ChunkSet10MiB_Chunk1MiB
53
+ },
54
+ ["ClayCode_4Total_2Data_3Helper" /* ClayCode_4Total_2Data_3Helper */]: {
55
+ ...CHUNK_SIZE_PARAMS.ChunkSet2MiB_Chunk1MiB
56
+ }
57
+ };
58
+
59
+ // src/core/utils.ts
1
60
  import {
2
- BlobCommitmentsSchema,
3
- COMMITMENT_SCHEMA_VERSION,
4
- ChunksetCommitmentSchema,
5
- expectedTotalChunksets,
6
- generateCommitments,
7
- generateMerkleRoot
8
- } from "../chunk-RNNJXTX2.mjs";
9
- import "../chunk-UEZNZBJO.mjs";
10
- import "../chunk-JTXYKO3U.mjs";
11
- import "../chunk-AUQDI5BS.mjs";
12
- import "../chunk-7P6ASYW6.mjs";
61
+ AccountAddress,
62
+ Hex
63
+ } from "@aptos-labs/ts-sdk";
64
+ async function* readInChunks(input, chunkSize) {
65
+ let idx = 0;
66
+ if (isReadableStream(input)) {
67
+ const reader = input.getReader();
68
+ let buffer = new Uint8Array(chunkSize);
69
+ let bufferWriteOffset = 0;
70
+ try {
71
+ while (true) {
72
+ const { value, done } = await reader.read();
73
+ if (done) break;
74
+ if (value === void 0) continue;
75
+ let srcOffset = 0;
76
+ while (srcOffset < value.length) {
77
+ const remainingCapacity = chunkSize - bufferWriteOffset;
78
+ const bytesToCopy = Math.min(
79
+ remainingCapacity,
80
+ value.length - srcOffset
81
+ );
82
+ buffer.set(
83
+ value.subarray(srcOffset, srcOffset + bytesToCopy),
84
+ bufferWriteOffset
85
+ );
86
+ bufferWriteOffset += bytesToCopy;
87
+ srcOffset += bytesToCopy;
88
+ if (bufferWriteOffset >= chunkSize) {
89
+ yield [idx++, buffer];
90
+ buffer = new Uint8Array(chunkSize);
91
+ bufferWriteOffset = 0;
92
+ }
93
+ }
94
+ }
95
+ } finally {
96
+ reader.releaseLock();
97
+ }
98
+ if (bufferWriteOffset > 0) {
99
+ yield [idx++, buffer.subarray(0, bufferWriteOffset)];
100
+ }
101
+ return;
102
+ }
103
+ const view = toUint8Array(input);
104
+ for (let offset = 0; offset < view.byteLength; offset += chunkSize) {
105
+ yield [
106
+ idx++,
107
+ view.subarray(offset, Math.min(offset + chunkSize, view.byteLength))
108
+ ];
109
+ }
110
+ }
111
+ function zeroPadBytes(buffer, desiredLength) {
112
+ if (buffer.byteLength === desiredLength) {
113
+ return buffer;
114
+ }
115
+ if (buffer.byteLength > desiredLength) {
116
+ return buffer.subarray(0, desiredLength);
117
+ }
118
+ const paddedBuffer = new Uint8Array(desiredLength);
119
+ paddedBuffer.set(buffer);
120
+ return paddedBuffer;
121
+ }
122
+ async function concatHashes(parts) {
123
+ const chunks = parts.map((part) => Hex.fromHexInput(part).toUint8Array());
124
+ const totalLength = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);
125
+ const combined = new Uint8Array(totalLength);
126
+ let offset = 0;
127
+ for (const chunk of chunks) {
128
+ combined.set(chunk, offset);
129
+ offset += chunk.byteLength;
130
+ }
131
+ return Hex.fromHexInput(
132
+ new Uint8Array(await crypto.subtle.digest("SHA-256", combined))
133
+ );
134
+ }
135
+ function isReadableStream(value) {
136
+ return typeof value === "object" && value !== null && "getReader" in value && typeof value.getReader === "function";
137
+ }
138
+ function toUint8Array(view) {
139
+ return view instanceof Uint8Array ? view : new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
140
+ }
141
+
142
+ // src/core/commitments.ts
143
+ var COMMITMENT_SCHEMA_VERSION = "1.3";
144
+ var ChunksetCommitmentSchema = z.object({
145
+ // Chunkset root (vector commitment of child chunks)
146
+ chunkset_root: z.string(),
147
+ // the size is known statically from the current configuration
148
+ chunk_commitments: z.array(z.string())
149
+ }).refine(
150
+ (data) => {
151
+ return data.chunk_commitments.length === DEFAULT_ERASURE_K + DEFAULT_ERASURE_M;
152
+ },
153
+ {
154
+ message: `Chunkset must have exactly ${DEFAULT_ERASURE_K + DEFAULT_ERASURE_M} chunks (ERASURE_K + ERASURE_M = ${DEFAULT_ERASURE_K} + ${DEFAULT_ERASURE_M})`,
155
+ path: ["chunk_commitments"]
156
+ }
157
+ );
158
+ function expectedTotalChunksets(rawSize, chunksetSize = DEFAULT_CHUNKSET_SIZE_BYTES) {
159
+ if (chunksetSize <= 0) {
160
+ throw new Error("chunksetSize must be positive");
161
+ }
162
+ if (rawSize === 0) return 1;
163
+ return Math.ceil(rawSize / chunksetSize);
164
+ }
165
+ function expectedChunksetInclusionProofHashes(numChunksets) {
166
+ if (numChunksets < 1) {
167
+ throw new Error("numChunksets must be positive");
168
+ }
169
+ return Math.ceil(Math.log2(numChunksets));
170
+ }
171
+ var BlobCommitmentsSchema = z.object({
172
+ schema_version: z.string(),
173
+ raw_data_size: z.number(),
174
+ // FIXME I am not sure about this being here, or if it should be somewhere else
175
+ blob_merkle_root: z.string(),
176
+ chunkset_commitments: z.array(ChunksetCommitmentSchema)
177
+ }).refine(
178
+ (data) => {
179
+ return expectedTotalChunksets(data.raw_data_size) === data.chunkset_commitments.length;
180
+ },
181
+ {
182
+ message: "Total chunkset count mismatches with raw data size",
183
+ // FIXME put more details in here
184
+ path: ["chunkset_commitments"]
185
+ }
186
+ );
187
+ async function generateMerkleRoot(leafHashes) {
188
+ if (!leafHashes.length) {
189
+ throw new Error(
190
+ "An empty array cannot be used to construct a Merkle tree."
191
+ );
192
+ }
193
+ const zeroArray = new Uint8Array(leafHashes[0].toUint8Array().length);
194
+ const zeroBytes = Hex2.fromHexInput(zeroArray);
195
+ let currentLeaves = leafHashes;
196
+ while (currentLeaves.length > 1) {
197
+ if (currentLeaves.length % 2 !== 0) {
198
+ currentLeaves.push(zeroBytes);
199
+ }
200
+ const nextLeaves = [];
201
+ for (let i = 0; i < currentLeaves.length; i += 2) {
202
+ nextLeaves.push(
203
+ await concatHashes([
204
+ currentLeaves[i].toUint8Array(),
205
+ currentLeaves[i + 1].toUint8Array()
206
+ ])
207
+ );
208
+ }
209
+ currentLeaves = nextLeaves;
210
+ }
211
+ return currentLeaves[0];
212
+ }
213
+ async function generateChunksetCommitments(chunksetIdx, chunksetData, expectedChunksetSize, provider, onChunk) {
214
+ const { erasure_n } = provider.config;
215
+ const chunksetPayload = zeroPadBytes(chunksetData, expectedChunksetSize);
216
+ const { chunks } = provider.encode(chunksetPayload);
217
+ if (chunks.length !== erasure_n) {
218
+ throw new Error(
219
+ `Erasure provider produced ${chunks.length} chunks, expected ${erasure_n}.`
220
+ );
221
+ }
222
+ const chunkRoots = provider.getChunkMerkleRoots();
223
+ let chunkIdx = 0;
224
+ for (const chunkData of chunks) {
225
+ if (onChunk !== void 0) {
226
+ await onChunk(chunksetIdx, chunkIdx, chunkData);
227
+ }
228
+ chunkIdx += 1;
229
+ }
230
+ const a = await generateMerkleRoot(
231
+ chunkRoots.map((a2) => Hex2.fromHexInput(a2))
232
+ );
233
+ const entry = {
234
+ chunkset_root: a.toString(),
235
+ chunk_commitments: chunkRoots.map(
236
+ (chunk) => Hex2.fromHexInput(chunk).toString()
237
+ )
238
+ };
239
+ return { h: a, entry };
240
+ }
241
+ async function generateCommitments(provider, fullData, onChunk) {
242
+ const expectedChunksetSize = provider.config.chunkSizeBytes * provider.config.erasure_k;
243
+ const chunksetCommitments = [];
244
+ const chunksetCommitmentHashes = [];
245
+ let rawDataSize = 0;
246
+ const chunksetGen = readInChunks(fullData, expectedChunksetSize);
247
+ for await (const [chunksetIdx, chunksetData] of chunksetGen) {
248
+ rawDataSize += chunksetData.length;
249
+ const { h, entry } = await generateChunksetCommitments(
250
+ chunksetIdx,
251
+ chunksetData,
252
+ expectedChunksetSize,
253
+ provider,
254
+ onChunk
255
+ );
256
+ chunksetCommitments.push(entry);
257
+ chunksetCommitmentHashes.push(h);
258
+ }
259
+ if (rawDataSize === 0) {
260
+ const zeroChunkset = new Uint8Array(expectedChunksetSize);
261
+ const { h, entry } = await generateChunksetCommitments(
262
+ 0,
263
+ zeroChunkset,
264
+ expectedChunksetSize,
265
+ provider,
266
+ onChunk
267
+ );
268
+ chunksetCommitments.push(entry);
269
+ chunksetCommitmentHashes.push(h);
270
+ }
271
+ return {
272
+ schema_version: COMMITMENT_SCHEMA_VERSION,
273
+ raw_data_size: rawDataSize,
274
+ blob_merkle_root: (await generateMerkleRoot(chunksetCommitmentHashes)).toString(),
275
+ chunkset_commitments: chunksetCommitments
276
+ };
277
+ }
13
278
  export {
14
279
  BlobCommitmentsSchema,
15
280
  COMMITMENT_SCHEMA_VERSION,
16
281
  ChunksetCommitmentSchema,
282
+ expectedChunksetInclusionProofHashes,
17
283
  expectedTotalChunksets,
18
284
  generateCommitments,
19
285
  generateMerkleRoot
@@ -1,12 +1,12 @@
1
1
  declare const DEFAULT_PROJECT_NAME = "shelby";
2
2
  declare const DEFAULT_PROJECT_DESCRIPTION = "High performance, decentralized storage";
3
3
  declare const NetworkToShelbyRPCBaseUrl: {
4
- readonly shelbynet: "https://api.shelbynet.shelby.xyz/shelby";
4
+ readonly shelbynet: "https://shelby.shelbynet.shelby.xyz/shelby";
5
5
  readonly netna: undefined;
6
6
  readonly devnet: undefined;
7
7
  readonly testnet: "https://api.testnet.shelby.xyz/shelby";
8
8
  readonly mainnet: undefined;
9
- readonly local: undefined;
9
+ readonly local: "http://localhost:9090";
10
10
  readonly custom: undefined;
11
11
  };
12
12
  /**
@@ -18,7 +18,7 @@ declare const NetworkToShelbyBlobIndexerBaseUrl: {
18
18
  readonly devnet: undefined;
19
19
  readonly testnet: "https://api.testnet.aptoslabs.com/nocode/v1/public/alias/shelby/testnet/v1/graphql";
20
20
  readonly mainnet: undefined;
21
- readonly local: undefined;
21
+ readonly local: "http://localhost:8091/v1/graphql";
22
22
  readonly custom: undefined;
23
23
  };
24
24
  /**
@@ -1,19 +1,42 @@
1
- import {
2
- DEFAULT_PROJECT_DESCRIPTION,
3
- DEFAULT_PROJECT_NAME,
4
- MICROPAYMENTS_DEPLOYER,
5
- NetworkToGasStationBaseUrl,
6
- NetworkToShelbyBlobIndexerBaseUrl,
7
- NetworkToShelbyRPCBaseUrl,
8
- SHELBYUSD_FA_METADATA_ADDRESS,
9
- SHELBYUSD_TOKEN_ADDRESS,
10
- SHELBYUSD_TOKEN_MODULE,
11
- SHELBYUSD_TOKEN_NAME,
12
- SHELBY_DEPLOYER,
13
- TOKEN_DEPLOYER,
14
- TOKEN_OBJECT_ADDRESS
15
- } from "../chunk-MNCQBEMS.mjs";
16
- import "../chunk-7P6ASYW6.mjs";
1
+ // src/core/constants.ts
2
+ import { Network } from "@aptos-labs/ts-sdk";
3
+ var DEFAULT_PROJECT_NAME = "shelby";
4
+ var DEFAULT_PROJECT_DESCRIPTION = "High performance, decentralized storage";
5
+ var NetworkToShelbyRPCBaseUrl = {
6
+ [Network.SHELBYNET]: "https://shelby.shelbynet.shelby.xyz/shelby",
7
+ [Network.NETNA]: void 0,
8
+ [Network.DEVNET]: void 0,
9
+ [Network.TESTNET]: "https://api.testnet.shelby.xyz/shelby",
10
+ [Network.MAINNET]: void 0,
11
+ [Network.LOCAL]: "http://localhost:9090",
12
+ [Network.CUSTOM]: void 0
13
+ };
14
+ var NetworkToShelbyBlobIndexerBaseUrl = {
15
+ [Network.SHELBYNET]: "https://api.shelbynet.aptoslabs.com/nocode/v1/public/alias/shelby/shelbynet/v1/graphql",
16
+ [Network.NETNA]: void 0,
17
+ [Network.DEVNET]: void 0,
18
+ [Network.TESTNET]: "https://api.testnet.aptoslabs.com/nocode/v1/public/alias/shelby/testnet/v1/graphql",
19
+ [Network.MAINNET]: void 0,
20
+ [Network.LOCAL]: "http://localhost:8091/v1/graphql",
21
+ [Network.CUSTOM]: void 0
22
+ };
23
+ var NetworkToGasStationBaseUrl = {
24
+ [Network.SHELBYNET]: "https://api.shelbynet.shelby.xyz/gs/v1",
25
+ [Network.NETNA]: void 0,
26
+ [Network.DEVNET]: void 0,
27
+ [Network.TESTNET]: "https://api.testnet.shelby.xyz/gs/v1",
28
+ [Network.MAINNET]: void 0,
29
+ [Network.LOCAL]: void 0,
30
+ [Network.CUSTOM]: void 0
31
+ };
32
+ var SHELBY_DEPLOYER = "0x85fdb9a176ab8ef1d9d9c1b60d60b3924f0800ac1de1cc2085fb0b8bb4988e6a";
33
+ var MICROPAYMENTS_DEPLOYER = "0x1ae7275148bf6ef742b658fd9cbcc2e094201606f4a7bc707bab0201da8043ee";
34
+ var TOKEN_DEPLOYER = "0x33009e852be7f93762dd0bf303383c2cb2c5cab7a30d8238ca5f9f177ae75124";
35
+ var TOKEN_OBJECT_ADDRESS = "0x249f5c642a63885ff88a5113b3ba0079840af5a1357706f8c7f3bfc5dd12511f";
36
+ var SHELBYUSD_TOKEN_ADDRESS = TOKEN_OBJECT_ADDRESS;
37
+ var SHELBYUSD_TOKEN_MODULE = "shelby_usd";
38
+ var SHELBYUSD_TOKEN_NAME = "ShelbyUSD";
39
+ var SHELBYUSD_FA_METADATA_ADDRESS = "0x1b18363a9f1fe5e6ebf247daba5cc1c18052bb232efdc4c50f556053922d98e1";
17
40
  export {
18
41
  DEFAULT_PROJECT_DESCRIPTION,
19
42
  DEFAULT_PROJECT_NAME,
@@ -1,8 +1,133 @@
1
+ // src/core/erasure/clay-codes.ts
1
2
  import {
2
- ClayErasureCodingProvider,
3
- buildClayConfig
4
- } from "../../chunk-OEK24ON7.mjs";
5
- import "../../chunk-7P6ASYW6.mjs";
3
+ createDecoder,
4
+ createEncoder
5
+ } from "@shelby-protocol/clay-codes";
6
+ function getTotalChunks(config) {
7
+ return config.erasure_n;
8
+ }
9
+ var ClayErasureCodingProvider = class _ClayErasureCodingProvider {
10
+ config;
11
+ encoderCache;
12
+ decoderCache;
13
+ lastFunction;
14
+ constructor(config) {
15
+ this.config = config;
16
+ this.lastFunction = "none" /* NONE */;
17
+ }
18
+ /**
19
+ * Static factory method to create an initialized ClayErasureCodingProvider
20
+ */
21
+ static async create(config) {
22
+ const provider = new _ClayErasureCodingProvider(config);
23
+ [provider.encoderCache, provider.decoderCache] = await Promise.all([
24
+ createEncoder({
25
+ n: getTotalChunks(config),
26
+ k: config.erasure_k,
27
+ d: config.erasure_d,
28
+ chunkSizeBytes: config.chunkSizeBytes
29
+ }),
30
+ createDecoder({
31
+ n: getTotalChunks(config),
32
+ k: config.erasure_k,
33
+ d: config.erasure_d,
34
+ chunkSizeBytes: config.chunkSizeBytes,
35
+ erasedChunkIndexes: []
36
+ })
37
+ ]);
38
+ return provider;
39
+ }
40
+ encode(data) {
41
+ const { erasure_k, chunkSizeBytes } = this.config;
42
+ if (!this.encoderCache) {
43
+ throw new Error("Encoder cache is missing");
44
+ }
45
+ const systematicCapacity = erasure_k * chunkSizeBytes;
46
+ if (data.byteLength > systematicCapacity) {
47
+ throw new Error(
48
+ `Data size ${data.byteLength} bytes exceeds systematic capacity ${systematicCapacity} bytes (erasure_k=${erasure_k} * chunkSizeBytes=${chunkSizeBytes}).`
49
+ );
50
+ }
51
+ if (this.requiresPadding(data.length)) {
52
+ throw new Error(
53
+ `Data size ${data.length} bytes does not match systematic capacity ${systematicCapacity} bytes (erasure_k=${erasure_k} * chunkSizeBytes=${chunkSizeBytes}). Provide pre-padded data before encoding.`
54
+ );
55
+ }
56
+ this.lastFunction = "encoded" /* ENCODED */;
57
+ return this.encoderCache.erasureCode(data);
58
+ }
59
+ decode(available, config) {
60
+ if (!this.decoderCache) {
61
+ throw new Error("Decoder cache is missing");
62
+ }
63
+ const { erasure_k, chunkSizeBytes } = this.config;
64
+ if (available.length < erasure_k) {
65
+ throw new Error(
66
+ `Insufficient available chunks: need at least ${erasure_k}, received ${available.length}.`
67
+ );
68
+ }
69
+ for (let i = 0; i < available.length; i++) {
70
+ const chunk = available[i];
71
+ if (chunk.length !== chunkSizeBytes) {
72
+ throw new Error(
73
+ `Chunk ${i} size ${chunk.length} bytes does not match expected chunkSizeBytes ${chunkSizeBytes}.`
74
+ );
75
+ }
76
+ }
77
+ this.lastFunction = "decoded" /* DECODED */;
78
+ return this.decoderCache.decode(available, config);
79
+ }
80
+ getChunkMerkleRoots() {
81
+ if (this.decoderCache && this.lastFunction === "decoded" /* DECODED */)
82
+ return this.decoderCache.getChunkMerkleRoots();
83
+ if (this.encoderCache && this.lastFunction === "encoded" /* ENCODED */)
84
+ return this.encoderCache.getChunkMerkleRoots();
85
+ throw new Error(
86
+ "You must call encode or decode before calling getChunkMerkleRoots"
87
+ );
88
+ }
89
+ /**
90
+ * Determines if data can be erasure coded as-is or requires padding.
91
+ *
92
+ * Data can be erasure coded without padding if its size exactly matches
93
+ * the total systematic data capacity (k * chunkSizeBytes).
94
+ *
95
+ * @param dataSize - Size of the data in bytes
96
+ * @returns true if data needs padding, false if it can be coded as-is
97
+ */
98
+ requiresPadding(dataSize) {
99
+ const { erasure_k, chunkSizeBytes } = this.config;
100
+ const systematicCapacity = erasure_k * chunkSizeBytes;
101
+ return dataSize !== systematicCapacity;
102
+ }
103
+ };
104
+ function buildClayConfig(input) {
105
+ const { erasure_n, erasure_k, erasure_d, chunkSizeBytes, enumIndex } = input;
106
+ if (erasure_n <= 0)
107
+ throw new Error("erasure_n (total number of chunks) must be > 0");
108
+ if (erasure_k <= 0)
109
+ throw new Error("erasure_k (number of data chunks) must be > 0");
110
+ if (erasure_k >= erasure_n)
111
+ throw new Error(
112
+ `erasure_k (${erasure_k}) must be < erasure_n (${erasure_n})`
113
+ );
114
+ if (erasure_d <= erasure_k)
115
+ throw new Error(
116
+ `erasure_d (${erasure_d}) must be > erasure_k (${erasure_k})`
117
+ );
118
+ if (erasure_d >= erasure_n)
119
+ throw new Error(
120
+ `erasure_d (${erasure_d}) must be < erasure_n (${erasure_n})`
121
+ );
122
+ if (chunkSizeBytes <= 0) throw new Error("chunkSizeBytes must be > 0");
123
+ return {
124
+ erasure_n,
125
+ erasure_k,
126
+ erasure_d,
127
+ chunkSizeBytes,
128
+ enumIndex
129
+ };
130
+ }
6
131
  export {
7
132
  ClayErasureCodingProvider,
8
133
  buildClayConfig
@@ -36,6 +36,21 @@ declare const ERASURE_CODE_PARAMS: {
36
36
  readonly enumIndex: 1;
37
37
  };
38
38
  };
39
+ /**
40
+ * Look up an erasure coding scheme by its total-chunk count (`erasure_n`).
41
+ * Returns the `[scheme, params]` entry, or `undefined` if no scheme matches.
42
+ * Shared by callers that need to recover a scheme's `erasure_k`/`erasure_d`
43
+ * (or its key for {@link ERASURE_CODE_AND_CHUNK_MAPPING}) from `erasure_n`
44
+ * alone, so the lookup stays in one place as schemes are added.
45
+ */
46
+ declare function findErasureSchemeByErasureN(erasureN: number): [ErasureCodingScheme, ErasureSchemeParams] | undefined;
47
+ /**
48
+ * Number of storage-provider acknowledgements required to finalize a blob on
49
+ * chain: the erasure scheme's helper-node count (`erasure_d`), recovered from
50
+ * the scheme's total-chunk count (`erasure_n`). Throws if `erasureN` matches no
51
+ * known scheme.
52
+ */
53
+ declare function requiredAckCount(erasureN: number): number;
39
54
  /**
40
55
  * The total number of chunks (data + parity) in the erasure coding scheme.
41
56
  */
@@ -57,4 +72,4 @@ declare const DEFAULT_ERASURE_M: number;
57
72
  */
58
73
  declare const DEFAULT_SAMPLE_SIZE = 1024;
59
74
 
60
- export { DEFAULT_ERASURE_D, DEFAULT_ERASURE_K, DEFAULT_ERASURE_M, DEFAULT_ERASURE_N, DEFAULT_SAMPLE_SIZE, ERASURE_CODE_PARAMS, type ErasureCodeParams, ErasureCodingScheme, type ErasureSchemeParams };
75
+ export { DEFAULT_ERASURE_D, DEFAULT_ERASURE_K, DEFAULT_ERASURE_M, DEFAULT_ERASURE_N, DEFAULT_SAMPLE_SIZE, ERASURE_CODE_PARAMS, type ErasureCodeParams, ErasureCodingScheme, type ErasureSchemeParams, findErasureSchemeByErasureN, requiredAckCount };