nano-pow
Version:
Proof-of-work generation and validation with WebGPU/WebGL/WASM for Nano cryptocurrency.
749 lines (733 loc) • 134 kB
JavaScript
var __toBinary = /* @__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@zoso.dev>
//! 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@zoso.dev>
//! 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;
} 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@zoso.dev>
//! 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?.();
isWebgpuSupported = adapter instanceof GPUAdapter;
} 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@zoso.dev>
//! 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@zoso.dev>
//! SPDX-License-Identifier: GPL-3.0-or-later
function bigintAsUintNArray(int, bits, length = 0) {
const UintTypedArray = {
8: Uint8Array,
16: Uint16Array,
32: Uint32Array,
64: BigUint64Array
};
if (![8, 16, 32, 64].includes(bits)) throw new Error("Invalid TypedArray UintN subclass");
if (int < 0n) int = ~(int - 1n);
length = Math.max(length, Math.ceil(bigintByteLength(int) / bits));
const mask = (1n << BigInt(bits)) - 1n;
const uintArray = new UintTypedArray[bits](length);
for (let i = length - 1; i >= 0; i--) {
bits === 64 ? uintArray[i] = int & mask : uintArray[i] = Number(int & mask);
int >>= BigInt(bits);
}
return uintArray;
}
function bigintBitLength(int) {
let bitLength = 1n;
while (int > 1n || int < -1n) {
bitLength++;
int >>= 1n;
}
return bitLength;
}
function bigintByteLength(int) {
let byteLength = 0;
while (int > 0n || int < -1n) {
byteLength++;
int >>= 8n;
}
return byteLength;
}
function bigintFrom(value, type) {
if (typeof value === "bigint") {
return value;
} else if (typeof value === "boolean" || typeof value === "number") {
return BigInt(value);
} else if (typeof value === "string") {
const v3 = value.trim().replace(/n$/, "");
if (/^0[Bb][01]+$/.test(v3) || /^0[Oo][0-7]+$/.test(v3) || /^0[Xx][A-Fa-f\d]+$/.test(v3) || /^\d+$/.test(v3)) {
return BigInt(v3);
}
if (type === "bin" && /^[01]+$/.test(v3)) {
return BigInt(`0b${v3}`);
}
if (type === "oct" && /^[0-7]+$/.test(v3)) {
return BigInt(`0o${v3}`);
}
if (type === "hex" || /^\d*[A-Fa-f]+\d*$/.test(v3)) {
return BigInt(`0x${v3}`);
}
}
throw new TypeError(`can't convert string to BigInt`);
}
function bigintRandom(max = 0xFFFFFFFFFFFFFFFFn) {
if (typeof max !== "bigint" || max < 1n) {
throw new TypeError("Invalid max value");
}
const randomUint8Array = new Uint8Array(bigintByteLength(max));
const mask = (1n << bigintBitLength(max)) - 1n;
let output = 0n;
do {
output = 0n;
crypto.getRandomValues(randomUint8Array);
output = BigInt(randomUint8Array[0]);
for (let i = 1; i < randomUint8Array.length; i++) {
output <<= 8n;
output += BigInt(randomUint8Array[i]);
}
output &= mask;
} while (output > max);
return output;
}
function bigintToHex(int, length = 0) {
if (typeof length !== "number") {
throw new TypeError("invalid length");
}
return int.toString(16).padStart(length, "0");
}
// src/utils/cache.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@zoso.dev>
//! SPDX-License-Identifier: GPL-3.0-or-later
var Cache = class {
static #storage = {};
static #getItem(key) {
if (globalThis?.localStorage) return globalThis.localStorage.getItem(key);
return this.#storage[key];
}
static #setItem(key, item) {
if (globalThis?.localStorage) return globalThis.localStorage.setItem(key, item);
this.#storage[key] = item;
}
static search(hash, difficulty) {
const bigintHash = bigintFrom(hash, "hex");
const item = this.#getItem("NanoPowCache");
if (item) {
const cache = JSON.parse(item);
for (const c of cache) {
if (bigintFrom(c.hash, "hex") === bigintHash && bigintFrom(c.difficulty, "hex") >= difficulty) {
return c;
}
}
}
return null;
}
static store(result2) {
const item = this.#getItem("NanoPowCache");
const cache = JSON.parse(item ?? "[]");
if (cache.push(result2) > 1e3) cache.shift();
this.#setItem("NanoPowCache", JSON.stringify(cache));
return result2;
}
};
// src/utils/logger.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@zoso.dev>
//! 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@zoso.dev>
//! 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@zoso.dev>
//! SPDX-License-Identifier: GPL-3.0-or-later
var SEND = 0xfffffff800000000n;
var RECEIVE = 0xfffffe0000000000n;
function stats(times) {
if (times == null || times.length === 0) return null;
const count = times.length;
const truncatedStart = Math.floor(count * 0.1);
const truncatedEnd = count - truncatedStart;
const truncatedCount = truncatedEnd - truncatedStart;
let min = Number.MAX_SAFE_INTEGER;
let logarithms, max, median, reciprocals, total;
logarithms = max = median = reciprocals = total = 0;
let truncatedMin = Number.MAX_SAFE_INTEGER;
let truncatedLogarithms, truncatedMax, truncatedReciprocals, truncatedTotal;
truncatedLogarithms = truncatedMax = truncatedReciprocals = truncatedTotal = 0;
times.sort((a, b) => a - b);
for (let i = 0; i < count; i++) {
const time = times[i];
total += time;
logarithms += Math.log(time);
reciprocals += 1 / time;
min = Math.min(min, time);
max = Math.max(max, time);
if (i === Math.floor((count - 1) / 2)) median = time;
if (i === Math.floor(count / 2) && count % 2 === 0) median = (median + time) / 2;
}
for (let i = truncatedStart; i < truncatedEnd; i++) {
const time = times[i];
truncatedTotal += time;
truncatedLogarithms += Math.log(time);
truncatedReciprocals += 1 / time;
truncatedMin = Math.min(truncatedMin, time);
truncatedMax = Math.max(truncatedMax, time);
}
return {
count,
total,
rate: 1e3 * count / total,
min,
max,
median,
arithmetic: total / count,
geometric: Math.exp(logarithms / count),
harmonic: count / reciprocals,
truncatedCount,
truncatedTotal,
truncatedRate: 1e3 * truncatedCount / truncatedTotal,
truncatedMin,
truncatedMax,
truncatedArithmetic: truncatedTotal / truncatedCount,
truncatedGeometric: Math.exp(truncatedLogarithms / truncatedCount),
truncatedHarmonic: truncatedCount / truncatedReciprocals
};
}
// src/lib/validate/index.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@zoso.dev>
//! 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, bigintAsUintNArray(hash, 64, 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: bigintToHex(hash, 64),
work: bigintToHex(work, 16),
difficulty: bigintToHex(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@zoso.dev>
//! 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 {
let result2 = validate(bigintRandom(), hash, difficulty, false);
for (let i = 0; i < 32768; i++) {
result2 = validate(bigintRandom(), hash, difficulty, false);
if (result2.valid === "1") break;
}
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@zoso.dev>
//! 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) {
let result2 = null;
try {
if (!isReady3) await setup3();
const hashArray = new BigUint64Array(4);
const hashView = new DataView(hashArray.buffer);
if (msg.data === "start") {
result2 = "started";
} else if (msg.data === "stop") {
removeEventListener("message", handleMessage);
result2 = "stopped";
} else {
const data2 = JSON.parse(msg.data);
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];
}
} catch (err) {
if (typeof err === "object" && err != null) {
const e = err;
if (e.message !== "divide by zero") {
result2 = e.message;
}
} else {
result2 = JSON.stringify(err);
}
} finally {
postMessage(result2);
addEventListener("message", handleMessage);
}
}
addEventListener("message", handleMessage);
};
var NanoPowWasmWorker = `
;await (${worker})([${compute_default}])
`;
// src/lib/generate/wasm/index.ts
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@zoso.dev>
//! 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 = bigintToHex(hash, 64);
data.difficulty = bigintToHex(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.onmessage = (msg) => msg.data === "started" ? resolve(msg.data) : reject(msg.data);
w.onerror = (err) => reject(err.message);
w.postMessage("start");
}));
}
Promise.all(resolutions).then(ready).catch(fail);
});
}
async function dispatch() {
return new Promise((resolve) => {
const attempts = [];
for (let i = 0; i < workers.length; i++) {
data.seed = bigintToHex(bigintRandom() & ~((1n << 24n) - 1n), 16);
attempts.push(new Promise((found, err) => {
const w = workers[i];
w.onerror = err;
w.onmessage = (msg) => {
const result2 = msg.data;
found(result2);
};
w.postMessage(JSON.stringify(data));
}));
}
Promise.all(attempts).then((results) => {
const result2 = results.find((r) => typeof r === "bigint");
result2 ? resolve(result2) : resolve(dispatch());
});
});
}
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 result2 = msg.data;
if (result2 === "stopped") {
resolve(result2);
} else {
reject(i);
}
};
w.postMessage("stop");
}));
}
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: bigintToHex(hash, 64),
work: bigintToHex(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@zoso.dev>
//! 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@zoso.dev>
//! 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(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);v1+=m3;v1.y+=uint(v1.x<m3.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);v2+=m1;v2.y+=uint(v2.x<m1.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+=m4;v3.y+=uint(v3.x<m4.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+=m3;v1.y+=uint(v1.x<m3.x);v13 ^=v1;v13=v13.yx;v9+=v13;v9.y+=uint(v9.x<v13.x)