zeldhash-miner 0.2.0 → 0.2.2

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.
package/dist/worker.js CHANGED
@@ -43,21 +43,21 @@ const R = (1n << 64n) - 1n, K = (t) => {
43
43
  const n = t + BigInt(e - 1);
44
44
  if (n > R)
45
45
  throw new Error("nonce range exceeds u64");
46
- const r = [];
47
- let i = t;
48
- for (; i <= n; ) {
49
- const o = K(i), s = X(o), c = n < s ? n : s, f = c - i + 1n;
50
- if (f > BigInt(Number.MAX_SAFE_INTEGER))
46
+ const i = [];
47
+ let r = t;
48
+ for (; r <= n; ) {
49
+ const s = K(r), o = X(s), a = n < o ? n : o, l = a - r + 1n;
50
+ if (l > BigInt(Number.MAX_SAFE_INTEGER))
51
51
  throw new Error("segment size exceeds safe integer range");
52
- if (r.push({
53
- start: i,
54
- size: Number(f),
55
- nonceLength: o
56
- }), c === n)
52
+ if (i.push({
53
+ start: r,
54
+ size: Number(l),
55
+ nonceLength: s
56
+ }), a === n)
57
57
  break;
58
- i = c + 1n;
58
+ r = a + 1n;
59
59
  }
60
- return r;
60
+ return i;
61
61
  }, J = (t, e) => {
62
62
  if (t < 0n)
63
63
  throw new Error("startNonce must be non-negative");
@@ -66,48 +66,55 @@ const R = (1n << 64n) - 1n, K = (t) => {
66
66
  const n = t + BigInt(e - 1);
67
67
  if (n > R)
68
68
  throw new Error("nonce range exceeds u64");
69
- const r = [];
70
- let i = t;
71
- for (; i <= n; ) {
72
- const o = H(i), s = j(o), c = n < s ? n : s, f = c - i + 1n;
73
- if (f > BigInt(Number.MAX_SAFE_INTEGER))
69
+ const i = [];
70
+ let r = t;
71
+ for (; r <= n; ) {
72
+ const s = H(r), o = j(s), a = n < o ? n : o, l = a - r + 1n;
73
+ if (l > BigInt(Number.MAX_SAFE_INTEGER))
74
74
  throw new Error("segment size exceeds safe integer range");
75
- if (r.push({
76
- start: i,
77
- size: Number(f),
78
- nonceLength: o
79
- }), c === n)
75
+ if (i.push({
76
+ start: r,
77
+ size: Number(l),
78
+ nonceLength: s
79
+ }), a === n)
80
80
  break;
81
- i = c + 1n;
81
+ r = a + 1n;
82
82
  }
83
- return r;
83
+ return i;
84
84
  }, Q = {};
85
- let U = null, d = null, x = !1;
85
+ if (typeof globalThis.__ZELDMINER_WASM_BASE__ > "u")
86
+ try {
87
+ const t = typeof window < "u" && window.location?.origin ? window.location.origin : typeof self < "u" && self.location?.origin ? self.location.origin : "http://localhost";
88
+ globalThis.__ZELDMINER_WASM_BASE__ = new URL("/wasm/", t).href;
89
+ } catch {
90
+ globalThis.__ZELDMINER_WASM_BASE__ = "/wasm/";
91
+ }
92
+ let y = null, d = null, O = !1;
86
93
  const Z = () => {
87
- if (x) return;
88
- x = !0;
94
+ if (O) return;
95
+ O = !0;
89
96
  const t = globalThis.GPUAdapter?.prototype, e = t?.requestDevice;
90
- !t || typeof e != "function" || (t.requestDevice = function(r) {
91
- if (r?.requiredLimits && typeof this.limits == "object") {
92
- const i = r.requiredLimits, o = this.limits;
93
- for (const s of Object.keys(i))
94
- (!(s in o) || o[s] === void 0) && delete i[s];
97
+ !t || typeof e != "function" || (t.requestDevice = function(i) {
98
+ if (i?.requiredLimits && typeof this.limits == "object") {
99
+ const r = i.requiredLimits, s = this.limits;
100
+ for (const o of Object.keys(r))
101
+ (!(o in s) || s[o] === void 0) && delete r[o];
95
102
  }
96
- return e.call(this, r);
103
+ return e.call(this, i);
97
104
  });
98
- }, y = (t) => t.endsWith("/") ? t : `${t}/`, I = (t) => {
105
+ }, U = (t) => t.endsWith("/") ? t : `${t}/`, A = (t) => {
99
106
  const e = t.trim();
100
- return e && (typeof window < "u" && typeof window.location?.origin == "string" ? y(new URL(e, window.location.origin).href) : y(new URL(e, import.meta.url).href));
107
+ return e && (typeof window < "u" && typeof window.location?.origin == "string" ? U(new URL(e, window.location.origin).href) : U(new URL(e, import.meta.url).href));
101
108
  }, tt = () => {
102
109
  const t = globalThis.__ZELDMINER_WASM_BASE__;
103
110
  if (typeof t == "string" && t.trim())
104
- return I(t);
111
+ return A(t);
105
112
  const e = Q?.VITE_ZELDMINER_WASM_BASE;
106
113
  if (typeof e == "string" && e.trim())
107
- return I(e);
108
- const n = "/";
109
- return n.trim() ? I(`${y(n.trim())}wasm/`) : I("/wasm/");
110
- }, M = tt(), W = `${M}zeldhash_miner_wasm.js`, et = `${M}zeldhash_miner_wasm_bg.wasm`, z = (t) => t instanceof Error ? t.message : String(t), nt = async () => {
114
+ return A(e);
115
+ const n = "./";
116
+ return n.trim() ? A(`${U(n.trim())}wasm/`) : A("/wasm/");
117
+ }, z = tt(), W = `${z}zeldhash_miner_wasm.js`, et = `${z}zeldhash_miner_wasm_bg.wasm`, x = (t) => t instanceof Error ? t.message : String(t), nt = async () => {
111
118
  Z();
112
119
  let t;
113
120
  try {
@@ -115,20 +122,20 @@ const Z = () => {
115
122
  /* @vite-ignore */
116
123
  W
117
124
  );
118
- } catch (r) {
125
+ } catch (i) {
119
126
  throw new Error(
120
- `Failed to import WASM bundle (${W}). Did you run ./scripts/build-wasm.sh? (${z(r)})`
127
+ `Failed to import WASM bundle (${W}). Did you run ./scripts/build-wasm.sh? (${x(i)})`
121
128
  );
122
129
  }
123
130
  const e = t.default;
124
131
  if (typeof e != "function")
125
132
  throw new Error("WASM init function is missing from the bundle.");
126
133
  try {
127
- const r = new URL(et, import.meta.url);
128
- await e({ module_or_path: r });
129
- } catch (r) {
134
+ const i = new URL(et, import.meta.url);
135
+ await e({ module_or_path: i });
136
+ } catch (i) {
130
137
  throw new Error(
131
- `Failed to initialize WASM bundle: ${z(r)}`
138
+ `Failed to initialize WASM bundle: ${x(i)}`
132
139
  );
133
140
  }
134
141
  const n = t;
@@ -137,69 +144,77 @@ const Z = () => {
137
144
  } catch {
138
145
  }
139
146
  return n;
140
- }, rt = async () => U || (d || (d = nt().then((t) => (U = t, t)).catch((t) => {
147
+ }, it = async () => y || (d || (d = nt().then((t) => (y = t, t)).catch((t) => {
141
148
  throw d = null, t;
142
- })), d), B = self, it = B.name ?? void 0, N = (t) => t instanceof Error ? t.message : String(t);
143
- let A = "cpu", w = null;
144
- const E = (t) => {
145
- B.postMessage({ ...t, workerId: it });
146
- }, m = (t, e = u.WORKER_ERROR, n) => {
147
- E({ type: "error", message: t, code: e, details: n });
148
- }, st = (t) => typeof t == "object" && t !== null && "ok" in t, ot = (t) => typeof t == "object" && t !== null && "nonce" in t && "txid" in t, ct = (t) => {
149
+ })), d);
150
+ if (typeof globalThis.__ZELDMINER_WASM_BASE__ > "u")
151
+ try {
152
+ const t = typeof self < "u" && self.location?.origin ? self.location.origin : "http://localhost";
153
+ globalThis.__ZELDMINER_WASM_BASE__ = new URL("/wasm/", t).href;
154
+ } catch {
155
+ globalThis.__ZELDMINER_WASM_BASE__ = "/wasm/";
156
+ }
157
+ const B = self, rt = B.name ?? void 0, I = (t) => t instanceof Error ? t.message : String(t);
158
+ let N = "cpu", b = null;
159
+ const w = (t) => {
160
+ B.postMessage({ ...t, workerId: rt });
161
+ }, h = (t, e = u.WORKER_ERROR, n) => {
162
+ w({ type: "error", message: t, code: e, details: n });
163
+ }, ot = (t) => typeof t == "object" && t !== null && "ok" in t, st = (t) => typeof t == "object" && t !== null && "nonce" in t && "txid" in t, at = (t) => {
149
164
  const e = BigInt(Number.MAX_SAFE_INTEGER);
150
165
  return t > e ? Number.MAX_SAFE_INTEGER : t < -e ? -Number.MAX_SAFE_INTEGER : Number(t);
151
- }, at = (t) => ({
166
+ }, ct = (t) => ({
152
167
  nonceLength: t.nonceLength,
153
168
  prefix: new Uint8Array(t.prefix),
154
169
  suffix: new Uint8Array(t.suffix),
155
170
  useCborNonce: t.useCborNonce
156
171
  }), F = (t, e) => {
157
- t.set(e.nonceLength, at(e));
158
- }, ut = async (t, e, n, r, i) => {
159
- const o = t.get(r.nonceLength);
160
- if (o)
161
- return o;
162
- const s = e.build_mining_template(
172
+ t.set(e.nonceLength, ct(e));
173
+ }, ut = async (t, e, n, i, r) => {
174
+ const s = t.get(i.nonceLength);
175
+ if (s)
176
+ return s;
177
+ const o = e.build_mining_template(
163
178
  n.inputs,
164
179
  n.outputs,
165
- i,
180
+ r,
166
181
  BigInt(n.satsPerVbyte),
167
- r.start,
168
- r.size,
182
+ i.start,
183
+ i.size,
169
184
  n.distribution ?? null
170
- ), c = {
171
- ...s,
172
- nonceLength: r.nonceLength,
173
- useCborNonce: s.useCborNonce ?? n.useCborNonce
185
+ ), a = {
186
+ ...o,
187
+ nonceLength: i.nonceLength,
188
+ useCborNonce: o.useCborNonce ?? n.useCborNonce
174
189
  };
175
- return F(t, c), c;
176
- }, ft = async (t, e, n, r, i, o, s, c) => {
190
+ return F(t, a), a;
191
+ }, lt = async (t, e, n, i, r, s, o, a) => {
177
192
  if (e === "gpu") {
178
193
  if (!t.mine_batch_gpu)
179
194
  throw new Error("GPU mining requested but mine_batch_gpu is unavailable");
180
195
  return t.mine_batch_gpu(
181
196
  n,
182
- r,
183
197
  i,
184
- o,
198
+ r,
185
199
  s,
186
- c
200
+ o,
201
+ a
187
202
  );
188
203
  }
189
204
  return t.mine_batch_wasm(
190
205
  n,
191
- r,
192
206
  i,
193
- o,
207
+ r,
194
208
  s,
195
- c
209
+ o,
210
+ a
196
211
  );
197
- }, lt = async (t, e) => {
212
+ }, ft = async (t, e) => {
198
213
  let n;
199
214
  try {
200
- if (n = await rt(), A === "gpu") {
215
+ if (n = await it(), N === "gpu") {
201
216
  if (!n.mine_batch_gpu) {
202
- m(
217
+ h(
203
218
  "GPU mining requested but mine_batch_gpu is unavailable",
204
219
  u.WEBGPU_NOT_AVAILABLE
205
220
  );
@@ -207,27 +222,27 @@ const E = (t) => {
207
222
  }
208
223
  n.init_gpu && await n.init_gpu();
209
224
  }
210
- } catch (g) {
211
- const _ = N(g), b = A === "gpu" ? u.WEBGPU_NOT_AVAILABLE : u.WORKER_ERROR;
212
- m(`Failed to initialize WASM: ${_}`, b);
225
+ } catch (m) {
226
+ const g = I(m), E = N === "gpu" ? u.WEBGPU_NOT_AVAILABLE : u.WORKER_ERROR;
227
+ h(`Failed to initialize WASM: ${g}`, E);
213
228
  return;
214
229
  }
215
- const r = /* @__PURE__ */ new Map(), i = t.template.useCborNonce ?? !!(t.distribution && t.distribution.length > 0);
216
- F(r, { ...t.template, useCborNonce: i });
217
- const o = t.nonceStep ?? BigInt(t.batchSize), s = t.network === "signet" ? "testnet" : t.network;
218
- let c = t.startNonce, f = 0n;
230
+ const i = /* @__PURE__ */ new Map(), r = t.template.useCborNonce ?? !!(t.distribution && t.distribution.length > 0);
231
+ F(i, { ...t.template, useCborNonce: r });
232
+ const s = t.nonceStep ?? BigInt(t.batchSize), o = t.network === "signet" ? "testnet" : t.network;
233
+ let a = t.startNonce, l = 0n;
219
234
  const G = performance.now();
220
235
  for (; !e.signal.aborted; ) {
221
- const g = c;
222
- let _ = t.batchSize, b = 0n;
223
- for (; _ > 0 && !e.signal.aborted; ) {
224
- const P = g + b;
225
- let a;
236
+ const m = a;
237
+ let g = t.batchSize, E = 0n;
238
+ for (; g > 0 && !e.signal.aborted; ) {
239
+ const D = m + E;
240
+ let c;
226
241
  try {
227
- a = (i ? J(P, _) : Y(P, _))[0];
228
- } catch (h) {
229
- m(
230
- `Invalid nonce range: ${N(h)}`,
242
+ c = (r ? J(D, g) : Y(D, g))[0];
243
+ } catch (_) {
244
+ h(
245
+ `Invalid nonce range: ${I(_)}`,
231
246
  u.INVALID_INPUT
232
247
  ), e.abort();
233
248
  return;
@@ -235,102 +250,102 @@ const E = (t) => {
235
250
  let S;
236
251
  try {
237
252
  S = await ut(
238
- r,
253
+ i,
239
254
  n,
240
255
  {
241
256
  inputs: t.inputs,
242
257
  outputs: t.outputs,
243
258
  satsPerVbyte: t.satsPerVbyte,
244
259
  distribution: t.distribution,
245
- useCborNonce: i
260
+ useCborNonce: r
246
261
  },
247
- a,
248
- s
262
+ c,
263
+ o
249
264
  );
250
- } catch (h) {
251
- m(
252
- `Failed to build mining template: ${N(h)}`,
265
+ } catch (_) {
266
+ h(
267
+ `Failed to build mining template: ${I(_)}`,
253
268
  u.WORKER_ERROR
254
269
  ), e.abort();
255
270
  return;
256
271
  }
257
- let l;
272
+ let f;
258
273
  const k = performance.now();
259
274
  try {
260
- l = await ft(
275
+ f = await lt(
261
276
  n,
262
- A,
277
+ N,
263
278
  S.prefix,
264
279
  S.suffix,
265
- a.start,
266
- a.size,
280
+ c.start,
281
+ c.size,
267
282
  t.targetZeros,
268
- i
283
+ r
269
284
  );
270
- } catch (h) {
271
- const p = N(h);
272
- m(
285
+ } catch (_) {
286
+ const p = I(_);
287
+ h(
273
288
  `Batch mining failed: ${p}`,
274
289
  u.WORKER_ERROR
275
290
  ), e.abort();
276
291
  return;
277
292
  }
278
- const O = performance.now() - k;
279
- if (st(l)) {
280
- if (!l.ok) {
281
- m(
282
- l.error ?? "Validation failed",
293
+ const P = performance.now() - k;
294
+ if (ot(f)) {
295
+ if (!f.ok) {
296
+ h(
297
+ f.error ?? "Validation failed",
283
298
  u.INVALID_INPUT
284
299
  ), e.abort();
285
300
  return;
286
301
  }
287
- } else if (ot(l)) {
288
- const h = f + b, p = BigInt(l.nonce) - a.start + 1n, T = h + p, L = performance.now() - G, D = L > 0 ? ct(T) / (L / 1e3) : 0, q = a.start + p - 1n, C = {
302
+ } else if (st(f)) {
303
+ const _ = l + E, p = BigInt(f.nonce) - c.start + 1n, L = _ + p, T = performance.now() - G, M = T > 0 ? at(L) / (T / 1e3) : 0, q = c.start + p - 1n, C = {
289
304
  psbt: "",
290
- txid: l.txid,
291
- nonce: BigInt(l.nonce),
292
- attempts: T,
293
- duration: L,
294
- hashRate: D
305
+ txid: f.txid,
306
+ nonce: BigInt(f.nonce),
307
+ attempts: L,
308
+ duration: T,
309
+ hashRate: M
295
310
  };
296
- E({
311
+ w({
297
312
  type: "found",
298
313
  result: C,
299
- hashesProcessed: T,
300
- hashRate: D,
314
+ hashesProcessed: L,
315
+ hashRate: M,
301
316
  lastNonce: q
302
317
  }), e.abort();
303
318
  return;
304
319
  }
305
- f += BigInt(a.size), b += BigInt(a.size), _ -= a.size;
306
- const v = O > 0 ? a.size / (O / 1e3) : a.size, $ = a.start + BigInt(a.size) - 1n;
307
- E({ type: "progress", hashesProcessed: f, hashRate: v, lastNonce: $ });
320
+ l += BigInt(c.size), E += BigInt(c.size), g -= c.size;
321
+ const v = P > 0 ? c.size / (P / 1e3) : c.size, $ = c.start + BigInt(c.size) - 1n;
322
+ w({ type: "progress", hashesProcessed: l, hashRate: v, lastNonce: $ });
308
323
  }
309
324
  if (e.signal.aborted)
310
325
  break;
311
- const V = g + BigInt(t.batchSize) - 1n;
312
- E({ type: "batch_complete", lastNonce: V }), c = g + o;
326
+ const V = m + BigInt(t.batchSize) - 1n;
327
+ w({ type: "batch_complete", lastNonce: V }), a = m + s;
313
328
  }
314
- }, ht = (t) => {
329
+ }, _t = (t) => {
315
330
  const e = new AbortController();
316
- w?.abort(), w = e, lt(t, e).finally(() => {
317
- w === e && (w = null);
331
+ b?.abort(), b = e, ft(t, e).finally(() => {
332
+ b === e && (b = null);
318
333
  });
319
334
  };
320
335
  B.addEventListener("message", (t) => {
321
336
  const e = t.data;
322
337
  switch (e.type) {
323
338
  case "init":
324
- A = e.mode, E({ type: "ready" });
339
+ N = e.mode, w({ type: "ready" });
325
340
  break;
326
341
  case "mine":
327
- ht(e);
342
+ _t(e);
328
343
  break;
329
344
  case "stop":
330
- w?.abort();
345
+ b?.abort();
331
346
  break;
332
347
  default:
333
- m(
348
+ h(
334
349
  `Unknown message type: ${e.type}`,
335
350
  u.WORKER_ERROR
336
351
  );
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sources":["src/types.ts","src/nonce.ts","src/wasm.ts","src/worker.ts"],"sourcesContent":["export enum ZeldMinerErrorCode {\n INVALID_ADDRESS = \"INVALID_ADDRESS\",\n UNSUPPORTED_ADDRESS_TYPE = \"UNSUPPORTED_ADDRESS_TYPE\",\n INSUFFICIENT_FUNDS = \"INSUFFICIENT_FUNDS\",\n NO_CHANGE_OUTPUT = \"NO_CHANGE_OUTPUT\",\n MULTIPLE_CHANGE_OUTPUTS = \"MULTIPLE_CHANGE_OUTPUTS\",\n INVALID_INPUT = \"INVALID_INPUT\",\n WEBGPU_NOT_AVAILABLE = \"WEBGPU_NOT_AVAILABLE\",\n WORKER_ERROR = \"WORKER_ERROR\",\n MINING_ABORTED = \"MINING_ABORTED\",\n DUST_OUTPUT = \"DUST_OUTPUT\",\n}\n\nexport type ZeldMinerErrorDetails = Record<string, unknown>;\n\nexport type Network = \"mainnet\" | \"testnet\" | \"signet\" | \"regtest\";\n\nexport interface ZeldMinerOptions {\n network: Network;\n batchSize: number;\n useWebGPU: boolean;\n workerThreads: number;\n satsPerVbyte: number;\n}\n\nexport interface MiningCoordinatorOptions {\n mode: WorkerMode;\n batchSize: number;\n workerThreads: number;\n}\n\nexport interface TxInput {\n txid: string;\n vout: number;\n scriptPubKey: string;\n amount: number;\n}\n\nexport interface TxOutput {\n address: string;\n amount?: number;\n change: boolean;\n}\n\nexport interface MineResult {\n psbt: string;\n txid: string;\n nonce: bigint;\n attempts: bigint;\n duration: number;\n hashRate: number;\n}\n\nexport interface ProgressEvent {\n hashesProcessed: bigint;\n hashRate: number;\n elapsedMs?: number;\n lastNonce?: bigint;\n workerId?: string;\n}\n\nexport type WorkerMode = \"cpu\" | \"gpu\";\n\nexport type WorkerMessage =\n | { type: \"init\"; mode: WorkerMode }\n | {\n type: \"mine\";\n inputs: TxInput[];\n outputs: TxOutput[];\n network: Network;\n satsPerVbyte: number;\n template: WorkerTemplate;\n startNonce: bigint;\n batchSize: number;\n targetZeros: number;\n nonceStep?: bigint;\n distribution?: bigint[];\n }\n | { type: \"stop\" };\n\nexport type WorkerResponse =\n | { type: \"ready\"; workerId?: string }\n | {\n type: \"progress\";\n hashesProcessed: bigint;\n hashRate: number;\n lastNonce?: bigint;\n workerId?: string;\n }\n | {\n type: \"found\";\n result: MineResult;\n hashesProcessed?: bigint;\n hashRate?: number;\n lastNonce?: bigint;\n workerId?: string;\n }\n | { type: \"batch_complete\"; lastNonce: bigint; workerId?: string }\n | {\n type: \"error\";\n message: string;\n code?: ZeldMinerErrorCode;\n details?: ZeldMinerErrorDetails;\n workerId?: string;\n };\n\nexport interface MiningState {\n mode: WorkerMode;\n running: boolean;\n startNonce: bigint;\n nextNonce: bigint;\n batchSize: number;\n targetZeros: number;\n hashesProcessed: bigint;\n lastHashRate?: number;\n}\n\nexport interface MiningTemplate {\n prefix: Uint8Array;\n suffix: Uint8Array;\n useCborNonce?: boolean;\n}\n\nexport interface WorkerTemplate extends MiningTemplate {\n nonceLength: number;\n useCborNonce?: boolean;\n}\n\nexport interface ValidationResult {\n ok: boolean;\n error?: string;\n addressType?: \"p2wpkh\" | \"p2tr\";\n network?: Network;\n}\n\nexport interface WasmExports {\n init_panic_hook: () => void;\n mine_batch_wasm: (\n txPrefix: Uint8Array,\n txSuffix: Uint8Array,\n startNonce: bigint,\n batchSize: number,\n targetZeros: number,\n useCborNonce?: boolean\n ) => ValidationResult | MineResult | null;\n mine_batch_gpu?: (\n txPrefix: Uint8Array,\n txSuffix: Uint8Array,\n startNonce: bigint,\n batchSize: number,\n targetZeros: number,\n useCborNonce?: boolean\n ) => Promise<ValidationResult | MineResult | null>;\n mine_range_wasm: (\n inputs: TxInput[],\n outputs: TxOutput[],\n network: Network,\n satsPerVbyte: bigint,\n startNonce: bigint,\n batchSize: number,\n targetZeros: number,\n distribution?: bigint[] | null\n ) => ValidationResult | MineResult | null;\n mine_range_gpu?: (\n inputs: TxInput[],\n outputs: TxOutput[],\n network: Network,\n satsPerVbyte: bigint,\n startNonce: bigint,\n batchSize: number,\n targetZeros: number,\n distribution?: bigint[] | null\n ) => Promise<ValidationResult | MineResult | null>;\n validate_address: (addr: string, network: Network) => ValidationResult;\n build_psbt: (\n inputs: TxInput[],\n outputs: TxOutput[],\n network: Network,\n satsPerVbyte: bigint,\n nonce: bigint,\n distribution?: bigint[] | null\n ) => string;\n build_mining_template: (\n inputs: TxInput[],\n outputs: TxOutput[],\n network: Network,\n satsPerVbyte: bigint,\n startNonce: bigint,\n batchSize: number,\n distribution?: bigint[] | null\n ) => MiningTemplate;\n compute_txid: (txBytes: Uint8Array) => string;\n init_gpu?: () => Promise<unknown>;\n calibrate_batch_size?: () => Promise<number>;\n}\n\nexport type ProgressStats = ProgressEvent;\n\nexport interface MineParams {\n inputs: TxInput[];\n outputs: TxOutput[];\n targetZeros: number;\n startNonce?: bigint;\n batchSize?: number;\n signal?: AbortSignal;\n distribution?: bigint[];\n}\n\n","const MAX_U64 = (1n << 64n) - 1n;\n\nexport interface NonceSegment {\n start: bigint;\n size: number;\n nonceLength: number;\n}\n\nexport const nonceLength = (nonce: bigint): number => {\n if (nonce < 0n) {\n throw new Error(\"nonce must be non-negative\");\n }\n\n if (nonce === 0n) return 1;\n\n let len = 0;\n let value = nonce;\n while (value > 0n) {\n len += 1;\n value >>= 8n;\n }\n return len;\n};\n\nexport const cborNonceLength = (nonce: bigint): number => {\n if (nonce < 0n) {\n throw new Error(\"nonce must be non-negative\");\n }\n\n if (nonce <= 23n) return 1;\n if (nonce <= 0xffn) return 2;\n if (nonce <= 0xffffn) return 3;\n if (nonce <= 0xffff_ffffn) return 5;\n if (nonce <= MAX_U64) return 9;\n\n throw new Error(\"nonce range exceeds u64\");\n};\n\nconst maxValueForLength = (len: number): bigint => {\n if (!Number.isInteger(len) || len <= 0 || len > 8) {\n throw new Error(\"nonceLength must be between 1 and 8\");\n }\n return (1n << BigInt(len * 8)) - 1n;\n};\n\nconst maxValueForCborLength = (len: number): bigint => {\n switch (len) {\n case 1:\n return 23n;\n case 2:\n return 0xffn;\n case 3:\n return 0xffffn;\n case 5:\n return 0xffff_ffffn;\n case 9:\n return MAX_U64;\n default:\n throw new Error(\"cbor nonceLength must be one of 1, 2, 3, 5, 9\");\n }\n};\n\nexport const splitNonceSegments = (startNonce: bigint, span: number): NonceSegment[] => {\n if (startNonce < 0n) {\n throw new Error(\"startNonce must be non-negative\");\n }\n if (!Number.isInteger(span) || span <= 0) {\n throw new Error(\"batchSize must be a positive integer\");\n }\n\n const end = startNonce + BigInt(span - 1);\n if (end > MAX_U64) {\n throw new Error(\"nonce range exceeds u64\");\n }\n\n const segments: NonceSegment[] = [];\n let current = startNonce;\n\n while (current <= end) {\n const len = nonceLength(current);\n const maxForLen = maxValueForLength(len);\n const segmentEnd = end < maxForLen ? end : maxForLen;\n const segmentSize = segmentEnd - current + 1n;\n\n if (segmentSize > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(\"segment size exceeds safe integer range\");\n }\n\n segments.push({\n start: current,\n size: Number(segmentSize),\n nonceLength: len,\n });\n\n if (segmentEnd === end) {\n break;\n }\n\n current = segmentEnd + 1n;\n }\n\n return segments;\n};\n\nexport const maxNonceForLength = (len: number): bigint => maxValueForLength(len);\n\nexport const splitNonceSegmentsCbor = (startNonce: bigint, span: number): NonceSegment[] => {\n if (startNonce < 0n) {\n throw new Error(\"startNonce must be non-negative\");\n }\n if (!Number.isInteger(span) || span <= 0) {\n throw new Error(\"batchSize must be a positive integer\");\n }\n\n const end = startNonce + BigInt(span - 1);\n if (end > MAX_U64) {\n throw new Error(\"nonce range exceeds u64\");\n }\n\n const segments: NonceSegment[] = [];\n let current = startNonce;\n\n while (current <= end) {\n const len = cborNonceLength(current);\n const maxForLen = maxValueForCborLength(len);\n const segmentEnd = end < maxForLen ? end : maxForLen;\n const segmentSize = segmentEnd - current + 1n;\n\n if (segmentSize > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(\"segment size exceeds safe integer range\");\n }\n\n segments.push({\n start: current,\n size: Number(segmentSize),\n nonceLength: len,\n });\n\n if (segmentEnd === end) {\n break;\n }\n\n current = segmentEnd + 1n;\n }\n\n return segments;\n};\n\n\n","import type { WasmExports } from \"./types\";\n\nlet wasmModule: WasmExports | null = null;\nlet wasmInitPromise: Promise<WasmExports> | null = null;\n\n// Chrome/Dawn can reject requestDevice when optional limits (e.g.\n// maxInterStageShaderComponents) are present but unsupported. Strip any\n// limit keys the adapter doesn't expose to keep WebGPU initialization\n// portable across browser versions.\nlet webGpuLimitShimInstalled = false;\nconst installWebGpuLimitShim = (): void => {\n if (webGpuLimitShimInstalled) return;\n webGpuLimitShimInstalled = true;\n\n const adapterProto = (globalThis as typeof globalThis & { GPUAdapter?: { prototype?: unknown } })\n .GPUAdapter?.prototype as GPUAdapter | undefined;\n const requestDevice = adapterProto?.requestDevice;\n if (!adapterProto || typeof requestDevice !== \"function\") return;\n\n adapterProto.requestDevice = function patchedRequestDevice(\n this: GPUAdapter,\n descriptor?: GPUDeviceDescriptor\n ): Promise<GPUDevice> {\n if (descriptor?.requiredLimits && typeof this.limits === \"object\") {\n const limits = descriptor.requiredLimits as Record<string, unknown>;\n const supported = this.limits as unknown as Record<string, unknown>;\n for (const key of Object.keys(limits)) {\n if (!(key in supported) || supported[key] === undefined) {\n delete limits[key];\n }\n }\n }\n return requestDevice.call(this, descriptor);\n };\n};\n\nconst ensureTrailingSlash = (value: string): string =>\n value.endsWith(\"/\") ? value : `${value}/`;\n\nconst toAbsoluteBase = (base: string): string => {\n const trimmed = base.trim();\n if (!trimmed) return trimmed;\n // Use window origin when available so Vite treats it as an external URL and does not try to transform public assets.\n if (typeof window !== \"undefined\" && typeof window.location?.origin === \"string\") {\n return ensureTrailingSlash(new URL(trimmed, window.location.origin).href);\n }\n return ensureTrailingSlash(new URL(trimmed, import.meta.url).href);\n};\n\nconst resolveWasmBase = (): string => {\n const globalBase = (globalThis as { __ZELDMINER_WASM_BASE__?: unknown })\n .__ZELDMINER_WASM_BASE__;\n if (typeof globalBase === \"string\" && globalBase.trim()) {\n return toAbsoluteBase(globalBase);\n }\n\n const envBase = (import.meta as ImportMeta & { env?: Record<string, unknown> })\n .env?.VITE_ZELDMINER_WASM_BASE;\n if (typeof envBase === \"string\" && envBase.trim()) {\n return toAbsoluteBase(envBase);\n }\n\n const viteBase = (import.meta as ImportMeta & { env?: Record<string, unknown> }).env?.BASE_URL;\n if (typeof viteBase === \"string\" && viteBase.trim()) {\n return toAbsoluteBase(`${ensureTrailingSlash(viteBase.trim())}wasm/`);\n }\n\n return toAbsoluteBase(\"/wasm/\");\n};\n\nconst WASM_BASE_URL = resolveWasmBase();\nconst WASM_JS_PATH = `${WASM_BASE_URL}zeldhash_miner_wasm.js`;\nconst WASM_BINARY_PATH = `${WASM_BASE_URL}zeldhash_miner_wasm_bg.wasm`;\n\nconst formatError = (err: unknown): string =>\n err instanceof Error ? err.message : String(err);\n\nconst loadModule = async (): Promise<WasmExports> => {\n installWebGpuLimitShim();\n\n let bindings: unknown;\n try {\n bindings = await import(/* @vite-ignore */ WASM_JS_PATH);\n } catch (err) {\n throw new Error(\n `Failed to import WASM bundle (${WASM_JS_PATH}). ` +\n `Did you run ./scripts/build-wasm.sh? (${formatError(err)})`\n );\n }\n\n const init = (bindings as { default?: unknown }).default;\n if (typeof init !== \"function\") {\n throw new Error(\"WASM init function is missing from the bundle.\");\n }\n\n try {\n const wasmUrl = new URL(WASM_BINARY_PATH, import.meta.url);\n await init({ module_or_path: wasmUrl });\n } catch (err) {\n throw new Error(\n `Failed to initialize WASM bundle: ${formatError(err)}`\n );\n }\n\n const typedBindings = bindings as WasmExports;\n try {\n typedBindings.init_panic_hook?.();\n } catch {\n /* ignore optional panic hook failures */\n }\n\n return typedBindings;\n};\n\nexport const loadWasm = async (): Promise<WasmExports> => {\n if (wasmModule) return wasmModule;\n if (!wasmInitPromise) {\n wasmInitPromise = loadModule()\n .then((mod) => {\n wasmModule = mod;\n return mod;\n })\n .catch((err) => {\n wasmInitPromise = null;\n throw err;\n });\n }\n return wasmInitPromise;\n};\n\nexport const getWasm = (): WasmExports | null => wasmModule;\n\nexport const resetWasm = (): void => {\n wasmModule = null;\n wasmInitPromise = null;\n};\n\n","import type {\n MineResult,\n ValidationResult,\n WasmExports,\n WorkerMessage,\n WorkerMode,\n WorkerTemplate,\n WorkerResponse,\n} from \"./types\";\nimport { ZeldMinerErrorCode } from \"./types\";\nimport { splitNonceSegments, splitNonceSegmentsCbor } from \"./nonce\";\nimport { loadWasm } from \"./wasm\";\n\ntype MineMessage = Extract<WorkerMessage, { type: \"mine\" }>;\n\nconst ctx = self as unknown as DedicatedWorkerGlobalScope;\nconst workerId =\n (ctx as DedicatedWorkerGlobalScope & { name?: string }).name ?? undefined;\n\nconst formatError = (err: unknown): string =>\n err instanceof Error ? err.message : String(err);\n\nlet currentMode: WorkerMode = \"cpu\";\nlet miningAbort: AbortController | null = null;\nlet miningPromise: Promise<void> | null = null;\n\nconst post = (message: WorkerResponse): void => {\n ctx.postMessage({ ...message, workerId });\n};\n\nconst postError = (\n message: string,\n code: ZeldMinerErrorCode = ZeldMinerErrorCode.WORKER_ERROR,\n details?: Record<string, unknown>\n): void => {\n post({ type: \"error\", message, code, details });\n};\n\nconst isValidationResult = (val: unknown): val is ValidationResult =>\n typeof val === \"object\" && val !== null && \"ok\" in (val as object);\n\nconst isMineResult = (\n val: unknown\n): val is { nonce: bigint; txid: string } =>\n typeof val === \"object\" &&\n val !== null &&\n \"nonce\" in (val as object) &&\n \"txid\" in (val as object);\n\nconst safeBigIntToNumber = (value: bigint): number => {\n const max = BigInt(Number.MAX_SAFE_INTEGER);\n if (value > max) return Number.MAX_SAFE_INTEGER;\n if (value < -max) return -Number.MAX_SAFE_INTEGER;\n return Number(value);\n};\n\ntype TemplateCache = Map<number, WorkerTemplate>;\n\nconst cloneTemplate = (template: WorkerTemplate): WorkerTemplate => ({\n nonceLength: template.nonceLength,\n prefix: new Uint8Array(template.prefix),\n suffix: new Uint8Array(template.suffix),\n useCborNonce: template.useCborNonce,\n});\n\nconst cacheTemplate = (cache: TemplateCache, template: WorkerTemplate): void => {\n cache.set(template.nonceLength, cloneTemplate(template));\n};\n\nconst ensureTemplateForSegment = async (\n cache: TemplateCache,\n wasm: WasmExports,\n params: {\n inputs: MineMessage[\"inputs\"];\n outputs: MineMessage[\"outputs\"];\n satsPerVbyte: number;\n distribution?: bigint[];\n useCborNonce: boolean;\n },\n segment: { start: bigint; size: number; nonceLength: number },\n normalizedNetwork: MineMessage[\"network\"]\n): Promise<WorkerTemplate> => {\n const cached = cache.get(segment.nonceLength);\n if (cached) {\n return cached;\n }\n\n const template = wasm.build_mining_template(\n params.inputs,\n params.outputs,\n normalizedNetwork,\n BigInt(params.satsPerVbyte),\n segment.start,\n segment.size,\n params.distribution ?? null\n );\n\n const built: WorkerTemplate = {\n ...template,\n nonceLength: segment.nonceLength,\n useCborNonce: template.useCborNonce ?? params.useCborNonce,\n };\n\n cacheTemplate(cache, built);\n return built;\n};\n\nconst runBatch = async (\n wasm: WasmExports,\n mode: WorkerMode,\n prefix: Uint8Array,\n suffix: Uint8Array,\n startNonce: bigint,\n batchSize: number,\n targetZeros: number,\n useCborNonce: boolean\n): Promise<unknown> => {\n if (mode === \"gpu\") {\n if (!wasm.mine_batch_gpu) {\n throw new Error(\"GPU mining requested but mine_batch_gpu is unavailable\");\n }\n return wasm.mine_batch_gpu(\n prefix,\n suffix,\n startNonce,\n batchSize,\n targetZeros,\n useCborNonce\n );\n }\n\n return wasm.mine_batch_wasm(\n prefix,\n suffix,\n startNonce,\n batchSize,\n targetZeros,\n useCborNonce\n );\n};\n\nconst mineLoop = async (msg: MineMessage, abort: AbortController): Promise<void> => {\n let wasm: WasmExports;\n try {\n wasm = await loadWasm();\n if (currentMode === \"gpu\") {\n if (!wasm.mine_batch_gpu) {\n postError(\n \"GPU mining requested but mine_batch_gpu is unavailable\",\n ZeldMinerErrorCode.WEBGPU_NOT_AVAILABLE\n );\n return;\n }\n if (wasm.init_gpu) {\n await wasm.init_gpu();\n }\n }\n } catch (err) {\n const message = formatError(err);\n const code =\n currentMode === \"gpu\"\n ? ZeldMinerErrorCode.WEBGPU_NOT_AVAILABLE\n : ZeldMinerErrorCode.WORKER_ERROR;\n postError(`Failed to initialize WASM: ${message}`, code);\n return;\n }\n\n const templateCache: TemplateCache = new Map();\n const useCborNonce =\n msg.template.useCborNonce ?? Boolean(msg.distribution && msg.distribution.length > 0);\n cacheTemplate(templateCache, { ...msg.template, useCborNonce });\n\n const stride = msg.nonceStep ?? BigInt(msg.batchSize);\n const normalizedNetwork = msg.network === \"signet\" ? \"testnet\" : msg.network;\n let nextNonce = msg.startNonce;\n let hashesProcessed = 0n;\n const startedAt = performance.now();\n\n while (!abort.signal.aborted) {\n const iterationStart = nextNonce;\n let remaining = msg.batchSize;\n let processedInIteration = 0n;\n\n while (remaining > 0 && !abort.signal.aborted) {\n const segmentStart = iterationStart + processedInIteration;\n let segment: { start: bigint; size: number; nonceLength: number };\n\n try {\n const segments = useCborNonce\n ? splitNonceSegmentsCbor(segmentStart, remaining)\n : splitNonceSegments(segmentStart, remaining);\n segment = segments[0];\n } catch (err) {\n postError(\n `Invalid nonce range: ${formatError(err)}`,\n ZeldMinerErrorCode.INVALID_INPUT\n );\n abort.abort();\n return;\n }\n\n let template: WorkerTemplate;\n try {\n template = await ensureTemplateForSegment(\n templateCache,\n wasm,\n {\n inputs: msg.inputs,\n outputs: msg.outputs,\n satsPerVbyte: msg.satsPerVbyte,\n distribution: msg.distribution,\n useCborNonce,\n },\n segment,\n normalizedNetwork\n );\n } catch (err) {\n postError(\n `Failed to build mining template: ${formatError(err)}`,\n ZeldMinerErrorCode.WORKER_ERROR\n );\n abort.abort();\n return;\n }\n\n let output: unknown;\n const batchStartedAt = performance.now();\n try {\n output = await runBatch(\n wasm,\n currentMode,\n template.prefix,\n template.suffix,\n segment.start,\n segment.size,\n msg.targetZeros,\n useCborNonce\n );\n } catch (err) {\n const message = formatError(err);\n postError(\n `Batch mining failed: ${message}`,\n ZeldMinerErrorCode.WORKER_ERROR\n );\n abort.abort();\n return;\n }\n\n const batchDurationMs = performance.now() - batchStartedAt;\n\n if (isValidationResult(output)) {\n if (!output.ok) {\n postError(\n output.error ?? \"Validation failed\",\n ZeldMinerErrorCode.INVALID_INPUT\n );\n abort.abort();\n return;\n }\n } else if (isMineResult(output)) {\n const attemptsBefore = hashesProcessed + processedInIteration;\n const attemptsInSegment = BigInt(output.nonce) - segment.start + 1n;\n const totalAttempts = attemptsBefore + attemptsInSegment;\n const elapsedMs = performance.now() - startedAt;\n const hashRate =\n elapsedMs > 0\n ? safeBigIntToNumber(totalAttempts) / (elapsedMs / 1000)\n : 0;\n const lastNonce = segment.start + attemptsInSegment - 1n;\n\n const result: MineResult = {\n psbt: \"\",\n txid: output.txid,\n nonce: BigInt(output.nonce),\n attempts: totalAttempts,\n duration: elapsedMs,\n hashRate,\n };\n\n post({\n type: \"found\",\n result,\n hashesProcessed: totalAttempts,\n hashRate,\n lastNonce,\n });\n abort.abort();\n return;\n }\n\n hashesProcessed += BigInt(segment.size);\n processedInIteration += BigInt(segment.size);\n remaining -= segment.size;\n\n const hashRate =\n batchDurationMs > 0\n ? segment.size / (batchDurationMs / 1000)\n : segment.size;\n const lastNonce = segment.start + BigInt(segment.size) - 1n;\n\n post({ type: \"progress\", hashesProcessed, hashRate, lastNonce });\n }\n\n if (abort.signal.aborted) {\n break;\n }\n\n const lastNonce = iterationStart + BigInt(msg.batchSize) - 1n;\n post({ type: \"batch_complete\", lastNonce });\n\n nextNonce = iterationStart + stride;\n }\n};\n\nconst startMining = (msg: MineMessage): void => {\n const abort = new AbortController();\n miningAbort?.abort();\n miningAbort = abort;\n\n const promise = mineLoop(msg, abort).finally(() => {\n if (miningAbort === abort) {\n miningAbort = null;\n }\n if (miningPromise === promise) {\n miningPromise = null;\n }\n });\n\n miningPromise = promise;\n};\n\nctx.addEventListener(\"message\", (event: MessageEvent<WorkerMessage>) => {\n const data = event.data;\n\n switch (data.type) {\n case \"init\":\n currentMode = data.mode;\n post({ type: \"ready\" });\n break;\n case \"mine\":\n startMining(data);\n break;\n case \"stop\":\n miningAbort?.abort();\n break;\n default:\n postError(\n `Unknown message type: ${(data as { type?: string }).type}`,\n ZeldMinerErrorCode.WORKER_ERROR\n );\n }\n});\n\n"],"names":["ZeldMinerErrorCode","MAX_U64","nonceLength","nonce","len","value","cborNonceLength","maxValueForLength","maxValueForCborLength","splitNonceSegments","startNonce","span","end","segments","current","maxForLen","segmentEnd","segmentSize","splitNonceSegmentsCbor","wasmModule","wasmInitPromise","webGpuLimitShimInstalled","installWebGpuLimitShim","adapterProto","requestDevice","descriptor","limits","supported","key","ensureTrailingSlash","toAbsoluteBase","base","trimmed","resolveWasmBase","globalBase","envBase","__vite_import_meta_env__","viteBase","WASM_BASE_URL","WASM_JS_PATH","WASM_BINARY_PATH","formatError","err","loadModule","bindings","init","wasmUrl","typedBindings","loadWasm","mod","ctx","workerId","currentMode","miningAbort","post","message","postError","code","details","isValidationResult","val","isMineResult","safeBigIntToNumber","max","cloneTemplate","template","cacheTemplate","cache","ensureTemplateForSegment","wasm","params","segment","normalizedNetwork","cached","built","runBatch","mode","prefix","suffix","batchSize","targetZeros","useCborNonce","mineLoop","msg","abort","templateCache","stride","nextNonce","hashesProcessed","startedAt","iterationStart","remaining","processedInIteration","segmentStart","output","batchStartedAt","batchDurationMs","attemptsBefore","attemptsInSegment","totalAttempts","elapsedMs","hashRate","lastNonce","result","startMining","event","data"],"mappings":"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"}
1
+ {"version":3,"file":"worker.js","sources":["src/types.ts","src/nonce.ts","src/wasm.ts","src/worker.ts"],"sourcesContent":["export enum ZeldMinerErrorCode {\n INVALID_ADDRESS = \"INVALID_ADDRESS\",\n UNSUPPORTED_ADDRESS_TYPE = \"UNSUPPORTED_ADDRESS_TYPE\",\n INSUFFICIENT_FUNDS = \"INSUFFICIENT_FUNDS\",\n NO_CHANGE_OUTPUT = \"NO_CHANGE_OUTPUT\",\n MULTIPLE_CHANGE_OUTPUTS = \"MULTIPLE_CHANGE_OUTPUTS\",\n INVALID_INPUT = \"INVALID_INPUT\",\n WEBGPU_NOT_AVAILABLE = \"WEBGPU_NOT_AVAILABLE\",\n WORKER_ERROR = \"WORKER_ERROR\",\n MINING_ABORTED = \"MINING_ABORTED\",\n DUST_OUTPUT = \"DUST_OUTPUT\",\n}\n\nexport type ZeldMinerErrorDetails = Record<string, unknown>;\n\nexport type Network = \"mainnet\" | \"testnet\" | \"signet\" | \"regtest\";\n\nexport interface ZeldMinerOptions {\n network: Network;\n batchSize: number;\n useWebGPU: boolean;\n workerThreads: number;\n satsPerVbyte: number;\n}\n\nexport interface MiningCoordinatorOptions {\n mode: WorkerMode;\n batchSize: number;\n workerThreads: number;\n}\n\nexport interface TxInput {\n txid: string;\n vout: number;\n scriptPubKey: string;\n amount: number;\n}\n\nexport interface TxOutput {\n address: string;\n amount?: number;\n change: boolean;\n}\n\nexport interface MineResult {\n psbt: string;\n txid: string;\n nonce: bigint;\n attempts: bigint;\n duration: number;\n hashRate: number;\n}\n\nexport interface ProgressEvent {\n hashesProcessed: bigint;\n hashRate: number;\n elapsedMs?: number;\n lastNonce?: bigint;\n workerId?: string;\n}\n\nexport type WorkerMode = \"cpu\" | \"gpu\";\n\nexport type WorkerMessage =\n | { type: \"init\"; mode: WorkerMode }\n | {\n type: \"mine\";\n inputs: TxInput[];\n outputs: TxOutput[];\n network: Network;\n satsPerVbyte: number;\n template: WorkerTemplate;\n startNonce: bigint;\n batchSize: number;\n targetZeros: number;\n nonceStep?: bigint;\n distribution?: bigint[];\n }\n | { type: \"stop\" };\n\nexport type WorkerResponse =\n | { type: \"ready\"; workerId?: string }\n | {\n type: \"progress\";\n hashesProcessed: bigint;\n hashRate: number;\n lastNonce?: bigint;\n workerId?: string;\n }\n | {\n type: \"found\";\n result: MineResult;\n hashesProcessed?: bigint;\n hashRate?: number;\n lastNonce?: bigint;\n workerId?: string;\n }\n | { type: \"batch_complete\"; lastNonce: bigint; workerId?: string }\n | {\n type: \"error\";\n message: string;\n code?: ZeldMinerErrorCode;\n details?: ZeldMinerErrorDetails;\n workerId?: string;\n };\n\nexport interface MiningState {\n mode: WorkerMode;\n running: boolean;\n startNonce: bigint;\n nextNonce: bigint;\n batchSize: number;\n targetZeros: number;\n hashesProcessed: bigint;\n lastHashRate?: number;\n}\n\nexport interface MiningTemplate {\n prefix: Uint8Array;\n suffix: Uint8Array;\n useCborNonce?: boolean;\n}\n\nexport interface WorkerTemplate extends MiningTemplate {\n nonceLength: number;\n useCborNonce?: boolean;\n}\n\nexport interface ValidationResult {\n ok: boolean;\n error?: string;\n addressType?: \"p2wpkh\" | \"p2tr\";\n network?: Network;\n}\n\nexport interface WasmExports {\n init_panic_hook: () => void;\n mine_batch_wasm: (\n txPrefix: Uint8Array,\n txSuffix: Uint8Array,\n startNonce: bigint,\n batchSize: number,\n targetZeros: number,\n useCborNonce?: boolean\n ) => ValidationResult | MineResult | null;\n mine_batch_gpu?: (\n txPrefix: Uint8Array,\n txSuffix: Uint8Array,\n startNonce: bigint,\n batchSize: number,\n targetZeros: number,\n useCborNonce?: boolean\n ) => Promise<ValidationResult | MineResult | null>;\n mine_range_wasm: (\n inputs: TxInput[],\n outputs: TxOutput[],\n network: Network,\n satsPerVbyte: bigint,\n startNonce: bigint,\n batchSize: number,\n targetZeros: number,\n distribution?: bigint[] | null\n ) => ValidationResult | MineResult | null;\n mine_range_gpu?: (\n inputs: TxInput[],\n outputs: TxOutput[],\n network: Network,\n satsPerVbyte: bigint,\n startNonce: bigint,\n batchSize: number,\n targetZeros: number,\n distribution?: bigint[] | null\n ) => Promise<ValidationResult | MineResult | null>;\n validate_address: (addr: string, network: Network) => ValidationResult;\n build_psbt: (\n inputs: TxInput[],\n outputs: TxOutput[],\n network: Network,\n satsPerVbyte: bigint,\n nonce: bigint,\n distribution?: bigint[] | null\n ) => string;\n build_mining_template: (\n inputs: TxInput[],\n outputs: TxOutput[],\n network: Network,\n satsPerVbyte: bigint,\n startNonce: bigint,\n batchSize: number,\n distribution?: bigint[] | null\n ) => MiningTemplate;\n compute_txid: (txBytes: Uint8Array) => string;\n init_gpu?: () => Promise<unknown>;\n calibrate_batch_size?: () => Promise<number>;\n}\n\nexport type ProgressStats = ProgressEvent;\n\nexport interface MineParams {\n inputs: TxInput[];\n outputs: TxOutput[];\n targetZeros: number;\n startNonce?: bigint;\n batchSize?: number;\n signal?: AbortSignal;\n distribution?: bigint[];\n}\n\n","const MAX_U64 = (1n << 64n) - 1n;\n\nexport interface NonceSegment {\n start: bigint;\n size: number;\n nonceLength: number;\n}\n\nexport const nonceLength = (nonce: bigint): number => {\n if (nonce < 0n) {\n throw new Error(\"nonce must be non-negative\");\n }\n\n if (nonce === 0n) return 1;\n\n let len = 0;\n let value = nonce;\n while (value > 0n) {\n len += 1;\n value >>= 8n;\n }\n return len;\n};\n\nexport const cborNonceLength = (nonce: bigint): number => {\n if (nonce < 0n) {\n throw new Error(\"nonce must be non-negative\");\n }\n\n if (nonce <= 23n) return 1;\n if (nonce <= 0xffn) return 2;\n if (nonce <= 0xffffn) return 3;\n if (nonce <= 0xffff_ffffn) return 5;\n if (nonce <= MAX_U64) return 9;\n\n throw new Error(\"nonce range exceeds u64\");\n};\n\nconst maxValueForLength = (len: number): bigint => {\n if (!Number.isInteger(len) || len <= 0 || len > 8) {\n throw new Error(\"nonceLength must be between 1 and 8\");\n }\n return (1n << BigInt(len * 8)) - 1n;\n};\n\nconst maxValueForCborLength = (len: number): bigint => {\n switch (len) {\n case 1:\n return 23n;\n case 2:\n return 0xffn;\n case 3:\n return 0xffffn;\n case 5:\n return 0xffff_ffffn;\n case 9:\n return MAX_U64;\n default:\n throw new Error(\"cbor nonceLength must be one of 1, 2, 3, 5, 9\");\n }\n};\n\nexport const splitNonceSegments = (startNonce: bigint, span: number): NonceSegment[] => {\n if (startNonce < 0n) {\n throw new Error(\"startNonce must be non-negative\");\n }\n if (!Number.isInteger(span) || span <= 0) {\n throw new Error(\"batchSize must be a positive integer\");\n }\n\n const end = startNonce + BigInt(span - 1);\n if (end > MAX_U64) {\n throw new Error(\"nonce range exceeds u64\");\n }\n\n const segments: NonceSegment[] = [];\n let current = startNonce;\n\n while (current <= end) {\n const len = nonceLength(current);\n const maxForLen = maxValueForLength(len);\n const segmentEnd = end < maxForLen ? end : maxForLen;\n const segmentSize = segmentEnd - current + 1n;\n\n if (segmentSize > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(\"segment size exceeds safe integer range\");\n }\n\n segments.push({\n start: current,\n size: Number(segmentSize),\n nonceLength: len,\n });\n\n if (segmentEnd === end) {\n break;\n }\n\n current = segmentEnd + 1n;\n }\n\n return segments;\n};\n\nexport const maxNonceForLength = (len: number): bigint => maxValueForLength(len);\n\nexport const splitNonceSegmentsCbor = (startNonce: bigint, span: number): NonceSegment[] => {\n if (startNonce < 0n) {\n throw new Error(\"startNonce must be non-negative\");\n }\n if (!Number.isInteger(span) || span <= 0) {\n throw new Error(\"batchSize must be a positive integer\");\n }\n\n const end = startNonce + BigInt(span - 1);\n if (end > MAX_U64) {\n throw new Error(\"nonce range exceeds u64\");\n }\n\n const segments: NonceSegment[] = [];\n let current = startNonce;\n\n while (current <= end) {\n const len = cborNonceLength(current);\n const maxForLen = maxValueForCborLength(len);\n const segmentEnd = end < maxForLen ? end : maxForLen;\n const segmentSize = segmentEnd - current + 1n;\n\n if (segmentSize > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(\"segment size exceeds safe integer range\");\n }\n\n segments.push({\n start: current,\n size: Number(segmentSize),\n nonceLength: len,\n });\n\n if (segmentEnd === end) {\n break;\n }\n\n current = segmentEnd + 1n;\n }\n\n return segments;\n};\n\n\n","import type { WasmExports } from \"./types\";\n\n// Bootstrap: define a sensible default for WASM base path so consumers don't\n// need to patch the library. In Vite/dev the import.meta.url points inside\n// node_modules which is not served, so we derive a public path from the window\n// origin when available.\nif (typeof (globalThis as { __ZELDMINER_WASM_BASE__?: unknown }).__ZELDMINER_WASM_BASE__ === \"undefined\") {\n try {\n const origin =\n typeof window !== \"undefined\" && window.location?.origin\n ? window.location.origin\n : typeof self !== \"undefined\" && (self as { location?: { origin?: string } }).location?.origin\n ? (self as { location?: { origin?: string } }).location!.origin\n : \"http://localhost\";\n (globalThis as { __ZELDMINER_WASM_BASE__?: string }).__ZELDMINER_WASM_BASE__ = new URL(\"/wasm/\", origin!).href;\n } catch {\n (globalThis as { __ZELDMINER_WASM_BASE__?: string }).__ZELDMINER_WASM_BASE__ = \"/wasm/\";\n }\n}\n\nlet wasmModule: WasmExports | null = null;\nlet wasmInitPromise: Promise<WasmExports> | null = null;\n\n// Chrome/Dawn can reject requestDevice when optional limits (e.g.\n// maxInterStageShaderComponents) are present but unsupported. Strip any\n// limit keys the adapter doesn't expose to keep WebGPU initialization\n// portable across browser versions.\nlet webGpuLimitShimInstalled = false;\nconst installWebGpuLimitShim = (): void => {\n if (webGpuLimitShimInstalled) return;\n webGpuLimitShimInstalled = true;\n\n const adapterProto = (globalThis as typeof globalThis & { GPUAdapter?: { prototype?: unknown } })\n .GPUAdapter?.prototype as GPUAdapter | undefined;\n const requestDevice = adapterProto?.requestDevice;\n if (!adapterProto || typeof requestDevice !== \"function\") return;\n\n adapterProto.requestDevice = function patchedRequestDevice(\n this: GPUAdapter,\n descriptor?: GPUDeviceDescriptor\n ): Promise<GPUDevice> {\n if (descriptor?.requiredLimits && typeof this.limits === \"object\") {\n const limits = descriptor.requiredLimits as Record<string, unknown>;\n const supported = this.limits as unknown as Record<string, unknown>;\n for (const key of Object.keys(limits)) {\n if (!(key in supported) || supported[key] === undefined) {\n delete limits[key];\n }\n }\n }\n return requestDevice.call(this, descriptor);\n };\n};\n\nconst ensureTrailingSlash = (value: string): string =>\n value.endsWith(\"/\") ? value : `${value}/`;\n\nconst toAbsoluteBase = (base: string): string => {\n const trimmed = base.trim();\n if (!trimmed) return trimmed;\n // Use window origin when available so Vite treats it as an external URL and does not try to transform public assets.\n if (typeof window !== \"undefined\" && typeof window.location?.origin === \"string\") {\n return ensureTrailingSlash(new URL(trimmed, window.location.origin).href);\n }\n return ensureTrailingSlash(new URL(trimmed, import.meta.url).href);\n};\n\nconst resolveWasmBase = (): string => {\n const globalBase = (globalThis as { __ZELDMINER_WASM_BASE__?: unknown })\n .__ZELDMINER_WASM_BASE__;\n if (typeof globalBase === \"string\" && globalBase.trim()) {\n return toAbsoluteBase(globalBase);\n }\n\n const envBase = (import.meta as ImportMeta & { env?: Record<string, unknown> })\n .env?.VITE_ZELDMINER_WASM_BASE;\n if (typeof envBase === \"string\" && envBase.trim()) {\n return toAbsoluteBase(envBase);\n }\n\n const viteBase = (import.meta as ImportMeta & { env?: Record<string, unknown> }).env?.BASE_URL;\n if (typeof viteBase === \"string\" && viteBase.trim()) {\n return toAbsoluteBase(`${ensureTrailingSlash(viteBase.trim())}wasm/`);\n }\n\n return toAbsoluteBase(\"/wasm/\");\n};\n\nconst WASM_BASE_URL = resolveWasmBase();\nconst WASM_JS_PATH = `${WASM_BASE_URL}zeldhash_miner_wasm.js`;\nconst WASM_BINARY_PATH = `${WASM_BASE_URL}zeldhash_miner_wasm_bg.wasm`;\n\nconst formatError = (err: unknown): string =>\n err instanceof Error ? err.message : String(err);\n\nconst loadModule = async (): Promise<WasmExports> => {\n installWebGpuLimitShim();\n\n let bindings: unknown;\n try {\n bindings = await import(/* @vite-ignore */ WASM_JS_PATH);\n } catch (err) {\n throw new Error(\n `Failed to import WASM bundle (${WASM_JS_PATH}). ` +\n `Did you run ./scripts/build-wasm.sh? (${formatError(err)})`\n );\n }\n\n const init = (bindings as { default?: unknown }).default;\n if (typeof init !== \"function\") {\n throw new Error(\"WASM init function is missing from the bundle.\");\n }\n\n try {\n const wasmUrl = new URL(WASM_BINARY_PATH, import.meta.url);\n await init({ module_or_path: wasmUrl });\n } catch (err) {\n throw new Error(\n `Failed to initialize WASM bundle: ${formatError(err)}`\n );\n }\n\n const typedBindings = bindings as WasmExports;\n try {\n typedBindings.init_panic_hook?.();\n } catch {\n /* ignore optional panic hook failures */\n }\n\n return typedBindings;\n};\n\nexport const loadWasm = async (): Promise<WasmExports> => {\n if (wasmModule) return wasmModule;\n if (!wasmInitPromise) {\n wasmInitPromise = loadModule()\n .then((mod) => {\n wasmModule = mod;\n return mod;\n })\n .catch((err) => {\n wasmInitPromise = null;\n throw err;\n });\n }\n return wasmInitPromise;\n};\n\nexport const getWasm = (): WasmExports | null => wasmModule;\n\nexport const resetWasm = (): void => {\n wasmModule = null;\n wasmInitPromise = null;\n};\n\n","// Bootstrap: define a sensible default for WASM base path in worker context.\n// Workers don't have `window`, but `self` provides location. This must run\n// before any import that calls resolveWasmBase().\nif (typeof (globalThis as { __ZELDMINER_WASM_BASE__?: unknown }).__ZELDMINER_WASM_BASE__ === \"undefined\") {\n try {\n const origin =\n typeof self !== \"undefined\" && (self as { location?: { origin?: string } }).location?.origin\n ? (self as { location?: { origin?: string } }).location!.origin\n : \"http://localhost\";\n (globalThis as { __ZELDMINER_WASM_BASE__?: string }).__ZELDMINER_WASM_BASE__ = new URL(\"/wasm/\", origin!).href;\n } catch {\n (globalThis as { __ZELDMINER_WASM_BASE__?: string }).__ZELDMINER_WASM_BASE__ = \"/wasm/\";\n }\n}\n\nimport type {\n MineResult,\n ValidationResult,\n WasmExports,\n WorkerMessage,\n WorkerMode,\n WorkerTemplate,\n WorkerResponse,\n} from \"./types\";\nimport { ZeldMinerErrorCode } from \"./types\";\nimport { splitNonceSegments, splitNonceSegmentsCbor } from \"./nonce\";\nimport { loadWasm } from \"./wasm\";\n\ntype MineMessage = Extract<WorkerMessage, { type: \"mine\" }>;\n\nconst ctx = self as unknown as DedicatedWorkerGlobalScope;\nconst workerId =\n (ctx as DedicatedWorkerGlobalScope & { name?: string }).name ?? undefined;\n\nconst formatError = (err: unknown): string =>\n err instanceof Error ? err.message : String(err);\n\nlet currentMode: WorkerMode = \"cpu\";\nlet miningAbort: AbortController | null = null;\nlet miningPromise: Promise<void> | null = null;\n\nconst post = (message: WorkerResponse): void => {\n ctx.postMessage({ ...message, workerId });\n};\n\nconst postError = (\n message: string,\n code: ZeldMinerErrorCode = ZeldMinerErrorCode.WORKER_ERROR,\n details?: Record<string, unknown>\n): void => {\n post({ type: \"error\", message, code, details });\n};\n\nconst isValidationResult = (val: unknown): val is ValidationResult =>\n typeof val === \"object\" && val !== null && \"ok\" in (val as object);\n\nconst isMineResult = (\n val: unknown\n): val is { nonce: bigint; txid: string } =>\n typeof val === \"object\" &&\n val !== null &&\n \"nonce\" in (val as object) &&\n \"txid\" in (val as object);\n\nconst safeBigIntToNumber = (value: bigint): number => {\n const max = BigInt(Number.MAX_SAFE_INTEGER);\n if (value > max) return Number.MAX_SAFE_INTEGER;\n if (value < -max) return -Number.MAX_SAFE_INTEGER;\n return Number(value);\n};\n\ntype TemplateCache = Map<number, WorkerTemplate>;\n\nconst cloneTemplate = (template: WorkerTemplate): WorkerTemplate => ({\n nonceLength: template.nonceLength,\n prefix: new Uint8Array(template.prefix),\n suffix: new Uint8Array(template.suffix),\n useCborNonce: template.useCborNonce,\n});\n\nconst cacheTemplate = (cache: TemplateCache, template: WorkerTemplate): void => {\n cache.set(template.nonceLength, cloneTemplate(template));\n};\n\nconst ensureTemplateForSegment = async (\n cache: TemplateCache,\n wasm: WasmExports,\n params: {\n inputs: MineMessage[\"inputs\"];\n outputs: MineMessage[\"outputs\"];\n satsPerVbyte: number;\n distribution?: bigint[];\n useCborNonce: boolean;\n },\n segment: { start: bigint; size: number; nonceLength: number },\n normalizedNetwork: MineMessage[\"network\"]\n): Promise<WorkerTemplate> => {\n const cached = cache.get(segment.nonceLength);\n if (cached) {\n return cached;\n }\n\n const template = wasm.build_mining_template(\n params.inputs,\n params.outputs,\n normalizedNetwork,\n BigInt(params.satsPerVbyte),\n segment.start,\n segment.size,\n params.distribution ?? null\n );\n\n const built: WorkerTemplate = {\n ...template,\n nonceLength: segment.nonceLength,\n useCborNonce: template.useCborNonce ?? params.useCborNonce,\n };\n\n cacheTemplate(cache, built);\n return built;\n};\n\nconst runBatch = async (\n wasm: WasmExports,\n mode: WorkerMode,\n prefix: Uint8Array,\n suffix: Uint8Array,\n startNonce: bigint,\n batchSize: number,\n targetZeros: number,\n useCborNonce: boolean\n): Promise<unknown> => {\n if (mode === \"gpu\") {\n if (!wasm.mine_batch_gpu) {\n throw new Error(\"GPU mining requested but mine_batch_gpu is unavailable\");\n }\n return wasm.mine_batch_gpu(\n prefix,\n suffix,\n startNonce,\n batchSize,\n targetZeros,\n useCborNonce\n );\n }\n\n return wasm.mine_batch_wasm(\n prefix,\n suffix,\n startNonce,\n batchSize,\n targetZeros,\n useCborNonce\n );\n};\n\nconst mineLoop = async (msg: MineMessage, abort: AbortController): Promise<void> => {\n let wasm: WasmExports;\n try {\n wasm = await loadWasm();\n if (currentMode === \"gpu\") {\n if (!wasm.mine_batch_gpu) {\n postError(\n \"GPU mining requested but mine_batch_gpu is unavailable\",\n ZeldMinerErrorCode.WEBGPU_NOT_AVAILABLE\n );\n return;\n }\n if (wasm.init_gpu) {\n await wasm.init_gpu();\n }\n }\n } catch (err) {\n const message = formatError(err);\n const code =\n currentMode === \"gpu\"\n ? ZeldMinerErrorCode.WEBGPU_NOT_AVAILABLE\n : ZeldMinerErrorCode.WORKER_ERROR;\n postError(`Failed to initialize WASM: ${message}`, code);\n return;\n }\n\n const templateCache: TemplateCache = new Map();\n const useCborNonce =\n msg.template.useCborNonce ?? Boolean(msg.distribution && msg.distribution.length > 0);\n cacheTemplate(templateCache, { ...msg.template, useCborNonce });\n\n const stride = msg.nonceStep ?? BigInt(msg.batchSize);\n const normalizedNetwork = msg.network === \"signet\" ? \"testnet\" : msg.network;\n let nextNonce = msg.startNonce;\n let hashesProcessed = 0n;\n const startedAt = performance.now();\n\n while (!abort.signal.aborted) {\n const iterationStart = nextNonce;\n let remaining = msg.batchSize;\n let processedInIteration = 0n;\n\n while (remaining > 0 && !abort.signal.aborted) {\n const segmentStart = iterationStart + processedInIteration;\n let segment: { start: bigint; size: number; nonceLength: number };\n\n try {\n const segments = useCborNonce\n ? splitNonceSegmentsCbor(segmentStart, remaining)\n : splitNonceSegments(segmentStart, remaining);\n segment = segments[0];\n } catch (err) {\n postError(\n `Invalid nonce range: ${formatError(err)}`,\n ZeldMinerErrorCode.INVALID_INPUT\n );\n abort.abort();\n return;\n }\n\n let template: WorkerTemplate;\n try {\n template = await ensureTemplateForSegment(\n templateCache,\n wasm,\n {\n inputs: msg.inputs,\n outputs: msg.outputs,\n satsPerVbyte: msg.satsPerVbyte,\n distribution: msg.distribution,\n useCborNonce,\n },\n segment,\n normalizedNetwork\n );\n } catch (err) {\n postError(\n `Failed to build mining template: ${formatError(err)}`,\n ZeldMinerErrorCode.WORKER_ERROR\n );\n abort.abort();\n return;\n }\n\n let output: unknown;\n const batchStartedAt = performance.now();\n try {\n output = await runBatch(\n wasm,\n currentMode,\n template.prefix,\n template.suffix,\n segment.start,\n segment.size,\n msg.targetZeros,\n useCborNonce\n );\n } catch (err) {\n const message = formatError(err);\n postError(\n `Batch mining failed: ${message}`,\n ZeldMinerErrorCode.WORKER_ERROR\n );\n abort.abort();\n return;\n }\n\n const batchDurationMs = performance.now() - batchStartedAt;\n\n if (isValidationResult(output)) {\n if (!output.ok) {\n postError(\n output.error ?? \"Validation failed\",\n ZeldMinerErrorCode.INVALID_INPUT\n );\n abort.abort();\n return;\n }\n } else if (isMineResult(output)) {\n const attemptsBefore = hashesProcessed + processedInIteration;\n const attemptsInSegment = BigInt(output.nonce) - segment.start + 1n;\n const totalAttempts = attemptsBefore + attemptsInSegment;\n const elapsedMs = performance.now() - startedAt;\n const hashRate =\n elapsedMs > 0\n ? safeBigIntToNumber(totalAttempts) / (elapsedMs / 1000)\n : 0;\n const lastNonce = segment.start + attemptsInSegment - 1n;\n\n const result: MineResult = {\n psbt: \"\",\n txid: output.txid,\n nonce: BigInt(output.nonce),\n attempts: totalAttempts,\n duration: elapsedMs,\n hashRate,\n };\n\n post({\n type: \"found\",\n result,\n hashesProcessed: totalAttempts,\n hashRate,\n lastNonce,\n });\n abort.abort();\n return;\n }\n\n hashesProcessed += BigInt(segment.size);\n processedInIteration += BigInt(segment.size);\n remaining -= segment.size;\n\n const hashRate =\n batchDurationMs > 0\n ? segment.size / (batchDurationMs / 1000)\n : segment.size;\n const lastNonce = segment.start + BigInt(segment.size) - 1n;\n\n post({ type: \"progress\", hashesProcessed, hashRate, lastNonce });\n }\n\n if (abort.signal.aborted) {\n break;\n }\n\n const lastNonce = iterationStart + BigInt(msg.batchSize) - 1n;\n post({ type: \"batch_complete\", lastNonce });\n\n nextNonce = iterationStart + stride;\n }\n};\n\nconst startMining = (msg: MineMessage): void => {\n const abort = new AbortController();\n miningAbort?.abort();\n miningAbort = abort;\n\n const promise = mineLoop(msg, abort).finally(() => {\n if (miningAbort === abort) {\n miningAbort = null;\n }\n if (miningPromise === promise) {\n miningPromise = null;\n }\n });\n\n miningPromise = promise;\n};\n\nctx.addEventListener(\"message\", (event: MessageEvent<WorkerMessage>) => {\n const data = event.data;\n\n switch (data.type) {\n case \"init\":\n currentMode = data.mode;\n post({ type: \"ready\" });\n break;\n case \"mine\":\n startMining(data);\n break;\n case \"stop\":\n miningAbort?.abort();\n break;\n default:\n postError(\n `Unknown message type: ${(data as { type?: string }).type}`,\n ZeldMinerErrorCode.WORKER_ERROR\n );\n }\n});\n\n"],"names":["ZeldMinerErrorCode","MAX_U64","nonceLength","nonce","len","value","cborNonceLength","maxValueForLength","maxValueForCborLength","splitNonceSegments","startNonce","span","end","segments","current","maxForLen","segmentEnd","segmentSize","splitNonceSegmentsCbor","origin","wasmModule","wasmInitPromise","webGpuLimitShimInstalled","installWebGpuLimitShim","adapterProto","requestDevice","descriptor","limits","supported","key","ensureTrailingSlash","toAbsoluteBase","base","trimmed","resolveWasmBase","globalBase","envBase","__vite_import_meta_env__","viteBase","WASM_BASE_URL","WASM_JS_PATH","WASM_BINARY_PATH","formatError","err","loadModule","bindings","init","wasmUrl","typedBindings","loadWasm","mod","ctx","workerId","currentMode","miningAbort","post","message","postError","code","details","isValidationResult","val","isMineResult","safeBigIntToNumber","max","cloneTemplate","template","cacheTemplate","cache","ensureTemplateForSegment","wasm","params","segment","normalizedNetwork","cached","built","runBatch","mode","prefix","suffix","batchSize","targetZeros","useCborNonce","mineLoop","msg","abort","templateCache","stride","nextNonce","hashesProcessed","startedAt","iterationStart","remaining","processedInIteration","segmentStart","output","batchStartedAt","batchDurationMs","attemptsBefore","attemptsInSegment","totalAttempts","elapsedMs","hashRate","lastNonce","result","startMining","event","data"],"mappings":"AAAO,IAAKA,sBAAAA,OACVA,EAAA,kBAAkB,mBAClBA,EAAA,2BAA2B,4BAC3BA,EAAA,qBAAqB,sBACrBA,EAAA,mBAAmB,oBACnBA,EAAA,0BAA0B,2BAC1BA,EAAA,gBAAgB,iBAChBA,EAAA,uBAAuB,wBACvBA,EAAA,eAAe,gBACfA,EAAA,iBAAiB,kBACjBA,EAAA,cAAc,eAVJA,IAAAA,KAAA,CAAA,CAAA;ACAZ,MAAMC,KAAW,MAAM,OAAO,IAQjBC,IAAc,CAACC,MAA0B;AACpD,MAAIA,IAAQ;AACV,UAAM,IAAI,MAAM,4BAA4B;AAG9C,MAAIA,MAAU,GAAI,QAAO;AAEzB,MAAIC,IAAM,GACNC,IAAQF;AACZ,SAAOE,IAAQ;AACb,IAAAD,KAAO,GACPC,MAAU;AAEZ,SAAOD;AACT,GAEaE,IAAkB,CAACH,MAA0B;AACxD,MAAIA,IAAQ;AACV,UAAM,IAAI,MAAM,4BAA4B;AAG9C,MAAIA,KAAS,IAAK,QAAO;AACzB,MAAIA,KAAS,MAAO,QAAO;AAC3B,MAAIA,KAAS,QAAS,QAAO;AAC7B,MAAIA,KAAS,YAAc,QAAO;AAClC,MAAIA,KAASF,EAAS,QAAO;AAE7B,QAAM,IAAI,MAAM,yBAAyB;AAC3C,GAEMM,IAAoB,CAACH,MAAwB;AACjD,MAAI,CAAC,OAAO,UAAUA,CAAG,KAAKA,KAAO,KAAKA,IAAM;AAC9C,UAAM,IAAI,MAAM,qCAAqC;AAEvD,UAAQ,MAAM,OAAOA,IAAM,CAAC,KAAK;AACnC,GAEMI,IAAwB,CAACJ,MAAwB;AACrD,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAOH;AAAA,IACT;AACE,YAAM,IAAI,MAAM,+CAA+C;AAAA,EAAA;AAErE,GAEaQ,IAAqB,CAACC,GAAoBC,MAAiC;AACtF,MAAID,IAAa;AACf,UAAM,IAAI,MAAM,iCAAiC;AAEnD,MAAI,CAAC,OAAO,UAAUC,CAAI,KAAKA,KAAQ;AACrC,UAAM,IAAI,MAAM,sCAAsC;AAGxD,QAAMC,IAAMF,IAAa,OAAOC,IAAO,CAAC;AACxC,MAAIC,IAAMX;AACR,UAAM,IAAI,MAAM,yBAAyB;AAG3C,QAAMY,IAA2B,CAAA;AACjC,MAAIC,IAAUJ;AAEd,SAAOI,KAAWF,KAAK;AACrB,UAAMR,IAAMF,EAAYY,CAAO,GACzBC,IAAYR,EAAkBH,CAAG,GACjCY,IAAaJ,IAAMG,IAAYH,IAAMG,GACrCE,IAAcD,IAAaF,IAAU;AAE3C,QAAIG,IAAc,OAAO,OAAO,gBAAgB;AAC9C,YAAM,IAAI,MAAM,yCAAyC;AAS3D,QANAJ,EAAS,KAAK;AAAA,MACZ,OAAOC;AAAA,MACP,MAAM,OAAOG,CAAW;AAAA,MACxB,aAAab;AAAA,IAAA,CACd,GAEGY,MAAeJ;AACjB;AAGF,IAAAE,IAAUE,IAAa;AAAA,EACzB;AAEA,SAAOH;AACT,GAIaK,IAAyB,CAACR,GAAoBC,MAAiC;AAC1F,MAAID,IAAa;AACf,UAAM,IAAI,MAAM,iCAAiC;AAEnD,MAAI,CAAC,OAAO,UAAUC,CAAI,KAAKA,KAAQ;AACrC,UAAM,IAAI,MAAM,sCAAsC;AAGxD,QAAMC,IAAMF,IAAa,OAAOC,IAAO,CAAC;AACxC,MAAIC,IAAMX;AACR,UAAM,IAAI,MAAM,yBAAyB;AAG3C,QAAMY,IAA2B,CAAA;AACjC,MAAIC,IAAUJ;AAEd,SAAOI,KAAWF,KAAK;AACrB,UAAMR,IAAME,EAAgBQ,CAAO,GAC7BC,IAAYP,EAAsBJ,CAAG,GACrCY,IAAaJ,IAAMG,IAAYH,IAAMG,GACrCE,IAAcD,IAAaF,IAAU;AAE3C,QAAIG,IAAc,OAAO,OAAO,gBAAgB;AAC9C,YAAM,IAAI,MAAM,yCAAyC;AAS3D,QANAJ,EAAS,KAAK;AAAA,MACZ,OAAOC;AAAA,MACP,MAAM,OAAOG,CAAW;AAAA,MACxB,aAAab;AAAA,IAAA,CACd,GAEGY,MAAeJ;AACjB;AAGF,IAAAE,IAAUE,IAAa;AAAA,EACzB;AAEA,SAAOH;AACT;AC5IA,IAAI,OAAQ,WAAqD,0BAA4B;AAC3F,MAAI;AACF,UAAMM,IACJ,OAAO,SAAW,OAAe,OAAO,UAAU,SAC9C,OAAO,SAAS,SAChB,OAAO,OAAS,OAAgB,KAA4C,UAAU,SACnF,KAA4C,SAAU,SACvD;AACP,eAAoD,0BAA0B,IAAI,IAAI,UAAUA,CAAO,EAAE;AAAA,EAC5G,QAAQ;AACL,eAAoD,0BAA0B;AAAA,EACjF;AAGF,IAAIC,IAAiC,MACjCC,IAA+C,MAM/CC,IAA2B;AAC/B,MAAMC,IAAyB,MAAY;AACzC,MAAID,EAA0B;AAC9B,EAAAA,IAA2B;AAE3B,QAAME,IAAgB,WACnB,YAAY,WACTC,IAAgBD,GAAc;AACpC,EAAI,CAACA,KAAgB,OAAOC,KAAkB,eAE9CD,EAAa,gBAAgB,SAE3BE,GACoB;AACpB,QAAIA,GAAY,kBAAkB,OAAO,KAAK,UAAW,UAAU;AACjE,YAAMC,IAASD,EAAW,gBACpBE,IAAY,KAAK;AACvB,iBAAWC,KAAO,OAAO,KAAKF,CAAM;AAClC,SAAI,EAAEE,KAAOD,MAAcA,EAAUC,CAAG,MAAM,WAC5C,OAAOF,EAAOE,CAAG;AAAA,IAGvB;AACA,WAAOJ,EAAc,KAAK,MAAMC,CAAU;AAAA,EAC5C;AACF,GAEMI,IAAsB,CAACzB,MAC3BA,EAAM,SAAS,GAAG,IAAIA,IAAQ,GAAGA,CAAK,KAElC0B,IAAiB,CAACC,MAAyB;AAC/C,QAAMC,IAAUD,EAAK,KAAA;AACrB,SAAKC,MAED,OAAO,SAAW,OAAe,OAAO,OAAO,UAAU,UAAW,WAC/DH,EAAoB,IAAI,IAAIG,GAAS,OAAO,SAAS,MAAM,EAAE,IAAI,IAEnEH,EAAoB,IAAI,IAAIG,GAAS,YAAY,GAAG,EAAE,IAAI;AACnE,GAEMC,KAAkB,MAAc;AACpC,QAAMC,IAAc,WACjB;AACH,MAAI,OAAOA,KAAe,YAAYA,EAAW;AAC/C,WAAOJ,EAAeI,CAAU;AAGlC,QAAMC,IAAWC,GACT;AACR,MAAI,OAAOD,KAAY,YAAYA,EAAQ;AACzC,WAAOL,EAAeK,CAAO;AAG/B,QAAME,IAAY;AAClB,SAAoCA,EAAS,SACpCP,EAAe,GAAGD,EAAoBQ,EAAS,KAAA,CAAM,CAAC,OAAO,IAG/DP,EAAe,QAAQ;AAChC,GAEMQ,IAAgBL,GAAA,GAChBM,IAAe,GAAGD,CAAa,0BAC/BE,KAAmB,GAAGF,CAAa,+BAEnCG,IAAc,CAACC,MACnBA,aAAe,QAAQA,EAAI,UAAU,OAAOA,CAAG,GAE3CC,KAAa,YAAkC;AACnD,EAAArB,EAAA;AAEA,MAAIsB;AACJ,MAAI;AACF,IAAAA,IAAW,MAAM;AAAA;AAAA,MAA0BL;AAAA;AAAA,EAC7C,SAASG,GAAK;AACZ,UAAM,IAAI;AAAA,MACR,iCAAiCH,CAAY,4CACFE,EAAYC,CAAG,CAAC;AAAA,IAAA;AAAA,EAE/D;AAEA,QAAMG,IAAQD,EAAmC;AACjD,MAAI,OAAOC,KAAS;AAClB,UAAM,IAAI,MAAM,gDAAgD;AAGlE,MAAI;AACF,UAAMC,IAAU,IAAI,IAAIN,IAAkB,YAAY,GAAG;AACzD,UAAMK,EAAK,EAAE,gBAAgBC,GAAS;AAAA,EACxC,SAASJ,GAAK;AACZ,UAAM,IAAI;AAAA,MACR,qCAAqCD,EAAYC,CAAG,CAAC;AAAA,IAAA;AAAA,EAEzD;AAEA,QAAMK,IAAgBH;AACtB,MAAI;AACF,IAAAG,EAAc,kBAAA;AAAA,EAChB,QAAQ;AAAA,EAER;AAEA,SAAOA;AACT,GAEaC,KAAW,YAClB7B,MACCC,MACHA,IAAkBuB,GAAA,EACf,KAAK,CAACM,OACL9B,IAAa8B,GACNA,EACR,EACA,MAAM,CAACP,MAAQ;AACd,QAAAtB,IAAkB,MACZsB;AACR,CAAC,IAEEtB;AC9IT,IAAI,OAAQ,WAAqD,0BAA4B;AAC3F,MAAI;AACF,UAAMF,IACJ,OAAO,OAAS,OAAgB,KAA4C,UAAU,SACjF,KAA4C,SAAU,SACvD;AACL,eAAoD,0BAA0B,IAAI,IAAI,UAAUA,CAAO,EAAE;AAAA,EAC5G,QAAQ;AACL,eAAoD,0BAA0B;AAAA,EACjF;AAkBF,MAAMgC,IAAM,MACNC,KACHD,EAAuD,QAAQ,QAE5DT,IAAc,CAACC,MACnBA,aAAe,QAAQA,EAAI,UAAU,OAAOA,CAAG;AAEjD,IAAIU,IAA0B,OAC1BC,IAAsC;AAG1C,MAAMC,IAAO,CAACC,MAAkC;AAC9C,EAAAL,EAAI,YAAY,EAAE,GAAGK,GAAS,UAAAJ,IAAU;AAC1C,GAEMK,IAAY,CAChBD,GACAE,IAA2B1D,EAAmB,cAC9C2D,MACS;AACT,EAAAJ,EAAK,EAAE,MAAM,SAAS,SAAAC,GAAS,MAAAE,GAAM,SAAAC,GAAS;AAChD,GAEMC,KAAqB,CAACC,MAC1B,OAAOA,KAAQ,YAAYA,MAAQ,QAAQ,QAASA,GAEhDC,KAAe,CACnBD,MAEA,OAAOA,KAAQ,YACfA,MAAQ,QACR,WAAYA,KACZ,UAAWA,GAEPE,KAAqB,CAAC1D,MAA0B;AACpD,QAAM2D,IAAM,OAAO,OAAO,gBAAgB;AAC1C,SAAI3D,IAAQ2D,IAAY,OAAO,mBAC3B3D,IAAQ,CAAC2D,IAAY,CAAC,OAAO,mBAC1B,OAAO3D,CAAK;AACrB,GAIM4D,KAAgB,CAACC,OAA8C;AAAA,EACnE,aAAaA,EAAS;AAAA,EACtB,QAAQ,IAAI,WAAWA,EAAS,MAAM;AAAA,EACtC,QAAQ,IAAI,WAAWA,EAAS,MAAM;AAAA,EACtC,cAAcA,EAAS;AACzB,IAEMC,IAAgB,CAACC,GAAsBF,MAAmC;AAC9E,EAAAE,EAAM,IAAIF,EAAS,aAAaD,GAAcC,CAAQ,CAAC;AACzD,GAEMG,KAA2B,OAC/BD,GACAE,GACAC,GAOAC,GACAC,MAC4B;AAC5B,QAAMC,IAASN,EAAM,IAAII,EAAQ,WAAW;AAC5C,MAAIE;AACF,WAAOA;AAGT,QAAMR,IAAWI,EAAK;AAAA,IACpBC,EAAO;AAAA,IACPA,EAAO;AAAA,IACPE;AAAA,IACA,OAAOF,EAAO,YAAY;AAAA,IAC1BC,EAAQ;AAAA,IACRA,EAAQ;AAAA,IACRD,EAAO,gBAAgB;AAAA,EAAA,GAGnBI,IAAwB;AAAA,IAC5B,GAAGT;AAAA,IACH,aAAaM,EAAQ;AAAA,IACrB,cAAcN,EAAS,gBAAgBK,EAAO;AAAA,EAAA;AAGhD,SAAAJ,EAAcC,GAAOO,CAAK,GACnBA;AACT,GAEMC,KAAW,OACfN,GACAO,GACAC,GACAC,GACArE,GACAsE,GACAC,GACAC,MACqB;AACrB,MAAIL,MAAS,OAAO;AAClB,QAAI,CAACP,EAAK;AACR,YAAM,IAAI,MAAM,wDAAwD;AAE1E,WAAOA,EAAK;AAAA,MACVQ;AAAA,MACAC;AAAA,MACArE;AAAA,MACAsE;AAAA,MACAC;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AAEA,SAAOZ,EAAK;AAAA,IACVQ;AAAA,IACAC;AAAA,IACArE;AAAA,IACAsE;AAAA,IACAC;AAAA,IACAC;AAAA,EAAA;AAEJ,GAEMC,KAAW,OAAOC,GAAkBC,MAA0C;AAClF,MAAIf;AACJ,MAAI;AAEF,QADAA,IAAO,MAAMrB,GAAA,GACTI,MAAgB,OAAO;AACzB,UAAI,CAACiB,EAAK,gBAAgB;AACxB,QAAAb;AAAA,UACE;AAAA,UACAzD,EAAmB;AAAA,QAAA;AAErB;AAAA,MACF;AACA,MAAIsE,EAAK,YACP,MAAMA,EAAK,SAAA;AAAA,IAEf;AAAA,EACF,SAAS3B,GAAK;AACZ,UAAMa,IAAUd,EAAYC,CAAG,GACzBe,IACJL,MAAgB,QACZrD,EAAmB,uBACnBA,EAAmB;AACzB,IAAAyD,EAAU,8BAA8BD,CAAO,IAAIE,CAAI;AACvD;AAAA,EACF;AAEA,QAAM4B,wBAAmC,IAAA,GACnCJ,IACJE,EAAI,SAAS,gBAAgB,GAAQA,EAAI,gBAAgBA,EAAI,aAAa,SAAS;AACrF,EAAAjB,EAAcmB,GAAe,EAAE,GAAGF,EAAI,UAAU,cAAAF,GAAc;AAE9D,QAAMK,IAASH,EAAI,aAAa,OAAOA,EAAI,SAAS,GAC9CX,IAAoBW,EAAI,YAAY,WAAW,YAAYA,EAAI;AACrE,MAAII,IAAYJ,EAAI,YAChBK,IAAkB;AACtB,QAAMC,IAAY,YAAY,IAAA;AAE9B,SAAO,CAACL,EAAM,OAAO,WAAS;AAC5B,UAAMM,IAAiBH;AACvB,QAAII,IAAYR,EAAI,WAChBS,IAAuB;AAE3B,WAAOD,IAAY,KAAK,CAACP,EAAM,OAAO,WAAS;AAC7C,YAAMS,IAAeH,IAAiBE;AACtC,UAAIrB;AAEJ,UAAI;AAIF,QAAAA,KAHiBU,IACbhE,EAAuB4E,GAAcF,CAAS,IAC9CnF,EAAmBqF,GAAcF,CAAS,GAC3B,CAAC;AAAA,MACtB,SAASjD,GAAK;AACZ,QAAAc;AAAA,UACE,wBAAwBf,EAAYC,CAAG,CAAC;AAAA,UACxC3C,EAAmB;AAAA,QAAA,GAErBqF,EAAM,MAAA;AACN;AAAA,MACF;AAEA,UAAInB;AACJ,UAAI;AACF,QAAAA,IAAW,MAAMG;AAAA,UACfiB;AAAA,UACAhB;AAAA,UACA;AAAA,YACE,QAAQc,EAAI;AAAA,YACZ,SAASA,EAAI;AAAA,YACb,cAAcA,EAAI;AAAA,YAClB,cAAcA,EAAI;AAAA,YAClB,cAAAF;AAAA,UAAA;AAAA,UAEFV;AAAA,UACAC;AAAA,QAAA;AAAA,MAEJ,SAAS9B,GAAK;AACZ,QAAAc;AAAA,UACE,oCAAoCf,EAAYC,CAAG,CAAC;AAAA,UACpD3C,EAAmB;AAAA,QAAA,GAErBqF,EAAM,MAAA;AACN;AAAA,MACF;AAEA,UAAIU;AACJ,YAAMC,IAAiB,YAAY,IAAA;AACnC,UAAI;AACF,QAAAD,IAAS,MAAMnB;AAAA,UACbN;AAAA,UACAjB;AAAA,UACAa,EAAS;AAAA,UACTA,EAAS;AAAA,UACTM,EAAQ;AAAA,UACRA,EAAQ;AAAA,UACRY,EAAI;AAAA,UACJF;AAAA,QAAA;AAAA,MAEJ,SAASvC,GAAK;AACZ,cAAMa,IAAUd,EAAYC,CAAG;AAC/B,QAAAc;AAAA,UACE,wBAAwBD,CAAO;AAAA,UAC/BxD,EAAmB;AAAA,QAAA,GAErBqF,EAAM,MAAA;AACN;AAAA,MACF;AAEA,YAAMY,IAAkB,YAAY,IAAA,IAAQD;AAE5C,UAAIpC,GAAmBmC,CAAM;AAC3B,YAAI,CAACA,EAAO,IAAI;AACd,UAAAtC;AAAA,YACEsC,EAAO,SAAS;AAAA,YAChB/F,EAAmB;AAAA,UAAA,GAErBqF,EAAM,MAAA;AACN;AAAA,QACF;AAAA,iBACSvB,GAAaiC,CAAM,GAAG;AAC/B,cAAMG,IAAiBT,IAAkBI,GACnCM,IAAoB,OAAOJ,EAAO,KAAK,IAAIvB,EAAQ,QAAQ,IAC3D4B,IAAgBF,IAAiBC,GACjCE,IAAY,YAAY,IAAA,IAAQX,GAChCY,IACJD,IAAY,IACRtC,GAAmBqC,CAAa,KAAKC,IAAY,OACjD,GACAE,IAAY/B,EAAQ,QAAQ2B,IAAoB,IAEhDK,IAAqB;AAAA,UACzB,MAAM;AAAA,UACN,MAAMT,EAAO;AAAA,UACb,OAAO,OAAOA,EAAO,KAAK;AAAA,UAC1B,UAAUK;AAAA,UACV,UAAUC;AAAA,UACV,UAAAC;AAAAA,QAAA;AAGF,QAAA/C,EAAK;AAAA,UACH,MAAM;AAAA,UACN,QAAAiD;AAAA,UACA,iBAAiBJ;AAAA,UACjB,UAAAE;AAAAA,UACA,WAAAC;AAAAA,QAAA,CACD,GACDlB,EAAM,MAAA;AACN;AAAA,MACF;AAEA,MAAAI,KAAmB,OAAOjB,EAAQ,IAAI,GACtCqB,KAAwB,OAAOrB,EAAQ,IAAI,GAC3CoB,KAAapB,EAAQ;AAErB,YAAM8B,IACJL,IAAkB,IACdzB,EAAQ,QAAQyB,IAAkB,OAClCzB,EAAQ,MACR+B,IAAY/B,EAAQ,QAAQ,OAAOA,EAAQ,IAAI,IAAI;AAEzD,MAAAjB,EAAK,EAAE,MAAM,YAAY,iBAAAkC,GAAiB,UAAAa,GAAU,WAAAC,GAAW;AAAA,IACjE;AAEA,QAAIlB,EAAM,OAAO;AACf;AAGF,UAAMkB,IAAYZ,IAAiB,OAAOP,EAAI,SAAS,IAAI;AAC3D,IAAA7B,EAAK,EAAE,MAAM,kBAAkB,WAAAgD,EAAA,CAAW,GAE1Cf,IAAYG,IAAiBJ;AAAA,EAC/B;AACF,GAEMkB,KAAc,CAACrB,MAA2B;AAC9C,QAAMC,IAAQ,IAAI,gBAAA;AAClB,EAAA/B,GAAa,MAAA,GACbA,IAAc+B,GAEEF,GAASC,GAAKC,CAAK,EAAE,QAAQ,MAAM;AACjD,IAAI/B,MAAgB+B,MAClB/B,IAAc;AAAA,EAKlB,CAAC;AAGH;AAEAH,EAAI,iBAAiB,WAAW,CAACuD,MAAuC;AACtE,QAAMC,IAAOD,EAAM;AAEnB,UAAQC,EAAK,MAAA;AAAA,IACX,KAAK;AACH,MAAAtD,IAAcsD,EAAK,MACnBpD,EAAK,EAAE,MAAM,SAAS;AACtB;AAAA,IACF,KAAK;AACH,MAAAkD,GAAYE,CAAI;AAChB;AAAA,IACF,KAAK;AACH,MAAArD,GAAa,MAAA;AACb;AAAA,IACF;AACE,MAAAG;AAAA,QACE,yBAA0BkD,EAA2B,IAAI;AAAA,QACzD3G,EAAmB;AAAA,MAAA;AAAA,EACrB;AAEN,CAAC;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zeldhash-miner",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "author": "Ouziel Slama <ouziel@gmail.com>",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/wasm/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "Ouziel Slama <ouziel@gmail.com>"
6
6
  ],
7
7
  "description": "WASM bindings for the Zeldhash miner with optional WebGPU acceleration",
8
- "version": "0.2.0",
8
+ "version": "0.2.2",
9
9
  "license": "MIT",
10
10
  "repository": {
11
11
  "type": "git",
Binary file