@blindmarket/sdk 0.1.6 → 0.1.8

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 (156) hide show
  1. package/README.md +242 -29
  2. package/dist/chain/BlindEscrowClient.d.ts +2 -0
  3. package/dist/chain/BlindEscrowClient.js +19 -7
  4. package/dist/chain/BlindReputationClient.d.ts +3 -0
  5. package/dist/chain/BlindReputationClient.js +3 -1
  6. package/dist/chain/ChainClient.d.ts +6 -3
  7. package/dist/chain/ChainClient.js +6 -1
  8. package/dist/chain/IBlindMarketChain.d.ts +74 -0
  9. package/dist/chain/IBlindMarketChain.js +1 -0
  10. package/dist/chain/TaskRegistryClient.d.ts +2 -1
  11. package/dist/chain/TaskRegistryClient.js +15 -7
  12. package/dist/chain/createChainAdapter.d.ts +25 -0
  13. package/dist/chain/createChainAdapter.js +24 -0
  14. package/dist/chain/domain-types.d.ts +77 -0
  15. package/dist/chain/domain-types.js +1 -0
  16. package/dist/chain/evm/EVMChainAdapter.d.ts +56 -0
  17. package/dist/chain/evm/EVMChainAdapter.js +161 -0
  18. package/dist/chain/evm/index.d.ts +1 -0
  19. package/dist/chain/evm/index.js +1 -0
  20. package/dist/chain/index.d.ts +4 -0
  21. package/dist/chain/index.js +5 -0
  22. package/dist/crypto/constants.js +1 -1
  23. package/dist/errors/{BlindBountyError.d.ts → BlindMarketError.d.ts} +1 -1
  24. package/dist/errors/{BlindBountyError.js → BlindMarketError.js} +1 -1
  25. package/dist/errors/index.d.ts +1 -1
  26. package/dist/errors/index.js +1 -1
  27. package/dist/errors/subclasses.d.ts +9 -9
  28. package/dist/errors/subclasses.js +9 -9
  29. package/dist/executor/WorkerRuntime.d.ts +113 -0
  30. package/dist/executor/WorkerRuntime.js +248 -0
  31. package/dist/executor/index.d.ts +1 -0
  32. package/dist/executor/index.js +1 -0
  33. package/dist/index.d.ts +292 -22
  34. package/dist/index.js +413 -23
  35. package/dist/keystore/InMemoryKeyStore.js +2 -2
  36. package/dist/network/presets.d.ts +33 -5
  37. package/dist/network/presets.js +35 -8
  38. package/dist/network/resolve.d.ts +12 -3
  39. package/dist/network/resolve.js +15 -7
  40. package/dist/network/types.d.ts +3 -16
  41. package/dist/signer/EthersSigner.js +1 -1
  42. package/dist/storage/index.d.ts +0 -1
  43. package/dist/storage/index.js +1 -1
  44. package/dist/tools/adapters.d.ts +99 -0
  45. package/dist/tools/adapters.js +129 -0
  46. package/dist/tools/helpers.d.ts +9 -0
  47. package/dist/tools/helpers.js +169 -0
  48. package/dist/tools/index.d.ts +36 -0
  49. package/dist/tools/index.js +32 -0
  50. package/dist/tools/types.d.ts +44 -0
  51. package/dist/tools/types.js +1 -0
  52. package/dist/types.d.ts +202 -1
  53. package/dist/types.js +24 -1
  54. package/package.json +13 -2
  55. package/src/chain/BlindEscrowClient.ts +20 -6
  56. package/src/chain/BlindReputationClient.ts +6 -1
  57. package/src/chain/ChainClient.ts +9 -3
  58. package/src/chain/IBlindMarketChain.ts +109 -0
  59. package/src/chain/TaskRegistryClient.ts +17 -8
  60. package/src/chain/createChainAdapter.ts +40 -0
  61. package/src/chain/domain-types.ts +92 -0
  62. package/src/chain/evm/EVMChainAdapter.ts +212 -0
  63. package/src/chain/evm/index.ts +1 -0
  64. package/src/chain/index.ts +6 -0
  65. package/src/executor/WorkerRuntime.ts +338 -0
  66. package/src/executor/index.ts +8 -0
  67. package/src/index.ts +546 -36
  68. package/src/network/presets.ts +47 -8
  69. package/src/network/resolve.ts +20 -8
  70. package/src/network/types.ts +18 -16
  71. package/src/signer/index.ts +1 -1
  72. package/src/storage/index.ts +1 -1
  73. package/src/tools/adapters.ts +177 -0
  74. package/src/tools/helpers.ts +199 -0
  75. package/src/tools/index.ts +59 -0
  76. package/src/tools/types.ts +47 -0
  77. package/src/types.ts +222 -1
  78. package/tsconfig.json +2 -1
  79. package/dist/BlindEscrowClient-CyPuKMge.d.cts +0 -54
  80. package/dist/BlindEscrowClient-R7iGpE-n.d.ts +0 -54
  81. package/dist/KeyStore-Be_SSpCt.d.cts +0 -21
  82. package/dist/KeyStore-k1JgYPJY.d.ts +0 -21
  83. package/dist/Signer-BnqH_qew.d.cts +0 -38
  84. package/dist/Signer-LColE0Uo.d.ts +0 -38
  85. package/dist/Storage-4QOrh7rm.d.ts +0 -17
  86. package/dist/Storage-Cf4IJRMk.d.cts +0 -17
  87. package/dist/TaskRegistryClient-Ch6lYqM_.d.ts +0 -24
  88. package/dist/TaskRegistryClient-CrQjddDc.d.cts +0 -24
  89. package/dist/aes-J-7HrHze.d.cts +0 -17
  90. package/dist/aes-J-7HrHze.d.ts +0 -17
  91. package/dist/agent/index.cjs +0 -425
  92. package/dist/agent/index.cjs.map +0 -1
  93. package/dist/agent/index.d.cts +0 -63
  94. package/dist/agent/index.js.map +0 -1
  95. package/dist/api/index.cjs +0 -4
  96. package/dist/api/index.cjs.map +0 -1
  97. package/dist/api/index.d.cts +0 -2
  98. package/dist/api/index.js.map +0 -1
  99. package/dist/chain/index.cjs +0 -2484
  100. package/dist/chain/index.cjs.map +0 -1
  101. package/dist/chain/index.d.cts +0 -2305
  102. package/dist/chain/index.js.map +0 -1
  103. package/dist/compute/index.cjs +0 -4
  104. package/dist/compute/index.cjs.map +0 -1
  105. package/dist/compute/index.d.cts +0 -2
  106. package/dist/compute/index.js.map +0 -1
  107. package/dist/crypto/index.cjs +0 -424
  108. package/dist/crypto/index.cjs.map +0 -1
  109. package/dist/crypto/index.d.cts +0 -74
  110. package/dist/crypto/index.js.map +0 -1
  111. package/dist/errors/index.cjs +0 -136
  112. package/dist/errors/index.cjs.map +0 -1
  113. package/dist/errors/index.d.cts +0 -60
  114. package/dist/errors/index.js.map +0 -1
  115. package/dist/events/index.cjs +0 -41
  116. package/dist/events/index.cjs.map +0 -1
  117. package/dist/events/index.d.cts +0 -61
  118. package/dist/events/index.js.map +0 -1
  119. package/dist/index.cjs +0 -4
  120. package/dist/index.cjs.map +0 -1
  121. package/dist/index.d.cts +0 -2
  122. package/dist/index.js.map +0 -1
  123. package/dist/keystore/index.cjs +0 -335
  124. package/dist/keystore/index.cjs.map +0 -1
  125. package/dist/keystore/index.d.cts +0 -23
  126. package/dist/keystore/index.js.map +0 -1
  127. package/dist/network/index.cjs +0 -74
  128. package/dist/network/index.cjs.map +0 -1
  129. package/dist/network/index.d.cts +0 -36
  130. package/dist/network/index.js.map +0 -1
  131. package/dist/signer/index.cjs +0 -121
  132. package/dist/signer/index.cjs.map +0 -1
  133. package/dist/signer/index.d.cts +0 -40
  134. package/dist/signer/index.js.map +0 -1
  135. package/dist/storage/ZgStorage.d.ts +0 -24
  136. package/dist/storage/ZgStorage.js +0 -102
  137. package/dist/storage/index.cjs +0 -221
  138. package/dist/storage/index.cjs.map +0 -1
  139. package/dist/storage/index.d.cts +0 -44
  140. package/dist/storage/index.js.map +0 -1
  141. package/dist/testing/index.cjs +0 -4
  142. package/dist/testing/index.cjs.map +0 -1
  143. package/dist/testing/index.d.cts +0 -2
  144. package/dist/testing/index.js.map +0 -1
  145. package/dist/types-BOG5Ub1z.d.cts +0 -31
  146. package/dist/types-BOG5Ub1z.d.ts +0 -31
  147. package/dist/types-V7_ZmUb-.d.cts +0 -19
  148. package/dist/types-hAsITUQ7.d.ts +0 -19
  149. package/dist/verifier/index.cjs +0 -4
  150. package/dist/verifier/index.cjs.map +0 -1
  151. package/dist/verifier/index.d.cts +0 -2
  152. package/dist/verifier/index.js.map +0 -1
  153. package/dist/worker/index.cjs +0 -382
  154. package/dist/worker/index.cjs.map +0 -1
  155. package/dist/worker/index.d.cts +0 -58
  156. package/dist/worker/index.js.map +0 -1
