@btx-tools/challenges-sdk 0.0.2 → 0.0.3
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/index.cjs +2 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -6
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.cjs
CHANGED
|
@@ -386,9 +386,7 @@ function fromSeedRect(seed, rows, cols) {
|
|
|
386
386
|
}
|
|
387
387
|
function matAdd(a, b) {
|
|
388
388
|
if (a.rows !== b.rows || a.cols !== b.cols) {
|
|
389
|
-
throw new Error(
|
|
390
|
-
`matAdd: dim mismatch a=${a.rows}x${a.cols} b=${b.rows}x${b.cols}`
|
|
391
|
-
);
|
|
389
|
+
throw new Error(`matAdd: dim mismatch a=${a.rows}x${a.cols} b=${b.rows}x${b.cols}`);
|
|
392
390
|
}
|
|
393
391
|
const out = zeros(a.rows, a.cols);
|
|
394
392
|
for (let i = 0; i < a.data.length; i++) {
|
|
@@ -398,9 +396,7 @@ function matAdd(a, b) {
|
|
|
398
396
|
}
|
|
399
397
|
function matMul(a, b) {
|
|
400
398
|
if (a.cols !== b.rows) {
|
|
401
|
-
throw new Error(
|
|
402
|
-
`matMul: inner-dim mismatch a.cols=${a.cols} b.rows=${b.rows}`
|
|
403
|
-
);
|
|
399
|
+
throw new Error(`matMul: inner-dim mismatch a.cols=${a.cols} b.rows=${b.rows}`);
|
|
404
400
|
}
|
|
405
401
|
const out = zeros(a.rows, b.cols);
|
|
406
402
|
const rowBuf = new Uint32Array(a.cols);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/client.ts","../src/matmul/header.ts","../src/matmul/constants.ts","../src/matmul/field.ts","../src/matmul/matrix.ts","../src/matmul/noise.ts","../src/matmul/transcript.ts","../src/matmul/pow.ts","../src/solver.ts"],"names":["rawBody","sha256","writeUint32LE","hash"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Type definitions mirroring the BTX service-challenges RPC schema.\n *\n * Source: btx.dev/docs/rpc/service-challenges (verified 2026-05-20).\n * Schema captured against live btxd v0.29.7 at btx-iowa (block 106270).\n *\n * IMPORTANT: We do NOT camelCase rename — the RPC schema is the wire contract.\n * Field names mirror btxd output verbatim.\n */\n\n/** Difficulty calibration policy for issued challenges. */\nexport type DifficultyPolicy = 'fixed' | 'adaptive_window';\n\n/**\n * Standard purpose labels recognized by the chain. Free-form strings allowed too.\n *\n * The `(string & {})` trick keeps autocomplete on the known labels while still\n * accepting arbitrary purpose strings. Don't \"simplify\" to plain `string` — it\n * loses the autocompletion benefit. See: https://github.com/microsoft/TypeScript/issues/29729\n */\nexport type ChallengePurpose =\n | 'rate_limit'\n | 'api_gate'\n | 'ai_inference_gate'\n | (string & {});\n\n/** Parameters for issuing a challenge via getmatmulservicechallenge. */\nexport interface IssueParams {\n purpose: ChallengePurpose;\n resource: string;\n subject: string;\n /** Calibrates client compute work to roughly this many seconds. btxd default: 1.0. */\n target_solve_time_s?: number;\n /** Challenge lifetime in seconds. btxd default: 300. Range 1–86400. */\n expires_in_s?: number;\n validation_overhead_s?: number;\n propagation_overhead_s?: number;\n /** btxd default: \"fixed\". */\n difficulty_policy?: DifficultyPolicy;\n difficulty_window_blocks?: number;\n min_solve_time_s?: number;\n max_solve_time_s?: number;\n solver_parallelism?: number;\n solver_duty_cycle_pct?: number;\n}\n\n/**\n * Binding identifies the (purpose, resource, subject) trio the challenge is\n * scoped to. btxd also embeds hashes + anchor info for replay protection.\n */\nexport interface ChallengeBinding {\n chain: string;\n purpose: string;\n resource: string;\n subject: string;\n resource_hash: string;\n subject_hash: string;\n salt: string;\n anchor_height: number;\n anchor_hash: string;\n /** Hashing rule used to compute challenge_id. Treat as opaque docstring from btxd. */\n challenge_id_rule?: string;\n seed_derivation_rule?: string;\n /** Open extension — btxd may add fields without breaking us. */\n [k: string]: unknown;\n}\n\n/**\n * Proof policy describes what btxd will check when redeeming. Treat fields\n * as authoritative — do NOT re-derive verification rules client-side.\n */\nexport interface ChallengeProofPolicy {\n verification_rule: string;\n sigma_gate_applied: boolean;\n expiration_enforced: boolean;\n challenge_id_required: boolean;\n replay_protection: string;\n redeem_rpc: string;\n solve_rpc: string;\n locally_issued_required: boolean;\n issued_challenge_store?: string;\n issued_challenge_scope?: string;\n [k: string]: unknown;\n}\n\n/** MatMul parameters needed to solve. Day 2 solver consumes these. */\nexport interface ChallengeMatmul {\n /** Matrix dimension. btxd ships n=512 in production. */\n n: number;\n /** Block dimension for compression. */\n b: number;\n /** Noise rank. */\n r: number;\n /** Field modulus (Mersenne prime 2^31-1). */\n q: number;\n min_dimension: number;\n max_dimension: number;\n /** Hex-encoded seed for matrix A. */\n seed_a: string;\n /** Hex-encoded seed for matrix B. */\n seed_b: string;\n}\n\n/** Block header context the challenge is anchored to. */\nexport interface ChallengeHeaderContext {\n version: number;\n previousblockhash: string;\n merkleroot: string;\n time: number;\n bits: string;\n nonce64_start: number;\n matmul_dim: number;\n seed_a: string;\n seed_b: string;\n}\n\n/**\n * Inner challenge payload — what the solver actually needs.\n * The Day 2 MatMul solver reads `matmul`, `target`, `noncerange`, and `header_context`.\n */\nexport interface ChallengePayload {\n chain: string;\n algorithm: string;\n height: number;\n previousblockhash: string;\n mintime: number;\n bits: string;\n difficulty: number;\n /** Hex-encoded target. Digest must compare ≤ target for valid proof. */\n target: string;\n noncerange: string;\n header_context: ChallengeHeaderContext;\n matmul: ChallengeMatmul;\n /** btxd ships additional fields (work_profile, runtime_observability, etc.) we treat as opaque. */\n [k: string]: unknown;\n}\n\n/**\n * The challenge envelope returned by getmatmulservicechallenge.\n * Opaque to the SDK at the wire boundary — pass through to solver / redeem.\n */\nexport interface Challenge {\n /** btxd schema kind discriminator (e.g. \"matmul_service_challenge_v1\"). */\n kind?: string;\n challenge_id: string;\n issued_at: number;\n expires_at: number;\n expires_in_s: number;\n binding: ChallengeBinding;\n proof_policy: ChallengeProofPolicy;\n challenge: ChallengePayload;\n /** Open extension. */\n [k: string]: unknown;\n}\n\n/** Reasons returned by verify/redeem. Open string — btxd may add more. */\nexport type VerifyReason =\n | 'ok'\n | 'invalid_proof'\n | 'challenge_mismatch'\n | 'expired'\n | 'unknown_challenge'\n | 'already_redeemed'\n | 'missing_proof'\n | (string & {});\n\n/** Outcome of verifymatmulserviceproof / redeemmatmulserviceproof. */\nexport interface VerifyResult {\n valid: boolean;\n expired?: boolean;\n reason: VerifyReason;\n issued_by_local_node?: boolean;\n redeemed?: boolean;\n redeemable?: boolean;\n mismatch_field?: string;\n}\n\n/** Single entry in a batch redeem/verify call. */\nexport interface BatchEntry {\n challenge: Challenge;\n nonce64_hex: string;\n digest_hex: string;\n}\n\n/** Batch response — sequential per-proof results. */\nexport interface BatchResult {\n count: number;\n valid: number;\n invalid: number;\n by_reason: Record<string, number>;\n results: VerifyResult[];\n}\n\n/** Solver output (also returned by solvematmulservicechallenge RPC). */\nexport interface SolverOutput {\n nonce64_hex: string;\n digest_hex: string;\n proof: Record<string, unknown>;\n}\n\n/** RPC client configuration. */\nexport interface BtxClientOpts {\n /**\n * Full JSON-RPC endpoint, e.g. `http://127.0.0.1:19332`.\n *\n * **Security**: use HTTPS (or a localhost-only deployment) when the RPC\n * endpoint is not on `127.0.0.1`. Basic auth over plaintext exposes credentials.\n * Terminate TLS at stunnel/nginx/Caddy in front of btxd; do NOT expose\n * btxd's RPC port directly to the public internet.\n */\n rpcUrl: string;\n /** Basic-auth credentials matching btxd's rpcauth / rpcuser+rpcpassword. */\n rpcAuth: {\n user: string;\n pass: string;\n };\n /** Request timeout in ms (default 30000). */\n timeoutMs?: number;\n}\n\n// ============================================================================\n// Error taxonomy\n// ============================================================================\n\n/** Base class — all SDK errors extend this for `instanceof BtxError` checks. */\nexport class BtxError extends Error {\n constructor(\n message: string,\n public readonly method?: string,\n ) {\n super(message);\n this.name = 'BtxError';\n }\n}\n\n/** btxd returned a JSON-RPC error envelope with code + message. */\nexport class BtxRpcError extends BtxError {\n constructor(\n public readonly code: number,\n message: string,\n method?: string,\n ) {\n super(message, method);\n this.name = 'BtxRpcError';\n }\n}\n\n/** btxd returned a non-2xx HTTP status. */\nexport class BtxHttpError extends BtxError {\n constructor(\n public readonly status: number,\n /** Response body, with `Authorization: Basic ...` patterns redacted. */\n public readonly body: string,\n method?: string,\n ) {\n super(`HTTP ${status}: ${body.slice(0, 200)}`, method);\n this.name = 'BtxHttpError';\n }\n}\n\n/** The HTTP response was 2xx but the body wasn't valid JSON. */\nexport class BtxParseError extends BtxError {\n constructor(\n /** Underlying SyntaxError or similar. Overrides the ES2022 `Error.cause` slot. */\n public override readonly cause: unknown,\n /** Raw response body (redacted). */\n public readonly body: string,\n method?: string,\n ) {\n const causeMsg = cause instanceof Error ? cause.message : String(cause);\n super(`Failed to parse RPC response: ${causeMsg}`, method);\n this.name = 'BtxParseError';\n }\n}\n\n/** Request exceeded `timeoutMs`. */\nexport class BtxTimeoutError extends BtxError {\n constructor(\n public readonly timeoutMs: number,\n method?: string,\n ) {\n super(`RPC request timed out after ${timeoutMs}ms`, method);\n this.name = 'BtxTimeoutError';\n }\n}\n\n/** Transport-level failure (DNS, TCP reset, TLS, etc.). Wraps the underlying cause. */\nexport class BtxNetworkError extends BtxError {\n constructor(\n /** Underlying error from fetch / dns / tls. Overrides the ES2022 `Error.cause` slot. */\n public override readonly cause: unknown,\n method?: string,\n ) {\n const causeMsg = cause instanceof Error ? cause.message : String(cause);\n super(`RPC network error: ${causeMsg}`, method);\n this.name = 'BtxNetworkError';\n }\n}\n","import {\n BtxHttpError,\n BtxNetworkError,\n BtxParseError,\n BtxRpcError,\n BtxTimeoutError,\n type BatchEntry,\n type BatchResult,\n type BtxClientOpts,\n type Challenge,\n type IssueParams,\n type SolverOutput,\n type VerifyResult,\n} from './types.js';\n\ninterface JsonRpcResponse<T> {\n result: T;\n error: { code: number; message: string } | null;\n id: number | string;\n}\n\n/**\n * Universal UTF-8-safe base64 encoder.\n * Both Node 18.17+ and browsers expose `globalThis.crypto`, but `btoa()`\n * throws on any code point > 0xFF — so we route via TextEncoder for non-ASCII safety.\n * Per audit finding C1.\n */\nfunction base64Utf8(input: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(input, 'utf8').toString('base64');\n }\n // Browser fallback: encode UTF-8 manually so btoa() only sees byte-clean Latin1.\n const bytes = new TextEncoder().encode(input);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i] as number);\n }\n return btoa(binary);\n}\n\n/**\n * Redact sensitive header + credential patterns from error response bodies\n * before storing them on `BtxHttpError.body` (which callers commonly log).\n *\n * Covers:\n * - Authorization header echoes from proxies / debug endpoints (H2)\n * - JSON `\"password\"` / `\"rpcpassword\"` fields\n * - Config-line `rpcuser=...` / `rpcpassword=...` from btxd's loadincludeconf\n * error paths (re-audit N2 — added 2026-05-20)\n */\nfunction redactSensitive(body: string): string {\n return body\n .replace(/authorization\\s*:\\s*basic\\s+[A-Za-z0-9+/=]+/gi, 'authorization: basic [REDACTED]')\n .replace(/\"password\"\\s*:\\s*\"[^\"]*\"/gi, '\"password\":\"[REDACTED]\"')\n .replace(/\"rpcpassword\"\\s*:\\s*\"[^\"]*\"/gi, '\"rpcpassword\":\"[REDACTED]\"')\n .replace(/\\b(rpc(?:user|password|auth))\\s*=\\s*\\S+/gi, '$1=[REDACTED]');\n}\n\n/** Generate a stable-uniqueness request id without colliding across instances. */\nfunction nextRequestId(): string {\n // Both Node 18.17+ and modern browsers expose globalThis.crypto.randomUUID.\n const c = globalThis.crypto;\n if (c && typeof c.randomUUID === 'function') return c.randomUUID();\n // Last-resort fallback. Not cryptographically strong but uniqueness is the only\n // need here — btxd echoes the id back, doesn't use it for auth.\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * JSON-RPC client for BTX service-challenges.\n *\n * Wraps the 5 core RPCs:\n * - getmatmulservicechallenge (issue)\n * - verifymatmulserviceproof (verify, stateless)\n * - redeemmatmulserviceproof (verify + consume, anti-replay)\n * - verifymatmulserviceproofs (batch verify)\n * - redeemmatmulserviceproofs (batch redeem)\n *\n * Plus helper RPCs:\n * - solvematmulservicechallenge (server-side solver — for fixtures + tests)\n *\n * RPC reference: https://btx.dev/docs/rpc/service-challenges\n *\n * Error model:\n * - {@link BtxRpcError} — btxd returned a JSON-RPC error envelope\n * - {@link BtxHttpError} — non-2xx HTTP status\n * - {@link BtxParseError} — 2xx but body wasn't valid JSON\n * - {@link BtxTimeoutError} — request exceeded `timeoutMs`\n * - {@link BtxNetworkError} — DNS / TCP / TLS-level failure\n * - All extend {@link BtxError}.\n */\nexport class BtxChallengeClient {\n constructor(private readonly opts: BtxClientOpts) {}\n\n /** Low-level: raw JSON-RPC call. Exposed for forward compatibility. */\n async call<T = unknown>(method: string, params: unknown[] = []): Promise<T> {\n const id = nextRequestId();\n const auth = 'Basic ' + base64Utf8(`${this.opts.rpcAuth.user}:${this.opts.rpcAuth.pass}`);\n // JSON-RPC \"1.0\" is correct for Bitcoin-family btxd (NOT 2.0 as Ethereum-style uses).\n // See btxd src/rpc/server.cpp + httprpc.cpp. Do not \"fix\" to 2.0 — btxd will reject.\n const body = JSON.stringify({ jsonrpc: '1.0', id, method, params });\n\n const ctrl = new AbortController();\n const timeoutMs = this.opts.timeoutMs ?? 30_000;\n const timer = setTimeout(() => ctrl.abort(), timeoutMs);\n\n let res: Response;\n try {\n res = await fetch(this.opts.rpcUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: auth,\n },\n body,\n signal: ctrl.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n // AbortError on timeout vs everything else (DNS, TCP reset, TLS, etc.)\n if (err instanceof Error && err.name === 'AbortError') {\n throw new BtxTimeoutError(timeoutMs, method);\n }\n throw new BtxNetworkError(err, method);\n } finally {\n clearTimeout(timer);\n }\n\n if (!res.ok) {\n const rawBody = await res.text().catch(() => '');\n throw new BtxHttpError(res.status, redactSensitive(rawBody), method);\n }\n\n const rawBody = await res.text();\n let data: JsonRpcResponse<T>;\n try {\n data = JSON.parse(rawBody) as JsonRpcResponse<T>;\n } catch (err) {\n throw new BtxParseError(err, redactSensitive(rawBody), method);\n }\n\n if (data.error) {\n throw new BtxRpcError(data.error.code, data.error.message, method);\n }\n return data.result;\n }\n\n /** Issue a fresh challenge bound to (purpose, resource, subject). */\n async issue(params: IssueParams): Promise<Challenge> {\n // Per audit M3: do NOT hardcode btxd defaults. Truncate positional args at\n // the last explicitly-set value so btxd applies its own defaults for omitted ones.\n const ordered: Array<[string, unknown]> = [\n ['purpose', params.purpose],\n ['resource', params.resource],\n ['subject', params.subject],\n ['target_solve_time_s', params.target_solve_time_s],\n ['expires_in_s', params.expires_in_s],\n ['validation_overhead_s', params.validation_overhead_s],\n ['propagation_overhead_s', params.propagation_overhead_s],\n ['difficulty_policy', params.difficulty_policy],\n ['difficulty_window_blocks', params.difficulty_window_blocks],\n ['min_solve_time_s', params.min_solve_time_s],\n ['max_solve_time_s', params.max_solve_time_s],\n ['solver_parallelism', params.solver_parallelism],\n ['solver_duty_cycle_pct', params.solver_duty_cycle_pct],\n ];\n let lastSet = 2; // purpose, resource, subject are required\n for (let i = ordered.length - 1; i > 2; i--) {\n if (ordered[i]![1] !== undefined) {\n lastSet = i;\n break;\n }\n }\n const args = ordered.slice(0, lastSet + 1).map(([, v]) => v);\n return this.call<Challenge>('getmatmulservicechallenge', args);\n }\n\n /**\n * Verify a proof statelessly. Does NOT consume the challenge.\n * Use this for diagnostic / monitoring paths.\n * For admission control, use {@link redeem} instead — verification alone\n * does not prevent replay.\n */\n async verify(\n challenge: Challenge,\n nonce64_hex: string,\n digest_hex: string,\n lookup_local_status = true,\n ): Promise<VerifyResult> {\n return this.call<VerifyResult>('verifymatmulserviceproof', [\n challenge,\n nonce64_hex,\n digest_hex,\n lookup_local_status,\n ]);\n }\n\n /**\n * Verify-and-consume atomically. THIS is the admission control entry point.\n * On success, the challenge is marked redeemed and cannot be replayed.\n */\n async redeem(\n challenge: Challenge,\n nonce64_hex: string,\n digest_hex: string,\n ): Promise<VerifyResult> {\n return this.call<VerifyResult>('redeemmatmulserviceproof', [\n challenge,\n nonce64_hex,\n digest_hex,\n ]);\n }\n\n /** Batch verify. Spec range 1–256 (audit M2). No consumption. */\n async verifyBatch(entries: BatchEntry[]): Promise<BatchResult> {\n this.assertBatchSize(entries);\n return this.call<BatchResult>('verifymatmulserviceproofs', [entries]);\n }\n\n /** Batch verify + consume. Sequential per-entry. Spec range 1–256 (audit M2). */\n async redeemBatch(entries: BatchEntry[]): Promise<BatchResult> {\n this.assertBatchSize(entries);\n return this.call<BatchResult>('redeemmatmulserviceproofs', [entries]);\n }\n\n /**\n * Server-side local solver. Useful when generating fixtures or pre-computing\n * for tests. For production browser-side solving, ship the WASM solver —\n * RPC-based solving puts compute load on YOUR node, defeating the point.\n */\n async solve(challenge: Challenge): Promise<SolverOutput> {\n return this.call<SolverOutput>('solvematmulservicechallenge', [challenge]);\n }\n\n private assertBatchSize(entries: BatchEntry[]): void {\n if (entries.length < 1 || entries.length > 256) {\n throw new RangeError(\n `Batch size must be between 1 and 256 (per BTX RPC spec), got ${entries.length}`,\n );\n }\n }\n}\n","/**\n * Serialize a `PowState`-equivalent block header to the bytes that\n * `ComputeMatMulHeaderHash` then `DeriveSigma` (btxd) hash.\n *\n * Ported from `btxd v0.29.7 src/matmul/matmul_pow.cpp` lines 215-274.\n *\n * Wire format (150 bytes total, all integer fields little-endian):\n * - LE32 version\n * - 32 bytes previousblockhash (uint256 LE *storage* — i.e. reverse of display hex)\n * - 32 bytes merkleroot (uint256 LE storage)\n * - LE32 time\n * - LE32 bits\n * - LE64 nonce64\n * - LE16 matmul_dim\n * - 32 bytes seed_a (uint256 LE storage)\n * - 32 bytes seed_b (uint256 LE storage)\n *\n * Byte-order convention (this module + everything downstream):\n * - All hex strings are interpreted as **display/big-endian** (Bitcoin Core's\n * `uint256::ToString()` convention — first hex pair = most-significant byte).\n * - In-memory `Uint8Array` seeds/sigmas are kept in display/BE order too.\n * - This module reverses hex-parsed bytes back to LE storage for the header\n * serialization, and reverses the final SHA-256 output back to BE so the\n * sigma can flow into `fromOracle` (which expects BE) without further\n * transformation. Net effect: byte-for-byte equivalent to btxd's behavior.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport type { ChallengeHeaderContext } from '../types.js';\n\n/** Header fields the matmul header hash binds to. */\nexport interface MatMulHeaderInput {\n version: number;\n previousblockhash: string;\n merkleroot: string;\n time: number;\n /** Encoded as a hex string in btxd's header_context (e.g. `\"1d00ffff\"`). */\n bits: string;\n /** 64-bit nonce; pass as `bigint` to preserve full range. */\n nonce64: bigint;\n matmul_dim: number;\n seed_a: string;\n seed_b: string;\n}\n\n/**\n * Build a `MatMulHeaderInput` from a challenge envelope + the candidate nonce.\n * Reusing the existing `ChallengeHeaderContext` shape avoids a parallel struct.\n */\nexport function headerInputForNonce(\n ctx: ChallengeHeaderContext,\n nonce64: bigint,\n): MatMulHeaderInput {\n return {\n version: ctx.version,\n previousblockhash: ctx.previousblockhash,\n merkleroot: ctx.merkleroot,\n time: ctx.time,\n bits: ctx.bits,\n nonce64,\n matmul_dim: ctx.matmul_dim,\n seed_a: ctx.seed_a,\n seed_b: ctx.seed_b,\n };\n}\n\n/** Serialize the 150-byte header buffer that `ComputeMatMulHeaderHash` hashes. */\nexport function serializeMatMulHeader(input: MatMulHeaderInput): Uint8Array {\n const buf = new Uint8Array(4 + 32 + 32 + 4 + 4 + 8 + 2 + 32 + 32);\n let off = 0;\n\n writeUint32LE(buf, off, input.version >>> 0);\n off += 4;\n\n buf.set(parseUint256HexToLE(input.previousblockhash, 'previousblockhash'), off);\n off += 32;\n\n buf.set(parseUint256HexToLE(input.merkleroot, 'merkleroot'), off);\n off += 32;\n\n writeUint32LE(buf, off, input.time >>> 0);\n off += 4;\n\n writeUint32LE(buf, off, parseBitsHex(input.bits));\n off += 4;\n\n writeUint64LE(buf, off, input.nonce64);\n off += 8;\n\n writeUint16LE(buf, off, input.matmul_dim & 0xffff);\n off += 2;\n\n buf.set(parseUint256HexToLE(input.seed_a, 'seed_a'), off);\n off += 32;\n\n buf.set(parseUint256HexToLE(input.seed_b, 'seed_b'), off);\n off += 32;\n\n return buf;\n}\n\n/** Equivalent of btxd's `ComputeMatMulHeaderHash`. Returns 32 raw SHA-256 bytes. */\nexport function computeMatMulHeaderHash(input: MatMulHeaderInput): Uint8Array {\n return sha256(serializeMatMulHeader(input));\n}\n\n/**\n * Equivalent of btxd's `DeriveSigma`. Returns a 32-byte sigma in **display/BE\n * order** so it can flow directly into {@link fromOracle} and the transcript\n * compression vector.\n */\nexport function deriveSigma(input: MatMulHeaderInput): Uint8Array {\n const headerHash = computeMatMulHeaderHash(input);\n const sigmaRaw = sha256(headerHash);\n // sigmaRaw is \"LE storage\" per btxd's uint256 view; reverse to BE for\n // downstream consumers that operate on display-order seeds.\n const sigmaBE = new Uint8Array(32);\n for (let i = 0; i < 32; i++) sigmaBE[i] = sigmaRaw[31 - i]!;\n return sigmaBE;\n}\n\n// ----------------------------------------------------------------------------\n// internal helpers\n// ----------------------------------------------------------------------------\n\nfunction parseUint256HexToLE(hex: string, field: string): Uint8Array {\n const beBytes = parseHexFixed(hex, 32, field);\n // Reverse: BE display → LE storage.\n const leBytes = new Uint8Array(32);\n for (let i = 0; i < 32; i++) leBytes[i] = beBytes[31 - i]!;\n return leBytes;\n}\n\nfunction parseHexFixed(hex: string, byteLen: number, field: string): Uint8Array {\n const h = hex.startsWith('0x') || hex.startsWith('0X') ? hex.slice(2) : hex;\n if (h.length !== byteLen * 2) {\n throw new Error(\n `header.${field}: expected ${byteLen * 2} hex chars (${byteLen} bytes), got ${h.length}`,\n );\n }\n const out = new Uint8Array(byteLen);\n for (let i = 0; i < byteLen; i++) {\n const byte = parseInt(h.slice(i * 2, i * 2 + 2), 16);\n if (Number.isNaN(byte)) {\n throw new Error(`header.${field}: invalid hex at byte ${i}`);\n }\n out[i] = byte;\n }\n return out;\n}\n\nfunction parseBitsHex(bits: string): number {\n // btxd serializes bits as a 4-byte big-endian hex string (matching getblockheader).\n // Parse, then write LE in serializeMatMulHeader.\n const h = bits.startsWith('0x') || bits.startsWith('0X') ? bits.slice(2) : bits;\n if (h.length !== 8) {\n throw new Error(`header.bits: expected 8 hex chars, got ${h.length}`);\n }\n const n = parseInt(h, 16);\n if (Number.isNaN(n)) {\n throw new Error(`header.bits: invalid hex`);\n }\n return n >>> 0;\n}\n\nfunction writeUint16LE(buf: Uint8Array, offset: number, value: number): void {\n buf[offset] = value & 0xff;\n buf[offset + 1] = (value >>> 8) & 0xff;\n}\n\nfunction writeUint32LE(buf: Uint8Array, offset: number, value: number): void {\n buf[offset] = value & 0xff;\n buf[offset + 1] = (value >>> 8) & 0xff;\n buf[offset + 2] = (value >>> 16) & 0xff;\n buf[offset + 3] = (value >>> 24) & 0xff;\n}\n\nfunction writeUint64LE(buf: Uint8Array, offset: number, value: bigint): void {\n const lo = Number(value & 0xffffffffn);\n const hi = Number((value >> 32n) & 0xffffffffn);\n writeUint32LE(buf, offset, lo);\n writeUint32LE(buf, offset + 4, hi);\n}\n","/**\n * Magic numbers + domain tags from `btxd v0.29.7 src/matmul/`.\n *\n * Sourced from:\n * - `src/matmul/field.h` (M31 modulus)\n * - `src/matmul/noise.h` (4 noise domain tags)\n * - `src/matmul/transcript.h` (2 transcript tags)\n */\n\n/** M31 prime: 2^31 - 1. From `src/matmul/field.h`. */\nexport const M31_MODULUS = 0x7fffffff;\n\n/** Domain tag for noise matrix `E_L`. From `src/matmul/noise.h`. */\nexport const NOISE_TAG_EL = 'matmul_noise_EL_v1';\n/** Domain tag for noise matrix `E_R`. From `src/matmul/noise.h`. */\nexport const NOISE_TAG_ER = 'matmul_noise_ER_v1';\n/** Domain tag for noise matrix `F_L`. From `src/matmul/noise.h`. */\nexport const NOISE_TAG_FL = 'matmul_noise_FL_v1';\n/** Domain tag for noise matrix `F_R`. From `src/matmul/noise.h`. */\nexport const NOISE_TAG_FR = 'matmul_noise_FR_v1';\n\n/** Personalization for the per-block compression vector. From `src/matmul/transcript.h`. */\nexport const TRANSCRIPT_COMPRESS_TAG = 'matmul-compress-v1';\n/** Personalization for the product-committed final digest. From `src/matmul/transcript.h`. */\nexport const TRANSCRIPT_PRODUCT_DIGEST_TAG = 'matmul-product-digest-v3';\n","/**\n * M31 (Mersenne prime 2^31 - 1) modular arithmetic.\n *\n * Ported from `btxd v0.29.7 src/matmul/field.{h,cpp}`.\n *\n * Field elements are JS `number`s in the canonical range [0, M31_MODULUS).\n *\n * `mul` and the `dot` accumulator use `BigInt` because the worst-case\n * product (2^31 - 1)^2 ≈ 2^62 exceeds Number's 2^53 precision. Day 2.6\n * may swap in a Number-only split-multiplication path for perf.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport { M31_MODULUS } from './constants.js';\n\n/** Canonical field element type. Always in [0, M31_MODULUS). */\nexport type Element = number;\n\nconst MODULUS_BIG = BigInt(M31_MODULUS);\n\n/**\n * Mersenne fold for a non-negative `bigint` up to ~2^64. Matches btxd's\n * `reduce64` in `field.cpp` lines 23-34 (double fold + final canonical sub).\n */\nfunction reduce64(x: bigint): Element {\n let v = (x & MODULUS_BIG) + (x >> 31n);\n v = (v & MODULUS_BIG) + (v >> 31n);\n let result = Number(v);\n if (result >= M31_MODULUS) result -= M31_MODULUS;\n return result;\n}\n\n/** Modular addition. Matches `field::add` in `field.cpp` line 84. */\nexport function add(a: Element, b: Element): Element {\n const s = a + b;\n return s >= M31_MODULUS ? s - M31_MODULUS : s;\n}\n\n/** Modular subtraction. Matches `field::sub` in `field.cpp` line 93. */\nexport function sub(a: Element, b: Element): Element {\n return a >= b ? a - b : a + M31_MODULUS - b;\n}\n\n/** Modular multiplication. Matches `field::mul` in `field.cpp` line 102. */\nexport function mul(a: Element, b: Element): Element {\n return reduce64(BigInt(a) * BigInt(b));\n}\n\n/** Modular negation. Matches `field::neg` in `field.cpp` line 108. */\nexport function neg(a: Element): Element {\n return a === 0 ? 0 : M31_MODULUS - a;\n}\n\n/** Reduce a uint32 input to canonical form. Matches `field::from_uint32`. */\nexport function fromUint32(x: number): Element {\n return reduce64(BigInt(x >>> 0));\n}\n\n/**\n * Modular inverse via Fermat's little theorem: a^(p-2) mod p.\n * Matches `field::inv` in `field.cpp` line 121.\n */\nexport function inv(a: Element): Element {\n if (a === 0) throw new Error('field.inv: cannot invert 0');\n let exp = M31_MODULUS - 2;\n let result: Element = 1;\n let base = a;\n while (exp > 0) {\n if ((exp & 1) !== 0) result = mul(result, base);\n exp >>>= 1;\n if (exp > 0) base = mul(base, base);\n }\n return result;\n}\n\n/**\n * Hash-to-field oracle for deterministic challenge derivation.\n *\n * Matches `field::from_oracle` in `field.cpp` line 138:\n * - SHA-256(seed_bytes || LE32(index) [|| LE32(retry) if retry > 0])\n * - candidate = ReadLE32(hash[0..4]) & MODULUS\n * - accept if candidate < MODULUS; else retry (up to 256 retries)\n * - deterministic fallback otherwise (essentially unreachable, ~2^-7936)\n *\n * @param seed - 32-byte seed in btxd \"display/MSB-first\" order. The C++\n * reverses uint256's LE storage to MSB-first before hashing; standard hex\n * parsing of a uint256 hex string already yields MSB-first bytes, so the\n * caller can pass the hex-parsed bytes directly without reversing.\n */\nexport function fromOracle(seed: Uint8Array, index: number): Element {\n if (seed.length !== 32) {\n throw new Error(`field.fromOracle: seed must be 32 bytes, got ${seed.length}`);\n }\n const indexLe = new Uint8Array(4);\n writeUint32LE(indexLe, 0, index >>> 0);\n\n for (let retry = 0; retry < 256; retry++) {\n const hasher = sha256.create();\n hasher.update(seed);\n hasher.update(indexLe);\n if (retry > 0) {\n const retryLe = new Uint8Array(4);\n writeUint32LE(retryLe, 0, retry);\n hasher.update(retryLe);\n }\n const hash = hasher.digest();\n const candidate = readUint32LE(hash, 0) & M31_MODULUS;\n if (candidate < M31_MODULUS) return candidate;\n }\n\n // Deterministic fallback. Same construction as btxd `field.cpp` line 174.\n const fallback = sha256.create();\n fallback.update(seed);\n fallback.update(indexLe);\n fallback.update(new TextEncoder().encode('oracle-fallback'));\n const hash = fallback.digest();\n return readUint32LE(hash, 0) % M31_MODULUS;\n}\n\n/**\n * Inner-product over M31. Matches `field::ScalarDot` in `field.cpp` line 39\n * (the NEON kernel is a perf-equivalent rewrite of this canonical scalar path).\n *\n * Accumulates 4 products per Mersenne fold; uses BigInt for the 64-bit acc\n * because Number can't hold 4·(2^31-1)^2 ≈ 2^64.\n */\nexport function dot(a: Element[] | Uint32Array, b: Element[] | Uint32Array, len: number): Element {\n let acc = 0n;\n let pending = 0;\n for (let i = 0; i < len; i++) {\n acc += BigInt(a[i]!) * BigInt(b[i]!);\n if (++pending === 4) {\n acc = (acc & MODULUS_BIG) + (acc >> 31n);\n acc = (acc & MODULUS_BIG) + (acc >> 31n);\n pending = 0;\n }\n }\n return reduce64(acc);\n}\n\nfunction writeUint32LE(buf: Uint8Array, offset: number, value: number): void {\n buf[offset] = value & 0xff;\n buf[offset + 1] = (value >>> 8) & 0xff;\n buf[offset + 2] = (value >>> 16) & 0xff;\n buf[offset + 3] = (value >>> 24) & 0xff;\n}\n\nfunction readUint32LE(buf: Uint8Array, offset: number): number {\n return (\n (buf[offset]! |\n (buf[offset + 1]! << 8) |\n (buf[offset + 2]! << 16) |\n (buf[offset + 3]! << 24)) >>>\n 0\n );\n}\n","/**\n * Dense matrix over M31 with row-major layout.\n *\n * Lightweight equivalent of `btxd v0.29.7 src/matmul/matrix.{h,cpp}`. We expose\n * only the operations the solver needs: construction, element access, add,\n * and multiplication. Block views live in `transcript.ts`.\n */\n\nimport { add as fieldAdd, dot as fieldDot, fromOracle, type Element } from './field.js';\n\nexport interface Matrix {\n readonly rows: number;\n readonly cols: number;\n /** Row-major: data[row * cols + col]. Length = rows * cols. */\n readonly data: Uint32Array;\n}\n\n/** Construct a zero-initialized matrix. */\nexport function zeros(rows: number, cols: number): Matrix {\n return { rows, cols, data: new Uint32Array(rows * cols) };\n}\n\n/** Element accessor. */\nexport function get(m: Matrix, row: number, col: number): Element {\n return m.data[row * m.cols + col]!;\n}\n\n/** Element setter. */\nexport function set(m: Matrix, row: number, col: number, value: Element): void {\n m.data[row * m.cols + col] = value;\n}\n\n/**\n * Build a `rows × cols` matrix where entry (row, col) is\n * `field.fromOracle(seed, row * cols + col)`.\n *\n * Mirrors `FromSeedRect` in `btxd src/matmul/noise.cpp`.\n */\nexport function fromSeedRect(seed: Uint8Array, rows: number, cols: number): Matrix {\n const m = zeros(rows, cols);\n const total = rows * cols;\n for (let i = 0; i < total; i++) {\n m.data[i] = fromOracle(seed, i);\n }\n return m;\n}\n\n/**\n * Element-wise modular sum `out = a + b` in M31.\n * Throws if dimensions mismatch.\n */\nexport function matAdd(a: Matrix, b: Matrix): Matrix {\n if (a.rows !== b.rows || a.cols !== b.cols) {\n throw new Error(\n `matAdd: dim mismatch a=${a.rows}x${a.cols} b=${b.rows}x${b.cols}`,\n );\n }\n const out = zeros(a.rows, a.cols);\n for (let i = 0; i < a.data.length; i++) {\n out.data[i] = fieldAdd(a.data[i]!, b.data[i]!);\n }\n return out;\n}\n\n/**\n * Canonical M31 matrix multiplication: `out = a · b`.\n *\n * `a` is rows_a × inner, `b` is inner × cols_b; `out` is rows_a × cols_b.\n * Uses `field.dot` per inner row × col pair, which folds Mersenne every\n * 4 accumulated products.\n */\nexport function matMul(a: Matrix, b: Matrix): Matrix {\n if (a.cols !== b.rows) {\n throw new Error(\n `matMul: inner-dim mismatch a.cols=${a.cols} b.rows=${b.rows}`,\n );\n }\n const out = zeros(a.rows, b.cols);\n const rowBuf = new Uint32Array(a.cols);\n const colBuf = new Uint32Array(a.cols);\n for (let i = 0; i < a.rows; i++) {\n for (let k = 0; k < a.cols; k++) rowBuf[k] = a.data[i * a.cols + k]!;\n for (let j = 0; j < b.cols; j++) {\n for (let k = 0; k < a.cols; k++) colBuf[k] = b.data[k * b.cols + j]!;\n out.data[i * b.cols + j] = fieldDot(rowBuf, colBuf, a.cols);\n }\n }\n return out;\n}\n","/**\n * Deterministic noise pair generation: {E_L, E_R, F_L, F_R}.\n *\n * Each matrix is rank-r (n × r or r × n); used to perturb (A, B) into\n * (A', B') = (A + E_L·E_R, B + F_L·F_R) before the canonical matmul.\n *\n * Ported from `btxd v0.29.7 src/matmul/noise.{h,cpp}`.\n *\n * Byte-order convention (see header.ts for full discussion): sigma + noise\n * seeds are kept in **display/BE order** in-memory. The C++ reverses LE\n * storage to BE for hashing; we already store BE, so we hash directly.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport {\n NOISE_TAG_EL,\n NOISE_TAG_ER,\n NOISE_TAG_FL,\n NOISE_TAG_FR,\n} from './constants.js';\nimport { fromSeedRect, type Matrix } from './matrix.js';\n\n/** The 4 noise factor matrices. Sized (n×r, r×n, n×r, r×n) respectively. */\nexport interface NoisePair {\n E_L: Matrix;\n E_R: Matrix;\n F_L: Matrix;\n F_R: Matrix;\n}\n\n/**\n * Per-tag seed derivation. Matches `btxd noise::DeriveNoiseSeed`:\n * seed = SHA-256(domain_tag || sigma_BE)\n *\n * Subtle byte-order point: btxd stores the noise seed via\n * `CanonicalBytesToUint256(digest)` — i.e. the uint256's LE storage is the\n * REVERSE of the raw SHA-256 output. Then `from_oracle` reverses that LE\n * storage again before hashing, so the bytes actually fed to the per-index\n * SHA-256 are the RAW digest. Our `fromOracle` hashes the seed directly\n * (no internal reverse), so we must return the raw digest here — no reverse.\n *\n * (Contrast with `deriveSigma`, which DOES reverse: btxd's sigma uint256 is\n * stored direct from the SHA-256 output, so `from_oracle`'s reverse lands on\n * REVERSE(raw). The reverse in our `deriveSigma` mirrors that asymmetry.)\n */\nexport function deriveNoiseSeed(domainTag: string, sigmaBE: Uint8Array): Uint8Array {\n if (sigmaBE.length !== 32) {\n throw new Error(`deriveNoiseSeed: sigma must be 32 bytes, got ${sigmaBE.length}`);\n }\n if (domainTag.length !== 18) {\n // C++ asserts this; all 4 noise tags are 18 chars.\n throw new Error(`deriveNoiseSeed: domain tag must be 18 chars, got ${domainTag.length}`);\n }\n const hasher = sha256.create();\n hasher.update(new TextEncoder().encode(domainTag));\n hasher.update(sigmaBE);\n return hasher.digest();\n}\n\n/**\n * Generate the 4 noise matrices. Mirrors `noise::Generate(sigma, n, r)`.\n *\n * Returned matrix sizes:\n * - E_L : n × r\n * - E_R : r × n\n * - F_L : n × r\n * - F_R : r × n\n *\n * Asymmetric on purpose — so `E_L · E_R` and `F_L · F_R` are n×n.\n */\nexport function generate(sigmaBE: Uint8Array, n: number, r: number): NoisePair {\n const seedEL = deriveNoiseSeed(NOISE_TAG_EL, sigmaBE);\n const seedER = deriveNoiseSeed(NOISE_TAG_ER, sigmaBE);\n const seedFL = deriveNoiseSeed(NOISE_TAG_FL, sigmaBE);\n const seedFR = deriveNoiseSeed(NOISE_TAG_FR, sigmaBE);\n return {\n E_L: fromSeedRect(seedEL, n, r),\n E_R: fromSeedRect(seedER, r, n),\n F_L: fromSeedRect(seedFL, n, r),\n F_R: fromSeedRect(seedFR, r, n),\n };\n}\n","/**\n * Transcript-binding block compression + canonical matmul + final digest.\n *\n * Ported from `btxd v0.29.7 src/matmul/transcript.{h,cpp}`.\n *\n * For Day 2.5 (the canonical Solve path) we only need:\n * - {@link deriveCompressionVector} — b·b M31 vector from sigma\n * - {@link compressBlock} — block · compression-vector inner product\n * - {@link TranscriptHasher} — accumulates LE32(compressed c-block) per\n * (i, j, ell) step, finalizes as SHA-256d\n * - {@link canonicalMatMul} — block-wise A' · B' with intermediate hashing\n *\n * The replay / product-committed / accelerated-solver helpers are verifier\n * optimizations; out of scope for Day 2.5 but easy to add in Day 2.6+ if\n * needed.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport { TRANSCRIPT_COMPRESS_TAG } from './constants.js';\nimport { add as fieldAdd, dot as fieldDot, fromOracle } from './field.js';\nimport { zeros, type Matrix } from './matrix.js';\n\n/**\n * Per-sigma compression seed. Mirrors `DeriveCompressionSeed` in transcript.cpp\n * (the anonymous-namespace helper).\n *\n * Like `deriveNoiseSeed`, btxd stores this via `CanonicalBytesToUint256` —\n * the LE storage is the reverse of the raw digest. `from_oracle` reverses\n * once more before hashing, so the bytes actually fed to the per-index\n * SHA-256 are the RAW digest. Our `fromOracle` hashes the seed directly,\n * so we return the raw digest with no extra reverse.\n */\nfunction deriveCompressionSeed(sigmaBE: Uint8Array): Uint8Array {\n const hasher = sha256.create();\n hasher.update(new TextEncoder().encode(TRANSCRIPT_COMPRESS_TAG));\n hasher.update(sigmaBE);\n return hasher.digest();\n}\n\n/**\n * Build the b·b-element M31 compression vector. Mirrors\n * `transcript::DeriveCompressionVector`.\n */\nexport function deriveCompressionVector(sigmaBE: Uint8Array, b: number): Uint32Array {\n if (b <= 0) throw new Error('block size b must be positive');\n const seed = deriveCompressionSeed(sigmaBE);\n const len = b * b;\n const vec = new Uint32Array(len);\n for (let k = 0; k < len; k++) vec[k] = fromOracle(seed, k);\n return vec;\n}\n\n/**\n * Compress a b·b block against the precomputed compression vector. Mirrors\n * `transcript::CompressBlock` — a plain M31 inner product, no per-row split.\n */\nexport function compressBlock(block: Uint32Array, v: Uint32Array): number {\n if (block.length !== v.length) {\n throw new Error(\n `compressBlock: dim mismatch block.length=${block.length} v.length=${v.length}`,\n );\n }\n return fieldDot(block, v, block.length);\n}\n\n/**\n * Accumulating SHA-256(-d) transcript hasher. Mirrors\n * `transcript::TranscriptHasher`.\n *\n * compress_vec = DeriveCompressionVector(sigma, b)\n * per (i,j,ell): add LE32(CompressBlock(c_block, compress_vec)) to inner\n * finalize(): inner = SHA256.digest(); return SHA256(inner) (i.e. SHA-256d)\n */\nexport class TranscriptHasher {\n private readonly hasher = sha256.create();\n private readonly compressVec: Uint32Array;\n private readonly b: number;\n private readonly le4 = new Uint8Array(4);\n\n constructor(sigmaBE: Uint8Array, b: number) {\n this.b = b;\n this.compressVec = deriveCompressionVector(sigmaBE, b);\n }\n\n /**\n * Append the LE32-encoded compressed `c_block` to the transcript.\n * Ignores `i`/`j`/`ell` for hashing (btxd's `(void)i;(void)j;(void)ell;`\n * proves they don't participate in the digest), but accepts them so the\n * call-site reads identically to the C++.\n */\n addIntermediate(_i: number, _j: number, _ell: number, cBlock: Uint32Array): void {\n if (cBlock.length !== this.b * this.b) {\n throw new Error(\n `addIntermediate: c_block must be ${this.b * this.b} elements, got ${cBlock.length}`,\n );\n }\n const compressed = compressBlock(cBlock, this.compressVec);\n this.le4[0] = compressed & 0xff;\n this.le4[1] = (compressed >>> 8) & 0xff;\n this.le4[2] = (compressed >>> 16) & 0xff;\n this.le4[3] = (compressed >>> 24) & 0xff;\n this.hasher.update(this.le4);\n }\n\n /** SHA-256d: inner = SHA256(transcript); return SHA256(inner). */\n finalize(): Uint8Array {\n const inner = this.hasher.digest();\n return sha256(inner);\n }\n}\n\nexport interface CanonicalMatMulResult {\n /** Product matrix C' = A' · B' over M31. */\n cPrime: Matrix;\n /** SHA-256d over the LE32-encoded compressed c-blocks (in i,j,ell order). */\n transcriptHash: Uint8Array;\n}\n\n/**\n * Canonical block-wise matmul with transcript binding. Mirrors\n * `transcript::CanonicalMatMul`.\n *\n * for i,j in [0,N)²:\n * for ell in [0,N):\n * a = A'.block(i,ell)\n * b = B'.block(ell,j)\n * c_acc += a·b\n * hasher.add(c_acc)\n *\n * Where N = n / b. Each block read/multiply/accumulate happens in a\n * pre-allocated b·b scratch buffer to avoid per-step allocation in the\n * hot path.\n */\nexport function canonicalMatMul(\n aPrime: Matrix,\n bPrime: Matrix,\n b: number,\n sigmaBE: Uint8Array,\n): CanonicalMatMulResult {\n if (\n aPrime.rows !== aPrime.cols ||\n bPrime.rows !== bPrime.cols ||\n aPrime.rows !== bPrime.rows\n ) {\n throw new Error('canonicalMatMul requires square matrices of equal size');\n }\n if (b === 0 || aPrime.rows % b !== 0) {\n throw new Error('canonicalMatMul: invalid transcript block size');\n }\n\n const n = aPrime.rows;\n const N = n / b;\n const cPrime = zeros(n, n);\n const hasher = new TranscriptHasher(sigmaBE, b);\n\n const aBlock = new Uint32Array(b * b);\n const bBlock = new Uint32Array(b * b);\n const cBlock = new Uint32Array(b * b);\n\n for (let i = 0; i < N; i++) {\n for (let j = 0; j < N; j++) {\n cBlock.fill(0);\n for (let ell = 0; ell < N; ell++) {\n readBlock(aPrime, i, ell, b, aBlock);\n readBlock(bPrime, ell, j, b, bBlock);\n multiplyAndAccumulateBlock(aBlock, bBlock, cBlock, b);\n hasher.addIntermediate(i, j, ell, cBlock);\n }\n writeBlock(cPrime, i, j, b, cBlock);\n }\n }\n\n return { cPrime, transcriptHash: hasher.finalize() };\n}\n\n// ----------------------------------------------------------------------------\n// internal block kernels\n// ----------------------------------------------------------------------------\n\n/** Copy `m[bi*b..bi*b+b][bj*b..bj*b+b]` into the `b·b` `out` buffer. */\nfunction readBlock(\n m: Matrix,\n bi: number,\n bj: number,\n b: number,\n out: Uint32Array,\n): void {\n const rowStart = bi * b;\n const colStart = bj * b;\n const stride = m.cols;\n for (let r = 0; r < b; r++) {\n const src = (rowStart + r) * stride + colStart;\n const dst = r * b;\n for (let c = 0; c < b; c++) {\n out[dst + c] = m.data[src + c]!;\n }\n }\n}\n\n/** Copy a b·b `block` buffer into `m[bi*b..bi*b+b][bj*b..bj*b+b]`. */\nfunction writeBlock(\n m: Matrix,\n bi: number,\n bj: number,\n b: number,\n block: Uint32Array,\n): void {\n const rowStart = bi * b;\n const colStart = bj * b;\n const stride = m.cols;\n for (let r = 0; r < b; r++) {\n const dst = (rowStart + r) * stride + colStart;\n const src = r * b;\n for (let c = 0; c < b; c++) {\n m.data[dst + c] = block[src + c]!;\n }\n }\n}\n\n/**\n * `c += a · b` for square b·b blocks (all three buffers are length b·b).\n * Element-wise mod M31. Inner loop uses `field.dot` (Mersenne-fold every 4\n * products) to stay in the canonical scalar path.\n */\nfunction multiplyAndAccumulateBlock(\n a: Uint32Array,\n b_buf: Uint32Array,\n c: Uint32Array,\n b: number,\n): void {\n // c[i,j] += sum_k a[i,k] * b_buf[k,j]\n // Strategy: for each (i, j), pre-collect b_buf's column j into a temp,\n // then dot with a's row i. Reuses field.dot's batched reduction.\n const colBuf = new Uint32Array(b);\n for (let j = 0; j < b; j++) {\n for (let k = 0; k < b; k++) colBuf[k] = b_buf[k * b + j]!;\n for (let i = 0; i < b; i++) {\n const rowStart = i * b;\n // Compute dot(a[i,:], colBuf, b) and add to c[i,j].\n let acc = 0n;\n let pending = 0;\n for (let k = 0; k < b; k++) {\n acc += BigInt(a[rowStart + k]!) * BigInt(colBuf[k]!);\n if (++pending === 4) {\n acc = (acc & MOD_BIG) + (acc >> 31n);\n acc = (acc & MOD_BIG) + (acc >> 31n);\n pending = 0;\n }\n }\n // Final fold and add to c[i,j].\n acc = (acc & MOD_BIG) + (acc >> 31n);\n acc = (acc & MOD_BIG) + (acc >> 31n);\n let folded = Number(acc);\n if (folded >= MOD_NUM) folded -= MOD_NUM;\n c[rowStart + j] = fieldAdd(c[rowStart + j]!, folded);\n }\n }\n}\n\nconst MOD_NUM = 0x7fffffff;\nconst MOD_BIG = 0x7fffffffn;\n","/**\n * Top-level pure-JS solver for the BTX MatMul service-challenge PoW.\n *\n * Ported from `btxd v0.29.7 src/matmul/matmul_pow.cpp` lines 293-358 (`Solve`).\n *\n * A = FromSeed(seed_a, n)\n * B = FromSeed(seed_b, n)\n * for nonce in [start, start + maxTries):\n * sigma = DeriveSigma(state(nonce))\n * noise = noise::Generate(sigma, n, r)\n * E = noise.E_L · noise.E_R\n * F = noise.F_L · noise.F_R\n * A' = A + E\n * B' = B + F\n * result = transcript::CanonicalMatMul(A', B', b, sigma)\n * if uintLE(result.transcript_hash) <= uintBE(target): return success\n *\n * Comparison semantics: `transcript_hash` is the raw SHA-256d output, treated\n * as a 256-bit integer in **little-endian byte order** (btxd's `uint256` ↔\n * `arith_uint256` convention). `target` arrives as a BE hex string. Both are\n * converted to `bigint` for the `<=` test.\n */\n\nimport type { Challenge, SolverOutput } from '../types.js';\nimport { deriveSigma, headerInputForNonce } from './header.js';\nimport { fromSeedRect, matAdd, matMul } from './matrix.js';\nimport { generate as generateNoise } from './noise.js';\nimport { canonicalMatMul } from './transcript.js';\n\nconst MAX_U64 = (1n << 64n) - 1n;\n\n/** Options for {@link solveJs}. */\nexport interface SolveJsOptions {\n /** Max nonces to try before giving up. Default 1_000_000. */\n maxTries?: number;\n /** Override the starting nonce (default: challenge.header_context.nonce64_start). */\n nonceStart?: bigint;\n /** Optional callback fired every N attempts for progress reporting. */\n onAttempt?: (attemptIndex: number, nonce: bigint) => void;\n /** Frequency of `onAttempt` calls (default every 1 attempt). */\n attemptInterval?: number;\n}\n\n/**\n * Pure-JS solver for a BTX MatMul service challenge. Searches nonces starting\n * from `header_context.nonce64_start` (or `options.nonceStart`) until the\n * transcript-hash satisfies `digest_le256 <= target_be256` or `maxTries` is\n * exhausted.\n *\n * Returns `null` if no solution was found within the budget.\n *\n * @throws if the challenge envelope is malformed (wrong-shape matmul params,\n * non-square matrix dimensions, b doesn't divide n, etc.).\n */\nexport function solveJs(challenge: Challenge, options: SolveJsOptions = {}): SolverOutput | null {\n const payload = challenge.challenge;\n const ctx = payload.header_context;\n const { n, b, r } = payload.matmul;\n\n const maxTries = options.maxTries ?? 1_000_000;\n const nonceStart =\n options.nonceStart ?? BigInt(ctx.nonce64_start ?? 0);\n const attemptInterval = options.attemptInterval ?? 1;\n\n if (n <= 0 || b <= 0 || r <= 0) {\n throw new Error(`solveJs: invalid matmul params (n=${n}, b=${b}, r=${r})`);\n }\n if (n % b !== 0) {\n throw new Error(`solveJs: n=${n} not divisible by b=${b}`);\n }\n\n // Parse fixed inputs.\n const seedA = parseHex32(payload.matmul.seed_a, 'seed_a');\n const seedB = parseHex32(payload.matmul.seed_b, 'seed_b');\n const targetBE = parseHex32(payload.target, 'target');\n const targetValue = bytesBEToBigInt(targetBE);\n\n // A and B don't change per attempt.\n const A = fromSeedRect(seedA, n, n);\n const B = fromSeedRect(seedB, n, n);\n\n let nonce = nonceStart & MAX_U64;\n for (let attempt = 0; attempt < maxTries; attempt++) {\n if (options.onAttempt && attempt % attemptInterval === 0) {\n options.onAttempt(attempt, nonce);\n }\n\n const headerInput = headerInputForNonce(ctx, nonce);\n const sigmaBE = deriveSigma(headerInput);\n const noise = generateNoise(sigmaBE, n, r);\n\n const E = matMul(noise.E_L, noise.E_R);\n const F = matMul(noise.F_L, noise.F_R);\n const aPrime = matAdd(A, E);\n const bPrime = matAdd(B, F);\n\n const result = canonicalMatMul(aPrime, bPrime, b, sigmaBE);\n const digestValue = bytesLEToBigInt(result.transcriptHash);\n if (digestValue <= targetValue) {\n const nonce64_hex = nonce.toString(16).padStart(16, '0');\n const digest_hex = bytesLEToHexBE(result.transcriptHash);\n return {\n nonce64_hex,\n digest_hex,\n // Same shape btxd's solve RPC returns: {challenge, nonce64_hex, digest_hex}.\n // See `solvematmulservicechallenge` in btxd src/rpc/mining.cpp.\n proof: { challenge, nonce64_hex, digest_hex },\n };\n }\n\n if (nonce === MAX_U64) return null;\n nonce = (nonce + 1n) & MAX_U64;\n }\n\n return null;\n}\n\n// ----------------------------------------------------------------------------\n// hex / int conversion\n// ----------------------------------------------------------------------------\n\nfunction parseHex32(hex: string, field: string): Uint8Array {\n const h = hex.startsWith('0x') || hex.startsWith('0X') ? hex.slice(2) : hex;\n if (h.length !== 64) {\n throw new Error(`solveJs.${field}: expected 64 hex chars, got ${h.length}`);\n }\n const out = new Uint8Array(32);\n for (let i = 0; i < 32; i++) {\n const byte = parseInt(h.slice(i * 2, i * 2 + 2), 16);\n if (Number.isNaN(byte)) {\n throw new Error(`solveJs.${field}: invalid hex at byte ${i}`);\n }\n out[i] = byte;\n }\n return out;\n}\n\n/** Interpret 32 bytes as a 256-bit integer in big-endian byte order. */\nfunction bytesBEToBigInt(bytes: Uint8Array): bigint {\n let v = 0n;\n for (let i = 0; i < bytes.length; i++) {\n v = (v << 8n) | BigInt(bytes[i]!);\n }\n return v;\n}\n\n/** Interpret 32 bytes as a 256-bit integer in little-endian byte order. */\nfunction bytesLEToBigInt(bytes: Uint8Array): bigint {\n let v = 0n;\n for (let i = bytes.length - 1; i >= 0; i--) {\n v = (v << 8n) | BigInt(bytes[i]!);\n }\n return v;\n}\n\n/** Reverse LE-stored bytes and hex-encode as a BE/display string. */\nfunction bytesLEToHexBE(bytes: Uint8Array): string {\n const chars: string[] = [];\n for (let i = bytes.length - 1; i >= 0; i--) {\n chars.push(bytes[i]!.toString(16).padStart(2, '0'));\n }\n return chars.join('');\n}\n","import type { BtxChallengeClient } from './client.js';\nimport { solveJs, type SolveJsOptions } from './matmul/pow.js';\nimport type { Challenge, SolverOutput } from './types.js';\n\n/**\n * How a challenge should be solved.\n *\n * - `'rpc'` — delegate to btxd's `solvematmulservicechallenge`. Requires\n * `opts.rpcClient`. Server-side / Node-only.\n *\n * - `'pure-js'` — solve locally with a pure-TypeScript MatMul implementation.\n * Browser-compatible. Ports the canonical CPU path of btxd's matmul solver.\n * At default difficulty + n=512, pure-JS solving is slow (perf is currently\n * bounded by `BigInt`-based M31 multiplication; WASM/SIMD acceleration is\n * planned for a future iteration).\n *\n * - `'auto'` — pick automatically: `'rpc'` if `opts.rpcClient` is provided,\n * else `'pure-js'`.\n */\nexport type SolverMode = 'rpc' | 'pure-js' | 'auto';\n\n/** Options for {@link Solver.solve}. */\nexport interface SolverOptions {\n /** Solve strategy. Default: `'auto'` (rpc if client provided, else pure-js). */\n mode?: SolverMode;\n /** Required for `mode === 'rpc'`. Ignored for `'pure-js'`. */\n rpcClient?: BtxChallengeClient;\n /** Forwarded to the pure-JS solver. Ignored for `'rpc'`. */\n pureJs?: SolveJsOptions;\n}\n\n/**\n * Solve a BTX service challenge to produce a (nonce, digest, proof) tuple\n * that btxd will accept on redemption.\n *\n * **Modes**:\n * - `'rpc'`: delegate to btxd's `solvematmulservicechallenge` RPC. Pass an\n * authenticated `BtxChallengeClient` in `opts.rpcClient`. **Production\n * note**: the solve RPC shares the matmul backend with block-template\n * mining; consumers MUST point at a dedicated non-mining btxd, otherwise\n * individual solves can queue behind mining work for 10+ minutes.\n * - `'pure-js'`: solve locally with the ported TypeScript MatMul. Browser-\n * compatible. Slower than `'rpc'` but no node required.\n * - `'auto'`: prefers `'rpc'` if a client is provided, else `'pure-js'`.\n *\n * @example Server-side (Node, RPC mode)\n * ```typescript\n * import { BtxChallengeClient, Solver } from '@btx/challenges-sdk';\n *\n * const client = new BtxChallengeClient({\n * rpcUrl: 'http://127.0.0.1:19332',\n * rpcAuth: { user: 'rpcuser', pass: 'rpcpass' },\n * });\n *\n * const challenge = await client.issue({\n * purpose: 'ai_inference_gate',\n * resource: 'model:gpt-x|route:/v1/generate',\n * subject: 'tenant:abc123',\n * });\n *\n * const proof = await Solver.solve(challenge, { mode: 'rpc', rpcClient: client });\n * const result = await client.redeem(challenge, proof.nonce64_hex, proof.digest_hex);\n *\n * if (result.valid && result.reason === 'ok') {\n * // Admit the caller.\n * }\n * ```\n *\n * @example Browser-side (pure-JS mode)\n * ```typescript\n * import { Solver } from '@btx/challenges-sdk';\n *\n * // Solve a challenge with no server-side help. Slow at default difficulty;\n * // for production browser use cases, calibrate via `target_solve_time_s`.\n * const proof = await Solver.solve(challenge, {\n * mode: 'pure-js',\n * pureJs: { maxTries: 100_000 },\n * });\n * ```\n */\nexport class Solver {\n static async solve(\n challenge: Challenge,\n opts: SolverOptions = {},\n ): Promise<SolverOutput> {\n const mode: SolverMode = opts.mode ?? (opts.rpcClient ? 'rpc' : 'pure-js');\n\n switch (mode) {\n case 'rpc':\n return solveViaRpc(challenge, opts);\n case 'pure-js':\n return solveViaPureJs(challenge, opts);\n case 'auto':\n if (opts.rpcClient) return solveViaRpc(challenge, opts);\n return solveViaPureJs(challenge, opts);\n default: {\n // Exhaustiveness guard — unreachable if SolverMode is the source of truth.\n const _exhaustive: never = mode;\n throw new Error(`Solver.solve: unknown mode \"${_exhaustive as string}\"`);\n }\n }\n }\n}\n\nasync function solveViaRpc(\n challenge: Challenge,\n opts: SolverOptions,\n): Promise<SolverOutput> {\n if (!opts.rpcClient) {\n throw new Error(\n 'Solver.solve: mode=\"rpc\" requires opts.rpcClient. ' +\n 'Construct a BtxChallengeClient and pass it via opts.rpcClient.',\n );\n }\n return opts.rpcClient.solve(challenge);\n}\n\nasync function solveViaPureJs(\n challenge: Challenge,\n opts: SolverOptions,\n): Promise<SolverOutput> {\n const result = solveJs(challenge, opts.pureJs);\n if (result === null) {\n const tries = opts.pureJs?.maxTries ?? 1_000_000;\n throw new Error(\n `Solver.solve: pure-JS solver exhausted maxTries=${tries} without finding a proof. ` +\n 'Increase maxTries or lower challenge difficulty (target_solve_time_s).',\n );\n }\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/client.ts","../src/matmul/header.ts","../src/matmul/constants.ts","../src/matmul/field.ts","../src/matmul/matrix.ts","../src/matmul/noise.ts","../src/matmul/transcript.ts","../src/matmul/pow.ts","../src/solver.ts"],"names":["rawBody","sha256","writeUint32LE","hash"],"mappings":";;;;;AA6NO,IAAM,QAAA,GAAN,cAAuB,KAAA,CAAM;AAAA,EAClC,WAAA,CACE,SACgB,MAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAFG,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AAAA,EACd;AAAA,EAJkB,MAAA;AAKpB;AAGO,IAAM,WAAA,GAAN,cAA0B,QAAA,CAAS;AAAA,EACxC,WAAA,CACkB,IAAA,EAChB,OAAA,EACA,MAAA,EACA;AACA,IAAA,KAAA,CAAM,SAAS,MAAM,CAAA;AAJL,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAKhB,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EACd;AAAA,EANkB,IAAA;AAOpB;AAGO,IAAM,YAAA,GAAN,cAA2B,QAAA,CAAS;AAAA,EACzC,WAAA,CACkB,MAAA,EAEA,IAAA,EAChB,MAAA,EACA;AACA,IAAA,KAAA,CAAM,CAAA,KAAA,EAAQ,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA;AALrC,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAIhB,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AAAA,EAPkB,MAAA;AAAA,EAEA,IAAA;AAMpB;AAGO,IAAM,aAAA,GAAN,cAA4B,QAAA,CAAS;AAAA,EAC1C,WAAA,CAE2B,KAAA,EAET,IAAA,EAChB,MAAA,EACA;AACA,IAAA,MAAM,WAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACtE,IAAA,KAAA,CAAM,CAAA,8BAAA,EAAiC,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA;AANhC,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAET,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAKhB,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AAAA,EAR2B,KAAA;AAAA,EAET,IAAA;AAOpB;AAGO,IAAM,eAAA,GAAN,cAA8B,QAAA,CAAS;AAAA,EAC5C,WAAA,CACkB,WAChB,MAAA,EACA;AACA,IAAA,KAAA,CAAM,CAAA,4BAAA,EAA+B,SAAS,CAAA,EAAA,CAAA,EAAM,MAAM,CAAA;AAH1C,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAIhB,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AAAA,EALkB,SAAA;AAMpB;AAGO,IAAM,eAAA,GAAN,cAA8B,QAAA,CAAS;AAAA,EAC5C,WAAA,CAE2B,OACzB,MAAA,EACA;AACA,IAAA,MAAM,WAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACtE,IAAA,KAAA,CAAM,CAAA,mBAAA,EAAsB,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA;AAJrB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAKzB,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AAAA,EAN2B,KAAA;AAO7B;;;AC1QA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,OAAO,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,EACrD;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY,CAAE,OAAO,KAAK,CAAA;AAC5C,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAW,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,KAAK,MAAM,CAAA;AACpB;AAYA,SAAS,gBAAgB,IAAA,EAAsB;AAC7C,EAAA,OAAO,IAAA,CACJ,OAAA,CAAQ,+CAAA,EAAiD,iCAAiC,EAC1F,OAAA,CAAQ,4BAAA,EAA8B,yBAAyB,CAAA,CAC/D,QAAQ,+BAAA,EAAiC,4BAA4B,CAAA,CACrE,OAAA,CAAQ,6CAA6C,eAAe,CAAA;AACzE;AAGA,SAAS,aAAA,GAAwB;AAE/B,EAAA,MAAM,IAAI,UAAA,CAAW,MAAA;AACrB,EAAA,IAAI,KAAK,OAAO,CAAA,CAAE,eAAe,UAAA,EAAY,OAAO,EAAE,UAAA,EAAW;AAKjE,EAAA,OAAO,GAAG,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAC9E;AAyBO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAAtB,IAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAkB,MAAA,EAAgB,MAAA,GAAoB,EAAC,EAAe;AAC1E,IAAA,MAAM,KAAK,aAAA,EAAc;AACzB,IAAA,MAAM,IAAA,GAAO,QAAA,GAAW,UAAA,CAAW,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAGxF,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU,EAAE,SAAS,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAElE,IAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,SAAA,IAAa,GAAA;AACzC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,IAAA,CAAK,KAAA,IAAS,SAAS,CAAA;AAEtD,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAM,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ;AAAA,QAClC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe;AAAA,SACjB;AAAA,QACA,IAAA;AAAA,QACA,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,YAAA,CAAa,KAAK,CAAA;AAElB,MAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACrD,QAAA,MAAM,IAAI,eAAA,CAAgB,SAAA,EAAW,MAAM,CAAA;AAAA,MAC7C;AACA,MAAA,MAAM,IAAI,eAAA,CAAgB,GAAA,EAAK,MAAM,CAAA;AAAA,IACvC,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAEA,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAMA,WAAU,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC/C,MAAA,MAAM,IAAI,YAAA,CAAa,GAAA,CAAI,QAAQ,eAAA,CAAgBA,QAAO,GAAG,MAAM,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA,EAAK;AAC/B,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,eAAA,CAAgB,OAAO,GAAG,MAAM,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,YAAY,IAAA,CAAK,KAAA,CAAM,MAAM,IAAA,CAAK,KAAA,CAAM,SAAS,MAAM,CAAA;AAAA,IACnE;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,MAAM,MAAA,EAAyC;AAGnD,IAAA,MAAM,OAAA,GAAoC;AAAA,MACxC,CAAC,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAAA,MAC1B,CAAC,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,MAC5B,CAAC,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAAA,MAC1B,CAAC,qBAAA,EAAuB,MAAA,CAAO,mBAAmB,CAAA;AAAA,MAClD,CAAC,cAAA,EAAgB,MAAA,CAAO,YAAY,CAAA;AAAA,MACpC,CAAC,uBAAA,EAAyB,MAAA,CAAO,qBAAqB,CAAA;AAAA,MACtD,CAAC,wBAAA,EAA0B,MAAA,CAAO,sBAAsB,CAAA;AAAA,MACxD,CAAC,mBAAA,EAAqB,MAAA,CAAO,iBAAiB,CAAA;AAAA,MAC9C,CAAC,0BAAA,EAA4B,MAAA,CAAO,wBAAwB,CAAA;AAAA,MAC5D,CAAC,kBAAA,EAAoB,MAAA,CAAO,gBAAgB,CAAA;AAAA,MAC5C,CAAC,kBAAA,EAAoB,MAAA,CAAO,gBAAgB,CAAA;AAAA,MAC5C,CAAC,oBAAA,EAAsB,MAAA,CAAO,kBAAkB,CAAA;AAAA,MAChD,CAAC,uBAAA,EAAyB,MAAA,CAAO,qBAAqB;AAAA,KACxD;AACA,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,IAAS,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC3C,MAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,CAAG,CAAC,MAAM,MAAA,EAAW;AAChC,QAAA,OAAA,GAAU,CAAA;AACV,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAgB,2BAAA,EAA6B,IAAI,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAA,CACJ,SAAA,EACA,WAAA,EACA,UAAA,EACA,sBAAsB,IAAA,EACC;AACvB,IAAA,OAAO,IAAA,CAAK,KAAmB,0BAAA,EAA4B;AAAA,MACzD,SAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAA,CACJ,SAAA,EACA,WAAA,EACA,UAAA,EACuB;AACvB,IAAA,OAAO,IAAA,CAAK,KAAmB,0BAAA,EAA4B;AAAA,MACzD,SAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,YAAY,OAAA,EAA6C;AAC7D,IAAA,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAC5B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAkB,2BAAA,EAA6B,CAAC,OAAO,CAAC,CAAA;AAAA,EACtE;AAAA;AAAA,EAGA,MAAM,YAAY,OAAA,EAA6C;AAC7D,IAAA,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAC5B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAkB,2BAAA,EAA6B,CAAC,OAAO,CAAC,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAM,SAAA,EAA6C;AACvD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAmB,6BAAA,EAA+B,CAAC,SAAS,CAAC,CAAA;AAAA,EAC3E;AAAA,EAEQ,gBAAgB,OAAA,EAA6B;AACnD,IAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,OAAA,CAAQ,SAAS,GAAA,EAAK;AAC9C,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,CAAA,6DAAA,EAAgE,QAAQ,MAAM,CAAA;AAAA,OAChF;AAAA,IACF;AAAA,EACF;AACF;ACjMO,SAAS,mBAAA,CACd,KACA,OAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,mBAAmB,GAAA,CAAI,iBAAA;AAAA,IACvB,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,OAAA;AAAA,IACA,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,QAAQ,GAAA,CAAI;AAAA,GACd;AACF;AAGO,SAAS,sBAAsB,KAAA,EAAsC;AAC1E,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,EAAE,CAAA;AAChE,EAAA,IAAI,GAAA,GAAM,CAAA;AAEV,EAAA,aAAA,CAAc,GAAA,EAAK,GAAA,EAAK,KAAA,CAAM,OAAA,KAAY,CAAC,CAAA;AAC3C,EAAA,GAAA,IAAO,CAAA;AAEP,EAAA,GAAA,CAAI,IAAI,mBAAA,CAAoB,KAAA,CAAM,iBAAA,EAAmB,mBAAmB,GAAG,GAAG,CAAA;AAC9E,EAAA,GAAA,IAAO,EAAA;AAEP,EAAA,GAAA,CAAI,IAAI,mBAAA,CAAoB,KAAA,CAAM,UAAA,EAAY,YAAY,GAAG,GAAG,CAAA;AAChE,EAAA,GAAA,IAAO,EAAA;AAEP,EAAA,aAAA,CAAc,GAAA,EAAK,GAAA,EAAK,KAAA,CAAM,IAAA,KAAS,CAAC,CAAA;AACxC,EAAA,GAAA,IAAO,CAAA;AAEP,EAAA,aAAA,CAAc,GAAA,EAAK,GAAA,EAAK,YAAA,CAAa,KAAA,CAAM,IAAI,CAAC,CAAA;AAChD,EAAA,GAAA,IAAO,CAAA;AAEP,EAAA,aAAA,CAAc,GAAA,EAAK,GAAA,EAAK,KAAA,CAAM,OAAO,CAAA;AACrC,EAAA,GAAA,IAAO,CAAA;AAEP,EAAA,aAAA,CAAc,GAAA,EAAK,GAAA,EAAK,KAAA,CAAM,UAAA,GAAa,KAAM,CAAA;AACjD,EAAA,GAAA,IAAO,CAAA;AAEP,EAAA,GAAA,CAAI,IAAI,mBAAA,CAAoB,KAAA,CAAM,MAAA,EAAQ,QAAQ,GAAG,GAAG,CAAA;AACxD,EAAA,GAAA,IAAO,EAAA;AAEP,EAAA,GAAA,CAAI,IAAI,mBAAA,CAAoB,KAAA,CAAM,MAAA,EAAQ,QAAQ,GAAG,GAAG,CAAA;AACxD,EAAA,GAAA,IAAO,EAAA;AAEP,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,wBAAwB,KAAA,EAAsC;AAC5E,EAAA,OAAOC,cAAA,CAAO,qBAAA,CAAsB,KAAK,CAAC,CAAA;AAC5C;AAOO,SAAS,YAAY,KAAA,EAAsC;AAChE,EAAA,MAAM,UAAA,GAAa,wBAAwB,KAAK,CAAA;AAChD,EAAA,MAAM,QAAA,GAAWA,eAAO,UAAU,CAAA;AAGlC,EAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,EAAE,CAAA;AACjC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,UAAa,CAAC,CAAA,GAAI,QAAA,CAAS,EAAA,GAAK,CAAC,CAAA;AACzD,EAAA,OAAO,OAAA;AACT;AAMA,SAAS,mBAAA,CAAoB,KAAa,KAAA,EAA2B;AACnE,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,GAAA,EAAK,EAAA,EAAI,KAAK,CAAA;AAE5C,EAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,EAAE,CAAA;AACjC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,UAAa,CAAC,CAAA,GAAI,OAAA,CAAQ,EAAA,GAAK,CAAC,CAAA;AACxD,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,aAAA,CAAc,GAAA,EAAa,OAAA,EAAiB,KAAA,EAA2B;AAC9E,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,IAAK,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AACxE,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,OAAA,GAAU,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,OAAA,EAAU,KAAK,CAAA,WAAA,EAAc,OAAA,GAAU,CAAC,CAAA,YAAA,EAAe,OAAO,CAAA,aAAA,EAAgB,CAAA,CAAE,MAAM,CAAA;AAAA,KACxF;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,OAAO,CAAA;AAClC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAA;AACnD,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,KAAK,CAAA,sBAAA,EAAyB,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7D;AACA,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA;AAAA,EACX;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,aAAa,IAAA,EAAsB;AAG1C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA;AAC3E,EAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAClB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA;AAAA,EACtE;AACA,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,EAAE,CAAA;AACxB,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG;AACnB,IAAA,MAAM,IAAI,MAAM,CAAA,wBAAA,CAA0B,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,CAAA,KAAM,CAAA;AACf;AAEA,SAAS,aAAA,CAAc,GAAA,EAAiB,MAAA,EAAgB,KAAA,EAAqB;AAC3E,EAAA,GAAA,CAAI,MAAM,IAAI,KAAA,GAAQ,GAAA;AACtB,EAAA,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,KAAA,KAAU,CAAA,GAAK,GAAA;AACpC;AAEA,SAAS,aAAA,CAAc,GAAA,EAAiB,MAAA,EAAgB,KAAA,EAAqB;AAC3E,EAAA,GAAA,CAAI,MAAM,IAAI,KAAA,GAAQ,GAAA;AACtB,EAAA,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,KAAA,KAAU,CAAA,GAAK,GAAA;AAClC,EAAA,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,KAAA,KAAU,EAAA,GAAM,GAAA;AACnC,EAAA,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,KAAA,KAAU,EAAA,GAAM,GAAA;AACrC;AAEA,SAAS,aAAA,CAAc,GAAA,EAAiB,MAAA,EAAgB,KAAA,EAAqB;AAC3E,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,KAAA,GAAQ,WAAW,CAAA;AACrC,EAAA,MAAM,EAAA,GAAK,MAAA,CAAQ,KAAA,IAAS,GAAA,GAAO,WAAW,CAAA;AAC9C,EAAA,aAAA,CAAc,GAAA,EAAK,QAAQ,EAAE,CAAA;AAC7B,EAAA,aAAA,CAAc,GAAA,EAAK,MAAA,GAAS,CAAA,EAAG,EAAE,CAAA;AACnC;;;AC7KO,IAAM,WAAA,GAAc,UAAA;AAGpB,IAAM,YAAA,GAAe,oBAAA;AAErB,IAAM,YAAA,GAAe,oBAAA;AAErB,IAAM,YAAA,GAAe,oBAAA;AAErB,IAAM,YAAA,GAAe,oBAAA;AAGrB,IAAM,uBAAA,GAA0B,oBAAA;;;ACHvC,IAAM,WAAA,GAAc,OAAO,WAAW,CAAA;AAMtC,SAAS,SAAS,CAAA,EAAoB;AACpC,EAAA,IAAI,CAAA,GAAA,CAAK,CAAA,GAAI,WAAA,KAAgB,CAAA,IAAK,GAAA,CAAA;AAClC,EAAA,CAAA,GAAA,CAAK,CAAA,GAAI,gBAAgB,CAAA,IAAK,GAAA,CAAA;AAC9B,EAAA,IAAI,MAAA,GAAS,OAAO,CAAC,CAAA;AACrB,EAAA,IAAI,MAAA,IAAU,aAAa,MAAA,IAAU,WAAA;AACrC,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,GAAA,CAAI,GAAY,CAAA,EAAqB;AACnD,EAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,EAAA,OAAO,CAAA,IAAK,WAAA,GAAc,CAAA,GAAI,WAAA,GAAc,CAAA;AAC9C;AAqDO,SAAS,UAAA,CAAW,MAAkB,KAAA,EAAwB;AACnE,EAAA,IAAI,IAAA,CAAK,WAAW,EAAA,EAAI;AACtB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6CAAA,EAAgD,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAAA,EAC/E;AACA,EAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,CAAC,CAAA;AAChC,EAAAC,cAAAA,CAAc,OAAA,EAAS,CAAA,EAAG,KAAA,KAAU,CAAC,CAAA;AAErC,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,GAAA,EAAK,KAAA,EAAA,EAAS;AACxC,IAAA,MAAM,MAAA,GAASD,eAAO,MAAA,EAAO;AAC7B,IAAA,MAAA,CAAO,OAAO,IAAI,CAAA;AAClB,IAAA,MAAA,CAAO,OAAO,OAAO,CAAA;AACrB,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,CAAC,CAAA;AAChC,MAAAC,cAAAA,CAAc,OAAA,EAAS,CAAA,EAAG,KAAK,CAAA;AAC/B,MAAA,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA,IACvB;AACA,IAAA,MAAMC,KAAAA,GAAO,OAAO,MAAA,EAAO;AAC3B,IAAA,MAAM,SAAA,GAAY,YAAA,CAAaA,KAAAA,EAAM,CAAC,CAAA,GAAI,WAAA;AAC1C,IAAA,IAAI,SAAA,GAAY,aAAa,OAAO,SAAA;AAAA,EACtC;AAGA,EAAA,MAAM,QAAA,GAAWF,eAAO,MAAA,EAAO;AAC/B,EAAA,QAAA,CAAS,OAAO,IAAI,CAAA;AACpB,EAAA,QAAA,CAAS,OAAO,OAAO,CAAA;AACvB,EAAA,QAAA,CAAS,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,iBAAiB,CAAC,CAAA;AAC3D,EAAA,MAAM,IAAA,GAAO,SAAS,MAAA,EAAO;AAC7B,EAAA,OAAO,YAAA,CAAa,IAAA,EAAM,CAAC,CAAA,GAAI,WAAA;AACjC;AASO,SAAS,GAAA,CAAI,CAAA,EAA4B,CAAA,EAA4B,GAAA,EAAsB;AAChG,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,IAAA,GAAA,IAAO,MAAA,CAAO,EAAE,CAAC,CAAE,IAAI,MAAA,CAAO,CAAA,CAAE,CAAC,CAAE,CAAA;AACnC,IAAA,IAAI,EAAE,YAAY,CAAA,EAAG;AACnB,MAAA,GAAA,GAAA,CAAO,GAAA,GAAM,gBAAgB,GAAA,IAAO,GAAA,CAAA;AACpC,MAAA,GAAA,GAAA,CAAO,GAAA,GAAM,gBAAgB,GAAA,IAAO,GAAA,CAAA;AACpC,MAAA,OAAA,GAAU,CAAA;AAAA,IACZ;AAAA,EACF;AACA,EAAA,OAAO,SAAS,GAAG,CAAA;AACrB;AAEA,SAASC,cAAAA,CAAc,GAAA,EAAiB,MAAA,EAAgB,KAAA,EAAqB;AAC3E,EAAA,GAAA,CAAI,MAAM,IAAI,KAAA,GAAQ,GAAA;AACtB,EAAA,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,KAAA,KAAU,CAAA,GAAK,GAAA;AAClC,EAAA,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,KAAA,KAAU,EAAA,GAAM,GAAA;AACnC,EAAA,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,KAAA,KAAU,EAAA,GAAM,GAAA;AACrC;AAEA,SAAS,YAAA,CAAa,KAAiB,MAAA,EAAwB;AAC7D,EAAA,OAAA,CACG,IAAI,MAAM,CAAA,GACR,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,IAAM,CAAA,GACpB,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,IAAM,EAAA,GACpB,IAAI,MAAA,GAAS,CAAC,KAAM,EAAA,MACvB,CAAA;AAEJ;;;AC1IO,SAAS,KAAA,CAAM,MAAc,IAAA,EAAsB;AACxD,EAAA,OAAO,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,IAAI,WAAA,CAAY,IAAA,GAAO,IAAI,CAAA,EAAE;AAC1D;AAkBO,SAAS,YAAA,CAAa,IAAA,EAAkB,IAAA,EAAc,IAAA,EAAsB;AACjF,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAC1B,EAAA,MAAM,QAAQ,IAAA,GAAO,IAAA;AACrB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,GAAI,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,CAAA;AACT;AAMO,SAAS,MAAA,CAAO,GAAW,CAAA,EAAmB;AACnD,EAAA,IAAI,EAAE,IAAA,KAAS,CAAA,CAAE,QAAQ,CAAA,CAAE,IAAA,KAAS,EAAE,IAAA,EAAM;AAC1C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,GAAA,EAAM,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAAA,EACpF;AACA,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAA,CAAE,IAAA,EAAM,EAAE,IAAI,CAAA;AAChC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,GAAI,GAAA,CAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAE,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,GAAA;AACT;AASO,SAAS,MAAA,CAAO,GAAW,CAAA,EAAmB;AACnD,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,IAAA,EAAM;AACrB,IAAA,MAAM,IAAI,MAAM,CAAA,kCAAA,EAAqC,CAAA,CAAE,IAAI,CAAA,QAAA,EAAW,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAAA,EAChF;AACA,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAA,CAAE,IAAA,EAAM,EAAE,IAAI,CAAA;AAChC,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA;AACrC,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA;AACrC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,CAAA,GAAI,CAAA,CAAE,OAAO,CAAC,CAAA;AAClE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,CAAA,GAAI,CAAA,CAAE,OAAO,CAAC,CAAA;AAClE,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,GAAI,CAAA,CAAE,IAAA,GAAO,CAAC,IAAI,GAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,CAAA,CAAE,IAAI,CAAA;AAAA,IAC5D;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AC3CO,SAAS,eAAA,CAAgB,WAAmB,OAAA,EAAiC;AAClF,EAAA,IAAI,OAAA,CAAQ,WAAW,EAAA,EAAI;AACzB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6CAAA,EAAgD,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,EAClF;AACA,EAAA,IAAI,SAAA,CAAU,WAAW,EAAA,EAAI;AAE3B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kDAAA,EAAqD,SAAA,CAAU,MAAM,CAAA,CAAE,CAAA;AAAA,EACzF;AACA,EAAA,MAAM,MAAA,GAASD,eAAO,MAAA,EAAO;AAC7B,EAAA,MAAA,CAAO,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,SAAS,CAAC,CAAA;AACjD,EAAA,MAAA,CAAO,OAAO,OAAO,CAAA;AACrB,EAAA,OAAO,OAAO,MAAA,EAAO;AACvB;AAaO,SAAS,QAAA,CAAS,OAAA,EAAqB,CAAA,EAAW,CAAA,EAAsB;AAC7E,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,YAAA,EAAc,OAAO,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,YAAA,EAAc,OAAO,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,YAAA,EAAc,OAAO,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,YAAA,EAAc,OAAO,CAAA;AACpD,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,YAAA,CAAa,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,IAC9B,GAAA,EAAK,YAAA,CAAa,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,IAC9B,GAAA,EAAK,YAAA,CAAa,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,IAC9B,GAAA,EAAK,YAAA,CAAa,MAAA,EAAQ,CAAA,EAAG,CAAC;AAAA,GAChC;AACF;AC5CA,SAAS,sBAAsB,OAAA,EAAiC;AAC9D,EAAA,MAAM,MAAA,GAASA,eAAO,MAAA,EAAO;AAC7B,EAAA,MAAA,CAAO,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,uBAAuB,CAAC,CAAA;AAC/D,EAAA,MAAA,CAAO,OAAO,OAAO,CAAA;AACrB,EAAA,OAAO,OAAO,MAAA,EAAO;AACvB;AAMO,SAAS,uBAAA,CAAwB,SAAqB,CAAA,EAAwB;AACnF,EAAA,IAAI,CAAA,IAAK,CAAA,EAAG,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAC3D,EAAA,MAAM,IAAA,GAAO,sBAAsB,OAAO,CAAA;AAC1C,EAAA,MAAM,MAAM,CAAA,GAAI,CAAA;AAChB,EAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY,GAAG,CAAA;AAC/B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,MAAS,CAAC,CAAA,GAAI,UAAA,CAAW,IAAA,EAAM,CAAC,CAAA;AACzD,EAAA,OAAO,GAAA;AACT;AAMO,SAAS,aAAA,CAAc,OAAoB,CAAA,EAAwB;AACxE,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ;AAC7B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,yCAAA,EAA4C,KAAA,CAAM,MAAM,CAAA,UAAA,EAAa,EAAE,MAAM,CAAA;AAAA,KAC/E;AAAA,EACF;AACA,EAAA,OAAO,GAAA,CAAS,KAAA,EAAO,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA;AACxC;AAUO,IAAM,mBAAN,MAAuB;AAAA,EACX,MAAA,GAASA,eAAO,MAAA,EAAO;AAAA,EACvB,WAAA;AAAA,EACA,CAAA;AAAA,EACA,GAAA,GAAM,IAAI,UAAA,CAAW,CAAC,CAAA;AAAA,EAEvC,WAAA,CAAY,SAAqB,CAAA,EAAW;AAC1C,IAAA,IAAA,CAAK,CAAA,GAAI,CAAA;AACT,IAAA,IAAA,CAAK,WAAA,GAAc,uBAAA,CAAwB,OAAA,EAAS,CAAC,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAA,CAAgB,EAAA,EAAY,EAAA,EAAY,IAAA,EAAc,MAAA,EAA2B;AAC/E,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,IAAA,CAAK,CAAA,GAAI,KAAK,CAAA,EAAG;AACrC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,oCAAoC,IAAA,CAAK,CAAA,GAAI,KAAK,CAAC,CAAA,eAAA,EAAkB,OAAO,MAAM,CAAA;AAAA,OACpF;AAAA,IACF;AACA,IAAA,MAAM,UAAA,GAAa,aAAA,CAAc,MAAA,EAAQ,IAAA,CAAK,WAAW,CAAA;AACzD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,UAAA,GAAa,GAAA;AAC3B,IAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAK,UAAA,KAAe,CAAA,GAAK,GAAA;AACnC,IAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAK,UAAA,KAAe,EAAA,GAAM,GAAA;AACpC,IAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAK,UAAA,KAAe,EAAA,GAAM,GAAA;AACpC,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,QAAA,GAAuB;AACrB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,EAAO;AACjC,IAAA,OAAOA,eAAO,KAAK,CAAA;AAAA,EACrB;AACF,CAAA;AAwBO,SAAS,eAAA,CACd,MAAA,EACA,MAAA,EACA,CAAA,EACA,OAAA,EACuB;AACvB,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,IAAA,KAAS,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,IAAA,KAAS,MAAA,CAAO,IAAA,EAAM;AAC7F,IAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,EAC1E;AACA,EAAA,IAAI,CAAA,KAAM,CAAA,IAAK,MAAA,CAAO,IAAA,GAAO,MAAM,CAAA,EAAG;AACpC,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AAEA,EAAA,MAAM,IAAI,MAAA,CAAO,IAAA;AACjB,EAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACzB,EAAA,MAAM,MAAA,GAAS,IAAI,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA;AAE9C,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,CAAA,GAAI,CAAC,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,CAAA,GAAI,CAAC,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,CAAA,GAAI,CAAC,CAAA;AAEpC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AACb,MAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,CAAA,EAAG,GAAA,EAAA,EAAO;AAChC,QAAA,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAM,CAAA;AACnC,QAAA,SAAA,CAAU,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,MAAM,CAAA;AACnC,QAAA,0BAAA,CAA2B,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,CAAC,CAAA;AACpD,QAAA,MAAA,CAAO,eAAA,CAAgB,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA;AAAA,MAC1C;AACA,MAAA,UAAA,CAAW,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,MAAM,CAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,cAAA,EAAgB,MAAA,CAAO,UAAS,EAAE;AACrD;AAOA,SAAS,SAAA,CAAU,CAAA,EAAW,EAAA,EAAY,EAAA,EAAY,GAAW,GAAA,EAAwB;AACvF,EAAA,MAAM,WAAW,EAAA,GAAK,CAAA;AACtB,EAAA,MAAM,WAAW,EAAA,GAAK,CAAA;AACtB,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,GAAA,GAAA,CAAO,QAAA,GAAW,CAAA,IAAK,MAAA,GAAS,QAAA;AACtC,IAAA,MAAM,MAAM,CAAA,GAAI,CAAA;AAChB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,GAAA,CAAI,MAAM,CAAC,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IAC/B;AAAA,EACF;AACF;AAGA,SAAS,UAAA,CAAW,CAAA,EAAW,EAAA,EAAY,EAAA,EAAY,GAAW,KAAA,EAA0B;AAC1F,EAAA,MAAM,WAAW,EAAA,GAAK,CAAA;AACtB,EAAA,MAAM,WAAW,EAAA,GAAK,CAAA;AACtB,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,GAAA,GAAA,CAAO,QAAA,GAAW,CAAA,IAAK,MAAA,GAAS,QAAA;AACtC,IAAA,MAAM,MAAM,CAAA,GAAI,CAAA;AAChB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,CAAA,CAAE,KAAK,GAAA,GAAM,CAAC,CAAA,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,IACjC;AAAA,EACF;AACF;AAOA,SAAS,0BAAA,CACP,CAAA,EACA,KAAA,EACA,CAAA,EACA,CAAA,EACM;AAIN,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,CAAC,CAAA;AAChC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK,MAAA,CAAO,CAAC,CAAA,GAAI,KAAA,CAAM,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AACvD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,WAAW,CAAA,GAAI,CAAA;AAErB,MAAA,IAAI,GAAA,GAAM,EAAA;AACV,MAAA,IAAI,OAAA,GAAU,CAAA;AACd,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,QAAA,GAAA,IAAO,MAAA,CAAO,EAAE,QAAA,GAAW,CAAC,CAAE,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAE,CAAA;AACnD,QAAA,IAAI,EAAE,YAAY,CAAA,EAAG;AACnB,UAAA,GAAA,GAAA,CAAO,GAAA,GAAM,YAAY,GAAA,IAAO,GAAA,CAAA;AAChC,UAAA,GAAA,GAAA,CAAO,GAAA,GAAM,YAAY,GAAA,IAAO,GAAA,CAAA;AAChC,UAAA,OAAA,GAAU,CAAA;AAAA,QACZ;AAAA,MACF;AAEA,MAAA,GAAA,GAAA,CAAO,GAAA,GAAM,YAAY,GAAA,IAAO,GAAA,CAAA;AAChC,MAAA,GAAA,GAAA,CAAO,GAAA,GAAM,YAAY,GAAA,IAAO,GAAA,CAAA;AAChC,MAAA,IAAI,MAAA,GAAS,OAAO,GAAG,CAAA;AACvB,MAAA,IAAI,MAAA,IAAU,SAAS,MAAA,IAAU,OAAA;AACjC,MAAA,CAAA,CAAE,QAAA,GAAW,CAAC,CAAA,GAAI,GAAA,CAAS,EAAE,QAAA,GAAW,CAAC,GAAI,MAAM,CAAA;AAAA,IACrD;AAAA,EACF;AACF;AAEA,IAAM,OAAA,GAAU,UAAA;AAChB,IAAM,OAAA,GAAU,WAAA;;;ACxNhB,IAAM,OAAA,GAAA,CAAW,MAAM,GAAA,IAAO,EAAA;AAyBvB,SAAS,OAAA,CAAQ,SAAA,EAAsB,OAAA,GAA0B,EAAC,EAAwB;AAC/F,EAAA,MAAM,UAAU,SAAA,CAAU,SAAA;AAC1B,EAAA,MAAM,MAAM,OAAA,CAAQ,cAAA;AACpB,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,MAAA;AAE5B,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,GAAA;AACrC,EAAA,MAAM,aAAa,OAAA,CAAQ,UAAA,IAAc,MAAA,CAAO,GAAA,CAAI,iBAAiB,CAAC,CAAA;AACtE,EAAA,MAAM,eAAA,GAAkB,QAAQ,eAAA,IAAmB,CAAA;AAEnD,EAAA,IAAI,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,KAAK,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,MAAM,CAAA,kCAAA,EAAqC,CAAC,OAAO,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3E;AACA,EAAA,IAAI,CAAA,GAAI,MAAM,CAAA,EAAG;AACf,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,CAAC,CAAA,oBAAA,EAAuB,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3D;AAGA,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,CAAQ,MAAA,CAAO,QAAQ,QAAQ,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,CAAQ,MAAA,CAAO,QAAQ,QAAQ,CAAA;AACxD,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,OAAA,CAAQ,MAAA,EAAQ,QAAQ,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,gBAAgB,QAAQ,CAAA;AAG5C,EAAA,MAAM,CAAA,GAAI,YAAA,CAAa,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AAClC,EAAA,MAAM,CAAA,GAAI,YAAA,CAAa,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AAElC,EAAA,IAAI,QAAQ,UAAA,GAAa,OAAA;AACzB,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,QAAA,EAAU,OAAA,EAAA,EAAW;AACnD,IAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,OAAA,GAAU,eAAA,KAAoB,CAAA,EAAG;AACxD,MAAA,OAAA,CAAQ,SAAA,CAAU,SAAS,KAAK,CAAA;AAAA,IAClC;AAEA,IAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,GAAA,EAAK,KAAK,CAAA;AAClD,IAAA,MAAM,OAAA,GAAU,YAAY,WAAW,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAc,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AAEzC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,MAAM,GAAG,CAAA;AACrC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,MAAM,GAAG,CAAA;AACrC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAC1B,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAE1B,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,MAAA,EAAQ,MAAA,EAAQ,GAAG,OAAO,CAAA;AACzD,IAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,MAAA,CAAO,cAAc,CAAA;AACzD,IAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,MAAA,MAAM,cAAc,KAAA,CAAM,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,IAAI,GAAG,CAAA;AACvD,MAAA,MAAM,UAAA,GAAa,cAAA,CAAe,MAAA,CAAO,cAAc,CAAA;AACvD,MAAA,OAAO;AAAA,QACL,WAAA;AAAA,QACA,UAAA;AAAA;AAAA;AAAA,QAGA,KAAA,EAAO,EAAE,SAAA,EAAW,WAAA,EAAa,UAAA;AAAW,OAC9C;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,KAAU,SAAS,OAAO,IAAA;AAC9B,IAAA,KAAA,GAAS,QAAQ,EAAA,GAAM,OAAA;AAAA,EACzB;AAEA,EAAA,OAAO,IAAA;AACT;AAMA,SAAS,UAAA,CAAW,KAAa,KAAA,EAA2B;AAC1D,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,IAAK,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AACxE,EAAA,IAAI,CAAA,CAAE,WAAW,EAAA,EAAI;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,KAAK,CAAA,6BAAA,EAAgC,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA;AAAA,EAC5E;AACA,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,EAAE,CAAA;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAA;AACnD,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,KAAK,CAAA,sBAAA,EAAyB,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9D;AACA,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA;AAAA,EACX;AACA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,gBAAgB,KAAA,EAA2B;AAClD,EAAA,IAAI,CAAA,GAAI,EAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,CAAA,GAAK,CAAA,IAAK,EAAA,GAAM,MAAA,CAAO,KAAA,CAAM,CAAC,CAAE,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,CAAA;AACT;AAGA,SAAS,gBAAgB,KAAA,EAA2B;AAClD,EAAA,IAAI,CAAA,GAAI,EAAA;AACR,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,CAAA,GAAK,CAAA,IAAK,EAAA,GAAM,MAAA,CAAO,KAAA,CAAM,CAAC,CAAE,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,CAAA;AACT;AAGA,SAAS,eAAe,KAAA,EAA2B;AACjD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAG,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB;;;ACjFO,IAAM,SAAN,MAAa;AAAA,EAClB,aAAa,KAAA,CAAM,SAAA,EAAsB,IAAA,GAAsB,EAAC,EAA0B;AACxF,IAAA,MAAM,IAAA,GAAmB,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,YAAY,KAAA,GAAQ,SAAA,CAAA;AAEhE,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,KAAA;AACH,QAAA,OAAO,WAAA,CAAY,WAAW,IAAI,CAAA;AAAA,MACpC,KAAK,SAAA;AACH,QAAA,OAAO,cAAA,CAAe,WAAW,IAAI,CAAA;AAAA,MACvC,KAAK,MAAA;AACH,QAAA,IAAI,IAAA,CAAK,SAAA,EAAW,OAAO,WAAA,CAAY,WAAW,IAAI,CAAA;AACtD,QAAA,OAAO,cAAA,CAAe,WAAW,IAAI,CAAA;AAAA,MACvC,SAAS;AAEP,QAAA,MAAM,WAAA,GAAqB,IAAA;AAC3B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,WAAqB,CAAA,CAAA,CAAG,CAAA;AAAA,MACzE;AAAA;AACF,EACF;AACF;AAEA,eAAe,WAAA,CAAY,WAAsB,IAAA,EAA4C;AAC3F,EAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AACA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,SAAS,CAAA;AACvC;AAEA,eAAe,cAAA,CAAe,WAAsB,IAAA,EAA4C;AAC9F,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,MAAM,CAAA;AAC7C,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,EAAQ,QAAA,IAAY,GAAA;AACvC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,mDAAmD,KAAK,CAAA,gGAAA;AAAA,KAE1D;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT","file":"index.cjs","sourcesContent":["/**\n * Type definitions mirroring the BTX service-challenges RPC schema.\n *\n * Source: btx.dev/docs/rpc/service-challenges (verified 2026-05-20).\n * Schema captured against live btxd v0.29.7 at btx-iowa (block 106270).\n *\n * IMPORTANT: We do NOT camelCase rename — the RPC schema is the wire contract.\n * Field names mirror btxd output verbatim.\n */\n\n/** Difficulty calibration policy for issued challenges. */\nexport type DifficultyPolicy = 'fixed' | 'adaptive_window';\n\n/**\n * Standard purpose labels recognized by the chain. Free-form strings allowed too.\n *\n * The `(string & {})` trick keeps autocomplete on the known labels while still\n * accepting arbitrary purpose strings. Don't \"simplify\" to plain `string` — it\n * loses the autocompletion benefit. See: https://github.com/microsoft/TypeScript/issues/29729\n */\nexport type ChallengePurpose = 'rate_limit' | 'api_gate' | 'ai_inference_gate' | (string & {});\n\n/** Parameters for issuing a challenge via getmatmulservicechallenge. */\nexport interface IssueParams {\n purpose: ChallengePurpose;\n resource: string;\n subject: string;\n /** Calibrates client compute work to roughly this many seconds. btxd default: 1.0. */\n target_solve_time_s?: number;\n /** Challenge lifetime in seconds. btxd default: 300. Range 1–86400. */\n expires_in_s?: number;\n validation_overhead_s?: number;\n propagation_overhead_s?: number;\n /** btxd default: \"fixed\". */\n difficulty_policy?: DifficultyPolicy;\n difficulty_window_blocks?: number;\n min_solve_time_s?: number;\n max_solve_time_s?: number;\n solver_parallelism?: number;\n solver_duty_cycle_pct?: number;\n}\n\n/**\n * Binding identifies the (purpose, resource, subject) trio the challenge is\n * scoped to. btxd also embeds hashes + anchor info for replay protection.\n */\nexport interface ChallengeBinding {\n chain: string;\n purpose: string;\n resource: string;\n subject: string;\n resource_hash: string;\n subject_hash: string;\n salt: string;\n anchor_height: number;\n anchor_hash: string;\n /** Hashing rule used to compute challenge_id. Treat as opaque docstring from btxd. */\n challenge_id_rule?: string;\n seed_derivation_rule?: string;\n /** Open extension — btxd may add fields without breaking us. */\n [k: string]: unknown;\n}\n\n/**\n * Proof policy describes what btxd will check when redeeming. Treat fields\n * as authoritative — do NOT re-derive verification rules client-side.\n */\nexport interface ChallengeProofPolicy {\n verification_rule: string;\n sigma_gate_applied: boolean;\n expiration_enforced: boolean;\n challenge_id_required: boolean;\n replay_protection: string;\n redeem_rpc: string;\n solve_rpc: string;\n locally_issued_required: boolean;\n issued_challenge_store?: string;\n issued_challenge_scope?: string;\n [k: string]: unknown;\n}\n\n/** MatMul parameters needed to solve. Day 2 solver consumes these. */\nexport interface ChallengeMatmul {\n /** Matrix dimension. btxd ships n=512 in production. */\n n: number;\n /** Block dimension for compression. */\n b: number;\n /** Noise rank. */\n r: number;\n /** Field modulus (Mersenne prime 2^31-1). */\n q: number;\n min_dimension: number;\n max_dimension: number;\n /** Hex-encoded seed for matrix A. */\n seed_a: string;\n /** Hex-encoded seed for matrix B. */\n seed_b: string;\n}\n\n/** Block header context the challenge is anchored to. */\nexport interface ChallengeHeaderContext {\n version: number;\n previousblockhash: string;\n merkleroot: string;\n time: number;\n bits: string;\n nonce64_start: number;\n matmul_dim: number;\n seed_a: string;\n seed_b: string;\n}\n\n/**\n * Inner challenge payload — what the solver actually needs.\n * The Day 2 MatMul solver reads `matmul`, `target`, `noncerange`, and `header_context`.\n */\nexport interface ChallengePayload {\n chain: string;\n algorithm: string;\n height: number;\n previousblockhash: string;\n mintime: number;\n bits: string;\n difficulty: number;\n /** Hex-encoded target. Digest must compare ≤ target for valid proof. */\n target: string;\n noncerange: string;\n header_context: ChallengeHeaderContext;\n matmul: ChallengeMatmul;\n /** btxd ships additional fields (work_profile, runtime_observability, etc.) we treat as opaque. */\n [k: string]: unknown;\n}\n\n/**\n * The challenge envelope returned by getmatmulservicechallenge.\n * Opaque to the SDK at the wire boundary — pass through to solver / redeem.\n */\nexport interface Challenge {\n /** btxd schema kind discriminator (e.g. \"matmul_service_challenge_v1\"). */\n kind?: string;\n challenge_id: string;\n issued_at: number;\n expires_at: number;\n expires_in_s: number;\n binding: ChallengeBinding;\n proof_policy: ChallengeProofPolicy;\n challenge: ChallengePayload;\n /** Open extension. */\n [k: string]: unknown;\n}\n\n/** Reasons returned by verify/redeem. Open string — btxd may add more. */\nexport type VerifyReason =\n | 'ok'\n | 'invalid_proof'\n | 'challenge_mismatch'\n | 'expired'\n | 'unknown_challenge'\n | 'already_redeemed'\n | 'missing_proof'\n | (string & {});\n\n/** Outcome of verifymatmulserviceproof / redeemmatmulserviceproof. */\nexport interface VerifyResult {\n valid: boolean;\n expired?: boolean;\n reason: VerifyReason;\n issued_by_local_node?: boolean;\n redeemed?: boolean;\n redeemable?: boolean;\n mismatch_field?: string;\n}\n\n/** Single entry in a batch redeem/verify call. */\nexport interface BatchEntry {\n challenge: Challenge;\n nonce64_hex: string;\n digest_hex: string;\n}\n\n/** Batch response — sequential per-proof results. */\nexport interface BatchResult {\n count: number;\n valid: number;\n invalid: number;\n by_reason: Record<string, number>;\n results: VerifyResult[];\n}\n\n/** Solver output (also returned by solvematmulservicechallenge RPC). */\nexport interface SolverOutput {\n nonce64_hex: string;\n digest_hex: string;\n proof: Record<string, unknown>;\n}\n\n/** RPC client configuration. */\nexport interface BtxClientOpts {\n /**\n * Full JSON-RPC endpoint, e.g. `http://127.0.0.1:19332`.\n *\n * **Security**: use HTTPS (or a localhost-only deployment) when the RPC\n * endpoint is not on `127.0.0.1`. Basic auth over plaintext exposes credentials.\n * Terminate TLS at stunnel/nginx/Caddy in front of btxd; do NOT expose\n * btxd's RPC port directly to the public internet.\n */\n rpcUrl: string;\n /** Basic-auth credentials matching btxd's rpcauth / rpcuser+rpcpassword. */\n rpcAuth: {\n user: string;\n pass: string;\n };\n /** Request timeout in ms (default 30000). */\n timeoutMs?: number;\n}\n\n// ============================================================================\n// Error taxonomy\n// ============================================================================\n\n/** Base class — all SDK errors extend this for `instanceof BtxError` checks. */\nexport class BtxError extends Error {\n constructor(\n message: string,\n public readonly method?: string,\n ) {\n super(message);\n this.name = 'BtxError';\n }\n}\n\n/** btxd returned a JSON-RPC error envelope with code + message. */\nexport class BtxRpcError extends BtxError {\n constructor(\n public readonly code: number,\n message: string,\n method?: string,\n ) {\n super(message, method);\n this.name = 'BtxRpcError';\n }\n}\n\n/** btxd returned a non-2xx HTTP status. */\nexport class BtxHttpError extends BtxError {\n constructor(\n public readonly status: number,\n /** Response body, with `Authorization: Basic ...` patterns redacted. */\n public readonly body: string,\n method?: string,\n ) {\n super(`HTTP ${status}: ${body.slice(0, 200)}`, method);\n this.name = 'BtxHttpError';\n }\n}\n\n/** The HTTP response was 2xx but the body wasn't valid JSON. */\nexport class BtxParseError extends BtxError {\n constructor(\n /** Underlying SyntaxError or similar. Overrides the ES2022 `Error.cause` slot. */\n public override readonly cause: unknown,\n /** Raw response body (redacted). */\n public readonly body: string,\n method?: string,\n ) {\n const causeMsg = cause instanceof Error ? cause.message : String(cause);\n super(`Failed to parse RPC response: ${causeMsg}`, method);\n this.name = 'BtxParseError';\n }\n}\n\n/** Request exceeded `timeoutMs`. */\nexport class BtxTimeoutError extends BtxError {\n constructor(\n public readonly timeoutMs: number,\n method?: string,\n ) {\n super(`RPC request timed out after ${timeoutMs}ms`, method);\n this.name = 'BtxTimeoutError';\n }\n}\n\n/** Transport-level failure (DNS, TCP reset, TLS, etc.). Wraps the underlying cause. */\nexport class BtxNetworkError extends BtxError {\n constructor(\n /** Underlying error from fetch / dns / tls. Overrides the ES2022 `Error.cause` slot. */\n public override readonly cause: unknown,\n method?: string,\n ) {\n const causeMsg = cause instanceof Error ? cause.message : String(cause);\n super(`RPC network error: ${causeMsg}`, method);\n this.name = 'BtxNetworkError';\n }\n}\n","import {\n BtxHttpError,\n BtxNetworkError,\n BtxParseError,\n BtxRpcError,\n BtxTimeoutError,\n type BatchEntry,\n type BatchResult,\n type BtxClientOpts,\n type Challenge,\n type IssueParams,\n type SolverOutput,\n type VerifyResult,\n} from './types.js';\n\ninterface JsonRpcResponse<T> {\n result: T;\n error: { code: number; message: string } | null;\n id: number | string;\n}\n\n/**\n * Universal UTF-8-safe base64 encoder.\n * Both Node 18.17+ and browsers expose `globalThis.crypto`, but `btoa()`\n * throws on any code point > 0xFF — so we route via TextEncoder for non-ASCII safety.\n * Per audit finding C1.\n */\nfunction base64Utf8(input: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(input, 'utf8').toString('base64');\n }\n // Browser fallback: encode UTF-8 manually so btoa() only sees byte-clean Latin1.\n const bytes = new TextEncoder().encode(input);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i] as number);\n }\n return btoa(binary);\n}\n\n/**\n * Redact sensitive header + credential patterns from error response bodies\n * before storing them on `BtxHttpError.body` (which callers commonly log).\n *\n * Covers:\n * - Authorization header echoes from proxies / debug endpoints (H2)\n * - JSON `\"password\"` / `\"rpcpassword\"` fields\n * - Config-line `rpcuser=...` / `rpcpassword=...` from btxd's loadincludeconf\n * error paths (re-audit N2 — added 2026-05-20)\n */\nfunction redactSensitive(body: string): string {\n return body\n .replace(/authorization\\s*:\\s*basic\\s+[A-Za-z0-9+/=]+/gi, 'authorization: basic [REDACTED]')\n .replace(/\"password\"\\s*:\\s*\"[^\"]*\"/gi, '\"password\":\"[REDACTED]\"')\n .replace(/\"rpcpassword\"\\s*:\\s*\"[^\"]*\"/gi, '\"rpcpassword\":\"[REDACTED]\"')\n .replace(/\\b(rpc(?:user|password|auth))\\s*=\\s*\\S+/gi, '$1=[REDACTED]');\n}\n\n/** Generate a stable-uniqueness request id without colliding across instances. */\nfunction nextRequestId(): string {\n // Both Node 18.17+ and modern browsers expose globalThis.crypto.randomUUID.\n const c = globalThis.crypto;\n if (c && typeof c.randomUUID === 'function') return c.randomUUID();\n // Last-resort fallback. NOT a security context — this id is sent as the\n // JSON-RPC `id` field, echoed by btxd, and used only for client-side\n // response correlation. `Math.random` is appropriate here (uniqueness, not\n // unpredictability). btxd doesn't authenticate against this value.\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * JSON-RPC client for BTX service-challenges.\n *\n * Wraps the 5 core RPCs:\n * - getmatmulservicechallenge (issue)\n * - verifymatmulserviceproof (verify, stateless)\n * - redeemmatmulserviceproof (verify + consume, anti-replay)\n * - verifymatmulserviceproofs (batch verify)\n * - redeemmatmulserviceproofs (batch redeem)\n *\n * Plus helper RPCs:\n * - solvematmulservicechallenge (server-side solver — for fixtures + tests)\n *\n * RPC reference: https://btx.dev/docs/rpc/service-challenges\n *\n * Error model:\n * - {@link BtxRpcError} — btxd returned a JSON-RPC error envelope\n * - {@link BtxHttpError} — non-2xx HTTP status\n * - {@link BtxParseError} — 2xx but body wasn't valid JSON\n * - {@link BtxTimeoutError} — request exceeded `timeoutMs`\n * - {@link BtxNetworkError} — DNS / TCP / TLS-level failure\n * - All extend {@link BtxError}.\n */\nexport class BtxChallengeClient {\n constructor(private readonly opts: BtxClientOpts) {}\n\n /** Low-level: raw JSON-RPC call. Exposed for forward compatibility. */\n async call<T = unknown>(method: string, params: unknown[] = []): Promise<T> {\n const id = nextRequestId();\n const auth = 'Basic ' + base64Utf8(`${this.opts.rpcAuth.user}:${this.opts.rpcAuth.pass}`);\n // JSON-RPC \"1.0\" is correct for Bitcoin-family btxd (NOT 2.0 as Ethereum-style uses).\n // See btxd src/rpc/server.cpp + httprpc.cpp. Do not \"fix\" to 2.0 — btxd will reject.\n const body = JSON.stringify({ jsonrpc: '1.0', id, method, params });\n\n const ctrl = new AbortController();\n const timeoutMs = this.opts.timeoutMs ?? 30_000;\n const timer = setTimeout(() => ctrl.abort(), timeoutMs);\n\n let res: Response;\n try {\n res = await fetch(this.opts.rpcUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: auth,\n },\n body,\n signal: ctrl.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n // AbortError on timeout vs everything else (DNS, TCP reset, TLS, etc.)\n if (err instanceof Error && err.name === 'AbortError') {\n throw new BtxTimeoutError(timeoutMs, method);\n }\n throw new BtxNetworkError(err, method);\n } finally {\n clearTimeout(timer);\n }\n\n if (!res.ok) {\n const rawBody = await res.text().catch(() => '');\n throw new BtxHttpError(res.status, redactSensitive(rawBody), method);\n }\n\n const rawBody = await res.text();\n let data: JsonRpcResponse<T>;\n try {\n data = JSON.parse(rawBody) as JsonRpcResponse<T>;\n } catch (err) {\n throw new BtxParseError(err, redactSensitive(rawBody), method);\n }\n\n if (data.error) {\n throw new BtxRpcError(data.error.code, data.error.message, method);\n }\n return data.result;\n }\n\n /** Issue a fresh challenge bound to (purpose, resource, subject). */\n async issue(params: IssueParams): Promise<Challenge> {\n // Per audit M3: do NOT hardcode btxd defaults. Truncate positional args at\n // the last explicitly-set value so btxd applies its own defaults for omitted ones.\n const ordered: Array<[string, unknown]> = [\n ['purpose', params.purpose],\n ['resource', params.resource],\n ['subject', params.subject],\n ['target_solve_time_s', params.target_solve_time_s],\n ['expires_in_s', params.expires_in_s],\n ['validation_overhead_s', params.validation_overhead_s],\n ['propagation_overhead_s', params.propagation_overhead_s],\n ['difficulty_policy', params.difficulty_policy],\n ['difficulty_window_blocks', params.difficulty_window_blocks],\n ['min_solve_time_s', params.min_solve_time_s],\n ['max_solve_time_s', params.max_solve_time_s],\n ['solver_parallelism', params.solver_parallelism],\n ['solver_duty_cycle_pct', params.solver_duty_cycle_pct],\n ];\n let lastSet = 2; // purpose, resource, subject are required\n for (let i = ordered.length - 1; i > 2; i--) {\n if (ordered[i]![1] !== undefined) {\n lastSet = i;\n break;\n }\n }\n const args = ordered.slice(0, lastSet + 1).map(([, v]) => v);\n return this.call<Challenge>('getmatmulservicechallenge', args);\n }\n\n /**\n * Verify a proof statelessly. Does NOT consume the challenge.\n * Use this for diagnostic / monitoring paths.\n * For admission control, use {@link redeem} instead — verification alone\n * does not prevent replay.\n */\n async verify(\n challenge: Challenge,\n nonce64_hex: string,\n digest_hex: string,\n lookup_local_status = true,\n ): Promise<VerifyResult> {\n return this.call<VerifyResult>('verifymatmulserviceproof', [\n challenge,\n nonce64_hex,\n digest_hex,\n lookup_local_status,\n ]);\n }\n\n /**\n * Verify-and-consume atomically. THIS is the admission control entry point.\n * On success, the challenge is marked redeemed and cannot be replayed.\n */\n async redeem(\n challenge: Challenge,\n nonce64_hex: string,\n digest_hex: string,\n ): Promise<VerifyResult> {\n return this.call<VerifyResult>('redeemmatmulserviceproof', [\n challenge,\n nonce64_hex,\n digest_hex,\n ]);\n }\n\n /** Batch verify. Spec range 1–256 (audit M2). No consumption. */\n async verifyBatch(entries: BatchEntry[]): Promise<BatchResult> {\n this.assertBatchSize(entries);\n return this.call<BatchResult>('verifymatmulserviceproofs', [entries]);\n }\n\n /** Batch verify + consume. Sequential per-entry. Spec range 1–256 (audit M2). */\n async redeemBatch(entries: BatchEntry[]): Promise<BatchResult> {\n this.assertBatchSize(entries);\n return this.call<BatchResult>('redeemmatmulserviceproofs', [entries]);\n }\n\n /**\n * Server-side local solver. Useful when generating fixtures or pre-computing\n * for tests. For production browser-side solving, ship the WASM solver —\n * RPC-based solving puts compute load on YOUR node, defeating the point.\n */\n async solve(challenge: Challenge): Promise<SolverOutput> {\n return this.call<SolverOutput>('solvematmulservicechallenge', [challenge]);\n }\n\n private assertBatchSize(entries: BatchEntry[]): void {\n if (entries.length < 1 || entries.length > 256) {\n throw new RangeError(\n `Batch size must be between 1 and 256 (per BTX RPC spec), got ${entries.length}`,\n );\n }\n }\n}\n","/**\n * Serialize a `PowState`-equivalent block header to the bytes that\n * `ComputeMatMulHeaderHash` then `DeriveSigma` (btxd) hash.\n *\n * Ported from `btxd v0.29.7 src/matmul/matmul_pow.cpp` lines 215-274.\n *\n * Wire format (150 bytes total, all integer fields little-endian):\n * - LE32 version\n * - 32 bytes previousblockhash (uint256 LE *storage* — i.e. reverse of display hex)\n * - 32 bytes merkleroot (uint256 LE storage)\n * - LE32 time\n * - LE32 bits\n * - LE64 nonce64\n * - LE16 matmul_dim\n * - 32 bytes seed_a (uint256 LE storage)\n * - 32 bytes seed_b (uint256 LE storage)\n *\n * Byte-order convention (this module + everything downstream):\n * - All hex strings are interpreted as **display/big-endian** (Bitcoin Core's\n * `uint256::ToString()` convention — first hex pair = most-significant byte).\n * - In-memory `Uint8Array` seeds/sigmas are kept in display/BE order too.\n * - This module reverses hex-parsed bytes back to LE storage for the header\n * serialization, and reverses the final SHA-256 output back to BE so the\n * sigma can flow into `fromOracle` (which expects BE) without further\n * transformation. Net effect: byte-for-byte equivalent to btxd's behavior.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport type { ChallengeHeaderContext } from '../types.js';\n\n/** Header fields the matmul header hash binds to. */\nexport interface MatMulHeaderInput {\n version: number;\n previousblockhash: string;\n merkleroot: string;\n time: number;\n /** Encoded as a hex string in btxd's header_context (e.g. `\"1d00ffff\"`). */\n bits: string;\n /** 64-bit nonce; pass as `bigint` to preserve full range. */\n nonce64: bigint;\n matmul_dim: number;\n seed_a: string;\n seed_b: string;\n}\n\n/**\n * Build a `MatMulHeaderInput` from a challenge envelope + the candidate nonce.\n * Reusing the existing `ChallengeHeaderContext` shape avoids a parallel struct.\n */\nexport function headerInputForNonce(\n ctx: ChallengeHeaderContext,\n nonce64: bigint,\n): MatMulHeaderInput {\n return {\n version: ctx.version,\n previousblockhash: ctx.previousblockhash,\n merkleroot: ctx.merkleroot,\n time: ctx.time,\n bits: ctx.bits,\n nonce64,\n matmul_dim: ctx.matmul_dim,\n seed_a: ctx.seed_a,\n seed_b: ctx.seed_b,\n };\n}\n\n/** Serialize the 150-byte header buffer that `ComputeMatMulHeaderHash` hashes. */\nexport function serializeMatMulHeader(input: MatMulHeaderInput): Uint8Array {\n const buf = new Uint8Array(4 + 32 + 32 + 4 + 4 + 8 + 2 + 32 + 32);\n let off = 0;\n\n writeUint32LE(buf, off, input.version >>> 0);\n off += 4;\n\n buf.set(parseUint256HexToLE(input.previousblockhash, 'previousblockhash'), off);\n off += 32;\n\n buf.set(parseUint256HexToLE(input.merkleroot, 'merkleroot'), off);\n off += 32;\n\n writeUint32LE(buf, off, input.time >>> 0);\n off += 4;\n\n writeUint32LE(buf, off, parseBitsHex(input.bits));\n off += 4;\n\n writeUint64LE(buf, off, input.nonce64);\n off += 8;\n\n writeUint16LE(buf, off, input.matmul_dim & 0xffff);\n off += 2;\n\n buf.set(parseUint256HexToLE(input.seed_a, 'seed_a'), off);\n off += 32;\n\n buf.set(parseUint256HexToLE(input.seed_b, 'seed_b'), off);\n off += 32;\n\n return buf;\n}\n\n/** Equivalent of btxd's `ComputeMatMulHeaderHash`. Returns 32 raw SHA-256 bytes. */\nexport function computeMatMulHeaderHash(input: MatMulHeaderInput): Uint8Array {\n return sha256(serializeMatMulHeader(input));\n}\n\n/**\n * Equivalent of btxd's `DeriveSigma`. Returns a 32-byte sigma in **display/BE\n * order** so it can flow directly into {@link fromOracle} and the transcript\n * compression vector.\n */\nexport function deriveSigma(input: MatMulHeaderInput): Uint8Array {\n const headerHash = computeMatMulHeaderHash(input);\n const sigmaRaw = sha256(headerHash);\n // sigmaRaw is \"LE storage\" per btxd's uint256 view; reverse to BE for\n // downstream consumers that operate on display-order seeds.\n const sigmaBE = new Uint8Array(32);\n for (let i = 0; i < 32; i++) sigmaBE[i] = sigmaRaw[31 - i]!;\n return sigmaBE;\n}\n\n// ----------------------------------------------------------------------------\n// internal helpers\n// ----------------------------------------------------------------------------\n\nfunction parseUint256HexToLE(hex: string, field: string): Uint8Array {\n const beBytes = parseHexFixed(hex, 32, field);\n // Reverse: BE display → LE storage.\n const leBytes = new Uint8Array(32);\n for (let i = 0; i < 32; i++) leBytes[i] = beBytes[31 - i]!;\n return leBytes;\n}\n\nfunction parseHexFixed(hex: string, byteLen: number, field: string): Uint8Array {\n const h = hex.startsWith('0x') || hex.startsWith('0X') ? hex.slice(2) : hex;\n if (h.length !== byteLen * 2) {\n throw new Error(\n `header.${field}: expected ${byteLen * 2} hex chars (${byteLen} bytes), got ${h.length}`,\n );\n }\n const out = new Uint8Array(byteLen);\n for (let i = 0; i < byteLen; i++) {\n const byte = parseInt(h.slice(i * 2, i * 2 + 2), 16);\n if (Number.isNaN(byte)) {\n throw new Error(`header.${field}: invalid hex at byte ${i}`);\n }\n out[i] = byte;\n }\n return out;\n}\n\nfunction parseBitsHex(bits: string): number {\n // btxd serializes bits as a 4-byte big-endian hex string (matching getblockheader).\n // Parse, then write LE in serializeMatMulHeader.\n const h = bits.startsWith('0x') || bits.startsWith('0X') ? bits.slice(2) : bits;\n if (h.length !== 8) {\n throw new Error(`header.bits: expected 8 hex chars, got ${h.length}`);\n }\n const n = parseInt(h, 16);\n if (Number.isNaN(n)) {\n throw new Error(`header.bits: invalid hex`);\n }\n return n >>> 0;\n}\n\nfunction writeUint16LE(buf: Uint8Array, offset: number, value: number): void {\n buf[offset] = value & 0xff;\n buf[offset + 1] = (value >>> 8) & 0xff;\n}\n\nfunction writeUint32LE(buf: Uint8Array, offset: number, value: number): void {\n buf[offset] = value & 0xff;\n buf[offset + 1] = (value >>> 8) & 0xff;\n buf[offset + 2] = (value >>> 16) & 0xff;\n buf[offset + 3] = (value >>> 24) & 0xff;\n}\n\nfunction writeUint64LE(buf: Uint8Array, offset: number, value: bigint): void {\n const lo = Number(value & 0xffffffffn);\n const hi = Number((value >> 32n) & 0xffffffffn);\n writeUint32LE(buf, offset, lo);\n writeUint32LE(buf, offset + 4, hi);\n}\n","/**\n * Magic numbers + domain tags from `btxd v0.29.7 src/matmul/`.\n *\n * Sourced from:\n * - `src/matmul/field.h` (M31 modulus)\n * - `src/matmul/noise.h` (4 noise domain tags)\n * - `src/matmul/transcript.h` (2 transcript tags)\n */\n\n/** M31 prime: 2^31 - 1. From `src/matmul/field.h`. */\nexport const M31_MODULUS = 0x7fffffff;\n\n/** Domain tag for noise matrix `E_L`. From `src/matmul/noise.h`. */\nexport const NOISE_TAG_EL = 'matmul_noise_EL_v1';\n/** Domain tag for noise matrix `E_R`. From `src/matmul/noise.h`. */\nexport const NOISE_TAG_ER = 'matmul_noise_ER_v1';\n/** Domain tag for noise matrix `F_L`. From `src/matmul/noise.h`. */\nexport const NOISE_TAG_FL = 'matmul_noise_FL_v1';\n/** Domain tag for noise matrix `F_R`. From `src/matmul/noise.h`. */\nexport const NOISE_TAG_FR = 'matmul_noise_FR_v1';\n\n/** Personalization for the per-block compression vector. From `src/matmul/transcript.h`. */\nexport const TRANSCRIPT_COMPRESS_TAG = 'matmul-compress-v1';\n/** Personalization for the product-committed final digest. From `src/matmul/transcript.h`. */\nexport const TRANSCRIPT_PRODUCT_DIGEST_TAG = 'matmul-product-digest-v3';\n","/**\n * M31 (Mersenne prime 2^31 - 1) modular arithmetic.\n *\n * Ported from `btxd v0.29.7 src/matmul/field.{h,cpp}`.\n *\n * Field elements are JS `number`s in the canonical range [0, M31_MODULUS).\n *\n * `mul` and the `dot` accumulator use `BigInt` because the worst-case\n * product (2^31 - 1)^2 ≈ 2^62 exceeds Number's 2^53 precision. Day 2.6\n * may swap in a Number-only split-multiplication path for perf.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport { M31_MODULUS } from './constants.js';\n\n/** Canonical field element type. Always in [0, M31_MODULUS). */\nexport type Element = number;\n\nconst MODULUS_BIG = BigInt(M31_MODULUS);\n\n/**\n * Mersenne fold for a non-negative `bigint` up to ~2^64. Matches btxd's\n * `reduce64` in `field.cpp` lines 23-34 (double fold + final canonical sub).\n */\nfunction reduce64(x: bigint): Element {\n let v = (x & MODULUS_BIG) + (x >> 31n);\n v = (v & MODULUS_BIG) + (v >> 31n);\n let result = Number(v);\n if (result >= M31_MODULUS) result -= M31_MODULUS;\n return result;\n}\n\n/** Modular addition. Matches `field::add` in `field.cpp` line 84. */\nexport function add(a: Element, b: Element): Element {\n const s = a + b;\n return s >= M31_MODULUS ? s - M31_MODULUS : s;\n}\n\n/** Modular subtraction. Matches `field::sub` in `field.cpp` line 93. */\nexport function sub(a: Element, b: Element): Element {\n return a >= b ? a - b : a + M31_MODULUS - b;\n}\n\n/** Modular multiplication. Matches `field::mul` in `field.cpp` line 102. */\nexport function mul(a: Element, b: Element): Element {\n return reduce64(BigInt(a) * BigInt(b));\n}\n\n/** Modular negation. Matches `field::neg` in `field.cpp` line 108. */\nexport function neg(a: Element): Element {\n return a === 0 ? 0 : M31_MODULUS - a;\n}\n\n/** Reduce a uint32 input to canonical form. Matches `field::from_uint32`. */\nexport function fromUint32(x: number): Element {\n return reduce64(BigInt(x >>> 0));\n}\n\n/**\n * Modular inverse via Fermat's little theorem: a^(p-2) mod p.\n * Matches `field::inv` in `field.cpp` line 121.\n */\nexport function inv(a: Element): Element {\n if (a === 0) throw new Error('field.inv: cannot invert 0');\n let exp = M31_MODULUS - 2;\n let result: Element = 1;\n let base = a;\n while (exp > 0) {\n if ((exp & 1) !== 0) result = mul(result, base);\n exp >>>= 1;\n if (exp > 0) base = mul(base, base);\n }\n return result;\n}\n\n/**\n * Hash-to-field oracle for deterministic challenge derivation.\n *\n * Matches `field::from_oracle` in `field.cpp` line 138:\n * - SHA-256(seed_bytes || LE32(index) [|| LE32(retry) if retry > 0])\n * - candidate = ReadLE32(hash[0..4]) & MODULUS\n * - accept if candidate < MODULUS; else retry (up to 256 retries)\n * - deterministic fallback otherwise (essentially unreachable, ~2^-7936)\n *\n * @param seed - 32-byte seed in btxd \"display/MSB-first\" order. The C++\n * reverses uint256's LE storage to MSB-first before hashing; standard hex\n * parsing of a uint256 hex string already yields MSB-first bytes, so the\n * caller can pass the hex-parsed bytes directly without reversing.\n */\nexport function fromOracle(seed: Uint8Array, index: number): Element {\n if (seed.length !== 32) {\n throw new Error(`field.fromOracle: seed must be 32 bytes, got ${seed.length}`);\n }\n const indexLe = new Uint8Array(4);\n writeUint32LE(indexLe, 0, index >>> 0);\n\n for (let retry = 0; retry < 256; retry++) {\n const hasher = sha256.create();\n hasher.update(seed);\n hasher.update(indexLe);\n if (retry > 0) {\n const retryLe = new Uint8Array(4);\n writeUint32LE(retryLe, 0, retry);\n hasher.update(retryLe);\n }\n const hash = hasher.digest();\n const candidate = readUint32LE(hash, 0) & M31_MODULUS;\n if (candidate < M31_MODULUS) return candidate;\n }\n\n // Deterministic fallback. Same construction as btxd `field.cpp` line 174.\n const fallback = sha256.create();\n fallback.update(seed);\n fallback.update(indexLe);\n fallback.update(new TextEncoder().encode('oracle-fallback'));\n const hash = fallback.digest();\n return readUint32LE(hash, 0) % M31_MODULUS;\n}\n\n/**\n * Inner-product over M31. Matches `field::ScalarDot` in `field.cpp` line 39\n * (the NEON kernel is a perf-equivalent rewrite of this canonical scalar path).\n *\n * Accumulates 4 products per Mersenne fold; uses BigInt for the 64-bit acc\n * because Number can't hold 4·(2^31-1)^2 ≈ 2^64.\n */\nexport function dot(a: Element[] | Uint32Array, b: Element[] | Uint32Array, len: number): Element {\n let acc = 0n;\n let pending = 0;\n for (let i = 0; i < len; i++) {\n acc += BigInt(a[i]!) * BigInt(b[i]!);\n if (++pending === 4) {\n acc = (acc & MODULUS_BIG) + (acc >> 31n);\n acc = (acc & MODULUS_BIG) + (acc >> 31n);\n pending = 0;\n }\n }\n return reduce64(acc);\n}\n\nfunction writeUint32LE(buf: Uint8Array, offset: number, value: number): void {\n buf[offset] = value & 0xff;\n buf[offset + 1] = (value >>> 8) & 0xff;\n buf[offset + 2] = (value >>> 16) & 0xff;\n buf[offset + 3] = (value >>> 24) & 0xff;\n}\n\nfunction readUint32LE(buf: Uint8Array, offset: number): number {\n return (\n (buf[offset]! |\n (buf[offset + 1]! << 8) |\n (buf[offset + 2]! << 16) |\n (buf[offset + 3]! << 24)) >>>\n 0\n );\n}\n","/**\n * Dense matrix over M31 with row-major layout.\n *\n * Lightweight equivalent of `btxd v0.29.7 src/matmul/matrix.{h,cpp}`. We expose\n * only the operations the solver needs: construction, element access, add,\n * and multiplication. Block views live in `transcript.ts`.\n */\n\nimport { add as fieldAdd, dot as fieldDot, fromOracle, type Element } from './field.js';\n\nexport interface Matrix {\n readonly rows: number;\n readonly cols: number;\n /** Row-major: data[row * cols + col]. Length = rows * cols. */\n readonly data: Uint32Array;\n}\n\n/** Construct a zero-initialized matrix. */\nexport function zeros(rows: number, cols: number): Matrix {\n return { rows, cols, data: new Uint32Array(rows * cols) };\n}\n\n/** Element accessor. */\nexport function get(m: Matrix, row: number, col: number): Element {\n return m.data[row * m.cols + col]!;\n}\n\n/** Element setter. */\nexport function set(m: Matrix, row: number, col: number, value: Element): void {\n m.data[row * m.cols + col] = value;\n}\n\n/**\n * Build a `rows × cols` matrix where entry (row, col) is\n * `field.fromOracle(seed, row * cols + col)`.\n *\n * Mirrors `FromSeedRect` in `btxd src/matmul/noise.cpp`.\n */\nexport function fromSeedRect(seed: Uint8Array, rows: number, cols: number): Matrix {\n const m = zeros(rows, cols);\n const total = rows * cols;\n for (let i = 0; i < total; i++) {\n m.data[i] = fromOracle(seed, i);\n }\n return m;\n}\n\n/**\n * Element-wise modular sum `out = a + b` in M31.\n * Throws if dimensions mismatch.\n */\nexport function matAdd(a: Matrix, b: Matrix): Matrix {\n if (a.rows !== b.rows || a.cols !== b.cols) {\n throw new Error(`matAdd: dim mismatch a=${a.rows}x${a.cols} b=${b.rows}x${b.cols}`);\n }\n const out = zeros(a.rows, a.cols);\n for (let i = 0; i < a.data.length; i++) {\n out.data[i] = fieldAdd(a.data[i]!, b.data[i]!);\n }\n return out;\n}\n\n/**\n * Canonical M31 matrix multiplication: `out = a · b`.\n *\n * `a` is rows_a × inner, `b` is inner × cols_b; `out` is rows_a × cols_b.\n * Uses `field.dot` per inner row × col pair, which folds Mersenne every\n * 4 accumulated products.\n */\nexport function matMul(a: Matrix, b: Matrix): Matrix {\n if (a.cols !== b.rows) {\n throw new Error(`matMul: inner-dim mismatch a.cols=${a.cols} b.rows=${b.rows}`);\n }\n const out = zeros(a.rows, b.cols);\n const rowBuf = new Uint32Array(a.cols);\n const colBuf = new Uint32Array(a.cols);\n for (let i = 0; i < a.rows; i++) {\n for (let k = 0; k < a.cols; k++) rowBuf[k] = a.data[i * a.cols + k]!;\n for (let j = 0; j < b.cols; j++) {\n for (let k = 0; k < a.cols; k++) colBuf[k] = b.data[k * b.cols + j]!;\n out.data[i * b.cols + j] = fieldDot(rowBuf, colBuf, a.cols);\n }\n }\n return out;\n}\n","/**\n * Deterministic noise pair generation: {E_L, E_R, F_L, F_R}.\n *\n * Each matrix is rank-r (n × r or r × n); used to perturb (A, B) into\n * (A', B') = (A + E_L·E_R, B + F_L·F_R) before the canonical matmul.\n *\n * Ported from `btxd v0.29.7 src/matmul/noise.{h,cpp}`.\n *\n * Byte-order convention (see header.ts for full discussion): sigma + noise\n * seeds are kept in **display/BE order** in-memory. The C++ reverses LE\n * storage to BE for hashing; we already store BE, so we hash directly.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport { NOISE_TAG_EL, NOISE_TAG_ER, NOISE_TAG_FL, NOISE_TAG_FR } from './constants.js';\nimport { fromSeedRect, type Matrix } from './matrix.js';\n\n/** The 4 noise factor matrices. Sized (n×r, r×n, n×r, r×n) respectively. */\nexport interface NoisePair {\n E_L: Matrix;\n E_R: Matrix;\n F_L: Matrix;\n F_R: Matrix;\n}\n\n/**\n * Per-tag seed derivation. Matches `btxd noise::DeriveNoiseSeed`:\n * seed = SHA-256(domain_tag || sigma_BE)\n *\n * Subtle byte-order point: btxd stores the noise seed via\n * `CanonicalBytesToUint256(digest)` — i.e. the uint256's LE storage is the\n * REVERSE of the raw SHA-256 output. Then `from_oracle` reverses that LE\n * storage again before hashing, so the bytes actually fed to the per-index\n * SHA-256 are the RAW digest. Our `fromOracle` hashes the seed directly\n * (no internal reverse), so we must return the raw digest here — no reverse.\n *\n * (Contrast with `deriveSigma`, which DOES reverse: btxd's sigma uint256 is\n * stored direct from the SHA-256 output, so `from_oracle`'s reverse lands on\n * REVERSE(raw). The reverse in our `deriveSigma` mirrors that asymmetry.)\n */\nexport function deriveNoiseSeed(domainTag: string, sigmaBE: Uint8Array): Uint8Array {\n if (sigmaBE.length !== 32) {\n throw new Error(`deriveNoiseSeed: sigma must be 32 bytes, got ${sigmaBE.length}`);\n }\n if (domainTag.length !== 18) {\n // C++ asserts this; all 4 noise tags are 18 chars.\n throw new Error(`deriveNoiseSeed: domain tag must be 18 chars, got ${domainTag.length}`);\n }\n const hasher = sha256.create();\n hasher.update(new TextEncoder().encode(domainTag));\n hasher.update(sigmaBE);\n return hasher.digest();\n}\n\n/**\n * Generate the 4 noise matrices. Mirrors `noise::Generate(sigma, n, r)`.\n *\n * Returned matrix sizes:\n * - E_L : n × r\n * - E_R : r × n\n * - F_L : n × r\n * - F_R : r × n\n *\n * Asymmetric on purpose — so `E_L · E_R` and `F_L · F_R` are n×n.\n */\nexport function generate(sigmaBE: Uint8Array, n: number, r: number): NoisePair {\n const seedEL = deriveNoiseSeed(NOISE_TAG_EL, sigmaBE);\n const seedER = deriveNoiseSeed(NOISE_TAG_ER, sigmaBE);\n const seedFL = deriveNoiseSeed(NOISE_TAG_FL, sigmaBE);\n const seedFR = deriveNoiseSeed(NOISE_TAG_FR, sigmaBE);\n return {\n E_L: fromSeedRect(seedEL, n, r),\n E_R: fromSeedRect(seedER, r, n),\n F_L: fromSeedRect(seedFL, n, r),\n F_R: fromSeedRect(seedFR, r, n),\n };\n}\n","/**\n * Transcript-binding block compression + canonical matmul + final digest.\n *\n * Ported from `btxd v0.29.7 src/matmul/transcript.{h,cpp}`.\n *\n * For Day 2.5 (the canonical Solve path) we only need:\n * - {@link deriveCompressionVector} — b·b M31 vector from sigma\n * - {@link compressBlock} — block · compression-vector inner product\n * - {@link TranscriptHasher} — accumulates LE32(compressed c-block) per\n * (i, j, ell) step, finalizes as SHA-256d\n * - {@link canonicalMatMul} — block-wise A' · B' with intermediate hashing\n *\n * The replay / product-committed / accelerated-solver helpers are verifier\n * optimizations; out of scope for Day 2.5 but easy to add in Day 2.6+ if\n * needed.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport { TRANSCRIPT_COMPRESS_TAG } from './constants.js';\nimport { add as fieldAdd, dot as fieldDot, fromOracle } from './field.js';\nimport { zeros, type Matrix } from './matrix.js';\n\n/**\n * Per-sigma compression seed. Mirrors `DeriveCompressionSeed` in transcript.cpp\n * (the anonymous-namespace helper).\n *\n * Like `deriveNoiseSeed`, btxd stores this via `CanonicalBytesToUint256` —\n * the LE storage is the reverse of the raw digest. `from_oracle` reverses\n * once more before hashing, so the bytes actually fed to the per-index\n * SHA-256 are the RAW digest. Our `fromOracle` hashes the seed directly,\n * so we return the raw digest with no extra reverse.\n */\nfunction deriveCompressionSeed(sigmaBE: Uint8Array): Uint8Array {\n const hasher = sha256.create();\n hasher.update(new TextEncoder().encode(TRANSCRIPT_COMPRESS_TAG));\n hasher.update(sigmaBE);\n return hasher.digest();\n}\n\n/**\n * Build the b·b-element M31 compression vector. Mirrors\n * `transcript::DeriveCompressionVector`.\n */\nexport function deriveCompressionVector(sigmaBE: Uint8Array, b: number): Uint32Array {\n if (b <= 0) throw new Error('block size b must be positive');\n const seed = deriveCompressionSeed(sigmaBE);\n const len = b * b;\n const vec = new Uint32Array(len);\n for (let k = 0; k < len; k++) vec[k] = fromOracle(seed, k);\n return vec;\n}\n\n/**\n * Compress a b·b block against the precomputed compression vector. Mirrors\n * `transcript::CompressBlock` — a plain M31 inner product, no per-row split.\n */\nexport function compressBlock(block: Uint32Array, v: Uint32Array): number {\n if (block.length !== v.length) {\n throw new Error(\n `compressBlock: dim mismatch block.length=${block.length} v.length=${v.length}`,\n );\n }\n return fieldDot(block, v, block.length);\n}\n\n/**\n * Accumulating SHA-256(-d) transcript hasher. Mirrors\n * `transcript::TranscriptHasher`.\n *\n * compress_vec = DeriveCompressionVector(sigma, b)\n * per (i,j,ell): add LE32(CompressBlock(c_block, compress_vec)) to inner\n * finalize(): inner = SHA256.digest(); return SHA256(inner) (i.e. SHA-256d)\n */\nexport class TranscriptHasher {\n private readonly hasher = sha256.create();\n private readonly compressVec: Uint32Array;\n private readonly b: number;\n private readonly le4 = new Uint8Array(4);\n\n constructor(sigmaBE: Uint8Array, b: number) {\n this.b = b;\n this.compressVec = deriveCompressionVector(sigmaBE, b);\n }\n\n /**\n * Append the LE32-encoded compressed `c_block` to the transcript.\n * Ignores `i`/`j`/`ell` for hashing (btxd's `(void)i;(void)j;(void)ell;`\n * proves they don't participate in the digest), but accepts them so the\n * call-site reads identically to the C++.\n */\n addIntermediate(_i: number, _j: number, _ell: number, cBlock: Uint32Array): void {\n if (cBlock.length !== this.b * this.b) {\n throw new Error(\n `addIntermediate: c_block must be ${this.b * this.b} elements, got ${cBlock.length}`,\n );\n }\n const compressed = compressBlock(cBlock, this.compressVec);\n this.le4[0] = compressed & 0xff;\n this.le4[1] = (compressed >>> 8) & 0xff;\n this.le4[2] = (compressed >>> 16) & 0xff;\n this.le4[3] = (compressed >>> 24) & 0xff;\n this.hasher.update(this.le4);\n }\n\n /** SHA-256d: inner = SHA256(transcript); return SHA256(inner). */\n finalize(): Uint8Array {\n const inner = this.hasher.digest();\n return sha256(inner);\n }\n}\n\nexport interface CanonicalMatMulResult {\n /** Product matrix C' = A' · B' over M31. */\n cPrime: Matrix;\n /** SHA-256d over the LE32-encoded compressed c-blocks (in i,j,ell order). */\n transcriptHash: Uint8Array;\n}\n\n/**\n * Canonical block-wise matmul with transcript binding. Mirrors\n * `transcript::CanonicalMatMul`.\n *\n * for i,j in [0,N)²:\n * for ell in [0,N):\n * a = A'.block(i,ell)\n * b = B'.block(ell,j)\n * c_acc += a·b\n * hasher.add(c_acc)\n *\n * Where N = n / b. Each block read/multiply/accumulate happens in a\n * pre-allocated b·b scratch buffer to avoid per-step allocation in the\n * hot path.\n */\nexport function canonicalMatMul(\n aPrime: Matrix,\n bPrime: Matrix,\n b: number,\n sigmaBE: Uint8Array,\n): CanonicalMatMulResult {\n if (aPrime.rows !== aPrime.cols || bPrime.rows !== bPrime.cols || aPrime.rows !== bPrime.rows) {\n throw new Error('canonicalMatMul requires square matrices of equal size');\n }\n if (b === 0 || aPrime.rows % b !== 0) {\n throw new Error('canonicalMatMul: invalid transcript block size');\n }\n\n const n = aPrime.rows;\n const N = n / b;\n const cPrime = zeros(n, n);\n const hasher = new TranscriptHasher(sigmaBE, b);\n\n const aBlock = new Uint32Array(b * b);\n const bBlock = new Uint32Array(b * b);\n const cBlock = new Uint32Array(b * b);\n\n for (let i = 0; i < N; i++) {\n for (let j = 0; j < N; j++) {\n cBlock.fill(0);\n for (let ell = 0; ell < N; ell++) {\n readBlock(aPrime, i, ell, b, aBlock);\n readBlock(bPrime, ell, j, b, bBlock);\n multiplyAndAccumulateBlock(aBlock, bBlock, cBlock, b);\n hasher.addIntermediate(i, j, ell, cBlock);\n }\n writeBlock(cPrime, i, j, b, cBlock);\n }\n }\n\n return { cPrime, transcriptHash: hasher.finalize() };\n}\n\n// ----------------------------------------------------------------------------\n// internal block kernels\n// ----------------------------------------------------------------------------\n\n/** Copy `m[bi*b..bi*b+b][bj*b..bj*b+b]` into the `b·b` `out` buffer. */\nfunction readBlock(m: Matrix, bi: number, bj: number, b: number, out: Uint32Array): void {\n const rowStart = bi * b;\n const colStart = bj * b;\n const stride = m.cols;\n for (let r = 0; r < b; r++) {\n const src = (rowStart + r) * stride + colStart;\n const dst = r * b;\n for (let c = 0; c < b; c++) {\n out[dst + c] = m.data[src + c]!;\n }\n }\n}\n\n/** Copy a b·b `block` buffer into `m[bi*b..bi*b+b][bj*b..bj*b+b]`. */\nfunction writeBlock(m: Matrix, bi: number, bj: number, b: number, block: Uint32Array): void {\n const rowStart = bi * b;\n const colStart = bj * b;\n const stride = m.cols;\n for (let r = 0; r < b; r++) {\n const dst = (rowStart + r) * stride + colStart;\n const src = r * b;\n for (let c = 0; c < b; c++) {\n m.data[dst + c] = block[src + c]!;\n }\n }\n}\n\n/**\n * `c += a · b` for square b·b blocks (all three buffers are length b·b).\n * Element-wise mod M31. Inner loop uses `field.dot` (Mersenne-fold every 4\n * products) to stay in the canonical scalar path.\n */\nfunction multiplyAndAccumulateBlock(\n a: Uint32Array,\n b_buf: Uint32Array,\n c: Uint32Array,\n b: number,\n): void {\n // c[i,j] += sum_k a[i,k] * b_buf[k,j]\n // Strategy: for each (i, j), pre-collect b_buf's column j into a temp,\n // then dot with a's row i. Reuses field.dot's batched reduction.\n const colBuf = new Uint32Array(b);\n for (let j = 0; j < b; j++) {\n for (let k = 0; k < b; k++) colBuf[k] = b_buf[k * b + j]!;\n for (let i = 0; i < b; i++) {\n const rowStart = i * b;\n // Compute dot(a[i,:], colBuf, b) and add to c[i,j].\n let acc = 0n;\n let pending = 0;\n for (let k = 0; k < b; k++) {\n acc += BigInt(a[rowStart + k]!) * BigInt(colBuf[k]!);\n if (++pending === 4) {\n acc = (acc & MOD_BIG) + (acc >> 31n);\n acc = (acc & MOD_BIG) + (acc >> 31n);\n pending = 0;\n }\n }\n // Final fold and add to c[i,j].\n acc = (acc & MOD_BIG) + (acc >> 31n);\n acc = (acc & MOD_BIG) + (acc >> 31n);\n let folded = Number(acc);\n if (folded >= MOD_NUM) folded -= MOD_NUM;\n c[rowStart + j] = fieldAdd(c[rowStart + j]!, folded);\n }\n }\n}\n\nconst MOD_NUM = 0x7fffffff;\nconst MOD_BIG = 0x7fffffffn;\n","/**\n * Top-level pure-JS solver for the BTX MatMul service-challenge PoW.\n *\n * Ported from `btxd v0.29.7 src/matmul/matmul_pow.cpp` lines 293-358 (`Solve`).\n *\n * A = FromSeed(seed_a, n)\n * B = FromSeed(seed_b, n)\n * for nonce in [start, start + maxTries):\n * sigma = DeriveSigma(state(nonce))\n * noise = noise::Generate(sigma, n, r)\n * E = noise.E_L · noise.E_R\n * F = noise.F_L · noise.F_R\n * A' = A + E\n * B' = B + F\n * result = transcript::CanonicalMatMul(A', B', b, sigma)\n * if uintLE(result.transcript_hash) <= uintBE(target): return success\n *\n * Comparison semantics: `transcript_hash` is the raw SHA-256d output, treated\n * as a 256-bit integer in **little-endian byte order** (btxd's `uint256` ↔\n * `arith_uint256` convention). `target` arrives as a BE hex string. Both are\n * converted to `bigint` for the `<=` test.\n */\n\nimport type { Challenge, SolverOutput } from '../types.js';\nimport { deriveSigma, headerInputForNonce } from './header.js';\nimport { fromSeedRect, matAdd, matMul } from './matrix.js';\nimport { generate as generateNoise } from './noise.js';\nimport { canonicalMatMul } from './transcript.js';\n\nconst MAX_U64 = (1n << 64n) - 1n;\n\n/** Options for {@link solveJs}. */\nexport interface SolveJsOptions {\n /** Max nonces to try before giving up. Default 1_000_000. */\n maxTries?: number;\n /** Override the starting nonce (default: challenge.header_context.nonce64_start). */\n nonceStart?: bigint;\n /** Optional callback fired every N attempts for progress reporting. */\n onAttempt?: (attemptIndex: number, nonce: bigint) => void;\n /** Frequency of `onAttempt` calls (default every 1 attempt). */\n attemptInterval?: number;\n}\n\n/**\n * Pure-JS solver for a BTX MatMul service challenge. Searches nonces starting\n * from `header_context.nonce64_start` (or `options.nonceStart`) until the\n * transcript-hash satisfies `digest_le256 <= target_be256` or `maxTries` is\n * exhausted.\n *\n * Returns `null` if no solution was found within the budget.\n *\n * @throws if the challenge envelope is malformed (wrong-shape matmul params,\n * non-square matrix dimensions, b doesn't divide n, etc.).\n */\nexport function solveJs(challenge: Challenge, options: SolveJsOptions = {}): SolverOutput | null {\n const payload = challenge.challenge;\n const ctx = payload.header_context;\n const { n, b, r } = payload.matmul;\n\n const maxTries = options.maxTries ?? 1_000_000;\n const nonceStart = options.nonceStart ?? BigInt(ctx.nonce64_start ?? 0);\n const attemptInterval = options.attemptInterval ?? 1;\n\n if (n <= 0 || b <= 0 || r <= 0) {\n throw new Error(`solveJs: invalid matmul params (n=${n}, b=${b}, r=${r})`);\n }\n if (n % b !== 0) {\n throw new Error(`solveJs: n=${n} not divisible by b=${b}`);\n }\n\n // Parse fixed inputs.\n const seedA = parseHex32(payload.matmul.seed_a, 'seed_a');\n const seedB = parseHex32(payload.matmul.seed_b, 'seed_b');\n const targetBE = parseHex32(payload.target, 'target');\n const targetValue = bytesBEToBigInt(targetBE);\n\n // A and B don't change per attempt.\n const A = fromSeedRect(seedA, n, n);\n const B = fromSeedRect(seedB, n, n);\n\n let nonce = nonceStart & MAX_U64;\n for (let attempt = 0; attempt < maxTries; attempt++) {\n if (options.onAttempt && attempt % attemptInterval === 0) {\n options.onAttempt(attempt, nonce);\n }\n\n const headerInput = headerInputForNonce(ctx, nonce);\n const sigmaBE = deriveSigma(headerInput);\n const noise = generateNoise(sigmaBE, n, r);\n\n const E = matMul(noise.E_L, noise.E_R);\n const F = matMul(noise.F_L, noise.F_R);\n const aPrime = matAdd(A, E);\n const bPrime = matAdd(B, F);\n\n const result = canonicalMatMul(aPrime, bPrime, b, sigmaBE);\n const digestValue = bytesLEToBigInt(result.transcriptHash);\n if (digestValue <= targetValue) {\n const nonce64_hex = nonce.toString(16).padStart(16, '0');\n const digest_hex = bytesLEToHexBE(result.transcriptHash);\n return {\n nonce64_hex,\n digest_hex,\n // Same shape btxd's solve RPC returns: {challenge, nonce64_hex, digest_hex}.\n // See `solvematmulservicechallenge` in btxd src/rpc/mining.cpp.\n proof: { challenge, nonce64_hex, digest_hex },\n };\n }\n\n if (nonce === MAX_U64) return null;\n nonce = (nonce + 1n) & MAX_U64;\n }\n\n return null;\n}\n\n// ----------------------------------------------------------------------------\n// hex / int conversion\n// ----------------------------------------------------------------------------\n\nfunction parseHex32(hex: string, field: string): Uint8Array {\n const h = hex.startsWith('0x') || hex.startsWith('0X') ? hex.slice(2) : hex;\n if (h.length !== 64) {\n throw new Error(`solveJs.${field}: expected 64 hex chars, got ${h.length}`);\n }\n const out = new Uint8Array(32);\n for (let i = 0; i < 32; i++) {\n const byte = parseInt(h.slice(i * 2, i * 2 + 2), 16);\n if (Number.isNaN(byte)) {\n throw new Error(`solveJs.${field}: invalid hex at byte ${i}`);\n }\n out[i] = byte;\n }\n return out;\n}\n\n/** Interpret 32 bytes as a 256-bit integer in big-endian byte order. */\nfunction bytesBEToBigInt(bytes: Uint8Array): bigint {\n let v = 0n;\n for (let i = 0; i < bytes.length; i++) {\n v = (v << 8n) | BigInt(bytes[i]!);\n }\n return v;\n}\n\n/** Interpret 32 bytes as a 256-bit integer in little-endian byte order. */\nfunction bytesLEToBigInt(bytes: Uint8Array): bigint {\n let v = 0n;\n for (let i = bytes.length - 1; i >= 0; i--) {\n v = (v << 8n) | BigInt(bytes[i]!);\n }\n return v;\n}\n\n/** Reverse LE-stored bytes and hex-encode as a BE/display string. */\nfunction bytesLEToHexBE(bytes: Uint8Array): string {\n const chars: string[] = [];\n for (let i = bytes.length - 1; i >= 0; i--) {\n chars.push(bytes[i]!.toString(16).padStart(2, '0'));\n }\n return chars.join('');\n}\n","import type { BtxChallengeClient } from './client.js';\nimport { solveJs, type SolveJsOptions } from './matmul/pow.js';\nimport type { Challenge, SolverOutput } from './types.js';\n\n/**\n * How a challenge should be solved.\n *\n * - `'rpc'` — delegate to btxd's `solvematmulservicechallenge`. Requires\n * `opts.rpcClient`. Server-side / Node-only.\n *\n * - `'pure-js'` — solve locally with a pure-TypeScript MatMul implementation.\n * Browser-compatible. Ports the canonical CPU path of btxd's matmul solver.\n * At default difficulty + n=512, pure-JS solving is slow (perf is currently\n * bounded by `BigInt`-based M31 multiplication; WASM/SIMD acceleration is\n * planned for a future iteration).\n *\n * - `'auto'` — pick automatically: `'rpc'` if `opts.rpcClient` is provided,\n * else `'pure-js'`.\n */\nexport type SolverMode = 'rpc' | 'pure-js' | 'auto';\n\n/** Options for {@link Solver.solve}. */\nexport interface SolverOptions {\n /** Solve strategy. Default: `'auto'` (rpc if client provided, else pure-js). */\n mode?: SolverMode;\n /** Required for `mode === 'rpc'`. Ignored for `'pure-js'`. */\n rpcClient?: BtxChallengeClient;\n /** Forwarded to the pure-JS solver. Ignored for `'rpc'`. */\n pureJs?: SolveJsOptions;\n}\n\n/**\n * Solve a BTX service challenge to produce a (nonce, digest, proof) tuple\n * that btxd will accept on redemption.\n *\n * **Modes**:\n * - `'rpc'`: delegate to btxd's `solvematmulservicechallenge` RPC. Pass an\n * authenticated `BtxChallengeClient` in `opts.rpcClient`. **Production\n * note**: the solve RPC shares the matmul backend with block-template\n * mining; consumers MUST point at a dedicated non-mining btxd, otherwise\n * individual solves can queue behind mining work for 10+ minutes.\n * - `'pure-js'`: solve locally with the ported TypeScript MatMul. Browser-\n * compatible. Slower than `'rpc'` but no node required.\n * - `'auto'`: prefers `'rpc'` if a client is provided, else `'pure-js'`.\n *\n * @example Server-side (Node, RPC mode)\n * ```typescript\n * import { BtxChallengeClient, Solver } from '@btx/challenges-sdk';\n *\n * const client = new BtxChallengeClient({\n * rpcUrl: 'http://127.0.0.1:19332',\n * rpcAuth: { user: 'rpcuser', pass: 'rpcpass' },\n * });\n *\n * const challenge = await client.issue({\n * purpose: 'ai_inference_gate',\n * resource: 'model:gpt-x|route:/v1/generate',\n * subject: 'tenant:abc123',\n * });\n *\n * const proof = await Solver.solve(challenge, { mode: 'rpc', rpcClient: client });\n * const result = await client.redeem(challenge, proof.nonce64_hex, proof.digest_hex);\n *\n * if (result.valid && result.reason === 'ok') {\n * // Admit the caller.\n * }\n * ```\n *\n * @example Browser-side (pure-JS mode)\n * ```typescript\n * import { Solver } from '@btx/challenges-sdk';\n *\n * // Solve a challenge with no server-side help. Slow at default difficulty;\n * // for production browser use cases, calibrate via `target_solve_time_s`.\n * const proof = await Solver.solve(challenge, {\n * mode: 'pure-js',\n * pureJs: { maxTries: 100_000 },\n * });\n * ```\n */\nexport class Solver {\n static async solve(challenge: Challenge, opts: SolverOptions = {}): Promise<SolverOutput> {\n const mode: SolverMode = opts.mode ?? (opts.rpcClient ? 'rpc' : 'pure-js');\n\n switch (mode) {\n case 'rpc':\n return solveViaRpc(challenge, opts);\n case 'pure-js':\n return solveViaPureJs(challenge, opts);\n case 'auto':\n if (opts.rpcClient) return solveViaRpc(challenge, opts);\n return solveViaPureJs(challenge, opts);\n default: {\n // Exhaustiveness guard — unreachable if SolverMode is the source of truth.\n const _exhaustive: never = mode;\n throw new Error(`Solver.solve: unknown mode \"${_exhaustive as string}\"`);\n }\n }\n }\n}\n\nasync function solveViaRpc(challenge: Challenge, opts: SolverOptions): Promise<SolverOutput> {\n if (!opts.rpcClient) {\n throw new Error(\n 'Solver.solve: mode=\"rpc\" requires opts.rpcClient. ' +\n 'Construct a BtxChallengeClient and pass it via opts.rpcClient.',\n );\n }\n return opts.rpcClient.solve(challenge);\n}\n\nasync function solveViaPureJs(challenge: Challenge, opts: SolverOptions): Promise<SolverOutput> {\n const result = solveJs(challenge, opts.pureJs);\n if (result === null) {\n const tries = opts.pureJs?.maxTries ?? 1_000_000;\n throw new Error(\n `Solver.solve: pure-JS solver exhausted maxTries=${tries} without finding a proof. ` +\n 'Increase maxTries or lower challenge difficulty (target_solve_time_s).',\n );\n }\n return result;\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -384,9 +384,7 @@ function fromSeedRect(seed, rows, cols) {
|
|
|
384
384
|
}
|
|
385
385
|
function matAdd(a, b) {
|
|
386
386
|
if (a.rows !== b.rows || a.cols !== b.cols) {
|
|
387
|
-
throw new Error(
|
|
388
|
-
`matAdd: dim mismatch a=${a.rows}x${a.cols} b=${b.rows}x${b.cols}`
|
|
389
|
-
);
|
|
387
|
+
throw new Error(`matAdd: dim mismatch a=${a.rows}x${a.cols} b=${b.rows}x${b.cols}`);
|
|
390
388
|
}
|
|
391
389
|
const out = zeros(a.rows, a.cols);
|
|
392
390
|
for (let i = 0; i < a.data.length; i++) {
|
|
@@ -396,9 +394,7 @@ function matAdd(a, b) {
|
|
|
396
394
|
}
|
|
397
395
|
function matMul(a, b) {
|
|
398
396
|
if (a.cols !== b.rows) {
|
|
399
|
-
throw new Error(
|
|
400
|
-
`matMul: inner-dim mismatch a.cols=${a.cols} b.rows=${b.rows}`
|
|
401
|
-
);
|
|
397
|
+
throw new Error(`matMul: inner-dim mismatch a.cols=${a.cols} b.rows=${b.rows}`);
|
|
402
398
|
}
|
|
403
399
|
const out = zeros(a.rows, b.cols);
|
|
404
400
|
const rowBuf = new Uint32Array(a.cols);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/client.ts","../src/matmul/header.ts","../src/matmul/constants.ts","../src/matmul/field.ts","../src/matmul/matrix.ts","../src/matmul/noise.ts","../src/matmul/transcript.ts","../src/matmul/pow.ts","../src/solver.ts"],"names":["rawBody","writeUint32LE","sha256","hash"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Type definitions mirroring the BTX service-challenges RPC schema.\n *\n * Source: btx.dev/docs/rpc/service-challenges (verified 2026-05-20).\n * Schema captured against live btxd v0.29.7 at btx-iowa (block 106270).\n *\n * IMPORTANT: We do NOT camelCase rename — the RPC schema is the wire contract.\n * Field names mirror btxd output verbatim.\n */\n\n/** Difficulty calibration policy for issued challenges. */\nexport type DifficultyPolicy = 'fixed' | 'adaptive_window';\n\n/**\n * Standard purpose labels recognized by the chain. Free-form strings allowed too.\n *\n * The `(string & {})` trick keeps autocomplete on the known labels while still\n * accepting arbitrary purpose strings. Don't \"simplify\" to plain `string` — it\n * loses the autocompletion benefit. See: https://github.com/microsoft/TypeScript/issues/29729\n */\nexport type ChallengePurpose =\n | 'rate_limit'\n | 'api_gate'\n | 'ai_inference_gate'\n | (string & {});\n\n/** Parameters for issuing a challenge via getmatmulservicechallenge. */\nexport interface IssueParams {\n purpose: ChallengePurpose;\n resource: string;\n subject: string;\n /** Calibrates client compute work to roughly this many seconds. btxd default: 1.0. */\n target_solve_time_s?: number;\n /** Challenge lifetime in seconds. btxd default: 300. Range 1–86400. */\n expires_in_s?: number;\n validation_overhead_s?: number;\n propagation_overhead_s?: number;\n /** btxd default: \"fixed\". */\n difficulty_policy?: DifficultyPolicy;\n difficulty_window_blocks?: number;\n min_solve_time_s?: number;\n max_solve_time_s?: number;\n solver_parallelism?: number;\n solver_duty_cycle_pct?: number;\n}\n\n/**\n * Binding identifies the (purpose, resource, subject) trio the challenge is\n * scoped to. btxd also embeds hashes + anchor info for replay protection.\n */\nexport interface ChallengeBinding {\n chain: string;\n purpose: string;\n resource: string;\n subject: string;\n resource_hash: string;\n subject_hash: string;\n salt: string;\n anchor_height: number;\n anchor_hash: string;\n /** Hashing rule used to compute challenge_id. Treat as opaque docstring from btxd. */\n challenge_id_rule?: string;\n seed_derivation_rule?: string;\n /** Open extension — btxd may add fields without breaking us. */\n [k: string]: unknown;\n}\n\n/**\n * Proof policy describes what btxd will check when redeeming. Treat fields\n * as authoritative — do NOT re-derive verification rules client-side.\n */\nexport interface ChallengeProofPolicy {\n verification_rule: string;\n sigma_gate_applied: boolean;\n expiration_enforced: boolean;\n challenge_id_required: boolean;\n replay_protection: string;\n redeem_rpc: string;\n solve_rpc: string;\n locally_issued_required: boolean;\n issued_challenge_store?: string;\n issued_challenge_scope?: string;\n [k: string]: unknown;\n}\n\n/** MatMul parameters needed to solve. Day 2 solver consumes these. */\nexport interface ChallengeMatmul {\n /** Matrix dimension. btxd ships n=512 in production. */\n n: number;\n /** Block dimension for compression. */\n b: number;\n /** Noise rank. */\n r: number;\n /** Field modulus (Mersenne prime 2^31-1). */\n q: number;\n min_dimension: number;\n max_dimension: number;\n /** Hex-encoded seed for matrix A. */\n seed_a: string;\n /** Hex-encoded seed for matrix B. */\n seed_b: string;\n}\n\n/** Block header context the challenge is anchored to. */\nexport interface ChallengeHeaderContext {\n version: number;\n previousblockhash: string;\n merkleroot: string;\n time: number;\n bits: string;\n nonce64_start: number;\n matmul_dim: number;\n seed_a: string;\n seed_b: string;\n}\n\n/**\n * Inner challenge payload — what the solver actually needs.\n * The Day 2 MatMul solver reads `matmul`, `target`, `noncerange`, and `header_context`.\n */\nexport interface ChallengePayload {\n chain: string;\n algorithm: string;\n height: number;\n previousblockhash: string;\n mintime: number;\n bits: string;\n difficulty: number;\n /** Hex-encoded target. Digest must compare ≤ target for valid proof. */\n target: string;\n noncerange: string;\n header_context: ChallengeHeaderContext;\n matmul: ChallengeMatmul;\n /** btxd ships additional fields (work_profile, runtime_observability, etc.) we treat as opaque. */\n [k: string]: unknown;\n}\n\n/**\n * The challenge envelope returned by getmatmulservicechallenge.\n * Opaque to the SDK at the wire boundary — pass through to solver / redeem.\n */\nexport interface Challenge {\n /** btxd schema kind discriminator (e.g. \"matmul_service_challenge_v1\"). */\n kind?: string;\n challenge_id: string;\n issued_at: number;\n expires_at: number;\n expires_in_s: number;\n binding: ChallengeBinding;\n proof_policy: ChallengeProofPolicy;\n challenge: ChallengePayload;\n /** Open extension. */\n [k: string]: unknown;\n}\n\n/** Reasons returned by verify/redeem. Open string — btxd may add more. */\nexport type VerifyReason =\n | 'ok'\n | 'invalid_proof'\n | 'challenge_mismatch'\n | 'expired'\n | 'unknown_challenge'\n | 'already_redeemed'\n | 'missing_proof'\n | (string & {});\n\n/** Outcome of verifymatmulserviceproof / redeemmatmulserviceproof. */\nexport interface VerifyResult {\n valid: boolean;\n expired?: boolean;\n reason: VerifyReason;\n issued_by_local_node?: boolean;\n redeemed?: boolean;\n redeemable?: boolean;\n mismatch_field?: string;\n}\n\n/** Single entry in a batch redeem/verify call. */\nexport interface BatchEntry {\n challenge: Challenge;\n nonce64_hex: string;\n digest_hex: string;\n}\n\n/** Batch response — sequential per-proof results. */\nexport interface BatchResult {\n count: number;\n valid: number;\n invalid: number;\n by_reason: Record<string, number>;\n results: VerifyResult[];\n}\n\n/** Solver output (also returned by solvematmulservicechallenge RPC). */\nexport interface SolverOutput {\n nonce64_hex: string;\n digest_hex: string;\n proof: Record<string, unknown>;\n}\n\n/** RPC client configuration. */\nexport interface BtxClientOpts {\n /**\n * Full JSON-RPC endpoint, e.g. `http://127.0.0.1:19332`.\n *\n * **Security**: use HTTPS (or a localhost-only deployment) when the RPC\n * endpoint is not on `127.0.0.1`. Basic auth over plaintext exposes credentials.\n * Terminate TLS at stunnel/nginx/Caddy in front of btxd; do NOT expose\n * btxd's RPC port directly to the public internet.\n */\n rpcUrl: string;\n /** Basic-auth credentials matching btxd's rpcauth / rpcuser+rpcpassword. */\n rpcAuth: {\n user: string;\n pass: string;\n };\n /** Request timeout in ms (default 30000). */\n timeoutMs?: number;\n}\n\n// ============================================================================\n// Error taxonomy\n// ============================================================================\n\n/** Base class — all SDK errors extend this for `instanceof BtxError` checks. */\nexport class BtxError extends Error {\n constructor(\n message: string,\n public readonly method?: string,\n ) {\n super(message);\n this.name = 'BtxError';\n }\n}\n\n/** btxd returned a JSON-RPC error envelope with code + message. */\nexport class BtxRpcError extends BtxError {\n constructor(\n public readonly code: number,\n message: string,\n method?: string,\n ) {\n super(message, method);\n this.name = 'BtxRpcError';\n }\n}\n\n/** btxd returned a non-2xx HTTP status. */\nexport class BtxHttpError extends BtxError {\n constructor(\n public readonly status: number,\n /** Response body, with `Authorization: Basic ...` patterns redacted. */\n public readonly body: string,\n method?: string,\n ) {\n super(`HTTP ${status}: ${body.slice(0, 200)}`, method);\n this.name = 'BtxHttpError';\n }\n}\n\n/** The HTTP response was 2xx but the body wasn't valid JSON. */\nexport class BtxParseError extends BtxError {\n constructor(\n /** Underlying SyntaxError or similar. Overrides the ES2022 `Error.cause` slot. */\n public override readonly cause: unknown,\n /** Raw response body (redacted). */\n public readonly body: string,\n method?: string,\n ) {\n const causeMsg = cause instanceof Error ? cause.message : String(cause);\n super(`Failed to parse RPC response: ${causeMsg}`, method);\n this.name = 'BtxParseError';\n }\n}\n\n/** Request exceeded `timeoutMs`. */\nexport class BtxTimeoutError extends BtxError {\n constructor(\n public readonly timeoutMs: number,\n method?: string,\n ) {\n super(`RPC request timed out after ${timeoutMs}ms`, method);\n this.name = 'BtxTimeoutError';\n }\n}\n\n/** Transport-level failure (DNS, TCP reset, TLS, etc.). Wraps the underlying cause. */\nexport class BtxNetworkError extends BtxError {\n constructor(\n /** Underlying error from fetch / dns / tls. Overrides the ES2022 `Error.cause` slot. */\n public override readonly cause: unknown,\n method?: string,\n ) {\n const causeMsg = cause instanceof Error ? cause.message : String(cause);\n super(`RPC network error: ${causeMsg}`, method);\n this.name = 'BtxNetworkError';\n }\n}\n","import {\n BtxHttpError,\n BtxNetworkError,\n BtxParseError,\n BtxRpcError,\n BtxTimeoutError,\n type BatchEntry,\n type BatchResult,\n type BtxClientOpts,\n type Challenge,\n type IssueParams,\n type SolverOutput,\n type VerifyResult,\n} from './types.js';\n\ninterface JsonRpcResponse<T> {\n result: T;\n error: { code: number; message: string } | null;\n id: number | string;\n}\n\n/**\n * Universal UTF-8-safe base64 encoder.\n * Both Node 18.17+ and browsers expose `globalThis.crypto`, but `btoa()`\n * throws on any code point > 0xFF — so we route via TextEncoder for non-ASCII safety.\n * Per audit finding C1.\n */\nfunction base64Utf8(input: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(input, 'utf8').toString('base64');\n }\n // Browser fallback: encode UTF-8 manually so btoa() only sees byte-clean Latin1.\n const bytes = new TextEncoder().encode(input);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i] as number);\n }\n return btoa(binary);\n}\n\n/**\n * Redact sensitive header + credential patterns from error response bodies\n * before storing them on `BtxHttpError.body` (which callers commonly log).\n *\n * Covers:\n * - Authorization header echoes from proxies / debug endpoints (H2)\n * - JSON `\"password\"` / `\"rpcpassword\"` fields\n * - Config-line `rpcuser=...` / `rpcpassword=...` from btxd's loadincludeconf\n * error paths (re-audit N2 — added 2026-05-20)\n */\nfunction redactSensitive(body: string): string {\n return body\n .replace(/authorization\\s*:\\s*basic\\s+[A-Za-z0-9+/=]+/gi, 'authorization: basic [REDACTED]')\n .replace(/\"password\"\\s*:\\s*\"[^\"]*\"/gi, '\"password\":\"[REDACTED]\"')\n .replace(/\"rpcpassword\"\\s*:\\s*\"[^\"]*\"/gi, '\"rpcpassword\":\"[REDACTED]\"')\n .replace(/\\b(rpc(?:user|password|auth))\\s*=\\s*\\S+/gi, '$1=[REDACTED]');\n}\n\n/** Generate a stable-uniqueness request id without colliding across instances. */\nfunction nextRequestId(): string {\n // Both Node 18.17+ and modern browsers expose globalThis.crypto.randomUUID.\n const c = globalThis.crypto;\n if (c && typeof c.randomUUID === 'function') return c.randomUUID();\n // Last-resort fallback. Not cryptographically strong but uniqueness is the only\n // need here — btxd echoes the id back, doesn't use it for auth.\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * JSON-RPC client for BTX service-challenges.\n *\n * Wraps the 5 core RPCs:\n * - getmatmulservicechallenge (issue)\n * - verifymatmulserviceproof (verify, stateless)\n * - redeemmatmulserviceproof (verify + consume, anti-replay)\n * - verifymatmulserviceproofs (batch verify)\n * - redeemmatmulserviceproofs (batch redeem)\n *\n * Plus helper RPCs:\n * - solvematmulservicechallenge (server-side solver — for fixtures + tests)\n *\n * RPC reference: https://btx.dev/docs/rpc/service-challenges\n *\n * Error model:\n * - {@link BtxRpcError} — btxd returned a JSON-RPC error envelope\n * - {@link BtxHttpError} — non-2xx HTTP status\n * - {@link BtxParseError} — 2xx but body wasn't valid JSON\n * - {@link BtxTimeoutError} — request exceeded `timeoutMs`\n * - {@link BtxNetworkError} — DNS / TCP / TLS-level failure\n * - All extend {@link BtxError}.\n */\nexport class BtxChallengeClient {\n constructor(private readonly opts: BtxClientOpts) {}\n\n /** Low-level: raw JSON-RPC call. Exposed for forward compatibility. */\n async call<T = unknown>(method: string, params: unknown[] = []): Promise<T> {\n const id = nextRequestId();\n const auth = 'Basic ' + base64Utf8(`${this.opts.rpcAuth.user}:${this.opts.rpcAuth.pass}`);\n // JSON-RPC \"1.0\" is correct for Bitcoin-family btxd (NOT 2.0 as Ethereum-style uses).\n // See btxd src/rpc/server.cpp + httprpc.cpp. Do not \"fix\" to 2.0 — btxd will reject.\n const body = JSON.stringify({ jsonrpc: '1.0', id, method, params });\n\n const ctrl = new AbortController();\n const timeoutMs = this.opts.timeoutMs ?? 30_000;\n const timer = setTimeout(() => ctrl.abort(), timeoutMs);\n\n let res: Response;\n try {\n res = await fetch(this.opts.rpcUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: auth,\n },\n body,\n signal: ctrl.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n // AbortError on timeout vs everything else (DNS, TCP reset, TLS, etc.)\n if (err instanceof Error && err.name === 'AbortError') {\n throw new BtxTimeoutError(timeoutMs, method);\n }\n throw new BtxNetworkError(err, method);\n } finally {\n clearTimeout(timer);\n }\n\n if (!res.ok) {\n const rawBody = await res.text().catch(() => '');\n throw new BtxHttpError(res.status, redactSensitive(rawBody), method);\n }\n\n const rawBody = await res.text();\n let data: JsonRpcResponse<T>;\n try {\n data = JSON.parse(rawBody) as JsonRpcResponse<T>;\n } catch (err) {\n throw new BtxParseError(err, redactSensitive(rawBody), method);\n }\n\n if (data.error) {\n throw new BtxRpcError(data.error.code, data.error.message, method);\n }\n return data.result;\n }\n\n /** Issue a fresh challenge bound to (purpose, resource, subject). */\n async issue(params: IssueParams): Promise<Challenge> {\n // Per audit M3: do NOT hardcode btxd defaults. Truncate positional args at\n // the last explicitly-set value so btxd applies its own defaults for omitted ones.\n const ordered: Array<[string, unknown]> = [\n ['purpose', params.purpose],\n ['resource', params.resource],\n ['subject', params.subject],\n ['target_solve_time_s', params.target_solve_time_s],\n ['expires_in_s', params.expires_in_s],\n ['validation_overhead_s', params.validation_overhead_s],\n ['propagation_overhead_s', params.propagation_overhead_s],\n ['difficulty_policy', params.difficulty_policy],\n ['difficulty_window_blocks', params.difficulty_window_blocks],\n ['min_solve_time_s', params.min_solve_time_s],\n ['max_solve_time_s', params.max_solve_time_s],\n ['solver_parallelism', params.solver_parallelism],\n ['solver_duty_cycle_pct', params.solver_duty_cycle_pct],\n ];\n let lastSet = 2; // purpose, resource, subject are required\n for (let i = ordered.length - 1; i > 2; i--) {\n if (ordered[i]![1] !== undefined) {\n lastSet = i;\n break;\n }\n }\n const args = ordered.slice(0, lastSet + 1).map(([, v]) => v);\n return this.call<Challenge>('getmatmulservicechallenge', args);\n }\n\n /**\n * Verify a proof statelessly. Does NOT consume the challenge.\n * Use this for diagnostic / monitoring paths.\n * For admission control, use {@link redeem} instead — verification alone\n * does not prevent replay.\n */\n async verify(\n challenge: Challenge,\n nonce64_hex: string,\n digest_hex: string,\n lookup_local_status = true,\n ): Promise<VerifyResult> {\n return this.call<VerifyResult>('verifymatmulserviceproof', [\n challenge,\n nonce64_hex,\n digest_hex,\n lookup_local_status,\n ]);\n }\n\n /**\n * Verify-and-consume atomically. THIS is the admission control entry point.\n * On success, the challenge is marked redeemed and cannot be replayed.\n */\n async redeem(\n challenge: Challenge,\n nonce64_hex: string,\n digest_hex: string,\n ): Promise<VerifyResult> {\n return this.call<VerifyResult>('redeemmatmulserviceproof', [\n challenge,\n nonce64_hex,\n digest_hex,\n ]);\n }\n\n /** Batch verify. Spec range 1–256 (audit M2). No consumption. */\n async verifyBatch(entries: BatchEntry[]): Promise<BatchResult> {\n this.assertBatchSize(entries);\n return this.call<BatchResult>('verifymatmulserviceproofs', [entries]);\n }\n\n /** Batch verify + consume. Sequential per-entry. Spec range 1–256 (audit M2). */\n async redeemBatch(entries: BatchEntry[]): Promise<BatchResult> {\n this.assertBatchSize(entries);\n return this.call<BatchResult>('redeemmatmulserviceproofs', [entries]);\n }\n\n /**\n * Server-side local solver. Useful when generating fixtures or pre-computing\n * for tests. For production browser-side solving, ship the WASM solver —\n * RPC-based solving puts compute load on YOUR node, defeating the point.\n */\n async solve(challenge: Challenge): Promise<SolverOutput> {\n return this.call<SolverOutput>('solvematmulservicechallenge', [challenge]);\n }\n\n private assertBatchSize(entries: BatchEntry[]): void {\n if (entries.length < 1 || entries.length > 256) {\n throw new RangeError(\n `Batch size must be between 1 and 256 (per BTX RPC spec), got ${entries.length}`,\n );\n }\n }\n}\n","/**\n * Serialize a `PowState`-equivalent block header to the bytes that\n * `ComputeMatMulHeaderHash` then `DeriveSigma` (btxd) hash.\n *\n * Ported from `btxd v0.29.7 src/matmul/matmul_pow.cpp` lines 215-274.\n *\n * Wire format (150 bytes total, all integer fields little-endian):\n * - LE32 version\n * - 32 bytes previousblockhash (uint256 LE *storage* — i.e. reverse of display hex)\n * - 32 bytes merkleroot (uint256 LE storage)\n * - LE32 time\n * - LE32 bits\n * - LE64 nonce64\n * - LE16 matmul_dim\n * - 32 bytes seed_a (uint256 LE storage)\n * - 32 bytes seed_b (uint256 LE storage)\n *\n * Byte-order convention (this module + everything downstream):\n * - All hex strings are interpreted as **display/big-endian** (Bitcoin Core's\n * `uint256::ToString()` convention — first hex pair = most-significant byte).\n * - In-memory `Uint8Array` seeds/sigmas are kept in display/BE order too.\n * - This module reverses hex-parsed bytes back to LE storage for the header\n * serialization, and reverses the final SHA-256 output back to BE so the\n * sigma can flow into `fromOracle` (which expects BE) without further\n * transformation. Net effect: byte-for-byte equivalent to btxd's behavior.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport type { ChallengeHeaderContext } from '../types.js';\n\n/** Header fields the matmul header hash binds to. */\nexport interface MatMulHeaderInput {\n version: number;\n previousblockhash: string;\n merkleroot: string;\n time: number;\n /** Encoded as a hex string in btxd's header_context (e.g. `\"1d00ffff\"`). */\n bits: string;\n /** 64-bit nonce; pass as `bigint` to preserve full range. */\n nonce64: bigint;\n matmul_dim: number;\n seed_a: string;\n seed_b: string;\n}\n\n/**\n * Build a `MatMulHeaderInput` from a challenge envelope + the candidate nonce.\n * Reusing the existing `ChallengeHeaderContext` shape avoids a parallel struct.\n */\nexport function headerInputForNonce(\n ctx: ChallengeHeaderContext,\n nonce64: bigint,\n): MatMulHeaderInput {\n return {\n version: ctx.version,\n previousblockhash: ctx.previousblockhash,\n merkleroot: ctx.merkleroot,\n time: ctx.time,\n bits: ctx.bits,\n nonce64,\n matmul_dim: ctx.matmul_dim,\n seed_a: ctx.seed_a,\n seed_b: ctx.seed_b,\n };\n}\n\n/** Serialize the 150-byte header buffer that `ComputeMatMulHeaderHash` hashes. */\nexport function serializeMatMulHeader(input: MatMulHeaderInput): Uint8Array {\n const buf = new Uint8Array(4 + 32 + 32 + 4 + 4 + 8 + 2 + 32 + 32);\n let off = 0;\n\n writeUint32LE(buf, off, input.version >>> 0);\n off += 4;\n\n buf.set(parseUint256HexToLE(input.previousblockhash, 'previousblockhash'), off);\n off += 32;\n\n buf.set(parseUint256HexToLE(input.merkleroot, 'merkleroot'), off);\n off += 32;\n\n writeUint32LE(buf, off, input.time >>> 0);\n off += 4;\n\n writeUint32LE(buf, off, parseBitsHex(input.bits));\n off += 4;\n\n writeUint64LE(buf, off, input.nonce64);\n off += 8;\n\n writeUint16LE(buf, off, input.matmul_dim & 0xffff);\n off += 2;\n\n buf.set(parseUint256HexToLE(input.seed_a, 'seed_a'), off);\n off += 32;\n\n buf.set(parseUint256HexToLE(input.seed_b, 'seed_b'), off);\n off += 32;\n\n return buf;\n}\n\n/** Equivalent of btxd's `ComputeMatMulHeaderHash`. Returns 32 raw SHA-256 bytes. */\nexport function computeMatMulHeaderHash(input: MatMulHeaderInput): Uint8Array {\n return sha256(serializeMatMulHeader(input));\n}\n\n/**\n * Equivalent of btxd's `DeriveSigma`. Returns a 32-byte sigma in **display/BE\n * order** so it can flow directly into {@link fromOracle} and the transcript\n * compression vector.\n */\nexport function deriveSigma(input: MatMulHeaderInput): Uint8Array {\n const headerHash = computeMatMulHeaderHash(input);\n const sigmaRaw = sha256(headerHash);\n // sigmaRaw is \"LE storage\" per btxd's uint256 view; reverse to BE for\n // downstream consumers that operate on display-order seeds.\n const sigmaBE = new Uint8Array(32);\n for (let i = 0; i < 32; i++) sigmaBE[i] = sigmaRaw[31 - i]!;\n return sigmaBE;\n}\n\n// ----------------------------------------------------------------------------\n// internal helpers\n// ----------------------------------------------------------------------------\n\nfunction parseUint256HexToLE(hex: string, field: string): Uint8Array {\n const beBytes = parseHexFixed(hex, 32, field);\n // Reverse: BE display → LE storage.\n const leBytes = new Uint8Array(32);\n for (let i = 0; i < 32; i++) leBytes[i] = beBytes[31 - i]!;\n return leBytes;\n}\n\nfunction parseHexFixed(hex: string, byteLen: number, field: string): Uint8Array {\n const h = hex.startsWith('0x') || hex.startsWith('0X') ? hex.slice(2) : hex;\n if (h.length !== byteLen * 2) {\n throw new Error(\n `header.${field}: expected ${byteLen * 2} hex chars (${byteLen} bytes), got ${h.length}`,\n );\n }\n const out = new Uint8Array(byteLen);\n for (let i = 0; i < byteLen; i++) {\n const byte = parseInt(h.slice(i * 2, i * 2 + 2), 16);\n if (Number.isNaN(byte)) {\n throw new Error(`header.${field}: invalid hex at byte ${i}`);\n }\n out[i] = byte;\n }\n return out;\n}\n\nfunction parseBitsHex(bits: string): number {\n // btxd serializes bits as a 4-byte big-endian hex string (matching getblockheader).\n // Parse, then write LE in serializeMatMulHeader.\n const h = bits.startsWith('0x') || bits.startsWith('0X') ? bits.slice(2) : bits;\n if (h.length !== 8) {\n throw new Error(`header.bits: expected 8 hex chars, got ${h.length}`);\n }\n const n = parseInt(h, 16);\n if (Number.isNaN(n)) {\n throw new Error(`header.bits: invalid hex`);\n }\n return n >>> 0;\n}\n\nfunction writeUint16LE(buf: Uint8Array, offset: number, value: number): void {\n buf[offset] = value & 0xff;\n buf[offset + 1] = (value >>> 8) & 0xff;\n}\n\nfunction writeUint32LE(buf: Uint8Array, offset: number, value: number): void {\n buf[offset] = value & 0xff;\n buf[offset + 1] = (value >>> 8) & 0xff;\n buf[offset + 2] = (value >>> 16) & 0xff;\n buf[offset + 3] = (value >>> 24) & 0xff;\n}\n\nfunction writeUint64LE(buf: Uint8Array, offset: number, value: bigint): void {\n const lo = Number(value & 0xffffffffn);\n const hi = Number((value >> 32n) & 0xffffffffn);\n writeUint32LE(buf, offset, lo);\n writeUint32LE(buf, offset + 4, hi);\n}\n","/**\n * Magic numbers + domain tags from `btxd v0.29.7 src/matmul/`.\n *\n * Sourced from:\n * - `src/matmul/field.h` (M31 modulus)\n * - `src/matmul/noise.h` (4 noise domain tags)\n * - `src/matmul/transcript.h` (2 transcript tags)\n */\n\n/** M31 prime: 2^31 - 1. From `src/matmul/field.h`. */\nexport const M31_MODULUS = 0x7fffffff;\n\n/** Domain tag for noise matrix `E_L`. From `src/matmul/noise.h`. */\nexport const NOISE_TAG_EL = 'matmul_noise_EL_v1';\n/** Domain tag for noise matrix `E_R`. From `src/matmul/noise.h`. */\nexport const NOISE_TAG_ER = 'matmul_noise_ER_v1';\n/** Domain tag for noise matrix `F_L`. From `src/matmul/noise.h`. */\nexport const NOISE_TAG_FL = 'matmul_noise_FL_v1';\n/** Domain tag for noise matrix `F_R`. From `src/matmul/noise.h`. */\nexport const NOISE_TAG_FR = 'matmul_noise_FR_v1';\n\n/** Personalization for the per-block compression vector. From `src/matmul/transcript.h`. */\nexport const TRANSCRIPT_COMPRESS_TAG = 'matmul-compress-v1';\n/** Personalization for the product-committed final digest. From `src/matmul/transcript.h`. */\nexport const TRANSCRIPT_PRODUCT_DIGEST_TAG = 'matmul-product-digest-v3';\n","/**\n * M31 (Mersenne prime 2^31 - 1) modular arithmetic.\n *\n * Ported from `btxd v0.29.7 src/matmul/field.{h,cpp}`.\n *\n * Field elements are JS `number`s in the canonical range [0, M31_MODULUS).\n *\n * `mul` and the `dot` accumulator use `BigInt` because the worst-case\n * product (2^31 - 1)^2 ≈ 2^62 exceeds Number's 2^53 precision. Day 2.6\n * may swap in a Number-only split-multiplication path for perf.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport { M31_MODULUS } from './constants.js';\n\n/** Canonical field element type. Always in [0, M31_MODULUS). */\nexport type Element = number;\n\nconst MODULUS_BIG = BigInt(M31_MODULUS);\n\n/**\n * Mersenne fold for a non-negative `bigint` up to ~2^64. Matches btxd's\n * `reduce64` in `field.cpp` lines 23-34 (double fold + final canonical sub).\n */\nfunction reduce64(x: bigint): Element {\n let v = (x & MODULUS_BIG) + (x >> 31n);\n v = (v & MODULUS_BIG) + (v >> 31n);\n let result = Number(v);\n if (result >= M31_MODULUS) result -= M31_MODULUS;\n return result;\n}\n\n/** Modular addition. Matches `field::add` in `field.cpp` line 84. */\nexport function add(a: Element, b: Element): Element {\n const s = a + b;\n return s >= M31_MODULUS ? s - M31_MODULUS : s;\n}\n\n/** Modular subtraction. Matches `field::sub` in `field.cpp` line 93. */\nexport function sub(a: Element, b: Element): Element {\n return a >= b ? a - b : a + M31_MODULUS - b;\n}\n\n/** Modular multiplication. Matches `field::mul` in `field.cpp` line 102. */\nexport function mul(a: Element, b: Element): Element {\n return reduce64(BigInt(a) * BigInt(b));\n}\n\n/** Modular negation. Matches `field::neg` in `field.cpp` line 108. */\nexport function neg(a: Element): Element {\n return a === 0 ? 0 : M31_MODULUS - a;\n}\n\n/** Reduce a uint32 input to canonical form. Matches `field::from_uint32`. */\nexport function fromUint32(x: number): Element {\n return reduce64(BigInt(x >>> 0));\n}\n\n/**\n * Modular inverse via Fermat's little theorem: a^(p-2) mod p.\n * Matches `field::inv` in `field.cpp` line 121.\n */\nexport function inv(a: Element): Element {\n if (a === 0) throw new Error('field.inv: cannot invert 0');\n let exp = M31_MODULUS - 2;\n let result: Element = 1;\n let base = a;\n while (exp > 0) {\n if ((exp & 1) !== 0) result = mul(result, base);\n exp >>>= 1;\n if (exp > 0) base = mul(base, base);\n }\n return result;\n}\n\n/**\n * Hash-to-field oracle for deterministic challenge derivation.\n *\n * Matches `field::from_oracle` in `field.cpp` line 138:\n * - SHA-256(seed_bytes || LE32(index) [|| LE32(retry) if retry > 0])\n * - candidate = ReadLE32(hash[0..4]) & MODULUS\n * - accept if candidate < MODULUS; else retry (up to 256 retries)\n * - deterministic fallback otherwise (essentially unreachable, ~2^-7936)\n *\n * @param seed - 32-byte seed in btxd \"display/MSB-first\" order. The C++\n * reverses uint256's LE storage to MSB-first before hashing; standard hex\n * parsing of a uint256 hex string already yields MSB-first bytes, so the\n * caller can pass the hex-parsed bytes directly without reversing.\n */\nexport function fromOracle(seed: Uint8Array, index: number): Element {\n if (seed.length !== 32) {\n throw new Error(`field.fromOracle: seed must be 32 bytes, got ${seed.length}`);\n }\n const indexLe = new Uint8Array(4);\n writeUint32LE(indexLe, 0, index >>> 0);\n\n for (let retry = 0; retry < 256; retry++) {\n const hasher = sha256.create();\n hasher.update(seed);\n hasher.update(indexLe);\n if (retry > 0) {\n const retryLe = new Uint8Array(4);\n writeUint32LE(retryLe, 0, retry);\n hasher.update(retryLe);\n }\n const hash = hasher.digest();\n const candidate = readUint32LE(hash, 0) & M31_MODULUS;\n if (candidate < M31_MODULUS) return candidate;\n }\n\n // Deterministic fallback. Same construction as btxd `field.cpp` line 174.\n const fallback = sha256.create();\n fallback.update(seed);\n fallback.update(indexLe);\n fallback.update(new TextEncoder().encode('oracle-fallback'));\n const hash = fallback.digest();\n return readUint32LE(hash, 0) % M31_MODULUS;\n}\n\n/**\n * Inner-product over M31. Matches `field::ScalarDot` in `field.cpp` line 39\n * (the NEON kernel is a perf-equivalent rewrite of this canonical scalar path).\n *\n * Accumulates 4 products per Mersenne fold; uses BigInt for the 64-bit acc\n * because Number can't hold 4·(2^31-1)^2 ≈ 2^64.\n */\nexport function dot(a: Element[] | Uint32Array, b: Element[] | Uint32Array, len: number): Element {\n let acc = 0n;\n let pending = 0;\n for (let i = 0; i < len; i++) {\n acc += BigInt(a[i]!) * BigInt(b[i]!);\n if (++pending === 4) {\n acc = (acc & MODULUS_BIG) + (acc >> 31n);\n acc = (acc & MODULUS_BIG) + (acc >> 31n);\n pending = 0;\n }\n }\n return reduce64(acc);\n}\n\nfunction writeUint32LE(buf: Uint8Array, offset: number, value: number): void {\n buf[offset] = value & 0xff;\n buf[offset + 1] = (value >>> 8) & 0xff;\n buf[offset + 2] = (value >>> 16) & 0xff;\n buf[offset + 3] = (value >>> 24) & 0xff;\n}\n\nfunction readUint32LE(buf: Uint8Array, offset: number): number {\n return (\n (buf[offset]! |\n (buf[offset + 1]! << 8) |\n (buf[offset + 2]! << 16) |\n (buf[offset + 3]! << 24)) >>>\n 0\n );\n}\n","/**\n * Dense matrix over M31 with row-major layout.\n *\n * Lightweight equivalent of `btxd v0.29.7 src/matmul/matrix.{h,cpp}`. We expose\n * only the operations the solver needs: construction, element access, add,\n * and multiplication. Block views live in `transcript.ts`.\n */\n\nimport { add as fieldAdd, dot as fieldDot, fromOracle, type Element } from './field.js';\n\nexport interface Matrix {\n readonly rows: number;\n readonly cols: number;\n /** Row-major: data[row * cols + col]. Length = rows * cols. */\n readonly data: Uint32Array;\n}\n\n/** Construct a zero-initialized matrix. */\nexport function zeros(rows: number, cols: number): Matrix {\n return { rows, cols, data: new Uint32Array(rows * cols) };\n}\n\n/** Element accessor. */\nexport function get(m: Matrix, row: number, col: number): Element {\n return m.data[row * m.cols + col]!;\n}\n\n/** Element setter. */\nexport function set(m: Matrix, row: number, col: number, value: Element): void {\n m.data[row * m.cols + col] = value;\n}\n\n/**\n * Build a `rows × cols` matrix where entry (row, col) is\n * `field.fromOracle(seed, row * cols + col)`.\n *\n * Mirrors `FromSeedRect` in `btxd src/matmul/noise.cpp`.\n */\nexport function fromSeedRect(seed: Uint8Array, rows: number, cols: number): Matrix {\n const m = zeros(rows, cols);\n const total = rows * cols;\n for (let i = 0; i < total; i++) {\n m.data[i] = fromOracle(seed, i);\n }\n return m;\n}\n\n/**\n * Element-wise modular sum `out = a + b` in M31.\n * Throws if dimensions mismatch.\n */\nexport function matAdd(a: Matrix, b: Matrix): Matrix {\n if (a.rows !== b.rows || a.cols !== b.cols) {\n throw new Error(\n `matAdd: dim mismatch a=${a.rows}x${a.cols} b=${b.rows}x${b.cols}`,\n );\n }\n const out = zeros(a.rows, a.cols);\n for (let i = 0; i < a.data.length; i++) {\n out.data[i] = fieldAdd(a.data[i]!, b.data[i]!);\n }\n return out;\n}\n\n/**\n * Canonical M31 matrix multiplication: `out = a · b`.\n *\n * `a` is rows_a × inner, `b` is inner × cols_b; `out` is rows_a × cols_b.\n * Uses `field.dot` per inner row × col pair, which folds Mersenne every\n * 4 accumulated products.\n */\nexport function matMul(a: Matrix, b: Matrix): Matrix {\n if (a.cols !== b.rows) {\n throw new Error(\n `matMul: inner-dim mismatch a.cols=${a.cols} b.rows=${b.rows}`,\n );\n }\n const out = zeros(a.rows, b.cols);\n const rowBuf = new Uint32Array(a.cols);\n const colBuf = new Uint32Array(a.cols);\n for (let i = 0; i < a.rows; i++) {\n for (let k = 0; k < a.cols; k++) rowBuf[k] = a.data[i * a.cols + k]!;\n for (let j = 0; j < b.cols; j++) {\n for (let k = 0; k < a.cols; k++) colBuf[k] = b.data[k * b.cols + j]!;\n out.data[i * b.cols + j] = fieldDot(rowBuf, colBuf, a.cols);\n }\n }\n return out;\n}\n","/**\n * Deterministic noise pair generation: {E_L, E_R, F_L, F_R}.\n *\n * Each matrix is rank-r (n × r or r × n); used to perturb (A, B) into\n * (A', B') = (A + E_L·E_R, B + F_L·F_R) before the canonical matmul.\n *\n * Ported from `btxd v0.29.7 src/matmul/noise.{h,cpp}`.\n *\n * Byte-order convention (see header.ts for full discussion): sigma + noise\n * seeds are kept in **display/BE order** in-memory. The C++ reverses LE\n * storage to BE for hashing; we already store BE, so we hash directly.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport {\n NOISE_TAG_EL,\n NOISE_TAG_ER,\n NOISE_TAG_FL,\n NOISE_TAG_FR,\n} from './constants.js';\nimport { fromSeedRect, type Matrix } from './matrix.js';\n\n/** The 4 noise factor matrices. Sized (n×r, r×n, n×r, r×n) respectively. */\nexport interface NoisePair {\n E_L: Matrix;\n E_R: Matrix;\n F_L: Matrix;\n F_R: Matrix;\n}\n\n/**\n * Per-tag seed derivation. Matches `btxd noise::DeriveNoiseSeed`:\n * seed = SHA-256(domain_tag || sigma_BE)\n *\n * Subtle byte-order point: btxd stores the noise seed via\n * `CanonicalBytesToUint256(digest)` — i.e. the uint256's LE storage is the\n * REVERSE of the raw SHA-256 output. Then `from_oracle` reverses that LE\n * storage again before hashing, so the bytes actually fed to the per-index\n * SHA-256 are the RAW digest. Our `fromOracle` hashes the seed directly\n * (no internal reverse), so we must return the raw digest here — no reverse.\n *\n * (Contrast with `deriveSigma`, which DOES reverse: btxd's sigma uint256 is\n * stored direct from the SHA-256 output, so `from_oracle`'s reverse lands on\n * REVERSE(raw). The reverse in our `deriveSigma` mirrors that asymmetry.)\n */\nexport function deriveNoiseSeed(domainTag: string, sigmaBE: Uint8Array): Uint8Array {\n if (sigmaBE.length !== 32) {\n throw new Error(`deriveNoiseSeed: sigma must be 32 bytes, got ${sigmaBE.length}`);\n }\n if (domainTag.length !== 18) {\n // C++ asserts this; all 4 noise tags are 18 chars.\n throw new Error(`deriveNoiseSeed: domain tag must be 18 chars, got ${domainTag.length}`);\n }\n const hasher = sha256.create();\n hasher.update(new TextEncoder().encode(domainTag));\n hasher.update(sigmaBE);\n return hasher.digest();\n}\n\n/**\n * Generate the 4 noise matrices. Mirrors `noise::Generate(sigma, n, r)`.\n *\n * Returned matrix sizes:\n * - E_L : n × r\n * - E_R : r × n\n * - F_L : n × r\n * - F_R : r × n\n *\n * Asymmetric on purpose — so `E_L · E_R` and `F_L · F_R` are n×n.\n */\nexport function generate(sigmaBE: Uint8Array, n: number, r: number): NoisePair {\n const seedEL = deriveNoiseSeed(NOISE_TAG_EL, sigmaBE);\n const seedER = deriveNoiseSeed(NOISE_TAG_ER, sigmaBE);\n const seedFL = deriveNoiseSeed(NOISE_TAG_FL, sigmaBE);\n const seedFR = deriveNoiseSeed(NOISE_TAG_FR, sigmaBE);\n return {\n E_L: fromSeedRect(seedEL, n, r),\n E_R: fromSeedRect(seedER, r, n),\n F_L: fromSeedRect(seedFL, n, r),\n F_R: fromSeedRect(seedFR, r, n),\n };\n}\n","/**\n * Transcript-binding block compression + canonical matmul + final digest.\n *\n * Ported from `btxd v0.29.7 src/matmul/transcript.{h,cpp}`.\n *\n * For Day 2.5 (the canonical Solve path) we only need:\n * - {@link deriveCompressionVector} — b·b M31 vector from sigma\n * - {@link compressBlock} — block · compression-vector inner product\n * - {@link TranscriptHasher} — accumulates LE32(compressed c-block) per\n * (i, j, ell) step, finalizes as SHA-256d\n * - {@link canonicalMatMul} — block-wise A' · B' with intermediate hashing\n *\n * The replay / product-committed / accelerated-solver helpers are verifier\n * optimizations; out of scope for Day 2.5 but easy to add in Day 2.6+ if\n * needed.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport { TRANSCRIPT_COMPRESS_TAG } from './constants.js';\nimport { add as fieldAdd, dot as fieldDot, fromOracle } from './field.js';\nimport { zeros, type Matrix } from './matrix.js';\n\n/**\n * Per-sigma compression seed. Mirrors `DeriveCompressionSeed` in transcript.cpp\n * (the anonymous-namespace helper).\n *\n * Like `deriveNoiseSeed`, btxd stores this via `CanonicalBytesToUint256` —\n * the LE storage is the reverse of the raw digest. `from_oracle` reverses\n * once more before hashing, so the bytes actually fed to the per-index\n * SHA-256 are the RAW digest. Our `fromOracle` hashes the seed directly,\n * so we return the raw digest with no extra reverse.\n */\nfunction deriveCompressionSeed(sigmaBE: Uint8Array): Uint8Array {\n const hasher = sha256.create();\n hasher.update(new TextEncoder().encode(TRANSCRIPT_COMPRESS_TAG));\n hasher.update(sigmaBE);\n return hasher.digest();\n}\n\n/**\n * Build the b·b-element M31 compression vector. Mirrors\n * `transcript::DeriveCompressionVector`.\n */\nexport function deriveCompressionVector(sigmaBE: Uint8Array, b: number): Uint32Array {\n if (b <= 0) throw new Error('block size b must be positive');\n const seed = deriveCompressionSeed(sigmaBE);\n const len = b * b;\n const vec = new Uint32Array(len);\n for (let k = 0; k < len; k++) vec[k] = fromOracle(seed, k);\n return vec;\n}\n\n/**\n * Compress a b·b block against the precomputed compression vector. Mirrors\n * `transcript::CompressBlock` — a plain M31 inner product, no per-row split.\n */\nexport function compressBlock(block: Uint32Array, v: Uint32Array): number {\n if (block.length !== v.length) {\n throw new Error(\n `compressBlock: dim mismatch block.length=${block.length} v.length=${v.length}`,\n );\n }\n return fieldDot(block, v, block.length);\n}\n\n/**\n * Accumulating SHA-256(-d) transcript hasher. Mirrors\n * `transcript::TranscriptHasher`.\n *\n * compress_vec = DeriveCompressionVector(sigma, b)\n * per (i,j,ell): add LE32(CompressBlock(c_block, compress_vec)) to inner\n * finalize(): inner = SHA256.digest(); return SHA256(inner) (i.e. SHA-256d)\n */\nexport class TranscriptHasher {\n private readonly hasher = sha256.create();\n private readonly compressVec: Uint32Array;\n private readonly b: number;\n private readonly le4 = new Uint8Array(4);\n\n constructor(sigmaBE: Uint8Array, b: number) {\n this.b = b;\n this.compressVec = deriveCompressionVector(sigmaBE, b);\n }\n\n /**\n * Append the LE32-encoded compressed `c_block` to the transcript.\n * Ignores `i`/`j`/`ell` for hashing (btxd's `(void)i;(void)j;(void)ell;`\n * proves they don't participate in the digest), but accepts them so the\n * call-site reads identically to the C++.\n */\n addIntermediate(_i: number, _j: number, _ell: number, cBlock: Uint32Array): void {\n if (cBlock.length !== this.b * this.b) {\n throw new Error(\n `addIntermediate: c_block must be ${this.b * this.b} elements, got ${cBlock.length}`,\n );\n }\n const compressed = compressBlock(cBlock, this.compressVec);\n this.le4[0] = compressed & 0xff;\n this.le4[1] = (compressed >>> 8) & 0xff;\n this.le4[2] = (compressed >>> 16) & 0xff;\n this.le4[3] = (compressed >>> 24) & 0xff;\n this.hasher.update(this.le4);\n }\n\n /** SHA-256d: inner = SHA256(transcript); return SHA256(inner). */\n finalize(): Uint8Array {\n const inner = this.hasher.digest();\n return sha256(inner);\n }\n}\n\nexport interface CanonicalMatMulResult {\n /** Product matrix C' = A' · B' over M31. */\n cPrime: Matrix;\n /** SHA-256d over the LE32-encoded compressed c-blocks (in i,j,ell order). */\n transcriptHash: Uint8Array;\n}\n\n/**\n * Canonical block-wise matmul with transcript binding. Mirrors\n * `transcript::CanonicalMatMul`.\n *\n * for i,j in [0,N)²:\n * for ell in [0,N):\n * a = A'.block(i,ell)\n * b = B'.block(ell,j)\n * c_acc += a·b\n * hasher.add(c_acc)\n *\n * Where N = n / b. Each block read/multiply/accumulate happens in a\n * pre-allocated b·b scratch buffer to avoid per-step allocation in the\n * hot path.\n */\nexport function canonicalMatMul(\n aPrime: Matrix,\n bPrime: Matrix,\n b: number,\n sigmaBE: Uint8Array,\n): CanonicalMatMulResult {\n if (\n aPrime.rows !== aPrime.cols ||\n bPrime.rows !== bPrime.cols ||\n aPrime.rows !== bPrime.rows\n ) {\n throw new Error('canonicalMatMul requires square matrices of equal size');\n }\n if (b === 0 || aPrime.rows % b !== 0) {\n throw new Error('canonicalMatMul: invalid transcript block size');\n }\n\n const n = aPrime.rows;\n const N = n / b;\n const cPrime = zeros(n, n);\n const hasher = new TranscriptHasher(sigmaBE, b);\n\n const aBlock = new Uint32Array(b * b);\n const bBlock = new Uint32Array(b * b);\n const cBlock = new Uint32Array(b * b);\n\n for (let i = 0; i < N; i++) {\n for (let j = 0; j < N; j++) {\n cBlock.fill(0);\n for (let ell = 0; ell < N; ell++) {\n readBlock(aPrime, i, ell, b, aBlock);\n readBlock(bPrime, ell, j, b, bBlock);\n multiplyAndAccumulateBlock(aBlock, bBlock, cBlock, b);\n hasher.addIntermediate(i, j, ell, cBlock);\n }\n writeBlock(cPrime, i, j, b, cBlock);\n }\n }\n\n return { cPrime, transcriptHash: hasher.finalize() };\n}\n\n// ----------------------------------------------------------------------------\n// internal block kernels\n// ----------------------------------------------------------------------------\n\n/** Copy `m[bi*b..bi*b+b][bj*b..bj*b+b]` into the `b·b` `out` buffer. */\nfunction readBlock(\n m: Matrix,\n bi: number,\n bj: number,\n b: number,\n out: Uint32Array,\n): void {\n const rowStart = bi * b;\n const colStart = bj * b;\n const stride = m.cols;\n for (let r = 0; r < b; r++) {\n const src = (rowStart + r) * stride + colStart;\n const dst = r * b;\n for (let c = 0; c < b; c++) {\n out[dst + c] = m.data[src + c]!;\n }\n }\n}\n\n/** Copy a b·b `block` buffer into `m[bi*b..bi*b+b][bj*b..bj*b+b]`. */\nfunction writeBlock(\n m: Matrix,\n bi: number,\n bj: number,\n b: number,\n block: Uint32Array,\n): void {\n const rowStart = bi * b;\n const colStart = bj * b;\n const stride = m.cols;\n for (let r = 0; r < b; r++) {\n const dst = (rowStart + r) * stride + colStart;\n const src = r * b;\n for (let c = 0; c < b; c++) {\n m.data[dst + c] = block[src + c]!;\n }\n }\n}\n\n/**\n * `c += a · b` for square b·b blocks (all three buffers are length b·b).\n * Element-wise mod M31. Inner loop uses `field.dot` (Mersenne-fold every 4\n * products) to stay in the canonical scalar path.\n */\nfunction multiplyAndAccumulateBlock(\n a: Uint32Array,\n b_buf: Uint32Array,\n c: Uint32Array,\n b: number,\n): void {\n // c[i,j] += sum_k a[i,k] * b_buf[k,j]\n // Strategy: for each (i, j), pre-collect b_buf's column j into a temp,\n // then dot with a's row i. Reuses field.dot's batched reduction.\n const colBuf = new Uint32Array(b);\n for (let j = 0; j < b; j++) {\n for (let k = 0; k < b; k++) colBuf[k] = b_buf[k * b + j]!;\n for (let i = 0; i < b; i++) {\n const rowStart = i * b;\n // Compute dot(a[i,:], colBuf, b) and add to c[i,j].\n let acc = 0n;\n let pending = 0;\n for (let k = 0; k < b; k++) {\n acc += BigInt(a[rowStart + k]!) * BigInt(colBuf[k]!);\n if (++pending === 4) {\n acc = (acc & MOD_BIG) + (acc >> 31n);\n acc = (acc & MOD_BIG) + (acc >> 31n);\n pending = 0;\n }\n }\n // Final fold and add to c[i,j].\n acc = (acc & MOD_BIG) + (acc >> 31n);\n acc = (acc & MOD_BIG) + (acc >> 31n);\n let folded = Number(acc);\n if (folded >= MOD_NUM) folded -= MOD_NUM;\n c[rowStart + j] = fieldAdd(c[rowStart + j]!, folded);\n }\n }\n}\n\nconst MOD_NUM = 0x7fffffff;\nconst MOD_BIG = 0x7fffffffn;\n","/**\n * Top-level pure-JS solver for the BTX MatMul service-challenge PoW.\n *\n * Ported from `btxd v0.29.7 src/matmul/matmul_pow.cpp` lines 293-358 (`Solve`).\n *\n * A = FromSeed(seed_a, n)\n * B = FromSeed(seed_b, n)\n * for nonce in [start, start + maxTries):\n * sigma = DeriveSigma(state(nonce))\n * noise = noise::Generate(sigma, n, r)\n * E = noise.E_L · noise.E_R\n * F = noise.F_L · noise.F_R\n * A' = A + E\n * B' = B + F\n * result = transcript::CanonicalMatMul(A', B', b, sigma)\n * if uintLE(result.transcript_hash) <= uintBE(target): return success\n *\n * Comparison semantics: `transcript_hash` is the raw SHA-256d output, treated\n * as a 256-bit integer in **little-endian byte order** (btxd's `uint256` ↔\n * `arith_uint256` convention). `target` arrives as a BE hex string. Both are\n * converted to `bigint` for the `<=` test.\n */\n\nimport type { Challenge, SolverOutput } from '../types.js';\nimport { deriveSigma, headerInputForNonce } from './header.js';\nimport { fromSeedRect, matAdd, matMul } from './matrix.js';\nimport { generate as generateNoise } from './noise.js';\nimport { canonicalMatMul } from './transcript.js';\n\nconst MAX_U64 = (1n << 64n) - 1n;\n\n/** Options for {@link solveJs}. */\nexport interface SolveJsOptions {\n /** Max nonces to try before giving up. Default 1_000_000. */\n maxTries?: number;\n /** Override the starting nonce (default: challenge.header_context.nonce64_start). */\n nonceStart?: bigint;\n /** Optional callback fired every N attempts for progress reporting. */\n onAttempt?: (attemptIndex: number, nonce: bigint) => void;\n /** Frequency of `onAttempt` calls (default every 1 attempt). */\n attemptInterval?: number;\n}\n\n/**\n * Pure-JS solver for a BTX MatMul service challenge. Searches nonces starting\n * from `header_context.nonce64_start` (or `options.nonceStart`) until the\n * transcript-hash satisfies `digest_le256 <= target_be256` or `maxTries` is\n * exhausted.\n *\n * Returns `null` if no solution was found within the budget.\n *\n * @throws if the challenge envelope is malformed (wrong-shape matmul params,\n * non-square matrix dimensions, b doesn't divide n, etc.).\n */\nexport function solveJs(challenge: Challenge, options: SolveJsOptions = {}): SolverOutput | null {\n const payload = challenge.challenge;\n const ctx = payload.header_context;\n const { n, b, r } = payload.matmul;\n\n const maxTries = options.maxTries ?? 1_000_000;\n const nonceStart =\n options.nonceStart ?? BigInt(ctx.nonce64_start ?? 0);\n const attemptInterval = options.attemptInterval ?? 1;\n\n if (n <= 0 || b <= 0 || r <= 0) {\n throw new Error(`solveJs: invalid matmul params (n=${n}, b=${b}, r=${r})`);\n }\n if (n % b !== 0) {\n throw new Error(`solveJs: n=${n} not divisible by b=${b}`);\n }\n\n // Parse fixed inputs.\n const seedA = parseHex32(payload.matmul.seed_a, 'seed_a');\n const seedB = parseHex32(payload.matmul.seed_b, 'seed_b');\n const targetBE = parseHex32(payload.target, 'target');\n const targetValue = bytesBEToBigInt(targetBE);\n\n // A and B don't change per attempt.\n const A = fromSeedRect(seedA, n, n);\n const B = fromSeedRect(seedB, n, n);\n\n let nonce = nonceStart & MAX_U64;\n for (let attempt = 0; attempt < maxTries; attempt++) {\n if (options.onAttempt && attempt % attemptInterval === 0) {\n options.onAttempt(attempt, nonce);\n }\n\n const headerInput = headerInputForNonce(ctx, nonce);\n const sigmaBE = deriveSigma(headerInput);\n const noise = generateNoise(sigmaBE, n, r);\n\n const E = matMul(noise.E_L, noise.E_R);\n const F = matMul(noise.F_L, noise.F_R);\n const aPrime = matAdd(A, E);\n const bPrime = matAdd(B, F);\n\n const result = canonicalMatMul(aPrime, bPrime, b, sigmaBE);\n const digestValue = bytesLEToBigInt(result.transcriptHash);\n if (digestValue <= targetValue) {\n const nonce64_hex = nonce.toString(16).padStart(16, '0');\n const digest_hex = bytesLEToHexBE(result.transcriptHash);\n return {\n nonce64_hex,\n digest_hex,\n // Same shape btxd's solve RPC returns: {challenge, nonce64_hex, digest_hex}.\n // See `solvematmulservicechallenge` in btxd src/rpc/mining.cpp.\n proof: { challenge, nonce64_hex, digest_hex },\n };\n }\n\n if (nonce === MAX_U64) return null;\n nonce = (nonce + 1n) & MAX_U64;\n }\n\n return null;\n}\n\n// ----------------------------------------------------------------------------\n// hex / int conversion\n// ----------------------------------------------------------------------------\n\nfunction parseHex32(hex: string, field: string): Uint8Array {\n const h = hex.startsWith('0x') || hex.startsWith('0X') ? hex.slice(2) : hex;\n if (h.length !== 64) {\n throw new Error(`solveJs.${field}: expected 64 hex chars, got ${h.length}`);\n }\n const out = new Uint8Array(32);\n for (let i = 0; i < 32; i++) {\n const byte = parseInt(h.slice(i * 2, i * 2 + 2), 16);\n if (Number.isNaN(byte)) {\n throw new Error(`solveJs.${field}: invalid hex at byte ${i}`);\n }\n out[i] = byte;\n }\n return out;\n}\n\n/** Interpret 32 bytes as a 256-bit integer in big-endian byte order. */\nfunction bytesBEToBigInt(bytes: Uint8Array): bigint {\n let v = 0n;\n for (let i = 0; i < bytes.length; i++) {\n v = (v << 8n) | BigInt(bytes[i]!);\n }\n return v;\n}\n\n/** Interpret 32 bytes as a 256-bit integer in little-endian byte order. */\nfunction bytesLEToBigInt(bytes: Uint8Array): bigint {\n let v = 0n;\n for (let i = bytes.length - 1; i >= 0; i--) {\n v = (v << 8n) | BigInt(bytes[i]!);\n }\n return v;\n}\n\n/** Reverse LE-stored bytes and hex-encode as a BE/display string. */\nfunction bytesLEToHexBE(bytes: Uint8Array): string {\n const chars: string[] = [];\n for (let i = bytes.length - 1; i >= 0; i--) {\n chars.push(bytes[i]!.toString(16).padStart(2, '0'));\n }\n return chars.join('');\n}\n","import type { BtxChallengeClient } from './client.js';\nimport { solveJs, type SolveJsOptions } from './matmul/pow.js';\nimport type { Challenge, SolverOutput } from './types.js';\n\n/**\n * How a challenge should be solved.\n *\n * - `'rpc'` — delegate to btxd's `solvematmulservicechallenge`. Requires\n * `opts.rpcClient`. Server-side / Node-only.\n *\n * - `'pure-js'` — solve locally with a pure-TypeScript MatMul implementation.\n * Browser-compatible. Ports the canonical CPU path of btxd's matmul solver.\n * At default difficulty + n=512, pure-JS solving is slow (perf is currently\n * bounded by `BigInt`-based M31 multiplication; WASM/SIMD acceleration is\n * planned for a future iteration).\n *\n * - `'auto'` — pick automatically: `'rpc'` if `opts.rpcClient` is provided,\n * else `'pure-js'`.\n */\nexport type SolverMode = 'rpc' | 'pure-js' | 'auto';\n\n/** Options for {@link Solver.solve}. */\nexport interface SolverOptions {\n /** Solve strategy. Default: `'auto'` (rpc if client provided, else pure-js). */\n mode?: SolverMode;\n /** Required for `mode === 'rpc'`. Ignored for `'pure-js'`. */\n rpcClient?: BtxChallengeClient;\n /** Forwarded to the pure-JS solver. Ignored for `'rpc'`. */\n pureJs?: SolveJsOptions;\n}\n\n/**\n * Solve a BTX service challenge to produce a (nonce, digest, proof) tuple\n * that btxd will accept on redemption.\n *\n * **Modes**:\n * - `'rpc'`: delegate to btxd's `solvematmulservicechallenge` RPC. Pass an\n * authenticated `BtxChallengeClient` in `opts.rpcClient`. **Production\n * note**: the solve RPC shares the matmul backend with block-template\n * mining; consumers MUST point at a dedicated non-mining btxd, otherwise\n * individual solves can queue behind mining work for 10+ minutes.\n * - `'pure-js'`: solve locally with the ported TypeScript MatMul. Browser-\n * compatible. Slower than `'rpc'` but no node required.\n * - `'auto'`: prefers `'rpc'` if a client is provided, else `'pure-js'`.\n *\n * @example Server-side (Node, RPC mode)\n * ```typescript\n * import { BtxChallengeClient, Solver } from '@btx/challenges-sdk';\n *\n * const client = new BtxChallengeClient({\n * rpcUrl: 'http://127.0.0.1:19332',\n * rpcAuth: { user: 'rpcuser', pass: 'rpcpass' },\n * });\n *\n * const challenge = await client.issue({\n * purpose: 'ai_inference_gate',\n * resource: 'model:gpt-x|route:/v1/generate',\n * subject: 'tenant:abc123',\n * });\n *\n * const proof = await Solver.solve(challenge, { mode: 'rpc', rpcClient: client });\n * const result = await client.redeem(challenge, proof.nonce64_hex, proof.digest_hex);\n *\n * if (result.valid && result.reason === 'ok') {\n * // Admit the caller.\n * }\n * ```\n *\n * @example Browser-side (pure-JS mode)\n * ```typescript\n * import { Solver } from '@btx/challenges-sdk';\n *\n * // Solve a challenge with no server-side help. Slow at default difficulty;\n * // for production browser use cases, calibrate via `target_solve_time_s`.\n * const proof = await Solver.solve(challenge, {\n * mode: 'pure-js',\n * pureJs: { maxTries: 100_000 },\n * });\n * ```\n */\nexport class Solver {\n static async solve(\n challenge: Challenge,\n opts: SolverOptions = {},\n ): Promise<SolverOutput> {\n const mode: SolverMode = opts.mode ?? (opts.rpcClient ? 'rpc' : 'pure-js');\n\n switch (mode) {\n case 'rpc':\n return solveViaRpc(challenge, opts);\n case 'pure-js':\n return solveViaPureJs(challenge, opts);\n case 'auto':\n if (opts.rpcClient) return solveViaRpc(challenge, opts);\n return solveViaPureJs(challenge, opts);\n default: {\n // Exhaustiveness guard — unreachable if SolverMode is the source of truth.\n const _exhaustive: never = mode;\n throw new Error(`Solver.solve: unknown mode \"${_exhaustive as string}\"`);\n }\n }\n }\n}\n\nasync function solveViaRpc(\n challenge: Challenge,\n opts: SolverOptions,\n): Promise<SolverOutput> {\n if (!opts.rpcClient) {\n throw new Error(\n 'Solver.solve: mode=\"rpc\" requires opts.rpcClient. ' +\n 'Construct a BtxChallengeClient and pass it via opts.rpcClient.',\n );\n }\n return opts.rpcClient.solve(challenge);\n}\n\nasync function solveViaPureJs(\n challenge: Challenge,\n opts: SolverOptions,\n): Promise<SolverOutput> {\n const result = solveJs(challenge, opts.pureJs);\n if (result === null) {\n const tries = opts.pureJs?.maxTries ?? 1_000_000;\n throw new Error(\n `Solver.solve: pure-JS solver exhausted maxTries=${tries} without finding a proof. ` +\n 'Increase maxTries or lower challenge difficulty (target_solve_time_s).',\n );\n }\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/client.ts","../src/matmul/header.ts","../src/matmul/constants.ts","../src/matmul/field.ts","../src/matmul/matrix.ts","../src/matmul/noise.ts","../src/matmul/transcript.ts","../src/matmul/pow.ts","../src/solver.ts"],"names":["rawBody","writeUint32LE","sha256","hash"],"mappings":";;;AA6NO,IAAM,QAAA,GAAN,cAAuB,KAAA,CAAM;AAAA,EAClC,WAAA,CACE,SACgB,MAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAFG,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AAAA,EACd;AAAA,EAJkB,MAAA;AAKpB;AAGO,IAAM,WAAA,GAAN,cAA0B,QAAA,CAAS;AAAA,EACxC,WAAA,CACkB,IAAA,EAChB,OAAA,EACA,MAAA,EACA;AACA,IAAA,KAAA,CAAM,SAAS,MAAM,CAAA;AAJL,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAKhB,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EACd;AAAA,EANkB,IAAA;AAOpB;AAGO,IAAM,YAAA,GAAN,cAA2B,QAAA,CAAS;AAAA,EACzC,WAAA,CACkB,MAAA,EAEA,IAAA,EAChB,MAAA,EACA;AACA,IAAA,KAAA,CAAM,CAAA,KAAA,EAAQ,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA;AALrC,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAIhB,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AAAA,EAPkB,MAAA;AAAA,EAEA,IAAA;AAMpB;AAGO,IAAM,aAAA,GAAN,cAA4B,QAAA,CAAS;AAAA,EAC1C,WAAA,CAE2B,KAAA,EAET,IAAA,EAChB,MAAA,EACA;AACA,IAAA,MAAM,WAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACtE,IAAA,KAAA,CAAM,CAAA,8BAAA,EAAiC,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA;AANhC,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAET,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAKhB,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AAAA,EAR2B,KAAA;AAAA,EAET,IAAA;AAOpB;AAGO,IAAM,eAAA,GAAN,cAA8B,QAAA,CAAS;AAAA,EAC5C,WAAA,CACkB,WAChB,MAAA,EACA;AACA,IAAA,KAAA,CAAM,CAAA,4BAAA,EAA+B,SAAS,CAAA,EAAA,CAAA,EAAM,MAAM,CAAA;AAH1C,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAIhB,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AAAA,EALkB,SAAA;AAMpB;AAGO,IAAM,eAAA,GAAN,cAA8B,QAAA,CAAS;AAAA,EAC5C,WAAA,CAE2B,OACzB,MAAA,EACA;AACA,IAAA,MAAM,WAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACtE,IAAA,KAAA,CAAM,CAAA,mBAAA,EAAsB,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA;AAJrB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAKzB,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AAAA,EAN2B,KAAA;AAO7B;;;AC1QA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,OAAO,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,EACrD;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY,CAAE,OAAO,KAAK,CAAA;AAC5C,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAW,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,KAAK,MAAM,CAAA;AACpB;AAYA,SAAS,gBAAgB,IAAA,EAAsB;AAC7C,EAAA,OAAO,IAAA,CACJ,OAAA,CAAQ,+CAAA,EAAiD,iCAAiC,EAC1F,OAAA,CAAQ,4BAAA,EAA8B,yBAAyB,CAAA,CAC/D,QAAQ,+BAAA,EAAiC,4BAA4B,CAAA,CACrE,OAAA,CAAQ,6CAA6C,eAAe,CAAA;AACzE;AAGA,SAAS,aAAA,GAAwB;AAE/B,EAAA,MAAM,IAAI,UAAA,CAAW,MAAA;AACrB,EAAA,IAAI,KAAK,OAAO,CAAA,CAAE,eAAe,UAAA,EAAY,OAAO,EAAE,UAAA,EAAW;AAKjE,EAAA,OAAO,GAAG,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAC9E;AAyBO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAAtB,IAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAkB,MAAA,EAAgB,MAAA,GAAoB,EAAC,EAAe;AAC1E,IAAA,MAAM,KAAK,aAAA,EAAc;AACzB,IAAA,MAAM,IAAA,GAAO,QAAA,GAAW,UAAA,CAAW,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAGxF,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU,EAAE,SAAS,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAElE,IAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,SAAA,IAAa,GAAA;AACzC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,IAAA,CAAK,KAAA,IAAS,SAAS,CAAA;AAEtD,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAM,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ;AAAA,QAClC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe;AAAA,SACjB;AAAA,QACA,IAAA;AAAA,QACA,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,YAAA,CAAa,KAAK,CAAA;AAElB,MAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACrD,QAAA,MAAM,IAAI,eAAA,CAAgB,SAAA,EAAW,MAAM,CAAA;AAAA,MAC7C;AACA,MAAA,MAAM,IAAI,eAAA,CAAgB,GAAA,EAAK,MAAM,CAAA;AAAA,IACvC,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAEA,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAMA,WAAU,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC/C,MAAA,MAAM,IAAI,YAAA,CAAa,GAAA,CAAI,QAAQ,eAAA,CAAgBA,QAAO,GAAG,MAAM,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA,EAAK;AAC/B,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,eAAA,CAAgB,OAAO,GAAG,MAAM,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,YAAY,IAAA,CAAK,KAAA,CAAM,MAAM,IAAA,CAAK,KAAA,CAAM,SAAS,MAAM,CAAA;AAAA,IACnE;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,MAAM,MAAA,EAAyC;AAGnD,IAAA,MAAM,OAAA,GAAoC;AAAA,MACxC,CAAC,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAAA,MAC1B,CAAC,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,MAC5B,CAAC,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAAA,MAC1B,CAAC,qBAAA,EAAuB,MAAA,CAAO,mBAAmB,CAAA;AAAA,MAClD,CAAC,cAAA,EAAgB,MAAA,CAAO,YAAY,CAAA;AAAA,MACpC,CAAC,uBAAA,EAAyB,MAAA,CAAO,qBAAqB,CAAA;AAAA,MACtD,CAAC,wBAAA,EAA0B,MAAA,CAAO,sBAAsB,CAAA;AAAA,MACxD,CAAC,mBAAA,EAAqB,MAAA,CAAO,iBAAiB,CAAA;AAAA,MAC9C,CAAC,0BAAA,EAA4B,MAAA,CAAO,wBAAwB,CAAA;AAAA,MAC5D,CAAC,kBAAA,EAAoB,MAAA,CAAO,gBAAgB,CAAA;AAAA,MAC5C,CAAC,kBAAA,EAAoB,MAAA,CAAO,gBAAgB,CAAA;AAAA,MAC5C,CAAC,oBAAA,EAAsB,MAAA,CAAO,kBAAkB,CAAA;AAAA,MAChD,CAAC,uBAAA,EAAyB,MAAA,CAAO,qBAAqB;AAAA,KACxD;AACA,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,IAAS,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC3C,MAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,CAAG,CAAC,MAAM,MAAA,EAAW;AAChC,QAAA,OAAA,GAAU,CAAA;AACV,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAgB,2BAAA,EAA6B,IAAI,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAA,CACJ,SAAA,EACA,WAAA,EACA,UAAA,EACA,sBAAsB,IAAA,EACC;AACvB,IAAA,OAAO,IAAA,CAAK,KAAmB,0BAAA,EAA4B;AAAA,MACzD,SAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAA,CACJ,SAAA,EACA,WAAA,EACA,UAAA,EACuB;AACvB,IAAA,OAAO,IAAA,CAAK,KAAmB,0BAAA,EAA4B;AAAA,MACzD,SAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,YAAY,OAAA,EAA6C;AAC7D,IAAA,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAC5B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAkB,2BAAA,EAA6B,CAAC,OAAO,CAAC,CAAA;AAAA,EACtE;AAAA;AAAA,EAGA,MAAM,YAAY,OAAA,EAA6C;AAC7D,IAAA,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAC5B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAkB,2BAAA,EAA6B,CAAC,OAAO,CAAC,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAM,SAAA,EAA6C;AACvD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAmB,6BAAA,EAA+B,CAAC,SAAS,CAAC,CAAA;AAAA,EAC3E;AAAA,EAEQ,gBAAgB,OAAA,EAA6B;AACnD,IAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,OAAA,CAAQ,SAAS,GAAA,EAAK;AAC9C,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,CAAA,6DAAA,EAAgE,QAAQ,MAAM,CAAA;AAAA,OAChF;AAAA,IACF;AAAA,EACF;AACF;ACjMO,SAAS,mBAAA,CACd,KACA,OAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,mBAAmB,GAAA,CAAI,iBAAA;AAAA,IACvB,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,OAAA;AAAA,IACA,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,QAAQ,GAAA,CAAI;AAAA,GACd;AACF;AAGO,SAAS,sBAAsB,KAAA,EAAsC;AAC1E,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,EAAE,CAAA;AAChE,EAAA,IAAI,GAAA,GAAM,CAAA;AAEV,EAAA,aAAA,CAAc,GAAA,EAAK,GAAA,EAAK,KAAA,CAAM,OAAA,KAAY,CAAC,CAAA;AAC3C,EAAA,GAAA,IAAO,CAAA;AAEP,EAAA,GAAA,CAAI,IAAI,mBAAA,CAAoB,KAAA,CAAM,iBAAA,EAAmB,mBAAmB,GAAG,GAAG,CAAA;AAC9E,EAAA,GAAA,IAAO,EAAA;AAEP,EAAA,GAAA,CAAI,IAAI,mBAAA,CAAoB,KAAA,CAAM,UAAA,EAAY,YAAY,GAAG,GAAG,CAAA;AAChE,EAAA,GAAA,IAAO,EAAA;AAEP,EAAA,aAAA,CAAc,GAAA,EAAK,GAAA,EAAK,KAAA,CAAM,IAAA,KAAS,CAAC,CAAA;AACxC,EAAA,GAAA,IAAO,CAAA;AAEP,EAAA,aAAA,CAAc,GAAA,EAAK,GAAA,EAAK,YAAA,CAAa,KAAA,CAAM,IAAI,CAAC,CAAA;AAChD,EAAA,GAAA,IAAO,CAAA;AAEP,EAAA,aAAA,CAAc,GAAA,EAAK,GAAA,EAAK,KAAA,CAAM,OAAO,CAAA;AACrC,EAAA,GAAA,IAAO,CAAA;AAEP,EAAA,aAAA,CAAc,GAAA,EAAK,GAAA,EAAK,KAAA,CAAM,UAAA,GAAa,KAAM,CAAA;AACjD,EAAA,GAAA,IAAO,CAAA;AAEP,EAAA,GAAA,CAAI,IAAI,mBAAA,CAAoB,KAAA,CAAM,MAAA,EAAQ,QAAQ,GAAG,GAAG,CAAA;AACxD,EAAA,GAAA,IAAO,EAAA;AAEP,EAAA,GAAA,CAAI,IAAI,mBAAA,CAAoB,KAAA,CAAM,MAAA,EAAQ,QAAQ,GAAG,GAAG,CAAA;AACxD,EAAA,GAAA,IAAO,EAAA;AAEP,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,wBAAwB,KAAA,EAAsC;AAC5E,EAAA,OAAO,MAAA,CAAO,qBAAA,CAAsB,KAAK,CAAC,CAAA;AAC5C;AAOO,SAAS,YAAY,KAAA,EAAsC;AAChE,EAAA,MAAM,UAAA,GAAa,wBAAwB,KAAK,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAGlC,EAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,EAAE,CAAA;AACjC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,UAAa,CAAC,CAAA,GAAI,QAAA,CAAS,EAAA,GAAK,CAAC,CAAA;AACzD,EAAA,OAAO,OAAA;AACT;AAMA,SAAS,mBAAA,CAAoB,KAAa,KAAA,EAA2B;AACnE,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,GAAA,EAAK,EAAA,EAAI,KAAK,CAAA;AAE5C,EAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,EAAE,CAAA;AACjC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,UAAa,CAAC,CAAA,GAAI,OAAA,CAAQ,EAAA,GAAK,CAAC,CAAA;AACxD,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,aAAA,CAAc,GAAA,EAAa,OAAA,EAAiB,KAAA,EAA2B;AAC9E,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,IAAK,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AACxE,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,OAAA,GAAU,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,OAAA,EAAU,KAAK,CAAA,WAAA,EAAc,OAAA,GAAU,CAAC,CAAA,YAAA,EAAe,OAAO,CAAA,aAAA,EAAgB,CAAA,CAAE,MAAM,CAAA;AAAA,KACxF;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,OAAO,CAAA;AAClC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAA;AACnD,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,KAAK,CAAA,sBAAA,EAAyB,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7D;AACA,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA;AAAA,EACX;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,aAAa,IAAA,EAAsB;AAG1C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA;AAC3E,EAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAClB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA;AAAA,EACtE;AACA,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,EAAE,CAAA;AACxB,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG;AACnB,IAAA,MAAM,IAAI,MAAM,CAAA,wBAAA,CAA0B,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,CAAA,KAAM,CAAA;AACf;AAEA,SAAS,aAAA,CAAc,GAAA,EAAiB,MAAA,EAAgB,KAAA,EAAqB;AAC3E,EAAA,GAAA,CAAI,MAAM,IAAI,KAAA,GAAQ,GAAA;AACtB,EAAA,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,KAAA,KAAU,CAAA,GAAK,GAAA;AACpC;AAEA,SAAS,aAAA,CAAc,GAAA,EAAiB,MAAA,EAAgB,KAAA,EAAqB;AAC3E,EAAA,GAAA,CAAI,MAAM,IAAI,KAAA,GAAQ,GAAA;AACtB,EAAA,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,KAAA,KAAU,CAAA,GAAK,GAAA;AAClC,EAAA,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,KAAA,KAAU,EAAA,GAAM,GAAA;AACnC,EAAA,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,KAAA,KAAU,EAAA,GAAM,GAAA;AACrC;AAEA,SAAS,aAAA,CAAc,GAAA,EAAiB,MAAA,EAAgB,KAAA,EAAqB;AAC3E,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,KAAA,GAAQ,WAAW,CAAA;AACrC,EAAA,MAAM,EAAA,GAAK,MAAA,CAAQ,KAAA,IAAS,GAAA,GAAO,WAAW,CAAA;AAC9C,EAAA,aAAA,CAAc,GAAA,EAAK,QAAQ,EAAE,CAAA;AAC7B,EAAA,aAAA,CAAc,GAAA,EAAK,MAAA,GAAS,CAAA,EAAG,EAAE,CAAA;AACnC;;;AC7KO,IAAM,WAAA,GAAc,UAAA;AAGpB,IAAM,YAAA,GAAe,oBAAA;AAErB,IAAM,YAAA,GAAe,oBAAA;AAErB,IAAM,YAAA,GAAe,oBAAA;AAErB,IAAM,YAAA,GAAe,oBAAA;AAGrB,IAAM,uBAAA,GAA0B,oBAAA;;;ACHvC,IAAM,WAAA,GAAc,OAAO,WAAW,CAAA;AAMtC,SAAS,SAAS,CAAA,EAAoB;AACpC,EAAA,IAAI,CAAA,GAAA,CAAK,CAAA,GAAI,WAAA,KAAgB,CAAA,IAAK,GAAA,CAAA;AAClC,EAAA,CAAA,GAAA,CAAK,CAAA,GAAI,gBAAgB,CAAA,IAAK,GAAA,CAAA;AAC9B,EAAA,IAAI,MAAA,GAAS,OAAO,CAAC,CAAA;AACrB,EAAA,IAAI,MAAA,IAAU,aAAa,MAAA,IAAU,WAAA;AACrC,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,GAAA,CAAI,GAAY,CAAA,EAAqB;AACnD,EAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,EAAA,OAAO,CAAA,IAAK,WAAA,GAAc,CAAA,GAAI,WAAA,GAAc,CAAA;AAC9C;AAqDO,SAAS,UAAA,CAAW,MAAkB,KAAA,EAAwB;AACnE,EAAA,IAAI,IAAA,CAAK,WAAW,EAAA,EAAI;AACtB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6CAAA,EAAgD,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAAA,EAC/E;AACA,EAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,CAAC,CAAA;AAChC,EAAAC,cAAAA,CAAc,OAAA,EAAS,CAAA,EAAG,KAAA,KAAU,CAAC,CAAA;AAErC,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,GAAA,EAAK,KAAA,EAAA,EAAS;AACxC,IAAA,MAAM,MAAA,GAASC,OAAO,MAAA,EAAO;AAC7B,IAAA,MAAA,CAAO,OAAO,IAAI,CAAA;AAClB,IAAA,MAAA,CAAO,OAAO,OAAO,CAAA;AACrB,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,CAAC,CAAA;AAChC,MAAAD,cAAAA,CAAc,OAAA,EAAS,CAAA,EAAG,KAAK,CAAA;AAC/B,MAAA,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA,IACvB;AACA,IAAA,MAAME,KAAAA,GAAO,OAAO,MAAA,EAAO;AAC3B,IAAA,MAAM,SAAA,GAAY,YAAA,CAAaA,KAAAA,EAAM,CAAC,CAAA,GAAI,WAAA;AAC1C,IAAA,IAAI,SAAA,GAAY,aAAa,OAAO,SAAA;AAAA,EACtC;AAGA,EAAA,MAAM,QAAA,GAAWD,OAAO,MAAA,EAAO;AAC/B,EAAA,QAAA,CAAS,OAAO,IAAI,CAAA;AACpB,EAAA,QAAA,CAAS,OAAO,OAAO,CAAA;AACvB,EAAA,QAAA,CAAS,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,iBAAiB,CAAC,CAAA;AAC3D,EAAA,MAAM,IAAA,GAAO,SAAS,MAAA,EAAO;AAC7B,EAAA,OAAO,YAAA,CAAa,IAAA,EAAM,CAAC,CAAA,GAAI,WAAA;AACjC;AASO,SAAS,GAAA,CAAI,CAAA,EAA4B,CAAA,EAA4B,GAAA,EAAsB;AAChG,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,IAAA,GAAA,IAAO,MAAA,CAAO,EAAE,CAAC,CAAE,IAAI,MAAA,CAAO,CAAA,CAAE,CAAC,CAAE,CAAA;AACnC,IAAA,IAAI,EAAE,YAAY,CAAA,EAAG;AACnB,MAAA,GAAA,GAAA,CAAO,GAAA,GAAM,gBAAgB,GAAA,IAAO,GAAA,CAAA;AACpC,MAAA,GAAA,GAAA,CAAO,GAAA,GAAM,gBAAgB,GAAA,IAAO,GAAA,CAAA;AACpC,MAAA,OAAA,GAAU,CAAA;AAAA,IACZ;AAAA,EACF;AACA,EAAA,OAAO,SAAS,GAAG,CAAA;AACrB;AAEA,SAASD,cAAAA,CAAc,GAAA,EAAiB,MAAA,EAAgB,KAAA,EAAqB;AAC3E,EAAA,GAAA,CAAI,MAAM,IAAI,KAAA,GAAQ,GAAA;AACtB,EAAA,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,KAAA,KAAU,CAAA,GAAK,GAAA;AAClC,EAAA,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,KAAA,KAAU,EAAA,GAAM,GAAA;AACnC,EAAA,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,KAAA,KAAU,EAAA,GAAM,GAAA;AACrC;AAEA,SAAS,YAAA,CAAa,KAAiB,MAAA,EAAwB;AAC7D,EAAA,OAAA,CACG,IAAI,MAAM,CAAA,GACR,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,IAAM,CAAA,GACpB,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,IAAM,EAAA,GACpB,IAAI,MAAA,GAAS,CAAC,KAAM,EAAA,MACvB,CAAA;AAEJ;;;AC1IO,SAAS,KAAA,CAAM,MAAc,IAAA,EAAsB;AACxD,EAAA,OAAO,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,IAAI,WAAA,CAAY,IAAA,GAAO,IAAI,CAAA,EAAE;AAC1D;AAkBO,SAAS,YAAA,CAAa,IAAA,EAAkB,IAAA,EAAc,IAAA,EAAsB;AACjF,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAC1B,EAAA,MAAM,QAAQ,IAAA,GAAO,IAAA;AACrB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,GAAI,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,CAAA;AACT;AAMO,SAAS,MAAA,CAAO,GAAW,CAAA,EAAmB;AACnD,EAAA,IAAI,EAAE,IAAA,KAAS,CAAA,CAAE,QAAQ,CAAA,CAAE,IAAA,KAAS,EAAE,IAAA,EAAM;AAC1C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,GAAA,EAAM,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAAA,EACpF;AACA,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAA,CAAE,IAAA,EAAM,EAAE,IAAI,CAAA;AAChC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,GAAI,GAAA,CAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAE,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,GAAA;AACT;AASO,SAAS,MAAA,CAAO,GAAW,CAAA,EAAmB;AACnD,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,IAAA,EAAM;AACrB,IAAA,MAAM,IAAI,MAAM,CAAA,kCAAA,EAAqC,CAAA,CAAE,IAAI,CAAA,QAAA,EAAW,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAAA,EAChF;AACA,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAA,CAAE,IAAA,EAAM,EAAE,IAAI,CAAA;AAChC,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA;AACrC,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA;AACrC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,CAAA,GAAI,CAAA,CAAE,OAAO,CAAC,CAAA;AAClE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,CAAA,GAAI,CAAA,CAAE,OAAO,CAAC,CAAA;AAClE,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,GAAI,CAAA,CAAE,IAAA,GAAO,CAAC,IAAI,GAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,CAAA,CAAE,IAAI,CAAA;AAAA,IAC5D;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AC3CO,SAAS,eAAA,CAAgB,WAAmB,OAAA,EAAiC;AAClF,EAAA,IAAI,OAAA,CAAQ,WAAW,EAAA,EAAI;AACzB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6CAAA,EAAgD,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,EAClF;AACA,EAAA,IAAI,SAAA,CAAU,WAAW,EAAA,EAAI;AAE3B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kDAAA,EAAqD,SAAA,CAAU,MAAM,CAAA,CAAE,CAAA;AAAA,EACzF;AACA,EAAA,MAAM,MAAA,GAASC,OAAO,MAAA,EAAO;AAC7B,EAAA,MAAA,CAAO,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,SAAS,CAAC,CAAA;AACjD,EAAA,MAAA,CAAO,OAAO,OAAO,CAAA;AACrB,EAAA,OAAO,OAAO,MAAA,EAAO;AACvB;AAaO,SAAS,QAAA,CAAS,OAAA,EAAqB,CAAA,EAAW,CAAA,EAAsB;AAC7E,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,YAAA,EAAc,OAAO,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,YAAA,EAAc,OAAO,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,YAAA,EAAc,OAAO,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,YAAA,EAAc,OAAO,CAAA;AACpD,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,YAAA,CAAa,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,IAC9B,GAAA,EAAK,YAAA,CAAa,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,IAC9B,GAAA,EAAK,YAAA,CAAa,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,IAC9B,GAAA,EAAK,YAAA,CAAa,MAAA,EAAQ,CAAA,EAAG,CAAC;AAAA,GAChC;AACF;AC5CA,SAAS,sBAAsB,OAAA,EAAiC;AAC9D,EAAA,MAAM,MAAA,GAASA,OAAO,MAAA,EAAO;AAC7B,EAAA,MAAA,CAAO,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,uBAAuB,CAAC,CAAA;AAC/D,EAAA,MAAA,CAAO,OAAO,OAAO,CAAA;AACrB,EAAA,OAAO,OAAO,MAAA,EAAO;AACvB;AAMO,SAAS,uBAAA,CAAwB,SAAqB,CAAA,EAAwB;AACnF,EAAA,IAAI,CAAA,IAAK,CAAA,EAAG,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAC3D,EAAA,MAAM,IAAA,GAAO,sBAAsB,OAAO,CAAA;AAC1C,EAAA,MAAM,MAAM,CAAA,GAAI,CAAA;AAChB,EAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY,GAAG,CAAA;AAC/B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,MAAS,CAAC,CAAA,GAAI,UAAA,CAAW,IAAA,EAAM,CAAC,CAAA;AACzD,EAAA,OAAO,GAAA;AACT;AAMO,SAAS,aAAA,CAAc,OAAoB,CAAA,EAAwB;AACxE,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ;AAC7B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,yCAAA,EAA4C,KAAA,CAAM,MAAM,CAAA,UAAA,EAAa,EAAE,MAAM,CAAA;AAAA,KAC/E;AAAA,EACF;AACA,EAAA,OAAO,GAAA,CAAS,KAAA,EAAO,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA;AACxC;AAUO,IAAM,mBAAN,MAAuB;AAAA,EACX,MAAA,GAASA,OAAO,MAAA,EAAO;AAAA,EACvB,WAAA;AAAA,EACA,CAAA;AAAA,EACA,GAAA,GAAM,IAAI,UAAA,CAAW,CAAC,CAAA;AAAA,EAEvC,WAAA,CAAY,SAAqB,CAAA,EAAW;AAC1C,IAAA,IAAA,CAAK,CAAA,GAAI,CAAA;AACT,IAAA,IAAA,CAAK,WAAA,GAAc,uBAAA,CAAwB,OAAA,EAAS,CAAC,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAA,CAAgB,EAAA,EAAY,EAAA,EAAY,IAAA,EAAc,MAAA,EAA2B;AAC/E,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,IAAA,CAAK,CAAA,GAAI,KAAK,CAAA,EAAG;AACrC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,oCAAoC,IAAA,CAAK,CAAA,GAAI,KAAK,CAAC,CAAA,eAAA,EAAkB,OAAO,MAAM,CAAA;AAAA,OACpF;AAAA,IACF;AACA,IAAA,MAAM,UAAA,GAAa,aAAA,CAAc,MAAA,EAAQ,IAAA,CAAK,WAAW,CAAA;AACzD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,UAAA,GAAa,GAAA;AAC3B,IAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAK,UAAA,KAAe,CAAA,GAAK,GAAA;AACnC,IAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAK,UAAA,KAAe,EAAA,GAAM,GAAA;AACpC,IAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAK,UAAA,KAAe,EAAA,GAAM,GAAA;AACpC,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,QAAA,GAAuB;AACrB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,EAAO;AACjC,IAAA,OAAOA,OAAO,KAAK,CAAA;AAAA,EACrB;AACF,CAAA;AAwBO,SAAS,eAAA,CACd,MAAA,EACA,MAAA,EACA,CAAA,EACA,OAAA,EACuB;AACvB,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,IAAA,KAAS,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,IAAA,KAAS,MAAA,CAAO,IAAA,EAAM;AAC7F,IAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,EAC1E;AACA,EAAA,IAAI,CAAA,KAAM,CAAA,IAAK,MAAA,CAAO,IAAA,GAAO,MAAM,CAAA,EAAG;AACpC,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AAEA,EAAA,MAAM,IAAI,MAAA,CAAO,IAAA;AACjB,EAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACzB,EAAA,MAAM,MAAA,GAAS,IAAI,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA;AAE9C,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,CAAA,GAAI,CAAC,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,CAAA,GAAI,CAAC,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,CAAA,GAAI,CAAC,CAAA;AAEpC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AACb,MAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,CAAA,EAAG,GAAA,EAAA,EAAO;AAChC,QAAA,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAM,CAAA;AACnC,QAAA,SAAA,CAAU,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,MAAM,CAAA;AACnC,QAAA,0BAAA,CAA2B,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,CAAC,CAAA;AACpD,QAAA,MAAA,CAAO,eAAA,CAAgB,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA;AAAA,MAC1C;AACA,MAAA,UAAA,CAAW,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,MAAM,CAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,cAAA,EAAgB,MAAA,CAAO,UAAS,EAAE;AACrD;AAOA,SAAS,SAAA,CAAU,CAAA,EAAW,EAAA,EAAY,EAAA,EAAY,GAAW,GAAA,EAAwB;AACvF,EAAA,MAAM,WAAW,EAAA,GAAK,CAAA;AACtB,EAAA,MAAM,WAAW,EAAA,GAAK,CAAA;AACtB,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,GAAA,GAAA,CAAO,QAAA,GAAW,CAAA,IAAK,MAAA,GAAS,QAAA;AACtC,IAAA,MAAM,MAAM,CAAA,GAAI,CAAA;AAChB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,GAAA,CAAI,MAAM,CAAC,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IAC/B;AAAA,EACF;AACF;AAGA,SAAS,UAAA,CAAW,CAAA,EAAW,EAAA,EAAY,EAAA,EAAY,GAAW,KAAA,EAA0B;AAC1F,EAAA,MAAM,WAAW,EAAA,GAAK,CAAA;AACtB,EAAA,MAAM,WAAW,EAAA,GAAK,CAAA;AACtB,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,GAAA,GAAA,CAAO,QAAA,GAAW,CAAA,IAAK,MAAA,GAAS,QAAA;AACtC,IAAA,MAAM,MAAM,CAAA,GAAI,CAAA;AAChB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,CAAA,CAAE,KAAK,GAAA,GAAM,CAAC,CAAA,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,IACjC;AAAA,EACF;AACF;AAOA,SAAS,0BAAA,CACP,CAAA,EACA,KAAA,EACA,CAAA,EACA,CAAA,EACM;AAIN,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,CAAC,CAAA;AAChC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK,MAAA,CAAO,CAAC,CAAA,GAAI,KAAA,CAAM,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AACvD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,WAAW,CAAA,GAAI,CAAA;AAErB,MAAA,IAAI,GAAA,GAAM,EAAA;AACV,MAAA,IAAI,OAAA,GAAU,CAAA;AACd,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,QAAA,GAAA,IAAO,MAAA,CAAO,EAAE,QAAA,GAAW,CAAC,CAAE,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAE,CAAA;AACnD,QAAA,IAAI,EAAE,YAAY,CAAA,EAAG;AACnB,UAAA,GAAA,GAAA,CAAO,GAAA,GAAM,YAAY,GAAA,IAAO,GAAA,CAAA;AAChC,UAAA,GAAA,GAAA,CAAO,GAAA,GAAM,YAAY,GAAA,IAAO,GAAA,CAAA;AAChC,UAAA,OAAA,GAAU,CAAA;AAAA,QACZ;AAAA,MACF;AAEA,MAAA,GAAA,GAAA,CAAO,GAAA,GAAM,YAAY,GAAA,IAAO,GAAA,CAAA;AAChC,MAAA,GAAA,GAAA,CAAO,GAAA,GAAM,YAAY,GAAA,IAAO,GAAA,CAAA;AAChC,MAAA,IAAI,MAAA,GAAS,OAAO,GAAG,CAAA;AACvB,MAAA,IAAI,MAAA,IAAU,SAAS,MAAA,IAAU,OAAA;AACjC,MAAA,CAAA,CAAE,QAAA,GAAW,CAAC,CAAA,GAAI,GAAA,CAAS,EAAE,QAAA,GAAW,CAAC,GAAI,MAAM,CAAA;AAAA,IACrD;AAAA,EACF;AACF;AAEA,IAAM,OAAA,GAAU,UAAA;AAChB,IAAM,OAAA,GAAU,WAAA;;;ACxNhB,IAAM,OAAA,GAAA,CAAW,MAAM,GAAA,IAAO,EAAA;AAyBvB,SAAS,OAAA,CAAQ,SAAA,EAAsB,OAAA,GAA0B,EAAC,EAAwB;AAC/F,EAAA,MAAM,UAAU,SAAA,CAAU,SAAA;AAC1B,EAAA,MAAM,MAAM,OAAA,CAAQ,cAAA;AACpB,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,MAAA;AAE5B,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,GAAA;AACrC,EAAA,MAAM,aAAa,OAAA,CAAQ,UAAA,IAAc,MAAA,CAAO,GAAA,CAAI,iBAAiB,CAAC,CAAA;AACtE,EAAA,MAAM,eAAA,GAAkB,QAAQ,eAAA,IAAmB,CAAA;AAEnD,EAAA,IAAI,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,KAAK,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,MAAM,CAAA,kCAAA,EAAqC,CAAC,OAAO,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3E;AACA,EAAA,IAAI,CAAA,GAAI,MAAM,CAAA,EAAG;AACf,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,CAAC,CAAA,oBAAA,EAAuB,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3D;AAGA,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,CAAQ,MAAA,CAAO,QAAQ,QAAQ,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,CAAQ,MAAA,CAAO,QAAQ,QAAQ,CAAA;AACxD,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,OAAA,CAAQ,MAAA,EAAQ,QAAQ,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,gBAAgB,QAAQ,CAAA;AAG5C,EAAA,MAAM,CAAA,GAAI,YAAA,CAAa,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AAClC,EAAA,MAAM,CAAA,GAAI,YAAA,CAAa,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AAElC,EAAA,IAAI,QAAQ,UAAA,GAAa,OAAA;AACzB,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,QAAA,EAAU,OAAA,EAAA,EAAW;AACnD,IAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,OAAA,GAAU,eAAA,KAAoB,CAAA,EAAG;AACxD,MAAA,OAAA,CAAQ,SAAA,CAAU,SAAS,KAAK,CAAA;AAAA,IAClC;AAEA,IAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,GAAA,EAAK,KAAK,CAAA;AAClD,IAAA,MAAM,OAAA,GAAU,YAAY,WAAW,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAc,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AAEzC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,MAAM,GAAG,CAAA;AACrC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,MAAM,GAAG,CAAA;AACrC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAC1B,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAE1B,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,MAAA,EAAQ,MAAA,EAAQ,GAAG,OAAO,CAAA;AACzD,IAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,MAAA,CAAO,cAAc,CAAA;AACzD,IAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,MAAA,MAAM,cAAc,KAAA,CAAM,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,IAAI,GAAG,CAAA;AACvD,MAAA,MAAM,UAAA,GAAa,cAAA,CAAe,MAAA,CAAO,cAAc,CAAA;AACvD,MAAA,OAAO;AAAA,QACL,WAAA;AAAA,QACA,UAAA;AAAA;AAAA;AAAA,QAGA,KAAA,EAAO,EAAE,SAAA,EAAW,WAAA,EAAa,UAAA;AAAW,OAC9C;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,KAAU,SAAS,OAAO,IAAA;AAC9B,IAAA,KAAA,GAAS,QAAQ,EAAA,GAAM,OAAA;AAAA,EACzB;AAEA,EAAA,OAAO,IAAA;AACT;AAMA,SAAS,UAAA,CAAW,KAAa,KAAA,EAA2B;AAC1D,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,IAAK,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AACxE,EAAA,IAAI,CAAA,CAAE,WAAW,EAAA,EAAI;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,KAAK,CAAA,6BAAA,EAAgC,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA;AAAA,EAC5E;AACA,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,EAAE,CAAA;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAA;AACnD,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,KAAK,CAAA,sBAAA,EAAyB,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9D;AACA,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA;AAAA,EACX;AACA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,gBAAgB,KAAA,EAA2B;AAClD,EAAA,IAAI,CAAA,GAAI,EAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,CAAA,GAAK,CAAA,IAAK,EAAA,GAAM,MAAA,CAAO,KAAA,CAAM,CAAC,CAAE,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,CAAA;AACT;AAGA,SAAS,gBAAgB,KAAA,EAA2B;AAClD,EAAA,IAAI,CAAA,GAAI,EAAA;AACR,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,CAAA,GAAK,CAAA,IAAK,EAAA,GAAM,MAAA,CAAO,KAAA,CAAM,CAAC,CAAE,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,CAAA;AACT;AAGA,SAAS,eAAe,KAAA,EAA2B;AACjD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAG,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB;;;ACjFO,IAAM,SAAN,MAAa;AAAA,EAClB,aAAa,KAAA,CAAM,SAAA,EAAsB,IAAA,GAAsB,EAAC,EAA0B;AACxF,IAAA,MAAM,IAAA,GAAmB,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,YAAY,KAAA,GAAQ,SAAA,CAAA;AAEhE,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,KAAA;AACH,QAAA,OAAO,WAAA,CAAY,WAAW,IAAI,CAAA;AAAA,MACpC,KAAK,SAAA;AACH,QAAA,OAAO,cAAA,CAAe,WAAW,IAAI,CAAA;AAAA,MACvC,KAAK,MAAA;AACH,QAAA,IAAI,IAAA,CAAK,SAAA,EAAW,OAAO,WAAA,CAAY,WAAW,IAAI,CAAA;AACtD,QAAA,OAAO,cAAA,CAAe,WAAW,IAAI,CAAA;AAAA,MACvC,SAAS;AAEP,QAAA,MAAM,WAAA,GAAqB,IAAA;AAC3B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,WAAqB,CAAA,CAAA,CAAG,CAAA;AAAA,MACzE;AAAA;AACF,EACF;AACF;AAEA,eAAe,WAAA,CAAY,WAAsB,IAAA,EAA4C;AAC3F,EAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AACA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,SAAS,CAAA;AACvC;AAEA,eAAe,cAAA,CAAe,WAAsB,IAAA,EAA4C;AAC9F,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,MAAM,CAAA;AAC7C,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,EAAQ,QAAA,IAAY,GAAA;AACvC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,mDAAmD,KAAK,CAAA,gGAAA;AAAA,KAE1D;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["/**\n * Type definitions mirroring the BTX service-challenges RPC schema.\n *\n * Source: btx.dev/docs/rpc/service-challenges (verified 2026-05-20).\n * Schema captured against live btxd v0.29.7 at btx-iowa (block 106270).\n *\n * IMPORTANT: We do NOT camelCase rename — the RPC schema is the wire contract.\n * Field names mirror btxd output verbatim.\n */\n\n/** Difficulty calibration policy for issued challenges. */\nexport type DifficultyPolicy = 'fixed' | 'adaptive_window';\n\n/**\n * Standard purpose labels recognized by the chain. Free-form strings allowed too.\n *\n * The `(string & {})` trick keeps autocomplete on the known labels while still\n * accepting arbitrary purpose strings. Don't \"simplify\" to plain `string` — it\n * loses the autocompletion benefit. See: https://github.com/microsoft/TypeScript/issues/29729\n */\nexport type ChallengePurpose = 'rate_limit' | 'api_gate' | 'ai_inference_gate' | (string & {});\n\n/** Parameters for issuing a challenge via getmatmulservicechallenge. */\nexport interface IssueParams {\n purpose: ChallengePurpose;\n resource: string;\n subject: string;\n /** Calibrates client compute work to roughly this many seconds. btxd default: 1.0. */\n target_solve_time_s?: number;\n /** Challenge lifetime in seconds. btxd default: 300. Range 1–86400. */\n expires_in_s?: number;\n validation_overhead_s?: number;\n propagation_overhead_s?: number;\n /** btxd default: \"fixed\". */\n difficulty_policy?: DifficultyPolicy;\n difficulty_window_blocks?: number;\n min_solve_time_s?: number;\n max_solve_time_s?: number;\n solver_parallelism?: number;\n solver_duty_cycle_pct?: number;\n}\n\n/**\n * Binding identifies the (purpose, resource, subject) trio the challenge is\n * scoped to. btxd also embeds hashes + anchor info for replay protection.\n */\nexport interface ChallengeBinding {\n chain: string;\n purpose: string;\n resource: string;\n subject: string;\n resource_hash: string;\n subject_hash: string;\n salt: string;\n anchor_height: number;\n anchor_hash: string;\n /** Hashing rule used to compute challenge_id. Treat as opaque docstring from btxd. */\n challenge_id_rule?: string;\n seed_derivation_rule?: string;\n /** Open extension — btxd may add fields without breaking us. */\n [k: string]: unknown;\n}\n\n/**\n * Proof policy describes what btxd will check when redeeming. Treat fields\n * as authoritative — do NOT re-derive verification rules client-side.\n */\nexport interface ChallengeProofPolicy {\n verification_rule: string;\n sigma_gate_applied: boolean;\n expiration_enforced: boolean;\n challenge_id_required: boolean;\n replay_protection: string;\n redeem_rpc: string;\n solve_rpc: string;\n locally_issued_required: boolean;\n issued_challenge_store?: string;\n issued_challenge_scope?: string;\n [k: string]: unknown;\n}\n\n/** MatMul parameters needed to solve. Day 2 solver consumes these. */\nexport interface ChallengeMatmul {\n /** Matrix dimension. btxd ships n=512 in production. */\n n: number;\n /** Block dimension for compression. */\n b: number;\n /** Noise rank. */\n r: number;\n /** Field modulus (Mersenne prime 2^31-1). */\n q: number;\n min_dimension: number;\n max_dimension: number;\n /** Hex-encoded seed for matrix A. */\n seed_a: string;\n /** Hex-encoded seed for matrix B. */\n seed_b: string;\n}\n\n/** Block header context the challenge is anchored to. */\nexport interface ChallengeHeaderContext {\n version: number;\n previousblockhash: string;\n merkleroot: string;\n time: number;\n bits: string;\n nonce64_start: number;\n matmul_dim: number;\n seed_a: string;\n seed_b: string;\n}\n\n/**\n * Inner challenge payload — what the solver actually needs.\n * The Day 2 MatMul solver reads `matmul`, `target`, `noncerange`, and `header_context`.\n */\nexport interface ChallengePayload {\n chain: string;\n algorithm: string;\n height: number;\n previousblockhash: string;\n mintime: number;\n bits: string;\n difficulty: number;\n /** Hex-encoded target. Digest must compare ≤ target for valid proof. */\n target: string;\n noncerange: string;\n header_context: ChallengeHeaderContext;\n matmul: ChallengeMatmul;\n /** btxd ships additional fields (work_profile, runtime_observability, etc.) we treat as opaque. */\n [k: string]: unknown;\n}\n\n/**\n * The challenge envelope returned by getmatmulservicechallenge.\n * Opaque to the SDK at the wire boundary — pass through to solver / redeem.\n */\nexport interface Challenge {\n /** btxd schema kind discriminator (e.g. \"matmul_service_challenge_v1\"). */\n kind?: string;\n challenge_id: string;\n issued_at: number;\n expires_at: number;\n expires_in_s: number;\n binding: ChallengeBinding;\n proof_policy: ChallengeProofPolicy;\n challenge: ChallengePayload;\n /** Open extension. */\n [k: string]: unknown;\n}\n\n/** Reasons returned by verify/redeem. Open string — btxd may add more. */\nexport type VerifyReason =\n | 'ok'\n | 'invalid_proof'\n | 'challenge_mismatch'\n | 'expired'\n | 'unknown_challenge'\n | 'already_redeemed'\n | 'missing_proof'\n | (string & {});\n\n/** Outcome of verifymatmulserviceproof / redeemmatmulserviceproof. */\nexport interface VerifyResult {\n valid: boolean;\n expired?: boolean;\n reason: VerifyReason;\n issued_by_local_node?: boolean;\n redeemed?: boolean;\n redeemable?: boolean;\n mismatch_field?: string;\n}\n\n/** Single entry in a batch redeem/verify call. */\nexport interface BatchEntry {\n challenge: Challenge;\n nonce64_hex: string;\n digest_hex: string;\n}\n\n/** Batch response — sequential per-proof results. */\nexport interface BatchResult {\n count: number;\n valid: number;\n invalid: number;\n by_reason: Record<string, number>;\n results: VerifyResult[];\n}\n\n/** Solver output (also returned by solvematmulservicechallenge RPC). */\nexport interface SolverOutput {\n nonce64_hex: string;\n digest_hex: string;\n proof: Record<string, unknown>;\n}\n\n/** RPC client configuration. */\nexport interface BtxClientOpts {\n /**\n * Full JSON-RPC endpoint, e.g. `http://127.0.0.1:19332`.\n *\n * **Security**: use HTTPS (or a localhost-only deployment) when the RPC\n * endpoint is not on `127.0.0.1`. Basic auth over plaintext exposes credentials.\n * Terminate TLS at stunnel/nginx/Caddy in front of btxd; do NOT expose\n * btxd's RPC port directly to the public internet.\n */\n rpcUrl: string;\n /** Basic-auth credentials matching btxd's rpcauth / rpcuser+rpcpassword. */\n rpcAuth: {\n user: string;\n pass: string;\n };\n /** Request timeout in ms (default 30000). */\n timeoutMs?: number;\n}\n\n// ============================================================================\n// Error taxonomy\n// ============================================================================\n\n/** Base class — all SDK errors extend this for `instanceof BtxError` checks. */\nexport class BtxError extends Error {\n constructor(\n message: string,\n public readonly method?: string,\n ) {\n super(message);\n this.name = 'BtxError';\n }\n}\n\n/** btxd returned a JSON-RPC error envelope with code + message. */\nexport class BtxRpcError extends BtxError {\n constructor(\n public readonly code: number,\n message: string,\n method?: string,\n ) {\n super(message, method);\n this.name = 'BtxRpcError';\n }\n}\n\n/** btxd returned a non-2xx HTTP status. */\nexport class BtxHttpError extends BtxError {\n constructor(\n public readonly status: number,\n /** Response body, with `Authorization: Basic ...` patterns redacted. */\n public readonly body: string,\n method?: string,\n ) {\n super(`HTTP ${status}: ${body.slice(0, 200)}`, method);\n this.name = 'BtxHttpError';\n }\n}\n\n/** The HTTP response was 2xx but the body wasn't valid JSON. */\nexport class BtxParseError extends BtxError {\n constructor(\n /** Underlying SyntaxError or similar. Overrides the ES2022 `Error.cause` slot. */\n public override readonly cause: unknown,\n /** Raw response body (redacted). */\n public readonly body: string,\n method?: string,\n ) {\n const causeMsg = cause instanceof Error ? cause.message : String(cause);\n super(`Failed to parse RPC response: ${causeMsg}`, method);\n this.name = 'BtxParseError';\n }\n}\n\n/** Request exceeded `timeoutMs`. */\nexport class BtxTimeoutError extends BtxError {\n constructor(\n public readonly timeoutMs: number,\n method?: string,\n ) {\n super(`RPC request timed out after ${timeoutMs}ms`, method);\n this.name = 'BtxTimeoutError';\n }\n}\n\n/** Transport-level failure (DNS, TCP reset, TLS, etc.). Wraps the underlying cause. */\nexport class BtxNetworkError extends BtxError {\n constructor(\n /** Underlying error from fetch / dns / tls. Overrides the ES2022 `Error.cause` slot. */\n public override readonly cause: unknown,\n method?: string,\n ) {\n const causeMsg = cause instanceof Error ? cause.message : String(cause);\n super(`RPC network error: ${causeMsg}`, method);\n this.name = 'BtxNetworkError';\n }\n}\n","import {\n BtxHttpError,\n BtxNetworkError,\n BtxParseError,\n BtxRpcError,\n BtxTimeoutError,\n type BatchEntry,\n type BatchResult,\n type BtxClientOpts,\n type Challenge,\n type IssueParams,\n type SolverOutput,\n type VerifyResult,\n} from './types.js';\n\ninterface JsonRpcResponse<T> {\n result: T;\n error: { code: number; message: string } | null;\n id: number | string;\n}\n\n/**\n * Universal UTF-8-safe base64 encoder.\n * Both Node 18.17+ and browsers expose `globalThis.crypto`, but `btoa()`\n * throws on any code point > 0xFF — so we route via TextEncoder for non-ASCII safety.\n * Per audit finding C1.\n */\nfunction base64Utf8(input: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(input, 'utf8').toString('base64');\n }\n // Browser fallback: encode UTF-8 manually so btoa() only sees byte-clean Latin1.\n const bytes = new TextEncoder().encode(input);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i] as number);\n }\n return btoa(binary);\n}\n\n/**\n * Redact sensitive header + credential patterns from error response bodies\n * before storing them on `BtxHttpError.body` (which callers commonly log).\n *\n * Covers:\n * - Authorization header echoes from proxies / debug endpoints (H2)\n * - JSON `\"password\"` / `\"rpcpassword\"` fields\n * - Config-line `rpcuser=...` / `rpcpassword=...` from btxd's loadincludeconf\n * error paths (re-audit N2 — added 2026-05-20)\n */\nfunction redactSensitive(body: string): string {\n return body\n .replace(/authorization\\s*:\\s*basic\\s+[A-Za-z0-9+/=]+/gi, 'authorization: basic [REDACTED]')\n .replace(/\"password\"\\s*:\\s*\"[^\"]*\"/gi, '\"password\":\"[REDACTED]\"')\n .replace(/\"rpcpassword\"\\s*:\\s*\"[^\"]*\"/gi, '\"rpcpassword\":\"[REDACTED]\"')\n .replace(/\\b(rpc(?:user|password|auth))\\s*=\\s*\\S+/gi, '$1=[REDACTED]');\n}\n\n/** Generate a stable-uniqueness request id without colliding across instances. */\nfunction nextRequestId(): string {\n // Both Node 18.17+ and modern browsers expose globalThis.crypto.randomUUID.\n const c = globalThis.crypto;\n if (c && typeof c.randomUUID === 'function') return c.randomUUID();\n // Last-resort fallback. NOT a security context — this id is sent as the\n // JSON-RPC `id` field, echoed by btxd, and used only for client-side\n // response correlation. `Math.random` is appropriate here (uniqueness, not\n // unpredictability). btxd doesn't authenticate against this value.\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * JSON-RPC client for BTX service-challenges.\n *\n * Wraps the 5 core RPCs:\n * - getmatmulservicechallenge (issue)\n * - verifymatmulserviceproof (verify, stateless)\n * - redeemmatmulserviceproof (verify + consume, anti-replay)\n * - verifymatmulserviceproofs (batch verify)\n * - redeemmatmulserviceproofs (batch redeem)\n *\n * Plus helper RPCs:\n * - solvematmulservicechallenge (server-side solver — for fixtures + tests)\n *\n * RPC reference: https://btx.dev/docs/rpc/service-challenges\n *\n * Error model:\n * - {@link BtxRpcError} — btxd returned a JSON-RPC error envelope\n * - {@link BtxHttpError} — non-2xx HTTP status\n * - {@link BtxParseError} — 2xx but body wasn't valid JSON\n * - {@link BtxTimeoutError} — request exceeded `timeoutMs`\n * - {@link BtxNetworkError} — DNS / TCP / TLS-level failure\n * - All extend {@link BtxError}.\n */\nexport class BtxChallengeClient {\n constructor(private readonly opts: BtxClientOpts) {}\n\n /** Low-level: raw JSON-RPC call. Exposed for forward compatibility. */\n async call<T = unknown>(method: string, params: unknown[] = []): Promise<T> {\n const id = nextRequestId();\n const auth = 'Basic ' + base64Utf8(`${this.opts.rpcAuth.user}:${this.opts.rpcAuth.pass}`);\n // JSON-RPC \"1.0\" is correct for Bitcoin-family btxd (NOT 2.0 as Ethereum-style uses).\n // See btxd src/rpc/server.cpp + httprpc.cpp. Do not \"fix\" to 2.0 — btxd will reject.\n const body = JSON.stringify({ jsonrpc: '1.0', id, method, params });\n\n const ctrl = new AbortController();\n const timeoutMs = this.opts.timeoutMs ?? 30_000;\n const timer = setTimeout(() => ctrl.abort(), timeoutMs);\n\n let res: Response;\n try {\n res = await fetch(this.opts.rpcUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: auth,\n },\n body,\n signal: ctrl.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n // AbortError on timeout vs everything else (DNS, TCP reset, TLS, etc.)\n if (err instanceof Error && err.name === 'AbortError') {\n throw new BtxTimeoutError(timeoutMs, method);\n }\n throw new BtxNetworkError(err, method);\n } finally {\n clearTimeout(timer);\n }\n\n if (!res.ok) {\n const rawBody = await res.text().catch(() => '');\n throw new BtxHttpError(res.status, redactSensitive(rawBody), method);\n }\n\n const rawBody = await res.text();\n let data: JsonRpcResponse<T>;\n try {\n data = JSON.parse(rawBody) as JsonRpcResponse<T>;\n } catch (err) {\n throw new BtxParseError(err, redactSensitive(rawBody), method);\n }\n\n if (data.error) {\n throw new BtxRpcError(data.error.code, data.error.message, method);\n }\n return data.result;\n }\n\n /** Issue a fresh challenge bound to (purpose, resource, subject). */\n async issue(params: IssueParams): Promise<Challenge> {\n // Per audit M3: do NOT hardcode btxd defaults. Truncate positional args at\n // the last explicitly-set value so btxd applies its own defaults for omitted ones.\n const ordered: Array<[string, unknown]> = [\n ['purpose', params.purpose],\n ['resource', params.resource],\n ['subject', params.subject],\n ['target_solve_time_s', params.target_solve_time_s],\n ['expires_in_s', params.expires_in_s],\n ['validation_overhead_s', params.validation_overhead_s],\n ['propagation_overhead_s', params.propagation_overhead_s],\n ['difficulty_policy', params.difficulty_policy],\n ['difficulty_window_blocks', params.difficulty_window_blocks],\n ['min_solve_time_s', params.min_solve_time_s],\n ['max_solve_time_s', params.max_solve_time_s],\n ['solver_parallelism', params.solver_parallelism],\n ['solver_duty_cycle_pct', params.solver_duty_cycle_pct],\n ];\n let lastSet = 2; // purpose, resource, subject are required\n for (let i = ordered.length - 1; i > 2; i--) {\n if (ordered[i]![1] !== undefined) {\n lastSet = i;\n break;\n }\n }\n const args = ordered.slice(0, lastSet + 1).map(([, v]) => v);\n return this.call<Challenge>('getmatmulservicechallenge', args);\n }\n\n /**\n * Verify a proof statelessly. Does NOT consume the challenge.\n * Use this for diagnostic / monitoring paths.\n * For admission control, use {@link redeem} instead — verification alone\n * does not prevent replay.\n */\n async verify(\n challenge: Challenge,\n nonce64_hex: string,\n digest_hex: string,\n lookup_local_status = true,\n ): Promise<VerifyResult> {\n return this.call<VerifyResult>('verifymatmulserviceproof', [\n challenge,\n nonce64_hex,\n digest_hex,\n lookup_local_status,\n ]);\n }\n\n /**\n * Verify-and-consume atomically. THIS is the admission control entry point.\n * On success, the challenge is marked redeemed and cannot be replayed.\n */\n async redeem(\n challenge: Challenge,\n nonce64_hex: string,\n digest_hex: string,\n ): Promise<VerifyResult> {\n return this.call<VerifyResult>('redeemmatmulserviceproof', [\n challenge,\n nonce64_hex,\n digest_hex,\n ]);\n }\n\n /** Batch verify. Spec range 1–256 (audit M2). No consumption. */\n async verifyBatch(entries: BatchEntry[]): Promise<BatchResult> {\n this.assertBatchSize(entries);\n return this.call<BatchResult>('verifymatmulserviceproofs', [entries]);\n }\n\n /** Batch verify + consume. Sequential per-entry. Spec range 1–256 (audit M2). */\n async redeemBatch(entries: BatchEntry[]): Promise<BatchResult> {\n this.assertBatchSize(entries);\n return this.call<BatchResult>('redeemmatmulserviceproofs', [entries]);\n }\n\n /**\n * Server-side local solver. Useful when generating fixtures or pre-computing\n * for tests. For production browser-side solving, ship the WASM solver —\n * RPC-based solving puts compute load on YOUR node, defeating the point.\n */\n async solve(challenge: Challenge): Promise<SolverOutput> {\n return this.call<SolverOutput>('solvematmulservicechallenge', [challenge]);\n }\n\n private assertBatchSize(entries: BatchEntry[]): void {\n if (entries.length < 1 || entries.length > 256) {\n throw new RangeError(\n `Batch size must be between 1 and 256 (per BTX RPC spec), got ${entries.length}`,\n );\n }\n }\n}\n","/**\n * Serialize a `PowState`-equivalent block header to the bytes that\n * `ComputeMatMulHeaderHash` then `DeriveSigma` (btxd) hash.\n *\n * Ported from `btxd v0.29.7 src/matmul/matmul_pow.cpp` lines 215-274.\n *\n * Wire format (150 bytes total, all integer fields little-endian):\n * - LE32 version\n * - 32 bytes previousblockhash (uint256 LE *storage* — i.e. reverse of display hex)\n * - 32 bytes merkleroot (uint256 LE storage)\n * - LE32 time\n * - LE32 bits\n * - LE64 nonce64\n * - LE16 matmul_dim\n * - 32 bytes seed_a (uint256 LE storage)\n * - 32 bytes seed_b (uint256 LE storage)\n *\n * Byte-order convention (this module + everything downstream):\n * - All hex strings are interpreted as **display/big-endian** (Bitcoin Core's\n * `uint256::ToString()` convention — first hex pair = most-significant byte).\n * - In-memory `Uint8Array` seeds/sigmas are kept in display/BE order too.\n * - This module reverses hex-parsed bytes back to LE storage for the header\n * serialization, and reverses the final SHA-256 output back to BE so the\n * sigma can flow into `fromOracle` (which expects BE) without further\n * transformation. Net effect: byte-for-byte equivalent to btxd's behavior.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport type { ChallengeHeaderContext } from '../types.js';\n\n/** Header fields the matmul header hash binds to. */\nexport interface MatMulHeaderInput {\n version: number;\n previousblockhash: string;\n merkleroot: string;\n time: number;\n /** Encoded as a hex string in btxd's header_context (e.g. `\"1d00ffff\"`). */\n bits: string;\n /** 64-bit nonce; pass as `bigint` to preserve full range. */\n nonce64: bigint;\n matmul_dim: number;\n seed_a: string;\n seed_b: string;\n}\n\n/**\n * Build a `MatMulHeaderInput` from a challenge envelope + the candidate nonce.\n * Reusing the existing `ChallengeHeaderContext` shape avoids a parallel struct.\n */\nexport function headerInputForNonce(\n ctx: ChallengeHeaderContext,\n nonce64: bigint,\n): MatMulHeaderInput {\n return {\n version: ctx.version,\n previousblockhash: ctx.previousblockhash,\n merkleroot: ctx.merkleroot,\n time: ctx.time,\n bits: ctx.bits,\n nonce64,\n matmul_dim: ctx.matmul_dim,\n seed_a: ctx.seed_a,\n seed_b: ctx.seed_b,\n };\n}\n\n/** Serialize the 150-byte header buffer that `ComputeMatMulHeaderHash` hashes. */\nexport function serializeMatMulHeader(input: MatMulHeaderInput): Uint8Array {\n const buf = new Uint8Array(4 + 32 + 32 + 4 + 4 + 8 + 2 + 32 + 32);\n let off = 0;\n\n writeUint32LE(buf, off, input.version >>> 0);\n off += 4;\n\n buf.set(parseUint256HexToLE(input.previousblockhash, 'previousblockhash'), off);\n off += 32;\n\n buf.set(parseUint256HexToLE(input.merkleroot, 'merkleroot'), off);\n off += 32;\n\n writeUint32LE(buf, off, input.time >>> 0);\n off += 4;\n\n writeUint32LE(buf, off, parseBitsHex(input.bits));\n off += 4;\n\n writeUint64LE(buf, off, input.nonce64);\n off += 8;\n\n writeUint16LE(buf, off, input.matmul_dim & 0xffff);\n off += 2;\n\n buf.set(parseUint256HexToLE(input.seed_a, 'seed_a'), off);\n off += 32;\n\n buf.set(parseUint256HexToLE(input.seed_b, 'seed_b'), off);\n off += 32;\n\n return buf;\n}\n\n/** Equivalent of btxd's `ComputeMatMulHeaderHash`. Returns 32 raw SHA-256 bytes. */\nexport function computeMatMulHeaderHash(input: MatMulHeaderInput): Uint8Array {\n return sha256(serializeMatMulHeader(input));\n}\n\n/**\n * Equivalent of btxd's `DeriveSigma`. Returns a 32-byte sigma in **display/BE\n * order** so it can flow directly into {@link fromOracle} and the transcript\n * compression vector.\n */\nexport function deriveSigma(input: MatMulHeaderInput): Uint8Array {\n const headerHash = computeMatMulHeaderHash(input);\n const sigmaRaw = sha256(headerHash);\n // sigmaRaw is \"LE storage\" per btxd's uint256 view; reverse to BE for\n // downstream consumers that operate on display-order seeds.\n const sigmaBE = new Uint8Array(32);\n for (let i = 0; i < 32; i++) sigmaBE[i] = sigmaRaw[31 - i]!;\n return sigmaBE;\n}\n\n// ----------------------------------------------------------------------------\n// internal helpers\n// ----------------------------------------------------------------------------\n\nfunction parseUint256HexToLE(hex: string, field: string): Uint8Array {\n const beBytes = parseHexFixed(hex, 32, field);\n // Reverse: BE display → LE storage.\n const leBytes = new Uint8Array(32);\n for (let i = 0; i < 32; i++) leBytes[i] = beBytes[31 - i]!;\n return leBytes;\n}\n\nfunction parseHexFixed(hex: string, byteLen: number, field: string): Uint8Array {\n const h = hex.startsWith('0x') || hex.startsWith('0X') ? hex.slice(2) : hex;\n if (h.length !== byteLen * 2) {\n throw new Error(\n `header.${field}: expected ${byteLen * 2} hex chars (${byteLen} bytes), got ${h.length}`,\n );\n }\n const out = new Uint8Array(byteLen);\n for (let i = 0; i < byteLen; i++) {\n const byte = parseInt(h.slice(i * 2, i * 2 + 2), 16);\n if (Number.isNaN(byte)) {\n throw new Error(`header.${field}: invalid hex at byte ${i}`);\n }\n out[i] = byte;\n }\n return out;\n}\n\nfunction parseBitsHex(bits: string): number {\n // btxd serializes bits as a 4-byte big-endian hex string (matching getblockheader).\n // Parse, then write LE in serializeMatMulHeader.\n const h = bits.startsWith('0x') || bits.startsWith('0X') ? bits.slice(2) : bits;\n if (h.length !== 8) {\n throw new Error(`header.bits: expected 8 hex chars, got ${h.length}`);\n }\n const n = parseInt(h, 16);\n if (Number.isNaN(n)) {\n throw new Error(`header.bits: invalid hex`);\n }\n return n >>> 0;\n}\n\nfunction writeUint16LE(buf: Uint8Array, offset: number, value: number): void {\n buf[offset] = value & 0xff;\n buf[offset + 1] = (value >>> 8) & 0xff;\n}\n\nfunction writeUint32LE(buf: Uint8Array, offset: number, value: number): void {\n buf[offset] = value & 0xff;\n buf[offset + 1] = (value >>> 8) & 0xff;\n buf[offset + 2] = (value >>> 16) & 0xff;\n buf[offset + 3] = (value >>> 24) & 0xff;\n}\n\nfunction writeUint64LE(buf: Uint8Array, offset: number, value: bigint): void {\n const lo = Number(value & 0xffffffffn);\n const hi = Number((value >> 32n) & 0xffffffffn);\n writeUint32LE(buf, offset, lo);\n writeUint32LE(buf, offset + 4, hi);\n}\n","/**\n * Magic numbers + domain tags from `btxd v0.29.7 src/matmul/`.\n *\n * Sourced from:\n * - `src/matmul/field.h` (M31 modulus)\n * - `src/matmul/noise.h` (4 noise domain tags)\n * - `src/matmul/transcript.h` (2 transcript tags)\n */\n\n/** M31 prime: 2^31 - 1. From `src/matmul/field.h`. */\nexport const M31_MODULUS = 0x7fffffff;\n\n/** Domain tag for noise matrix `E_L`. From `src/matmul/noise.h`. */\nexport const NOISE_TAG_EL = 'matmul_noise_EL_v1';\n/** Domain tag for noise matrix `E_R`. From `src/matmul/noise.h`. */\nexport const NOISE_TAG_ER = 'matmul_noise_ER_v1';\n/** Domain tag for noise matrix `F_L`. From `src/matmul/noise.h`. */\nexport const NOISE_TAG_FL = 'matmul_noise_FL_v1';\n/** Domain tag for noise matrix `F_R`. From `src/matmul/noise.h`. */\nexport const NOISE_TAG_FR = 'matmul_noise_FR_v1';\n\n/** Personalization for the per-block compression vector. From `src/matmul/transcript.h`. */\nexport const TRANSCRIPT_COMPRESS_TAG = 'matmul-compress-v1';\n/** Personalization for the product-committed final digest. From `src/matmul/transcript.h`. */\nexport const TRANSCRIPT_PRODUCT_DIGEST_TAG = 'matmul-product-digest-v3';\n","/**\n * M31 (Mersenne prime 2^31 - 1) modular arithmetic.\n *\n * Ported from `btxd v0.29.7 src/matmul/field.{h,cpp}`.\n *\n * Field elements are JS `number`s in the canonical range [0, M31_MODULUS).\n *\n * `mul` and the `dot` accumulator use `BigInt` because the worst-case\n * product (2^31 - 1)^2 ≈ 2^62 exceeds Number's 2^53 precision. Day 2.6\n * may swap in a Number-only split-multiplication path for perf.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport { M31_MODULUS } from './constants.js';\n\n/** Canonical field element type. Always in [0, M31_MODULUS). */\nexport type Element = number;\n\nconst MODULUS_BIG = BigInt(M31_MODULUS);\n\n/**\n * Mersenne fold for a non-negative `bigint` up to ~2^64. Matches btxd's\n * `reduce64` in `field.cpp` lines 23-34 (double fold + final canonical sub).\n */\nfunction reduce64(x: bigint): Element {\n let v = (x & MODULUS_BIG) + (x >> 31n);\n v = (v & MODULUS_BIG) + (v >> 31n);\n let result = Number(v);\n if (result >= M31_MODULUS) result -= M31_MODULUS;\n return result;\n}\n\n/** Modular addition. Matches `field::add` in `field.cpp` line 84. */\nexport function add(a: Element, b: Element): Element {\n const s = a + b;\n return s >= M31_MODULUS ? s - M31_MODULUS : s;\n}\n\n/** Modular subtraction. Matches `field::sub` in `field.cpp` line 93. */\nexport function sub(a: Element, b: Element): Element {\n return a >= b ? a - b : a + M31_MODULUS - b;\n}\n\n/** Modular multiplication. Matches `field::mul` in `field.cpp` line 102. */\nexport function mul(a: Element, b: Element): Element {\n return reduce64(BigInt(a) * BigInt(b));\n}\n\n/** Modular negation. Matches `field::neg` in `field.cpp` line 108. */\nexport function neg(a: Element): Element {\n return a === 0 ? 0 : M31_MODULUS - a;\n}\n\n/** Reduce a uint32 input to canonical form. Matches `field::from_uint32`. */\nexport function fromUint32(x: number): Element {\n return reduce64(BigInt(x >>> 0));\n}\n\n/**\n * Modular inverse via Fermat's little theorem: a^(p-2) mod p.\n * Matches `field::inv` in `field.cpp` line 121.\n */\nexport function inv(a: Element): Element {\n if (a === 0) throw new Error('field.inv: cannot invert 0');\n let exp = M31_MODULUS - 2;\n let result: Element = 1;\n let base = a;\n while (exp > 0) {\n if ((exp & 1) !== 0) result = mul(result, base);\n exp >>>= 1;\n if (exp > 0) base = mul(base, base);\n }\n return result;\n}\n\n/**\n * Hash-to-field oracle for deterministic challenge derivation.\n *\n * Matches `field::from_oracle` in `field.cpp` line 138:\n * - SHA-256(seed_bytes || LE32(index) [|| LE32(retry) if retry > 0])\n * - candidate = ReadLE32(hash[0..4]) & MODULUS\n * - accept if candidate < MODULUS; else retry (up to 256 retries)\n * - deterministic fallback otherwise (essentially unreachable, ~2^-7936)\n *\n * @param seed - 32-byte seed in btxd \"display/MSB-first\" order. The C++\n * reverses uint256's LE storage to MSB-first before hashing; standard hex\n * parsing of a uint256 hex string already yields MSB-first bytes, so the\n * caller can pass the hex-parsed bytes directly without reversing.\n */\nexport function fromOracle(seed: Uint8Array, index: number): Element {\n if (seed.length !== 32) {\n throw new Error(`field.fromOracle: seed must be 32 bytes, got ${seed.length}`);\n }\n const indexLe = new Uint8Array(4);\n writeUint32LE(indexLe, 0, index >>> 0);\n\n for (let retry = 0; retry < 256; retry++) {\n const hasher = sha256.create();\n hasher.update(seed);\n hasher.update(indexLe);\n if (retry > 0) {\n const retryLe = new Uint8Array(4);\n writeUint32LE(retryLe, 0, retry);\n hasher.update(retryLe);\n }\n const hash = hasher.digest();\n const candidate = readUint32LE(hash, 0) & M31_MODULUS;\n if (candidate < M31_MODULUS) return candidate;\n }\n\n // Deterministic fallback. Same construction as btxd `field.cpp` line 174.\n const fallback = sha256.create();\n fallback.update(seed);\n fallback.update(indexLe);\n fallback.update(new TextEncoder().encode('oracle-fallback'));\n const hash = fallback.digest();\n return readUint32LE(hash, 0) % M31_MODULUS;\n}\n\n/**\n * Inner-product over M31. Matches `field::ScalarDot` in `field.cpp` line 39\n * (the NEON kernel is a perf-equivalent rewrite of this canonical scalar path).\n *\n * Accumulates 4 products per Mersenne fold; uses BigInt for the 64-bit acc\n * because Number can't hold 4·(2^31-1)^2 ≈ 2^64.\n */\nexport function dot(a: Element[] | Uint32Array, b: Element[] | Uint32Array, len: number): Element {\n let acc = 0n;\n let pending = 0;\n for (let i = 0; i < len; i++) {\n acc += BigInt(a[i]!) * BigInt(b[i]!);\n if (++pending === 4) {\n acc = (acc & MODULUS_BIG) + (acc >> 31n);\n acc = (acc & MODULUS_BIG) + (acc >> 31n);\n pending = 0;\n }\n }\n return reduce64(acc);\n}\n\nfunction writeUint32LE(buf: Uint8Array, offset: number, value: number): void {\n buf[offset] = value & 0xff;\n buf[offset + 1] = (value >>> 8) & 0xff;\n buf[offset + 2] = (value >>> 16) & 0xff;\n buf[offset + 3] = (value >>> 24) & 0xff;\n}\n\nfunction readUint32LE(buf: Uint8Array, offset: number): number {\n return (\n (buf[offset]! |\n (buf[offset + 1]! << 8) |\n (buf[offset + 2]! << 16) |\n (buf[offset + 3]! << 24)) >>>\n 0\n );\n}\n","/**\n * Dense matrix over M31 with row-major layout.\n *\n * Lightweight equivalent of `btxd v0.29.7 src/matmul/matrix.{h,cpp}`. We expose\n * only the operations the solver needs: construction, element access, add,\n * and multiplication. Block views live in `transcript.ts`.\n */\n\nimport { add as fieldAdd, dot as fieldDot, fromOracle, type Element } from './field.js';\n\nexport interface Matrix {\n readonly rows: number;\n readonly cols: number;\n /** Row-major: data[row * cols + col]. Length = rows * cols. */\n readonly data: Uint32Array;\n}\n\n/** Construct a zero-initialized matrix. */\nexport function zeros(rows: number, cols: number): Matrix {\n return { rows, cols, data: new Uint32Array(rows * cols) };\n}\n\n/** Element accessor. */\nexport function get(m: Matrix, row: number, col: number): Element {\n return m.data[row * m.cols + col]!;\n}\n\n/** Element setter. */\nexport function set(m: Matrix, row: number, col: number, value: Element): void {\n m.data[row * m.cols + col] = value;\n}\n\n/**\n * Build a `rows × cols` matrix where entry (row, col) is\n * `field.fromOracle(seed, row * cols + col)`.\n *\n * Mirrors `FromSeedRect` in `btxd src/matmul/noise.cpp`.\n */\nexport function fromSeedRect(seed: Uint8Array, rows: number, cols: number): Matrix {\n const m = zeros(rows, cols);\n const total = rows * cols;\n for (let i = 0; i < total; i++) {\n m.data[i] = fromOracle(seed, i);\n }\n return m;\n}\n\n/**\n * Element-wise modular sum `out = a + b` in M31.\n * Throws if dimensions mismatch.\n */\nexport function matAdd(a: Matrix, b: Matrix): Matrix {\n if (a.rows !== b.rows || a.cols !== b.cols) {\n throw new Error(`matAdd: dim mismatch a=${a.rows}x${a.cols} b=${b.rows}x${b.cols}`);\n }\n const out = zeros(a.rows, a.cols);\n for (let i = 0; i < a.data.length; i++) {\n out.data[i] = fieldAdd(a.data[i]!, b.data[i]!);\n }\n return out;\n}\n\n/**\n * Canonical M31 matrix multiplication: `out = a · b`.\n *\n * `a` is rows_a × inner, `b` is inner × cols_b; `out` is rows_a × cols_b.\n * Uses `field.dot` per inner row × col pair, which folds Mersenne every\n * 4 accumulated products.\n */\nexport function matMul(a: Matrix, b: Matrix): Matrix {\n if (a.cols !== b.rows) {\n throw new Error(`matMul: inner-dim mismatch a.cols=${a.cols} b.rows=${b.rows}`);\n }\n const out = zeros(a.rows, b.cols);\n const rowBuf = new Uint32Array(a.cols);\n const colBuf = new Uint32Array(a.cols);\n for (let i = 0; i < a.rows; i++) {\n for (let k = 0; k < a.cols; k++) rowBuf[k] = a.data[i * a.cols + k]!;\n for (let j = 0; j < b.cols; j++) {\n for (let k = 0; k < a.cols; k++) colBuf[k] = b.data[k * b.cols + j]!;\n out.data[i * b.cols + j] = fieldDot(rowBuf, colBuf, a.cols);\n }\n }\n return out;\n}\n","/**\n * Deterministic noise pair generation: {E_L, E_R, F_L, F_R}.\n *\n * Each matrix is rank-r (n × r or r × n); used to perturb (A, B) into\n * (A', B') = (A + E_L·E_R, B + F_L·F_R) before the canonical matmul.\n *\n * Ported from `btxd v0.29.7 src/matmul/noise.{h,cpp}`.\n *\n * Byte-order convention (see header.ts for full discussion): sigma + noise\n * seeds are kept in **display/BE order** in-memory. The C++ reverses LE\n * storage to BE for hashing; we already store BE, so we hash directly.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport { NOISE_TAG_EL, NOISE_TAG_ER, NOISE_TAG_FL, NOISE_TAG_FR } from './constants.js';\nimport { fromSeedRect, type Matrix } from './matrix.js';\n\n/** The 4 noise factor matrices. Sized (n×r, r×n, n×r, r×n) respectively. */\nexport interface NoisePair {\n E_L: Matrix;\n E_R: Matrix;\n F_L: Matrix;\n F_R: Matrix;\n}\n\n/**\n * Per-tag seed derivation. Matches `btxd noise::DeriveNoiseSeed`:\n * seed = SHA-256(domain_tag || sigma_BE)\n *\n * Subtle byte-order point: btxd stores the noise seed via\n * `CanonicalBytesToUint256(digest)` — i.e. the uint256's LE storage is the\n * REVERSE of the raw SHA-256 output. Then `from_oracle` reverses that LE\n * storage again before hashing, so the bytes actually fed to the per-index\n * SHA-256 are the RAW digest. Our `fromOracle` hashes the seed directly\n * (no internal reverse), so we must return the raw digest here — no reverse.\n *\n * (Contrast with `deriveSigma`, which DOES reverse: btxd's sigma uint256 is\n * stored direct from the SHA-256 output, so `from_oracle`'s reverse lands on\n * REVERSE(raw). The reverse in our `deriveSigma` mirrors that asymmetry.)\n */\nexport function deriveNoiseSeed(domainTag: string, sigmaBE: Uint8Array): Uint8Array {\n if (sigmaBE.length !== 32) {\n throw new Error(`deriveNoiseSeed: sigma must be 32 bytes, got ${sigmaBE.length}`);\n }\n if (domainTag.length !== 18) {\n // C++ asserts this; all 4 noise tags are 18 chars.\n throw new Error(`deriveNoiseSeed: domain tag must be 18 chars, got ${domainTag.length}`);\n }\n const hasher = sha256.create();\n hasher.update(new TextEncoder().encode(domainTag));\n hasher.update(sigmaBE);\n return hasher.digest();\n}\n\n/**\n * Generate the 4 noise matrices. Mirrors `noise::Generate(sigma, n, r)`.\n *\n * Returned matrix sizes:\n * - E_L : n × r\n * - E_R : r × n\n * - F_L : n × r\n * - F_R : r × n\n *\n * Asymmetric on purpose — so `E_L · E_R` and `F_L · F_R` are n×n.\n */\nexport function generate(sigmaBE: Uint8Array, n: number, r: number): NoisePair {\n const seedEL = deriveNoiseSeed(NOISE_TAG_EL, sigmaBE);\n const seedER = deriveNoiseSeed(NOISE_TAG_ER, sigmaBE);\n const seedFL = deriveNoiseSeed(NOISE_TAG_FL, sigmaBE);\n const seedFR = deriveNoiseSeed(NOISE_TAG_FR, sigmaBE);\n return {\n E_L: fromSeedRect(seedEL, n, r),\n E_R: fromSeedRect(seedER, r, n),\n F_L: fromSeedRect(seedFL, n, r),\n F_R: fromSeedRect(seedFR, r, n),\n };\n}\n","/**\n * Transcript-binding block compression + canonical matmul + final digest.\n *\n * Ported from `btxd v0.29.7 src/matmul/transcript.{h,cpp}`.\n *\n * For Day 2.5 (the canonical Solve path) we only need:\n * - {@link deriveCompressionVector} — b·b M31 vector from sigma\n * - {@link compressBlock} — block · compression-vector inner product\n * - {@link TranscriptHasher} — accumulates LE32(compressed c-block) per\n * (i, j, ell) step, finalizes as SHA-256d\n * - {@link canonicalMatMul} — block-wise A' · B' with intermediate hashing\n *\n * The replay / product-committed / accelerated-solver helpers are verifier\n * optimizations; out of scope for Day 2.5 but easy to add in Day 2.6+ if\n * needed.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport { TRANSCRIPT_COMPRESS_TAG } from './constants.js';\nimport { add as fieldAdd, dot as fieldDot, fromOracle } from './field.js';\nimport { zeros, type Matrix } from './matrix.js';\n\n/**\n * Per-sigma compression seed. Mirrors `DeriveCompressionSeed` in transcript.cpp\n * (the anonymous-namespace helper).\n *\n * Like `deriveNoiseSeed`, btxd stores this via `CanonicalBytesToUint256` —\n * the LE storage is the reverse of the raw digest. `from_oracle` reverses\n * once more before hashing, so the bytes actually fed to the per-index\n * SHA-256 are the RAW digest. Our `fromOracle` hashes the seed directly,\n * so we return the raw digest with no extra reverse.\n */\nfunction deriveCompressionSeed(sigmaBE: Uint8Array): Uint8Array {\n const hasher = sha256.create();\n hasher.update(new TextEncoder().encode(TRANSCRIPT_COMPRESS_TAG));\n hasher.update(sigmaBE);\n return hasher.digest();\n}\n\n/**\n * Build the b·b-element M31 compression vector. Mirrors\n * `transcript::DeriveCompressionVector`.\n */\nexport function deriveCompressionVector(sigmaBE: Uint8Array, b: number): Uint32Array {\n if (b <= 0) throw new Error('block size b must be positive');\n const seed = deriveCompressionSeed(sigmaBE);\n const len = b * b;\n const vec = new Uint32Array(len);\n for (let k = 0; k < len; k++) vec[k] = fromOracle(seed, k);\n return vec;\n}\n\n/**\n * Compress a b·b block against the precomputed compression vector. Mirrors\n * `transcript::CompressBlock` — a plain M31 inner product, no per-row split.\n */\nexport function compressBlock(block: Uint32Array, v: Uint32Array): number {\n if (block.length !== v.length) {\n throw new Error(\n `compressBlock: dim mismatch block.length=${block.length} v.length=${v.length}`,\n );\n }\n return fieldDot(block, v, block.length);\n}\n\n/**\n * Accumulating SHA-256(-d) transcript hasher. Mirrors\n * `transcript::TranscriptHasher`.\n *\n * compress_vec = DeriveCompressionVector(sigma, b)\n * per (i,j,ell): add LE32(CompressBlock(c_block, compress_vec)) to inner\n * finalize(): inner = SHA256.digest(); return SHA256(inner) (i.e. SHA-256d)\n */\nexport class TranscriptHasher {\n private readonly hasher = sha256.create();\n private readonly compressVec: Uint32Array;\n private readonly b: number;\n private readonly le4 = new Uint8Array(4);\n\n constructor(sigmaBE: Uint8Array, b: number) {\n this.b = b;\n this.compressVec = deriveCompressionVector(sigmaBE, b);\n }\n\n /**\n * Append the LE32-encoded compressed `c_block` to the transcript.\n * Ignores `i`/`j`/`ell` for hashing (btxd's `(void)i;(void)j;(void)ell;`\n * proves they don't participate in the digest), but accepts them so the\n * call-site reads identically to the C++.\n */\n addIntermediate(_i: number, _j: number, _ell: number, cBlock: Uint32Array): void {\n if (cBlock.length !== this.b * this.b) {\n throw new Error(\n `addIntermediate: c_block must be ${this.b * this.b} elements, got ${cBlock.length}`,\n );\n }\n const compressed = compressBlock(cBlock, this.compressVec);\n this.le4[0] = compressed & 0xff;\n this.le4[1] = (compressed >>> 8) & 0xff;\n this.le4[2] = (compressed >>> 16) & 0xff;\n this.le4[3] = (compressed >>> 24) & 0xff;\n this.hasher.update(this.le4);\n }\n\n /** SHA-256d: inner = SHA256(transcript); return SHA256(inner). */\n finalize(): Uint8Array {\n const inner = this.hasher.digest();\n return sha256(inner);\n }\n}\n\nexport interface CanonicalMatMulResult {\n /** Product matrix C' = A' · B' over M31. */\n cPrime: Matrix;\n /** SHA-256d over the LE32-encoded compressed c-blocks (in i,j,ell order). */\n transcriptHash: Uint8Array;\n}\n\n/**\n * Canonical block-wise matmul with transcript binding. Mirrors\n * `transcript::CanonicalMatMul`.\n *\n * for i,j in [0,N)²:\n * for ell in [0,N):\n * a = A'.block(i,ell)\n * b = B'.block(ell,j)\n * c_acc += a·b\n * hasher.add(c_acc)\n *\n * Where N = n / b. Each block read/multiply/accumulate happens in a\n * pre-allocated b·b scratch buffer to avoid per-step allocation in the\n * hot path.\n */\nexport function canonicalMatMul(\n aPrime: Matrix,\n bPrime: Matrix,\n b: number,\n sigmaBE: Uint8Array,\n): CanonicalMatMulResult {\n if (aPrime.rows !== aPrime.cols || bPrime.rows !== bPrime.cols || aPrime.rows !== bPrime.rows) {\n throw new Error('canonicalMatMul requires square matrices of equal size');\n }\n if (b === 0 || aPrime.rows % b !== 0) {\n throw new Error('canonicalMatMul: invalid transcript block size');\n }\n\n const n = aPrime.rows;\n const N = n / b;\n const cPrime = zeros(n, n);\n const hasher = new TranscriptHasher(sigmaBE, b);\n\n const aBlock = new Uint32Array(b * b);\n const bBlock = new Uint32Array(b * b);\n const cBlock = new Uint32Array(b * b);\n\n for (let i = 0; i < N; i++) {\n for (let j = 0; j < N; j++) {\n cBlock.fill(0);\n for (let ell = 0; ell < N; ell++) {\n readBlock(aPrime, i, ell, b, aBlock);\n readBlock(bPrime, ell, j, b, bBlock);\n multiplyAndAccumulateBlock(aBlock, bBlock, cBlock, b);\n hasher.addIntermediate(i, j, ell, cBlock);\n }\n writeBlock(cPrime, i, j, b, cBlock);\n }\n }\n\n return { cPrime, transcriptHash: hasher.finalize() };\n}\n\n// ----------------------------------------------------------------------------\n// internal block kernels\n// ----------------------------------------------------------------------------\n\n/** Copy `m[bi*b..bi*b+b][bj*b..bj*b+b]` into the `b·b` `out` buffer. */\nfunction readBlock(m: Matrix, bi: number, bj: number, b: number, out: Uint32Array): void {\n const rowStart = bi * b;\n const colStart = bj * b;\n const stride = m.cols;\n for (let r = 0; r < b; r++) {\n const src = (rowStart + r) * stride + colStart;\n const dst = r * b;\n for (let c = 0; c < b; c++) {\n out[dst + c] = m.data[src + c]!;\n }\n }\n}\n\n/** Copy a b·b `block` buffer into `m[bi*b..bi*b+b][bj*b..bj*b+b]`. */\nfunction writeBlock(m: Matrix, bi: number, bj: number, b: number, block: Uint32Array): void {\n const rowStart = bi * b;\n const colStart = bj * b;\n const stride = m.cols;\n for (let r = 0; r < b; r++) {\n const dst = (rowStart + r) * stride + colStart;\n const src = r * b;\n for (let c = 0; c < b; c++) {\n m.data[dst + c] = block[src + c]!;\n }\n }\n}\n\n/**\n * `c += a · b` for square b·b blocks (all three buffers are length b·b).\n * Element-wise mod M31. Inner loop uses `field.dot` (Mersenne-fold every 4\n * products) to stay in the canonical scalar path.\n */\nfunction multiplyAndAccumulateBlock(\n a: Uint32Array,\n b_buf: Uint32Array,\n c: Uint32Array,\n b: number,\n): void {\n // c[i,j] += sum_k a[i,k] * b_buf[k,j]\n // Strategy: for each (i, j), pre-collect b_buf's column j into a temp,\n // then dot with a's row i. Reuses field.dot's batched reduction.\n const colBuf = new Uint32Array(b);\n for (let j = 0; j < b; j++) {\n for (let k = 0; k < b; k++) colBuf[k] = b_buf[k * b + j]!;\n for (let i = 0; i < b; i++) {\n const rowStart = i * b;\n // Compute dot(a[i,:], colBuf, b) and add to c[i,j].\n let acc = 0n;\n let pending = 0;\n for (let k = 0; k < b; k++) {\n acc += BigInt(a[rowStart + k]!) * BigInt(colBuf[k]!);\n if (++pending === 4) {\n acc = (acc & MOD_BIG) + (acc >> 31n);\n acc = (acc & MOD_BIG) + (acc >> 31n);\n pending = 0;\n }\n }\n // Final fold and add to c[i,j].\n acc = (acc & MOD_BIG) + (acc >> 31n);\n acc = (acc & MOD_BIG) + (acc >> 31n);\n let folded = Number(acc);\n if (folded >= MOD_NUM) folded -= MOD_NUM;\n c[rowStart + j] = fieldAdd(c[rowStart + j]!, folded);\n }\n }\n}\n\nconst MOD_NUM = 0x7fffffff;\nconst MOD_BIG = 0x7fffffffn;\n","/**\n * Top-level pure-JS solver for the BTX MatMul service-challenge PoW.\n *\n * Ported from `btxd v0.29.7 src/matmul/matmul_pow.cpp` lines 293-358 (`Solve`).\n *\n * A = FromSeed(seed_a, n)\n * B = FromSeed(seed_b, n)\n * for nonce in [start, start + maxTries):\n * sigma = DeriveSigma(state(nonce))\n * noise = noise::Generate(sigma, n, r)\n * E = noise.E_L · noise.E_R\n * F = noise.F_L · noise.F_R\n * A' = A + E\n * B' = B + F\n * result = transcript::CanonicalMatMul(A', B', b, sigma)\n * if uintLE(result.transcript_hash) <= uintBE(target): return success\n *\n * Comparison semantics: `transcript_hash` is the raw SHA-256d output, treated\n * as a 256-bit integer in **little-endian byte order** (btxd's `uint256` ↔\n * `arith_uint256` convention). `target` arrives as a BE hex string. Both are\n * converted to `bigint` for the `<=` test.\n */\n\nimport type { Challenge, SolverOutput } from '../types.js';\nimport { deriveSigma, headerInputForNonce } from './header.js';\nimport { fromSeedRect, matAdd, matMul } from './matrix.js';\nimport { generate as generateNoise } from './noise.js';\nimport { canonicalMatMul } from './transcript.js';\n\nconst MAX_U64 = (1n << 64n) - 1n;\n\n/** Options for {@link solveJs}. */\nexport interface SolveJsOptions {\n /** Max nonces to try before giving up. Default 1_000_000. */\n maxTries?: number;\n /** Override the starting nonce (default: challenge.header_context.nonce64_start). */\n nonceStart?: bigint;\n /** Optional callback fired every N attempts for progress reporting. */\n onAttempt?: (attemptIndex: number, nonce: bigint) => void;\n /** Frequency of `onAttempt` calls (default every 1 attempt). */\n attemptInterval?: number;\n}\n\n/**\n * Pure-JS solver for a BTX MatMul service challenge. Searches nonces starting\n * from `header_context.nonce64_start` (or `options.nonceStart`) until the\n * transcript-hash satisfies `digest_le256 <= target_be256` or `maxTries` is\n * exhausted.\n *\n * Returns `null` if no solution was found within the budget.\n *\n * @throws if the challenge envelope is malformed (wrong-shape matmul params,\n * non-square matrix dimensions, b doesn't divide n, etc.).\n */\nexport function solveJs(challenge: Challenge, options: SolveJsOptions = {}): SolverOutput | null {\n const payload = challenge.challenge;\n const ctx = payload.header_context;\n const { n, b, r } = payload.matmul;\n\n const maxTries = options.maxTries ?? 1_000_000;\n const nonceStart = options.nonceStart ?? BigInt(ctx.nonce64_start ?? 0);\n const attemptInterval = options.attemptInterval ?? 1;\n\n if (n <= 0 || b <= 0 || r <= 0) {\n throw new Error(`solveJs: invalid matmul params (n=${n}, b=${b}, r=${r})`);\n }\n if (n % b !== 0) {\n throw new Error(`solveJs: n=${n} not divisible by b=${b}`);\n }\n\n // Parse fixed inputs.\n const seedA = parseHex32(payload.matmul.seed_a, 'seed_a');\n const seedB = parseHex32(payload.matmul.seed_b, 'seed_b');\n const targetBE = parseHex32(payload.target, 'target');\n const targetValue = bytesBEToBigInt(targetBE);\n\n // A and B don't change per attempt.\n const A = fromSeedRect(seedA, n, n);\n const B = fromSeedRect(seedB, n, n);\n\n let nonce = nonceStart & MAX_U64;\n for (let attempt = 0; attempt < maxTries; attempt++) {\n if (options.onAttempt && attempt % attemptInterval === 0) {\n options.onAttempt(attempt, nonce);\n }\n\n const headerInput = headerInputForNonce(ctx, nonce);\n const sigmaBE = deriveSigma(headerInput);\n const noise = generateNoise(sigmaBE, n, r);\n\n const E = matMul(noise.E_L, noise.E_R);\n const F = matMul(noise.F_L, noise.F_R);\n const aPrime = matAdd(A, E);\n const bPrime = matAdd(B, F);\n\n const result = canonicalMatMul(aPrime, bPrime, b, sigmaBE);\n const digestValue = bytesLEToBigInt(result.transcriptHash);\n if (digestValue <= targetValue) {\n const nonce64_hex = nonce.toString(16).padStart(16, '0');\n const digest_hex = bytesLEToHexBE(result.transcriptHash);\n return {\n nonce64_hex,\n digest_hex,\n // Same shape btxd's solve RPC returns: {challenge, nonce64_hex, digest_hex}.\n // See `solvematmulservicechallenge` in btxd src/rpc/mining.cpp.\n proof: { challenge, nonce64_hex, digest_hex },\n };\n }\n\n if (nonce === MAX_U64) return null;\n nonce = (nonce + 1n) & MAX_U64;\n }\n\n return null;\n}\n\n// ----------------------------------------------------------------------------\n// hex / int conversion\n// ----------------------------------------------------------------------------\n\nfunction parseHex32(hex: string, field: string): Uint8Array {\n const h = hex.startsWith('0x') || hex.startsWith('0X') ? hex.slice(2) : hex;\n if (h.length !== 64) {\n throw new Error(`solveJs.${field}: expected 64 hex chars, got ${h.length}`);\n }\n const out = new Uint8Array(32);\n for (let i = 0; i < 32; i++) {\n const byte = parseInt(h.slice(i * 2, i * 2 + 2), 16);\n if (Number.isNaN(byte)) {\n throw new Error(`solveJs.${field}: invalid hex at byte ${i}`);\n }\n out[i] = byte;\n }\n return out;\n}\n\n/** Interpret 32 bytes as a 256-bit integer in big-endian byte order. */\nfunction bytesBEToBigInt(bytes: Uint8Array): bigint {\n let v = 0n;\n for (let i = 0; i < bytes.length; i++) {\n v = (v << 8n) | BigInt(bytes[i]!);\n }\n return v;\n}\n\n/** Interpret 32 bytes as a 256-bit integer in little-endian byte order. */\nfunction bytesLEToBigInt(bytes: Uint8Array): bigint {\n let v = 0n;\n for (let i = bytes.length - 1; i >= 0; i--) {\n v = (v << 8n) | BigInt(bytes[i]!);\n }\n return v;\n}\n\n/** Reverse LE-stored bytes and hex-encode as a BE/display string. */\nfunction bytesLEToHexBE(bytes: Uint8Array): string {\n const chars: string[] = [];\n for (let i = bytes.length - 1; i >= 0; i--) {\n chars.push(bytes[i]!.toString(16).padStart(2, '0'));\n }\n return chars.join('');\n}\n","import type { BtxChallengeClient } from './client.js';\nimport { solveJs, type SolveJsOptions } from './matmul/pow.js';\nimport type { Challenge, SolverOutput } from './types.js';\n\n/**\n * How a challenge should be solved.\n *\n * - `'rpc'` — delegate to btxd's `solvematmulservicechallenge`. Requires\n * `opts.rpcClient`. Server-side / Node-only.\n *\n * - `'pure-js'` — solve locally with a pure-TypeScript MatMul implementation.\n * Browser-compatible. Ports the canonical CPU path of btxd's matmul solver.\n * At default difficulty + n=512, pure-JS solving is slow (perf is currently\n * bounded by `BigInt`-based M31 multiplication; WASM/SIMD acceleration is\n * planned for a future iteration).\n *\n * - `'auto'` — pick automatically: `'rpc'` if `opts.rpcClient` is provided,\n * else `'pure-js'`.\n */\nexport type SolverMode = 'rpc' | 'pure-js' | 'auto';\n\n/** Options for {@link Solver.solve}. */\nexport interface SolverOptions {\n /** Solve strategy. Default: `'auto'` (rpc if client provided, else pure-js). */\n mode?: SolverMode;\n /** Required for `mode === 'rpc'`. Ignored for `'pure-js'`. */\n rpcClient?: BtxChallengeClient;\n /** Forwarded to the pure-JS solver. Ignored for `'rpc'`. */\n pureJs?: SolveJsOptions;\n}\n\n/**\n * Solve a BTX service challenge to produce a (nonce, digest, proof) tuple\n * that btxd will accept on redemption.\n *\n * **Modes**:\n * - `'rpc'`: delegate to btxd's `solvematmulservicechallenge` RPC. Pass an\n * authenticated `BtxChallengeClient` in `opts.rpcClient`. **Production\n * note**: the solve RPC shares the matmul backend with block-template\n * mining; consumers MUST point at a dedicated non-mining btxd, otherwise\n * individual solves can queue behind mining work for 10+ minutes.\n * - `'pure-js'`: solve locally with the ported TypeScript MatMul. Browser-\n * compatible. Slower than `'rpc'` but no node required.\n * - `'auto'`: prefers `'rpc'` if a client is provided, else `'pure-js'`.\n *\n * @example Server-side (Node, RPC mode)\n * ```typescript\n * import { BtxChallengeClient, Solver } from '@btx/challenges-sdk';\n *\n * const client = new BtxChallengeClient({\n * rpcUrl: 'http://127.0.0.1:19332',\n * rpcAuth: { user: 'rpcuser', pass: 'rpcpass' },\n * });\n *\n * const challenge = await client.issue({\n * purpose: 'ai_inference_gate',\n * resource: 'model:gpt-x|route:/v1/generate',\n * subject: 'tenant:abc123',\n * });\n *\n * const proof = await Solver.solve(challenge, { mode: 'rpc', rpcClient: client });\n * const result = await client.redeem(challenge, proof.nonce64_hex, proof.digest_hex);\n *\n * if (result.valid && result.reason === 'ok') {\n * // Admit the caller.\n * }\n * ```\n *\n * @example Browser-side (pure-JS mode)\n * ```typescript\n * import { Solver } from '@btx/challenges-sdk';\n *\n * // Solve a challenge with no server-side help. Slow at default difficulty;\n * // for production browser use cases, calibrate via `target_solve_time_s`.\n * const proof = await Solver.solve(challenge, {\n * mode: 'pure-js',\n * pureJs: { maxTries: 100_000 },\n * });\n * ```\n */\nexport class Solver {\n static async solve(challenge: Challenge, opts: SolverOptions = {}): Promise<SolverOutput> {\n const mode: SolverMode = opts.mode ?? (opts.rpcClient ? 'rpc' : 'pure-js');\n\n switch (mode) {\n case 'rpc':\n return solveViaRpc(challenge, opts);\n case 'pure-js':\n return solveViaPureJs(challenge, opts);\n case 'auto':\n if (opts.rpcClient) return solveViaRpc(challenge, opts);\n return solveViaPureJs(challenge, opts);\n default: {\n // Exhaustiveness guard — unreachable if SolverMode is the source of truth.\n const _exhaustive: never = mode;\n throw new Error(`Solver.solve: unknown mode \"${_exhaustive as string}\"`);\n }\n }\n }\n}\n\nasync function solveViaRpc(challenge: Challenge, opts: SolverOptions): Promise<SolverOutput> {\n if (!opts.rpcClient) {\n throw new Error(\n 'Solver.solve: mode=\"rpc\" requires opts.rpcClient. ' +\n 'Construct a BtxChallengeClient and pass it via opts.rpcClient.',\n );\n }\n return opts.rpcClient.solve(challenge);\n}\n\nasync function solveViaPureJs(challenge: Challenge, opts: SolverOptions): Promise<SolverOutput> {\n const result = solveJs(challenge, opts.pureJs);\n if (result === null) {\n const tries = opts.pureJs?.maxTries ?? 1_000_000;\n throw new Error(\n `Solver.solve: pure-JS solver exhausted maxTries=${tries} without finding a proof. ` +\n 'Increase maxTries or lower challenge difficulty (target_solve_time_s).',\n );\n }\n return result;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@btx-tools/challenges-sdk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "TypeScript SDK for BTX service challenges — chain-anchored proof-of-work admission control for APIs, agent gateways, and form submissions",
|
|
5
5
|
"author": "visitor-code <visitor@friction.market>",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
8
|
+
"sideEffects": false,
|
|
8
9
|
"main": "./dist/index.cjs",
|
|
9
10
|
"module": "./dist/index.js",
|
|
10
11
|
"types": "./dist/index.d.ts",
|