nano-pow
Version:
Proof-of-work generation and validation with WebGPU/WebGL/WASM for Nano cryptocurrency.
816 lines (799 loc) • 131 kB
JavaScript
var __toBinary = Uint8Array.fromBase64 || /* @__PURE__ */ (() => {
var table = new Uint8Array(128);
for (var i = 0; i < 64; i++) table[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i * 4 - 205] = i;
return (base64) => {
var n = base64.length, bytes = new Uint8Array((n - (base64[n - 1] == "=") - (base64[n - 2] == "=")) * 3 / 4 | 0);
for (var i2 = 0, j = 0; i2 < n; ) {
var c0 = table[base64.charCodeAt(i2++)], c1 = table[base64.charCodeAt(i2++)];
var c2 = table[base64.charCodeAt(i2++)], c3 = table[base64.charCodeAt(i2++)];
bytes[j++] = c0 << 2 | c1 >> 4;
bytes[j++] = c1 << 4 | c2 >> 2;
bytes[j++] = c2 << 6 | c3;
}
return bytes;
};
})();
// src/utils/api-support/wasm.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-License-Identifier: GPL-3.0-or-later
var wasm = { isSupported: false };
Object.defineProperty(wasm, "isSupported", {
get: async function() {
let isWasmSupported = false;
try {
const wasmBuffer = new Uint8Array([
0,
97,
115,
109,
1,
0,
0,
0,
// WASM magic header and version
1,
4,
// Type section, 4 byte descriptor
1,
96,
0,
0,
// 1 type, type function, 0 params, 0 returns
3,
2,
// Function section, 2 byte descriptor
1,
0,
// 1 function, ID 0
10,
23,
// Code section, 23 bytes
1,
21,
// 1 function body, 21 bytes
0,
// 0 local variables
253,
12,
// v128.const
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
// assign i64x2 values
26,
11
// Drop result, end function
]);
const module = await WebAssembly.compile(wasmBuffer);
const instance = await WebAssembly.instantiate(module);
isWasmSupported = instance instanceof WebAssembly.Instance;
} catch (err) {
console.warn("WASM is not supported in this environment.\n", err.message ?? err);
isWasmSupported = false;
} finally {
delete this.isSupported;
this.isSupported = isWasmSupported;
return this.isSupported;
}
}
});
// src/utils/api-support/webgl.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-License-Identifier: GPL-3.0-or-later
var webgl = { isSupported: false };
Object.defineProperty(webgl, "isSupported", {
get: async function() {
let isWebglSupported = false;
try {
const gl2 = new OffscreenCanvas(0, 0)?.getContext?.("webgl2");
isWebglSupported = gl2 instanceof WebGL2RenderingContext && !gl2.isContextLost();
} catch (err) {
console.warn("WebGL is not supported in this environment.\n", err);
isWebglSupported = false;
} finally {
delete this.isSupported;
this.isSupported = isWebglSupported;
return this.isSupported;
}
}
});
// src/utils/api-support/webgpu.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-License-Identifier: GPL-3.0-or-later
var webgpu = { isSupported: false };
Object.defineProperty(webgpu, "isSupported", {
get: async function() {
let isWebgpuSupported = false;
try {
const adapter = await navigator?.gpu?.requestAdapter?.();
const device2 = await adapter?.requestDevice?.();
isWebgpuSupported = adapter instanceof GPUAdapter && device2 instanceof GPUDevice;
} catch (err) {
console.warn("WebGPU is not supported in this environment.\n", err);
isWebgpuSupported = false;
} finally {
delete this.isSupported;
this.isSupported = isWebgpuSupported;
return this.isSupported;
}
}
});
// src/utils/api-support/index.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-License-Identifier: GPL-3.0-or-later
var ApiSupport = { cpu: { isSupported: true }, wasm, webgl, webgpu };
// src/utils/bigint.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-License-Identifier: GPL-3.0-or-later
function big(value) {
switch (typeof value) {
case "bigint":
case "boolean":
case "number": {
return BigInt(value);
}
case "string": {
const v3 = value.trim().replace(/^0[Xx]/, "").replace(/[Nn]$/, "");
if (!isHexN(v3, null)) throw TypeError("invalid hex string", { cause: value });
return BigInt(`0x${v3}`);
}
default: {
throw TypeError(`can't convert value to BigInt`);
}
}
}
function bigHex(int, length = 0) {
return int.toString(16).padStart(length, "0");
}
function bigToU32(int, length) {
const u32 = new Uint32Array(length);
bigintToUintArray(u32, int);
return u32;
}
function bigToU64(int, length) {
const u64 = new BigUint64Array(length);
bigintToUintArray(u64, int);
return u64;
}
function bigintToUintArray(out, int) {
if (int < 0n) int = ~(int - 1n);
const bits = out instanceof BigUint64Array ? 64n : 32n;
const mask = (1n << bits) - 1n;
for (let i = out.length - 1; i >= 0 && int > 0n; i--) {
const v3 = int & mask;
out[i] = bits === 64n ? v3 : Number(v3);
int >>= bits;
}
}
// src/utils/cache.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-License-Identifier: GPL-3.0-or-later
var STORAGE_KEY = "NanoPowCache";
var storage = globalThis.localStorage ?? {
records: /* @__PURE__ */ new Map(),
getItem(key) {
return this.records.get(key);
},
removeItem(key) {
this.records.delete(key);
},
setItem(key, item) {
this.storage.set(key, item);
}
};
function eq(a, b) {
return typeof a === "string" && /^([a-f0-9]{2})+$/i.test(a) && BigInt(`0x${a}`) === b;
}
var Cache = {
clear() {
storage.removeItem(STORAGE_KEY);
},
delete(hash) {
const item = storage.getItem(STORAGE_KEY);
if (item == null) return;
const cache = JSON.parse(item);
for (let i = 0; i < cache.length; i++) {
if (cache[i].hash === hash) {
cache.splice(i, 1);
}
}
storage.setItem(STORAGE_KEY, JSON.stringify(cache));
},
search(hash, difficulty) {
const item = storage.getItem(STORAGE_KEY);
if (item == null) return null;
const cache = JSON.parse(item);
const match = cache.find((c) => c.hash === hash && eq(c.difficulty, difficulty));
return match ?? null;
},
store(result2) {
const item = storage.getItem(STORAGE_KEY) ?? "[]";
const cache = JSON.parse(item);
if (cache.push(result2) > 1e3) cache.shift();
storage.setItem(STORAGE_KEY, JSON.stringify(cache));
return result2;
}
};
// src/utils/logger.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-License-Identifier: GPL-3.0-or-later
var Logger = class {
isEnabled = false;
groups = {};
groupStart(name) {
if (this.isEnabled) {
console.groupCollapsed(name);
this.groups[name] = true;
}
}
groupEnd(name) {
if (this.groups[name]) {
console.groupEnd();
delete this.groups[name];
}
}
log(...args) {
if (this.isEnabled) {
const datetime = new Date(Date.now()).toLocaleString(Intl.DateTimeFormat().resolvedOptions().locale ?? "en-US", { hour12: false, dateStyle: "medium", timeStyle: "medium" });
for (let i = 0; i < args.length; i++) {
if (typeof args[i] === "string") {
args[i] = args[i].replace(datetime, "").trimStart();
}
if (args[i] instanceof Error) {
if ("stack" in args[i]) {
args.splice(i + 1, 0, args[i].stack);
} else if ("message" in args[i]) {
args.splice(i + 1, 0, args[i].message);
}
}
}
const entry = `${datetime} ${globalThis.process?.title ?? "NanoPow"}[${globalThis.process?.pid ?? "browser"}]:`;
console.log(entry, ...args);
globalThis.process?.send?.({ type: "console", data: `${entry} ${args}` });
}
}
};
// src/utils/queue.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-License-Identifier: GPL-3.0-or-later
var Queue = class {
#isIdle;
#queue;
constructor() {
this.#isIdle = true;
this.#queue = [];
}
#process = () => {
const { task, resolve, reject, args } = this.#queue.shift() ?? {};
this.#isIdle = !task;
task?.(...args).then(resolve).catch(reject).finally(this.#process);
};
async add(task, ...args) {
if (typeof task !== "function") throw new TypeError("task is not a function");
return new Promise((resolve, reject) => {
this.#queue.push({ task, resolve, reject, args });
if (this.#isIdle) this.#process();
});
}
async prioritize(task, ...args) {
if (typeof task !== "function") throw new TypeError("task is not a function");
return new Promise((resolve, reject) => {
if (typeof task !== "function") reject("task is not a function");
this.#queue.unshift({ task, resolve, reject, args });
if (this.#isIdle) this.#process();
});
}
};
// src/utils/index.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-License-Identifier: GPL-3.0-or-later
var SEND = 0xfffffff800000000n;
var RECEIVE = 0xfffffe0000000000n;
var MAX_HASH = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn;
function isHexN(value, byteLength) {
if (typeof value !== "string") return false;
const length = byteLength === null ? "+" : `{${byteLength << 1}}`;
const r = new RegExp(`^[0-9a-f]${length}$`, "i");
return r.test(value);
}
// src/lib/config/index.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-License-Identifier: GPL-3.0-or-later
var NanoPowConfigConstructor = class {
static #isInternal = false;
static get isInternal() {
return this.#isInternal;
}
api;
debug;
difficulty;
effort;
toJSON() {
return {
api: this.api,
debug: this.debug,
difficulty: bigHex(this.difficulty, 16),
effort: this.effort
};
}
constructor(api, debug, difficulty, effort) {
if (!this.constructor.isInternal) {
throw new TypeError(`NanoPowConfig cannot be constructed with 'new'.`);
}
this.api = api;
this.debug = debug;
this.difficulty = difficulty;
this.effort = effort;
}
static async create(options) {
const input = options;
const api = await this.#getValidApi(input);
const debug = this.#getValidDebug(input);
const difficulty = this.#getValidDifficulty(input);
const effort = this.#getValidEffort(input);
this.#isInternal = true;
const config = new this(api, debug, difficulty, effort);
this.#isInternal = false;
return config;
}
// Check platform support for default API setting
static async #getDefaultApi() {
if (await ApiSupport.webgpu.isSupported) return "webgpu";
if (await ApiSupport.webgl.isSupported) return "webgl";
if (await ApiSupport.wasm.isSupported) return "wasm";
return "cpu";
}
// Assign API if valid value passed
static async #getValidApi(input) {
if (input != null && input.api != null) {
if (typeof input.api === "string") {
try {
input.api = input.api.toLowerCase();
} catch {
input.api = null;
}
}
if (input.api !== "cpu" && input.api !== "wasm" && input.api !== "webgl" && input.api !== "webgpu") {
throw new Error(`Invalid API ${input.api}`);
}
if (!ApiSupport[input.api].isSupported) {
throw new Error(`${input.api} is not supported`);
}
return input.api;
}
return this.#getDefaultApi();
}
// Assign debug if valid value passed
static #getValidDebug(input) {
if (input != null && input.debug != null) {
if (typeof input.debug === "bigint" || typeof input.debug === "number") {
input.debug = input.debug.toString();
}
if (typeof input.debug === "string") {
input.debug = ["1", "true", "y", "yes"].includes(input.debug.toLowerCase());
}
if (typeof input.debug !== "boolean") {
throw new Error(`Invalid debug ${input.debug}`);
}
return input.debug;
}
return false;
}
// Assign difficulty if valid value passed
static #getValidDifficulty(input) {
if (input != null && input.difficulty != null) {
if (typeof input.difficulty === "string") {
try {
input.difficulty = big(input.difficulty);
} catch {
}
}
if (typeof input.difficulty !== "bigint") {
throw new Error(`Invalid difficulty ${input.difficulty}`);
}
if (input.difficulty < 0n || input.difficulty > SEND) {
throw new Error(`Invalid difficulty ${bigHex(input.difficulty, 16)}`);
}
return input.difficulty;
}
return SEND;
}
// Assign effort if valid value passed
static #getValidEffort(input) {
if (input != null && input.effort != null) {
if (typeof input.effort !== "number") {
throw new Error(`Invalid effort (${typeof input.effort})${input.effort}`);
}
if (input.effort < 1 || input.effort > 32) {
throw new Error(`Invalid effort ${input.effort}`);
}
return input.effort;
}
return 4;
}
};
var NanoPowConfig = (options) => {
try {
return NanoPowConfigConstructor.create(options);
} catch (err) {
throw new Error("Error constructing NanoPowConfig", { cause: err });
}
};
// src/lib/validate/index.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-License-Identifier: GPL-3.0-or-later
var logger = new Logger();
var blake2b_IV = Object.freeze([
0x6a09e667f3bcc908n,
0xbb67ae8584caa73bn,
0x3c6ef372fe94f82bn,
0xa54ff53a5f1d36f1n,
0x510e527fade682d1n,
0x9b05688c2b3e6c1fn,
0x1f83d9abfb41bd6bn,
0x5be0cd19137e2179n
]);
var blake2b_sigma = Object.freeze([
Object.freeze([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),
Object.freeze([14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3]),
Object.freeze([11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4]),
Object.freeze([7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8]),
Object.freeze([9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13]),
Object.freeze([2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9]),
Object.freeze([12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11]),
Object.freeze([13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10]),
Object.freeze([6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5]),
Object.freeze([10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0]),
Object.freeze([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),
Object.freeze([14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3])
]);
var blake2b_param = 0x01010008n;
var v = new BigUint64Array(16);
var m = new BigUint64Array(16);
var mView = new DataView(m.buffer);
var result = 0n;
function G(a, b, c, d, x, y) {
v[a] += v[b] + m[x];
v[d] ^= v[a];
v[d] = v[d] >> 32n | v[d] << 32n;
v[c] += v[d];
v[b] ^= v[c];
v[b] = v[b] >> 24n | v[b] << 40n;
v[a] += v[b] + m[y];
v[d] ^= v[a];
v[d] = v[d] >> 16n | v[d] << 48n;
v[c] += v[d];
v[b] ^= v[c];
v[b] = v[b] >> 63n | v[b] << 1n;
}
function ROUND(i) {
const s = blake2b_sigma[i];
G(0, 4, 8, 12, s[0], s[1]);
G(1, 5, 9, 13, s[2], s[3]);
G(2, 6, 10, 14, s[4], s[5]);
G(3, 7, 11, 15, s[6], s[7]);
G(0, 5, 10, 15, s[8], s[9]);
G(1, 6, 11, 12, s[10], s[11]);
G(2, 7, 8, 13, s[12], s[13]);
G(3, 4, 9, 14, s[14], s[15]);
}
function init(seed, hash) {
result = 0n;
for (let i = 0; i < 8; i++) {
v[i] = blake2b_IV[i];
v[i + 8] = blake2b_IV[i];
}
v[0] ^= blake2b_param;
v[12] ^= 40n;
v[14] = ~v[14];
mView.setBigUint64(0, seed, true);
for (let i = 0; i < 4; i++) {
mView.setBigUint64(8 * (i + 1), hash[i]);
}
}
function blake2b(work, hash) {
init(work, bigToU64(hash, 4));
for (let i = 0; i < 12; i++) {
ROUND(i);
}
result = blake2b_IV[0] ^ 0x01010008n ^ v[0] ^ v[8];
}
function log(work, hash, difficulty) {
}
function validate(work, hash, difficulty, debug) {
logger.isEnabled = debug;
blake2b(work, hash);
log(work, hash, difficulty);
return {
hash: bigHex(hash, 64),
work: bigHex(work, 16),
difficulty: bigHex(result, 16),
valid: result >= difficulty ? "1" : "0",
valid_all: result >= SEND ? "1" : "0",
valid_receive: result >= RECEIVE ? "1" : "0"
};
}
// src/lib/generate/cpu/index.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-License-Identifier: GPL-3.0-or-later
var logger2 = new Logger();
async function generate(hash, difficulty, debug) {
logger2.isEnabled = debug;
return new Promise((resolve, reject) => {
const check3 = () => {
try {
const seed = new BigUint64Array(1);
let result2 = validate(crypto.getRandomValues(seed)[0], hash, difficulty, false);
for (let i = 0; i < 32768; i++) {
if (result2.valid === "1") break;
result2 = validate(crypto.getRandomValues(seed)[0], hash, difficulty, false);
}
if (result2.valid === "1") {
resolve({
hash: result2.hash,
work: result2.work,
difficulty: result2.difficulty
});
} else {
requestAnimationFrame(check3);
}
} catch (err) {
reject(err);
}
};
check3();
});
}
// src/lib/generate/wasm/asm/build/compute.wasm
var compute_default = __toBinary("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");
// src/lib/generate/wasm/worker.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-License-Identifier: GPL-3.0-or-later
var worker = async (compute) => {
let isReady3 = false;
let wasm2;
let module;
let instance;
let main;
async function setup3() {
try {
wasm2 = Uint8Array.from(compute);
module = await WebAssembly.compile(wasm2);
instance = await WebAssembly.instantiate(module, {
env: {
abort: (message, fileName, lineNumber, columnNumber) => {
console.error("Wasm abort:", message, fileName, lineNumber, columnNumber);
throw new Error(`Wasm abort: ${message}`);
},
memory: new WebAssembly.Memory({ initial: 256, maximum: 1024 })
}
});
main = instance.exports.main;
isReady3 = true;
} catch (err) {
throw new Error("Error instantiating WebAssembly", { cause: err });
}
}
async function handleMessage(msg) {
if (msg?.data?.url !== self.location.href) return;
let result2 = null;
try {
const { data: data2 } = msg;
if (!isReady3) await setup3();
const hashArray = new BigUint64Array(4);
const hashView = new DataView(hashArray.buffer);
if (data2.start) {
result2 = "started";
} else if (data2.stop) {
removeEventListener("message", handleMessage);
result2 = "stopped";
} else {
const seed = BigInt(`0x${data2.seed}`);
const difficulty = BigInt(`0x${data2.difficulty}`);
for (let i = 0; i < data2.hash.length; i += 16) {
const u64 = data2.hash.slice(i, i + 16);
hashView.setBigUint64(i / 2, BigInt(`0x${u64}`));
}
const work = main(seed, hashArray[0], hashArray[1], hashArray[2], hashArray[3], difficulty);
if (typeof work !== "bigint") {
throw new TypeError("Invalid work from WASM");
}
const workArray = new BigUint64Array(1);
const workView = new DataView(workArray.buffer);
workView.setBigUint64(0, work, true);
result2 = workArray[0].toString(16).padStart(16, "0");
}
} catch (err) {
if (typeof err === "object" && err != null) {
const e = err;
if (typeof e.message === "string" && e.message.includes("divide by zero")) {
result2 = "";
} else {
result2 = e.message;
}
} else {
result2 = JSON.stringify(err);
}
} finally {
if (result2 != null) {
postMessage({ result: result2, url: self.location.href });
}
addEventListener("message", handleMessage);
}
}
addEventListener("message", handleMessage);
};
var NanoPowWasmWorker = `
;await (${worker})([${compute_default}])
`;
// src/lib/generate/wasm/index.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-License-Identifier: GPL-3.0-or-later
var logger3 = new Logger();
var isReady = false;
var data = {};
var v2 = new BigUint64Array(16);
var m2 = new BigUint64Array(16);
var workers = [];
var url;
function setup() {
try {
url = URL.createObjectURL(new Blob([NanoPowWasmWorker], { type: "text/javascript" }));
workers = [];
isReady = true;
} catch (err) {
isReady = false;
throw new Error("NanoPow CPU initialization failed.", { cause: err });
}
}
function reset() {
console.warn(`NanoPow CPU encountered an error. Reinitializing...`);
isReady = false;
for (const w of workers) w.terminate();
workers = [];
m2?.fill(0n);
v2?.fill(0n);
}
async function init2(hash, difficulty, effort) {
data.hash = bigHex(hash, 64);
data.difficulty = bigHex(difficulty, 16);
for (let i = workers.length; i < effort; i++) {
workers.push(new Worker(url, { type: "module" }));
}
while (workers.length - effort > 0) {
workers.pop()?.terminate();
}
try {
await workersStarted();
} catch (err) {
throw new Error("Error loading workers");
}
}
async function workersStarted() {
return new Promise(async (ready, fail) => {
const resolutions = [];
for (const w of workers) {
resolutions.push(new Promise((resolve, reject) => {
w.onerror = reject;
w.onmessage = (msg) => {
const { data: data2 } = msg;
if (data2.url === url) {
data2.result === "started" ? resolve(data2) : reject(data2);
}
};
w.postMessage({ start: true, url });
}));
}
Promise.all(resolutions).then(ready).catch(fail);
});
}
async function dispatch() {
return new Promise((resolve, reject) => {
const seed = crypto.getRandomValues(new BigUint64Array(workers.length));
const attempts = [];
for (let i = 0; i < workers.length; i++) {
data.seed = bigHex(seed[i], 16);
attempts.push(new Promise((found, err) => {
const w = workers[i];
w.onerror = err;
w.onmessage = (msg) => {
const { data: data2 } = msg;
if (data2.url === url) {
found(data2.result);
}
};
w.postMessage({ ...data, url });
}));
}
Promise.all(attempts).then((results) => {
const result2 = results.find((r) => typeof r === "string" && r !== "");
resolve(result2 ? big(result2) : dispatch());
}).catch((err) => reject(err));
});
}
async function workersStopped() {
return new Promise((stopped) => {
try {
const attempts = [];
for (let i = 0; i < workers.length; i++) {
attempts.push(new Promise((resolve, reject) => {
const w = workers[i];
w.onerror = reject;
w.onmessage = (msg) => {
const { data: data2 } = msg;
if (data2.url === url) {
data2.result === "stopped" ? resolve(true) : reject(i);
}
};
w.postMessage({ stop: true, url });
}));
}
Promise.allSettled(attempts).then((results) => {
for (const result2 of results) {
if (result2.status === "rejected") {
const i = result2.reason;
workers[i].terminate();
workers.splice(i);
}
}
stopped(true);
});
} catch {
stopped(false);
}
});
}
async function generate2(hash, difficulty, effort, debug) {
logger3.isEnabled = debug;
if (isReady === false) setup();
await init2(hash, difficulty, effort);
let work = 0n;
let result2 = "";
try {
work = await dispatch();
result2 = (await validate(work, hash, difficulty, debug)).difficulty;
} catch (err) {
} finally {
const isStopped = await workersStopped();
if (isStopped) {
} else {
reset();
}
}
return {
hash: bigHex(hash, 64),
work: bigHex(work, 16),
difficulty: result2
};
}
// src/lib/generate/webgl/shaders/downsample.frag
var downsample_default = `#version 300 es
#pragma vscode_glsllint_stage: frag
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-License-Identifier: GPL-3.0-or-later
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
precision highp int;out uvec4 nonce;uniform highp usampler2D src;void main(){nonce=uvec4(0u);vec2 inputSize=vec2(textureSize(src,0));vec2 texel=vec2(1.0)/inputSize;vec2 blockCoord=(floor(gl_FragCoord.xy)*2.0+vec2(0.5))/inputSize;uvec4 pixel=texture(src,blockCoord);nonce=pixel.x==0u?nonce:pixel;pixel=texture(src,blockCoord+vec2(texel.x,0.0));nonce=pixel.x==0u?nonce:pixel;pixel=texture(src,blockCoord+vec2(0.0,texel.y));nonce=pixel.x==0u?nonce:pixel;pixel=texture(src,blockCoord+vec2(texel.x,texel.y));nonce=pixel.x==0u?nonce:pixel;}`;
// src/lib/generate/webgl/shaders/draw.frag
var draw_default = `#version 300 es
#pragma vscode_glsllint_stage: frag
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-FileContributor: Ben Green <ben@latenightsketches.com>
//! SPDX-License-Identifier: GPL-3.0-or-later AND MIT
layout(std140)uniform INPUT{uint hash[8];uvec2 difficulty;uvec2 seed;};out uvec4 work;void main(){work=uvec4(0u);uvec2 m0=seed ^ uvec2(gl_FragCoord);uvec2 m1=uvec2(hash[0u],hash[1u]);uvec2 m2=uvec2(hash[2u],hash[3u]);uvec2 m3=uvec2(hash[4u],hash[5u]);uvec2 m4=uvec2(hash[6u],hash[7u]);uvec2 v0=uvec2(0xf3bcc908u,0x6a09e667u);uvec2 v8=uvec2(0xf3bcc908u,0x6a09e667u);uvec2 v1=uvec2(0x84caa73bu,0xbb67ae85u);uvec2 v9=uvec2(0x84caa73bu,0xbb67ae85u);uvec2 v2=uvec2(0xfe94f82bu,0x3c6ef372u);uvec2 v10=uvec2(0xfe94f82bu,0x3c6ef372u);uvec2 v3=uvec2(0x5f1d36f1u,0xa54ff53au);uvec2 v11=uvec2(0x5f1d36f1u,0xa54ff53au);uvec2 v4=uvec2(0xade682d1u,0x510e527fu);uvec2 v12=uvec2(0xade682d1u,0x510e527fu);uvec2 v5=uvec2(0x2b3e6c1fu,0x9b05688cu);uvec2 v13=uvec2(0x2b3e6c1fu,0x9b05688cu);uvec2 v6=uvec2(0xfb41bd6bu,0x1f83d9abu);uvec2 v14=uvec2(0xfb41bd6bu,0x1f83d9abu);uvec2 v7=uvec2(0x137e2179u,0x5be0cd19u);uvec2 v15=uvec2(0x137e2179u,0x5be0cd19u);v0 ^=uvec2(0x01010008u,0x0u);v12 ^=uvec2(0x28u,0x0u);v14 ^=uvec2(~0x0u);v0+=v4;v0.y+=uint(v0.x<v4.x);v0+=m0;v0.y+=uint(v0.x<m0.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v0+=v4;v0.y+=uint(v0.x<v4.x);v0+=m1;v0.y+=uint(v0.x<m1.x);v12 ^=v0;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v1+=v5;v1.y+=uint(v1.x<v5.x);v1+=m2;v1.y+=uint(v1.x<m2.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v1+=v5;v1.y+=uint(v1.x<v5.x);v1+=m3;v1.y+=uint(v1.x<m3.x);v13 ^=v1;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v2+=v6;v2.y+=uint(v2.x<v6.x);v2+=m4;v2.y+=uint(v2.x<m4.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v1+=v6;v1.y+=uint(v1.x<v6.x);v12 ^=v1;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v1+=v5;v1.y+=uint(v1.x<v5.x);v1+=m4;v1.y+=uint(v1.x<m4.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v1+=v5;v1.y+=uint(v1.x<v5.x);v13 ^=v1;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=v15.yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v3+=v7;v3.y+=uint(v3.x<v7.x);v15 ^=v3;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v11+=v15;v11.y+=uint(v11.x<v15.x);v7 ^=v11;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v0+=v5;v0.y+=uint(v0.x<v5.x);v0+=m1;v0.y+=uint(v0.x<m1.x);v15 ^=v0;v15=v15.yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v0+=v5;v0.y+=uint(v0.x<v5.x);v15 ^=v0;v15=(v15>>uvec2(16u))|(v15<<uvec2(16u)).yx;v10+=v15;v10.y+=uint(v10.x<v15.x);v5 ^=v10;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v1+=v6;v1.y+=uint(v1.x<v6.x);v1+=m0;v1.y+=uint(v1.x<m0.x);v12 ^=v1;v12=v12.yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v1+=v6;v1.y+=uint(v1.x<v6.x);v1+=m2;v1.y+=uint(v1.x<m2.x);v12 ^=v1;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v11+=v12;v11.y+=uint(v11.x<v12.x);v6 ^=v11;v6=(v6>>uvec2(31u)).yx|(v6<<uvec2(1u));v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=v13.yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(24u))|(v7<<uvec2(8u)).yx;v2+=v7;v2.y+=uint(v2.x<v7.x);v13 ^=v2;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v8+=v13;v8.y+=uint(v8.x<v13.x);v7 ^=v8;v7=(v7>>uvec2(31u)).yx|(v7<<uvec2(1u));v3+=v4;v3.y+=uint(v3.x<v4.x);v14 ^=v3;v14=v14.yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v3+=v4;v3.y+=uint(v3.x<v4.x);v3+=m3;v3.y+=uint(v3.x<m3.x);v14 ^=v3;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v9+=v14;v9.y+=uint(v9.x<v14.x);v4 ^=v9;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=v12.yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(24u))|(v4<<uvec2(8u)).yx;v0+=v4;v0.y+=uint(v0.x<v4.x);v12 ^=v0;v12=(v12>>uvec2(16u))|(v12<<uvec2(16u)).yx;v8+=v12;v8.y+=uint(v8.x<v12.x);v4 ^=v8;v4=(v4>>uvec2(31u)).yx|(v4<<uvec2(1u));v1+=v5;v1.y+=uint(v1.x<v5.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(24u))|(v5<<uvec2(8u)).yx;v1+=v5;v1.y+=uint(v1.x<v5.x);v1+=m0;v1.y+=uint(v1.x<m0.x);v13 ^=v1;v13=(v13>>uvec2(16u))|(v13<<uvec2(16u)).yx;v9+=v13;v9.y+=uint(v9.x<v13.x);v5 ^=v9;v5=(v5>>uvec2(31u)).yx|(v5<<uvec2(1u));v2+=v6;v2.y+=uint(v2.x<v6.x);v14 ^=v2;v14=v14.yx;v10+=v14;v10.y+=uint(v10.x<v14.x);v6 ^=v10;v6=(v6>>uvec2(24u))|(v6<<uvec2(8u)).yx;v2+=v6;v2.y+=uint(v2.x<v6.x);v2+=m2;v2.y+=uint(v2.x<m2.x);v14 ^=v2;v14=(v14>>uvec2(16u))|(v14<<uvec2(16u)).yx;v10+=v14;v10.y+=uint(v1