@@ -1,335 +0,0 @@
1
- 'use strict';
2
-
3
- require('ethers');
4
-
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __esm = (fn, res) => function __init() {
7
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
8
- };
9
-
10
- // src/crypto/constants.ts
11
- var IV_LENGTH, TAG_LENGTH, KEY_LENGTH, ECIES_HKDF_INFO, AES_MIN_BLOB;
12
- var init_constants = __esm({
13
- "src/crypto/constants.ts"() {
14
- IV_LENGTH = 12;
15
- TAG_LENGTH = 16;
16
- KEY_LENGTH = 32;
17
- ECIES_HKDF_INFO = new TextEncoder().encode("BlindBounty-ECIES-v1");
18
- AES_MIN_BLOB = IV_LENGTH + TAG_LENGTH;
19
- }
20
- });
21
-
22
- // src/errors/codes.ts
23
- var init_codes = __esm({
24
- "src/errors/codes.ts"() {
25
- }
26
- });
27
-
28
- // src/errors/BlindBountyError.ts
29
- var BlindBountyError;
30
- var init_BlindBountyError = __esm({
31
- "src/errors/BlindBountyError.ts"() {
32
- BlindBountyError = class extends Error {
33
- code;
34
- retriable;
35
- context;
36
- cause;
37
- constructor(code, message, opts = {}) {
38
- super(message);
39
- this.code = code;
40
- this.retriable = opts.retriable ?? false;
41
- if (opts.context !== void 0) this.context = opts.context;
42
- if (opts.cause !== void 0) this.cause = opts.cause;
43
- Object.defineProperty(this, "name", {
44
- value: this.constructor.name,
45
- enumerable: false,
46
- configurable: true,
47
- writable: true
48
- });
49
- }
50
- toJSON() {
51
- return {
52
- name: this.name,
53
- code: this.code,
54
- message: this.message,
55
- retriable: this.retriable,
56
- ...this.context ? { context: this.context } : {}
57
- };
58
- }
59
- };
60
- }
61
- });
62
-
63
- // src/errors/subclasses.ts
64
- var CryptoError;
65
- var init_subclasses = __esm({
66
- "src/errors/subclasses.ts"() {
67
- init_BlindBountyError();
68
- CryptoError = class extends BlindBountyError {
69
- constructor(code, msg, opts) {
70
- super(code, msg, opts);
71
- }
72
- };
73
- }
74
- });
75
-
76
- // src/errors/index.ts
77
- var init_errors = __esm({
78
- "src/errors/index.ts"() {
79
- init_codes();
80
- init_BlindBountyError();
81
- init_subclasses();
82
- }
83
- });
84
-
85
- // src/crypto/aes.ts
86
- function getCrypto() {
87
- const c = globalThis.crypto;
88
- if (!c?.subtle) {
89
- throw new CryptoError("CRYPTO/UNSUPPORTED_CIPHER", "Web Crypto (crypto.subtle) is not available");
90
- }
91
- return c;
92
- }
93
- function toArrayBuffer(u) {
94
- const ab = new ArrayBuffer(u.byteLength);
95
- new Uint8Array(ab).set(u);
96
- return ab;
97
- }
98
- async function generateAesKey() {
99
- const key = new Uint8Array(KEY_LENGTH);
100
- getCrypto().getRandomValues(key);
101
- return key;
102
- }
103
- async function aesEncrypt(plaintext, key) {
104
- if (key.byteLength !== KEY_LENGTH) {
105
- throw new CryptoError(
106
- "CRYPTO/INVALID_KEY",
107
- `AES key must be ${KEY_LENGTH} bytes, got ${key.byteLength}`
108
- );
109
- }
110
- const c = getCrypto();
111
- const iv = new Uint8Array(IV_LENGTH);
112
- c.getRandomValues(iv);
113
- try {
114
- const ck = await c.subtle.importKey("raw", toArrayBuffer(key), "AES-GCM", false, ["encrypt"]);
115
- const wcOut = new Uint8Array(
116
- await c.subtle.encrypt(
117
- { name: "AES-GCM", iv: toArrayBuffer(iv), tagLength: TAG_LENGTH * 8 },
118
- ck,
119
- toArrayBuffer(plaintext)
120
- )
121
- );
122
- const ctLen = wcOut.length - TAG_LENGTH;
123
- const ct = wcOut.subarray(0, ctLen);
124
- const tag = wcOut.subarray(ctLen);
125
- const blob = new Uint8Array(IV_LENGTH + TAG_LENGTH + ctLen);
126
- blob.set(iv, 0);
127
- blob.set(tag, IV_LENGTH);
128
- blob.set(ct, IV_LENGTH + TAG_LENGTH);
129
- return blob;
130
- } catch (cause) {
131
- throw new CryptoError("CRYPTO/DECRYPT_FAILED", "AES-GCM encryption failed", { cause });
132
- }
133
- }
134
- async function aesDecrypt(blob, key) {
135
- if (key.byteLength !== KEY_LENGTH) {
136
- throw new CryptoError(
137
- "CRYPTO/INVALID_KEY",
138
- `AES key must be ${KEY_LENGTH} bytes, got ${key.byteLength}`
139
- );
140
- }
141
- if (blob.byteLength < AES_MIN_BLOB) {
142
- throw new CryptoError(
143
- "CRYPTO/INTEGRITY_CHECK",
144
- `AES blob too short: need \u2265${AES_MIN_BLOB} bytes, got ${blob.byteLength}`
145
- );
146
- }
147
- const iv = blob.subarray(0, IV_LENGTH);
148
- const tag = blob.subarray(IV_LENGTH, IV_LENGTH + TAG_LENGTH);
149
- const ct = blob.subarray(IV_LENGTH + TAG_LENGTH);
150
- const combined = new Uint8Array(ct.length + TAG_LENGTH);
151
- combined.set(ct, 0);
152
- combined.set(tag, ct.length);
153
- try {
154
- const c = getCrypto();
155
- const ck = await c.subtle.importKey("raw", toArrayBuffer(key), "AES-GCM", false, ["decrypt"]);
156
- const pt = await c.subtle.decrypt(
157
- { name: "AES-GCM", iv: toArrayBuffer(iv), tagLength: TAG_LENGTH * 8 },
158
- ck,
159
- toArrayBuffer(combined)
160
- );
161
- return new Uint8Array(pt);
162
- } catch (cause) {
163
- throw new CryptoError("CRYPTO/DECRYPT_FAILED", "AES-GCM decryption failed (wrong key or tampered data)", { cause });
164
- }
165
- }
166
- var init_aes = __esm({
167
- "src/crypto/aes.ts"() {
168
- init_errors();
169
- init_constants();
170
- }
171
- });
172
-
173
- // src/crypto/hkdf.ts
174
- function getSubtle() {
175
- const c = globalThis.crypto;
176
- if (!c?.subtle) {
177
- throw new CryptoError("CRYPTO/UNSUPPORTED_CIPHER", "Web Crypto (crypto.subtle) is not available");
178
- }
179
- return c.subtle;
180
- }
181
- function toArrayBuffer2(u) {
182
- const ab = new ArrayBuffer(u.byteLength);
183
- new Uint8Array(ab).set(u);
184
- return ab;
185
- }
186
- async function hkdfSha256(ikm, length = 32, info = ECIES_HKDF_INFO, salt = new Uint8Array(0)) {
187
- try {
188
- const subtle = getSubtle();
189
- const baseKey = await subtle.importKey("raw", toArrayBuffer2(ikm), "HKDF", false, ["deriveBits"]);
190
- const derived = await subtle.deriveBits(
191
- {
192
- name: "HKDF",
193
- hash: "SHA-256",
194
- info: toArrayBuffer2(info),
195
- salt: toArrayBuffer2(salt)
196
- },
197
- baseKey,
198
- length * 8
199
- );
200
- return new Uint8Array(derived);
201
- } catch (cause) {
202
- throw new CryptoError("CRYPTO/INVALID_KEY", "HKDF derivation failed", { cause });
203
- }
204
- }
205
- var init_hkdf = __esm({
206
- "src/crypto/hkdf.ts"() {
207
- init_errors();
208
- init_constants();
209
- }
210
- });
211
- var init_keys = __esm({
212
- "src/crypto/keys.ts"() {
213
- }
214
- });
215
- var init_ecies = __esm({
216
- "src/crypto/ecies.ts"() {
217
- }
218
- });
219
-
220
- // src/crypto/index.ts
221
- init_constants();
222
- init_aes();
223
- init_ecies();
224
- init_keys();
225
- init_hkdf();
226
-
227
- // src/keystore/InMemoryKeyStore.ts
228
- init_errors();
229
- var EXPORT_FORMAT = "blindbounty.keystore.v1";
230
- var EXPORT_INFO = new TextEncoder().encode("BlindBounty-Keystore-Export-v1");
231
- var InMemoryKeyStore = class {
232
- keys = /* @__PURE__ */ new Map();
233
- peers = /* @__PURE__ */ new Map();
234
- async putTaskKey(taskId, key) {
235
- this.keys.set(taskId.toString(), {
236
- aesKey: copy(key.aesKey),
237
- createdAt: key.createdAt.getTime()
238
- });
239
- }
240
- async getTaskKey(taskId) {
241
- const e = this.keys.get(taskId.toString());
242
- if (!e) return null;
243
- return { aesKey: copy(e.aesKey), createdAt: new Date(e.createdAt) };
244
- }
245
- async putPeerPubKey(addr, pubkey) {
246
- this.peers.set(addr, pubkey);
247
- }
248
- async getPeerPubKey(addr) {
249
- return this.peers.get(addr) ?? null;
250
- }
251
- async list() {
252
- return Array.from(this.keys.entries()).map(([id, e]) => ({
253
- taskId: BigInt(id),
254
- createdAt: new Date(e.createdAt)
255
- }));
256
- }
257
- async delete(taskId) {
258
- this.keys.delete(taskId.toString());
259
- }
260
- async export(passphrase) {
261
- if (!passphrase || passphrase.length < 8) {
262
- throw new CryptoError("CRYPTO/INVALID_KEY", "passphrase must be \u22658 characters");
263
- }
264
- const salt = randomBytes(16);
265
- const wrapKey = await deriveWrapKey(passphrase, salt);
266
- const plain = {
267
- keys: Array.from(this.keys.entries()).map(([taskId, e]) => ({
268
- taskId,
269
- aesKey: bytesToHex(e.aesKey),
270
- createdAt: e.createdAt
271
- })),
272
- peers: Array.from(this.peers.entries()).map(([addr, pubkey]) => ({ addr, pubkey }))
273
- };
274
- const blob = await aesEncrypt(new TextEncoder().encode(JSON.stringify(plain)), wrapKey);
275
- const out = { format: EXPORT_FORMAT, salt: bytesToHex(salt), blob: bytesToHex(blob) };
276
- return JSON.stringify(out);
277
- }
278
- async import(data, passphrase) {
279
- let parsed;
280
- try {
281
- parsed = JSON.parse(data);
282
- } catch (cause) {
283
- throw new CryptoError("CRYPTO/INTEGRITY_CHECK", "keystore export is not valid JSON", { cause });
284
- }
285
- if (parsed.format !== EXPORT_FORMAT) {
286
- throw new CryptoError(
287
- "CRYPTO/UNSUPPORTED_CIPHER",
288
- `unknown keystore export format: ${parsed.format ?? "(missing)"}`
289
- );
290
- }
291
- const salt = hexToBytes(parsed.salt);
292
- const wrapKey = await deriveWrapKey(passphrase, salt);
293
- const blob = hexToBytes(parsed.blob);
294
- const plainBytes = await aesDecrypt(blob, wrapKey);
295
- const plain = JSON.parse(new TextDecoder().decode(plainBytes));
296
- this.keys.clear();
297
- this.peers.clear();
298
- for (const k of plain.keys) {
299
- this.keys.set(k.taskId, { aesKey: hexToBytes(k.aesKey), createdAt: k.createdAt });
300
- }
301
- for (const p of plain.peers) {
302
- this.peers.set(p.addr, p.pubkey);
303
- }
304
- }
305
- };
306
- function copy(u) {
307
- const c = new Uint8Array(u.byteLength);
308
- c.set(u);
309
- return c;
310
- }
311
- function randomBytes(n) {
312
- const c = globalThis.crypto;
313
- const out = new Uint8Array(n);
314
- c.getRandomValues(out);
315
- return out;
316
- }
317
- async function deriveWrapKey(passphrase, salt) {
318
- const ikm = new TextEncoder().encode(passphrase);
319
- return hkdfSha256(ikm, 32, EXPORT_INFO, salt);
320
- }
321
- function bytesToHex(u) {
322
- return Array.from(u, (b) => b.toString(16).padStart(2, "0")).join("");
323
- }
324
- function hexToBytes(hex) {
325
- const out = new Uint8Array(hex.length / 2);
326
- for (let i = 0; i < out.length; i++) {
327
- out[i] = Number.parseInt(hex.substring(i * 2, i * 2 + 2), 16);
328
- }
329
- return out;
330
- }
331
-
332
- exports.InMemoryKeyStore = InMemoryKeyStore;
333
- exports.generateAesKey = generateAesKey;
334
- //# sourceMappingURL=index.cjs.map
335
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/crypto/constants.ts","../../src/errors/codes.ts","../../src/errors/BlindBountyError.ts","../../src/errors/subclasses.ts","../../src/errors/index.ts","../../src/crypto/aes.ts","../../src/crypto/hkdf.ts","../../src/crypto/keys.ts","../../src/crypto/ecies.ts","../../src/crypto/index.ts","../../src/keystore/InMemoryKeyStore.ts"],"names":["toArrayBuffer"],"mappings":"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","file":"index.cjs","sourcesContent":["export const IV_LENGTH = 12;\nexport const TAG_LENGTH = 16;\nexport const KEY_LENGTH = 32;\nexport const ECIES_PUBKEY_LENGTH = 65;\nexport const ECIES_HKDF_INFO = new TextEncoder().encode('BlindBounty-ECIES-v1');\nexport const AES_MIN_BLOB = IV_LENGTH + TAG_LENGTH;\nexport const ECIES_MIN_BLOB = ECIES_PUBKEY_LENGTH + AES_MIN_BLOB;\n","export const ErrorCodes = {\n Config: ['CONFIG/INVALID_NETWORK', 'CONFIG/MISSING_SIGNER', 'CONFIG/BAD_CONFIG'] as const,\n Crypto: [\n 'CRYPTO/INVALID_KEY',\n 'CRYPTO/DECRYPT_FAILED',\n 'CRYPTO/INTEGRITY_CHECK',\n 'CRYPTO/UNSUPPORTED_CIPHER',\n ] as const,\n Storage: [\n 'STORAGE/UPLOAD_FAILED',\n 'STORAGE/DOWNLOAD_FAILED',\n 'STORAGE/MERKLE_MISMATCH',\n 'STORAGE/NOT_FOUND',\n 'STORAGE/INDEXER_UNREACHABLE',\n ] as const,\n Chain: [\n 'CHAIN/TX_REVERTED',\n 'CHAIN/TX_TIMED_OUT',\n 'CHAIN/NONCE_CONFLICT',\n 'CHAIN/INSUFFICIENT_BALANCE',\n 'CHAIN/NETWORK_MISMATCH',\n 'CHAIN/CONTRACT_NOT_DEPLOYED',\n ] as const,\n Compute: [\n 'COMPUTE/BROKER_UNREACHABLE',\n 'COMPUTE/NO_PROVIDERS',\n 'COMPUTE/LEDGER_INSUFFICIENT',\n 'COMPUTE/TEE_ATTESTATION_INVALID',\n 'COMPUTE/VERIFICATION_TIMEOUT',\n ] as const,\n Api: [\n 'API/AUTH_REQUIRED',\n 'API/AUTH_EXPIRED',\n 'API/FORBIDDEN',\n 'API/RATE_LIMITED',\n 'API/VALIDATION',\n 'API/SERVER',\n 'API/NOT_FOUND',\n ] as const,\n Lifecycle: [\n 'LIFECYCLE/ILLEGAL_TRANSITION',\n 'LIFECYCLE/TASK_NOT_FOUND',\n 'LIFECYCLE/NOT_ASSIGNED',\n 'LIFECYCLE/ALREADY_SUBMITTED',\n 'LIFECYCLE/CLAIM_NOT_READY',\n ] as const,\n Timeout: ['TIMEOUT'] as const,\n} as const;\n\nexport type ConfigCode = (typeof ErrorCodes.Config)[number];\nexport type CryptoCode = (typeof ErrorCodes.Crypto)[number];\nexport type StorageCode = (typeof ErrorCodes.Storage)[number];\nexport type ChainCode = (typeof ErrorCodes.Chain)[number];\nexport type ComputeCode = (typeof ErrorCodes.Compute)[number];\nexport type ApiCode = (typeof ErrorCodes.Api)[number];\nexport type LifecycleCode = (typeof ErrorCodes.Lifecycle)[number];\nexport type TimeoutCode = (typeof ErrorCodes.Timeout)[number];\n\nexport type ErrorCode =\n | ConfigCode\n | CryptoCode\n | StorageCode\n | ChainCode\n | ComputeCode\n | ApiCode\n | LifecycleCode\n | TimeoutCode;\n","import type { ErrorCode } from './codes.js';\n\nexport interface ErrorOptions {\n retriable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n}\n\nexport abstract class BlindBountyError extends Error {\n readonly code: ErrorCode;\n readonly retriable: boolean;\n readonly context?: Record<string, unknown>;\n override readonly cause?: unknown;\n\n constructor(code: ErrorCode, message: string, opts: ErrorOptions = {}) {\n super(message);\n this.code = code;\n this.retriable = opts.retriable ?? false;\n if (opts.context !== undefined) this.context = opts.context;\n if (opts.cause !== undefined) this.cause = opts.cause;\n Object.defineProperty(this, 'name', {\n value: this.constructor.name,\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n retriable: this.retriable,\n ...(this.context ? { context: this.context } : {}),\n };\n }\n}\n","import { BlindBountyError, type ErrorOptions } from './BlindBountyError.js';\nimport type {\n ApiCode,\n ChainCode,\n ComputeCode,\n ConfigCode,\n CryptoCode,\n LifecycleCode,\n StorageCode,\n TimeoutCode,\n} from './codes.js';\n\nexport class ConfigError extends BlindBountyError {\n constructor(code: ConfigCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class CryptoError extends BlindBountyError {\n constructor(code: CryptoCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class StorageError extends BlindBountyError {\n constructor(code: StorageCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ChainError extends BlindBountyError {\n constructor(code: ChainCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ComputeError extends BlindBountyError {\n constructor(code: ComputeCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ApiError extends BlindBountyError {\n constructor(code: ApiCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class LifecycleError extends BlindBountyError {\n constructor(code: LifecycleCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class TimeoutError extends BlindBountyError {\n constructor(code: TimeoutCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n","export * from './codes.js';\nexport * from './BlindBountyError.js';\nexport * from './subclasses.js';\n","import { CryptoError } from '../errors/index.js';\nimport { AES_MIN_BLOB, IV_LENGTH, KEY_LENGTH, TAG_LENGTH } from './constants.js';\n\nfunction getCrypto(): Crypto {\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (!c?.subtle) {\n throw new CryptoError('CRYPTO/UNSUPPORTED_CIPHER', 'Web Crypto (crypto.subtle) is not available');\n }\n return c;\n}\n\nfunction toArrayBuffer(u: Uint8Array): ArrayBuffer {\n const ab = new ArrayBuffer(u.byteLength);\n new Uint8Array(ab).set(u);\n return ab;\n}\n\n/** Generate a fresh 32-byte AES-256 key. */\nexport async function generateAesKey(): Promise<Uint8Array> {\n const key = new Uint8Array(KEY_LENGTH);\n getCrypto().getRandomValues(key);\n return key;\n}\n\n/**\n * AES-256-GCM encrypt. Output format: [12 IV][16 tag][ciphertext].\n * This ordering matches backend/src/services/crypto.ts and frontend/src/lib/crypto.ts\n * byte-for-byte, so SDK blobs decrypt anywhere in the stack.\n */\nexport async function aesEncrypt(plaintext: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n if (key.byteLength !== KEY_LENGTH) {\n throw new CryptoError(\n 'CRYPTO/INVALID_KEY',\n `AES key must be ${KEY_LENGTH} bytes, got ${key.byteLength}`,\n );\n }\n const c = getCrypto();\n const iv = new Uint8Array(IV_LENGTH);\n c.getRandomValues(iv);\n try {\n const ck = await c.subtle.importKey('raw', toArrayBuffer(key), 'AES-GCM', false, ['encrypt']);\n const wcOut = new Uint8Array(\n await c.subtle.encrypt(\n { name: 'AES-GCM', iv: toArrayBuffer(iv), tagLength: TAG_LENGTH * 8 },\n ck,\n toArrayBuffer(plaintext),\n ),\n );\n // WebCrypto returns [ciphertext || tag]. Rewrite to [IV || tag || ciphertext].\n const ctLen = wcOut.length - TAG_LENGTH;\n const ct = wcOut.subarray(0, ctLen);\n const tag = wcOut.subarray(ctLen);\n const blob = new Uint8Array(IV_LENGTH + TAG_LENGTH + ctLen);\n blob.set(iv, 0);\n blob.set(tag, IV_LENGTH);\n blob.set(ct, IV_LENGTH + TAG_LENGTH);\n return blob;\n } catch (cause) {\n throw new CryptoError('CRYPTO/DECRYPT_FAILED', 'AES-GCM encryption failed', { cause });\n }\n}\n\n/**\n * AES-256-GCM decrypt. Input format: [12 IV][16 tag][ciphertext].\n * Throws CRYPTO/INTEGRITY_CHECK on truncation or tag mismatch.\n */\nexport async function aesDecrypt(blob: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n if (key.byteLength !== KEY_LENGTH) {\n throw new CryptoError(\n 'CRYPTO/INVALID_KEY',\n `AES key must be ${KEY_LENGTH} bytes, got ${key.byteLength}`,\n );\n }\n if (blob.byteLength < AES_MIN_BLOB) {\n throw new CryptoError(\n 'CRYPTO/INTEGRITY_CHECK',\n `AES blob too short: need ≥${AES_MIN_BLOB} bytes, got ${blob.byteLength}`,\n );\n }\n const iv = blob.subarray(0, IV_LENGTH);\n const tag = blob.subarray(IV_LENGTH, IV_LENGTH + TAG_LENGTH);\n const ct = blob.subarray(IV_LENGTH + TAG_LENGTH);\n const combined = new Uint8Array(ct.length + TAG_LENGTH);\n combined.set(ct, 0);\n combined.set(tag, ct.length);\n try {\n const c = getCrypto();\n const ck = await c.subtle.importKey('raw', toArrayBuffer(key), 'AES-GCM', false, ['decrypt']);\n const pt = await c.subtle.decrypt(\n { name: 'AES-GCM', iv: toArrayBuffer(iv), tagLength: TAG_LENGTH * 8 },\n ck,\n toArrayBuffer(combined),\n );\n return new Uint8Array(pt);\n } catch (cause) {\n throw new CryptoError('CRYPTO/DECRYPT_FAILED', 'AES-GCM decryption failed (wrong key or tampered data)', { cause });\n }\n}\n\n/** SHA-256 of arbitrary bytes. Returns 32-byte digest. */\nexport async function sha256(data: Uint8Array): Promise<Uint8Array> {\n const digest = await getCrypto().subtle.digest('SHA-256', toArrayBuffer(data));\n return new Uint8Array(digest);\n}\n","import { CryptoError } from '../errors/index.js';\nimport { ECIES_HKDF_INFO } from './constants.js';\n\nfunction getSubtle(): SubtleCrypto {\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (!c?.subtle) {\n throw new CryptoError('CRYPTO/UNSUPPORTED_CIPHER', 'Web Crypto (crypto.subtle) is not available');\n }\n return c.subtle;\n}\n\nfunction toArrayBuffer(u: Uint8Array): ArrayBuffer {\n const ab = new ArrayBuffer(u.byteLength);\n new Uint8Array(ab).set(u);\n return ab;\n}\n\n/**\n * HKDF-SHA256. Defaults match backend: empty salt, the ECIES domain separation info,\n * 32-byte output length. Pass custom values for other uses.\n */\nexport async function hkdfSha256(\n ikm: Uint8Array,\n length = 32,\n info: Uint8Array = ECIES_HKDF_INFO,\n salt: Uint8Array = new Uint8Array(0),\n): Promise<Uint8Array> {\n try {\n const subtle = getSubtle();\n const baseKey = await subtle.importKey('raw', toArrayBuffer(ikm), 'HKDF', false, ['deriveBits']);\n const derived = await subtle.deriveBits(\n {\n name: 'HKDF',\n hash: 'SHA-256',\n info: toArrayBuffer(info),\n salt: toArrayBuffer(salt),\n },\n baseKey,\n length * 8,\n );\n return new Uint8Array(derived);\n } catch (cause) {\n throw new CryptoError('CRYPTO/INVALID_KEY', 'HKDF derivation failed', { cause });\n }\n}\n","import { ethers } from 'ethers';\nimport { CryptoError } from '../errors/index.js';\n\nexport interface KeyPair {\n privateKey: string;\n publicKey: string;\n}\n\n/** Fresh secp256k1 keypair. Hex strings returned un-prefixed (no 0x). */\nexport function generateKeyPair(): KeyPair {\n const w = ethers.Wallet.createRandom();\n return {\n privateKey: w.privateKey.slice(2),\n publicKey: w.signingKey.publicKey.slice(2),\n };\n}\n\n/** Recover the uncompressed public key (un-prefixed hex) from a private key. */\nexport function derivePublicKey(privateKey: string): string {\n const sk = new ethers.SigningKey(`0x${strip(privateKey)}`);\n return sk.publicKey.slice(2);\n}\n\nexport function strip(hex: string): string {\n return hex.startsWith('0x') || hex.startsWith('0X') ? hex.slice(2) : hex;\n}\n\nexport function assertUncompressedPubKey(pub: string): void {\n const s = strip(pub);\n if (s.length !== 130 || !/^04/i.test(s)) {\n throw new CryptoError(\n 'CRYPTO/INVALID_KEY',\n 'expected uncompressed secp256k1 pubkey (65 bytes hex, starts with 04)',\n );\n }\n}\n\nexport function hexToBytes(hex: string): Uint8Array {\n const s = strip(hex);\n if (s.length % 2 !== 0) {\n throw new CryptoError('CRYPTO/INVALID_KEY', 'hex string has odd length');\n }\n const out = new Uint8Array(s.length / 2);\n for (let i = 0; i < out.length; i++) {\n const byte = Number.parseInt(s.substring(i * 2, i * 2 + 2), 16);\n if (Number.isNaN(byte)) {\n throw new CryptoError('CRYPTO/INVALID_KEY', `invalid hex byte at position ${i * 2}`);\n }\n out[i] = byte;\n }\n return out;\n}\n\nexport function bytesToHex(u: Uint8Array): string {\n return Array.from(u, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n","import { ethers } from 'ethers';\nimport { CryptoError } from '../errors/index.js';\nimport { aesDecrypt, aesEncrypt } from './aes.js';\nimport { ECIES_MIN_BLOB, ECIES_PUBKEY_LENGTH, KEY_LENGTH } from './constants.js';\nimport { hkdfSha256 } from './hkdf.js';\nimport { assertUncompressedPubKey, bytesToHex, hexToBytes, strip } from './keys.js';\n\n/**\n * ECIES-secp256k1 encrypt to a recipient's uncompressed public key.\n * Wire format: [65 ephemeral pubkey][12 IV][16 tag][ciphertext].\n * Byte-compatible with backend/src/services/crypto.ts.\n */\nexport async function eciesEncrypt(plaintext: Uint8Array, recipientPubKey: string): Promise<Uint8Array> {\n assertUncompressedPubKey(recipientPubKey);\n const ephemeral = ethers.Wallet.createRandom();\n const shared = deriveSharedSecretX(ephemeral.privateKey, `0x${strip(recipientPubKey)}`);\n const aesKey = await hkdfSha256(shared, KEY_LENGTH);\n const aesBlob = await aesEncrypt(plaintext, aesKey);\n const ephPub = hexToBytes(strip(ephemeral.signingKey.publicKey));\n if (ephPub.byteLength !== ECIES_PUBKEY_LENGTH) {\n throw new CryptoError('CRYPTO/INVALID_KEY', `ephemeral pubkey length ${ephPub.byteLength}`);\n }\n const blob = new Uint8Array(ECIES_PUBKEY_LENGTH + aesBlob.byteLength);\n blob.set(ephPub, 0);\n blob.set(aesBlob, ECIES_PUBKEY_LENGTH);\n return blob;\n}\n\n/** ECIES-secp256k1 decrypt with the recipient's private key. */\nexport async function eciesDecrypt(blob: Uint8Array, recipientPrivKey: string): Promise<Uint8Array> {\n if (blob.byteLength < ECIES_MIN_BLOB) {\n throw new CryptoError(\n 'CRYPTO/INTEGRITY_CHECK',\n `ECIES blob too short: need ≥${ECIES_MIN_BLOB} bytes, got ${blob.byteLength}`,\n );\n }\n const ephPub = blob.subarray(0, ECIES_PUBKEY_LENGTH);\n const aesBlob = blob.subarray(ECIES_PUBKEY_LENGTH);\n const shared = deriveSharedSecretX(`0x${strip(recipientPrivKey)}`, `0x${bytesToHex(ephPub)}`);\n const aesKey = await hkdfSha256(shared, KEY_LENGTH);\n return aesDecrypt(aesBlob, aesKey);\n}\n\n/**\n * Compute the ECDH shared secret X coordinate (32 bytes) between a private key\n * and a peer's public key. Matches Node createECDH.computeSecret() output used by\n * the backend — ethers v6 returns 0x04||X||Y, so we slice X.\n */\nfunction deriveSharedSecretX(privHex: string, pubHex: string): Uint8Array {\n const sk = new ethers.SigningKey(privHex);\n const shared = sk.computeSharedSecret(pubHex);\n const bytes = hexToBytes(strip(shared));\n if (bytes.byteLength !== 65 || bytes[0] !== 0x04) {\n throw new CryptoError(\n 'CRYPTO/INVALID_KEY',\n `unexpected shared secret shape (len=${bytes.byteLength}, prefix=${bytes[0]?.toString(16) ?? 'none'})`,\n );\n }\n return bytes.subarray(1, 33);\n}\n","export * from './constants.js';\nexport * from './aes.js';\nexport * from './ecies.js';\nexport * from './keys.js';\nexport * from './envelope.js';\nexport { hkdfSha256 } from './hkdf.js';\n","import { aesDecrypt, aesEncrypt, generateAesKey, hkdfSha256 } from '../crypto/index.js';\nimport { CryptoError } from '../errors/index.js';\nimport type { Address, Hex, TaskId, TaskKey, TaskKeyRef } from '../types.js';\nimport type { KeyStore } from './KeyStore.js';\n\nconst EXPORT_FORMAT = 'blindbounty.keystore.v1';\nconst EXPORT_INFO = new TextEncoder().encode('BlindBounty-Keystore-Export-v1');\n\ninterface Entry {\n aesKey: Uint8Array;\n createdAt: number;\n}\n\ninterface ExportShape {\n format: typeof EXPORT_FORMAT;\n salt: string;\n blob: string;\n}\n\ninterface PlainExport {\n keys: Array<{ taskId: string; aesKey: string; createdAt: number }>;\n peers: Array<{ addr: Address; pubkey: Hex }>;\n}\n\n/**\n * Default KeyStore. Non-persistent — keys live only for the process lifetime.\n * Export/import is encrypted with a passphrase via HKDF-derived AES-256-GCM,\n * so exported blobs are safe to move between processes.\n */\nexport class InMemoryKeyStore implements KeyStore {\n private readonly keys = new Map<string, Entry>();\n private readonly peers = new Map<Address, Hex>();\n\n async putTaskKey(taskId: TaskId, key: TaskKey): Promise<void> {\n this.keys.set(taskId.toString(), {\n aesKey: copy(key.aesKey),\n createdAt: key.createdAt.getTime(),\n });\n }\n\n async getTaskKey(taskId: TaskId): Promise<TaskKey | null> {\n const e = this.keys.get(taskId.toString());\n if (!e) return null;\n return { aesKey: copy(e.aesKey), createdAt: new Date(e.createdAt) };\n }\n\n async putPeerPubKey(addr: Address, pubkey: Hex): Promise<void> {\n this.peers.set(addr, pubkey);\n }\n\n async getPeerPubKey(addr: Address): Promise<Hex | null> {\n return this.peers.get(addr) ?? null;\n }\n\n async list(): Promise<TaskKeyRef[]> {\n return Array.from(this.keys.entries()).map(([id, e]) => ({\n taskId: BigInt(id),\n createdAt: new Date(e.createdAt),\n }));\n }\n\n async delete(taskId: TaskId): Promise<void> {\n this.keys.delete(taskId.toString());\n }\n\n async export(passphrase: string): Promise<string> {\n if (!passphrase || passphrase.length < 8) {\n throw new CryptoError('CRYPTO/INVALID_KEY', 'passphrase must be ≥8 characters');\n }\n const salt = randomBytes(16);\n const wrapKey = await deriveWrapKey(passphrase, salt);\n const plain: PlainExport = {\n keys: Array.from(this.keys.entries()).map(([taskId, e]) => ({\n taskId,\n aesKey: bytesToHex(e.aesKey),\n createdAt: e.createdAt,\n })),\n peers: Array.from(this.peers.entries()).map(([addr, pubkey]) => ({ addr, pubkey })),\n };\n const blob = await aesEncrypt(new TextEncoder().encode(JSON.stringify(plain)), wrapKey);\n const out: ExportShape = { format: EXPORT_FORMAT, salt: bytesToHex(salt), blob: bytesToHex(blob) };\n return JSON.stringify(out);\n }\n\n async import(data: string, passphrase: string): Promise<void> {\n let parsed: ExportShape;\n try {\n parsed = JSON.parse(data) as ExportShape;\n } catch (cause) {\n throw new CryptoError('CRYPTO/INTEGRITY_CHECK', 'keystore export is not valid JSON', { cause });\n }\n if (parsed.format !== EXPORT_FORMAT) {\n throw new CryptoError(\n 'CRYPTO/UNSUPPORTED_CIPHER',\n `unknown keystore export format: ${parsed.format ?? '(missing)'}`,\n );\n }\n const salt = hexToBytes(parsed.salt);\n const wrapKey = await deriveWrapKey(passphrase, salt);\n const blob = hexToBytes(parsed.blob);\n const plainBytes = await aesDecrypt(blob, wrapKey);\n const plain = JSON.parse(new TextDecoder().decode(plainBytes)) as PlainExport;\n this.keys.clear();\n this.peers.clear();\n for (const k of plain.keys) {\n this.keys.set(k.taskId, { aesKey: hexToBytes(k.aesKey), createdAt: k.createdAt });\n }\n for (const p of plain.peers) {\n this.peers.set(p.addr, p.pubkey);\n }\n }\n}\n\nfunction copy(u: Uint8Array): Uint8Array {\n const c = new Uint8Array(u.byteLength);\n c.set(u);\n return c;\n}\n\nfunction randomBytes(n: number): Uint8Array {\n const c = (globalThis as { crypto: Crypto }).crypto;\n const out = new Uint8Array(n);\n c.getRandomValues(out);\n return out;\n}\n\nasync function deriveWrapKey(passphrase: string, salt: Uint8Array): Promise<Uint8Array> {\n const ikm = new TextEncoder().encode(passphrase);\n return hkdfSha256(ikm, 32, EXPORT_INFO, salt);\n}\n\nfunction bytesToHex(u: Uint8Array): string {\n return Array.from(u, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < out.length; i++) {\n out[i] = Number.parseInt(hex.substring(i * 2, i * 2 + 2), 16);\n }\n return out;\n}\n\n// Tree-shakable helper kept here so we don't accidentally ship generateAesKey\n// from this module — it's re-exported from crypto only.\nexport { generateAesKey };\n"]}
@@ -1,23 +0,0 @@
1
- import { K as KeyStore } from '../KeyStore-Be_SSpCt.cjs';
2
- import { T as TaskId, a as TaskKey, A as Address, H as Hex, c as TaskKeyRef } from '../types-BOG5Ub1z.cjs';
3
- export { g as generateAesKey } from '../aes-J-7HrHze.cjs';
4
-
5
- /**
6
- * Default KeyStore. Non-persistent — keys live only for the process lifetime.
7
- * Export/import is encrypted with a passphrase via HKDF-derived AES-256-GCM,
8
- * so exported blobs are safe to move between processes.
9
- */
10
- declare class InMemoryKeyStore implements KeyStore {
11
- private readonly keys;
12
- private readonly peers;
13
- putTaskKey(taskId: TaskId, key: TaskKey): Promise<void>;
14
- getTaskKey(taskId: TaskId): Promise<TaskKey | null>;
15
- putPeerPubKey(addr: Address, pubkey: Hex): Promise<void>;
16
- getPeerPubKey(addr: Address): Promise<Hex | null>;
17
- list(): Promise<TaskKeyRef[]>;
18
- delete(taskId: TaskId): Promise<void>;
19
- export(passphrase: string): Promise<string>;
20
- import(data: string, passphrase: string): Promise<void>;
21
- }
22
-
23
- export { InMemoryKeyStore, KeyStore };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/crypto/constants.ts","../../src/errors/codes.ts","../../src/errors/BlindBountyError.ts","../../src/errors/subclasses.ts","../../src/errors/index.ts","../../src/crypto/aes.ts","../../src/crypto/hkdf.ts","../../src/crypto/keys.ts","../../src/crypto/ecies.ts","../../src/crypto/index.ts","../../src/keystore/InMemoryKeyStore.ts"],"names":["toArrayBuffer"],"mappings":"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","file":"index.js","sourcesContent":["export const IV_LENGTH = 12;\nexport const TAG_LENGTH = 16;\nexport const KEY_LENGTH = 32;\nexport const ECIES_PUBKEY_LENGTH = 65;\nexport const ECIES_HKDF_INFO = new TextEncoder().encode('BlindBounty-ECIES-v1');\nexport const AES_MIN_BLOB = IV_LENGTH + TAG_LENGTH;\nexport const ECIES_MIN_BLOB = ECIES_PUBKEY_LENGTH + AES_MIN_BLOB;\n","export const ErrorCodes = {\n Config: ['CONFIG/INVALID_NETWORK', 'CONFIG/MISSING_SIGNER', 'CONFIG/BAD_CONFIG'] as const,\n Crypto: [\n 'CRYPTO/INVALID_KEY',\n 'CRYPTO/DECRYPT_FAILED',\n 'CRYPTO/INTEGRITY_CHECK',\n 'CRYPTO/UNSUPPORTED_CIPHER',\n ] as const,\n Storage: [\n 'STORAGE/UPLOAD_FAILED',\n 'STORAGE/DOWNLOAD_FAILED',\n 'STORAGE/MERKLE_MISMATCH',\n 'STORAGE/NOT_FOUND',\n 'STORAGE/INDEXER_UNREACHABLE',\n ] as const,\n Chain: [\n 'CHAIN/TX_REVERTED',\n 'CHAIN/TX_TIMED_OUT',\n 'CHAIN/NONCE_CONFLICT',\n 'CHAIN/INSUFFICIENT_BALANCE',\n 'CHAIN/NETWORK_MISMATCH',\n 'CHAIN/CONTRACT_NOT_DEPLOYED',\n ] as const,\n Compute: [\n 'COMPUTE/BROKER_UNREACHABLE',\n 'COMPUTE/NO_PROVIDERS',\n 'COMPUTE/LEDGER_INSUFFICIENT',\n 'COMPUTE/TEE_ATTESTATION_INVALID',\n 'COMPUTE/VERIFICATION_TIMEOUT',\n ] as const,\n Api: [\n 'API/AUTH_REQUIRED',\n 'API/AUTH_EXPIRED',\n 'API/FORBIDDEN',\n 'API/RATE_LIMITED',\n 'API/VALIDATION',\n 'API/SERVER',\n 'API/NOT_FOUND',\n ] as const,\n Lifecycle: [\n 'LIFECYCLE/ILLEGAL_TRANSITION',\n 'LIFECYCLE/TASK_NOT_FOUND',\n 'LIFECYCLE/NOT_ASSIGNED',\n 'LIFECYCLE/ALREADY_SUBMITTED',\n 'LIFECYCLE/CLAIM_NOT_READY',\n ] as const,\n Timeout: ['TIMEOUT'] as const,\n} as const;\n\nexport type ConfigCode = (typeof ErrorCodes.Config)[number];\nexport type CryptoCode = (typeof ErrorCodes.Crypto)[number];\nexport type StorageCode = (typeof ErrorCodes.Storage)[number];\nexport type ChainCode = (typeof ErrorCodes.Chain)[number];\nexport type ComputeCode = (typeof ErrorCodes.Compute)[number];\nexport type ApiCode = (typeof ErrorCodes.Api)[number];\nexport type LifecycleCode = (typeof ErrorCodes.Lifecycle)[number];\nexport type TimeoutCode = (typeof ErrorCodes.Timeout)[number];\n\nexport type ErrorCode =\n | ConfigCode\n | CryptoCode\n | StorageCode\n | ChainCode\n | ComputeCode\n | ApiCode\n | LifecycleCode\n | TimeoutCode;\n","import type { ErrorCode } from './codes.js';\n\nexport interface ErrorOptions {\n retriable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n}\n\nexport abstract class BlindBountyError extends Error {\n readonly code: ErrorCode;\n readonly retriable: boolean;\n readonly context?: Record<string, unknown>;\n override readonly cause?: unknown;\n\n constructor(code: ErrorCode, message: string, opts: ErrorOptions = {}) {\n super(message);\n this.code = code;\n this.retriable = opts.retriable ?? false;\n if (opts.context !== undefined) this.context = opts.context;\n if (opts.cause !== undefined) this.cause = opts.cause;\n Object.defineProperty(this, 'name', {\n value: this.constructor.name,\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n retriable: this.retriable,\n ...(this.context ? { context: this.context } : {}),\n };\n }\n}\n","import { BlindBountyError, type ErrorOptions } from './BlindBountyError.js';\nimport type {\n ApiCode,\n ChainCode,\n ComputeCode,\n ConfigCode,\n CryptoCode,\n LifecycleCode,\n StorageCode,\n TimeoutCode,\n} from './codes.js';\n\nexport class ConfigError extends BlindBountyError {\n constructor(code: ConfigCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class CryptoError extends BlindBountyError {\n constructor(code: CryptoCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class StorageError extends BlindBountyError {\n constructor(code: StorageCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ChainError extends BlindBountyError {\n constructor(code: ChainCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ComputeError extends BlindBountyError {\n constructor(code: ComputeCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ApiError extends BlindBountyError {\n constructor(code: ApiCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class LifecycleError extends BlindBountyError {\n constructor(code: LifecycleCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class TimeoutError extends BlindBountyError {\n constructor(code: TimeoutCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n","export * from './codes.js';\nexport * from './BlindBountyError.js';\nexport * from './subclasses.js';\n","import { CryptoError } from '../errors/index.js';\nimport { AES_MIN_BLOB, IV_LENGTH, KEY_LENGTH, TAG_LENGTH } from './constants.js';\n\nfunction getCrypto(): Crypto {\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (!c?.subtle) {\n throw new CryptoError('CRYPTO/UNSUPPORTED_CIPHER', 'Web Crypto (crypto.subtle) is not available');\n }\n return c;\n}\n\nfunction toArrayBuffer(u: Uint8Array): ArrayBuffer {\n const ab = new ArrayBuffer(u.byteLength);\n new Uint8Array(ab).set(u);\n return ab;\n}\n\n/** Generate a fresh 32-byte AES-256 key. */\nexport async function generateAesKey(): Promise<Uint8Array> {\n const key = new Uint8Array(KEY_LENGTH);\n getCrypto().getRandomValues(key);\n return key;\n}\n\n/**\n * AES-256-GCM encrypt. Output format: [12 IV][16 tag][ciphertext].\n * This ordering matches backend/src/services/crypto.ts and frontend/src/lib/crypto.ts\n * byte-for-byte, so SDK blobs decrypt anywhere in the stack.\n */\nexport async function aesEncrypt(plaintext: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n if (key.byteLength !== KEY_LENGTH) {\n throw new CryptoError(\n 'CRYPTO/INVALID_KEY',\n `AES key must be ${KEY_LENGTH} bytes, got ${key.byteLength}`,\n );\n }\n const c = getCrypto();\n const iv = new Uint8Array(IV_LENGTH);\n c.getRandomValues(iv);\n try {\n const ck = await c.subtle.importKey('raw', toArrayBuffer(key), 'AES-GCM', false, ['encrypt']);\n const wcOut = new Uint8Array(\n await c.subtle.encrypt(\n { name: 'AES-GCM', iv: toArrayBuffer(iv), tagLength: TAG_LENGTH * 8 },\n ck,\n toArrayBuffer(plaintext),\n ),\n );\n // WebCrypto returns [ciphertext || tag]. Rewrite to [IV || tag || ciphertext].\n const ctLen = wcOut.length - TAG_LENGTH;\n const ct = wcOut.subarray(0, ctLen);\n const tag = wcOut.subarray(ctLen);\n const blob = new Uint8Array(IV_LENGTH + TAG_LENGTH + ctLen);\n blob.set(iv, 0);\n blob.set(tag, IV_LENGTH);\n blob.set(ct, IV_LENGTH + TAG_LENGTH);\n return blob;\n } catch (cause) {\n throw new CryptoError('CRYPTO/DECRYPT_FAILED', 'AES-GCM encryption failed', { cause });\n }\n}\n\n/**\n * AES-256-GCM decrypt. Input format: [12 IV][16 tag][ciphertext].\n * Throws CRYPTO/INTEGRITY_CHECK on truncation or tag mismatch.\n */\nexport async function aesDecrypt(blob: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n if (key.byteLength !== KEY_LENGTH) {\n throw new CryptoError(\n 'CRYPTO/INVALID_KEY',\n `AES key must be ${KEY_LENGTH} bytes, got ${key.byteLength}`,\n );\n }\n if (blob.byteLength < AES_MIN_BLOB) {\n throw new CryptoError(\n 'CRYPTO/INTEGRITY_CHECK',\n `AES blob too short: need ≥${AES_MIN_BLOB} bytes, got ${blob.byteLength}`,\n );\n }\n const iv = blob.subarray(0, IV_LENGTH);\n const tag = blob.subarray(IV_LENGTH, IV_LENGTH + TAG_LENGTH);\n const ct = blob.subarray(IV_LENGTH + TAG_LENGTH);\n const combined = new Uint8Array(ct.length + TAG_LENGTH);\n combined.set(ct, 0);\n combined.set(tag, ct.length);\n try {\n const c = getCrypto();\n const ck = await c.subtle.importKey('raw', toArrayBuffer(key), 'AES-GCM', false, ['decrypt']);\n const pt = await c.subtle.decrypt(\n { name: 'AES-GCM', iv: toArrayBuffer(iv), tagLength: TAG_LENGTH * 8 },\n ck,\n toArrayBuffer(combined),\n );\n return new Uint8Array(pt);\n } catch (cause) {\n throw new CryptoError('CRYPTO/DECRYPT_FAILED', 'AES-GCM decryption failed (wrong key or tampered data)', { cause });\n }\n}\n\n/** SHA-256 of arbitrary bytes. Returns 32-byte digest. */\nexport async function sha256(data: Uint8Array): Promise<Uint8Array> {\n const digest = await getCrypto().subtle.digest('SHA-256', toArrayBuffer(data));\n return new Uint8Array(digest);\n}\n","import { CryptoError } from '../errors/index.js';\nimport { ECIES_HKDF_INFO } from './constants.js';\n\nfunction getSubtle(): SubtleCrypto {\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (!c?.subtle) {\n throw new CryptoError('CRYPTO/UNSUPPORTED_CIPHER', 'Web Crypto (crypto.subtle) is not available');\n }\n return c.subtle;\n}\n\nfunction toArrayBuffer(u: Uint8Array): ArrayBuffer {\n const ab = new ArrayBuffer(u.byteLength);\n new Uint8Array(ab).set(u);\n return ab;\n}\n\n/**\n * HKDF-SHA256. Defaults match backend: empty salt, the ECIES domain separation info,\n * 32-byte output length. Pass custom values for other uses.\n */\nexport async function hkdfSha256(\n ikm: Uint8Array,\n length = 32,\n info: Uint8Array = ECIES_HKDF_INFO,\n salt: Uint8Array = new Uint8Array(0),\n): Promise<Uint8Array> {\n try {\n const subtle = getSubtle();\n const baseKey = await subtle.importKey('raw', toArrayBuffer(ikm), 'HKDF', false, ['deriveBits']);\n const derived = await subtle.deriveBits(\n {\n name: 'HKDF',\n hash: 'SHA-256',\n info: toArrayBuffer(info),\n salt: toArrayBuffer(salt),\n },\n baseKey,\n length * 8,\n );\n return new Uint8Array(derived);\n } catch (cause) {\n throw new CryptoError('CRYPTO/INVALID_KEY', 'HKDF derivation failed', { cause });\n }\n}\n","import { ethers } from 'ethers';\nimport { CryptoError } from '../errors/index.js';\n\nexport interface KeyPair {\n privateKey: string;\n publicKey: string;\n}\n\n/** Fresh secp256k1 keypair. Hex strings returned un-prefixed (no 0x). */\nexport function generateKeyPair(): KeyPair {\n const w = ethers.Wallet.createRandom();\n return {\n privateKey: w.privateKey.slice(2),\n publicKey: w.signingKey.publicKey.slice(2),\n };\n}\n\n/** Recover the uncompressed public key (un-prefixed hex) from a private key. */\nexport function derivePublicKey(privateKey: string): string {\n const sk = new ethers.SigningKey(`0x${strip(privateKey)}`);\n return sk.publicKey.slice(2);\n}\n\nexport function strip(hex: string): string {\n return hex.startsWith('0x') || hex.startsWith('0X') ? hex.slice(2) : hex;\n}\n\nexport function assertUncompressedPubKey(pub: string): void {\n const s = strip(pub);\n if (s.length !== 130 || !/^04/i.test(s)) {\n throw new CryptoError(\n 'CRYPTO/INVALID_KEY',\n 'expected uncompressed secp256k1 pubkey (65 bytes hex, starts with 04)',\n );\n }\n}\n\nexport function hexToBytes(hex: string): Uint8Array {\n const s = strip(hex);\n if (s.length % 2 !== 0) {\n throw new CryptoError('CRYPTO/INVALID_KEY', 'hex string has odd length');\n }\n const out = new Uint8Array(s.length / 2);\n for (let i = 0; i < out.length; i++) {\n const byte = Number.parseInt(s.substring(i * 2, i * 2 + 2), 16);\n if (Number.isNaN(byte)) {\n throw new CryptoError('CRYPTO/INVALID_KEY', `invalid hex byte at position ${i * 2}`);\n }\n out[i] = byte;\n }\n return out;\n}\n\nexport function bytesToHex(u: Uint8Array): string {\n return Array.from(u, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n","import { ethers } from 'ethers';\nimport { CryptoError } from '../errors/index.js';\nimport { aesDecrypt, aesEncrypt } from './aes.js';\nimport { ECIES_MIN_BLOB, ECIES_PUBKEY_LENGTH, KEY_LENGTH } from './constants.js';\nimport { hkdfSha256 } from './hkdf.js';\nimport { assertUncompressedPubKey, bytesToHex, hexToBytes, strip } from './keys.js';\n\n/**\n * ECIES-secp256k1 encrypt to a recipient's uncompressed public key.\n * Wire format: [65 ephemeral pubkey][12 IV][16 tag][ciphertext].\n * Byte-compatible with backend/src/services/crypto.ts.\n */\nexport async function eciesEncrypt(plaintext: Uint8Array, recipientPubKey: string): Promise<Uint8Array> {\n assertUncompressedPubKey(recipientPubKey);\n const ephemeral = ethers.Wallet.createRandom();\n const shared = deriveSharedSecretX(ephemeral.privateKey, `0x${strip(recipientPubKey)}`);\n const aesKey = await hkdfSha256(shared, KEY_LENGTH);\n const aesBlob = await aesEncrypt(plaintext, aesKey);\n const ephPub = hexToBytes(strip(ephemeral.signingKey.publicKey));\n if (ephPub.byteLength !== ECIES_PUBKEY_LENGTH) {\n throw new CryptoError('CRYPTO/INVALID_KEY', `ephemeral pubkey length ${ephPub.byteLength}`);\n }\n const blob = new Uint8Array(ECIES_PUBKEY_LENGTH + aesBlob.byteLength);\n blob.set(ephPub, 0);\n blob.set(aesBlob, ECIES_PUBKEY_LENGTH);\n return blob;\n}\n\n/** ECIES-secp256k1 decrypt with the recipient's private key. */\nexport async function eciesDecrypt(blob: Uint8Array, recipientPrivKey: string): Promise<Uint8Array> {\n if (blob.byteLength < ECIES_MIN_BLOB) {\n throw new CryptoError(\n 'CRYPTO/INTEGRITY_CHECK',\n `ECIES blob too short: need ≥${ECIES_MIN_BLOB} bytes, got ${blob.byteLength}`,\n );\n }\n const ephPub = blob.subarray(0, ECIES_PUBKEY_LENGTH);\n const aesBlob = blob.subarray(ECIES_PUBKEY_LENGTH);\n const shared = deriveSharedSecretX(`0x${strip(recipientPrivKey)}`, `0x${bytesToHex(ephPub)}`);\n const aesKey = await hkdfSha256(shared, KEY_LENGTH);\n return aesDecrypt(aesBlob, aesKey);\n}\n\n/**\n * Compute the ECDH shared secret X coordinate (32 bytes) between a private key\n * and a peer's public key. Matches Node createECDH.computeSecret() output used by\n * the backend — ethers v6 returns 0x04||X||Y, so we slice X.\n */\nfunction deriveSharedSecretX(privHex: string, pubHex: string): Uint8Array {\n const sk = new ethers.SigningKey(privHex);\n const shared = sk.computeSharedSecret(pubHex);\n const bytes = hexToBytes(strip(shared));\n if (bytes.byteLength !== 65 || bytes[0] !== 0x04) {\n throw new CryptoError(\n 'CRYPTO/INVALID_KEY',\n `unexpected shared secret shape (len=${bytes.byteLength}, prefix=${bytes[0]?.toString(16) ?? 'none'})`,\n );\n }\n return bytes.subarray(1, 33);\n}\n","export * from './constants.js';\nexport * from './aes.js';\nexport * from './ecies.js';\nexport * from './keys.js';\nexport * from './envelope.js';\nexport { hkdfSha256 } from './hkdf.js';\n","import { aesDecrypt, aesEncrypt, generateAesKey, hkdfSha256 } from '../crypto/index.js';\nimport { CryptoError } from '../errors/index.js';\nimport type { Address, Hex, TaskId, TaskKey, TaskKeyRef } from '../types.js';\nimport type { KeyStore } from './KeyStore.js';\n\nconst EXPORT_FORMAT = 'blindbounty.keystore.v1';\nconst EXPORT_INFO = new TextEncoder().encode('BlindBounty-Keystore-Export-v1');\n\ninterface Entry {\n aesKey: Uint8Array;\n createdAt: number;\n}\n\ninterface ExportShape {\n format: typeof EXPORT_FORMAT;\n salt: string;\n blob: string;\n}\n\ninterface PlainExport {\n keys: Array<{ taskId: string; aesKey: string; createdAt: number }>;\n peers: Array<{ addr: Address; pubkey: Hex }>;\n}\n\n/**\n * Default KeyStore. Non-persistent — keys live only for the process lifetime.\n * Export/import is encrypted with a passphrase via HKDF-derived AES-256-GCM,\n * so exported blobs are safe to move between processes.\n */\nexport class InMemoryKeyStore implements KeyStore {\n private readonly keys = new Map<string, Entry>();\n private readonly peers = new Map<Address, Hex>();\n\n async putTaskKey(taskId: TaskId, key: TaskKey): Promise<void> {\n this.keys.set(taskId.toString(), {\n aesKey: copy(key.aesKey),\n createdAt: key.createdAt.getTime(),\n });\n }\n\n async getTaskKey(taskId: TaskId): Promise<TaskKey | null> {\n const e = this.keys.get(taskId.toString());\n if (!e) return null;\n return { aesKey: copy(e.aesKey), createdAt: new Date(e.createdAt) };\n }\n\n async putPeerPubKey(addr: Address, pubkey: Hex): Promise<void> {\n this.peers.set(addr, pubkey);\n }\n\n async getPeerPubKey(addr: Address): Promise<Hex | null> {\n return this.peers.get(addr) ?? null;\n }\n\n async list(): Promise<TaskKeyRef[]> {\n return Array.from(this.keys.entries()).map(([id, e]) => ({\n taskId: BigInt(id),\n createdAt: new Date(e.createdAt),\n }));\n }\n\n async delete(taskId: TaskId): Promise<void> {\n this.keys.delete(taskId.toString());\n }\n\n async export(passphrase: string): Promise<string> {\n if (!passphrase || passphrase.length < 8) {\n throw new CryptoError('CRYPTO/INVALID_KEY', 'passphrase must be ≥8 characters');\n }\n const salt = randomBytes(16);\n const wrapKey = await deriveWrapKey(passphrase, salt);\n const plain: PlainExport = {\n keys: Array.from(this.keys.entries()).map(([taskId, e]) => ({\n taskId,\n aesKey: bytesToHex(e.aesKey),\n createdAt: e.createdAt,\n })),\n peers: Array.from(this.peers.entries()).map(([addr, pubkey]) => ({ addr, pubkey })),\n };\n const blob = await aesEncrypt(new TextEncoder().encode(JSON.stringify(plain)), wrapKey);\n const out: ExportShape = { format: EXPORT_FORMAT, salt: bytesToHex(salt), blob: bytesToHex(blob) };\n return JSON.stringify(out);\n }\n\n async import(data: string, passphrase: string): Promise<void> {\n let parsed: ExportShape;\n try {\n parsed = JSON.parse(data) as ExportShape;\n } catch (cause) {\n throw new CryptoError('CRYPTO/INTEGRITY_CHECK', 'keystore export is not valid JSON', { cause });\n }\n if (parsed.format !== EXPORT_FORMAT) {\n throw new CryptoError(\n 'CRYPTO/UNSUPPORTED_CIPHER',\n `unknown keystore export format: ${parsed.format ?? '(missing)'}`,\n );\n }\n const salt = hexToBytes(parsed.salt);\n const wrapKey = await deriveWrapKey(passphrase, salt);\n const blob = hexToBytes(parsed.blob);\n const plainBytes = await aesDecrypt(blob, wrapKey);\n const plain = JSON.parse(new TextDecoder().decode(plainBytes)) as PlainExport;\n this.keys.clear();\n this.peers.clear();\n for (const k of plain.keys) {\n this.keys.set(k.taskId, { aesKey: hexToBytes(k.aesKey), createdAt: k.createdAt });\n }\n for (const p of plain.peers) {\n this.peers.set(p.addr, p.pubkey);\n }\n }\n}\n\nfunction copy(u: Uint8Array): Uint8Array {\n const c = new Uint8Array(u.byteLength);\n c.set(u);\n return c;\n}\n\nfunction randomBytes(n: number): Uint8Array {\n const c = (globalThis as { crypto: Crypto }).crypto;\n const out = new Uint8Array(n);\n c.getRandomValues(out);\n return out;\n}\n\nasync function deriveWrapKey(passphrase: string, salt: Uint8Array): Promise<Uint8Array> {\n const ikm = new TextEncoder().encode(passphrase);\n return hkdfSha256(ikm, 32, EXPORT_INFO, salt);\n}\n\nfunction bytesToHex(u: Uint8Array): string {\n return Array.from(u, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < out.length; i++) {\n out[i] = Number.parseInt(hex.substring(i * 2, i * 2 + 2), 16);\n }\n return out;\n}\n\n// Tree-shakable helper kept here so we don't accidentally ship generateAesKey\n// from this module — it's re-exported from crypto only.\nexport { generateAesKey };\n"]}
@@ -1,74 +0,0 @@
1
- 'use strict';
2
-
3
- // src/network/presets.ts
4
- var networks = {
5
- testnet: {
6
- name: "0g-galileo-testnet",
7
- chainId: 16602n,
8
- rpc: ["https://evmrpc-testnet.0g.ai"],
9
- contracts: {
10
- escrow: "0xFd4F93F5A7BE144c405D1D8fbEC63Fb776207681",
11
- registry: "0xeE52d780A47F77E8a4a1cEb236e3C65A48FbD828",
12
- reputation: "0x4A6374Fae37E19E69ba43E7cf6994AC15F63256e",
13
- usdc: "0x317227efcA18D004E12CA8046AEf7E1597458F25"
14
- },
15
- indexer: "https://indexer-storage-testnet-turbo.0g.ai",
16
- broker: "https://broker.testnet.0g.ai",
17
- explorer: "https://chainscan-galileo.0g.ai"
18
- }
19
- };
20
-
21
- // src/errors/BlindBountyError.ts
22
- var BlindBountyError = class extends Error {
23
- code;
24
- retriable;
25
- context;
26
- cause;
27
- constructor(code, message, opts = {}) {
28
- super(message);
29
- this.code = code;
30
- this.retriable = opts.retriable ?? false;
31
- if (opts.context !== void 0) this.context = opts.context;
32
- if (opts.cause !== void 0) this.cause = opts.cause;
33
- Object.defineProperty(this, "name", {
34
- value: this.constructor.name,
35
- enumerable: false,
36
- configurable: true,
37
- writable: true
38
- });
39
- }
40
- toJSON() {
41
- return {
42
- name: this.name,
43
- code: this.code,
44
- message: this.message,
45
- retriable: this.retriable,
46
- ...this.context ? { context: this.context } : {}
47
- };
48
- }
49
- };
50
-
51
- // src/errors/subclasses.ts
52
- var ConfigError = class extends BlindBountyError {
53
- constructor(code, msg, opts) {
54
- super(code, msg, opts);
55
- }
56
- };
57
-
58
- // src/network/resolve.ts
59
- function resolveNetwork(arg) {
60
- if (typeof arg === "string") {
61
- const preset = networks[arg];
62
- if (!preset) {
63
- const known = Object.keys(networks).join(", ");
64
- throw new ConfigError("CONFIG/INVALID_NETWORK", `unknown network '${arg}' (known: ${known})`);
65
- }
66
- return preset;
67
- }
68
- return arg;
69
- }
70
-
71
- exports.networks = networks;
72
- exports.resolveNetwork = resolveNetwork;
73
- //# sourceMappingURL=index.cjs.map
74
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/network/presets.ts","../../src/errors/BlindBountyError.ts","../../src/errors/subclasses.ts","../../src/network/resolve.ts"],"names":[],"mappings":";;;AASO,IAAM,QAAA,GAAW;AAAA,EACtB,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,oBAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,GAAA,EAAK,CAAC,8BAA8B,CAAA;AAAA,IACpC,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ,4CAAA;AAAA,MACR,QAAA,EAAU,4CAAA;AAAA,MACV,UAAA,EAAY,4CAAA;AAAA,MACZ,IAAA,EAAM;AAAA,KACR;AAAA,IACA,OAAA,EAAS,6CAAA;AAAA,IACT,MAAA,EAAQ,8BAAA;AAAA,IACR,QAAA,EAAU;AAAA;AAEd;;;AChBO,IAAe,gBAAA,GAAf,cAAwC,KAAA,CAAM;AAAA,EAC1C,IAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACS,KAAA;AAAA,EAElB,WAAA,CAAY,IAAA,EAAiB,OAAA,EAAiB,IAAA,GAAqB,EAAC,EAAG;AACrE,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,KAAA;AACnC,IAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpD,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAChD,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,MAAA,EAAQ;AAAA,MAClC,KAAA,EAAO,KAAK,WAAA,CAAY,IAAA;AAAA,MACxB,UAAA,EAAY,KAAA;AAAA,MACZ,YAAA,EAAc,IAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,GAAI,KAAK,OAAA,GAAU,EAAE,SAAS,IAAA,CAAK,OAAA,KAAY;AAAC,KAClD;AAAA,EACF;AACF,CAAA;;;ACzBO,IAAM,WAAA,GAAN,cAA0B,gBAAA,CAAiB;AAAA,EAChD,WAAA,CAAY,IAAA,EAAkB,GAAA,EAAa,IAAA,EAAqB;AAC9D,IAAA,KAAA,CAAM,IAAA,EAAM,KAAK,IAAI,CAAA;AAAA,EACvB;AACF,CAAA;;;ACRO,SAAS,eAAe,GAAA,EAAqC;AAClE,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,MAAA,GAAU,SAAiD,GAAG,CAAA;AACpE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAK,IAAI,CAAA;AAC7C,MAAA,MAAM,IAAI,WAAA,CAAY,wBAAA,EAA0B,oBAAoB,GAAG,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9F;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT","file":"index.cjs","sourcesContent":["import type { Network } from './types.js';\n\n/**\n * Known-good network presets. Addresses pinned per SDK version so upgrading\n * the SDK cannot silently move contracts under a consumer.\n *\n * testnet = 0G Galileo (chainId 16602) — addresses from\n * contracts/deployments/0g-testnet.json (deployed 2026-04-15).\n */\nexport const networks = {\n testnet: {\n name: '0g-galileo-testnet',\n chainId: 16602n,\n rpc: ['https://evmrpc-testnet.0g.ai'],\n contracts: {\n escrow: '0xFd4F93F5A7BE144c405D1D8fbEC63Fb776207681',\n registry: '0xeE52d780A47F77E8a4a1cEb236e3C65A48FbD828',\n reputation: '0x4A6374Fae37E19E69ba43E7cf6994AC15F63256e',\n usdc: '0x317227efcA18D004E12CA8046AEf7E1597458F25',\n },\n indexer: 'https://indexer-storage-testnet-turbo.0g.ai',\n broker: 'https://broker.testnet.0g.ai',\n explorer: 'https://chainscan-galileo.0g.ai',\n },\n} as const satisfies Record<string, Network>;\n\nexport type NetworkName = keyof typeof networks;\n","import type { ErrorCode } from './codes.js';\n\nexport interface ErrorOptions {\n retriable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n}\n\nexport abstract class BlindBountyError extends Error {\n readonly code: ErrorCode;\n readonly retriable: boolean;\n readonly context?: Record<string, unknown>;\n override readonly cause?: unknown;\n\n constructor(code: ErrorCode, message: string, opts: ErrorOptions = {}) {\n super(message);\n this.code = code;\n this.retriable = opts.retriable ?? false;\n if (opts.context !== undefined) this.context = opts.context;\n if (opts.cause !== undefined) this.cause = opts.cause;\n Object.defineProperty(this, 'name', {\n value: this.constructor.name,\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n retriable: this.retriable,\n ...(this.context ? { context: this.context } : {}),\n };\n }\n}\n","import { BlindBountyError, type ErrorOptions } from './BlindBountyError.js';\nimport type {\n ApiCode,\n ChainCode,\n ComputeCode,\n ConfigCode,\n CryptoCode,\n LifecycleCode,\n StorageCode,\n TimeoutCode,\n} from './codes.js';\n\nexport class ConfigError extends BlindBountyError {\n constructor(code: ConfigCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class CryptoError extends BlindBountyError {\n constructor(code: CryptoCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class StorageError extends BlindBountyError {\n constructor(code: StorageCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ChainError extends BlindBountyError {\n constructor(code: ChainCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ComputeError extends BlindBountyError {\n constructor(code: ComputeCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ApiError extends BlindBountyError {\n constructor(code: ApiCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class LifecycleError extends BlindBountyError {\n constructor(code: LifecycleCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class TimeoutError extends BlindBountyError {\n constructor(code: TimeoutCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n","import { ConfigError } from '../errors/index.js';\nimport { networks, type NetworkName } from './presets.js';\nimport type { Network } from './types.js';\n\n/**\n * Resolve a preset name or a literal Network object into the canonical\n * Network used throughout the SDK. Throws ConfigError for unknown names.\n */\nexport function resolveNetwork(arg: NetworkName | Network): Network {\n if (typeof arg === 'string') {\n const preset = (networks as Record<string, Network | undefined>)[arg];\n if (!preset) {\n const known = Object.keys(networks).join(', ');\n throw new ConfigError('CONFIG/INVALID_NETWORK', `unknown network '${arg}' (known: ${known})`);\n }\n return preset;\n }\n return arg;\n}\n"]}
@@ -1,36 +0,0 @@
1
- import { N as Network } from '../types-V7_ZmUb-.cjs';
2
- export { a as NetworkContracts } from '../types-V7_ZmUb-.cjs';
3
- import '../types-BOG5Ub1z.cjs';
4
-
5
- /**
6
- * Known-good network presets. Addresses pinned per SDK version so upgrading
7
- * the SDK cannot silently move contracts under a consumer.
8
- *
9
- * testnet = 0G Galileo (chainId 16602) — addresses from
10
- * contracts/deployments/0g-testnet.json (deployed 2026-04-15).
11
- */
12
- declare const networks: {
13
- readonly testnet: {
14
- readonly name: "0g-galileo-testnet";
15
- readonly chainId: 16602n;
16
- readonly rpc: ["https://evmrpc-testnet.0g.ai"];
17
- readonly contracts: {
18
- readonly escrow: "0xFd4F93F5A7BE144c405D1D8fbEC63Fb776207681";
19
- readonly registry: "0xeE52d780A47F77E8a4a1cEb236e3C65A48FbD828";
20
- readonly reputation: "0x4A6374Fae37E19E69ba43E7cf6994AC15F63256e";
21
- readonly usdc: "0x317227efcA18D004E12CA8046AEf7E1597458F25";
22
- };
23
- readonly indexer: "https://indexer-storage-testnet-turbo.0g.ai";
24
- readonly broker: "https://broker.testnet.0g.ai";
25
- readonly explorer: "https://chainscan-galileo.0g.ai";
26
- };
27
- };
28
- type NetworkName = keyof typeof networks;
29
-
30
- /**
31
- * Resolve a preset name or a literal Network object into the canonical
32
- * Network used throughout the SDK. Throws ConfigError for unknown names.
33
- */
34
- declare function resolveNetwork(arg: NetworkName | Network): Network;
35
-
36
- export { Network, type NetworkName, networks, resolveNetwork };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/network/presets.ts","../../src/errors/BlindBountyError.ts","../../src/errors/subclasses.ts","../../src/network/resolve.ts"],"names":[],"mappings":";AASO,IAAM,QAAA,GAAW;AAAA,EACtB,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,oBAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,GAAA,EAAK,CAAC,8BAA8B,CAAA;AAAA,IACpC,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ,4CAAA;AAAA,MACR,QAAA,EAAU,4CAAA;AAAA,MACV,UAAA,EAAY,4CAAA;AAAA,MACZ,IAAA,EAAM;AAAA,KACR;AAAA,IACA,OAAA,EAAS,6CAAA;AAAA,IACT,MAAA,EAAQ,8BAAA;AAAA,IACR,QAAA,EAAU;AAAA;AAEd;;;AChBO,IAAe,gBAAA,GAAf,cAAwC,KAAA,CAAM;AAAA,EAC1C,IAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACS,KAAA;AAAA,EAElB,WAAA,CAAY,IAAA,EAAiB,OAAA,EAAiB,IAAA,GAAqB,EAAC,EAAG;AACrE,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,KAAA;AACnC,IAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpD,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAChD,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,MAAA,EAAQ;AAAA,MAClC,KAAA,EAAO,KAAK,WAAA,CAAY,IAAA;AAAA,MACxB,UAAA,EAAY,KAAA;AAAA,MACZ,YAAA,EAAc,IAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,GAAI,KAAK,OAAA,GAAU,EAAE,SAAS,IAAA,CAAK,OAAA,KAAY;AAAC,KAClD;AAAA,EACF;AACF,CAAA;;;ACzBO,IAAM,WAAA,GAAN,cAA0B,gBAAA,CAAiB;AAAA,EAChD,WAAA,CAAY,IAAA,EAAkB,GAAA,EAAa,IAAA,EAAqB;AAC9D,IAAA,KAAA,CAAM,IAAA,EAAM,KAAK,IAAI,CAAA;AAAA,EACvB;AACF,CAAA;;;ACRO,SAAS,eAAe,GAAA,EAAqC;AAClE,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,MAAA,GAAU,SAAiD,GAAG,CAAA;AACpE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAK,IAAI,CAAA;AAC7C,MAAA,MAAM,IAAI,WAAA,CAAY,wBAAA,EAA0B,oBAAoB,GAAG,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9F;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT","file":"index.js","sourcesContent":["import type { Network } from './types.js';\n\n/**\n * Known-good network presets. Addresses pinned per SDK version so upgrading\n * the SDK cannot silently move contracts under a consumer.\n *\n * testnet = 0G Galileo (chainId 16602) — addresses from\n * contracts/deployments/0g-testnet.json (deployed 2026-04-15).\n */\nexport const networks = {\n testnet: {\n name: '0g-galileo-testnet',\n chainId: 16602n,\n rpc: ['https://evmrpc-testnet.0g.ai'],\n contracts: {\n escrow: '0xFd4F93F5A7BE144c405D1D8fbEC63Fb776207681',\n registry: '0xeE52d780A47F77E8a4a1cEb236e3C65A48FbD828',\n reputation: '0x4A6374Fae37E19E69ba43E7cf6994AC15F63256e',\n usdc: '0x317227efcA18D004E12CA8046AEf7E1597458F25',\n },\n indexer: 'https://indexer-storage-testnet-turbo.0g.ai',\n broker: 'https://broker.testnet.0g.ai',\n explorer: 'https://chainscan-galileo.0g.ai',\n },\n} as const satisfies Record<string, Network>;\n\nexport type NetworkName = keyof typeof networks;\n","import type { ErrorCode } from './codes.js';\n\nexport interface ErrorOptions {\n retriable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n}\n\nexport abstract class BlindBountyError extends Error {\n readonly code: ErrorCode;\n readonly retriable: boolean;\n readonly context?: Record<string, unknown>;\n override readonly cause?: unknown;\n\n constructor(code: ErrorCode, message: string, opts: ErrorOptions = {}) {\n super(message);\n this.code = code;\n this.retriable = opts.retriable ?? false;\n if (opts.context !== undefined) this.context = opts.context;\n if (opts.cause !== undefined) this.cause = opts.cause;\n Object.defineProperty(this, 'name', {\n value: this.constructor.name,\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n retriable: this.retriable,\n ...(this.context ? { context: this.context } : {}),\n };\n }\n}\n","import { BlindBountyError, type ErrorOptions } from './BlindBountyError.js';\nimport type {\n ApiCode,\n ChainCode,\n ComputeCode,\n ConfigCode,\n CryptoCode,\n LifecycleCode,\n StorageCode,\n TimeoutCode,\n} from './codes.js';\n\nexport class ConfigError extends BlindBountyError {\n constructor(code: ConfigCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class CryptoError extends BlindBountyError {\n constructor(code: CryptoCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class StorageError extends BlindBountyError {\n constructor(code: StorageCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ChainError extends BlindBountyError {\n constructor(code: ChainCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ComputeError extends BlindBountyError {\n constructor(code: ComputeCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ApiError extends BlindBountyError {\n constructor(code: ApiCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class LifecycleError extends BlindBountyError {\n constructor(code: LifecycleCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class TimeoutError extends BlindBountyError {\n constructor(code: TimeoutCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n","import { ConfigError } from '../errors/index.js';\nimport { networks, type NetworkName } from './presets.js';\nimport type { Network } from './types.js';\n\n/**\n * Resolve a preset name or a literal Network object into the canonical\n * Network used throughout the SDK. Throws ConfigError for unknown names.\n */\nexport function resolveNetwork(arg: NetworkName | Network): Network {\n if (typeof arg === 'string') {\n const preset = (networks as Record<string, Network | undefined>)[arg];\n if (!preset) {\n const known = Object.keys(networks).join(', ');\n throw new ConfigError('CONFIG/INVALID_NETWORK', `unknown network '${arg}' (known: ${known})`);\n }\n return preset;\n }\n return arg;\n}\n"]}