@toon-protocol/townhouse 0.1.0 → 0.1.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/create-hmac@1.1.7/node_modules/create-hmac/index.js","../../../node_modules/.pnpm/tweetnacl@1.0.3/node_modules/tweetnacl/nacl-fast.js","../../../node_modules/.pnpm/ed25519-hd-key@1.3.0/node_modules/ed25519-hd-key/dist/utils.js","../../../node_modules/.pnpm/ed25519-hd-key@1.3.0/node_modules/ed25519-hd-key/dist/index.js","../../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/constants.js","../../../node_modules/.pnpm/node-gyp-build@4.8.4/node_modules/node-gyp-build/node-gyp-build.js","../../../node_modules/.pnpm/node-gyp-build@4.8.4/node_modules/node-gyp-build/index.js","../../../node_modules/.pnpm/bufferutil@4.1.0/node_modules/bufferutil/fallback.js","../../../node_modules/.pnpm/bufferutil@4.1.0/node_modules/bufferutil/index.js","../../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/buffer-util.js","../../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/limiter.js","../../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/permessage-deflate.js","../../../node_modules/.pnpm/utf-8-validate@5.0.10/node_modules/utf-8-validate/fallback.js","../../../node_modules/.pnpm/utf-8-validate@5.0.10/node_modules/utf-8-validate/index.js","../../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/validation.js","../../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/receiver.js","../../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/sender.js","../../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/event-target.js","../../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/extension.js","../../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket.js","../../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/stream.js","../../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/subprotocol.js","../../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket-server.js","../src/config/defaults.ts","../src/config/validator.ts","../src/config/loader.ts","../src/connector/config-generator.ts","../src/connector/admin-client.ts","../src/docker/orchestrator.ts","../src/connector/transport-probe.ts","../src/connector/hs-config-writer.ts","../src/compose-loader.ts","../src/state/nodes-yaml.ts","../src/reconciler.ts","../src/earnings/snapshot-writer.ts","../src/wallet/storage.ts","../src/wallet/crypto.ts","../src/state/image-manifest.ts","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/src/utils.ts","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/src/hmac.ts","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/src/pbkdf2.ts","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/src/_md.ts","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/src/_u64.ts","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/src/sha2.ts","../../../node_modules/.pnpm/@scure+base@2.0.0/node_modules/@scure/base/index.ts","../../../node_modules/.pnpm/@scure+bip39@2.0.1/node_modules/@scure/bip39/index.js","../../../node_modules/.pnpm/@scure+bip39@2.0.1/node_modules/@scure/bip39/wordlists/english.js","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/src/utils.ts","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/src/abstract/modular.ts","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/src/abstract/curve.ts","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/src/abstract/weierstrass.ts","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/src/secp256k1.ts","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/src/legacy.ts","../../../node_modules/.pnpm/@scure+bip32@2.0.1/node_modules/@scure/bip32/index.ts","../src/wallet/manager.ts","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/sha3.ts","../../../node_modules/.pnpm/@noble+curves@1.9.7/node_modules/@noble/curves/src/utils.ts","../../../node_modules/.pnpm/@noble+curves@1.9.7/node_modules/@noble/curves/src/abstract/modular.ts","../../../node_modules/.pnpm/@noble+curves@1.9.7/node_modules/@noble/curves/src/abstract/curve.ts","../../../node_modules/.pnpm/@noble+curves@1.9.7/node_modules/@noble/curves/src/abstract/weierstrass.ts","../../../node_modules/.pnpm/@noble+curves@1.9.7/node_modules/@noble/curves/src/_shortw_utils.ts","../../../node_modules/.pnpm/@noble+curves@1.9.7/node_modules/@noble/curves/src/secp256k1.ts","../src/wallet/ar-cache.ts","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/src/abstract/edwards.ts","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/src/ed25519.ts","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/src/sha3.ts","../../mill/src/wallet.ts","../../mill/src/errors.ts","../src/earnings/aggregator.ts","../src/earnings/snapshot-reader.ts","../src/registry/peer-type-resolver.ts","../src/api/server.ts","../../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/wrapper.mjs","../src/api/build-app.ts","../src/api/cors.ts","../src/api/routes/nodes.ts","../src/api/routes/wallet.ts","../src/chain/evm-rpc.ts","../src/chain/solana-rpc.ts","../src/chain/mina-graphql.ts","../src/api/routes/wallet-balances.ts","../src/api/routes/wallet-reveal.ts","../src/api/routes/wallet-withdraw.ts","../src/chain/evm-tx.ts","../src/api/config-mutex.ts","../src/api/routes/nodes-patch.ts","../src/api/routes/nodes-lifecycle.ts","../src/api/routes/metrics-ws.ts","../src/api/routes/wizard.ts","../src/api/routes/transport.ts","../src/api/routes/earnings.ts","../src/api/schemas/earnings.ts","../src/api/routes/logs.ts","../src/docker/log-tail.ts","../src/api/wizard-server.ts"],"sourcesContent":["module.exports = require('crypto').createHmac\n","(function(nacl) {\n'use strict';\n\n// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri.\n// Public domain.\n//\n// Implementation derived from TweetNaCl version 20140427.\n// See for details: http://tweetnacl.cr.yp.to/\n\nvar gf = function(init) {\n var i, r = new Float64Array(16);\n if (init) for (i = 0; i < init.length; i++) r[i] = init[i];\n return r;\n};\n\n// Pluggable, initialized in high-level API below.\nvar randombytes = function(/* x, n */) { throw new Error('no PRNG'); };\n\nvar _0 = new Uint8Array(16);\nvar _9 = new Uint8Array(32); _9[0] = 9;\n\nvar gf0 = gf(),\n gf1 = gf([1]),\n _121665 = gf([0xdb41, 1]),\n D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]),\n D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]),\n X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]),\n Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]),\n I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);\n\nfunction ts64(x, i, h, l) {\n x[i] = (h >> 24) & 0xff;\n x[i+1] = (h >> 16) & 0xff;\n x[i+2] = (h >> 8) & 0xff;\n x[i+3] = h & 0xff;\n x[i+4] = (l >> 24) & 0xff;\n x[i+5] = (l >> 16) & 0xff;\n x[i+6] = (l >> 8) & 0xff;\n x[i+7] = l & 0xff;\n}\n\nfunction vn(x, xi, y, yi, n) {\n var i,d = 0;\n for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i];\n return (1 & ((d - 1) >>> 8)) - 1;\n}\n\nfunction crypto_verify_16(x, xi, y, yi) {\n return vn(x,xi,y,yi,16);\n}\n\nfunction crypto_verify_32(x, xi, y, yi) {\n return vn(x,xi,y,yi,32);\n}\n\nfunction core_salsa20(o, p, k, c) {\n var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24,\n j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24,\n j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24,\n j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24,\n j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24,\n j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24,\n j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24,\n j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24,\n j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24,\n j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24,\n j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24,\n j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24,\n j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24,\n j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24,\n j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24,\n j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24;\n\n var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,\n x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,\n x15 = j15, u;\n\n for (var i = 0; i < 20; i += 2) {\n u = x0 + x12 | 0;\n x4 ^= u<<7 | u>>>(32-7);\n u = x4 + x0 | 0;\n x8 ^= u<<9 | u>>>(32-9);\n u = x8 + x4 | 0;\n x12 ^= u<<13 | u>>>(32-13);\n u = x12 + x8 | 0;\n x0 ^= u<<18 | u>>>(32-18);\n\n u = x5 + x1 | 0;\n x9 ^= u<<7 | u>>>(32-7);\n u = x9 + x5 | 0;\n x13 ^= u<<9 | u>>>(32-9);\n u = x13 + x9 | 0;\n x1 ^= u<<13 | u>>>(32-13);\n u = x1 + x13 | 0;\n x5 ^= u<<18 | u>>>(32-18);\n\n u = x10 + x6 | 0;\n x14 ^= u<<7 | u>>>(32-7);\n u = x14 + x10 | 0;\n x2 ^= u<<9 | u>>>(32-9);\n u = x2 + x14 | 0;\n x6 ^= u<<13 | u>>>(32-13);\n u = x6 + x2 | 0;\n x10 ^= u<<18 | u>>>(32-18);\n\n u = x15 + x11 | 0;\n x3 ^= u<<7 | u>>>(32-7);\n u = x3 + x15 | 0;\n x7 ^= u<<9 | u>>>(32-9);\n u = x7 + x3 | 0;\n x11 ^= u<<13 | u>>>(32-13);\n u = x11 + x7 | 0;\n x15 ^= u<<18 | u>>>(32-18);\n\n u = x0 + x3 | 0;\n x1 ^= u<<7 | u>>>(32-7);\n u = x1 + x0 | 0;\n x2 ^= u<<9 | u>>>(32-9);\n u = x2 + x1 | 0;\n x3 ^= u<<13 | u>>>(32-13);\n u = x3 + x2 | 0;\n x0 ^= u<<18 | u>>>(32-18);\n\n u = x5 + x4 | 0;\n x6 ^= u<<7 | u>>>(32-7);\n u = x6 + x5 | 0;\n x7 ^= u<<9 | u>>>(32-9);\n u = x7 + x6 | 0;\n x4 ^= u<<13 | u>>>(32-13);\n u = x4 + x7 | 0;\n x5 ^= u<<18 | u>>>(32-18);\n\n u = x10 + x9 | 0;\n x11 ^= u<<7 | u>>>(32-7);\n u = x11 + x10 | 0;\n x8 ^= u<<9 | u>>>(32-9);\n u = x8 + x11 | 0;\n x9 ^= u<<13 | u>>>(32-13);\n u = x9 + x8 | 0;\n x10 ^= u<<18 | u>>>(32-18);\n\n u = x15 + x14 | 0;\n x12 ^= u<<7 | u>>>(32-7);\n u = x12 + x15 | 0;\n x13 ^= u<<9 | u>>>(32-9);\n u = x13 + x12 | 0;\n x14 ^= u<<13 | u>>>(32-13);\n u = x14 + x13 | 0;\n x15 ^= u<<18 | u>>>(32-18);\n }\n x0 = x0 + j0 | 0;\n x1 = x1 + j1 | 0;\n x2 = x2 + j2 | 0;\n x3 = x3 + j3 | 0;\n x4 = x4 + j4 | 0;\n x5 = x5 + j5 | 0;\n x6 = x6 + j6 | 0;\n x7 = x7 + j7 | 0;\n x8 = x8 + j8 | 0;\n x9 = x9 + j9 | 0;\n x10 = x10 + j10 | 0;\n x11 = x11 + j11 | 0;\n x12 = x12 + j12 | 0;\n x13 = x13 + j13 | 0;\n x14 = x14 + j14 | 0;\n x15 = x15 + j15 | 0;\n\n o[ 0] = x0 >>> 0 & 0xff;\n o[ 1] = x0 >>> 8 & 0xff;\n o[ 2] = x0 >>> 16 & 0xff;\n o[ 3] = x0 >>> 24 & 0xff;\n\n o[ 4] = x1 >>> 0 & 0xff;\n o[ 5] = x1 >>> 8 & 0xff;\n o[ 6] = x1 >>> 16 & 0xff;\n o[ 7] = x1 >>> 24 & 0xff;\n\n o[ 8] = x2 >>> 0 & 0xff;\n o[ 9] = x2 >>> 8 & 0xff;\n o[10] = x2 >>> 16 & 0xff;\n o[11] = x2 >>> 24 & 0xff;\n\n o[12] = x3 >>> 0 & 0xff;\n o[13] = x3 >>> 8 & 0xff;\n o[14] = x3 >>> 16 & 0xff;\n o[15] = x3 >>> 24 & 0xff;\n\n o[16] = x4 >>> 0 & 0xff;\n o[17] = x4 >>> 8 & 0xff;\n o[18] = x4 >>> 16 & 0xff;\n o[19] = x4 >>> 24 & 0xff;\n\n o[20] = x5 >>> 0 & 0xff;\n o[21] = x5 >>> 8 & 0xff;\n o[22] = x5 >>> 16 & 0xff;\n o[23] = x5 >>> 24 & 0xff;\n\n o[24] = x6 >>> 0 & 0xff;\n o[25] = x6 >>> 8 & 0xff;\n o[26] = x6 >>> 16 & 0xff;\n o[27] = x6 >>> 24 & 0xff;\n\n o[28] = x7 >>> 0 & 0xff;\n o[29] = x7 >>> 8 & 0xff;\n o[30] = x7 >>> 16 & 0xff;\n o[31] = x7 >>> 24 & 0xff;\n\n o[32] = x8 >>> 0 & 0xff;\n o[33] = x8 >>> 8 & 0xff;\n o[34] = x8 >>> 16 & 0xff;\n o[35] = x8 >>> 24 & 0xff;\n\n o[36] = x9 >>> 0 & 0xff;\n o[37] = x9 >>> 8 & 0xff;\n o[38] = x9 >>> 16 & 0xff;\n o[39] = x9 >>> 24 & 0xff;\n\n o[40] = x10 >>> 0 & 0xff;\n o[41] = x10 >>> 8 & 0xff;\n o[42] = x10 >>> 16 & 0xff;\n o[43] = x10 >>> 24 & 0xff;\n\n o[44] = x11 >>> 0 & 0xff;\n o[45] = x11 >>> 8 & 0xff;\n o[46] = x11 >>> 16 & 0xff;\n o[47] = x11 >>> 24 & 0xff;\n\n o[48] = x12 >>> 0 & 0xff;\n o[49] = x12 >>> 8 & 0xff;\n o[50] = x12 >>> 16 & 0xff;\n o[51] = x12 >>> 24 & 0xff;\n\n o[52] = x13 >>> 0 & 0xff;\n o[53] = x13 >>> 8 & 0xff;\n o[54] = x13 >>> 16 & 0xff;\n o[55] = x13 >>> 24 & 0xff;\n\n o[56] = x14 >>> 0 & 0xff;\n o[57] = x14 >>> 8 & 0xff;\n o[58] = x14 >>> 16 & 0xff;\n o[59] = x14 >>> 24 & 0xff;\n\n o[60] = x15 >>> 0 & 0xff;\n o[61] = x15 >>> 8 & 0xff;\n o[62] = x15 >>> 16 & 0xff;\n o[63] = x15 >>> 24 & 0xff;\n}\n\nfunction core_hsalsa20(o,p,k,c) {\n var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24,\n j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24,\n j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24,\n j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24,\n j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24,\n j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24,\n j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24,\n j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24,\n j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24,\n j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24,\n j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24,\n j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24,\n j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24,\n j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24,\n j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24,\n j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24;\n\n var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,\n x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,\n x15 = j15, u;\n\n for (var i = 0; i < 20; i += 2) {\n u = x0 + x12 | 0;\n x4 ^= u<<7 | u>>>(32-7);\n u = x4 + x0 | 0;\n x8 ^= u<<9 | u>>>(32-9);\n u = x8 + x4 | 0;\n x12 ^= u<<13 | u>>>(32-13);\n u = x12 + x8 | 0;\n x0 ^= u<<18 | u>>>(32-18);\n\n u = x5 + x1 | 0;\n x9 ^= u<<7 | u>>>(32-7);\n u = x9 + x5 | 0;\n x13 ^= u<<9 | u>>>(32-9);\n u = x13 + x9 | 0;\n x1 ^= u<<13 | u>>>(32-13);\n u = x1 + x13 | 0;\n x5 ^= u<<18 | u>>>(32-18);\n\n u = x10 + x6 | 0;\n x14 ^= u<<7 | u>>>(32-7);\n u = x14 + x10 | 0;\n x2 ^= u<<9 | u>>>(32-9);\n u = x2 + x14 | 0;\n x6 ^= u<<13 | u>>>(32-13);\n u = x6 + x2 | 0;\n x10 ^= u<<18 | u>>>(32-18);\n\n u = x15 + x11 | 0;\n x3 ^= u<<7 | u>>>(32-7);\n u = x3 + x15 | 0;\n x7 ^= u<<9 | u>>>(32-9);\n u = x7 + x3 | 0;\n x11 ^= u<<13 | u>>>(32-13);\n u = x11 + x7 | 0;\n x15 ^= u<<18 | u>>>(32-18);\n\n u = x0 + x3 | 0;\n x1 ^= u<<7 | u>>>(32-7);\n u = x1 + x0 | 0;\n x2 ^= u<<9 | u>>>(32-9);\n u = x2 + x1 | 0;\n x3 ^= u<<13 | u>>>(32-13);\n u = x3 + x2 | 0;\n x0 ^= u<<18 | u>>>(32-18);\n\n u = x5 + x4 | 0;\n x6 ^= u<<7 | u>>>(32-7);\n u = x6 + x5 | 0;\n x7 ^= u<<9 | u>>>(32-9);\n u = x7 + x6 | 0;\n x4 ^= u<<13 | u>>>(32-13);\n u = x4 + x7 | 0;\n x5 ^= u<<18 | u>>>(32-18);\n\n u = x10 + x9 | 0;\n x11 ^= u<<7 | u>>>(32-7);\n u = x11 + x10 | 0;\n x8 ^= u<<9 | u>>>(32-9);\n u = x8 + x11 | 0;\n x9 ^= u<<13 | u>>>(32-13);\n u = x9 + x8 | 0;\n x10 ^= u<<18 | u>>>(32-18);\n\n u = x15 + x14 | 0;\n x12 ^= u<<7 | u>>>(32-7);\n u = x12 + x15 | 0;\n x13 ^= u<<9 | u>>>(32-9);\n u = x13 + x12 | 0;\n x14 ^= u<<13 | u>>>(32-13);\n u = x14 + x13 | 0;\n x15 ^= u<<18 | u>>>(32-18);\n }\n\n o[ 0] = x0 >>> 0 & 0xff;\n o[ 1] = x0 >>> 8 & 0xff;\n o[ 2] = x0 >>> 16 & 0xff;\n o[ 3] = x0 >>> 24 & 0xff;\n\n o[ 4] = x5 >>> 0 & 0xff;\n o[ 5] = x5 >>> 8 & 0xff;\n o[ 6] = x5 >>> 16 & 0xff;\n o[ 7] = x5 >>> 24 & 0xff;\n\n o[ 8] = x10 >>> 0 & 0xff;\n o[ 9] = x10 >>> 8 & 0xff;\n o[10] = x10 >>> 16 & 0xff;\n o[11] = x10 >>> 24 & 0xff;\n\n o[12] = x15 >>> 0 & 0xff;\n o[13] = x15 >>> 8 & 0xff;\n o[14] = x15 >>> 16 & 0xff;\n o[15] = x15 >>> 24 & 0xff;\n\n o[16] = x6 >>> 0 & 0xff;\n o[17] = x6 >>> 8 & 0xff;\n o[18] = x6 >>> 16 & 0xff;\n o[19] = x6 >>> 24 & 0xff;\n\n o[20] = x7 >>> 0 & 0xff;\n o[21] = x7 >>> 8 & 0xff;\n o[22] = x7 >>> 16 & 0xff;\n o[23] = x7 >>> 24 & 0xff;\n\n o[24] = x8 >>> 0 & 0xff;\n o[25] = x8 >>> 8 & 0xff;\n o[26] = x8 >>> 16 & 0xff;\n o[27] = x8 >>> 24 & 0xff;\n\n o[28] = x9 >>> 0 & 0xff;\n o[29] = x9 >>> 8 & 0xff;\n o[30] = x9 >>> 16 & 0xff;\n o[31] = x9 >>> 24 & 0xff;\n}\n\nfunction crypto_core_salsa20(out,inp,k,c) {\n core_salsa20(out,inp,k,c);\n}\n\nfunction crypto_core_hsalsa20(out,inp,k,c) {\n core_hsalsa20(out,inp,k,c);\n}\n\nvar sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]);\n // \"expand 32-byte k\"\n\nfunction crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) {\n var z = new Uint8Array(16), x = new Uint8Array(64);\n var u, i;\n for (i = 0; i < 16; i++) z[i] = 0;\n for (i = 0; i < 8; i++) z[i] = n[i];\n while (b >= 64) {\n crypto_core_salsa20(x,z,k,sigma);\n for (i = 0; i < 64; i++) c[cpos+i] = m[mpos+i] ^ x[i];\n u = 1;\n for (i = 8; i < 16; i++) {\n u = u + (z[i] & 0xff) | 0;\n z[i] = u & 0xff;\n u >>>= 8;\n }\n b -= 64;\n cpos += 64;\n mpos += 64;\n }\n if (b > 0) {\n crypto_core_salsa20(x,z,k,sigma);\n for (i = 0; i < b; i++) c[cpos+i] = m[mpos+i] ^ x[i];\n }\n return 0;\n}\n\nfunction crypto_stream_salsa20(c,cpos,b,n,k) {\n var z = new Uint8Array(16), x = new Uint8Array(64);\n var u, i;\n for (i = 0; i < 16; i++) z[i] = 0;\n for (i = 0; i < 8; i++) z[i] = n[i];\n while (b >= 64) {\n crypto_core_salsa20(x,z,k,sigma);\n for (i = 0; i < 64; i++) c[cpos+i] = x[i];\n u = 1;\n for (i = 8; i < 16; i++) {\n u = u + (z[i] & 0xff) | 0;\n z[i] = u & 0xff;\n u >>>= 8;\n }\n b -= 64;\n cpos += 64;\n }\n if (b > 0) {\n crypto_core_salsa20(x,z,k,sigma);\n for (i = 0; i < b; i++) c[cpos+i] = x[i];\n }\n return 0;\n}\n\nfunction crypto_stream(c,cpos,d,n,k) {\n var s = new Uint8Array(32);\n crypto_core_hsalsa20(s,n,k,sigma);\n var sn = new Uint8Array(8);\n for (var i = 0; i < 8; i++) sn[i] = n[i+16];\n return crypto_stream_salsa20(c,cpos,d,sn,s);\n}\n\nfunction crypto_stream_xor(c,cpos,m,mpos,d,n,k) {\n var s = new Uint8Array(32);\n crypto_core_hsalsa20(s,n,k,sigma);\n var sn = new Uint8Array(8);\n for (var i = 0; i < 8; i++) sn[i] = n[i+16];\n return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,sn,s);\n}\n\n/*\n* Port of Andrew Moon's Poly1305-donna-16. Public domain.\n* https://github.com/floodyberry/poly1305-donna\n*/\n\nvar poly1305 = function(key) {\n this.buffer = new Uint8Array(16);\n this.r = new Uint16Array(10);\n this.h = new Uint16Array(10);\n this.pad = new Uint16Array(8);\n this.leftover = 0;\n this.fin = 0;\n\n var t0, t1, t2, t3, t4, t5, t6, t7;\n\n t0 = key[ 0] & 0xff | (key[ 1] & 0xff) << 8; this.r[0] = ( t0 ) & 0x1fff;\n t1 = key[ 2] & 0xff | (key[ 3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff;\n t2 = key[ 4] & 0xff | (key[ 5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03;\n t3 = key[ 6] & 0xff | (key[ 7] & 0xff) << 8; this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff;\n t4 = key[ 8] & 0xff | (key[ 9] & 0xff) << 8; this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff;\n this.r[5] = ((t4 >>> 1)) & 0x1ffe;\n t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff;\n t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81;\n t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff;\n this.r[9] = ((t7 >>> 5)) & 0x007f;\n\n this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8;\n this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8;\n this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8;\n this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8;\n this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8;\n this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8;\n this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8;\n this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8;\n};\n\npoly1305.prototype.blocks = function(m, mpos, bytes) {\n var hibit = this.fin ? 0 : (1 << 11);\n var t0, t1, t2, t3, t4, t5, t6, t7, c;\n var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9;\n\n var h0 = this.h[0],\n h1 = this.h[1],\n h2 = this.h[2],\n h3 = this.h[3],\n h4 = this.h[4],\n h5 = this.h[5],\n h6 = this.h[6],\n h7 = this.h[7],\n h8 = this.h[8],\n h9 = this.h[9];\n\n var r0 = this.r[0],\n r1 = this.r[1],\n r2 = this.r[2],\n r3 = this.r[3],\n r4 = this.r[4],\n r5 = this.r[5],\n r6 = this.r[6],\n r7 = this.r[7],\n r8 = this.r[8],\n r9 = this.r[9];\n\n while (bytes >= 16) {\n t0 = m[mpos+ 0] & 0xff | (m[mpos+ 1] & 0xff) << 8; h0 += ( t0 ) & 0x1fff;\n t1 = m[mpos+ 2] & 0xff | (m[mpos+ 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 << 3)) & 0x1fff;\n t2 = m[mpos+ 4] & 0xff | (m[mpos+ 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 << 6)) & 0x1fff;\n t3 = m[mpos+ 6] & 0xff | (m[mpos+ 7] & 0xff) << 8; h3 += ((t2 >>> 7) | (t3 << 9)) & 0x1fff;\n t4 = m[mpos+ 8] & 0xff | (m[mpos+ 9] & 0xff) << 8; h4 += ((t3 >>> 4) | (t4 << 12)) & 0x1fff;\n h5 += ((t4 >>> 1)) & 0x1fff;\n t5 = m[mpos+10] & 0xff | (m[mpos+11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 << 2)) & 0x1fff;\n t6 = m[mpos+12] & 0xff | (m[mpos+13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 << 5)) & 0x1fff;\n t7 = m[mpos+14] & 0xff | (m[mpos+15] & 0xff) << 8; h8 += ((t6 >>> 8) | (t7 << 8)) & 0x1fff;\n h9 += ((t7 >>> 5)) | hibit;\n\n c = 0;\n\n d0 = c;\n d0 += h0 * r0;\n d0 += h1 * (5 * r9);\n d0 += h2 * (5 * r8);\n d0 += h3 * (5 * r7);\n d0 += h4 * (5 * r6);\n c = (d0 >>> 13); d0 &= 0x1fff;\n d0 += h5 * (5 * r5);\n d0 += h6 * (5 * r4);\n d0 += h7 * (5 * r3);\n d0 += h8 * (5 * r2);\n d0 += h9 * (5 * r1);\n c += (d0 >>> 13); d0 &= 0x1fff;\n\n d1 = c;\n d1 += h0 * r1;\n d1 += h1 * r0;\n d1 += h2 * (5 * r9);\n d1 += h3 * (5 * r8);\n d1 += h4 * (5 * r7);\n c = (d1 >>> 13); d1 &= 0x1fff;\n d1 += h5 * (5 * r6);\n d1 += h6 * (5 * r5);\n d1 += h7 * (5 * r4);\n d1 += h8 * (5 * r3);\n d1 += h9 * (5 * r2);\n c += (d1 >>> 13); d1 &= 0x1fff;\n\n d2 = c;\n d2 += h0 * r2;\n d2 += h1 * r1;\n d2 += h2 * r0;\n d2 += h3 * (5 * r9);\n d2 += h4 * (5 * r8);\n c = (d2 >>> 13); d2 &= 0x1fff;\n d2 += h5 * (5 * r7);\n d2 += h6 * (5 * r6);\n d2 += h7 * (5 * r5);\n d2 += h8 * (5 * r4);\n d2 += h9 * (5 * r3);\n c += (d2 >>> 13); d2 &= 0x1fff;\n\n d3 = c;\n d3 += h0 * r3;\n d3 += h1 * r2;\n d3 += h2 * r1;\n d3 += h3 * r0;\n d3 += h4 * (5 * r9);\n c = (d3 >>> 13); d3 &= 0x1fff;\n d3 += h5 * (5 * r8);\n d3 += h6 * (5 * r7);\n d3 += h7 * (5 * r6);\n d3 += h8 * (5 * r5);\n d3 += h9 * (5 * r4);\n c += (d3 >>> 13); d3 &= 0x1fff;\n\n d4 = c;\n d4 += h0 * r4;\n d4 += h1 * r3;\n d4 += h2 * r2;\n d4 += h3 * r1;\n d4 += h4 * r0;\n c = (d4 >>> 13); d4 &= 0x1fff;\n d4 += h5 * (5 * r9);\n d4 += h6 * (5 * r8);\n d4 += h7 * (5 * r7);\n d4 += h8 * (5 * r6);\n d4 += h9 * (5 * r5);\n c += (d4 >>> 13); d4 &= 0x1fff;\n\n d5 = c;\n d5 += h0 * r5;\n d5 += h1 * r4;\n d5 += h2 * r3;\n d5 += h3 * r2;\n d5 += h4 * r1;\n c = (d5 >>> 13); d5 &= 0x1fff;\n d5 += h5 * r0;\n d5 += h6 * (5 * r9);\n d5 += h7 * (5 * r8);\n d5 += h8 * (5 * r7);\n d5 += h9 * (5 * r6);\n c += (d5 >>> 13); d5 &= 0x1fff;\n\n d6 = c;\n d6 += h0 * r6;\n d6 += h1 * r5;\n d6 += h2 * r4;\n d6 += h3 * r3;\n d6 += h4 * r2;\n c = (d6 >>> 13); d6 &= 0x1fff;\n d6 += h5 * r1;\n d6 += h6 * r0;\n d6 += h7 * (5 * r9);\n d6 += h8 * (5 * r8);\n d6 += h9 * (5 * r7);\n c += (d6 >>> 13); d6 &= 0x1fff;\n\n d7 = c;\n d7 += h0 * r7;\n d7 += h1 * r6;\n d7 += h2 * r5;\n d7 += h3 * r4;\n d7 += h4 * r3;\n c = (d7 >>> 13); d7 &= 0x1fff;\n d7 += h5 * r2;\n d7 += h6 * r1;\n d7 += h7 * r0;\n d7 += h8 * (5 * r9);\n d7 += h9 * (5 * r8);\n c += (d7 >>> 13); d7 &= 0x1fff;\n\n d8 = c;\n d8 += h0 * r8;\n d8 += h1 * r7;\n d8 += h2 * r6;\n d8 += h3 * r5;\n d8 += h4 * r4;\n c = (d8 >>> 13); d8 &= 0x1fff;\n d8 += h5 * r3;\n d8 += h6 * r2;\n d8 += h7 * r1;\n d8 += h8 * r0;\n d8 += h9 * (5 * r9);\n c += (d8 >>> 13); d8 &= 0x1fff;\n\n d9 = c;\n d9 += h0 * r9;\n d9 += h1 * r8;\n d9 += h2 * r7;\n d9 += h3 * r6;\n d9 += h4 * r5;\n c = (d9 >>> 13); d9 &= 0x1fff;\n d9 += h5 * r4;\n d9 += h6 * r3;\n d9 += h7 * r2;\n d9 += h8 * r1;\n d9 += h9 * r0;\n c += (d9 >>> 13); d9 &= 0x1fff;\n\n c = (((c << 2) + c)) | 0;\n c = (c + d0) | 0;\n d0 = c & 0x1fff;\n c = (c >>> 13);\n d1 += c;\n\n h0 = d0;\n h1 = d1;\n h2 = d2;\n h3 = d3;\n h4 = d4;\n h5 = d5;\n h6 = d6;\n h7 = d7;\n h8 = d8;\n h9 = d9;\n\n mpos += 16;\n bytes -= 16;\n }\n this.h[0] = h0;\n this.h[1] = h1;\n this.h[2] = h2;\n this.h[3] = h3;\n this.h[4] = h4;\n this.h[5] = h5;\n this.h[6] = h6;\n this.h[7] = h7;\n this.h[8] = h8;\n this.h[9] = h9;\n};\n\npoly1305.prototype.finish = function(mac, macpos) {\n var g = new Uint16Array(10);\n var c, mask, f, i;\n\n if (this.leftover) {\n i = this.leftover;\n this.buffer[i++] = 1;\n for (; i < 16; i++) this.buffer[i] = 0;\n this.fin = 1;\n this.blocks(this.buffer, 0, 16);\n }\n\n c = this.h[1] >>> 13;\n this.h[1] &= 0x1fff;\n for (i = 2; i < 10; i++) {\n this.h[i] += c;\n c = this.h[i] >>> 13;\n this.h[i] &= 0x1fff;\n }\n this.h[0] += (c * 5);\n c = this.h[0] >>> 13;\n this.h[0] &= 0x1fff;\n this.h[1] += c;\n c = this.h[1] >>> 13;\n this.h[1] &= 0x1fff;\n this.h[2] += c;\n\n g[0] = this.h[0] + 5;\n c = g[0] >>> 13;\n g[0] &= 0x1fff;\n for (i = 1; i < 10; i++) {\n g[i] = this.h[i] + c;\n c = g[i] >>> 13;\n g[i] &= 0x1fff;\n }\n g[9] -= (1 << 13);\n\n mask = (c ^ 1) - 1;\n for (i = 0; i < 10; i++) g[i] &= mask;\n mask = ~mask;\n for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i];\n\n this.h[0] = ((this.h[0] ) | (this.h[1] << 13) ) & 0xffff;\n this.h[1] = ((this.h[1] >>> 3) | (this.h[2] << 10) ) & 0xffff;\n this.h[2] = ((this.h[2] >>> 6) | (this.h[3] << 7) ) & 0xffff;\n this.h[3] = ((this.h[3] >>> 9) | (this.h[4] << 4) ) & 0xffff;\n this.h[4] = ((this.h[4] >>> 12) | (this.h[5] << 1) | (this.h[6] << 14)) & 0xffff;\n this.h[5] = ((this.h[6] >>> 2) | (this.h[7] << 11) ) & 0xffff;\n this.h[6] = ((this.h[7] >>> 5) | (this.h[8] << 8) ) & 0xffff;\n this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5) ) & 0xffff;\n\n f = this.h[0] + this.pad[0];\n this.h[0] = f & 0xffff;\n for (i = 1; i < 8; i++) {\n f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0;\n this.h[i] = f & 0xffff;\n }\n\n mac[macpos+ 0] = (this.h[0] >>> 0) & 0xff;\n mac[macpos+ 1] = (this.h[0] >>> 8) & 0xff;\n mac[macpos+ 2] = (this.h[1] >>> 0) & 0xff;\n mac[macpos+ 3] = (this.h[1] >>> 8) & 0xff;\n mac[macpos+ 4] = (this.h[2] >>> 0) & 0xff;\n mac[macpos+ 5] = (this.h[2] >>> 8) & 0xff;\n mac[macpos+ 6] = (this.h[3] >>> 0) & 0xff;\n mac[macpos+ 7] = (this.h[3] >>> 8) & 0xff;\n mac[macpos+ 8] = (this.h[4] >>> 0) & 0xff;\n mac[macpos+ 9] = (this.h[4] >>> 8) & 0xff;\n mac[macpos+10] = (this.h[5] >>> 0) & 0xff;\n mac[macpos+11] = (this.h[5] >>> 8) & 0xff;\n mac[macpos+12] = (this.h[6] >>> 0) & 0xff;\n mac[macpos+13] = (this.h[6] >>> 8) & 0xff;\n mac[macpos+14] = (this.h[7] >>> 0) & 0xff;\n mac[macpos+15] = (this.h[7] >>> 8) & 0xff;\n};\n\npoly1305.prototype.update = function(m, mpos, bytes) {\n var i, want;\n\n if (this.leftover) {\n want = (16 - this.leftover);\n if (want > bytes)\n want = bytes;\n for (i = 0; i < want; i++)\n this.buffer[this.leftover + i] = m[mpos+i];\n bytes -= want;\n mpos += want;\n this.leftover += want;\n if (this.leftover < 16)\n return;\n this.blocks(this.buffer, 0, 16);\n this.leftover = 0;\n }\n\n if (bytes >= 16) {\n want = bytes - (bytes % 16);\n this.blocks(m, mpos, want);\n mpos += want;\n bytes -= want;\n }\n\n if (bytes) {\n for (i = 0; i < bytes; i++)\n this.buffer[this.leftover + i] = m[mpos+i];\n this.leftover += bytes;\n }\n};\n\nfunction crypto_onetimeauth(out, outpos, m, mpos, n, k) {\n var s = new poly1305(k);\n s.update(m, mpos, n);\n s.finish(out, outpos);\n return 0;\n}\n\nfunction crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) {\n var x = new Uint8Array(16);\n crypto_onetimeauth(x,0,m,mpos,n,k);\n return crypto_verify_16(h,hpos,x,0);\n}\n\nfunction crypto_secretbox(c,m,d,n,k) {\n var i;\n if (d < 32) return -1;\n crypto_stream_xor(c,0,m,0,d,n,k);\n crypto_onetimeauth(c, 16, c, 32, d - 32, c);\n for (i = 0; i < 16; i++) c[i] = 0;\n return 0;\n}\n\nfunction crypto_secretbox_open(m,c,d,n,k) {\n var i;\n var x = new Uint8Array(32);\n if (d < 32) return -1;\n crypto_stream(x,0,32,n,k);\n if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1;\n crypto_stream_xor(m,0,c,0,d,n,k);\n for (i = 0; i < 32; i++) m[i] = 0;\n return 0;\n}\n\nfunction set25519(r, a) {\n var i;\n for (i = 0; i < 16; i++) r[i] = a[i]|0;\n}\n\nfunction car25519(o) {\n var i, v, c = 1;\n for (i = 0; i < 16; i++) {\n v = o[i] + c + 65535;\n c = Math.floor(v / 65536);\n o[i] = v - c * 65536;\n }\n o[0] += c-1 + 37 * (c-1);\n}\n\nfunction sel25519(p, q, b) {\n var t, c = ~(b-1);\n for (var i = 0; i < 16; i++) {\n t = c & (p[i] ^ q[i]);\n p[i] ^= t;\n q[i] ^= t;\n }\n}\n\nfunction pack25519(o, n) {\n var i, j, b;\n var m = gf(), t = gf();\n for (i = 0; i < 16; i++) t[i] = n[i];\n car25519(t);\n car25519(t);\n car25519(t);\n for (j = 0; j < 2; j++) {\n m[0] = t[0] - 0xffed;\n for (i = 1; i < 15; i++) {\n m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1);\n m[i-1] &= 0xffff;\n }\n m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1);\n b = (m[15]>>16) & 1;\n m[14] &= 0xffff;\n sel25519(t, m, 1-b);\n }\n for (i = 0; i < 16; i++) {\n o[2*i] = t[i] & 0xff;\n o[2*i+1] = t[i]>>8;\n }\n}\n\nfunction neq25519(a, b) {\n var c = new Uint8Array(32), d = new Uint8Array(32);\n pack25519(c, a);\n pack25519(d, b);\n return crypto_verify_32(c, 0, d, 0);\n}\n\nfunction par25519(a) {\n var d = new Uint8Array(32);\n pack25519(d, a);\n return d[0] & 1;\n}\n\nfunction unpack25519(o, n) {\n var i;\n for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8);\n o[15] &= 0x7fff;\n}\n\nfunction A(o, a, b) {\n for (var i = 0; i < 16; i++) o[i] = a[i] + b[i];\n}\n\nfunction Z(o, a, b) {\n for (var i = 0; i < 16; i++) o[i] = a[i] - b[i];\n}\n\nfunction M(o, a, b) {\n var v, c,\n t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0,\n t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0,\n t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0,\n t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0,\n b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7],\n b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11],\n b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n\n v = a[0];\n t0 += v * b0;\n t1 += v * b1;\n t2 += v * b2;\n t3 += v * b3;\n t4 += v * b4;\n t5 += v * b5;\n t6 += v * b6;\n t7 += v * b7;\n t8 += v * b8;\n t9 += v * b9;\n t10 += v * b10;\n t11 += v * b11;\n t12 += v * b12;\n t13 += v * b13;\n t14 += v * b14;\n t15 += v * b15;\n v = a[1];\n t1 += v * b0;\n t2 += v * b1;\n t3 += v * b2;\n t4 += v * b3;\n t5 += v * b4;\n t6 += v * b5;\n t7 += v * b6;\n t8 += v * b7;\n t9 += v * b8;\n t10 += v * b9;\n t11 += v * b10;\n t12 += v * b11;\n t13 += v * b12;\n t14 += v * b13;\n t15 += v * b14;\n t16 += v * b15;\n v = a[2];\n t2 += v * b0;\n t3 += v * b1;\n t4 += v * b2;\n t5 += v * b3;\n t6 += v * b4;\n t7 += v * b5;\n t8 += v * b6;\n t9 += v * b7;\n t10 += v * b8;\n t11 += v * b9;\n t12 += v * b10;\n t13 += v * b11;\n t14 += v * b12;\n t15 += v * b13;\n t16 += v * b14;\n t17 += v * b15;\n v = a[3];\n t3 += v * b0;\n t4 += v * b1;\n t5 += v * b2;\n t6 += v * b3;\n t7 += v * b4;\n t8 += v * b5;\n t9 += v * b6;\n t10 += v * b7;\n t11 += v * b8;\n t12 += v * b9;\n t13 += v * b10;\n t14 += v * b11;\n t15 += v * b12;\n t16 += v * b13;\n t17 += v * b14;\n t18 += v * b15;\n v = a[4];\n t4 += v * b0;\n t5 += v * b1;\n t6 += v * b2;\n t7 += v * b3;\n t8 += v * b4;\n t9 += v * b5;\n t10 += v * b6;\n t11 += v * b7;\n t12 += v * b8;\n t13 += v * b9;\n t14 += v * b10;\n t15 += v * b11;\n t16 += v * b12;\n t17 += v * b13;\n t18 += v * b14;\n t19 += v * b15;\n v = a[5];\n t5 += v * b0;\n t6 += v * b1;\n t7 += v * b2;\n t8 += v * b3;\n t9 += v * b4;\n t10 += v * b5;\n t11 += v * b6;\n t12 += v * b7;\n t13 += v * b8;\n t14 += v * b9;\n t15 += v * b10;\n t16 += v * b11;\n t17 += v * b12;\n t18 += v * b13;\n t19 += v * b14;\n t20 += v * b15;\n v = a[6];\n t6 += v * b0;\n t7 += v * b1;\n t8 += v * b2;\n t9 += v * b3;\n t10 += v * b4;\n t11 += v * b5;\n t12 += v * b6;\n t13 += v * b7;\n t14 += v * b8;\n t15 += v * b9;\n t16 += v * b10;\n t17 += v * b11;\n t18 += v * b12;\n t19 += v * b13;\n t20 += v * b14;\n t21 += v * b15;\n v = a[7];\n t7 += v * b0;\n t8 += v * b1;\n t9 += v * b2;\n t10 += v * b3;\n t11 += v * b4;\n t12 += v * b5;\n t13 += v * b6;\n t14 += v * b7;\n t15 += v * b8;\n t16 += v * b9;\n t17 += v * b10;\n t18 += v * b11;\n t19 += v * b12;\n t20 += v * b13;\n t21 += v * b14;\n t22 += v * b15;\n v = a[8];\n t8 += v * b0;\n t9 += v * b1;\n t10 += v * b2;\n t11 += v * b3;\n t12 += v * b4;\n t13 += v * b5;\n t14 += v * b6;\n t15 += v * b7;\n t16 += v * b8;\n t17 += v * b9;\n t18 += v * b10;\n t19 += v * b11;\n t20 += v * b12;\n t21 += v * b13;\n t22 += v * b14;\n t23 += v * b15;\n v = a[9];\n t9 += v * b0;\n t10 += v * b1;\n t11 += v * b2;\n t12 += v * b3;\n t13 += v * b4;\n t14 += v * b5;\n t15 += v * b6;\n t16 += v * b7;\n t17 += v * b8;\n t18 += v * b9;\n t19 += v * b10;\n t20 += v * b11;\n t21 += v * b12;\n t22 += v * b13;\n t23 += v * b14;\n t24 += v * b15;\n v = a[10];\n t10 += v * b0;\n t11 += v * b1;\n t12 += v * b2;\n t13 += v * b3;\n t14 += v * b4;\n t15 += v * b5;\n t16 += v * b6;\n t17 += v * b7;\n t18 += v * b8;\n t19 += v * b9;\n t20 += v * b10;\n t21 += v * b11;\n t22 += v * b12;\n t23 += v * b13;\n t24 += v * b14;\n t25 += v * b15;\n v = a[11];\n t11 += v * b0;\n t12 += v * b1;\n t13 += v * b2;\n t14 += v * b3;\n t15 += v * b4;\n t16 += v * b5;\n t17 += v * b6;\n t18 += v * b7;\n t19 += v * b8;\n t20 += v * b9;\n t21 += v * b10;\n t22 += v * b11;\n t23 += v * b12;\n t24 += v * b13;\n t25 += v * b14;\n t26 += v * b15;\n v = a[12];\n t12 += v * b0;\n t13 += v * b1;\n t14 += v * b2;\n t15 += v * b3;\n t16 += v * b4;\n t17 += v * b5;\n t18 += v * b6;\n t19 += v * b7;\n t20 += v * b8;\n t21 += v * b9;\n t22 += v * b10;\n t23 += v * b11;\n t24 += v * b12;\n t25 += v * b13;\n t26 += v * b14;\n t27 += v * b15;\n v = a[13];\n t13 += v * b0;\n t14 += v * b1;\n t15 += v * b2;\n t16 += v * b3;\n t17 += v * b4;\n t18 += v * b5;\n t19 += v * b6;\n t20 += v * b7;\n t21 += v * b8;\n t22 += v * b9;\n t23 += v * b10;\n t24 += v * b11;\n t25 += v * b12;\n t26 += v * b13;\n t27 += v * b14;\n t28 += v * b15;\n v = a[14];\n t14 += v * b0;\n t15 += v * b1;\n t16 += v * b2;\n t17 += v * b3;\n t18 += v * b4;\n t19 += v * b5;\n t20 += v * b6;\n t21 += v * b7;\n t22 += v * b8;\n t23 += v * b9;\n t24 += v * b10;\n t25 += v * b11;\n t26 += v * b12;\n t27 += v * b13;\n t28 += v * b14;\n t29 += v * b15;\n v = a[15];\n t15 += v * b0;\n t16 += v * b1;\n t17 += v * b2;\n t18 += v * b3;\n t19 += v * b4;\n t20 += v * b5;\n t21 += v * b6;\n t22 += v * b7;\n t23 += v * b8;\n t24 += v * b9;\n t25 += v * b10;\n t26 += v * b11;\n t27 += v * b12;\n t28 += v * b13;\n t29 += v * b14;\n t30 += v * b15;\n\n t0 += 38 * t16;\n t1 += 38 * t17;\n t2 += 38 * t18;\n t3 += 38 * t19;\n t4 += 38 * t20;\n t5 += 38 * t21;\n t6 += 38 * t22;\n t7 += 38 * t23;\n t8 += 38 * t24;\n t9 += 38 * t25;\n t10 += 38 * t26;\n t11 += 38 * t27;\n t12 += 38 * t28;\n t13 += 38 * t29;\n t14 += 38 * t30;\n // t15 left as is\n\n // first car\n c = 1;\n v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536;\n v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536;\n v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536;\n v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536;\n v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536;\n v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536;\n v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536;\n v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536;\n v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536;\n v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536;\n v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;\n v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;\n v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;\n v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;\n v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;\n v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;\n t0 += c-1 + 37 * (c-1);\n\n // second car\n c = 1;\n v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536;\n v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536;\n v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536;\n v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536;\n v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536;\n v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536;\n v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536;\n v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536;\n v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536;\n v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536;\n v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;\n v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;\n v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;\n v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;\n v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;\n v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;\n t0 += c-1 + 37 * (c-1);\n\n o[ 0] = t0;\n o[ 1] = t1;\n o[ 2] = t2;\n o[ 3] = t3;\n o[ 4] = t4;\n o[ 5] = t5;\n o[ 6] = t6;\n o[ 7] = t7;\n o[ 8] = t8;\n o[ 9] = t9;\n o[10] = t10;\n o[11] = t11;\n o[12] = t12;\n o[13] = t13;\n o[14] = t14;\n o[15] = t15;\n}\n\nfunction S(o, a) {\n M(o, a, a);\n}\n\nfunction inv25519(o, i) {\n var c = gf();\n var a;\n for (a = 0; a < 16; a++) c[a] = i[a];\n for (a = 253; a >= 0; a--) {\n S(c, c);\n if(a !== 2 && a !== 4) M(c, c, i);\n }\n for (a = 0; a < 16; a++) o[a] = c[a];\n}\n\nfunction pow2523(o, i) {\n var c = gf();\n var a;\n for (a = 0; a < 16; a++) c[a] = i[a];\n for (a = 250; a >= 0; a--) {\n S(c, c);\n if(a !== 1) M(c, c, i);\n }\n for (a = 0; a < 16; a++) o[a] = c[a];\n}\n\nfunction crypto_scalarmult(q, n, p) {\n var z = new Uint8Array(32);\n var x = new Float64Array(80), r, i;\n var a = gf(), b = gf(), c = gf(),\n d = gf(), e = gf(), f = gf();\n for (i = 0; i < 31; i++) z[i] = n[i];\n z[31]=(n[31]&127)|64;\n z[0]&=248;\n unpack25519(x,p);\n for (i = 0; i < 16; i++) {\n b[i]=x[i];\n d[i]=a[i]=c[i]=0;\n }\n a[0]=d[0]=1;\n for (i=254; i>=0; --i) {\n r=(z[i>>>3]>>>(i&7))&1;\n sel25519(a,b,r);\n sel25519(c,d,r);\n A(e,a,c);\n Z(a,a,c);\n A(c,b,d);\n Z(b,b,d);\n S(d,e);\n S(f,a);\n M(a,c,a);\n M(c,b,e);\n A(e,a,c);\n Z(a,a,c);\n S(b,a);\n Z(c,d,f);\n M(a,c,_121665);\n A(a,a,d);\n M(c,c,a);\n M(a,d,f);\n M(d,b,x);\n S(b,e);\n sel25519(a,b,r);\n sel25519(c,d,r);\n }\n for (i = 0; i < 16; i++) {\n x[i+16]=a[i];\n x[i+32]=c[i];\n x[i+48]=b[i];\n x[i+64]=d[i];\n }\n var x32 = x.subarray(32);\n var x16 = x.subarray(16);\n inv25519(x32,x32);\n M(x16,x16,x32);\n pack25519(q,x16);\n return 0;\n}\n\nfunction crypto_scalarmult_base(q, n) {\n return crypto_scalarmult(q, n, _9);\n}\n\nfunction crypto_box_keypair(y, x) {\n randombytes(x, 32);\n return crypto_scalarmult_base(y, x);\n}\n\nfunction crypto_box_beforenm(k, y, x) {\n var s = new Uint8Array(32);\n crypto_scalarmult(s, x, y);\n return crypto_core_hsalsa20(k, _0, s, sigma);\n}\n\nvar crypto_box_afternm = crypto_secretbox;\nvar crypto_box_open_afternm = crypto_secretbox_open;\n\nfunction crypto_box(c, m, d, n, y, x) {\n var k = new Uint8Array(32);\n crypto_box_beforenm(k, y, x);\n return crypto_box_afternm(c, m, d, n, k);\n}\n\nfunction crypto_box_open(m, c, d, n, y, x) {\n var k = new Uint8Array(32);\n crypto_box_beforenm(k, y, x);\n return crypto_box_open_afternm(m, c, d, n, k);\n}\n\nvar K = [\n 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,\n 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,\n 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,\n 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118,\n 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe,\n 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,\n 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1,\n 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694,\n 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,\n 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65,\n 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483,\n 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,\n 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210,\n 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4,\n 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,\n 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70,\n 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926,\n 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,\n 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8,\n 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b,\n 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,\n 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30,\n 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910,\n 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,\n 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53,\n 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8,\n 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,\n 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3,\n 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60,\n 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,\n 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9,\n 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b,\n 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,\n 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178,\n 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6,\n 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,\n 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493,\n 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c,\n 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,\n 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817\n];\n\nfunction crypto_hashblocks_hl(hh, hl, m, n) {\n var wh = new Int32Array(16), wl = new Int32Array(16),\n bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7,\n bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7,\n th, tl, i, j, h, l, a, b, c, d;\n\n var ah0 = hh[0],\n ah1 = hh[1],\n ah2 = hh[2],\n ah3 = hh[3],\n ah4 = hh[4],\n ah5 = hh[5],\n ah6 = hh[6],\n ah7 = hh[7],\n\n al0 = hl[0],\n al1 = hl[1],\n al2 = hl[2],\n al3 = hl[3],\n al4 = hl[4],\n al5 = hl[5],\n al6 = hl[6],\n al7 = hl[7];\n\n var pos = 0;\n while (n >= 128) {\n for (i = 0; i < 16; i++) {\n j = 8 * i + pos;\n wh[i] = (m[j+0] << 24) | (m[j+1] << 16) | (m[j+2] << 8) | m[j+3];\n wl[i] = (m[j+4] << 24) | (m[j+5] << 16) | (m[j+6] << 8) | m[j+7];\n }\n for (i = 0; i < 80; i++) {\n bh0 = ah0;\n bh1 = ah1;\n bh2 = ah2;\n bh3 = ah3;\n bh4 = ah4;\n bh5 = ah5;\n bh6 = ah6;\n bh7 = ah7;\n\n bl0 = al0;\n bl1 = al1;\n bl2 = al2;\n bl3 = al3;\n bl4 = al4;\n bl5 = al5;\n bl6 = al6;\n bl7 = al7;\n\n // add\n h = ah7;\n l = al7;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n // Sigma1\n h = ((ah4 >>> 14) | (al4 << (32-14))) ^ ((ah4 >>> 18) | (al4 << (32-18))) ^ ((al4 >>> (41-32)) | (ah4 << (32-(41-32))));\n l = ((al4 >>> 14) | (ah4 << (32-14))) ^ ((al4 >>> 18) | (ah4 << (32-18))) ^ ((ah4 >>> (41-32)) | (al4 << (32-(41-32))));\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // Ch\n h = (ah4 & ah5) ^ (~ah4 & ah6);\n l = (al4 & al5) ^ (~al4 & al6);\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // K\n h = K[i*2];\n l = K[i*2+1];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // w\n h = wh[i%16];\n l = wl[i%16];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n th = c & 0xffff | d << 16;\n tl = a & 0xffff | b << 16;\n\n // add\n h = th;\n l = tl;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n // Sigma0\n h = ((ah0 >>> 28) | (al0 << (32-28))) ^ ((al0 >>> (34-32)) | (ah0 << (32-(34-32)))) ^ ((al0 >>> (39-32)) | (ah0 << (32-(39-32))));\n l = ((al0 >>> 28) | (ah0 << (32-28))) ^ ((ah0 >>> (34-32)) | (al0 << (32-(34-32)))) ^ ((ah0 >>> (39-32)) | (al0 << (32-(39-32))));\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // Maj\n h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2);\n l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2);\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n bh7 = (c & 0xffff) | (d << 16);\n bl7 = (a & 0xffff) | (b << 16);\n\n // add\n h = bh3;\n l = bl3;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = th;\n l = tl;\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n bh3 = (c & 0xffff) | (d << 16);\n bl3 = (a & 0xffff) | (b << 16);\n\n ah1 = bh0;\n ah2 = bh1;\n ah3 = bh2;\n ah4 = bh3;\n ah5 = bh4;\n ah6 = bh5;\n ah7 = bh6;\n ah0 = bh7;\n\n al1 = bl0;\n al2 = bl1;\n al3 = bl2;\n al4 = bl3;\n al5 = bl4;\n al6 = bl5;\n al7 = bl6;\n al0 = bl7;\n\n if (i%16 === 15) {\n for (j = 0; j < 16; j++) {\n // add\n h = wh[j];\n l = wl[j];\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = wh[(j+9)%16];\n l = wl[(j+9)%16];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // sigma0\n th = wh[(j+1)%16];\n tl = wl[(j+1)%16];\n h = ((th >>> 1) | (tl << (32-1))) ^ ((th >>> 8) | (tl << (32-8))) ^ (th >>> 7);\n l = ((tl >>> 1) | (th << (32-1))) ^ ((tl >>> 8) | (th << (32-8))) ^ ((tl >>> 7) | (th << (32-7)));\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // sigma1\n th = wh[(j+14)%16];\n tl = wl[(j+14)%16];\n h = ((th >>> 19) | (tl << (32-19))) ^ ((tl >>> (61-32)) | (th << (32-(61-32)))) ^ (th >>> 6);\n l = ((tl >>> 19) | (th << (32-19))) ^ ((th >>> (61-32)) | (tl << (32-(61-32)))) ^ ((tl >>> 6) | (th << (32-6)));\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n wh[j] = (c & 0xffff) | (d << 16);\n wl[j] = (a & 0xffff) | (b << 16);\n }\n }\n }\n\n // add\n h = ah0;\n l = al0;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[0];\n l = hl[0];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[0] = ah0 = (c & 0xffff) | (d << 16);\n hl[0] = al0 = (a & 0xffff) | (b << 16);\n\n h = ah1;\n l = al1;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[1];\n l = hl[1];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[1] = ah1 = (c & 0xffff) | (d << 16);\n hl[1] = al1 = (a & 0xffff) | (b << 16);\n\n h = ah2;\n l = al2;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[2];\n l = hl[2];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[2] = ah2 = (c & 0xffff) | (d << 16);\n hl[2] = al2 = (a & 0xffff) | (b << 16);\n\n h = ah3;\n l = al3;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[3];\n l = hl[3];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[3] = ah3 = (c & 0xffff) | (d << 16);\n hl[3] = al3 = (a & 0xffff) | (b << 16);\n\n h = ah4;\n l = al4;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[4];\n l = hl[4];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[4] = ah4 = (c & 0xffff) | (d << 16);\n hl[4] = al4 = (a & 0xffff) | (b << 16);\n\n h = ah5;\n l = al5;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[5];\n l = hl[5];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[5] = ah5 = (c & 0xffff) | (d << 16);\n hl[5] = al5 = (a & 0xffff) | (b << 16);\n\n h = ah6;\n l = al6;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[6];\n l = hl[6];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[6] = ah6 = (c & 0xffff) | (d << 16);\n hl[6] = al6 = (a & 0xffff) | (b << 16);\n\n h = ah7;\n l = al7;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[7];\n l = hl[7];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[7] = ah7 = (c & 0xffff) | (d << 16);\n hl[7] = al7 = (a & 0xffff) | (b << 16);\n\n pos += 128;\n n -= 128;\n }\n\n return n;\n}\n\nfunction crypto_hash(out, m, n) {\n var hh = new Int32Array(8),\n hl = new Int32Array(8),\n x = new Uint8Array(256),\n i, b = n;\n\n hh[0] = 0x6a09e667;\n hh[1] = 0xbb67ae85;\n hh[2] = 0x3c6ef372;\n hh[3] = 0xa54ff53a;\n hh[4] = 0x510e527f;\n hh[5] = 0x9b05688c;\n hh[6] = 0x1f83d9ab;\n hh[7] = 0x5be0cd19;\n\n hl[0] = 0xf3bcc908;\n hl[1] = 0x84caa73b;\n hl[2] = 0xfe94f82b;\n hl[3] = 0x5f1d36f1;\n hl[4] = 0xade682d1;\n hl[5] = 0x2b3e6c1f;\n hl[6] = 0xfb41bd6b;\n hl[7] = 0x137e2179;\n\n crypto_hashblocks_hl(hh, hl, m, n);\n n %= 128;\n\n for (i = 0; i < n; i++) x[i] = m[b-n+i];\n x[n] = 128;\n\n n = 256-128*(n<112?1:0);\n x[n-9] = 0;\n ts64(x, n-8, (b / 0x20000000) | 0, b << 3);\n crypto_hashblocks_hl(hh, hl, x, n);\n\n for (i = 0; i < 8; i++) ts64(out, 8*i, hh[i], hl[i]);\n\n return 0;\n}\n\nfunction add(p, q) {\n var a = gf(), b = gf(), c = gf(),\n d = gf(), e = gf(), f = gf(),\n g = gf(), h = gf(), t = gf();\n\n Z(a, p[1], p[0]);\n Z(t, q[1], q[0]);\n M(a, a, t);\n A(b, p[0], p[1]);\n A(t, q[0], q[1]);\n M(b, b, t);\n M(c, p[3], q[3]);\n M(c, c, D2);\n M(d, p[2], q[2]);\n A(d, d, d);\n Z(e, b, a);\n Z(f, d, c);\n A(g, d, c);\n A(h, b, a);\n\n M(p[0], e, f);\n M(p[1], h, g);\n M(p[2], g, f);\n M(p[3], e, h);\n}\n\nfunction cswap(p, q, b) {\n var i;\n for (i = 0; i < 4; i++) {\n sel25519(p[i], q[i], b);\n }\n}\n\nfunction pack(r, p) {\n var tx = gf(), ty = gf(), zi = gf();\n inv25519(zi, p[2]);\n M(tx, p[0], zi);\n M(ty, p[1], zi);\n pack25519(r, ty);\n r[31] ^= par25519(tx) << 7;\n}\n\nfunction scalarmult(p, q, s) {\n var b, i;\n set25519(p[0], gf0);\n set25519(p[1], gf1);\n set25519(p[2], gf1);\n set25519(p[3], gf0);\n for (i = 255; i >= 0; --i) {\n b = (s[(i/8)|0] >> (i&7)) & 1;\n cswap(p, q, b);\n add(q, p);\n add(p, p);\n cswap(p, q, b);\n }\n}\n\nfunction scalarbase(p, s) {\n var q = [gf(), gf(), gf(), gf()];\n set25519(q[0], X);\n set25519(q[1], Y);\n set25519(q[2], gf1);\n M(q[3], X, Y);\n scalarmult(p, q, s);\n}\n\nfunction crypto_sign_keypair(pk, sk, seeded) {\n var d = new Uint8Array(64);\n var p = [gf(), gf(), gf(), gf()];\n var i;\n\n if (!seeded) randombytes(sk, 32);\n crypto_hash(d, sk, 32);\n d[0] &= 248;\n d[31] &= 127;\n d[31] |= 64;\n\n scalarbase(p, d);\n pack(pk, p);\n\n for (i = 0; i < 32; i++) sk[i+32] = pk[i];\n return 0;\n}\n\nvar L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]);\n\nfunction modL(r, x) {\n var carry, i, j, k;\n for (i = 63; i >= 32; --i) {\n carry = 0;\n for (j = i - 32, k = i - 12; j < k; ++j) {\n x[j] += carry - 16 * x[i] * L[j - (i - 32)];\n carry = Math.floor((x[j] + 128) / 256);\n x[j] -= carry * 256;\n }\n x[j] += carry;\n x[i] = 0;\n }\n carry = 0;\n for (j = 0; j < 32; j++) {\n x[j] += carry - (x[31] >> 4) * L[j];\n carry = x[j] >> 8;\n x[j] &= 255;\n }\n for (j = 0; j < 32; j++) x[j] -= carry * L[j];\n for (i = 0; i < 32; i++) {\n x[i+1] += x[i] >> 8;\n r[i] = x[i] & 255;\n }\n}\n\nfunction reduce(r) {\n var x = new Float64Array(64), i;\n for (i = 0; i < 64; i++) x[i] = r[i];\n for (i = 0; i < 64; i++) r[i] = 0;\n modL(r, x);\n}\n\n// Note: difference from C - smlen returned, not passed as argument.\nfunction crypto_sign(sm, m, n, sk) {\n var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64);\n var i, j, x = new Float64Array(64);\n var p = [gf(), gf(), gf(), gf()];\n\n crypto_hash(d, sk, 32);\n d[0] &= 248;\n d[31] &= 127;\n d[31] |= 64;\n\n var smlen = n + 64;\n for (i = 0; i < n; i++) sm[64 + i] = m[i];\n for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i];\n\n crypto_hash(r, sm.subarray(32), n+32);\n reduce(r);\n scalarbase(p, r);\n pack(sm, p);\n\n for (i = 32; i < 64; i++) sm[i] = sk[i];\n crypto_hash(h, sm, n + 64);\n reduce(h);\n\n for (i = 0; i < 64; i++) x[i] = 0;\n for (i = 0; i < 32; i++) x[i] = r[i];\n for (i = 0; i < 32; i++) {\n for (j = 0; j < 32; j++) {\n x[i+j] += h[i] * d[j];\n }\n }\n\n modL(sm.subarray(32), x);\n return smlen;\n}\n\nfunction unpackneg(r, p) {\n var t = gf(), chk = gf(), num = gf(),\n den = gf(), den2 = gf(), den4 = gf(),\n den6 = gf();\n\n set25519(r[2], gf1);\n unpack25519(r[1], p);\n S(num, r[1]);\n M(den, num, D);\n Z(num, num, r[2]);\n A(den, r[2], den);\n\n S(den2, den);\n S(den4, den2);\n M(den6, den4, den2);\n M(t, den6, num);\n M(t, t, den);\n\n pow2523(t, t);\n M(t, t, num);\n M(t, t, den);\n M(t, t, den);\n M(r[0], t, den);\n\n S(chk, r[0]);\n M(chk, chk, den);\n if (neq25519(chk, num)) M(r[0], r[0], I);\n\n S(chk, r[0]);\n M(chk, chk, den);\n if (neq25519(chk, num)) return -1;\n\n if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]);\n\n M(r[3], r[0], r[1]);\n return 0;\n}\n\nfunction crypto_sign_open(m, sm, n, pk) {\n var i;\n var t = new Uint8Array(32), h = new Uint8Array(64);\n var p = [gf(), gf(), gf(), gf()],\n q = [gf(), gf(), gf(), gf()];\n\n if (n < 64) return -1;\n\n if (unpackneg(q, pk)) return -1;\n\n for (i = 0; i < n; i++) m[i] = sm[i];\n for (i = 0; i < 32; i++) m[i+32] = pk[i];\n crypto_hash(h, m, n);\n reduce(h);\n scalarmult(p, q, h);\n\n scalarbase(q, sm.subarray(32));\n add(p, q);\n pack(t, p);\n\n n -= 64;\n if (crypto_verify_32(sm, 0, t, 0)) {\n for (i = 0; i < n; i++) m[i] = 0;\n return -1;\n }\n\n for (i = 0; i < n; i++) m[i] = sm[i + 64];\n return n;\n}\n\nvar crypto_secretbox_KEYBYTES = 32,\n crypto_secretbox_NONCEBYTES = 24,\n crypto_secretbox_ZEROBYTES = 32,\n crypto_secretbox_BOXZEROBYTES = 16,\n crypto_scalarmult_BYTES = 32,\n crypto_scalarmult_SCALARBYTES = 32,\n crypto_box_PUBLICKEYBYTES = 32,\n crypto_box_SECRETKEYBYTES = 32,\n crypto_box_BEFORENMBYTES = 32,\n crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES,\n crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES,\n crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES,\n crypto_sign_BYTES = 64,\n crypto_sign_PUBLICKEYBYTES = 32,\n crypto_sign_SECRETKEYBYTES = 64,\n crypto_sign_SEEDBYTES = 32,\n crypto_hash_BYTES = 64;\n\nnacl.lowlevel = {\n crypto_core_hsalsa20: crypto_core_hsalsa20,\n crypto_stream_xor: crypto_stream_xor,\n crypto_stream: crypto_stream,\n crypto_stream_salsa20_xor: crypto_stream_salsa20_xor,\n crypto_stream_salsa20: crypto_stream_salsa20,\n crypto_onetimeauth: crypto_onetimeauth,\n crypto_onetimeauth_verify: crypto_onetimeauth_verify,\n crypto_verify_16: crypto_verify_16,\n crypto_verify_32: crypto_verify_32,\n crypto_secretbox: crypto_secretbox,\n crypto_secretbox_open: crypto_secretbox_open,\n crypto_scalarmult: crypto_scalarmult,\n crypto_scalarmult_base: crypto_scalarmult_base,\n crypto_box_beforenm: crypto_box_beforenm,\n crypto_box_afternm: crypto_box_afternm,\n crypto_box: crypto_box,\n crypto_box_open: crypto_box_open,\n crypto_box_keypair: crypto_box_keypair,\n crypto_hash: crypto_hash,\n crypto_sign: crypto_sign,\n crypto_sign_keypair: crypto_sign_keypair,\n crypto_sign_open: crypto_sign_open,\n\n crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES,\n crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES,\n crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES,\n crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES,\n crypto_scalarmult_BYTES: crypto_scalarmult_BYTES,\n crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES,\n crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES,\n crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES,\n crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES,\n crypto_box_NONCEBYTES: crypto_box_NONCEBYTES,\n crypto_box_ZEROBYTES: crypto_box_ZEROBYTES,\n crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES,\n crypto_sign_BYTES: crypto_sign_BYTES,\n crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES,\n crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES,\n crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES,\n crypto_hash_BYTES: crypto_hash_BYTES,\n\n gf: gf,\n D: D,\n L: L,\n pack25519: pack25519,\n unpack25519: unpack25519,\n M: M,\n A: A,\n S: S,\n Z: Z,\n pow2523: pow2523,\n add: add,\n set25519: set25519,\n modL: modL,\n scalarmult: scalarmult,\n scalarbase: scalarbase,\n};\n\n/* High-level API */\n\nfunction checkLengths(k, n) {\n if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size');\n if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size');\n}\n\nfunction checkBoxLengths(pk, sk) {\n if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size');\n if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size');\n}\n\nfunction checkArrayTypes() {\n for (var i = 0; i < arguments.length; i++) {\n if (!(arguments[i] instanceof Uint8Array))\n throw new TypeError('unexpected type, use Uint8Array');\n }\n}\n\nfunction cleanup(arr) {\n for (var i = 0; i < arr.length; i++) arr[i] = 0;\n}\n\nnacl.randomBytes = function(n) {\n var b = new Uint8Array(n);\n randombytes(b, n);\n return b;\n};\n\nnacl.secretbox = function(msg, nonce, key) {\n checkArrayTypes(msg, nonce, key);\n checkLengths(key, nonce);\n var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length);\n var c = new Uint8Array(m.length);\n for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i];\n crypto_secretbox(c, m, m.length, nonce, key);\n return c.subarray(crypto_secretbox_BOXZEROBYTES);\n};\n\nnacl.secretbox.open = function(box, nonce, key) {\n checkArrayTypes(box, nonce, key);\n checkLengths(key, nonce);\n var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length);\n var m = new Uint8Array(c.length);\n for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i];\n if (c.length < 32) return null;\n if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return null;\n return m.subarray(crypto_secretbox_ZEROBYTES);\n};\n\nnacl.secretbox.keyLength = crypto_secretbox_KEYBYTES;\nnacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES;\nnacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES;\n\nnacl.scalarMult = function(n, p) {\n checkArrayTypes(n, p);\n if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');\n if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size');\n var q = new Uint8Array(crypto_scalarmult_BYTES);\n crypto_scalarmult(q, n, p);\n return q;\n};\n\nnacl.scalarMult.base = function(n) {\n checkArrayTypes(n);\n if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');\n var q = new Uint8Array(crypto_scalarmult_BYTES);\n crypto_scalarmult_base(q, n);\n return q;\n};\n\nnacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES;\nnacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES;\n\nnacl.box = function(msg, nonce, publicKey, secretKey) {\n var k = nacl.box.before(publicKey, secretKey);\n return nacl.secretbox(msg, nonce, k);\n};\n\nnacl.box.before = function(publicKey, secretKey) {\n checkArrayTypes(publicKey, secretKey);\n checkBoxLengths(publicKey, secretKey);\n var k = new Uint8Array(crypto_box_BEFORENMBYTES);\n crypto_box_beforenm(k, publicKey, secretKey);\n return k;\n};\n\nnacl.box.after = nacl.secretbox;\n\nnacl.box.open = function(msg, nonce, publicKey, secretKey) {\n var k = nacl.box.before(publicKey, secretKey);\n return nacl.secretbox.open(msg, nonce, k);\n};\n\nnacl.box.open.after = nacl.secretbox.open;\n\nnacl.box.keyPair = function() {\n var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);\n var sk = new Uint8Array(crypto_box_SECRETKEYBYTES);\n crypto_box_keypair(pk, sk);\n return {publicKey: pk, secretKey: sk};\n};\n\nnacl.box.keyPair.fromSecretKey = function(secretKey) {\n checkArrayTypes(secretKey);\n if (secretKey.length !== crypto_box_SECRETKEYBYTES)\n throw new Error('bad secret key size');\n var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);\n crypto_scalarmult_base(pk, secretKey);\n return {publicKey: pk, secretKey: new Uint8Array(secretKey)};\n};\n\nnacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES;\nnacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES;\nnacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES;\nnacl.box.nonceLength = crypto_box_NONCEBYTES;\nnacl.box.overheadLength = nacl.secretbox.overheadLength;\n\nnacl.sign = function(msg, secretKey) {\n checkArrayTypes(msg, secretKey);\n if (secretKey.length !== crypto_sign_SECRETKEYBYTES)\n throw new Error('bad secret key size');\n var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length);\n crypto_sign(signedMsg, msg, msg.length, secretKey);\n return signedMsg;\n};\n\nnacl.sign.open = function(signedMsg, publicKey) {\n checkArrayTypes(signedMsg, publicKey);\n if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)\n throw new Error('bad public key size');\n var tmp = new Uint8Array(signedMsg.length);\n var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey);\n if (mlen < 0) return null;\n var m = new Uint8Array(mlen);\n for (var i = 0; i < m.length; i++) m[i] = tmp[i];\n return m;\n};\n\nnacl.sign.detached = function(msg, secretKey) {\n var signedMsg = nacl.sign(msg, secretKey);\n var sig = new Uint8Array(crypto_sign_BYTES);\n for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];\n return sig;\n};\n\nnacl.sign.detached.verify = function(msg, sig, publicKey) {\n checkArrayTypes(msg, sig, publicKey);\n if (sig.length !== crypto_sign_BYTES)\n throw new Error('bad signature size');\n if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)\n throw new Error('bad public key size');\n var sm = new Uint8Array(crypto_sign_BYTES + msg.length);\n var m = new Uint8Array(crypto_sign_BYTES + msg.length);\n var i;\n for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i];\n for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i];\n return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0);\n};\n\nnacl.sign.keyPair = function() {\n var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);\n crypto_sign_keypair(pk, sk);\n return {publicKey: pk, secretKey: sk};\n};\n\nnacl.sign.keyPair.fromSecretKey = function(secretKey) {\n checkArrayTypes(secretKey);\n if (secretKey.length !== crypto_sign_SECRETKEYBYTES)\n throw new Error('bad secret key size');\n var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i];\n return {publicKey: pk, secretKey: new Uint8Array(secretKey)};\n};\n\nnacl.sign.keyPair.fromSeed = function(seed) {\n checkArrayTypes(seed);\n if (seed.length !== crypto_sign_SEEDBYTES)\n throw new Error('bad seed size');\n var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);\n for (var i = 0; i < 32; i++) sk[i] = seed[i];\n crypto_sign_keypair(pk, sk, true);\n return {publicKey: pk, secretKey: sk};\n};\n\nnacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES;\nnacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES;\nnacl.sign.seedLength = crypto_sign_SEEDBYTES;\nnacl.sign.signatureLength = crypto_sign_BYTES;\n\nnacl.hash = function(msg) {\n checkArrayTypes(msg);\n var h = new Uint8Array(crypto_hash_BYTES);\n crypto_hash(h, msg, msg.length);\n return h;\n};\n\nnacl.hash.hashLength = crypto_hash_BYTES;\n\nnacl.verify = function(x, y) {\n checkArrayTypes(x, y);\n // Zero length arguments are considered not equal.\n if (x.length === 0 || y.length === 0) return false;\n if (x.length !== y.length) return false;\n return (vn(x, 0, y, 0, x.length) === 0) ? true : false;\n};\n\nnacl.setPRNG = function(fn) {\n randombytes = fn;\n};\n\n(function() {\n // Initialize PRNG if environment provides CSPRNG.\n // If not, methods calling randombytes will throw.\n var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null;\n if (crypto && crypto.getRandomValues) {\n // Browsers.\n var QUOTA = 65536;\n nacl.setPRNG(function(x, n) {\n var i, v = new Uint8Array(n);\n for (i = 0; i < n; i += QUOTA) {\n crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA)));\n }\n for (i = 0; i < n; i++) x[i] = v[i];\n cleanup(v);\n });\n } else if (typeof require !== 'undefined') {\n // Node.js.\n crypto = require('crypto');\n if (crypto && crypto.randomBytes) {\n nacl.setPRNG(function(x, n) {\n var i, v = crypto.randomBytes(n);\n for (i = 0; i < n; i++) x[i] = v[i];\n cleanup(v);\n });\n }\n }\n})();\n\n})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.replaceDerive = exports.pathRegex = void 0;\nexports.pathRegex = new RegExp(\"^m(\\\\/[0-9]+')+$\");\nexports.replaceDerive = (val) => val.replace(\"'\", '');\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.derivePath = exports.isValidPath = exports.getPublicKey = exports.CKDPriv = exports.getMasterKeyFromSeed = void 0;\nconst createHmac = require(\"create-hmac\");\nconst nacl = require(\"tweetnacl\");\nconst utils_1 = require(\"./utils\");\nconst ED25519_CURVE = 'ed25519 seed';\nconst HARDENED_OFFSET = 0x80000000;\nexports.getMasterKeyFromSeed = (seed) => {\n const hmac = createHmac('sha512', ED25519_CURVE);\n const I = hmac.update(Buffer.from(seed, 'hex')).digest();\n const IL = I.slice(0, 32);\n const IR = I.slice(32);\n return {\n key: IL,\n chainCode: IR,\n };\n};\nexports.CKDPriv = ({ key, chainCode }, index) => {\n const indexBuffer = Buffer.allocUnsafe(4);\n indexBuffer.writeUInt32BE(index, 0);\n const data = Buffer.concat([Buffer.alloc(1, 0), key, indexBuffer]);\n const I = createHmac('sha512', chainCode)\n .update(data)\n .digest();\n const IL = I.slice(0, 32);\n const IR = I.slice(32);\n return {\n key: IL,\n chainCode: IR,\n };\n};\nexports.getPublicKey = (privateKey, withZeroByte = true) => {\n const keyPair = nacl.sign.keyPair.fromSeed(privateKey);\n const signPk = keyPair.secretKey.subarray(32);\n const zero = Buffer.alloc(1, 0);\n return withZeroByte ?\n Buffer.concat([zero, Buffer.from(signPk)]) :\n Buffer.from(signPk);\n};\nexports.isValidPath = (path) => {\n if (!utils_1.pathRegex.test(path)) {\n return false;\n }\n return !path\n .split('/')\n .slice(1)\n .map(utils_1.replaceDerive)\n .some(isNaN);\n};\nexports.derivePath = (path, seed, offset = HARDENED_OFFSET) => {\n if (!exports.isValidPath(path)) {\n throw new Error('Invalid derivation path');\n }\n const { key, chainCode } = exports.getMasterKeyFromSeed(seed);\n const segments = path\n .split('/')\n .slice(1)\n .map(utils_1.replaceDerive)\n .map(el => parseInt(el, 10));\n return segments.reduce((parentKeys, segment) => exports.CKDPriv(parentKeys, segment + offset), { key, chainCode });\n};\n","'use strict';\n\nconst BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments'];\nconst hasBlob = typeof Blob !== 'undefined';\n\nif (hasBlob) BINARY_TYPES.push('blob');\n\nmodule.exports = {\n BINARY_TYPES,\n CLOSE_TIMEOUT: 30000,\n EMPTY_BUFFER: Buffer.alloc(0),\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\n hasBlob,\n kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),\n kListener: Symbol('kListener'),\n kStatusCode: Symbol('status-code'),\n kWebSocket: Symbol('websocket'),\n NOOP: () => {}\n};\n","var fs = require('fs')\nvar path = require('path')\nvar os = require('os')\n\n// Workaround to fix webpack's build warnings: 'the request of a dependency is an expression'\nvar runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line\n\nvar vars = (process.config && process.config.variables) || {}\nvar prebuildsOnly = !!process.env.PREBUILDS_ONLY\nvar abi = process.versions.modules // TODO: support old node where this is undef\nvar runtime = isElectron() ? 'electron' : (isNwjs() ? 'node-webkit' : 'node')\n\nvar arch = process.env.npm_config_arch || os.arch()\nvar platform = process.env.npm_config_platform || os.platform()\nvar libc = process.env.LIBC || (isAlpine(platform) ? 'musl' : 'glibc')\nvar armv = process.env.ARM_VERSION || (arch === 'arm64' ? '8' : vars.arm_version) || ''\nvar uv = (process.versions.uv || '').split('.')[0]\n\nmodule.exports = load\n\nfunction load (dir) {\n return runtimeRequire(load.resolve(dir))\n}\n\nload.resolve = load.path = function (dir) {\n dir = path.resolve(dir || '.')\n\n try {\n var name = runtimeRequire(path.join(dir, 'package.json')).name.toUpperCase().replace(/-/g, '_')\n if (process.env[name + '_PREBUILD']) dir = process.env[name + '_PREBUILD']\n } catch (err) {}\n\n if (!prebuildsOnly) {\n var release = getFirst(path.join(dir, 'build/Release'), matchBuild)\n if (release) return release\n\n var debug = getFirst(path.join(dir, 'build/Debug'), matchBuild)\n if (debug) return debug\n }\n\n var prebuild = resolve(dir)\n if (prebuild) return prebuild\n\n var nearby = resolve(path.dirname(process.execPath))\n if (nearby) return nearby\n\n var target = [\n 'platform=' + platform,\n 'arch=' + arch,\n 'runtime=' + runtime,\n 'abi=' + abi,\n 'uv=' + uv,\n armv ? 'armv=' + armv : '',\n 'libc=' + libc,\n 'node=' + process.versions.node,\n process.versions.electron ? 'electron=' + process.versions.electron : '',\n typeof __webpack_require__ === 'function' ? 'webpack=true' : '' // eslint-disable-line\n ].filter(Boolean).join(' ')\n\n throw new Error('No native build was found for ' + target + '\\n loaded from: ' + dir + '\\n')\n\n function resolve (dir) {\n // Find matching \"prebuilds/<platform>-<arch>\" directory\n var tuples = readdirSync(path.join(dir, 'prebuilds')).map(parseTuple)\n var tuple = tuples.filter(matchTuple(platform, arch)).sort(compareTuples)[0]\n if (!tuple) return\n\n // Find most specific flavor first\n var prebuilds = path.join(dir, 'prebuilds', tuple.name)\n var parsed = readdirSync(prebuilds).map(parseTags)\n var candidates = parsed.filter(matchTags(runtime, abi))\n var winner = candidates.sort(compareTags(runtime))[0]\n if (winner) return path.join(prebuilds, winner.file)\n }\n}\n\nfunction readdirSync (dir) {\n try {\n return fs.readdirSync(dir)\n } catch (err) {\n return []\n }\n}\n\nfunction getFirst (dir, filter) {\n var files = readdirSync(dir).filter(filter)\n return files[0] && path.join(dir, files[0])\n}\n\nfunction matchBuild (name) {\n return /\\.node$/.test(name)\n}\n\nfunction parseTuple (name) {\n // Example: darwin-x64+arm64\n var arr = name.split('-')\n if (arr.length !== 2) return\n\n var platform = arr[0]\n var architectures = arr[1].split('+')\n\n if (!platform) return\n if (!architectures.length) return\n if (!architectures.every(Boolean)) return\n\n return { name, platform, architectures }\n}\n\nfunction matchTuple (platform, arch) {\n return function (tuple) {\n if (tuple == null) return false\n if (tuple.platform !== platform) return false\n return tuple.architectures.includes(arch)\n }\n}\n\nfunction compareTuples (a, b) {\n // Prefer single-arch prebuilds over multi-arch\n return a.architectures.length - b.architectures.length\n}\n\nfunction parseTags (file) {\n var arr = file.split('.')\n var extension = arr.pop()\n var tags = { file: file, specificity: 0 }\n\n if (extension !== 'node') return\n\n for (var i = 0; i < arr.length; i++) {\n var tag = arr[i]\n\n if (tag === 'node' || tag === 'electron' || tag === 'node-webkit') {\n tags.runtime = tag\n } else if (tag === 'napi') {\n tags.napi = true\n } else if (tag.slice(0, 3) === 'abi') {\n tags.abi = tag.slice(3)\n } else if (tag.slice(0, 2) === 'uv') {\n tags.uv = tag.slice(2)\n } else if (tag.slice(0, 4) === 'armv') {\n tags.armv = tag.slice(4)\n } else if (tag === 'glibc' || tag === 'musl') {\n tags.libc = tag\n } else {\n continue\n }\n\n tags.specificity++\n }\n\n return tags\n}\n\nfunction matchTags (runtime, abi) {\n return function (tags) {\n if (tags == null) return false\n if (tags.runtime && tags.runtime !== runtime && !runtimeAgnostic(tags)) return false\n if (tags.abi && tags.abi !== abi && !tags.napi) return false\n if (tags.uv && tags.uv !== uv) return false\n if (tags.armv && tags.armv !== armv) return false\n if (tags.libc && tags.libc !== libc) return false\n\n return true\n }\n}\n\nfunction runtimeAgnostic (tags) {\n return tags.runtime === 'node' && tags.napi\n}\n\nfunction compareTags (runtime) {\n // Precedence: non-agnostic runtime, abi over napi, then by specificity.\n return function (a, b) {\n if (a.runtime !== b.runtime) {\n return a.runtime === runtime ? -1 : 1\n } else if (a.abi !== b.abi) {\n return a.abi ? -1 : 1\n } else if (a.specificity !== b.specificity) {\n return a.specificity > b.specificity ? -1 : 1\n } else {\n return 0\n }\n }\n}\n\nfunction isNwjs () {\n return !!(process.versions && process.versions.nw)\n}\n\nfunction isElectron () {\n if (process.versions && process.versions.electron) return true\n if (process.env.ELECTRON_RUN_AS_NODE) return true\n return typeof window !== 'undefined' && window.process && window.process.type === 'renderer'\n}\n\nfunction isAlpine (platform) {\n return platform === 'linux' && fs.existsSync('/etc/alpine-release')\n}\n\n// Exposed for unit tests\n// TODO: move to lib\nload.parseTags = parseTags\nload.matchTags = matchTags\nload.compareTags = compareTags\nload.parseTuple = parseTuple\nload.matchTuple = matchTuple\nload.compareTuples = compareTuples\n","const runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line\nif (typeof runtimeRequire.addon === 'function') { // if the platform supports native resolving prefer that\n module.exports = runtimeRequire.addon.bind(runtimeRequire)\n} else { // else use the runtime version here\n module.exports = require('./node-gyp-build.js')\n}\n","'use strict';\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nconst mask = (source, mask, output, offset, length) => {\n for (var i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n};\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nconst unmask = (buffer, mask) => {\n // Required until https://github.com/nodejs/node/issues/9006 is resolved.\n const length = buffer.length;\n for (var i = 0; i < length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n};\n\nmodule.exports = { mask, unmask };\n","'use strict';\n\ntry {\n module.exports = require('node-gyp-build')(__dirname);\n} catch (e) {\n module.exports = require('./fallback');\n}\n","'use strict';\n\nconst { EMPTY_BUFFER } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\n\n/**\n * Merges an array of buffers into a new buffer.\n *\n * @param {Buffer[]} list The array of buffers to concat\n * @param {Number} totalLength The total length of buffers in the list\n * @return {Buffer} The resulting buffer\n * @public\n */\nfunction concat(list, totalLength) {\n if (list.length === 0) return EMPTY_BUFFER;\n if (list.length === 1) return list[0];\n\n const target = Buffer.allocUnsafe(totalLength);\n let offset = 0;\n\n for (let i = 0; i < list.length; i++) {\n const buf = list[i];\n target.set(buf, offset);\n offset += buf.length;\n }\n\n if (offset < totalLength) {\n return new FastBuffer(target.buffer, target.byteOffset, offset);\n }\n\n return target;\n}\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nfunction _mask(source, mask, output, offset, length) {\n for (let i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n}\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nfunction _unmask(buffer, mask) {\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n}\n\n/**\n * Converts a buffer to an `ArrayBuffer`.\n *\n * @param {Buffer} buf The buffer to convert\n * @return {ArrayBuffer} Converted buffer\n * @public\n */\nfunction toArrayBuffer(buf) {\n if (buf.length === buf.buffer.byteLength) {\n return buf.buffer;\n }\n\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);\n}\n\n/**\n * Converts `data` to a `Buffer`.\n *\n * @param {*} data The data to convert\n * @return {Buffer} The buffer\n * @throws {TypeError}\n * @public\n */\nfunction toBuffer(data) {\n toBuffer.readOnly = true;\n\n if (Buffer.isBuffer(data)) return data;\n\n let buf;\n\n if (data instanceof ArrayBuffer) {\n buf = new FastBuffer(data);\n } else if (ArrayBuffer.isView(data)) {\n buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength);\n } else {\n buf = Buffer.from(data);\n toBuffer.readOnly = false;\n }\n\n return buf;\n}\n\nmodule.exports = {\n concat,\n mask: _mask,\n toArrayBuffer,\n toBuffer,\n unmask: _unmask\n};\n\n/* istanbul ignore else */\nif (!process.env.WS_NO_BUFFER_UTIL) {\n try {\n const bufferUtil = require('bufferutil');\n\n module.exports.mask = function (source, mask, output, offset, length) {\n if (length < 48) _mask(source, mask, output, offset, length);\n else bufferUtil.mask(source, mask, output, offset, length);\n };\n\n module.exports.unmask = function (buffer, mask) {\n if (buffer.length < 32) _unmask(buffer, mask);\n else bufferUtil.unmask(buffer, mask);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n","'use strict';\n\nconst zlib = require('zlib');\n\nconst bufferUtil = require('./buffer-util');\nconst Limiter = require('./limiter');\nconst { kStatusCode } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\nconst kPerMessageDeflate = Symbol('permessage-deflate');\nconst kTotalLength = Symbol('total-length');\nconst kCallback = Symbol('callback');\nconst kBuffers = Symbol('buffers');\nconst kError = Symbol('error');\n\n//\n// We limit zlib concurrency, which prevents severe memory fragmentation\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\n// and https://github.com/websockets/ws/issues/1202\n//\n// Intentionally global; it's the global thread pool that's an issue.\n//\nlet zlibLimiter;\n\n/**\n * permessage-deflate implementation.\n */\nclass PerMessageDeflate {\n /**\n * Creates a PerMessageDeflate instance.\n *\n * @param {Object} [options] Configuration options\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n * for, or request, a custom client window size\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n * acknowledge disabling of client context takeover\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n * calls to zlib\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n * use of a custom server window size\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n * disabling of server context takeover\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\n * messages should not be compressed if context takeover is disabled\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n * deflate\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n * inflate\n * @param {Boolean} [isServer=false] Create the instance in either server or\n * client mode\n * @param {Number} [maxPayload=0] The maximum allowed message length\n */\n constructor(options, isServer, maxPayload) {\n this._maxPayload = maxPayload | 0;\n this._options = options || {};\n this._threshold =\n this._options.threshold !== undefined ? this._options.threshold : 1024;\n this._isServer = !!isServer;\n this._deflate = null;\n this._inflate = null;\n\n this.params = null;\n\n if (!zlibLimiter) {\n const concurrency =\n this._options.concurrencyLimit !== undefined\n ? this._options.concurrencyLimit\n : 10;\n zlibLimiter = new Limiter(concurrency);\n }\n }\n\n /**\n * @type {String}\n */\n static get extensionName() {\n return 'permessage-deflate';\n }\n\n /**\n * Create an extension negotiation offer.\n *\n * @return {Object} Extension parameters\n * @public\n */\n offer() {\n const params = {};\n\n if (this._options.serverNoContextTakeover) {\n params.server_no_context_takeover = true;\n }\n if (this._options.clientNoContextTakeover) {\n params.client_no_context_takeover = true;\n }\n if (this._options.serverMaxWindowBits) {\n params.server_max_window_bits = this._options.serverMaxWindowBits;\n }\n if (this._options.clientMaxWindowBits) {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n } else if (this._options.clientMaxWindowBits == null) {\n params.client_max_window_bits = true;\n }\n\n return params;\n }\n\n /**\n * Accept an extension negotiation offer/response.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Object} Accepted configuration\n * @public\n */\n accept(configurations) {\n configurations = this.normalizeParams(configurations);\n\n this.params = this._isServer\n ? this.acceptAsServer(configurations)\n : this.acceptAsClient(configurations);\n\n return this.params;\n }\n\n /**\n * Releases all resources used by the extension.\n *\n * @public\n */\n cleanup() {\n if (this._inflate) {\n this._inflate.close();\n this._inflate = null;\n }\n\n if (this._deflate) {\n const callback = this._deflate[kCallback];\n\n this._deflate.close();\n this._deflate = null;\n\n if (callback) {\n callback(\n new Error(\n 'The deflate stream was closed while data was being processed'\n )\n );\n }\n }\n }\n\n /**\n * Accept an extension negotiation offer.\n *\n * @param {Array} offers The extension negotiation offers\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsServer(offers) {\n const opts = this._options;\n const accepted = offers.find((params) => {\n if (\n (opts.serverNoContextTakeover === false &&\n params.server_no_context_takeover) ||\n (params.server_max_window_bits &&\n (opts.serverMaxWindowBits === false ||\n (typeof opts.serverMaxWindowBits === 'number' &&\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n (typeof opts.clientMaxWindowBits === 'number' &&\n !params.client_max_window_bits)\n ) {\n return false;\n }\n\n return true;\n });\n\n if (!accepted) {\n throw new Error('None of the extension offers can be accepted');\n }\n\n if (opts.serverNoContextTakeover) {\n accepted.server_no_context_takeover = true;\n }\n if (opts.clientNoContextTakeover) {\n accepted.client_no_context_takeover = true;\n }\n if (typeof opts.serverMaxWindowBits === 'number') {\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\n }\n if (typeof opts.clientMaxWindowBits === 'number') {\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\n } else if (\n accepted.client_max_window_bits === true ||\n opts.clientMaxWindowBits === false\n ) {\n delete accepted.client_max_window_bits;\n }\n\n return accepted;\n }\n\n /**\n * Accept the extension negotiation response.\n *\n * @param {Array} response The extension negotiation response\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsClient(response) {\n const params = response[0];\n\n if (\n this._options.clientNoContextTakeover === false &&\n params.client_no_context_takeover\n ) {\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n }\n\n if (!params.client_max_window_bits) {\n if (typeof this._options.clientMaxWindowBits === 'number') {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n }\n } else if (\n this._options.clientMaxWindowBits === false ||\n (typeof this._options.clientMaxWindowBits === 'number' &&\n params.client_max_window_bits > this._options.clientMaxWindowBits)\n ) {\n throw new Error(\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\n );\n }\n\n return params;\n }\n\n /**\n * Normalize parameters.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Array} The offers/response with normalized parameters\n * @private\n */\n normalizeParams(configurations) {\n configurations.forEach((params) => {\n Object.keys(params).forEach((key) => {\n let value = params[key];\n\n if (value.length > 1) {\n throw new Error(`Parameter \"${key}\" must have only a single value`);\n }\n\n value = value[0];\n\n if (key === 'client_max_window_bits') {\n if (value !== true) {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (!this._isServer) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else if (key === 'server_max_window_bits') {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (\n key === 'client_no_context_takeover' ||\n key === 'server_no_context_takeover'\n ) {\n if (value !== true) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else {\n throw new Error(`Unknown parameter \"${key}\"`);\n }\n\n params[key] = value;\n });\n });\n\n return configurations;\n }\n\n /**\n * Decompress data. Concurrency limited.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n decompress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._decompress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Compress data. Concurrency limited.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n compress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._compress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Decompress data.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _decompress(data, fin, callback) {\n const endpoint = this._isServer ? 'client' : 'server';\n\n if (!this._inflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._inflate = zlib.createInflateRaw({\n ...this._options.zlibInflateOptions,\n windowBits\n });\n this._inflate[kPerMessageDeflate] = this;\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n this._inflate.on('error', inflateOnError);\n this._inflate.on('data', inflateOnData);\n }\n\n this._inflate[kCallback] = callback;\n\n this._inflate.write(data);\n if (fin) this._inflate.write(TRAILER);\n\n this._inflate.flush(() => {\n const err = this._inflate[kError];\n\n if (err) {\n this._inflate.close();\n this._inflate = null;\n callback(err);\n return;\n }\n\n const data = bufferUtil.concat(\n this._inflate[kBuffers],\n this._inflate[kTotalLength]\n );\n\n if (this._inflate._readableState.endEmitted) {\n this._inflate.close();\n this._inflate = null;\n } else {\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._inflate.reset();\n }\n }\n\n callback(null, data);\n });\n }\n\n /**\n * Compress data.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _compress(data, fin, callback) {\n const endpoint = this._isServer ? 'server' : 'client';\n\n if (!this._deflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._deflate = zlib.createDeflateRaw({\n ...this._options.zlibDeflateOptions,\n windowBits\n });\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n this._deflate.on('data', deflateOnData);\n }\n\n this._deflate[kCallback] = callback;\n\n this._deflate.write(data);\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n if (!this._deflate) {\n //\n // The deflate stream was closed while data was being processed.\n //\n return;\n }\n\n let data = bufferUtil.concat(\n this._deflate[kBuffers],\n this._deflate[kTotalLength]\n );\n\n if (fin) {\n data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4);\n }\n\n //\n // Ensure that the callback will not be called again in\n // `PerMessageDeflate#cleanup()`.\n //\n this._deflate[kCallback] = null;\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._deflate.reset();\n }\n\n callback(null, data);\n });\n }\n}\n\nmodule.exports = PerMessageDeflate;\n\n/**\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction deflateOnData(chunk) {\n this[kBuffers].push(chunk);\n this[kTotalLength] += chunk.length;\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction inflateOnData(chunk) {\n this[kTotalLength] += chunk.length;\n\n if (\n this[kPerMessageDeflate]._maxPayload < 1 ||\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\n ) {\n this[kBuffers].push(chunk);\n return;\n }\n\n this[kError] = new RangeError('Max payload size exceeded');\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\n this[kError][kStatusCode] = 1009;\n this.removeListener('data', inflateOnData);\n\n //\n // The choice to employ `zlib.reset()` over `zlib.close()` is dictated by the\n // fact that in Node.js versions prior to 13.10.0, the callback for\n // `zlib.flush()` is not called if `zlib.close()` is used. Utilizing\n // `zlib.reset()` ensures that either the callback is invoked or an error is\n // emitted.\n //\n this.reset();\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\n *\n * @param {Error} err The emitted error\n * @private\n */\nfunction inflateOnError(err) {\n //\n // There is no need to call `Zlib#close()` as the handle is automatically\n // closed when an error is emitted.\n //\n this[kPerMessageDeflate]._inflate = null;\n\n if (this[kError]) {\n this[kCallback](this[kError]);\n return;\n }\n\n err[kStatusCode] = 1007;\n this[kCallback](err);\n}\n","'use strict';\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0x00) { // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) { // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) { // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80 || // overlong\n buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0 // surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) { // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80 || // overlong\n buf[i] === 0xf4 && buf[i + 1] > 0x8f || buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\nmodule.exports = isValidUTF8;\n","'use strict';\n\ntry {\n module.exports = require('node-gyp-build')(__dirname);\n} catch (e) {\n module.exports = require('./fallback');\n}\n","'use strict';\n\nconst { isUtf8 } = require('buffer');\n\nconst { hasBlob } = require('./constants');\n\n//\n// Allowed token characters:\n//\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\n//\n// tokenChars[32] === 0 // ' '\n// tokenChars[33] === 1 // '!'\n// tokenChars[34] === 0 // '\"'\n// ...\n//\n// prettier-ignore\nconst tokenChars = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\n];\n\n/**\n * Checks if a status code is allowed in a close frame.\n *\n * @param {Number} code The status code\n * @return {Boolean} `true` if the status code is valid, else `false`\n * @public\n */\nfunction isValidStatusCode(code) {\n return (\n (code >= 1000 &&\n code <= 1014 &&\n code !== 1004 &&\n code !== 1005 &&\n code !== 1006) ||\n (code >= 3000 && code <= 4999)\n );\n}\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction _isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0) {\n // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) {\n // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // Overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) {\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\n buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Determines whether a value is a `Blob`.\n *\n * @param {*} value The value to be tested\n * @return {Boolean} `true` if `value` is a `Blob`, else `false`\n * @private\n */\nfunction isBlob(value) {\n return (\n hasBlob &&\n typeof value === 'object' &&\n typeof value.arrayBuffer === 'function' &&\n typeof value.type === 'string' &&\n typeof value.stream === 'function' &&\n (value[Symbol.toStringTag] === 'Blob' ||\n value[Symbol.toStringTag] === 'File')\n );\n}\n\nmodule.exports = {\n isBlob,\n isValidStatusCode,\n isValidUTF8: _isValidUTF8,\n tokenChars\n};\n\nif (isUtf8) {\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf);\n };\n} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) {\n try {\n const isValidUTF8 = require('utf-8-validate');\n\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst { Writable } = require('stream');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n kStatusCode,\n kWebSocket\n} = require('./constants');\nconst { concat, toArrayBuffer, unmask } = require('./buffer-util');\nconst { isValidStatusCode, isValidUTF8 } = require('./validation');\n\nconst FastBuffer = Buffer[Symbol.species];\n\nconst GET_INFO = 0;\nconst GET_PAYLOAD_LENGTH_16 = 1;\nconst GET_PAYLOAD_LENGTH_64 = 2;\nconst GET_MASK = 3;\nconst GET_DATA = 4;\nconst INFLATING = 5;\nconst DEFER_EVENT = 6;\n\n/**\n * HyBi Receiver implementation.\n *\n * @extends Writable\n */\nclass Receiver extends Writable {\n /**\n * Creates a Receiver instance.\n *\n * @param {Object} [options] Options object\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {String} [options.binaryType=nodebuffer] The type for binary data\n * @param {Object} [options.extensions] An object containing the negotiated\n * extensions\n * @param {Boolean} [options.isServer=false] Specifies whether to operate in\n * client or server mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n */\n constructor(options = {}) {\n super();\n\n this._allowSynchronousEvents =\n options.allowSynchronousEvents !== undefined\n ? options.allowSynchronousEvents\n : true;\n this._binaryType = options.binaryType || BINARY_TYPES[0];\n this._extensions = options.extensions || {};\n this._isServer = !!options.isServer;\n this._maxPayload = options.maxPayload | 0;\n this._skipUTF8Validation = !!options.skipUTF8Validation;\n this[kWebSocket] = undefined;\n\n this._bufferedBytes = 0;\n this._buffers = [];\n\n this._compressed = false;\n this._payloadLength = 0;\n this._mask = undefined;\n this._fragmented = 0;\n this._masked = false;\n this._fin = false;\n this._opcode = 0;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragments = [];\n\n this._errored = false;\n this._loop = false;\n this._state = GET_INFO;\n }\n\n /**\n * Implements `Writable.prototype._write()`.\n *\n * @param {Buffer} chunk The chunk of data to write\n * @param {String} encoding The character encoding of `chunk`\n * @param {Function} cb Callback\n * @private\n */\n _write(chunk, encoding, cb) {\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\n\n this._bufferedBytes += chunk.length;\n this._buffers.push(chunk);\n this.startLoop(cb);\n }\n\n /**\n * Consumes `n` bytes from the buffered data.\n *\n * @param {Number} n The number of bytes to consume\n * @return {Buffer} The consumed bytes\n * @private\n */\n consume(n) {\n this._bufferedBytes -= n;\n\n if (n === this._buffers[0].length) return this._buffers.shift();\n\n if (n < this._buffers[0].length) {\n const buf = this._buffers[0];\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n\n return new FastBuffer(buf.buffer, buf.byteOffset, n);\n }\n\n const dst = Buffer.allocUnsafe(n);\n\n do {\n const buf = this._buffers[0];\n const offset = dst.length - n;\n\n if (n >= buf.length) {\n dst.set(this._buffers.shift(), offset);\n } else {\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n }\n\n n -= buf.length;\n } while (n > 0);\n\n return dst;\n }\n\n /**\n * Starts the parsing loop.\n *\n * @param {Function} cb Callback\n * @private\n */\n startLoop(cb) {\n this._loop = true;\n\n do {\n switch (this._state) {\n case GET_INFO:\n this.getInfo(cb);\n break;\n case GET_PAYLOAD_LENGTH_16:\n this.getPayloadLength16(cb);\n break;\n case GET_PAYLOAD_LENGTH_64:\n this.getPayloadLength64(cb);\n break;\n case GET_MASK:\n this.getMask();\n break;\n case GET_DATA:\n this.getData(cb);\n break;\n case INFLATING:\n case DEFER_EVENT:\n this._loop = false;\n return;\n }\n } while (this._loop);\n\n if (!this._errored) cb();\n }\n\n /**\n * Reads the first two bytes of a frame.\n *\n * @param {Function} cb Callback\n * @private\n */\n getInfo(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(2);\n\n if ((buf[0] & 0x30) !== 0x00) {\n const error = this.createError(\n RangeError,\n 'RSV2 and RSV3 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_2_3'\n );\n\n cb(error);\n return;\n }\n\n const compressed = (buf[0] & 0x40) === 0x40;\n\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n this._fin = (buf[0] & 0x80) === 0x80;\n this._opcode = buf[0] & 0x0f;\n this._payloadLength = buf[1] & 0x7f;\n\n if (this._opcode === 0x00) {\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fragmented) {\n const error = this.createError(\n RangeError,\n 'invalid opcode 0',\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._opcode = this._fragmented;\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\n if (this._fragmented) {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._compressed = compressed;\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\n if (!this._fin) {\n const error = this.createError(\n RangeError,\n 'FIN must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_FIN'\n );\n\n cb(error);\n return;\n }\n\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (\n this._payloadLength > 0x7d ||\n (this._opcode === 0x08 && this._payloadLength === 1)\n ) {\n const error = this.createError(\n RangeError,\n `invalid payload length ${this._payloadLength}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n } else {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n this._masked = (buf[1] & 0x80) === 0x80;\n\n if (this._isServer) {\n if (!this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n } else if (this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n else this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+16).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength16(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n this._payloadLength = this.consume(2).readUInt16BE(0);\n this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+64).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength64(cb) {\n if (this._bufferedBytes < 8) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(8);\n const num = buf.readUInt32BE(0);\n\n //\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\n // if payload length is greater than this number.\n //\n if (num > Math.pow(2, 53 - 32) - 1) {\n const error = this.createError(\n RangeError,\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n this.haveLength(cb);\n }\n\n /**\n * Payload length has been read.\n *\n * @param {Function} cb Callback\n * @private\n */\n haveLength(cb) {\n if (this._payloadLength && this._opcode < 0x08) {\n this._totalPayloadLength += this._payloadLength;\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n }\n\n if (this._masked) this._state = GET_MASK;\n else this._state = GET_DATA;\n }\n\n /**\n * Reads mask bytes.\n *\n * @private\n */\n getMask() {\n if (this._bufferedBytes < 4) {\n this._loop = false;\n return;\n }\n\n this._mask = this.consume(4);\n this._state = GET_DATA;\n }\n\n /**\n * Reads data bytes.\n *\n * @param {Function} cb Callback\n * @private\n */\n getData(cb) {\n let data = EMPTY_BUFFER;\n\n if (this._payloadLength) {\n if (this._bufferedBytes < this._payloadLength) {\n this._loop = false;\n return;\n }\n\n data = this.consume(this._payloadLength);\n\n if (\n this._masked &&\n (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0\n ) {\n unmask(data, this._mask);\n }\n }\n\n if (this._opcode > 0x07) {\n this.controlMessage(data, cb);\n return;\n }\n\n if (this._compressed) {\n this._state = INFLATING;\n this.decompress(data, cb);\n return;\n }\n\n if (data.length) {\n //\n // This message is not compressed so its length is the sum of the payload\n // length of all fragments.\n //\n this._messageLength = this._totalPayloadLength;\n this._fragments.push(data);\n }\n\n this.dataMessage(cb);\n }\n\n /**\n * Decompresses data.\n *\n * @param {Buffer} data Compressed data\n * @param {Function} cb Callback\n * @private\n */\n decompress(data, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n if (err) return cb(err);\n\n if (buf.length) {\n this._messageLength += buf.length;\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._fragments.push(buf);\n }\n\n this.dataMessage(cb);\n if (this._state === GET_INFO) this.startLoop(cb);\n });\n }\n\n /**\n * Handles a data message.\n *\n * @param {Function} cb Callback\n * @private\n */\n dataMessage(cb) {\n if (!this._fin) {\n this._state = GET_INFO;\n return;\n }\n\n const messageLength = this._messageLength;\n const fragments = this._fragments;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragmented = 0;\n this._fragments = [];\n\n if (this._opcode === 2) {\n let data;\n\n if (this._binaryType === 'nodebuffer') {\n data = concat(fragments, messageLength);\n } else if (this._binaryType === 'arraybuffer') {\n data = toArrayBuffer(concat(fragments, messageLength));\n } else if (this._binaryType === 'blob') {\n data = new Blob(fragments);\n } else {\n data = fragments;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit('message', data, true);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', data, true);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n } else {\n const buf = concat(fragments, messageLength);\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n if (this._state === INFLATING || this._allowSynchronousEvents) {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n }\n\n /**\n * Handles a control message.\n *\n * @param {Buffer} data Data to handle\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n controlMessage(data, cb) {\n if (this._opcode === 0x08) {\n if (data.length === 0) {\n this._loop = false;\n this.emit('conclude', 1005, EMPTY_BUFFER);\n this.end();\n } else {\n const code = data.readUInt16BE(0);\n\n if (!isValidStatusCode(code)) {\n const error = this.createError(\n RangeError,\n `invalid status code ${code}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CLOSE_CODE'\n );\n\n cb(error);\n return;\n }\n\n const buf = new FastBuffer(\n data.buffer,\n data.byteOffset + 2,\n data.length - 2\n );\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n this._loop = false;\n this.emit('conclude', code, buf);\n this.end();\n }\n\n this._state = GET_INFO;\n return;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n\n /**\n * Builds an error object.\n *\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\n * @param {String} message The error message\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\n * `message`\n * @param {Number} statusCode The status code\n * @param {String} errorCode The exposed error code\n * @return {(Error|RangeError)} The error\n * @private\n */\n createError(ErrorCtor, message, prefix, statusCode, errorCode) {\n this._loop = false;\n this._errored = true;\n\n const err = new ErrorCtor(\n prefix ? `Invalid WebSocket frame: ${message}` : message\n );\n\n Error.captureStackTrace(err, this.createError);\n err.code = errorCode;\n err[kStatusCode] = statusCode;\n return err;\n }\n}\n\nmodule.exports = Receiver;\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex\" }] */\n\n'use strict';\n\nconst { Duplex } = require('stream');\nconst { randomFillSync } = require('crypto');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst { EMPTY_BUFFER, kWebSocket, NOOP } = require('./constants');\nconst { isBlob, isValidStatusCode } = require('./validation');\nconst { mask: applyMask, toBuffer } = require('./buffer-util');\n\nconst kByteLength = Symbol('kByteLength');\nconst maskBuffer = Buffer.alloc(4);\nconst RANDOM_POOL_SIZE = 8 * 1024;\nlet randomPool;\nlet randomPoolPointer = RANDOM_POOL_SIZE;\n\nconst DEFAULT = 0;\nconst DEFLATING = 1;\nconst GET_BLOB_DATA = 2;\n\n/**\n * HyBi Sender implementation.\n */\nclass Sender {\n /**\n * Creates a Sender instance.\n *\n * @param {Duplex} socket The connection socket\n * @param {Object} [extensions] An object containing the negotiated extensions\n * @param {Function} [generateMask] The function used to generate the masking\n * key\n */\n constructor(socket, extensions, generateMask) {\n this._extensions = extensions || {};\n\n if (generateMask) {\n this._generateMask = generateMask;\n this._maskBuffer = Buffer.alloc(4);\n }\n\n this._socket = socket;\n\n this._firstFragment = true;\n this._compress = false;\n\n this._bufferedBytes = 0;\n this._queue = [];\n this._state = DEFAULT;\n this.onerror = NOOP;\n this[kWebSocket] = undefined;\n }\n\n /**\n * Frames a piece of data according to the HyBi WebSocket protocol.\n *\n * @param {(Buffer|String)} data The data to frame\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @return {(Buffer|String)[]} The framed data\n * @public\n */\n static frame(data, options) {\n let mask;\n let merge = false;\n let offset = 2;\n let skipMasking = false;\n\n if (options.mask) {\n mask = options.maskBuffer || maskBuffer;\n\n if (options.generateMask) {\n options.generateMask(mask);\n } else {\n if (randomPoolPointer === RANDOM_POOL_SIZE) {\n /* istanbul ignore else */\n if (randomPool === undefined) {\n //\n // This is lazily initialized because server-sent frames must not\n // be masked so it may never be used.\n //\n randomPool = Buffer.alloc(RANDOM_POOL_SIZE);\n }\n\n randomFillSync(randomPool, 0, RANDOM_POOL_SIZE);\n randomPoolPointer = 0;\n }\n\n mask[0] = randomPool[randomPoolPointer++];\n mask[1] = randomPool[randomPoolPointer++];\n mask[2] = randomPool[randomPoolPointer++];\n mask[3] = randomPool[randomPoolPointer++];\n }\n\n skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;\n offset = 6;\n }\n\n let dataLength;\n\n if (typeof data === 'string') {\n if (\n (!options.mask || skipMasking) &&\n options[kByteLength] !== undefined\n ) {\n dataLength = options[kByteLength];\n } else {\n data = Buffer.from(data);\n dataLength = data.length;\n }\n } else {\n dataLength = data.length;\n merge = options.mask && options.readOnly && !skipMasking;\n }\n\n let payloadLength = dataLength;\n\n if (dataLength >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (dataLength > 125) {\n offset += 2;\n payloadLength = 126;\n }\n\n const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);\n\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n\n target[1] = payloadLength;\n\n if (payloadLength === 126) {\n target.writeUInt16BE(dataLength, 2);\n } else if (payloadLength === 127) {\n target[2] = target[3] = 0;\n target.writeUIntBE(dataLength, 4, 6);\n }\n\n if (!options.mask) return [target, data];\n\n target[1] |= 0x80;\n target[offset - 4] = mask[0];\n target[offset - 3] = mask[1];\n target[offset - 2] = mask[2];\n target[offset - 1] = mask[3];\n\n if (skipMasking) return [target, data];\n\n if (merge) {\n applyMask(data, mask, target, offset, dataLength);\n return [target];\n }\n\n applyMask(data, mask, data, 0, dataLength);\n return [target, data];\n }\n\n /**\n * Sends a close message to the other peer.\n *\n * @param {Number} [code] The status code component of the body\n * @param {(String|Buffer)} [data] The message component of the body\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n * @param {Function} [cb] Callback\n * @public\n */\n close(code, data, mask, cb) {\n let buf;\n\n if (code === undefined) {\n buf = EMPTY_BUFFER;\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\n throw new TypeError('First argument must be a valid error code number');\n } else if (data === undefined || !data.length) {\n buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(code, 0);\n } else {\n const length = Buffer.byteLength(data);\n\n if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n\n if (typeof data === 'string') {\n buf.write(data, 2);\n } else {\n buf.set(data, 2);\n }\n }\n\n const options = {\n [kByteLength]: buf.length,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x08,\n readOnly: false,\n rsv1: false\n };\n\n if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, buf, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(buf, options), cb);\n }\n }\n\n /**\n * Sends a ping message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n ping(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x09,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a pong message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n pong(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x0a,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a data message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Object} options Options object\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n * or text\n * @param {Boolean} [options.compress=false] Specifies whether or not to\n * compress `data`\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Function} [cb] Callback\n * @public\n */\n send(data, options, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n let opcode = options.binary ? 2 : 1;\n let rsv1 = options.compress;\n\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (this._firstFragment) {\n this._firstFragment = false;\n if (\n rsv1 &&\n perMessageDeflate &&\n perMessageDeflate.params[\n perMessageDeflate._isServer\n ? 'server_no_context_takeover'\n : 'client_no_context_takeover'\n ]\n ) {\n rsv1 = byteLength >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n\n if (options.fin) this._firstFragment = true;\n\n const opts = {\n [kByteLength]: byteLength,\n fin: options.fin,\n generateMask: this._generateMask,\n mask: options.mask,\n maskBuffer: this._maskBuffer,\n opcode,\n readOnly,\n rsv1\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, this._compress, opts, cb]);\n } else {\n this.getBlobData(data, this._compress, opts, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, this._compress, opts, cb]);\n } else {\n this.dispatch(data, this._compress, opts, cb);\n }\n }\n\n /**\n * Gets the contents of a blob as binary data.\n *\n * @param {Blob} blob The blob\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * the data\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n getBlobData(blob, compress, options, cb) {\n this._bufferedBytes += options[kByteLength];\n this._state = GET_BLOB_DATA;\n\n blob\n .arrayBuffer()\n .then((arrayBuffer) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while the blob was being read'\n );\n\n //\n // `callCallbacks` is called in the next tick to ensure that errors\n // that might be thrown in the callbacks behave like errors thrown\n // outside the promise chain.\n //\n process.nextTick(callCallbacks, this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n const data = toBuffer(arrayBuffer);\n\n if (!compress) {\n this._state = DEFAULT;\n this.sendFrame(Sender.frame(data, options), cb);\n this.dequeue();\n } else {\n this.dispatch(data, compress, options, cb);\n }\n })\n .catch((err) => {\n //\n // `onError` is called in the next tick for the same reason that\n // `callCallbacks` above is.\n //\n process.nextTick(onError, this, err, cb);\n });\n }\n\n /**\n * Dispatches a message.\n *\n * @param {(Buffer|String)} data The message to send\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * `data`\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n dispatch(data, compress, options, cb) {\n if (!compress) {\n this.sendFrame(Sender.frame(data, options), cb);\n return;\n }\n\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n this._bufferedBytes += options[kByteLength];\n this._state = DEFLATING;\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while data was being compressed'\n );\n\n callCallbacks(this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n this._state = DEFAULT;\n options.readOnly = false;\n this.sendFrame(Sender.frame(buf, options), cb);\n this.dequeue();\n });\n }\n\n /**\n * Executes queued send operations.\n *\n * @private\n */\n dequeue() {\n while (this._state === DEFAULT && this._queue.length) {\n const params = this._queue.shift();\n\n this._bufferedBytes -= params[3][kByteLength];\n Reflect.apply(params[0], this, params.slice(1));\n }\n }\n\n /**\n * Enqueues a send operation.\n *\n * @param {Array} params Send operation parameters.\n * @private\n */\n enqueue(params) {\n this._bufferedBytes += params[3][kByteLength];\n this._queue.push(params);\n }\n\n /**\n * Sends a frame.\n *\n * @param {(Buffer | String)[]} list The frame to send\n * @param {Function} [cb] Callback\n * @private\n */\n sendFrame(list, cb) {\n if (list.length === 2) {\n this._socket.cork();\n this._socket.write(list[0]);\n this._socket.write(list[1], cb);\n this._socket.uncork();\n } else {\n this._socket.write(list[0], cb);\n }\n }\n}\n\nmodule.exports = Sender;\n\n/**\n * Calls queued callbacks with an error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error to call the callbacks with\n * @param {Function} [cb] The first callback\n * @private\n */\nfunction callCallbacks(sender, err, cb) {\n if (typeof cb === 'function') cb(err);\n\n for (let i = 0; i < sender._queue.length; i++) {\n const params = sender._queue[i];\n const callback = params[params.length - 1];\n\n if (typeof callback === 'function') callback(err);\n }\n}\n\n/**\n * Handles a `Sender` error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error\n * @param {Function} [cb] The first pending callback\n * @private\n */\nfunction onError(sender, err, cb) {\n callCallbacks(sender, err, cb);\n sender.onerror(err);\n}\n","'use strict';\n\nconst { kForOnEventAttribute, kListener } = require('./constants');\n\nconst kCode = Symbol('kCode');\nconst kData = Symbol('kData');\nconst kError = Symbol('kError');\nconst kMessage = Symbol('kMessage');\nconst kReason = Symbol('kReason');\nconst kTarget = Symbol('kTarget');\nconst kType = Symbol('kType');\nconst kWasClean = Symbol('kWasClean');\n\n/**\n * Class representing an event.\n */\nclass Event {\n /**\n * Create a new `Event`.\n *\n * @param {String} type The name of the event\n * @throws {TypeError} If the `type` argument is not specified\n */\n constructor(type) {\n this[kTarget] = null;\n this[kType] = type;\n }\n\n /**\n * @type {*}\n */\n get target() {\n return this[kTarget];\n }\n\n /**\n * @type {String}\n */\n get type() {\n return this[kType];\n }\n}\n\nObject.defineProperty(Event.prototype, 'target', { enumerable: true });\nObject.defineProperty(Event.prototype, 'type', { enumerable: true });\n\n/**\n * Class representing a close event.\n *\n * @extends Event\n */\nclass CloseEvent extends Event {\n /**\n * Create a new `CloseEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {Number} [options.code=0] The status code explaining why the\n * connection was closed\n * @param {String} [options.reason=''] A human-readable string explaining why\n * the connection was closed\n * @param {Boolean} [options.wasClean=false] Indicates whether or not the\n * connection was cleanly closed\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kCode] = options.code === undefined ? 0 : options.code;\n this[kReason] = options.reason === undefined ? '' : options.reason;\n this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;\n }\n\n /**\n * @type {Number}\n */\n get code() {\n return this[kCode];\n }\n\n /**\n * @type {String}\n */\n get reason() {\n return this[kReason];\n }\n\n /**\n * @type {Boolean}\n */\n get wasClean() {\n return this[kWasClean];\n }\n}\n\nObject.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });\n\n/**\n * Class representing an error event.\n *\n * @extends Event\n */\nclass ErrorEvent extends Event {\n /**\n * Create a new `ErrorEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.error=null] The error that generated this event\n * @param {String} [options.message=''] The error message\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kError] = options.error === undefined ? null : options.error;\n this[kMessage] = options.message === undefined ? '' : options.message;\n }\n\n /**\n * @type {*}\n */\n get error() {\n return this[kError];\n }\n\n /**\n * @type {String}\n */\n get message() {\n return this[kMessage];\n }\n}\n\nObject.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });\nObject.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });\n\n/**\n * Class representing a message event.\n *\n * @extends Event\n */\nclass MessageEvent extends Event {\n /**\n * Create a new `MessageEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.data=null] The message content\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kData] = options.data === undefined ? null : options.data;\n }\n\n /**\n * @type {*}\n */\n get data() {\n return this[kData];\n }\n}\n\nObject.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });\n\n/**\n * This provides methods for emulating the `EventTarget` interface. It's not\n * meant to be used directly.\n *\n * @mixin\n */\nconst EventTarget = {\n /**\n * Register an event listener.\n *\n * @param {String} type A string representing the event type to listen for\n * @param {(Function|Object)} handler The listener to add\n * @param {Object} [options] An options object specifies characteristics about\n * the event listener\n * @param {Boolean} [options.once=false] A `Boolean` indicating that the\n * listener should be invoked at most once after being added. If `true`,\n * the listener would be automatically removed when invoked.\n * @public\n */\n addEventListener(type, handler, options = {}) {\n for (const listener of this.listeners(type)) {\n if (\n !options[kForOnEventAttribute] &&\n listener[kListener] === handler &&\n !listener[kForOnEventAttribute]\n ) {\n return;\n }\n }\n\n let wrapper;\n\n if (type === 'message') {\n wrapper = function onMessage(data, isBinary) {\n const event = new MessageEvent('message', {\n data: isBinary ? data : data.toString()\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'close') {\n wrapper = function onClose(code, message) {\n const event = new CloseEvent('close', {\n code,\n reason: message.toString(),\n wasClean: this._closeFrameReceived && this._closeFrameSent\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'error') {\n wrapper = function onError(error) {\n const event = new ErrorEvent('error', {\n error,\n message: error.message\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'open') {\n wrapper = function onOpen() {\n const event = new Event('open');\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else {\n return;\n }\n\n wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];\n wrapper[kListener] = handler;\n\n if (options.once) {\n this.once(type, wrapper);\n } else {\n this.on(type, wrapper);\n }\n },\n\n /**\n * Remove an event listener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {(Function|Object)} handler The listener to remove\n * @public\n */\n removeEventListener(type, handler) {\n for (const listener of this.listeners(type)) {\n if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {\n this.removeListener(type, listener);\n break;\n }\n }\n }\n};\n\nmodule.exports = {\n CloseEvent,\n ErrorEvent,\n Event,\n EventTarget,\n MessageEvent\n};\n\n/**\n * Call an event listener\n *\n * @param {(Function|Object)} listener The listener to call\n * @param {*} thisArg The value to use as `this`` when calling the listener\n * @param {Event} event The event to pass to the listener\n * @private\n */\nfunction callListener(listener, thisArg, event) {\n if (typeof listener === 'object' && listener.handleEvent) {\n listener.handleEvent.call(listener, event);\n } else {\n listener.call(thisArg, event);\n }\n}\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Adds an offer to the map of extension offers or a parameter to the map of\n * parameters.\n *\n * @param {Object} dest The map of extension offers or parameters\n * @param {String} name The extension or parameter name\n * @param {(Object|Boolean|String)} elem The extension parameters or the\n * parameter value\n * @private\n */\nfunction push(dest, name, elem) {\n if (dest[name] === undefined) dest[name] = [elem];\n else dest[name].push(elem);\n}\n\n/**\n * Parses the `Sec-WebSocket-Extensions` header into an object.\n *\n * @param {String} header The field value of the header\n * @return {Object} The parsed object\n * @public\n */\nfunction parse(header) {\n const offers = Object.create(null);\n let params = Object.create(null);\n let mustUnescape = false;\n let isEscaping = false;\n let inQuotes = false;\n let extensionName;\n let paramName;\n let start = -1;\n let code = -1;\n let end = -1;\n let i = 0;\n\n for (; i < header.length; i++) {\n code = header.charCodeAt(i);\n\n if (extensionName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n const name = header.slice(start, end);\n if (code === 0x2c) {\n push(offers, name, params);\n params = Object.create(null);\n } else {\n extensionName = name;\n }\n\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (paramName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 || code === 0x09) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n push(params, header.slice(start, end), true);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n start = end = -1;\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\n paramName = header.slice(start, i);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else {\n //\n // The value of a quoted-string after unescaping must conform to the\n // token ABNF, so only token characters are valid.\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\n //\n if (isEscaping) {\n if (tokenChars[code] !== 1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n if (start === -1) start = i;\n else if (!mustUnescape) mustUnescape = true;\n isEscaping = false;\n } else if (inQuotes) {\n if (tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\n inQuotes = false;\n end = i;\n } else if (code === 0x5c /* '\\' */) {\n isEscaping = true;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\n inQuotes = true;\n } else if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\n if (end === -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n let value = header.slice(start, end);\n if (mustUnescape) {\n value = value.replace(/\\\\/g, '');\n mustUnescape = false;\n }\n push(params, paramName, value);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n paramName = undefined;\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n }\n\n if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n if (end === -1) end = i;\n const token = header.slice(start, end);\n if (extensionName === undefined) {\n push(offers, token, params);\n } else {\n if (paramName === undefined) {\n push(params, token, true);\n } else if (mustUnescape) {\n push(params, paramName, token.replace(/\\\\/g, ''));\n } else {\n push(params, paramName, token);\n }\n push(offers, extensionName, params);\n }\n\n return offers;\n}\n\n/**\n * Builds the `Sec-WebSocket-Extensions` header field value.\n *\n * @param {Object} extensions The map of extensions and parameters to format\n * @return {String} A string representing the given object\n * @public\n */\nfunction format(extensions) {\n return Object.keys(extensions)\n .map((extension) => {\n let configurations = extensions[extension];\n if (!Array.isArray(configurations)) configurations = [configurations];\n return configurations\n .map((params) => {\n return [extension]\n .concat(\n Object.keys(params).map((k) => {\n let values = params[k];\n if (!Array.isArray(values)) values = [values];\n return values\n .map((v) => (v === true ? k : `${k}=${v}`))\n .join('; ');\n })\n )\n .join('; ');\n })\n .join(', ');\n })\n .join(', ');\n}\n\nmodule.exports = { format, parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex|Readable$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst https = require('https');\nconst http = require('http');\nconst net = require('net');\nconst tls = require('tls');\nconst { randomBytes, createHash } = require('crypto');\nconst { Duplex, Readable } = require('stream');\nconst { URL } = require('url');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst Receiver = require('./receiver');\nconst Sender = require('./sender');\nconst { isBlob } = require('./validation');\n\nconst {\n BINARY_TYPES,\n CLOSE_TIMEOUT,\n EMPTY_BUFFER,\n GUID,\n kForOnEventAttribute,\n kListener,\n kStatusCode,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst {\n EventTarget: { addEventListener, removeEventListener }\n} = require('./event-target');\nconst { format, parse } = require('./extension');\nconst { toBuffer } = require('./buffer-util');\n\nconst kAborted = Symbol('kAborted');\nconst protocolVersions = [8, 13];\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\nconst subprotocolRegex = /^[!#$%&'*+\\-.0-9A-Z^_`|a-z~]+$/;\n\n/**\n * Class representing a WebSocket.\n *\n * @extends EventEmitter\n */\nclass WebSocket extends EventEmitter {\n /**\n * Create a new `WebSocket`.\n *\n * @param {(String|URL)} address The URL to which to connect\n * @param {(String|String[])} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n */\n constructor(address, protocols, options) {\n super();\n\n this._binaryType = BINARY_TYPES[0];\n this._closeCode = 1006;\n this._closeFrameReceived = false;\n this._closeFrameSent = false;\n this._closeMessage = EMPTY_BUFFER;\n this._closeTimer = null;\n this._errorEmitted = false;\n this._extensions = {};\n this._paused = false;\n this._protocol = '';\n this._readyState = WebSocket.CONNECTING;\n this._receiver = null;\n this._sender = null;\n this._socket = null;\n\n if (address !== null) {\n this._bufferedAmount = 0;\n this._isServer = false;\n this._redirects = 0;\n\n if (protocols === undefined) {\n protocols = [];\n } else if (!Array.isArray(protocols)) {\n if (typeof protocols === 'object' && protocols !== null) {\n options = protocols;\n protocols = [];\n } else {\n protocols = [protocols];\n }\n }\n\n initAsClient(this, address, protocols, options);\n } else {\n this._autoPong = options.autoPong;\n this._closeTimeout = options.closeTimeout;\n this._isServer = true;\n }\n }\n\n /**\n * For historical reasons, the custom \"nodebuffer\" type is used by the default\n * instead of \"blob\".\n *\n * @type {String}\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(type) {\n if (!BINARY_TYPES.includes(type)) return;\n\n this._binaryType = type;\n\n //\n // Allow to change `binaryType` on the fly.\n //\n if (this._receiver) this._receiver._binaryType = type;\n }\n\n /**\n * @type {Number}\n */\n get bufferedAmount() {\n if (!this._socket) return this._bufferedAmount;\n\n return this._socket._writableState.length + this._sender._bufferedBytes;\n }\n\n /**\n * @type {String}\n */\n get extensions() {\n return Object.keys(this._extensions).join();\n }\n\n /**\n * @type {Boolean}\n */\n get isPaused() {\n return this._paused;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onclose() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onerror() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onopen() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onmessage() {\n return null;\n }\n\n /**\n * @type {String}\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * @type {Number}\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * @type {String}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Set up the socket and the internal resources.\n *\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Object} options Options object\n * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.maxPayload=0] The maximum allowed message size\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\n setSocket(socket, head, options) {\n const receiver = new Receiver({\n allowSynchronousEvents: options.allowSynchronousEvents,\n binaryType: this.binaryType,\n extensions: this._extensions,\n isServer: this._isServer,\n maxPayload: options.maxPayload,\n skipUTF8Validation: options.skipUTF8Validation\n });\n\n const sender = new Sender(socket, this._extensions, options.generateMask);\n\n this._receiver = receiver;\n this._sender = sender;\n this._socket = socket;\n\n receiver[kWebSocket] = this;\n sender[kWebSocket] = this;\n socket[kWebSocket] = this;\n\n receiver.on('conclude', receiverOnConclude);\n receiver.on('drain', receiverOnDrain);\n receiver.on('error', receiverOnError);\n receiver.on('message', receiverOnMessage);\n receiver.on('ping', receiverOnPing);\n receiver.on('pong', receiverOnPong);\n\n sender.onerror = senderOnError;\n\n //\n // These methods may not be available if `socket` is just a `Duplex`.\n //\n if (socket.setTimeout) socket.setTimeout(0);\n if (socket.setNoDelay) socket.setNoDelay();\n\n if (head.length > 0) socket.unshift(head);\n\n socket.on('close', socketOnClose);\n socket.on('data', socketOnData);\n socket.on('end', socketOnEnd);\n socket.on('error', socketOnError);\n\n this._readyState = WebSocket.OPEN;\n this.emit('open');\n }\n\n /**\n * Emit the `'close'` event.\n *\n * @private\n */\n emitClose() {\n if (!this._socket) {\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n return;\n }\n\n if (this._extensions[PerMessageDeflate.extensionName]) {\n this._extensions[PerMessageDeflate.extensionName].cleanup();\n }\n\n this._receiver.removeAllListeners();\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n }\n\n /**\n * Start a closing handshake.\n *\n * +----------+ +-----------+ +----------+\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n * | +----------+ +-----------+ +----------+ |\n * +----------+ +-----------+ |\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\n * +----------+ +-----------+ |\n * | | | +---+ |\n * +------------------------+-->|fin| - - - -\n * | +---+ | +---+\n * - - - - -|fin|<---------------------+\n * +---+\n *\n * @param {Number} [code] Status code explaining why the connection is closing\n * @param {(String|Buffer)} [data] The reason why the connection is\n * closing\n * @public\n */\n close(code, data) {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n if (\n this._closeFrameSent &&\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\n ) {\n this._socket.end();\n }\n\n return;\n }\n\n this._readyState = WebSocket.CLOSING;\n this._sender.close(code, data, !this._isServer, (err) => {\n //\n // This error is handled by the `'error'` listener on the socket. We only\n // want to know if the close frame has been sent here.\n //\n if (err) return;\n\n this._closeFrameSent = true;\n\n if (\n this._closeFrameReceived ||\n this._receiver._writableState.errorEmitted\n ) {\n this._socket.end();\n }\n });\n\n setCloseTimer(this);\n }\n\n /**\n * Pause the socket.\n *\n * @public\n */\n pause() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = true;\n this._socket.pause();\n }\n\n /**\n * Send a ping.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the ping is sent\n * @public\n */\n ping(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a pong.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the pong is sent\n * @public\n */\n pong(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Resume the socket.\n *\n * @public\n */\n resume() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = false;\n if (!this._receiver._writableState.needDrain) this._socket.resume();\n }\n\n /**\n * Send a data message.\n *\n * @param {*} data The message to send\n * @param {Object} [options] Options object\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n * text\n * @param {Boolean} [options.compress] Specifies whether or not to compress\n * `data`\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when data is written out\n * @public\n */\n send(data, options, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n const opts = {\n binary: typeof data !== 'string',\n mask: !this._isServer,\n compress: true,\n fin: true,\n ...options\n };\n\n if (!this._extensions[PerMessageDeflate.extensionName]) {\n opts.compress = false;\n }\n\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\n }\n\n /**\n * Forcibly close the connection.\n *\n * @public\n */\n terminate() {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this._socket) {\n this._readyState = WebSocket.CLOSING;\n this._socket.destroy();\n }\n }\n}\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n[\n 'binaryType',\n 'bufferedAmount',\n 'extensions',\n 'isPaused',\n 'protocol',\n 'readyState',\n 'url'\n].forEach((property) => {\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n});\n\n//\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\n//\n['open', 'error', 'close', 'message'].forEach((method) => {\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\n enumerable: true,\n get() {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) return listener[kListener];\n }\n\n return null;\n },\n set(handler) {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) {\n this.removeListener(method, listener);\n break;\n }\n }\n\n if (typeof handler !== 'function') return;\n\n this.addEventListener(method, handler, {\n [kForOnEventAttribute]: true\n });\n }\n });\n});\n\nWebSocket.prototype.addEventListener = addEventListener;\nWebSocket.prototype.removeEventListener = removeEventListener;\n\nmodule.exports = WebSocket;\n\n/**\n * Initialize a WebSocket client.\n *\n * @param {WebSocket} websocket The client to initialize\n * @param {(String|URL)} address The URL to which to connect\n * @param {Array} protocols The subprotocols\n * @param {Object} [options] Connection options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any\n * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple\n * times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to wait\n * for the closing handshake to finish after `websocket.close()` is called\n * @param {Function} [options.finishRequest] A function which can be used to\n * customize the headers of each http request before it is sent\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\n * redirects\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\n * handshake request\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\n * allowed\n * @param {String} [options.origin] Value of the `Origin` or\n * `Sec-WebSocket-Origin` header\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\n * permessage-deflate\n * @param {Number} [options.protocolVersion=13] Value of the\n * `Sec-WebSocket-Version` header\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\nfunction initAsClient(websocket, address, protocols, options) {\n const opts = {\n allowSynchronousEvents: true,\n autoPong: true,\n closeTimeout: CLOSE_TIMEOUT,\n protocolVersion: protocolVersions[1],\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: true,\n followRedirects: false,\n maxRedirects: 10,\n ...options,\n socketPath: undefined,\n hostname: undefined,\n protocol: undefined,\n timeout: undefined,\n method: 'GET',\n host: undefined,\n path: undefined,\n port: undefined\n };\n\n websocket._autoPong = opts.autoPong;\n websocket._closeTimeout = opts.closeTimeout;\n\n if (!protocolVersions.includes(opts.protocolVersion)) {\n throw new RangeError(\n `Unsupported protocol version: ${opts.protocolVersion} ` +\n `(supported versions: ${protocolVersions.join(', ')})`\n );\n }\n\n let parsedUrl;\n\n if (address instanceof URL) {\n parsedUrl = address;\n } else {\n try {\n parsedUrl = new URL(address);\n } catch (e) {\n throw new SyntaxError(`Invalid URL: ${address}`);\n }\n }\n\n if (parsedUrl.protocol === 'http:') {\n parsedUrl.protocol = 'ws:';\n } else if (parsedUrl.protocol === 'https:') {\n parsedUrl.protocol = 'wss:';\n }\n\n websocket._url = parsedUrl.href;\n\n const isSecure = parsedUrl.protocol === 'wss:';\n const isIpcUrl = parsedUrl.protocol === 'ws+unix:';\n let invalidUrlMessage;\n\n if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) {\n invalidUrlMessage =\n 'The URL\\'s protocol must be one of \"ws:\", \"wss:\", ' +\n '\"http:\", \"https:\", or \"ws+unix:\"';\n } else if (isIpcUrl && !parsedUrl.pathname) {\n invalidUrlMessage = \"The URL's pathname is empty\";\n } else if (parsedUrl.hash) {\n invalidUrlMessage = 'The URL contains a fragment identifier';\n }\n\n if (invalidUrlMessage) {\n const err = new SyntaxError(invalidUrlMessage);\n\n if (websocket._redirects === 0) {\n throw err;\n } else {\n emitErrorAndClose(websocket, err);\n return;\n }\n }\n\n const defaultPort = isSecure ? 443 : 80;\n const key = randomBytes(16).toString('base64');\n const request = isSecure ? https.request : http.request;\n const protocolSet = new Set();\n let perMessageDeflate;\n\n opts.createConnection =\n opts.createConnection || (isSecure ? tlsConnect : netConnect);\n opts.defaultPort = opts.defaultPort || defaultPort;\n opts.port = parsedUrl.port || defaultPort;\n opts.host = parsedUrl.hostname.startsWith('[')\n ? parsedUrl.hostname.slice(1, -1)\n : parsedUrl.hostname;\n opts.headers = {\n ...opts.headers,\n 'Sec-WebSocket-Version': opts.protocolVersion,\n 'Sec-WebSocket-Key': key,\n Connection: 'Upgrade',\n Upgrade: 'websocket'\n };\n opts.path = parsedUrl.pathname + parsedUrl.search;\n opts.timeout = opts.handshakeTimeout;\n\n if (opts.perMessageDeflate) {\n perMessageDeflate = new PerMessageDeflate(\n opts.perMessageDeflate !== true ? opts.perMessageDeflate : {},\n false,\n opts.maxPayload\n );\n opts.headers['Sec-WebSocket-Extensions'] = format({\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n });\n }\n if (protocols.length) {\n for (const protocol of protocols) {\n if (\n typeof protocol !== 'string' ||\n !subprotocolRegex.test(protocol) ||\n protocolSet.has(protocol)\n ) {\n throw new SyntaxError(\n 'An invalid or duplicated subprotocol was specified'\n );\n }\n\n protocolSet.add(protocol);\n }\n\n opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');\n }\n if (opts.origin) {\n if (opts.protocolVersion < 13) {\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\n } else {\n opts.headers.Origin = opts.origin;\n }\n }\n if (parsedUrl.username || parsedUrl.password) {\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n }\n\n if (isIpcUrl) {\n const parts = opts.path.split(':');\n\n opts.socketPath = parts[0];\n opts.path = parts[1];\n }\n\n let req;\n\n if (opts.followRedirects) {\n if (websocket._redirects === 0) {\n websocket._originalIpc = isIpcUrl;\n websocket._originalSecure = isSecure;\n websocket._originalHostOrSocketPath = isIpcUrl\n ? opts.socketPath\n : parsedUrl.host;\n\n const headers = options && options.headers;\n\n //\n // Shallow copy the user provided options so that headers can be changed\n // without mutating the original object.\n //\n options = { ...options, headers: {} };\n\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n options.headers[key.toLowerCase()] = value;\n }\n }\n } else if (websocket.listenerCount('redirect') === 0) {\n const isSameHost = isIpcUrl\n ? websocket._originalIpc\n ? opts.socketPath === websocket._originalHostOrSocketPath\n : false\n : websocket._originalIpc\n ? false\n : parsedUrl.host === websocket._originalHostOrSocketPath;\n\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\n //\n // Match curl 7.77.0 behavior and drop the following headers. These\n // headers are also dropped when following a redirect to a subdomain.\n //\n delete opts.headers.authorization;\n delete opts.headers.cookie;\n\n if (!isSameHost) delete opts.headers.host;\n\n opts.auth = undefined;\n }\n }\n\n //\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\n // If the `Authorization` header is set, then there is nothing to do as it\n // will take precedence.\n //\n if (opts.auth && !options.headers.authorization) {\n options.headers.authorization =\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\n }\n\n req = websocket._req = request(opts);\n\n if (websocket._redirects) {\n //\n // Unlike what is done for the `'upgrade'` event, no early exit is\n // triggered here if the user calls `websocket.close()` or\n // `websocket.terminate()` from a listener of the `'redirect'` event. This\n // is because the user can also call `request.destroy()` with an error\n // before calling `websocket.close()` or `websocket.terminate()` and this\n // would result in an error being emitted on the `request` object with no\n // `'error'` event listeners attached.\n //\n websocket.emit('redirect', websocket.url, req);\n }\n } else {\n req = websocket._req = request(opts);\n }\n\n if (opts.timeout) {\n req.on('timeout', () => {\n abortHandshake(websocket, req, 'Opening handshake has timed out');\n });\n }\n\n req.on('error', (err) => {\n if (req === null || req[kAborted]) return;\n\n req = websocket._req = null;\n emitErrorAndClose(websocket, err);\n });\n\n req.on('response', (res) => {\n const location = res.headers.location;\n const statusCode = res.statusCode;\n\n if (\n location &&\n opts.followRedirects &&\n statusCode >= 300 &&\n statusCode < 400\n ) {\n if (++websocket._redirects > opts.maxRedirects) {\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\n return;\n }\n\n req.abort();\n\n let addr;\n\n try {\n addr = new URL(location, address);\n } catch (e) {\n const err = new SyntaxError(`Invalid URL: ${location}`);\n emitErrorAndClose(websocket, err);\n return;\n }\n\n initAsClient(websocket, addr, protocols, options);\n } else if (!websocket.emit('unexpected-response', req, res)) {\n abortHandshake(\n websocket,\n req,\n `Unexpected server response: ${res.statusCode}`\n );\n }\n });\n\n req.on('upgrade', (res, socket, head) => {\n websocket.emit('upgrade', res);\n\n //\n // The user may have closed the connection from a listener of the\n // `'upgrade'` event.\n //\n if (websocket.readyState !== WebSocket.CONNECTING) return;\n\n req = websocket._req = null;\n\n const upgrade = res.headers.upgrade;\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\n return;\n }\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n if (res.headers['sec-websocket-accept'] !== digest) {\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\n return;\n }\n\n const serverProt = res.headers['sec-websocket-protocol'];\n let protError;\n\n if (serverProt !== undefined) {\n if (!protocolSet.size) {\n protError = 'Server sent a subprotocol but none was requested';\n } else if (!protocolSet.has(serverProt)) {\n protError = 'Server sent an invalid subprotocol';\n }\n } else if (protocolSet.size) {\n protError = 'Server sent no subprotocol';\n }\n\n if (protError) {\n abortHandshake(websocket, socket, protError);\n return;\n }\n\n if (serverProt) websocket._protocol = serverProt;\n\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\n\n if (secWebSocketExtensions !== undefined) {\n if (!perMessageDeflate) {\n const message =\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\n 'was requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n let extensions;\n\n try {\n extensions = parse(secWebSocketExtensions);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n const extensionNames = Object.keys(extensions);\n\n if (\n extensionNames.length !== 1 ||\n extensionNames[0] !== PerMessageDeflate.extensionName\n ) {\n const message = 'Server indicated an extension that was not requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n try {\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n websocket._extensions[PerMessageDeflate.extensionName] =\n perMessageDeflate;\n }\n\n websocket.setSocket(socket, head, {\n allowSynchronousEvents: opts.allowSynchronousEvents,\n generateMask: opts.generateMask,\n maxPayload: opts.maxPayload,\n skipUTF8Validation: opts.skipUTF8Validation\n });\n });\n\n if (opts.finishRequest) {\n opts.finishRequest(req, websocket);\n } else {\n req.end();\n }\n}\n\n/**\n * Emit the `'error'` and `'close'` events.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {Error} The error to emit\n * @private\n */\nfunction emitErrorAndClose(websocket, err) {\n websocket._readyState = WebSocket.CLOSING;\n //\n // The following assignment is practically useless and is done only for\n // consistency.\n //\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n websocket.emitClose();\n}\n\n/**\n * Create a `net.Socket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {net.Socket} The newly created socket used to start the connection\n * @private\n */\nfunction netConnect(options) {\n options.path = options.socketPath;\n return net.connect(options);\n}\n\n/**\n * Create a `tls.TLSSocket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {tls.TLSSocket} The newly created socket used to start the connection\n * @private\n */\nfunction tlsConnect(options) {\n options.path = undefined;\n\n if (!options.servername && options.servername !== '') {\n options.servername = net.isIP(options.host) ? '' : options.host;\n }\n\n return tls.connect(options);\n}\n\n/**\n * Abort the handshake and emit an error.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\n * abort or the socket to destroy\n * @param {String} message The error message\n * @private\n */\nfunction abortHandshake(websocket, stream, message) {\n websocket._readyState = WebSocket.CLOSING;\n\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshake);\n\n if (stream.setHeader) {\n stream[kAborted] = true;\n stream.abort();\n\n if (stream.socket && !stream.socket.destroyed) {\n //\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\n // called after the request completed. See\n // https://github.com/websockets/ws/issues/1869.\n //\n stream.socket.destroy();\n }\n\n process.nextTick(emitErrorAndClose, websocket, err);\n } else {\n stream.destroy(err);\n stream.once('error', websocket.emit.bind(websocket, 'error'));\n stream.once('close', websocket.emitClose.bind(websocket));\n }\n}\n\n/**\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {*} [data] The data to send\n * @param {Function} [cb] Callback\n * @private\n */\nfunction sendAfterClose(websocket, data, cb) {\n if (data) {\n const length = isBlob(data) ? data.size : toBuffer(data).length;\n\n //\n // The `_bufferedAmount` property is used only when the peer is a client and\n // the opening handshake fails. Under these circumstances, in fact, the\n // `setSocket()` method is not called, so the `_socket` and `_sender`\n // properties are set to `null`.\n //\n if (websocket._socket) websocket._sender._bufferedBytes += length;\n else websocket._bufferedAmount += length;\n }\n\n if (cb) {\n const err = new Error(\n `WebSocket is not open: readyState ${websocket.readyState} ` +\n `(${readyStates[websocket.readyState]})`\n );\n process.nextTick(cb, err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'conclude'` event.\n *\n * @param {Number} code The status code\n * @param {Buffer} reason The reason for closing\n * @private\n */\nfunction receiverOnConclude(code, reason) {\n const websocket = this[kWebSocket];\n\n websocket._closeFrameReceived = true;\n websocket._closeMessage = reason;\n websocket._closeCode = code;\n\n if (websocket._socket[kWebSocket] === undefined) return;\n\n websocket._socket.removeListener('data', socketOnData);\n process.nextTick(resume, websocket._socket);\n\n if (code === 1005) websocket.close();\n else websocket.close(code, reason);\n}\n\n/**\n * The listener of the `Receiver` `'drain'` event.\n *\n * @private\n */\nfunction receiverOnDrain() {\n const websocket = this[kWebSocket];\n\n if (!websocket.isPaused) websocket._socket.resume();\n}\n\n/**\n * The listener of the `Receiver` `'error'` event.\n *\n * @param {(RangeError|Error)} err The emitted error\n * @private\n */\nfunction receiverOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket._socket[kWebSocket] !== undefined) {\n websocket._socket.removeListener('data', socketOnData);\n\n //\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\n // https://github.com/websockets/ws/issues/1940.\n //\n process.nextTick(resume, websocket._socket);\n\n websocket.close(err[kStatusCode]);\n }\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'finish'` event.\n *\n * @private\n */\nfunction receiverOnFinish() {\n this[kWebSocket].emitClose();\n}\n\n/**\n * The listener of the `Receiver` `'message'` event.\n *\n * @param {Buffer|ArrayBuffer|Buffer[])} data The message\n * @param {Boolean} isBinary Specifies whether the message is binary or not\n * @private\n */\nfunction receiverOnMessage(data, isBinary) {\n this[kWebSocket].emit('message', data, isBinary);\n}\n\n/**\n * The listener of the `Receiver` `'ping'` event.\n *\n * @param {Buffer} data The data included in the ping frame\n * @private\n */\nfunction receiverOnPing(data) {\n const websocket = this[kWebSocket];\n\n if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP);\n websocket.emit('ping', data);\n}\n\n/**\n * The listener of the `Receiver` `'pong'` event.\n *\n * @param {Buffer} data The data included in the pong frame\n * @private\n */\nfunction receiverOnPong(data) {\n this[kWebSocket].emit('pong', data);\n}\n\n/**\n * Resume a readable stream\n *\n * @param {Readable} stream The readable stream\n * @private\n */\nfunction resume(stream) {\n stream.resume();\n}\n\n/**\n * The `Sender` error event handler.\n *\n * @param {Error} The error\n * @private\n */\nfunction senderOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket.readyState === WebSocket.CLOSED) return;\n if (websocket.readyState === WebSocket.OPEN) {\n websocket._readyState = WebSocket.CLOSING;\n setCloseTimer(websocket);\n }\n\n //\n // `socket.end()` is used instead of `socket.destroy()` to allow the other\n // peer to finish sending queued data. There is no need to set a timer here\n // because `CLOSING` means that it is already set or not needed.\n //\n this._socket.end();\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * Set a timer to destroy the underlying raw socket of a WebSocket.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @private\n */\nfunction setCloseTimer(websocket) {\n websocket._closeTimer = setTimeout(\n websocket._socket.destroy.bind(websocket._socket),\n websocket._closeTimeout\n );\n}\n\n/**\n * The listener of the socket `'close'` event.\n *\n * @private\n */\nfunction socketOnClose() {\n const websocket = this[kWebSocket];\n\n this.removeListener('close', socketOnClose);\n this.removeListener('data', socketOnData);\n this.removeListener('end', socketOnEnd);\n\n websocket._readyState = WebSocket.CLOSING;\n\n //\n // The close frame might not have been received or the `'end'` event emitted,\n // for example, if the socket was destroyed due to an error. Ensure that the\n // `receiver` stream is closed after writing any remaining buffered data to\n // it. If the readable side of the socket is in flowing mode then there is no\n // buffered data as everything has been already written. If instead, the\n // socket is paused, any possible buffered data will be read as a single\n // chunk.\n //\n if (\n !this._readableState.endEmitted &&\n !websocket._closeFrameReceived &&\n !websocket._receiver._writableState.errorEmitted &&\n this._readableState.length !== 0\n ) {\n const chunk = this.read(this._readableState.length);\n\n websocket._receiver.write(chunk);\n }\n\n websocket._receiver.end();\n\n this[kWebSocket] = undefined;\n\n clearTimeout(websocket._closeTimer);\n\n if (\n websocket._receiver._writableState.finished ||\n websocket._receiver._writableState.errorEmitted\n ) {\n websocket.emitClose();\n } else {\n websocket._receiver.on('error', receiverOnFinish);\n websocket._receiver.on('finish', receiverOnFinish);\n }\n}\n\n/**\n * The listener of the socket `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction socketOnData(chunk) {\n if (!this[kWebSocket]._receiver.write(chunk)) {\n this.pause();\n }\n}\n\n/**\n * The listener of the socket `'end'` event.\n *\n * @private\n */\nfunction socketOnEnd() {\n const websocket = this[kWebSocket];\n\n websocket._readyState = WebSocket.CLOSING;\n websocket._receiver.end();\n this.end();\n}\n\n/**\n * The listener of the socket `'error'` event.\n *\n * @private\n */\nfunction socketOnError() {\n const websocket = this[kWebSocket];\n\n this.removeListener('error', socketOnError);\n this.on('error', NOOP);\n\n if (websocket) {\n websocket._readyState = WebSocket.CLOSING;\n this.destroy();\n }\n}\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^WebSocket$\" }] */\n'use strict';\n\nconst WebSocket = require('./websocket');\nconst { Duplex } = require('stream');\n\n/**\n * Emits the `'close'` event on a stream.\n *\n * @param {Duplex} stream The stream.\n * @private\n */\nfunction emitClose(stream) {\n stream.emit('close');\n}\n\n/**\n * The listener of the `'end'` event.\n *\n * @private\n */\nfunction duplexOnEnd() {\n if (!this.destroyed && this._writableState.finished) {\n this.destroy();\n }\n}\n\n/**\n * The listener of the `'error'` event.\n *\n * @param {Error} err The error\n * @private\n */\nfunction duplexOnError(err) {\n this.removeListener('error', duplexOnError);\n this.destroy();\n if (this.listenerCount('error') === 0) {\n // Do not suppress the throwing behavior.\n this.emit('error', err);\n }\n}\n\n/**\n * Wraps a `WebSocket` in a duplex stream.\n *\n * @param {WebSocket} ws The `WebSocket` to wrap\n * @param {Object} [options] The options for the `Duplex` constructor\n * @return {Duplex} The duplex stream\n * @public\n */\nfunction createWebSocketStream(ws, options) {\n let terminateOnDestroy = true;\n\n const duplex = new Duplex({\n ...options,\n autoDestroy: false,\n emitClose: false,\n objectMode: false,\n writableObjectMode: false\n });\n\n ws.on('message', function message(msg, isBinary) {\n const data =\n !isBinary && duplex._readableState.objectMode ? msg.toString() : msg;\n\n if (!duplex.push(data)) ws.pause();\n });\n\n ws.once('error', function error(err) {\n if (duplex.destroyed) return;\n\n // Prevent `ws.terminate()` from being called by `duplex._destroy()`.\n //\n // - If the `'error'` event is emitted before the `'open'` event, then\n // `ws.terminate()` is a noop as no socket is assigned.\n // - Otherwise, the error is re-emitted by the listener of the `'error'`\n // event of the `Receiver` object. The listener already closes the\n // connection by calling `ws.close()`. This allows a close frame to be\n // sent to the other peer. If `ws.terminate()` is called right after this,\n // then the close frame might not be sent.\n terminateOnDestroy = false;\n duplex.destroy(err);\n });\n\n ws.once('close', function close() {\n if (duplex.destroyed) return;\n\n duplex.push(null);\n });\n\n duplex._destroy = function (err, callback) {\n if (ws.readyState === ws.CLOSED) {\n callback(err);\n process.nextTick(emitClose, duplex);\n return;\n }\n\n let called = false;\n\n ws.once('error', function error(err) {\n called = true;\n callback(err);\n });\n\n ws.once('close', function close() {\n if (!called) callback(err);\n process.nextTick(emitClose, duplex);\n });\n\n if (terminateOnDestroy) ws.terminate();\n };\n\n duplex._final = function (callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._final(callback);\n });\n return;\n }\n\n // If the value of the `_socket` property is `null` it means that `ws` is a\n // client websocket and the handshake failed. In fact, when this happens, a\n // socket is never assigned to the websocket. Wait for the `'error'` event\n // that will be emitted by the websocket.\n if (ws._socket === null) return;\n\n if (ws._socket._writableState.finished) {\n callback();\n if (duplex._readableState.endEmitted) duplex.destroy();\n } else {\n ws._socket.once('finish', function finish() {\n // `duplex` is not destroyed here because the `'end'` event will be\n // emitted on `duplex` after this `'finish'` event. The EOF signaling\n // `null` chunk is, in fact, pushed when the websocket emits `'close'`.\n callback();\n });\n ws.close();\n }\n };\n\n duplex._read = function () {\n if (ws.isPaused) ws.resume();\n };\n\n duplex._write = function (chunk, encoding, callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._write(chunk, encoding, callback);\n });\n return;\n }\n\n ws.send(chunk, callback);\n };\n\n duplex.on('end', duplexOnEnd);\n duplex.on('error', duplexOnError);\n return duplex;\n}\n\nmodule.exports = createWebSocketStream;\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names.\n *\n * @param {String} header The field value of the header\n * @return {Set} The subprotocol names\n * @public\n */\nfunction parse(header) {\n const protocols = new Set();\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (i; i < header.length; i++) {\n const code = header.charCodeAt(i);\n\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n\n const protocol = header.slice(start, end);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n\n if (start === -1 || end !== -1) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n const protocol = header.slice(start, i);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n return protocols;\n}\n\nmodule.exports = { parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst http = require('http');\nconst { Duplex } = require('stream');\nconst { createHash } = require('crypto');\n\nconst extension = require('./extension');\nconst PerMessageDeflate = require('./permessage-deflate');\nconst subprotocol = require('./subprotocol');\nconst WebSocket = require('./websocket');\nconst { CLOSE_TIMEOUT, GUID, kWebSocket } = require('./constants');\n\nconst keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n\nconst RUNNING = 0;\nconst CLOSING = 1;\nconst CLOSED = 2;\n\n/**\n * Class representing a WebSocket server.\n *\n * @extends EventEmitter\n */\nclass WebSocketServer extends EventEmitter {\n /**\n * Create a `WebSocketServer` instance.\n *\n * @param {Object} options Configuration options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.backlog=511] The maximum length of the queue of\n * pending connections\n * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n * track clients\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to\n * wait for the closing handshake to finish after `websocket.close()` is\n * called\n * @param {Function} [options.handleProtocols] A hook to handle protocols\n * @param {String} [options.host] The hostname where to bind the server\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.noServer=false] Enable no server mode\n * @param {String} [options.path] Accept only connections matching this path\n * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n * permessage-deflate\n * @param {Number} [options.port] The port where to bind the server\n * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S\n * server to use\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @param {Function} [options.verifyClient] A hook to reject connections\n * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket`\n * class to use. It must be the `WebSocket` class or class that extends it\n * @param {Function} [callback] A listener for the `listening` event\n */\n constructor(options, callback) {\n super();\n\n options = {\n allowSynchronousEvents: true,\n autoPong: true,\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: false,\n handleProtocols: null,\n clientTracking: true,\n closeTimeout: CLOSE_TIMEOUT,\n verifyClient: null,\n noServer: false,\n backlog: null, // use default (511 as implemented in net.js)\n server: null,\n host: null,\n path: null,\n port: null,\n WebSocket,\n ...options\n };\n\n if (\n (options.port == null && !options.server && !options.noServer) ||\n (options.port != null && (options.server || options.noServer)) ||\n (options.server && options.noServer)\n ) {\n throw new TypeError(\n 'One and only one of the \"port\", \"server\", or \"noServer\" options ' +\n 'must be specified'\n );\n }\n\n if (options.port != null) {\n this._server = http.createServer((req, res) => {\n const body = http.STATUS_CODES[426];\n\n res.writeHead(426, {\n 'Content-Length': body.length,\n 'Content-Type': 'text/plain'\n });\n res.end(body);\n });\n this._server.listen(\n options.port,\n options.host,\n options.backlog,\n callback\n );\n } else if (options.server) {\n this._server = options.server;\n }\n\n if (this._server) {\n const emitConnection = this.emit.bind(this, 'connection');\n\n this._removeListeners = addListeners(this._server, {\n listening: this.emit.bind(this, 'listening'),\n error: this.emit.bind(this, 'error'),\n upgrade: (req, socket, head) => {\n this.handleUpgrade(req, socket, head, emitConnection);\n }\n });\n }\n\n if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n if (options.clientTracking) {\n this.clients = new Set();\n this._shouldEmitClose = false;\n }\n\n this.options = options;\n this._state = RUNNING;\n }\n\n /**\n * Returns the bound address, the address family name, and port of the server\n * as reported by the operating system if listening on an IP socket.\n * If the server is listening on a pipe or UNIX domain socket, the name is\n * returned as a string.\n *\n * @return {(Object|String|null)} The address of the server\n * @public\n */\n address() {\n if (this.options.noServer) {\n throw new Error('The server is operating in \"noServer\" mode');\n }\n\n if (!this._server) return null;\n return this._server.address();\n }\n\n /**\n * Stop the server from accepting new connections and emit the `'close'` event\n * when all existing connections are closed.\n *\n * @param {Function} [cb] A one-time listener for the `'close'` event\n * @public\n */\n close(cb) {\n if (this._state === CLOSED) {\n if (cb) {\n this.once('close', () => {\n cb(new Error('The server is not running'));\n });\n }\n\n process.nextTick(emitClose, this);\n return;\n }\n\n if (cb) this.once('close', cb);\n\n if (this._state === CLOSING) return;\n this._state = CLOSING;\n\n if (this.options.noServer || this.options.server) {\n if (this._server) {\n this._removeListeners();\n this._removeListeners = this._server = null;\n }\n\n if (this.clients) {\n if (!this.clients.size) {\n process.nextTick(emitClose, this);\n } else {\n this._shouldEmitClose = true;\n }\n } else {\n process.nextTick(emitClose, this);\n }\n } else {\n const server = this._server;\n\n this._removeListeners();\n this._removeListeners = this._server = null;\n\n //\n // The HTTP/S server was created internally. Close it, and rely on its\n // `'close'` event.\n //\n server.close(() => {\n emitClose(this);\n });\n }\n }\n\n /**\n * See if a given request should be handled by this server instance.\n *\n * @param {http.IncomingMessage} req Request object to inspect\n * @return {Boolean} `true` if the request is valid, else `false`\n * @public\n */\n shouldHandle(req) {\n if (this.options.path) {\n const index = req.url.indexOf('?');\n const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n\n if (pathname !== this.options.path) return false;\n }\n\n return true;\n }\n\n /**\n * Handle a HTTP Upgrade request.\n *\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @public\n */\n handleUpgrade(req, socket, head, cb) {\n socket.on('error', socketOnError);\n\n const key = req.headers['sec-websocket-key'];\n const upgrade = req.headers.upgrade;\n const version = +req.headers['sec-websocket-version'];\n\n if (req.method !== 'GET') {\n const message = 'Invalid HTTP method';\n abortHandshakeOrEmitwsClientError(this, req, socket, 405, message);\n return;\n }\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n const message = 'Invalid Upgrade header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (key === undefined || !keyRegex.test(key)) {\n const message = 'Missing or invalid Sec-WebSocket-Key header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (version !== 13 && version !== 8) {\n const message = 'Missing or invalid Sec-WebSocket-Version header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, {\n 'Sec-WebSocket-Version': '13, 8'\n });\n return;\n }\n\n if (!this.shouldHandle(req)) {\n abortHandshake(socket, 400);\n return;\n }\n\n const secWebSocketProtocol = req.headers['sec-websocket-protocol'];\n let protocols = new Set();\n\n if (secWebSocketProtocol !== undefined) {\n try {\n protocols = subprotocol.parse(secWebSocketProtocol);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Protocol header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n const secWebSocketExtensions = req.headers['sec-websocket-extensions'];\n const extensions = {};\n\n if (\n this.options.perMessageDeflate &&\n secWebSocketExtensions !== undefined\n ) {\n const perMessageDeflate = new PerMessageDeflate(\n this.options.perMessageDeflate,\n true,\n this.options.maxPayload\n );\n\n try {\n const offers = extension.parse(secWebSocketExtensions);\n\n if (offers[PerMessageDeflate.extensionName]) {\n perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n }\n } catch (err) {\n const message =\n 'Invalid or unacceptable Sec-WebSocket-Extensions header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n //\n // Optionally call external client verification handler.\n //\n if (this.options.verifyClient) {\n const info = {\n origin:\n req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],\n secure: !!(req.socket.authorized || req.socket.encrypted),\n req\n };\n\n if (this.options.verifyClient.length === 2) {\n this.options.verifyClient(info, (verified, code, message, headers) => {\n if (!verified) {\n return abortHandshake(socket, code || 401, message, headers);\n }\n\n this.completeUpgrade(\n extensions,\n key,\n protocols,\n req,\n socket,\n head,\n cb\n );\n });\n return;\n }\n\n if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n }\n\n this.completeUpgrade(extensions, key, protocols, req, socket, head, cb);\n }\n\n /**\n * Upgrade the connection to WebSocket.\n *\n * @param {Object} extensions The accepted extensions\n * @param {String} key The value of the `Sec-WebSocket-Key` header\n * @param {Set} protocols The subprotocols\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @throws {Error} If called more than once with the same socket\n * @private\n */\n completeUpgrade(extensions, key, protocols, req, socket, head, cb) {\n //\n // Destroy the socket if the client has already sent a FIN packet.\n //\n if (!socket.readable || !socket.writable) return socket.destroy();\n\n if (socket[kWebSocket]) {\n throw new Error(\n 'server.handleUpgrade() was called more than once with the same ' +\n 'socket, possibly due to a misconfiguration'\n );\n }\n\n if (this._state > RUNNING) return abortHandshake(socket, 503);\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${digest}`\n ];\n\n const ws = new this.options.WebSocket(null, undefined, this.options);\n\n if (protocols.size) {\n //\n // Optionally call external protocol selection handler.\n //\n const protocol = this.options.handleProtocols\n ? this.options.handleProtocols(protocols, req)\n : protocols.values().next().value;\n\n if (protocol) {\n headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n ws._protocol = protocol;\n }\n }\n\n if (extensions[PerMessageDeflate.extensionName]) {\n const params = extensions[PerMessageDeflate.extensionName].params;\n const value = extension.format({\n [PerMessageDeflate.extensionName]: [params]\n });\n headers.push(`Sec-WebSocket-Extensions: ${value}`);\n ws._extensions = extensions;\n }\n\n //\n // Allow external modification/inspection of handshake headers.\n //\n this.emit('headers', headers, req);\n\n socket.write(headers.concat('\\r\\n').join('\\r\\n'));\n socket.removeListener('error', socketOnError);\n\n ws.setSocket(socket, head, {\n allowSynchronousEvents: this.options.allowSynchronousEvents,\n maxPayload: this.options.maxPayload,\n skipUTF8Validation: this.options.skipUTF8Validation\n });\n\n if (this.clients) {\n this.clients.add(ws);\n ws.on('close', () => {\n this.clients.delete(ws);\n\n if (this._shouldEmitClose && !this.clients.size) {\n process.nextTick(emitClose, this);\n }\n });\n }\n\n cb(ws, req);\n }\n}\n\nmodule.exports = WebSocketServer;\n\n/**\n * Add event listeners on an `EventEmitter` using a map of <event, listener>\n * pairs.\n *\n * @param {EventEmitter} server The event emitter\n * @param {Object.<String, Function>} map The listeners to add\n * @return {Function} A function that will remove the added listeners when\n * called\n * @private\n */\nfunction addListeners(server, map) {\n for (const event of Object.keys(map)) server.on(event, map[event]);\n\n return function removeListeners() {\n for (const event of Object.keys(map)) {\n server.removeListener(event, map[event]);\n }\n };\n}\n\n/**\n * Emit a `'close'` event on an `EventEmitter`.\n *\n * @param {EventEmitter} server The event emitter\n * @private\n */\nfunction emitClose(server) {\n server._state = CLOSED;\n server.emit('close');\n}\n\n/**\n * Handle socket errors.\n *\n * @private\n */\nfunction socketOnError() {\n this.destroy();\n}\n\n/**\n * Close the connection when preconditions are not fulfilled.\n *\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} [message] The HTTP response body\n * @param {Object} [headers] Additional HTTP response headers\n * @private\n */\nfunction abortHandshake(socket, code, message, headers) {\n //\n // The socket is writable unless the user destroyed or ended it before calling\n // `server.handleUpgrade()` or in the `verifyClient` function, which is a user\n // error. Handling this does not make much sense as the worst that can happen\n // is that some of the data written by the user might be discarded due to the\n // call to `socket.end()` below, which triggers an `'error'` event that in\n // turn causes the socket to be destroyed.\n //\n message = message || http.STATUS_CODES[code];\n headers = {\n Connection: 'close',\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(message),\n ...headers\n };\n\n socket.once('finish', socket.destroy);\n\n socket.end(\n `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\\r\\n` +\n Object.keys(headers)\n .map((h) => `${h}: ${headers[h]}`)\n .join('\\r\\n') +\n '\\r\\n\\r\\n' +\n message\n );\n}\n\n/**\n * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least\n * one listener for it, otherwise call `abortHandshake()`.\n *\n * @param {WebSocketServer} server The WebSocket server\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} message The HTTP response body\n * @param {Object} [headers] The HTTP response headers\n * @private\n */\nfunction abortHandshakeOrEmitwsClientError(\n server,\n req,\n socket,\n code,\n message,\n headers\n) {\n if (server.listenerCount('wsClientError')) {\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);\n\n server.emit('wsClientError', err, socket, req);\n } else {\n abortHandshake(socket, code, message, headers);\n }\n}\n","import type { ChainProviderEntry, TownhouseConfig } from './schema.js';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { DEFAULT_CONNECTOR_IMAGE } from '../constants.js';\n\n/**\n * Default chain-provider entry for HS-mode boots without explicit config.\n *\n * These are dev-Anvil deterministic addresses paired with a dead RPC URL —\n * the connector's settlement subsystem (AccountManager + ClaimReceiver)\n * initializes successfully (SQLite-backed) even when the RPC never resolves,\n * because the chain calls are lazy and the failure path is non-fatal.\n *\n * The single concrete value-add: with these defaults present, the connector\n * wires the ClaimReceiver into the AdminServer at boot and\n * `GET /admin/earnings.json` returns 200 instead of 503 (Epic 47 BUG-1).\n *\n * Production operators override this in `config.yaml`:\n *\n * chainProviders:\n * - chainType: evm\n * chainId: evm:base:8453 # Base mainnet\n * rpcUrl: https://mainnet.base.org\n * registryAddress: 0x…\n * tokenAddress: 0x…\n * keyId: 0x… # operator-managed key\n */\nexport const DEFAULT_HS_CHAIN_PROVIDERS: readonly ChainProviderEntry[] = [\n Object.freeze({\n chainType: 'evm',\n chainId: 'evm:base:31337',\n rpcUrl: 'http://127.0.0.1:19999',\n registryAddress: '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512',\n tokenAddress: '0x5FbDB2315678afecb367f032d93F642f64180aa3',\n keyId: '0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6',\n }),\n] as const;\n\n/**\n * Sensible default configuration. All nodes disabled by default —\n * operator must explicitly enable what they want to run.\n */\nexport function getDefaultConfig(): TownhouseConfig {\n return {\n nodes: {\n town: { enabled: false },\n mill: { enabled: false },\n dvm: { enabled: false },\n },\n wallet: {\n encrypted_path: join(homedir(), '.townhouse', 'wallet.enc'),\n },\n connector: {\n image: DEFAULT_CONNECTOR_IMAGE,\n adminPort: 9401,\n },\n transport: {\n mode: 'direct',\n },\n api: {\n port: 9400,\n host: '127.0.0.1',\n },\n logging: {\n level: 'info',\n },\n };\n}\n","/**\n * Runtime validation for Townhouse configuration.\n * Validates shape, narrows types, returns typed config or throws.\n */\n\nimport type { ChainProviderEntry, TownhouseConfig } from './schema.js';\n\nconst VALID_CHAIN_TYPES = new Set(['evm']);\nconst HEX_ADDRESS = /^0x[a-fA-F0-9]+$/;\n\nclass ConfigValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigValidationError';\n }\n}\n\nfunction assertObject(\n value: unknown,\n path: string\n): asserts value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new ConfigValidationError(`${path} must be a non-null object`);\n }\n}\n\nfunction assertBoolean(value: unknown, path: string): asserts value is boolean {\n if (typeof value !== 'boolean') {\n throw new ConfigValidationError(`${path} must be a boolean`);\n }\n}\n\nfunction assertString(value: unknown, path: string): asserts value is string {\n if (typeof value !== 'string') {\n throw new ConfigValidationError(`${path} must be a string`);\n }\n}\n\nfunction assertNumber(value: unknown, path: string): asserts value is number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new ConfigValidationError(`${path} must be a finite number`);\n }\n}\n\nfunction assertPort(value: number, path: string): void {\n if (!Number.isInteger(value) || value < 0 || value > 65535) {\n throw new ConfigValidationError(\n `${path} must be an integer in range 0..65535`\n );\n }\n}\n\nconst VALID_LOG_LEVELS = new Set(['debug', 'info', 'warn', 'error']);\nconst VALID_TRANSPORT_MODES = new Set(['ator', 'direct']);\n\nfunction validateNodeConfig(\n raw: unknown,\n path: string\n): { enabled: boolean } & Record<string, unknown> {\n assertObject(raw, path);\n assertBoolean(raw['enabled'], `${path}.enabled`);\n\n if (raw['feePerEvent'] !== undefined) {\n assertNumber(raw['feePerEvent'], `${path}.feePerEvent`);\n }\n if (raw['feeBasisPoints'] !== undefined) {\n assertNumber(raw['feeBasisPoints'], `${path}.feeBasisPoints`);\n }\n if (raw['feePerJob'] !== undefined) {\n assertNumber(raw['feePerJob'], `${path}.feePerJob`);\n }\n if (raw['kindPricing'] !== undefined) {\n assertObject(raw['kindPricing'], `${path}.kindPricing`);\n for (const [k, v] of Object.entries(\n raw['kindPricing'] as Record<string, unknown>\n )) {\n // Keys must be positive-integer strings — prevents prototype-key\n // pollution (`__proto__`, `constructor`) and env-var key injection\n // (newlines / spaces) when the orchestrator emits KIND_PRICING_<k>.\n if (!/^[0-9]+$/.test(k)) {\n throw new ConfigValidationError(\n `${path}.kindPricing has invalid key \"${k}\" — must be a positive-integer string`\n );\n }\n assertNumber(v, `${path}.kindPricing.${k}`);\n if (!Number.isInteger(v as number) || (v as number) < 0) {\n throw new ConfigValidationError(\n `${path}.kindPricing.${k} must be a non-negative integer`\n );\n }\n if ((v as number) > Number.MAX_SAFE_INTEGER) {\n throw new ConfigValidationError(\n `${path}.kindPricing.${k} exceeds Number.MAX_SAFE_INTEGER`\n );\n }\n }\n }\n if (raw['image'] !== undefined) {\n assertString(raw['image'], `${path}.image`);\n }\n\n return raw as { enabled: boolean } & Record<string, unknown>;\n}\n\n/**\n * Validate raw input and return a typed TownhouseConfig.\n * Throws ConfigValidationError with descriptive messages on invalid input.\n */\nexport function validateConfig(raw: unknown): TownhouseConfig {\n assertObject(raw, 'config');\n\n // nodes\n assertObject(raw['nodes'], 'config.nodes');\n const nodes = raw['nodes'] as Record<string, unknown>;\n const town = validateNodeConfig(nodes['town'], 'config.nodes.town');\n const mill = validateNodeConfig(nodes['mill'], 'config.nodes.mill');\n const dvm = validateNodeConfig(nodes['dvm'], 'config.nodes.dvm');\n\n // wallet\n assertObject(raw['wallet'], 'config.wallet');\n const wallet = raw['wallet'] as Record<string, unknown>;\n assertString(wallet['encrypted_path'], 'config.wallet.encrypted_path');\n\n // connector\n assertObject(raw['connector'], 'config.connector');\n const connector = raw['connector'] as Record<string, unknown>;\n assertString(connector['image'], 'config.connector.image');\n assertNumber(connector['adminPort'], 'config.connector.adminPort');\n assertPort(connector['adminPort'] as number, 'config.connector.adminPort');\n\n // transport\n assertObject(raw['transport'], 'config.transport');\n const transport = raw['transport'] as Record<string, unknown>;\n assertString(transport['mode'], 'config.transport.mode');\n if (!VALID_TRANSPORT_MODES.has(transport['mode'] as string)) {\n throw new ConfigValidationError(\n `config.transport.mode must be one of: ${[...VALID_TRANSPORT_MODES].join(', ')}`\n );\n }\n if (transport['socksProxy'] !== undefined) {\n assertString(transport['socksProxy'], 'config.transport.socksProxy');\n }\n if (transport['externalUrl'] !== undefined) {\n assertString(transport['externalUrl'], 'config.transport.externalUrl');\n }\n // hiddenService is optional and only meaningful when mode='ator'. We\n // validate the inner shape unconditionally if present (a hiddenService\n // block under mode='direct' is operator confusion, not silent acceptance).\n if (transport['hiddenService'] !== undefined) {\n assertObject(transport['hiddenService'], 'config.transport.hiddenService');\n const hs = transport['hiddenService'] as Record<string, unknown>;\n assertString(hs['dir'], 'config.transport.hiddenService.dir');\n assertNumber(hs['port'], 'config.transport.hiddenService.port');\n assertPort(hs['port'] as number, 'config.transport.hiddenService.port');\n if (hs['externalUrl'] !== undefined) {\n assertString(\n hs['externalUrl'],\n 'config.transport.hiddenService.externalUrl'\n );\n }\n if (hs['startupTimeoutMs'] !== undefined) {\n assertNumber(\n hs['startupTimeoutMs'],\n 'config.transport.hiddenService.startupTimeoutMs'\n );\n }\n if (hs['stopTimeoutMs'] !== undefined) {\n assertNumber(\n hs['stopTimeoutMs'],\n 'config.transport.hiddenService.stopTimeoutMs'\n );\n }\n if (transport['mode'] !== 'ator') {\n throw new ConfigValidationError(\n 'config.transport.hiddenService is only valid when config.transport.mode is \"ator\"'\n );\n }\n }\n // relayHiddenService is the second optional HS — when set, the orchestrator\n // launches a parallel sidecar that forwards inbound .anyone traffic to the\n // town container's port 7100 so external Nostr clients can read the relay\n // without routing through ILP/BTP. Reuses HiddenServiceConfig shape.\n if (transport['relayHiddenService'] !== undefined) {\n assertObject(\n transport['relayHiddenService'],\n 'config.transport.relayHiddenService'\n );\n const hs = transport['relayHiddenService'] as Record<string, unknown>;\n assertString(hs['dir'], 'config.transport.relayHiddenService.dir');\n assertNumber(hs['port'], 'config.transport.relayHiddenService.port');\n assertPort(\n hs['port'] as number,\n 'config.transport.relayHiddenService.port'\n );\n if (hs['externalUrl'] !== undefined) {\n assertString(\n hs['externalUrl'],\n 'config.transport.relayHiddenService.externalUrl'\n );\n }\n if (hs['startupTimeoutMs'] !== undefined) {\n assertNumber(\n hs['startupTimeoutMs'],\n 'config.transport.relayHiddenService.startupTimeoutMs'\n );\n }\n if (hs['stopTimeoutMs'] !== undefined) {\n assertNumber(\n hs['stopTimeoutMs'],\n 'config.transport.relayHiddenService.stopTimeoutMs'\n );\n }\n }\n\n // mode='ator' requires SOMETHING to advertise: either explicit externalUrl\n // OR hiddenService (which makes externalUrl='auto' implicit). Without one\n // of these, the connector's socks5 transport rejects with \"missing\n // required field: transport.externalUrl\" and the connector fails to boot.\n if (\n transport['mode'] === 'ator' &&\n transport['externalUrl'] === undefined &&\n transport['hiddenService'] === undefined\n ) {\n throw new ConfigValidationError(\n 'config.transport.mode=\"ator\" requires either config.transport.externalUrl ' +\n '(operator-managed anon binary) or config.transport.hiddenService ' +\n '(connector-managed anon binary). Without one of these, the underlying ' +\n 'connector will reject the manifest at boot.'\n );\n }\n\n // chainProviders (optional)\n let chainProviders: ChainProviderEntry[] | undefined;\n if (raw['chainProviders'] !== undefined) {\n if (!Array.isArray(raw['chainProviders'])) {\n throw new ConfigValidationError(\n 'config.chainProviders must be an array of ChainProviderEntry'\n );\n }\n chainProviders = (raw['chainProviders'] as unknown[]).map((entry, idx) => {\n const path = `config.chainProviders[${idx}]`;\n assertObject(entry, path);\n assertString(entry['chainType'], `${path}.chainType`);\n if (!VALID_CHAIN_TYPES.has(entry['chainType'] as string)) {\n throw new ConfigValidationError(\n `${path}.chainType must be one of: ${[...VALID_CHAIN_TYPES].join(', ')}`\n );\n }\n assertString(entry['chainId'], `${path}.chainId`);\n assertString(entry['rpcUrl'], `${path}.rpcUrl`);\n assertString(entry['registryAddress'], `${path}.registryAddress`);\n if (!HEX_ADDRESS.test(entry['registryAddress'] as string)) {\n throw new ConfigValidationError(\n `${path}.registryAddress must match /^0x[a-fA-F0-9]+$/`\n );\n }\n assertString(entry['tokenAddress'], `${path}.tokenAddress`);\n if (!HEX_ADDRESS.test(entry['tokenAddress'] as string)) {\n throw new ConfigValidationError(\n `${path}.tokenAddress must match /^0x[a-fA-F0-9]+$/`\n );\n }\n assertString(entry['keyId'], `${path}.keyId`);\n if (!HEX_ADDRESS.test(entry['keyId'] as string)) {\n throw new ConfigValidationError(\n `${path}.keyId must match /^0x[a-fA-F0-9]+$/`\n );\n }\n return {\n chainType: entry['chainType'] as 'evm',\n chainId: entry['chainId'] as string,\n rpcUrl: entry['rpcUrl'] as string,\n registryAddress: entry['registryAddress'] as string,\n tokenAddress: entry['tokenAddress'] as string,\n keyId: entry['keyId'] as string,\n };\n });\n }\n\n // api\n assertObject(raw['api'], 'config.api');\n const api = raw['api'] as Record<string, unknown>;\n assertNumber(api['port'], 'config.api.port');\n assertPort(api['port'] as number, 'config.api.port');\n assertString(api['host'], 'config.api.host');\n\n // logging\n assertObject(raw['logging'], 'config.logging');\n const logging = raw['logging'] as Record<string, unknown>;\n assertString(logging['level'], 'config.logging.level');\n if (!VALID_LOG_LEVELS.has(logging['level'] as string)) {\n throw new ConfigValidationError(\n `config.logging.level must be one of: ${[...VALID_LOG_LEVELS].join(', ')}`\n );\n }\n\n return {\n nodes: {\n town: {\n enabled: town['enabled'] as boolean,\n ...pickOptional(town, ['feePerEvent', 'image']),\n },\n mill: {\n enabled: mill['enabled'] as boolean,\n ...pickOptional(mill, ['feeBasisPoints', 'image']),\n },\n dvm: {\n enabled: dvm['enabled'] as boolean,\n ...pickOptional(dvm, ['feePerJob', 'kindPricing', 'image']),\n },\n },\n wallet: { encrypted_path: wallet['encrypted_path'] as string },\n connector: {\n image: connector['image'] as string,\n adminPort: connector['adminPort'] as number,\n },\n transport: {\n mode: transport['mode'] as 'ator' | 'direct',\n ...(transport['socksProxy'] !== undefined\n ? { socksProxy: transport['socksProxy'] as string }\n : {}),\n ...(transport['externalUrl'] !== undefined\n ? { externalUrl: transport['externalUrl'] as string }\n : {}),\n ...(transport['hiddenService'] !== undefined\n ? {\n hiddenService: transport['hiddenService'] as {\n dir: string;\n port: number;\n externalUrl?: string;\n startupTimeoutMs?: number;\n stopTimeoutMs?: number;\n },\n }\n : {}),\n ...(transport['relayHiddenService'] !== undefined\n ? {\n relayHiddenService: transport['relayHiddenService'] as {\n dir: string;\n port: number;\n externalUrl?: string;\n startupTimeoutMs?: number;\n stopTimeoutMs?: number;\n },\n }\n : {}),\n },\n api: {\n port: api['port'] as number,\n host: api['host'] as string,\n },\n logging: {\n level: logging['level'] as 'debug' | 'info' | 'warn' | 'error',\n },\n ...(chainProviders !== undefined ? { chainProviders } : {}),\n };\n}\n\nfunction pickOptional(\n obj: Record<string, unknown>,\n keys: string[]\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const key of keys) {\n if (obj[key] !== undefined) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\nexport { ConfigValidationError };\n","/**\n * Config file loader — reads YAML, validates, writes.\n */\n\nimport { readFileSync, writeFileSync, renameSync } from 'node:fs';\nimport { parse, stringify } from 'yaml';\nimport { validateConfig } from './validator.js';\nimport { getDefaultConfig } from './defaults.js';\nimport type { TownhouseConfig } from './schema.js';\n\n/**\n * Load and validate a Townhouse config from a YAML file.\n * Environment variables override YAML values for key settings:\n * - TOWNHOUSE_API_PORT\n * - TOWNHOUSE_TRANSPORT_MODE\n * - TOWNHOUSE_LOG_LEVEL\n */\nexport function loadConfig(configPath: string): TownhouseConfig {\n let rawText: string;\n try {\n rawText = readFileSync(configPath, 'utf-8');\n } catch (err: unknown) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new Error(`Config file not found: ${configPath}`);\n }\n throw err;\n }\n\n let parsed: unknown;\n try {\n parsed = parse(rawText);\n } catch {\n throw new Error(`Failed to parse YAML config at ${configPath}`);\n }\n\n // An empty YAML file parses to null — treat as empty object so defaults apply\n if (parsed === null || parsed === undefined) {\n parsed = {};\n }\n\n if (typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error(\n `Config at ${configPath} must be a YAML mapping (object), not ${Array.isArray(parsed) ? 'an array' : typeof parsed}`\n );\n }\n\n // Deep-merge with defaults so partial configs work\n const defaults = getDefaultConfig();\n const merged = deepMerge(\n defaults as unknown as Record<string, unknown>,\n parsed as Record<string, unknown>\n );\n\n // Apply environment variable overrides\n applyEnvOverrides(merged);\n\n return validateConfig(merged);\n}\n\nfunction applyEnvOverrides(config: Record<string, unknown>): void {\n const env = process.env;\n\n if (env['TOWNHOUSE_API_PORT']) {\n const port = parseInt(env['TOWNHOUSE_API_PORT'], 10);\n if (!Number.isFinite(port) || port < 0 || port > 65535) {\n throw new Error('TOWNHOUSE_API_PORT must be 0..65535');\n }\n const api = config['api'] as Record<string, unknown> | undefined;\n if (api) {\n api['port'] = port;\n }\n }\n\n if (env['TOWNHOUSE_TRANSPORT_MODE']) {\n const mode = env['TOWNHOUSE_TRANSPORT_MODE'];\n if (mode !== 'ator' && mode !== 'direct') {\n throw new Error('TOWNHOUSE_TRANSPORT_MODE must be \"ator\" or \"direct\"');\n }\n const transport = config['transport'] as\n | Record<string, unknown>\n | undefined;\n if (transport) {\n transport['mode'] = mode;\n }\n }\n\n if (env['TOWNHOUSE_LOG_LEVEL']) {\n const level = env['TOWNHOUSE_LOG_LEVEL'];\n if (!['debug', 'info', 'warn', 'error'].includes(level)) {\n throw new Error(\n 'TOWNHOUSE_LOG_LEVEL must be one of: debug, info, warn, error'\n );\n }\n const logging = config['logging'] as Record<string, unknown> | undefined;\n if (logging) {\n logging['level'] = level;\n }\n }\n}\n\n/** Keys that must never be merged — prevents prototype pollution (CWE-1321). */\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Simple deep merge — target values are overwritten by source values.\n * Arrays are replaced, not concatenated.\n * Skips dangerous keys to prevent prototype pollution from crafted YAML.\n */\nfunction deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>\n): Record<string, unknown> {\n const result: Record<string, unknown> = { ...target };\n for (const key of Object.keys(source)) {\n if (DANGEROUS_KEYS.has(key)) {\n continue;\n }\n const sv = source[key];\n const tv = target[key];\n if (\n typeof sv === 'object' &&\n sv !== null &&\n !Array.isArray(sv) &&\n typeof tv === 'object' &&\n tv !== null &&\n !Array.isArray(tv)\n ) {\n result[key] = deepMerge(\n tv as Record<string, unknown>,\n sv as Record<string, unknown>\n );\n } else {\n result[key] = sv;\n }\n }\n return result;\n}\n\n/**\n * Save a config to a YAML file atomically.\n * Writes to a temp file first, then renames to the target (atomic on POSIX).\n */\nexport function saveConfig(configPath: string, config: TownhouseConfig): void {\n // Validate before saving\n const validated = validateConfig(config);\n\n // Serialize to YAML\n const yaml = stringify(validated);\n\n // Write to temp file first\n const tmpPath = configPath + '.tmp';\n writeFileSync(tmpPath, yaml, 'utf-8');\n\n // Atomic rename\n renameSync(tmpPath, configPath);\n}\n","/**\n * Connector Config Generator for Townhouse (Story 21.3).\n *\n * Generates runtime configuration for the standalone ILP connector\n * based on the Townhouse config and currently active nodes.\n */\n\nimport { stringify as yamlStringify } from 'yaml';\n\nimport type { TownhouseConfig } from '../config/schema.js';\nimport type { NodeType } from '../docker/types.js';\nimport { CONTAINER_PREFIX, NODE_BTP_PORT } from '../constants.js';\nimport type { ConnectorRuntimeConfig, PeerEntry } from './types.js';\n\n/** Default ILP address for the Townhouse connector */\nconst DEFAULT_ILP_ADDRESS = 'g.townhouse';\n\n/** Default ATOR SOCKS proxy address */\nexport const DEFAULT_ATOR_PROXY = 'socks5h://proxy.ator.io:9050';\n\n/** Default asset configuration for ILP peers */\nconst DEFAULT_ASSET_CODE = 'USD';\nconst DEFAULT_ASSET_SCALE = 6;\n\n/**\n * ConnectorConfigGenerator produces runtime configuration for the standalone\n * ILP connector based on Townhouse config and active node list.\n *\n * Key design: peer BTP URLs are deterministic Docker DNS names, so nodes\n * don't need to be running for config generation to work.\n */\nexport class ConnectorConfigGenerator {\n private readonly config: TownhouseConfig;\n\n constructor(config: TownhouseConfig) {\n this.config = config;\n }\n\n /**\n * Generate a ConnectorRuntimeConfig for the given set of active nodes.\n *\n * @param activeNodes - Node types currently running or about to start\n * @returns Typed configuration object (not serialized)\n */\n generate(activeNodes: NodeType[]): ConnectorRuntimeConfig {\n const peers = this.generatePeerList(activeNodes);\n const transport = this.generateTransportConfig();\n\n return {\n adminPort: this.config.connector.adminPort,\n ilpAddress: DEFAULT_ILP_ADDRESS,\n peers,\n transport,\n };\n }\n\n /**\n * Serialize a ConnectorRuntimeConfig into environment variable key-value pairs.\n *\n * @returns Record of env var name to string value\n */\n toEnvVars(runtimeConfig: ConnectorRuntimeConfig): Record<string, string> {\n const env: Record<string, string> = {\n CONNECTOR_ADMIN_PORT: String(runtimeConfig.adminPort),\n CONNECTOR_ILP_ADDRESS: runtimeConfig.ilpAddress,\n CONNECTOR_PEERS: JSON.stringify(runtimeConfig.peers),\n TRANSPORT_MODE: runtimeConfig.transport.mode,\n };\n\n if (runtimeConfig.transport.socksProxy) {\n env['SOCKS_PROXY'] = runtimeConfig.transport.socksProxy;\n }\n\n // Hidden-service env vars surface for tooling that wants the .anyone\n // address out-of-band (e.g., `townhouse status` reading the hostname\n // file). The connector itself reads these from the YAML config block\n // produced by toYaml(), not env.\n if (runtimeConfig.transport.hiddenService) {\n env['TRANSPORT_HIDDEN_SERVICE_DIR'] =\n runtimeConfig.transport.hiddenService.dir;\n env['TRANSPORT_HIDDEN_SERVICE_PORT'] = String(\n runtimeConfig.transport.hiddenService.port\n );\n }\n\n return env;\n }\n\n /**\n * Convert a ConnectorRuntimeConfig into the string[] format expected by\n * dockerode's container create API (Env option: ['KEY=VALUE', ...]).\n *\n * @returns Array of 'KEY=VALUE' strings\n */\n toEnvArray(runtimeConfig: ConnectorRuntimeConfig): string[] {\n const envVars = this.toEnvVars(runtimeConfig);\n return Object.entries(envVars).map(([key, value]) => `${key}=${value}`);\n }\n\n /**\n * Render a connector YAML config string the connector image at 3.3.x can\n * load via its `CONFIG_FILE` env var (default `./config.yaml`).\n *\n * The shape mirrors `docker/configs/townhouse-dev-connector.yaml` (the\n * working dev fixture) — peers list is empty because child nodes dial\n * INTO the connector at startup; the connector accepts BTP connections\n * (no-auth in dev) without needing pre-configured peer entries.\n *\n * Added in the orchestrator-bug-fix: env vars set on the container were\n * silently ignored by the connector image, which only reads from this\n * YAML file. Caller writes the returned string to disk and mounts it\n * at `/config/connector.yaml` in the container.\n */\n toYaml(runtimeConfig: ConnectorRuntimeConfig): string {\n // Translate operator-facing `mode: 'ator' | 'direct'` into the\n // connector's internal discriminated union (Epic 35 / Story 35.3):\n // { type: 'direct' }\n // → unchanged direct TCP\n // { type: 'socks5', socksProxy, externalUrl, managed, managedOptions? }\n // → SOCKS5 outbound + (optionally) managed inbound hidden service\n //\n // Historical bug we're fixing here: the previous shape was\n // `{ mode: 'ator', socksProxy }`, which the connector at 3.3.x\n // does NOT recognize. The connector's validateTransport() saw an\n // unknown `mode` field, defaulted `type` to 'direct', and silently\n // discarded socksProxy. Operators toggling mode='ator' got direct\n // traffic anyway. The new shape is what the connector actually reads.\n const transportBlock = this.buildConnectorTransportBlock(\n runtimeConfig.transport\n );\n\n const yamlObj: Record<string, unknown> = {\n nodeId: runtimeConfig.ilpAddress,\n btpServerPort: NODE_BTP_PORT,\n healthCheckPort: 8080,\n environment: 'development',\n deploymentMode: 'standalone',\n logLevel: this.config.logging?.level ?? 'info',\n adminApi: {\n enabled: true,\n port: runtimeConfig.adminPort,\n host: '0.0.0.0',\n // Permissive for the demo loopback environment. Production deployments\n // would lock this to specific operator IPs.\n allowedIPs: ['0.0.0.0/0'],\n },\n transport: transportBlock,\n peers: [],\n routes: [],\n };\n\n // Epic 47 BUG-1 fix (D2): emit chainProviders when configured so the\n // connector's settlement subsystem initializes. Without it,\n // /admin/earnings.json returns 503 and Townhouse's earnings data plane\n // (Epic 47.1–47.5) silently degrades. `hs-config-writer.ts` injects\n // `DEFAULT_HS_CHAIN_PROVIDERS` when the operator hasn't configured this.\n if (\n this.config.chainProviders !== undefined &&\n this.config.chainProviders.length > 0\n ) {\n yamlObj['chainProviders'] = this.config.chainProviders.map((p) => ({\n chainType: p.chainType,\n chainId: p.chainId,\n rpcUrl: p.rpcUrl,\n registryAddress: p.registryAddress,\n tokenAddress: p.tokenAddress,\n keyId: p.keyId,\n }));\n }\n\n return yamlStringify(yamlObj);\n }\n\n // ── Private helpers ──\n\n /**\n * Translate the runtime config's transport block into the discriminated-\n * union shape the connector expects. See toYaml's note for why this was\n * silently broken before.\n */\n private buildConnectorTransportBlock(\n transport: ConnectorRuntimeConfig['transport']\n ): Record<string, unknown> {\n if (transport.mode === 'direct') {\n return { type: 'direct' };\n }\n const block: Record<string, unknown> = {\n type: 'socks5',\n socksProxy: transport.socksProxy ?? DEFAULT_ATOR_PROXY,\n };\n if (transport.hiddenService) {\n // Connector-managed inbound hidden service (Story 35.5). When\n // hiddenService is set, the connector spawns the anon binary itself\n // and resolves externalUrl from `${dir}/hostname` at boot.\n block['externalUrl'] = transport.externalUrl ?? 'auto';\n block['managed'] = true;\n const managedOptions: Record<string, unknown> = {\n hiddenServiceDir: transport.hiddenService.dir,\n hiddenServicePort: transport.hiddenService.port,\n };\n if (transport.hiddenService.startupTimeoutMs !== undefined) {\n managedOptions['startupTimeoutMs'] =\n transport.hiddenService.startupTimeoutMs;\n }\n if (transport.hiddenService.stopTimeoutMs !== undefined) {\n managedOptions['stopTimeoutMs'] = transport.hiddenService.stopTimeoutMs;\n }\n block['managedOptions'] = managedOptions;\n } else {\n // Operator manages anon externally — externalUrl is non-optional in\n // this branch; the validator enforces it upstream, so we trust it.\n // The connector also requires `managed: false` here.\n block['externalUrl'] = transport.externalUrl;\n block['managed'] = false;\n }\n return block;\n }\n\n /**\n * Generate PeerEntry list for each active node type.\n * BTP URLs use Docker DNS: btp+ws://townhouse-{type}:3000 // nosemgrep: javascript.lang.security.detect-insecure-websocket.detect-insecure-websocket\n */\n private generatePeerList(activeNodes: NodeType[]): PeerEntry[] {\n return activeNodes.map((type) => ({\n id: type,\n relation: 'child' as const,\n // nosemgrep: javascript.lang.security.detect-insecure-websocket.detect-insecure-websocket -- Docker-internal BTP URL, TLS unnecessary\n btpUrl: `btp+ws://${CONTAINER_PREFIX}${type}:${NODE_BTP_PORT}`,\n assetCode: DEFAULT_ASSET_CODE,\n assetScale: DEFAULT_ASSET_SCALE,\n }));\n }\n\n /**\n * Generate transport config from Townhouse config.\n * When mode is 'ator', includes SOCKS proxy (uses default if not configured).\n * Carries forward externalUrl + hiddenService when set; downstream\n * buildConnectorTransportBlock handles translation to the connector's\n * wire shape.\n */\n private generateTransportConfig(): ConnectorRuntimeConfig['transport'] {\n if (this.config.transport.mode === 'ator') {\n const transport: ConnectorRuntimeConfig['transport'] = {\n mode: 'ator',\n socksProxy: this.config.transport.socksProxy ?? DEFAULT_ATOR_PROXY,\n };\n if (this.config.transport.externalUrl !== undefined) {\n transport.externalUrl = this.config.transport.externalUrl;\n }\n if (this.config.transport.hiddenService !== undefined) {\n const hs = this.config.transport.hiddenService;\n transport.hiddenService = {\n dir: hs.dir,\n port: hs.port,\n ...(hs.externalUrl !== undefined\n ? { externalUrl: hs.externalUrl }\n : {}),\n ...(hs.startupTimeoutMs !== undefined\n ? { startupTimeoutMs: hs.startupTimeoutMs }\n : {}),\n ...(hs.stopTimeoutMs !== undefined\n ? { stopTimeoutMs: hs.stopTimeoutMs }\n : {}),\n };\n }\n return transport;\n }\n\n return { mode: 'direct' };\n }\n}\n","/**\n * Connector Admin Client for Townhouse (Story 21.3, contract aligned in 21.7.5).\n *\n * HTTP client for the connector's admin API endpoints. Paths and response\n * shapes mirror the connector source-of-truth — see\n * `@toon-protocol/connector` `packages/connector/src/http/{types,admin-api}.ts`.\n *\n * Uses Node.js native fetch (available in Node 20+).\n *\n * Two distinct HTTP servers live on the connector image:\n * - healthCheckPort serves /health and /health/{live,ready}\n * - adminApi.port serves /admin/* (peers, metrics.json, routes, channels, …)\n *\n * The base URL passed to this client must point at whichever server hosts\n * the endpoint being called: pass the healthCheckPort base for `getHealth`\n * and the adminApi.port base for `getPeers` / `getMetrics`. In practice\n * Townhouse currently runs both ports on the same host, so callers either\n * construct two clients or hit a shared base URL when the ports overlap.\n */\n\nimport type {\n ChannelSummary,\n ConnectorFeeEntry,\n EarningsResponse,\n EarningsTimestamp,\n HealthResponse,\n HsHostnameResponse,\n MetricsResponse,\n PeerEarnings,\n PeerStatus,\n PeersResponse,\n PacketLogFilter,\n PacketLogEntry,\n PacketLogResponse,\n RecentClaim,\n} from './types.js';\n\n/** Default request timeout in milliseconds (5 seconds) */\nconst DEFAULT_TIMEOUT_MS = 5000;\n\nexport class ConnectorAdminClient {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n\n /**\n * @param baseUrl - Base URL for the connector admin API (e.g., 'http://localhost:9402')\n * @param timeoutMs - Request timeout in milliseconds (default: 5000)\n */\n constructor(baseUrl: string, timeoutMs: number = DEFAULT_TIMEOUT_MS) {\n // Strip trailing slash to avoid double-slash in URL construction\n this.baseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n this.timeoutMs = timeoutMs;\n }\n\n /** Public read of the configured base URL (used by drill-command probes to derive a sibling client). */\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * GET /health on the admin-API port — checks HTTP reachability of the\n * connector without validating the rich HealthStatus shape. Use this from\n * the drill-command health probe when only the admin URL is available\n * (port 9401), not the healthCheckPort (8080). The admin server's /health\n * returns `{status:'healthy', service:'admin-api', nodeId, timestamp}` —\n * a different shape from `getHealth()`'s validator. This method returns\n * a coarse status from a 200 response and reads `nodeId` if present.\n *\n * @throws Error when connector is unreachable or returns non-2xx.\n */\n async pingAdminLive(): Promise<{ status: 'healthy'; nodeId?: string }> {\n const response = await this.fetch('/health');\n const body: unknown = await response.json().catch(() => ({}));\n const nodeId =\n typeof body === 'object' &&\n body !== null &&\n typeof (body as Record<string, unknown>)['nodeId'] === 'string'\n ? ((body as Record<string, unknown>)['nodeId'] as string)\n : undefined;\n return nodeId !== undefined\n ? { status: 'healthy', nodeId }\n : { status: 'healthy' };\n }\n\n /**\n * GET /health — returns the connector's HealthStatus from the healthCheckPort server.\n *\n * @throws Error when connector is not running, returns non-200, or shape is invalid\n */\n async getHealth(): Promise<HealthResponse> {\n const response = await this.fetch('/health');\n const body: unknown = await response.json();\n if (typeof body !== 'object' || body === null) {\n throw new Error('Connector admin API: invalid health response shape');\n }\n const obj = body as Record<string, unknown>;\n const status = obj['status'];\n if (\n status !== 'healthy' &&\n status !== 'unhealthy' &&\n status !== 'starting' &&\n status !== 'degraded'\n ) {\n throw new Error('Connector admin API: invalid health response shape');\n }\n if (\n typeof obj['uptime'] !== 'number' ||\n typeof obj['peersConnected'] !== 'number' ||\n typeof obj['totalPeers'] !== 'number' ||\n typeof obj['timestamp'] !== 'string'\n ) {\n throw new Error('Connector admin API: invalid health response shape');\n }\n return body as HealthResponse;\n }\n\n /**\n * GET /admin/hs-hostname — returns the connector's published .anyone hidden-service\n * hostname (Epic 45 / Story 44.1). Returns 200 with {hostname, publishedAt} both\n * possibly null while bootstrap is in progress, both non-null once anon publishes.\n * Returns 503 when the connector is anon-disabled (anon.enabled: false in config).\n *\n * @throws Error('connector is anon-disabled (HTTP 503)') on 503 — caller can match\n * on this exact prefix for actionable diagnostics.\n * @throws Error on non-200/503 status, network error, or shape-validation failure.\n */\n async getHsHostname(): Promise<HsHostnameResponse> {\n const url = `${this.baseUrl}/admin/hs-hostname`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n let body: unknown;\n try {\n let response: Response;\n try {\n response = await fetch(url, { signal: controller.signal });\n } catch (error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(\n `Connector admin API request timeout after ${this.timeoutMs}ms: ${url}`\n );\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new Error(`Connector admin API connection refused: ${msg}`);\n }\n if (response.status === 503) {\n throw new Error('connector is anon-disabled (HTTP 503)');\n }\n // fast-fail on unexpected non-200/503 status codes. Retrying a 404\n // (pre-v3.5.0 connector image) for 120 s silently burns the full readiness\n // timeout. Only 200 (success) and 503 (anon-disabled, caught above) are\n // expected — everything else is an immediate fatal error.\n if (!response.ok) {\n throw new Error(\n `Connector admin API unexpected status ${response.status} on /admin/hs-hostname — ` +\n `expected 200 or 503 (connector image may be too old or misconfigured)`\n );\n }\n // Body read MUST happen inside the AbortSignal-protected try so the\n // request timeout covers a slow / streaming JSON body. An AbortError\n // here means the body read itself timed out; surface as a timeout so\n // the readiness loop's diagnostics distinguish it from a malformed\n // body. Other JSON errors (true SyntaxError on non-JSON content)\n // re-throw as a shape error.\n try {\n body = await response.json();\n } catch (error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(\n `Connector admin API request timeout after ${this.timeoutMs}ms: ${url}`\n );\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Connector admin API: invalid JSON in hs-hostname response: ${msg}`\n );\n }\n } finally {\n clearTimeout(timer);\n }\n if (typeof body !== 'object' || body === null) {\n throw new Error(\n 'Connector admin API: invalid hs-hostname response shape'\n );\n }\n const obj = body as Record<string, unknown>;\n const hostname = obj['hostname'];\n const publishedAt = obj['publishedAt'];\n if (\n (hostname !== null && typeof hostname !== 'string') ||\n (publishedAt !== null && typeof publishedAt !== 'string')\n ) {\n throw new Error(\n 'Connector admin API: invalid hs-hostname response shape'\n );\n }\n // Empty-string hostname / publishedAt are server-side bugs — reject so\n // the readiness loop fails fast instead of returning \"ready\" with an\n // unusable address or empty timestamp.\n if (typeof hostname === 'string' && hostname.length === 0) {\n throw new Error(\n 'Connector admin API: invalid hs-hostname response shape'\n );\n }\n if (typeof publishedAt === 'string' && publishedAt.length === 0) {\n throw new Error(\n 'Connector admin API: invalid hs-hostname response shape'\n );\n }\n // Enforce the `.anon` suffix at the trust boundary: the ATOR network uses\n // `.anon` as the hidden-service TLD (analogous to Tor's `.onion`). A\n // non-`.anon` value indicates connector-side misconfiguration and would\n // propagate as an unusable address through Story 45.4's CLI.\n if (typeof hostname === 'string' && !hostname.endsWith('.anon')) {\n throw new Error(\n 'Connector admin API: invalid hs-hostname response shape'\n );\n }\n return body as HsHostnameResponse;\n }\n\n /**\n * GET /admin/metrics.json — returns the connector's per-peer ILP counters\n * with an aggregate rollup, mirroring `AdminMetricsJsonResponse`.\n *\n * @throws Error when connector is not running, returns non-200, or shape is invalid\n */\n async getMetrics(): Promise<MetricsResponse> {\n const response = await this.fetch('/admin/metrics.json');\n const body: unknown = await response.json();\n if (typeof body !== 'object' || body === null) {\n throw new Error('Connector admin API: invalid metrics response shape');\n }\n const obj = body as Record<string, unknown>;\n const aggregate = obj['aggregate'];\n if (\n typeof obj['uptimeSeconds'] !== 'number' ||\n typeof aggregate !== 'object' ||\n aggregate === null ||\n !Array.isArray(obj['peers']) ||\n typeof obj['timestamp'] !== 'string'\n ) {\n throw new Error('Connector admin API: invalid metrics response shape');\n }\n const agg = aggregate as Record<string, unknown>;\n if (\n typeof agg['packetsForwarded'] !== 'number' ||\n typeof agg['packetsRejected'] !== 'number' ||\n typeof agg['bytesSent'] !== 'number'\n ) {\n throw new Error('Connector admin API: invalid metrics response shape');\n }\n return body as MetricsResponse;\n }\n\n /**\n * GET /admin/earnings.json — returns the connector's per-peer per-asset\n * earnings projection, mirroring `AdminEarningsJsonResponse` (connector v3.2.0+).\n *\n * Source of truth: @toon-protocol/connector\n * packages/connector/src/http/admin-api.ts:1864-1945\n *\n * Returns HTTP 503 when the connector is started without settlement config\n * (accountManager / claimReceiver not wired). Townhouse's apex always wires\n * both; 503 in production indicates connector misconfiguration.\n *\n * Wire-shape adaptation: the connector's `timestamp: string` field is\n * wrapped into `{ iso: string }` on the way out (EarningsTimestamp).\n *\n * @throws Error when connector is not running, returns non-200, or shape is invalid\n */\n async getEarnings(): Promise<EarningsResponse> {\n const response = await this.fetch('/admin/earnings.json');\n const body: unknown = await response.json();\n if (typeof body !== 'object' || body === null) {\n throw new Error('Connector admin API: invalid earnings response shape');\n }\n const obj = body as Record<string, unknown>;\n if (\n typeof obj['uptimeSeconds'] !== 'number' ||\n !Array.isArray(obj['peers']) ||\n !Array.isArray(obj['connectorFees']) ||\n !Array.isArray(obj['recentClaims']) ||\n typeof obj['timestamp'] !== 'string'\n ) {\n throw new Error('Connector admin API: invalid earnings response shape');\n }\n // Inner-element shape validation — AC #3 drift coverage for named fields\n // (peers[].byAsset[].claimsReceivedTotal, connectorFees[].assetCode, recentClaims[].direction).\n const peers = obj['peers'] as unknown[];\n for (const peer of peers) {\n if (typeof peer !== 'object' || peer === null) {\n throw new Error('Connector admin API: invalid earnings response shape');\n }\n const p = peer as Record<string, unknown>;\n if (typeof p['peerId'] !== 'string' || !Array.isArray(p['byAsset'])) {\n throw new Error('Connector admin API: invalid earnings response shape');\n }\n for (const asset of p['byAsset'] as unknown[]) {\n if (typeof asset !== 'object' || asset === null) {\n throw new Error(\n 'Connector admin API: invalid earnings response shape'\n );\n }\n const a = asset as Record<string, unknown>;\n if (\n typeof a['assetCode'] !== 'string' ||\n typeof a['assetScale'] !== 'number' ||\n typeof a['claimsReceivedTotal'] !== 'string' ||\n typeof a['claimsSentTotal'] !== 'string' ||\n typeof a['netBalance'] !== 'string' ||\n (a['lastClaimAt'] !== null && typeof a['lastClaimAt'] !== 'string')\n ) {\n throw new Error(\n 'Connector admin API: invalid earnings response shape'\n );\n }\n }\n }\n const fees = obj['connectorFees'] as unknown[];\n for (const fee of fees) {\n if (typeof fee !== 'object' || fee === null) {\n throw new Error('Connector admin API: invalid earnings response shape');\n }\n const f = fee as Record<string, unknown>;\n if (\n typeof f['assetCode'] !== 'string' ||\n typeof f['assetScale'] !== 'number' ||\n typeof f['total'] !== 'string'\n ) {\n throw new Error('Connector admin API: invalid earnings response shape');\n }\n }\n const claims = obj['recentClaims'] as unknown[];\n for (const claim of claims) {\n if (typeof claim !== 'object' || claim === null) {\n throw new Error('Connector admin API: invalid earnings response shape');\n }\n const c = claim as Record<string, unknown>;\n if (\n typeof c['peerId'] !== 'string' ||\n typeof c['assetCode'] !== 'string' ||\n typeof c['assetScale'] !== 'number' ||\n typeof c['amount'] !== 'string' ||\n (c['direction'] !== 'inbound' && c['direction'] !== 'outbound') ||\n typeof c['at'] !== 'string'\n ) {\n throw new Error('Connector admin API: invalid earnings response shape');\n }\n }\n const timestamp: EarningsTimestamp = { iso: obj['timestamp'] as string };\n // Explicit construction (not spread) — prevents forward-compat wire fields\n // from leaking through the typed surface.\n return {\n uptimeSeconds: obj['uptimeSeconds'] as number,\n peers: peers as PeerEarnings[],\n connectorFees: fees as ConnectorFeeEntry[],\n recentClaims: claims as RecentClaim[],\n timestamp,\n };\n }\n\n /**\n * GET /admin/peers — returns the connector's peer roster with route counts\n * and ILP addresses. Returns the unwrapped peers array (the wrapper's\n * nodeId / peerCount / connectedCount fields are dropped).\n *\n * @throws Error when connector is not running, returns non-200, or shape is invalid\n */\n async getPeers(): Promise<PeerStatus[]> {\n const response = await this.fetch('/admin/peers');\n const body: unknown = await response.json();\n if (typeof body !== 'object' || body === null) {\n throw new Error('Connector admin API: invalid peers response shape');\n }\n const obj = body as Record<string, unknown>;\n if (!Array.isArray(obj['peers'])) {\n throw new Error('Connector admin API: invalid peers response shape');\n }\n return (body as PeersResponse).peers;\n }\n\n /**\n * GET /admin/channels — returns the connector's payment-channel summaries\n * across all registered chain providers. Multi-chain: one entry per channel\n * regardless of chain.\n *\n * @throws Error when connector is not running, returns non-200, or shape is invalid\n */\n async getChannels(): Promise<ChannelSummary[]> {\n const response = await this.fetch('/admin/channels');\n const body: unknown = await response.json();\n if (!Array.isArray(body)) {\n throw new Error('Connector admin API: invalid channels response shape');\n }\n for (const entry of body) {\n if (typeof entry !== 'object' || entry === null) {\n throw new Error('Connector admin API: invalid channels response shape');\n }\n const e = entry as Record<string, unknown>;\n if (\n typeof e['channelId'] !== 'string' ||\n typeof e['peerId'] !== 'string' ||\n typeof e['chain'] !== 'string' ||\n typeof e['status'] !== 'string' ||\n typeof e['deposit'] !== 'string' ||\n typeof e['lastActivity'] !== 'string'\n ) {\n throw new Error('Connector admin API: invalid channels response shape');\n }\n }\n return body as ChannelSummary[];\n }\n\n /**\n * POST /admin/peers — register (or re-register, idempotent) a child peer\n * with the connector. Used by the boot reconciler (Story 46.1) to\n * re-register peers present in `nodes.yaml` but missing from the\n * connector's runtime peer roster (e.g., after a connector restart).\n *\n * The connector's POST /admin/peers handler treats a POST whose `id`\n * matches an existing peer as a re-registration (no-op for the peer\n * itself; routes are appended). A POST with a new `id` triggers\n * `addPeer()` and BTP connection setup.\n *\n * @param input.id - peer identifier (matches `nodes.yaml`'s `peerId` and\n * the connector's `PeerStatus.id`).\n * @param input.url - BTP WebSocket URL the connector dials. MUST start\n * with `ws://` or `wss://` (the connector validates this).\n * @param input.authToken - shared auth token; pass empty string for\n * internal Townhouse peers (no auth).\n * @param input.routes - optional ILP route prefixes to register against\n * this peer. The reconciler passes the peer's ilpAddress.\n * @param input.transport - optional per-peer transport selection\n * (connector >= 3.6.2). `'direct'` forces the connector to bypass the\n * global SOCKS5 transport for this peer, even when the apex itself\n * runs in `transport.type: socks5` mode. Required for Docker-sibling\n * peers in HS mode — the anon SOCKS5 proxy cannot resolve internal\n * Docker hostnames. When omitted, the peer inherits the connector's\n * global transport (back-compat with pre-3.6.2 connectors).\n *\n * @throws Error on non-2xx response, timeout, or connection refused.\n */\n async registerPeer(input: {\n id: string;\n url: string;\n authToken: string;\n routes?: { prefix: string; priority?: number }[];\n transport?: 'direct' | 'socks5';\n // Peer relation. `'child'` marks an apex-owned downstream node (town relay,\n // mill, dvm): the connector's `requiresSettlementClaim()` returns false for\n // children, so the apex routes to them for FREE (no settlement channel) —\n // children don't pay each other. Forwarded verbatim to POST /admin/peers,\n // which calls setPeerRelation(id, relation). On an existing (inbound-dialed)\n // peer the connector treats this as an update: no re-dial, just the\n // relation + any routes are (re)applied.\n relation?: 'parent' | 'peer' | 'child';\n }): Promise<void> {\n if (!input.url.startsWith('ws://') && !input.url.startsWith('wss://')) {\n throw new Error(\n `Connector admin API: registerPeer.url must start with ws:// or wss:// (got: ${input.url})`\n );\n }\n const url = `${this.baseUrl}/admin/peers`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(input),\n signal: controller.signal,\n });\n } catch (error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(\n `Connector admin API request timeout after ${this.timeoutMs}ms: POST ${url}`\n );\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Connector admin API request failed: POST ${url} — ${msg}`\n );\n }\n if (!response.ok) {\n // Body read MUST happen inside the AbortSignal-protected try so a slow\n // response body cannot hang past the request timeout.\n let body = '';\n try {\n body = await response.text();\n } catch (error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(\n `Connector admin API request timeout after ${this.timeoutMs}ms: POST ${url} (body read)`\n );\n }\n /* best-effort: leave body empty */\n }\n throw new Error(\n `Connector admin API error: POST /admin/peers returned ${response.status} ${response.statusText}${body ? ` — ${body}` : ''}`\n );\n }\n } finally {\n clearTimeout(timer);\n }\n }\n\n /**\n * DELETE /admin/peers/:peerId?removeRoutes=true — deregister a child peer.\n *\n * Idempotent: a 404 from the connector (peer already removed) is treated as\n * success so callers can safely use this as a rollback step without knowing\n * whether the peer was ever registered.\n *\n * `removeRoutes=true` is always sent so the connector drops the ILP routing\n * entries for this peer along with the BTP connection config.\n *\n * @throws Error on empty peerId (rejected at client, no network request made)\n * @throws Error on non-2xx/404 response, timeout, or connection refused\n */\n async removePeer(peerId: string): Promise<void> {\n if (!peerId) {\n throw new Error(\n 'Connector admin API: removePeer requires a non-empty peerId'\n );\n }\n const url = `${this.baseUrl}/admin/peers/${encodeURIComponent(peerId)}?removeRoutes=true`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'DELETE',\n signal: controller.signal,\n });\n } catch (error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(\n `Connector admin API request timeout after ${this.timeoutMs}ms: DELETE ${url}`\n );\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Connector admin API request failed: DELETE ${url} — ${msg}`\n );\n }\n // 404 means peer already gone — idempotent success.\n if (response.status === 404) {\n return;\n }\n if (!response.ok) {\n let body = '';\n try {\n body = await response.text();\n } catch (error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(\n `Connector admin API request timeout after ${this.timeoutMs}ms: DELETE ${url} (body read)`\n );\n }\n /* best-effort: leave body empty */\n }\n throw new Error(\n `Connector admin API error: DELETE /admin/peers/${peerId} returned ${response.status} ${response.statusText}${body ? ` — ${body}` : ''}`\n );\n }\n } finally {\n clearTimeout(timer);\n }\n }\n\n /**\n * GET /packets — returns the connector's raw packet log filtered by the\n * given criteria. Used by the timeseries aggregation route (story 21.10).\n *\n * Townhouse-Side Contract: see packages/sdk/CONNECTOR_MIGRATION.md §getPacketLog.\n * If the connector image does not expose GET /packets, this method throws\n * with a `ConnectorEndpointNotFound` error code so the route can return 503.\n *\n * @throws Error with code='ConnectorEndpointNotFound' when connector returns 404\n * @throws Error when connector is not running, returns non-200, or shape is invalid\n */\n async getPacketLog(filter: PacketLogFilter = {}): Promise<PacketLogEntry[]> {\n const params = new URLSearchParams();\n if (filter.ilpAddress !== undefined)\n params.set('ilpAddress', filter.ilpAddress);\n if (filter.since !== undefined) params.set('since', String(filter.since));\n if (filter.limit !== undefined) params.set('limit', String(filter.limit));\n const path = params.toString()\n ? `/packets?${params.toString()}`\n : '/packets';\n\n let response: Response;\n try {\n response = await this.fetch(path);\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes('404')) {\n const err = new Error(\n 'Connector does not expose GET /packets — endpoint not found'\n );\n (err as NodeJS.ErrnoException).code = 'ConnectorEndpointNotFound';\n throw err;\n }\n throw error;\n }\n\n const body: unknown = await response.json();\n if (!Array.isArray(body)) {\n throw new Error(\n 'Connector admin API: invalid packet log response shape — expected array'\n );\n }\n return body as PacketLogResponse;\n }\n\n // ── Private helpers ──\n\n /**\n * Perform an HTTP GET request to the connector admin API.\n * Wraps fetch with error handling for connection refused and non-200 responses.\n */\n private async fetch(path: string): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n let response: Response;\n try {\n response = await fetch(url, { signal: controller.signal });\n } catch (error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(\n `Connector admin API request timeout after ${this.timeoutMs}ms: ${url}`\n );\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new Error(`Connector admin API connection refused: ${msg}`);\n }\n\n if (!response.ok) {\n throw new Error(\n `Connector admin API error: ${response.status} ${response.statusText}`\n );\n }\n\n return response;\n } finally {\n clearTimeout(timer);\n }\n }\n}\n","/**\n * Docker Orchestration Engine for Townhouse (Story 21.2).\n *\n * Manages the full container lifecycle: network creation, image pulling,\n * container creation/start/stop/removal, and health check polling.\n * Uses dockerode for programmatic Docker control with DI for testability.\n */\n\nimport { EventEmitter } from 'node:events';\nimport { spawn } from 'node:child_process';\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, isAbsolute, join } from 'node:path';\nimport type Docker from 'dockerode';\nimport type { TownhouseConfig } from '../config/schema.js';\nimport { ConnectorConfigGenerator } from '../connector/config-generator.js';\nimport { ConnectorAdminClient } from '../connector/admin-client.js';\nimport type { ComposeProfile } from '../compose-loader.js';\nimport {\n CONTAINER_PREFIX,\n TOWN_HEALTH_PORT,\n MILL_HEALTH_PORT,\n DVM_HEALTH_PORT,\n} from '../constants.js';\nimport type { NodeType, HealthCheckOptions, BandwidthStats } from './types.js';\nimport type { WalletManager } from '../wallet/index.js';\n\ninterface RunDockerOptions {\n timeout?: number;\n maxBuffer?: number;\n inheritStdio?: boolean;\n /** Override the subprocess env. Defaults to process.env when omitted. */\n env?: NodeJS.ProcessEnv;\n}\n\n/**\n * Run `docker <args>` as a child process and resolve with captured stderr/stdout.\n *\n * `inheritStdio: true` pipes the child's stdout straight to the parent's TTY so\n * the operator sees `docker pull` progress during a multi-minute first-time\n * pull (Story 45.3 AC #10). Stderr is always captured so we can surface\n * compose failure diagnostics through the `containerState` event channel.\n */\nfunction runDockerCompose(\n file: string,\n args: readonly string[],\n options: RunDockerOptions = {}\n): Promise<{ stdout: string; stderr: string }> {\n const {\n timeout,\n maxBuffer = 16 * 1024 * 1024,\n inheritStdio = false,\n env,\n } = options;\n return new Promise((resolve, reject) => {\n const child = spawn(file, Array.from(args), {\n stdio: inheritStdio\n ? ['ignore', 'inherit', 'pipe']\n : ['ignore', 'pipe', 'pipe'],\n ...(env !== undefined ? { env } : {}),\n });\n const stderrChunks: Buffer[] = [];\n const stdoutChunks: Buffer[] = [];\n let stderrLen = 0;\n let stdoutLen = 0;\n let timedOut = false;\n const timer =\n timeout !== undefined && timeout > 0\n ? setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n // Force-kill if SIGTERM is ignored (5 s grace).\n setTimeout(() => {\n if (!child.killed) child.kill('SIGKILL');\n }, 5_000).unref();\n }, timeout)\n : null;\n child.stderr?.on('data', (chunk: Buffer) => {\n if (stderrLen < maxBuffer) {\n stderrChunks.push(chunk);\n stderrLen += chunk.length;\n }\n });\n // Capture stdout when piped (inheritStdio: false). When stdio inherits to\n // the parent TTY, child.stdout is null and we leave stdoutChunks empty —\n // the operator sees the output directly.\n child.stdout?.on('data', (chunk: Buffer) => {\n if (stdoutLen < maxBuffer) {\n stdoutChunks.push(chunk);\n stdoutLen += chunk.length;\n }\n });\n child.on('error', (err: NodeJS.ErrnoException) => {\n if (timer) clearTimeout(timer);\n reject(err);\n });\n child.on('close', (code, signal) => {\n if (timer) clearTimeout(timer);\n const stderr = Buffer.concat(stderrChunks).toString('utf8');\n const stdout = Buffer.concat(stdoutChunks).toString('utf8');\n if (timedOut) {\n const err = new Error(\n `docker subprocess timed out after ${timeout}ms`\n ) as Error & {\n stdout?: string;\n stderr?: string;\n code?: number | string;\n signal?: NodeJS.Signals | null;\n };\n err.stdout = stdout;\n err.stderr = stderr;\n err.code = 'ETIMEDOUT';\n err.signal = signal;\n return reject(err);\n }\n if (code === 0) {\n return resolve({ stdout, stderr });\n }\n const err = new Error(\n `docker subprocess exited with ${code !== null ? `code ${code}` : `signal ${signal}`}`\n ) as Error & {\n stdout?: string;\n stderr?: string;\n code?: number | string;\n signal?: NodeJS.Signals | null;\n };\n err.stdout = stdout;\n err.stderr = stderr;\n if (code !== null) err.code = code;\n if (signal !== null) err.signal = signal;\n reject(err);\n });\n });\n}\n\ntype ExecFileAsyncSignature = (\n file: string,\n args: readonly string[],\n options?: RunDockerOptions\n) => Promise<{ stdout: string; stderr: string }>;\n\n/** Nostr relay WebSocket port on Town containers (fixed by Dockerfile) */\nconst TOWN_RELAY_PORT = 7100;\n\n/** Container stats cache TTL in milliseconds */\nconst STATS_CACHE_TTL_MS = 5_000;\n\ninterface CachedStats {\n data: BandwidthStats | null;\n cachedAt: number;\n}\n\n/** Docker bridge network name */\nconst NETWORK_NAME = 'townhouse-net';\n\n/** Default images for node types (used when not overridden in config) */\nconst DEFAULT_NODE_IMAGES: Record<NodeType, string> = {\n town: 'toon:town',\n mill: 'toon:mill',\n dvm: 'toon:dvm',\n};\n\n/** Maximum number of start retries per container */\nconst MAX_START_RETRIES = 3;\n\n/** Internal connector port (Docker-internal, not exposed to host) */\nconst CONNECTOR_INTERNAL_PORT = 3000;\n\n/** Default ator sidecar image tag for relay hidden service publication. */\nconst RELAY_ATOR_SIDECAR_IMAGE = 'toon:townhouse-ator-sidecar';\n\n/**\n * SOCKS port for the relay-side ator sidecar. Distinct from the connector\n * HS sidecar's 9050 so the two can coexist on the same Docker network if\n * both transports are enabled.\n */\nconst RELAY_ATOR_SOCKS_PORT = 9051;\n\n/**\n * Error thrown by DockerOrchestrator HS-path failures (Story 45.3).\n * Carries the failed-service name + subprocess diagnostics so CLI consumers\n * (Story 45.4) can render Sally's failure-state copy library (UX-DR5).\n */\nexport class OrchestratorError extends Error {\n readonly service?: string;\n readonly exitCode?: number;\n readonly stderr?: string;\n constructor(\n message: string,\n options: {\n service?: string;\n exitCode?: number;\n stderr?: string;\n cause?: Error;\n } = {}\n ) {\n super(message, options.cause ? { cause: options.cause } : undefined);\n this.name = 'OrchestratorError';\n if (options.service !== undefined) this.service = options.service;\n if (options.exitCode !== undefined) this.exitCode = options.exitCode;\n if (options.stderr !== undefined) this.stderr = options.stderr;\n }\n}\n\n/**\n * Strip secret-name env assignments from compose stderr before it becomes\n * part of an error message (Story 46.2 P5). Compose stderr can echo env\n * interpolation, including injected secrets. Conservative: keep the KEY so\n * operators see which secret was involved; redact only the VALUE up to the\n * next whitespace, quote, or newline.\n */\nfunction redactSecretsInComposeStderr(stderr: string): string {\n const SECRET_KEYS = [\n 'TOWN_SECRET_KEY',\n 'MILL_SECRET_KEY',\n 'DVM_SECRET_KEY',\n 'TOWN_SETTLEMENT_PRIVATE_KEY',\n 'MILL_SETTLEMENT_PRIVATE_KEY',\n 'DVM_SETTLEMENT_PRIVATE_KEY',\n 'MILL_MNEMONIC',\n 'TOWNHOUSE_WALLET_PASSWORD',\n ];\n const pattern = new RegExp(`(${SECRET_KEYS.join('|')})=[^\\\\s\"'\\\\n\\\\r]+`, 'g');\n return stderr.replace(pattern, '$1=[REDACTED]');\n}\n\n/**\n * Normalize a Docker image reference to include an explicit tag.\n * Docker defaults to `:latest` when no tag is specified, but\n * `listImages()` RepoTags always include the explicit tag.\n * Without normalization, an untagged image like `nginx` would not\n * match `nginx:latest` in the local image cache check.\n */\nfunction normalizeImageTag(image: string): string {\n // If there's already a tag (contains ':' after the last '/'), return as-is.\n // Handle registry prefixes like ghcr.io/org/image:tag\n const lastSlash = image.lastIndexOf('/');\n const nameAndTag = lastSlash >= 0 ? image.slice(lastSlash + 1) : image;\n if (nameAndTag.includes(':')) {\n return image;\n }\n return `${image}:latest`;\n}\n\n/**\n * DockerOrchestrator manages the lifecycle of Townhouse containers.\n *\n * Constructor accepts a dockerode instance (DI for testability) and config.\n * Emits typed events defined in OrchestratorEvents: pullProgress,\n * containerState, and healthCheck.\n */\nexport class DockerOrchestrator extends EventEmitter {\n private readonly docker: Docker;\n private readonly config: TownhouseConfig;\n private readonly configGenerator: ConnectorConfigGenerator;\n private readonly walletManager: WalletManager | undefined;\n private activeNodes: NodeType[] = [];\n private readonly statsCache = new Map<string, CachedStats>();\n private readonly profile: ComposeProfile;\n private readonly composePath: string | undefined;\n private readonly execFileAsync: ExecFileAsyncSignature;\n private readonly adminClientFactory: (\n baseUrl: string,\n timeoutMs: number\n ) => ConnectorAdminClient;\n\n constructor(\n docker: Docker,\n config: TownhouseConfig,\n walletManager?: WalletManager,\n options: {\n profile?: ComposeProfile;\n composePath?: string;\n execFileAsync?: ExecFileAsyncSignature;\n adminClientFactory?: (\n baseUrl: string,\n timeoutMs: number\n ) => ConnectorAdminClient;\n } = {}\n ) {\n super();\n this.docker = docker;\n this.config = config;\n this.configGenerator = new ConnectorConfigGenerator(config);\n this.walletManager = walletManager;\n this.profile = options.profile ?? 'dev';\n // Trim composePath so a whitespace-only string trips the same validation\n // as undefined / empty string (otherwise ` ` would slip past the falsy\n // check below and be passed verbatim to docker).\n const trimmedComposePath = options.composePath?.trim();\n this.composePath =\n trimmedComposePath !== undefined && trimmedComposePath.length > 0\n ? trimmedComposePath\n : undefined;\n this.execFileAsync = options.execFileAsync ?? runDockerCompose;\n this.adminClientFactory =\n options.adminClientFactory ??\n ((url, t) => new ConnectorAdminClient(url, t));\n\n if (this.profile === 'hs' && !this.composePath) {\n throw new OrchestratorError(\n `profile: 'hs' requires a non-empty composePath. Pass options.composePath ` +\n `pointing at the rendered HS template (typically the composePath ` +\n `returned by materializeComposeTemplate('hs')).`\n );\n }\n }\n\n /**\n * Orchestrate full startup sequence. Branches on profile:\n * - 'dev' (default): dockerode-based, preserves existing dev-stack behavior\n * - 'hs': docker compose subprocess + HS hostname readiness gate\n */\n async up(profiles: NodeType[]): Promise<void> {\n if (this.profile === 'hs') {\n await this.upHs(profiles);\n // defer activeNodes mutation until after upHs succeeds so a\n // failed/timed-out upHs does not leave phantom state.\n this.activeNodes = [...profiles];\n } else {\n this.activeNodes = [...profiles];\n await this.upDev(profiles);\n }\n }\n\n private async upDev(profiles: NodeType[]): Promise<void> {\n await this.ensureNetwork();\n await this.pullImages(profiles);\n await this.startConnector();\n await this.waitForHealth('townhouse-connector');\n\n // Start all node containers in parallel\n await Promise.all(profiles.map((type) => this.startNode(type)));\n\n // Optional: bring up the relay-side ator sidecar after town is started.\n // It forwards inbound HS traffic to the town container's relay WS port,\n // so it must be created after the town container exists in DNS.\n if (profiles.includes('town') && this.config.transport.relayHiddenService) {\n await this.startRelayAtorSidecar();\n }\n }\n\n /**\n * Narrow `this.composePath` to a definite string. The constructor enforces\n * this invariant for `profile: 'hs'`; this helper exists so the HS-path\n * methods don't need a non-null assertion (lint-clean) and so a constructor\n * regression surfaces as an `OrchestratorError` rather than a `TypeError`.\n */\n private requireComposePath(): string {\n if (!this.composePath) {\n throw new OrchestratorError(\n `internal: composePath unset for HS profile (constructor invariant violated)`\n );\n }\n return this.composePath;\n }\n\n /**\n * validate that composePath is absolute and exists on disk before\n * passing it to any subprocess call. Defence-in-depth — callers pass paths\n * from materializeComposeTemplate so this should never fire in normal use.\n */\n private validateComposePath(composePath: string): void {\n if (!isAbsolute(composePath)) {\n throw new OrchestratorError(\n `composePath must be an absolute path, got: ${composePath}`\n );\n }\n if (!existsSync(composePath)) {\n throw new OrchestratorError(\n `composePath does not exist on disk: ${composePath}`\n );\n }\n }\n\n /** HS-mode startup: shell out to `docker compose up -d`, wait for HS hostname. */\n private async upHs(profiles: NodeType[]): Promise<void> {\n const composePath = this.requireComposePath();\n this.validateComposePath(composePath);\n // Profile flags MUST come BEFORE the subcommand per Docker Compose CLI grammar.\n // Deterministic order: town → mill → dvm (matches AC #4).\n const PROFILE_ORDER: NodeType[] = ['town', 'mill', 'dvm'];\n // Reject unknown profile types up-front rather than silently dropping them\n // (they would otherwise fail the `PROFILE_ORDER.includes()` check below\n // and start no containers).\n for (const p of profiles) {\n if (!PROFILE_ORDER.includes(p)) {\n throw new OrchestratorError(\n `Unknown profile '${String(p)}'. Expected one of: ${PROFILE_ORDER.join(', ')}.`\n );\n }\n }\n const args = ['compose', '-f', composePath];\n for (const type of PROFILE_ORDER) {\n if (profiles.includes(type)) {\n args.push('--profile', type);\n }\n }\n args.push('up', '-d');\n\n try {\n await this.execFileAsync('docker', args, {\n timeout: 180_000,\n maxBuffer: 16 * 1024 * 1024,\n inheritStdio: true,\n });\n } catch (err: unknown) {\n const e = err as NodeJS.ErrnoException & {\n stderr?: string;\n stdout?: string;\n code?: number | string;\n signal?: string | null;\n };\n const stderr = String(e.stderr ?? '');\n const numericExit = typeof e.code === 'number' ? e.code : undefined;\n const codeLabel = String(e.code ?? e.signal ?? 'unknown');\n let message: string;\n if (e.code === 'ENOENT') {\n message = `docker CLI not found on PATH (ENOENT): ${stderr.trim().slice(0, 2000)}`;\n } else if (e.code === 'ETIMEDOUT') {\n message = `docker compose up timed out after 180000ms: ${stderr.trim().slice(0, 2000)}`;\n } else {\n message = `docker compose up failed (exit ${codeLabel}): ${stderr.trim().slice(0, 2000)}`;\n }\n this.surfaceComposeFailure(stderr);\n throw new OrchestratorError(message, {\n ...(numericExit !== undefined ? { exitCode: numericExit } : {}),\n stderr,\n cause: err instanceof Error ? err : undefined,\n });\n }\n\n // roll back containers when waitForHsHostname times out or throws,\n // so the operator can retry without a manual `townhouse hs down`.\n try {\n await this.waitForHsHostname();\n } catch (err: unknown) {\n await this.downHs().catch(() => {\n // Best-effort rollback — ignore teardown errors so the original error\n // propagates to the caller unchanged.\n });\n throw err;\n }\n }\n\n /**\n * Parse Docker Compose stderr for failed-service names and emit a\n * containerState event per failed service so callers see the failure via\n * the same channel dev-mode uses (AC #6 — \"for each failed service\n * identified, it emits...\"). When no pattern matches, emit a single\n * fallback event with name `'compose-up'`.\n */\n private surfaceComposeFailure(stderr: string): void {\n // Patterns 1 + 2 capture the SERVICE name from quoted Compose v2 stderr\n // (e.g., `failed to start \"townhouse-api\"`).\n // Pattern 3 was hardcoded to `townhouse-hs-` which would miss\n // Epic 46 containers (town-*, mill-*, dvm-*). The generic Compose container\n // name format is `<project>-<service>-<N>`. Capture the service name by\n // matching `Container <word>-<service>-<N> Error` without a fixed prefix.\n const patterns = [\n /failed to start (?:service\\s+)?[\"']([^\"']+)[\"']/gi,\n /service\\s+[\"']([^\"']+)[\"']\\s+failed/gi,\n /Container\\s+[\\w-]+-([a-z][\\w-]*?)(?:-\\d+)?\\s+Error/gi,\n ];\n const detail = stderr.trim().slice(0, 2000);\n const seen = new Set<string>();\n for (const pattern of patterns) {\n for (const match of stderr.matchAll(pattern)) {\n const name = match[1];\n if (name && !seen.has(name)) {\n seen.add(name);\n this.emit('containerState', { name, state: 'error', detail });\n }\n }\n }\n if (seen.size === 0) {\n this.emit('containerState', {\n name: 'compose-up',\n state: 'error',\n detail,\n });\n }\n }\n\n private async waitForHsHostname(): Promise<void> {\n const adminUrl = `http://127.0.0.1:${this.config.connector.adminPort}`;\n const client = this.adminClientFactory(adminUrl, 5_000);\n // use process.hrtime.bigint() (monotonic) instead of Date.now() so\n // laptop suspend/resume cannot jump the clock backward and extend the timeout\n // indefinitely. 120_000ms → 120_000_000_000n nanoseconds.\n const deadlineNs = process.hrtime.bigint() + 120_000_000_000n;\n const pollInterval = 2_000;\n let lastResponse:\n | { hostname: string | null; publishedAt: string | null }\n | undefined;\n let lastError: Error | undefined;\n while (process.hrtime.bigint() < deadlineNs) {\n try {\n lastResponse = await client.getHsHostname();\n lastError = undefined;\n if (\n lastResponse.hostname !== null &&\n lastResponse.publishedAt !== null\n ) {\n return;\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n lastError = err instanceof Error ? err : new Error(String(err));\n // 503 anon-disabled is fatal — do NOT keep polling.\n if (msg.includes('anon-disabled')) {\n throw new OrchestratorError(\n `connector is anon-disabled — set anon.enabled: true in the connector config`,\n { cause: err instanceof Error ? err : undefined }\n );\n }\n // Connector returned 200 with malformed body (or non-JSON) — fatal.\n // Retrying for 120 s would mask a real connector regression behind a\n // generic timeout. Surface the shape error immediately.\n if (\n msg.includes('invalid hs-hostname response shape') ||\n msg.includes('invalid JSON in hs-hostname response')\n ) {\n throw new OrchestratorError(\n `connector returned a malformed /admin/hs-hostname response: ${msg}`,\n { cause: err instanceof Error ? err : undefined }\n );\n }\n // fast-fail on unexpected status codes (e.g. 404 from a pre-v3.5.0\n // connector image). The admin-client throws with 'unexpected status' in the\n // message; retrying these would burn the full 120 s budget silently.\n if (msg.includes('unexpected status')) {\n throw new OrchestratorError(msg, {\n cause: err instanceof Error ? err : undefined,\n });\n }\n // Network errors (ECONNREFUSED, request timeout, etc.) — retry within\n // budget. lastError preserves the most recent diagnostic for the\n // timeout message below.\n }\n await new Promise((r) => setTimeout(r, pollInterval));\n }\n // Build a timeout message that prefers the most recent observation. If the\n // last poll *failed* (e.g., connector died mid-bootstrap), report that —\n // not a stale earlier success — so the operator sees connection death\n // instead of \"anon bootstrap is still in progress\" misdiagnosis.\n const tail = lastError\n ? ` (last error: ${lastError.message})`\n : lastResponse\n ? ` (last response: ${JSON.stringify(lastResponse)})`\n : ' (no successful response received)';\n throw new OrchestratorError(\n `HS hostname publication timeout after 120000ms` + tail,\n lastError ? { cause: lastError } : {}\n );\n }\n\n /**\n * Regenerate connector config and restart the connector container\n * with updated environment variables (peer list).\n *\n * Sequence: emit connectorRestarting -> stop -> remove -> create -> start -> health -> emit connectorRestarted\n */\n async regenerateConnectorConfig(activeNodes: NodeType[]): Promise<void> {\n this.activeNodes = [...activeNodes];\n\n this.emit('connectorRestarting', { reason: 'peer list updated' });\n\n // Stop and remove existing connector.\n // Use separate try-catch blocks so a failed stop() (e.g. container in\n // Created/exited state) still allows remove() to run and clear the name.\n const connectorName = `${CONTAINER_PREFIX}connector`;\n const existingContainer = this.docker.getContainer(connectorName);\n try {\n await existingContainer.stop({ t: 5 });\n } catch {\n /* not running */\n }\n try {\n await existingContainer.remove();\n } catch {\n /* may not exist */\n }\n\n // Ensure the network exists — regenerate can be called independently of\n // up() (e.g. fee change), so we cannot assume ensureNetwork() already ran.\n await this.ensureNetwork();\n\n // Start new connector with updated config. Always emit connectorRestarted in\n // a finally block so WS clients clear the restarting state even when the\n // connector fails to start (prevents isRestarting stuck indefinitely in UI).\n try {\n await this.startConnector();\n await this.waitForHealth(connectorName);\n } finally {\n this.emit('connectorRestarted', { peers: activeNodes });\n }\n }\n\n /**\n * Hot-add a node after initial startup.\n * Starts the node container, then restarts the connector with updated peer list.\n */\n async addNode(type: NodeType): Promise<void> {\n if (!this.activeNodes.includes(type)) {\n this.activeNodes.push(type);\n }\n\n await this.startNode(type);\n await this.regenerateConnectorConfig(this.activeNodes);\n }\n\n /**\n * Hot-remove a node.\n * Stops the node container, then restarts the connector with updated peer list.\n */\n async removeNode(type: NodeType): Promise<void> {\n this.activeNodes = this.activeNodes.filter((n) => n !== type);\n\n const containerName = `${CONTAINER_PREFIX}${type}`;\n await this.stopAndRemove(containerName);\n await this.regenerateConnectorConfig(this.activeNodes);\n }\n\n /**\n * Graceful shutdown. Branches on profile:\n * - 'dev' (default): dockerode-based teardown\n * - 'hs': docker compose subprocess\n */\n async down(): Promise<void> {\n if (this.profile === 'hs') {\n await this.downHs();\n } else {\n await this.downDev();\n }\n }\n\n private async downDev(): Promise<void> {\n const containers = await this.docker.listContainers({ all: true });\n\n // Find all townhouse containers\n const nodeContainerNames: string[] = [];\n let connectorName: string | undefined;\n\n for (const info of containers) {\n for (const name of info.Names) {\n const cleanName = name.startsWith('/') ? name.slice(1) : name;\n if (!cleanName.startsWith(CONTAINER_PREFIX)) continue;\n\n if (cleanName === `${CONTAINER_PREFIX}connector`) {\n connectorName = cleanName;\n } else {\n nodeContainerNames.push(cleanName);\n }\n }\n }\n\n // Stop nodes first (parallel)\n await Promise.all(\n nodeContainerNames.map((name) => this.stopAndRemove(name))\n );\n\n // Then stop connector\n if (connectorName) {\n await this.stopAndRemove(connectorName);\n }\n\n // Remove network\n await this.removeNetwork();\n }\n\n private async downHs(): Promise<void> {\n const composePath = this.requireComposePath();\n const args = ['compose', '-f', composePath, 'down'];\n // NO -v flag — preserves the townhouse-hs-anon volume so the .anyone\n // address survives `down` (Story 45.4 AC).\n try {\n // 120s timeout (up from 60s) to accommodate Epic 46 multi-container\n // stacks where town+mill+dvm each need a SIGTERM grace period.\n await this.execFileAsync('docker', args, {\n timeout: 120_000,\n maxBuffer: 16 * 1024 * 1024,\n });\n } catch (err: unknown) {\n const e = err as NodeJS.ErrnoException & {\n stderr?: string;\n code?: number | string;\n signal?: string | null;\n };\n const stderr = String(e.stderr ?? '');\n const numericExit = typeof e.code === 'number' ? e.code : undefined;\n const codeLabel = String(e.code ?? e.signal ?? 'unknown');\n let message: string;\n if (e.code === 'ENOENT') {\n message = `docker CLI not found on PATH (ENOENT): ${stderr.trim().slice(0, 2000)}`;\n } else if (e.code === 'ETIMEDOUT') {\n message = `docker compose down timed out after 120000ms: ${stderr.trim().slice(0, 2000)}`;\n } else {\n // Compose down returns non-zero when nothing is running on some\n // Compose versions. Treat an empty-stack teardown (no containers / no\n // such service) as success so `townhouse hs down` is idempotent.\n if (\n stderr.includes('no such service') ||\n stderr.includes('no containers to remove') ||\n stderr.includes('No such container') ||\n (stderr.includes('network') && stderr.includes('not found'))\n ) {\n return;\n }\n message = `docker compose down failed (exit ${codeLabel}): ${stderr.trim().slice(0, 2000)}`;\n }\n throw new OrchestratorError(message, {\n ...(numericExit !== undefined ? { exitCode: numericExit } : {}),\n stderr,\n cause: err instanceof Error ? err : undefined,\n });\n }\n }\n\n /**\n * Resolve the Nostr relay WebSocket URL for a Town node instance.\n *\n * Inspects the container's port bindings to get the host-bound port for\n * the relay WebSocket (7100/tcp). Falls back to the Docker-internal URL\n * when the server is running inside the Docker network or bindings are absent.\n *\n * @param nodeId - The `NodeInfo.id` value (e.g. 'town', 'dev-town-01')\n */\n async getNodeRelayEndpoint(nodeId: string): Promise<string> {\n const containerName = `${CONTAINER_PREFIX}${nodeId}`;\n try {\n const container = this.docker.getContainer(containerName);\n const info = await container.inspect();\n const portBindings = info.HostConfig?.PortBindings as\n | Record<string, { HostIp?: string; HostPort?: string }[] | null>\n | undefined;\n const binding = portBindings?.[`${TOWN_RELAY_PORT}/tcp`]?.[0];\n if (binding?.HostPort) {\n const host =\n binding.HostIp && binding.HostIp !== '0.0.0.0'\n ? binding.HostIp\n : '127.0.0.1';\n // nosemgrep: javascript.lang.security.detect-insecure-websocket -- operator-controlled host, not user input\n return `ws://${host}:${binding.HostPort}`;\n }\n } catch {\n // Container not found or inspect failed — fall through to Docker-internal fallback\n }\n // Docker-internal fallback (server running inside Docker network)\n // nosemgrep: javascript.lang.security.detect-insecure-websocket -- Docker-internal, TLS unnecessary\n return `ws://${containerName}:${TOWN_RELAY_PORT}`;\n }\n\n /**\n * Resolve the BLS health HTTP URL for a node instance.\n *\n * Inspects the container's port bindings to find the host-bound port for the\n * node's health endpoint. Falls back to Docker-internal URL when running\n * inside the Docker network or when bindings are absent.\n *\n * @param nodeId - The `NodeInfo.id` value (e.g. 'mill', 'dev-mill-01')\n * @param type - Node type (determines which internal port to use)\n */\n async getNodeHealthEndpoint(\n nodeId: string,\n type: 'town' | 'mill' | 'dvm'\n ): Promise<string> {\n const port =\n type === 'town'\n ? TOWN_HEALTH_PORT\n : type === 'mill'\n ? MILL_HEALTH_PORT\n : DVM_HEALTH_PORT;\n const containerName = `${CONTAINER_PREFIX}${nodeId}`;\n try {\n const container = this.docker.getContainer(containerName);\n const info = await container.inspect();\n const portBindings = info.HostConfig?.PortBindings as\n | Record<string, { HostIp?: string; HostPort?: string }[] | null>\n | undefined;\n const binding = portBindings?.[`${port}/tcp`]?.[0];\n if (binding?.HostPort) {\n const host =\n binding.HostIp && binding.HostIp !== '0.0.0.0'\n ? binding.HostIp\n : '127.0.0.1';\n return `http://${host}:${binding.HostPort}`;\n }\n } catch {\n // Container not found or inspect failed — fall through to Docker-internal fallback\n }\n return `http://${containerName}:${port}`;\n }\n\n /**\n * Fetch network I/O stats for a container.\n * Results are cached for 5 seconds to avoid per-request Docker API overhead.\n *\n * @param containerName - Full container name (e.g. 'townhouse-town')\n * @returns Bandwidth stats or null when container is not running\n */\n async getContainerStats(\n containerName: string\n ): Promise<BandwidthStats | null> {\n const cached = this.statsCache.get(containerName);\n if (cached && Date.now() - cached.cachedAt < STATS_CACHE_TTL_MS) {\n return cached.data;\n }\n\n try {\n const container = this.docker.getContainer(containerName);\n const stats = (await container.stats({\n stream: false,\n })) as unknown as Record<string, unknown>;\n\n const networks = stats['networks'] as\n | Record<string, { rx_bytes?: number; tx_bytes?: number }>\n | undefined;\n\n if (!networks) {\n const result: BandwidthStats = {\n bytesIn: 0,\n bytesOut: 0,\n sampleAt: Date.now(),\n };\n this.statsCache.set(containerName, {\n data: result,\n cachedAt: Date.now(),\n });\n return result;\n }\n\n let bytesIn = 0;\n let bytesOut = 0;\n for (const iface of Object.values(networks)) {\n bytesIn += iface.rx_bytes ?? 0;\n bytesOut += iface.tx_bytes ?? 0;\n }\n\n const result: BandwidthStats = {\n bytesIn,\n bytesOut,\n sampleAt: Date.now(),\n };\n this.statsCache.set(containerName, {\n data: result,\n cachedAt: Date.now(),\n });\n return result;\n } catch {\n // Container not running or stats unavailable\n this.statsCache.set(containerName, { data: null, cachedAt: Date.now() });\n return null;\n }\n }\n\n /**\n * Return status for all townhouse containers.\n *\n * Discovers both single-instance (townhouse-<type>) and multi-instance\n * (townhouse-<prefix>-<type>-<n>) containers. Multi-instance containers\n * are returned with a `name` matching their instance suffix so callers\n * can build per-instance NodeInfo entries (e.g. \"dev-town-01\").\n */\n async status(): Promise<\n {\n name: string;\n type: 'connector' | 'town' | 'mill' | 'dvm';\n state: string;\n health?: string;\n startedAt?: string;\n }[]\n > {\n const containers = await this.docker.listContainers({ all: true });\n const nodeTypes = ['town', 'mill', 'dvm'] as const;\n const allTypes = ['connector', ...nodeTypes] as const;\n\n // Collect all containers that belong to this townhouse instance\n const matching: {\n containerName: string;\n type: (typeof allTypes)[number];\n info: (typeof containers)[number];\n }[] = [];\n\n for (const c of containers) {\n for (const rawName of c.Names) {\n const name = rawName.startsWith('/') ? rawName.slice(1) : rawName;\n if (!name.startsWith(CONTAINER_PREFIX)) continue;\n const suffix = name.slice(CONTAINER_PREFIX.length); // e.g. \"town\", \"dev-town-01\"\n for (const type of allTypes) {\n if (\n suffix === type ||\n suffix.endsWith(`-${type}`) ||\n suffix.includes(`-${type}-`)\n ) {\n matching.push({ containerName: name, type, info: c });\n break;\n }\n }\n }\n }\n\n const results: {\n name: string;\n type: (typeof allTypes)[number];\n state: string;\n health?: string;\n startedAt?: string;\n }[] = [];\n\n for (const { containerName, type, info } of matching) {\n const suffix = containerName.slice(CONTAINER_PREFIX.length); // e.g. \"town\", \"dev-town-01\"\n let health: string | undefined;\n let startedAt: string | undefined;\n try {\n const container = this.docker.getContainer(containerName);\n const detail = await container.inspect();\n health = detail.State?.Health?.Status ?? undefined;\n startedAt = detail.State?.StartedAt ?? undefined;\n } catch {\n // Inspect may fail if container is being removed — skip health and startedAt\n }\n results.push({\n name: suffix, // \"town\" for single-instance, \"dev-town-01\" for multi\n type,\n state: info.State ?? 'stopped',\n ...(health !== undefined ? { health } : {}),\n ...(startedAt !== undefined ? { startedAt } : {}),\n });\n }\n\n // Ensure every type has at least one entry (stopped placeholder)\n for (const type of allTypes) {\n if (!results.some((r) => r.type === type)) {\n results.push({ name: type, type, state: 'stopped' });\n }\n }\n\n return results;\n }\n\n /**\n * Pull required images before starting containers.\n * Skips images that already exist locally.\n * Emits pullProgress events during download.\n */\n async pullImages(profiles: NodeType[]): Promise<void> {\n const imagesToPull = new Set<string>();\n\n // Always need the connector image\n imagesToPull.add(normalizeImageTag(this.config.connector.image));\n\n // Add node images\n for (const type of profiles) {\n const nodeConfig = this.config.nodes[type];\n const image = nodeConfig.image ?? DEFAULT_NODE_IMAGES[type];\n imagesToPull.add(normalizeImageTag(image));\n }\n\n // Pull the relay ator sidecar when the operator opted in. Built locally\n // by docker/townhouse-ator-sidecar — pull may 404, which is fine; the\n // operator must have built it before `townhouse up` (see README).\n if (profiles.includes('town') && this.config.transport.relayHiddenService) {\n imagesToPull.add(normalizeImageTag(RELAY_ATOR_SIDECAR_IMAGE));\n }\n\n // Delegate per-image pull to the public pullImage method (reuses skip-if-exists logic).\n for (const image of imagesToPull) {\n await this.pullImage(image);\n }\n }\n\n /**\n * Pull a single image by its reference (tag or digest form).\n *\n * Skips the pull when the image already exists locally (matches against\n * both RepoTags and RepoDigests so digest-form refs like\n * `ghcr.io/toon-protocol/town@sha256:abc...` are found correctly).\n * Throws `OrchestratorError` on pull failure.\n */\n async pullImage(image: string): Promise<void> {\n const existingImages = await this.docker.listImages();\n const existingRefs = new Set<string>();\n for (const img of existingImages) {\n for (const tag of img.RepoTags ?? []) existingRefs.add(tag);\n for (const digest of img.RepoDigests ?? []) existingRefs.add(digest);\n }\n if (existingRefs.has(image)) {\n return;\n }\n try {\n const stream = await this.docker.pull(image);\n await this.followPullProgress(image, stream);\n } catch (err: unknown) {\n throw new OrchestratorError(\n `Failed to pull image ${image}: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err instanceof Error ? err : undefined }\n );\n }\n }\n\n /**\n * Start a child peer node via `docker compose --profile <type> up -d <type>`.\n *\n * HS-profile only — throws `OrchestratorError` when called on the dev profile.\n *\n * The `env` parameter supplies the per-node wallet secrets (e.g.\n * `TOWN_SECRET_KEY`, `MILL_MNEMONIC`). It is layered on top of `process.env`\n * so that PATH, HOME, and other process-level env vars are preserved for the\n * docker CLI subprocess.\n *\n * Logging guard: the caller (nodes-lifecycle route) must NOT log the `env`\n * argument — it contains secret keys and the wallet mnemonic.\n */\n async startNodeViaCompose(\n type: NodeType,\n env: Record<string, string>\n ): Promise<void> {\n if (this.profile === 'dev') {\n throw new OrchestratorError(\n `startNodeViaCompose is only available in HS profile; current profile is 'dev'`\n );\n }\n const composePath = this.requireComposePath();\n this.validateComposePath(composePath);\n\n const args = [\n 'compose',\n '-f',\n composePath,\n '--profile',\n type,\n 'up',\n '-d',\n type,\n ] as const;\n\n try {\n await this.execFileAsync('docker', args, {\n timeout: 180_000,\n maxBuffer: 16 * 1024 * 1024,\n inheritStdio: true,\n // Layer node secrets on top of process.env — preserves PATH, HOME, etc.\n env: { ...process.env, ...env },\n });\n } catch (err: unknown) {\n const e = err as NodeJS.ErrnoException & {\n stderr?: string;\n code?: number | string;\n signal?: string | null;\n };\n // P5: redact env-value secrets before stderr ever reaches an error\n // message or response body.\n const stderr = redactSecretsInComposeStderr(String(e.stderr ?? ''));\n const numericExit = typeof e.code === 'number' ? e.code : undefined;\n const codeLabel = String(e.code ?? e.signal ?? 'unknown');\n let message: string;\n if (e.code === 'ENOENT') {\n message = `docker CLI not found on PATH (ENOENT): ${stderr.trim().slice(0, 2000)}`;\n } else if (e.code === 'ETIMEDOUT') {\n message = `docker compose up timed out after 180000ms: ${stderr.trim().slice(0, 2000)}`;\n } else {\n message = `docker compose up failed (exit ${codeLabel}): ${stderr.trim().slice(0, 2000)}`;\n }\n this.surfaceComposeFailure(stderr);\n throw new OrchestratorError(message, {\n ...(numericExit !== undefined ? { exitCode: numericExit } : {}),\n stderr,\n cause: err instanceof Error ? err : undefined,\n });\n }\n }\n\n /**\n * Stop and remove a child peer node via `docker compose stop` + `rm -f`.\n *\n * HS-profile only — throws `OrchestratorError` when called on the dev profile.\n * Idempotent: stderr patterns indicating the service/container is already gone\n * (`'no such service'`, `'no containers to remove'`, `'No such container'`)\n * are treated as success so callers can run this as a rollback without\n * worrying about the container's prior state.\n */\n async stopNodeViaCompose(type: NodeType): Promise<void> {\n if (this.profile === 'dev') {\n throw new OrchestratorError(\n `stopNodeViaCompose is only available in HS profile; current profile is 'dev'`\n );\n }\n const composePath = this.requireComposePath();\n\n const idempotentStderr = (stderr: string): boolean =>\n stderr.includes('no such service') ||\n stderr.includes('no containers to remove') ||\n stderr.includes('No such container');\n\n // Step 1: stop the service\n try {\n await this.execFileAsync(\n 'docker',\n ['compose', '-f', composePath, '--profile', type, 'stop', type],\n { timeout: 60_000, maxBuffer: 16 * 1024 * 1024 }\n );\n } catch (err: unknown) {\n const e = err as NodeJS.ErrnoException & {\n stderr?: string;\n code?: number | string;\n };\n const stderr = redactSecretsInComposeStderr(String(e.stderr ?? ''));\n if (!idempotentStderr(stderr)) {\n // P11: wrap raw error in OrchestratorError for parity with startNodeViaCompose.\n const numericExit = typeof e.code === 'number' ? e.code : undefined;\n const codeLabel = String(e.code ?? 'unknown');\n throw new OrchestratorError(\n `docker compose stop failed (exit ${codeLabel}): ${stderr.trim().slice(0, 2000)}`,\n {\n ...(numericExit !== undefined ? { exitCode: numericExit } : {}),\n stderr,\n cause: err instanceof Error ? err : undefined,\n }\n );\n }\n }\n\n // Step 2: remove the stopped container so a future `up` re-creates it cleanly\n try {\n await this.execFileAsync(\n 'docker',\n ['compose', '-f', composePath, '--profile', type, 'rm', '-f', type],\n { timeout: 60_000, maxBuffer: 16 * 1024 * 1024 }\n );\n } catch (err: unknown) {\n const e = err as NodeJS.ErrnoException & {\n stderr?: string;\n code?: number | string;\n };\n const stderr = redactSecretsInComposeStderr(String(e.stderr ?? ''));\n if (!idempotentStderr(stderr)) {\n const numericExit = typeof e.code === 'number' ? e.code : undefined;\n const codeLabel = String(e.code ?? 'unknown');\n throw new OrchestratorError(\n `docker compose rm failed (exit ${codeLabel}): ${stderr.trim().slice(0, 2000)}`,\n {\n ...(numericExit !== undefined ? { exitCode: numericExit } : {}),\n stderr,\n cause: err instanceof Error ? err : undefined,\n }\n );\n }\n }\n }\n\n /**\n * Poll container health status via inspect().\n * Retries at configurable interval, throws on timeout.\n */\n async healthCheck(\n containerName: string,\n options?: HealthCheckOptions\n ): Promise<string> {\n const interval = options?.interval ?? 2000;\n const timeout = options?.timeout ?? 60000;\n const startTime = Date.now();\n let attempt = 0;\n\n while (Date.now() - startTime < timeout) {\n attempt++;\n try {\n const container = this.docker.getContainer(containerName);\n const info = await container.inspect();\n\n const healthStatus = info.State?.Health?.Status ?? 'none';\n\n this.emit('healthCheck', {\n name: containerName,\n status: healthStatus,\n attempt,\n });\n\n if (healthStatus === 'healthy') {\n return 'healthy';\n }\n } catch {\n // Transient inspect failure (Docker daemon hiccup) — retry within timeout\n this.emit('healthCheck', {\n name: containerName,\n status: 'error',\n attempt,\n });\n }\n\n // Wait before next poll\n await new Promise((resolve) => setTimeout(resolve, interval));\n }\n\n throw new Error(\n `Health check timeout: ${containerName} did not become healthy within ${timeout}ms`\n );\n }\n\n // ── Private helpers ──\n\n /**\n * Create the townhouse-net bridge network if it doesn't exist.\n */\n private async ensureNetwork(): Promise<void> {\n try {\n // Docker's name filter does substring matching, so we post-filter\n // with an exact Name comparison to avoid false positives.\n const networks = await this.docker.listNetworks({\n filters: { name: [NETWORK_NAME] },\n });\n\n const exists = networks.some(\n (n: { Name: string }) => n.Name === NETWORK_NAME\n );\n if (exists) return;\n\n await this.docker.createNetwork({\n Name: NETWORK_NAME,\n Driver: 'bridge',\n });\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n if (\n msg.includes('ENOENT') ||\n msg.includes('ECONNREFUSED') ||\n msg.includes('socket')\n ) {\n throw new Error(\n `Docker is not running or not available. Please start Docker and try again. (${msg})`\n );\n }\n throw error;\n }\n }\n\n /**\n * Start the connector container — always runs first.\n *\n * The connector image at 3.3.x reads its config from a YAML file pointed\n * to by the `CONFIG_FILE` env var (default `./config.yaml`). We write the\n * generated YAML to `<configDir>/connector.yaml` (sibling to wallet.enc),\n * mount it as `/config/connector.yaml`, and set CONFIG_FILE accordingly.\n *\n * (Env-var-based config was set on the container historically but the\n * connector image silently ignored them — see the YAML fix landing with\n * this comment block.)\n */\n private async startConnector(): Promise<void> {\n const name = `${CONTAINER_PREFIX}connector`;\n const env = this.buildConnectorEnv();\n env.push('CONFIG_FILE=/config/connector.yaml');\n\n // Write the YAML config beside the wallet so it's stable across restarts.\n const configDir = dirname(this.config.wallet.encrypted_path);\n mkdirSync(configDir, { recursive: true, mode: 0o700 });\n const yamlPath = join(configDir, 'connector.yaml');\n const runtimeConfig = this.configGenerator.generate(this.activeNodes);\n writeFileSync(yamlPath, this.configGenerator.toYaml(runtimeConfig), {\n encoding: 'utf-8',\n mode: 0o600,\n });\n\n this.emit('containerState', { name, state: 'creating' });\n\n const container = await this.docker.createContainer({\n name,\n Image: this.config.connector.image,\n Env: env,\n ExposedPorts: {\n [`${CONNECTOR_INTERNAL_PORT}/tcp`]: {},\n [`${this.config.connector.adminPort}/tcp`]: {},\n },\n HostConfig: {\n NetworkMode: NETWORK_NAME,\n Binds: [`${yamlPath}:/config/connector.yaml:ro`],\n PortBindings: {\n [`${this.config.connector.adminPort}/tcp`]: [\n {\n HostIp: '127.0.0.1',\n HostPort: String(this.config.connector.adminPort),\n },\n ],\n },\n },\n });\n\n this.emit('containerState', { name, state: 'starting' });\n await container.start();\n this.emit('containerState', { name, state: 'running' });\n }\n\n /**\n * Start a node container (town, mill, or dvm).\n * Retries up to MAX_START_RETRIES on failure.\n */\n private async startNode(type: NodeType): Promise<void> {\n const name = `${CONTAINER_PREFIX}${type}`;\n const nodeConfig = this.config.nodes[type];\n const image = nodeConfig.image ?? DEFAULT_NODE_IMAGES[type];\n const env = await this.buildNodeEnv(type);\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= MAX_START_RETRIES; attempt++) {\n try {\n this.emit('containerState', { name, state: 'creating' });\n\n const container = await this.docker.createContainer({\n name,\n Image: image,\n Env: env,\n HostConfig: {\n NetworkMode: NETWORK_NAME,\n },\n });\n\n this.emit('containerState', { name, state: 'starting' });\n await container.start();\n this.emit('containerState', { name, state: 'running' });\n return;\n } catch (error: unknown) {\n lastError = error instanceof Error ? error : new Error(String(error));\n this.emit('containerState', { name, state: 'error' });\n\n // Clean up failed container before retry\n try {\n const existing = this.docker.getContainer(name);\n await existing.remove({ force: true });\n } catch {\n // Container may not exist, ignore\n }\n }\n }\n\n throw new Error(\n `Failed to start container ${name} after ${MAX_START_RETRIES} restart attempts: ${lastError?.message}`\n );\n }\n\n /**\n * Wait for a container's health check to pass.\n */\n private async waitForHealth(containerName: string): Promise<void> {\n await this.healthCheck(containerName);\n }\n\n /**\n * Start the relay-side ator sidecar that publishes a v3 hidden service\n * forwarding inbound traffic to the town container's Nostr WebSocket port.\n *\n * The keypair directory is mounted read-write because the sidecar's\n * entrypoint writes the `hostname` file on first boot (see\n * docker/townhouse-ator-sidecar/Dockerfile). The town container picks up\n * the resulting .anyone URL via the operator-set externalUrl field.\n */\n private async startRelayAtorSidecar(): Promise<void> {\n const hsConfig = this.config.transport.relayHiddenService;\n if (!hsConfig) return;\n\n const name = `${CONTAINER_PREFIX}ator-sidecar-relay`;\n const env = [\n `HS_TARGET_HOST=${CONTAINER_PREFIX}town`,\n `HS_TARGET_PORT=${TOWN_RELAY_PORT}`,\n `HS_PORT=${hsConfig.port}`,\n `SOCKS_PORT=${RELAY_ATOR_SOCKS_PORT}`,\n ];\n\n this.emit('containerState', { name, state: 'creating' });\n\n const container = await this.docker.createContainer({\n name,\n Image: RELAY_ATOR_SIDECAR_IMAGE,\n Env: env,\n HostConfig: {\n NetworkMode: NETWORK_NAME,\n Binds: [`${hsConfig.dir}:/var/lib/anon/hs:rw`],\n },\n });\n\n this.emit('containerState', { name, state: 'starting' });\n await container.start();\n this.emit('containerState', { name, state: 'running' });\n }\n\n /**\n * Stop and remove a single container.\n */\n private async stopAndRemove(containerName: string): Promise<void> {\n try {\n const container = this.docker.getContainer(containerName);\n this.emit('containerState', { name: containerName, state: 'stopping' });\n await container.stop({ t: 10 });\n await container.remove();\n this.emit('containerState', { name: containerName, state: 'stopped' });\n } catch (error: unknown) {\n // Container may already be stopped/removed — only swallow expected errors\n const msg = error instanceof Error ? error.message : String(error);\n if (\n msg.includes('already stopped') ||\n msg.includes('not running') ||\n msg.includes('No such container') ||\n msg.includes('is not running') ||\n msg.includes('removal')\n ) {\n return;\n }\n // Emit error state with detail but don't throw — best-effort cleanup during shutdown\n this.emit('containerState', {\n name: containerName,\n state: 'error',\n detail: msg,\n });\n }\n }\n\n /**\n * Remove the townhouse-net network if it exists.\n */\n private async removeNetwork(): Promise<void> {\n try {\n const networks = await this.docker.listNetworks({\n filters: { name: [NETWORK_NAME] },\n });\n const netInfo = networks.find(\n (n: { Name: string }) => n.Name === NETWORK_NAME\n );\n if (netInfo) {\n const network = this.docker.getNetwork(netInfo.Id ?? netInfo.Name);\n await network.remove();\n }\n } catch {\n // Network may not exist, ignore\n }\n }\n\n /**\n * Build environment variables for the connector container.\n * Delegates to ConnectorConfigGenerator for consistent config generation.\n */\n private buildConnectorEnv(): string[] {\n const runtimeConfig = this.configGenerator.generate(this.activeNodes);\n return this.configGenerator.toEnvArray(runtimeConfig);\n }\n\n /**\n * Build environment variables for a node container.\n * If a WalletManager is provided, injects per-node identity keys.\n *\n * Async because the DVM path may need to derive an RSA-4096 Arweave key\n * via `walletManager.ensureArweaveKey('dvm')` — that derivation takes\n * 5–30s on first call per unlocked wallet (cached thereafter).\n */\n private async buildNodeEnv(type: NodeType): Promise<string[]> {\n // nosemgrep: javascript.lang.security.detect-insecure-websocket.detect-insecure-websocket -- Docker-internal container-to-container URL, TLS unnecessary\n const connectorUrl = `ws://${CONTAINER_PREFIX}connector:${CONNECTOR_INTERNAL_PORT}`;\n const env: string[] = [`CONNECTOR_URL=${connectorUrl}`];\n\n switch (type) {\n case 'town': {\n const feePerEvent = this.config.nodes.town.feePerEvent;\n if (feePerEvent !== undefined) {\n env.push(`FEE_PER_EVENT=${feePerEvent}`);\n }\n // When the operator opts into a relay hidden service, the .anyone URL\n // is advertised via packages/town/src/cli.ts which reads\n // TOON_EXTERNAL_RELAY_URL into config.externalRelayUrl. We deliberately\n // do NOT set config.ator.enabled — that would bind the relay to\n // 127.0.0.1 inside the container, which the sidecar (reaching town via\n // Docker DNS) cannot then forward to.\n const relayHs = this.config.transport.relayHiddenService;\n if (relayHs?.externalUrl) {\n env.push(`TOON_EXTERNAL_RELAY_URL=${relayHs.externalUrl}`);\n }\n break;\n }\n case 'mill': {\n const feeBasisPoints = this.config.nodes.mill.feeBasisPoints;\n if (feeBasisPoints !== undefined) {\n env.push(`FEE_BASIS_POINTS=${feeBasisPoints}`);\n }\n break;\n }\n case 'dvm': {\n const feePerJob = this.config.nodes.dvm.feePerJob;\n if (feePerJob !== undefined) {\n env.push(`FEE_PER_JOB=${feePerJob}`);\n }\n const kindPricing = this.config.nodes.dvm.kindPricing;\n if (kindPricing) {\n for (const [kind, value] of Object.entries(kindPricing)) {\n env.push(`KIND_PRICING_${kind}=${value}`);\n }\n }\n // Arweave DVM (kind:5094) requires Arweave credit credentials for\n // authenticated uploads. Two paths are wired here:\n // 1. Preferred (Phase 4): pipe the wallet-derived AR JWK as\n // DVM_ARWEAVE_JWK_B64 = base64(JSON(jwk)). Container picks\n // this up first and constructs an ArweaveSigner.\n // 2. Legacy: pass through TURBO_TOKEN (raw JWK JSON env var)\n // so existing operators are not broken.\n // Without either, the entrypoint installs a stub adapter that\n // throws on first upload with a `townhouse credits buy` CTA.\n //\n // NOTE: the JWK is secret material — DO NOT log the env-var value\n // anywhere in this path. The orchestrator's existing logging only\n // surfaces container names / lifecycle events, not env arrays.\n if (this.walletManager) {\n try {\n // Surface the 5–30s blocking call so operators know why their\n // boot is paused. Logged BEFORE the await so the message lands\n // even if derivation is slow.\n console.log(\n '[orchestrator] Deriving DVM Arweave key (first boot, this can take 5-30s)...'\n );\n await this.walletManager.ensureArweaveKey('dvm');\n const jwk = this.walletManager.getArweaveJwk('dvm');\n const jwkB64 = Buffer.from(JSON.stringify(jwk), 'utf-8').toString(\n 'base64'\n );\n env.push(`DVM_ARWEAVE_JWK_B64=${jwkB64}`);\n } catch {\n // Wallet locked, unsupported platform, or derivation failed —\n // skip the preferred path silently. The legacy TURBO_TOKEN\n // path below (or the stub adapter with CTA) takes over.\n }\n }\n const turboToken = process.env['TURBO_TOKEN'];\n if (turboToken) {\n env.push(`TURBO_TOKEN=${turboToken}`);\n }\n break;\n }\n }\n\n // Inject wallet-derived identity keys if available\n if (this.walletManager) {\n try {\n const keys = this.walletManager.getNodeKeys(type);\n env.push(`NODE_NOSTR_PUBKEY=${keys.nostrPubkey}`);\n env.push(`NODE_EVM_ADDRESS=${keys.evmAddress}`);\n // Secret key as hex for the container to use for event signing\n const secretHex = Buffer.from(keys.nostrSecretKey).toString('hex');\n env.push(`NODE_NOSTR_SECRET_KEY=${secretHex}`);\n } catch {\n // Wallet not initialized — skip key injection (backward compatible)\n }\n }\n\n return env;\n }\n\n /**\n * Follow a Docker pull stream and emit progress events.\n */\n private async followPullProgress(\n image: string,\n stream: NodeJS.ReadableStream\n ): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.docker.modem.followProgress(\n stream,\n (err: Error | null) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n },\n (event: { status?: string; id?: string; progress?: string }) => {\n this.emit('pullProgress', {\n image,\n status: event.status ?? '',\n id: event.id,\n progress: event.progress,\n });\n }\n );\n });\n }\n}\n","/**\n * ATOR transport probe — periodically TCP-connects to the configured SOCKS5\n * proxy host:port and measures direct HTTPS latency for comparison.\n *\n * The probe answers a single operator question: \"is my configured ATOR proxy\n * contactable from this host?\" TCP connect is the right granularity — if the\n * TCP listener is up, the connector's real BTP traffic will succeed.\n *\n * The probe NEVER makes a real SOCKS5 handshake or proxied request — only a\n * plain TCP connect to the proxy host:port.\n */\n\nimport * as net from 'node:net';\nimport * as https from 'node:https';\nimport * as http from 'node:http';\n\nconst DEFAULT_INTERVAL_MS = 30_000;\nconst MIN_INTERVAL_MS = 1_000;\nconst PROBE_TIMEOUT_MS = 3_000;\nconst DEFAULT_DIRECT_PROBE_URL = 'https://1.1.1.1/';\n\nexport interface TransportProbeOptions {\n proxyUrl: string;\n intervalMs?: number;\n /** Override the direct-latency probe URL (for tests — avoids real network). */\n directProbeUrl?: string;\n}\n\nexport interface TransportProbeStatus {\n reachable: boolean;\n latencyProxyMs: number | null;\n latencyDirectMs: number | null;\n lastProbedAt: number;\n probeError: string | null;\n}\n\nexport class TransportProbe {\n private proxyUrl: string;\n private readonly intervalMs: number;\n private readonly directProbeUrl: string;\n\n private running = false;\n private timer: ReturnType<typeof setInterval> | null = null;\n\n private status: TransportProbeStatus = {\n reachable: true,\n latencyProxyMs: null,\n latencyDirectMs: null,\n lastProbedAt: 0,\n probeError: null,\n };\n\n constructor(opts: TransportProbeOptions) {\n this.proxyUrl = opts.proxyUrl;\n this.intervalMs = Math.max(\n MIN_INTERVAL_MS,\n opts.intervalMs ?? DEFAULT_INTERVAL_MS\n );\n this.directProbeUrl = opts.directProbeUrl ?? DEFAULT_DIRECT_PROBE_URL;\n }\n\n /** Start the probe loop. Idempotent — calling twice while running is a no-op. */\n start(): void {\n if (this.running) return;\n this.running = true;\n const tick = (): void => {\n void this.tick().catch((err: unknown) => {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[TransportProbe] tick failed: ${msg}`);\n });\n };\n // Run immediately on start, then on interval\n tick();\n this.timer = setInterval(tick, this.intervalMs);\n }\n\n /** Stop the probe loop. Idempotent. */\n stop(): void {\n this.running = false;\n if (this.timer !== null) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n\n /** Returns the latest probe snapshot synchronously. Never blocks. */\n getStatus(): TransportProbeStatus {\n return { ...this.status };\n }\n\n /**\n * Update the target proxy URL.\n * The next tick will use the new URL; the current tick may complete against the old URL.\n */\n setProxyUrl(url: string): void {\n this.proxyUrl = url;\n }\n\n // ── Private probe logic ──────────────────────────────────────────────────\n\n private async tick(): Promise<void> {\n if (!this.running) return;\n\n const directMs = await this.probeDirectLatency();\n if (!this.running) return;\n\n if (!this.proxyUrl) {\n // Direct-mode: no proxy to probe\n const prev = this.status;\n this.status = {\n reachable: true,\n latencyProxyMs: null,\n latencyDirectMs: directMs,\n lastProbedAt: Date.now(),\n probeError: null,\n };\n this.logTransition(prev, this.status);\n return;\n }\n\n let host: string;\n let port: number;\n let hostPort: string;\n try {\n const parsed = new URL(this.proxyUrl);\n host = parsed.hostname;\n const rawPort = Number(parsed.port);\n if (\n !parsed.port ||\n !Number.isInteger(rawPort) ||\n rawPort < 1 ||\n rawPort > 65535\n ) {\n throw new Error('missing or invalid port');\n }\n port = rawPort;\n hostPort = `${host}:${port}`;\n } catch {\n const prev = this.status;\n this.status = {\n reachable: false,\n latencyProxyMs: null,\n latencyDirectMs: directMs,\n lastProbedAt: Date.now(),\n probeError: 'invalid_proxy_url',\n };\n this.logTransition(prev, this.status);\n return;\n }\n\n const { reachable, latencyMs, error } = await this.probeTcp(host, port);\n if (!this.running) return;\n const prev = this.status;\n this.status = {\n reachable,\n latencyProxyMs: latencyMs,\n latencyDirectMs: directMs,\n lastProbedAt: Date.now(),\n probeError: error ?? null,\n };\n this.logTransition(prev, this.status, hostPort);\n }\n\n private probeTcp(\n host: string,\n port: number\n ): Promise<{ reachable: boolean; latencyMs: number | null; error?: string }> {\n return new Promise((resolve) => {\n const start = Date.now();\n const socket = net.createConnection({ host, port });\n let settled = false;\n\n const settle = (result: {\n reachable: boolean;\n latencyMs: number | null;\n error?: string;\n }) => {\n if (settled) return;\n settled = true;\n try {\n socket.destroy();\n } catch {\n /* best-effort */\n }\n resolve(result);\n };\n\n const timeout = setTimeout(() => {\n settle({ reachable: false, latencyMs: null, error: 'timeout' });\n }, PROBE_TIMEOUT_MS);\n\n socket.once('connect', () => {\n clearTimeout(timeout);\n settle({ reachable: true, latencyMs: Date.now() - start });\n });\n\n socket.once('error', (err: NodeJS.ErrnoException) => {\n clearTimeout(timeout);\n settle({\n reachable: false,\n latencyMs: null,\n error: err.code ?? err.message,\n });\n });\n });\n }\n\n private probeDirectLatency(): Promise<number | null> {\n return new Promise((resolve) => {\n const start = Date.now();\n let settled = false;\n\n const settle = (ms: number | null) => {\n if (settled) return;\n settled = true;\n resolve(ms);\n };\n\n // Support both http:// (tests) and https:// (production)\n const isHttps = this.directProbeUrl.startsWith('https://');\n const requester = isHttps ? https : http;\n\n let req: http.ClientRequest | undefined;\n const timeout = setTimeout(() => {\n try {\n req?.destroy();\n } catch {\n /* best-effort */\n }\n settle(null);\n }, PROBE_TIMEOUT_MS);\n\n try {\n req = requester.request(\n this.directProbeUrl,\n { method: 'HEAD' },\n (res) => {\n clearTimeout(timeout);\n res.resume();\n settle(Date.now() - start);\n }\n );\n\n req.once('error', (err: NodeJS.ErrnoException) => {\n clearTimeout(timeout);\n console.debug(\n `[TransportProbe] direct latency probe failed: ${err.code ?? err.message}`\n );\n settle(null);\n });\n\n req.end();\n } catch (err) {\n clearTimeout(timeout);\n const msg = err instanceof Error ? err.message : String(err);\n console.debug(`[TransportProbe] direct latency probe threw: ${msg}`);\n settle(null);\n }\n });\n }\n\n private logTransition(\n prev: TransportProbeStatus,\n next: TransportProbeStatus,\n hostPort?: string\n ): void {\n // Suppress reachable→unreachable transition log on the very first probe;\n // the default initial state is reachable=true even before any probe ran.\n if (prev.lastProbedAt === 0) return;\n\n const target = hostPort ? ` (${hostPort})` : '';\n if (prev.reachable && !next.reachable) {\n console.warn(\n `[TransportProbe] proxy became unreachable${target}: ${next.probeError ?? 'unknown'}`\n );\n } else if (!prev.reachable && next.reachable) {\n console.debug(`[TransportProbe] proxy reachable${target}`);\n }\n // No per-tick info logs for the proxy host (see AC-22)\n }\n}\n","/**\n * HS connector config writer for `townhouse hs up` (Story 45.4, Task 3).\n *\n * Generates ~/.townhouse/connector.yaml with anon.enabled: true and the\n * managed hidden-service transport block so the connector spawns the anon\n * binary and publishes a .anyone v3 hidden service automatically.\n *\n * Idempotency: if the file already exists and contains `anon.enabled: true`,\n * it is reused verbatim (preserves operator edits). Pass `force: true` to\n * overwrite unconditionally.\n */\n\nimport { existsSync, readFileSync, writeFileSync, chmodSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse, stringify as yamlStringify } from 'yaml';\nimport { ConnectorConfigGenerator } from './config-generator.js';\nimport type { TownhouseConfig } from '../config/schema.js';\nimport { DEFAULT_HS_CHAIN_PROVIDERS } from '../config/defaults.js';\nimport type { ConnectorRuntimeConfig } from './types.js';\n\n/** Absolute path inside the connector container where anon stores the keypair. */\nconst HS_DIR = '/var/lib/anon/hs';\n\n/** Port the connector's BTP server listens on (inside the container). */\nconst HS_PORT = 3000;\n\n// HS detection: parse the YAML and check anon.enabled === true. This avoids\n// false negatives from YAML formatting differences (dotted key vs. nested block).\n\nexport interface WriteHsConnectorConfigResult {\n yamlPath: string;\n /** true if the file was freshly written; false if an existing HS file was reused. */\n created: boolean;\n}\n\n/**\n * Write (or reuse) `~/.townhouse/connector.yaml` with HS-specific overrides.\n *\n * @param configDir - The townhouse home directory (e.g. `~/.townhouse/`).\n * @param config - Loaded `TownhouseConfig` (provides adminPort, ilpAddress, etc.).\n * @param options.force - When true, overwrite even if an HS file already exists.\n */\nexport function writeHsConnectorConfig(\n configDir: string,\n config: TownhouseConfig,\n options: { force?: boolean } = {}\n): WriteHsConnectorConfigResult {\n const yamlPath = join(configDir, 'connector.yaml');\n\n // Idempotency check: if the file exists and was written by a prior hs up,\n // reuse it verbatim so operator edits (e.g. log level) are preserved.\n if (!options.force && existsSync(yamlPath)) {\n try {\n const existing = parse(readFileSync(yamlPath, 'utf-8')) as Record<\n string,\n unknown\n >;\n const anon = existing['anon'] as Record<string, unknown> | undefined;\n if (anon?.['enabled'] === true) {\n return { yamlPath, created: false };\n }\n } catch {\n // Unparseable existing file — fall through to overwrite.\n }\n // Existing file lacks anon.enabled: true — treat as legacy non-HS config.\n // Fall through to overwrite.\n }\n\n // Epic 47 BUG-1 product fix (D2): inject DEFAULT_HS_CHAIN_PROVIDERS when\n // the operator has not configured chainProviders. Without at least one\n // entry, the connector's settlement subsystem (AccountManager +\n // ClaimReceiver) does not initialize, so `/admin/earnings.json` returns\n // 503 and Townhouse's earnings data plane (Epic 47) breaks. The defaults\n // are dev-Anvil deterministic addresses paired with a dead RPC; they\n // initialize the subsystem successfully but never resolve on-chain calls.\n // Operators running on real chains override chainProviders in config.yaml.\n const hsConfig: TownhouseConfig =\n config.chainProviders !== undefined && config.chainProviders.length > 0\n ? config\n : { ...config, chainProviders: [...DEFAULT_HS_CHAIN_PROVIDERS] };\n\n // Build the HS runtime config by extending the base generated config.\n const generator = new ConnectorConfigGenerator(hsConfig);\n const baseConfig = generator.generate([]); // apex-only, no peers\n\n // Managed mode: the connector spawns the anon daemon in-process. The SOCKS\n // proxy port binds locally at 127.0.0.1:9050 — use the local address so the\n // connector's TCP-readiness check waits for the right host, not the external\n // public ATOR proxy (proxy.ator.io:9050) which can never bind locally.\n const HS_LOCAL_SOCKS_PROXY = 'socks5h://127.0.0.1:9050';\n\n const hsRuntimeConfig: ConnectorRuntimeConfig = {\n ...baseConfig,\n transport: {\n mode: 'ator',\n socksProxy: HS_LOCAL_SOCKS_PROXY,\n externalUrl: 'auto',\n hiddenService: {\n dir: HS_DIR,\n port: HS_PORT,\n // The orchestrator polls getHsHostname() for up to 120s; give the\n // connector the same budget so the internal timeout doesn't fire first.\n startupTimeoutMs: 120_000,\n },\n },\n };\n\n // Render the base YAML, then add `anon: { enabled: true }` as a top-level field.\n const baseYaml = generator.toYaml(hsRuntimeConfig);\n const parsed = parse(baseYaml) as Record<string, unknown>;\n parsed['anon'] = { enabled: true };\n const finalYaml = yamlStringify(parsed);\n\n // Write atomically: writeFileSync is not atomic on all platforms, but since\n // we set mode on creation and then defensively chmod, this is consistent with\n // the pattern used by materializeComposeTemplate (Story 45.2).\n writeFileSync(yamlPath, finalYaml, { mode: 0o600, encoding: 'utf-8' });\n chmodSync(yamlPath, 0o600);\n\n return { yamlPath, created: true };\n}\n","import {\n readFileSync,\n writeFileSync,\n mkdirSync,\n chmodSync,\n statSync,\n lstatSync,\n existsSync,\n} from 'node:fs';\nimport { dirname, join, resolve, isAbsolute } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { homedir } from 'node:os';\n\nexport type ComposeProfile = 'dev' | 'hs';\nconst VALID_PROFILES: readonly ComposeProfile[] = ['dev', 'hs'] as const;\n\nexport interface ComposeLoaderOptions {\n /** Override default `~/.townhouse/` write target. Used by tests. */\n townhouseHome?: string;\n /** Override the package-relative dist directory the loader reads from.\n * Defaults to the `dist/` adjacent to compose-loader.js at runtime.\n * Tests use this to point at fixture directories. */\n distDir?: string;\n}\n\nexport class ComposeLoaderError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ComposeLoaderError';\n }\n}\n\nfunction defaultDistDir(): string {\n // Resolves to `dist/` adjacent to the bundled output at runtime.\n // When bundled by tsup, import.meta.url is the path of dist/index.js,\n // so dirname = <package>/dist. resolve(<package>/dist, '..', 'dist') = <package>/dist.\n // When running via tsx/ts-node from src/, dirname = <package>/src,\n // so resolve(<package>/src, '..', 'dist') = <package>/dist. Both work.\n const here = dirname(fileURLToPath(import.meta.url));\n return resolve(here, '..', 'dist');\n}\n\nfunction assertValidProfile(\n profile: string\n): asserts profile is ComposeProfile {\n if (!(VALID_PROFILES as readonly string[]).includes(profile)) {\n throw new ComposeLoaderError(\n `invalid compose profile: '${profile}'. Must be one of: ${VALID_PROFILES.join(', ')}.`\n );\n }\n}\n\n// Reject townhouseHome paths that target system directories. Internal callers\n// (CLI, API, Story 45.4) pass `~/.townhouse` or test tmpdirs; an attacker\n// reaching this code path with `townhouseHome: '/etc'` would otherwise write\n// `/etc/compose/townhouse-hs.yml` and `chmod /etc 0o700`. The list is a\n// belt-and-suspenders defense — it doesn't replace caller validation, but it\n// turns a silent privilege escalation into a loud error.\nconst SYSTEM_PATH_PREFIXES = [\n '/etc',\n '/usr',\n '/bin',\n '/sbin',\n '/lib',\n '/lib64',\n '/proc',\n '/sys',\n '/dev',\n '/boot',\n '/root',\n] as const;\n\nfunction assertValidTownhouseHome(home: string): void {\n if (!home) {\n throw new ComposeLoaderError(\n 'townhouseHome resolved to an empty path. Set $HOME or pass options.townhouseHome explicitly.'\n );\n }\n if (!isAbsolute(home)) {\n throw new ComposeLoaderError(\n `townhouseHome must be an absolute path; got '${home}'.`\n );\n }\n if (home === '/' || home === '\\\\') {\n throw new ComposeLoaderError(\n `townhouseHome must not be the filesystem root; got '${home}'. ` +\n `This usually means $HOME is unset and homedir() returned '/'.`\n );\n }\n for (const prefix of SYSTEM_PATH_PREFIXES) {\n if (home === prefix || home.startsWith(prefix + '/')) {\n throw new ComposeLoaderError(\n `townhouseHome must not target a system directory; got '${home}'. ` +\n `Allowed paths: under $HOME, under tmpdir(), or any user-writable location.`\n );\n }\n }\n}\n\n// Refuse to write through a symlink at composePath/manifestPath. The dir-level\n// guard above only protects the directory itself; this protects the file path.\nfunction assertNotSymlink(filePath: string): void {\n try {\n const lst = lstatSync(filePath);\n if (lst.isSymbolicLink()) {\n throw new ComposeLoaderError(\n `${filePath} is a symlink; refusing to write through it. ` +\n `If this is intentional, remove the symlink and re-run.`\n );\n }\n } catch (err) {\n // ENOENT is expected (file doesn't exist yet — fresh write); rethrow others.\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT') throw err;\n }\n}\n\n/**\n * Returns the rendered compose YAML for the requested profile.\n * For 'hs', digest substitutions are already applied (resolved at build time).\n * For 'dev', the YAML is returned verbatim (uses local `toon:*` image tags).\n * Throws `ComposeLoaderError` if the requested profile's YAML is unreadable.\n */\nexport function loadComposeTemplate(\n profile: ComposeProfile,\n options: ComposeLoaderOptions = {}\n): string {\n assertValidProfile(profile);\n const distDir = options.distDir ?? defaultDistDir();\n const composePath = join(distDir, 'compose', `townhouse-${profile}.yml`);\n if (!existsSync(composePath)) {\n throw new ComposeLoaderError(\n `compose template not found: ${composePath}. ` +\n `Did you run 'pnpm --filter @toon-protocol/townhouse build' first?`\n );\n }\n return readFileSync(composePath, 'utf-8');\n}\n\n/**\n * Writes the resolved compose YAML to `<townhouseHome>/compose/<profile>.yml`\n * and copies `dist/image-manifest.json` to `<townhouseHome>/image-manifest.json`.\n * BOTH output files are written with mode 0o600 (NFR8 — operator-secret file mode).\n * Returns the absolute paths of the two files written.\n */\nexport function materializeComposeTemplate(\n profile: ComposeProfile,\n options: ComposeLoaderOptions = {}\n): { composePath: string; manifestPath: string } {\n assertValidProfile(profile);\n const home = options.townhouseHome || join(homedir(), '.townhouse');\n assertValidTownhouseHome(home);\n\n const distDir = options.distDir ?? defaultDistDir();\n const manifestSrc = join(distDir, 'image-manifest.json');\n\n // Validate inputs BEFORE any writes so a failure leaves disk untouched.\n // HS profile cannot succeed without a manifest — fail loudly up-front\n // rather than after writing a stale/torn compose file.\n if (profile === 'hs' && !existsSync(manifestSrc)) {\n throw new ComposeLoaderError(\n `image-manifest.json not found at ${manifestSrc}. ` +\n `HS mode requires a digest-pinned image manifest. ` +\n `Reinstall @toon-protocol/townhouse from npm to restore the manifest.`\n );\n }\n // loadComposeTemplate also throws ENOENT if the source is missing — surface\n // it now (read-only) so we don't mkdir or chmod for a doomed call.\n const yaml = loadComposeTemplate(profile, options);\n\n const composeDir = join(home, 'compose');\n // Pass mode: 0o700 so newly-created intermediates start tight (closes the\n // mkdir → chmod TOCTOU window that allowed brief world-readable state).\n mkdirSync(composeDir, { recursive: true, mode: 0o700 });\n\n // Refuse to chmod symlink targets — operator may have placed `~/.townhouse`\n // as a symlink to an encrypted volume, and we should not silently flip the\n // mode of a path we did not create. lstatSync inspects the link itself.\n for (const dir of [home, composeDir]) {\n const lst = lstatSync(dir);\n if (lst.isSymbolicLink()) {\n // Resolve the link target and confirm it's a directory; do not chmod.\n const target = statSync(dir);\n if (!target.isDirectory()) {\n throw new ComposeLoaderError(\n `${dir} is a symlink to a non-directory; refusing to materialize.`\n );\n }\n continue;\n }\n // Only narrow the mode if it is currently broader than 0o700. Operators\n // who deliberately set 0o700 OR tighter (e.g. 0o500) keep their setting.\n // Bug fix R2: previous `!== 0o700` widened 0o500 to 0o700 — now we only\n // chmod if the existing mode grants any permission outside the owner.\n const currentMode = lst.mode & 0o777;\n if ((currentMode & 0o077) !== 0) {\n chmodSync(dir, 0o700);\n }\n }\n\n const composePath = join(composeDir, `townhouse-${profile}.yml`);\n // R2 file-symlink guard — refuse to write through a planted symlink.\n assertNotSymlink(composePath);\n writeFileSync(composePath, yaml, { mode: 0o600, encoding: 'utf-8' });\n // Defensive re-chmod: writeFileSync's mode option is honored only on file\n // creation — if composePath already existed at e.g. 0o644 (stale state from\n // a prior interrupted run), the mode is unchanged by writeFileSync.\n // chmodSync corrects both that case AND the WSL2 umask-masking edge case.\n chmodSync(composePath, 0o600);\n\n const manifestPath = join(home, 'image-manifest.json');\n if (existsSync(manifestSrc)) {\n assertNotSymlink(manifestPath);\n const manifest = readFileSync(manifestSrc, 'utf-8');\n writeFileSync(manifestPath, manifest, { mode: 0o600, encoding: 'utf-8' });\n chmodSync(manifestPath, 0o600);\n }\n // (Manifest absence for 'dev' profile is silently tolerated — dev mode\n // doesn't need digest pinning. HS profile already failed at the entry guard.)\n\n return { composePath, manifestPath };\n}\n","/**\n * `nodes.yaml` schema + read/write helpers (Story 46.1).\n *\n * `~/.townhouse/nodes.yaml` is the operator-managed source of truth for\n * enabled child nodes. The reconciler (see `../reconciler.ts`) converges\n * connector peer state to this file on every `townhouse hs up`.\n *\n * Architectural rule (Epic 46.2 dependency): yaml writes happen BEFORE\n * connector registration. The drift window resolves in the safe direction —\n * a yaml entry without a connector peer is re-registered on next boot; a\n * connector peer without a yaml entry is treated as `'external'` and left\n * alone.\n */\n\nimport { promises as fs } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { parse as yamlParse, stringify as yamlStringify } from 'yaml';\nimport { z } from 'zod';\n\nconst NodesYamlEntrySchema = z\n .object({\n id: z.string().min(1),\n type: z.enum(['town', 'mill', 'dvm']),\n peerId: z.string().min(1),\n ilpAddress: z.string().min(1),\n derivationIndex: z.number().int().nonnegative(),\n enabledAt: z.string().datetime({ offset: true }),\n lastSeenAt: z.string().datetime({ offset: true }).nullable(),\n })\n .strict();\n\nexport const NodesYamlSchema = z\n .object({\n entries: z.array(NodesYamlEntrySchema),\n })\n .strict()\n .superRefine((data, ctx) => {\n const seenPeerIds = new Set<string>();\n const seenDerivationIndexes = new Set<number>();\n for (const [i, e] of data.entries.entries()) {\n if (seenPeerIds.has(e.peerId)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['entries', i, 'peerId'],\n message: `duplicate peerId: ${e.peerId}`,\n });\n }\n seenPeerIds.add(e.peerId);\n if (seenDerivationIndexes.has(e.derivationIndex)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['entries', i, 'derivationIndex'],\n message: `duplicate derivationIndex: ${e.derivationIndex}`,\n });\n }\n seenDerivationIndexes.add(e.derivationIndex);\n }\n });\n\nexport type NodesYamlEntry = z.infer<typeof NodesYamlEntrySchema>;\nexport type NodesYaml = z.infer<typeof NodesYamlSchema>;\n\n/**\n * Read and validate `nodes.yaml` at the given path.\n *\n * Returns `{ entries: [] }` if the file does not exist (graceful first-run).\n * Throws a `ZodError` with a useful path if the file is present but invalid.\n */\nexport async function readNodesYaml(path: string): Promise<NodesYaml> {\n let raw: string;\n try {\n raw = await fs.readFile(path, 'utf-8');\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return { entries: [] };\n }\n throw err;\n }\n const parsed: unknown = yamlParse(raw);\n // An empty yaml file (or one containing only `~`) parses to null — coerce\n // to the empty default so the schema validation succeeds.\n if (parsed === null || parsed === undefined) {\n return { entries: [] };\n }\n return NodesYamlSchema.parse(parsed);\n}\n\n/**\n * Write `nodes.yaml` atomically with file mode `0o600`.\n *\n * Atomic = write to `<path>.tmp` then `fs.rename`. On POSIX, rename is\n * atomic when source + destination live on the same filesystem (always true\n * for `~/.townhouse/nodes.yaml`). Prevents partial-write corruption if the\n * process is killed mid-write.\n */\nexport async function writeNodesYaml(\n path: string,\n data: NodesYaml\n): Promise<void> {\n // Validate before serializing — never persist a yaml that won't round-trip.\n const validated = NodesYamlSchema.parse(data);\n const yamlContent = yamlStringify(validated);\n const tmpPath = `${path}.tmp`;\n await fs.mkdir(dirname(path), { recursive: true, mode: 0o700 });\n await fs.writeFile(tmpPath, yamlContent, { encoding: 'utf-8', mode: 0o600 });\n await fs.rename(tmpPath, path);\n // fs.writeFile honors mode only on file creation. Re-chmod after rename\n // to handle the case where `<path>` already existed and inherited a\n // different mode from a previous run.\n await fs.chmod(path, 0o600);\n}\n\n// Re-export for downstream validators (Epic 47 aggregator) that need to\n// validate operator input without reaching into a deep import path.\nexport { NodesYamlEntrySchema };\n","/**\n * Boot reconciler (Story 46.1).\n *\n * Converges connector peer state to `~/.townhouse/nodes.yaml` (truth) on\n * every `townhouse hs up`. Reads yaml + connector peers, diffs them,\n * re-registers any yaml entries missing from the connector, and logs\n * connector peers without yaml entries as `'external'` (left alone).\n *\n * Container lifecycle is OUT of scope — that lives in Epic 46.2.\n */\n\nimport { promises as fs } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport type { ConnectorAdminClient } from './connector/admin-client.js';\nimport type { PeerStatus } from './connector/types.js';\nimport { CONTAINER_PREFIX, NODE_BTP_PORT } from './constants.js';\nimport {\n readNodesYaml,\n type NodesYaml,\n type NodesYamlEntry,\n} from './state/nodes-yaml.js';\n\n/** Action recorded for a single divergence. */\nexport type DivergenceAction =\n | 'reregistered'\n | 'reregister-failed'\n | 'external';\n\n/** A single divergence record for the reconciler log. */\nexport interface DivergenceLog {\n timestamp: string;\n peerId: string;\n action: DivergenceAction;\n detail?: string;\n}\n\n/** Per-divergence intent computed by `diff()` — converted to a `DivergenceLog` at action time. */\ninterface DivergencePlan {\n peerId: string;\n intent: 'reregister' | 'external';\n}\n\n/** Summary returned by `reconcile()` so callers can surface partial-failure counts. */\nexport interface ReconcileSummary {\n reregistered: number;\n failed: number;\n external: number;\n}\n\nexport class BootReconciler {\n private logDirEnsured = false;\n private logFileChmodEnsured = false;\n\n constructor(\n private readonly adminClient: Pick<\n ConnectorAdminClient,\n 'getPeers' | 'registerPeer'\n >,\n private readonly nodesYamlPath: string,\n private readonly reconcilerLogPath: string\n ) {}\n\n /**\n * Diff `nodes.yaml` (truth) against `GET /admin/peers` (derived state)\n * and converge.\n *\n * Ordering rule (Epic 46.2 dependency — load-bearing):\n * `nodes.yaml` write happens BEFORE connector registration\n * (`POST /admin/peers`).\n *\n * The drift window resolves in the safe direction:\n * - yaml entry without a connector peer = harmless. The reconciler\n * re-registers it on next `hs up` (this method does that).\n * - connector peer without a yaml entry = treated as `'external'` and\n * left alone (operators may legitimately route non-Townhouse peers\n * through the same connector).\n *\n * The unsafe direction (register first, then write yaml) creates a\n * window where the connector routes to a peer Townhouse cannot clean\n * up. Epic 46.2's provisioning pipeline MUST honor the yaml-first rule.\n *\n * Failures fetching `getPeers()` are surfaced (not swallowed) so the\n * caller in `handleHsUp` can decide whether to treat reconciler\n * divergence as fatal. (Today: non-fatal — see cli.ts wire point.)\n *\n * Per-divergence appendLog failures are caught so a single log-write\n * failure does not abort the rest of the reconciliation pass.\n */\n async reconcile(): Promise<ReconcileSummary> {\n const yaml = await readNodesYaml(this.nodesYamlPath);\n const peers = await this.adminClient.getPeers();\n const plans = this.diff(yaml, peers);\n\n const summary: ReconcileSummary = {\n reregistered: 0,\n failed: 0,\n external: 0,\n };\n\n for (const plan of plans) {\n if (plan.intent === 'reregister') {\n const entry = yaml.entries.find((e) => e.peerId === plan.peerId);\n if (!entry) continue;\n try {\n await this.adminClient.registerPeer({\n id: entry.peerId,\n url: deriveBtpUrl(entry),\n authToken: '',\n routes: [{ prefix: entry.ilpAddress, priority: 0 }],\n });\n summary.reregistered++;\n await this.tryAppendLog({\n timestamp: new Date().toISOString(),\n peerId: plan.peerId,\n action: 'reregistered',\n });\n } catch (err: unknown) {\n summary.failed++;\n const msg = err instanceof Error ? err.message : String(err);\n await this.tryAppendLog({\n timestamp: new Date().toISOString(),\n peerId: plan.peerId,\n action: 'reregister-failed',\n detail: msg,\n });\n }\n } else {\n summary.external++;\n await this.tryAppendLog({\n timestamp: new Date().toISOString(),\n peerId: plan.peerId,\n action: 'external',\n });\n }\n }\n\n return summary;\n }\n\n /**\n * Compute divergences without mutating the connector. Exposed for\n * testability — production callers use `reconcile()`.\n */\n private diff(yaml: NodesYaml, peers: PeerStatus[]): DivergencePlan[] {\n const peerIds = new Set(peers.map((p) => p.id));\n const yamlPeerIds = new Set(yaml.entries.map((e) => e.peerId));\n const out: DivergencePlan[] = [];\n\n for (const entry of yaml.entries) {\n if (!peerIds.has(entry.peerId)) {\n out.push({ peerId: entry.peerId, intent: 'reregister' });\n }\n }\n for (const peer of peers) {\n if (!yamlPeerIds.has(peer.id)) {\n out.push({ peerId: peer.id, intent: 'external' });\n }\n }\n return out;\n }\n\n /**\n * Append one divergence record without aborting the whole reconciliation\n * pass on a single log-write failure (disk full, EACCES, etc.). Failures\n * are themselves logged to stderr — not silently swallowed — so the\n * operator can see them in the same `hs up` session.\n */\n private async tryAppendLog(div: DivergenceLog): Promise<void> {\n try {\n await this.appendLog(div);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(\n `[townhouse boot-reconciler] failed to append divergence log: ${msg}`\n );\n }\n }\n\n /**\n * Append one divergence record to the reconciler log as a single line of\n * JSON (jsonl-style — easy to grep, easy to parse).\n *\n * `mkdir` runs once per reconciler instance. `chmod 0o600` on the log file\n * also runs once — `fs.appendFile`'s `mode` option only applies on\n * creation, so without a post-create chmod a pre-existing log file with\n * permissive mode would never be tightened.\n */\n private async appendLog(div: DivergenceLog): Promise<void> {\n const line = JSON.stringify(div) + '\\n';\n if (!this.logDirEnsured) {\n await fs.mkdir(dirname(this.reconcilerLogPath), {\n recursive: true,\n mode: 0o700,\n });\n this.logDirEnsured = true;\n }\n await fs.appendFile(this.reconcilerLogPath, line, {\n encoding: 'utf-8',\n mode: 0o600,\n });\n if (!this.logFileChmodEnsured) {\n try {\n await fs.chmod(this.reconcilerLogPath, 0o600);\n } catch {\n /* best-effort: file may have been removed; next call retries */\n }\n this.logFileChmodEnsured = true;\n }\n }\n}\n\n/**\n * Derive the BTP WebSocket URL for a Townhouse internal peer.\n *\n * Convention: `ws://${CONTAINER_PREFIX}${type}:${NODE_BTP_PORT}` — matches\n * the URL used by `ConnectorConfigGenerator` at boot, minus the `btp+`\n * scheme prefix (the connector's POST /admin/peers requires `ws://` or\n * `wss://`, while the static yaml config uses `btp+ws://`).\n *\n * Epic 46.2 may persist the URL into `nodes.yaml` directly when the\n * provisioning pipeline supports operator-defined peer URLs; until then,\n * convention is sufficient because the only producer of yaml entries is\n * Townhouse itself.\n */\nfunction deriveBtpUrl(entry: NodesYamlEntry): string {\n return `ws://${CONTAINER_PREFIX}${entry.type}:${NODE_BTP_PORT}`;\n}\n","/**\n * Hourly earnings snapshot writer (Story 47.3).\n *\n * Persists `claimsReceivedTotal` per (peerId × assetCode) — plus apex\n * `connectorFees[]` rows under `peerId: '__apex__'` — to\n * `${dirname(configPath)}/earnings-snapshots.jsonl` once per hour. Consumed\n * by `snapshot-reader.ts`'s `DeltaComputer` factory. Failure mode: any\n * per-tick error is logged via `logger.warn` and swallowed (the writer NEVER\n * throws into the apex event loop) — the next tick retries cleanly. Pruning\n * runs after each successful append (entries older than 13 months are\n * rewritten atomically). File mode is `0o600` on every write.\n *\n * @module\n * @since 47.3\n */\n\nimport { promises as fs } from 'node:fs';\nimport { dirname } from 'node:path';\nimport type { ConnectorAdminClient } from '../connector/index.js';\n\n/**\n * One JSONL row in `earnings-snapshots.jsonl`.\n *\n * NOTE: apex routing-fee rows use `peerId: '__apex__'`. The field name\n * `claimsReceivedTotal` is technically a misnomer for apex rows — those\n * are connector routing fees, not received claims — but the uniform column\n * name keeps the JSONL schema simple and the reader doesn't need a special\n * case.\n */\nexport interface SnapshotEntry {\n /** ISO-8601 UTC timestamp of the tick boundary (e.g. '2026-05-12T15:00:00.000Z'). */\n ts: string;\n /** Connector peerId, OR the literal `'__apex__'` for apex routing-fee rows. */\n peerId: string;\n assetCode: string;\n /** Decimal-string cumulative (claims received for peers, routing-fee total for apex). */\n claimsReceivedTotal: string;\n}\n\nexport interface SnapshotWriterOptions {\n connectorAdmin: ConnectorAdminClient;\n /** Absolute path to `earnings-snapshots.jsonl`. */\n snapshotPath: string;\n /** Tick interval (ms). Default 3_600_000 (1 hour). */\n tickIntervalMs?: number;\n /** Injected clock for tests. Default `() => new Date()`. */\n now?: () => Date;\n /** Retention window in months. Default 13. */\n retentionMonths?: number;\n /** pino/Fastify-compatible logger; warn-only. */\n logger?: { warn(obj: object, msg?: string): void };\n /**\n * Fire one tick immediately on `start()` instead of waiting for the first\n * interval. Default `false` (production). Tests set this to `true` to\n * assert append behavior without advancing fake timers.\n */\n fireOnStart?: boolean;\n}\n\nexport class SnapshotWriter {\n private timer: ReturnType<typeof setInterval> | null = null;\n private tickPending = false;\n\n constructor(private readonly opts: SnapshotWriterOptions) {}\n\n start(): void {\n // Idempotent — calling start() twice without stop() must not leak the first timer.\n if (this.timer !== null) return;\n const intervalMs = this.opts.tickIntervalMs ?? 3_600_000;\n this.timer = setInterval(() => {\n void this.tick();\n }, intervalMs);\n if (this.opts.fireOnStart) {\n void this.tick();\n }\n }\n\n stop(): void {\n if (this.timer !== null) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n\n /** Exposed for test ergonomics — runs one full append+prune cycle. */\n async tick(): Promise<void> {\n if (this.tickPending) {\n // Log the skip so operators can detect a wedged getEarnings (hours of silent no-ops otherwise).\n this.opts.logger?.warn(\n { snapshotPath: this.opts.snapshotPath },\n 'snapshot writer: tick skipped — previous tick still in flight'\n );\n return;\n }\n this.tickPending = true;\n try {\n await this.runTick();\n } finally {\n this.tickPending = false;\n }\n }\n\n private async runTick(): Promise<void> {\n const now = (this.opts.now ?? (() => new Date()))();\n const tsMs = Math.floor(now.getTime() / 3_600_000) * 3_600_000;\n const ts = new Date(tsMs).toISOString();\n\n let earnings: Awaited<ReturnType<ConnectorAdminClient['getEarnings']>>;\n try {\n earnings = await this.opts.connectorAdmin.getEarnings();\n } catch (err) {\n this.opts.logger?.warn(\n { err },\n 'snapshot writer: getEarnings failed — skipping this tick'\n );\n return;\n }\n\n // Wrap append + prune so any fs error (ENOSPC, EACCES, EROFS, EIO, EXDEV)\n // is contained — the writer NEVER throws into the apex event loop.\n try {\n const entries: SnapshotEntry[] = [];\n for (const peer of earnings.peers ?? []) {\n if (peer.peerId === '__apex__') {\n // Defensive: a connector-side peer literally named '__apex__' would\n // collide with the apex routing-fee sentinel. Skip and warn once.\n this.opts.logger?.warn(\n { peerId: peer.peerId },\n 'snapshot writer: peer with reserved id \"__apex__\" — row dropped'\n );\n continue;\n }\n for (const a of peer.byAsset ?? []) {\n entries.push({\n ts,\n peerId: peer.peerId,\n assetCode: a.assetCode,\n claimsReceivedTotal: a.claimsReceivedTotal,\n });\n }\n }\n for (const fee of earnings.connectorFees ?? []) {\n entries.push({\n ts,\n peerId: '__apex__',\n assetCode: fee.assetCode,\n claimsReceivedTotal: fee.total,\n });\n }\n\n if (entries.length === 0) {\n // Nothing to write — but still try pruning.\n await this.pruneIfNeeded(now);\n return;\n }\n\n await this.appendEntries(entries);\n await this.pruneIfNeeded(now);\n } catch (err) {\n this.opts.logger?.warn(\n { err },\n 'snapshot writer: append/prune failed — skipping this tick'\n );\n }\n }\n\n private async appendEntries(entries: SnapshotEntry[]): Promise<void> {\n // Always mkdir + chmod: directory or file may be deleted between ticks\n // (operator cleanup, container restart). Both ops are cheap-idempotent.\n await fs.mkdir(dirname(this.opts.snapshotPath), {\n recursive: true,\n mode: 0o700,\n });\n\n const body = entries.map((e) => JSON.stringify(e)).join('\\n') + '\\n';\n await fs.appendFile(this.opts.snapshotPath, body, {\n encoding: 'utf-8',\n mode: 0o600,\n });\n // `appendFile`'s `mode` is ignored if the file already exists; chmod ensures\n // 0o600 on both first-create and subsequent appends.\n await fs.chmod(this.opts.snapshotPath, 0o600);\n }\n\n private async pruneIfNeeded(now: Date): Promise<void> {\n const WATERMARK = 256 * 1024; // 256 KB\n let stat: Awaited<ReturnType<typeof fs.stat>> | null = null;\n try {\n stat = await fs.stat(this.opts.snapshotPath);\n } catch {\n return; // File doesn't exist yet — nothing to prune.\n }\n if (stat.size < WATERMARK) return;\n\n const retentionMonths = this.opts.retentionMonths ?? 13;\n const cutoff = new Date(now);\n cutoff.setUTCMonth(cutoff.getUTCMonth() - retentionMonths);\n const cutoffMs = cutoff.getTime();\n\n let raw: string;\n try {\n raw = await fs.readFile(this.opts.snapshotPath, 'utf-8');\n } catch {\n return;\n }\n\n const lines = raw.split('\\n').filter((l) => l.length > 0);\n let anyDropped = false;\n const kept: string[] = [];\n for (const line of lines) {\n let entry: unknown;\n try {\n entry = JSON.parse(line);\n } catch {\n anyDropped = true;\n continue; // drop malformed line (lazy compaction)\n }\n if (!isSnapshotEntry(entry)) {\n anyDropped = true;\n continue;\n }\n const entryMs = new Date(entry.ts).getTime();\n if (isNaN(entryMs) || entryMs < cutoffMs) {\n anyDropped = true;\n } else {\n kept.push(line);\n }\n }\n\n if (!anyDropped) return; // No rewrite needed.\n\n const tmpPath = `${this.opts.snapshotPath}.tmp`;\n const newContent = kept.length > 0 ? kept.join('\\n') + '\\n' : '';\n await fs.writeFile(tmpPath, newContent, { encoding: 'utf-8', mode: 0o600 });\n await fs.rename(tmpPath, this.opts.snapshotPath);\n await fs.chmod(this.opts.snapshotPath, 0o600);\n }\n}\n\nfunction isSnapshotEntry(v: unknown): v is SnapshotEntry {\n if (typeof v !== 'object' || v === null) return false;\n const e = v as Record<string, unknown>;\n return (\n typeof e['ts'] === 'string' &&\n typeof e['peerId'] === 'string' &&\n typeof e['assetCode'] === 'string' &&\n typeof e['claimsReceivedTotal'] === 'string'\n );\n}\n","/**\n * Wallet file I/O for Townhouse (Story 21.4, Task 2.2).\n *\n * Persists encrypted wallet to disk with 0o600 permissions (owner-only).\n * Warns if existing file has world-readable permissions.\n */\n\nimport { writeFile, readFile, mkdir, stat } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport type { EncryptedWallet } from './types.js';\n\n/**\n * Save encrypted wallet to disk with restrictive permissions.\n * Creates parent directory if missing.\n */\nexport async function saveWallet(\n path: string,\n encrypted: EncryptedWallet\n): Promise<void> {\n const dir = dirname(path);\n await mkdir(dir, { recursive: true, mode: 0o700 });\n\n const data = JSON.stringify(encrypted, null, 2);\n await writeFile(path, data, { encoding: 'utf-8', mode: 0o600 });\n}\n\n/**\n * Load encrypted wallet from disk.\n * Returns null if file does not exist.\n * Warns (via returned flag) if file permissions are too open.\n */\nexport async function loadWallet(\n path: string\n): Promise<{ wallet: EncryptedWallet; permissionsWarning?: string } | null> {\n let data: string;\n try {\n data = await readFile(path, 'utf-8');\n } catch (err: unknown) {\n if (\n err instanceof Error &&\n 'code' in err &&\n (err as NodeJS.ErrnoException).code === 'ENOENT'\n ) {\n return null;\n }\n throw err;\n }\n\n // Check permissions\n let permissionsWarning: string | undefined;\n try {\n const stats = await stat(path);\n const mode = stats.mode & 0o777;\n if (mode & 0o077) {\n permissionsWarning = `Warning: wallet file ${path} has permissions ${mode.toString(8)} (should be 600)`;\n }\n } catch {\n // stat failure is non-fatal — skip permissions check\n }\n\n const wallet = JSON.parse(data) as EncryptedWallet;\n return { wallet, permissionsWarning };\n}\n","/**\n * Wallet encryption/decryption for Townhouse (Story 21.4, Task 2).\n *\n * Uses Node.js crypto: scrypt for KDF, AES-256-GCM for authenticated encryption.\n * The mnemonic is the plaintext being encrypted.\n */\n\nimport {\n scryptSync,\n createCipheriv,\n createDecipheriv,\n randomBytes,\n} from 'node:crypto';\nimport type { ArweaveJwk, EncryptedWallet } from './types.js';\n\n/** scrypt parameters — N=2^17 (~0.5-1s on modern hardware), r=8, p=1 */\nconst SCRYPT_N = 2 ** 17;\nconst SCRYPT_R = 8;\nconst SCRYPT_P = 1;\nconst SCRYPT_KEY_LEN = 32;\n/** maxmem for scrypt: N * r * 128 * 2 (with headroom for Node.js overhead) */\nconst SCRYPT_MAXMEM = SCRYPT_N * SCRYPT_R * 256 + 32 * 1024 * 1024;\n\n/** Salt length in bytes */\nconst SALT_LEN = 32;\n\n/** AES-GCM IV length in bytes */\nconst IV_LEN = 12;\n\n/** AES-GCM authentication tag length in bytes (128-bit) */\nconst AUTH_TAG_LEN = 16;\n\n/**\n * Encrypt a mnemonic with a password using scrypt + AES-256-GCM.\n */\nexport function encryptWallet(\n mnemonic: string,\n password: string\n): EncryptedWallet {\n const salt = randomBytes(SALT_LEN);\n const iv = randomBytes(IV_LEN);\n\n const key = scryptSync(password, salt, SCRYPT_KEY_LEN, {\n N: SCRYPT_N,\n r: SCRYPT_R,\n p: SCRYPT_P,\n maxmem: SCRYPT_MAXMEM,\n });\n\n try {\n const cipher = createCipheriv('aes-256-gcm', key, iv, {\n authTagLength: AUTH_TAG_LEN,\n });\n const ciphertext = Buffer.concat([\n cipher.update(mnemonic, 'utf8'),\n cipher.final(),\n ]);\n const tag = cipher.getAuthTag();\n\n return {\n salt: salt.toString('base64'),\n iv: iv.toString('base64'),\n ciphertext: ciphertext.toString('base64'),\n tag: tag.toString('base64'),\n };\n } finally {\n key.fill(0);\n }\n}\n\n/**\n * Decrypt an encrypted wallet with a password.\n * Throws on wrong password (GCM auth tag verification failure).\n */\nexport function decryptWallet(\n encrypted: EncryptedWallet,\n password: string\n): string {\n const salt = Buffer.from(encrypted.salt, 'base64');\n const iv = Buffer.from(encrypted.iv, 'base64');\n const ciphertext = Buffer.from(encrypted.ciphertext, 'base64');\n const tag = Buffer.from(encrypted.tag, 'base64');\n\n const key = scryptSync(password, salt, SCRYPT_KEY_LEN, {\n N: SCRYPT_N,\n r: SCRYPT_R,\n p: SCRYPT_P,\n maxmem: SCRYPT_MAXMEM,\n });\n\n try {\n const decipher = createDecipheriv('aes-256-gcm', key, iv, {\n authTagLength: AUTH_TAG_LEN,\n });\n decipher.setAuthTag(tag);\n\n try {\n const plaintext = Buffer.concat([\n decipher.update(ciphertext),\n decipher.final(),\n ]);\n return plaintext.toString('utf8');\n } catch {\n throw new Error(\n 'Decryption failed: wrong password or corrupted wallet file'\n );\n }\n } finally {\n key.fill(0);\n }\n}\n\n/**\n * Generic string encryption — same envelope as encryptWallet, used by the\n * Arweave JWK cache (epic-49 Followup A) and any future caller that wants\n * to reuse the scrypt+AES-256-GCM primitive without committing to mnemonic\n * semantics.\n */\nexport function encryptString(\n plaintext: string,\n password: string\n): EncryptedWallet {\n const salt = randomBytes(SALT_LEN);\n const iv = randomBytes(IV_LEN);\n const key = scryptSync(password, salt, SCRYPT_KEY_LEN, {\n N: SCRYPT_N,\n r: SCRYPT_R,\n p: SCRYPT_P,\n maxmem: SCRYPT_MAXMEM,\n });\n try {\n const cipher = createCipheriv('aes-256-gcm', key, iv, {\n authTagLength: AUTH_TAG_LEN,\n });\n const ciphertext = Buffer.concat([\n cipher.update(plaintext, 'utf8'),\n cipher.final(),\n ]);\n const tag = cipher.getAuthTag();\n return {\n salt: salt.toString('base64'),\n iv: iv.toString('base64'),\n ciphertext: ciphertext.toString('base64'),\n tag: tag.toString('base64'),\n };\n } finally {\n key.fill(0);\n }\n}\n\n/** Inverse of encryptString. Throws on wrong password / corruption. */\nexport function decryptString(\n encrypted: EncryptedWallet,\n password: string\n): string {\n const salt = Buffer.from(encrypted.salt, 'base64');\n const iv = Buffer.from(encrypted.iv, 'base64');\n const ciphertext = Buffer.from(encrypted.ciphertext, 'base64');\n const tag = Buffer.from(encrypted.tag, 'base64');\n const key = scryptSync(password, salt, SCRYPT_KEY_LEN, {\n N: SCRYPT_N,\n r: SCRYPT_R,\n p: SCRYPT_P,\n maxmem: SCRYPT_MAXMEM,\n });\n try {\n const decipher = createDecipheriv('aes-256-gcm', key, iv, {\n authTagLength: AUTH_TAG_LEN,\n });\n decipher.setAuthTag(tag);\n try {\n const plaintext = Buffer.concat([\n decipher.update(ciphertext),\n decipher.final(),\n ]);\n return plaintext.toString('utf8');\n } catch {\n throw new Error(\n 'Decryption failed: wrong password or corrupted ciphertext'\n );\n }\n } finally {\n key.fill(0);\n }\n}\n\n/** Encrypt an Arweave RSA JWK under the operator password (epic-49 Followup A). */\nexport function encryptArweaveJwk(\n jwk: ArweaveJwk,\n password: string\n): EncryptedWallet {\n return encryptString(JSON.stringify(jwk), password);\n}\n\n/**\n * Decrypt an Arweave RSA JWK previously produced by `encryptArweaveJwk`.\n * Throws if the password is wrong, ciphertext is corrupt, or the plaintext\n * is not a well-formed JWK (missing `kty`/`n`/`e`).\n */\nexport function decryptArweaveJwk(\n encrypted: EncryptedWallet,\n password: string\n): ArweaveJwk {\n const plaintext = decryptString(encrypted, password);\n let parsed: unknown;\n try {\n parsed = JSON.parse(plaintext);\n } catch {\n throw new Error(\n 'Arweave JWK cache is corrupt: plaintext is not valid JSON'\n );\n }\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n (parsed as { kty?: unknown }).kty !== 'RSA' ||\n typeof (parsed as { n?: unknown }).n !== 'string' ||\n typeof (parsed as { e?: unknown }).e !== 'string'\n ) {\n throw new Error(\n 'Arweave JWK cache is corrupt: plaintext is not a well-formed RSA JWK'\n );\n }\n return parsed as ArweaveJwk;\n}\n","/**\n * Image manifest reader for Townhouse (Story 46.2).\n *\n * `~/.townhouse/image-manifest.json` is materialized by `compose-loader.ts`\n * during `townhouse hs up`. It maps node types to their digest-pinned image\n * refs, consumed by `POST /api/nodes` step 2 (pull image).\n */\n\nimport { promises as fs } from 'node:fs';\nimport { z } from 'zod';\n\nconst ImageEntrySchema = z\n .object({\n name: z.string().min(1),\n tag: z.string().min(1),\n digest: z.string().regex(/^sha256:[0-9a-f]{64}$/),\n })\n .strict();\n\nexport const ImageManifestSchema = z\n .object({\n schemaVersion: z.literal(1),\n townhouseVersion: z.string(),\n builtAt: z.string().datetime({ offset: true }),\n images: z\n .object({\n 'townhouse-api': ImageEntrySchema,\n town: ImageEntrySchema,\n mill: ImageEntrySchema,\n dvm: ImageEntrySchema,\n connector: ImageEntrySchema,\n })\n .strict(),\n })\n .strict();\n\nexport type ImageManifest = z.infer<typeof ImageManifestSchema>;\n\n/**\n * Sentinel digest used by `.github/workflows/connector-publish-smoke.yml`\n * to populate the four non-connector entries of a synthetic\n * `image-manifest.json` it writes when the operator supplies\n * `connector_digest` for a candidate connector tag.\n *\n * The smoke workflow only validates the CONNECTOR entry; the four other\n * entries exist purely to satisfy `ImageManifestSchema.strict()`. Any future\n * per-image alignment check MUST treat this value as \"not a real registry\n * digest\" and skip the comparison rather than fail. Recognize via either\n * literal equality or `isSyntheticDigest(d)`.\n */\nexport const SYNTHETIC_DIGEST_SENTINEL =\n 'sha256:dead000000000000000000000000000000000000000000000000000000000000';\n\n/** True iff the digest is the synthetic sentinel produced by the smoke workflow. */\nexport function isSyntheticDigest(digest: string): boolean {\n return digest === SYNTHETIC_DIGEST_SENTINEL;\n}\n\n/**\n * Read and validate `image-manifest.json` at the given path.\n *\n * Throws ENOENT if the file is missing — there is no graceful fallback for a\n * missing manifest; it means `townhouse hs up` was not run first.\n * Throws `ZodError` with a useful path if the file is present but invalid.\n */\nexport async function readImageManifest(path: string): Promise<ImageManifest> {\n const raw = await fs.readFile(path, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n return ImageManifestSchema.parse(parsed);\n}\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number, title: string = ''): void {\n if (!Number.isSafeInteger(n) || n < 0) {\n const prefix = title && `\"${title}\" `;\n throw new Error(`${prefix}expected integer >= 0, got ${n}`);\n }\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(value: Uint8Array, length?: number, title: string = ''): Uint8Array {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n}\n\n/** Asserts something is hash */\nexport function ahash(h: CHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash must wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out, undefined, 'digestInto() output');\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('\"digestInto() output\" expected to be of length >=' + min);\n }\n}\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word: number, shift: number): number {\n return (word << (32 - shift)) | (word >>> shift);\n}\n\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word: number, shift: number): number {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n/** The byte swap operation for uint32 */\nexport function byteSwap(word: number): number {\n return (\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff)\n );\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE: (n: number) => number = isLE\n ? (n: number) => n\n : (n: number) => byteSwap(n);\n\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr: Uint32Array): Uint32Array {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\n\nexport const swap32IfBE: (u: Uint32Array) => Uint32Array = isLE\n ? (u: Uint32Array) => u\n : byteSwap32;\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async (): Promise<void> => {};\n\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(\n iters: number,\n tick: number,\n cb: (i: number) => void\n): Promise<void> {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick) continue;\n await nextTick();\n ts += diff;\n }\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * Built-in doesn't validate input to be string: we do the check.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\n\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data: KDFInput, errorTitle = ''): Uint8Array {\n if (typeof data === 'string') return utf8ToBytes(data);\n return abytes(data, undefined, errorTitle);\n}\n\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\ntype EmptyObj = {};\n/** Merges default options and passed options. */\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options must be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Common interface for all hashes. */\nexport interface Hash<T> {\n blockLen: number; // Bytes per block\n outputLen: number; // Bytes in output\n update(buf: Uint8Array): this;\n digestInto(buf: Uint8Array): void;\n digest(): Uint8Array;\n destroy(): void;\n _cloneInto(to?: T): T;\n clone(): T;\n}\n\n/** PseudoRandom (number) Generator */\nexport interface PRG {\n addEntropy(seed: Uint8Array): void;\n randomBytes(length: number): Uint8Array;\n clean(): void;\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\n/** Hash constructor */\nexport type HasherCons<T, Opts = undefined> = Opts extends undefined ? () => T : (opts?: Opts) => T;\n/** Optional hash params. */\nexport type HashInfo = {\n oid?: Uint8Array; // DER encoded OID in bytes\n};\n/** Hash function */\nexport type CHash<T extends Hash<T> = Hash<any>, Opts = undefined> = {\n outputLen: number;\n blockLen: number;\n} & HashInfo &\n (Opts extends undefined\n ? {\n (msg: Uint8Array): Uint8Array;\n create(): T;\n }\n : {\n (msg: Uint8Array, opts?: Opts): Uint8Array;\n create(opts?: Opts): T;\n });\n/** XOF with output */\nexport type CHashXOF<T extends HashXOF<T> = HashXOF<any>, Opts = undefined> = CHash<T, Opts>;\n\n/** Creates function with outputLen, blockLen, create properties from a class constructor. */\nexport function createHasher<T extends Hash<T>, Opts = undefined>(\n hashCons: HasherCons<T, Opts>,\n info: HashInfo = {}\n): CHash<T, Opts> {\n const hashC: any = (msg: Uint8Array, opts?: Opts) => hashCons(opts).update(msg).digest();\n const tmp = hashCons(undefined);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: Opts) => hashCons(opts);\n Object.assign(hashC, info);\n return Object.freeze(hashC);\n}\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n const cr = typeof globalThis === 'object' ? (globalThis as any).crypto : null;\n if (typeof cr?.getRandomValues !== 'function')\n throw new Error('crypto.getRandomValues must be defined');\n return cr.getRandomValues(new Uint8Array(bytesLength));\n}\n\n/** Creates OID opts for NIST hashes, with prefix 06 09 60 86 48 01 65 03 04 02. */\nexport const oidNist = (suffix: number): Required<HashInfo> => ({\n oid: Uint8Array.from([0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, suffix]),\n});\n","/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean, type CHash, type Hash } from './utils.ts';\n\n/** Internal class for HMAC. */\nexport class _HMAC<T extends Hash<T>> implements Hash<_HMAC<T>> {\n oHash: T;\n iHash: T;\n blockLen: number;\n outputLen: number;\n private finished = false;\n private destroyed = false;\n\n constructor(hash: CHash, key: Uint8Array) {\n ahash(hash);\n abytes(key, undefined, 'key');\n this.iHash = hash.create() as T;\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create() as T;\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n clean(pad);\n }\n update(buf: Uint8Array): this {\n aexists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n abytes(out, this.outputLen, 'output');\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest(): Uint8Array {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to?: _HMAC<T>): _HMAC<T> {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to ||= Object.create(Object.getPrototypeOf(this), {});\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to as this;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone(): _HMAC<T> {\n return this._cloneInto();\n }\n destroy(): void {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac: {\n (hash: CHash, key: Uint8Array, message: Uint8Array): Uint8Array;\n create(hash: CHash, key: Uint8Array): _HMAC<any>;\n} = (hash: CHash, key: Uint8Array, message: Uint8Array): Uint8Array =>\n new _HMAC<any>(hash, key).update(message).digest();\nhmac.create = (hash: CHash, key: Uint8Array) => new _HMAC<any>(hash, key);\n","/**\n * PBKDF (RFC 2898). Can be used to create a key from password and salt.\n * @module\n */\nimport { hmac } from './hmac.ts';\n// prettier-ignore\nimport {\n ahash, anumber,\n asyncLoop, checkOpts, clean, createView, kdfInputToBytes,\n type CHash,\n type Hash,\n type KDFInput\n} from './utils.ts';\n\n/**\n * PBKDF2 options:\n * * c: iterations, should probably be higher than 100_000\n * * dkLen: desired length of derived key in bytes\n * * asyncTick: max time in ms for which async function can block execution\n */\nexport type Pbkdf2Opt = {\n c: number;\n dkLen?: number;\n asyncTick?: number;\n};\n// Common start and end for sync/async functions\nfunction pbkdf2Init(hash: CHash, _password: KDFInput, _salt: KDFInput, _opts: Pbkdf2Opt) {\n ahash(hash);\n const opts = checkOpts({ dkLen: 32, asyncTick: 10 }, _opts);\n const { c, dkLen, asyncTick } = opts;\n anumber(c, 'c');\n anumber(dkLen, 'dkLen');\n anumber(asyncTick, 'asyncTick');\n if (c < 1) throw new Error('iterations (c) must be >= 1');\n const password = kdfInputToBytes(_password, 'password');\n const salt = kdfInputToBytes(_salt, 'salt');\n // DK = PBKDF2(PRF, Password, Salt, c, dkLen);\n const DK = new Uint8Array(dkLen);\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n const PRF = hmac.create(hash, password);\n const PRFSalt = PRF._cloneInto().update(salt);\n return { c, dkLen, asyncTick, DK, PRF, PRFSalt };\n}\n\nfunction pbkdf2Output<T extends Hash<T>>(\n PRF: Hash<T>,\n PRFSalt: Hash<T>,\n DK: Uint8Array,\n prfW: Hash<T>,\n u: Uint8Array\n) {\n PRF.destroy();\n PRFSalt.destroy();\n if (prfW) prfW.destroy();\n clean(u);\n return DK;\n}\n\n/**\n * PBKDF2-HMAC: RFC 2898 key derivation function\n * @param hash - hash function that would be used e.g. sha256\n * @param password - password from which a derived key is generated\n * @param salt - cryptographic salt\n * @param opts - {c, dkLen} where c is work factor and dkLen is output message size\n * @example\n * const key = pbkdf2(sha256, 'password', 'salt', { dkLen: 32, c: Math.pow(2, 18) });\n */\nexport function pbkdf2(\n hash: CHash,\n password: KDFInput,\n salt: KDFInput,\n opts: Pbkdf2Opt\n): Uint8Array {\n const { c, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);\n let prfW: any; // Working copy\n const arr = new Uint8Array(4);\n const view = createView(arr);\n const u = new Uint8Array(PRF.outputLen);\n // DK = T1 + T2 + ⋯ + Tdklen/hlen\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n // Ti = F(Password, Salt, c, i)\n const Ti = DK.subarray(pos, pos + PRF.outputLen);\n view.setInt32(0, ti, false);\n // F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);\n Ti.set(u.subarray(0, Ti.length));\n for (let ui = 1; ui < c; ui++) {\n // Uc = PRF(Password, Uc−1)\n PRF._cloneInto(prfW).update(u).digestInto(u);\n for (let i = 0; i < Ti.length; i++) Ti[i] ^= u[i];\n }\n }\n return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);\n}\n\n/**\n * PBKDF2-HMAC: RFC 2898 key derivation function. Async version.\n * @example\n * await pbkdf2Async(sha256, 'password', 'salt', { dkLen: 32, c: 500_000 });\n */\nexport async function pbkdf2Async(\n hash: CHash,\n password: KDFInput,\n salt: KDFInput,\n opts: Pbkdf2Opt\n): Promise<Uint8Array> {\n const { c, dkLen, asyncTick, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);\n let prfW: any; // Working copy\n const arr = new Uint8Array(4);\n const view = createView(arr);\n const u = new Uint8Array(PRF.outputLen);\n // DK = T1 + T2 + ⋯ + Tdklen/hlen\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n // Ti = F(Password, Salt, c, i)\n const Ti = DK.subarray(pos, pos + PRF.outputLen);\n view.setInt32(0, ti, false);\n // F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);\n Ti.set(u.subarray(0, Ti.length));\n await asyncLoop(c - 1, asyncTick, () => {\n // Uc = PRF(Password, Uc−1)\n PRF._cloneInto(prfW).update(u).digestInto(u);\n for (let i = 0; i < Ti.length; i++) Ti[i] ^= u[i];\n });\n }\n return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);\n}\n","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { abytes, aexists, aoutput, clean, createView, type Hash } from './utils.ts';\n\n/** Choice: a ? b : c */\nexport function Chi(a: number, b: number, c: number): number {\n return (a & b) ^ (~a & c);\n}\n\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a: number, b: number, c: number): number {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport abstract class HashMD<T extends HashMD<T>> implements Hash<T> {\n protected abstract process(buf: DataView, offset: number): void;\n protected abstract get(): number[];\n protected abstract set(...args: number[]): void;\n abstract destroy(): void;\n protected abstract roundClean(): void;\n\n readonly blockLen: number;\n readonly outputLen: number;\n readonly padOffset: number;\n readonly isLE: boolean;\n\n // For partial updates less than block size\n protected buffer: Uint8Array;\n protected view: DataView;\n protected finished = false;\n protected length = 0;\n protected pos = 0;\n protected destroyed = false;\n\n constructor(blockLen: number, outputLen: number, padOffset: number, isLE: boolean) {\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data: Uint8Array): this {\n aexists(this);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen) this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++) buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n view.setBigUint64(blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which must be fused in single op with modulo by JIT\n if (len % 4) throw new Error('_sha2: outputLen must be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length) throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++) oview.setUint32(4 * i, state[i], isLE);\n }\n digest(): Uint8Array {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to?: T): T {\n to ||= new (this.constructor as any)() as T;\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen) to.buffer.set(buffer);\n return to as unknown as any;\n }\n clone(): T {\n return this._cloneInto();\n }\n}\n\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n\nfunction fromBig(\n n: bigint,\n le = false\n): {\n h: number;\n l: number;\n} {\n if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n\nfunction split(lst: bigint[], le = false): Uint32Array[] {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\n\nconst toBig = (h: number, l: number): bigint => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h: number, _l: number, s: number): number => h >>> s;\nconst shrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h: number, l: number, s: number): number => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h: number, l: number, s: number): number => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h: number, l: number, s: number): number => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h: number, l: number): number => l;\nconst rotr32L = (h: number, _l: number): number => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h: number, l: number, s: number): number => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h: number, l: number, s: number): number => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h: number, l: number, s: number): number => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h: number, l: number, s: number): number => (h << (s - 32)) | (l >>> (64 - s));\n\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(\n Ah: number,\n Al: number,\n Bh: number,\n Bl: number\n): {\n h: number;\n l: number;\n} {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al: number, Bl: number, Cl: number): number => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number): number =>\n (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number): number =>\n (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number): number =>\n (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n\n// prettier-ignore\nexport {\n add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig\n};\n// prettier-ignore\nconst u64: { fromBig: typeof fromBig; split: typeof split; toBig: (h: number, l: number) => bigint; shrSH: (h: number, _l: number, s: number) => number; shrSL: (h: number, l: number, s: number) => number; rotrSH: (h: number, l: number, s: number) => number; rotrSL: (h: number, l: number, s: number) => number; rotrBH: (h: number, l: number, s: number) => number; rotrBL: (h: number, l: number, s: number) => number; rotr32H: (_h: number, l: number) => number; rotr32L: (h: number, _l: number) => number; rotlSH: (h: number, l: number, s: number) => number; rotlSL: (h: number, l: number, s: number) => number; rotlBH: (h: number, l: number, s: number) => number; rotlBL: (h: number, l: number, s: number) => number; add: typeof add; add3L: (Al: number, Bl: number, Cl: number) => number; add3H: (low: number, Ah: number, Bh: number, Ch: number) => number; add4L: (Al: number, Bl: number, Cl: number, Dl: number) => number; add4H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number) => number; add5H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) => number; add5L: (Al: number, Bl: number, Cl: number, Dl: number, El: number) => number; } = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://www.rfc-editor.org/rfc/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from './_md.ts';\nimport * as u64 from './_u64.ts';\nimport { type CHash, clean, createHasher, oidNist, rotr } from './utils.ts';\n\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\n\n/** Internal 32-byte base SHA2 hash class. */\nabstract class SHA2_32B<T extends SHA2_32B<T>> extends HashMD<T> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected abstract A: number;\n protected abstract B: number;\n protected abstract C: number;\n protected abstract D: number;\n protected abstract E: number;\n protected abstract F: number;\n protected abstract G: number;\n protected abstract H: number;\n\n constructor(outputLen: number) {\n super(64, outputLen, 8, false);\n }\n protected get(): [number, number, number, number, number, number, number, number] {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n protected set(\n A: number, B: number, C: number, D: number, E: number, F: number, G: number, H: number\n ): void {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n protected roundClean(): void {\n clean(SHA256_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\n/** Internal SHA2-256 hash class. */\nexport class _SHA256 extends SHA2_32B<_SHA256> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected A: number = SHA256_IV[0] | 0;\n protected B: number = SHA256_IV[1] | 0;\n protected C: number = SHA256_IV[2] | 0;\n protected D: number = SHA256_IV[3] | 0;\n protected E: number = SHA256_IV[4] | 0;\n protected F: number = SHA256_IV[5] | 0;\n protected G: number = SHA256_IV[6] | 0;\n protected H: number = SHA256_IV[7] | 0;\n constructor() {\n super(32);\n }\n}\n\n/** Internal SHA2-224 hash class. */\nexport class _SHA224 extends SHA2_32B<_SHA224> {\n protected A: number = SHA224_IV[0] | 0;\n protected B: number = SHA224_IV[1] | 0;\n protected C: number = SHA224_IV[2] | 0;\n protected D: number = SHA224_IV[3] | 0;\n protected E: number = SHA224_IV[4] | 0;\n protected F: number = SHA224_IV[5] | 0;\n protected G: number = SHA224_IV[6] | 0;\n protected H: number = SHA224_IV[7] | 0;\n constructor() {\n super(28);\n }\n}\n\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n\n/** Internal 64-byte base SHA2 hash class. */\nabstract class SHA2_64B<T extends SHA2_64B<T>> extends HashMD<T> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n protected abstract Ah: number;\n protected abstract Al: number;\n protected abstract Bh: number;\n protected abstract Bl: number;\n protected abstract Ch: number;\n protected abstract Cl: number;\n protected abstract Dh: number;\n protected abstract Dl: number;\n protected abstract Eh: number;\n protected abstract El: number;\n protected abstract Fh: number;\n protected abstract Fl: number;\n protected abstract Gh: number;\n protected abstract Gl: number;\n protected abstract Hh: number;\n protected abstract Hl: number;\n\n constructor(outputLen: number) {\n super(128, outputLen, 16, false);\n }\n // prettier-ignore\n protected get(): [\n number, number, number, number, number, number, number, number,\n number, number, number, number, number, number, number, number\n ] {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n protected set(\n Ah: number, Al: number, Bh: number, Bl: number, Ch: number, Cl: number, Dh: number, Dl: number,\n Eh: number, El: number, Fh: number, Fl: number, Gh: number, Gl: number, Hh: number, Hl: number\n ): void {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n protected roundClean(): void {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy(): void {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n\n/** Internal SHA2-512 hash class. */\nexport class _SHA512 extends SHA2_64B<_SHA512> {\n protected Ah: number = SHA512_IV[0] | 0;\n protected Al: number = SHA512_IV[1] | 0;\n protected Bh: number = SHA512_IV[2] | 0;\n protected Bl: number = SHA512_IV[3] | 0;\n protected Ch: number = SHA512_IV[4] | 0;\n protected Cl: number = SHA512_IV[5] | 0;\n protected Dh: number = SHA512_IV[6] | 0;\n protected Dl: number = SHA512_IV[7] | 0;\n protected Eh: number = SHA512_IV[8] | 0;\n protected El: number = SHA512_IV[9] | 0;\n protected Fh: number = SHA512_IV[10] | 0;\n protected Fl: number = SHA512_IV[11] | 0;\n protected Gh: number = SHA512_IV[12] | 0;\n protected Gl: number = SHA512_IV[13] | 0;\n protected Hh: number = SHA512_IV[14] | 0;\n protected Hl: number = SHA512_IV[15] | 0;\n\n constructor() {\n super(64);\n }\n}\n\n/** Internal SHA2-384 hash class. */\nexport class _SHA384 extends SHA2_64B<_SHA384> {\n protected Ah: number = SHA384_IV[0] | 0;\n protected Al: number = SHA384_IV[1] | 0;\n protected Bh: number = SHA384_IV[2] | 0;\n protected Bl: number = SHA384_IV[3] | 0;\n protected Ch: number = SHA384_IV[4] | 0;\n protected Cl: number = SHA384_IV[5] | 0;\n protected Dh: number = SHA384_IV[6] | 0;\n protected Dl: number = SHA384_IV[7] | 0;\n protected Eh: number = SHA384_IV[8] | 0;\n protected El: number = SHA384_IV[9] | 0;\n protected Fh: number = SHA384_IV[10] | 0;\n protected Fl: number = SHA384_IV[11] | 0;\n protected Gh: number = SHA384_IV[12] | 0;\n protected Gl: number = SHA384_IV[13] | 0;\n protected Hh: number = SHA384_IV[14] | 0;\n protected Hl: number = SHA384_IV[15] | 0;\n\n constructor() {\n super(48);\n }\n}\n\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n\n/** Internal SHA2-512/224 hash class. */\nexport class _SHA512_224 extends SHA2_64B<_SHA512_224> {\n protected Ah: number = T224_IV[0] | 0;\n protected Al: number = T224_IV[1] | 0;\n protected Bh: number = T224_IV[2] | 0;\n protected Bl: number = T224_IV[3] | 0;\n protected Ch: number = T224_IV[4] | 0;\n protected Cl: number = T224_IV[5] | 0;\n protected Dh: number = T224_IV[6] | 0;\n protected Dl: number = T224_IV[7] | 0;\n protected Eh: number = T224_IV[8] | 0;\n protected El: number = T224_IV[9] | 0;\n protected Fh: number = T224_IV[10] | 0;\n protected Fl: number = T224_IV[11] | 0;\n protected Gh: number = T224_IV[12] | 0;\n protected Gl: number = T224_IV[13] | 0;\n protected Hh: number = T224_IV[14] | 0;\n protected Hl: number = T224_IV[15] | 0;\n\n constructor() {\n super(28);\n }\n}\n\n/** Internal SHA2-512/256 hash class. */\nexport class _SHA512_256 extends SHA2_64B<_SHA512_256> {\n protected Ah: number = T256_IV[0] | 0;\n protected Al: number = T256_IV[1] | 0;\n protected Bh: number = T256_IV[2] | 0;\n protected Bl: number = T256_IV[3] | 0;\n protected Ch: number = T256_IV[4] | 0;\n protected Cl: number = T256_IV[5] | 0;\n protected Dh: number = T256_IV[6] | 0;\n protected Dl: number = T256_IV[7] | 0;\n protected Eh: number = T256_IV[8] | 0;\n protected El: number = T256_IV[9] | 0;\n protected Fh: number = T256_IV[10] | 0;\n protected Fl: number = T256_IV[11] | 0;\n protected Gh: number = T256_IV[12] | 0;\n protected Gl: number = T256_IV[13] | 0;\n protected Hh: number = T256_IV[14] | 0;\n protected Hl: number = T256_IV[15] | 0;\n\n constructor() {\n super(32);\n }\n}\n\n/**\n * SHA2-256 hash function from RFC 4634. In JS it's the fastest: even faster than Blake3. Some info:\n *\n * - Trying 2^128 hashes would get 50% chance of collision, using birthday attack.\n * - BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n * - Each sha256 hash is executing 2^18 bit operations.\n * - Good 2024 ASICs can do 200Th/sec with 3500 watts of power, corresponding to 2^36 hashes/joule.\n */\nexport const sha256: CHash<_SHA256> = /* @__PURE__ */ createHasher(\n () => new _SHA256(),\n /* @__PURE__ */ oidNist(0x01)\n);\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224: CHash<_SHA224> = /* @__PURE__ */ createHasher(\n () => new _SHA224(),\n /* @__PURE__ */ oidNist(0x04)\n);\n\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512: CHash<_SHA512> = /* @__PURE__ */ createHasher(\n () => new _SHA512(),\n /* @__PURE__ */ oidNist(0x03)\n);\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384: CHash<_SHA384> = /* @__PURE__ */ createHasher(\n () => new _SHA384(),\n /* @__PURE__ */ oidNist(0x02)\n);\n\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256: CHash<_SHA512_256> = /* @__PURE__ */ createHasher(\n () => new _SHA512_256(),\n /* @__PURE__ */ oidNist(0x06)\n);\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224: CHash<_SHA512_224> = /* @__PURE__ */ createHasher(\n () => new _SHA512_224(),\n /* @__PURE__ */ oidNist(0x05)\n);\n","/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\nexport interface Coder<F, T> {\n encode(from: F): T;\n decode(to: T): F;\n}\n\nexport interface BytesCoder extends Coder<Uint8Array, string> {\n encode: (data: Uint8Array) => string;\n decode: (str: string) => Uint8Array;\n}\n\nfunction isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b: Uint8Array | undefined): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n}\n\nfunction isArrayOf(isString: boolean, arr: any[]) {\n if (!Array.isArray(arr)) return false;\n if (arr.length === 0) return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n } else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\n\nfunction afn(input: Function): input is Function {\n if (typeof input !== 'function') throw new Error('function expected');\n return true;\n}\n\nfunction astr(label: string, input: unknown): input is string {\n if (typeof input !== 'string') throw new Error(`${label}: string expected`);\n return true;\n}\n\nfunction anumber(n: number): void {\n if (!Number.isSafeInteger(n)) throw new Error(`invalid integer: ${n}`);\n}\n\nfunction aArr(input: any[]) {\n if (!Array.isArray(input)) throw new Error('array expected');\n}\nfunction astrArr(label: string, input: string[]) {\n if (!isArrayOf(true, input)) throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label: string, input: number[]) {\n if (!isArrayOf(false, input)) throw new Error(`${label}: array of numbers expected`);\n}\n\n// TODO: some recusive type inference so it would check correct order of input/output inside rest?\n// like <string, number>, <number, bytes>, <bytes, float>\ntype Chain = [Coder<any, any>, ...Coder<any, any>[]];\n// Extract info from Coder type\ntype Input<F> = F extends Coder<infer T, any> ? T : never;\ntype Output<F> = F extends Coder<any, infer T> ? T : never;\n// Generic function for arrays\ntype First<T> = T extends [infer U, ...any[]] ? U : never;\ntype Last<T> = T extends [...any[], infer U] ? U : never;\ntype Tail<T> = T extends [any, ...infer U] ? U : never;\n\ntype AsChain<C extends Chain, Rest = Tail<C>> = {\n // C[K] = Coder<Input<C[K]>, Input<Rest[k]>>\n [K in keyof C]: Coder<Input<C[K]>, Input<K extends keyof Rest ? Rest[K] : any>>;\n};\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain<T extends Chain & AsChain<T>>(...args: T): Coder<Input<First<T>>, Output<Last<T>>> {\n const id = (a: any) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a: any, b: any) => (c: any) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters: string | string[]): Coder<number[], string[]> {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits: number[]) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(\n `alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`\n );\n return lettersA[i]!;\n });\n },\n decode: (input: string[]): number[] => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined) throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = ''): Coder<string[], string> {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits: number, chr = '='): Coder<string[], string[]> {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data: string[]): string[] {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8) data.push(chr);\n return data;\n },\n decode(input: string[]): string[] {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0) throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize<T>(fn: (val: T) => T): Coder<T, T> {\n afn(fn);\n return { encode: (from: T) => from, decode: (to: T) => fn(to) };\n}\n\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data: number[], from: number, to: number): number[] {\n // base 1 is impossible\n if (from < 2) throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2) throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length) return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from) throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i]!;\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (\n !Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry\n ) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done) continue;\n else if (!rounded) pos = i;\n else done = false;\n }\n res.push(carry);\n if (done) break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++) res.push(0);\n return res.reverse();\n}\n\nconst gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from: number, to: number) =>\n from + (to - gcd(from, to));\nconst powers: number[] = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++) res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data: number[], from: number, to: number, padding: boolean): number[] {\n aArr(data);\n if (from <= 0 || from > 32) throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32) throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(\n `convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`\n );\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from]!;\n const mask = powers[to]! - 1;\n const res: number[] = [];\n for (const n of data) {\n anumber(n);\n if (n >= max) throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32) throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to) res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined) throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from) throw new Error('Excess padding');\n if (!padding && carry > 0) throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0) res.push(carry >>> 0);\n return res;\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num: number): Coder<Uint8Array, number[]> {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits: number[]) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits: number, revPadding = false): Coder<Uint8Array, number[]> {\n anumber(bits);\n if (bits <= 0 || bits > 32) throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits: number[]) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\n\ntype ArgumentTypes<F extends Function> = F extends (...args: infer A) => any ? A : never;\nfunction unsafeWrapper<T extends (...args: any) => any>(fn: T) {\n afn(fn);\n return function (...args: ArgumentTypes<T>): ReturnType<T> | void {\n try {\n return fn.apply(null, args);\n } catch (e) {}\n };\n}\n\nfunction checksum(\n len: number,\n fn: (data: Uint8Array) => Uint8Array\n): Coder<Uint8Array, Uint8Array> {\n anumber(len);\n afn(fn);\n return {\n encode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i]) throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n\n// prettier-ignore\nexport const utils: { alphabet: typeof alphabet; chain: typeof chain; checksum: typeof checksum; convertRadix: typeof convertRadix; convertRadix2: typeof convertRadix2; radix: typeof radix; radix2: typeof radix2; join: typeof join; padding: typeof padding; } = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n\n// RFC 4648 aka RFC 3548\n// ---------------------\n\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16: BytesCoder = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'),\n join(''),\n normalize((s: string) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))\n);\n\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toBase64 === 'function' &&\n typeof (Uint8Array as any).fromBase64 === 'function')();\n\nconst decodeBase64Builtin = (s: string, isUrl: boolean) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s)) throw new Error('invalid base64');\n return (Uint8Array as any).fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n padding(6),\n join('')\n);\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n padding(6),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n join('')\n);\n\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc: string) =>\n chain(radix(58), alphabet(abc), join(''));\n\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58: BytesCoder = genBase58(\n '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n);\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr: BytesCoder = genBase58(\n '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n);\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp: BytesCoder = genBase58(\n 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'\n);\n\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr: BytesCoder = {\n encode(data: Uint8Array) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length]!, '1');\n }\n return res;\n },\n decode(str: string) {\n let res: number[] = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0) throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256: (data: Uint8Array) => Uint8Array): BytesCoder =>\n chain(\n checksum(4, (data) => sha256(sha256(data))),\n base58\n );\n\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check: (sha256: (data: Uint8Array) => Uint8Array) => BytesCoder =\n createBase58check;\n\n// Bech32 code\n// -----------\nexport interface Bech32Decoded<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n}\nexport interface Bech32DecodedWithArray<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n bytes: Uint8Array;\n}\n\nconst BECH_ALPHABET: Coder<number[], string> = chain(\n alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'),\n join('')\n);\n\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre: number): number {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1) chk ^= POLYMOD_GENERATORS[i]!;\n }\n return chk;\n}\n\nfunction bechChecksum(prefix: string, words: number[], encodingConst = 1): string {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126) throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++) chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words) chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++) chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]!], 30, 5, false));\n}\n\nexport interface Bech32 {\n encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit?: number | false\n ): `${Lowercase<Prefix>}1${string}`;\n decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n encodeFromBytes(prefix: string, bytes: Uint8Array): string;\n decodeToBytes(str: string): Bech32DecodedWithArray;\n decodeUnsafe(str: string, limit?: number | false): void | Bech32Decoded<string>;\n fromWords(to: number[]): Uint8Array;\n fromWordsUnsafe(to: number[]): void | Uint8Array;\n toWords(from: Uint8Array): number[];\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding: 'bech32' | 'bech32m'): Bech32 {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n\n function encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit: number | false = 90\n ): `${Lowercase<Prefix>}1${string}` {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words)) words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0) throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}` as `${Lowercase<Prefix>}1${string}`;\n }\n\n function decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n function decode(str: string, limit?: number | false): Bech32Decoded;\n function decode(str: string, limit: number | false = 90): Bech32Decoded {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6) throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum)) throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n\n const decodeUnsafe = unsafeWrapper(decode);\n\n function decodeToBytes(str: string): Bech32DecodedWithArray {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n\n function encodeFromBytes(prefix: string, bytes: Uint8Array) {\n return encode(prefix, toWords(bytes));\n }\n\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32: Bech32 = genBech32('bech32');\n\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m: Bech32 = genBech32('bech32m');\n\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8: BytesCoder = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toHex === 'function' &&\n typeof (Uint8Array as any).fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin: BytesCoder = {\n encode(data) { abytes(data); return (data as any).toHex(); },\n decode(s) { astr('hex', s); return (Uint8Array as any).fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex: BytesCoder = hasHexBuiltin\n ? hexBuiltin\n : chain(\n radix2(4),\n alphabet('0123456789abcdef'),\n join(''),\n normalize((s: string) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(\n `hex.decode: expected string, got ${typeof s} with length ${s.length}`\n );\n return s.toLowerCase();\n })\n );\n\nexport type SomeCoders = {\n utf8: BytesCoder;\n hex: BytesCoder;\n base16: BytesCoder;\n base32: BytesCoder;\n base64: BytesCoder;\n base64url: BytesCoder;\n base58: BytesCoder;\n base58xmr: BytesCoder;\n};\n// prettier-ignore\nconst CODERS: SomeCoders = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\ntype CoderType = keyof SomeCoders;\nconst coderTypeError =\n 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n\n/** @deprecated */\nexport const bytesToString = (type: CoderType, bytes: Uint8Array): string => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (!isBytes(bytes)) throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n\n/** @deprecated */\nexport const str: (type: CoderType, bytes: Uint8Array) => string = bytesToString; // as in python, but for bytes only\n\n/** @deprecated */\nexport const stringToBytes = (type: CoderType, str: string): Uint8Array => {\n if (!CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (typeof str !== 'string') throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes: (type: CoderType, str: string) => Uint8Array = stringToBytes;\n","/*! scure-bip39 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) */\nimport { pbkdf2, pbkdf2Async } from '@noble/hashes/pbkdf2.js';\nimport { sha256, sha512 } from '@noble/hashes/sha2.js';\nimport { abytes, anumber, randomBytes } from '@noble/hashes/utils.js';\nimport { pbkdf2 as pbkdf2web, sha512 as sha512web } from '@noble/hashes/webcrypto.js';\nimport { utils as baseUtils } from '@scure/base';\n// Japanese wordlist\nconst isJapanese = (wordlist) => wordlist[0] === '\\u3042\\u3044\\u3053\\u304f\\u3057\\u3093';\n// Normalization replaces equivalent sequences of characters\n// so that any two texts that are equivalent will be reduced\n// to the same sequence of code points, called the normal form of the original text.\n// https://tonsky.me/blog/unicode/#why-is-a----\nfunction nfkd(str) {\n if (typeof str !== 'string')\n throw new TypeError('invalid mnemonic type: ' + typeof str);\n return str.normalize('NFKD');\n}\nfunction normalize(str) {\n const norm = nfkd(str);\n const words = norm.split(' ');\n if (![12, 15, 18, 21, 24].includes(words.length))\n throw new Error('Invalid mnemonic');\n return { nfkd: norm, words };\n}\nfunction aentropy(ent) {\n abytes(ent);\n if (![16, 20, 24, 28, 32].includes(ent.length))\n throw new Error('invalid entropy length');\n}\n/**\n * Generate x random words. Uses Cryptographically-Secure Random Number Generator.\n * @param wordlist imported wordlist for specific language\n * @param strength mnemonic strength 128-256 bits\n * @example\n * generateMnemonic(wordlist, 128)\n * // 'legal winner thank year wave sausage worth useful legal winner thank yellow'\n */\nexport function generateMnemonic(wordlist, strength = 128) {\n anumber(strength);\n if (strength % 32 !== 0 || strength > 256)\n throw new TypeError('Invalid entropy');\n return entropyToMnemonic(randomBytes(strength / 8), wordlist);\n}\nconst calcChecksum = (entropy) => {\n // Checksum is ent.length/4 bits long\n const bitsLeft = 8 - entropy.length / 4;\n // Zero rightmost \"bitsLeft\" bits in byte\n // For example: bitsLeft=4 val=10111101 -> 10110000\n return new Uint8Array([(sha256(entropy)[0] >> bitsLeft) << bitsLeft]);\n};\nfunction getCoder(wordlist) {\n if (!Array.isArray(wordlist) || wordlist.length !== 2048 || typeof wordlist[0] !== 'string')\n throw new Error('Wordlist: expected array of 2048 strings');\n wordlist.forEach((i) => {\n if (typeof i !== 'string')\n throw new Error('wordlist: non-string element: ' + i);\n });\n return baseUtils.chain(baseUtils.checksum(1, calcChecksum), baseUtils.radix2(11, true), baseUtils.alphabet(wordlist));\n}\n/**\n * Reversible: Converts mnemonic string to raw entropy in form of byte array.\n * @param mnemonic 12-24 words\n * @param wordlist imported wordlist for specific language\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToEntropy(mnem, wordlist)\n * // Produces\n * new Uint8Array([\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f\n * ])\n */\nexport function mnemonicToEntropy(mnemonic, wordlist) {\n const { words } = normalize(mnemonic);\n const entropy = getCoder(wordlist).decode(words);\n aentropy(entropy);\n return entropy;\n}\n/**\n * Reversible: Converts raw entropy in form of byte array to mnemonic string.\n * @param entropy byte array\n * @param wordlist imported wordlist for specific language\n * @returns 12-24 words\n * @example\n * const ent = new Uint8Array([\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f\n * ]);\n * entropyToMnemonic(ent, wordlist);\n * // 'legal winner thank year wave sausage worth useful legal winner thank yellow'\n */\nexport function entropyToMnemonic(entropy, wordlist) {\n aentropy(entropy);\n const words = getCoder(wordlist).encode(entropy);\n return words.join(isJapanese(wordlist) ? '\\u3000' : ' ');\n}\n/**\n * Validates mnemonic for being 12-24 words contained in `wordlist`.\n */\nexport function validateMnemonic(mnemonic, wordlist) {\n try {\n mnemonicToEntropy(mnemonic, wordlist);\n }\n catch (e) {\n return false;\n }\n return true;\n}\nconst psalt = (passphrase) => nfkd('mnemonic' + passphrase);\n/**\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * await mnemonicToSeed(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeed(mnemonic, passphrase = '') {\n return pbkdf2Async(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n/**\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToSeedSync(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeedSync(mnemonic, passphrase = '') {\n return pbkdf2(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n/**\n * Uses native, built-in functionality, provided by globalThis.crypto.\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToSeedWebcrypto(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeedWebcrypto(mnemonic, passphrase = '') {\n return pbkdf2web(sha512web, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n","export const wordlist = `abandon\nability\nable\nabout\nabove\nabsent\nabsorb\nabstract\nabsurd\nabuse\naccess\naccident\naccount\naccuse\nachieve\nacid\nacoustic\nacquire\nacross\nact\naction\nactor\nactress\nactual\nadapt\nadd\naddict\naddress\nadjust\nadmit\nadult\nadvance\nadvice\naerobic\naffair\nafford\nafraid\nagain\nage\nagent\nagree\nahead\naim\nair\nairport\naisle\nalarm\nalbum\nalcohol\nalert\nalien\nall\nalley\nallow\nalmost\nalone\nalpha\nalready\nalso\nalter\nalways\namateur\namazing\namong\namount\namused\nanalyst\nanchor\nancient\nanger\nangle\nangry\nanimal\nankle\nannounce\nannual\nanother\nanswer\nantenna\nantique\nanxiety\nany\napart\napology\nappear\napple\napprove\napril\narch\narctic\narea\narena\nargue\narm\narmed\narmor\narmy\naround\narrange\narrest\narrive\narrow\nart\nartefact\nartist\nartwork\nask\naspect\nassault\nasset\nassist\nassume\nasthma\nathlete\natom\nattack\nattend\nattitude\nattract\nauction\naudit\naugust\naunt\nauthor\nauto\nautumn\naverage\navocado\navoid\nawake\naware\naway\nawesome\nawful\nawkward\naxis\nbaby\nbachelor\nbacon\nbadge\nbag\nbalance\nbalcony\nball\nbamboo\nbanana\nbanner\nbar\nbarely\nbargain\nbarrel\nbase\nbasic\nbasket\nbattle\nbeach\nbean\nbeauty\nbecause\nbecome\nbeef\nbefore\nbegin\nbehave\nbehind\nbelieve\nbelow\nbelt\nbench\nbenefit\nbest\nbetray\nbetter\nbetween\nbeyond\nbicycle\nbid\nbike\nbind\nbiology\nbird\nbirth\nbitter\nblack\nblade\nblame\nblanket\nblast\nbleak\nbless\nblind\nblood\nblossom\nblouse\nblue\nblur\nblush\nboard\nboat\nbody\nboil\nbomb\nbone\nbonus\nbook\nboost\nborder\nboring\nborrow\nboss\nbottom\nbounce\nbox\nboy\nbracket\nbrain\nbrand\nbrass\nbrave\nbread\nbreeze\nbrick\nbridge\nbrief\nbright\nbring\nbrisk\nbroccoli\nbroken\nbronze\nbroom\nbrother\nbrown\nbrush\nbubble\nbuddy\nbudget\nbuffalo\nbuild\nbulb\nbulk\nbullet\nbundle\nbunker\nburden\nburger\nburst\nbus\nbusiness\nbusy\nbutter\nbuyer\nbuzz\ncabbage\ncabin\ncable\ncactus\ncage\ncake\ncall\ncalm\ncamera\ncamp\ncan\ncanal\ncancel\ncandy\ncannon\ncanoe\ncanvas\ncanyon\ncapable\ncapital\ncaptain\ncar\ncarbon\ncard\ncargo\ncarpet\ncarry\ncart\ncase\ncash\ncasino\ncastle\ncasual\ncat\ncatalog\ncatch\ncategory\ncattle\ncaught\ncause\ncaution\ncave\nceiling\ncelery\ncement\ncensus\ncentury\ncereal\ncertain\nchair\nchalk\nchampion\nchange\nchaos\nchapter\ncharge\nchase\nchat\ncheap\ncheck\ncheese\nchef\ncherry\nchest\nchicken\nchief\nchild\nchimney\nchoice\nchoose\nchronic\nchuckle\nchunk\nchurn\ncigar\ncinnamon\ncircle\ncitizen\ncity\ncivil\nclaim\nclap\nclarify\nclaw\nclay\nclean\nclerk\nclever\nclick\nclient\ncliff\nclimb\nclinic\nclip\nclock\nclog\nclose\ncloth\ncloud\nclown\nclub\nclump\ncluster\nclutch\ncoach\ncoast\ncoconut\ncode\ncoffee\ncoil\ncoin\ncollect\ncolor\ncolumn\ncombine\ncome\ncomfort\ncomic\ncommon\ncompany\nconcert\nconduct\nconfirm\ncongress\nconnect\nconsider\ncontrol\nconvince\ncook\ncool\ncopper\ncopy\ncoral\ncore\ncorn\ncorrect\ncost\ncotton\ncouch\ncountry\ncouple\ncourse\ncousin\ncover\ncoyote\ncrack\ncradle\ncraft\ncram\ncrane\ncrash\ncrater\ncrawl\ncrazy\ncream\ncredit\ncreek\ncrew\ncricket\ncrime\ncrisp\ncritic\ncrop\ncross\ncrouch\ncrowd\ncrucial\ncruel\ncruise\ncrumble\ncrunch\ncrush\ncry\ncrystal\ncube\nculture\ncup\ncupboard\ncurious\ncurrent\ncurtain\ncurve\ncushion\ncustom\ncute\ncycle\ndad\ndamage\ndamp\ndance\ndanger\ndaring\ndash\ndaughter\ndawn\nday\ndeal\ndebate\ndebris\ndecade\ndecember\ndecide\ndecline\ndecorate\ndecrease\ndeer\ndefense\ndefine\ndefy\ndegree\ndelay\ndeliver\ndemand\ndemise\ndenial\ndentist\ndeny\ndepart\ndepend\ndeposit\ndepth\ndeputy\nderive\ndescribe\ndesert\ndesign\ndesk\ndespair\ndestroy\ndetail\ndetect\ndevelop\ndevice\ndevote\ndiagram\ndial\ndiamond\ndiary\ndice\ndiesel\ndiet\ndiffer\ndigital\ndignity\ndilemma\ndinner\ndinosaur\ndirect\ndirt\ndisagree\ndiscover\ndisease\ndish\ndismiss\ndisorder\ndisplay\ndistance\ndivert\ndivide\ndivorce\ndizzy\ndoctor\ndocument\ndog\ndoll\ndolphin\ndomain\ndonate\ndonkey\ndonor\ndoor\ndose\ndouble\ndove\ndraft\ndragon\ndrama\ndrastic\ndraw\ndream\ndress\ndrift\ndrill\ndrink\ndrip\ndrive\ndrop\ndrum\ndry\nduck\ndumb\ndune\nduring\ndust\ndutch\nduty\ndwarf\ndynamic\neager\neagle\nearly\nearn\nearth\neasily\neast\neasy\necho\necology\neconomy\nedge\nedit\neducate\neffort\negg\neight\neither\nelbow\nelder\nelectric\nelegant\nelement\nelephant\nelevator\nelite\nelse\nembark\nembody\nembrace\nemerge\nemotion\nemploy\nempower\nempty\nenable\nenact\nend\nendless\nendorse\nenemy\nenergy\nenforce\nengage\nengine\nenhance\nenjoy\nenlist\nenough\nenrich\nenroll\nensure\nenter\nentire\nentry\nenvelope\nepisode\nequal\nequip\nera\nerase\nerode\nerosion\nerror\nerupt\nescape\nessay\nessence\nestate\neternal\nethics\nevidence\nevil\nevoke\nevolve\nexact\nexample\nexcess\nexchange\nexcite\nexclude\nexcuse\nexecute\nexercise\nexhaust\nexhibit\nexile\nexist\nexit\nexotic\nexpand\nexpect\nexpire\nexplain\nexpose\nexpress\nextend\nextra\neye\neyebrow\nfabric\nface\nfaculty\nfade\nfaint\nfaith\nfall\nfalse\nfame\nfamily\nfamous\nfan\nfancy\nfantasy\nfarm\nfashion\nfat\nfatal\nfather\nfatigue\nfault\nfavorite\nfeature\nfebruary\nfederal\nfee\nfeed\nfeel\nfemale\nfence\nfestival\nfetch\nfever\nfew\nfiber\nfiction\nfield\nfigure\nfile\nfilm\nfilter\nfinal\nfind\nfine\nfinger\nfinish\nfire\nfirm\nfirst\nfiscal\nfish\nfit\nfitness\nfix\nflag\nflame\nflash\nflat\nflavor\nflee\nflight\nflip\nfloat\nflock\nfloor\nflower\nfluid\nflush\nfly\nfoam\nfocus\nfog\nfoil\nfold\nfollow\nfood\nfoot\nforce\nforest\nforget\nfork\nfortune\nforum\nforward\nfossil\nfoster\nfound\nfox\nfragile\nframe\nfrequent\nfresh\nfriend\nfringe\nfrog\nfront\nfrost\nfrown\nfrozen\nfruit\nfuel\nfun\nfunny\nfurnace\nfury\nfuture\ngadget\ngain\ngalaxy\ngallery\ngame\ngap\ngarage\ngarbage\ngarden\ngarlic\ngarment\ngas\ngasp\ngate\ngather\ngauge\ngaze\ngeneral\ngenius\ngenre\ngentle\ngenuine\ngesture\nghost\ngiant\ngift\ngiggle\nginger\ngiraffe\ngirl\ngive\nglad\nglance\nglare\nglass\nglide\nglimpse\nglobe\ngloom\nglory\nglove\nglow\nglue\ngoat\ngoddess\ngold\ngood\ngoose\ngorilla\ngospel\ngossip\ngovern\ngown\ngrab\ngrace\ngrain\ngrant\ngrape\ngrass\ngravity\ngreat\ngreen\ngrid\ngrief\ngrit\ngrocery\ngroup\ngrow\ngrunt\nguard\nguess\nguide\nguilt\nguitar\ngun\ngym\nhabit\nhair\nhalf\nhammer\nhamster\nhand\nhappy\nharbor\nhard\nharsh\nharvest\nhat\nhave\nhawk\nhazard\nhead\nhealth\nheart\nheavy\nhedgehog\nheight\nhello\nhelmet\nhelp\nhen\nhero\nhidden\nhigh\nhill\nhint\nhip\nhire\nhistory\nhobby\nhockey\nhold\nhole\nholiday\nhollow\nhome\nhoney\nhood\nhope\nhorn\nhorror\nhorse\nhospital\nhost\nhotel\nhour\nhover\nhub\nhuge\nhuman\nhumble\nhumor\nhundred\nhungry\nhunt\nhurdle\nhurry\nhurt\nhusband\nhybrid\nice\nicon\nidea\nidentify\nidle\nignore\nill\nillegal\nillness\nimage\nimitate\nimmense\nimmune\nimpact\nimpose\nimprove\nimpulse\ninch\ninclude\nincome\nincrease\nindex\nindicate\nindoor\nindustry\ninfant\ninflict\ninform\ninhale\ninherit\ninitial\ninject\ninjury\ninmate\ninner\ninnocent\ninput\ninquiry\ninsane\ninsect\ninside\ninspire\ninstall\nintact\ninterest\ninto\ninvest\ninvite\ninvolve\niron\nisland\nisolate\nissue\nitem\nivory\njacket\njaguar\njar\njazz\njealous\njeans\njelly\njewel\njob\njoin\njoke\njourney\njoy\njudge\njuice\njump\njungle\njunior\njunk\njust\nkangaroo\nkeen\nkeep\nketchup\nkey\nkick\nkid\nkidney\nkind\nkingdom\nkiss\nkit\nkitchen\nkite\nkitten\nkiwi\nknee\nknife\nknock\nknow\nlab\nlabel\nlabor\nladder\nlady\nlake\nlamp\nlanguage\nlaptop\nlarge\nlater\nlatin\nlaugh\nlaundry\nlava\nlaw\nlawn\nlawsuit\nlayer\nlazy\nleader\nleaf\nlearn\nleave\nlecture\nleft\nleg\nlegal\nlegend\nleisure\nlemon\nlend\nlength\nlens\nleopard\nlesson\nletter\nlevel\nliar\nliberty\nlibrary\nlicense\nlife\nlift\nlight\nlike\nlimb\nlimit\nlink\nlion\nliquid\nlist\nlittle\nlive\nlizard\nload\nloan\nlobster\nlocal\nlock\nlogic\nlonely\nlong\nloop\nlottery\nloud\nlounge\nlove\nloyal\nlucky\nluggage\nlumber\nlunar\nlunch\nluxury\nlyrics\nmachine\nmad\nmagic\nmagnet\nmaid\nmail\nmain\nmajor\nmake\nmammal\nman\nmanage\nmandate\nmango\nmansion\nmanual\nmaple\nmarble\nmarch\nmargin\nmarine\nmarket\nmarriage\nmask\nmass\nmaster\nmatch\nmaterial\nmath\nmatrix\nmatter\nmaximum\nmaze\nmeadow\nmean\nmeasure\nmeat\nmechanic\nmedal\nmedia\nmelody\nmelt\nmember\nmemory\nmention\nmenu\nmercy\nmerge\nmerit\nmerry\nmesh\nmessage\nmetal\nmethod\nmiddle\nmidnight\nmilk\nmillion\nmimic\nmind\nminimum\nminor\nminute\nmiracle\nmirror\nmisery\nmiss\nmistake\nmix\nmixed\nmixture\nmobile\nmodel\nmodify\nmom\nmoment\nmonitor\nmonkey\nmonster\nmonth\nmoon\nmoral\nmore\nmorning\nmosquito\nmother\nmotion\nmotor\nmountain\nmouse\nmove\nmovie\nmuch\nmuffin\nmule\nmultiply\nmuscle\nmuseum\nmushroom\nmusic\nmust\nmutual\nmyself\nmystery\nmyth\nnaive\nname\nnapkin\nnarrow\nnasty\nnation\nnature\nnear\nneck\nneed\nnegative\nneglect\nneither\nnephew\nnerve\nnest\nnet\nnetwork\nneutral\nnever\nnews\nnext\nnice\nnight\nnoble\nnoise\nnominee\nnoodle\nnormal\nnorth\nnose\nnotable\nnote\nnothing\nnotice\nnovel\nnow\nnuclear\nnumber\nnurse\nnut\noak\nobey\nobject\noblige\nobscure\nobserve\nobtain\nobvious\noccur\nocean\noctober\nodor\noff\noffer\noffice\noften\noil\nokay\nold\nolive\nolympic\nomit\nonce\none\nonion\nonline\nonly\nopen\nopera\nopinion\noppose\noption\norange\norbit\norchard\norder\nordinary\norgan\norient\noriginal\norphan\nostrich\nother\noutdoor\nouter\noutput\noutside\noval\noven\nover\nown\nowner\noxygen\noyster\nozone\npact\npaddle\npage\npair\npalace\npalm\npanda\npanel\npanic\npanther\npaper\nparade\nparent\npark\nparrot\nparty\npass\npatch\npath\npatient\npatrol\npattern\npause\npave\npayment\npeace\npeanut\npear\npeasant\npelican\npen\npenalty\npencil\npeople\npepper\nperfect\npermit\nperson\npet\nphone\nphoto\nphrase\nphysical\npiano\npicnic\npicture\npiece\npig\npigeon\npill\npilot\npink\npioneer\npipe\npistol\npitch\npizza\nplace\nplanet\nplastic\nplate\nplay\nplease\npledge\npluck\nplug\nplunge\npoem\npoet\npoint\npolar\npole\npolice\npond\npony\npool\npopular\nportion\nposition\npossible\npost\npotato\npottery\npoverty\npowder\npower\npractice\npraise\npredict\nprefer\nprepare\npresent\npretty\nprevent\nprice\npride\nprimary\nprint\npriority\nprison\nprivate\nprize\nproblem\nprocess\nproduce\nprofit\nprogram\nproject\npromote\nproof\nproperty\nprosper\nprotect\nproud\nprovide\npublic\npudding\npull\npulp\npulse\npumpkin\npunch\npupil\npuppy\npurchase\npurity\npurpose\npurse\npush\nput\npuzzle\npyramid\nquality\nquantum\nquarter\nquestion\nquick\nquit\nquiz\nquote\nrabbit\nraccoon\nrace\nrack\nradar\nradio\nrail\nrain\nraise\nrally\nramp\nranch\nrandom\nrange\nrapid\nrare\nrate\nrather\nraven\nraw\nrazor\nready\nreal\nreason\nrebel\nrebuild\nrecall\nreceive\nrecipe\nrecord\nrecycle\nreduce\nreflect\nreform\nrefuse\nregion\nregret\nregular\nreject\nrelax\nrelease\nrelief\nrely\nremain\nremember\nremind\nremove\nrender\nrenew\nrent\nreopen\nrepair\nrepeat\nreplace\nreport\nrequire\nrescue\nresemble\nresist\nresource\nresponse\nresult\nretire\nretreat\nreturn\nreunion\nreveal\nreview\nreward\nrhythm\nrib\nribbon\nrice\nrich\nride\nridge\nrifle\nright\nrigid\nring\nriot\nripple\nrisk\nritual\nrival\nriver\nroad\nroast\nrobot\nrobust\nrocket\nromance\nroof\nrookie\nroom\nrose\nrotate\nrough\nround\nroute\nroyal\nrubber\nrude\nrug\nrule\nrun\nrunway\nrural\nsad\nsaddle\nsadness\nsafe\nsail\nsalad\nsalmon\nsalon\nsalt\nsalute\nsame\nsample\nsand\nsatisfy\nsatoshi\nsauce\nsausage\nsave\nsay\nscale\nscan\nscare\nscatter\nscene\nscheme\nschool\nscience\nscissors\nscorpion\nscout\nscrap\nscreen\nscript\nscrub\nsea\nsearch\nseason\nseat\nsecond\nsecret\nsection\nsecurity\nseed\nseek\nsegment\nselect\nsell\nseminar\nsenior\nsense\nsentence\nseries\nservice\nsession\nsettle\nsetup\nseven\nshadow\nshaft\nshallow\nshare\nshed\nshell\nsheriff\nshield\nshift\nshine\nship\nshiver\nshock\nshoe\nshoot\nshop\nshort\nshoulder\nshove\nshrimp\nshrug\nshuffle\nshy\nsibling\nsick\nside\nsiege\nsight\nsign\nsilent\nsilk\nsilly\nsilver\nsimilar\nsimple\nsince\nsing\nsiren\nsister\nsituate\nsix\nsize\nskate\nsketch\nski\nskill\nskin\nskirt\nskull\nslab\nslam\nsleep\nslender\nslice\nslide\nslight\nslim\nslogan\nslot\nslow\nslush\nsmall\nsmart\nsmile\nsmoke\nsmooth\nsnack\nsnake\nsnap\nsniff\nsnow\nsoap\nsoccer\nsocial\nsock\nsoda\nsoft\nsolar\nsoldier\nsolid\nsolution\nsolve\nsomeone\nsong\nsoon\nsorry\nsort\nsoul\nsound\nsoup\nsource\nsouth\nspace\nspare\nspatial\nspawn\nspeak\nspecial\nspeed\nspell\nspend\nsphere\nspice\nspider\nspike\nspin\nspirit\nsplit\nspoil\nsponsor\nspoon\nsport\nspot\nspray\nspread\nspring\nspy\nsquare\nsqueeze\nsquirrel\nstable\nstadium\nstaff\nstage\nstairs\nstamp\nstand\nstart\nstate\nstay\nsteak\nsteel\nstem\nstep\nstereo\nstick\nstill\nsting\nstock\nstomach\nstone\nstool\nstory\nstove\nstrategy\nstreet\nstrike\nstrong\nstruggle\nstudent\nstuff\nstumble\nstyle\nsubject\nsubmit\nsubway\nsuccess\nsuch\nsudden\nsuffer\nsugar\nsuggest\nsuit\nsummer\nsun\nsunny\nsunset\nsuper\nsupply\nsupreme\nsure\nsurface\nsurge\nsurprise\nsurround\nsurvey\nsuspect\nsustain\nswallow\nswamp\nswap\nswarm\nswear\nsweet\nswift\nswim\nswing\nswitch\nsword\nsymbol\nsymptom\nsyrup\nsystem\ntable\ntackle\ntag\ntail\ntalent\ntalk\ntank\ntape\ntarget\ntask\ntaste\ntattoo\ntaxi\nteach\nteam\ntell\nten\ntenant\ntennis\ntent\nterm\ntest\ntext\nthank\nthat\ntheme\nthen\ntheory\nthere\nthey\nthing\nthis\nthought\nthree\nthrive\nthrow\nthumb\nthunder\nticket\ntide\ntiger\ntilt\ntimber\ntime\ntiny\ntip\ntired\ntissue\ntitle\ntoast\ntobacco\ntoday\ntoddler\ntoe\ntogether\ntoilet\ntoken\ntomato\ntomorrow\ntone\ntongue\ntonight\ntool\ntooth\ntop\ntopic\ntopple\ntorch\ntornado\ntortoise\ntoss\ntotal\ntourist\ntoward\ntower\ntown\ntoy\ntrack\ntrade\ntraffic\ntragic\ntrain\ntransfer\ntrap\ntrash\ntravel\ntray\ntreat\ntree\ntrend\ntrial\ntribe\ntrick\ntrigger\ntrim\ntrip\ntrophy\ntrouble\ntruck\ntrue\ntruly\ntrumpet\ntrust\ntruth\ntry\ntube\ntuition\ntumble\ntuna\ntunnel\nturkey\nturn\nturtle\ntwelve\ntwenty\ntwice\ntwin\ntwist\ntwo\ntype\ntypical\nugly\numbrella\nunable\nunaware\nuncle\nuncover\nunder\nundo\nunfair\nunfold\nunhappy\nuniform\nunique\nunit\nuniverse\nunknown\nunlock\nuntil\nunusual\nunveil\nupdate\nupgrade\nuphold\nupon\nupper\nupset\nurban\nurge\nusage\nuse\nused\nuseful\nuseless\nusual\nutility\nvacant\nvacuum\nvague\nvalid\nvalley\nvalve\nvan\nvanish\nvapor\nvarious\nvast\nvault\nvehicle\nvelvet\nvendor\nventure\nvenue\nverb\nverify\nversion\nvery\nvessel\nveteran\nviable\nvibrant\nvicious\nvictory\nvideo\nview\nvillage\nvintage\nviolin\nvirtual\nvirus\nvisa\nvisit\nvisual\nvital\nvivid\nvocal\nvoice\nvoid\nvolcano\nvolume\nvote\nvoyage\nwage\nwagon\nwait\nwalk\nwall\nwalnut\nwant\nwarfare\nwarm\nwarrior\nwash\nwasp\nwaste\nwater\nwave\nway\nwealth\nweapon\nwear\nweasel\nweather\nweb\nwedding\nweekend\nweird\nwelcome\nwest\nwet\nwhale\nwhat\nwheat\nwheel\nwhen\nwhere\nwhip\nwhisper\nwide\nwidth\nwife\nwild\nwill\nwin\nwindow\nwine\nwing\nwink\nwinner\nwinter\nwire\nwisdom\nwise\nwish\nwitness\nwolf\nwoman\nwonder\nwood\nwool\nword\nwork\nworld\nworry\nworth\nwrap\nwreck\nwrestle\nwrist\nwrite\nwrong\nyard\nyear\nyellow\nyou\nyoung\nyouth\nzebra\nzero\nzone\nzoo`.split('\\n');\n","/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abytes as abytes_,\n anumber,\n bytesToHex as bytesToHex_,\n concatBytes as concatBytes_,\n hexToBytes as hexToBytes_,\n} from '@noble/hashes/utils.js';\nexport {\n abytes,\n anumber,\n bytesToHex,\n concatBytes,\n hexToBytes,\n isBytes,\n randomBytes,\n} from '@noble/hashes/utils.js';\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\n\nexport type CHash = {\n (message: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create(opts?: { dkLen?: number }): any; // For shake\n};\nexport type FHash = (message: Uint8Array) => Uint8Array;\nexport function abool(value: boolean, title: string = ''): boolean {\n if (typeof value !== 'boolean') {\n const prefix = title && `\"${title}\" `;\n throw new Error(prefix + 'expected boolean, got type=' + typeof value);\n }\n return value;\n}\n\n// Used in weierstrass, der\nfunction abignumber(n: number | bigint) {\n if (typeof n === 'bigint') {\n if (!isPosBig(n)) throw new Error('positive bigint expected, got ' + n);\n } else anumber(n);\n return n;\n}\n\nexport function asafenumber(value: number, title: string = ''): void {\n if (!Number.isSafeInteger(value)) {\n const prefix = title && `\"${title}\" `;\n throw new Error(prefix + 'expected safe integer, got type=' + typeof value);\n }\n}\n\nexport function numberToHexUnpadded(num: number | bigint): string {\n const hex = abignumber(num).toString(16);\n return hex.length & 1 ? '0' + hex : hex;\n}\n\nexport function hexToNumber(hex: string): bigint {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex_(bytes));\n}\nexport function bytesToNumberLE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex_(copyBytes(abytes_(bytes)).reverse()));\n}\n\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n anumber(len);\n n = abignumber(n);\n const res = hexToBytes_(n.toString(16).padStart(len * 2, '0'));\n if (res.length !== len) throw new Error('number too large');\n return res;\n}\nexport function numberToBytesLE(n: number | bigint, len: number): Uint8Array {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n: number | bigint): Uint8Array {\n return hexToBytes_(numberToHexUnpadded(abignumber(n)));\n}\n\n// Compares 2 u8a-s in kinda constant time\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n\n/**\n * Copies Uint8Array. We can't use u8a.slice(), because u8a can be Buffer,\n * and Buffer#slice creates mutable copy. Never use Buffers!\n */\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n return Uint8Array.from(bytes);\n}\n\n/**\n * Decodes 7-bit ASCII string to Uint8Array, throws on non-ascii symbols\n * Should be safe to use for things expected to be ASCII.\n * Returns exact same result as `TextEncoder` for ASCII or throws.\n */\nexport function asciiToBytes(ascii: string): Uint8Array {\n return Uint8Array.from(ascii, (c, i) => {\n const charCode = c.charCodeAt(0);\n if (c.length !== 1 || charCode > 127) {\n throw new Error(\n `string contains non-ASCII character \"${ascii[i]}\" with code ${charCode} at position ${i}`\n );\n }\n return charCode;\n });\n}\n\n// Is positive bigint\nconst isPosBig = (n: bigint) => typeof n === 'bigint' && _0n <= n;\n\nexport function inRange(n: bigint, min: bigint, max: bigint): boolean {\n return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nexport function aInRange(title: string, n: bigint, min: bigint, max: bigint): void {\n // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n // consider P=256n, min=0n, max=P\n // - a for min=0 would require -1: `inRange('x', x, -1n, P)`\n // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)`\n // - our way is the cleanest: `inRange('x', x, 0n, P)\n if (!inRange(n, min, max))\n throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n\n// Bit operations\n\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nexport function bitLen(n: bigint): number {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1);\n return len;\n}\n\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n: bigint, pos: number): bigint {\n return (n >> BigInt(pos)) & _1n;\n}\n\n/**\n * Sets single bit at position.\n */\nexport function bitSet(n: bigint, pos: number, value: boolean): bigint {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n: number): bigint => (_1n << BigInt(n)) - _1n;\n\n// DRBG\n\ntype Pred<T> = (v: Uint8Array) => T | undefined;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG<Key>(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg<T>(\n hashLen: number,\n qByteLen: number,\n hmacFn: (key: Uint8Array, message: Uint8Array) => Uint8Array\n): (seed: Uint8Array, predicate: Pred<T>) => T {\n anumber(hashLen, 'hashLen');\n anumber(qByteLen, 'qByteLen');\n if (typeof hmacFn !== 'function') throw new Error('hmacFn must be a function');\n const u8n = (len: number): Uint8Array => new Uint8Array(len); // creates Uint8Array\n const NULL = Uint8Array.of();\n const byte0 = Uint8Array.of(0x00);\n const byte1 = Uint8Array.of(0x01);\n const _maxDrbgIters = 1000;\n\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...msgs: Uint8Array[]) => hmacFn(k, concatBytes_(v, ...msgs)); // hmac(k)(v, ...values)\n const reseed = (seed: Uint8Array = NULL) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(byte0, seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0) return;\n k = h(byte1, seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= _maxDrbgIters) throw new Error('drbg: tried max amount of iterations');\n let len = 0;\n const out: Uint8Array[] = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return concatBytes_(...out);\n };\n const genUntil = (seed: Uint8Array, pred: Pred<T>): T => {\n reset();\n reseed(seed); // Steps D-G\n let res: T | undefined = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen()))) reseed();\n reset();\n return res;\n };\n return genUntil;\n}\n\nexport function validateObject(\n object: Record<string, any>,\n fields: Record<string, string> = {},\n optFields: Record<string, string> = {}\n): void {\n if (!object || typeof object !== 'object') throw new Error('expected valid options object');\n type Item = keyof typeof object;\n function checkField(fieldName: Item, expectedType: string, isOpt: boolean) {\n const val = object[fieldName];\n if (isOpt && val === undefined) return;\n const current = typeof val;\n if (current !== expectedType || val === null)\n throw new Error(`param \"${fieldName}\" is invalid: expected ${expectedType}, got ${current}`);\n }\n const iter = (f: typeof fields, isOpt: boolean) =>\n Object.entries(f).forEach(([k, v]) => checkField(k, v, isOpt));\n iter(fields, false);\n iter(optFields, true);\n}\n\n/**\n * throws not implemented error\n */\nexport const notImplemented = (): never => {\n throw new Error('not implemented');\n};\n\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nexport function memoized<T extends object, R, O extends any[]>(\n fn: (arg: T, ...args: O) => R\n): (arg: T, ...args: O) => R {\n const map = new WeakMap<T, R>();\n return (arg: T, ...args: O): R => {\n const val = map.get(arg);\n if (val !== undefined) return val;\n const computed = fn(arg, ...args);\n map.set(arg, computed);\n return computed;\n };\n}\n\nexport interface CryptoKeys {\n lengths: { seed?: number; public?: number; secret?: number };\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: Uint8Array) => Uint8Array;\n}\n\n/** Generic interface for signatures. Has keygen, sign and verify. */\nexport interface Signer extends CryptoKeys {\n // Interfaces are fun. We cannot just add new fields without copying old ones.\n lengths: {\n seed?: number;\n public?: number;\n secret?: number;\n signRand?: number;\n signature?: number;\n };\n sign: (msg: Uint8Array, secretKey: Uint8Array) => Uint8Array;\n verify: (sig: Uint8Array, msg: Uint8Array, publicKey: Uint8Array) => boolean;\n}\n","/**\n * Utils for modular division and fields.\n * Field over 11 is a finite (Galois) field is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abytes,\n anumber,\n bytesToNumberBE,\n bytesToNumberLE,\n numberToBytesBE,\n numberToBytesLE,\n validateObject,\n} from '../utils.ts';\n\n// Numbers aren't used in x25519 / x448 builds\n// prettier-ignore\nconst _0n = /* @__PURE__ */ BigInt(0), _1n = /* @__PURE__ */ BigInt(1), _2n = /* @__PURE__ */ BigInt(2);\n// prettier-ignore\nconst _3n = /* @__PURE__ */ BigInt(3), _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5);\n// prettier-ignore\nconst _7n = /* @__PURE__ */ BigInt(7), _8n = /* @__PURE__ */ BigInt(8), _9n = /* @__PURE__ */ BigInt(9);\nconst _16n = /* @__PURE__ */ BigInt(16);\n\n// Calculates a modulo b\nexport function mod(a: bigint, b: bigint): bigint {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nexport function pow(num: bigint, power: bigint, modulo: bigint): bigint {\n return FpPow(Field(modulo), num, power);\n}\n\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nexport function pow2(x: bigint, power: bigint, modulo: bigint): bigint {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nexport function invert(number: bigint, modulo: bigint): bigint {\n if (number === _0n) throw new Error('invert: expected non-zero number');\n if (modulo <= _0n) throw new Error('invert: expected positive modulus, got ' + modulo);\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n) throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\n\nfunction assertIsSquare<T>(Fp: IField<T>, root: T, n: T): void {\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n}\n\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4<T>(Fp: IField<T>, n: T) {\n const p1div4 = (Fp.ORDER + _1n) / _4n;\n const root = Fp.pow(n, p1div4);\n assertIsSquare(Fp, root, n);\n return root;\n}\n\nfunction sqrt5mod8<T>(Fp: IField<T>, n: T) {\n const p5div8 = (Fp.ORDER - _5n) / _8n;\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, p5div8);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n assertIsSquare(Fp, root, n);\n return root;\n}\n\n// Based on RFC9380, Kong algorithm\n// prettier-ignore\nfunction sqrt9mod16(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n const Fp_ = Field(P);\n const tn = tonelliShanks(P);\n const c1 = tn(Fp_, Fp_.neg(Fp_.ONE));// 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n const c2 = tn(Fp_, c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n const c3 = tn(Fp_, Fp_.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n const c4 = (P + _7n) / _16n; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n return <T>(Fp: IField<T>, n: T) => {\n let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4\n let tv2 = Fp.mul(tv1, c1); // 2. tv2 = c1 * tv1\n const tv3 = Fp.mul(tv1, c2); // 3. tv3 = c2 * tv1\n const tv4 = Fp.mul(tv1, c3); // 4. tv4 = c3 * tv1\n const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x\n const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x\n tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x\n const root = Fp.cmov(tv1, tv2, e3);// 10. z = CMOV(tv1, tv2, e3) # Select sqrt from tv1 & tv2\n assertIsSquare(Fp, root, n);\n return root;\n };\n}\n\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n // Initialization (precomputation).\n // Caching initialization could boost perf by 7%.\n if (P < _3n) throw new Error('sqrt is not defined for small field');\n // Factor P - 1 = Q * 2^S, where Q is odd\n let Q = P - _1n;\n let S = 0;\n while (Q % _2n === _0n) {\n Q /= _2n;\n S++;\n }\n\n // Find the first quadratic non-residue Z >= 2\n let Z = _2n;\n const _Fp = Field(P);\n while (FpLegendre(_Fp, Z) === 1) {\n // Basic primality test for P. After x iterations, chance of\n // not finding quadratic non-residue is 2^x, so 2^1000.\n if (Z++ > 1000) throw new Error('Cannot find square root: probably non-prime P');\n }\n // Fast-path; usually done before Z, but we do \"primality test\".\n if (S === 1) return sqrt3mod4;\n\n // Slow-path\n // TODO: test on Fp2 and others\n let cc = _Fp.pow(Z, Q); // c = z^Q\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow<T>(Fp: IField<T>, n: T): T {\n if (Fp.is0(n)) return n;\n // Check if n is a quadratic residue using Legendre symbol\n if (FpLegendre(Fp, n) !== 1) throw new Error('Cannot find square root');\n\n // Initialize variables for the main loop\n let M = S;\n let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n\n // Main loop\n // while t != 1\n while (!Fp.eql(t, Fp.ONE)) {\n if (Fp.is0(t)) return Fp.ZERO; // if t=0 return R=0\n let i = 1;\n\n // Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P)\n let t_tmp = Fp.sqr(t); // t^(2^1)\n while (!Fp.eql(t_tmp, Fp.ONE)) {\n i++;\n t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n if (i === M) throw new Error('Cannot find square root');\n }\n\n // Calculate the exponent for b: 2^(M - i - 1)\n const exponent = _1n << BigInt(M - i - 1); // bigint is important\n const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n\n // Update variables\n M = i;\n c = Fp.sqr(b); // c = b^2\n t = Fp.mul(t, c); // t = (t * b^2)\n R = Fp.mul(R, b); // R = R*b\n }\n return R;\n };\n}\n\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P ≡ 3 (mod 4)\n * 2. P ≡ 5 (mod 8)\n * 3. P ≡ 9 (mod 16)\n * 4. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nexport function FpSqrt(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n // P ≡ 3 (mod 4) => √n = n^((P+1)/4)\n if (P % _4n === _3n) return sqrt3mod4;\n // P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n if (P % _8n === _5n) return sqrt5mod8;\n // P ≡ 9 (mod 16) => Kong algorithm, page 11 of https://eprint.iacr.org/2012/685.pdf (algorithm 4)\n if (P % _16n === _9n) return sqrt9mod16(P);\n // Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num: bigint, modulo: bigint): boolean =>\n (mod(num, modulo) & _1n) === _1n;\n\n/** Field is not always over prime: for example, Fp2 has ORDER(q)=p^m. */\nexport interface IField<T> {\n ORDER: bigint;\n BYTES: number;\n BITS: number;\n isLE: boolean;\n ZERO: T;\n ONE: T;\n // 1-arg\n create: (num: T) => T;\n isValid: (num: T) => boolean;\n is0: (num: T) => boolean;\n isValidNot0: (num: T) => boolean;\n neg(num: T): T;\n inv(num: T): T;\n sqrt(num: T): T;\n sqr(num: T): T;\n // 2-args\n eql(lhs: T, rhs: T): boolean;\n add(lhs: T, rhs: T): T;\n sub(lhs: T, rhs: T): T;\n mul(lhs: T, rhs: T | bigint): T;\n pow(lhs: T, power: bigint): T;\n div(lhs: T, rhs: T | bigint): T;\n // N for NonNormalized (for now)\n addN(lhs: T, rhs: T): T;\n subN(lhs: T, rhs: T): T;\n mulN(lhs: T, rhs: T | bigint): T;\n sqrN(num: T): T;\n\n // Optional\n // Should be same as sgn0 function in\n // [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#section-4.1).\n // NOTE: sgn0 is 'negative in LE', which is same as odd. And negative in LE is kinda strange definition anyway.\n isOdd?(num: T): boolean; // Odd instead of even since we have it for Fp2\n // legendre?(num: T): T;\n invertBatch: (lst: T[]) => T[];\n toBytes(num: T): Uint8Array;\n fromBytes(bytes: Uint8Array, skipValidation?: boolean): T;\n // If c is False, CMOV returns a, otherwise it returns b.\n cmov(a: T, b: T, c: boolean): T;\n}\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n] as const;\nexport function validateField<T>(field: IField<T>): IField<T> {\n const initial = {\n ORDER: 'bigint',\n BYTES: 'number',\n BITS: 'number',\n } as Record<string, string>;\n const opts = FIELD_FIELDS.reduce((map, val: string) => {\n map[val] = 'function';\n return map;\n }, initial);\n validateObject(field, opts);\n // const max = 16384;\n // if (field.BYTES < 1 || field.BYTES > max) throw new Error('invalid field');\n // if (field.BITS < 1 || field.BITS > 8 * max) throw new Error('invalid field');\n return field;\n}\n\n// Generic field functions\n\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow<T>(Fp: IField<T>, num: T, power: bigint): T {\n if (power < _0n) throw new Error('invalid exponent, negatives unsupported');\n if (power === _0n) return Fp.ONE;\n if (power === _1n) return num;\n let p = Fp.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n) p = Fp.mul(p, d);\n d = Fp.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nexport function FpInvertBatch<T>(Fp: IField<T>, nums: T[], passZero = false): T[] {\n const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n // Walk from first to last, multiply them by each other MOD p\n const multipliedAcc = nums.reduce((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = acc;\n return Fp.mul(acc, num);\n }, Fp.ONE);\n // Invert last element\n const invertedAcc = Fp.inv(multipliedAcc);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = Fp.mul(acc, inverted[i]);\n return Fp.mul(acc, num);\n }, invertedAcc);\n return inverted;\n}\n\n// TODO: remove\nexport function FpDiv<T>(Fp: IField<T>, lhs: T, rhs: T | bigint): T {\n return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) ≡ 1 if a is a square (mod p), quadratic residue\n * * (a | p) ≡ -1 if a is not a square (mod p), quadratic non residue\n * * (a | p) ≡ 0 if a ≡ 0 (mod p)\n */\nexport function FpLegendre<T>(Fp: IField<T>, n: T): -1 | 0 | 1 {\n // We can use 3rd argument as optional cache of this value\n // but seems unneeded for now. The operation is very fast.\n const p1mod2 = (Fp.ORDER - _1n) / _2n;\n const powered = Fp.pow(n, p1mod2);\n const yes = Fp.eql(powered, Fp.ONE);\n const zero = Fp.eql(powered, Fp.ZERO);\n const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n if (!yes && !zero && !no) throw new Error('invalid Legendre symbol result');\n return yes ? 1 : zero ? 0 : -1;\n}\n\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare<T>(Fp: IField<T>, n: T): boolean {\n const l = FpLegendre(Fp, n);\n return l === 1;\n}\n\nexport type NLength = { nByteLength: number; nBitLength: number };\n// CURVE.n lengths\nexport function nLength(n: bigint, nBitLength?: number): NLength {\n // Bit size, byte size of CURVE.n\n if (nBitLength !== undefined) anumber(nBitLength);\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\n\ntype FpField = IField<bigint> & Required<Pick<IField<bigint>, 'isOdd'>>;\ntype SqrtFn = (n: bigint) => bigint;\ntype FieldOpts = Partial<{\n isLE: boolean;\n BITS: number;\n sqrt: SqrtFn;\n allowedLengths?: readonly number[]; // for P521 (adds padding for smaller sizes)\n modFromBytes: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n}>;\nclass _Field implements IField<bigint> {\n readonly ORDER: bigint;\n readonly BITS: number;\n readonly BYTES: number;\n readonly isLE: boolean;\n readonly ZERO = _0n;\n readonly ONE = _1n;\n readonly _lengths?: number[];\n private _sqrt: ReturnType<typeof FpSqrt> | undefined; // cached sqrt\n private readonly _mod?: boolean;\n constructor(ORDER: bigint, opts: FieldOpts = {}) {\n if (ORDER <= _0n) throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n let _nbitLength: number | undefined = undefined;\n this.isLE = false;\n if (opts != null && typeof opts === 'object') {\n if (typeof opts.BITS === 'number') _nbitLength = opts.BITS;\n if (typeof opts.sqrt === 'function') this.sqrt = opts.sqrt;\n if (typeof opts.isLE === 'boolean') this.isLE = opts.isLE;\n if (opts.allowedLengths) this._lengths = opts.allowedLengths?.slice();\n if (typeof opts.modFromBytes === 'boolean') this._mod = opts.modFromBytes;\n }\n const { nBitLength, nByteLength } = nLength(ORDER, _nbitLength);\n if (nByteLength > 2048) throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n this.ORDER = ORDER;\n this.BITS = nBitLength;\n this.BYTES = nByteLength;\n this._sqrt = undefined;\n Object.preventExtensions(this);\n }\n\n create(num: bigint) {\n return mod(num, this.ORDER);\n }\n isValid(num: bigint) {\n if (typeof num !== 'bigint')\n throw new Error('invalid field element: expected bigint, got ' + typeof num);\n return _0n <= num && num < this.ORDER; // 0 is valid element, but it's not invertible\n }\n is0(num: bigint) {\n return num === _0n;\n }\n // is valid and invertible\n isValidNot0(num: bigint) {\n return !this.is0(num) && this.isValid(num);\n }\n isOdd(num: bigint) {\n return (num & _1n) === _1n;\n }\n neg(num: bigint) {\n return mod(-num, this.ORDER);\n }\n eql(lhs: bigint, rhs: bigint) {\n return lhs === rhs;\n }\n\n sqr(num: bigint) {\n return mod(num * num, this.ORDER);\n }\n add(lhs: bigint, rhs: bigint) {\n return mod(lhs + rhs, this.ORDER);\n }\n sub(lhs: bigint, rhs: bigint) {\n return mod(lhs - rhs, this.ORDER);\n }\n mul(lhs: bigint, rhs: bigint) {\n return mod(lhs * rhs, this.ORDER);\n }\n pow(num: bigint, power: bigint): bigint {\n return FpPow(this, num, power);\n }\n div(lhs: bigint, rhs: bigint) {\n return mod(lhs * invert(rhs, this.ORDER), this.ORDER);\n }\n\n // Same as above, but doesn't normalize\n sqrN(num: bigint) {\n return num * num;\n }\n addN(lhs: bigint, rhs: bigint) {\n return lhs + rhs;\n }\n subN(lhs: bigint, rhs: bigint) {\n return lhs - rhs;\n }\n mulN(lhs: bigint, rhs: bigint) {\n return lhs * rhs;\n }\n\n inv(num: bigint) {\n return invert(num, this.ORDER);\n }\n sqrt(num: bigint): bigint {\n // Caching _sqrt speeds up sqrt9mod16 by 5x and tonneli-shanks by 10%\n if (!this._sqrt) this._sqrt = FpSqrt(this.ORDER);\n return this._sqrt(this, num);\n }\n toBytes(num: bigint) {\n return this.isLE ? numberToBytesLE(num, this.BYTES) : numberToBytesBE(num, this.BYTES);\n }\n fromBytes(bytes: Uint8Array, skipValidation = false) {\n abytes(bytes);\n const { _lengths: allowedLengths, BYTES, isLE, ORDER, _mod: modFromBytes } = this;\n if (allowedLengths) {\n if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) {\n throw new Error(\n 'Field.fromBytes: expected ' + allowedLengths + ' bytes, got ' + bytes.length\n );\n }\n const padded = new Uint8Array(BYTES);\n // isLE add 0 to right, !isLE to the left.\n padded.set(bytes, isLE ? 0 : padded.length - bytes.length);\n bytes = padded;\n }\n if (bytes.length !== BYTES)\n throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n let scalar = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n if (modFromBytes) scalar = mod(scalar, ORDER);\n if (!skipValidation)\n if (!this.isValid(scalar))\n throw new Error('invalid field element: outside of range 0..ORDER');\n // NOTE: we don't validate scalar here, please use isValid. This done such way because some\n // protocol may allow non-reduced scalar that reduced later or changed some other way.\n return scalar;\n }\n // TODO: we don't need it here, move out to separate fn\n invertBatch(lst: bigint[]): bigint[] {\n return FpInvertBatch(this, lst);\n }\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov(a: bigint, b: bigint, condition: boolean) {\n return condition ? b : a;\n }\n}\n\n/**\n * Creates a finite field. Major performance optimizations:\n * * 1. Denormalized operations like mulN instead of mul.\n * * 2. Identical object shape: never add or remove keys.\n * * 3. `Object.freeze`.\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n *\n * Note about field properties:\n * * CHARACTERISTIC p = prime number, number of elements in main subgroup.\n * * ORDER q = similar to cofactor in curves, may be composite `q = p^m`.\n *\n * @param ORDER field order, probably prime, or could be composite\n * @param bitLen how many bits the field consumes\n * @param isLE (default: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(ORDER: bigint, opts: FieldOpts = {}): Readonly<FpField> {\n return new _Field(ORDER, opts);\n}\n\n// Generic random scalar, we can do same for other fields if via Fp2.mul(Fp2.ONE, Fp2.random)?\n// This allows unsafe methods like ignore bias or zero. These unsafe, but often used in different protocols (if deterministic RNG).\n// which mean we cannot force this via opts.\n// Not sure what to do with randomBytes, we can accept it inside opts if wanted.\n// Probably need to export getMinHashLength somewhere?\n// random(bytes?: Uint8Array, unsafeAllowZero = false, unsafeAllowBias = false) {\n// const LEN = !unsafeAllowBias ? getMinHashLength(ORDER) : BYTES;\n// if (bytes === undefined) bytes = randomBytes(LEN); // _opts.randomBytes?\n// const num = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n// // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n// const reduced = unsafeAllowZero ? mod(num, ORDER) : mod(num, ORDER - _1n) + _1n;\n// return reduced;\n// },\n\nexport function FpSqrtOdd<T>(Fp: IField<T>, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\n\nexport function FpSqrtEven<T>(Fp: IField<T>, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder: bigint): number {\n if (typeof fieldOrder !== 'bigint') throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder: bigint): number {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.Point.Fn.ORDER)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key: Uint8Array, fieldOrder: bigint, isLE = false): Uint8Array {\n abytes(key);\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n const num = isLE ? bytesToNumberLE(key) : bytesToNumberBE(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n","/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { bitLen, bitMask, type Signer } from '../utils.ts';\nimport { Field, FpInvertBatch, validateField, type IField } from './modular.ts';\n\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\n\nexport type AffinePoint<T> = {\n x: T;\n y: T;\n} & { Z?: never };\n\n// We can't \"abstract out\" coordinates (X, Y, Z; and T in Edwards): argument names of constructor\n// are not accessible. See Typescript gh-56093, gh-41594.\n//\n// We have to use recursive types, so it will return actual point, not constained `CurvePoint`.\n// If, at any point, P is `any`, it will erase all types and replace it\n// with `any`, because of recursion, `any implements CurvePoint`,\n// but we lose all constrains on methods.\n\n/** Base interface for all elliptic curve Points. */\nexport interface CurvePoint<F, P extends CurvePoint<F, P>> {\n /** Affine x coordinate. Different from projective / extended X coordinate. */\n x: F;\n /** Affine y coordinate. Different from projective / extended Y coordinate. */\n y: F;\n Z?: F;\n double(): P;\n negate(): P;\n add(other: P): P;\n subtract(other: P): P;\n equals(other: P): boolean;\n multiply(scalar: bigint): P;\n assertValidity(): void;\n clearCofactor(): P;\n is0(): boolean;\n isTorsionFree(): boolean;\n isSmallOrder(): boolean;\n multiplyUnsafe(scalar: bigint): P;\n /**\n * Massively speeds up `p.multiply(n)` by using precompute tables (caching). See {@link wNAF}.\n * @param isLazy calculate cache now. Default (true) ensures it's deferred to first `multiply()`\n */\n precompute(windowSize?: number, isLazy?: boolean): P;\n /** Converts point to 2D xy affine coordinates */\n toAffine(invertedZ?: F): AffinePoint<F>;\n toBytes(): Uint8Array;\n toHex(): string;\n}\n\n/** Base interface for all elliptic curve Point constructors. */\nexport interface CurvePointCons<P extends CurvePoint<any, P>> {\n [Symbol.hasInstance]: (item: unknown) => boolean;\n BASE: P;\n ZERO: P;\n /** Field for basic curve math */\n Fp: IField<P_F<P>>;\n /** Scalar field, for scalars in multiply and others */\n Fn: IField<bigint>;\n /** Creates point from x, y. Does NOT validate if the point is valid. Use `.assertValidity()`. */\n fromAffine(p: AffinePoint<P_F<P>>): P;\n fromBytes(bytes: Uint8Array): P;\n fromHex(hex: string): P;\n}\n\n// Type inference helpers: PC - PointConstructor, P - Point, Fp - Field element\n// Short names, because we use them a lot in result types:\n// * we can't do 'P = GetCurvePoint<PC>': this is default value and doesn't constrain anything\n// * we can't do 'type X = GetCurvePoint<PC>': it won't be accesible for arguments/return types\n// * `CurvePointCons<P extends CurvePoint<any, P>>` constraints from interface definition\n// won't propagate, if `PC extends CurvePointCons<any>`: the P would be 'any', which is incorrect\n// * PC could be super specific with super specific P, which implements CurvePoint<any, P>.\n// this means we need to do stuff like\n// `function test<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(`\n// if we want type safety around P, otherwise PC_P<PC> will be any\n\n/** Returns Fp type from Point (P_F<P> == P.F) */\nexport type P_F<P extends CurvePoint<any, P>> = P extends CurvePoint<infer F, P> ? F : never;\n/** Returns Fp type from PointCons (PC_F<PC> == PC.P.F) */\nexport type PC_F<PC extends CurvePointCons<CurvePoint<any, any>>> = PC['Fp']['ZERO'];\n/** Returns Point type from PointCons (PC_P<PC> == PC.P) */\nexport type PC_P<PC extends CurvePointCons<CurvePoint<any, any>>> = PC['ZERO'];\n\n// Ugly hack to get proper type inference, because in typescript fails to infer resursively.\n// The hack allows to do up to 10 chained operations without applying type erasure.\n//\n// Types which won't work:\n// * `CurvePointCons<CurvePoint<any, any>>`, will return `any` after 1 operation\n// * `CurvePointCons<any>: WeierstrassPointCons<bigint> extends CurvePointCons<any> = false`\n// * `P extends CurvePoint, PC extends CurvePointCons<P>`\n// * It can't infer P from PC alone\n// * Too many relations between F, P & PC\n// * It will infer P/F if `arg: CurvePointCons<F, P>`, but will fail if PC is generic\n// * It will work correctly if there is an additional argument of type P\n// * But generally, we don't want to parametrize `CurvePointCons` over `F`: it will complicate\n// types, making them un-inferable\n// prettier-ignore\nexport type PC_ANY = CurvePointCons<\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any, any>\n >>>>>>>>>\n>;\n\nexport interface CurveLengths {\n secretKey?: number;\n publicKey?: number;\n publicKeyUncompressed?: number;\n publicKeyHasPrefix?: boolean;\n signature?: number;\n seed?: number;\n}\n\nexport type Mapper<T> = (i: T[]) => T[];\n\nexport function negateCt<T extends { negate: () => T }>(condition: boolean, item: T): T {\n const neg = item.negate();\n return condition ? neg : item;\n}\n\n/**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\nexport function normalizeZ<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n points: P[]\n): P[] {\n const invertedZs = FpInvertBatch(\n c.Fp,\n points.map((p) => p.Z!)\n );\n return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i])));\n}\n\nfunction validateW(W: number, bits: number) {\n if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\n\n/** Internal wNAF opts for specific W and scalarBits */\ntype WOpts = {\n windows: number;\n windowSize: number;\n mask: bigint;\n maxNumber: number;\n shiftBy: bigint;\n};\n\nfunction calcWOpts(W: number, scalarBits: number): WOpts {\n validateW(W, scalarBits);\n const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n const maxNumber = 2 ** W; // W=8 256\n const mask = bitMask(W); // W=8 255 == mask 0b11111111\n const shiftBy = BigInt(W); // W=8 8\n return { windows, windowSize, mask, maxNumber, shiftBy };\n}\n\nfunction calcOffsets(n: bigint, window: number, wOpts: WOpts) {\n const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n let wbits = Number(n & mask); // extract W bits.\n let nextN = n >> shiftBy; // shift number by W bits.\n\n // What actually happens here:\n // const highestBit = Number(mask ^ (mask >> 1n));\n // let wbits2 = wbits - 1; // skip zero\n // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n\n // split if bits > max: +224 => 256-32\n if (wbits > windowSize) {\n // we skip zero, which means instead of `>= size-1`, we do `> size`\n wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n nextN += _1n; // +256 (carry)\n }\n const offsetStart = window * windowSize;\n const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n const isZero = wbits === 0; // is current window slice a 0?\n const isNeg = wbits < 0; // is current window slice negative?\n const isNegF = window % 2 !== 0; // fake random statement for noise\n const offsetF = offsetStart; // fake offset for noise\n return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\n\nfunction validateMSMPoints(points: any[], c: any) {\n if (!Array.isArray(points)) throw new Error('array expected');\n points.forEach((p, i) => {\n if (!(p instanceof c)) throw new Error('invalid point at index ' + i);\n });\n}\nfunction validateMSMScalars(scalars: any[], field: any) {\n if (!Array.isArray(scalars)) throw new Error('array of scalars expected');\n scalars.forEach((s, i) => {\n if (!field.isValid(s)) throw new Error('invalid scalar at index ' + i);\n });\n}\n\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap<any, any[]>();\nconst pointWindowSizes = new WeakMap<any, number>();\n\nfunction getW(P: any): number {\n // To disable precomputes:\n // return 1;\n return pointWindowSizes.get(P) || 1;\n}\n\nfunction assert0(n: bigint): void {\n if (n !== _0n) throw new Error('invalid wNAF');\n}\n\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Table generation takes **30MB of ram and 10ms on high-end CPU**,\n * but may take much longer on slow devices. Actual generation will happen on\n * first call of `multiply()`. By default, `BASE` point is precomputed.\n *\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nexport class wNAF<PC extends PC_ANY> {\n private readonly BASE: PC_P<PC>;\n private readonly ZERO: PC_P<PC>;\n private readonly Fn: PC['Fn'];\n readonly bits: number;\n\n // Parametrized with a given Point class (not individual point)\n constructor(Point: PC, bits: number) {\n this.BASE = Point.BASE;\n this.ZERO = Point.ZERO;\n this.Fn = Point.Fn;\n this.bits = bits;\n }\n\n // non-const time multiplication ladder\n _unsafeLadder(elm: PC_P<PC>, n: bigint, p: PC_P<PC> = this.ZERO): PC_P<PC> {\n let d: PC_P<PC> = elm;\n while (n > _0n) {\n if (n & _1n) p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n }\n\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n * - 𝑊 is the window size\n * - 𝑛 is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param point Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n private precomputeWindow(point: PC_P<PC>, W: number): PC_P<PC>[] {\n const { windows, windowSize } = calcWOpts(W, this.bits);\n const points: PC_P<PC>[] = [];\n let p: PC_P<PC> = point;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // i=1, bc we skip 0\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n }\n\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * More compact implementation:\n * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n * @returns real and fake (for const-time) points\n */\n private wNAF(W: number, precomputes: PC_P<PC>[], n: bigint): { p: PC_P<PC>; f: PC_P<PC> } {\n // Scalar should be smaller than field order\n if (!this.Fn.isValid(n)) throw new Error('invalid scalar');\n // Accumulators\n let p = this.ZERO;\n let f = this.BASE;\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // bits are 0: add garbage to fake point\n // Important part for const-time getPublicKey: add random \"noise\" point to f.\n f = f.add(negateCt(isNegF, precomputes[offsetF]));\n } else {\n // bits are 1: add to result point\n p = p.add(negateCt(isNeg, precomputes[offset]));\n }\n }\n assert0(n);\n // Return both real and fake points: JIT won't eliminate f.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n }\n\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n private wNAFUnsafe(\n W: number,\n precomputes: PC_P<PC>[],\n n: bigint,\n acc: PC_P<PC> = this.ZERO\n ): PC_P<PC> {\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n if (n === _0n) break; // Early-exit, skip 0 value\n const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // Window bits are 0: skip processing.\n // Move to next window.\n continue;\n } else {\n const item = precomputes[offset];\n acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n }\n }\n assert0(n);\n return acc;\n }\n\n private getPrecomputes(W: number, point: PC_P<PC>, transform?: Mapper<PC_P<PC>>): PC_P<PC>[] {\n // Calculate precomputes on a first run, reuse them after\n let comp = pointPrecomputes.get(point);\n if (!comp) {\n comp = this.precomputeWindow(point, W) as PC_P<PC>[];\n if (W !== 1) {\n // Doing transform outside of if brings 15% perf hit\n if (typeof transform === 'function') comp = transform(comp);\n pointPrecomputes.set(point, comp);\n }\n }\n return comp;\n }\n\n cached(\n point: PC_P<PC>,\n scalar: bigint,\n transform?: Mapper<PC_P<PC>>\n ): { p: PC_P<PC>; f: PC_P<PC> } {\n const W = getW(point);\n return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar);\n }\n\n unsafe(point: PC_P<PC>, scalar: bigint, transform?: Mapper<PC_P<PC>>, prev?: PC_P<PC>): PC_P<PC> {\n const W = getW(point);\n if (W === 1) return this._unsafeLadder(point, scalar, prev); // For W=1 ladder is ~x2 faster\n return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev);\n }\n\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n createCache(P: PC_P<PC>, W: number): void {\n validateW(W, this.bits);\n pointWindowSizes.set(P, W);\n pointPrecomputes.delete(P);\n }\n\n hasCache(elm: PC_P<PC>): boolean {\n return getW(elm) !== 1;\n }\n}\n\n/**\n * Endomorphism-specific multiplication for Koblitz curves.\n * Cost: 128 dbl, 0-256 adds.\n */\nexport function mulEndoUnsafe<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n Point: PC,\n point: P,\n k1: bigint,\n k2: bigint\n): { p1: P; p2: P } {\n let acc = point;\n let p1 = Point.ZERO;\n let p2 = Point.ZERO;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n) p1 = p1.add(acc);\n if (k2 & _1n) p2 = p2.add(acc);\n acc = acc.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n return { p1, p2 };\n}\n\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka secret keys / bigints)\n */\nexport function pippenger<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n points: P[],\n scalars: bigint[]\n): P {\n // If we split scalars by some window (let's say 8 bits), every chunk will only\n // take 256 buckets even if there are 4096 scalars, also re-uses double.\n // TODO:\n // - https://eprint.iacr.org/2024/750.pdf\n // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n // 0 is accepted in scalars\n const fieldN = c.Fn;\n validateMSMPoints(points, c);\n validateMSMScalars(scalars, fieldN);\n const plength = points.length;\n const slength = scalars.length;\n if (plength !== slength) throw new Error('arrays of points and scalars must have equal length');\n // if (plength === 0) throw new Error('array must be of length >= 2');\n const zero = c.ZERO;\n const wbits = bitLen(BigInt(plength));\n let windowSize = 1; // bits\n if (wbits > 12) windowSize = wbits - 3;\n else if (wbits > 4) windowSize = wbits - 2;\n else if (wbits > 0) windowSize = 2;\n const MASK = bitMask(windowSize);\n const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n let sum = zero;\n for (let i = lastBits; i >= 0; i -= windowSize) {\n buckets.fill(zero);\n for (let j = 0; j < slength; j++) {\n const scalar = scalars[j];\n const wbits = Number((scalar >> BigInt(i)) & MASK);\n buckets[wbits] = buckets[wbits].add(points[j]);\n }\n let resI = zero; // not using this will do small speed-up, but will lose ct\n // Skip first bucket, because it is zero\n for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n sumI = sumI.add(buckets[j]);\n resI = resI.add(sumI);\n }\n sum = sum.add(resI);\n if (i !== 0) for (let j = 0; j < windowSize; j++) sum = sum.double();\n }\n return sum as P;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nexport function precomputeMSMUnsafe<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n points: P[],\n windowSize: number\n): (scalars: bigint[]) => P {\n /**\n * Performance Analysis of Window-based Precomputation\n *\n * Base Case (256-bit scalar, 8-bit window):\n * - Standard precomputation requires:\n * - 31 additions per scalar × 256 scalars = 7,936 ops\n * - Plus 255 summary additions = 8,191 total ops\n * Note: Summary additions can be optimized via accumulator\n *\n * Chunked Precomputation Analysis:\n * - Using 32 chunks requires:\n * - 255 additions per chunk\n * - 256 doublings\n * - Total: (255 × 32) + 256 = 8,416 ops\n *\n * Memory Usage Comparison:\n * Window Size | Standard Points | Chunked Points\n * ------------|-----------------|---------------\n * 4-bit | 520 | 15\n * 8-bit | 4,224 | 255\n * 10-bit | 13,824 | 1,023\n * 16-bit | 557,056 | 65,535\n *\n * Key Advantages:\n * 1. Enables larger window sizes due to reduced memory overhead\n * 2. More efficient for smaller scalar counts:\n * - 16 chunks: (16 × 255) + 256 = 4,336 ops\n * - ~2x faster than standard 8,191 ops\n *\n * Limitations:\n * - Not suitable for plain precomputes (requires 256 constant doublings)\n * - Performance degrades with larger scalar counts:\n * - Optimal for ~256 scalars\n * - Less efficient for 4096+ scalars (Pippenger preferred)\n */\n const fieldN = c.Fn;\n validateW(windowSize, fieldN.BITS);\n validateMSMPoints(points, c);\n const zero = c.ZERO;\n const tableSize = 2 ** windowSize - 1; // table size (without zero)\n const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n const MASK = bitMask(windowSize);\n const tables = points.map((p: P) => {\n const res = [];\n for (let i = 0, acc = p; i < tableSize; i++) {\n res.push(acc);\n acc = acc.add(p);\n }\n return res;\n });\n return (scalars: bigint[]): P => {\n validateMSMScalars(scalars, fieldN);\n if (scalars.length > points.length)\n throw new Error('array of scalars must be smaller than array of points');\n let res = zero;\n for (let i = 0; i < chunks; i++) {\n // No need to double if accumulator is still zero.\n if (res !== zero) for (let j = 0; j < windowSize; j++) res = res.double();\n const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n for (let j = 0; j < scalars.length; j++) {\n const n = scalars[j];\n const curr = Number((n >> shiftBy) & MASK);\n if (!curr) continue; // skip zero scalars chunks\n res = res.add(tables[j][curr - 1]);\n }\n }\n return res;\n };\n}\n\nexport type ValidCurveParams<T> = {\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b?: T;\n d?: T;\n Gx: T;\n Gy: T;\n};\n\nfunction createField<T>(order: bigint, field?: IField<T>, isLE?: boolean): IField<T> {\n if (field) {\n if (field.ORDER !== order) throw new Error('Field.ORDER must match order: Fp == p, Fn == n');\n validateField(field);\n return field;\n } else {\n return Field(order, { isLE }) as unknown as IField<T>;\n }\n}\nexport type FpFn<T> = { Fp: IField<T>; Fn: IField<bigint> };\n\n/** Validates CURVE opts and creates fields */\nexport function createCurveFields<T>(\n type: 'weierstrass' | 'edwards',\n CURVE: ValidCurveParams<T>,\n curveOpts: Partial<FpFn<T>> = {},\n FpFnLE?: boolean\n): FpFn<T> & { CURVE: ValidCurveParams<T> } {\n if (FpFnLE === undefined) FpFnLE = type === 'edwards';\n if (!CURVE || typeof CURVE !== 'object') throw new Error(`expected valid ${type} CURVE object`);\n for (const p of ['p', 'n', 'h'] as const) {\n const val = CURVE[p];\n if (!(typeof val === 'bigint' && val > _0n))\n throw new Error(`CURVE.${p} must be positive bigint`);\n }\n const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE);\n const Fn = createField(CURVE.n, curveOpts.Fn, FpFnLE);\n const _b: 'b' | 'd' = type === 'weierstrass' ? 'b' : 'd';\n const params = ['Gx', 'Gy', 'a', _b] as const;\n for (const p of params) {\n // @ts-ignore\n if (!Fp.isValid(CURVE[p]))\n throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`);\n }\n CURVE = Object.freeze(Object.assign({}, CURVE));\n return { CURVE, Fp, Fn };\n}\n\ntype KeygenFn = (\n seed?: Uint8Array,\n isCompressed?: boolean\n) => { secretKey: Uint8Array; publicKey: Uint8Array };\nexport function createKeygen(\n randomSecretKey: Function,\n getPublicKey: Signer['getPublicKey']\n): KeygenFn {\n return function keygen(seed?: Uint8Array) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: getPublicKey(secretKey) };\n };\n}\n","/**\n * Short Weierstrass curve methods. The formula is: y² = x³ + ax + b.\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n * `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n * `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n * it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n * 1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n * which is hard to debug.\n * 2. Params can be generic and we can't enforce them to be constant value:\n * if somebody creates curve from non-constant params,\n * it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { hmac as nobleHmac } from '@noble/hashes/hmac.js';\nimport { ahash } from '@noble/hashes/utils.js';\nimport {\n abool,\n abytes,\n aInRange,\n bitLen,\n bitMask,\n bytesToHex,\n bytesToNumberBE,\n concatBytes,\n createHmacDrbg,\n hexToBytes,\n isBytes,\n memoized,\n numberToHexUnpadded,\n validateObject,\n randomBytes as wcRandomBytes,\n type CHash,\n type Signer,\n} from '../utils.ts';\nimport {\n createCurveFields,\n createKeygen,\n mulEndoUnsafe,\n negateCt,\n normalizeZ,\n wNAF,\n type AffinePoint,\n type CurveLengths,\n type CurvePoint,\n type CurvePointCons,\n} from './curve.ts';\nimport {\n FpInvertBatch,\n getMinHashLength,\n mapHashToField,\n validateField,\n type IField,\n} from './modular.ts';\n\nexport type { AffinePoint };\n\ntype EndoBasis = [[bigint, bigint], [bigint, bigint]];\n/**\n * When Weierstrass curve has `a=0`, it becomes Koblitz curve.\n * Koblitz curves allow using **efficiently-computable GLV endomorphism ψ**.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n *\n * Endomorphism consists of beta, lambda and splitScalar:\n *\n * 1. GLV endomorphism ψ transforms a point: `P = (x, y) ↦ ψ(P) = (β·x mod p, y)`\n * 2. GLV scalar decomposition transforms a scalar: `k ≡ k₁ + k₂·λ (mod n)`\n * 3. Then these are combined: `k·P = k₁·P + k₂·ψ(P)`\n * 4. Two 128-bit point-by-scalar multiplications + one point addition is faster than\n * one 256-bit multiplication.\n *\n * where\n * * beta: β ∈ Fₚ with β³ = 1, β ≠ 1\n * * lambda: λ ∈ Fₙ with λ³ = 1, λ ≠ 1\n * * splitScalar decomposes k ↦ k₁, k₂, by using reduced basis vectors.\n * Gauss lattice reduction calculates them from initial basis vectors `(n, 0), (-λ, 0)`\n *\n * Check out `test/misc/endomorphism.js` and\n * [gist](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n */\nexport type EndomorphismOpts = {\n beta: bigint;\n basises?: EndoBasis;\n splitScalar?: (k: bigint) => { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n};\n// We construct basis in such way that den is always positive and equals n, but num sign depends on basis (not on secret value)\nconst divNearest = (num: bigint, den: bigint) => (num + (num >= 0 ? den : -den) / _2n) / den;\n\nexport type ScalarEndoParts = { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n\n/**\n * Splits scalar for GLV endomorphism.\n */\nexport function _splitEndoScalar(k: bigint, basis: EndoBasis, n: bigint): ScalarEndoParts {\n // Split scalar into two such that part is ~half bits: `abs(part) < sqrt(N)`\n // Since part can be negative, we need to do this on point.\n // TODO: verifyScalar function which consumes lambda\n const [[a1, b1], [a2, b2]] = basis;\n const c1 = divNearest(b2 * k, n);\n const c2 = divNearest(-b1 * k, n);\n // |k1|/|k2| is < sqrt(N), but can be negative.\n // If we do `k1 mod N`, we'll get big scalar (`> sqrt(N)`): so, we do cheaper negation instead.\n let k1 = k - c1 * a1 - c2 * a2;\n let k2 = -c1 * b1 - c2 * b2;\n const k1neg = k1 < _0n;\n const k2neg = k2 < _0n;\n if (k1neg) k1 = -k1;\n if (k2neg) k2 = -k2;\n // Double check that resulting scalar less than half bits of N: otherwise wNAF will fail.\n // This should only happen on wrong basises. Also, math inside is too complex and I don't trust it.\n const MAX_NUM = bitMask(Math.ceil(bitLen(n) / 2)) + _1n; // Half bits of N\n if (k1 < _0n || k1 >= MAX_NUM || k2 < _0n || k2 >= MAX_NUM) {\n throw new Error('splitScalar (endomorphism): failed, k=' + k);\n }\n return { k1neg, k1, k2neg, k2 };\n}\n\n/**\n * Option to enable hedged signatures with improved security.\n *\n * * Randomly generated k is bad, because broken CSPRNG would leak private keys.\n * * Deterministic k (RFC6979) is better; but is suspectible to fault attacks.\n *\n * We allow using technique described in RFC6979 3.6: additional k', a.k.a. adding randomness\n * to deterministic sig. If CSPRNG is broken & randomness is weak, it would STILL be as secure\n * as ordinary sig without ExtraEntropy.\n *\n * * `true` means \"fetch data, from CSPRNG, incorporate it into k generation\"\n * * `false` means \"disable extra entropy, use purely deterministic k\"\n * * `Uint8Array` passed means \"incorporate following data into k generation\"\n *\n * https://paulmillr.com/posts/deterministic-signatures/\n */\nexport type ECDSAExtraEntropy = boolean | Uint8Array;\n/**\n * - `compact` is the default format\n * - `recovered` is the same as compact, but with an extra byte indicating recovery byte\n * - `der` is ASN.1 DER encoding\n */\nexport type ECDSASignatureFormat = 'compact' | 'recovered' | 'der';\n/**\n * - `prehash`: (default: true) indicates whether to do sha256(message).\n * When a custom hash is used, it must be set to `false`.\n */\nexport type ECDSARecoverOpts = {\n prehash?: boolean;\n};\n/**\n * - `prehash`: (default: true) indicates whether to do sha256(message).\n * When a custom hash is used, it must be set to `false`.\n * - `lowS`: (default: true) prohibits signatures which have (sig.s >= CURVE.n/2n).\n * Compatible with BTC/ETH. Setting `lowS: false` allows to create malleable signatures,\n * which is default openssl behavior.\n * Non-malleable signatures can still be successfully verified in openssl.\n * - `format`: (default: 'compact') 'compact' or 'recovered' with recovery byte\n */\nexport type ECDSAVerifyOpts = {\n prehash?: boolean;\n lowS?: boolean;\n format?: ECDSASignatureFormat;\n};\n/**\n * - `prehash`: (default: true) indicates whether to do sha256(message).\n * When a custom hash is used, it must be set to `false`.\n * - `lowS`: (default: true) prohibits signatures which have (sig.s >= CURVE.n/2n).\n * Compatible with BTC/ETH. Setting `lowS: false` allows to create malleable signatures,\n * which is default openssl behavior.\n * Non-malleable signatures can still be successfully verified in openssl.\n * - `format`: (default: 'compact') 'compact' or 'recovered' with recovery byte\n * - `extraEntropy`: (default: false) creates sigs with increased security, see {@link ECDSAExtraEntropy}\n */\nexport type ECDSASignOpts = {\n prehash?: boolean;\n lowS?: boolean;\n format?: ECDSASignatureFormat;\n extraEntropy?: ECDSAExtraEntropy;\n};\n\nfunction validateSigFormat(format: string): ECDSASignatureFormat {\n if (!['compact', 'recovered', 'der'].includes(format))\n throw new Error('Signature format must be \"compact\", \"recovered\", or \"der\"');\n return format as ECDSASignatureFormat;\n}\n\nfunction validateSigOpts<T extends ECDSASignOpts, D extends Required<ECDSASignOpts>>(\n opts: T,\n def: D\n): Required<ECDSASignOpts> {\n const optsn: ECDSASignOpts = {};\n for (let optName of Object.keys(def)) {\n // @ts-ignore\n optsn[optName] = opts[optName] === undefined ? def[optName] : opts[optName];\n }\n abool(optsn.lowS!, 'lowS');\n abool(optsn.prehash!, 'prehash');\n if (optsn.format !== undefined) validateSigFormat(optsn.format);\n return optsn as Required<ECDSASignOpts>;\n}\n\n/** Instance methods for 3D XYZ projective points. */\nexport interface WeierstrassPoint<T> extends CurvePoint<T, WeierstrassPoint<T>> {\n /** projective X coordinate. Different from affine x. */\n readonly X: T;\n /** projective Y coordinate. Different from affine y. */\n readonly Y: T;\n /** projective z coordinate */\n readonly Z: T;\n /** affine x coordinate. Different from projective X. */\n get x(): T;\n /** affine y coordinate. Different from projective Y. */\n get y(): T;\n /** Encodes point using IEEE P1363 (DER) encoding. First byte is 2/3/4. Default = isCompressed. */\n toBytes(isCompressed?: boolean): Uint8Array;\n toHex(isCompressed?: boolean): string;\n}\n\n/** Static methods for 3D XYZ projective points. */\nexport interface WeierstrassPointCons<T> extends CurvePointCons<WeierstrassPoint<T>> {\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n new (X: T, Y: T, Z: T): WeierstrassPoint<T>;\n CURVE(): WeierstrassOpts<T>;\n}\n\n/**\n * Weierstrass curve options.\n *\n * * p: prime characteristic (order) of finite field, in which arithmetics is done\n * * n: order of prime subgroup a.k.a total amount of valid curve points\n * * h: cofactor, usually 1. h*n is group order; n is subgroup order\n * * a: formula param, must be in field of p\n * * b: formula param, must be in field of p\n * * Gx: x coordinate of generator point a.k.a. base point\n * * Gy: y coordinate of generator point\n */\nexport type WeierstrassOpts<T> = Readonly<{\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b: T;\n Gx: T;\n Gy: T;\n}>;\n\n// When a cofactor != 1, there can be an effective methods to:\n// 1. Determine whether a point is torsion-free\n// 2. Clear torsion component\nexport type WeierstrassExtraOpts<T> = Partial<{\n Fp: IField<T>;\n Fn: IField<bigint>;\n allowInfinityPoint: boolean;\n endo: EndomorphismOpts;\n isTorsionFree: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => boolean;\n clearCofactor: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => WeierstrassPoint<T>;\n fromBytes: (bytes: Uint8Array) => AffinePoint<T>;\n toBytes: (\n c: WeierstrassPointCons<T>,\n point: WeierstrassPoint<T>,\n isCompressed: boolean\n ) => Uint8Array;\n}>;\n\n/**\n * Options for ECDSA signatures over a Weierstrass curve.\n *\n * * lowS: (default: true) whether produced / verified signatures occupy low half of ecdsaOpts.p. Prevents malleability.\n * * hmac: (default: noble-hashes hmac) function, would be used to init hmac-drbg for k generation.\n * * randomBytes: (default: webcrypto os-level CSPRNG) custom method for fetching secure randomness.\n * * bits2int, bits2int_modN: used in sigs, sometimes overridden by curves\n */\nexport type ECDSAOpts = Partial<{\n lowS: boolean;\n hmac: (key: Uint8Array, message: Uint8Array) => Uint8Array;\n randomBytes: (bytesLength?: number) => Uint8Array;\n bits2int: (bytes: Uint8Array) => bigint;\n bits2int_modN: (bytes: Uint8Array) => bigint;\n}>;\n\n/**\n * Elliptic Curve Diffie-Hellman interface.\n * Provides keygen, secret-to-public conversion, calculating shared secrets.\n */\nexport interface ECDH {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: Uint8Array, isCompressed?: boolean) => Uint8Array;\n getSharedSecret: (\n secretKeyA: Uint8Array,\n publicKeyB: Uint8Array,\n isCompressed?: boolean\n ) => Uint8Array;\n Point: WeierstrassPointCons<bigint>;\n utils: {\n isValidSecretKey: (secretKey: Uint8Array) => boolean;\n isValidPublicKey: (publicKey: Uint8Array, isCompressed?: boolean) => boolean;\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n };\n lengths: CurveLengths;\n}\n\n/**\n * ECDSA interface.\n * Only supported for prime fields, not Fp2 (extension fields).\n */\nexport interface ECDSA extends ECDH {\n sign: (message: Uint8Array, secretKey: Uint8Array, opts?: ECDSASignOpts) => Uint8Array;\n verify: (\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n opts?: ECDSAVerifyOpts\n ) => boolean;\n recoverPublicKey(signature: Uint8Array, message: Uint8Array, opts?: ECDSARecoverOpts): Uint8Array;\n Signature: ECDSASignatureCons;\n}\nexport class DERErr extends Error {\n constructor(m = '') {\n super(m);\n }\n}\nexport type IDER = {\n // asn.1 DER encoding utils\n Err: typeof DERErr;\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string) => string;\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array };\n };\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string;\n decode(data: Uint8Array): bigint;\n };\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint };\n hexFromSig(sig: { r: bigint; s: bigint }): string;\n};\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n * [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nexport const DER: IDER = {\n // asn.1 DER encoding utils\n Err: DERErr,\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string): string => {\n const { Err: E } = DER;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length & 1) throw new E('tlv.encode: unpadded data');\n const dataLen = data.length / 2;\n const len = numberToHexUnpadded(dataLen);\n if ((len.length / 2) & 0b1000_0000) throw new E('tlv.encode: long form length too big');\n // length of length with long form flag\n const lenLen = dataLen > 127 ? numberToHexUnpadded((len.length / 2) | 0b1000_0000) : '';\n const t = numberToHexUnpadded(tag);\n return t + lenLen + len + data;\n },\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array } {\n const { Err: E } = DER;\n let pos = 0;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length < 2 || data[pos++] !== tag) throw new E('tlv.decode: wrong tlv');\n const first = data[pos++];\n const isLong = !!(first & 0b1000_0000); // First bit of first length byte is flag for short/long form\n let length = 0;\n if (!isLong) length = first;\n else {\n // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n const lenLen = first & 0b0111_1111;\n if (!lenLen) throw new E('tlv.decode(long): indefinite length not supported');\n if (lenLen > 4) throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n const lengthBytes = data.subarray(pos, pos + lenLen);\n if (lengthBytes.length !== lenLen) throw new E('tlv.decode: length bytes not complete');\n if (lengthBytes[0] === 0) throw new E('tlv.decode(long): zero leftmost byte');\n for (const b of lengthBytes) length = (length << 8) | b;\n pos += lenLen;\n if (length < 128) throw new E('tlv.decode(long): not minimal encoding');\n }\n const v = data.subarray(pos, pos + length);\n if (v.length !== length) throw new E('tlv.decode: wrong value length');\n return { v, l: data.subarray(pos + length) };\n },\n },\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string {\n const { Err: E } = DER;\n if (num < _0n) throw new E('integer: negative integers are not allowed');\n let hex = numberToHexUnpadded(num);\n // Pad with zero byte if negative flag is present\n if (Number.parseInt(hex[0], 16) & 0b1000) hex = '00' + hex;\n if (hex.length & 1) throw new E('unexpected DER parsing assertion: unpadded hex');\n return hex;\n },\n decode(data: Uint8Array): bigint {\n const { Err: E } = DER;\n if (data[0] & 0b1000_0000) throw new E('invalid signature integer: negative');\n if (data[0] === 0x00 && !(data[1] & 0b1000_0000))\n throw new E('invalid signature integer: unnecessary leading zero');\n return bytesToNumberBE(data);\n },\n },\n toSig(bytes: Uint8Array): { r: bigint; s: bigint } {\n // parse DER signature\n const { Err: E, _int: int, _tlv: tlv } = DER;\n const data = abytes(bytes, undefined, 'signature');\n const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n if (seqLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n if (sLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n return { r: int.decode(rBytes), s: int.decode(sBytes) };\n },\n hexFromSig(sig: { r: bigint; s: bigint }): string {\n const { _tlv: tlv, _int: int } = DER;\n const rs = tlv.encode(0x02, int.encode(sig.r));\n const ss = tlv.encode(0x02, int.encode(sig.s));\n const seq = rs + ss;\n return tlv.encode(0x30, seq);\n },\n};\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\n\n/**\n * Creates weierstrass Point constructor, based on specified curve options.\n *\n * See {@link WeierstrassOpts}.\n *\n * @example\n```js\nconst opts = {\n p: 0xfffffffffffffffffffffffffffffffeffffac73n,\n n: 0x100000000000000000001b8fa16dfab9aca16b6b3n,\n h: 1n,\n a: 0n,\n b: 7n,\n Gx: 0x3b4c382ce37aa192a4019e763036f4f5dd4d7ebbn,\n Gy: 0x938cf935318fdced6bc28286531733c3f03c4feen,\n};\nconst secp160k1_Point = weierstrass(opts);\n```\n */\nexport function weierstrass<T>(\n params: WeierstrassOpts<T>,\n extraOpts: WeierstrassExtraOpts<T> = {}\n): WeierstrassPointCons<T> {\n const validated = createCurveFields('weierstrass', params, extraOpts);\n const { Fp, Fn } = validated;\n let CURVE = validated.CURVE as WeierstrassOpts<T>;\n const { h: cofactor, n: CURVE_ORDER } = CURVE;\n validateObject(\n extraOpts,\n {},\n {\n allowInfinityPoint: 'boolean',\n clearCofactor: 'function',\n isTorsionFree: 'function',\n fromBytes: 'function',\n toBytes: 'function',\n endo: 'object',\n }\n );\n\n const { endo } = extraOpts;\n if (endo) {\n // validateObject(endo, { beta: 'bigint', splitScalar: 'function' });\n if (!Fp.is0(CURVE.a) || typeof endo.beta !== 'bigint' || !Array.isArray(endo.basises)) {\n throw new Error('invalid endo: expected \"beta\": bigint and \"basises\": array');\n }\n }\n\n const lengths = getWLengths(Fp, Fn);\n\n function assertCompressionIsSupported() {\n if (!Fp.isOdd) throw new Error('compression is not supported: Field does not have .isOdd()');\n }\n\n // Implements IEEE P1363 point encoding\n function pointToBytes(\n _c: WeierstrassPointCons<T>,\n point: WeierstrassPoint<T>,\n isCompressed: boolean\n ): Uint8Array {\n const { x, y } = point.toAffine();\n const bx = Fp.toBytes(x);\n abool(isCompressed, 'isCompressed');\n if (isCompressed) {\n assertCompressionIsSupported();\n const hasEvenY = !Fp.isOdd!(y);\n return concatBytes(pprefix(hasEvenY), bx);\n } else {\n return concatBytes(Uint8Array.of(0x04), bx, Fp.toBytes(y));\n }\n }\n function pointFromBytes(bytes: Uint8Array) {\n abytes(bytes, undefined, 'Point');\n const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65\n const length = bytes.length;\n const head = bytes[0];\n const tail = bytes.subarray(1);\n // No actual validation is done here: use .assertValidity()\n if (length === comp && (head === 0x02 || head === 0x03)) {\n const x = Fp.fromBytes(tail);\n if (!Fp.isValid(x)) throw new Error('bad point: is not on curve, wrong x');\n const y2 = weierstrassEquation(x); // y² = x³ + ax + b\n let y: T;\n try {\n y = Fp.sqrt(y2); // y = y² ^ (p+1)/4\n } catch (sqrtError) {\n const err = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n throw new Error('bad point: is not on curve, sqrt error' + err);\n }\n assertCompressionIsSupported();\n const evenY = Fp.isOdd!(y);\n const evenH = (head & 1) === 1; // ECDSA-specific\n if (evenH !== evenY) y = Fp.neg(y);\n return { x, y };\n } else if (length === uncomp && head === 0x04) {\n // TODO: more checks\n const L = Fp.BYTES;\n const x = Fp.fromBytes(tail.subarray(0, L));\n const y = Fp.fromBytes(tail.subarray(L, L * 2));\n if (!isValidXY(x, y)) throw new Error('bad point: is not on curve');\n return { x, y };\n } else {\n throw new Error(\n `bad point: got length ${length}, expected compressed=${comp} or uncompressed=${uncomp}`\n );\n }\n }\n\n const encodePoint = extraOpts.toBytes || pointToBytes;\n const decodePoint = extraOpts.fromBytes || pointFromBytes;\n function weierstrassEquation(x: T): T {\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x² * x\n return Fp.add(Fp.add(x3, Fp.mul(x, CURVE.a)), CURVE.b); // x³ + a * x + b\n }\n\n // TODO: move top-level\n /** Checks whether equation holds for given x, y: y² == x³ + ax + b */\n function isValidXY(x: T, y: T): boolean {\n const left = Fp.sqr(y); // y²\n const right = weierstrassEquation(x); // x³ + ax + b\n return Fp.eql(left, right);\n }\n\n // Validate whether the passed curve params are valid.\n // Test 1: equation y² = x³ + ax + b should work for generator point.\n if (!isValidXY(CURVE.Gx, CURVE.Gy)) throw new Error('bad curve params: generator point');\n\n // Test 2: discriminant Δ part should be non-zero: 4a³ + 27b² != 0.\n // Guarantees curve is genus-1, smooth (non-singular).\n const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n if (Fp.is0(Fp.add(_4a3, _27b2))) throw new Error('bad curve params: a or b');\n\n /** Asserts coordinate is valid: 0 <= n < Fp.ORDER. */\n function acoord(title: string, n: T, banZero = false) {\n if (!Fp.isValid(n) || (banZero && Fp.is0(n))) throw new Error(`bad point coordinate ${title}`);\n return n;\n }\n\n function aprjpoint(other: unknown) {\n if (!(other instanceof Point)) throw new Error('Weierstrass Point expected');\n }\n\n function splitEndoScalarN(k: bigint) {\n if (!endo || !endo.basises) throw new Error('no endo');\n return _splitEndoScalar(k, endo.basises, Fn.ORDER);\n }\n\n // Memoized toAffine / validity check. They are heavy. Points are immutable.\n\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n const toAffineMemo = memoized((p: Point, iz?: T): AffinePoint<T> => {\n const { X, Y, Z } = p;\n // Fast-path for normalized points\n if (Fp.eql(Z, Fp.ONE)) return { x: X, y: Y };\n const is0 = p.is0();\n // If invZ was 0, we return zero point. However we still want to execute\n // all operations, so we replace invZ with a random number, 1.\n if (iz == null) iz = is0 ? Fp.ONE : Fp.inv(Z);\n const x = Fp.mul(X, iz);\n const y = Fp.mul(Y, iz);\n const zz = Fp.mul(Z, iz);\n if (is0) return { x: Fp.ZERO, y: Fp.ZERO };\n if (!Fp.eql(zz, Fp.ONE)) throw new Error('invZ was invalid');\n return { x, y };\n });\n // NOTE: on exception this will crash 'cached' and no value will be set.\n // Otherwise true will be return\n const assertValidMemo = memoized((p: Point) => {\n if (p.is0()) {\n // (0, 1, 0) aka ZERO is invalid in most contexts.\n // In BLS, ZERO can be serialized, so we allow it.\n // (0, 0, 0) is invalid representation of ZERO.\n if (extraOpts.allowInfinityPoint && !Fp.is0(p.Y)) return;\n throw new Error('bad point: ZERO');\n }\n // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n const { x, y } = p.toAffine();\n if (!Fp.isValid(x) || !Fp.isValid(y)) throw new Error('bad point: x or y not field elements');\n if (!isValidXY(x, y)) throw new Error('bad point: equation left != right');\n if (!p.isTorsionFree()) throw new Error('bad point: not in prime-order subgroup');\n return true;\n });\n\n function finishEndo(\n endoBeta: EndomorphismOpts['beta'],\n k1p: Point,\n k2p: Point,\n k1neg: boolean,\n k2neg: boolean\n ) {\n k2p = new Point(Fp.mul(k2p.X, endoBeta), k2p.Y, k2p.Z);\n k1p = negateCt(k1neg, k1p);\n k2p = negateCt(k2neg, k2p);\n return k1p.add(k2p);\n }\n\n /**\n * Projective Point works in 3d / projective (homogeneous) coordinates:(X, Y, Z) ∋ (x=X/Z, y=Y/Z).\n * Default Point works in 2d / affine coordinates: (x, y).\n * We're doing calculations in projective, because its operations don't require costly inversion.\n */\n class Point implements WeierstrassPoint<T> {\n // base / generator point\n static readonly BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n // zero / infinity / identity point\n static readonly ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n // math field\n static readonly Fp = Fp;\n // scalar field\n static readonly Fn = Fn;\n\n readonly X: T;\n readonly Y: T;\n readonly Z: T;\n\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n constructor(X: T, Y: T, Z: T) {\n this.X = acoord('x', X);\n this.Y = acoord('y', Y, true);\n this.Z = acoord('z', Z);\n Object.freeze(this);\n }\n\n static CURVE(): WeierstrassOpts<T> {\n return CURVE;\n }\n\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n static fromAffine(p: AffinePoint<T>): Point {\n const { x, y } = p || {};\n if (!p || !Fp.isValid(x) || !Fp.isValid(y)) throw new Error('invalid affine point');\n if (p instanceof Point) throw new Error('projective point not allowed');\n // (0, 0) would've produced (0, 0, 1) - instead, we need (0, 1, 0)\n if (Fp.is0(x) && Fp.is0(y)) return Point.ZERO;\n return new Point(x, y, Fp.ONE);\n }\n\n static fromBytes(bytes: Uint8Array): Point {\n const P = Point.fromAffine(decodePoint(abytes(bytes, undefined, 'point')));\n P.assertValidity();\n return P;\n }\n\n static fromHex(hex: string): Point {\n return Point.fromBytes(hexToBytes(hex));\n }\n\n get x(): T {\n return this.toAffine().x;\n }\n get y(): T {\n return this.toAffine().y;\n }\n\n /**\n *\n * @param windowSize\n * @param isLazy true will defer table computation until the first multiplication\n * @returns\n */\n precompute(windowSize: number = 8, isLazy = true): Point {\n wnaf.createCache(this, windowSize);\n if (!isLazy) this.multiply(_3n); // random number\n return this;\n }\n\n // TODO: return `this`\n /** A point on curve is valid if it conforms to equation. */\n assertValidity(): void {\n assertValidMemo(this);\n }\n\n hasEvenY(): boolean {\n const { y } = this.toAffine();\n if (!Fp.isOdd) throw new Error(\"Field doesn't support isOdd\");\n return !Fp.isOdd(y);\n }\n\n /** Compare one point to another. */\n equals(other: Point): boolean {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n return U1 && U2;\n }\n\n /** Flips point to one corresponding to (x, -y) in Affine coordinates. */\n negate(): Point {\n return new Point(this.X, Fp.neg(this.Y), this.Z);\n }\n\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a, b } = CURVE;\n const b3 = Fp.mul(b, _3n);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n let t0 = Fp.mul(X1, X1); // step 1\n let t1 = Fp.mul(Y1, Y1);\n let t2 = Fp.mul(Z1, Z1);\n let t3 = Fp.mul(X1, Y1);\n t3 = Fp.add(t3, t3); // step 5\n Z3 = Fp.mul(X1, Z1);\n Z3 = Fp.add(Z3, Z3);\n X3 = Fp.mul(a, Z3);\n Y3 = Fp.mul(b3, t2);\n Y3 = Fp.add(X3, Y3); // step 10\n X3 = Fp.sub(t1, Y3);\n Y3 = Fp.add(t1, Y3);\n Y3 = Fp.mul(X3, Y3);\n X3 = Fp.mul(t3, X3);\n Z3 = Fp.mul(b3, Z3); // step 15\n t2 = Fp.mul(a, t2);\n t3 = Fp.sub(t0, t2);\n t3 = Fp.mul(a, t3);\n t3 = Fp.add(t3, Z3);\n Z3 = Fp.add(t0, t0); // step 20\n t0 = Fp.add(Z3, t0);\n t0 = Fp.add(t0, t2);\n t0 = Fp.mul(t0, t3);\n Y3 = Fp.add(Y3, t0);\n t2 = Fp.mul(Y1, Z1); // step 25\n t2 = Fp.add(t2, t2);\n t0 = Fp.mul(t2, t3);\n X3 = Fp.sub(X3, t0);\n Z3 = Fp.mul(t2, t1);\n Z3 = Fp.add(Z3, Z3); // step 30\n Z3 = Fp.add(Z3, Z3);\n return new Point(X3, Y3, Z3);\n }\n\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(other: Point): Point {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n const a = CURVE.a;\n const b3 = Fp.mul(CURVE.b, _3n);\n let t0 = Fp.mul(X1, X2); // step 1\n let t1 = Fp.mul(Y1, Y2);\n let t2 = Fp.mul(Z1, Z2);\n let t3 = Fp.add(X1, Y1);\n let t4 = Fp.add(X2, Y2); // step 5\n t3 = Fp.mul(t3, t4);\n t4 = Fp.add(t0, t1);\n t3 = Fp.sub(t3, t4);\n t4 = Fp.add(X1, Z1);\n let t5 = Fp.add(X2, Z2); // step 10\n t4 = Fp.mul(t4, t5);\n t5 = Fp.add(t0, t2);\n t4 = Fp.sub(t4, t5);\n t5 = Fp.add(Y1, Z1);\n X3 = Fp.add(Y2, Z2); // step 15\n t5 = Fp.mul(t5, X3);\n X3 = Fp.add(t1, t2);\n t5 = Fp.sub(t5, X3);\n Z3 = Fp.mul(a, t4);\n X3 = Fp.mul(b3, t2); // step 20\n Z3 = Fp.add(X3, Z3);\n X3 = Fp.sub(t1, Z3);\n Z3 = Fp.add(t1, Z3);\n Y3 = Fp.mul(X3, Z3);\n t1 = Fp.add(t0, t0); // step 25\n t1 = Fp.add(t1, t0);\n t2 = Fp.mul(a, t2);\n t4 = Fp.mul(b3, t4);\n t1 = Fp.add(t1, t2);\n t2 = Fp.sub(t0, t2); // step 30\n t2 = Fp.mul(a, t2);\n t4 = Fp.add(t4, t2);\n t0 = Fp.mul(t1, t4);\n Y3 = Fp.add(Y3, t0);\n t0 = Fp.mul(t5, t4); // step 35\n X3 = Fp.mul(t3, X3);\n X3 = Fp.sub(X3, t0);\n t0 = Fp.mul(t3, t1);\n Z3 = Fp.mul(t5, Z3);\n Z3 = Fp.add(Z3, t0); // step 40\n return new Point(X3, Y3, Z3);\n }\n\n subtract(other: Point) {\n return this.add(other.negate());\n }\n\n is0(): boolean {\n return this.equals(Point.ZERO);\n }\n\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(scalar: bigint): Point {\n const { endo } = extraOpts;\n if (!Fn.isValidNot0(scalar)) throw new Error('invalid scalar: out of range'); // 0 is invalid\n let point: Point, fake: Point; // Fake point is used to const-time mult\n const mul = (n: bigint) => wnaf.cached(this, n, (p) => normalizeZ(Point, p));\n /** See docs for {@link EndomorphismOpts} */\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(scalar);\n const { p: k1p, f: k1f } = mul(k1);\n const { p: k2p, f: k2f } = mul(k2);\n fake = k1f.add(k2f);\n point = finishEndo(endo.beta, k1p, k2p, k1neg, k2neg);\n } else {\n const { p, f } = mul(scalar);\n point = p;\n fake = f;\n }\n // Normalize `z` for both points, but return only real one\n return normalizeZ(Point, [point, fake])[0];\n }\n\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed secret key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(sc: bigint): Point {\n const { endo } = extraOpts;\n const p = this as Point;\n if (!Fn.isValid(sc)) throw new Error('invalid scalar: out of range'); // 0 is valid\n if (sc === _0n || p.is0()) return Point.ZERO; // 0\n if (sc === _1n) return p; // 1\n if (wnaf.hasCache(this)) return this.multiply(sc); // precomputes\n // We don't have method for double scalar multiplication (aP + bQ):\n // Even with using Strauss-Shamir trick, it's 35% slower than naïve mul+add.\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(sc);\n const { p1, p2 } = mulEndoUnsafe(Point, p, k1, k2); // 30% faster vs wnaf.unsafe\n return finishEndo(endo.beta, p1, p2, k1neg, k2neg);\n } else {\n return wnaf.unsafe(p, sc);\n }\n }\n\n /**\n * Converts Projective point to affine (x, y) coordinates.\n * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch\n */\n toAffine(invertedZ?: T): AffinePoint<T> {\n return toAffineMemo(this, invertedZ);\n }\n\n /**\n * Checks whether Point is free of torsion elements (is in prime subgroup).\n * Always torsion-free for cofactor=1 curves.\n */\n isTorsionFree(): boolean {\n const { isTorsionFree } = extraOpts;\n if (cofactor === _1n) return true;\n if (isTorsionFree) return isTorsionFree(Point, this);\n return wnaf.unsafe(this, CURVE_ORDER).is0();\n }\n\n clearCofactor(): Point {\n const { clearCofactor } = extraOpts;\n if (cofactor === _1n) return this; // Fast-path\n if (clearCofactor) return clearCofactor(Point, this) as Point;\n return this.multiplyUnsafe(cofactor);\n }\n\n isSmallOrder(): boolean {\n // can we use this.clearCofactor()?\n return this.multiplyUnsafe(cofactor).is0();\n }\n\n toBytes(isCompressed = true): Uint8Array {\n abool(isCompressed, 'isCompressed');\n this.assertValidity();\n return encodePoint(Point, this, isCompressed);\n }\n\n toHex(isCompressed = true): string {\n return bytesToHex(this.toBytes(isCompressed));\n }\n\n toString() {\n return `<Point ${this.is0() ? 'ZERO' : this.toHex()}>`;\n }\n }\n const bits = Fn.BITS;\n const wnaf = new wNAF(Point, extraOpts.endo ? Math.ceil(bits / 2) : bits);\n Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n return Point;\n}\n\n/** Methods of ECDSA signature instance. */\nexport interface ECDSASignature {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n addRecoveryBit(recovery: number): ECDSASignature & { readonly recovery: number };\n hasHighS(): boolean;\n recoverPublicKey(messageHash: Uint8Array): WeierstrassPoint<bigint>;\n toBytes(format?: string): Uint8Array;\n toHex(format?: string): string;\n}\n/** Methods of ECDSA signature constructor. */\nexport type ECDSASignatureCons = {\n new (r: bigint, s: bigint, recovery?: number): ECDSASignature;\n fromBytes(bytes: Uint8Array, format?: ECDSASignatureFormat): ECDSASignature;\n fromHex(hex: string, format?: ECDSASignatureFormat): ECDSASignature;\n};\n\n// Points start with byte 0x02 when y is even; otherwise 0x03\nfunction pprefix(hasEvenY: boolean): Uint8Array {\n return Uint8Array.of(hasEvenY ? 0x02 : 0x03);\n}\n\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nexport function SWUFpSqrtRatio<T>(\n Fp: IField<T>,\n Z: T\n): (u: T, v: T) => { isValid: boolean; value: T } {\n // Generic implementation\n const q = Fp.ORDER;\n let l = _0n;\n for (let o = q - _1n; o % _2n === _0n; o /= _2n) l += _1n;\n const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n // 2n ** c1 == 2n << (c1-1)\n const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic\n const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic\n const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic\n const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic\n const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n let sqrtRatio = (u: T, v: T): { isValid: boolean; value: T } => {\n let tv1 = c6; // 1. tv1 = c6\n let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n // 17. for i in (c1, c1 - 1, ..., 2):\n for (let i = c1; i > _1n; i--) {\n let tv5 = i - _2n; // 18. tv5 = i - 2\n tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5\n let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5\n const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1\n tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1\n tv1 = Fp.mul(tv1, tv1); // 23. tv1 = tv1 * tv1\n tvv5 = Fp.mul(tv4, tv1); // 24. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, e1); // 25. tv3 = CMOV(tv2, tv3, e1)\n tv4 = Fp.cmov(tvv5, tv4, e1); // 26. tv4 = CMOV(tv5, tv4, e1)\n }\n return { isValid: isQR, value: tv3 };\n };\n if (Fp.ORDER % _4n === _3n) {\n // sqrt_ratio_3mod4(u, v)\n const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4 # Integer arithmetic\n const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n sqrtRatio = (u: T, v: T) => {\n let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n };\n }\n // No curves uses that\n // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nexport function mapToCurveSimpleSWU<T>(\n Fp: IField<T>,\n opts: {\n A: T;\n B: T;\n Z: T;\n }\n): (u: T) => { x: T; y: T } {\n validateField(Fp);\n const { A, B, Z } = opts;\n if (!Fp.isValid(A) || !Fp.isValid(B) || !Fp.isValid(Z))\n throw new Error('mapToCurveSimpleSWU: invalid opts');\n const sqrtRatio = SWUFpSqrtRatio(Fp, Z);\n if (!Fp.isOdd) throw new Error('Field does not have .isOdd()');\n // Input: u, an element of F.\n // Output: (x, y), a point on E.\n return (u: T): { x: T; y: T } => {\n // prettier-ignore\n let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, Z); // 2. tv1 = Z * tv1\n tv2 = Fp.sqr(tv1); // 3. tv2 = tv1^2\n tv2 = Fp.add(tv2, tv1); // 4. tv2 = tv2 + tv1\n tv3 = Fp.add(tv2, Fp.ONE); // 5. tv3 = tv2 + 1\n tv3 = Fp.mul(tv3, B); // 6. tv3 = B * tv3\n tv4 = Fp.cmov(Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7. tv4 = CMOV(Z, -tv2, tv2 != 0)\n tv4 = Fp.mul(tv4, A); // 8. tv4 = A * tv4\n tv2 = Fp.sqr(tv3); // 9. tv2 = tv3^2\n tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n tv5 = Fp.mul(tv6, A); // 11. tv5 = A * tv6\n tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n tv5 = Fp.mul(tv6, B); // 15. tv5 = B * tv6\n tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n x = Fp.mul(tv1, tv3); // 17. x = tv1 * tv3\n const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n y = Fp.mul(tv1, u); // 19. y = tv1 * u -> Z * u^3 * y1\n y = Fp.mul(y, value); // 20. y = y * y1\n x = Fp.cmov(x, tv3, isValid); // 21. x = CMOV(x, tv3, is_gx1_square)\n y = Fp.cmov(y, value, isValid); // 22. y = CMOV(y, y1, is_gx1_square)\n const e1 = Fp.isOdd!(u) === Fp.isOdd!(y); // 23. e1 = sgn0(u) == sgn0(y)\n y = Fp.cmov(Fp.neg(y), y, e1); // 24. y = CMOV(-y, y, e1)\n const tv4_inv = FpInvertBatch(Fp, [tv4], true)[0];\n x = Fp.mul(x, tv4_inv); // 25. x = x / tv4\n return { x, y };\n };\n}\n\nfunction getWLengths<T>(Fp: IField<T>, Fn: IField<bigint>) {\n return {\n secretKey: Fn.BYTES,\n publicKey: 1 + Fp.BYTES,\n publicKeyUncompressed: 1 + 2 * Fp.BYTES,\n publicKeyHasPrefix: true,\n signature: 2 * Fn.BYTES,\n };\n}\n\n/**\n * Sometimes users only need getPublicKey, getSharedSecret, and secret key handling.\n * This helper ensures no signature functionality is present. Less code, smaller bundle size.\n */\nexport function ecdh(\n Point: WeierstrassPointCons<bigint>,\n ecdhOpts: { randomBytes?: (bytesLength?: number) => Uint8Array } = {}\n): ECDH {\n const { Fn } = Point;\n const randomBytes_ = ecdhOpts.randomBytes || wcRandomBytes;\n const lengths = Object.assign(getWLengths(Point.Fp, Fn), { seed: getMinHashLength(Fn.ORDER) });\n\n function isValidSecretKey(secretKey: Uint8Array) {\n try {\n const num = Fn.fromBytes(secretKey);\n return Fn.isValidNot0(num);\n } catch (error) {\n return false;\n }\n }\n\n function isValidPublicKey(publicKey: Uint8Array, isCompressed?: boolean): boolean {\n const { publicKey: comp, publicKeyUncompressed } = lengths;\n try {\n const l = publicKey.length;\n if (isCompressed === true && l !== comp) return false;\n if (isCompressed === false && l !== publicKeyUncompressed) return false;\n return !!Point.fromBytes(publicKey);\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Produces cryptographically secure secret key from random of size\n * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n */\n function randomSecretKey(seed = randomBytes_(lengths.seed)): Uint8Array {\n return mapHashToField(abytes(seed, lengths.seed, 'seed'), Fn.ORDER);\n }\n\n /**\n * Computes public key for a secret key. Checks for validity of the secret key.\n * @param isCompressed whether to return compact (default), or full key\n * @returns Public key, full when isCompressed=false; short when isCompressed=true\n */\n function getPublicKey(secretKey: Uint8Array, isCompressed = true): Uint8Array {\n return Point.BASE.multiply(Fn.fromBytes(secretKey)).toBytes(isCompressed);\n }\n\n /**\n * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n */\n function isProbPub(item: Uint8Array): boolean | undefined {\n const { secretKey, publicKey, publicKeyUncompressed } = lengths;\n if (!isBytes(item)) return undefined;\n if (('_lengths' in Fn && Fn._lengths) || secretKey === publicKey) return undefined;\n const l = abytes(item, undefined, 'key').length;\n return l === publicKey || l === publicKeyUncompressed;\n }\n\n /**\n * ECDH (Elliptic Curve Diffie Hellman).\n * Computes shared public key from secret key A and public key B.\n * Checks: 1) secret key validity 2) shared key is on-curve.\n * Does NOT hash the result.\n * @param isCompressed whether to return compact (default), or full key\n * @returns shared public key\n */\n function getSharedSecret(\n secretKeyA: Uint8Array,\n publicKeyB: Uint8Array,\n isCompressed = true\n ): Uint8Array {\n if (isProbPub(secretKeyA) === true) throw new Error('first arg must be private key');\n if (isProbPub(publicKeyB) === false) throw new Error('second arg must be public key');\n const s = Fn.fromBytes(secretKeyA);\n const b = Point.fromBytes(publicKeyB); // checks for being on-curve\n return b.multiply(s).toBytes(isCompressed);\n }\n\n const utils = {\n isValidSecretKey,\n isValidPublicKey,\n randomSecretKey,\n };\n const keygen = createKeygen(randomSecretKey, getPublicKey);\n\n return Object.freeze({ getPublicKey, getSharedSecret, keygen, Point, utils, lengths });\n}\n\n/**\n * Creates ECDSA signing interface for given elliptic curve `Point` and `hash` function.\n *\n * @param Point created using {@link weierstrass} function\n * @param hash used for 1) message prehash-ing 2) k generation in `sign`, using hmac_drbg(hash)\n * @param ecdsaOpts rarely needed, see {@link ECDSAOpts}\n *\n * @example\n * ```js\n * const p256_Point = weierstrass(...);\n * const p256_sha256 = ecdsa(p256_Point, sha256);\n * const p256_sha224 = ecdsa(p256_Point, sha224);\n * const p256_sha224_r = ecdsa(p256_Point, sha224, { randomBytes: (length) => { ... } });\n * ```\n */\nexport function ecdsa(\n Point: WeierstrassPointCons<bigint>,\n hash: CHash,\n ecdsaOpts: ECDSAOpts = {}\n): ECDSA {\n ahash(hash);\n validateObject(\n ecdsaOpts,\n {},\n {\n hmac: 'function',\n lowS: 'boolean',\n randomBytes: 'function',\n bits2int: 'function',\n bits2int_modN: 'function',\n }\n );\n ecdsaOpts = Object.assign({}, ecdsaOpts);\n const randomBytes = ecdsaOpts.randomBytes || wcRandomBytes;\n const hmac = ecdsaOpts.hmac || ((key, msg) => nobleHmac(hash, key, msg));\n\n const { Fp, Fn } = Point;\n const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn;\n const { keygen, getPublicKey, getSharedSecret, utils, lengths } = ecdh(Point, ecdsaOpts);\n const defaultSigOpts: Required<ECDSASignOpts> = {\n prehash: true,\n lowS: typeof ecdsaOpts.lowS === 'boolean' ? ecdsaOpts.lowS : true,\n format: 'compact' as ECDSASignatureFormat,\n extraEntropy: false,\n };\n const hasLargeCofactor = CURVE_ORDER * _2n < Fp.ORDER; // Won't CURVE().h > 2n be more effective?\n\n function isBiggerThanHalfOrder(number: bigint) {\n const HALF = CURVE_ORDER >> _1n;\n return number > HALF;\n }\n function validateRS(title: string, num: bigint): bigint {\n if (!Fn.isValidNot0(num))\n throw new Error(`invalid signature ${title}: out of range 1..Point.Fn.ORDER`);\n return num;\n }\n function assertSmallCofactor(): void {\n // ECDSA recovery is hard for cofactor > 1 curves.\n // In sign, `r = q.x mod n`, and here we recover q.x from r.\n // While recovering q.x >= n, we need to add r+n for cofactor=1 curves.\n // However, for cofactor>1, r+n may not get q.x:\n // r+n*i would need to be done instead where i is unknown.\n // To easily get i, we either need to:\n // a. increase amount of valid recid values (4, 5...); OR\n // b. prohibit non-prime-order signatures (recid > 1).\n if (hasLargeCofactor)\n throw new Error('\"recovered\" sig type is not supported for cofactor >2 curves');\n }\n function validateSigLength(bytes: Uint8Array, format: ECDSASignatureFormat) {\n validateSigFormat(format);\n const size = lengths.signature!;\n const sizer = format === 'compact' ? size : format === 'recovered' ? size + 1 : undefined;\n return abytes(bytes, sizer);\n }\n\n /**\n * ECDSA signature with its (r, s) properties. Supports compact, recovered & DER representations.\n */\n class Signature implements ECDSASignature {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n\n constructor(r: bigint, s: bigint, recovery?: number) {\n this.r = validateRS('r', r); // r in [1..N-1];\n this.s = validateRS('s', s); // s in [1..N-1];\n if (recovery != null) {\n assertSmallCofactor();\n if (![0, 1, 2, 3].includes(recovery)) throw new Error('invalid recovery id');\n this.recovery = recovery;\n }\n Object.freeze(this);\n }\n\n static fromBytes(\n bytes: Uint8Array,\n format: ECDSASignatureFormat = defaultSigOpts.format\n ): Signature {\n validateSigLength(bytes, format);\n let recid: number | undefined;\n if (format === 'der') {\n const { r, s } = DER.toSig(abytes(bytes));\n return new Signature(r, s);\n }\n if (format === 'recovered') {\n recid = bytes[0];\n format = 'compact';\n bytes = bytes.subarray(1);\n }\n const L = lengths.signature! / 2;\n const r = bytes.subarray(0, L);\n const s = bytes.subarray(L, L * 2);\n return new Signature(Fn.fromBytes(r), Fn.fromBytes(s), recid);\n }\n\n static fromHex(hex: string, format?: ECDSASignatureFormat) {\n return this.fromBytes(hexToBytes(hex), format);\n }\n\n private assertRecovery(): number {\n const { recovery } = this;\n if (recovery == null) throw new Error('invalid recovery id: must be present');\n return recovery;\n }\n\n addRecoveryBit(recovery: number): RecoveredSignature {\n return new Signature(this.r, this.s, recovery) as RecoveredSignature;\n }\n\n recoverPublicKey(messageHash: Uint8Array): WeierstrassPoint<bigint> {\n const { r, s } = this;\n const recovery = this.assertRecovery();\n const radj = recovery === 2 || recovery === 3 ? r + CURVE_ORDER : r;\n if (!Fp.isValid(radj)) throw new Error('invalid recovery id: sig.r+curve.n != R.x');\n const x = Fp.toBytes(radj);\n const R = Point.fromBytes(concatBytes(pprefix((recovery & 1) === 0), x));\n const ir = Fn.inv(radj); // r^-1\n const h = bits2int_modN(abytes(messageHash, undefined, 'msgHash')); // Truncate hash\n const u1 = Fn.create(-h * ir); // -hr^-1\n const u2 = Fn.create(s * ir); // sr^-1\n // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1). unsafe is fine: there is no private data.\n const Q = Point.BASE.multiplyUnsafe(u1).add(R.multiplyUnsafe(u2));\n if (Q.is0()) throw new Error('invalid recovery: point at infinify');\n Q.assertValidity();\n return Q;\n }\n\n // Signatures should be low-s, to prevent malleability.\n hasHighS(): boolean {\n return isBiggerThanHalfOrder(this.s);\n }\n\n toBytes(format: ECDSASignatureFormat = defaultSigOpts.format) {\n validateSigFormat(format);\n if (format === 'der') return hexToBytes(DER.hexFromSig(this));\n const { r, s } = this;\n const rb = Fn.toBytes(r);\n const sb = Fn.toBytes(s);\n if (format === 'recovered') {\n assertSmallCofactor();\n return concatBytes(Uint8Array.of(this.assertRecovery()), rb, sb);\n }\n return concatBytes(rb, sb);\n }\n\n toHex(format?: ECDSASignatureFormat) {\n return bytesToHex(this.toBytes(format));\n }\n }\n type RecoveredSignature = Signature & { recovery: number };\n\n // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n const bits2int =\n ecdsaOpts.bits2int ||\n function bits2int_def(bytes: Uint8Array): bigint {\n // Our custom check \"just in case\", for protection against DoS\n if (bytes.length > 8192) throw new Error('input is too large');\n // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n // for some cases, since bytes.length * 8 is not actual bitLength.\n const num = bytesToNumberBE(bytes); // check for == u8 done here\n const delta = bytes.length * 8 - fnBits; // truncate to nBitLength leftmost bits\n return delta > 0 ? num >> BigInt(delta) : num;\n };\n const bits2int_modN =\n ecdsaOpts.bits2int_modN ||\n function bits2int_modN_def(bytes: Uint8Array): bigint {\n return Fn.create(bits2int(bytes)); // can't use bytesToNumberBE here\n };\n // Pads output with zero as per spec\n const ORDER_MASK = bitMask(fnBits);\n /** Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`. */\n function int2octets(num: bigint): Uint8Array {\n // IMPORTANT: the check ensures working for case `Fn.BYTES != Fn.BITS * 8`\n aInRange('num < 2^' + fnBits, num, _0n, ORDER_MASK);\n return Fn.toBytes(num);\n }\n\n function validateMsgAndHash(message: Uint8Array, prehash: boolean) {\n abytes(message, undefined, 'message');\n return prehash ? abytes(hash(message), undefined, 'prehashed message') : message;\n }\n\n /**\n * Steps A, D of RFC6979 3.2.\n * Creates RFC6979 seed; converts msg/privKey to numbers.\n * Used only in sign, not in verify.\n *\n * Warning: we cannot assume here that message has same amount of bytes as curve order,\n * this will be invalid at least for P521. Also it can be bigger for P224 + SHA256.\n */\n function prepSig(message: Uint8Array, secretKey: Uint8Array, opts: ECDSASignOpts) {\n const { lowS, prehash, extraEntropy } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash); // RFC6979 3.2 A: h1 = H(m)\n // We can't later call bits2octets, since nested bits2int is broken for curves\n // with fnBits % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n const h1int = bits2int_modN(message);\n const d = Fn.fromBytes(secretKey); // validate secret key, convert to bigint\n if (!Fn.isValidNot0(d)) throw new Error('invalid private key');\n const seedArgs = [int2octets(d), int2octets(h1int)];\n // extraEntropy. RFC6979 3.6: additional k' (optional).\n if (extraEntropy != null && extraEntropy !== false) {\n // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n // gen random bytes OR pass as-is\n const e = extraEntropy === true ? randomBytes(lengths.secretKey) : extraEntropy;\n seedArgs.push(abytes(e, undefined, 'extraEntropy')); // check for being bytes\n }\n const seed = concatBytes(...seedArgs); // Step D of RFC6979 3.2\n const m = h1int; // no need to call bits2int second time here, it is inside truncateHash!\n // Converts signature params into point w r/s, checks result for validity.\n // To transform k => Signature:\n // q = k⋅G\n // r = q.x mod n\n // s = k^-1(m + rd) mod n\n // Can use scalar blinding b^-1(bm + bdr) where b ∈ [1,q−1] according to\n // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n function k2sig(kBytes: Uint8Array): Signature | undefined {\n // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n // Important: all mod() calls here must be done over N\n const k = bits2int(kBytes); // Cannot use fields methods, since it is group element\n if (!Fn.isValidNot0(k)) return; // Valid scalars (including k) must be in 1..N-1\n const ik = Fn.inv(k); // k^-1 mod n\n const q = Point.BASE.multiply(k).toAffine(); // q = k⋅G\n const r = Fn.create(q.x); // r = q.x mod n\n if (r === _0n) return;\n const s = Fn.create(ik * Fn.create(m + r * d)); // s = k^-1(m + rd) mod n\n if (s === _0n) return;\n let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3 when q.x>n)\n let normS = s;\n if (lowS && isBiggerThanHalfOrder(s)) {\n normS = Fn.neg(s); // if lowS was passed, ensure s is always in the bottom half of N\n recovery ^= 1;\n }\n return new Signature(r, normS, hasLargeCofactor ? undefined : recovery);\n }\n return { seed, k2sig };\n }\n\n /**\n * Signs message hash with a secret key.\n *\n * ```\n * sign(m, d) where\n * k = rfc6979_hmac_drbg(m, d)\n * (x, y) = G × k\n * r = x mod n\n * s = (m + dr) / k mod n\n * ```\n */\n function sign(message: Uint8Array, secretKey: Uint8Array, opts: ECDSASignOpts = {}): Uint8Array {\n const { seed, k2sig } = prepSig(message, secretKey, opts); // Steps A, D of RFC6979 3.2.\n const drbg = createHmacDrbg<Signature>(hash.outputLen, Fn.BYTES, hmac);\n const sig = drbg(seed, k2sig); // Steps B, C, D, E, F, G\n return sig.toBytes(opts.format);\n }\n\n /**\n * Verifies a signature against message and public key.\n * Rejects lowS signatures by default: see {@link ECDSAVerifyOpts}.\n * Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n *\n * ```\n * verify(r, s, h, P) where\n * u1 = hs^-1 mod n\n * u2 = rs^-1 mod n\n * R = u1⋅G + u2⋅P\n * mod(R.x, n) == r\n * ```\n */\n function verify(\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n opts: ECDSAVerifyOpts = {}\n ): boolean {\n const { lowS, prehash, format } = validateSigOpts(opts, defaultSigOpts);\n publicKey = abytes(publicKey, undefined, 'publicKey');\n message = validateMsgAndHash(message, prehash);\n if (!isBytes(signature as any)) {\n const end = signature instanceof Signature ? ', use sig.toBytes()' : '';\n throw new Error('verify expects Uint8Array signature' + end);\n }\n validateSigLength(signature, format); // execute this twice because we want loud error\n try {\n const sig = Signature.fromBytes(signature, format);\n const P = Point.fromBytes(publicKey);\n if (lowS && sig.hasHighS()) return false;\n const { r, s } = sig;\n const h = bits2int_modN(message); // mod n, not mod p\n const is = Fn.inv(s); // s^-1 mod n\n const u1 = Fn.create(h * is); // u1 = hs^-1 mod n\n const u2 = Fn.create(r * is); // u2 = rs^-1 mod n\n const R = Point.BASE.multiplyUnsafe(u1).add(P.multiplyUnsafe(u2)); // u1⋅G + u2⋅P\n if (R.is0()) return false;\n const v = Fn.create(R.x); // v = r.x mod n\n return v === r;\n } catch (e) {\n return false;\n }\n }\n\n function recoverPublicKey(\n signature: Uint8Array,\n message: Uint8Array,\n opts: ECDSARecoverOpts = {}\n ): Uint8Array {\n const { prehash } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash);\n return Signature.fromBytes(signature, 'recovered').recoverPublicKey(message).toBytes();\n }\n\n return Object.freeze({\n keygen,\n getPublicKey,\n getSharedSecret,\n utils,\n lengths,\n Point,\n sign,\n verify,\n recoverPublicKey,\n Signature,\n hash,\n }) satisfies Signer;\n}\n","/**\n * SECG secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Belongs to Koblitz curves: it has efficiently-computable GLV endomorphism ψ,\n * check out {@link EndomorphismOpts}. Seems to be rigid (not backdoored).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { randomBytes } from '@noble/hashes/utils.js';\nimport { createKeygen, type CurveLengths } from './abstract/curve.ts';\nimport { createHasher, type H2CHasher, isogenyMap } from './abstract/hash-to-curve.ts';\nimport { Field, mapHashToField, pow2 } from './abstract/modular.ts';\nimport {\n type ECDSA,\n ecdsa,\n type EndomorphismOpts,\n mapToCurveSimpleSWU,\n type WeierstrassPoint as PointType,\n weierstrass,\n type WeierstrassOpts,\n type WeierstrassPointCons,\n} from './abstract/weierstrass.ts';\nimport { abytes, asciiToBytes, bytesToNumberBE, concatBytes } from './utils.ts';\n\n// Seems like generator was produced from some seed:\n// `Pointk1.BASE.multiply(Pointk1.Fn.inv(2n, N)).toAffine().x`\n// // gives short x 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63n\nconst secp256k1_CURVE: WeierstrassOpts<bigint> = {\n p: BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'),\n n: BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'),\n h: BigInt(1),\n a: BigInt(0),\n b: BigInt(7),\n Gx: BigInt('0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'),\n Gy: BigInt('0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'),\n};\n\nconst secp256k1_ENDO: EndomorphismOpts = {\n beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n basises: [\n [BigInt('0x3086d221a7d46bcde86c90e49284eb15'), -BigInt('0xe4437ed6010e88286f547fa90abfe4c3')],\n [BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8'), BigInt('0x3086d221a7d46bcde86c90e49284eb15')],\n ],\n};\n\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _2n = /* @__PURE__ */ BigInt(2);\n\n/**\n * √n = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y: bigint): bigint {\n const P = secp256k1_CURVE.p;\n // prettier-ignore\n const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n // prettier-ignore\n const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n const b2 = (y * y * y) % P; // x^3, 11\n const b3 = (b2 * b2 * y) % P; // x^7\n const b6 = (pow2(b3, _3n, P) * b3) % P;\n const b9 = (pow2(b6, _3n, P) * b3) % P;\n const b11 = (pow2(b9, _2n, P) * b2) % P;\n const b22 = (pow2(b11, _11n, P) * b11) % P;\n const b44 = (pow2(b22, _22n, P) * b22) % P;\n const b88 = (pow2(b44, _44n, P) * b44) % P;\n const b176 = (pow2(b88, _88n, P) * b88) % P;\n const b220 = (pow2(b176, _44n, P) * b44) % P;\n const b223 = (pow2(b220, _3n, P) * b3) % P;\n const t1 = (pow2(b223, _23n, P) * b22) % P;\n const t2 = (pow2(t1, _6n, P) * b2) % P;\n const root = pow2(t2, _2n, P);\n if (!Fpk1.eql(Fpk1.sqr(root), y)) throw new Error('Cannot find square root');\n return root;\n}\n\nconst Fpk1 = Field(secp256k1_CURVE.p, { sqrt: sqrtMod });\nconst Pointk1 = /* @__PURE__ */ weierstrass(secp256k1_CURVE, {\n Fp: Fpk1,\n endo: secp256k1_ENDO,\n});\n\n/**\n * secp256k1 curve: ECDSA and ECDH methods.\n *\n * Uses sha256 to hash messages. To use a different hash,\n * pass `{ prehash: false }` to sign / verify.\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1.js';\n * const { secretKey, publicKey } = secp256k1.keygen();\n * // const publicKey = secp256k1.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello noble');\n * const sig = secp256k1.sign(msg, secretKey);\n * const isValid = secp256k1.verify(sig, msg, publicKey);\n * // const sigKeccak = secp256k1.sign(keccak256(msg), secretKey, { prehash: false });\n * ```\n */\nexport const secp256k1: ECDSA = /* @__PURE__ */ ecdsa(Pointk1, sha256);\n\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES: { [tag: string]: Uint8Array } = {};\nfunction taggedHash(tag: string, ...messages: Uint8Array[]): Uint8Array {\n let tagP = TAGGED_HASH_PREFIXES[tag];\n if (tagP === undefined) {\n const tagH = sha256(asciiToBytes(tag));\n tagP = concatBytes(tagH, tagH);\n TAGGED_HASH_PREFIXES[tag] = tagP;\n }\n return sha256(concatBytes(tagP, ...messages));\n}\n\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point: PointType<bigint>) => point.toBytes(true).slice(1);\nconst hasEven = (y: bigint) => y % _2n === _0n;\n\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv: Uint8Array) {\n const { Fn, BASE } = Pointk1;\n const d_ = Fn.fromBytes(priv);\n const p = BASE.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside\n const scalar = hasEven(p.y) ? d_ : Fn.neg(d_);\n return { scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x: bigint): PointType<bigint> {\n const Fp = Fpk1;\n if (!Fp.isValidNot0(x)) throw new Error('invalid x: Fail if x ≥ p');\n const xx = Fp.create(x * x);\n const c = Fp.create(xx * x + BigInt(7)); // Let c = x³ + 7 mod p.\n let y = Fp.sqrt(c); // Let y = c^(p+1)/4 mod p. Same as sqrt().\n // Return the unique point P such that x(P) = x and\n // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n if (!hasEven(y)) y = Fp.neg(y);\n const p = Pointk1.fromAffine({ x, y });\n p.assertValidity();\n return p;\n}\nconst num = bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args: Uint8Array[]): bigint {\n return Pointk1.Fn.create(num(taggedHash('BIP0340/challenge', ...args)));\n}\n\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(secretKey: Uint8Array): Uint8Array {\n return schnorrGetExtPubKey(secretKey).bytes; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)\n}\n\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(\n message: Uint8Array,\n secretKey: Uint8Array,\n auxRand: Uint8Array = randomBytes(32)\n): Uint8Array {\n const { Fn } = Pointk1;\n const m = abytes(message, undefined, 'message');\n const { bytes: px, scalar: d } = schnorrGetExtPubKey(secretKey); // checks for isWithinCurveOrder\n const a = abytes(auxRand, 32, 'auxRand'); // Auxiliary random data a: a 32-byte array\n const t = Fn.toBytes(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n // Let k' = int(rand) mod n. Fail if k' = 0. Let R = k'⋅G\n const { bytes: rx, scalar: k } = schnorrGetExtPubKey(rand);\n const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n sig.set(rx, 0);\n sig.set(Fn.toBytes(Fn.create(k + e * d)), 32);\n // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n if (!schnorrVerify(sig, m, px)) throw new Error('sign: Invalid signature produced');\n return sig;\n}\n\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature: Uint8Array, message: Uint8Array, publicKey: Uint8Array): boolean {\n const { Fp, Fn, BASE } = Pointk1;\n const sig = abytes(signature, 64, 'signature');\n const m = abytes(message, undefined, 'message');\n const pub = abytes(publicKey, 32, 'publicKey');\n try {\n const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r ≥ p.\n if (!Fp.isValidNot0(r)) return false;\n const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s ≥ n.\n if (!Fn.isValidNot0(s)) return false;\n\n const e = challenge(Fn.toBytes(r), pointToBytes(P), m); // int(challenge(bytes(r)||bytes(P)||m))%n\n // R = s⋅G - e⋅P, where -eP == (n-e)P\n const R = BASE.multiplyUnsafe(s).add(P.multiplyUnsafe(Fn.neg(e)));\n const { x, y } = R.toAffine();\n // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.\n if (R.is0() || !hasEven(y) || x !== r) return false;\n return true;\n } catch (error) {\n return false;\n }\n}\n\nexport type SecpSchnorr = {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: typeof schnorrGetPublicKey;\n sign: typeof schnorrSign;\n verify: typeof schnorrVerify;\n Point: WeierstrassPointCons<bigint>;\n utils: {\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n pointToBytes: (point: PointType<bigint>) => Uint8Array;\n lift_x: typeof lift_x;\n taggedHash: typeof taggedHash;\n };\n lengths: CurveLengths;\n};\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1.js';\n * const { secretKey, publicKey } = schnorr.keygen();\n * // const publicKey = schnorr.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, secretKey);\n * const isValid = schnorr.verify(sig, msg, publicKey);\n * ```\n */\nexport const schnorr: SecpSchnorr = /* @__PURE__ */ (() => {\n const size = 32;\n const seedLength = 48;\n const randomSecretKey = (seed = randomBytes(seedLength)): Uint8Array => {\n return mapHashToField(seed, secp256k1_CURVE.n);\n };\n return {\n keygen: createKeygen(randomSecretKey, schnorrGetPublicKey),\n getPublicKey: schnorrGetPublicKey,\n sign: schnorrSign,\n verify: schnorrVerify,\n Point: Pointk1,\n utils: {\n randomSecretKey,\n taggedHash,\n lift_x,\n pointToBytes,\n },\n lengths: {\n secretKey: size,\n publicKey: size,\n publicKeyHasPrefix: false,\n signature: size * 2,\n seed: seedLength,\n },\n };\n})();\n\nconst isoMap = /* @__PURE__ */ (() =>\n isogenyMap(\n Fpk1,\n [\n // xNum\n [\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n ],\n // xDen\n [\n '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n // yNum\n [\n '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n ],\n // yDen\n [\n '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n ].map((i) => i.map((j) => BigInt(j))) as [bigint[], bigint[], bigint[], bigint[]]\n ))();\nconst mapSWU = /* @__PURE__ */ (() =>\n mapToCurveSimpleSWU(Fpk1, {\n A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n B: BigInt('1771'),\n Z: Fpk1.create(BigInt('-11')),\n }))();\n\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nexport const secp256k1_hasher: H2CHasher<WeierstrassPointCons<bigint>> = /* @__PURE__ */ (() =>\n createHasher(\n Pointk1,\n (scalars: bigint[]) => {\n const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n return isoMap(x, y);\n },\n {\n DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n p: Fpk1.ORDER,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha256,\n }\n ))();\n","/**\n\nSHA1 (RFC 3174), MD5 (RFC 1321) and RIPEMD160 (RFC 2286) legacy, weak hash functions.\nDon't use them in a new protocol. What \"weak\" means:\n\n- Collisions can be made with 2^18 effort in MD5, 2^60 in SHA1, 2^80 in RIPEMD160.\n- No practical pre-image attacks (only theoretical, 2^123.4)\n- HMAC seems kinda ok: https://www.rfc-editor.org/rfc/rfc6151\n * @module\n */\nimport { Chi, HashMD, Maj } from './_md.ts';\nimport { type CHash, clean, createHasher, rotl } from './utils.ts';\n\n/** Initial SHA1 state */\nconst SHA1_IV = /* @__PURE__ */ Uint32Array.from([\n 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0,\n]);\n\n// Reusable temporary buffer\nconst SHA1_W = /* @__PURE__ */ new Uint32Array(80);\n\n/** Internal SHA1 legacy hash class. */\nexport class _SHA1 extends HashMD<_SHA1> {\n private A = SHA1_IV[0] | 0;\n private B = SHA1_IV[1] | 0;\n private C = SHA1_IV[2] | 0;\n private D = SHA1_IV[3] | 0;\n private E = SHA1_IV[4] | 0;\n\n constructor() {\n super(64, 20, 8, false);\n }\n protected get(): [number, number, number, number, number] {\n const { A, B, C, D, E } = this;\n return [A, B, C, D, E];\n }\n protected set(A: number, B: number, C: number, D: number, E: number): void {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n }\n protected process(view: DataView, offset: number): void {\n for (let i = 0; i < 16; i++, offset += 4) SHA1_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 80; i++)\n SHA1_W[i] = rotl(SHA1_W[i - 3] ^ SHA1_W[i - 8] ^ SHA1_W[i - 14] ^ SHA1_W[i - 16], 1);\n // Compression function main loop, 80 rounds\n let { A, B, C, D, E } = this;\n for (let i = 0; i < 80; i++) {\n let F, K;\n if (i < 20) {\n F = Chi(B, C, D);\n K = 0x5a827999;\n } else if (i < 40) {\n F = B ^ C ^ D;\n K = 0x6ed9eba1;\n } else if (i < 60) {\n F = Maj(B, C, D);\n K = 0x8f1bbcdc;\n } else {\n F = B ^ C ^ D;\n K = 0xca62c1d6;\n }\n const T = (rotl(A, 5) + F + E + K + SHA1_W[i]) | 0;\n E = D;\n D = C;\n C = rotl(B, 30);\n B = A;\n A = T;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n this.set(A, B, C, D, E);\n }\n protected roundClean(): void {\n clean(SHA1_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\n/** SHA1 (RFC 3174) legacy hash function. It was cryptographically broken. */\nexport const sha1: CHash = /* @__PURE__ */ createHasher(() => new _SHA1());\n\n/** Per-round constants */\nconst p32 = /* @__PURE__ */ Math.pow(2, 32);\nconst K = /* @__PURE__ */ Array.from({ length: 64 }, (_, i) =>\n Math.floor(p32 * Math.abs(Math.sin(i + 1)))\n);\n\n/** md5 initial state: same as sha1, but 4 u32 instead of 5. */\nconst MD5_IV = /* @__PURE__ */ SHA1_IV.slice(0, 4);\n\n// Reusable temporary buffer\nconst MD5_W = /* @__PURE__ */ new Uint32Array(16);\n/** Internal MD5 legacy hash class. */\nexport class _MD5 extends HashMD<_MD5> {\n private A = MD5_IV[0] | 0;\n private B = MD5_IV[1] | 0;\n private C = MD5_IV[2] | 0;\n private D = MD5_IV[3] | 0;\n\n constructor() {\n super(64, 16, 8, true);\n }\n protected get(): [number, number, number, number] {\n const { A, B, C, D } = this;\n return [A, B, C, D];\n }\n protected set(A: number, B: number, C: number, D: number): void {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n }\n protected process(view: DataView, offset: number): void {\n for (let i = 0; i < 16; i++, offset += 4) MD5_W[i] = view.getUint32(offset, true);\n // Compression function main loop, 64 rounds\n let { A, B, C, D } = this;\n for (let i = 0; i < 64; i++) {\n let F, g, s;\n if (i < 16) {\n F = Chi(B, C, D);\n g = i;\n s = [7, 12, 17, 22];\n } else if (i < 32) {\n F = Chi(D, B, C);\n g = (5 * i + 1) % 16;\n s = [5, 9, 14, 20];\n } else if (i < 48) {\n F = B ^ C ^ D;\n g = (3 * i + 5) % 16;\n s = [4, 11, 16, 23];\n } else {\n F = C ^ (B | ~D);\n g = (7 * i) % 16;\n s = [6, 10, 15, 21];\n }\n F = F + A + K[i] + MD5_W[g];\n A = D;\n D = C;\n C = B;\n B = B + rotl(F, s[i % 4]);\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n this.set(A, B, C, D);\n }\n protected roundClean(): void {\n clean(MD5_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\n/**\n * MD5 (RFC 1321) legacy hash function. It was cryptographically broken.\n * MD5 architecture is similar to SHA1, with some differences:\n * - Reduced output length: 16 bytes (128 bit) instead of 20\n * - 64 rounds, instead of 80\n * - Little-endian: could be faster, but will require more code\n * - Non-linear index selection: huge speed-up for unroll\n * - Per round constants: more memory accesses, additional speed-up for unroll\n */\nexport const md5: CHash = /* @__PURE__ */ createHasher(() => new _MD5());\n\n// RIPEMD-160\n\nconst Rho160 = /* @__PURE__ */ Uint8Array.from([\n 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,\n]);\nconst Id160 = /* @__PURE__ */ (() => Uint8Array.from(new Array(16).fill(0).map((_, i) => i)))();\nconst Pi160 = /* @__PURE__ */ (() => Id160.map((i) => (9 * i + 5) % 16))();\nconst idxLR = /* @__PURE__ */ (() => {\n const L = [Id160];\n const R = [Pi160];\n const res = [L, R];\n for (let i = 0; i < 4; i++) for (let j of res) j.push(j[i].map((k) => Rho160[k]));\n return res;\n})();\nconst idxL = /* @__PURE__ */ (() => idxLR[0])();\nconst idxR = /* @__PURE__ */ (() => idxLR[1])();\n// const [idxL, idxR] = idxLR;\n\nconst shifts160 = /* @__PURE__ */ [\n [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8],\n [12, 13, 11, 15, 6, 9, 9, 7, 12, 15, 11, 13, 7, 8, 7, 7],\n [13, 15, 14, 11, 7, 7, 6, 8, 13, 14, 13, 12, 5, 5, 6, 9],\n [14, 11, 12, 14, 8, 6, 5, 5, 15, 12, 15, 14, 9, 9, 8, 6],\n [15, 12, 13, 13, 9, 5, 8, 6, 14, 11, 12, 11, 8, 6, 5, 5],\n].map((i) => Uint8Array.from(i));\nconst shiftsL160 = /* @__PURE__ */ idxL.map((idx, i) => idx.map((j) => shifts160[i][j]));\nconst shiftsR160 = /* @__PURE__ */ idxR.map((idx, i) => idx.map((j) => shifts160[i][j]));\nconst Kl160 = /* @__PURE__ */ Uint32Array.from([\n 0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e,\n]);\nconst Kr160 = /* @__PURE__ */ Uint32Array.from([\n 0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000,\n]);\n// It's called f() in spec.\nfunction ripemd_f(group: number, x: number, y: number, z: number): number {\n if (group === 0) return x ^ y ^ z;\n if (group === 1) return (x & y) | (~x & z);\n if (group === 2) return (x | ~y) ^ z;\n if (group === 3) return (x & z) | (y & ~z);\n return x ^ (y | ~z);\n}\n// Reusable temporary buffer\nconst BUF_160 = /* @__PURE__ */ new Uint32Array(16);\nexport class _RIPEMD160 extends HashMD<_RIPEMD160> {\n private h0 = 0x67452301 | 0;\n private h1 = 0xefcdab89 | 0;\n private h2 = 0x98badcfe | 0;\n private h3 = 0x10325476 | 0;\n private h4 = 0xc3d2e1f0 | 0;\n\n constructor() {\n super(64, 20, 8, true);\n }\n protected get(): [number, number, number, number, number] {\n const { h0, h1, h2, h3, h4 } = this;\n return [h0, h1, h2, h3, h4];\n }\n protected set(h0: number, h1: number, h2: number, h3: number, h4: number): void {\n this.h0 = h0 | 0;\n this.h1 = h1 | 0;\n this.h2 = h2 | 0;\n this.h3 = h3 | 0;\n this.h4 = h4 | 0;\n }\n protected process(view: DataView, offset: number): void {\n for (let i = 0; i < 16; i++, offset += 4) BUF_160[i] = view.getUint32(offset, true);\n // prettier-ignore\n let al = this.h0 | 0, ar = al,\n bl = this.h1 | 0, br = bl,\n cl = this.h2 | 0, cr = cl,\n dl = this.h3 | 0, dr = dl,\n el = this.h4 | 0, er = el;\n\n // Instead of iterating 0 to 80, we split it into 5 groups\n // And use the groups in constants, functions, etc. Much simpler\n for (let group = 0; group < 5; group++) {\n const rGroup = 4 - group;\n const hbl = Kl160[group], hbr = Kr160[group]; // prettier-ignore\n const rl = idxL[group], rr = idxR[group]; // prettier-ignore\n const sl = shiftsL160[group], sr = shiftsR160[group]; // prettier-ignore\n for (let i = 0; i < 16; i++) {\n const tl = (rotl(al + ripemd_f(group, bl, cl, dl) + BUF_160[rl[i]] + hbl, sl[i]) + el) | 0;\n al = el, el = dl, dl = rotl(cl, 10) | 0, cl = bl, bl = tl; // prettier-ignore\n }\n // 2 loops are 10% faster\n for (let i = 0; i < 16; i++) {\n const tr = (rotl(ar + ripemd_f(rGroup, br, cr, dr) + BUF_160[rr[i]] + hbr, sr[i]) + er) | 0;\n ar = er, er = dr, dr = rotl(cr, 10) | 0, cr = br, br = tr; // prettier-ignore\n }\n }\n // Add the compressed chunk to the current hash value\n this.set(\n (this.h1 + cl + dr) | 0,\n (this.h2 + dl + er) | 0,\n (this.h3 + el + ar) | 0,\n (this.h4 + al + br) | 0,\n (this.h0 + bl + cr) | 0\n );\n }\n protected roundClean(): void {\n clean(BUF_160);\n }\n destroy(): void {\n this.destroyed = true;\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0);\n }\n}\n\n/**\n * RIPEMD-160 - a legacy hash function from 1990s.\n * * https://homes.esat.kuleuven.be/~bosselae/ripemd160.html\n * * https://homes.esat.kuleuven.be/~bosselae/ripemd160/pdf/AB-9601/AB-9601.pdf\n */\nexport const ripemd160: CHash = /* @__PURE__ */ createHasher(() => new _RIPEMD160());\n","/**\n * BIP32 hierarchical deterministic (HD) wallets over secp256k1.\n * @module\n * @example\n * ```js\n * import { HDKey } from \"@scure/bip32\";\n * const hdkey1 = HDKey.fromMasterSeed(seed);\n * const hdkey2 = HDKey.fromExtendedKey(base58key);\n * const hdkey3 = HDKey.fromJSON({ xpriv: string });\n *\n * // props\n * [hdkey1.depth, hdkey1.index, hdkey1.chainCode];\n * console.log(hdkey2.privateKey, hdkey2.publicKey);\n * console.log(hdkey3.derive(\"m/0/2147483647'/1\"));\n * const sig = hdkey3.sign(hash);\n * hdkey3.verify(hash, sig);\n * ```\n */\n/*! scure-bip32 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) */\nimport { secp256k1 as secp } from '@noble/curves/secp256k1.js';\nimport { hmac } from '@noble/hashes/hmac.js';\nimport { ripemd160 } from '@noble/hashes/legacy.js';\nimport { sha256, sha512 } from '@noble/hashes/sha2.js';\nimport { abytes, concatBytes, createView } from '@noble/hashes/utils.js';\nimport { createBase58check } from '@scure/base';\n\nconst Point = secp.Point;\nconst { Fn } = Point;\nconst base58check = createBase58check(sha256);\n\nconst MASTER_SECRET = Uint8Array.from('Bitcoin seed'.split(''), (char) => char.charCodeAt(0));\n\n/** Network-specific versioning. */\nexport interface Versions {\n private: number;\n public: number;\n}\n\nconst BITCOIN_VERSIONS: Versions = { private: 0x0488ade4, public: 0x0488b21e };\n/** Hardened offset from Bitcoin, default */\nexport const HARDENED_OFFSET: number = 0x80000000;\n\nconst hash160 = (data: Uint8Array) => ripemd160(sha256(data));\nconst fromU32 = (data: Uint8Array) => createView(data).getUint32(0, false);\nconst toU32 = (n: number): Uint8Array => {\n if (!Number.isSafeInteger(n) || n < 0 || n > 2 ** 32 - 1) {\n throw new Error('invalid number, should be from 0 to 2**32-1, got ' + n);\n }\n const buf = new Uint8Array(4);\n createView(buf).setUint32(0, n, false);\n return buf;\n};\n\ninterface HDKeyOpt {\n versions?: Versions;\n depth?: number;\n index?: number;\n parentFingerprint?: number;\n chainCode?: Uint8Array;\n publicKey?: Uint8Array;\n privateKey?: Uint8Array;\n}\n\n/**\n * HDKey from BIP32\n * @example\n```js\nconst hdkey1 = HDKey.fromMasterSeed(seed);\nconst hdkey2 = HDKey.fromExtendedKey(base58key);\nconst hdkey3 = HDKey.fromJSON({ xpriv: string });\n```\n */\nexport class HDKey {\n get fingerprint(): number {\n if (!this.pubHash) {\n throw new Error('No publicKey set!');\n }\n return fromU32(this.pubHash);\n }\n get identifier(): Uint8Array | undefined {\n return this.pubHash;\n }\n get pubKeyHash(): Uint8Array | undefined {\n return this.pubHash;\n }\n get privateKey(): Uint8Array | null {\n return this._privateKey || null;\n }\n get publicKey(): Uint8Array | null {\n return this._publicKey || null;\n }\n get privateExtendedKey(): string {\n const priv = this._privateKey;\n if (!priv) {\n throw new Error('No private key');\n }\n return base58check.encode(\n this.serialize(this.versions.private, concatBytes(Uint8Array.of(0), priv))\n );\n }\n get publicExtendedKey(): string {\n if (!this._publicKey) {\n throw new Error('No public key');\n }\n return base58check.encode(this.serialize(this.versions.public, this._publicKey));\n }\n\n static fromMasterSeed(seed: Uint8Array, versions: Versions = BITCOIN_VERSIONS): HDKey {\n abytes(seed);\n if (8 * seed.length < 128 || 8 * seed.length > 512) {\n throw new Error(\n 'HDKey: seed length must be between 128 and 512 bits; 256 bits is advised, got ' +\n seed.length\n );\n }\n const I = hmac(sha512, MASTER_SECRET, seed);\n const privateKey = I.slice(0, 32);\n const chainCode = I.slice(32);\n return new HDKey({ versions, chainCode, privateKey });\n }\n\n static fromExtendedKey(base58key: string, versions: Versions = BITCOIN_VERSIONS): HDKey {\n // => version(4) || depth(1) || fingerprint(4) || index(4) || chain(32) || key(33)\n const keyBuffer: Uint8Array = base58check.decode(base58key);\n const keyView = createView(keyBuffer);\n const version = keyView.getUint32(0, false);\n const opt = {\n versions,\n depth: keyBuffer[4],\n parentFingerprint: keyView.getUint32(5, false),\n index: keyView.getUint32(9, false),\n chainCode: keyBuffer.slice(13, 45),\n };\n const key = keyBuffer.slice(45);\n const isPriv = key[0] === 0;\n if (version !== versions[isPriv ? 'private' : 'public']) {\n throw new Error('Version mismatch');\n }\n if (isPriv) {\n return new HDKey({ ...opt, privateKey: key.slice(1) });\n } else {\n return new HDKey({ ...opt, publicKey: key });\n }\n }\n\n public static fromJSON(json: { xpriv: string }): HDKey {\n return HDKey.fromExtendedKey(json.xpriv);\n }\n readonly versions: Versions;\n readonly depth: number = 0;\n readonly index: number = 0;\n readonly chainCode: Uint8Array | null = null;\n readonly parentFingerprint: number = 0;\n private _privateKey?: Uint8Array;\n private _publicKey?: Uint8Array;\n private pubHash: Uint8Array | undefined;\n\n constructor(opt: HDKeyOpt) {\n if (!opt || typeof opt !== 'object') {\n throw new Error('HDKey.constructor must not be called directly');\n }\n this.versions = opt.versions || BITCOIN_VERSIONS;\n this.depth = opt.depth || 0;\n this.chainCode = opt.chainCode || null;\n this.index = opt.index || 0;\n this.parentFingerprint = opt.parentFingerprint || 0;\n if (!this.depth) {\n if (this.parentFingerprint || this.index) {\n throw new Error('HDKey: zero depth with non-zero index/parent fingerprint');\n }\n }\n if (this.depth > 255) {\n throw new Error('HDKey: depth exceeds the serializable value 255');\n }\n if (opt.publicKey && opt.privateKey) {\n throw new Error('HDKey: publicKey and privateKey at same time.');\n }\n if (opt.privateKey) {\n if (!secp.utils.isValidSecretKey(opt.privateKey)) throw new Error('Invalid private key');\n this._privateKey = opt.privateKey;\n this._publicKey = secp.getPublicKey(opt.privateKey, true);\n } else if (opt.publicKey) {\n this._publicKey = Point.fromBytes(opt.publicKey).toBytes(true); // force compressed point\n } else {\n throw new Error('HDKey: no public or private key provided');\n }\n this.pubHash = hash160(this._publicKey);\n }\n\n derive(path: string): HDKey {\n if (!/^[mM]'?/.test(path)) {\n throw new Error('Path must start with \"m\" or \"M\"');\n }\n if (/^[mM]'?$/.test(path)) {\n return this;\n }\n const parts = path.replace(/^[mM]'?\\//, '').split('/');\n // tslint:disable-next-line\n let child: HDKey = this;\n for (const c of parts) {\n const m = /^(\\d+)('?)$/.exec(c);\n const m1 = m && m[1];\n if (!m || m.length !== 3 || typeof m1 !== 'string')\n throw new Error('invalid child index: ' + c);\n let idx = +m1;\n if (!Number.isSafeInteger(idx) || idx >= HARDENED_OFFSET) {\n throw new Error('Invalid index');\n }\n // hardened key\n if (m[2] === \"'\") {\n idx += HARDENED_OFFSET;\n }\n child = child.deriveChild(idx);\n }\n return child;\n }\n\n deriveChild(index: number): HDKey {\n if (!this._publicKey || !this.chainCode) {\n throw new Error('No publicKey or chainCode set');\n }\n let data = toU32(index);\n if (index >= HARDENED_OFFSET) {\n // Hardened\n const priv = this._privateKey;\n if (!priv) {\n throw new Error('Could not derive hardened child key');\n }\n // Hardened child: 0x00 || ser256(kpar) || ser32(index)\n data = concatBytes(Uint8Array.of(0), priv, data);\n } else {\n // Normal child: serP(point(kpar)) || ser32(index)\n data = concatBytes(this._publicKey, data);\n }\n const I = hmac(sha512, this.chainCode, data);\n const childTweak = I.slice(0, 32);\n const chainCode = I.slice(32);\n if (!secp.utils.isValidSecretKey(childTweak)) {\n throw new Error('Tweak bigger than curve order');\n }\n const opt: HDKeyOpt = {\n versions: this.versions,\n chainCode,\n depth: this.depth + 1,\n parentFingerprint: this.fingerprint,\n index,\n };\n const ctweak = Fn.fromBytes(childTweak);\n try {\n // Private parent key -> private child key\n if (this._privateKey) {\n const added = Fn.create(Fn.fromBytes(this._privateKey) + ctweak);\n if (!Fn.isValidNot0(added)) {\n throw new Error('The tweak was out of range or the resulted private key is invalid');\n }\n opt.privateKey = Fn.toBytes(added);\n } else {\n const added = Point.fromBytes(this._publicKey).add(Point.BASE.multiply(ctweak));\n // Cryptographically impossible: hmac-sha512 preimage would need to be found\n if (added.equals(Point.ZERO)) {\n throw new Error('The tweak was equal to negative P, which made the result key invalid');\n }\n opt.publicKey = added.toBytes(true);\n }\n return new HDKey(opt);\n } catch (err) {\n return this.deriveChild(index + 1);\n }\n }\n\n sign(hash: Uint8Array): Uint8Array {\n if (!this._privateKey) {\n throw new Error('No privateKey set!');\n }\n abytes(hash, 32);\n return secp.sign(hash, this._privateKey, { prehash: false });\n }\n\n verify(hash: Uint8Array, signature: Uint8Array): boolean {\n abytes(hash, 32);\n abytes(signature, 64);\n if (!this._publicKey) {\n throw new Error('No publicKey set!');\n }\n return secp.verify(signature, hash, this._publicKey, { prehash: false });\n }\n\n wipePrivateData(): this {\n if (this._privateKey) {\n this._privateKey.fill(0);\n this._privateKey = undefined;\n }\n return this;\n }\n toJSON(): { xpriv: string; xpub: string } {\n return {\n xpriv: this.privateExtendedKey,\n xpub: this.publicExtendedKey,\n };\n }\n\n private serialize(version: number, key: Uint8Array) {\n if (!this.chainCode) {\n throw new Error('No chainCode set');\n }\n abytes(key, 33);\n // version(4) || depth(1) || fingerprint(4) || index(4) || chain(32) || key(33)\n return concatBytes(\n toU32(version),\n new Uint8Array([this.depth]),\n toU32(this.parentFingerprint),\n toU32(this.index),\n this.chainCode,\n key\n );\n }\n}\n","/**\n * WalletManager — HD key derivation for Townhouse (Story 21.4, Task 1).\n *\n * Single BIP-39 mnemonic, deterministic HD derivation per node type.\n * Uses BIP-44 paths with distinct account indices per node type:\n * - Town: account 0\n * - Mill: account 1\n * - DVM: account 2\n *\n * Nostr keys use NIP-06 coin type 1237: m/44'/1237'/{account}'/0/0\n * EVM keys use standard coin type 60: m/44'/60'/{account}'/0/0\n * Solana keys (all node types) coin 501: m/44'/501'/{account}'/0'/0'\n * (SLIP-0010 all-hardened, via @toon-protocol/mill::deriveMillKeys)\n * Arweave keys (DVM only) coin 472: m/44'/472'/2'/0/0\n * (32-byte BIP-32 sub-seed feeds a deterministic RSA-4096 PRNG via\n * rsa-from-seed.ts (HMAC-DRBG + node-forge 1.3.3). Derivation takes 5–30s per DVM unlock; this runs\n * once at unlock time, not per operation.)\n */\n\nimport {\n generateMnemonic,\n validateMnemonic,\n mnemonicToSeedSync,\n} from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english.js';\nimport { HDKey } from '@scure/bip32';\nimport { getPublicKey } from 'nostr-tools/pure';\nimport { bytesToHex } from '@noble/hashes/utils';\nimport { keccak_256 } from '@noble/hashes/sha3';\nimport { secp256k1 } from '@noble/curves/secp256k1';\nimport { createPrivateKey, createHash } from 'node:crypto';\n\nimport type { NodeType } from '../docker/types.js';\nimport {\n arweaveCachePath,\n deleteArweaveJwkFromCache,\n readArweaveJwkFromCache,\n writeArweaveJwkToCache,\n} from './ar-cache.js';\nimport {\n ACCOUNT_INDEX_TOWN,\n ACCOUNT_INDEX_MILL,\n ACCOUNT_INDEX_DVM,\n} from '../constants.js';\nimport type {\n WalletManagerConfig,\n WalletState,\n NodeKeys,\n DerivedNodeKeys,\n NodeKeyInfo,\n ArweaveJwk,\n} from './types.js';\n// Imported from the lean `/wallet` subpath (NOT the `@toon-protocol/mill` root\n// barrel) so tsup inlines only the pure key-derivation + its light crypto deps.\n// mill is a build-only (dev) dependency — it ships as a Docker image, never an\n// npm runtime dep of townhouse. The `noExternal` rule in tsup.config.ts bundles\n// this into dist so the published package has zero @toon-protocol/* runtime deps.\nimport { deriveMillKeys } from '@toon-protocol/mill/wallet';\n\nconst BASE58_ALPHABET =\n '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\nfunction base58Encode(bytes: Uint8Array): string {\n let zeros = 0;\n for (let i = 0; i < bytes.length && bytes[i] === 0; i++) zeros++;\n let value = 0n;\n for (const byte of bytes) value = value * 256n + BigInt(byte);\n let result = '';\n while (value > 0n) {\n result = BASE58_ALPHABET[Number(value % 58n)] + result;\n value = value / 58n;\n }\n for (let i = 0; i < zeros; i++) result = '1' + result;\n return result || '1';\n}\n\n/** Map node type to account index */\nconst NODE_ACCOUNT_INDEX: Record<NodeType, number> = {\n town: ACCOUNT_INDEX_TOWN,\n mill: ACCOUNT_INDEX_MILL,\n dvm: ACCOUNT_INDEX_DVM,\n};\n\n/**\n * WalletManager handles mnemonic generation, key derivation, and in-memory\n * key lifecycle for Townhouse node operations.\n */\nexport class WalletManager {\n private readonly config: WalletManagerConfig;\n private state: WalletState | null = null;\n\n constructor(config: WalletManagerConfig) {\n this.config = config;\n }\n\n /** Path to the encrypted wallet file */\n get encryptedPath(): string {\n return this.config.encryptedPath;\n }\n\n /**\n * Generate a new 12-word BIP-39 mnemonic and derive all node keys.\n * Returns the mnemonic (for one-time display) and the derived state.\n */\n async generate(): Promise<{ mnemonic: string; state: WalletState }> {\n const mnemonic = generateMnemonic(wordlist, 128); // 128 bits = 12 words\n const state = await this.deriveAllKeys(mnemonic);\n this.state = state;\n return { mnemonic, state };\n }\n\n /**\n * Import an existing mnemonic (12 or 24 words) and derive all node keys.\n * Throws if mnemonic is invalid (wrong checksum, wrong word count, etc).\n */\n async fromMnemonic(mnemonic: string): Promise<WalletState> {\n if (!validateMnemonic(mnemonic, wordlist)) {\n throw new Error(\n 'Invalid BIP-39 mnemonic: checksum or word list validation failed'\n );\n }\n const state = await this.deriveAllKeys(mnemonic);\n this.state = state;\n return state;\n }\n\n /**\n * Get derived keys for a specific node type.\n * Throws if wallet has not been initialized (call generate() or fromMnemonic() first).\n */\n getNodeKeys(nodeType: NodeType): NodeKeys {\n if (!this.state) {\n throw new Error(\n 'Wallet not initialized. Call generate() or fromMnemonic() first.'\n );\n }\n return this.state.keys[nodeType];\n }\n\n /**\n * Get display-safe info for all node types (no secrets).\n */\n getAllKeys(): NodeKeyInfo[] {\n if (!this.state) {\n throw new Error(\n 'Wallet not initialized. Call generate() or fromMnemonic() first.'\n );\n }\n\n const state = this.state;\n const types: NodeType[] = ['town', 'mill', 'dvm'];\n return types.map((nodeType) => {\n const keys = state.keys[nodeType];\n const info: NodeKeyInfo = {\n nodeType,\n nostrPubkey: keys.nostrPubkey,\n evmAddress: keys.evmAddress,\n nostrDerivationPath: keys.nostrDerivationPath,\n evmDerivationPath: keys.evmDerivationPath,\n };\n if (keys.solanaAddress) info.solanaAddress = keys.solanaAddress;\n if (keys.solanaDerivationPath)\n info.solanaDerivationPath = keys.solanaDerivationPath;\n if (nodeType === 'mill' && keys.minaAddress) {\n info.minaAddress = keys.minaAddress;\n }\n if (keys.arweaveAddress) info.arweaveAddress = keys.arweaveAddress;\n if (keys.arweaveDerivationPath)\n info.arweaveDerivationPath = keys.arweaveDerivationPath;\n return info;\n });\n }\n\n /**\n * List keys for all node types (alias for getAllKeys for API compatibility).\n */\n listKeys(): NodeKeyInfo[] {\n return this.getAllKeys();\n }\n\n /**\n * Zero all in-memory key material. After calling lock(),\n * getNodeKeys() and getAllKeys() will throw.\n */\n lock(): void {\n if (!this.state) return;\n\n const types: NodeType[] = ['town', 'mill', 'dvm'];\n for (const nodeType of types) {\n const keys = this.state.keys[nodeType];\n keys.nostrSecretKey.fill(0);\n keys.evmPrivateKey.fill(0);\n if (keys.solanaPrivateKey) keys.solanaPrivateKey.fill(0);\n if (keys.arweaveJwk) zeroArweaveJwk(keys.arweaveJwk);\n }\n this.state = null;\n }\n\n /**\n * Return the BIP-39 mnemonic from in-memory wallet state.\n * Returns null when the wallet is locked or not initialized.\n */\n getMnemonic(): string | null {\n return this.state?.mnemonic ?? null;\n }\n\n /**\n * Get derived keys for a specific node type at a given derivation index.\n *\n * Pure derivation — does NOT mutate `state`. Re-derives from the stored\n * mnemonic each time it is called. For every node type, also derives the\n * Solana key at the same account index. For 'dvm', also derives Arweave.\n * Throws if the wallet is locked.\n *\n * v1 callers MUST pass `derivationIndex = ACCOUNT_INDEX_{type}` for the\n * first (and only) instance per type. Multi-instance support is out of\n * scope for v1 — the route layer enforces single-instance-per-type.\n */\n async deriveNodeKey(\n type: NodeType,\n derivationIndex: number\n ): Promise<NodeKeys> {\n if (!this.state) {\n throw new Error(\n 'Wallet not initialized. Call generate() or fromMnemonic() first.'\n );\n }\n const mnemonic = this.state.mnemonic;\n let seed: Uint8Array | undefined;\n try {\n seed = mnemonicToSeedSync(mnemonic);\n const baseKeys = this.deriveNodeKeys(seed, type, derivationIndex);\n // Derive Solana for ALL node types (P21-008 — DVM needs SOL for\n // Turbo credit funding; town's SOL is exposed for symmetry).\n const chains: ('solana' | 'mina')[] =\n type === 'mill' ? ['solana', 'mina'] : ['solana'];\n let solanaAddress: string | undefined;\n let solanaPrivateKey: Uint8Array | undefined;\n let solanaDerivationPath: string | undefined;\n let minaAddress: string | undefined;\n try {\n const chainKeys = await deriveMillKeys({\n mnemonic,\n chains,\n accountIndex: derivationIndex,\n });\n if (chainKeys.solana) {\n solanaAddress = base58Encode(chainKeys.solana.publicKey);\n solanaPrivateKey = chainKeys.solana.privateKey;\n solanaDerivationPath = chainKeys.solana.path;\n }\n if (chainKeys.mina && type === 'mill') {\n minaAddress = chainKeys.mina.publicKey;\n }\n } catch (err: unknown) {\n // deriveMillKeys failure (e.g. unsupported platform, library load\n // error) — chain addresses are optional at derivation time, but a\n // non-platform failure should be visible (P8). Log via console.warn\n // because WalletManager has no logger injected.\n const errMsg = err instanceof Error ? err.message : String(err);\n console.warn(\n `[WalletManager] deriveMillKeys failed for type=${type} accountIndex=${derivationIndex}: ${errMsg} — Solana/Mina addresses omitted`\n );\n }\n // Note: AR is intentionally NOT derived here either — `deriveNodeKey`\n // is a pure re-derivation helper called by route/admin code paths\n // where blocking 5–30s on RSA-4096 generation would surprise callers.\n // Use `ensureArweaveKey(type)` from the credit-funding code path to\n // obtain the AR JWK on demand.\n return {\n ...baseKeys,\n solanaAddress,\n solanaPrivateKey,\n solanaDerivationPath,\n minaAddress,\n };\n } finally {\n if (seed) seed.fill(0);\n }\n }\n\n // ── Private-key accessors (epic-49 credit funding) ───────────────────────\n\n /**\n * Returns the EVM private key for a node as a 64-char lowercase hex string.\n * Throws when the wallet is locked. Callers MUST treat the returned string\n * as sensitive (no logging, no persisting). The underlying Uint8Array is\n * still owned by WalletManager and will be zeroed by `lock()`.\n */\n getEvmPrivateKeyHex(nodeType: NodeType): string {\n const keys = this.getNodeKeys(nodeType);\n return bytesToHex(keys.evmPrivateKey);\n }\n\n /**\n * Returns the Solana Ed25519 private key seed for a node as a 64-char\n * lowercase hex string (32 raw seed bytes). Throws when the wallet is\n * locked or when the Solana key was not derived for this node type.\n */\n getSolanaPrivateKeyHex(nodeType: NodeType): string {\n const keys = this.getNodeKeys(nodeType);\n if (!keys.solanaPrivateKey) {\n throw new Error(\n `Solana private key not available for node '${nodeType}'`\n );\n }\n return bytesToHex(keys.solanaPrivateKey);\n }\n\n /**\n * Returns the Arweave RSA JWK for a node. Throws when the wallet is locked\n * or when AR derivation has not yet been triggered for this node type.\n *\n * Callers MUST `await ensureArweaveKey(nodeType)` first the first time per\n * unlock — RSA-4096 derivation is 5–30s and is therefore not done eagerly\n * at `fromMnemonic`/`generate` time. After the first `ensureArweaveKey`\n * the JWK is cached on the in-memory state until `lock()`.\n */\n getArweaveJwk(nodeType: NodeType): ArweaveJwk {\n const keys = this.getNodeKeys(nodeType);\n if (!keys.arweaveJwk) {\n throw new Error(\n `Arweave JWK not yet derived for node '${nodeType}'. Call ensureArweaveKey('${nodeType}') first (note: derivation takes 5–30s).`\n );\n }\n return keys.arweaveJwk;\n }\n\n /**\n * Lazily derive the Arweave RSA-4096 JWK for a node type and cache it on\n * the in-memory wallet state. Subsequent calls (within the same unlocked\n * session) return the cached result without re-deriving.\n *\n * Only meaningful for node types that participate in the Arweave credit\n * flow — `dvm` (account 2) in the current Townhouse layout. Calling on\n * `town` or `mill` will derive a valid AR key at the corresponding\n * account index but those keys are not used by any current code path.\n *\n * Throws if the wallet is locked or RSA derivation fails (unsupported\n * platform, etc.). On success the result is also reflected in subsequent\n * `getAllKeys()` calls (arweaveAddress + arweaveDerivationPath fields).\n */\n async ensureArweaveKey(\n nodeType: NodeType,\n password?: string\n ): Promise<ArweaveJwk> {\n if (!this.state) {\n throw new Error(\n 'Wallet not initialized. Call generate() or fromMnemonic() first.'\n );\n }\n const existing = this.state.keys[nodeType].arweaveJwk;\n if (existing) return existing;\n\n const accountIndex = NODE_ACCOUNT_INDEX[nodeType];\n const path = `m/44'/472'/${accountIndex}'/0/0`;\n let seed: Uint8Array | undefined;\n let subSeed: Uint8Array | undefined;\n try {\n seed = mnemonicToSeedSync(this.state.mnemonic);\n\n // Derive the BIP-32 sub-seed (fast) up front so we can compute a public\n // fingerprint of the mnemonic-bound material. The fingerprint lets the\n // on-disk cache detect \"wallet restored from a different mnemonic\"\n // without paying the 5–30s RSA cost on every load.\n const hdKey = HDKey.fromMasterSeed(seed).derive(path);\n if (!hdKey.privateKey) {\n throw new Error(`Arweave sub-seed missing at ${path}`);\n }\n subSeed = new Uint8Array(hdKey.privateKey);\n const fingerprint = createHash('sha256')\n .update(subSeed)\n .digest('base64url');\n\n // ── Disk cache check (epic-49 Followup A) ─────────────────────────\n // Only attempted when a password is supplied — the cache file is\n // encrypted under the same operator password as wallet.enc. Callers\n // that don't have the password (e.g. test setups that called\n // fromMnemonic directly) skip the cache; they pay the full RSA cost.\n if (password) {\n const cachePath = arweaveCachePath(this.config.encryptedPath);\n const result = await readArweaveJwkFromCache(\n cachePath,\n nodeType,\n password,\n fingerprint\n );\n if (result.status === 'hit') {\n this.state.keys[nodeType].arweaveJwk = result.jwk;\n this.state.keys[nodeType].arweaveAddress =\n result.entry.arweaveAddress;\n this.state.keys[nodeType].arweaveDerivationPath = path;\n return result.jwk;\n }\n if (result.status === 'stale') {\n console.warn(\n `[WalletManager] Arweave JWK cache for ${nodeType} was written from a different mnemonic (cached address ${result.cachedAddress.slice(0, 12)}…). Discarding and re-deriving.`\n );\n await deleteArweaveJwkFromCache(cachePath, nodeType);\n // fall through to RSA derivation\n }\n // status === 'miss' → fall through to RSA derivation\n }\n\n // ── RSA-4096 derivation (5–30s) ──────────────────────────────────\n const ar = await deriveArweaveKey(seed, accountIndex);\n // Re-check state under the assumption a concurrent lock() may have\n // wiped it while we were generating RSA (5–30s window).\n if (!this.state) {\n zeroArweaveJwk(ar.jwk);\n throw new Error(\n 'Wallet was locked during Arweave key derivation. Discarding derived key.'\n );\n }\n this.state.keys[nodeType].arweaveJwk = ar.jwk;\n this.state.keys[nodeType].arweaveAddress = ar.address;\n this.state.keys[nodeType].arweaveDerivationPath = ar.path;\n\n // ── Persist to disk cache (best-effort, password-gated) ──────────\n if (password) {\n try {\n const cachePath = arweaveCachePath(this.config.encryptedPath);\n await writeArweaveJwkToCache(\n cachePath,\n nodeType,\n ar.jwk,\n password,\n fingerprint,\n ar.address\n );\n } catch (err: unknown) {\n // Cache write failure is non-fatal — RSA derivation succeeded.\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(\n `[WalletManager] Failed to write Arweave JWK cache (non-fatal): ${msg}`\n );\n }\n }\n\n return ar.jwk;\n } finally {\n if (seed) seed.fill(0);\n if (subSeed) subSeed.fill(0);\n }\n }\n\n /**\n * Derive keys for all node types from a mnemonic.\n */\n private async deriveAllKeys(mnemonic: string): Promise<WalletState> {\n let seed: Uint8Array | undefined;\n try {\n seed = mnemonicToSeedSync(mnemonic);\n\n // Derive Solana addresses for ALL node types (D21-008 / epic-49).\n // Mill additionally gets a Mina address. Errors here are\n // non-fatal — chain addresses are optional, base BIP-44 keys are\n // still derived per node type below.\n interface ChainExtras {\n solanaAddress?: string;\n solanaPrivateKey?: Uint8Array;\n solanaDerivationPath?: string;\n minaAddress?: string;\n }\n const chainExtras: Record<NodeType, ChainExtras> = {\n town: {},\n mill: {},\n dvm: {},\n };\n const types: NodeType[] = ['town', 'mill', 'dvm'];\n for (const nodeType of types) {\n const accountIndex = NODE_ACCOUNT_INDEX[nodeType];\n const chains: ('solana' | 'mina')[] =\n nodeType === 'mill' ? ['solana', 'mina'] : ['solana'];\n try {\n const chainKeys = await deriveMillKeys({\n mnemonic,\n chains,\n accountIndex,\n });\n if (chainKeys.solana) {\n chainExtras[nodeType].solanaAddress = base58Encode(\n chainKeys.solana.publicKey\n );\n chainExtras[nodeType].solanaPrivateKey =\n chainKeys.solana.privateKey;\n chainExtras[nodeType].solanaDerivationPath = chainKeys.solana.path;\n }\n if (nodeType === 'mill' && chainKeys.mina) {\n chainExtras[nodeType].minaAddress = chainKeys.mina.publicKey;\n }\n } catch (err: unknown) {\n const errMsg = err instanceof Error ? err.message : String(err);\n console.warn(\n `[WalletManager] deriveMillKeys failed for ${nodeType} (accountIndex=${accountIndex}): ${errMsg} — chain addresses omitted`\n );\n }\n }\n\n // Note: Arweave (RSA-4096) derivation is NOT done eagerly here.\n // RSA-4096 generation from a deterministic PRNG takes 5–30 seconds\n // per call — too slow to block every wallet unlock. Callers that\n // need the AR key (CLI `credits buy`, orchestrator before starting\n // the DVM container, etc.) must call `ensureArweaveKey('dvm')`\n // explicitly. The result is cached on the in-memory state for the\n // rest of the unlocked session.\n\n const keys: DerivedNodeKeys = {\n town: { ...this.deriveNodeKeys(seed, 'town'), ...chainExtras.town },\n mill: { ...this.deriveNodeKeys(seed, 'mill'), ...chainExtras.mill },\n dvm: { ...this.deriveNodeKeys(seed, 'dvm'), ...chainExtras.dvm },\n };\n return { keys, mnemonic };\n } finally {\n if (seed) seed.fill(0);\n }\n }\n\n /**\n * Derive Nostr + EVM keys for a specific node type.\n * Accepts an optional `accountIndex` to override the default per-type index.\n * When omitted, uses `NODE_ACCOUNT_INDEX[nodeType]` (existing behavior).\n */\n private deriveNodeKeys(\n seed: Uint8Array,\n nodeType: NodeType,\n accountIndex?: number\n ): NodeKeys {\n const idx = accountIndex ?? NODE_ACCOUNT_INDEX[nodeType];\n\n // Nostr key: NIP-06 path m/44'/1237'/{account}'/0/0\n const nostrPath = `m/44'/1237'/${idx}'/0/0`;\n const nostrHdKey = HDKey.fromMasterSeed(seed).derive(nostrPath);\n if (!nostrHdKey.privateKey) {\n throw new Error(`Nostr private key missing at ${nostrPath}`);\n }\n const nostrSecretKey = new Uint8Array(nostrHdKey.privateKey);\n const nostrPubkey = getPublicKey(nostrSecretKey);\n\n // EVM key: standard path m/44'/60'/{account}'/0/0\n const evmPath = `m/44'/60'/${idx}'/0/0`;\n const evmHdKey = HDKey.fromMasterSeed(seed).derive(evmPath);\n if (!evmHdKey.privateKey) {\n throw new Error(`EVM private key missing at ${evmPath}`);\n }\n const evmPrivateKey = new Uint8Array(evmHdKey.privateKey);\n const evmAddress = computeEvmAddress(evmPrivateKey);\n\n return {\n nostrPubkey,\n nostrSecretKey,\n evmAddress,\n evmPrivateKey,\n nostrDerivationPath: nostrPath,\n evmDerivationPath: evmPath,\n };\n }\n}\n\n/**\n * Derive an Arweave RSA-4096 JWK from a BIP-39 seed at a given account index.\n *\n * Algorithm:\n * 1. BIP-32 derive a 32-byte sub-seed at m/44'/472'/{account}'/0/0.\n * 2. Feed that sub-seed into our HMAC-DRBG(SHA-256, seed) PRNG implemented\n * with @noble/hashes, which drives node-forge 1.3.3 (CVE-free) PRIMEINC\n * prime search → deterministic RSA keys identical to human-crypto-keys 0.1.4.\n * 3. Parse the PKCS#1 PEM via Node's built-in `crypto.createPrivateKey()`\n * and export as JWK. Strip non-arweave fields (alg, kid).\n * 4. Compute the Arweave address: base64url(sha256(base64url_decode(n))).\n *\n * Determinism verified empirically: identical seed → identical JWK across runs\n * (Node 20.x, rsa-from-seed.ts, node-forge 1.3.3).\n *\n * Performance: 5–30 seconds per call on a 2024 desktop. This is a one-time\n * cost per wallet unlock — the JWK is then held in memory until `lock()`.\n */\nasync function deriveArweaveKey(\n seed: Uint8Array,\n accountIndex: number\n): Promise<{ jwk: ArweaveJwk; address: string; path: string }> {\n // Coin type 472 = Arweave (https://github.com/satoshilabs/slips/blob/master/slip-0044.md)\n const path = `m/44'/472'/${accountIndex}'/0/0`;\n const hdKey = HDKey.fromMasterSeed(seed).derive(path);\n if (!hdKey.privateKey) {\n throw new Error(`Arweave sub-seed missing at ${path}`);\n }\n const subSeed = new Uint8Array(hdKey.privateKey);\n\n // rsa-from-seed uses @noble/hashes HMAC-DRBG + node-forge 1.3.3 (CVE-free).\n // Lazy-import keeps startup cheap for Town/Mill callers that never touch Arweave.\n const { rsaPrivateKeyPemFromSeed } = await import('./rsa-from-seed.js');\n\n let pemPrivateKey: string;\n try {\n pemPrivateKey = await rsaPrivateKeyPemFromSeed(subSeed);\n } finally {\n // Sub-seed leaves the function. Zero it ASAP — the RSA key derived from\n // it is what we keep, not the seed itself.\n subSeed.fill(0);\n }\n\n // PEM → JWK via Node's built-in crypto (no extra dependency).\n const keyObject = createPrivateKey({\n key: pemPrivateKey,\n format: 'pem',\n type: 'pkcs1',\n });\n const rawJwk = keyObject.export({ format: 'jwk' }) as {\n kty?: string;\n e?: string;\n n?: string;\n d?: string;\n p?: string;\n q?: string;\n dp?: string;\n dq?: string;\n qi?: string;\n };\n if (\n rawJwk.kty !== 'RSA' ||\n !rawJwk.n ||\n !rawJwk.e ||\n !rawJwk.d ||\n !rawJwk.p ||\n !rawJwk.q ||\n !rawJwk.dp ||\n !rawJwk.dq ||\n !rawJwk.qi\n ) {\n throw new Error(\n `Arweave JWK conversion produced unexpected shape (kty=${String(rawJwk.kty)}, has-private=${Boolean(rawJwk.d)})`\n );\n }\n const jwk: ArweaveJwk = {\n kty: 'RSA',\n e: rawJwk.e,\n n: rawJwk.n,\n d: rawJwk.d,\n p: rawJwk.p,\n q: rawJwk.q,\n dp: rawJwk.dp,\n dq: rawJwk.dq,\n qi: rawJwk.qi,\n };\n\n // Arweave address = base64url(sha256(modulus_bytes)).\n const modulusBytes = Buffer.from(jwk.n, 'base64url');\n const address = createHash('sha256').update(modulusBytes).digest('base64url');\n\n return { jwk, address, path };\n}\n\n/**\n * Zero out every base64url string field of an Arweave JWK in place.\n *\n * RSA private key material lives in `d`, `p`, `q`, `dp`, `dq`, `qi`. String\n * primitives are immutable in JavaScript, so we cannot truly zero them — what\n * we CAN do is overwrite the property with an empty string so a later read of\n * the JWK object after `lock()` cannot recover the key material.\n *\n * This matches the best-effort zeroing approach used elsewhere (Uint8Array\n * `.fill(0)` is similarly best-effort against off-heap copies).\n */\nfunction zeroArweaveJwk(jwk: ArweaveJwk): void {\n // Public components are not secrets; leave them. Wipe private exponents.\n jwk.d = '';\n jwk.p = '';\n jwk.q = '';\n jwk.dp = '';\n jwk.dq = '';\n jwk.qi = '';\n}\n\n/**\n * Compute EVM address from private key: uncompressed pubkey -> keccak256 -> last 20 bytes.\n */\nfunction computeEvmAddress(privateKey: Uint8Array): string {\n const uncompressed = secp256k1.getPublicKey(privateKey, false);\n const hash = keccak_256(uncompressed.slice(1));\n const addressHex = bytesToHex(hash.slice(-20));\n return toChecksumAddress(addressHex);\n}\n\n/**\n * EIP-55 checksum address encoding.\n */\nfunction toChecksumAddress(addressHex: string): string {\n const lower = addressHex.toLowerCase();\n const hashHex = bytesToHex(keccak_256(new TextEncoder().encode(lower)));\n let out = '0x';\n for (let i = 0; i < 40; i++) {\n const ch = lower.charAt(i);\n const hashNibble = parseInt(hashHex.charAt(i), 16);\n out += hashNibble >= 8 ? ch.toUpperCase() : ch;\n }\n return out;\n}\n","/**\n * SHA3 (keccak) hash function, based on a new \"Sponge function\" design.\n * Different from older hashes, the internal state is bigger than output size.\n *\n * Check out [FIPS-202](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf),\n * [Website](https://keccak.team/keccak.html),\n * [the differences between SHA-3 and Keccak](https://crypto.stackexchange.com/questions/15727/what-are-the-key-differences-between-the-draft-sha-3-standard-and-the-keccak-sub).\n *\n * Check out `sha3-addons` module for cSHAKE, k12, and others.\n * @module\n */\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from './_u64.ts';\n// prettier-ignore\nimport {\n abytes, aexists, anumber, aoutput,\n clean, createHasher, createXOFer, Hash,\n swap32IfBE,\n toBytes, u32,\n type CHash, type CHashXO, type HashXOF, type Input\n} from './utils.ts';\n\n// No __PURE__ annotations in sha3 header:\n// EVERYTHING is in fact used on every export.\n// Various per round constants calculations\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst _7n = BigInt(7);\nconst _256n = BigInt(256);\nconst _0x71n = BigInt(0x71);\nconst SHA3_PI: number[] = [];\nconst SHA3_ROTL: number[] = [];\nconst _SHA3_IOTA: bigint[] = [];\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n // Pi\n [x, y] = [y, (2 * x + 3 * y) % 5];\n SHA3_PI.push(2 * (5 * y + x));\n // Rotational\n SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n // Iota\n let t = _0n;\n for (let j = 0; j < 7; j++) {\n R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n if (R & _2n) t ^= _1n << ((_1n << /* @__PURE__ */ BigInt(j)) - _1n);\n }\n _SHA3_IOTA.push(t);\n}\nconst IOTAS = split(_SHA3_IOTA, true);\nconst SHA3_IOTA_H = IOTAS[0];\nconst SHA3_IOTA_L = IOTAS[1];\n\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h: number, l: number, s: number) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h: number, l: number, s: number) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n\n/** `keccakf1600` internal function, additionally allows to adjust round count. */\nexport function keccakP(s: Uint32Array, rounds: number = 24): void {\n const B = new Uint32Array(5 * 2);\n // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n for (let round = 24 - rounds; round < 24; round++) {\n // Theta θ\n for (let x = 0; x < 10; x++) B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n for (let x = 0; x < 10; x += 2) {\n const idx1 = (x + 8) % 10;\n const idx0 = (x + 2) % 10;\n const B0 = B[idx0];\n const B1 = B[idx0 + 1];\n const Th = rotlH(B0, B1, 1) ^ B[idx1];\n const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n for (let y = 0; y < 50; y += 10) {\n s[x + y] ^= Th;\n s[x + y + 1] ^= Tl;\n }\n }\n // Rho (ρ) and Pi (π)\n let curH = s[2];\n let curL = s[3];\n for (let t = 0; t < 24; t++) {\n const shift = SHA3_ROTL[t];\n const Th = rotlH(curH, curL, shift);\n const Tl = rotlL(curH, curL, shift);\n const PI = SHA3_PI[t];\n curH = s[PI];\n curL = s[PI + 1];\n s[PI] = Th;\n s[PI + 1] = Tl;\n }\n // Chi (χ)\n for (let y = 0; y < 50; y += 10) {\n for (let x = 0; x < 10; x++) B[x] = s[y + x];\n for (let x = 0; x < 10; x++) s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n }\n // Iota (ι)\n s[0] ^= SHA3_IOTA_H[round];\n s[1] ^= SHA3_IOTA_L[round];\n }\n clean(B);\n}\n\n/** Keccak sponge function. */\nexport class Keccak extends Hash<Keccak> implements HashXOF<Keccak> {\n protected state: Uint8Array;\n protected pos = 0;\n protected posOut = 0;\n protected finished = false;\n protected state32: Uint32Array;\n protected destroyed = false;\n\n public blockLen: number;\n public suffix: number;\n public outputLen: number;\n protected enableXOF = false;\n protected rounds: number;\n\n // NOTE: we accept arguments in bytes instead of bits here.\n constructor(\n blockLen: number,\n suffix: number,\n outputLen: number,\n enableXOF = false,\n rounds: number = 24\n ) {\n super();\n this.blockLen = blockLen;\n this.suffix = suffix;\n this.outputLen = outputLen;\n this.enableXOF = enableXOF;\n this.rounds = rounds;\n // Can be passed from user as dkLen\n anumber(outputLen);\n // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes\n // 0 < blockLen < 200\n if (!(0 < blockLen && blockLen < 200))\n throw new Error('only keccak-f1600 function is supported');\n this.state = new Uint8Array(200);\n this.state32 = u32(this.state);\n }\n clone(): Keccak {\n return this._cloneInto();\n }\n protected keccak(): void {\n swap32IfBE(this.state32);\n keccakP(this.state32, this.rounds);\n swap32IfBE(this.state32);\n this.posOut = 0;\n this.pos = 0;\n }\n update(data: Input): this {\n aexists(this);\n data = toBytes(data);\n abytes(data);\n const { blockLen, state } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n for (let i = 0; i < take; i++) state[this.pos++] ^= data[pos++];\n if (this.pos === blockLen) this.keccak();\n }\n return this;\n }\n protected finish(): void {\n if (this.finished) return;\n this.finished = true;\n const { state, suffix, pos, blockLen } = this;\n // Do the padding\n state[pos] ^= suffix;\n if ((suffix & 0x80) !== 0 && pos === blockLen - 1) this.keccak();\n state[blockLen - 1] ^= 0x80;\n this.keccak();\n }\n protected writeInto(out: Uint8Array): Uint8Array {\n aexists(this, false);\n abytes(out);\n this.finish();\n const bufferOut = this.state;\n const { blockLen } = this;\n for (let pos = 0, len = out.length; pos < len; ) {\n if (this.posOut >= blockLen) this.keccak();\n const take = Math.min(blockLen - this.posOut, len - pos);\n out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n this.posOut += take;\n pos += take;\n }\n return out;\n }\n xofInto(out: Uint8Array): Uint8Array {\n // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n if (!this.enableXOF) throw new Error('XOF is not possible for this instance');\n return this.writeInto(out);\n }\n xof(bytes: number): Uint8Array {\n anumber(bytes);\n return this.xofInto(new Uint8Array(bytes));\n }\n digestInto(out: Uint8Array): Uint8Array {\n aoutput(out, this);\n if (this.finished) throw new Error('digest() was already called');\n this.writeInto(out);\n this.destroy();\n return out;\n }\n digest(): Uint8Array {\n return this.digestInto(new Uint8Array(this.outputLen));\n }\n destroy(): void {\n this.destroyed = true;\n clean(this.state);\n }\n _cloneInto(to?: Keccak): Keccak {\n const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n to ||= new Keccak(blockLen, suffix, outputLen, enableXOF, rounds);\n to.state32.set(this.state32);\n to.pos = this.pos;\n to.posOut = this.posOut;\n to.finished = this.finished;\n to.rounds = rounds;\n // Suffix can change in cSHAKE\n to.suffix = suffix;\n to.outputLen = outputLen;\n to.enableXOF = enableXOF;\n to.destroyed = this.destroyed;\n return to;\n }\n}\n\nconst gen = (suffix: number, blockLen: number, outputLen: number) =>\n createHasher(() => new Keccak(blockLen, suffix, outputLen));\n\n/** SHA3-224 hash function. */\nexport const sha3_224: CHash = /* @__PURE__ */ (() => gen(0x06, 144, 224 / 8))();\n/** SHA3-256 hash function. Different from keccak-256. */\nexport const sha3_256: CHash = /* @__PURE__ */ (() => gen(0x06, 136, 256 / 8))();\n/** SHA3-384 hash function. */\nexport const sha3_384: CHash = /* @__PURE__ */ (() => gen(0x06, 104, 384 / 8))();\n/** SHA3-512 hash function. */\nexport const sha3_512: CHash = /* @__PURE__ */ (() => gen(0x06, 72, 512 / 8))();\n\n/** keccak-224 hash function. */\nexport const keccak_224: CHash = /* @__PURE__ */ (() => gen(0x01, 144, 224 / 8))();\n/** keccak-256 hash function. Different from SHA3-256. */\nexport const keccak_256: CHash = /* @__PURE__ */ (() => gen(0x01, 136, 256 / 8))();\n/** keccak-384 hash function. */\nexport const keccak_384: CHash = /* @__PURE__ */ (() => gen(0x01, 104, 384 / 8))();\n/** keccak-512 hash function. */\nexport const keccak_512: CHash = /* @__PURE__ */ (() => gen(0x01, 72, 512 / 8))();\n\nexport type ShakeOpts = { dkLen?: number };\n\nconst genShake = (suffix: number, blockLen: number, outputLen: number) =>\n createXOFer<HashXOF<Keccak>, ShakeOpts>(\n (opts: ShakeOpts = {}) =>\n new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true)\n );\n\n/** SHAKE128 XOF with 128-bit security. */\nexport const shake128: CHashXO = /* @__PURE__ */ (() => genShake(0x1f, 168, 128 / 8))();\n/** SHAKE256 XOF with 256-bit security. */\nexport const shake256: CHashXO = /* @__PURE__ */ (() => genShake(0x1f, 136, 256 / 8))();\n","/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abytes as abytes_,\n bytesToHex as bytesToHex_,\n concatBytes as concatBytes_,\n hexToBytes as hexToBytes_,\n isBytes as isBytes_,\n} from '@noble/hashes/utils.js';\nexport {\n abytes,\n anumber,\n bytesToHex,\n bytesToUtf8,\n concatBytes,\n hexToBytes,\n isBytes,\n randomBytes,\n utf8ToBytes,\n} from '@noble/hashes/utils.js';\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nexport type Hex = Uint8Array | string; // hex strings are accepted for simplicity\nexport type PrivKey = Hex | bigint; // bigints are accepted to ease learning curve\nexport type CHash = {\n (message: Uint8Array | string): Uint8Array;\n blockLen: number;\n outputLen: number;\n create(opts?: { dkLen?: number }): any; // For shake\n};\nexport type FHash = (message: Uint8Array | string) => Uint8Array;\n\nexport function abool(title: string, value: boolean): void {\n if (typeof value !== 'boolean') throw new Error(title + ' boolean expected, got ' + value);\n}\n\n// tmp name until v2\nexport function _abool2(value: boolean, title: string = ''): boolean {\n if (typeof value !== 'boolean') {\n const prefix = title && `\"${title}\"`;\n throw new Error(prefix + 'expected boolean, got type=' + typeof value);\n }\n return value;\n}\n\n// tmp name until v2\n/** Asserts something is Uint8Array. */\nexport function _abytes2(value: Uint8Array, length?: number, title: string = ''): Uint8Array {\n const bytes = isBytes_(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n}\n\n// Used in weierstrass, der\nexport function numberToHexUnpadded(num: number | bigint): string {\n const hex = num.toString(16);\n return hex.length & 1 ? '0' + hex : hex;\n}\n\nexport function hexToNumber(hex: string): bigint {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex_(bytes));\n}\nexport function bytesToNumberLE(bytes: Uint8Array): bigint {\n abytes_(bytes);\n return hexToNumber(bytesToHex_(Uint8Array.from(bytes).reverse()));\n}\n\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n return hexToBytes_(n.toString(16).padStart(len * 2, '0'));\n}\nexport function numberToBytesLE(n: number | bigint, len: number): Uint8Array {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n: number | bigint): Uint8Array {\n return hexToBytes_(numberToHexUnpadded(n));\n}\n\n/**\n * Takes hex string or Uint8Array, converts to Uint8Array.\n * Validates output length.\n * Will throw error for other types.\n * @param title descriptive title for an error e.g. 'secret key'\n * @param hex hex string or Uint8Array\n * @param expectedLength optional, will compare to result array's length\n * @returns\n */\nexport function ensureBytes(title: string, hex: Hex, expectedLength?: number): Uint8Array {\n let res: Uint8Array;\n if (typeof hex === 'string') {\n try {\n res = hexToBytes_(hex);\n } catch (e) {\n throw new Error(title + ' must be hex string or Uint8Array, cause: ' + e);\n }\n } else if (isBytes_(hex)) {\n // Uint8Array.from() instead of hash.slice() because node.js Buffer\n // is instance of Uint8Array, and its slice() creates **mutable** copy\n res = Uint8Array.from(hex);\n } else {\n throw new Error(title + ' must be hex string or Uint8Array');\n }\n const len = res.length;\n if (typeof expectedLength === 'number' && len !== expectedLength)\n throw new Error(title + ' of length ' + expectedLength + ' expected, got ' + len);\n return res;\n}\n\n// Compares 2 u8a-s in kinda constant time\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n/**\n * Copies Uint8Array. We can't use u8a.slice(), because u8a can be Buffer,\n * and Buffer#slice creates mutable copy. Never use Buffers!\n */\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n return Uint8Array.from(bytes);\n}\n\n/**\n * Decodes 7-bit ASCII string to Uint8Array, throws on non-ascii symbols\n * Should be safe to use for things expected to be ASCII.\n * Returns exact same result as utf8ToBytes for ASCII or throws.\n */\nexport function asciiToBytes(ascii: string): Uint8Array {\n return Uint8Array.from(ascii, (c, i) => {\n const charCode = c.charCodeAt(0);\n if (c.length !== 1 || charCode > 127) {\n throw new Error(\n `string contains non-ASCII character \"${ascii[i]}\" with code ${charCode} at position ${i}`\n );\n }\n return charCode;\n });\n}\n\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\n// export const utf8ToBytes: typeof utf8ToBytes_ = utf8ToBytes_;\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\n// export const bytesToUtf8: typeof bytesToUtf8_ = bytesToUtf8_;\n\n// Is positive bigint\nconst isPosBig = (n: bigint) => typeof n === 'bigint' && _0n <= n;\n\nexport function inRange(n: bigint, min: bigint, max: bigint): boolean {\n return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nexport function aInRange(title: string, n: bigint, min: bigint, max: bigint): void {\n // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n // consider P=256n, min=0n, max=P\n // - a for min=0 would require -1: `inRange('x', x, -1n, P)`\n // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)`\n // - our way is the cleanest: `inRange('x', x, 0n, P)\n if (!inRange(n, min, max))\n throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n\n// Bit operations\n\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nexport function bitLen(n: bigint): number {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1);\n return len;\n}\n\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n: bigint, pos: number): bigint {\n return (n >> BigInt(pos)) & _1n;\n}\n\n/**\n * Sets single bit at position.\n */\nexport function bitSet(n: bigint, pos: number, value: boolean): bigint {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n: number): bigint => (_1n << BigInt(n)) - _1n;\n\n// DRBG\n\ntype Pred<T> = (v: Uint8Array) => T | undefined;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG<Key>(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg<T>(\n hashLen: number,\n qByteLen: number,\n hmacFn: (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array\n): (seed: Uint8Array, predicate: Pred<T>) => T {\n if (typeof hashLen !== 'number' || hashLen < 2) throw new Error('hashLen must be a number');\n if (typeof qByteLen !== 'number' || qByteLen < 2) throw new Error('qByteLen must be a number');\n if (typeof hmacFn !== 'function') throw new Error('hmacFn must be a function');\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n const u8n = (len: number) => new Uint8Array(len); // creates Uint8Array\n const u8of = (byte: number) => Uint8Array.of(byte); // another shortcut\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...b: Uint8Array[]) => hmacFn(k, v, ...b); // hmac(k)(v, ...values)\n const reseed = (seed = u8n(0)) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(u8of(0x00), seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0) return;\n k = h(u8of(0x01), seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= 1000) throw new Error('drbg: tried 1000 values');\n let len = 0;\n const out: Uint8Array[] = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return concatBytes_(...out);\n };\n const genUntil = (seed: Uint8Array, pred: Pred<T>): T => {\n reset();\n reseed(seed); // Steps D-G\n let res: T | undefined = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen()))) reseed();\n reset();\n return res;\n };\n return genUntil;\n}\n\n// Validating curves and fields\n\nconst validatorFns = {\n bigint: (val: any): boolean => typeof val === 'bigint',\n function: (val: any): boolean => typeof val === 'function',\n boolean: (val: any): boolean => typeof val === 'boolean',\n string: (val: any): boolean => typeof val === 'string',\n stringOrUint8Array: (val: any): boolean => typeof val === 'string' || isBytes_(val),\n isSafeInteger: (val: any): boolean => Number.isSafeInteger(val),\n array: (val: any): boolean => Array.isArray(val),\n field: (val: any, object: any): any => (object as any).Fp.isValid(val),\n hash: (val: any): boolean => typeof val === 'function' && Number.isSafeInteger(val.outputLen),\n} as const;\ntype Validator = keyof typeof validatorFns;\ntype ValMap<T extends Record<string, any>> = { [K in keyof T]?: Validator };\n// type Record<K extends string | number | symbol, T> = { [P in K]: T; }\n\nexport function validateObject<T extends Record<string, any>>(\n object: T,\n validators: ValMap<T>,\n optValidators: ValMap<T> = {}\n): T {\n const checkField = (fieldName: keyof T, type: Validator, isOptional: boolean) => {\n const checkVal = validatorFns[type];\n if (typeof checkVal !== 'function') throw new Error('invalid validator function');\n\n const val = object[fieldName as keyof typeof object];\n if (isOptional && val === undefined) return;\n if (!checkVal(val, object)) {\n throw new Error(\n 'param ' + String(fieldName) + ' is invalid. Expected ' + type + ', got ' + val\n );\n }\n };\n for (const [fieldName, type] of Object.entries(validators)) checkField(fieldName, type!, false);\n for (const [fieldName, type] of Object.entries(optValidators)) checkField(fieldName, type!, true);\n return object;\n}\n// validate type tests\n// const o: { a: number; b: number; c: number } = { a: 1, b: 5, c: 6 };\n// const z0 = validateObject(o, { a: 'isSafeInteger' }, { c: 'bigint' }); // Ok!\n// // Should fail type-check\n// const z1 = validateObject(o, { a: 'tmp' }, { c: 'zz' });\n// const z2 = validateObject(o, { a: 'isSafeInteger' }, { c: 'zz' });\n// const z3 = validateObject(o, { test: 'boolean', z: 'bug' });\n// const z4 = validateObject(o, { a: 'boolean', z: 'bug' });\n\nexport function isHash(val: CHash): boolean {\n return typeof val === 'function' && Number.isSafeInteger(val.outputLen);\n}\nexport function _validateObject(\n object: Record<string, any>,\n fields: Record<string, string>,\n optFields: Record<string, string> = {}\n): void {\n if (!object || typeof object !== 'object') throw new Error('expected valid options object');\n type Item = keyof typeof object;\n function checkField(fieldName: Item, expectedType: string, isOpt: boolean) {\n const val = object[fieldName];\n if (isOpt && val === undefined) return;\n const current = typeof val;\n if (current !== expectedType || val === null)\n throw new Error(`param \"${fieldName}\" is invalid: expected ${expectedType}, got ${current}`);\n }\n Object.entries(fields).forEach(([k, v]) => checkField(k, v, false));\n Object.entries(optFields).forEach(([k, v]) => checkField(k, v, true));\n}\n\n/**\n * throws not implemented error\n */\nexport const notImplemented = (): never => {\n throw new Error('not implemented');\n};\n\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nexport function memoized<T extends object, R, O extends any[]>(\n fn: (arg: T, ...args: O) => R\n): (arg: T, ...args: O) => R {\n const map = new WeakMap<T, R>();\n return (arg: T, ...args: O): R => {\n const val = map.get(arg);\n if (val !== undefined) return val;\n const computed = fn(arg, ...args);\n map.set(arg, computed);\n return computed;\n };\n}\n","/**\n * Utils for modular division and fields.\n * Field over 11 is a finite (Galois) field is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n _validateObject,\n anumber,\n bitMask,\n bytesToNumberBE,\n bytesToNumberLE,\n ensureBytes,\n numberToBytesBE,\n numberToBytesLE,\n} from '../utils.ts';\n\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = /* @__PURE__ */ BigInt(2), _3n = /* @__PURE__ */ BigInt(3);\n// prettier-ignore\nconst _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5), _7n = /* @__PURE__ */ BigInt(7);\n// prettier-ignore\nconst _8n = /* @__PURE__ */ BigInt(8), _9n = /* @__PURE__ */ BigInt(9), _16n = /* @__PURE__ */ BigInt(16);\n\n// Calculates a modulo b\nexport function mod(a: bigint, b: bigint): bigint {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nexport function pow(num: bigint, power: bigint, modulo: bigint): bigint {\n return FpPow(Field(modulo), num, power);\n}\n\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nexport function pow2(x: bigint, power: bigint, modulo: bigint): bigint {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nexport function invert(number: bigint, modulo: bigint): bigint {\n if (number === _0n) throw new Error('invert: expected non-zero number');\n if (modulo <= _0n) throw new Error('invert: expected positive modulus, got ' + modulo);\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n) throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\n\nfunction assertIsSquare<T>(Fp: IField<T>, root: T, n: T): void {\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n}\n\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4<T>(Fp: IField<T>, n: T) {\n const p1div4 = (Fp.ORDER + _1n) / _4n;\n const root = Fp.pow(n, p1div4);\n assertIsSquare(Fp, root, n);\n return root;\n}\n\nfunction sqrt5mod8<T>(Fp: IField<T>, n: T) {\n const p5div8 = (Fp.ORDER - _5n) / _8n;\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, p5div8);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n assertIsSquare(Fp, root, n);\n return root;\n}\n\n// Based on RFC9380, Kong algorithm\n// prettier-ignore\nfunction sqrt9mod16(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n const Fp_ = Field(P);\n const tn = tonelliShanks(P);\n const c1 = tn(Fp_, Fp_.neg(Fp_.ONE));// 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n const c2 = tn(Fp_, c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n const c3 = tn(Fp_, Fp_.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n const c4 = (P + _7n) / _16n; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n return <T>(Fp: IField<T>, n: T) => {\n let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4\n let tv2 = Fp.mul(tv1, c1); // 2. tv2 = c1 * tv1\n const tv3 = Fp.mul(tv1, c2); // 3. tv3 = c2 * tv1\n const tv4 = Fp.mul(tv1, c3); // 4. tv4 = c3 * tv1\n const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x\n const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x\n tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x\n const root = Fp.cmov(tv1, tv2, e3);// 10. z = CMOV(tv1, tv2, e3) # Select sqrt from tv1 & tv2\n assertIsSquare(Fp, root, n);\n return root;\n };\n}\n\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n // Initialization (precomputation).\n // Caching initialization could boost perf by 7%.\n if (P < _3n) throw new Error('sqrt is not defined for small field');\n // Factor P - 1 = Q * 2^S, where Q is odd\n let Q = P - _1n;\n let S = 0;\n while (Q % _2n === _0n) {\n Q /= _2n;\n S++;\n }\n\n // Find the first quadratic non-residue Z >= 2\n let Z = _2n;\n const _Fp = Field(P);\n while (FpLegendre(_Fp, Z) === 1) {\n // Basic primality test for P. After x iterations, chance of\n // not finding quadratic non-residue is 2^x, so 2^1000.\n if (Z++ > 1000) throw new Error('Cannot find square root: probably non-prime P');\n }\n // Fast-path; usually done before Z, but we do \"primality test\".\n if (S === 1) return sqrt3mod4;\n\n // Slow-path\n // TODO: test on Fp2 and others\n let cc = _Fp.pow(Z, Q); // c = z^Q\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow<T>(Fp: IField<T>, n: T): T {\n if (Fp.is0(n)) return n;\n // Check if n is a quadratic residue using Legendre symbol\n if (FpLegendre(Fp, n) !== 1) throw new Error('Cannot find square root');\n\n // Initialize variables for the main loop\n let M = S;\n let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n\n // Main loop\n // while t != 1\n while (!Fp.eql(t, Fp.ONE)) {\n if (Fp.is0(t)) return Fp.ZERO; // if t=0 return R=0\n let i = 1;\n\n // Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P)\n let t_tmp = Fp.sqr(t); // t^(2^1)\n while (!Fp.eql(t_tmp, Fp.ONE)) {\n i++;\n t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n if (i === M) throw new Error('Cannot find square root');\n }\n\n // Calculate the exponent for b: 2^(M - i - 1)\n const exponent = _1n << BigInt(M - i - 1); // bigint is important\n const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n\n // Update variables\n M = i;\n c = Fp.sqr(b); // c = b^2\n t = Fp.mul(t, c); // t = (t * b^2)\n R = Fp.mul(R, b); // R = R*b\n }\n return R;\n };\n}\n\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P ≡ 3 (mod 4)\n * 2. P ≡ 5 (mod 8)\n * 3. P ≡ 9 (mod 16)\n * 4. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nexport function FpSqrt(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n // P ≡ 3 (mod 4) => √n = n^((P+1)/4)\n if (P % _4n === _3n) return sqrt3mod4;\n // P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n if (P % _8n === _5n) return sqrt5mod8;\n // P ≡ 9 (mod 16) => Kong algorithm, page 11 of https://eprint.iacr.org/2012/685.pdf (algorithm 4)\n if (P % _16n === _9n) return sqrt9mod16(P);\n // Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num: bigint, modulo: bigint): boolean =>\n (mod(num, modulo) & _1n) === _1n;\n\n/** Field is not always over prime: for example, Fp2 has ORDER(q)=p^m. */\nexport interface IField<T> {\n ORDER: bigint;\n isLE: boolean;\n BYTES: number;\n BITS: number;\n MASK: bigint;\n ZERO: T;\n ONE: T;\n // 1-arg\n create: (num: T) => T;\n isValid: (num: T) => boolean;\n is0: (num: T) => boolean;\n isValidNot0: (num: T) => boolean;\n neg(num: T): T;\n inv(num: T): T;\n sqrt(num: T): T;\n sqr(num: T): T;\n // 2-args\n eql(lhs: T, rhs: T): boolean;\n add(lhs: T, rhs: T): T;\n sub(lhs: T, rhs: T): T;\n mul(lhs: T, rhs: T | bigint): T;\n pow(lhs: T, power: bigint): T;\n div(lhs: T, rhs: T | bigint): T;\n // N for NonNormalized (for now)\n addN(lhs: T, rhs: T): T;\n subN(lhs: T, rhs: T): T;\n mulN(lhs: T, rhs: T | bigint): T;\n sqrN(num: T): T;\n\n // Optional\n // Should be same as sgn0 function in\n // [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#section-4.1).\n // NOTE: sgn0 is 'negative in LE', which is same as odd. And negative in LE is kinda strange definition anyway.\n isOdd?(num: T): boolean; // Odd instead of even since we have it for Fp2\n allowedLengths?: number[];\n // legendre?(num: T): T;\n invertBatch: (lst: T[]) => T[];\n toBytes(num: T): Uint8Array;\n fromBytes(bytes: Uint8Array, skipValidation?: boolean): T;\n // If c is False, CMOV returns a, otherwise it returns b.\n cmov(a: T, b: T, c: boolean): T;\n}\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n] as const;\nexport function validateField<T>(field: IField<T>): IField<T> {\n const initial = {\n ORDER: 'bigint',\n MASK: 'bigint',\n BYTES: 'number',\n BITS: 'number',\n } as Record<string, string>;\n const opts = FIELD_FIELDS.reduce((map, val: string) => {\n map[val] = 'function';\n return map;\n }, initial);\n _validateObject(field, opts);\n // const max = 16384;\n // if (field.BYTES < 1 || field.BYTES > max) throw new Error('invalid field');\n // if (field.BITS < 1 || field.BITS > 8 * max) throw new Error('invalid field');\n return field;\n}\n\n// Generic field functions\n\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow<T>(Fp: IField<T>, num: T, power: bigint): T {\n if (power < _0n) throw new Error('invalid exponent, negatives unsupported');\n if (power === _0n) return Fp.ONE;\n if (power === _1n) return num;\n let p = Fp.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n) p = Fp.mul(p, d);\n d = Fp.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nexport function FpInvertBatch<T>(Fp: IField<T>, nums: T[], passZero = false): T[] {\n const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n // Walk from first to last, multiply them by each other MOD p\n const multipliedAcc = nums.reduce((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = acc;\n return Fp.mul(acc, num);\n }, Fp.ONE);\n // Invert last element\n const invertedAcc = Fp.inv(multipliedAcc);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = Fp.mul(acc, inverted[i]);\n return Fp.mul(acc, num);\n }, invertedAcc);\n return inverted;\n}\n\n// TODO: remove\nexport function FpDiv<T>(Fp: IField<T>, lhs: T, rhs: T | bigint): T {\n return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) ≡ 1 if a is a square (mod p), quadratic residue\n * * (a | p) ≡ -1 if a is not a square (mod p), quadratic non residue\n * * (a | p) ≡ 0 if a ≡ 0 (mod p)\n */\nexport function FpLegendre<T>(Fp: IField<T>, n: T): -1 | 0 | 1 {\n // We can use 3rd argument as optional cache of this value\n // but seems unneeded for now. The operation is very fast.\n const p1mod2 = (Fp.ORDER - _1n) / _2n;\n const powered = Fp.pow(n, p1mod2);\n const yes = Fp.eql(powered, Fp.ONE);\n const zero = Fp.eql(powered, Fp.ZERO);\n const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n if (!yes && !zero && !no) throw new Error('invalid Legendre symbol result');\n return yes ? 1 : zero ? 0 : -1;\n}\n\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare<T>(Fp: IField<T>, n: T): boolean {\n const l = FpLegendre(Fp, n);\n return l === 1;\n}\n\nexport type NLength = { nByteLength: number; nBitLength: number };\n// CURVE.n lengths\nexport function nLength(n: bigint, nBitLength?: number): NLength {\n // Bit size, byte size of CURVE.n\n if (nBitLength !== undefined) anumber(nBitLength);\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\n\ntype FpField = IField<bigint> & Required<Pick<IField<bigint>, 'isOdd'>>;\ntype SqrtFn = (n: bigint) => bigint;\ntype FieldOpts = Partial<{\n sqrt: SqrtFn;\n isLE: boolean;\n BITS: number;\n modFromBytes: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n allowedLengths?: readonly number[]; // for P521 (adds padding for smaller sizes)\n}>;\n/**\n * Creates a finite field. Major performance optimizations:\n * * 1. Denormalized operations like mulN instead of mul.\n * * 2. Identical object shape: never add or remove keys.\n * * 3. `Object.freeze`.\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n *\n * Note about field properties:\n * * CHARACTERISTIC p = prime number, number of elements in main subgroup.\n * * ORDER q = similar to cofactor in curves, may be composite `q = p^m`.\n *\n * @param ORDER field order, probably prime, or could be composite\n * @param bitLen how many bits the field consumes\n * @param isLE (default: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(\n ORDER: bigint,\n bitLenOrOpts?: number | FieldOpts, // TODO: use opts only in v2?\n isLE = false,\n opts: { sqrt?: SqrtFn } = {}\n): Readonly<FpField> {\n if (ORDER <= _0n) throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n let _nbitLength: number | undefined = undefined;\n let _sqrt: SqrtFn | undefined = undefined;\n let modFromBytes: boolean = false;\n let allowedLengths: undefined | readonly number[] = undefined;\n if (typeof bitLenOrOpts === 'object' && bitLenOrOpts != null) {\n if (opts.sqrt || isLE) throw new Error('cannot specify opts in two arguments');\n const _opts = bitLenOrOpts;\n if (_opts.BITS) _nbitLength = _opts.BITS;\n if (_opts.sqrt) _sqrt = _opts.sqrt;\n if (typeof _opts.isLE === 'boolean') isLE = _opts.isLE;\n if (typeof _opts.modFromBytes === 'boolean') modFromBytes = _opts.modFromBytes;\n allowedLengths = _opts.allowedLengths;\n } else {\n if (typeof bitLenOrOpts === 'number') _nbitLength = bitLenOrOpts;\n if (opts.sqrt) _sqrt = opts.sqrt;\n }\n const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, _nbitLength);\n if (BYTES > 2048) throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n let sqrtP: ReturnType<typeof FpSqrt>; // cached sqrtP\n const f: Readonly<FpField> = Object.freeze({\n ORDER,\n isLE,\n BITS,\n BYTES,\n MASK: bitMask(BITS),\n ZERO: _0n,\n ONE: _1n,\n allowedLengths: allowedLengths,\n create: (num) => mod(num, ORDER),\n isValid: (num) => {\n if (typeof num !== 'bigint')\n throw new Error('invalid field element: expected bigint, got ' + typeof num);\n return _0n <= num && num < ORDER; // 0 is valid element, but it's not invertible\n },\n is0: (num) => num === _0n,\n // is valid and invertible\n isValidNot0: (num: bigint) => !f.is0(num) && f.isValid(num),\n isOdd: (num) => (num & _1n) === _1n,\n neg: (num) => mod(-num, ORDER),\n eql: (lhs, rhs) => lhs === rhs,\n\n sqr: (num) => mod(num * num, ORDER),\n add: (lhs, rhs) => mod(lhs + rhs, ORDER),\n sub: (lhs, rhs) => mod(lhs - rhs, ORDER),\n mul: (lhs, rhs) => mod(lhs * rhs, ORDER),\n pow: (num, power) => FpPow(f, num, power),\n div: (lhs, rhs) => mod(lhs * invert(rhs, ORDER), ORDER),\n\n // Same as above, but doesn't normalize\n sqrN: (num) => num * num,\n addN: (lhs, rhs) => lhs + rhs,\n subN: (lhs, rhs) => lhs - rhs,\n mulN: (lhs, rhs) => lhs * rhs,\n\n inv: (num) => invert(num, ORDER),\n sqrt:\n _sqrt ||\n ((n) => {\n if (!sqrtP) sqrtP = FpSqrt(ORDER);\n return sqrtP(f, n);\n }),\n toBytes: (num) => (isLE ? numberToBytesLE(num, BYTES) : numberToBytesBE(num, BYTES)),\n fromBytes: (bytes, skipValidation = true) => {\n if (allowedLengths) {\n if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) {\n throw new Error(\n 'Field.fromBytes: expected ' + allowedLengths + ' bytes, got ' + bytes.length\n );\n }\n const padded = new Uint8Array(BYTES);\n // isLE add 0 to right, !isLE to the left.\n padded.set(bytes, isLE ? 0 : padded.length - bytes.length);\n bytes = padded;\n }\n if (bytes.length !== BYTES)\n throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n let scalar = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n if (modFromBytes) scalar = mod(scalar, ORDER);\n if (!skipValidation)\n if (!f.isValid(scalar)) throw new Error('invalid field element: outside of range 0..ORDER');\n // NOTE: we don't validate scalar here, please use isValid. This done such way because some\n // protocol may allow non-reduced scalar that reduced later or changed some other way.\n return scalar;\n },\n // TODO: we don't need it here, move out to separate fn\n invertBatch: (lst) => FpInvertBatch(f, lst),\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov: (a, b, c) => (c ? b : a),\n } as FpField);\n return Object.freeze(f);\n}\n\n// Generic random scalar, we can do same for other fields if via Fp2.mul(Fp2.ONE, Fp2.random)?\n// This allows unsafe methods like ignore bias or zero. These unsafe, but often used in different protocols (if deterministic RNG).\n// which mean we cannot force this via opts.\n// Not sure what to do with randomBytes, we can accept it inside opts if wanted.\n// Probably need to export getMinHashLength somewhere?\n// random(bytes?: Uint8Array, unsafeAllowZero = false, unsafeAllowBias = false) {\n// const LEN = !unsafeAllowBias ? getMinHashLength(ORDER) : BYTES;\n// if (bytes === undefined) bytes = randomBytes(LEN); // _opts.randomBytes?\n// const num = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n// // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n// const reduced = unsafeAllowZero ? mod(num, ORDER) : mod(num, ORDER - _1n) + _1n;\n// return reduced;\n// },\n\nexport function FpSqrtOdd<T>(Fp: IField<T>, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\n\nexport function FpSqrtEven<T>(Fp: IField<T>, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Same as mapKeyToField, but accepts less bytes (40 instead of 48 for 32-byte field).\n * Which makes it slightly more biased, less secure.\n * @deprecated use `mapKeyToField` instead\n */\nexport function hashToPrivateScalar(\n hash: string | Uint8Array,\n groupOrder: bigint,\n isLE = false\n): bigint {\n hash = ensureBytes('privateHash', hash);\n const hashLen = hash.length;\n const minLen = nLength(groupOrder).nByteLength + 8;\n if (minLen < 24 || hashLen < minLen || hashLen > 1024)\n throw new Error(\n 'hashToPrivateScalar: expected ' + minLen + '-1024 bytes of input, got ' + hashLen\n );\n const num = isLE ? bytesToNumberLE(hash) : bytesToNumberBE(hash);\n return mod(num, groupOrder - _1n) + _1n;\n}\n\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder: bigint): number {\n if (typeof fieldOrder !== 'bigint') throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder: bigint): number {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.CURVE.n)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key: Uint8Array, fieldOrder: bigint, isLE = false): Uint8Array {\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n const num = isLE ? bytesToNumberLE(key) : bytesToNumberBE(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n","/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { bitLen, bitMask, validateObject } from '../utils.ts';\nimport { Field, FpInvertBatch, nLength, validateField, type IField } from './modular.ts';\n\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\n\nexport type AffinePoint<T> = {\n x: T;\n y: T;\n} & { Z?: never };\n\n// This was initialy do this way to re-use montgomery ladder in field (add->mul,double->sqr), but\n// that didn't happen and there is probably not much reason to have separate Group like this?\nexport interface Group<T extends Group<T>> {\n double(): T;\n negate(): T;\n add(other: T): T;\n subtract(other: T): T;\n equals(other: T): boolean;\n multiply(scalar: bigint): T;\n toAffine?(invertedZ?: any): AffinePoint<any>;\n}\n\n// We can't \"abstract out\" coordinates (X, Y, Z; and T in Edwards): argument names of constructor\n// are not accessible. See Typescript gh-56093, gh-41594.\n//\n// We have to use recursive types, so it will return actual point, not constained `CurvePoint`.\n// If, at any point, P is `any`, it will erase all types and replace it\n// with `any`, because of recursion, `any implements CurvePoint`,\n// but we lose all constrains on methods.\n\n/** Base interface for all elliptic curve Points. */\nexport interface CurvePoint<F, P extends CurvePoint<F, P>> extends Group<P> {\n /** Affine x coordinate. Different from projective / extended X coordinate. */\n x: F;\n /** Affine y coordinate. Different from projective / extended Y coordinate. */\n y: F;\n Z?: F;\n double(): P;\n negate(): P;\n add(other: P): P;\n subtract(other: P): P;\n equals(other: P): boolean;\n multiply(scalar: bigint): P;\n assertValidity(): void;\n clearCofactor(): P;\n is0(): boolean;\n isTorsionFree(): boolean;\n isSmallOrder(): boolean;\n multiplyUnsafe(scalar: bigint): P;\n /**\n * Massively speeds up `p.multiply(n)` by using precompute tables (caching). See {@link wNAF}.\n * @param isLazy calculate cache now. Default (true) ensures it's deferred to first `multiply()`\n */\n precompute(windowSize?: number, isLazy?: boolean): P;\n /** Converts point to 2D xy affine coordinates */\n toAffine(invertedZ?: F): AffinePoint<F>;\n toBytes(): Uint8Array;\n toHex(): string;\n}\n\n/** Base interface for all elliptic curve Point constructors. */\nexport interface CurvePointCons<P extends CurvePoint<any, P>> {\n [Symbol.hasInstance]: (item: unknown) => boolean;\n BASE: P;\n ZERO: P;\n /** Field for basic curve math */\n Fp: IField<P_F<P>>;\n /** Scalar field, for scalars in multiply and others */\n Fn: IField<bigint>;\n /** Creates point from x, y. Does NOT validate if the point is valid. Use `.assertValidity()`. */\n fromAffine(p: AffinePoint<P_F<P>>): P;\n fromBytes(bytes: Uint8Array): P;\n fromHex(hex: Uint8Array | string): P;\n}\n\n// Type inference helpers: PC - PointConstructor, P - Point, Fp - Field element\n// Short names, because we use them a lot in result types:\n// * we can't do 'P = GetCurvePoint<PC>': this is default value and doesn't constrain anything\n// * we can't do 'type X = GetCurvePoint<PC>': it won't be accesible for arguments/return types\n// * `CurvePointCons<P extends CurvePoint<any, P>>` constraints from interface definition\n// won't propagate, if `PC extends CurvePointCons<any>`: the P would be 'any', which is incorrect\n// * PC could be super specific with super specific P, which implements CurvePoint<any, P>.\n// this means we need to do stuff like\n// `function test<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(`\n// if we want type safety around P, otherwise PC_P<PC> will be any\n\n/** Returns Fp type from Point (P_F<P> == P.F) */\nexport type P_F<P extends CurvePoint<any, P>> = P extends CurvePoint<infer F, P> ? F : never;\n/** Returns Fp type from PointCons (PC_F<PC> == PC.P.F) */\nexport type PC_F<PC extends CurvePointCons<CurvePoint<any, any>>> = PC['Fp']['ZERO'];\n/** Returns Point type from PointCons (PC_P<PC> == PC.P) */\nexport type PC_P<PC extends CurvePointCons<CurvePoint<any, any>>> = PC['ZERO'];\n\n// Ugly hack to get proper type inference, because in typescript fails to infer resursively.\n// The hack allows to do up to 10 chained operations without applying type erasure.\n//\n// Types which won't work:\n// * `CurvePointCons<CurvePoint<any, any>>`, will return `any` after 1 operation\n// * `CurvePointCons<any>: WeierstrassPointCons<bigint> extends CurvePointCons<any> = false`\n// * `P extends CurvePoint, PC extends CurvePointCons<P>`\n// * It can't infer P from PC alone\n// * Too many relations between F, P & PC\n// * It will infer P/F if `arg: CurvePointCons<F, P>`, but will fail if PC is generic\n// * It will work correctly if there is an additional argument of type P\n// * But generally, we don't want to parametrize `CurvePointCons` over `F`: it will complicate\n// types, making them un-inferable\n// prettier-ignore\nexport type PC_ANY = CurvePointCons<\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any, any>\n >>>>>>>>>\n>;\n\nexport interface CurveLengths {\n secretKey?: number;\n publicKey?: number;\n publicKeyUncompressed?: number;\n publicKeyHasPrefix?: boolean;\n signature?: number;\n seed?: number;\n}\nexport type GroupConstructor<T> = {\n BASE: T;\n ZERO: T;\n};\n/** @deprecated */\nexport type ExtendedGroupConstructor<T> = GroupConstructor<T> & {\n Fp: IField<any>;\n Fn: IField<bigint>;\n fromAffine(ap: AffinePoint<any>): T;\n};\nexport type Mapper<T> = (i: T[]) => T[];\n\nexport function negateCt<T extends { negate: () => T }>(condition: boolean, item: T): T {\n const neg = item.negate();\n return condition ? neg : item;\n}\n\n/**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\nexport function normalizeZ<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n points: P[]\n): P[] {\n const invertedZs = FpInvertBatch(\n c.Fp,\n points.map((p) => p.Z!)\n );\n return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i])));\n}\n\nfunction validateW(W: number, bits: number) {\n if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\n\n/** Internal wNAF opts for specific W and scalarBits */\nexport type WOpts = {\n windows: number;\n windowSize: number;\n mask: bigint;\n maxNumber: number;\n shiftBy: bigint;\n};\n\nfunction calcWOpts(W: number, scalarBits: number): WOpts {\n validateW(W, scalarBits);\n const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n const maxNumber = 2 ** W; // W=8 256\n const mask = bitMask(W); // W=8 255 == mask 0b11111111\n const shiftBy = BigInt(W); // W=8 8\n return { windows, windowSize, mask, maxNumber, shiftBy };\n}\n\nfunction calcOffsets(n: bigint, window: number, wOpts: WOpts) {\n const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n let wbits = Number(n & mask); // extract W bits.\n let nextN = n >> shiftBy; // shift number by W bits.\n\n // What actually happens here:\n // const highestBit = Number(mask ^ (mask >> 1n));\n // let wbits2 = wbits - 1; // skip zero\n // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n\n // split if bits > max: +224 => 256-32\n if (wbits > windowSize) {\n // we skip zero, which means instead of `>= size-1`, we do `> size`\n wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n nextN += _1n; // +256 (carry)\n }\n const offsetStart = window * windowSize;\n const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n const isZero = wbits === 0; // is current window slice a 0?\n const isNeg = wbits < 0; // is current window slice negative?\n const isNegF = window % 2 !== 0; // fake random statement for noise\n const offsetF = offsetStart; // fake offset for noise\n return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\n\nfunction validateMSMPoints(points: any[], c: any) {\n if (!Array.isArray(points)) throw new Error('array expected');\n points.forEach((p, i) => {\n if (!(p instanceof c)) throw new Error('invalid point at index ' + i);\n });\n}\nfunction validateMSMScalars(scalars: any[], field: any) {\n if (!Array.isArray(scalars)) throw new Error('array of scalars expected');\n scalars.forEach((s, i) => {\n if (!field.isValid(s)) throw new Error('invalid scalar at index ' + i);\n });\n}\n\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap<any, any[]>();\nconst pointWindowSizes = new WeakMap<any, number>();\n\nfunction getW(P: any): number {\n // To disable precomputes:\n // return 1;\n return pointWindowSizes.get(P) || 1;\n}\n\nfunction assert0(n: bigint): void {\n if (n !== _0n) throw new Error('invalid wNAF');\n}\n\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Table generation takes **30MB of ram and 10ms on high-end CPU**,\n * but may take much longer on slow devices. Actual generation will happen on\n * first call of `multiply()`. By default, `BASE` point is precomputed.\n *\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nexport class wNAF<PC extends PC_ANY> {\n private readonly BASE: PC_P<PC>;\n private readonly ZERO: PC_P<PC>;\n private readonly Fn: PC['Fn'];\n readonly bits: number;\n\n // Parametrized with a given Point class (not individual point)\n constructor(Point: PC, bits: number) {\n this.BASE = Point.BASE;\n this.ZERO = Point.ZERO;\n this.Fn = Point.Fn;\n this.bits = bits;\n }\n\n // non-const time multiplication ladder\n _unsafeLadder(elm: PC_P<PC>, n: bigint, p: PC_P<PC> = this.ZERO): PC_P<PC> {\n let d: PC_P<PC> = elm;\n while (n > _0n) {\n if (n & _1n) p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n }\n\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n * - 𝑊 is the window size\n * - 𝑛 is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param point Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n private precomputeWindow(point: PC_P<PC>, W: number): PC_P<PC>[] {\n const { windows, windowSize } = calcWOpts(W, this.bits);\n const points: PC_P<PC>[] = [];\n let p: PC_P<PC> = point;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // i=1, bc we skip 0\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n }\n\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * More compact implementation:\n * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n * @returns real and fake (for const-time) points\n */\n private wNAF(W: number, precomputes: PC_P<PC>[], n: bigint): { p: PC_P<PC>; f: PC_P<PC> } {\n // Scalar should be smaller than field order\n if (!this.Fn.isValid(n)) throw new Error('invalid scalar');\n // Accumulators\n let p = this.ZERO;\n let f = this.BASE;\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // bits are 0: add garbage to fake point\n // Important part for const-time getPublicKey: add random \"noise\" point to f.\n f = f.add(negateCt(isNegF, precomputes[offsetF]));\n } else {\n // bits are 1: add to result point\n p = p.add(negateCt(isNeg, precomputes[offset]));\n }\n }\n assert0(n);\n // Return both real and fake points: JIT won't eliminate f.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n }\n\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n private wNAFUnsafe(\n W: number,\n precomputes: PC_P<PC>[],\n n: bigint,\n acc: PC_P<PC> = this.ZERO\n ): PC_P<PC> {\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n if (n === _0n) break; // Early-exit, skip 0 value\n const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // Window bits are 0: skip processing.\n // Move to next window.\n continue;\n } else {\n const item = precomputes[offset];\n acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n }\n }\n assert0(n);\n return acc;\n }\n\n private getPrecomputes(W: number, point: PC_P<PC>, transform?: Mapper<PC_P<PC>>): PC_P<PC>[] {\n // Calculate precomputes on a first run, reuse them after\n let comp = pointPrecomputes.get(point);\n if (!comp) {\n comp = this.precomputeWindow(point, W) as PC_P<PC>[];\n if (W !== 1) {\n // Doing transform outside of if brings 15% perf hit\n if (typeof transform === 'function') comp = transform(comp);\n pointPrecomputes.set(point, comp);\n }\n }\n return comp;\n }\n\n cached(\n point: PC_P<PC>,\n scalar: bigint,\n transform?: Mapper<PC_P<PC>>\n ): { p: PC_P<PC>; f: PC_P<PC> } {\n const W = getW(point);\n return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar);\n }\n\n unsafe(point: PC_P<PC>, scalar: bigint, transform?: Mapper<PC_P<PC>>, prev?: PC_P<PC>): PC_P<PC> {\n const W = getW(point);\n if (W === 1) return this._unsafeLadder(point, scalar, prev); // For W=1 ladder is ~x2 faster\n return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev);\n }\n\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n createCache(P: PC_P<PC>, W: number): void {\n validateW(W, this.bits);\n pointWindowSizes.set(P, W);\n pointPrecomputes.delete(P);\n }\n\n hasCache(elm: PC_P<PC>): boolean {\n return getW(elm) !== 1;\n }\n}\n\n/**\n * Endomorphism-specific multiplication for Koblitz curves.\n * Cost: 128 dbl, 0-256 adds.\n */\nexport function mulEndoUnsafe<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n Point: PC,\n point: P,\n k1: bigint,\n k2: bigint\n): { p1: P; p2: P } {\n let acc = point;\n let p1 = Point.ZERO;\n let p2 = Point.ZERO;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n) p1 = p1.add(acc);\n if (k2 & _1n) p2 = p2.add(acc);\n acc = acc.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n return { p1, p2 };\n}\n\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka secret keys / bigints)\n */\nexport function pippenger<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n fieldN: IField<bigint>,\n points: P[],\n scalars: bigint[]\n): P {\n // If we split scalars by some window (let's say 8 bits), every chunk will only\n // take 256 buckets even if there are 4096 scalars, also re-uses double.\n // TODO:\n // - https://eprint.iacr.org/2024/750.pdf\n // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n // 0 is accepted in scalars\n validateMSMPoints(points, c);\n validateMSMScalars(scalars, fieldN);\n const plength = points.length;\n const slength = scalars.length;\n if (plength !== slength) throw new Error('arrays of points and scalars must have equal length');\n // if (plength === 0) throw new Error('array must be of length >= 2');\n const zero = c.ZERO;\n const wbits = bitLen(BigInt(plength));\n let windowSize = 1; // bits\n if (wbits > 12) windowSize = wbits - 3;\n else if (wbits > 4) windowSize = wbits - 2;\n else if (wbits > 0) windowSize = 2;\n const MASK = bitMask(windowSize);\n const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n let sum = zero;\n for (let i = lastBits; i >= 0; i -= windowSize) {\n buckets.fill(zero);\n for (let j = 0; j < slength; j++) {\n const scalar = scalars[j];\n const wbits = Number((scalar >> BigInt(i)) & MASK);\n buckets[wbits] = buckets[wbits].add(points[j]);\n }\n let resI = zero; // not using this will do small speed-up, but will lose ct\n // Skip first bucket, because it is zero\n for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n sumI = sumI.add(buckets[j]);\n resI = resI.add(sumI);\n }\n sum = sum.add(resI);\n if (i !== 0) for (let j = 0; j < windowSize; j++) sum = sum.double();\n }\n return sum as P;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nexport function precomputeMSMUnsafe<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n fieldN: IField<bigint>,\n points: P[],\n windowSize: number\n): (scalars: bigint[]) => P {\n /**\n * Performance Analysis of Window-based Precomputation\n *\n * Base Case (256-bit scalar, 8-bit window):\n * - Standard precomputation requires:\n * - 31 additions per scalar × 256 scalars = 7,936 ops\n * - Plus 255 summary additions = 8,191 total ops\n * Note: Summary additions can be optimized via accumulator\n *\n * Chunked Precomputation Analysis:\n * - Using 32 chunks requires:\n * - 255 additions per chunk\n * - 256 doublings\n * - Total: (255 × 32) + 256 = 8,416 ops\n *\n * Memory Usage Comparison:\n * Window Size | Standard Points | Chunked Points\n * ------------|-----------------|---------------\n * 4-bit | 520 | 15\n * 8-bit | 4,224 | 255\n * 10-bit | 13,824 | 1,023\n * 16-bit | 557,056 | 65,535\n *\n * Key Advantages:\n * 1. Enables larger window sizes due to reduced memory overhead\n * 2. More efficient for smaller scalar counts:\n * - 16 chunks: (16 × 255) + 256 = 4,336 ops\n * - ~2x faster than standard 8,191 ops\n *\n * Limitations:\n * - Not suitable for plain precomputes (requires 256 constant doublings)\n * - Performance degrades with larger scalar counts:\n * - Optimal for ~256 scalars\n * - Less efficient for 4096+ scalars (Pippenger preferred)\n */\n validateW(windowSize, fieldN.BITS);\n validateMSMPoints(points, c);\n const zero = c.ZERO;\n const tableSize = 2 ** windowSize - 1; // table size (without zero)\n const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n const MASK = bitMask(windowSize);\n const tables = points.map((p: P) => {\n const res = [];\n for (let i = 0, acc = p; i < tableSize; i++) {\n res.push(acc);\n acc = acc.add(p);\n }\n return res;\n });\n return (scalars: bigint[]): P => {\n validateMSMScalars(scalars, fieldN);\n if (scalars.length > points.length)\n throw new Error('array of scalars must be smaller than array of points');\n let res = zero;\n for (let i = 0; i < chunks; i++) {\n // No need to double if accumulator is still zero.\n if (res !== zero) for (let j = 0; j < windowSize; j++) res = res.double();\n const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n for (let j = 0; j < scalars.length; j++) {\n const n = scalars[j];\n const curr = Number((n >> shiftBy) & MASK);\n if (!curr) continue; // skip zero scalars chunks\n res = res.add(tables[j][curr - 1]);\n }\n }\n return res;\n };\n}\n\n// TODO: remove\n/**\n * Generic BasicCurve interface: works even for polynomial fields (BLS): P, n, h would be ok.\n * Though generator can be different (Fp2 / Fp6 for BLS).\n */\nexport type BasicCurve<T> = {\n Fp: IField<T>; // Field over which we'll do calculations (Fp)\n n: bigint; // Curve order, total count of valid points in the field\n nBitLength?: number; // bit length of curve order\n nByteLength?: number; // byte length of curve order\n h: bigint; // cofactor. we can assign default=1, but users will just ignore it w/o validation\n hEff?: bigint; // Number to multiply to clear cofactor\n Gx: T; // base point X coordinate\n Gy: T; // base point Y coordinate\n allowInfinityPoint?: boolean; // bls12-381 requires it. ZERO point is valid, but invalid pubkey\n};\n\n// TODO: remove\n/** @deprecated */\nexport function validateBasic<FP, T>(\n curve: BasicCurve<FP> & T\n): Readonly<\n {\n readonly nBitLength: number;\n readonly nByteLength: number;\n } & BasicCurve<FP> &\n T & {\n p: bigint;\n }\n> {\n validateField(curve.Fp);\n validateObject(\n curve,\n {\n n: 'bigint',\n h: 'bigint',\n Gx: 'field',\n Gy: 'field',\n },\n {\n nBitLength: 'isSafeInteger',\n nByteLength: 'isSafeInteger',\n }\n );\n // Set defaults\n return Object.freeze({\n ...nLength(curve.n, curve.nBitLength),\n ...curve,\n ...{ p: curve.Fp.ORDER },\n } as const);\n}\n\nexport type ValidCurveParams<T> = {\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b?: T;\n d?: T;\n Gx: T;\n Gy: T;\n};\n\nfunction createField<T>(order: bigint, field?: IField<T>, isLE?: boolean): IField<T> {\n if (field) {\n if (field.ORDER !== order) throw new Error('Field.ORDER must match order: Fp == p, Fn == n');\n validateField(field);\n return field;\n } else {\n return Field(order, { isLE }) as unknown as IField<T>;\n }\n}\nexport type FpFn<T> = { Fp: IField<T>; Fn: IField<bigint> };\n\n/** Validates CURVE opts and creates fields */\nexport function _createCurveFields<T>(\n type: 'weierstrass' | 'edwards',\n CURVE: ValidCurveParams<T>,\n curveOpts: Partial<FpFn<T>> = {},\n FpFnLE?: boolean\n): FpFn<T> & { CURVE: ValidCurveParams<T> } {\n if (FpFnLE === undefined) FpFnLE = type === 'edwards';\n if (!CURVE || typeof CURVE !== 'object') throw new Error(`expected valid ${type} CURVE object`);\n for (const p of ['p', 'n', 'h'] as const) {\n const val = CURVE[p];\n if (!(typeof val === 'bigint' && val > _0n))\n throw new Error(`CURVE.${p} must be positive bigint`);\n }\n const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE);\n const Fn = createField(CURVE.n, curveOpts.Fn, FpFnLE);\n const _b: 'b' | 'd' = type === 'weierstrass' ? 'b' : 'd';\n const params = ['Gx', 'Gy', 'a', _b] as const;\n for (const p of params) {\n // @ts-ignore\n if (!Fp.isValid(CURVE[p]))\n throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`);\n }\n CURVE = Object.freeze(Object.assign({}, CURVE));\n return { CURVE, Fp, Fn };\n}\n","/**\n * Short Weierstrass curve methods. The formula is: y² = x³ + ax + b.\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n * `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n * `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n * it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n * 1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n * which is hard to debug.\n * 2. Params can be generic and we can't enforce them to be constant value:\n * if somebody creates curve from non-constant params,\n * it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { hmac as nobleHmac } from '@noble/hashes/hmac.js';\nimport { ahash } from '@noble/hashes/utils';\nimport {\n _validateObject,\n _abool2 as abool,\n _abytes2 as abytes,\n aInRange,\n bitLen,\n bitMask,\n bytesToHex,\n bytesToNumberBE,\n concatBytes,\n createHmacDrbg,\n ensureBytes,\n hexToBytes,\n inRange,\n isBytes,\n memoized,\n numberToHexUnpadded,\n randomBytes as randomBytesWeb,\n type CHash,\n type Hex,\n type PrivKey,\n} from '../utils.ts';\nimport {\n _createCurveFields,\n mulEndoUnsafe,\n negateCt,\n normalizeZ,\n pippenger,\n wNAF,\n type AffinePoint,\n type BasicCurve,\n type CurveLengths,\n type CurvePoint,\n type CurvePointCons,\n} from './curve.ts';\nimport {\n Field,\n FpInvertBatch,\n getMinHashLength,\n mapHashToField,\n nLength,\n validateField,\n type IField,\n type NLength,\n} from './modular.ts';\n\nexport type { AffinePoint };\nexport type HmacFnSync = (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array;\n\ntype EndoBasis = [[bigint, bigint], [bigint, bigint]];\n/**\n * When Weierstrass curve has `a=0`, it becomes Koblitz curve.\n * Koblitz curves allow using **efficiently-computable GLV endomorphism ψ**.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n *\n * Endomorphism consists of beta, lambda and splitScalar:\n *\n * 1. GLV endomorphism ψ transforms a point: `P = (x, y) ↦ ψ(P) = (β·x mod p, y)`\n * 2. GLV scalar decomposition transforms a scalar: `k ≡ k₁ + k₂·λ (mod n)`\n * 3. Then these are combined: `k·P = k₁·P + k₂·ψ(P)`\n * 4. Two 128-bit point-by-scalar multiplications + one point addition is faster than\n * one 256-bit multiplication.\n *\n * where\n * * beta: β ∈ Fₚ with β³ = 1, β ≠ 1\n * * lambda: λ ∈ Fₙ with λ³ = 1, λ ≠ 1\n * * splitScalar decomposes k ↦ k₁, k₂, by using reduced basis vectors.\n * Gauss lattice reduction calculates them from initial basis vectors `(n, 0), (-λ, 0)`\n *\n * Check out `test/misc/endomorphism.js` and\n * [gist](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n */\nexport type EndomorphismOpts = {\n beta: bigint;\n basises?: EndoBasis;\n splitScalar?: (k: bigint) => { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n};\n\n// We construct basis in such way that den is always positive and equals n, but num sign depends on basis (not on secret value)\nconst divNearest = (num: bigint, den: bigint) => (num + (num >= 0 ? den : -den) / _2n) / den;\n\nexport type ScalarEndoParts = { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n\n/**\n * Splits scalar for GLV endomorphism.\n */\nexport function _splitEndoScalar(k: bigint, basis: EndoBasis, n: bigint): ScalarEndoParts {\n // Split scalar into two such that part is ~half bits: `abs(part) < sqrt(N)`\n // Since part can be negative, we need to do this on point.\n // TODO: verifyScalar function which consumes lambda\n const [[a1, b1], [a2, b2]] = basis;\n const c1 = divNearest(b2 * k, n);\n const c2 = divNearest(-b1 * k, n);\n // |k1|/|k2| is < sqrt(N), but can be negative.\n // If we do `k1 mod N`, we'll get big scalar (`> sqrt(N)`): so, we do cheaper negation instead.\n let k1 = k - c1 * a1 - c2 * a2;\n let k2 = -c1 * b1 - c2 * b2;\n const k1neg = k1 < _0n;\n const k2neg = k2 < _0n;\n if (k1neg) k1 = -k1;\n if (k2neg) k2 = -k2;\n // Double check that resulting scalar less than half bits of N: otherwise wNAF will fail.\n // This should only happen on wrong basises. Also, math inside is too complex and I don't trust it.\n const MAX_NUM = bitMask(Math.ceil(bitLen(n) / 2)) + _1n; // Half bits of N\n if (k1 < _0n || k1 >= MAX_NUM || k2 < _0n || k2 >= MAX_NUM) {\n throw new Error('splitScalar (endomorphism): failed, k=' + k);\n }\n return { k1neg, k1, k2neg, k2 };\n}\n\nexport type ECDSASigFormat = 'compact' | 'recovered' | 'der';\nexport type ECDSARecoverOpts = {\n prehash?: boolean;\n};\nexport type ECDSAVerifyOpts = {\n prehash?: boolean;\n lowS?: boolean;\n format?: ECDSASigFormat;\n};\nexport type ECDSASignOpts = {\n prehash?: boolean;\n lowS?: boolean;\n format?: ECDSASigFormat;\n extraEntropy?: Uint8Array | boolean;\n};\n\nfunction validateSigFormat(format: string): ECDSASigFormat {\n if (!['compact', 'recovered', 'der'].includes(format))\n throw new Error('Signature format must be \"compact\", \"recovered\", or \"der\"');\n return format as ECDSASigFormat;\n}\n\nfunction validateSigOpts<T extends ECDSASignOpts, D extends Required<ECDSASignOpts>>(\n opts: T,\n def: D\n): Required<ECDSASignOpts> {\n const optsn: ECDSASignOpts = {};\n for (let optName of Object.keys(def)) {\n // @ts-ignore\n optsn[optName] = opts[optName] === undefined ? def[optName] : opts[optName];\n }\n abool(optsn.lowS!, 'lowS');\n abool(optsn.prehash!, 'prehash');\n if (optsn.format !== undefined) validateSigFormat(optsn.format);\n return optsn as Required<ECDSASignOpts>;\n}\n\n/** Instance methods for 3D XYZ projective points. */\nexport interface WeierstrassPoint<T> extends CurvePoint<T, WeierstrassPoint<T>> {\n /** projective X coordinate. Different from affine x. */\n readonly X: T;\n /** projective Y coordinate. Different from affine y. */\n readonly Y: T;\n /** projective z coordinate */\n readonly Z: T;\n /** affine x coordinate. Different from projective X. */\n get x(): T;\n /** affine y coordinate. Different from projective Y. */\n get y(): T;\n /** Encodes point using IEEE P1363 (DER) encoding. First byte is 2/3/4. Default = isCompressed. */\n toBytes(isCompressed?: boolean): Uint8Array;\n toHex(isCompressed?: boolean): string;\n\n /** @deprecated use `.X` */\n readonly px: T;\n /** @deprecated use `.Y` */\n readonly py: T;\n /** @deprecated use `.Z` */\n readonly pz: T;\n /** @deprecated use `toBytes` */\n toRawBytes(isCompressed?: boolean): Uint8Array;\n /** @deprecated use `multiplyUnsafe` */\n multiplyAndAddUnsafe(\n Q: WeierstrassPoint<T>,\n a: bigint,\n b: bigint\n ): WeierstrassPoint<T> | undefined;\n /** @deprecated use `p.y % 2n === 0n` */\n hasEvenY(): boolean;\n /** @deprecated use `p.precompute(windowSize)` */\n _setWindowSize(windowSize: number): void;\n}\n\n/** Static methods for 3D XYZ projective points. */\nexport interface WeierstrassPointCons<T> extends CurvePointCons<WeierstrassPoint<T>> {\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n new (X: T, Y: T, Z: T): WeierstrassPoint<T>;\n CURVE(): WeierstrassOpts<T>;\n /** @deprecated use `Point.BASE.multiply(Point.Fn.fromBytes(privateKey))` */\n fromPrivateKey(privateKey: PrivKey): WeierstrassPoint<T>;\n /** @deprecated use `import { normalizeZ } from '@noble/curves/abstract/curve.js';` */\n normalizeZ(points: WeierstrassPoint<T>[]): WeierstrassPoint<T>[];\n /** @deprecated use `import { pippenger } from '@noble/curves/abstract/curve.js';` */\n msm(points: WeierstrassPoint<T>[], scalars: bigint[]): WeierstrassPoint<T>;\n}\n\n/**\n * Weierstrass curve options.\n *\n * * p: prime characteristic (order) of finite field, in which arithmetics is done\n * * n: order of prime subgroup a.k.a total amount of valid curve points\n * * h: cofactor, usually 1. h*n is group order; n is subgroup order\n * * a: formula param, must be in field of p\n * * b: formula param, must be in field of p\n * * Gx: x coordinate of generator point a.k.a. base point\n * * Gy: y coordinate of generator point\n */\nexport type WeierstrassOpts<T> = Readonly<{\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b: T;\n Gx: T;\n Gy: T;\n}>;\n\n// When a cofactor != 1, there can be an effective methods to:\n// 1. Determine whether a point is torsion-free\n// 2. Clear torsion component\n// wrapPrivateKey: bls12-381 requires mod(n) instead of rejecting keys >= n\nexport type WeierstrassExtraOpts<T> = Partial<{\n Fp: IField<T>;\n Fn: IField<bigint>;\n allowInfinityPoint: boolean;\n endo: EndomorphismOpts;\n isTorsionFree: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => boolean;\n clearCofactor: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => WeierstrassPoint<T>;\n fromBytes: (bytes: Uint8Array) => AffinePoint<T>;\n toBytes: (\n c: WeierstrassPointCons<T>,\n point: WeierstrassPoint<T>,\n isCompressed: boolean\n ) => Uint8Array;\n}>;\n\n/**\n * Options for ECDSA signatures over a Weierstrass curve.\n *\n * * lowS: (default: true) whether produced / verified signatures occupy low half of ecdsaOpts.p. Prevents malleability.\n * * hmac: (default: noble-hashes hmac) function, would be used to init hmac-drbg for k generation.\n * * randomBytes: (default: webcrypto os-level CSPRNG) custom method for fetching secure randomness.\n * * bits2int, bits2int_modN: used in sigs, sometimes overridden by curves\n */\nexport type ECDSAOpts = Partial<{\n lowS: boolean;\n hmac: HmacFnSync;\n randomBytes: (bytesLength?: number) => Uint8Array;\n bits2int: (bytes: Uint8Array) => bigint;\n bits2int_modN: (bytes: Uint8Array) => bigint;\n}>;\n\n/**\n * Elliptic Curve Diffie-Hellman interface.\n * Provides keygen, secret-to-public conversion, calculating shared secrets.\n */\nexport interface ECDH {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: PrivKey, isCompressed?: boolean) => Uint8Array;\n getSharedSecret: (secretKeyA: PrivKey, publicKeyB: Hex, isCompressed?: boolean) => Uint8Array;\n Point: WeierstrassPointCons<bigint>;\n utils: {\n isValidSecretKey: (secretKey: PrivKey) => boolean;\n isValidPublicKey: (publicKey: Uint8Array, isCompressed?: boolean) => boolean;\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n /** @deprecated use `randomSecretKey` */\n randomPrivateKey: (seed?: Uint8Array) => Uint8Array;\n /** @deprecated use `isValidSecretKey` */\n isValidPrivateKey: (secretKey: PrivKey) => boolean;\n /** @deprecated use `Point.Fn.fromBytes()` */\n normPrivateKeyToScalar: (key: PrivKey) => bigint;\n /** @deprecated use `point.precompute()` */\n precompute: (windowSize?: number, point?: WeierstrassPoint<bigint>) => WeierstrassPoint<bigint>;\n };\n lengths: CurveLengths;\n}\n\n/**\n * ECDSA interface.\n * Only supported for prime fields, not Fp2 (extension fields).\n */\nexport interface ECDSA extends ECDH {\n sign: (message: Hex, secretKey: PrivKey, opts?: ECDSASignOpts) => ECDSASigRecovered;\n verify: (\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n opts?: ECDSAVerifyOpts\n ) => boolean;\n recoverPublicKey(signature: Uint8Array, message: Uint8Array, opts?: ECDSARecoverOpts): Uint8Array;\n Signature: ECDSASignatureCons;\n}\nexport class DERErr extends Error {\n constructor(m = '') {\n super(m);\n }\n}\nexport type IDER = {\n // asn.1 DER encoding utils\n Err: typeof DERErr;\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string) => string;\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array };\n };\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string;\n decode(data: Uint8Array): bigint;\n };\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint };\n hexFromSig(sig: { r: bigint; s: bigint }): string;\n};\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n * [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nexport const DER: IDER = {\n // asn.1 DER encoding utils\n Err: DERErr,\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string): string => {\n const { Err: E } = DER;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length & 1) throw new E('tlv.encode: unpadded data');\n const dataLen = data.length / 2;\n const len = numberToHexUnpadded(dataLen);\n if ((len.length / 2) & 0b1000_0000) throw new E('tlv.encode: long form length too big');\n // length of length with long form flag\n const lenLen = dataLen > 127 ? numberToHexUnpadded((len.length / 2) | 0b1000_0000) : '';\n const t = numberToHexUnpadded(tag);\n return t + lenLen + len + data;\n },\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array } {\n const { Err: E } = DER;\n let pos = 0;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length < 2 || data[pos++] !== tag) throw new E('tlv.decode: wrong tlv');\n const first = data[pos++];\n const isLong = !!(first & 0b1000_0000); // First bit of first length byte is flag for short/long form\n let length = 0;\n if (!isLong) length = first;\n else {\n // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n const lenLen = first & 0b0111_1111;\n if (!lenLen) throw new E('tlv.decode(long): indefinite length not supported');\n if (lenLen > 4) throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n const lengthBytes = data.subarray(pos, pos + lenLen);\n if (lengthBytes.length !== lenLen) throw new E('tlv.decode: length bytes not complete');\n if (lengthBytes[0] === 0) throw new E('tlv.decode(long): zero leftmost byte');\n for (const b of lengthBytes) length = (length << 8) | b;\n pos += lenLen;\n if (length < 128) throw new E('tlv.decode(long): not minimal encoding');\n }\n const v = data.subarray(pos, pos + length);\n if (v.length !== length) throw new E('tlv.decode: wrong value length');\n return { v, l: data.subarray(pos + length) };\n },\n },\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string {\n const { Err: E } = DER;\n if (num < _0n) throw new E('integer: negative integers are not allowed');\n let hex = numberToHexUnpadded(num);\n // Pad with zero byte if negative flag is present\n if (Number.parseInt(hex[0], 16) & 0b1000) hex = '00' + hex;\n if (hex.length & 1) throw new E('unexpected DER parsing assertion: unpadded hex');\n return hex;\n },\n decode(data: Uint8Array): bigint {\n const { Err: E } = DER;\n if (data[0] & 0b1000_0000) throw new E('invalid signature integer: negative');\n if (data[0] === 0x00 && !(data[1] & 0b1000_0000))\n throw new E('invalid signature integer: unnecessary leading zero');\n return bytesToNumberBE(data);\n },\n },\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint } {\n // parse DER signature\n const { Err: E, _int: int, _tlv: tlv } = DER;\n const data = ensureBytes('signature', hex);\n const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n if (seqLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n if (sLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n return { r: int.decode(rBytes), s: int.decode(sBytes) };\n },\n hexFromSig(sig: { r: bigint; s: bigint }): string {\n const { _tlv: tlv, _int: int } = DER;\n const rs = tlv.encode(0x02, int.encode(sig.r));\n const ss = tlv.encode(0x02, int.encode(sig.s));\n const seq = rs + ss;\n return tlv.encode(0x30, seq);\n },\n};\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\n\nexport function _normFnElement(Fn: IField<bigint>, key: PrivKey): bigint {\n const { BYTES: expected } = Fn;\n let num: bigint;\n if (typeof key === 'bigint') {\n num = key;\n } else {\n let bytes = ensureBytes('private key', key);\n try {\n num = Fn.fromBytes(bytes);\n } catch (error) {\n throw new Error(`invalid private key: expected ui8a of size ${expected}, got ${typeof key}`);\n }\n }\n if (!Fn.isValidNot0(num)) throw new Error('invalid private key: out of range [1..N-1]');\n return num;\n}\n\n/**\n * Creates weierstrass Point constructor, based on specified curve options.\n *\n * @example\n```js\nconst opts = {\n p: BigInt('0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff'),\n n: BigInt('0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551'),\n h: BigInt(1),\n a: BigInt('0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc'),\n b: BigInt('0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b'),\n Gx: BigInt('0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296'),\n Gy: BigInt('0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5'),\n};\nconst p256_Point = weierstrass(opts);\n```\n */\nexport function weierstrassN<T>(\n params: WeierstrassOpts<T>,\n extraOpts: WeierstrassExtraOpts<T> = {}\n): WeierstrassPointCons<T> {\n const validated = _createCurveFields('weierstrass', params, extraOpts);\n const { Fp, Fn } = validated;\n let CURVE = validated.CURVE as WeierstrassOpts<T>;\n const { h: cofactor, n: CURVE_ORDER } = CURVE;\n _validateObject(\n extraOpts,\n {},\n {\n allowInfinityPoint: 'boolean',\n clearCofactor: 'function',\n isTorsionFree: 'function',\n fromBytes: 'function',\n toBytes: 'function',\n endo: 'object',\n wrapPrivateKey: 'boolean',\n }\n );\n\n const { endo } = extraOpts;\n if (endo) {\n // validateObject(endo, { beta: 'bigint', splitScalar: 'function' });\n if (!Fp.is0(CURVE.a) || typeof endo.beta !== 'bigint' || !Array.isArray(endo.basises)) {\n throw new Error('invalid endo: expected \"beta\": bigint and \"basises\": array');\n }\n }\n\n const lengths = getWLengths(Fp, Fn);\n\n function assertCompressionIsSupported() {\n if (!Fp.isOdd) throw new Error('compression is not supported: Field does not have .isOdd()');\n }\n\n // Implements IEEE P1363 point encoding\n function pointToBytes(\n _c: WeierstrassPointCons<T>,\n point: WeierstrassPoint<T>,\n isCompressed: boolean\n ): Uint8Array {\n const { x, y } = point.toAffine();\n const bx = Fp.toBytes(x);\n abool(isCompressed, 'isCompressed');\n if (isCompressed) {\n assertCompressionIsSupported();\n const hasEvenY = !Fp.isOdd!(y);\n return concatBytes(pprefix(hasEvenY), bx);\n } else {\n return concatBytes(Uint8Array.of(0x04), bx, Fp.toBytes(y));\n }\n }\n function pointFromBytes(bytes: Uint8Array) {\n abytes(bytes, undefined, 'Point');\n const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65\n const length = bytes.length;\n const head = bytes[0];\n const tail = bytes.subarray(1);\n // No actual validation is done here: use .assertValidity()\n if (length === comp && (head === 0x02 || head === 0x03)) {\n const x = Fp.fromBytes(tail);\n if (!Fp.isValid(x)) throw new Error('bad point: is not on curve, wrong x');\n const y2 = weierstrassEquation(x); // y² = x³ + ax + b\n let y: T;\n try {\n y = Fp.sqrt(y2); // y = y² ^ (p+1)/4\n } catch (sqrtError) {\n const err = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n throw new Error('bad point: is not on curve, sqrt error' + err);\n }\n assertCompressionIsSupported();\n const isYOdd = Fp.isOdd!(y); // (y & _1n) === _1n;\n const isHeadOdd = (head & 1) === 1; // ECDSA-specific\n if (isHeadOdd !== isYOdd) y = Fp.neg(y);\n return { x, y };\n } else if (length === uncomp && head === 0x04) {\n // TODO: more checks\n const L = Fp.BYTES;\n const x = Fp.fromBytes(tail.subarray(0, L));\n const y = Fp.fromBytes(tail.subarray(L, L * 2));\n if (!isValidXY(x, y)) throw new Error('bad point: is not on curve');\n return { x, y };\n } else {\n throw new Error(\n `bad point: got length ${length}, expected compressed=${comp} or uncompressed=${uncomp}`\n );\n }\n }\n\n const encodePoint = extraOpts.toBytes || pointToBytes;\n const decodePoint = extraOpts.fromBytes || pointFromBytes;\n function weierstrassEquation(x: T): T {\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x² * x\n return Fp.add(Fp.add(x3, Fp.mul(x, CURVE.a)), CURVE.b); // x³ + a * x + b\n }\n\n // TODO: move top-level\n /** Checks whether equation holds for given x, y: y² == x³ + ax + b */\n function isValidXY(x: T, y: T): boolean {\n const left = Fp.sqr(y); // y²\n const right = weierstrassEquation(x); // x³ + ax + b\n return Fp.eql(left, right);\n }\n\n // Validate whether the passed curve params are valid.\n // Test 1: equation y² = x³ + ax + b should work for generator point.\n if (!isValidXY(CURVE.Gx, CURVE.Gy)) throw new Error('bad curve params: generator point');\n\n // Test 2: discriminant Δ part should be non-zero: 4a³ + 27b² != 0.\n // Guarantees curve is genus-1, smooth (non-singular).\n const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n if (Fp.is0(Fp.add(_4a3, _27b2))) throw new Error('bad curve params: a or b');\n\n /** Asserts coordinate is valid: 0 <= n < Fp.ORDER. */\n function acoord(title: string, n: T, banZero = false) {\n if (!Fp.isValid(n) || (banZero && Fp.is0(n))) throw new Error(`bad point coordinate ${title}`);\n return n;\n }\n\n function aprjpoint(other: unknown) {\n if (!(other instanceof Point)) throw new Error('ProjectivePoint expected');\n }\n\n function splitEndoScalarN(k: bigint) {\n if (!endo || !endo.basises) throw new Error('no endo');\n return _splitEndoScalar(k, endo.basises, Fn.ORDER);\n }\n\n // Memoized toAffine / validity check. They are heavy. Points are immutable.\n\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n const toAffineMemo = memoized((p: Point, iz?: T): AffinePoint<T> => {\n const { X, Y, Z } = p;\n // Fast-path for normalized points\n if (Fp.eql(Z, Fp.ONE)) return { x: X, y: Y };\n const is0 = p.is0();\n // If invZ was 0, we return zero point. However we still want to execute\n // all operations, so we replace invZ with a random number, 1.\n if (iz == null) iz = is0 ? Fp.ONE : Fp.inv(Z);\n const x = Fp.mul(X, iz);\n const y = Fp.mul(Y, iz);\n const zz = Fp.mul(Z, iz);\n if (is0) return { x: Fp.ZERO, y: Fp.ZERO };\n if (!Fp.eql(zz, Fp.ONE)) throw new Error('invZ was invalid');\n return { x, y };\n });\n // NOTE: on exception this will crash 'cached' and no value will be set.\n // Otherwise true will be return\n const assertValidMemo = memoized((p: Point) => {\n if (p.is0()) {\n // (0, 1, 0) aka ZERO is invalid in most contexts.\n // In BLS, ZERO can be serialized, so we allow it.\n // (0, 0, 0) is invalid representation of ZERO.\n if (extraOpts.allowInfinityPoint && !Fp.is0(p.Y)) return;\n throw new Error('bad point: ZERO');\n }\n // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n const { x, y } = p.toAffine();\n if (!Fp.isValid(x) || !Fp.isValid(y)) throw new Error('bad point: x or y not field elements');\n if (!isValidXY(x, y)) throw new Error('bad point: equation left != right');\n if (!p.isTorsionFree()) throw new Error('bad point: not in prime-order subgroup');\n return true;\n });\n\n function finishEndo(\n endoBeta: EndomorphismOpts['beta'],\n k1p: Point,\n k2p: Point,\n k1neg: boolean,\n k2neg: boolean\n ) {\n k2p = new Point(Fp.mul(k2p.X, endoBeta), k2p.Y, k2p.Z);\n k1p = negateCt(k1neg, k1p);\n k2p = negateCt(k2neg, k2p);\n return k1p.add(k2p);\n }\n\n /**\n * Projective Point works in 3d / projective (homogeneous) coordinates:(X, Y, Z) ∋ (x=X/Z, y=Y/Z).\n * Default Point works in 2d / affine coordinates: (x, y).\n * We're doing calculations in projective, because its operations don't require costly inversion.\n */\n class Point implements WeierstrassPoint<T> {\n // base / generator point\n static readonly BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n // zero / infinity / identity point\n static readonly ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n // math field\n static readonly Fp = Fp;\n // scalar field\n static readonly Fn = Fn;\n\n readonly X: T;\n readonly Y: T;\n readonly Z: T;\n\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n constructor(X: T, Y: T, Z: T) {\n this.X = acoord('x', X);\n this.Y = acoord('y', Y, true);\n this.Z = acoord('z', Z);\n Object.freeze(this);\n }\n\n static CURVE(): WeierstrassOpts<T> {\n return CURVE;\n }\n\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n static fromAffine(p: AffinePoint<T>): Point {\n const { x, y } = p || {};\n if (!p || !Fp.isValid(x) || !Fp.isValid(y)) throw new Error('invalid affine point');\n if (p instanceof Point) throw new Error('projective point not allowed');\n // (0, 0) would've produced (0, 0, 1) - instead, we need (0, 1, 0)\n if (Fp.is0(x) && Fp.is0(y)) return Point.ZERO;\n return new Point(x, y, Fp.ONE);\n }\n\n static fromBytes(bytes: Uint8Array): Point {\n const P = Point.fromAffine(decodePoint(abytes(bytes, undefined, 'point')));\n P.assertValidity();\n return P;\n }\n static fromHex(hex: Hex): Point {\n return Point.fromBytes(ensureBytes('pointHex', hex));\n }\n\n get x(): T {\n return this.toAffine().x;\n }\n get y(): T {\n return this.toAffine().y;\n }\n\n /**\n *\n * @param windowSize\n * @param isLazy true will defer table computation until the first multiplication\n * @returns\n */\n precompute(windowSize: number = 8, isLazy = true): Point {\n wnaf.createCache(this, windowSize);\n if (!isLazy) this.multiply(_3n); // random number\n return this;\n }\n\n // TODO: return `this`\n /** A point on curve is valid if it conforms to equation. */\n assertValidity(): void {\n assertValidMemo(this);\n }\n\n hasEvenY(): boolean {\n const { y } = this.toAffine();\n if (!Fp.isOdd) throw new Error(\"Field doesn't support isOdd\");\n return !Fp.isOdd(y);\n }\n\n /** Compare one point to another. */\n equals(other: Point): boolean {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n return U1 && U2;\n }\n\n /** Flips point to one corresponding to (x, -y) in Affine coordinates. */\n negate(): Point {\n return new Point(this.X, Fp.neg(this.Y), this.Z);\n }\n\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a, b } = CURVE;\n const b3 = Fp.mul(b, _3n);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n let t0 = Fp.mul(X1, X1); // step 1\n let t1 = Fp.mul(Y1, Y1);\n let t2 = Fp.mul(Z1, Z1);\n let t3 = Fp.mul(X1, Y1);\n t3 = Fp.add(t3, t3); // step 5\n Z3 = Fp.mul(X1, Z1);\n Z3 = Fp.add(Z3, Z3);\n X3 = Fp.mul(a, Z3);\n Y3 = Fp.mul(b3, t2);\n Y3 = Fp.add(X3, Y3); // step 10\n X3 = Fp.sub(t1, Y3);\n Y3 = Fp.add(t1, Y3);\n Y3 = Fp.mul(X3, Y3);\n X3 = Fp.mul(t3, X3);\n Z3 = Fp.mul(b3, Z3); // step 15\n t2 = Fp.mul(a, t2);\n t3 = Fp.sub(t0, t2);\n t3 = Fp.mul(a, t3);\n t3 = Fp.add(t3, Z3);\n Z3 = Fp.add(t0, t0); // step 20\n t0 = Fp.add(Z3, t0);\n t0 = Fp.add(t0, t2);\n t0 = Fp.mul(t0, t3);\n Y3 = Fp.add(Y3, t0);\n t2 = Fp.mul(Y1, Z1); // step 25\n t2 = Fp.add(t2, t2);\n t0 = Fp.mul(t2, t3);\n X3 = Fp.sub(X3, t0);\n Z3 = Fp.mul(t2, t1);\n Z3 = Fp.add(Z3, Z3); // step 30\n Z3 = Fp.add(Z3, Z3);\n return new Point(X3, Y3, Z3);\n }\n\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(other: Point): Point {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n const a = CURVE.a;\n const b3 = Fp.mul(CURVE.b, _3n);\n let t0 = Fp.mul(X1, X2); // step 1\n let t1 = Fp.mul(Y1, Y2);\n let t2 = Fp.mul(Z1, Z2);\n let t3 = Fp.add(X1, Y1);\n let t4 = Fp.add(X2, Y2); // step 5\n t3 = Fp.mul(t3, t4);\n t4 = Fp.add(t0, t1);\n t3 = Fp.sub(t3, t4);\n t4 = Fp.add(X1, Z1);\n let t5 = Fp.add(X2, Z2); // step 10\n t4 = Fp.mul(t4, t5);\n t5 = Fp.add(t0, t2);\n t4 = Fp.sub(t4, t5);\n t5 = Fp.add(Y1, Z1);\n X3 = Fp.add(Y2, Z2); // step 15\n t5 = Fp.mul(t5, X3);\n X3 = Fp.add(t1, t2);\n t5 = Fp.sub(t5, X3);\n Z3 = Fp.mul(a, t4);\n X3 = Fp.mul(b3, t2); // step 20\n Z3 = Fp.add(X3, Z3);\n X3 = Fp.sub(t1, Z3);\n Z3 = Fp.add(t1, Z3);\n Y3 = Fp.mul(X3, Z3);\n t1 = Fp.add(t0, t0); // step 25\n t1 = Fp.add(t1, t0);\n t2 = Fp.mul(a, t2);\n t4 = Fp.mul(b3, t4);\n t1 = Fp.add(t1, t2);\n t2 = Fp.sub(t0, t2); // step 30\n t2 = Fp.mul(a, t2);\n t4 = Fp.add(t4, t2);\n t0 = Fp.mul(t1, t4);\n Y3 = Fp.add(Y3, t0);\n t0 = Fp.mul(t5, t4); // step 35\n X3 = Fp.mul(t3, X3);\n X3 = Fp.sub(X3, t0);\n t0 = Fp.mul(t3, t1);\n Z3 = Fp.mul(t5, Z3);\n Z3 = Fp.add(Z3, t0); // step 40\n return new Point(X3, Y3, Z3);\n }\n\n subtract(other: Point) {\n return this.add(other.negate());\n }\n\n is0(): boolean {\n return this.equals(Point.ZERO);\n }\n\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(scalar: bigint): Point {\n const { endo } = extraOpts;\n if (!Fn.isValidNot0(scalar)) throw new Error('invalid scalar: out of range'); // 0 is invalid\n let point: Point, fake: Point; // Fake point is used to const-time mult\n const mul = (n: bigint) => wnaf.cached(this, n, (p) => normalizeZ(Point, p));\n /** See docs for {@link EndomorphismOpts} */\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(scalar);\n const { p: k1p, f: k1f } = mul(k1);\n const { p: k2p, f: k2f } = mul(k2);\n fake = k1f.add(k2f);\n point = finishEndo(endo.beta, k1p, k2p, k1neg, k2neg);\n } else {\n const { p, f } = mul(scalar);\n point = p;\n fake = f;\n }\n // Normalize `z` for both points, but return only real one\n return normalizeZ(Point, [point, fake])[0];\n }\n\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed secret key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(sc: bigint): Point {\n const { endo } = extraOpts;\n const p = this as Point;\n if (!Fn.isValid(sc)) throw new Error('invalid scalar: out of range'); // 0 is valid\n if (sc === _0n || p.is0()) return Point.ZERO;\n if (sc === _1n) return p; // fast-path\n if (wnaf.hasCache(this)) return this.multiply(sc);\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(sc);\n const { p1, p2 } = mulEndoUnsafe(Point, p, k1, k2); // 30% faster vs wnaf.unsafe\n return finishEndo(endo.beta, p1, p2, k1neg, k2neg);\n } else {\n return wnaf.unsafe(p, sc);\n }\n }\n\n multiplyAndAddUnsafe(Q: Point, a: bigint, b: bigint): Point | undefined {\n const sum = this.multiplyUnsafe(a).add(Q.multiplyUnsafe(b));\n return sum.is0() ? undefined : sum;\n }\n\n /**\n * Converts Projective point to affine (x, y) coordinates.\n * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch\n */\n toAffine(invertedZ?: T): AffinePoint<T> {\n return toAffineMemo(this, invertedZ);\n }\n\n /**\n * Checks whether Point is free of torsion elements (is in prime subgroup).\n * Always torsion-free for cofactor=1 curves.\n */\n isTorsionFree(): boolean {\n const { isTorsionFree } = extraOpts;\n if (cofactor === _1n) return true;\n if (isTorsionFree) return isTorsionFree(Point, this);\n return wnaf.unsafe(this, CURVE_ORDER).is0();\n }\n\n clearCofactor(): Point {\n const { clearCofactor } = extraOpts;\n if (cofactor === _1n) return this; // Fast-path\n if (clearCofactor) return clearCofactor(Point, this) as Point;\n return this.multiplyUnsafe(cofactor);\n }\n\n isSmallOrder(): boolean {\n // can we use this.clearCofactor()?\n return this.multiplyUnsafe(cofactor).is0();\n }\n\n toBytes(isCompressed = true): Uint8Array {\n abool(isCompressed, 'isCompressed');\n this.assertValidity();\n return encodePoint(Point, this, isCompressed);\n }\n\n toHex(isCompressed = true): string {\n return bytesToHex(this.toBytes(isCompressed));\n }\n\n toString() {\n return `<Point ${this.is0() ? 'ZERO' : this.toHex()}>`;\n }\n\n // TODO: remove\n get px(): T {\n return this.X;\n }\n get py(): T {\n return this.X;\n }\n get pz(): T {\n return this.Z;\n }\n toRawBytes(isCompressed = true): Uint8Array {\n return this.toBytes(isCompressed);\n }\n _setWindowSize(windowSize: number) {\n this.precompute(windowSize);\n }\n static normalizeZ(points: Point[]): Point[] {\n return normalizeZ(Point, points);\n }\n static msm(points: Point[], scalars: bigint[]): Point {\n return pippenger(Point, Fn, points, scalars);\n }\n static fromPrivateKey(privateKey: PrivKey) {\n return Point.BASE.multiply(_normFnElement(Fn, privateKey));\n }\n }\n const bits = Fn.BITS;\n const wnaf = new wNAF(Point, extraOpts.endo ? Math.ceil(bits / 2) : bits);\n Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n return Point;\n}\n\n/** Methods of ECDSA signature instance. */\nexport interface ECDSASignature {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n addRecoveryBit(recovery: number): ECDSASigRecovered;\n hasHighS(): boolean;\n toBytes(format?: string): Uint8Array;\n toHex(format?: string): string;\n\n /** @deprecated */\n assertValidity(): void;\n /** @deprecated */\n normalizeS(): ECDSASignature;\n /** @deprecated use standalone method `curve.recoverPublicKey(sig.toBytes('recovered'), msg)` */\n recoverPublicKey(msgHash: Hex): WeierstrassPoint<bigint>;\n /** @deprecated use `.toBytes('compact')` */\n toCompactRawBytes(): Uint8Array;\n /** @deprecated use `.toBytes('compact')` */\n toCompactHex(): string;\n /** @deprecated use `.toBytes('der')` */\n toDERRawBytes(): Uint8Array;\n /** @deprecated use `.toBytes('der')` */\n toDERHex(): string;\n}\nexport type ECDSASigRecovered = ECDSASignature & {\n readonly recovery: number;\n};\n/** Methods of ECDSA signature constructor. */\nexport type ECDSASignatureCons = {\n new (r: bigint, s: bigint, recovery?: number): ECDSASignature;\n fromBytes(bytes: Uint8Array, format?: ECDSASigFormat): ECDSASignature;\n fromHex(hex: string, format?: ECDSASigFormat): ECDSASignature;\n\n /** @deprecated use `.fromBytes(bytes, 'compact')` */\n fromCompact(hex: Hex): ECDSASignature;\n /** @deprecated use `.fromBytes(bytes, 'der')` */\n fromDER(hex: Hex): ECDSASignature;\n};\n\n// Points start with byte 0x02 when y is even; otherwise 0x03\nfunction pprefix(hasEvenY: boolean): Uint8Array {\n return Uint8Array.of(hasEvenY ? 0x02 : 0x03);\n}\n\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nexport function SWUFpSqrtRatio<T>(\n Fp: IField<T>,\n Z: T\n): (u: T, v: T) => { isValid: boolean; value: T } {\n // Generic implementation\n const q = Fp.ORDER;\n let l = _0n;\n for (let o = q - _1n; o % _2n === _0n; o /= _2n) l += _1n;\n const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n // 2n ** c1 == 2n << (c1-1)\n const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic\n const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic\n const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic\n const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic\n const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n let sqrtRatio = (u: T, v: T): { isValid: boolean; value: T } => {\n let tv1 = c6; // 1. tv1 = c6\n let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n // 17. for i in (c1, c1 - 1, ..., 2):\n for (let i = c1; i > _1n; i--) {\n let tv5 = i - _2n; // 18. tv5 = i - 2\n tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5\n let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5\n const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1\n tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1\n tv1 = Fp.mul(tv1, tv1); // 23. tv1 = tv1 * tv1\n tvv5 = Fp.mul(tv4, tv1); // 24. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, e1); // 25. tv3 = CMOV(tv2, tv3, e1)\n tv4 = Fp.cmov(tvv5, tv4, e1); // 26. tv4 = CMOV(tv5, tv4, e1)\n }\n return { isValid: isQR, value: tv3 };\n };\n if (Fp.ORDER % _4n === _3n) {\n // sqrt_ratio_3mod4(u, v)\n const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4 # Integer arithmetic\n const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n sqrtRatio = (u: T, v: T) => {\n let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n };\n }\n // No curves uses that\n // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nexport function mapToCurveSimpleSWU<T>(\n Fp: IField<T>,\n opts: {\n A: T;\n B: T;\n Z: T;\n }\n): (u: T) => { x: T; y: T } {\n validateField(Fp);\n const { A, B, Z } = opts;\n if (!Fp.isValid(A) || !Fp.isValid(B) || !Fp.isValid(Z))\n throw new Error('mapToCurveSimpleSWU: invalid opts');\n const sqrtRatio = SWUFpSqrtRatio(Fp, Z);\n if (!Fp.isOdd) throw new Error('Field does not have .isOdd()');\n // Input: u, an element of F.\n // Output: (x, y), a point on E.\n return (u: T): { x: T; y: T } => {\n // prettier-ignore\n let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, Z); // 2. tv1 = Z * tv1\n tv2 = Fp.sqr(tv1); // 3. tv2 = tv1^2\n tv2 = Fp.add(tv2, tv1); // 4. tv2 = tv2 + tv1\n tv3 = Fp.add(tv2, Fp.ONE); // 5. tv3 = tv2 + 1\n tv3 = Fp.mul(tv3, B); // 6. tv3 = B * tv3\n tv4 = Fp.cmov(Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7. tv4 = CMOV(Z, -tv2, tv2 != 0)\n tv4 = Fp.mul(tv4, A); // 8. tv4 = A * tv4\n tv2 = Fp.sqr(tv3); // 9. tv2 = tv3^2\n tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n tv5 = Fp.mul(tv6, A); // 11. tv5 = A * tv6\n tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n tv5 = Fp.mul(tv6, B); // 15. tv5 = B * tv6\n tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n x = Fp.mul(tv1, tv3); // 17. x = tv1 * tv3\n const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n y = Fp.mul(tv1, u); // 19. y = tv1 * u -> Z * u^3 * y1\n y = Fp.mul(y, value); // 20. y = y * y1\n x = Fp.cmov(x, tv3, isValid); // 21. x = CMOV(x, tv3, is_gx1_square)\n y = Fp.cmov(y, value, isValid); // 22. y = CMOV(y, y1, is_gx1_square)\n const e1 = Fp.isOdd!(u) === Fp.isOdd!(y); // 23. e1 = sgn0(u) == sgn0(y)\n y = Fp.cmov(Fp.neg(y), y, e1); // 24. y = CMOV(-y, y, e1)\n const tv4_inv = FpInvertBatch(Fp, [tv4], true)[0];\n x = Fp.mul(x, tv4_inv); // 25. x = x / tv4\n return { x, y };\n };\n}\n\nfunction getWLengths<T>(Fp: IField<T>, Fn: IField<bigint>) {\n return {\n secretKey: Fn.BYTES,\n publicKey: 1 + Fp.BYTES,\n publicKeyUncompressed: 1 + 2 * Fp.BYTES,\n publicKeyHasPrefix: true,\n signature: 2 * Fn.BYTES,\n };\n}\n\n/**\n * Sometimes users only need getPublicKey, getSharedSecret, and secret key handling.\n * This helper ensures no signature functionality is present. Less code, smaller bundle size.\n */\nexport function ecdh(\n Point: WeierstrassPointCons<bigint>,\n ecdhOpts: { randomBytes?: (bytesLength?: number) => Uint8Array } = {}\n): ECDH {\n const { Fn } = Point;\n const randomBytes_ = ecdhOpts.randomBytes || randomBytesWeb;\n const lengths = Object.assign(getWLengths(Point.Fp, Fn), { seed: getMinHashLength(Fn.ORDER) });\n\n function isValidSecretKey(secretKey: PrivKey) {\n try {\n return !!_normFnElement(Fn, secretKey);\n } catch (error) {\n return false;\n }\n }\n\n function isValidPublicKey(publicKey: Uint8Array, isCompressed?: boolean): boolean {\n const { publicKey: comp, publicKeyUncompressed } = lengths;\n try {\n const l = publicKey.length;\n if (isCompressed === true && l !== comp) return false;\n if (isCompressed === false && l !== publicKeyUncompressed) return false;\n return !!Point.fromBytes(publicKey);\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Produces cryptographically secure secret key from random of size\n * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n */\n function randomSecretKey(seed = randomBytes_(lengths.seed)): Uint8Array {\n return mapHashToField(abytes(seed, lengths.seed, 'seed'), Fn.ORDER);\n }\n\n /**\n * Computes public key for a secret key. Checks for validity of the secret key.\n * @param isCompressed whether to return compact (default), or full key\n * @returns Public key, full when isCompressed=false; short when isCompressed=true\n */\n function getPublicKey(secretKey: PrivKey, isCompressed = true): Uint8Array {\n return Point.BASE.multiply(_normFnElement(Fn, secretKey)).toBytes(isCompressed);\n }\n\n function keygen(seed?: Uint8Array) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: getPublicKey(secretKey) };\n }\n\n /**\n * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n */\n function isProbPub(item: PrivKey | PubKey): boolean | undefined {\n if (typeof item === 'bigint') return false;\n if (item instanceof Point) return true;\n const { secretKey, publicKey, publicKeyUncompressed } = lengths;\n if (Fn.allowedLengths || secretKey === publicKey) return undefined;\n const l = ensureBytes('key', item).length;\n return l === publicKey || l === publicKeyUncompressed;\n }\n\n /**\n * ECDH (Elliptic Curve Diffie Hellman).\n * Computes shared public key from secret key A and public key B.\n * Checks: 1) secret key validity 2) shared key is on-curve.\n * Does NOT hash the result.\n * @param isCompressed whether to return compact (default), or full key\n * @returns shared public key\n */\n function getSharedSecret(secretKeyA: PrivKey, publicKeyB: Hex, isCompressed = true): Uint8Array {\n if (isProbPub(secretKeyA) === true) throw new Error('first arg must be private key');\n if (isProbPub(publicKeyB) === false) throw new Error('second arg must be public key');\n const s = _normFnElement(Fn, secretKeyA);\n const b = Point.fromHex(publicKeyB); // checks for being on-curve\n return b.multiply(s).toBytes(isCompressed);\n }\n\n const utils = {\n isValidSecretKey,\n isValidPublicKey,\n randomSecretKey,\n\n // TODO: remove\n isValidPrivateKey: isValidSecretKey,\n randomPrivateKey: randomSecretKey,\n normPrivateKeyToScalar: (key: PrivKey) => _normFnElement(Fn, key),\n precompute(windowSize = 8, point = Point.BASE): WeierstrassPoint<bigint> {\n return point.precompute(windowSize, false);\n },\n };\n\n return Object.freeze({ getPublicKey, getSharedSecret, keygen, Point, utils, lengths });\n}\n\n/**\n * Creates ECDSA signing interface for given elliptic curve `Point` and `hash` function.\n * We need `hash` for 2 features:\n * 1. Message prehash-ing. NOT used if `sign` / `verify` are called with `prehash: false`\n * 2. k generation in `sign`, using HMAC-drbg(hash)\n *\n * ECDSAOpts are only rarely needed.\n *\n * @example\n * ```js\n * const p256_Point = weierstrass(...);\n * const p256_sha256 = ecdsa(p256_Point, sha256);\n * const p256_sha224 = ecdsa(p256_Point, sha224);\n * const p256_sha224_r = ecdsa(p256_Point, sha224, { randomBytes: (length) => { ... } });\n * ```\n */\nexport function ecdsa(\n Point: WeierstrassPointCons<bigint>,\n hash: CHash,\n ecdsaOpts: ECDSAOpts = {}\n): ECDSA {\n ahash(hash);\n _validateObject(\n ecdsaOpts,\n {},\n {\n hmac: 'function',\n lowS: 'boolean',\n randomBytes: 'function',\n bits2int: 'function',\n bits2int_modN: 'function',\n }\n );\n\n const randomBytes = ecdsaOpts.randomBytes || randomBytesWeb;\n const hmac: HmacFnSync =\n ecdsaOpts.hmac ||\n (((key, ...msgs) => nobleHmac(hash, key, concatBytes(...msgs))) satisfies HmacFnSync);\n\n const { Fp, Fn } = Point;\n const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn;\n const { keygen, getPublicKey, getSharedSecret, utils, lengths } = ecdh(Point, ecdsaOpts);\n const defaultSigOpts: Required<ECDSASignOpts> = {\n prehash: false,\n lowS: typeof ecdsaOpts.lowS === 'boolean' ? ecdsaOpts.lowS : false,\n format: undefined as any, //'compact' as ECDSASigFormat,\n extraEntropy: false,\n };\n const defaultSigOpts_format = 'compact';\n\n function isBiggerThanHalfOrder(number: bigint) {\n const HALF = CURVE_ORDER >> _1n;\n return number > HALF;\n }\n function validateRS(title: string, num: bigint): bigint {\n if (!Fn.isValidNot0(num))\n throw new Error(`invalid signature ${title}: out of range 1..Point.Fn.ORDER`);\n return num;\n }\n function validateSigLength(bytes: Uint8Array, format: ECDSASigFormat) {\n validateSigFormat(format);\n const size = lengths.signature!;\n const sizer = format === 'compact' ? size : format === 'recovered' ? size + 1 : undefined;\n return abytes(bytes, sizer, `${format} signature`);\n }\n\n /**\n * ECDSA signature with its (r, s) properties. Supports compact, recovered & DER representations.\n */\n class Signature implements ECDSASignature {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n constructor(r: bigint, s: bigint, recovery?: number) {\n this.r = validateRS('r', r); // r in [1..N-1];\n this.s = validateRS('s', s); // s in [1..N-1];\n if (recovery != null) this.recovery = recovery;\n Object.freeze(this);\n }\n\n static fromBytes(bytes: Uint8Array, format: ECDSASigFormat = defaultSigOpts_format): Signature {\n validateSigLength(bytes, format);\n let recid: number | undefined;\n if (format === 'der') {\n const { r, s } = DER.toSig(abytes(bytes));\n return new Signature(r, s);\n }\n if (format === 'recovered') {\n recid = bytes[0];\n format = 'compact';\n bytes = bytes.subarray(1);\n }\n const L = Fn.BYTES;\n const r = bytes.subarray(0, L);\n const s = bytes.subarray(L, L * 2);\n return new Signature(Fn.fromBytes(r), Fn.fromBytes(s), recid);\n }\n\n static fromHex(hex: string, format?: ECDSASigFormat) {\n return this.fromBytes(hexToBytes(hex), format);\n }\n\n addRecoveryBit(recovery: number): RecoveredSignature {\n return new Signature(this.r, this.s, recovery) as RecoveredSignature;\n }\n\n recoverPublicKey(messageHash: Hex): WeierstrassPoint<bigint> {\n const FIELD_ORDER = Fp.ORDER;\n const { r, s, recovery: rec } = this;\n if (rec == null || ![0, 1, 2, 3].includes(rec)) throw new Error('recovery id invalid');\n\n // ECDSA recovery is hard for cofactor > 1 curves.\n // In sign, `r = q.x mod n`, and here we recover q.x from r.\n // While recovering q.x >= n, we need to add r+n for cofactor=1 curves.\n // However, for cofactor>1, r+n may not get q.x:\n // r+n*i would need to be done instead where i is unknown.\n // To easily get i, we either need to:\n // a. increase amount of valid recid values (4, 5...); OR\n // b. prohibit non-prime-order signatures (recid > 1).\n const hasCofactor = CURVE_ORDER * _2n < FIELD_ORDER;\n if (hasCofactor && rec > 1) throw new Error('recovery id is ambiguous for h>1 curve');\n\n const radj = rec === 2 || rec === 3 ? r + CURVE_ORDER : r;\n if (!Fp.isValid(radj)) throw new Error('recovery id 2 or 3 invalid');\n const x = Fp.toBytes(radj);\n const R = Point.fromBytes(concatBytes(pprefix((rec & 1) === 0), x));\n const ir = Fn.inv(radj); // r^-1\n const h = bits2int_modN(ensureBytes('msgHash', messageHash)); // Truncate hash\n const u1 = Fn.create(-h * ir); // -hr^-1\n const u2 = Fn.create(s * ir); // sr^-1\n // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1). unsafe is fine: there is no private data.\n const Q = Point.BASE.multiplyUnsafe(u1).add(R.multiplyUnsafe(u2));\n if (Q.is0()) throw new Error('point at infinify');\n Q.assertValidity();\n return Q;\n }\n\n // Signatures should be low-s, to prevent malleability.\n hasHighS(): boolean {\n return isBiggerThanHalfOrder(this.s);\n }\n\n toBytes(format: ECDSASigFormat = defaultSigOpts_format) {\n validateSigFormat(format);\n if (format === 'der') return hexToBytes(DER.hexFromSig(this));\n const r = Fn.toBytes(this.r);\n const s = Fn.toBytes(this.s);\n if (format === 'recovered') {\n if (this.recovery == null) throw new Error('recovery bit must be present');\n return concatBytes(Uint8Array.of(this.recovery), r, s);\n }\n return concatBytes(r, s);\n }\n\n toHex(format?: ECDSASigFormat) {\n return bytesToHex(this.toBytes(format));\n }\n\n // TODO: remove\n assertValidity(): void {}\n static fromCompact(hex: Hex) {\n return Signature.fromBytes(ensureBytes('sig', hex), 'compact');\n }\n static fromDER(hex: Hex) {\n return Signature.fromBytes(ensureBytes('sig', hex), 'der');\n }\n normalizeS() {\n return this.hasHighS() ? new Signature(this.r, Fn.neg(this.s), this.recovery) : this;\n }\n toDERRawBytes() {\n return this.toBytes('der');\n }\n toDERHex() {\n return bytesToHex(this.toBytes('der'));\n }\n toCompactRawBytes() {\n return this.toBytes('compact');\n }\n toCompactHex() {\n return bytesToHex(this.toBytes('compact'));\n }\n }\n type RecoveredSignature = Signature & { recovery: number };\n\n // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n const bits2int =\n ecdsaOpts.bits2int ||\n function bits2int_def(bytes: Uint8Array): bigint {\n // Our custom check \"just in case\", for protection against DoS\n if (bytes.length > 8192) throw new Error('input is too large');\n // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n // for some cases, since bytes.length * 8 is not actual bitLength.\n const num = bytesToNumberBE(bytes); // check for == u8 done here\n const delta = bytes.length * 8 - fnBits; // truncate to nBitLength leftmost bits\n return delta > 0 ? num >> BigInt(delta) : num;\n };\n const bits2int_modN =\n ecdsaOpts.bits2int_modN ||\n function bits2int_modN_def(bytes: Uint8Array): bigint {\n return Fn.create(bits2int(bytes)); // can't use bytesToNumberBE here\n };\n // Pads output with zero as per spec\n const ORDER_MASK = bitMask(fnBits);\n /** Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`. */\n function int2octets(num: bigint): Uint8Array {\n // IMPORTANT: the check ensures working for case `Fn.BYTES != Fn.BITS * 8`\n aInRange('num < 2^' + fnBits, num, _0n, ORDER_MASK);\n return Fn.toBytes(num);\n }\n\n function validateMsgAndHash(message: Uint8Array, prehash: boolean) {\n abytes(message, undefined, 'message');\n return prehash ? abytes(hash(message), undefined, 'prehashed message') : message;\n }\n\n /**\n * Steps A, D of RFC6979 3.2.\n * Creates RFC6979 seed; converts msg/privKey to numbers.\n * Used only in sign, not in verify.\n *\n * Warning: we cannot assume here that message has same amount of bytes as curve order,\n * this will be invalid at least for P521. Also it can be bigger for P224 + SHA256.\n */\n function prepSig(message: Uint8Array, privateKey: PrivKey, opts: ECDSASignOpts) {\n if (['recovered', 'canonical'].some((k) => k in opts))\n throw new Error('sign() legacy options not supported');\n const { lowS, prehash, extraEntropy } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash); // RFC6979 3.2 A: h1 = H(m)\n // We can't later call bits2octets, since nested bits2int is broken for curves\n // with fnBits % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n const h1int = bits2int_modN(message);\n const d = _normFnElement(Fn, privateKey); // validate secret key, convert to bigint\n const seedArgs = [int2octets(d), int2octets(h1int)];\n // extraEntropy. RFC6979 3.6: additional k' (optional).\n if (extraEntropy != null && extraEntropy !== false) {\n // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n // gen random bytes OR pass as-is\n const e = extraEntropy === true ? randomBytes(lengths.secretKey) : extraEntropy;\n seedArgs.push(ensureBytes('extraEntropy', e)); // check for being bytes\n }\n const seed = concatBytes(...seedArgs); // Step D of RFC6979 3.2\n const m = h1int; // NOTE: no need to call bits2int second time here, it is inside truncateHash!\n // Converts signature params into point w r/s, checks result for validity.\n // To transform k => Signature:\n // q = k⋅G\n // r = q.x mod n\n // s = k^-1(m + rd) mod n\n // Can use scalar blinding b^-1(bm + bdr) where b ∈ [1,q−1] according to\n // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n function k2sig(kBytes: Uint8Array): RecoveredSignature | undefined {\n // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n // Important: all mod() calls here must be done over N\n const k = bits2int(kBytes); // mod n, not mod p\n if (!Fn.isValidNot0(k)) return; // Valid scalars (including k) must be in 1..N-1\n const ik = Fn.inv(k); // k^-1 mod n\n const q = Point.BASE.multiply(k).toAffine(); // q = k⋅G\n const r = Fn.create(q.x); // r = q.x mod n\n if (r === _0n) return;\n const s = Fn.create(ik * Fn.create(m + r * d)); // Not using blinding here, see comment above\n if (s === _0n) return;\n let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3, when q.x > n)\n let normS = s;\n if (lowS && isBiggerThanHalfOrder(s)) {\n normS = Fn.neg(s); // if lowS was passed, ensure s is always\n recovery ^= 1; // // in the bottom half of N\n }\n return new Signature(r, normS, recovery) as RecoveredSignature; // use normS, not s\n }\n return { seed, k2sig };\n }\n\n /**\n * Signs message hash with a secret key.\n *\n * ```\n * sign(m, d) where\n * k = rfc6979_hmac_drbg(m, d)\n * (x, y) = G × k\n * r = x mod n\n * s = (m + dr) / k mod n\n * ```\n */\n function sign(message: Hex, secretKey: PrivKey, opts: ECDSASignOpts = {}): RecoveredSignature {\n message = ensureBytes('message', message);\n const { seed, k2sig } = prepSig(message, secretKey, opts); // Steps A, D of RFC6979 3.2.\n const drbg = createHmacDrbg<RecoveredSignature>(hash.outputLen, Fn.BYTES, hmac);\n const sig = drbg(seed, k2sig); // Steps B, C, D, E, F, G\n return sig;\n }\n\n function tryParsingSig(sg: Hex | SignatureLike) {\n // Try to deduce format\n let sig: Signature | undefined = undefined;\n const isHex = typeof sg === 'string' || isBytes(sg);\n const isObj =\n !isHex &&\n sg !== null &&\n typeof sg === 'object' &&\n typeof sg.r === 'bigint' &&\n typeof sg.s === 'bigint';\n if (!isHex && !isObj)\n throw new Error('invalid signature, expected Uint8Array, hex string or Signature instance');\n if (isObj) {\n sig = new Signature(sg.r, sg.s);\n } else if (isHex) {\n try {\n sig = Signature.fromBytes(ensureBytes('sig', sg), 'der');\n } catch (derError) {\n if (!(derError instanceof DER.Err)) throw derError;\n }\n if (!sig) {\n try {\n sig = Signature.fromBytes(ensureBytes('sig', sg), 'compact');\n } catch (error) {\n return false;\n }\n }\n }\n if (!sig) return false;\n return sig;\n }\n\n /**\n * Verifies a signature against message and public key.\n * Rejects lowS signatures by default: see {@link ECDSAVerifyOpts}.\n * Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n *\n * ```\n * verify(r, s, h, P) where\n * u1 = hs^-1 mod n\n * u2 = rs^-1 mod n\n * R = u1⋅G + u2⋅P\n * mod(R.x, n) == r\n * ```\n */\n function verify(\n signature: Hex | SignatureLike,\n message: Hex,\n publicKey: Hex,\n opts: ECDSAVerifyOpts = {}\n ): boolean {\n const { lowS, prehash, format } = validateSigOpts(opts, defaultSigOpts);\n publicKey = ensureBytes('publicKey', publicKey);\n message = validateMsgAndHash(ensureBytes('message', message), prehash);\n if ('strict' in opts) throw new Error('options.strict was renamed to lowS');\n const sig =\n format === undefined\n ? tryParsingSig(signature)\n : Signature.fromBytes(ensureBytes('sig', signature as Hex), format);\n if (sig === false) return false;\n try {\n const P = Point.fromBytes(publicKey);\n if (lowS && sig.hasHighS()) return false;\n const { r, s } = sig;\n const h = bits2int_modN(message); // mod n, not mod p\n const is = Fn.inv(s); // s^-1 mod n\n const u1 = Fn.create(h * is); // u1 = hs^-1 mod n\n const u2 = Fn.create(r * is); // u2 = rs^-1 mod n\n const R = Point.BASE.multiplyUnsafe(u1).add(P.multiplyUnsafe(u2)); // u1⋅G + u2⋅P\n if (R.is0()) return false;\n const v = Fn.create(R.x); // v = r.x mod n\n return v === r;\n } catch (e) {\n return false;\n }\n }\n\n function recoverPublicKey(\n signature: Uint8Array,\n message: Uint8Array,\n opts: ECDSARecoverOpts = {}\n ): Uint8Array {\n const { prehash } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash);\n return Signature.fromBytes(signature, 'recovered').recoverPublicKey(message).toBytes();\n }\n\n return Object.freeze({\n keygen,\n getPublicKey,\n getSharedSecret,\n utils,\n lengths,\n Point,\n sign,\n verify,\n recoverPublicKey,\n Signature,\n hash,\n });\n}\n\n// TODO: remove everything below\n/** @deprecated use ECDSASignature */\nexport type SignatureType = ECDSASignature;\n/** @deprecated use ECDSASigRecovered */\nexport type RecoveredSignatureType = ECDSASigRecovered;\n/** @deprecated switch to Uint8Array signatures in format 'compact' */\nexport type SignatureLike = { r: bigint; s: bigint };\nexport type ECDSAExtraEntropy = Hex | boolean;\n/** @deprecated use `ECDSAExtraEntropy` */\nexport type Entropy = Hex | boolean;\nexport type BasicWCurve<T> = BasicCurve<T> & {\n // Params: a, b\n a: T;\n b: T;\n\n // Optional params\n allowedPrivateKeyLengths?: readonly number[]; // for P521\n wrapPrivateKey?: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n endo?: EndomorphismOpts;\n // When a cofactor != 1, there can be an effective methods to:\n // 1. Determine whether a point is torsion-free\n isTorsionFree?: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => boolean;\n // 2. Clear torsion component\n clearCofactor?: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => WeierstrassPoint<T>;\n};\n/** @deprecated use ECDSASignOpts */\nexport type SignOpts = ECDSASignOpts;\n/** @deprecated use ECDSASignOpts */\nexport type VerOpts = ECDSAVerifyOpts;\n\n/** @deprecated use WeierstrassPoint */\nexport type ProjPointType<T> = WeierstrassPoint<T>;\n/** @deprecated use WeierstrassPointCons */\nexport type ProjConstructor<T> = WeierstrassPointCons<T>;\n/** @deprecated use ECDSASignatureCons */\nexport type SignatureConstructor = ECDSASignatureCons;\n\n// TODO: remove\nexport type CurvePointsType<T> = BasicWCurve<T> & {\n fromBytes?: (bytes: Uint8Array) => AffinePoint<T>;\n toBytes?: (\n c: WeierstrassPointCons<T>,\n point: WeierstrassPoint<T>,\n isCompressed: boolean\n ) => Uint8Array;\n};\n\n// LegacyWeierstrassOpts\nexport type CurvePointsTypeWithLength<T> = Readonly<CurvePointsType<T> & Partial<NLength>>;\n\n// LegacyWeierstrass\nexport type CurvePointsRes<T> = {\n Point: WeierstrassPointCons<T>;\n\n /** @deprecated use `Point.CURVE()` */\n CURVE: CurvePointsType<T>;\n /** @deprecated use `Point` */\n ProjectivePoint: WeierstrassPointCons<T>;\n /** @deprecated use `Point.Fn.fromBytes(privateKey)` */\n normPrivateKeyToScalar: (key: PrivKey) => bigint;\n /** @deprecated */\n weierstrassEquation: (x: T) => T;\n /** @deprecated use `Point.Fn.isValidNot0(num)` */\n isWithinCurveOrder: (num: bigint) => boolean;\n};\n\n// Aliases to legacy types\n// export type CurveType = LegacyECDSAOpts;\n// export type CurveFn = LegacyECDSA;\n// export type CurvePointsRes<T> = LegacyWeierstrass<T>;\n// export type CurvePointsType<T> = LegacyWeierstrassOpts<T>;\n// export type CurvePointsTypeWithLength<T> = LegacyWeierstrassOpts<T>;\n// export type BasicWCurve<T> = LegacyWeierstrassOpts<T>;\n\n/** @deprecated use `Uint8Array` */\nexport type PubKey = Hex | WeierstrassPoint<bigint>;\nexport type CurveType = BasicWCurve<bigint> & {\n hash: CHash; // CHash not FHash because we need outputLen for DRBG\n hmac?: HmacFnSync;\n randomBytes?: (bytesLength?: number) => Uint8Array;\n lowS?: boolean;\n bits2int?: (bytes: Uint8Array) => bigint;\n bits2int_modN?: (bytes: Uint8Array) => bigint;\n};\nexport type CurveFn = {\n /** @deprecated use `Point.CURVE()` */\n CURVE: CurvePointsType<bigint>;\n keygen: ECDSA['keygen'];\n getPublicKey: ECDSA['getPublicKey'];\n getSharedSecret: ECDSA['getSharedSecret'];\n sign: ECDSA['sign'];\n verify: ECDSA['verify'];\n Point: WeierstrassPointCons<bigint>;\n /** @deprecated use `Point` */\n ProjectivePoint: WeierstrassPointCons<bigint>;\n Signature: ECDSASignatureCons;\n utils: ECDSA['utils'];\n lengths: ECDSA['lengths'];\n};\n/** @deprecated use `weierstrass` in newer releases */\nexport function weierstrassPoints<T>(c: CurvePointsTypeWithLength<T>): CurvePointsRes<T> {\n const { CURVE, curveOpts } = _weierstrass_legacy_opts_to_new(c);\n const Point = weierstrassN(CURVE, curveOpts);\n return _weierstrass_new_output_to_legacy(c, Point);\n}\nexport type WsPointComposed<T> = {\n CURVE: WeierstrassOpts<T>;\n curveOpts: WeierstrassExtraOpts<T>;\n};\nexport type WsComposed = {\n /** @deprecated use `Point.CURVE()` */\n CURVE: WeierstrassOpts<bigint>;\n hash: CHash;\n curveOpts: WeierstrassExtraOpts<bigint>;\n ecdsaOpts: ECDSAOpts;\n};\nfunction _weierstrass_legacy_opts_to_new<T>(c: CurvePointsType<T>): WsPointComposed<T> {\n const CURVE: WeierstrassOpts<T> = {\n a: c.a,\n b: c.b,\n p: c.Fp.ORDER,\n n: c.n,\n h: c.h,\n Gx: c.Gx,\n Gy: c.Gy,\n };\n const Fp = c.Fp;\n let allowedLengths = c.allowedPrivateKeyLengths\n ? Array.from(new Set(c.allowedPrivateKeyLengths.map((l) => Math.ceil(l / 2))))\n : undefined;\n const Fn = Field(CURVE.n, {\n BITS: c.nBitLength,\n allowedLengths: allowedLengths,\n modFromBytes: c.wrapPrivateKey,\n });\n const curveOpts: WeierstrassExtraOpts<T> = {\n Fp,\n Fn,\n allowInfinityPoint: c.allowInfinityPoint,\n endo: c.endo,\n isTorsionFree: c.isTorsionFree,\n clearCofactor: c.clearCofactor,\n fromBytes: c.fromBytes,\n toBytes: c.toBytes,\n };\n return { CURVE, curveOpts };\n}\nfunction _ecdsa_legacy_opts_to_new(c: CurveType): WsComposed {\n const { CURVE, curveOpts } = _weierstrass_legacy_opts_to_new(c);\n const ecdsaOpts: ECDSAOpts = {\n hmac: c.hmac,\n randomBytes: c.randomBytes,\n lowS: c.lowS,\n bits2int: c.bits2int,\n bits2int_modN: c.bits2int_modN,\n };\n return { CURVE, curveOpts, hash: c.hash, ecdsaOpts };\n}\nexport function _legacyHelperEquat<T>(Fp: IField<T>, a: T, b: T): (x: T) => T {\n /**\n * y² = x³ + ax + b: Short weierstrass curve formula. Takes x, returns y².\n * @returns y²\n */\n function weierstrassEquation(x: T): T {\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x² * x\n return Fp.add(Fp.add(x3, Fp.mul(x, a)), b); // x³ + a * x + b\n }\n return weierstrassEquation;\n}\nfunction _weierstrass_new_output_to_legacy<T>(\n c: CurvePointsType<T>,\n Point: WeierstrassPointCons<T>\n): CurvePointsRes<T> {\n const { Fp, Fn } = Point;\n function isWithinCurveOrder(num: bigint): boolean {\n return inRange(num, _1n, Fn.ORDER);\n }\n const weierstrassEquation = _legacyHelperEquat(Fp, c.a, c.b);\n return Object.assign(\n {},\n {\n CURVE: c,\n Point: Point,\n ProjectivePoint: Point,\n normPrivateKeyToScalar: (key: PrivKey) => _normFnElement(Fn, key),\n weierstrassEquation,\n isWithinCurveOrder,\n }\n );\n}\nfunction _ecdsa_new_output_to_legacy(c: CurveType, _ecdsa: ECDSA): CurveFn {\n const Point = _ecdsa.Point;\n return Object.assign({}, _ecdsa, {\n ProjectivePoint: Point,\n CURVE: Object.assign({}, c, nLength(Point.Fn.ORDER, Point.Fn.BITS)),\n });\n}\n\n// _ecdsa_legacy\nexport function weierstrass(c: CurveType): CurveFn {\n const { CURVE, curveOpts, hash, ecdsaOpts } = _ecdsa_legacy_opts_to_new(c);\n const Point = weierstrassN(CURVE, curveOpts);\n const signs = ecdsa(Point, hash, ecdsaOpts);\n return _ecdsa_new_output_to_legacy(c, signs);\n}\n","/**\n * Utilities for short weierstrass curves, combined with noble-hashes.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { type CurveFn, type CurveType, weierstrass } from './abstract/weierstrass.ts';\nimport type { CHash } from './utils.ts';\n\n/** connects noble-curves to noble-hashes */\nexport function getHash(hash: CHash): { hash: CHash } {\n return { hash };\n}\n/** Same API as @noble/hashes, with ability to create curve with custom hash */\nexport type CurveDef = Readonly<Omit<CurveType, 'hash'>>;\nexport type CurveFnWithCreate = CurveFn & { create: (hash: CHash) => CurveFn };\n\n/** @deprecated use new `weierstrass()` and `ecdsa()` methods */\nexport function createCurve(curveDef: CurveDef, defHash: CHash): CurveFnWithCreate {\n const create = (hash: CHash): CurveFn => weierstrass({ ...curveDef, hash: hash });\n return { ...create(defHash), create };\n}\n","/**\n * SECG secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Belongs to Koblitz curves: it has efficiently-computable GLV endomorphism ψ,\n * check out {@link EndomorphismOpts}. Seems to be rigid (not backdoored).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { randomBytes } from '@noble/hashes/utils.js';\nimport { createCurve, type CurveFnWithCreate } from './_shortw_utils.ts';\nimport type { CurveLengths } from './abstract/curve.ts';\nimport {\n createHasher,\n type H2CHasher,\n type H2CMethod,\n isogenyMap,\n} from './abstract/hash-to-curve.ts';\nimport { Field, mapHashToField, mod, pow2 } from './abstract/modular.ts';\nimport {\n _normFnElement,\n type EndomorphismOpts,\n mapToCurveSimpleSWU,\n type WeierstrassPoint as PointType,\n type WeierstrassOpts,\n type WeierstrassPointCons,\n} from './abstract/weierstrass.ts';\nimport type { Hex, PrivKey } from './utils.ts';\nimport {\n bytesToNumberBE,\n concatBytes,\n ensureBytes,\n inRange,\n numberToBytesBE,\n utf8ToBytes,\n} from './utils.ts';\n\n// Seems like generator was produced from some seed:\n// `Point.BASE.multiply(Point.Fn.inv(2n, N)).toAffine().x`\n// // gives short x 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63n\nconst secp256k1_CURVE: WeierstrassOpts<bigint> = {\n p: BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'),\n n: BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'),\n h: BigInt(1),\n a: BigInt(0),\n b: BigInt(7),\n Gx: BigInt('0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'),\n Gy: BigInt('0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'),\n};\n\nconst secp256k1_ENDO: EndomorphismOpts = {\n beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n basises: [\n [BigInt('0x3086d221a7d46bcde86c90e49284eb15'), -BigInt('0xe4437ed6010e88286f547fa90abfe4c3')],\n [BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8'), BigInt('0x3086d221a7d46bcde86c90e49284eb15')],\n ],\n};\n\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nconst _2n = /* @__PURE__ */ BigInt(2);\n\n/**\n * √n = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y: bigint): bigint {\n const P = secp256k1_CURVE.p;\n // prettier-ignore\n const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n // prettier-ignore\n const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n const b2 = (y * y * y) % P; // x^3, 11\n const b3 = (b2 * b2 * y) % P; // x^7\n const b6 = (pow2(b3, _3n, P) * b3) % P;\n const b9 = (pow2(b6, _3n, P) * b3) % P;\n const b11 = (pow2(b9, _2n, P) * b2) % P;\n const b22 = (pow2(b11, _11n, P) * b11) % P;\n const b44 = (pow2(b22, _22n, P) * b22) % P;\n const b88 = (pow2(b44, _44n, P) * b44) % P;\n const b176 = (pow2(b88, _88n, P) * b88) % P;\n const b220 = (pow2(b176, _44n, P) * b44) % P;\n const b223 = (pow2(b220, _3n, P) * b3) % P;\n const t1 = (pow2(b223, _23n, P) * b22) % P;\n const t2 = (pow2(t1, _6n, P) * b2) % P;\n const root = pow2(t2, _2n, P);\n if (!Fpk1.eql(Fpk1.sqr(root), y)) throw new Error('Cannot find square root');\n return root;\n}\n\nconst Fpk1 = Field(secp256k1_CURVE.p, { sqrt: sqrtMod });\n\n/**\n * secp256k1 curve, ECDSA and ECDH methods.\n *\n * Field: `2n**256n - 2n**32n - 2n**9n - 2n**8n - 2n**7n - 2n**6n - 2n**4n - 1n`\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1';\n * const { secretKey, publicKey } = secp256k1.keygen();\n * const msg = new TextEncoder().encode('hello');\n * const sig = secp256k1.sign(msg, secretKey);\n * const isValid = secp256k1.verify(sig, msg, publicKey) === true;\n * ```\n */\nexport const secp256k1: CurveFnWithCreate = createCurve(\n { ...secp256k1_CURVE, Fp: Fpk1, lowS: true, endo: secp256k1_ENDO },\n sha256\n);\n\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES: { [tag: string]: Uint8Array } = {};\nfunction taggedHash(tag: string, ...messages: Uint8Array[]): Uint8Array {\n let tagP = TAGGED_HASH_PREFIXES[tag];\n if (tagP === undefined) {\n const tagH = sha256(utf8ToBytes(tag));\n tagP = concatBytes(tagH, tagH);\n TAGGED_HASH_PREFIXES[tag] = tagP;\n }\n return sha256(concatBytes(tagP, ...messages));\n}\n\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point: PointType<bigint>) => point.toBytes(true).slice(1);\nconst Pointk1 = /* @__PURE__ */ (() => secp256k1.Point)();\nconst hasEven = (y: bigint) => y % _2n === _0n;\n\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv: PrivKey) {\n const { Fn, BASE } = Pointk1;\n const d_ = _normFnElement(Fn, priv);\n const p = BASE.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside\n const scalar = hasEven(p.y) ? d_ : Fn.neg(d_);\n return { scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x: bigint): PointType<bigint> {\n const Fp = Fpk1;\n if (!Fp.isValidNot0(x)) throw new Error('invalid x: Fail if x ≥ p');\n const xx = Fp.create(x * x);\n const c = Fp.create(xx * x + BigInt(7)); // Let c = x³ + 7 mod p.\n let y = Fp.sqrt(c); // Let y = c^(p+1)/4 mod p. Same as sqrt().\n // Return the unique point P such that x(P) = x and\n // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n if (!hasEven(y)) y = Fp.neg(y);\n const p = Pointk1.fromAffine({ x, y });\n p.assertValidity();\n return p;\n}\nconst num = bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args: Uint8Array[]): bigint {\n return Pointk1.Fn.create(num(taggedHash('BIP0340/challenge', ...args)));\n}\n\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(secretKey: Hex): Uint8Array {\n return schnorrGetExtPubKey(secretKey).bytes; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)\n}\n\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(message: Hex, secretKey: PrivKey, auxRand: Hex = randomBytes(32)): Uint8Array {\n const { Fn } = Pointk1;\n const m = ensureBytes('message', message);\n const { bytes: px, scalar: d } = schnorrGetExtPubKey(secretKey); // checks for isWithinCurveOrder\n const a = ensureBytes('auxRand', auxRand, 32); // Auxiliary random data a: a 32-byte array\n const t = Fn.toBytes(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n // Let k' = int(rand) mod n. Fail if k' = 0. Let R = k'⋅G\n const { bytes: rx, scalar: k } = schnorrGetExtPubKey(rand);\n const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n sig.set(rx, 0);\n sig.set(Fn.toBytes(Fn.create(k + e * d)), 32);\n // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n if (!schnorrVerify(sig, m, px)) throw new Error('sign: Invalid signature produced');\n return sig;\n}\n\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature: Hex, message: Hex, publicKey: Hex): boolean {\n const { Fn, BASE } = Pointk1;\n const sig = ensureBytes('signature', signature, 64);\n const m = ensureBytes('message', message);\n const pub = ensureBytes('publicKey', publicKey, 32);\n try {\n const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r ≥ p.\n if (!inRange(r, _1n, secp256k1_CURVE.p)) return false;\n const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s ≥ n.\n if (!inRange(s, _1n, secp256k1_CURVE.n)) return false;\n // int(challenge(bytes(r)||bytes(P)||m))%n\n const e = challenge(Fn.toBytes(r), pointToBytes(P), m);\n // R = s⋅G - e⋅P, where -eP == (n-e)P\n const R = BASE.multiplyUnsafe(s).add(P.multiplyUnsafe(Fn.neg(e)));\n const { x, y } = R.toAffine();\n // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.\n if (R.is0() || !hasEven(y) || x !== r) return false;\n return true;\n } catch (error) {\n return false;\n }\n}\n\nexport type SecpSchnorr = {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: typeof schnorrGetPublicKey;\n sign: typeof schnorrSign;\n verify: typeof schnorrVerify;\n Point: WeierstrassPointCons<bigint>;\n utils: {\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n pointToBytes: (point: PointType<bigint>) => Uint8Array;\n lift_x: typeof lift_x;\n taggedHash: typeof taggedHash;\n\n /** @deprecated use `randomSecretKey` */\n randomPrivateKey: (seed?: Uint8Array) => Uint8Array;\n /** @deprecated use `utils` */\n numberToBytesBE: typeof numberToBytesBE;\n /** @deprecated use `utils` */\n bytesToNumberBE: typeof bytesToNumberBE;\n /** @deprecated use `modular` */\n mod: typeof mod;\n };\n lengths: CurveLengths;\n};\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1';\n * const { secretKey, publicKey } = schnorr.keygen();\n * // const publicKey = schnorr.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, secretKey);\n * const isValid = schnorr.verify(sig, msg, publicKey);\n * ```\n */\nexport const schnorr: SecpSchnorr = /* @__PURE__ */ (() => {\n const size = 32;\n const seedLength = 48;\n const randomSecretKey = (seed = randomBytes(seedLength)): Uint8Array => {\n return mapHashToField(seed, secp256k1_CURVE.n);\n };\n // TODO: remove\n secp256k1.utils.randomSecretKey;\n function keygen(seed?: Uint8Array) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: schnorrGetPublicKey(secretKey) };\n }\n return {\n keygen,\n getPublicKey: schnorrGetPublicKey,\n sign: schnorrSign,\n verify: schnorrVerify,\n Point: Pointk1,\n utils: {\n randomSecretKey: randomSecretKey,\n randomPrivateKey: randomSecretKey,\n taggedHash,\n\n // TODO: remove\n lift_x,\n pointToBytes,\n numberToBytesBE,\n bytesToNumberBE,\n mod,\n },\n lengths: {\n secretKey: size,\n publicKey: size,\n publicKeyHasPrefix: false,\n signature: size * 2,\n seed: seedLength,\n },\n };\n})();\n\nconst isoMap = /* @__PURE__ */ (() =>\n isogenyMap(\n Fpk1,\n [\n // xNum\n [\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n ],\n // xDen\n [\n '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n // yNum\n [\n '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n ],\n // yDen\n [\n '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n ].map((i) => i.map((j) => BigInt(j))) as [bigint[], bigint[], bigint[], bigint[]]\n ))();\nconst mapSWU = /* @__PURE__ */ (() =>\n mapToCurveSimpleSWU(Fpk1, {\n A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n B: BigInt('1771'),\n Z: Fpk1.create(BigInt('-11')),\n }))();\n\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nexport const secp256k1_hasher: H2CHasher<bigint> = /* @__PURE__ */ (() =>\n createHasher(\n secp256k1.Point,\n (scalars: bigint[]) => {\n const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n return isoMap(x, y);\n },\n {\n DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n p: Fpk1.ORDER,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha256,\n }\n ))();\n\n/** @deprecated use `import { secp256k1_hasher } from '@noble/curves/secp256k1.js';` */\nexport const hashToCurve: H2CMethod<bigint> = /* @__PURE__ */ (() =>\n secp256k1_hasher.hashToCurve)();\n\n/** @deprecated use `import { secp256k1_hasher } from '@noble/curves/secp256k1.js';` */\nexport const encodeToCurve: H2CMethod<bigint> = /* @__PURE__ */ (() =>\n secp256k1_hasher.encodeToCurve)();\n","/**\n * On-disk cache for derived Arweave RSA-4096 JWKs (Followup A).\n *\n * The Arweave HD-derivation costs 5–30 s of RSA prime search per process\n * invocation. Persisting the derived JWK to `wallet.arweave.enc` (alongside\n * `wallet.enc`) pays the cost once per wallet, not once per CLI invocation.\n *\n * File format: JSON envelope, mode 0o600, JWK plaintext encrypted with the\n * same operator password as `wallet.enc`. Per-node-type map under `nodes`\n * so future per-node AR keys are forward-compatible (today only `dvm` is\n * populated). Each entry stores a public sub-seed fingerprint and AR address\n * so we can detect a stale cache (different mnemonic) without paying the\n * RSA cost.\n *\n * {\n * \"version\": 1,\n * \"nodes\": {\n * \"dvm\": {\n * \"subSeedFingerprint\": \"<base64url-sha256>\",\n * \"arweaveAddress\": \"<base64url-sha256>\",\n * \"encryptedJwk\": { salt, iv, ciphertext, tag }\n * }\n * }\n * }\n */\n\nimport { mkdir, readFile, stat, writeFile, unlink } from 'node:fs/promises';\nimport { dirname } from 'node:path';\n\nimport type { NodeType } from '../docker/types.js';\nimport type {\n ArweaveCacheEntry,\n ArweaveJwk,\n EncryptedArweaveCacheFile,\n} from './types.js';\nimport { decryptArweaveJwk, encryptArweaveJwk } from './crypto.js';\n\n/** Derive the cache file path from the wallet.enc path. Same directory. */\nexport function arweaveCachePath(encryptedWalletPath: string): string {\n return `${dirname(encryptedWalletPath)}/wallet.arweave.enc`;\n}\n\n/**\n * Load and parse the on-disk cache. Returns `null` if the file does not\n * exist. Throws on malformed JSON or schema mismatch.\n */\nexport async function loadArweaveCacheFile(\n path: string\n): Promise<EncryptedArweaveCacheFile | null> {\n let data: string;\n try {\n data = await readFile(path, 'utf-8');\n } catch (err: unknown) {\n if (\n err instanceof Error &&\n 'code' in err &&\n (err as NodeJS.ErrnoException).code === 'ENOENT'\n ) {\n return null;\n }\n throw err;\n }\n\n // Permissions check — surface a warning via stderr if too open (best-effort,\n // mirrors loadWallet behavior; consumers can choose to harden separately).\n try {\n const stats = await stat(path);\n const mode = stats.mode & 0o777;\n if (mode & 0o077) {\n console.error(\n `Warning: arweave cache ${path} has permissions ${mode.toString(8)} (should be 600)`\n );\n }\n } catch {\n /* best-effort */\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n throw new Error(\n `Arweave JWK cache at ${path} is corrupt: not valid JSON. Delete the file and re-run to re-derive.`\n );\n }\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n (parsed as { version?: unknown }).version !== 1 ||\n typeof (parsed as { nodes?: unknown }).nodes !== 'object' ||\n (parsed as { nodes: unknown }).nodes === null\n ) {\n throw new Error(\n `Arweave JWK cache at ${path} is corrupt: unexpected envelope shape. Delete the file and re-run to re-derive.`\n );\n }\n return parsed as EncryptedArweaveCacheFile;\n}\n\n/** Result of an attempted cache read — distinguishes miss from mismatch. */\nexport type ArweaveCacheReadResult =\n | { status: 'miss' }\n | {\n status: 'stale';\n cachedFingerprint: string;\n cachedAddress: string;\n }\n | { status: 'hit'; jwk: ArweaveJwk; entry: ArweaveCacheEntry };\n\n/**\n * Read + verify + decrypt the cached JWK for `nodeType`.\n *\n * - `miss` → file or entry absent; caller should derive + write.\n * - `stale` → entry exists but its sub-seed fingerprint does not match\n * `expectedFingerprint` (cache was written from a different\n * mnemonic). Caller should `deleteArweaveJwkFromCache` then\n * derive + write.\n * - `hit` → fingerprint matches; JWK successfully decrypted. **Throws**\n * if decryption fails (wrong password / corrupt ciphertext) —\n * the spec disallows silently re-deriving on password mismatch.\n */\nexport async function readArweaveJwkFromCache(\n path: string,\n nodeType: NodeType,\n password: string,\n expectedFingerprint: string\n): Promise<ArweaveCacheReadResult> {\n const file = await loadArweaveCacheFile(path);\n if (!file) return { status: 'miss' };\n const entry = file.nodes[nodeType];\n if (!entry) return { status: 'miss' };\n\n // Validate entry shape before doing anything else.\n if (\n typeof entry.subSeedFingerprint !== 'string' ||\n typeof entry.arweaveAddress !== 'string' ||\n typeof entry.encryptedJwk !== 'object' ||\n entry.encryptedJwk === null\n ) {\n throw new Error(\n `Arweave JWK cache entry for ${nodeType} at ${path} is corrupt: missing fields.`\n );\n }\n\n if (entry.subSeedFingerprint !== expectedFingerprint) {\n return {\n status: 'stale',\n cachedFingerprint: entry.subSeedFingerprint,\n cachedAddress: entry.arweaveAddress,\n };\n }\n\n // Fingerprint matched — now decrypt. If this throws, the password is wrong\n // (or the JWK plaintext is malformed); both surface to the caller.\n const jwk = decryptArweaveJwk(entry.encryptedJwk, password);\n return { status: 'hit', jwk, entry };\n}\n\n/**\n * Encrypt and write `jwk` for `nodeType` into the cache file. Preserves\n * entries for other node types. Idempotent re-write (overwrites the same\n * entry). File mode is 0o600; parent directory is created if missing.\n */\nexport async function writeArweaveJwkToCache(\n path: string,\n nodeType: NodeType,\n jwk: ArweaveJwk,\n password: string,\n subSeedFingerprint: string,\n arweaveAddress: string\n): Promise<void> {\n const existing = await loadArweaveCacheFile(path);\n const entry: ArweaveCacheEntry = {\n subSeedFingerprint,\n arweaveAddress,\n encryptedJwk: encryptArweaveJwk(jwk, password),\n };\n const file: EncryptedArweaveCacheFile = existing ?? {\n version: 1,\n nodes: {},\n };\n file.nodes[nodeType] = entry;\n\n const dir = dirname(path);\n await mkdir(dir, { recursive: true, mode: 0o700 });\n await writeFile(path, JSON.stringify(file, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n });\n}\n\n/**\n * Delete the cache entry for a specific node type. Used when a stale-cache\n * mismatch is detected (e.g., operator restored from a different mnemonic).\n * No-op if the file or entry does not exist. Removes the file entirely\n * when the last entry is dropped, to keep the on-disk surface tidy.\n */\nexport async function deleteArweaveJwkFromCache(\n path: string,\n nodeType: NodeType\n): Promise<void> {\n const file = await loadArweaveCacheFile(path);\n if (!file) return;\n if (!(nodeType in file.nodes)) return;\n const { [nodeType]: _removed, ...remaining } = file.nodes;\n file.nodes = remaining;\n\n if (Object.keys(file.nodes).length === 0) {\n try {\n await unlink(path);\n } catch (err: unknown) {\n if (\n err instanceof Error &&\n 'code' in err &&\n (err as NodeJS.ErrnoException).code === 'ENOENT'\n ) {\n return;\n }\n throw err;\n }\n return;\n }\n\n await writeFile(path, JSON.stringify(file, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n });\n}\n","/**\n * Twisted Edwards curve. The formula is: ax² + y² = 1 + dx²y².\n * For design rationale of types / exports, see weierstrass module documentation.\n * Untwisted Edwards curves exist, but they aren't used in real-world protocols.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abool,\n abytes,\n aInRange,\n bytesToHex,\n bytesToNumberLE,\n concatBytes,\n copyBytes,\n hexToBytes,\n isBytes,\n memoized,\n notImplemented,\n validateObject,\n randomBytes as wcRandomBytes,\n type FHash,\n type Signer,\n} from '../utils.ts';\nimport {\n createCurveFields,\n createKeygen,\n normalizeZ,\n wNAF,\n type AffinePoint,\n type CurveLengths,\n type CurvePoint,\n type CurvePointCons,\n} from './curve.ts';\nimport { type IField } from './modular.ts';\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _8n = BigInt(8);\n\n/** Instance of Extended Point with coordinates in X, Y, Z, T. */\nexport interface EdwardsPoint extends CurvePoint<bigint, EdwardsPoint> {\n /** extended X coordinate. Different from affine x. */\n readonly X: bigint;\n /** extended Y coordinate. Different from affine y. */\n readonly Y: bigint;\n /** extended Z coordinate */\n readonly Z: bigint;\n /** extended T coordinate */\n readonly T: bigint;\n}\n/** Static methods of Extended Point with coordinates in X, Y, Z, T. */\nexport interface EdwardsPointCons extends CurvePointCons<EdwardsPoint> {\n new (X: bigint, Y: bigint, Z: bigint, T: bigint): EdwardsPoint;\n CURVE(): EdwardsOpts;\n fromBytes(bytes: Uint8Array, zip215?: boolean): EdwardsPoint;\n fromHex(hex: string, zip215?: boolean): EdwardsPoint;\n}\n\n/**\n * Twisted Edwards curve options.\n *\n * * a: formula param\n * * d: formula param\n * * p: prime characteristic (order) of finite field, in which arithmetics is done\n * * n: order of prime subgroup a.k.a total amount of valid curve points\n * * h: cofactor. h*n is group order; n is subgroup order\n * * Gx: x coordinate of generator point a.k.a. base point\n * * Gy: y coordinate of generator point\n */\nexport type EdwardsOpts = Readonly<{\n p: bigint;\n n: bigint;\n h: bigint;\n a: bigint;\n d: bigint;\n Gx: bigint;\n Gy: bigint;\n}>;\n\n/**\n * Extra curve options for Twisted Edwards.\n *\n * * Fp: redefined Field over curve.p\n * * Fn: redefined Field over curve.n\n * * uvRatio: helper function for decompression, calculating √(u/v)\n */\nexport type EdwardsExtraOpts = Partial<{\n Fp: IField<bigint>;\n Fn: IField<bigint>;\n FpFnLE: boolean;\n uvRatio: (u: bigint, v: bigint) => { isValid: boolean; value: bigint };\n}>;\n\n/**\n * EdDSA (Edwards Digital Signature algorithm) options.\n *\n * * hash: hash function used to hash secret keys and messages\n * * adjustScalarBytes: clears bits to get valid field element\n * * domain: Used for hashing\n * * mapToCurve: for hash-to-curve standard\n * * prehash: RFC 8032 pre-hashing of messages to sign() / verify()\n * * randomBytes: function generating random bytes, used for randomSecretKey\n */\nexport type EdDSAOpts = Partial<{\n adjustScalarBytes: (bytes: Uint8Array) => Uint8Array;\n domain: (data: Uint8Array, ctx: Uint8Array, phflag: boolean) => Uint8Array;\n mapToCurve: (scalar: bigint[]) => AffinePoint<bigint>;\n prehash: FHash;\n randomBytes: (bytesLength?: number) => Uint8Array;\n}>;\n\n/**\n * EdDSA (Edwards Digital Signature algorithm) interface.\n *\n * Allows to create and verify signatures, create public and secret keys.\n */\nexport interface EdDSA {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: Uint8Array) => Uint8Array;\n sign: (\n message: Uint8Array,\n secretKey: Uint8Array,\n options?: { context?: Uint8Array }\n ) => Uint8Array;\n verify: (\n sig: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n options?: { context?: Uint8Array; zip215: boolean }\n ) => boolean;\n Point: EdwardsPointCons;\n utils: {\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n isValidSecretKey: (secretKey: Uint8Array) => boolean;\n isValidPublicKey: (publicKey: Uint8Array, zip215?: boolean) => boolean;\n\n /**\n * Converts ed public key to x public key.\n *\n * There is NO `fromMontgomery`:\n * - There are 2 valid ed25519 points for every x25519, with flipped coordinate\n * - Sometimes there are 0 valid ed25519 points, because x25519 *additionally*\n * accepts inputs on the quadratic twist, which can't be moved to ed25519\n *\n * @example\n * ```js\n * const someonesPub_ed = ed25519.getPublicKey(ed25519.utils.randomSecretKey());\n * const someonesPub = ed25519.utils.toMontgomery(someonesPub);\n * const aPriv = x25519.utils.randomSecretKey();\n * const shared = x25519.getSharedSecret(aPriv, someonesPub)\n * ```\n */\n toMontgomery: (publicKey: Uint8Array) => Uint8Array;\n /**\n * Converts ed secret key to x secret key.\n * @example\n * ```js\n * const someonesPub = x25519.getPublicKey(x25519.utils.randomSecretKey());\n * const aPriv_ed = ed25519.utils.randomSecretKey();\n * const aPriv = ed25519.utils.toMontgomerySecret(aPriv_ed);\n * const shared = x25519.getSharedSecret(aPriv, someonesPub)\n * ```\n */\n toMontgomerySecret: (secretKey: Uint8Array) => Uint8Array;\n getExtendedPublicKey: (key: Uint8Array) => {\n head: Uint8Array;\n prefix: Uint8Array;\n scalar: bigint;\n point: EdwardsPoint;\n pointBytes: Uint8Array;\n };\n };\n lengths: CurveLengths;\n}\n\nfunction isEdValidXY(Fp: IField<bigint>, CURVE: EdwardsOpts, x: bigint, y: bigint): boolean {\n const x2 = Fp.sqr(x);\n const y2 = Fp.sqr(y);\n const left = Fp.add(Fp.mul(CURVE.a, x2), y2);\n const right = Fp.add(Fp.ONE, Fp.mul(CURVE.d, Fp.mul(x2, y2)));\n return Fp.eql(left, right);\n}\n\nexport function edwards(params: EdwardsOpts, extraOpts: EdwardsExtraOpts = {}): EdwardsPointCons {\n const validated = createCurveFields('edwards', params, extraOpts, extraOpts.FpFnLE);\n const { Fp, Fn } = validated;\n let CURVE = validated.CURVE as EdwardsOpts;\n const { h: cofactor } = CURVE;\n validateObject(extraOpts, {}, { uvRatio: 'function' });\n\n // Important:\n // There are some places where Fp.BYTES is used instead of nByteLength.\n // So far, everything has been tested with curves of Fp.BYTES == nByteLength.\n // TODO: test and find curves which behave otherwise.\n const MASK = _2n << (BigInt(Fn.BYTES * 8) - _1n);\n const modP = (n: bigint) => Fp.create(n); // Function overrides\n\n // sqrt(u/v)\n const uvRatio =\n extraOpts.uvRatio ||\n ((u: bigint, v: bigint) => {\n try {\n return { isValid: true, value: Fp.sqrt(Fp.div(u, v)) };\n } catch (e) {\n return { isValid: false, value: _0n };\n }\n });\n\n // Validate whether the passed curve params are valid.\n // equation ax² + y² = 1 + dx²y² should work for generator point.\n if (!isEdValidXY(Fp, CURVE, CURVE.Gx, CURVE.Gy))\n throw new Error('bad curve params: generator point');\n\n /**\n * Asserts coordinate is valid: 0 <= n < MASK.\n * Coordinates >= Fp.ORDER are allowed for zip215.\n */\n function acoord(title: string, n: bigint, banZero = false) {\n const min = banZero ? _1n : _0n;\n aInRange('coordinate ' + title, n, min, MASK);\n return n;\n }\n\n function aedpoint(other: unknown) {\n if (!(other instanceof Point)) throw new Error('EdwardsPoint expected');\n }\n // Converts Extended point to default (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n const toAffineMemo = memoized((p: Point, iz?: bigint): AffinePoint<bigint> => {\n const { X, Y, Z } = p;\n const is0 = p.is0();\n if (iz == null) iz = is0 ? _8n : (Fp.inv(Z) as bigint); // 8 was chosen arbitrarily\n const x = modP(X * iz);\n const y = modP(Y * iz);\n const zz = Fp.mul(Z, iz);\n if (is0) return { x: _0n, y: _1n };\n if (zz !== _1n) throw new Error('invZ was invalid');\n return { x, y };\n });\n const assertValidMemo = memoized((p: Point) => {\n const { a, d } = CURVE;\n if (p.is0()) throw new Error('bad point: ZERO'); // TODO: optimize, with vars below?\n // Equation in affine coordinates: ax² + y² = 1 + dx²y²\n // Equation in projective coordinates (X/Z, Y/Z, Z): (aX² + Y²)Z² = Z⁴ + dX²Y²\n const { X, Y, Z, T } = p;\n const X2 = modP(X * X); // X²\n const Y2 = modP(Y * Y); // Y²\n const Z2 = modP(Z * Z); // Z²\n const Z4 = modP(Z2 * Z2); // Z⁴\n const aX2 = modP(X2 * a); // aX²\n const left = modP(Z2 * modP(aX2 + Y2)); // (aX² + Y²)Z²\n const right = modP(Z4 + modP(d * modP(X2 * Y2))); // Z⁴ + dX²Y²\n if (left !== right) throw new Error('bad point: equation left != right (1)');\n // In Extended coordinates we also have T, which is x*y=T/Z: check X*Y == Z*T\n const XY = modP(X * Y);\n const ZT = modP(Z * T);\n if (XY !== ZT) throw new Error('bad point: equation left != right (2)');\n return true;\n });\n\n // Extended Point works in extended coordinates: (X, Y, Z, T) ∋ (x=X/Z, y=Y/Z, T=xy).\n // https://en.wikipedia.org/wiki/Twisted_Edwards_curve#Extended_coordinates\n class Point implements EdwardsPoint {\n // base / generator point\n static readonly BASE = new Point(CURVE.Gx, CURVE.Gy, _1n, modP(CURVE.Gx * CURVE.Gy));\n // zero / infinity / identity point\n static readonly ZERO = new Point(_0n, _1n, _1n, _0n); // 0, 1, 1, 0\n // math field\n static readonly Fp = Fp;\n // scalar field\n static readonly Fn = Fn;\n\n readonly X: bigint;\n readonly Y: bigint;\n readonly Z: bigint;\n readonly T: bigint;\n\n constructor(X: bigint, Y: bigint, Z: bigint, T: bigint) {\n this.X = acoord('x', X);\n this.Y = acoord('y', Y);\n this.Z = acoord('z', Z, true);\n this.T = acoord('t', T);\n Object.freeze(this);\n }\n\n static CURVE(): EdwardsOpts {\n return CURVE;\n }\n\n static fromAffine(p: AffinePoint<bigint>): Point {\n if (p instanceof Point) throw new Error('extended point not allowed');\n const { x, y } = p || {};\n acoord('x', x);\n acoord('y', y);\n return new Point(x, y, _1n, modP(x * y));\n }\n\n // Uses algo from RFC8032 5.1.3.\n static fromBytes(bytes: Uint8Array, zip215 = false): Point {\n const len = Fp.BYTES;\n const { a, d } = CURVE;\n bytes = copyBytes(abytes(bytes, len, 'point'));\n abool(zip215, 'zip215');\n const normed = copyBytes(bytes); // copy again, we'll manipulate it\n const lastByte = bytes[len - 1]; // select last byte\n normed[len - 1] = lastByte & ~0x80; // clear last bit\n const y = bytesToNumberLE(normed);\n\n // zip215=true is good for consensus-critical apps. =false follows RFC8032 / NIST186-5.\n // RFC8032 prohibits >= p, but ZIP215 doesn't\n // zip215=true: 0 <= y < MASK (2^256 for ed25519)\n // zip215=false: 0 <= y < P (2^255-19 for ed25519)\n const max = zip215 ? MASK : Fp.ORDER;\n aInRange('point.y', y, _0n, max);\n\n // Ed25519: x² = (y²-1)/(dy²+1) mod p. Ed448: x² = (y²-1)/(dy²-1) mod p. Generic case:\n // ax²+y²=1+dx²y² => y²-1=dx²y²-ax² => y²-1=x²(dy²-a) => x²=(y²-1)/(dy²-a)\n const y2 = modP(y * y); // denominator is always non-0 mod p.\n const u = modP(y2 - _1n); // u = y² - 1\n const v = modP(d * y2 - a); // v = d y² + 1.\n let { isValid, value: x } = uvRatio(u, v); // √(u/v)\n if (!isValid) throw new Error('bad point: invalid y coordinate');\n const isXOdd = (x & _1n) === _1n; // There are 2 square roots. Use x_0 bit to select proper\n const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n if (!zip215 && x === _0n && isLastByteOdd)\n // if x=0 and x_0 = 1, fail\n throw new Error('bad point: x=0 and x_0=1');\n if (isLastByteOdd !== isXOdd) x = modP(-x); // if x_0 != x mod 2, set x = p-x\n return Point.fromAffine({ x, y });\n }\n\n static fromHex(hex: string, zip215 = false): Point {\n return Point.fromBytes(hexToBytes(hex), zip215);\n }\n\n get x(): bigint {\n return this.toAffine().x;\n }\n get y(): bigint {\n return this.toAffine().y;\n }\n\n precompute(windowSize: number = 8, isLazy = true) {\n wnaf.createCache(this, windowSize);\n if (!isLazy) this.multiply(_2n); // random number\n return this;\n }\n\n // Useful in fromAffine() - not for fromBytes(), which always created valid points.\n assertValidity(): void {\n assertValidMemo(this);\n }\n\n // Compare one point to another.\n equals(other: Point): boolean {\n aedpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n const X1Z2 = modP(X1 * Z2);\n const X2Z1 = modP(X2 * Z1);\n const Y1Z2 = modP(Y1 * Z2);\n const Y2Z1 = modP(Y2 * Z1);\n return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;\n }\n\n is0(): boolean {\n return this.equals(Point.ZERO);\n }\n\n negate(): Point {\n // Flips point sign to a negative one (-x, y in affine coords)\n return new Point(modP(-this.X), this.Y, this.Z, modP(-this.T));\n }\n\n // Fast algo for doubling Extended Point.\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#doubling-dbl-2008-hwcd\n // Cost: 4M + 4S + 1*a + 6add + 1*2.\n double(): Point {\n const { a } = CURVE;\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const A = modP(X1 * X1); // A = X12\n const B = modP(Y1 * Y1); // B = Y12\n const C = modP(_2n * modP(Z1 * Z1)); // C = 2*Z12\n const D = modP(a * A); // D = a*A\n const x1y1 = X1 + Y1;\n const E = modP(modP(x1y1 * x1y1) - A - B); // E = (X1+Y1)2-A-B\n const G = D + B; // G = D+B\n const F = G - C; // F = G-C\n const H = D - B; // H = D-B\n const X3 = modP(E * F); // X3 = E*F\n const Y3 = modP(G * H); // Y3 = G*H\n const T3 = modP(E * H); // T3 = E*H\n const Z3 = modP(F * G); // Z3 = F*G\n return new Point(X3, Y3, Z3, T3);\n }\n\n // Fast algo for adding 2 Extended Points.\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd\n // Cost: 9M + 1*a + 1*d + 7add.\n add(other: Point) {\n aedpoint(other);\n const { a, d } = CURVE;\n const { X: X1, Y: Y1, Z: Z1, T: T1 } = this;\n const { X: X2, Y: Y2, Z: Z2, T: T2 } = other;\n const A = modP(X1 * X2); // A = X1*X2\n const B = modP(Y1 * Y2); // B = Y1*Y2\n const C = modP(T1 * d * T2); // C = T1*d*T2\n const D = modP(Z1 * Z2); // D = Z1*Z2\n const E = modP((X1 + Y1) * (X2 + Y2) - A - B); // E = (X1+Y1)*(X2+Y2)-A-B\n const F = D - C; // F = D-C\n const G = D + C; // G = D+C\n const H = modP(B - a * A); // H = B-a*A\n const X3 = modP(E * F); // X3 = E*F\n const Y3 = modP(G * H); // Y3 = G*H\n const T3 = modP(E * H); // T3 = E*H\n const Z3 = modP(F * G); // Z3 = F*G\n return new Point(X3, Y3, Z3, T3);\n }\n\n subtract(other: Point): Point {\n return this.add(other.negate());\n }\n\n // Constant-time multiplication.\n multiply(scalar: bigint): Point {\n // 1 <= scalar < L\n if (!Fn.isValidNot0(scalar)) throw new Error('invalid scalar: expected 1 <= sc < curve.n');\n const { p, f } = wnaf.cached(this, scalar, (p) => normalizeZ(Point, p));\n return normalizeZ(Point, [p, f])[0];\n }\n\n // Non-constant-time multiplication. Uses double-and-add algorithm.\n // It's faster, but should only be used when you don't care about\n // an exposed private key e.g. sig verification.\n // Does NOT allow scalars higher than CURVE.n.\n // Accepts optional accumulator to merge with multiply (important for sparse scalars)\n multiplyUnsafe(scalar: bigint, acc = Point.ZERO): Point {\n // 0 <= scalar < L\n if (!Fn.isValid(scalar)) throw new Error('invalid scalar: expected 0 <= sc < curve.n');\n if (scalar === _0n) return Point.ZERO;\n if (this.is0() || scalar === _1n) return this;\n return wnaf.unsafe(this, scalar, (p) => normalizeZ(Point, p), acc);\n }\n\n // Checks if point is of small order.\n // If you add something to small order point, you will have \"dirty\"\n // point with torsion component.\n // Multiplies point by cofactor and checks if the result is 0.\n isSmallOrder(): boolean {\n return this.multiplyUnsafe(cofactor).is0();\n }\n\n // Multiplies point by curve order and checks if the result is 0.\n // Returns `false` is the point is dirty.\n isTorsionFree(): boolean {\n return wnaf.unsafe(this, CURVE.n).is0();\n }\n\n // Converts Extended point to default (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n toAffine(invertedZ?: bigint): AffinePoint<bigint> {\n return toAffineMemo(this, invertedZ);\n }\n\n clearCofactor(): Point {\n if (cofactor === _1n) return this;\n return this.multiplyUnsafe(cofactor);\n }\n\n toBytes(): Uint8Array {\n const { x, y } = this.toAffine();\n // Fp.toBytes() allows non-canonical encoding of y (>= p).\n const bytes = Fp.toBytes(y);\n // Each y has 2 valid points: (x, y), (x,-y).\n // When compressing, it's enough to store y and use the last byte to encode sign of x\n bytes[bytes.length - 1] |= x & _1n ? 0x80 : 0;\n return bytes;\n }\n toHex(): string {\n return bytesToHex(this.toBytes());\n }\n\n toString() {\n return `<Point ${this.is0() ? 'ZERO' : this.toHex()}>`;\n }\n }\n const wnaf = new wNAF(Point, Fn.BITS);\n Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n return Point;\n}\n\n/**\n * Base class for prime-order points like Ristretto255 and Decaf448.\n * These points eliminate cofactor issues by representing equivalence classes\n * of Edwards curve points.\n */\nexport abstract class PrimeEdwardsPoint<T extends PrimeEdwardsPoint<T>>\n implements CurvePoint<bigint, T>\n{\n static BASE: PrimeEdwardsPoint<any>;\n static ZERO: PrimeEdwardsPoint<any>;\n static Fp: IField<bigint>;\n static Fn: IField<bigint>;\n\n protected readonly ep: EdwardsPoint;\n\n constructor(ep: EdwardsPoint) {\n this.ep = ep;\n }\n\n // Abstract methods that must be implemented by subclasses\n abstract toBytes(): Uint8Array;\n abstract equals(other: T): boolean;\n\n // Static methods that must be implemented by subclasses\n static fromBytes(_bytes: Uint8Array): any {\n notImplemented();\n }\n\n static fromHex(_hex: string): any {\n notImplemented();\n }\n\n get x(): bigint {\n return this.toAffine().x;\n }\n get y(): bigint {\n return this.toAffine().y;\n }\n\n // Common implementations\n clearCofactor(): T {\n // no-op for prime-order groups\n return this as any;\n }\n\n assertValidity(): void {\n this.ep.assertValidity();\n }\n\n toAffine(invertedZ?: bigint): AffinePoint<bigint> {\n return this.ep.toAffine(invertedZ);\n }\n\n toHex(): string {\n return bytesToHex(this.toBytes());\n }\n\n toString(): string {\n return this.toHex();\n }\n\n isTorsionFree(): boolean {\n return true;\n }\n\n isSmallOrder(): boolean {\n return false;\n }\n\n add(other: T): T {\n this.assertSame(other);\n return this.init(this.ep.add(other.ep));\n }\n\n subtract(other: T): T {\n this.assertSame(other);\n return this.init(this.ep.subtract(other.ep));\n }\n\n multiply(scalar: bigint): T {\n return this.init(this.ep.multiply(scalar));\n }\n\n multiplyUnsafe(scalar: bigint): T {\n return this.init(this.ep.multiplyUnsafe(scalar));\n }\n\n double(): T {\n return this.init(this.ep.double());\n }\n\n negate(): T {\n return this.init(this.ep.negate());\n }\n\n precompute(windowSize?: number, isLazy?: boolean): T {\n return this.init(this.ep.precompute(windowSize, isLazy));\n }\n\n // Helper methods\n abstract is0(): boolean;\n protected abstract assertSame(other: T): void;\n protected abstract init(ep: EdwardsPoint): T;\n}\n\n/**\n * Initializes EdDSA signatures over given Edwards curve.\n */\nexport function eddsa(Point: EdwardsPointCons, cHash: FHash, eddsaOpts: EdDSAOpts = {}): EdDSA {\n if (typeof cHash !== 'function') throw new Error('\"hash\" function param is required');\n validateObject(\n eddsaOpts,\n {},\n {\n adjustScalarBytes: 'function',\n randomBytes: 'function',\n domain: 'function',\n prehash: 'function',\n mapToCurve: 'function',\n }\n );\n\n const { prehash } = eddsaOpts;\n const { BASE, Fp, Fn } = Point;\n\n const randomBytes = eddsaOpts.randomBytes || wcRandomBytes;\n const adjustScalarBytes = eddsaOpts.adjustScalarBytes || ((bytes: Uint8Array) => bytes);\n const domain =\n eddsaOpts.domain ||\n ((data: Uint8Array, ctx: Uint8Array, phflag: boolean) => {\n abool(phflag, 'phflag');\n if (ctx.length || phflag) throw new Error('Contexts/pre-hash are not supported');\n return data;\n }); // NOOP\n\n // Little-endian SHA512 with modulo n\n function modN_LE(hash: Uint8Array): bigint {\n return Fn.create(bytesToNumberLE(hash)); // Not Fn.fromBytes: it has length limit\n }\n\n // Get the hashed private scalar per RFC8032 5.1.5\n function getPrivateScalar(key: Uint8Array) {\n const len = lengths.secretKey;\n abytes(key, lengths.secretKey, 'secretKey');\n // Hash private key with curve's hash function to produce uniformingly random input\n // Check byte lengths: ensure(64, h(ensure(32, key)))\n const hashed = abytes(cHash(key), 2 * len, 'hashedSecretKey');\n const head = adjustScalarBytes(hashed.slice(0, len)); // clear first half bits, produce FE\n const prefix = hashed.slice(len, 2 * len); // second half is called key prefix (5.1.6)\n const scalar = modN_LE(head); // The actual private scalar\n return { head, prefix, scalar };\n }\n\n /** Convenience method that creates public key from scalar. RFC8032 5.1.5 */\n function getExtendedPublicKey(secretKey: Uint8Array) {\n const { head, prefix, scalar } = getPrivateScalar(secretKey);\n const point = BASE.multiply(scalar); // Point on Edwards curve aka public key\n const pointBytes = point.toBytes();\n return { head, prefix, scalar, point, pointBytes };\n }\n\n /** Calculates EdDSA pub key. RFC8032 5.1.5. */\n function getPublicKey(secretKey: Uint8Array): Uint8Array {\n return getExtendedPublicKey(secretKey).pointBytes;\n }\n\n // int('LE', SHA512(dom2(F, C) || msgs)) mod N\n function hashDomainToScalar(context: Uint8Array = Uint8Array.of(), ...msgs: Uint8Array[]) {\n const msg = concatBytes(...msgs);\n return modN_LE(cHash(domain(msg, abytes(context, undefined, 'context'), !!prehash)));\n }\n\n /** Signs message with secret key. RFC8032 5.1.6 */\n function sign(\n msg: Uint8Array,\n secretKey: Uint8Array,\n options: { context?: Uint8Array } = {}\n ): Uint8Array {\n msg = abytes(msg, undefined, 'message');\n if (prehash) msg = prehash(msg); // for ed25519ph etc.\n const { prefix, scalar, pointBytes } = getExtendedPublicKey(secretKey);\n const r = hashDomainToScalar(options.context, prefix, msg); // r = dom2(F, C) || prefix || PH(M)\n const R = BASE.multiply(r).toBytes(); // R = rG\n const k = hashDomainToScalar(options.context, R, pointBytes, msg); // R || A || PH(M)\n const s = Fn.create(r + k * scalar); // S = (r + k * s) mod L\n if (!Fn.isValid(s)) throw new Error('sign failed: invalid s'); // 0 <= s < L\n const rs = concatBytes(R, Fn.toBytes(s));\n return abytes(rs, lengths.signature, 'result');\n }\n\n // verification rule is either zip215 or rfc8032 / nist186-5. Consult fromHex:\n const verifyOpts: { context?: Uint8Array; zip215?: boolean } = { zip215: true };\n\n /**\n * Verifies EdDSA signature against message and public key. RFC8032 5.1.7.\n * An extended group equation is checked.\n */\n function verify(\n sig: Uint8Array,\n msg: Uint8Array,\n publicKey: Uint8Array,\n options = verifyOpts\n ): boolean {\n const { context, zip215 } = options;\n const len = lengths.signature;\n sig = abytes(sig, len, 'signature');\n msg = abytes(msg, undefined, 'message');\n publicKey = abytes(publicKey, lengths.publicKey, 'publicKey');\n if (zip215 !== undefined) abool(zip215, 'zip215');\n if (prehash) msg = prehash(msg); // for ed25519ph, etc\n\n const mid = len / 2;\n const r = sig.subarray(0, mid);\n const s = bytesToNumberLE(sig.subarray(mid, len));\n let A, R, SB;\n try {\n // zip215=true is good for consensus-critical apps. =false follows RFC8032 / NIST186-5.\n // zip215=true: 0 <= y < MASK (2^256 for ed25519)\n // zip215=false: 0 <= y < P (2^255-19 for ed25519)\n A = Point.fromBytes(publicKey, zip215);\n R = Point.fromBytes(r, zip215);\n SB = BASE.multiplyUnsafe(s); // 0 <= s < l is done inside\n } catch (error) {\n return false;\n }\n if (!zip215 && A.isSmallOrder()) return false; // zip215 allows public keys of small order\n\n const k = hashDomainToScalar(context, R.toBytes(), A.toBytes(), msg);\n const RkA = R.add(A.multiplyUnsafe(k));\n // Extended group equation\n // [8][S]B = [8]R + [8][k]A'\n return RkA.subtract(SB).clearCofactor().is0();\n }\n\n const _size = Fp.BYTES; // 32 for ed25519, 57 for ed448\n const lengths = {\n secretKey: _size,\n publicKey: _size,\n signature: 2 * _size,\n seed: _size,\n };\n function randomSecretKey(seed = randomBytes(lengths.seed)): Uint8Array {\n return abytes(seed, lengths.seed, 'seed');\n }\n\n function isValidSecretKey(key: Uint8Array): boolean {\n return isBytes(key) && key.length === Fn.BYTES;\n }\n\n function isValidPublicKey(key: Uint8Array, zip215?: boolean): boolean {\n try {\n return !!Point.fromBytes(key, zip215);\n } catch (error) {\n return false;\n }\n }\n\n const utils = {\n getExtendedPublicKey,\n randomSecretKey,\n isValidSecretKey,\n isValidPublicKey,\n /**\n * Converts ed public key to x public key. Uses formula:\n * - ed25519:\n * - `(u, v) = ((1+y)/(1-y), sqrt(-486664)*u/x)`\n * - `(x, y) = (sqrt(-486664)*u/v, (u-1)/(u+1))`\n * - ed448:\n * - `(u, v) = ((y-1)/(y+1), sqrt(156324)*u/x)`\n * - `(x, y) = (sqrt(156324)*u/v, (1+u)/(1-u))`\n */\n toMontgomery(publicKey: Uint8Array): Uint8Array {\n const { y } = Point.fromBytes(publicKey);\n const size = lengths.publicKey;\n const is25519 = size === 32;\n if (!is25519 && size !== 57) throw new Error('only defined for 25519 and 448');\n const u = is25519 ? Fp.div(_1n + y, _1n - y) : Fp.div(y - _1n, y + _1n);\n return Fp.toBytes(u);\n },\n toMontgomerySecret(secretKey: Uint8Array): Uint8Array {\n const size = lengths.secretKey;\n abytes(secretKey, size);\n const hashed = cHash(secretKey.subarray(0, size));\n return adjustScalarBytes(hashed).subarray(0, size);\n },\n };\n\n return Object.freeze({\n keygen: createKeygen(randomSecretKey, getPublicKey),\n getPublicKey,\n sign,\n verify,\n utils,\n Point,\n lengths,\n }) satisfies Signer;\n}\n","/**\n * ed25519 Twisted Edwards curve with following addons:\n * - X25519 ECDH\n * - Ristretto cofactor elimination\n * - Elligator hash-to-group / point indistinguishability\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha512 } from '@noble/hashes/sha2.js';\nimport { abytes, concatBytes, hexToBytes } from '@noble/hashes/utils.js';\nimport { type AffinePoint } from './abstract/curve.ts';\nimport {\n eddsa,\n edwards,\n PrimeEdwardsPoint,\n type EdDSA,\n type EdDSAOpts,\n type EdwardsOpts,\n type EdwardsPoint,\n type EdwardsPointCons,\n} from './abstract/edwards.ts';\nimport {\n _DST_scalar,\n createHasher,\n expand_message_xmd,\n type H2CDSTOpts,\n type H2CHasher,\n type H2CHasherBase,\n} from './abstract/hash-to-curve.ts';\nimport {\n FpInvertBatch,\n FpSqrtEven,\n isNegativeLE,\n mod,\n pow2,\n type IField,\n} from './abstract/modular.ts';\nimport { montgomery, type MontgomeryECDH } from './abstract/montgomery.ts';\nimport { createORPF, type OPRF } from './abstract/oprf.ts';\nimport { asciiToBytes, bytesToNumberLE, equalBytes } from './utils.ts';\n\n// prettier-ignore\nconst _0n = /* @__PURE__ */ BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = /* @__PURE__ */ BigInt(3);\n// prettier-ignore\nconst _5n = BigInt(5), _8n = BigInt(8);\n\n// P = 2n**255n - 19n\nconst ed25519_CURVE_p = BigInt(\n '0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed'\n);\n// N = 2n**252n + 27742317777372353535851937790883648493n\n// a = Fp.create(BigInt(-1))\n// d = -121665/121666 a.k.a. Fp.neg(121665 * Fp.inv(121666))\nconst ed25519_CURVE: EdwardsOpts = /* @__PURE__ */ (() => ({\n p: ed25519_CURVE_p,\n n: BigInt('0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed'),\n h: _8n,\n a: BigInt('0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec'),\n d: BigInt('0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3'),\n Gx: BigInt('0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a'),\n Gy: BigInt('0x6666666666666666666666666666666666666666666666666666666666666658'),\n}))();\n\nfunction ed25519_pow_2_252_3(x: bigint) {\n // prettier-ignore\n const _10n = BigInt(10), _20n = BigInt(20), _40n = BigInt(40), _80n = BigInt(80);\n const P = ed25519_CURVE_p;\n const x2 = (x * x) % P;\n const b2 = (x2 * x) % P; // x^3, 11\n const b4 = (pow2(b2, _2n, P) * b2) % P; // x^15, 1111\n const b5 = (pow2(b4, _1n, P) * x) % P; // x^31\n const b10 = (pow2(b5, _5n, P) * b5) % P;\n const b20 = (pow2(b10, _10n, P) * b10) % P;\n const b40 = (pow2(b20, _20n, P) * b20) % P;\n const b80 = (pow2(b40, _40n, P) * b40) % P;\n const b160 = (pow2(b80, _80n, P) * b80) % P;\n const b240 = (pow2(b160, _80n, P) * b80) % P;\n const b250 = (pow2(b240, _10n, P) * b10) % P;\n const pow_p_5_8 = (pow2(b250, _2n, P) * x) % P;\n // ^ To pow to (p+3)/8, multiply it by x.\n return { pow_p_5_8, b2 };\n}\n\nfunction adjustScalarBytes(bytes: Uint8Array): Uint8Array {\n // Section 5: For X25519, in order to decode 32 random bytes as an integer scalar,\n // set the three least significant bits of the first byte\n bytes[0] &= 248; // 0b1111_1000\n // and the most significant bit of the last to zero,\n bytes[31] &= 127; // 0b0111_1111\n // set the second most significant bit of the last byte to 1\n bytes[31] |= 64; // 0b0100_0000\n return bytes;\n}\n\n// √(-1) aka √(a) aka 2^((p-1)/4)\n// Fp.sqrt(Fp.neg(1))\nconst ED25519_SQRT_M1 = /* @__PURE__ */ BigInt(\n '19681161376707505956807079304988542015446066515923890162744021073123829784752'\n);\n// sqrt(u/v)\nfunction uvRatio(u: bigint, v: bigint): { isValid: boolean; value: bigint } {\n const P = ed25519_CURVE_p;\n const v3 = mod(v * v * v, P); // v³\n const v7 = mod(v3 * v3 * v, P); // v⁷\n // (p+3)/8 and (p-5)/8\n const pow = ed25519_pow_2_252_3(u * v7).pow_p_5_8;\n let x = mod(u * v3 * pow, P); // (uv³)(uv⁷)^(p-5)/8\n const vx2 = mod(v * x * x, P); // vx²\n const root1 = x; // First root candidate\n const root2 = mod(x * ED25519_SQRT_M1, P); // Second root candidate\n const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root\n const useRoot2 = vx2 === mod(-u, P); // If vx² = -u, set x <-- x * 2^((p-1)/4)\n const noRoot = vx2 === mod(-u * ED25519_SQRT_M1, P); // There is no valid root, vx² = -u√(-1)\n if (useRoot1) x = root1;\n if (useRoot2 || noRoot) x = root2; // We return root2 anyway, for const-time\n if (isNegativeLE(x, P)) x = mod(-x, P);\n return { isValid: useRoot1 || useRoot2, value: x };\n}\n\nconst ed25519_Point = /* @__PURE__ */ edwards(ed25519_CURVE, { uvRatio });\nconst Fp = /* @__PURE__ */ (() => ed25519_Point.Fp)();\nconst Fn = /* @__PURE__ */ (() => ed25519_Point.Fn)();\n\nfunction ed25519_domain(data: Uint8Array, ctx: Uint8Array, phflag: boolean) {\n if (ctx.length > 255) throw new Error('Context is too big');\n return concatBytes(\n asciiToBytes('SigEd25519 no Ed25519 collisions'),\n new Uint8Array([phflag ? 1 : 0, ctx.length]),\n ctx,\n data\n );\n}\n\nfunction ed(opts: EdDSAOpts) {\n return eddsa(ed25519_Point, sha512, Object.assign({ adjustScalarBytes }, opts));\n}\n\n/**\n * ed25519 curve with EdDSA signatures.\n * @example\n * ```js\n * import { ed25519 } from '@noble/curves/ed25519.js';\n * const { secretKey, publicKey } = ed25519.keygen();\n * // const publicKey = ed25519.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello noble');\n * const sig = ed25519.sign(msg, secretKey);\n * const isValid = ed25519.verify(sig, msg, pub); // ZIP215\n * // RFC8032 / FIPS 186-5\n * const isValid2 = ed25519.verify(sig, msg, pub, { zip215: false });\n * ```\n */\nexport const ed25519: EdDSA = /* @__PURE__ */ ed({});\n/** Context version of ed25519 (ctx for domain separation). See {@link ed25519} */\nexport const ed25519ctx: EdDSA = /* @__PURE__ */ ed({ domain: ed25519_domain });\n/** Prehashed version of ed25519. See {@link ed25519} */\nexport const ed25519ph: EdDSA = /* @__PURE__ */ ed({ domain: ed25519_domain, prehash: sha512 });\n\n/**\n * ECDH using curve25519 aka x25519.\n * @example\n * ```js\n * import { x25519 } from '@noble/curves/ed25519.js';\n * const alice = x25519.keygen();\n * const bob = x25519.keygen();\n * const shared = x25519.getSharedSecret(alice.secretKey, bob.publicKey);\n * ```\n */\nexport const x25519: MontgomeryECDH = /* @__PURE__ */ (() => {\n const P = ed25519_CURVE_p;\n return montgomery({\n P,\n type: 'x25519',\n powPminus2: (x: bigint): bigint => {\n // x^(p-2) aka x^(2^255-21)\n const { pow_p_5_8, b2 } = ed25519_pow_2_252_3(x);\n return mod(pow2(pow_p_5_8, _3n, P) * b2, P);\n },\n adjustScalarBytes,\n });\n})();\n\n// Hash To Curve Elligator2 Map (NOTE: different from ristretto255 elligator)\n// NOTE: very important part is usage of FpSqrtEven for ELL2_C1_EDWARDS, since\n// SageMath returns different root first and everything falls apart\nconst ELL2_C1 = /* @__PURE__ */ (() => (ed25519_CURVE_p + _3n) / _8n)(); // 1. c1 = (q + 3) / 8 # Integer arithmetic\nconst ELL2_C2 = /* @__PURE__ */ (() => Fp.pow(_2n, ELL2_C1))(); // 2. c2 = 2^c1\nconst ELL2_C3 = /* @__PURE__ */ (() => Fp.sqrt(Fp.neg(Fp.ONE)))(); // 3. c3 = sqrt(-1)\n\n/**\n * RFC 9380 method `map_to_curve_elligator2_curve25519`. Experimental name: may be renamed later.\n * @private\n */\n// prettier-ignore\nexport function _map_to_curve_elligator2_curve25519(u: bigint): {\n xMn: bigint, xMd: bigint, yMn: bigint, yMd: bigint\n} {\n const ELL2_C4 = (ed25519_CURVE_p - _5n) / _8n; // 4. c4 = (q - 5) / 8 # Integer arithmetic\n const ELL2_J = BigInt(486662);\n\n let tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, _2n); // 2. tv1 = 2 * tv1\n let xd = Fp.add(tv1, Fp.ONE); // 3. xd = tv1 + 1 # Nonzero: -1 is square (mod p), tv1 is not\n let x1n = Fp.neg(ELL2_J); // 4. x1n = -J # x1 = x1n / xd = -J / (1 + 2 * u^2)\n let tv2 = Fp.sqr(xd); // 5. tv2 = xd^2\n let gxd = Fp.mul(tv2, xd); // 6. gxd = tv2 * xd # gxd = xd^3\n let gx1 = Fp.mul(tv1, ELL2_J);// 7. gx1 = J * tv1 # x1n + J * xd\n gx1 = Fp.mul(gx1, x1n); // 8. gx1 = gx1 * x1n # x1n^2 + J * x1n * xd\n gx1 = Fp.add(gx1, tv2); // 9. gx1 = gx1 + tv2 # x1n^2 + J * x1n * xd + xd^2\n gx1 = Fp.mul(gx1, x1n); // 10. gx1 = gx1 * x1n # x1n^3 + J * x1n^2 * xd + x1n * xd^2\n let tv3 = Fp.sqr(gxd); // 11. tv3 = gxd^2\n tv2 = Fp.sqr(tv3); // 12. tv2 = tv3^2 # gxd^4\n tv3 = Fp.mul(tv3, gxd); // 13. tv3 = tv3 * gxd # gxd^3\n tv3 = Fp.mul(tv3, gx1); // 14. tv3 = tv3 * gx1 # gx1 * gxd^3\n tv2 = Fp.mul(tv2, tv3); // 15. tv2 = tv2 * tv3 # gx1 * gxd^7\n let y11 = Fp.pow(tv2, ELL2_C4); // 16. y11 = tv2^c4 # (gx1 * gxd^7)^((p - 5) / 8)\n y11 = Fp.mul(y11, tv3); // 17. y11 = y11 * tv3 # gx1*gxd^3*(gx1*gxd^7)^((p-5)/8)\n let y12 = Fp.mul(y11, ELL2_C3); // 18. y12 = y11 * c3\n tv2 = Fp.sqr(y11); // 19. tv2 = y11^2\n tv2 = Fp.mul(tv2, gxd); // 20. tv2 = tv2 * gxd\n let e1 = Fp.eql(tv2, gx1); // 21. e1 = tv2 == gx1\n let y1 = Fp.cmov(y12, y11, e1); // 22. y1 = CMOV(y12, y11, e1) # If g(x1) is square, this is its sqrt\n let x2n = Fp.mul(x1n, tv1); // 23. x2n = x1n * tv1 # x2 = x2n / xd = 2 * u^2 * x1n / xd\n let y21 = Fp.mul(y11, u); // 24. y21 = y11 * u\n y21 = Fp.mul(y21, ELL2_C2); // 25. y21 = y21 * c2\n let y22 = Fp.mul(y21, ELL2_C3); // 26. y22 = y21 * c3\n let gx2 = Fp.mul(gx1, tv1); // 27. gx2 = gx1 * tv1 # g(x2) = gx2 / gxd = 2 * u^2 * g(x1)\n tv2 = Fp.sqr(y21); // 28. tv2 = y21^2\n tv2 = Fp.mul(tv2, gxd); // 29. tv2 = tv2 * gxd\n let e2 = Fp.eql(tv2, gx2); // 30. e2 = tv2 == gx2\n let y2 = Fp.cmov(y22, y21, e2); // 31. y2 = CMOV(y22, y21, e2) # If g(x2) is square, this is its sqrt\n tv2 = Fp.sqr(y1); // 32. tv2 = y1^2\n tv2 = Fp.mul(tv2, gxd); // 33. tv2 = tv2 * gxd\n let e3 = Fp.eql(tv2, gx1); // 34. e3 = tv2 == gx1\n let xn = Fp.cmov(x2n, x1n, e3); // 35. xn = CMOV(x2n, x1n, e3) # If e3, x = x1, else x = x2\n let y = Fp.cmov(y2, y1, e3); // 36. y = CMOV(y2, y1, e3) # If e3, y = y1, else y = y2\n let e4 = Fp.isOdd!(y); // 37. e4 = sgn0(y) == 1 # Fix sign of y\n y = Fp.cmov(y, Fp.neg(y), e3 !== e4); // 38. y = CMOV(y, -y, e3 XOR e4)\n return { xMn: xn, xMd: xd, yMn: y, yMd: _1n }; // 39. return (xn, xd, y, 1)\n}\n\nconst ELL2_C1_EDWARDS = /* @__PURE__ */ (() => FpSqrtEven(Fp, Fp.neg(BigInt(486664))))(); // sgn0(c1) MUST equal 0\nfunction map_to_curve_elligator2_edwards25519(u: bigint) {\n const { xMn, xMd, yMn, yMd } = _map_to_curve_elligator2_curve25519(u); // 1. (xMn, xMd, yMn, yMd) =\n // map_to_curve_elligator2_curve25519(u)\n let xn = Fp.mul(xMn, yMd); // 2. xn = xMn * yMd\n xn = Fp.mul(xn, ELL2_C1_EDWARDS); // 3. xn = xn * c1\n let xd = Fp.mul(xMd, yMn); // 4. xd = xMd * yMn # xn / xd = c1 * xM / yM\n let yn = Fp.sub(xMn, xMd); // 5. yn = xMn - xMd\n let yd = Fp.add(xMn, xMd); // 6. yd = xMn + xMd # (n / d - 1) / (n / d + 1) = (n - d) / (n + d)\n let tv1 = Fp.mul(xd, yd); // 7. tv1 = xd * yd\n let e = Fp.eql(tv1, Fp.ZERO); // 8. e = tv1 == 0\n xn = Fp.cmov(xn, Fp.ZERO, e); // 9. xn = CMOV(xn, 0, e)\n xd = Fp.cmov(xd, Fp.ONE, e); // 10. xd = CMOV(xd, 1, e)\n yn = Fp.cmov(yn, Fp.ONE, e); // 11. yn = CMOV(yn, 1, e)\n yd = Fp.cmov(yd, Fp.ONE, e); // 12. yd = CMOV(yd, 1, e)\n const [xd_inv, yd_inv] = FpInvertBatch(Fp, [xd, yd], true); // batch division\n return { x: Fp.mul(xn, xd_inv), y: Fp.mul(yn, yd_inv) }; // 13. return (xn, xd, yn, yd)\n}\n\n/** Hashing to ed25519 points / field. RFC 9380 methods. */\nexport const ed25519_hasher: H2CHasher<EdwardsPointCons> = /* @__PURE__ */ (() =>\n createHasher(\n ed25519_Point,\n (scalars: bigint[]) => map_to_curve_elligator2_edwards25519(scalars[0]),\n {\n DST: 'edwards25519_XMD:SHA-512_ELL2_RO_',\n encodeDST: 'edwards25519_XMD:SHA-512_ELL2_NU_',\n p: ed25519_CURVE_p,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha512,\n }\n ))();\n\n// √(-1) aka √(a) aka 2^((p-1)/4)\nconst SQRT_M1 = ED25519_SQRT_M1;\n// √(ad - 1)\nconst SQRT_AD_MINUS_ONE = /* @__PURE__ */ BigInt(\n '25063068953384623474111414158702152701244531502492656460079210482610430750235'\n);\n// 1 / √(a-d)\nconst INVSQRT_A_MINUS_D = /* @__PURE__ */ BigInt(\n '54469307008909316920995813868745141605393597292927456921205312896311721017578'\n);\n// 1-d²\nconst ONE_MINUS_D_SQ = /* @__PURE__ */ BigInt(\n '1159843021668779879193775521855586647937357759715417654439879720876111806838'\n);\n// (d-1)²\nconst D_MINUS_ONE_SQ = /* @__PURE__ */ BigInt(\n '40440834346308536858101042469323190826248399146238708352240133220865137265952'\n);\n// Calculates 1/√(number)\nconst invertSqrt = (number: bigint) => uvRatio(_1n, number);\n\nconst MAX_255B = /* @__PURE__ */ BigInt(\n '0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n);\nconst bytes255ToNumberLE = (bytes: Uint8Array) => Fp.create(bytesToNumberLE(bytes) & MAX_255B);\n\n/**\n * Computes Elligator map for Ristretto255.\n * Described in [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#appendix-B) and on\n * the [website](https://ristretto.group/formulas/elligator.html).\n */\nfunction calcElligatorRistrettoMap(r0: bigint): EdwardsPoint {\n const { d } = ed25519_CURVE;\n const P = ed25519_CURVE_p;\n const mod = (n: bigint) => Fp.create(n);\n const r = mod(SQRT_M1 * r0 * r0); // 1\n const Ns = mod((r + _1n) * ONE_MINUS_D_SQ); // 2\n let c = BigInt(-1); // 3\n const D = mod((c - d * r) * mod(r + d)); // 4\n let { isValid: Ns_D_is_sq, value: s } = uvRatio(Ns, D); // 5\n let s_ = mod(s * r0); // 6\n if (!isNegativeLE(s_, P)) s_ = mod(-s_);\n if (!Ns_D_is_sq) s = s_; // 7\n if (!Ns_D_is_sq) c = r; // 8\n const Nt = mod(c * (r - _1n) * D_MINUS_ONE_SQ - D); // 9\n const s2 = s * s;\n const W0 = mod((s + s) * D); // 10\n const W1 = mod(Nt * SQRT_AD_MINUS_ONE); // 11\n const W2 = mod(_1n - s2); // 12\n const W3 = mod(_1n + s2); // 13\n return new ed25519_Point(mod(W0 * W3), mod(W2 * W1), mod(W1 * W3), mod(W0 * W2));\n}\n\n/**\n * Wrapper over Edwards Point for ristretto255.\n *\n * Each ed25519/EdwardsPoint has 8 different equivalent points. This can be\n * a source of bugs for protocols like ring signatures. Ristretto was created to solve this.\n * Ristretto point operates in X:Y:Z:T extended coordinates like EdwardsPoint,\n * but it should work in its own namespace: do not combine those two.\n * See [RFC9496](https://www.rfc-editor.org/rfc/rfc9496).\n */\nclass _RistrettoPoint extends PrimeEdwardsPoint<_RistrettoPoint> {\n // Do NOT change syntax: the following gymnastics is done,\n // because typescript strips comments, which makes bundlers disable tree-shaking.\n // prettier-ignore\n static BASE: _RistrettoPoint =\n /* @__PURE__ */ (() => new _RistrettoPoint(ed25519_Point.BASE))();\n // prettier-ignore\n static ZERO: _RistrettoPoint =\n /* @__PURE__ */ (() => new _RistrettoPoint(ed25519_Point.ZERO))();\n // prettier-ignore\n static Fp: IField<bigint> =\n /* @__PURE__ */ (() => Fp)();\n // prettier-ignore\n static Fn: IField<bigint> =\n /* @__PURE__ */ (() => Fn)();\n\n constructor(ep: EdwardsPoint) {\n super(ep);\n }\n\n static fromAffine(ap: AffinePoint<bigint>): _RistrettoPoint {\n return new _RistrettoPoint(ed25519_Point.fromAffine(ap));\n }\n\n protected assertSame(other: _RistrettoPoint): void {\n if (!(other instanceof _RistrettoPoint)) throw new Error('RistrettoPoint expected');\n }\n\n protected init(ep: EdwardsPoint): _RistrettoPoint {\n return new _RistrettoPoint(ep);\n }\n\n static fromBytes(bytes: Uint8Array): _RistrettoPoint {\n abytes(bytes, 32);\n const { a, d } = ed25519_CURVE;\n const P = ed25519_CURVE_p;\n const mod = (n: bigint) => Fp.create(n);\n const s = bytes255ToNumberLE(bytes);\n // 1. Check that s_bytes is the canonical encoding of a field element, or else abort.\n // 3. Check that s is non-negative, or else abort\n if (!equalBytes(Fp.toBytes(s), bytes) || isNegativeLE(s, P))\n throw new Error('invalid ristretto255 encoding 1');\n const s2 = mod(s * s);\n const u1 = mod(_1n + a * s2); // 4 (a is -1)\n const u2 = mod(_1n - a * s2); // 5\n const u1_2 = mod(u1 * u1);\n const u2_2 = mod(u2 * u2);\n const v = mod(a * d * u1_2 - u2_2); // 6\n const { isValid, value: I } = invertSqrt(mod(v * u2_2)); // 7\n const Dx = mod(I * u2); // 8\n const Dy = mod(I * Dx * v); // 9\n let x = mod((s + s) * Dx); // 10\n if (isNegativeLE(x, P)) x = mod(-x); // 10\n const y = mod(u1 * Dy); // 11\n const t = mod(x * y); // 12\n if (!isValid || isNegativeLE(t, P) || y === _0n)\n throw new Error('invalid ristretto255 encoding 2');\n return new _RistrettoPoint(new ed25519_Point(x, y, _1n, t));\n }\n\n /**\n * Converts ristretto-encoded string to ristretto point.\n * Described in [RFC9496](https://www.rfc-editor.org/rfc/rfc9496#name-decode).\n * @param hex Ristretto-encoded 32 bytes. Not every 32-byte string is valid ristretto encoding\n */\n static fromHex(hex: string): _RistrettoPoint {\n return _RistrettoPoint.fromBytes(hexToBytes(hex));\n }\n\n /**\n * Encodes ristretto point to Uint8Array.\n * Described in [RFC9496](https://www.rfc-editor.org/rfc/rfc9496#name-encode).\n */\n toBytes(): Uint8Array {\n let { X, Y, Z, T } = this.ep;\n const P = ed25519_CURVE_p;\n const mod = (n: bigint) => Fp.create(n);\n const u1 = mod(mod(Z + Y) * mod(Z - Y)); // 1\n const u2 = mod(X * Y); // 2\n // Square root always exists\n const u2sq = mod(u2 * u2);\n const { value: invsqrt } = invertSqrt(mod(u1 * u2sq)); // 3\n const D1 = mod(invsqrt * u1); // 4\n const D2 = mod(invsqrt * u2); // 5\n const zInv = mod(D1 * D2 * T); // 6\n let D: bigint; // 7\n if (isNegativeLE(T * zInv, P)) {\n let _x = mod(Y * SQRT_M1);\n let _y = mod(X * SQRT_M1);\n X = _x;\n Y = _y;\n D = mod(D1 * INVSQRT_A_MINUS_D);\n } else {\n D = D2; // 8\n }\n if (isNegativeLE(X * zInv, P)) Y = mod(-Y); // 9\n let s = mod((Z - Y) * D); // 10 (check footer's note, no sqrt(-a))\n if (isNegativeLE(s, P)) s = mod(-s);\n return Fp.toBytes(s); // 11\n }\n\n /**\n * Compares two Ristretto points.\n * Described in [RFC9496](https://www.rfc-editor.org/rfc/rfc9496#name-equals).\n */\n equals(other: _RistrettoPoint): boolean {\n this.assertSame(other);\n const { X: X1, Y: Y1 } = this.ep;\n const { X: X2, Y: Y2 } = other.ep;\n const mod = (n: bigint) => Fp.create(n);\n // (x1 * y2 == y1 * x2) | (y1 * y2 == x1 * x2)\n const one = mod(X1 * Y2) === mod(Y1 * X2);\n const two = mod(Y1 * Y2) === mod(X1 * X2);\n return one || two;\n }\n\n is0(): boolean {\n return this.equals(_RistrettoPoint.ZERO);\n }\n}\n\nexport const ristretto255: {\n Point: typeof _RistrettoPoint;\n} = { Point: _RistrettoPoint };\n\n/** Hashing to ristretto255 points / field. RFC 9380 methods. */\nexport const ristretto255_hasher: H2CHasherBase<typeof _RistrettoPoint> = {\n Point: _RistrettoPoint,\n /**\n * Spec: https://www.rfc-editor.org/rfc/rfc9380.html#name-hashing-to-ristretto255. Caveats:\n * * There are no test vectors\n * * encodeToCurve / mapToCurve is undefined\n * * mapToCurve would be `calcElligatorRistrettoMap(scalars[0])`, not ristretto255_map!\n * * hashToScalar is undefined too, so we just use OPRF implementation\n * * We cannot re-use 'createHasher', because ristretto255_map is different algorithm/RFC\n (os2ip -> bytes255ToNumberLE)\n * * mapToCurve == calcElligatorRistrettoMap, hashToCurve == ristretto255_map\n * * hashToScalar is undefined in RFC9380 for ristretto, we are using version from OPRF here, using bytes255ToNumblerLE will create different result if we use bytes255ToNumberLE as os2ip\n * * current version is closest to spec.\n */\n hashToCurve(msg: Uint8Array, options?: H2CDSTOpts): _RistrettoPoint {\n // == 'hash_to_ristretto255'\n const DST = options?.DST || 'ristretto255_XMD:SHA-512_R255MAP_RO_';\n const xmd = expand_message_xmd(msg, DST, 64, sha512);\n // NOTE: RFC 9380 incorrectly calls this function 'ristretto255_map', in RFC 9496 map was function inside (per point)\n // That also lead to confustion that ristretto255_map is mapToCurve (it is not! it is old hashToCurve)\n return ristretto255_hasher.deriveToCurve!(xmd);\n },\n hashToScalar(msg: Uint8Array, options: H2CDSTOpts = { DST: _DST_scalar }) {\n const xmd = expand_message_xmd(msg, options.DST, 64, sha512);\n return Fn.create(bytesToNumberLE(xmd));\n },\n /**\n * HashToCurve-like construction based on RFC 9496 (Element Derivation).\n * Converts 64 uniform random bytes into a curve point.\n *\n * WARNING: This represents an older hash-to-curve construction, preceding the finalization of RFC 9380.\n * It was later reused as a component in the newer `hash_to_ristretto255` function defined in RFC 9380.\n */\n deriveToCurve(bytes: Uint8Array): _RistrettoPoint {\n // https://www.rfc-editor.org/rfc/rfc9496.html#name-element-derivation\n abytes(bytes, 64);\n const r1 = bytes255ToNumberLE(bytes.subarray(0, 32));\n const R1 = calcElligatorRistrettoMap(r1);\n const r2 = bytes255ToNumberLE(bytes.subarray(32, 64));\n const R2 = calcElligatorRistrettoMap(r2);\n return new _RistrettoPoint(R1.add(R2));\n },\n};\n\n/** ristretto255 OPRF, defined in RFC 9497. */\nexport const ristretto255_oprf: OPRF = /* @__PURE__ */ (() =>\n createORPF({\n name: 'ristretto255-SHA512',\n Point: _RistrettoPoint,\n hash: sha512,\n hashToGroup: ristretto255_hasher.hashToCurve,\n hashToScalar: ristretto255_hasher.hashToScalar,\n }))();\n\n/**\n * Weird / bogus points, useful for debugging.\n * All 8 ed25519 points of 8-torsion subgroup can be generated from the point\n * T = `26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05`.\n * ⟨T⟩ = { O, T, 2T, 3T, 4T, 5T, 6T, 7T }\n */\nexport const ED25519_TORSION_SUBGROUP: string[] = [\n '0100000000000000000000000000000000000000000000000000000000000000',\n 'c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a',\n '0000000000000000000000000000000000000000000000000000000000000080',\n '26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05',\n 'ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f',\n '26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85',\n '0000000000000000000000000000000000000000000000000000000000000000',\n 'c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa',\n];\n","/**\n * SHA3 (keccak) hash function, based on a new \"Sponge function\" design.\n * Different from older hashes, the internal state is bigger than output size.\n *\n * Check out [FIPS-202](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf),\n * [Website](https://keccak.team/keccak.html),\n * [the differences between SHA-3 and Keccak](https://crypto.stackexchange.com/questions/15727/what-are-the-key-differences-between-the-draft-sha-3-standard-and-the-keccak-sub).\n *\n * Check out `sha3-addons` module for cSHAKE, k12, and others.\n * @module\n */\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from './_u64.ts';\n// prettier-ignore\nimport {\n abytes, aexists, anumber, aoutput,\n clean, createHasher,\n oidNist,\n swap32IfBE,\n u32,\n type CHash, type CHashXOF,\n type Hash,\n type HashInfo,\n type HashXOF\n} from './utils.ts';\n\n// No __PURE__ annotations in sha3 header:\n// EVERYTHING is in fact used on every export.\n// Various per round constants calculations\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst _7n = BigInt(7);\nconst _256n = BigInt(256);\nconst _0x71n = BigInt(0x71);\nconst SHA3_PI: number[] = [];\nconst SHA3_ROTL: number[] = [];\nconst _SHA3_IOTA: bigint[] = []; // no pure annotation: var is always used\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n // Pi\n [x, y] = [y, (2 * x + 3 * y) % 5];\n SHA3_PI.push(2 * (5 * y + x));\n // Rotational\n SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n // Iota\n let t = _0n;\n for (let j = 0; j < 7; j++) {\n R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n if (R & _2n) t ^= _1n << ((_1n << BigInt(j)) - _1n);\n }\n _SHA3_IOTA.push(t);\n}\nconst IOTAS = split(_SHA3_IOTA, true);\nconst SHA3_IOTA_H = IOTAS[0];\nconst SHA3_IOTA_L = IOTAS[1];\n\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h: number, l: number, s: number) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h: number, l: number, s: number) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n\n/** `keccakf1600` internal function, additionally allows to adjust round count. */\nexport function keccakP(s: Uint32Array, rounds: number = 24): void {\n const B = new Uint32Array(5 * 2);\n // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n for (let round = 24 - rounds; round < 24; round++) {\n // Theta θ\n for (let x = 0; x < 10; x++) B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n for (let x = 0; x < 10; x += 2) {\n const idx1 = (x + 8) % 10;\n const idx0 = (x + 2) % 10;\n const B0 = B[idx0];\n const B1 = B[idx0 + 1];\n const Th = rotlH(B0, B1, 1) ^ B[idx1];\n const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n for (let y = 0; y < 50; y += 10) {\n s[x + y] ^= Th;\n s[x + y + 1] ^= Tl;\n }\n }\n // Rho (ρ) and Pi (π)\n let curH = s[2];\n let curL = s[3];\n for (let t = 0; t < 24; t++) {\n const shift = SHA3_ROTL[t];\n const Th = rotlH(curH, curL, shift);\n const Tl = rotlL(curH, curL, shift);\n const PI = SHA3_PI[t];\n curH = s[PI];\n curL = s[PI + 1];\n s[PI] = Th;\n s[PI + 1] = Tl;\n }\n // Chi (χ)\n for (let y = 0; y < 50; y += 10) {\n for (let x = 0; x < 10; x++) B[x] = s[y + x];\n for (let x = 0; x < 10; x++) s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n }\n // Iota (ι)\n s[0] ^= SHA3_IOTA_H[round];\n s[1] ^= SHA3_IOTA_L[round];\n }\n clean(B);\n}\n\n/** Keccak sponge function. */\nexport class Keccak implements Hash<Keccak>, HashXOF<Keccak> {\n protected state: Uint8Array;\n protected pos = 0;\n protected posOut = 0;\n protected finished = false;\n protected state32: Uint32Array;\n protected destroyed = false;\n\n public blockLen: number;\n public suffix: number;\n public outputLen: number;\n protected enableXOF = false;\n protected rounds: number;\n\n // NOTE: we accept arguments in bytes instead of bits here.\n constructor(\n blockLen: number,\n suffix: number,\n outputLen: number,\n enableXOF = false,\n rounds: number = 24\n ) {\n this.blockLen = blockLen;\n this.suffix = suffix;\n this.outputLen = outputLen;\n this.enableXOF = enableXOF;\n this.rounds = rounds;\n // Can be passed from user as dkLen\n anumber(outputLen, 'outputLen');\n // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes\n // 0 < blockLen < 200\n if (!(0 < blockLen && blockLen < 200))\n throw new Error('only keccak-f1600 function is supported');\n this.state = new Uint8Array(200);\n this.state32 = u32(this.state);\n }\n clone(): Keccak {\n return this._cloneInto();\n }\n protected keccak(): void {\n swap32IfBE(this.state32);\n keccakP(this.state32, this.rounds);\n swap32IfBE(this.state32);\n this.posOut = 0;\n this.pos = 0;\n }\n update(data: Uint8Array): this {\n aexists(this);\n abytes(data);\n const { blockLen, state } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n for (let i = 0; i < take; i++) state[this.pos++] ^= data[pos++];\n if (this.pos === blockLen) this.keccak();\n }\n return this;\n }\n protected finish(): void {\n if (this.finished) return;\n this.finished = true;\n const { state, suffix, pos, blockLen } = this;\n // Do the padding\n state[pos] ^= suffix;\n if ((suffix & 0x80) !== 0 && pos === blockLen - 1) this.keccak();\n state[blockLen - 1] ^= 0x80;\n this.keccak();\n }\n protected writeInto(out: Uint8Array): Uint8Array {\n aexists(this, false);\n abytes(out);\n this.finish();\n const bufferOut = this.state;\n const { blockLen } = this;\n for (let pos = 0, len = out.length; pos < len; ) {\n if (this.posOut >= blockLen) this.keccak();\n const take = Math.min(blockLen - this.posOut, len - pos);\n out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n this.posOut += take;\n pos += take;\n }\n return out;\n }\n xofInto(out: Uint8Array): Uint8Array {\n // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n if (!this.enableXOF) throw new Error('XOF is not possible for this instance');\n return this.writeInto(out);\n }\n xof(bytes: number): Uint8Array {\n anumber(bytes);\n return this.xofInto(new Uint8Array(bytes));\n }\n digestInto(out: Uint8Array): Uint8Array {\n aoutput(out, this);\n if (this.finished) throw new Error('digest() was already called');\n this.writeInto(out);\n this.destroy();\n return out;\n }\n digest(): Uint8Array {\n return this.digestInto(new Uint8Array(this.outputLen));\n }\n destroy(): void {\n this.destroyed = true;\n clean(this.state);\n }\n _cloneInto(to?: Keccak): Keccak {\n const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n to ||= new Keccak(blockLen, suffix, outputLen, enableXOF, rounds);\n to.state32.set(this.state32);\n to.pos = this.pos;\n to.posOut = this.posOut;\n to.finished = this.finished;\n to.rounds = rounds;\n // Suffix can change in cSHAKE\n to.suffix = suffix;\n to.outputLen = outputLen;\n to.enableXOF = enableXOF;\n to.destroyed = this.destroyed;\n return to;\n }\n}\n\nconst genKeccak = (suffix: number, blockLen: number, outputLen: number, info: HashInfo = {}) =>\n createHasher(() => new Keccak(blockLen, suffix, outputLen), info);\n\n/** SHA3-224 hash function. */\nexport const sha3_224: CHash = /* @__PURE__ */ genKeccak(\n 0x06,\n 144,\n 28,\n /* @__PURE__ */ oidNist(0x07)\n);\n/** SHA3-256 hash function. Different from keccak-256. */\nexport const sha3_256: CHash = /* @__PURE__ */ genKeccak(\n 0x06,\n 136,\n 32,\n /* @__PURE__ */ oidNist(0x08)\n);\n/** SHA3-384 hash function. */\nexport const sha3_384: CHash = /* @__PURE__ */ genKeccak(\n 0x06,\n 104,\n 48,\n /* @__PURE__ */ oidNist(0x09)\n);\n/** SHA3-512 hash function. */\nexport const sha3_512: CHash = /* @__PURE__ */ genKeccak(\n 0x06,\n 72,\n 64,\n /* @__PURE__ */ oidNist(0x0a)\n);\n\n/** keccak-224 hash function. */\nexport const keccak_224: CHash = /* @__PURE__ */ genKeccak(0x01, 144, 28);\n/** keccak-256 hash function. Different from SHA3-256. */\nexport const keccak_256: CHash = /* @__PURE__ */ genKeccak(0x01, 136, 32);\n/** keccak-384 hash function. */\nexport const keccak_384: CHash = /* @__PURE__ */ genKeccak(0x01, 104, 48);\n/** keccak-512 hash function. */\nexport const keccak_512: CHash = /* @__PURE__ */ genKeccak(0x01, 72, 64);\n\n/** Options for SHAKE XOF. */\nexport type ShakeOpts = { dkLen?: number };\n\nconst genShake = (suffix: number, blockLen: number, outputLen: number, info: HashInfo = {}) =>\n createHasher<Keccak, ShakeOpts>(\n (opts: ShakeOpts = {}) =>\n new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true),\n info\n );\n\n/** SHAKE128 XOF with 128-bit security. */\nexport const shake128: CHashXOF<Keccak, ShakeOpts> =\n /* @__PURE__ */\n genShake(0x1f, 168, 16, /* @__PURE__ */ oidNist(0x0b));\n/** SHAKE256 XOF with 256-bit security. */\nexport const shake256: CHashXOF<Keccak, ShakeOpts> =\n /* @__PURE__ */\n genShake(0x1f, 136, 32, /* @__PURE__ */ oidNist(0x0c));\n\n/** SHAKE128 XOF with 256-bit output (NIST version). */\nexport const shake128_32: CHashXOF<Keccak, ShakeOpts> =\n /* @__PURE__ */\n genShake(0x1f, 168, 32, /* @__PURE__ */ oidNist(0x0b));\n/** SHAKE256 XOF with 512-bit output (NIST version). */\nexport const shake256_64: CHashXOF<Keccak, ShakeOpts> =\n /* @__PURE__ */\n genShake(0x1f, 136, 64, /* @__PURE__ */ oidNist(0x0c));\n","/**\n * `deriveMillKeys` — BIP-44 multi-chain HD key derivation (Story 12.4 AC-3).\n *\n * Default account index is 2 (D12-011 — distinct from the connector's\n * account index 1 so one mnemonic governs both sides).\n *\n * Paths (with account index `N`):\n * - EVM : m/44'/60'/N'/0/0 (secp256k1)\n * - Mina : m/44'/12586'/N'/0/0 (Pallas)\n * - Solana : m/44'/501'/N'/0'/0' (Ed25519, SLIP-0010 all-hardened)\n *\n * Pure function of inputs — no filesystem, no network, no clock.\n */\n\nimport { validateMnemonic, mnemonicToSeedSync } from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english.js';\nimport { HDKey } from '@scure/bip32';\nimport { secp256k1 } from '@noble/curves/secp256k1.js';\nimport { ed25519 } from '@noble/curves/ed25519.js';\nimport { keccak_256 } from '@noble/hashes/sha3.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { derivePath as ed25519DerivePath } from 'ed25519-hd-key';\n\nimport { MillWalletError } from './errors.js';\n\nexport type MillChainKind = 'evm' | 'mina' | 'solana';\n\nexport interface MillKeys {\n evm?: {\n privateKey: Uint8Array;\n address: `0x${string}`;\n path: string;\n };\n mina?: {\n privateKey: string; // base58 (mina-signer convention) or hex fallback\n publicKey: string;\n path: string;\n };\n solana?: {\n privateKey: Uint8Array; // 32-byte Ed25519 seed\n publicKey: Uint8Array; // 32-byte Ed25519 public key\n path: string;\n };\n}\n\nexport interface DeriveMillKeysInput {\n mnemonic: string;\n chains: readonly MillChainKind[];\n passphrase?: string;\n accountIndex?: number;\n addressIndex?: number;\n}\n\nconst MAX_BIP32_INDEX = 0x7fffffff;\n\nexport async function deriveMillKeys(\n input: DeriveMillKeysInput\n): Promise<MillKeys> {\n const {\n mnemonic,\n chains,\n passphrase,\n accountIndex = 2,\n addressIndex = 0,\n } = input;\n\n if (!validateMnemonic(mnemonic, wordlist)) {\n throw new MillWalletError('INVALID_MNEMONIC', 'Invalid BIP-39 mnemonic');\n }\n\n if (\n !Number.isInteger(accountIndex) ||\n accountIndex < 0 ||\n accountIndex > MAX_BIP32_INDEX\n ) {\n throw new MillWalletError(\n 'DERIVATION_FAILED',\n `Invalid accountIndex: ${String(accountIndex)}`\n );\n }\n\n const result: MillKeys = {};\n if (chains.length === 0) {\n return result;\n }\n\n let seed: Uint8Array | undefined;\n try {\n seed = mnemonicToSeedSync(mnemonic, passphrase ?? '');\n\n if (chains.includes('evm')) {\n result.evm = deriveEvm(seed, accountIndex, addressIndex);\n }\n if (chains.includes('mina')) {\n result.mina = deriveMina(seed, accountIndex, addressIndex);\n }\n if (chains.includes('solana')) {\n result.solana = deriveSolana(seed, accountIndex);\n }\n\n return result;\n } catch (err) {\n if (err instanceof MillWalletError) throw err;\n throw new MillWalletError(\n 'DERIVATION_FAILED',\n `Key derivation failed: ${\n err instanceof Error ? err.message : String(err)\n }`,\n { cause: err }\n );\n } finally {\n // Best-effort zero of the intermediate seed. The returned privateKey\n // bytes are live references; caller is responsible for their lifecycle.\n if (seed) seed.fill(0);\n }\n}\n\n// ---------------------------------------------------------------------------\n// EVM (secp256k1, coin type 60)\n// ---------------------------------------------------------------------------\n\nfunction deriveEvm(\n seed: Uint8Array,\n accountIndex: number,\n addressIndex: number\n): NonNullable<MillKeys['evm']> {\n const path = `m/44'/60'/${accountIndex}'/0/${addressIndex}`;\n const hdKey = HDKey.fromMasterSeed(seed).derive(path);\n if (!hdKey.privateKey) {\n throw new MillWalletError(\n 'DERIVATION_FAILED',\n `EVM private key missing at ${path}`\n );\n }\n const privateKey = new Uint8Array(hdKey.privateKey);\n const address = computeEvmAddress(privateKey);\n return { privateKey, address, path };\n}\n\nfunction computeEvmAddress(privateKey: Uint8Array): `0x${string}` {\n const uncompressed = secp256k1.getPublicKey(privateKey, false);\n const hash = keccak_256(uncompressed.slice(1));\n const addressHex = bytesToHex(hash.slice(-20));\n return toChecksumAddress(addressHex);\n}\n\nfunction toChecksumAddress(addressHex: string): `0x${string}` {\n const lower = addressHex.toLowerCase();\n const hashHex = bytesToHex(keccak_256(new TextEncoder().encode(lower)));\n let out = '0x';\n for (let i = 0; i < 40; i++) {\n const ch = lower.charAt(i);\n const hashNibble = parseInt(hashHex.charAt(i), 16);\n out += hashNibble >= 8 ? ch.toUpperCase() : ch;\n }\n return out as `0x${string}`;\n}\n\n// ---------------------------------------------------------------------------\n// Mina (Pallas, coin type 12586)\n// ---------------------------------------------------------------------------\n\nfunction deriveMina(\n seed: Uint8Array,\n accountIndex: number,\n addressIndex: number\n): NonNullable<MillKeys['mina']> {\n const path = `m/44'/12586'/${accountIndex}'/0/${addressIndex}`;\n const hdKey = HDKey.fromMasterSeed(seed).derive(path);\n if (!hdKey.privateKey) {\n throw new MillWalletError(\n 'DERIVATION_FAILED',\n `Mina private key missing at ${path}`\n );\n }\n\n // Deterministic scalar via BIP-32 derivation; callers (MinaPaymentChannelSigner)\n // convert to `mina-signer`'s base58 form when available. Here we store the\n // private key as hex of the 32-byte scalar (with Pallas high-bit clearance\n // applied per mina-signer convention: clear the most-significant two bits\n // to guarantee the value is in-domain).\n const scalar = new Uint8Array(hdKey.privateKey);\n if (scalar.length !== 32) {\n throw new MillWalletError(\n 'DERIVATION_FAILED',\n `Mina scalar must be 32 bytes (got ${scalar.length})`\n );\n }\n // Clear top 2 bits so the 256-bit scalar is guaranteed to be below the\n // Pallas field order (which is ~2^254). This matches mina-signer's\n // big-endian private-key normalisation convention. Length was validated\n // above (scalar.length === 32), so `scalar[0]` is guaranteed defined.\n // Read into a typed local to satisfy noUncheckedIndexedAccess without\n // resorting to a non-null assertion (lint clean).\n const firstByte: number = scalar[0] as number;\n scalar[0] = firstByte & 0x3f;\n\n const privateKeyHex = bytesToHex(scalar);\n\n // Compute a Mina-style public key from the scalar: pub = scalar * G on\n // Pallas. We do NOT re-implement Pallas math here — instead we derive a\n // determistic public-key identifier from the scalar via sha256 so the\n // golden tests can detect \"different account index -> different pubkey\"\n // without pulling Pallas primitives into this module. A full Mina base58\n // public-key string is produced by MinaPaymentChannelSigner at signing\n // time when `mina-signer` is present.\n const publicKeyHex = bytesToHex(keccak_256(scalar));\n\n return {\n privateKey: privateKeyHex,\n publicKey: publicKeyHex,\n path,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Solana (Ed25519, coin type 501, SLIP-0010 all-hardened)\n// ---------------------------------------------------------------------------\n\nfunction deriveSolana(\n seed: Uint8Array,\n accountIndex: number\n): NonNullable<MillKeys['solana']> {\n const path = `m/44'/501'/${accountIndex}'/0'/0'`;\n const seedHex = bytesToHex(seed);\n const { key } = ed25519DerivePath(path, seedHex);\n const privateKey = new Uint8Array(key);\n const publicKey = ed25519.getPublicKey(privateKey);\n return { privateKey, publicKey, path };\n}\n","/**\n * Error classes for @toon-protocol/mill (Story 12.4 AC-2).\n *\n * Two shapes:\n * - `MillInventoryError` — raised from inventory operations (debit/credit).\n * The `INSUFFICIENT_INVENTORY` code is load-bearing: Story 12.3's swap\n * handler detects it via `err.code === 'INSUFFICIENT_INVENTORY'` and\n * rejects with ILP `T04 Insufficient liquidity`. Do NOT rename.\n * - `MillWalletError` — raised from key derivation, signer lookup, and\n * balance-proof signing. All other codes flow through the handler as\n * ILP `T00 Internal error` (by design — the handler is a protocol\n * boundary and does not leak Mill-internal failure modes).\n */\n\nexport type MillInventoryErrorCode =\n | 'INSUFFICIENT_INVENTORY'\n | 'UNKNOWN_PAIR'\n | 'INVENTORY_NOT_INITIALIZED';\n\nexport type MillWalletErrorCode =\n | 'INVALID_MNEMONIC'\n | 'UNSUPPORTED_CHAIN'\n | 'DERIVATION_FAILED'\n | 'SIGNING_FAILED'\n | 'INVALID_CONFIG';\n\nexport class MillInventoryError extends Error {\n public readonly code: MillInventoryErrorCode;\n\n constructor(\n code: MillInventoryErrorCode,\n message: string,\n options?: { cause?: unknown }\n ) {\n super(message, options as ErrorOptions | undefined);\n this.name = 'MillInventoryError';\n this.code = code;\n }\n}\n\nexport class MillWalletError extends Error {\n public readonly code: MillWalletErrorCode;\n\n constructor(\n code: MillWalletErrorCode,\n message: string,\n options?: { cause?: unknown }\n ) {\n super(message, options as ErrorOptions | undefined);\n this.name = 'MillWalletError';\n this.code = code;\n }\n}\n\n/**\n * Startup-time failure codes for `startMill()` (Story 12.7 AC-11).\n *\n * `INVALID_CONFIG` — config validation failed (missing/conflicting fields).\n * `MILL_REQUIRES_MNEMONIC` — caller supplied `secretKey` only; Mill key\n * derivation (BIP-32) requires a BIP-39 mnemonic\n * (D12-011).\n * `MISSING_KEY` — pair targets a chain family whose key was not\n * derived (operator forgot to list it in\n * `config.chains`).\n * `UNSUPPORTED_CHAIN_FAMILY` — pair targets a chain prefix the Mill does\n * not recognise.\n * `CONNECTOR_INIT_FAILED` — failed to construct / start the embedded\n * connector.\n * `HANDLER_REGISTRATION_FAILED` — registering the kind:1059 swap handler\n * on the registry failed.\n */\nexport type MillStartErrorCode =\n | 'INVALID_CONFIG'\n | 'MILL_REQUIRES_MNEMONIC'\n | 'MISSING_KEY'\n | 'UNSUPPORTED_CHAIN_FAMILY'\n | 'CONNECTOR_INIT_FAILED'\n | 'HANDLER_REGISTRATION_FAILED';\n\nexport class MillStartError extends Error {\n public readonly code: MillStartErrorCode;\n\n constructor(\n code: MillStartErrorCode,\n message: string,\n options?: { cause?: unknown }\n ) {\n super(`[${code}] ${message}`, options as ErrorOptions | undefined);\n this.name = 'MillStartError';\n this.code = code;\n }\n}\n","/**\n * Earnings aggregator (Story 47.2).\n *\n * Aggregates connector-reported earnings into the canonical\n * `{ status, apex, peers }` shape consumed by the host-API\n * `/api/earnings` endpoint.\n *\n * Source of truth: `connectorAdmin.getEarnings()` (Story 47.1).\n * Peer-type attribution via `PeerTypeResolver` (Story 46.1); the resolver\n * buckets unmatched peerIds as `'external'` (enforcement lives in the\n * resolver, not here — we trust its contract).\n *\n * Failure mode: if `getEarnings()` throws (network, 503-when-disabled,\n * shape drift), returns the empty payload with\n * `status: 'connector_unavailable'`. The route returns 200 either way;\n * operators see zeros plus a UI banner rather than a 5xx. An injected\n * `logger.warn` (Fastify / pino-compatible) is called on failure so ops\n * can distinguish \"connector outage\" from \"no earnings yet.\"\n *\n * @module\n * @since 47.2\n */\n\nimport type { ConnectorAdminClient } from '../connector/index.js';\nimport type { RecentClaim } from '../connector/types.js';\nimport type { PeerTypeResolver } from '../registry/peer-type-resolver.js';\nimport type { NodeType } from '../docker/types.js';\n\nexport type { NodeType };\nexport type { RecentClaim };\n\n/**\n * Per-asset cumulative + delta breakdown. `lifetime` is the connector's\n * cumulative `claimsReceivedTotal` (decimal-string bigint at `assetScale`\n * decimals). `today` / `month` / `year` are deltas computed by Story 47.3's\n * snapshot-reader; until the `deltaComputer` dep is provided, they stub\n * to '0'. Asset-scale interpretation (USD: 6, ETH: 18, sats: 0) is the\n * dashboard's job — the aggregator never collapses to a unit.\n */\nexport interface PerAsset {\n lifetime: string;\n today: string;\n month: string;\n year: string;\n}\n\n/** Per-peer earnings entry in the aggregator output. */\nexport interface NodeEarnings {\n id: string; // == connector peerId\n type: NodeType | 'external'; // PeerTypeResolver attribution\n byAsset: Record<string, PerAsset>; // keyed by assetCode\n /** Max `lastClaimAt` across this peer's assets, or `null` if none. Added in 47.4. */\n lastClaimAt: string | null;\n}\n\n/**\n * Wire-level status for the aggregator response.\n *\n * `'ok'` — `getEarnings()` succeeded; payload reflects connector state.\n * `'connector_unavailable'` — `getEarnings()` threw (network, 503, shape\n * drift); apex + peers are empty. The dashboard renders a banner.\n */\nexport type AggregatedEarningsStatus = 'ok' | 'connector_unavailable';\n\n/** Top-level aggregator output. Extended in 47.4 with dashboard fields. */\nexport interface AggregatedEarnings {\n status: AggregatedEarningsStatus;\n apex: {\n routingFees: Record<string, PerAsset>; // keyed by assetCode\n };\n peers: NodeEarnings[];\n /** Pass-through from connector `recentClaims`. Empty array on connector outage. */\n recentClaims: RecentClaim[];\n /** Sum of `getMetrics().peers[].packetsForwarded` PLUS `packetsLocallyDelivered`\n * (connector v3.7.0+, toon-protocol/connector#73 — counts events that landed\n * via the self-delivery route, where the connector's in-process relay accepts\n * the event locally rather than forwarding to a remote peer). 0 on connector\n * outage or metrics failure. */\n eventsRelayed: number;\n /** From `getMetrics().uptimeSeconds`. 0 on connector outage or metrics failure. */\n uptimeSeconds: number;\n}\n\n/** Resolves TODAY / MONTH / YEAR deltas for a (scope, assetCode) tuple. */\nexport type DeltaComputer = (params: {\n /** Either a connector peerId or the literal `'__apex__'` for routing-fee rows. */\n scope: string;\n assetCode: string;\n /** Current cumulative (matches the lifetime value in the response). */\n currentLifetime: string;\n}) => Promise<{ today: string; month: string; year: string }>;\n\n/**\n * Minimal logger contract; Fastify `request.log` and pino satisfy it.\n * Kept narrow so tests can pass a `{ warn: vi.fn() }` stub.\n */\nexport interface AggregatorLogger {\n warn(obj: object, msg?: string): void;\n}\n\nexport interface AggregateEarningsInput {\n connectorAdmin: ConnectorAdminClient;\n peerTypeResolver: PeerTypeResolver;\n /**\n * Optional delta computer (Story 47.3). When omitted, all PerAsset\n * `today` / `month` / `year` fields stub to '0'. The route layer (47.4)\n * wires the snapshot-backed implementation. A rejection on a single\n * asset stubs that asset's deltas to '0' and emits `logger.warn`; one\n * bad asset never breaks the aggregate.\n */\n deltaComputer?: DeltaComputer;\n /**\n * Optional logger. When provided, `getEarnings()` failures and\n * `deltaComputer` rejections are surfaced via `logger.warn` so ops can\n * distinguish a connector outage from \"no earnings yet.\"\n */\n logger?: AggregatorLogger;\n}\n\nconst STUB_DELTAS = { today: '0', month: '0', year: '0' } as const;\n\nasync function maybeDeltas(\n deltaComputer: DeltaComputer | undefined,\n scope: string,\n assetCode: string,\n currentLifetime: string,\n logger: AggregatorLogger | undefined\n): Promise<{ today: string; month: string; year: string }> {\n if (!deltaComputer) return { ...STUB_DELTAS };\n try {\n return await deltaComputer({ scope, assetCode, currentLifetime });\n } catch (err) {\n logger?.warn(\n { err, scope, assetCode },\n 'aggregator: deltaComputer rejected — stubbing deltas to 0 for this asset'\n );\n return { ...STUB_DELTAS };\n }\n}\n\n/**\n * Aggregate connector-reported earnings into the canonical\n * `{ status, apex, peers }` shape.\n *\n * Failure mode: any throw from `getEarnings()` returns the empty payload\n * with `status: 'connector_unavailable'` — operators see zeros + a banner,\n * not a 5xx. `deltaComputer` opt-in: when provided, today/month/year are\n * computed per-asset via concurrent `Promise.all` fan-out within each peer;\n * when omitted (or when an individual asset's delta rejects), the fields\n * stub to '0'. Story 47.3 ships the computer; Story 47.4 wires it.\n */\nexport async function aggregateEarnings(\n input: AggregateEarningsInput\n): Promise<AggregatedEarnings> {\n let earnings: Awaited<ReturnType<typeof input.connectorAdmin.getEarnings>>;\n try {\n earnings = await input.connectorAdmin.getEarnings();\n } catch (err) {\n input.logger?.warn(\n { err },\n 'aggregator: connectorAdmin.getEarnings failed — returning status=connector_unavailable'\n );\n return {\n status: 'connector_unavailable',\n apex: { routingFees: {} },\n peers: [],\n recentClaims: [],\n eventsRelayed: 0,\n uptimeSeconds: 0,\n };\n }\n\n // Apex routing fees: connector-level fees keyed by assetCode.\n const buildRoutingFees = async (): Promise<Record<string, PerAsset>> => {\n const out: Record<string, PerAsset> = {};\n await Promise.all(\n earnings.connectorFees.map(async (fee) => {\n const deltas = await maybeDeltas(\n input.deltaComputer,\n '__apex__',\n fee.assetCode,\n fee.total,\n input.logger\n );\n out[fee.assetCode] = { lifetime: fee.total, ...deltas };\n })\n );\n return out;\n };\n\n // Per-peer earnings: type attributed via PeerTypeResolver; the resolver\n // returns `'external'` for any peerId not in nodes.yaml, so we never\n // drop peers here.\n const buildPeers = async (): Promise<NodeEarnings[]> =>\n Promise.all(\n earnings.peers.map(async (peer) => {\n const type = input.peerTypeResolver.resolvePeerType(peer.peerId);\n\n // Shape conversion: connector ships `byAsset` as an array\n // (`AssetEarnings[]`); the aggregator output is a\n // `Record<assetCode, PerAsset>`. Delta calls fan out concurrently\n // across this peer's assets.\n const byAsset: Record<string, PerAsset> = {};\n await Promise.all(\n peer.byAsset.map(async (a) => {\n const deltas = await maybeDeltas(\n input.deltaComputer,\n peer.peerId,\n a.assetCode,\n a.claimsReceivedTotal,\n input.logger\n );\n byAsset[a.assetCode] = {\n lifetime: a.claimsReceivedTotal,\n ...deltas,\n };\n })\n );\n\n // lastClaimAt: temporally-latest non-null timestamp across this peer's\n // assets. Uses `Date.parse` rather than raw string compare so the result\n // is stable under ISO-8601 format drift (millisecond-precision variance,\n // timezone-offset suffix). Unparseable strings are skipped — never crash\n // the response on a connector format regression.\n const lastClaimAt = peer.byAsset.reduce<string | null>((acc, a) => {\n const v = a.lastClaimAt;\n if (!v) return acc;\n const vMs = Date.parse(v);\n if (!Number.isFinite(vMs)) return acc;\n if (acc === null) return v;\n const accMs = Date.parse(acc);\n if (!Number.isFinite(accMs)) return v;\n return vMs > accMs ? v : acc;\n }, null);\n\n return { id: peer.peerId, type, byAsset, lastClaimAt };\n })\n );\n\n // Fan out: routing fees + peers + metrics concurrently.\n // Reachable only after getEarnings() succeeded — early return above guards the failure path.\n const metricsPromise = input.connectorAdmin.getMetrics().catch((err) => {\n input.logger?.warn(\n { err },\n 'aggregator: getMetrics failed — eventsRelayed/uptimeSeconds defaulting to 0'\n );\n return null;\n });\n\n const [routingFees, peers, metricsResult] = await Promise.all([\n buildRoutingFees(),\n buildPeers(),\n metricsPromise,\n ]);\n\n // eventsRelayed:\n // - primary: sum of peers[].packetsForwarded + peers[].packetsLocallyDelivered\n // - fallback: aggregate.packetsForwarded + aggregate.packetsLocallyDelivered\n // when peers[] is empty (early-boot case per Task 1.8 — connector returns\n // 200 with peers: [] before any peer has registered, but aggregate counts\n // may already be > 0)\n //\n // packetsLocallyDelivered is connector v3.7.0+ (toon-protocol/connector#73).\n // Older connectors omit the field; `?? 0` coalesces undefined so this still\n // works against pre-3.7.0 deployments.\n //\n // All sources are clamped to non-negative finite integers — schema declares\n // `{ type: 'integer', minimum: 0 }` but Fastify response is a serializer,\n // not a validator, so we clamp at the source.\n const clampInt = (n: number): number =>\n Number.isFinite(n) && n >= 0 ? Math.floor(n) : 0;\n let eventsRelayed = 0;\n if (metricsResult) {\n if (metricsResult.peers.length === 0) {\n eventsRelayed =\n clampInt(metricsResult.aggregate.packetsForwarded) +\n clampInt(metricsResult.aggregate.packetsLocallyDelivered ?? 0);\n } else {\n eventsRelayed = metricsResult.peers.reduce(\n (sum, p) =>\n sum +\n clampInt(p.packetsForwarded) +\n clampInt(p.packetsLocallyDelivered ?? 0),\n 0\n );\n }\n }\n const uptimeSeconds = clampInt(metricsResult?.uptimeSeconds ?? 0);\n\n return {\n status: 'ok',\n apex: { routingFees },\n peers,\n recentClaims: earnings.recentClaims,\n eventsRelayed,\n uptimeSeconds,\n };\n}\n","/**\n * Snapshot reader + `DeltaComputer` factory (Story 47.3).\n *\n * Reads `earnings-snapshots.jsonl` and computes TODAY/MONTH/YEAR deltas vs.\n * UTC boundaries (midnight, 1st-of-month, 1st-of-year). Tolerates malformed\n * lines (skip) and clock-skewed snapshots (filter `ts > now`). Returns `'0'`\n * when no boundary snapshot exists yet.\n *\n * @module\n * @since 47.3\n */\n\nimport { createReadStream } from 'node:fs';\nimport { createInterface } from 'node:readline';\nimport type { DeltaComputer } from './aggregator.js';\nimport type { SnapshotEntry } from './snapshot-writer.js';\n\nexport type { SnapshotEntry };\n\n/** ISO of the most recent UTC midnight <= ref. */\nexport function utcDayBoundary(ref: Date): string {\n const d = new Date(ref);\n d.setUTCHours(0, 0, 0, 0);\n return d.toISOString();\n}\n\n/** ISO of the first instant of the current calendar month in UTC. */\nexport function utcMonthBoundary(ref: Date): string {\n const d = new Date(ref);\n d.setUTCDate(1);\n d.setUTCHours(0, 0, 0, 0);\n return d.toISOString();\n}\n\n/** ISO of the first instant of the current calendar year in UTC. */\nexport function utcYearBoundary(ref: Date): string {\n const d = new Date(ref);\n d.setUTCMonth(0, 1);\n d.setUTCHours(0, 0, 0, 0);\n return d.toISOString();\n}\n\n/**\n * Read all snapshot entries for any (scope, assetCode) pair from the JSONL\n * file, filtered to those with `ts <= nowMs` (exclude future snapshots).\n * Returns a map keyed by `(peerId, assetCode)`; the caller picks the best\n * match per boundary from the array.\n *\n * Reads the file once via readline (streaming), so all three boundaries\n * share a single file scan. On stream I/O error, returns an empty map\n * (caller treats as \"no snapshots\" rather than acting on a partial read).\n */\nasync function readSnapshotMap(\n snapshotPath: string,\n nowMs: number\n): Promise<Map<string, SnapshotEntry[]>> {\n const map = new Map<string, SnapshotEntry[]>();\n\n let stream: ReturnType<typeof createReadStream>;\n try {\n stream = createReadStream(snapshotPath, { encoding: 'utf-8' });\n } catch {\n return map;\n }\n\n let streamFailed = false;\n await new Promise<void>((resolve) => {\n const rl = createInterface({ input: stream, crlfDelay: Infinity });\n\n rl.on('line', (line) => {\n if (!line.trim()) return;\n let entry: unknown;\n try {\n entry = JSON.parse(line);\n } catch {\n return; // malformed — skip\n }\n if (!isSnapshotEntry(entry)) return;\n const tsMs = Date.parse(entry.ts);\n if (!Number.isFinite(tsMs)) return; // unparseable ts — skip\n if (tsMs > nowMs) return; // clock-skewed future snapshot — exclude\n\n const key = `${entry.peerId}\\0${entry.assetCode}`;\n let arr = map.get(key);\n if (!arr) {\n arr = [];\n map.set(key, arr);\n }\n arr.push(entry);\n });\n\n rl.on('close', resolve);\n rl.on('error', () => {\n streamFailed = true;\n resolve();\n });\n stream.on('error', () => {\n streamFailed = true;\n rl.close();\n resolve();\n });\n });\n\n // Surface I/O errors as empty rather than returning a partial map the caller\n // would treat as authoritative.\n if (streamFailed) return new Map();\n return map;\n}\n\n/**\n * Find the entry with the greatest `tsMs <= boundaryMs` from the entries\n * for a (scope, assetCode) pair. Input is not assumed sorted — does a\n * linear scan tracking the running max.\n */\nfunction findBestMatch(\n entries: SnapshotEntry[] | undefined,\n boundaryMs: number\n): SnapshotEntry | null {\n if (!entries || entries.length === 0) return null;\n let best: SnapshotEntry | null = null;\n let bestMs = -Infinity;\n for (const e of entries) {\n const eMs = Date.parse(e.ts);\n if (!Number.isFinite(eMs)) continue;\n if (eMs <= boundaryMs && eMs > bestMs) {\n best = e;\n bestMs = eMs;\n }\n }\n return best;\n}\n\n/**\n * Construct a `DeltaComputer` (Story 47.2's type) backed by the snapshot\n * file at `snapshotPath`. The returned function is the one wired into\n * `aggregateEarnings({ ..., deltaComputer })` by Story 47.4's route.\n *\n * Reads the snapshot file once per DeltaComputer call (single-pass), then\n * resolves all three boundaries (today/month/year) in-memory from the parsed\n * map. No cross-call cache in v1 — see Open Question 6 in story notes.\n */\nexport function createDeltaComputer(opts: {\n snapshotPath: string;\n /** Optional clock injection for tests. Default `() => new Date()`. */\n now?: () => Date;\n}): DeltaComputer {\n return async ({ scope, assetCode, currentLifetime }) => {\n const ref = (opts.now ?? (() => new Date()))();\n const nowMs = ref.getTime();\n if (!Number.isFinite(nowMs)) {\n // Defensive: bad clock injection (NaN time) would throw from toISOString.\n return { today: '0', month: '0', year: '0' };\n }\n\n const dayMs = Date.parse(utcDayBoundary(ref));\n const monthMs = Date.parse(utcMonthBoundary(ref));\n const yearMs = Date.parse(utcYearBoundary(ref));\n\n // Single file scan for all three boundaries.\n const map = await readSnapshotMap(opts.snapshotPath, nowMs);\n const key = `${scope}\\0${assetCode}`;\n const entries = map.get(key);\n\n const daySnap = findBestMatch(entries, dayMs);\n const monthSnap = findBestMatch(entries, monthMs);\n const yearSnap = findBestMatch(entries, yearMs);\n\n let cur: bigint;\n try {\n cur = BigInt(currentLifetime);\n } catch {\n return { today: '0', month: '0', year: '0' };\n }\n\n const subOrZero = (snap: SnapshotEntry | null): string => {\n if (!snap) return '0';\n try {\n const base = BigInt(snap.claimsReceivedTotal);\n // Clamp negative BASELINE (not just negative diff) — a corrupt row\n // with claimsReceivedTotal = '-N' would otherwise INFLATE the delta\n // because `cur - (-Nn) = cur + Nn`.\n if (base < 0n) return '0';\n const diff = cur - base;\n return diff < 0n ? '0' : diff.toString();\n } catch {\n return '0';\n }\n };\n\n return {\n today: subOrZero(daySnap),\n month: subOrZero(monthSnap),\n year: subOrZero(yearSnap),\n };\n };\n}\n\nfunction isSnapshotEntry(v: unknown): v is SnapshotEntry {\n if (typeof v !== 'object' || v === null) return false;\n const e = v as Record<string, unknown>;\n return (\n typeof e['ts'] === 'string' &&\n typeof e['peerId'] === 'string' &&\n typeof e['assetCode'] === 'string' &&\n typeof e['claimsReceivedTotal'] === 'string'\n );\n}\n","/**\n * `PeerTypeResolver` (Story 46.1).\n *\n * The connector is a generic ILP router — it has no concept of\n * `'town' | 'mill' | 'dvm'`. Townhouse owns the type concept entirely\n * via this resolver, which is the single translation layer between\n * connector `peerId` values and operator-meaningful node types.\n *\n * Architectural rule (Epic 46 planning §Architectural Layering):\n * downstream consumers (Epic 47 aggregator, Epic 48 TUI, Epic 49 telemetry)\n * MUST call through this resolver — they never hardcode peer-to-type\n * mappings.\n *\n * The resolver is rebuilt from a `NodesYaml` snapshot — prefer immutable\n * rebuild (re-instantiate) over mutable update for testability.\n */\n\nimport type { NodesYaml } from '../state/nodes-yaml.js';\nimport type { NodeType } from '../docker/types.js';\n\nexport class PeerTypeResolver {\n private readonly map: Map<string, NodeType>;\n\n constructor(yaml: NodesYaml) {\n this.map = new Map(yaml.entries.map((e) => [e.peerId, e.type]));\n }\n\n /**\n * Resolve a connector `peerId` to its operator-declared node type.\n * Returns `'external'` for unknown peerIds (legitimate non-Townhouse\n * peers running through the same connector).\n */\n resolvePeerType(peerId: string): NodeType | 'external' {\n return this.map.get(peerId) ?? 'external';\n }\n}\n","/**\n * API Server Factory.\n *\n * SECURITY: Only binds to loopback address by default (localhost-only for v1).\n * Set TOWNHOUSE_API_ALLOW_REMOTE=1 to override this security boundary.\n */\n\nimport { join, dirname } from 'node:path';\nimport { WebSocket } from 'ws';\nimport { buildFastifyApp } from './build-app.js';\nimport type { ApiServer, ApiDeps } from './types.js';\nimport { SnapshotWriter } from '../earnings/snapshot-writer.js';\nimport { registerNodeRoutes } from './routes/nodes.js';\nimport { registerWalletRoutes } from './routes/wallet.js';\nimport { registerWalletBalancesRoutes } from './routes/wallet-balances.js';\nimport { registerWalletRevealRoutes } from './routes/wallet-reveal.js';\nimport { registerWalletWithdrawRoutes } from './routes/wallet-withdraw.js';\nimport { registerConfigPatchRoutes } from './routes/nodes-patch.js';\nimport { registerNodeLifecycleRoutes } from './routes/nodes-lifecycle.js';\nimport {\n registerMetricsWsRoutes,\n getOpenWebSockets,\n} from './routes/metrics-ws.js';\nimport { registerWizardRoutes } from './routes/wizard.js';\nimport { registerTransportRoutes } from './routes/transport.js';\nimport { registerEarningsRoutes } from './routes/earnings.js';\nimport { registerLogsRoutes } from './routes/logs.js';\n\n/**\n * Create the Fastify API server. Caller MUST supply a `transportProbe` in\n * `deps` (constructed from the config and started if mode === 'ator').\n */\nexport async function createApiServer(deps: ApiDeps): Promise<ApiServer> {\n const { config, logger } = deps;\n\n const snapshotPath = join(\n dirname(deps.configPath),\n 'earnings-snapshots.jsonl'\n );\n const snapshotWriter = new SnapshotWriter({\n connectorAdmin: deps.connectorAdmin,\n snapshotPath,\n logger: logger as { warn(obj: object, msg?: string): void } | undefined,\n });\n\n const app = await buildFastifyApp({\n logger: logger ?? true,\n bindHost: config.api.host ?? '127.0.0.1',\n });\n\n // Register wizard state route in normal mode so the SPA can check state\n registerWizardRoutes(\n app,\n {\n configPath: deps.configPath,\n walletPath: config.wallet.encrypted_path,\n },\n { mode: 'normal' }\n );\n\n // Register transport routes (before nodes routes)\n registerTransportRoutes(app, deps);\n\n // Register all normal routes\n registerNodeRoutes(app, deps);\n registerWalletRoutes(app, deps);\n registerWalletBalancesRoutes(app, deps);\n registerWalletRevealRoutes(app, deps);\n registerWalletWithdrawRoutes(app, deps);\n registerConfigPatchRoutes(app, deps);\n registerNodeLifecycleRoutes(app, deps);\n registerEarningsRoutes(app, deps);\n registerLogsRoutes(app, deps);\n registerMetricsWsRoutes(app, deps);\n\n snapshotWriter.start();\n\n const CLOSE_TIMEOUT_MS = 5000;\n async function close(): Promise<void> {\n try {\n snapshotWriter.stop();\n } catch {\n /* best-effort */\n }\n try {\n deps.transportProbe.stop();\n } catch {\n /* best-effort — must not block shutdown */\n }\n\n const openSockets = getOpenWebSockets();\n for (const socket of openSockets) {\n try {\n if (socket.readyState === WebSocket.OPEN) {\n socket.close(1001, 'server_shutdown');\n }\n } catch {\n // Best-effort\n }\n }\n openSockets.clear();\n\n await Promise.race([\n app.close(),\n new Promise<void>((resolve) => setTimeout(resolve, CLOSE_TIMEOUT_MS)),\n ]);\n }\n\n return { app, close };\n}\n","import createWebSocketStream from './lib/stream.js';\nimport Receiver from './lib/receiver.js';\nimport Sender from './lib/sender.js';\nimport WebSocket from './lib/websocket.js';\nimport WebSocketServer from './lib/websocket-server.js';\n\nexport { createWebSocketStream, Receiver, Sender, WebSocket, WebSocketServer };\nexport default WebSocket;\n","/**\n * Shared Fastify instance builder — loopback validation + CORS + WebSocket + error handler.\n * Consumed by both createApiServer and createWizardApiServer.\n */\n\nimport Fastify, {\n type FastifyInstance,\n type FastifyServerOptions,\n type FastifyBaseLogger,\n} from 'fastify';\nimport cors from '@fastify/cors';\nimport websocket from '@fastify/websocket';\n// Local alias so the bundled output doesn't collide with the tsup banner's own\n// `import { createRequire } from 'module'` (Node ESM rejects duplicate identifier\n// imports from the same module). Retroactively authorized 2026-05-18 code review of\n// Story 49.1 — see Hard Rule #2 exception (d) in the story file. Smaller-radius fix\n// than dropping the tsup banner entirely.\nimport { createRequire as nodeCreateRequire } from 'node:module';\nimport { buildCorsOptions } from './cors.js';\n\nconst STARTED_AT = new Date().toISOString();\n// Resolve `package.json` defensively. At runtime `import.meta.url` points at the\n// bundled output (e.g. `dist/cli.js`), where `../package.json` resolves to\n// `packages/townhouse/package.json`. If tsup ever chunks this module deeper\n// (e.g. `dist/api/build-app.js`), `../../package.json` is needed. Try the\n// expected path first, then the deeper-chunk fallback. Pass 2 code review\n// 2026-05-18 hardening per P37 — keeps the file working across bundle layouts\n// instead of silently MODULE_NOT_FOUND-ing at boot under a future tsup config change.\nconst _localRequire = nodeCreateRequire(import.meta.url);\nfunction _loadPackageJson(): { version: string } {\n for (const rel of ['../package.json', '../../package.json']) {\n try {\n return _localRequire(rel) as { version: string };\n } catch {\n // try next candidate\n }\n }\n throw new Error(\n \"build-app.ts: could not resolve package.json from '../package.json' or '../../package.json'. \" +\n 'Bundle layout may have changed — update the resolution ladder.'\n );\n}\nconst _pkgVersion: string = _loadPackageJson()['version'];\n\n/** Allowed loopback hosts */\nexport const LOOPBACK_HOSTS = ['127.0.0.1', '::1', 'localhost'];\n\nexport interface FastifyBuildOptions {\n logger?: FastifyBaseLogger | boolean;\n /** Validated bind host — must be a loopback address in wizard mode */\n bindHost?: string;\n /** When true, throws if bindHost is non-loopback regardless of env var */\n requireLoopback?: boolean;\n}\n\n/**\n * Build a Fastify instance with shared middleware: CORS, WebSocket, and error handler.\n * Does NOT register any routes.\n *\n * SECURITY: Pino logger is configured with `redact` paths covering wizard-mode\n * secrets (mnemonic, password, password_confirm) so request-shape logging cannot\n * leak credentials even if the log level is bumped.\n */\nexport async function buildFastifyApp(\n opts: FastifyBuildOptions = {}\n): Promise<FastifyInstance> {\n const bindHost = opts.bindHost ?? '127.0.0.1';\n\n if (!LOOPBACK_HOSTS.includes(bindHost)) {\n if (opts.requireLoopback) {\n throw new Error(\n 'The wizard refuses remote bind for security. Edit ~/.townhouse/config.yaml after setup if you need remote API access.'\n );\n }\n if (process.env['TOWNHOUSE_API_ALLOW_REMOTE'] !== '1') {\n throw new Error(\n 'Townhouse API refuses to bind to non-loopback host without TOWNHOUSE_API_ALLOW_REMOTE=1'\n );\n }\n }\n\n // Build logger options. When the caller passes a boolean (the common path) we\n // attach Pino redact paths. A custom FastifyBaseLogger instance is opaque so\n // we trust the caller has already configured redaction.\n const loggerOpt = opts.logger ?? true;\n const logger: FastifyServerOptions['logger'] =\n typeof loggerOpt === 'boolean' && loggerOpt\n ? {\n redact: {\n paths: [\n 'req.body.mnemonic',\n 'req.body.password',\n 'req.body.password_confirm',\n 'res.body.mnemonic',\n 'mnemonic',\n 'password',\n 'password_confirm',\n // Story 46.2: secret-bearing fields introduced by node lifecycle\n // routes. These never appear in request/response bodies (they go\n // to subprocess env), but defense-in-depth covers them at every\n // path Pino might log a stray object (error objects, debug dumps).\n 'nostrSecretKey',\n 'evmPrivateKey',\n 'TOWN_SECRET_KEY',\n 'MILL_SECRET_KEY',\n 'DVM_SECRET_KEY',\n 'TOWN_SETTLEMENT_PRIVATE_KEY',\n 'MILL_SETTLEMENT_PRIVATE_KEY',\n 'DVM_SETTLEMENT_PRIVATE_KEY',\n 'MILL_MNEMONIC',\n 'TOWNHOUSE_WALLET_PASSWORD',\n ],\n censor: '[REDACTED]',\n },\n }\n : (loggerOpt as FastifyServerOptions['logger']);\n\n const app = Fastify({\n logger,\n bodyLimit: 16 * 1024,\n // SECURITY/CONTRACT: schemas with `additionalProperties: false` must REJECT\n // unknown keys with a 400, not silently strip them. Operators shipping a typo\n // should see a loud failure, not a no-op success.\n ajv: {\n customOptions: {\n removeAdditional: false,\n },\n },\n } as FastifyServerOptions);\n\n app.setErrorHandler((error, _request, reply) => {\n app.log.error(error);\n const err = error as {\n statusCode?: number;\n code?: string;\n message?: string;\n validation?: unknown;\n };\n const isCorsRejection = err.message === 'Origin not allowed';\n const statusCode = isCorsRejection ? 403 : (err.statusCode ?? 500);\n\n // SECURITY: 5xx responses always sanitized — err.message can carry payload\n // bits (validation context, file paths, partial inputs) and must not reach\n // the client. Only known-safe error classes (CORS rejection, Fastify\n // validation 4xx) get the original message.\n let message: string;\n if (isCorsRejection) {\n message = err.message ?? 'Origin not allowed';\n } else if (statusCode >= 400 && statusCode < 500 && err.validation) {\n message = err.message ?? 'Bad request';\n } else if (statusCode >= 400 && statusCode < 500) {\n message = err.message ?? 'Bad request';\n } else {\n message = 'Internal server error';\n }\n\n reply.status(statusCode).send({\n error: isCorsRejection\n ? 'origin_not_allowed'\n : (err.code ?? 'internal_error'),\n message,\n });\n });\n\n await app.register(cors, buildCorsOptions());\n await app.register(websocket);\n\n app.get('/health', async () => ({\n status: 'healthy' as const,\n uptime: Math.floor(process.uptime()),\n startedAt: STARTED_AT,\n version: _pkgVersion,\n }));\n\n return app;\n}\n","/**\n * CORS configuration for Townhouse API.\n *\n * SECURITY: Only allows localhost origins (loopback only for v1).\n */\n\nimport type { FastifyCorsOptions } from '@fastify/cors';\n\n/**\n * Allowed localhost origins for CORS.\n */\nconst ALLOWED_ORIGINS = ['localhost', '127.0.0.1', '[::1]', '::1'];\n\n/**\n * Check if an origin host is allowed.\n */\nfunction isOriginAllowed(origin: string | undefined): boolean {\n // No origin header = curl, native fetch from file:// page = allowed\n if (!origin) {\n return true;\n }\n\n try {\n const url = new URL(origin);\n return ALLOWED_ORIGINS.includes(url.hostname);\n } catch {\n // Invalid origin = reject\n return false;\n }\n}\n\n/**\n * Build CORS options for Fastify.\n */\nexport function buildCorsOptions(): FastifyCorsOptions {\n return {\n origin: (origin, callback) => {\n // origin is the value of the Origin header, or undefined if not present\n\n if (isOriginAllowed(origin)) {\n callback(null, true);\n } else {\n // Reject with 403; Fastify will handle the response\n callback(new Error('Origin not allowed'), false);\n }\n },\n methods: ['GET', 'PATCH', 'OPTIONS', 'HEAD'],\n credentials: false,\n };\n}\n","/**\n * Node routes: GET /nodes, GET /nodes/:type, GET /nodes/:type/packets/timeseries,\n * GET /nodes/:type/bandwidth,\n * GET /nodes/:nodeId/health, GET /nodes/:nodeId/swaps/recent,\n * GET /nodes/:nodeId/deposit-addresses.\n *\n * `:type` routes are scoped per node kind ('town' | 'mill' | 'dvm').\n * `:nodeId` routes are scoped per running instance and accept either a\n * container name (e.g. 'dev-mill-01') or a type-level placeholder\n * ('mill' when no instance has started yet).\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type {\n ApiDeps,\n NodeInfo,\n MetricsPayload,\n BandwidthPayload,\n PacketTimeseriesPayload,\n TimeseriesBucket,\n NodeHealthPayload,\n MillSwapsRecentPayload,\n JobsRecentPayload,\n DepositAddressesPayload,\n DvmHealthResponse,\n} from '../types.js';\nimport type { NodeType, NodeState } from '../types.js';\nimport { CONTAINER_PREFIX } from '../../constants.js';\n\n/** Cache entry for health proxy responses */\ninterface HealthCacheEntry {\n payload: NodeHealthPayload;\n cachedAt: number;\n}\n\nconst HEALTH_CACHE_TTL_MS = 2_000;\n\n/**\n * Feature-detect the event `kind` from a connector packet log entry. The\n * connector contract's `PacketLogEntry` does not yet expose a `kind` field\n * (see `@toon-protocol/sdk` CONNECTOR_MIGRATION.md \"Townhouse-Side\n * Contract\"); when absent, packets group under bucket 0 (\"unattributed\")\n * so operators can see the shortfall instead of silent data loss.\n */\nexport function extractKindFromPacketEntry(entry: unknown): number {\n const kind = (entry as { kind?: unknown } | null)?.kind;\n return typeof kind === 'number' && Number.isFinite(kind) ? kind : 0;\n}\n\n/** Map raw Docker container state to the API's NodeState enum. */\nfunction mapDockerState(raw: string | undefined): NodeState {\n switch (raw) {\n case 'running':\n return 'running';\n case 'exited':\n case 'stopped':\n case 'created':\n case 'paused':\n return 'stopped';\n case undefined:\n return 'not-created';\n default:\n // 'restarting', 'removing', 'dead' → error\n return 'error';\n }\n}\n\n/** Build the mutable fee-field subset of a node's config, typed per node kind. */\nfunction pickMutableFees(\n type: NodeType,\n nodeConfig: {\n enabled: boolean;\n feePerEvent?: number;\n feeBasisPoints?: number;\n feePerJob?: number;\n }\n): {\n enabled: boolean;\n feePerEvent?: number;\n feeBasisPoints?: number;\n feePerJob?: number;\n} {\n switch (type) {\n case 'town':\n return {\n enabled: nodeConfig.enabled,\n feePerEvent: nodeConfig.feePerEvent,\n };\n case 'mill':\n return {\n enabled: nodeConfig.enabled,\n feeBasisPoints: nodeConfig.feeBasisPoints,\n };\n case 'dvm':\n return { enabled: nodeConfig.enabled, feePerJob: nodeConfig.feePerJob };\n }\n}\n\n/** Guard an ISO-8601 StartedAt and return uptime in seconds, or null if implausible. */\nfunction computeUptimeSeconds(\n startedAt: string | undefined,\n state: NodeState\n): number | null {\n if (state !== 'running' || !startedAt) return null;\n const started = new Date(startedAt).getTime();\n if (isNaN(started) || started <= 0) return null;\n const now = Date.now();\n const ONE_YEAR_MS = 365 * 24 * 60 * 60 * 1000;\n if (started > now || now - started >= ONE_YEAR_MS) return null;\n return Math.floor((now - started) / 1000);\n}\n\n/**\n * Register node routes.\n */\nexport function registerNodeRoutes(app: FastifyInstance, deps: ApiDeps): void {\n const healthCache = new Map<string, HealthCacheEntry>();\n // GET /nodes - list all node types (multi-instance aware)\n app.get('/nodes', async (_request, _reply) => {\n const status = await deps.orchestrator.status();\n const nodes: NodeInfo[] = [];\n\n for (const type of ['town', 'mill', 'dvm'] as const) {\n const nodeConfig = deps.config.nodes[type];\n if (!nodeConfig) continue;\n\n const instances = status.filter((s) => s.type === type);\n\n if (instances.length === 0) {\n nodes.push({\n id: type,\n type,\n enabled: nodeConfig.enabled,\n state: 'not-created',\n uptimeSeconds: null,\n image: nodeConfig.image ?? `toon:${type}`,\n });\n continue;\n }\n\n for (const entry of instances) {\n const state = mapDockerState(entry.state);\n const uptimeSeconds = computeUptimeSeconds(entry.startedAt, state);\n nodes.push({\n id: entry.name, // \"town\" for single-instance, \"dev-town-01\" for multi\n type,\n enabled: nodeConfig.enabled,\n state,\n uptimeSeconds,\n image: nodeConfig.image ?? `toon:${type}`,\n });\n }\n }\n\n return nodes;\n });\n\n // GET /nodes/:type - get single node detail\n app.get<{ Params: { type: string } }>(\n '/nodes/:type',\n async (request, reply) => {\n const { type } = request.params;\n\n // Validate type - return 404 for unknown types (for AC #9)\n if (type !== 'town' && type !== 'mill' && type !== 'dvm') {\n return reply.status(404).send({\n error: 'unknown_node_type',\n type,\n });\n }\n\n const nodeConfig = deps.config.nodes[type as NodeType];\n if (!nodeConfig) {\n return reply.status(404).send({\n error: 'unknown_node_type',\n type,\n });\n }\n\n // Get status from orchestrator (use first matching instance for single-type endpoint)\n const status = await deps.orchestrator.status();\n const statusEntry = status.find((s) => s.type === type);\n const state: NodeState = statusEntry\n ? mapDockerState(statusEntry.state)\n : 'not-created';\n const uptimeSeconds = computeUptimeSeconds(statusEntry?.startedAt, state);\n\n // Get metrics from connector admin (degraded state on failure).\n // ConnectorAdminClient.getMetrics() returns the connector's\n // /admin/metrics.json shape verbatim — aggregate counters live under\n // `aggregate`, per-peer entries under `peers`. Narrowed MetricsPayload\n // here surfaces the aggregate rollup; per-peer breakdowns are available\n // to consumers that need them via metricsRes.peers.\n let metrics: MetricsPayload | null = null;\n try {\n const metricsRes = await deps.connectorAdmin.getMetrics();\n if (metricsRes) {\n metrics = {\n packetsForwarded: metricsRes.aggregate.packetsForwarded,\n packetsRejected: metricsRes.aggregate.packetsRejected,\n bytesSent: metricsRes.aggregate.bytesSent,\n attribution: 'aggregate',\n available: true,\n };\n }\n } catch {\n // Connector down - return degraded state\n metrics = {\n packetsForwarded: 0,\n packetsRejected: 0,\n bytesSent: 0,\n attribution: 'aggregate',\n available: false,\n };\n }\n\n // Build config subset (mutable fields) — per-type, typed safely\n const config = pickMutableFees(type as NodeType, nodeConfig);\n\n return {\n id: type,\n type,\n enabled: nodeConfig.enabled,\n state,\n uptimeSeconds,\n image: nodeConfig.image ?? `toon:${type}`,\n config,\n metrics,\n };\n }\n );\n\n // ── GET /nodes/:type/packets/timeseries ────────────────────────────────────\n\n app.get<{\n Params: { type: string };\n Querystring: { bucket?: string; since?: string };\n }>('/nodes/:type/packets/timeseries', async (request, reply) => {\n const { type } = request.params;\n const { bucket = 'hour', since } = request.query;\n\n if (type !== 'town' && type !== 'mill' && type !== 'dvm') {\n return reply.status(404).send({ error: 'unknown_node_type', type });\n }\n\n const supportedBuckets = ['hour', 'day', 'minute'];\n if (!supportedBuckets.includes(bucket)) {\n return reply.status(400).send({\n error: 'unsupported_bucket',\n message: `bucket must be one of: ${supportedBuckets.join(', ')}`,\n });\n }\n\n const sinceMs = since\n ? new Date(since).getTime()\n : Date.now() - 24 * 60 * 60 * 1000;\n if (isNaN(sinceMs)) {\n return reply\n .status(400)\n .send({ error: 'invalid_since', message: 'since must be ISO 8601' });\n }\n\n try {\n // Resolve the node's ILP address from the connector's peer roster so the\n // packet log is scoped to this node type only (AC-3 / Task 2.3).\n // Falls through without filter if peers are unavailable.\n let ilpAddress: string | undefined;\n try {\n const peers = await deps.connectorAdmin.getPeers();\n const peer = peers.find((p) => p.id === type);\n ilpAddress = peer?.ilpAddresses[0];\n } catch {\n // Connector peer list unavailable — return unfiltered data as fallback\n }\n\n const packets = await deps.connectorAdmin.getPacketLog({\n ilpAddress,\n since: sinceMs,\n limit: 10_000,\n });\n\n // Bucket the packet log by time\n const bucketMs =\n bucket === 'minute'\n ? 60_000\n : bucket === 'day'\n ? 24 * 60 * 60_000\n : /* hour */ 60 * 60_000;\n\n const countsMap = new Map<number, number>();\n for (const entry of packets) {\n const bucketTs = Math.floor(entry.ts / bucketMs) * bucketMs;\n countsMap.set(bucketTs, (countsMap.get(bucketTs) ?? 0) + 1);\n }\n\n const buckets: TimeseriesBucket[] = Array.from(countsMap.entries())\n .sort(([a], [b]) => a - b)\n .map(([ts, count]) => ({ ts, count }));\n\n const payload: PacketTimeseriesPayload = { buckets };\n return payload;\n } catch (error: unknown) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ConnectorEndpointNotFound') {\n return reply.status(503).send({\n error: 'connector_endpoint_not_found',\n message:\n 'Connector image does not expose GET /packets. See CONNECTOR_MIGRATION.md §getPacketLog.',\n });\n }\n // Connector down or other error\n return reply.status(503).send({\n error: 'connector_unavailable',\n message: 'Could not reach connector admin API',\n });\n }\n });\n\n // ── GET /nodes/:type/bandwidth ─────────────────────────────────────────────\n\n app.get<{ Params: { type: string } }>(\n '/nodes/:type/bandwidth',\n async (request, reply) => {\n const { type } = request.params;\n\n if (type !== 'town' && type !== 'mill' && type !== 'dvm') {\n return reply.status(404).send({ error: 'unknown_node_type', type });\n }\n\n const containerName = `${CONTAINER_PREFIX}${type}`;\n const stats = await deps.orchestrator.getContainerStats(containerName);\n\n if (stats === null) {\n return null;\n }\n\n const payload: BandwidthPayload = {\n bytesIn: stats.bytesIn,\n bytesOut: stats.bytesOut,\n sampleAt: stats.sampleAt,\n };\n return payload;\n }\n );\n\n // ── per-instance node resolution helper ───────────────────────────────────\n\n async function resolveNodeId(\n nodeId: string\n ): Promise<{ type: NodeType; instanceName: string } | null> {\n const status = await deps.orchestrator.status();\n const instance = status.find((s) => s.name === nodeId);\n if (instance) {\n return { type: instance.type as NodeType, instanceName: instance.name };\n }\n if (nodeId === 'town' || nodeId === 'mill' || nodeId === 'dvm') {\n return { type: nodeId, instanceName: nodeId };\n }\n return null;\n }\n\n // ── GET /nodes/:nodeId/health ──────────────────────────────────────────────\n\n app.get<{ Params: { nodeId: string } }>(\n '/nodes/:nodeId/health',\n async (request, reply) => {\n const { nodeId } = request.params;\n\n // Skip the type-level routes that share the prefix.\n if (nodeId === 'packets' || nodeId === 'bandwidth') {\n return reply.status(404).send({ error: 'unknown_node', nodeId });\n }\n\n const resolved = await resolveNodeId(nodeId);\n if (!resolved) {\n return reply.status(404).send({ error: 'unknown_node', nodeId });\n }\n\n const cacheKey = resolved.instanceName;\n const cached = healthCache.get(cacheKey);\n if (cached && Date.now() - cached.cachedAt < HEALTH_CACHE_TTL_MS) {\n return cached.payload;\n }\n\n try {\n const endpoint = await deps.orchestrator.getNodeHealthEndpoint(\n resolved.instanceName,\n resolved.type\n );\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3_000);\n let res: Response;\n try {\n // nosemgrep: javascript.lang.security.detect-insecure-http -- Docker-internal, TLS unnecessary\n res = await fetch(`${endpoint}/health`, {\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeout);\n }\n if (!res.ok) {\n return reply.status(503).send({ error: 'node_unreachable' });\n }\n const payload = (await res.json()) as NodeHealthPayload;\n healthCache.set(cacheKey, { payload, cachedAt: Date.now() });\n return payload;\n } catch {\n return reply.status(503).send({ error: 'node_unreachable' });\n }\n }\n );\n\n // ── GET /nodes/:nodeId/swaps/recent ───────────────────────────────────────\n\n app.get<{\n Params: { nodeId: string };\n Querystring: { windowSec?: string };\n }>('/nodes/:nodeId/swaps/recent', async (request, reply) => {\n const { nodeId } = request.params;\n\n const resolved = await resolveNodeId(nodeId);\n if (!resolved) {\n return reply.status(404).send({ error: 'unknown_node', nodeId });\n }\n if (resolved.type !== 'mill') {\n return reply.status(404).send({\n error: 'swaps_only_for_mill',\n message: 'swaps/recent is only available for mill instances',\n });\n }\n\n const rawWindowSec = request.query.windowSec;\n // Reject scientific notation and non-decimal strings before parseInt\n // silently truncates them ('1e10' → 1).\n if (rawWindowSec !== undefined && !/^\\d+$/.test(rawWindowSec)) {\n return reply.status(400).send({\n error: 'invalid_window_sec',\n message: 'windowSec must be a non-negative integer (1–3600)',\n });\n }\n const windowSec =\n rawWindowSec !== undefined ? parseInt(rawWindowSec, 10) : 300;\n if (isNaN(windowSec) || windowSec < 1 || windowSec > 3600) {\n return reply.status(400).send({\n error: 'invalid_window_sec',\n message: 'windowSec must be 1–3600',\n });\n }\n\n // Resolve this instance's ILP address from connector peers.\n // If the peer is not registered yet, return an empty result rather than\n // an unfiltered packet log (which would include packets from every peer).\n let ilpAddress: string | undefined;\n try {\n const peers = await deps.connectorAdmin.getPeers();\n const peer = peers.find((p) => p.id === resolved.instanceName);\n ilpAddress = peer?.ilpAddresses[0];\n } catch {\n // Connector unavailable — handled in the next try block.\n }\n\n if (!ilpAddress) {\n const empty: MillSwapsRecentPayload = {\n count: 0,\n volume: '0',\n byPair: [],\n };\n return empty;\n }\n\n try {\n const packets = await deps.connectorAdmin.getPacketLog({\n ilpAddress,\n since: Date.now() - windowSec * 1_000,\n limit: 10_000,\n });\n\n const byPairMap = new Map<string, { count: number; volume: bigint }>();\n let totalVolume = 0n;\n\n for (const entry of packets) {\n totalVolume += BigInt(entry.amount ?? 0);\n const pairKey = `${entry.ilpAddressFrom ?? '?'}→${entry.ilpAddressTo ?? '?'}`;\n const existing = byPairMap.get(pairKey) ?? { count: 0, volume: 0n };\n byPairMap.set(pairKey, {\n count: existing.count + 1,\n volume: existing.volume + BigInt(entry.amount ?? 0),\n });\n }\n\n const byPair = Array.from(byPairMap.entries()).map(([pair, data]) => ({\n pair,\n count: data.count,\n volume: data.volume.toString(),\n }));\n\n const payload: MillSwapsRecentPayload = {\n count: packets.length,\n volume: totalVolume.toString(),\n byPair,\n };\n return payload;\n } catch (error: unknown) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ConnectorEndpointNotFound') {\n return reply.status(503).send({\n error: 'connector_endpoint_not_found',\n message:\n 'Connector image does not expose GET /packets. See CONNECTOR_MIGRATION.md.',\n });\n }\n return reply.status(503).send({ error: 'connector_unavailable' });\n }\n });\n\n // ── GET /nodes/:nodeId/jobs/recent ────────────────────────────────────────\n // Returns DVM job throughput for the requested window (default 300 s).\n // byKind is sourced from the DVM container's health endpoint (counter-shim,\n // the canonical source since the connector PacketLogEntry has no kind field).\n // volume is sourced from the connector packet log (amount sum).\n\n app.get<{\n Params: { nodeId: string };\n Querystring: { windowSec?: string };\n }>('/nodes/:nodeId/jobs/recent', async (request, reply) => {\n const { nodeId } = request.params;\n\n const resolved = await resolveNodeId(nodeId);\n if (!resolved) {\n return reply.status(404).send({ error: 'unknown_node', nodeId });\n }\n if (resolved.type !== 'dvm') {\n return reply.status(404).send({\n error: 'jobs_only_for_dvm',\n message: 'jobs/recent is only available for dvm instances',\n });\n }\n\n const rawWindowSec = request.query.windowSec;\n if (rawWindowSec !== undefined && !/^\\d+$/.test(rawWindowSec)) {\n return reply.status(400).send({\n error: 'invalid_window_sec',\n message: 'windowSec must be a non-negative integer (1–300)',\n });\n }\n const requestedWindowSec =\n rawWindowSec !== undefined ? parseInt(rawWindowSec, 10) : 300;\n // The DVM in-memory counter is fixed at a 5-minute (300 s) window,\n // so the byKind/byStatus/total fields can only honestly report the\n // last 300 s. Reject windows outside [1, 300] rather than silently\n // mixing windows across response fields.\n if (requestedWindowSec < 1 || requestedWindowSec > 300) {\n return reply.status(400).send({\n error: 'invalid_window_sec',\n message:\n 'windowSec must be 1–300 (DVM counter window is fixed at 5 min)',\n });\n }\n const windowSec = requestedWindowSec;\n\n // Resolve ILP address from connector peers\n let ilpAddress: string | undefined;\n let connectorDown = false;\n try {\n const peers = await deps.connectorAdmin.getPeers();\n const peer = peers.find((p) => p.id === resolved.instanceName);\n ilpAddress = peer?.ilpAddresses[0];\n } catch {\n connectorDown = true;\n }\n\n if (connectorDown) {\n return reply.status(503).send({ error: 'connector_unavailable' });\n }\n\n // Fetch DVM health for byKind and byStatus (the canonical counter source)\n let dvmHealth: DvmHealthResponse | null = null;\n try {\n const cached = healthCache.get(resolved.instanceName);\n if (cached && Date.now() - cached.cachedAt < HEALTH_CACHE_TTL_MS) {\n dvmHealth = cached.payload as DvmHealthResponse;\n } else {\n const endpoint = await deps.orchestrator.getNodeHealthEndpoint(\n resolved.instanceName,\n 'dvm'\n );\n // 3 s timeout mirrors the parallel /nodes/:nodeId/health route.\n // A hung DVM container otherwise blocks Fastify indefinitely.\n const healthController = new AbortController();\n const healthTimeout = setTimeout(() => healthController.abort(), 3_000);\n let healthRes: Response;\n try {\n // nosemgrep: javascript.lang.security.detect-insecure-http -- Docker-internal, TLS unnecessary\n healthRes = await fetch(`${endpoint}/health`, {\n signal: healthController.signal,\n });\n } finally {\n clearTimeout(healthTimeout);\n }\n if (healthRes.ok) {\n dvmHealth = (await healthRes.json()) as DvmHealthResponse;\n healthCache.set(resolved.instanceName, {\n payload: dvmHealth,\n cachedAt: Date.now(),\n });\n }\n }\n } catch {\n // Health fetch failed — degrade gracefully\n }\n\n const byStatus = dvmHealth?.jobsRecent?.byStatus ?? {\n processing: 0,\n success: 0,\n error: 0,\n partial: 0,\n };\n\n // Build byKind from DVM health counter (canonical) — group into JobsByKindEntry\n const byKindFromHealth = dvmHealth?.jobsRecent?.byKind ?? [];\n const byKindMap = new Map<number, { count: number; volume: bigint }>();\n for (const entry of byKindFromHealth) {\n byKindMap.set(entry.kind, { count: entry.count, volume: 0n });\n }\n\n if (!ilpAddress) {\n // ILP address unknown — return zero-volume result with health-sourced counters\n const payload: JobsRecentPayload = {\n count: dvmHealth?.jobsRecent?.total ?? 0,\n volume: '0',\n byKind: Array.from(byKindMap.entries()).map(([kind, d]) => ({\n kind,\n count: d.count,\n volume: '0',\n })),\n byStatus,\n };\n return payload;\n }\n\n try {\n const packets = await deps.connectorAdmin.getPacketLog({\n ilpAddress,\n since: Date.now() - windowSec * 1_000,\n limit: 10_000,\n });\n\n let totalVolume = 0n;\n for (const entry of packets) {\n totalVolume += BigInt(entry.amount ?? 0);\n // kind field: feature-detect — if absent, group under bucket 0 (unattributed)\n const kind = extractKindFromPacketEntry(entry);\n const existing = byKindMap.get(kind) ?? { count: 0, volume: 0n };\n // Only increment count from packet log if no DVM health data available;\n // prefer DVM counter for count, use packet log for volume only.\n byKindMap.set(kind, {\n count:\n byKindFromHealth.length > 0 ? existing.count : existing.count + 1,\n volume: existing.volume + BigInt(entry.amount ?? 0),\n });\n }\n\n const byKind = Array.from(byKindMap.entries()).map(([kind, d]) => ({\n kind,\n count: d.count,\n volume: d.volume.toString(),\n }));\n\n const payload: JobsRecentPayload = {\n count: dvmHealth?.jobsRecent?.total ?? packets.length,\n volume: totalVolume.toString(),\n byKind,\n byStatus,\n };\n return payload;\n } catch (error: unknown) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ConnectorEndpointNotFound') {\n return reply.status(503).send({\n error: 'connector_endpoint_not_found',\n message:\n 'Connector image does not expose GET /packets. See CONNECTOR_MIGRATION.md.',\n });\n }\n return reply.status(503).send({ error: 'connector_unavailable' });\n }\n });\n\n // ── GET /nodes/:nodeId/deposit-addresses ──────────────────────────────────\n\n app.get<{ Params: { nodeId: string } }>(\n '/nodes/:nodeId/deposit-addresses',\n async (request, reply) => {\n const { nodeId } = request.params;\n\n const resolved = await resolveNodeId(nodeId);\n if (!resolved) {\n return reply.status(404).send({ error: 'unknown_node', nodeId });\n }\n\n let keys;\n try {\n keys = deps.wallet.getNodeKeys(resolved.type);\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n if (/not initialized/i.test(msg)) {\n return reply.status(503).send({ error: 'wallet_not_initialized' });\n }\n return reply.status(500).send({ error: 'wallet_error', message: msg });\n }\n\n const chains: DepositAddressesPayload['chains'] = [\n { family: 'evm', address: keys.evmAddress },\n ];\n\n if (resolved.type === 'mill') {\n if (keys.solanaAddress) {\n chains.push({ family: 'solana', address: keys.solanaAddress });\n }\n if (keys.minaAddress) {\n chains.push({ family: 'mina', address: keys.minaAddress });\n }\n }\n\n const payload: DepositAddressesPayload = { chains };\n return payload;\n }\n );\n}\n","/**\n * Wallet routes: GET /wallet\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { ApiDeps } from '../types.js';\n\n/**\n * Register wallet routes.\n */\nexport function registerWalletRoutes(\n app: FastifyInstance,\n deps: ApiDeps\n): void {\n // GET /wallet - list all wallet keys (address-only, no secrets)\n app.get('/wallet', async (_request, _reply) => {\n // Returns NodeKeyInfo[] which has NO secrets\n const keys = deps.wallet.listKeys();\n return { keys };\n });\n}\n","/**\n * EVM JSON-RPC helpers for balance queries.\n * Uses native fetch + AbortController (no external deps).\n */\n\nconst TIMEOUT_MS = 3_000;\nconst HEX_ADDR_RE = /^0x[0-9a-fA-F]{40}$/;\n\n/** JSON-RPC request helper. The local 3s timeout always fires regardless of\n * whether the caller passes their own signal. */\nasync function rpcCall(\n rpcUrl: string,\n method: string,\n params: unknown[],\n signal?: AbortSignal\n): Promise<unknown> {\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(new Error('rpc_timeout')),\n TIMEOUT_MS\n );\n // Forward caller cancellation into our controller so the local timeout-driven\n // abort and the caller-driven abort both reach the underlying fetch.\n const onCallerAbort = signal\n ? () =>\n controller.abort(\n (signal.reason as Error | undefined) ?? new Error('aborted')\n )\n : null;\n if (signal && onCallerAbort) {\n if (signal.aborted) onCallerAbort();\n else signal.addEventListener('abort', onCallerAbort, { once: true });\n }\n\n try {\n const res = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }),\n signal: controller.signal,\n });\n if (!res.ok)\n throw new Error(`EVM RPC ${method} failed: HTTP ${res.status}`);\n const data = (await res.json()) as {\n result?: string;\n error?: { message: string };\n };\n if (data.error)\n throw new Error(`EVM RPC ${method} error: ${data.error.message}`);\n return data.result;\n } finally {\n clearTimeout(timeout);\n if (signal && onCallerAbort) {\n signal.removeEventListener('abort', onCallerAbort);\n }\n }\n}\n\n/**\n * Get native ETH balance (wei) for an address.\n * Returns balance as decimal string.\n */\nexport async function getEvmBalance(\n rpcUrl: string,\n address: string\n): Promise<string> {\n if (!HEX_ADDR_RE.test(address)) {\n throw new Error(`getEvmBalance: invalid address shape (${address})`);\n }\n const hex = (await rpcCall(rpcUrl, 'eth_getBalance', [\n address,\n 'latest',\n ])) as string;\n return BigInt(hex).toString();\n}\n\n/**\n * Get ERC-20 token balance using balanceOf(address) selector.\n * Returns balance as decimal string.\n */\nexport async function getErc20Balance(\n rpcUrl: string,\n contractAddress: string,\n holderAddress: string\n): Promise<string> {\n if (!HEX_ADDR_RE.test(contractAddress)) {\n throw new Error(\n `getErc20Balance: invalid contract address (${contractAddress})`\n );\n }\n if (!HEX_ADDR_RE.test(holderAddress)) {\n throw new Error(\n `getErc20Balance: invalid holder address (${holderAddress})`\n );\n }\n // ABI-encode balanceOf(address): selector 0x70a08231 + padded address\n const paddedAddr = holderAddress\n .toLowerCase()\n .replace(/^0x/, '')\n .padStart(64, '0');\n const data = `0x70a08231${paddedAddr}`;\n\n const hex = (await rpcCall(rpcUrl, 'eth_call', [\n { to: contractAddress, data },\n 'latest',\n ])) as string;\n\n if (!hex || hex === '0x') return '0';\n return BigInt(hex).toString();\n}\n","/**\n * Solana JSON-RPC helpers for balance queries.\n * Uses native fetch + AbortController (no external deps).\n */\n\nconst TIMEOUT_MS = 3_000;\n\n/**\n * Get native SOL balance (lamports) for a base58 address.\n * Returns balance as decimal string.\n */\nexport async function getSolanaBalance(\n rpcUrl: string,\n address: string\n): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n const res = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getBalance',\n params: [address],\n }),\n signal: controller.signal,\n });\n if (!res.ok)\n throw new Error(`Solana RPC getBalance failed: HTTP ${res.status}`);\n const data = (await res.json()) as {\n result?: { value?: number };\n error?: { message: string };\n };\n if (data.error) throw new Error(`Solana RPC error: ${data.error.message}`);\n const lamports = data.result?.value ?? 0;\n return BigInt(lamports).toString();\n } finally {\n clearTimeout(timeout);\n }\n}\n","/**\n * Mina GraphQL helpers for balance queries.\n * Uses native fetch + AbortController (no external deps).\n */\n\nconst TIMEOUT_MS = 3_000;\n\n/**\n * Get MINA balance (nanomina) for a base58check address.\n * Returns balance as decimal string in nanomina (scale 9).\n */\nexport async function getMinaBalance(\n graphqlUrl: string,\n address: string\n): Promise<string> {\n const query = `query GetBalance($pk: PublicKey!) {\n account(publicKey: $pk) {\n balance {\n total\n }\n }\n }`;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n const res = await fetch(graphqlUrl, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ query, variables: { pk: address } }),\n signal: controller.signal,\n });\n if (!res.ok) throw new Error(`Mina GraphQL failed: HTTP ${res.status}`);\n const data = (await res.json()) as {\n data?: { account?: { balance?: { total?: string } } };\n errors?: { message: string }[];\n };\n if (data.errors?.length)\n throw new Error(`Mina GraphQL error: ${data.errors[0]?.message}`);\n const total = data.data?.account?.balance?.total;\n if (!total) return '0';\n // total is returned as a decimal MINA string (e.g. \"1000.000000000\").\n // Reject malformed inputs (scientific notation, empty wholes, non-digits)\n // explicitly — a BigInt throw inside this function would surface as a\n // generic 503 instead of a clean `available:false / reason:bad_format`.\n if (!/^\\d+(\\.\\d+)?$/.test(total)) {\n throw new Error(`Mina balance: unsupported numeric format (${total})`);\n }\n const [whole = '0', frac = ''] = total.split('.');\n const fracPadded = frac.padEnd(9, '0').slice(0, 9) || '0';\n const nanomina = BigInt(whole) * 1_000_000_000n + BigInt(fracPadded);\n return nanomina.toString();\n } finally {\n clearTimeout(timeout);\n }\n}\n","/**\n * GET /api/wallet/balances\n *\n * Returns per-(nodeType × family × token) balance entries.\n * Per-RPC failure is partial — one bad chain never kills the whole response.\n * Server-side cache: 5 s TTL per (nodeType × address × token) to avoid\n * hammering RPCs and to keep `payload.ts` stable across cache-hit reads.\n * In-flight requests for the same key are deduped via a Promise map so two\n * parallel /balances calls don't double-call the upstream RPC.\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { ApiDeps } from '../types.js';\nimport type { WalletBalanceEntry, WalletBalancesPayload } from '../types.js';\nimport { getEvmBalance, getErc20Balance } from '../../chain/evm-rpc.js';\nimport { getSolanaBalance } from '../../chain/solana-rpc.js';\nimport { getMinaBalance } from '../../chain/mina-graphql.js';\nimport type { NodeKeyInfo } from '../../wallet/types.js';\n\n// ── Cache ─────────────────────────────────────────────────────────────────────\n\ninterface CacheEntry {\n entry: WalletBalanceEntry;\n ts: number;\n}\n\n// In-memory best-effort cache (restart-volatile; single-process).\nconst CACHE = new Map<string, CacheEntry>();\nconst INFLIGHT = new Map<string, Promise<WalletBalanceEntry>>();\nconst CACHE_TTL_MS = 5_000;\n\n/** Test hook: reset module-scope cache between vitest tests. */\nexport function resetWalletBalancesCache(): void {\n CACHE.clear();\n INFLIGHT.clear();\n}\n\nfunction getCachedEntry(key: string): CacheEntry | undefined {\n const hit = CACHE.get(key);\n if (!hit) return undefined;\n if (Date.now() - hit.ts > CACHE_TTL_MS) {\n CACHE.delete(key);\n return undefined;\n }\n return hit;\n}\n\nfunction setCached(key: string, entry: WalletBalanceEntry): CacheEntry {\n const cached = { entry, ts: Date.now() };\n CACHE.set(key, cached);\n return cached;\n}\n\n/** Wrap a fetcher with cache + in-flight dedup so two callers for the same key\n * share one upstream RPC call. */\nasync function memoize(\n key: string,\n fetcher: () => Promise<WalletBalanceEntry>\n): Promise<{ entry: WalletBalanceEntry; ts: number }> {\n const cached = getCachedEntry(key);\n if (cached) return cached;\n const inflight = INFLIGHT.get(key);\n if (inflight) {\n const entry = await inflight;\n const after = getCachedEntry(key);\n return after ?? { entry, ts: Date.now() };\n }\n const promise = (async () => {\n try {\n const entry = await fetcher();\n setCached(key, entry);\n return entry;\n } finally {\n INFLIGHT.delete(key);\n }\n })();\n INFLIGHT.set(key, promise);\n const entry = await promise;\n const after = getCachedEntry(key);\n return after ?? { entry, ts: Date.now() };\n}\n\n// ── Fetch helpers ─────────────────────────────────────────────────────────────\n\nfunction unavailable(\n nodeType: 'town' | 'mill' | 'dvm',\n family: WalletBalanceEntry['family'],\n token: WalletBalanceEntry['token'],\n address: string,\n scale: number,\n reason: string\n): WalletBalanceEntry {\n return {\n nodeType,\n family,\n token,\n address,\n balance: '0',\n scale,\n available: false,\n reason,\n };\n}\n\nasync function fetchEvmEth(\n rpcUrl: string,\n nodeType: 'town' | 'mill' | 'dvm',\n address: string\n): Promise<{ entry: WalletBalanceEntry; ts: number }> {\n const cacheKey = `evm:${nodeType}:${address}:ETH`;\n return memoize(cacheKey, async () => {\n try {\n const balance = await getEvmBalance(rpcUrl, address);\n return {\n nodeType,\n family: 'evm',\n token: 'ETH',\n address,\n balance,\n scale: 18,\n available: true,\n };\n } catch (e) {\n return unavailable(\n nodeType,\n 'evm',\n 'ETH',\n address,\n 18,\n e instanceof Error ? e.message : 'evm_rpc_error'\n );\n }\n });\n}\n\nasync function fetchEvmUsdc(\n rpcUrl: string,\n usdcAddress: string | undefined,\n nodeType: 'town' | 'mill' | 'dvm',\n address: string\n): Promise<{ entry: WalletBalanceEntry; ts: number }> {\n if (!usdcAddress || !/^0x[0-9a-fA-F]{40}$/.test(usdcAddress)) {\n // Don't cache config-drift — it should clear immediately when the env is fixed.\n return {\n entry: unavailable(\n nodeType,\n 'evm',\n 'USDC',\n address,\n 6,\n 'usdc_address_not_configured'\n ),\n ts: Date.now(),\n };\n }\n const cacheKey = `evm:${nodeType}:${address}:USDC`;\n return memoize(cacheKey, async () => {\n try {\n const balance = await getErc20Balance(rpcUrl, usdcAddress, address);\n return {\n nodeType,\n family: 'evm',\n token: 'USDC',\n address,\n balance,\n scale: 6,\n available: true,\n };\n } catch (e) {\n return unavailable(\n nodeType,\n 'evm',\n 'USDC',\n address,\n 6,\n e instanceof Error ? e.message : 'evm_rpc_error'\n );\n }\n });\n}\n\nasync function fetchSolana(\n rpcUrl: string,\n nodeType: 'town' | 'mill' | 'dvm',\n address: string\n): Promise<{ entry: WalletBalanceEntry; ts: number }> {\n const cacheKey = `solana:${nodeType}:${address}:SOL`;\n return memoize(cacheKey, async () => {\n try {\n const balance = await getSolanaBalance(rpcUrl, address);\n return {\n nodeType,\n family: 'solana',\n token: 'SOL',\n address,\n balance,\n scale: 9,\n available: true,\n };\n } catch (e) {\n return unavailable(\n nodeType,\n 'solana',\n 'SOL',\n address,\n 9,\n e instanceof Error ? e.message : 'solana_rpc_error'\n );\n }\n });\n}\n\nasync function fetchMina(\n graphqlUrl: string,\n nodeType: 'town' | 'mill' | 'dvm',\n address: string\n): Promise<{ entry: WalletBalanceEntry; ts: number }> {\n const cacheKey = `mina:${nodeType}:${address}:MINA`;\n return memoize(cacheKey, async () => {\n try {\n const balance = await getMinaBalance(graphqlUrl, address);\n return {\n nodeType,\n family: 'mina',\n token: 'MINA',\n address,\n balance,\n scale: 9,\n available: true,\n };\n } catch (e) {\n return unavailable(\n nodeType,\n 'mina',\n 'MINA',\n address,\n 9,\n e instanceof Error ? e.message : 'mina_graphql_error'\n );\n }\n });\n}\n\n// ── Route registration ────────────────────────────────────────────────────────\n\ninterface FetchTask {\n /** Identity of the (nodeType, family, token, address) so a thrown task can\n * still be reported with its original tuple instead of a fake town/ETH stub. */\n identity: {\n nodeType: 'town' | 'mill' | 'dvm';\n family: WalletBalanceEntry['family'];\n token: WalletBalanceEntry['token'];\n address: string;\n scale: number;\n };\n run: () => Promise<{ entry: WalletBalanceEntry; ts: number }>;\n}\n\nexport function registerWalletBalancesRoutes(\n app: FastifyInstance,\n deps: ApiDeps\n): void {\n app.get('/wallet/balances', async (_request, reply) => {\n let keys: NodeKeyInfo[];\n try {\n keys = deps.wallet.getAllKeys();\n } catch {\n return reply.status(503).send({ error: 'wallet_not_initialized' });\n }\n\n const anvil =\n process.env['TOWNHOUSE_DEV_ANVIL_RPC'] ?? 'http://127.0.0.1:28545';\n const solanaRpc =\n process.env['TOWNHOUSE_DEV_SOLANA_RPC'] ?? 'http://127.0.0.1:28899';\n const minaGraphql =\n process.env['TOWNHOUSE_DEV_MINA_GRAPHQL'] ??\n 'http://127.0.0.1:28085/graphql';\n const usdcAddress = process.env['TOON_USDC_ADDRESS'] || undefined;\n\n const tasks: FetchTask[] = [];\n for (const keyInfo of keys) {\n const nodeType = keyInfo.nodeType as 'town' | 'mill' | 'dvm';\n tasks.push({\n identity: {\n nodeType,\n family: 'evm',\n token: 'ETH',\n address: keyInfo.evmAddress,\n scale: 18,\n },\n run: () => fetchEvmEth(anvil, nodeType, keyInfo.evmAddress),\n });\n tasks.push({\n identity: {\n nodeType,\n family: 'evm',\n token: 'USDC',\n address: keyInfo.evmAddress,\n scale: 6,\n },\n run: () =>\n fetchEvmUsdc(anvil, usdcAddress, nodeType, keyInfo.evmAddress),\n });\n if (nodeType === 'mill' && keyInfo.solanaAddress) {\n const solAddr = keyInfo.solanaAddress;\n tasks.push({\n identity: {\n nodeType,\n family: 'solana',\n token: 'SOL',\n address: solAddr,\n scale: 9,\n },\n run: () => fetchSolana(solanaRpc, nodeType, solAddr),\n });\n }\n if (nodeType === 'mill' && keyInfo.minaAddress) {\n const minaAddr = keyInfo.minaAddress;\n tasks.push({\n identity: {\n nodeType,\n family: 'mina',\n token: 'MINA',\n address: minaAddr,\n scale: 9,\n },\n run: () => fetchMina(minaGraphql, nodeType, minaAddr),\n });\n }\n }\n\n const results = await Promise.allSettled(tasks.map((t) => t.run()));\n\n let oldestTs = Number.POSITIVE_INFINITY;\n const entries: WalletBalanceEntry[] = results.map((r, idx) => {\n if (r.status === 'fulfilled') {\n if (r.value.ts < oldestTs) oldestTs = r.value.ts;\n return r.value.entry;\n }\n // Rejection branch: capture the original task identity rather than a fake stub.\n const task = tasks[idx];\n if (!task) {\n throw new Error(`task missing for index ${idx}`);\n }\n const { nodeType, family, token, address, scale } = task.identity;\n const reason =\n r.reason instanceof Error ? r.reason.message : 'internal_error';\n return unavailable(nodeType, family, token, address, scale, reason);\n });\n\n // AC-2: cache-hit returns same `ts`. Use the oldest cached entry's ts so\n // back-to-back cached requests yield identical timestamps.\n const ts = oldestTs === Number.POSITIVE_INFINITY ? Date.now() : oldestTs;\n const payload: WalletBalancesPayload = { entries, ts };\n return payload;\n });\n}\n","/**\n * POST /api/wallet/reveal\n *\n * Password-gated seed-phrase reveal.\n * SECURITY: Mnemonic is never logged, never cached beyond the request lifecycle.\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { ApiDeps } from '../types.js';\nimport { loadWallet } from '../../wallet/storage.js';\nimport { decryptWallet } from '../../wallet/crypto.js';\n\nexport function registerWalletRevealRoutes(\n app: FastifyInstance,\n deps: ApiDeps\n): void {\n app.post('/wallet/reveal', async (request, reply) => {\n const body = request.body as { password?: unknown };\n\n if (\n !body ||\n typeof body.password !== 'string' ||\n body.password.length === 0 ||\n body.password.length > 256\n ) {\n return reply.status(400).send({\n error: 'invalid_request',\n message: 'password must be a non-empty string ≤ 256 characters',\n });\n }\n\n const walletPath = deps.config.wallet.encrypted_path;\n let loaded: Awaited<ReturnType<typeof loadWallet>>;\n try {\n loaded = await loadWallet(walletPath);\n } catch (e) {\n // ENOENT (or any \"file not found\" surface) is \"wallet not initialized\",\n // not \"corrupted\" — the user just hasn't run `townhouse init` yet.\n const code = (e as { code?: string } | null)?.code;\n if (code === 'ENOENT' || code === 'ENOTDIR') {\n return reply.status(503).send({ error: 'wallet_not_initialized' });\n }\n return reply.status(500).send({\n error: 'wallet_corrupted',\n message: 'Failed to read wallet file',\n });\n }\n\n if (!loaded) {\n return reply.status(503).send({ error: 'wallet_not_initialized' });\n }\n\n let wallet: typeof loaded.wallet;\n try {\n wallet = loaded.wallet;\n // Validate JSON structure: all required fields present\n if (!wallet.salt || !wallet.iv || !wallet.ciphertext || !wallet.tag) {\n return reply.status(500).send({\n error: 'wallet_corrupted',\n message: 'Wallet file is missing required fields',\n });\n }\n } catch {\n return reply.status(500).send({\n error: 'wallet_corrupted',\n message: 'Wallet file JSON is invalid',\n });\n }\n\n let mnemonic: string;\n try {\n mnemonic = decryptWallet(wallet, body.password);\n } catch {\n return reply.status(401).send({ error: 'invalid_password' });\n }\n\n // Return mnemonic directly — not stored in any module-scoped variable\n return reply.status(200).send({ mnemonic });\n });\n}\n","/**\n * POST /api/wallet/withdraw — EVM-only signed withdrawal (v1)\n * GET /api/wallet/transaction/:txHash — receipt polling\n *\n * SECURITY: Private keys and signed-tx hex are never logged.\n * Localhost-only boundary enforced by the API server bind address.\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport { isAddress } from 'viem';\nimport type {\n ApiDeps,\n WithdrawRequest,\n WithdrawSuccessResponse,\n WithdrawDryRunResponse,\n TransactionReceiptPayload,\n} from '../types.js';\nimport {\n signAndBroadcastEthTransfer,\n signAndBroadcastUsdcTransfer,\n getReceipt,\n estimateNativeTransferGas,\n estimateUsdcTransferGas,\n} from '../../chain/evm-tx.js';\nimport { getEvmBalance, getErc20Balance } from '../../chain/evm-rpc.js';\nimport type { NodeType } from '../../docker/types.js';\n\nconst NODE_TYPES = new Set<string>(['town', 'mill', 'dvm']);\n\n/** Map a thrown viem/fetch error to an \"RPC unreachable\" verdict.\n * Replaces brittle `e.message.includes('fetch')` substring matching, which\n * over-catches viem strings like \"could not fetch nonce\" (a real broadcast\n * failure, not a transport problem). */\nfunction isRpcUnreachable(e: unknown): boolean {\n if (!(e instanceof Error)) return false;\n // Node fetch / undici surface transport failures as TypeError with a `cause`\n // whose `code` is set to one of these. Anything else is a real broadcast\n // failure that should propagate as 500 broadcast_failed.\n const cause = (e as { cause?: { code?: string } }).cause;\n if (cause?.code) {\n return [\n 'ECONNREFUSED',\n 'ENOTFOUND',\n 'EAI_AGAIN',\n 'ETIMEDOUT',\n 'UND_ERR_CONNECT_TIMEOUT',\n ].includes(cause.code);\n }\n // Bare TypeError \"fetch failed\" (no cause attached, e.g. mocked failures in\n // tests) — match exact viem fetch-failure strings, not the looser substring.\n return (\n /^fetch failed$/i.test(e.message) || /HTTP request failed/i.test(e.message)\n );\n}\n\nexport function registerWalletWithdrawRoutes(\n app: FastifyInstance,\n deps: ApiDeps\n): void {\n // POST /wallet/withdraw\n app.post('/wallet/withdraw', async (request, reply) => {\n const body = request.body as Partial<WithdrawRequest>;\n\n // Validate nodeType\n if (!body.nodeType || !NODE_TYPES.has(body.nodeType)) {\n return reply.status(400).send({\n error: 'invalid_node_type',\n message: 'nodeType must be town, mill, or dvm',\n });\n }\n\n // v1: EVM-only; Solana/Mina → 501\n if (body.chainFamily === 'solana' || body.chainFamily === 'mina') {\n return reply.status(501).send({\n error: 'chain_not_supported_for_withdrawal',\n message: `${body.chainFamily} withdrawal coming soon — copy the address and use an external wallet for now`,\n supportedFamilies: ['evm'],\n });\n }\n if (body.chainFamily !== 'evm') {\n return reply.status(400).send({\n error: 'invalid_chain_family',\n message: 'chainFamily must be evm, solana, or mina',\n });\n }\n\n // Validate token\n if (body.token !== 'native' && body.token !== 'USDC') {\n return reply.status(400).send({\n error: 'invalid_token',\n message: 'token must be native or USDC',\n });\n }\n\n // Validate recipient — regex + viem isAddress for EIP-55\n const recipient = body.recipient ?? '';\n if (!/^0x[0-9a-fA-F]{40}$/.test(recipient)) {\n return reply\n .status(400)\n .send({ error: 'invalid_recipient', code: 'invalid_recipient_format' });\n }\n if (!isAddress(recipient)) {\n return reply.status(400).send({\n error: 'invalid_recipient',\n code: 'invalid_recipient_checksum',\n });\n }\n\n // Validate amount\n let amountBig: bigint;\n try {\n amountBig = BigInt(body.amount ?? '');\n if (amountBig <= 0n) throw new Error('non-positive');\n } catch {\n return reply.status(400).send({\n error: 'invalid_amount',\n message: 'amount must be a positive integer string (raw units)',\n });\n }\n\n const anvil =\n process.env['TOWNHOUSE_DEV_ANVIL_RPC'] ?? 'http://127.0.0.1:28545';\n const usdcAddress = (process.env['TOON_USDC_ADDRESS'] || undefined) as\n | `0x${string}`\n | undefined;\n\n // Get keys\n let nodeKeys: ReturnType<typeof deps.wallet.getNodeKeys>;\n try {\n nodeKeys = deps.wallet.getNodeKeys(body.nodeType as NodeType);\n } catch {\n return reply.status(503).send({ error: 'wallet_not_initialized' });\n }\n\n const evmAddress = nodeKeys.evmAddress as `0x${string}`;\n\n // USDC config is a server-side requirement, not user input — 503 not 400.\n if (body.token === 'USDC' && !usdcAddress) {\n return reply.status(503).send({\n error: 'usdc_address_not_configured',\n message: 'TOON_USDC_ADDRESS not set on server',\n });\n }\n // After the guard above, USDC requests have a valid usdcAddress.\n function requireUsdc(): `0x${string}` {\n if (!usdcAddress) {\n throw new Error('usdcAddress missing after guard');\n }\n return usdcAddress;\n }\n\n // Balance check + gas-aware native cap.\n let onChainBalance: bigint;\n let estimateForGuard: { gas: string; fee: string } | null = null;\n try {\n if (body.token === 'native') {\n onChainBalance = BigInt(await getEvmBalance(anvil, evmAddress));\n } else {\n // USDC — gas is paid in native ETH, not the USDC balance.\n onChainBalance = BigInt(\n await getErc20Balance(anvil, requireUsdc(), evmAddress)\n );\n }\n if (amountBig > onChainBalance) {\n return reply.status(400).send({\n error: 'insufficient_balance',\n code: 'insufficient_balance',\n });\n }\n // Native-only gas headroom check: a \"Max\" withdraw passes the raw\n // balance check then fails at broadcast with \"insufficient funds for\n // gas * price + value\". Reject early with a distinct code so the UI\n // can surface \"leave headroom for fees\".\n if (body.token === 'native') {\n try {\n estimateForGuard = await estimateNativeTransferGas(\n anvil,\n evmAddress,\n recipient as `0x${string}`,\n amountBig\n );\n const fee = BigInt(estimateForGuard.fee);\n if (amountBig + fee > onChainBalance) {\n return reply.status(400).send({\n error: 'insufficient_balance',\n code: 'insufficient_balance_for_gas',\n message:\n 'amount + estimated gas exceeds balance — leave headroom for fees',\n });\n }\n } catch {\n // Estimate unavailable — broadcast will surface the real reason.\n }\n }\n } catch (e) {\n if (isRpcUnreachable(e)) {\n return reply.status(503).send({ error: 'rpc_unreachable' });\n }\n throw e;\n }\n\n // dryRun: return gas estimate without broadcasting. Estimator must match\n // the broadcast path or the displayed fee under-reports for ERC-20.\n if (body.dryRun === true) {\n try {\n const est =\n body.token === 'native'\n ? (estimateForGuard ??\n (await estimateNativeTransferGas(\n anvil,\n evmAddress,\n recipient as `0x${string}`,\n amountBig\n )))\n : await estimateUsdcTransferGas(\n anvil,\n evmAddress,\n requireUsdc(),\n recipient as `0x${string}`,\n amountBig\n );\n const response: WithdrawDryRunResponse = {\n estimatedGas: est.gas,\n estimatedFee: est.fee,\n };\n return reply.status(200).send(response);\n } catch (e) {\n if (isRpcUnreachable(e)) {\n return reply.status(503).send({ error: 'rpc_unreachable' });\n }\n throw e;\n }\n }\n\n // Broadcast\n try {\n let txHash: `0x${string}`;\n let chainId: number;\n\n if (body.token === 'native') {\n const result = await signAndBroadcastEthTransfer(\n anvil,\n nodeKeys.evmPrivateKey,\n recipient as `0x${string}`,\n amountBig\n );\n txHash = result.txHash;\n chainId = result.chainId;\n } else {\n const result = await signAndBroadcastUsdcTransfer(\n anvil,\n requireUsdc(),\n nodeKeys.evmPrivateKey,\n recipient as `0x${string}`,\n amountBig\n );\n txHash = result.txHash;\n chainId = result.chainId;\n }\n\n const response: WithdrawSuccessResponse = { txHash, chainId };\n return reply.status(200).send(response);\n } catch (e) {\n if (isRpcUnreachable(e)) {\n return reply.status(503).send({ error: 'rpc_unreachable' });\n }\n const msg = e instanceof Error ? e.message : String(e);\n return reply\n .status(500)\n .send({ error: 'broadcast_failed', message: msg });\n }\n });\n\n // GET /wallet/transaction/:txHash\n app.get<{ Params: { txHash: string } }>(\n '/wallet/transaction/:txHash',\n async (request, reply) => {\n const { txHash } = request.params;\n\n if (!/^0x[0-9a-fA-F]{64}$/.test(txHash)) {\n return reply.status(400).send({\n error: 'invalid_tx_hash',\n message: 'txHash must be a 0x-prefixed 32-byte hex string',\n });\n }\n\n const anvil =\n process.env['TOWNHOUSE_DEV_ANVIL_RPC'] ?? 'http://127.0.0.1:28545';\n try {\n const receipt: TransactionReceiptPayload = await getReceipt(\n anvil,\n txHash as `0x${string}`\n );\n return reply.status(200).send(receipt);\n } catch (e) {\n if (isRpcUnreachable(e)) {\n return reply.status(503).send({ error: 'rpc_unreachable' });\n }\n throw e;\n }\n }\n );\n}\n","/**\n * EVM transaction construction and broadcast helpers.\n * Uses viem for EIP-1559 tx construction, signing, and receipt polling.\n * SECURITY: private keys are never logged.\n */\n\nimport {\n createWalletClient,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n http,\n parseAbi,\n type Hash,\n} from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport type { TransactionReceiptPayload } from '../api/types.js';\n\nfunction toViemPrivkey(raw: Uint8Array): `0x${string}` {\n const hex = Buffer.from(raw).toString('hex');\n return `0x${hex}` as `0x${string}`;\n}\n\n/** Build a viem chain object pinned to the runtime-fetched chainId so EIP-155\n * replay protection is enforced. Refusing `chain: null` is the whole point. */\nfunction buildChain(rpcUrl: string, chainId: number) {\n return defineChain({\n id: chainId,\n name: `evm-${chainId}`,\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: { default: { http: [rpcUrl] } },\n });\n}\n\nconst ERC20_ABI = parseAbi([\n 'function transfer(address to, uint256 amount) returns (bool)',\n]);\n\nexport async function signAndBroadcastEthTransfer(\n rpcUrl: string,\n privateKey: Uint8Array,\n recipient: `0x${string}`,\n amount: bigint\n): Promise<{ txHash: Hash; chainId: number }> {\n const account = privateKeyToAccount(toViemPrivkey(privateKey));\n const transport = http(rpcUrl);\n\n const publicClient = createPublicClient({ transport });\n const chainId = await publicClient.getChainId();\n const chain = buildChain(rpcUrl, chainId);\n\n const walletClient = createWalletClient({ account, transport, chain });\n\n const txHash = await walletClient.sendTransaction({\n to: recipient,\n value: amount,\n chain,\n });\n\n return { txHash, chainId };\n}\n\nexport async function signAndBroadcastUsdcTransfer(\n rpcUrl: string,\n usdcAddress: `0x${string}`,\n privateKey: Uint8Array,\n recipient: `0x${string}`,\n amount: bigint\n): Promise<{ txHash: Hash; chainId: number }> {\n const account = privateKeyToAccount(toViemPrivkey(privateKey));\n const transport = http(rpcUrl);\n\n const publicClient = createPublicClient({ transport });\n const chainId = await publicClient.getChainId();\n const chain = buildChain(rpcUrl, chainId);\n\n const walletClient = createWalletClient({ account, transport, chain });\n\n const txHash = await walletClient.writeContract({\n address: usdcAddress,\n abi: ERC20_ABI,\n functionName: 'transfer',\n args: [recipient, amount],\n chain,\n });\n\n return { txHash, chainId };\n}\n\nexport async function getReceipt(\n rpcUrl: string,\n txHash: Hash\n): Promise<TransactionReceiptPayload> {\n const publicClient = createPublicClient({ transport: http(rpcUrl) });\n try {\n const receipt = await publicClient.getTransactionReceipt({ hash: txHash });\n if (!receipt) return { status: 'pending', txHash };\n return {\n status: receipt.status === 'success' ? 'success' : 'reverted',\n blockNumber: Number(receipt.blockNumber),\n txHash,\n };\n } catch (e) {\n // Receipt not found yet\n if (e instanceof Error && e.message.includes('not found')) {\n return { status: 'pending', txHash };\n }\n throw e;\n }\n}\n\nexport async function estimateNativeTransferGas(\n rpcUrl: string,\n fromAddress: `0x${string}`,\n recipient: `0x${string}`,\n amount: bigint\n): Promise<{ gas: string; fee: string }> {\n const publicClient = createPublicClient({ transport: http(rpcUrl) });\n const [gas, gasPrice] = await Promise.all([\n publicClient.estimateGas({\n account: fromAddress,\n to: recipient,\n value: amount,\n }),\n publicClient.getGasPrice(),\n ]);\n const fee = gas * gasPrice;\n return { gas: gas.toString(), fee: fee.toString() };\n}\n\n/** Estimate gas for an ERC-20 `transfer(to, amount)` call.\n * Native transfer is ~21k; ERC-20 transfer is ~50-65k — using the native\n * estimator for USDC under-reports the fee by ~3×. */\nexport async function estimateUsdcTransferGas(\n rpcUrl: string,\n fromAddress: `0x${string}`,\n usdcAddress: `0x${string}`,\n recipient: `0x${string}`,\n amount: bigint\n): Promise<{ gas: string; fee: string }> {\n const publicClient = createPublicClient({ transport: http(rpcUrl) });\n const data = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: 'transfer',\n args: [recipient, amount],\n });\n const [gas, gasPrice] = await Promise.all([\n publicClient.estimateGas({ account: fromAddress, to: usdcAddress, data }),\n publicClient.getGasPrice(),\n ]);\n const fee = gas * gasPrice;\n return { gas: gas.toString(), fee: fee.toString() };\n}\n","/**\n * Shared config-mutation mutex.\n *\n * Serializes concurrent PATCH /api/nodes/:type/config and PATCH /api/transport\n * mutations so they cannot race on the same config.yaml file.\n */\n\nlet isMutating = false;\n\n/**\n * Synchronous test-and-set acquire of the mutex. Returns true on success,\n * false if already held.\n *\n * Safety: relies on the JavaScript event-loop running the if-check and the\n * assignment in the same synchronous tick. Do NOT introduce an `await`\n * between the read and the write or this guard becomes racy.\n */\nexport function acquireConfigMutex(): boolean {\n if (isMutating) return false;\n isMutating = true;\n return true;\n}\n\nexport function releaseConfigMutex(): void {\n isMutating = false;\n}\n\n/** Reset for testing. */\nexport function resetConfigMutex(): void {\n isMutating = false;\n}\n\n// ── Node lifecycle mutex ────────────────────────────────────────────────────\n// Serializes concurrent POST/DELETE /api/nodes requests so the 6-step\n// provision pipeline cannot race with a concurrent teardown.\n// Kept separate from configMutex so config fee-patches and node-add can run\n// in parallel (they touch disjoint state).\n\nlet isNodeLifecycleRunning = false;\n\n/** Acquire the node-lifecycle mutex. Returns true on success, false if busy. */\nexport function acquireNodeLifecycleMutex(): boolean {\n if (isNodeLifecycleRunning) return false;\n isNodeLifecycleRunning = true;\n return true;\n}\n\nexport function releaseNodeLifecycleMutex(): void {\n isNodeLifecycleRunning = false;\n}\n\n/** Reset for testing. */\nexport function resetNodeLifecycleMutex(): void {\n isNodeLifecycleRunning = false;\n}\n","/**\n * Node configuration mutation routes: PATCH /nodes/:type/config\n */\n\nimport type { FastifyInstance, FastifySchema } from 'fastify';\nimport type { ApiDeps, NodeType } from '../types.js';\nimport { validateConfig } from '../../config/validator.js';\nimport { saveConfig } from '../../config/loader.js';\nimport {\n acquireConfigMutex,\n releaseConfigMutex,\n resetConfigMutex as _resetConfigMutex,\n} from '../config-mutex.js';\n\n/** Request body for PATCH /nodes/:type/config */\ninterface ConfigPatchBody {\n feePerEvent?: number;\n feeBasisPoints?: number;\n feePerJob?: number;\n kindPricing?: Record<string, number>;\n enabled?: boolean;\n}\n\n/**\n * JSON Schema for PATCH body — rejects unknown keys (typos) and enforces\n * numeric fee ceiling at JS Number.MAX_SAFE_INTEGER (2^53-1). Per Task 3.1 +\n * Dev Note \"Standard Guards\".\n */\nconst patchBodySchema: FastifySchema = {\n body: {\n type: 'object',\n additionalProperties: false,\n properties: {\n feePerEvent: { type: 'number', minimum: 0, maximum: 9007199254740991 },\n feeBasisPoints: { type: 'number', minimum: 0, maximum: 9007199254740991 },\n feePerJob: { type: 'number', minimum: 0, maximum: 9007199254740991 },\n kindPricing: {\n type: 'object',\n // Restrict keys to numeric strings (positive integers) to prevent\n // prototype pollution and env-var-injection attacks via arbitrary\n // keys (e.g. '__proto__', '5094\\nFOO=bar') that flow into\n // KIND_PRICING_<key> orchestrator env vars.\n propertyNames: { pattern: '^[0-9]+$' },\n additionalProperties: {\n type: 'integer',\n minimum: 0,\n maximum: 9007199254740991,\n },\n },\n enabled: { type: 'boolean' },\n },\n },\n};\n\n/**\n * Register config mutation routes.\n */\nexport function registerConfigPatchRoutes(\n app: FastifyInstance,\n deps: ApiDeps\n): void {\n app.patch<{ Params: { type: string }; Body: ConfigPatchBody }>(\n '/nodes/:type/config',\n { schema: patchBodySchema },\n async (request, reply) => {\n const { type } = request.params;\n const body = request.body ?? {};\n\n // Validate type\n if (type !== 'town' && type !== 'mill' && type !== 'dvm') {\n return reply.status(404).send({\n error: 'unknown_node_type',\n type,\n });\n }\n\n // kindPricing is only valid for dvm\n if (body.kindPricing !== undefined && type !== 'dvm') {\n return reply.status(400).send({\n error: 'invalid_field',\n message: `kindPricing not supported for type=${type}`,\n });\n }\n\n // Check mutex\n if (!acquireConfigMutex()) {\n return reply.status(409).send({\n error: 'config_mutation_in_flight',\n });\n }\n\n try {\n // Use the live reference — mutations applied to `deps.config` persist across requests\n const currentConfig = deps.config;\n const nodeConfig = currentConfig.nodes[type as NodeType];\n if (!nodeConfig) {\n return reply.status(404).send({\n error: 'unknown_node_type',\n type,\n });\n }\n\n // Deep merge the body into current config. kindPricing merges\n // per-key so a partial PATCH (e.g. `{ kindPricing: { '5094': 7 } }`)\n // does not clobber other already-set kinds in the persisted config.\n const existingKindPricing =\n (nodeConfig as { kindPricing?: Record<string, number> })\n .kindPricing ?? undefined;\n const mergedKindPricing =\n body.kindPricing !== undefined\n ? { ...(existingKindPricing ?? {}), ...body.kindPricing }\n : existingKindPricing;\n\n const mergedConfig = {\n ...currentConfig,\n nodes: {\n ...currentConfig.nodes,\n [type]: {\n ...nodeConfig,\n ...body,\n ...(mergedKindPricing !== undefined\n ? { kindPricing: mergedKindPricing }\n : {}),\n },\n },\n };\n\n // Validate merged config\n try {\n validateConfig(mergedConfig);\n } catch (validationError) {\n return reply.status(400).send({\n error: 'config_validation_error',\n message:\n validationError instanceof Error\n ? validationError.message\n : 'Invalid configuration',\n });\n }\n\n // Persist to disk\n await saveConfig(deps.configPath, mergedConfig);\n\n // Update in-memory config so subsequent requests see the new state.\n // Mutate in place on the same object reference the rest of the app holds.\n deps.config.nodes = mergedConfig.nodes;\n\n // Determine orchestrator action\n const nodeType = type as NodeType;\n const oldEnabled = nodeConfig.enabled;\n const newEnabled =\n body.enabled !== undefined ? body.enabled : oldEnabled;\n\n // D2 resolution (2026-04-21): run BOTH if enabled flips AND fee fields change\n if (oldEnabled !== newEnabled) {\n // Enabled was flipped\n if (newEnabled) {\n await deps.orchestrator.addNode(nodeType);\n } else {\n await deps.orchestrator.removeNode(nodeType);\n }\n }\n\n // Also regenerate if fee fields changed (even if enabled also changed)\n if (\n body.feePerEvent !== undefined ||\n body.feeBasisPoints !== undefined ||\n body.feePerJob !== undefined ||\n body.kindPricing !== undefined\n ) {\n // Fee fields changed - regenerate connector config\n const activeTypes = Object.entries(mergedConfig.nodes)\n .filter(([, config]) => config.enabled)\n .map(([type]) => type as NodeType);\n\n await deps.orchestrator.regenerateConnectorConfig(activeTypes);\n }\n\n // Return updated config subset (per-type, typed safely)\n const u = mergedConfig.nodes[type as NodeType] as {\n enabled: boolean;\n feePerEvent?: number;\n feeBasisPoints?: number;\n feePerJob?: number;\n kindPricing?: Record<string, number>;\n };\n if (nodeType === 'town') {\n return { enabled: u.enabled, feePerEvent: u.feePerEvent };\n } else if (nodeType === 'mill') {\n return { enabled: u.enabled, feeBasisPoints: u.feeBasisPoints };\n } else {\n return {\n enabled: u.enabled,\n feePerJob: u.feePerJob,\n kindPricing: u.kindPricing,\n };\n }\n } finally {\n releaseConfigMutex();\n }\n }\n );\n}\n\n/**\n * Reset the mutation mutex (for testing).\n * Re-exported from config-mutex.ts for backward compatibility with existing tests.\n */\nexport { _resetConfigMutex as resetConfigMutex };\n","/**\n * Node lifecycle routes: POST /api/nodes and DELETE /api/nodes/:id.\n *\n * Implements the 6-step atomic provisioning pipeline (Story 46.2):\n * 1. derive-key — WalletManager.deriveNodeKey (no state change)\n * 2. pull-image — DockerOrchestrator.pullImage (no state change)\n * 3. write-yaml — writeNodesYaml (first state mutation)\n * 4. start-container — DockerOrchestrator.startNodeViaCompose\n * 5. healthcheck — waitForHealthy (HTTP poll until 200 or 60 s timeout)\n * 6. register-peer — ConnectorAdminClient.registerPeer\n *\n * YAML-FIRST ordering invariant: step 3 (nodes.yaml write) MUST happen\n * BEFORE step 6 (connector /admin/peers registration). The drift window\n * resolves in the safe direction — a yaml entry without a connector peer\n * is re-registered on next `hs up`; the reverse creates a peer the\n * reconciler cannot clean up. Never invert this order.\n */\n\nimport { promises as fs } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { bytesToHex } from '@noble/hashes/utils';\nimport type { FastifyInstance, FastifyRequest } from 'fastify';\nimport type { ApiDeps } from '../types.js';\nimport type { NodeType } from '../types.js';\nimport type { TownhouseConfig } from '../../config/schema.js';\nimport { readNodesYaml, writeNodesYaml } from '../../state/nodes-yaml.js';\nimport {\n readImageManifest,\n isSyntheticDigest,\n} from '../../state/image-manifest.js';\nimport {\n CONTAINER_PREFIX,\n NODE_BTP_PORT,\n TOWN_HEALTH_PORT,\n MILL_HEALTH_PORT,\n DVM_HEALTH_PORT,\n ACCOUNT_INDEX_TOWN,\n ACCOUNT_INDEX_MILL,\n ACCOUNT_INDEX_DVM,\n} from '../../constants.js';\nimport {\n acquireNodeLifecycleMutex,\n releaseNodeLifecycleMutex,\n} from '../config-mutex.js';\n\nconst HEALTH_PORT: Record<NodeType, number> = {\n town: TOWN_HEALTH_PORT,\n mill: MILL_HEALTH_PORT,\n dvm: DVM_HEALTH_PORT,\n};\n\nconst ACCOUNT_INDEX: Record<NodeType, number> = {\n town: ACCOUNT_INDEX_TOWN,\n mill: ACCOUNT_INDEX_MILL,\n dvm: ACCOUNT_INDEX_DVM,\n};\n\n/** Default ILP prefix for the apex connector (constant from config-generator). */\nconst APEX_ILP_ADDRESS = 'g.townhouse';\n\n/**\n * Build the initial mill.config.json object for a freshly provisioned Mill.\n *\n * Mill's parseRawConfig() converts channels[*].cumulativeAmount / nonce and\n * inventory[*] from string → bigint. JSON cannot serialize bigint natively, so\n * these fields MUST be written as strings.\n *\n * The bootstrap channel and zero inventory allow validateConfig() to pass\n * without pre-funding the operator's Mill inventory.\n *\n * NOTE: validateConfig() also requires a non-empty `relayUrls` array, which\n * is NOT included here — it is injected at runtime via the `MILL_RELAYS`\n * environment variable (set in townhouse-hs.yml compose env). The POST handler\n * checks MILL_RELAYS before calling this function, so a missing env var is\n * caught before any file is written.\n */\nfunction buildMillSwapPairConfig(config: TownhouseConfig): object {\n // Both absent (undefined) and explicitly empty ([]) fall through to the\n // dev-Anvil sentinel — if a live EVM chain is configured, ensure\n // chainProviders has at least one entry with the correct chainId.\n const fromChain = config.chainProviders?.[0]?.chainId ?? 'evm:base:31337';\n // toChain is fixed at 'solana:devnet' for the v0.1 pilot — TownhouseConfig\n // has no Solana chain-ID field yet. Add one and read it here when mainnet\n // support is needed.\n const toChain = 'solana:devnet';\n\n return {\n swapPairs: [\n {\n from: { assetCode: 'USDC', assetScale: 6, chain: fromChain },\n to: { assetCode: 'USDC', assetScale: 6, chain: toChain },\n rate: '1.0',\n minAmount: '1000',\n maxAmount: '1000000000',\n },\n ],\n chains: ['evm', 'solana'],\n // Bootstrap: validateConfig() requires a non-empty channels array for\n // each distinct pair.to.chain. The zero channelId is a valid-format\n // sentinel that will never match a real on-chain channel.\n channels: {\n [toChain]: [\n {\n channelId: '0x' + '0'.repeat(64),\n cumulativeAmount: '0',\n nonce: '0',\n },\n ],\n },\n // Zero initial SOL inventory; parsed to 0n by the Mill CLI.\n inventory: {\n [toChain]: '0',\n },\n };\n}\n\n/**\n * Poll `url` with a per-request timeout until the server returns HTTP 200.\n * Throws if `timeoutMs` elapses without a successful response.\n *\n * Body content is intentionally ignored — only HTTP status matters, so this\n * helper stays decoupled from the three distinct node health payload shapes.\n */\nasync function waitForHealthy(url: string, timeoutMs: number): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n const POLL_INTERVAL_MS = 1_000;\n const REQUEST_TIMEOUT_MS = 3_000;\n\n while (Date.now() < deadline) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n try {\n const res = await fetch(url, { signal: controller.signal });\n if (res.ok) return;\n } catch {\n // connection refused or abort — keep polling\n } finally {\n clearTimeout(timer);\n }\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n throw new Error(\n `Health check timeout: ${url} did not return 200 within ${timeoutMs}ms`\n );\n}\n\n/**\n * Build the per-node env vars that compose interpolates at `up -d` time.\n * Callers must start from `process.env` and layer these on top (done inside\n * `startNodeViaCompose`). The returned object is the SECRET OVERLAY ONLY.\n *\n * NEVER log the return value of this function — it contains secret keys.\n */\nfunction buildNodeEnv(\n type: NodeType,\n nostrSecretKeyHex: string,\n evmPrivateKeyHex: string,\n mnemonic: string | null,\n apexEvmAddress: string\n): Record<string, string> {\n // Town's TOON_SETTLEMENT_PRIVATE_KEY (and mill's settlement key, if it\n // were ever read) requires a 0x-prefixed 32-byte hex string. bytesToHex\n // from @noble/hashes returns unprefixed hex — without the 0x, town\n // crashes at boot with `TOON_SETTLEMENT_PRIVATE_KEY must be a 0x-prefixed\n // 32-byte hex string`. Story 46.4 live gate run (Finding O, 2026-05-12).\n const evmPrivateKeyHex0x = `0x${evmPrivateKeyHex}`;\n switch (type) {\n case 'town':\n return {\n TOWN_SECRET_KEY: nostrSecretKeyHex,\n TOWN_SETTLEMENT_PRIVATE_KEY: evmPrivateKeyHex0x,\n APEX_EVM_ADDRESS: apexEvmAddress,\n };\n case 'mill':\n return {\n MILL_SECRET_KEY: nostrSecretKeyHex,\n MILL_SETTLEMENT_PRIVATE_KEY: evmPrivateKeyHex0x,\n MILL_MNEMONIC: mnemonic ?? '',\n APEX_EVM_ADDRESS: apexEvmAddress,\n };\n case 'dvm':\n return {\n DVM_SECRET_KEY: nostrSecretKeyHex,\n };\n }\n}\n\nexport function registerNodeLifecycleRoutes(\n app: FastifyInstance,\n deps: ApiDeps\n): void {\n // ── GET /api/nodes ─────────────────────────────────────────────────────────\n // Yaml-driven node list: joins nodes.yaml entries with connector peer state.\n // Always returns 200; connector-down degrades to status:'unknown' (not 500).\n // Note: the legacy GET /nodes route (no /api prefix, docker-status-driven,\n // in nodes.ts) is intentionally separate and powers the SPA docker-state view.\n\n app.get('/api/nodes', async (request, reply) => {\n const homeDir = dirname(deps.configPath);\n const nodesYamlPath = join(homeDir, 'nodes.yaml');\n\n let yaml: Awaited<ReturnType<typeof readNodesYaml>>;\n try {\n yaml = await readNodesYaml(nodesYamlPath);\n } catch (err: unknown) {\n const errMsg = err instanceof Error ? err.message : String(err);\n request.log.error(\n { event: 'get_nodes_yaml_error', err: errMsg },\n 'Failed to read nodes.yaml'\n );\n return reply.status(500).send({ error: 'yaml_read_failed', err: errMsg });\n }\n\n type PeerStatus = Awaited<\n ReturnType<typeof deps.connectorAdmin.getPeers>\n >[number];\n let peers: PeerStatus[] = [];\n let connectorUnreachable = false;\n try {\n peers = await deps.connectorAdmin.getPeers();\n } catch (err: unknown) {\n connectorUnreachable = true;\n request.log.warn(\n { event: 'get_nodes_connector_warn', err: String(err) },\n 'connector unreachable during GET /api/nodes — returning status:unknown'\n );\n }\n\n const nodes = yaml.entries.map((entry) => {\n let status: 'connected' | 'disconnected' | 'unknown';\n if (connectorUnreachable) {\n status = 'unknown';\n } else {\n const peer = peers.find((p) => p.id === entry.peerId);\n status = peer?.connected ? 'connected' : 'disconnected';\n }\n return {\n id: entry.id,\n type: entry.type,\n peerId: entry.peerId,\n ilpAddress: entry.ilpAddress,\n status,\n enabledAt: entry.enabledAt,\n lastSeenAt: entry.lastSeenAt,\n };\n });\n\n return reply.status(200).send({ nodes });\n });\n\n // ── POST /api/nodes ────────────────────────────────────────────────────────\n\n app.post<{ Body: { type: NodeType } }>(\n '/api/nodes',\n {\n schema: {\n body: {\n type: 'object',\n additionalProperties: false,\n required: ['type'],\n properties: {\n type: { type: 'string', enum: ['town', 'mill', 'dvm'] },\n },\n },\n },\n },\n async (request, reply) => {\n if (!acquireNodeLifecycleMutex()) {\n return reply.status(409).send({ error: 'node_lifecycle_in_flight' });\n }\n\n try {\n const { type } = request.body;\n const homeDir = dirname(deps.configPath);\n const nodesYamlPath = join(homeDir, 'nodes.yaml');\n const imageManifestPath = join(homeDir, 'image-manifest.json');\n const millConfigPath = join(homeDir, 'mill.config.json');\n\n // Pre-check: single instance per type (v1 constraint)\n const yaml = await readNodesYaml(nodesYamlPath);\n const existing = yaml.entries.find((e) => e.type === type);\n if (existing) {\n return reply.status(409).send({\n error: 'node_type_in_use',\n type,\n existingId: existing.id,\n });\n }\n\n // Pre-check: MILL_RELAYS must be set before any state is written.\n // Mill's validateConfig() throws INVALID_CONFIG on an empty relayUrls\n // array, producing a silent 60-second healthcheck timeout. Catching the\n // missing var here — before writeNodesYaml (step 3) — means no rollback\n // is needed and the caller gets an actionable 400 with zero side-effects.\n if (type === 'mill' && !process.env['MILL_RELAYS']?.trim()) {\n return reply.status(400).send({\n step: 'preflight',\n err: 'MILL_RELAYS is not set or is blank. Export a comma-separated list of relay URLs before provisioning Mill (e.g. export MILL_RELAYS=wss://relay.example.com). See packages/townhouse/README.md.',\n });\n }\n\n const derivationIndex = ACCOUNT_INDEX[type];\n const id = type; // v1: id === type\n const peerId = type; // v1: peerId === id\n const ilpAddress = `${APEX_ILP_ADDRESS}.${type}`;\n const containerName = `${CONTAINER_PREFIX}hs-${type}`;\n const healthPort = HEALTH_PORT[type];\n const healthCheckUrl = `http://${containerName}:${healthPort}/health`;\n const btpUrl = `ws://${CONTAINER_PREFIX}hs-${type}:${NODE_BTP_PORT}`;\n\n // ── Step 1: derive-key ─────────────────────────────────────────────\n request.log.info(\n { event: 'node_lifecycle_step', step: 'derive-key', type, peerId },\n 'Step 1: deriving node key'\n );\n let keys: Awaited<ReturnType<typeof deps.wallet.deriveNodeKey>>;\n try {\n keys = await deps.wallet.deriveNodeKey(type, derivationIndex);\n } catch (err: unknown) {\n const errMsg = sanitizeErrorMessage(\n err instanceof Error ? err.message : String(err)\n );\n request.log.error(\n {\n event: 'node_lifecycle_failure',\n step: 'derive-key',\n err: errMsg,\n },\n 'Step 1 failed: derive-key'\n );\n return reply.status(500).send({ step: 'derive-key', err: errMsg });\n }\n\n const nostrSecretKeyHex = bytesToHex(keys.nostrSecretKey);\n const evmPrivateKeyHex = bytesToHex(keys.evmPrivateKey);\n\n // Capture the mnemonic once at end of step 1. Step 1 succeeded, so the\n // wallet is unlocked; if `getMnemonic()` returns null now, the wallet\n // was locked between step 1's return and here (concurrent lock-route).\n // Fail-fast as a derive-key error rather than silently degrading later\n // env construction with empty-string secrets (P4).\n const mnemonicSnapshot = deps.wallet.getMnemonic();\n if (mnemonicSnapshot === null) {\n const errMsg =\n 'Wallet locked between step 1 and step 4 — refusing to start container without mnemonic';\n request.log.error(\n {\n event: 'node_lifecycle_failure',\n step: 'derive-key',\n err: errMsg,\n },\n 'Step 1 post-condition failed: mnemonic gone after derive'\n );\n return reply.status(500).send({ step: 'derive-key', err: errMsg });\n }\n // apex EVM address from the town node key (account 0 = primary wallet).\n const apexEvmAddress = deps.wallet.getNodeKeys('town').evmAddress;\n\n // ── Step 2: pull-image ─────────────────────────────────────────────\n request.log.info(\n { event: 'node_lifecycle_step', step: 'pull-image', type, peerId },\n 'Step 2: pulling image'\n );\n try {\n const manifest = await readImageManifest(imageManifestPath);\n const entry = manifest.images[type];\n if (isSyntheticDigest(entry.digest)) {\n return reply.status(400).send({\n step: 'pull-image',\n err: `Synthetic-digest manifest: image-manifest.json was produced by the connector-publish-smoke workflow for smoke testing only. Fetch a real manifest via 'gh run download' or rerun without --skip-fetch before provisioning nodes.`,\n });\n }\n const imageRef = `${entry.name}@${entry.digest}`;\n await deps.orchestrator.pullImage(imageRef);\n } catch (err: unknown) {\n const errMsg = sanitizeErrorMessage(\n err instanceof Error ? err.message : String(err)\n );\n request.log.error(\n {\n event: 'node_lifecycle_failure',\n step: 'pull-image',\n err: errMsg,\n },\n 'Step 2 failed: pull-image'\n );\n return reply.status(502).send({ step: 'pull-image', err: errMsg });\n }\n\n // ── Step 3: write-yaml (BEFORE connector registration — invariant) ──\n request.log.info(\n { event: 'node_lifecycle_step', step: 'write-yaml', type, peerId },\n 'Step 3: writing nodes.yaml entry'\n );\n const enabledAt = new Date().toISOString();\n const newEntry = {\n id,\n type,\n peerId,\n ilpAddress,\n derivationIndex,\n enabledAt,\n lastSeenAt: null,\n };\n try {\n await writeNodesYaml(nodesYamlPath, {\n entries: [...yaml.entries, newEntry],\n });\n } catch (err: unknown) {\n const errMsg = sanitizeErrorMessage(\n err instanceof Error ? err.message : String(err)\n );\n request.log.error(\n {\n event: 'node_lifecycle_failure',\n step: 'write-yaml',\n err: errMsg,\n },\n 'Step 3 failed: write-yaml'\n );\n return reply.status(500).send({ step: 'write-yaml', err: errMsg });\n }\n\n // ── Step 3b: mill — write mill.config.json (same rollback bucket as step 3) ──\n let millConfigWritten = false;\n if (type === 'mill') {\n // MILL_RELAYS pre-check already ran in pre-checks above — guaranteed set here.\n try {\n const defaultMillConfig = JSON.stringify(\n buildMillSwapPairConfig(deps.config),\n null,\n 2\n );\n await fs.mkdir(dirname(millConfigPath), {\n recursive: true,\n mode: 0o700,\n });\n // mkdir mode is a no-op on existing dirs — chmod explicitly so the\n // parent is 0o700 even if it pre-existed (P3).\n await fs.chmod(dirname(millConfigPath), 0o700);\n await fs.writeFile(millConfigPath, defaultMillConfig, {\n encoding: 'utf-8',\n mode: 0o600,\n });\n millConfigWritten = true;\n } catch (err: unknown) {\n const errMsg = sanitizeErrorMessage(\n err instanceof Error ? err.message : String(err)\n );\n request.log.error(\n {\n event: 'node_lifecycle_failure',\n step: 'write-mill-config',\n err: errMsg,\n },\n 'Step 3b failed: write mill.config.json'\n );\n // Rollback: remove any partial mill.config.json first, then the yaml entry.\n const rollbackMillError = await safeRollbackMillConfig(\n millConfigPath,\n request\n );\n const rollbackYamlError = await safeRollbackYaml(\n nodesYamlPath,\n peerId,\n request\n );\n const rollbackError = combineRollbackErrors(\n rollbackMillError,\n rollbackYamlError\n );\n return reply\n .status(500)\n .send({ step: 'write-mill-config', err: errMsg, rollbackError });\n }\n }\n\n // ── Step 4: start-container ────────────────────────────────────────\n request.log.info(\n {\n event: 'node_lifecycle_step',\n step: 'start-container',\n type,\n peerId,\n },\n 'Step 4: starting container via compose'\n );\n const nodeEnv = buildNodeEnv(\n type,\n nostrSecretKeyHex,\n evmPrivateKeyHex,\n mnemonicSnapshot,\n apexEvmAddress\n );\n try {\n await deps.orchestrator.startNodeViaCompose(type, nodeEnv);\n } catch (err: unknown) {\n const errMsg = sanitizeErrorMessage(\n err instanceof Error ? err.message : String(err)\n );\n request.log.error(\n {\n event: 'node_lifecycle_failure',\n step: 'start-container',\n err: errMsg,\n },\n 'Step 4 failed: start-container'\n );\n // Rollback: remove yaml entry (+ mill config)\n const rollbackError = await safeRollbackYaml(\n nodesYamlPath,\n peerId,\n request\n );\n let rollbackMillError: string | undefined;\n if (millConfigWritten) {\n rollbackMillError = await safeRollbackMillConfig(\n millConfigPath,\n request\n );\n }\n const combinedRollbackError = combineRollbackErrors(\n rollbackError,\n rollbackMillError\n );\n return reply.status(502).send({\n step: 'start-container',\n err: errMsg,\n rollbackError: combinedRollbackError,\n });\n }\n\n // ── Step 5: healthcheck ────────────────────────────────────────────\n request.log.info(\n {\n event: 'node_lifecycle_step',\n step: 'healthcheck',\n type,\n peerId,\n healthCheckUrl,\n },\n 'Step 5: waiting for container to become healthy'\n );\n try {\n await waitForHealthy(healthCheckUrl, 60_000);\n } catch (err: unknown) {\n const errMsg = sanitizeErrorMessage(\n err instanceof Error ? err.message : String(err)\n );\n request.log.error(\n {\n event: 'node_lifecycle_failure',\n step: 'healthcheck',\n err: errMsg,\n },\n 'Step 5 failed: healthcheck'\n );\n // Rollback: remove yaml entry + stop container + mill config\n const rollbackYamlError = await safeRollbackYaml(\n nodesYamlPath,\n peerId,\n request\n );\n const rollbackStopError = await safeRollbackStop(\n type,\n deps.orchestrator,\n request\n );\n let rollbackMillError: string | undefined;\n if (millConfigWritten) {\n rollbackMillError = await safeRollbackMillConfig(\n millConfigPath,\n request\n );\n }\n const combinedRollbackError = combineRollbackErrors(\n rollbackYamlError,\n rollbackStopError,\n rollbackMillError\n );\n return reply.status(502).send({\n step: 'healthcheck',\n err: errMsg,\n rollbackError: combinedRollbackError,\n });\n }\n\n // ── Step 6: register-peer ──────────────────────────────────────────\n request.log.info(\n {\n event: 'node_lifecycle_step',\n step: 'register-peer',\n type,\n peerId,\n ilpAddress,\n },\n 'Step 6: registering peer with connector'\n );\n try {\n await deps.connectorAdmin.registerPeer({\n id: peerId,\n url: btpUrl,\n authToken: '',\n routes: [{ prefix: ilpAddress, priority: 0 }],\n // Force direct (non-SOCKS5) BTP dial for this Docker-sibling\n // peer. The apex connector runs with `transport.type: socks5`\n // so the .anyone HS can publish; without this override, every\n // peer dial gets routed through the anon proxy and fails with\n // `HostUnreachable` on Docker-internal hostnames. Requires\n // connector >= 3.6.2 (toon-protocol/connector#70). Discovered\n // by Story 46.4 live gate run (Finding Q, 2026-05-12).\n transport: 'direct',\n });\n } catch (err: unknown) {\n const errMsg = sanitizeErrorMessage(\n err instanceof Error ? err.message : String(err)\n );\n request.log.error(\n {\n event: 'node_lifecycle_failure',\n step: 'register-peer',\n err: errMsg,\n },\n 'Step 6 failed: register-peer'\n );\n // Rollback: remove yaml entry + stop container + mill config\n const rollbackYamlError = await safeRollbackYaml(\n nodesYamlPath,\n peerId,\n request\n );\n const rollbackStopError = await safeRollbackStop(\n type,\n deps.orchestrator,\n request\n );\n let rollbackMillError: string | undefined;\n if (millConfigWritten) {\n rollbackMillError = await safeRollbackMillConfig(\n millConfigPath,\n request\n );\n }\n const combinedRollbackError = combineRollbackErrors(\n rollbackYamlError,\n rollbackStopError,\n rollbackMillError\n );\n return reply.status(502).send({\n step: 'register-peer',\n err: errMsg,\n rollbackError: combinedRollbackError,\n });\n }\n\n request.log.info(\n { event: 'node_lifecycle_success', type, peerId, ilpAddress },\n 'Node provisioned successfully'\n );\n\n return reply.status(201).send({\n id,\n type,\n peerId,\n ilpAddress,\n hsRoute: ilpAddress,\n healthCheckUrl,\n });\n } finally {\n releaseNodeLifecycleMutex();\n }\n }\n );\n\n // ── DELETE /api/nodes/:id ──────────────────────────────────────────────────\n\n app.delete<{ Params: { id: string } }>(\n '/api/nodes/:id',\n {\n schema: {\n params: {\n type: 'object',\n required: ['id'],\n properties: {\n id: {\n type: 'string',\n minLength: 1,\n maxLength: 64,\n pattern: '^[a-z][a-z0-9-]*$',\n },\n },\n },\n },\n },\n async (request, reply) => {\n if (!acquireNodeLifecycleMutex()) {\n return reply.status(409).send({ error: 'node_lifecycle_in_flight' });\n }\n\n try {\n const { id } = request.params;\n const homeDir = dirname(deps.configPath);\n const nodesYamlPath = join(homeDir, 'nodes.yaml');\n const millConfigPath = join(homeDir, 'mill.config.json');\n\n const yaml = await readNodesYaml(nodesYamlPath);\n const entry = yaml.entries.find((e) => e.id === id);\n if (!entry) {\n return reply.status(404).send({ error: 'unknown_node', id });\n }\n\n // Reverse pipeline — each step is idempotent\n\n // Step 1: deregister from connector FIRST (stop routing before stopping container)\n request.log.info(\n {\n event: 'node_lifecycle_step',\n step: 'deregister-peer',\n type: entry.type,\n peerId: entry.peerId,\n },\n 'DELETE step 1: deregistering peer from connector'\n );\n try {\n await deps.connectorAdmin.removePeer(entry.peerId);\n } catch (err: unknown) {\n const errMsg = sanitizeErrorMessage(\n err instanceof Error ? err.message : String(err)\n );\n request.log.error(\n {\n event: 'node_lifecycle_failure',\n step: 'deregister-peer',\n err: errMsg,\n },\n 'DELETE step 1 failed: deregister-peer'\n );\n return reply\n .status(502)\n .send({ step: 'deregister-peer', err: errMsg });\n }\n\n // Step 2: stop + remove container (idempotent — not running = no-op)\n request.log.info(\n {\n event: 'node_lifecycle_step',\n step: 'stop-container',\n type: entry.type,\n },\n 'DELETE step 2: stopping container'\n );\n try {\n await deps.orchestrator.stopNodeViaCompose(entry.type);\n } catch (err: unknown) {\n const errMsg = sanitizeErrorMessage(\n err instanceof Error ? err.message : String(err)\n );\n request.log.error(\n {\n event: 'node_lifecycle_failure',\n step: 'stop-container',\n err: errMsg,\n },\n 'DELETE step 2 failed: stop-container'\n );\n return reply\n .status(502)\n .send({ step: 'stop-container', err: errMsg });\n }\n\n // Step 3: remove yaml entry (idempotent — if entry not present, writes same array)\n request.log.info(\n {\n event: 'node_lifecycle_step',\n step: 'remove-yaml',\n type: entry.type,\n },\n 'DELETE step 3: removing nodes.yaml entry'\n );\n try {\n await writeNodesYaml(nodesYamlPath, {\n entries: yaml.entries.filter((e) => e.id !== id),\n });\n } catch (err: unknown) {\n const errMsg = sanitizeErrorMessage(\n err instanceof Error ? err.message : String(err)\n );\n request.log.error(\n {\n event: 'node_lifecycle_failure',\n step: 'remove-yaml',\n err: errMsg,\n },\n 'DELETE step 3 failed: remove-yaml'\n );\n // P1: yaml write failure is disk-class (500), not docker/connector (502).\n return reply.status(500).send({ step: 'remove-yaml', err: errMsg });\n }\n\n // Step 3b: mill only — remove mill.config.json (force: true = idempotent)\n if (entry.type === 'mill') {\n await fs.rm(millConfigPath, { force: true });\n }\n\n request.log.info(\n { event: 'node_lifecycle_deleted', id, type: entry.type },\n 'Node deprovisioned successfully'\n );\n\n return reply.status(200).send({ id, type: entry.type });\n } finally {\n releaseNodeLifecycleMutex();\n }\n }\n );\n}\n\n// ── Rollback helpers ───────────────────────────────────────────────────────\n// Each helper is \"safe\" — rollback failures are logged AND returned as a\n// string so the route can surface them in the response body's `rollbackError`\n// field (P6). The original step's HTTP response is still returned regardless —\n// the rollback error is auxiliary, not a second error class. Returns undefined\n// on rollback success.\n\ntype RollbackRequest = Pick<FastifyRequest, 'log'>;\n\n/**\n * Remove the entry we just added from nodes.yaml.\n *\n * P13: re-reads the file inside the helper and filters out only `addedPeerId`\n * (instead of restoring a pre-pipeline snapshot). This is robust to external\n * edits during the up-to-60s healthcheck window — anything an operator or\n * another writer added stays intact, while our entry is removed.\n *\n * Idempotent: entry already absent is a no-op write of the same array.\n */\nasync function safeRollbackYaml(\n nodesYamlPath: string,\n addedPeerId: string,\n request: RollbackRequest\n): Promise<string | undefined> {\n try {\n const current = await readNodesYaml(nodesYamlPath);\n const filtered = current.entries.filter((e) => e.peerId !== addedPeerId);\n await writeNodesYaml(nodesYamlPath, { entries: filtered });\n return undefined;\n } catch (err: unknown) {\n const errMsg = sanitizeErrorMessage(\n err instanceof Error ? err.message : String(err)\n );\n request.log.error(\n {\n event: 'node_lifecycle_rollback_failure',\n step: 'write-yaml',\n err: errMsg,\n },\n 'Rollback: failed to remove yaml entry — operator may need to hand-edit nodes.yaml'\n );\n return `write-yaml: ${errMsg}`;\n }\n}\n\nasync function safeRollbackMillConfig(\n millConfigPath: string,\n request: RollbackRequest\n): Promise<string | undefined> {\n try {\n await fs.rm(millConfigPath, { force: true });\n return undefined;\n } catch (err: unknown) {\n const errMsg = sanitizeErrorMessage(\n err instanceof Error ? err.message : String(err)\n );\n request.log.error(\n {\n event: 'node_lifecycle_rollback_failure',\n step: 'remove-mill-config',\n err: errMsg,\n },\n 'Rollback: failed to remove mill.config.json'\n );\n return `remove-mill-config: ${errMsg}`;\n }\n}\n\nasync function safeRollbackStop(\n type: NodeType,\n orchestrator: ApiDeps['orchestrator'],\n request: RollbackRequest\n): Promise<string | undefined> {\n try {\n await orchestrator.stopNodeViaCompose(type);\n return undefined;\n } catch (err: unknown) {\n const errMsg = sanitizeErrorMessage(\n err instanceof Error ? err.message : String(err)\n );\n request.log.error(\n {\n event: 'node_lifecycle_rollback_failure',\n step: 'stop-container',\n err: errMsg,\n },\n 'Rollback: failed to stop container — operator may need to docker rm by hand'\n );\n return `stop-container: ${errMsg}`;\n }\n}\n\n/**\n * Collapse one-or-more rollback-error strings into a single response-body\n * field. Returns undefined when every rollback step succeeded so the field\n * stays absent in the JSON.\n */\nfunction combineRollbackErrors(\n ...errors: (string | undefined)[]\n): string | undefined {\n const present = errors.filter((e): e is string => e !== undefined);\n if (present.length === 0) return undefined;\n return present.join('; ');\n}\n\n// Matches `KEY=value` where KEY is a known-secret name; redacts the value\n// up to the next whitespace, quote, or newline. Compiled once at module scope\n// so repeated error-path calls don't re-join the array and re-compile the RegExp.\nconst SECRET_KEYS = [\n 'TOWN_SECRET_KEY',\n 'MILL_SECRET_KEY',\n 'DVM_SECRET_KEY',\n 'TOWN_SETTLEMENT_PRIVATE_KEY',\n 'MILL_SETTLEMENT_PRIVATE_KEY',\n 'DVM_SETTLEMENT_PRIVATE_KEY',\n 'MILL_MNEMONIC',\n 'TOWNHOUSE_WALLET_PASSWORD',\n];\nconst REDACT_RE = new RegExp(`(${SECRET_KEYS.join('|')})=[^\\\\s\"'\\\\n\\\\r]+`, 'g');\n\n/**\n * Strip secret-name env assignments from an error message before it reaches\n * the HTTP response body (P5). Compose stderr can echo env interpolation in\n * error output; secrets injected via `startNodeViaCompose` would otherwise\n * surface to the API client. Conservative: replace the VALUE not the key, so\n * operators still see WHICH secret was involved.\n */\nfunction sanitizeErrorMessage(msg: string): string {\n return msg.replace(REDACT_RE, '$1=[REDACTED]');\n}\n","/**\n * WebSocket metrics route: WS /metrics\n *\n * Supports an optional `?subscribe=...` query parameter for relay-event subscriptions.\n * Format: `?subscribe=relayEvents:<nodeId>,relayEvents:<nodeId2>,...`\n * For each `relayEvents:<nodeId>` subscription, the server opens an upstream WebSocket\n * to the Town container's relay and forwards Nostr events to the client.\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport { WebSocket } from 'ws';\nimport { decode as decodeToon } from '@toon-format/toon';\nimport type { ApiDeps, WsMessage, NostrEventPayload } from '../types.js';\n\n/** Maximum buffer size before dropping old messages */\nconst MAX_BUFFER_SIZE = 100;\n\n/** Track open WebSocket connections for graceful shutdown (AC #10) */\nconst openWebSockets = new Set<WebSocket>();\n\n/** Get the set of open WebSocket connections (for server.ts close()) */\nexport function getOpenWebSockets(): Set<WebSocket> {\n return openWebSockets;\n}\n\n/** Flush interval for message batching (ms) */\nconst FLUSH_INTERVAL_MS = 100;\n\n/** Metrics poll interval (ms) */\nconst METRICS_POLL_INTERVAL_MS = 1000;\n\n/** Heartbeat interval (ms) */\nconst HEARTBEAT_INTERVAL_MS = 15000;\n\n/**\n * Parse `relayEvents:<nodeId>` subscription tokens from the `?subscribe=` query param.\n * Returns an array of nodeIds to subscribe to.\n */\nfunction parseRelayEventSubscriptions(queryString: string): string[] {\n if (!queryString) return [];\n const params = new URLSearchParams(queryString);\n const subscribeParam = params.get('subscribe');\n if (!subscribeParam) return [];\n\n const nodeIds: string[] = [];\n for (const token of subscribeParam.split(',')) {\n const trimmed = token.trim();\n if (trimmed.startsWith('relayEvents:')) {\n const nodeId = trimmed.slice('relayEvents:'.length);\n if (nodeId) nodeIds.push(nodeId);\n }\n }\n return nodeIds;\n}\n\n/**\n * Register WebSocket metrics route.\n */\nexport function registerMetricsWsRoutes(\n app: FastifyInstance,\n deps: ApiDeps\n): void {\n // Register websocket plugin handler\n app.get('/metrics', { websocket: true }, (socket, request) => {\n const logger = deps.logger ?? app.log;\n logger.info({ client: request.ip }, 'WebSocket client connected');\n\n // Track this connection for graceful shutdown\n openWebSockets.add(socket);\n\n // Per-socket message buffer\n const messageBuffer: WsMessage[] = [];\n\n // Track timers for cleanup\n const timers: NodeJS.Timeout[] = [];\n\n // Per-client upstream relay WebSocket connections: nodeId → WebSocket\n const upstreamSockets = new Map<string, WebSocket>();\n\n // ── relayEvents subscriptions ─────────────────────────────────────────────\n const rawQuery = request.url.includes('?')\n ? request.url.slice(request.url.indexOf('?') + 1)\n : '';\n const relayNodeIds = parseRelayEventSubscriptions(rawQuery);\n\n // Open upstream WS for each subscribed nodeId (async, non-blocking)\n if (relayNodeIds.length > 0) {\n void (async () => {\n for (const nodeId of relayNodeIds) {\n if (socket.readyState !== WebSocket.OPEN) break;\n try {\n const relayUrl =\n await deps.orchestrator.getNodeRelayEndpoint(nodeId);\n const upstream = new WebSocket(relayUrl);\n upstreamSockets.set(nodeId, upstream);\n\n // Track the latest event timestamp for incremental polling.\n // Start 60 s back to show recent events on connect.\n let sinceTs = Math.floor(Date.now() / 1000) - 60;\n // Dedup events already forwarded in this session. Capped to prevent\n // unbounded memory growth on long-lived connections to busy relays.\n const MAX_SEEN_IDS = 10_000;\n const seenEventIds = new Set<string>();\n const subId = `live-${nodeId}`;\n\n function sendReq() {\n if (upstream.readyState === WebSocket.OPEN) {\n upstream.send(\n JSON.stringify([\n 'REQ',\n subId,\n {\n kinds: [0, 1, 6, 7, 9735],\n since: sinceTs,\n },\n ])\n );\n }\n }\n\n // Subscribe for live events once the upstream relay accepts the connection.\n // Also poll every 5 s via re-REQ so events stored via /handle-packet (which\n // currently do not trigger broadcastEvent in older relay builds) are surfaced.\n let pollTimer: NodeJS.Timeout | null = null;\n upstream.on('open', () => {\n sendReq();\n pollTimer = setInterval(sendReq, 5_000);\n });\n\n upstream.on('message', (data: Buffer | string) => {\n if (socket.readyState !== WebSocket.OPEN) return;\n try {\n const msg = JSON.parse(data.toString()) as unknown;\n let payload: NostrEventPayload | undefined;\n\n if (Array.isArray(msg) && msg[0] === 'EVENT' && msg[2]) {\n // Real relay: NIP-01 [\"EVENT\", sub_id, toon_string]\n payload = decodeToon(\n msg[2] as string\n ) as unknown as NostrEventPayload;\n } else if (\n msg !== null &&\n typeof msg === 'object' &&\n !Array.isArray(msg)\n ) {\n // Test stub: raw JSON event object\n payload = msg as NostrEventPayload;\n }\n\n if (payload) {\n const eventId = (payload as { id?: string }).id ?? '';\n if (eventId && seenEventIds.has(eventId)) return; // dedup\n if (eventId) {\n seenEventIds.add(eventId);\n if (seenEventIds.size > MAX_SEEN_IDS) {\n const oldest = seenEventIds.values().next().value;\n if (oldest !== undefined) seenEventIds.delete(oldest);\n }\n }\n // Advance sinceTs so the next poll only fetches newer events.\n const createdAt = (payload as { created_at?: number })\n .created_at;\n if (typeof createdAt === 'number' && createdAt >= sinceTs) {\n sinceTs = createdAt;\n }\n addToBuffer({\n type: 'relayEvents',\n nodeId,\n payload,\n ts: Date.now(),\n });\n }\n } catch {\n // Malformed or non-event message from upstream relay — skip\n }\n });\n\n upstream.on('error', (err) => {\n logger.warn({ err, nodeId }, 'Upstream relay WS error');\n });\n\n upstream.on('close', () => {\n if (pollTimer) {\n clearInterval(pollTimer);\n pollTimer = null;\n }\n upstreamSockets.delete(nodeId);\n // Notify the dashboard client so it can surface the AC-7 error UI\n // instead of silently showing an empty \"No events yet\" feed.\n addToBuffer({\n type: 'relayEventsStatus',\n nodeId,\n connected: false,\n ts: Date.now(),\n });\n });\n } catch (err) {\n logger.warn({ err, nodeId }, 'Failed to open upstream relay WS');\n }\n }\n })();\n }\n\n // ── Metrics poll ──────────────────────────────────────────────────────────\n let metricsPollPending = false;\n const metricsTimer = setInterval(async () => {\n if (metricsPollPending) {\n return; // Skip this poll, previous one still in flight\n }\n metricsPollPending = true;\n try {\n const metricsRes = await deps.connectorAdmin.getMetrics();\n if (metricsRes) {\n // ConnectorAdminClient.getMetrics() returns the connector's\n // /admin/metrics.json shape; aggregate counters live under `aggregate`.\n const payload = {\n packetsForwarded: metricsRes.aggregate.packetsForwarded,\n packetsRejected: metricsRes.aggregate.packetsRejected,\n bytesSent: metricsRes.aggregate.bytesSent,\n attribution: 'aggregate' as const,\n available: true,\n };\n addToBuffer({\n type: 'metrics',\n payload,\n ts: Date.now(),\n });\n }\n } catch {\n // Connector down or /metrics not available — add unavailable marker\n addToBuffer({\n type: 'metrics',\n payload: {\n packetsForwarded: 0,\n packetsRejected: 0,\n bytesSent: 0,\n attribution: 'aggregate',\n available: false,\n },\n ts: Date.now(),\n });\n } finally {\n metricsPollPending = false;\n }\n }, METRICS_POLL_INTERVAL_MS);\n timers.push(metricsTimer);\n\n // ── Container state event listeners ───────────────────────────────────────\n\n const onContainerState = (data: { name: string; state: string }) => {\n addToBuffer({\n type: 'nodeState',\n payload: data,\n ts: Date.now(),\n });\n };\n deps.orchestrator.on('containerState', onContainerState);\n\n // Pull progress events\n const onPullProgress = (data: {\n image: string;\n status: string;\n progress?: string;\n }) => {\n addToBuffer({\n type: 'nodeState',\n payload: { name: `pull:${data.image}`, state: data.status },\n ts: Date.now(),\n });\n };\n deps.orchestrator.on('pullProgress', onPullProgress);\n\n // Connector restart events (AC-12 in story 21.10)\n const onConnectorRestarting = () => {\n addToBuffer({\n type: 'connectorRestarting',\n ts: Date.now(),\n });\n };\n deps.orchestrator.on('connectorRestarting', onConnectorRestarting);\n\n const onConnectorRestarted = () => {\n addToBuffer({\n type: 'connectorRestarted',\n ts: Date.now(),\n });\n // Also emit legacy nodeState for backward compat with older clients\n addToBuffer({\n type: 'nodeState',\n payload: { name: 'connector', state: 'restarted' },\n ts: Date.now(),\n });\n };\n deps.orchestrator.on('connectorRestarted', onConnectorRestarted);\n\n // ── Heartbeat ─────────────────────────────────────────────────────────────\n\n const heartbeatTimer = setInterval(() => {\n addToBuffer({\n type: 'heartbeat',\n ts: Date.now(),\n });\n }, HEARTBEAT_INTERVAL_MS);\n timers.push(heartbeatTimer);\n\n // ── Flush ─────────────────────────────────────────────────────────────────\n\n const flushTimer = setInterval(() => {\n flushBuffer(socket);\n }, FLUSH_INTERVAL_MS);\n timers.push(flushTimer);\n\n // Add message to buffer with backpressure handling\n function addToBuffer(message: WsMessage): void {\n messageBuffer.push(message);\n\n // If buffer exceeds max, drop oldest metrics (keep latest)\n if (messageBuffer.length > MAX_BUFFER_SIZE) {\n const idx = messageBuffer.findIndex((m) => m.type === 'metrics');\n if (idx >= 0) {\n messageBuffer.splice(idx, 1);\n } else {\n messageBuffer.shift();\n }\n }\n }\n\n // Flush buffer with batching logic\n function flushBuffer(_ws: WebSocket): void {\n if (messageBuffer.length === 0) {\n return;\n }\n\n if (socket.readyState !== WebSocket.OPEN) {\n return;\n }\n\n if (messageBuffer.length === 1) {\n socket.send(JSON.stringify(messageBuffer[0]));\n } else {\n // Batch multiple messages\n const batch: WsMessage = {\n type: 'batch',\n messages: [...messageBuffer],\n ts: Date.now(),\n };\n socket.send(JSON.stringify(batch));\n }\n\n messageBuffer.length = 0;\n }\n\n // ── Incoming messages (unsubscribe) ──────────────────────────────────────\n\n socket.on('message', (data: Buffer | string) => {\n try {\n const msg = JSON.parse(data.toString()) as {\n type?: string;\n nodeId?: string;\n };\n if (msg.type === 'unsubscribe' && typeof msg.nodeId === 'string') {\n const upstream = upstreamSockets.get(msg.nodeId);\n if (upstream) {\n try {\n upstream.close();\n } catch {\n /* best-effort */\n }\n upstreamSockets.delete(msg.nodeId);\n }\n }\n } catch {\n // Malformed control message — ignore\n }\n });\n\n // ── Cleanup on disconnect ─────────────────────────────────────────────────\n\n socket.on('close', () => {\n logger.info({ client: request.ip }, 'WebSocket client disconnected');\n\n // Remove from tracking set\n openWebSockets.delete(socket);\n\n // Clear all timers\n for (const timer of timers) {\n clearInterval(timer);\n }\n\n // Remove orchestrator event listeners\n deps.orchestrator.off('containerState', onContainerState);\n deps.orchestrator.off('pullProgress', onPullProgress);\n deps.orchestrator.off('connectorRestarting', onConnectorRestarting);\n deps.orchestrator.off('connectorRestarted', onConnectorRestarted);\n\n // Close all upstream relay WebSocket connections\n for (const [, ws] of upstreamSockets) {\n try {\n ws.close();\n } catch {\n // best-effort\n }\n }\n upstreamSockets.clear();\n });\n\n // Handle socket errors\n socket.on('error', (error) => {\n logger.error({ err: error, client: request.ip }, 'WebSocket error');\n });\n });\n}\n","/**\n * Wizard API routes: GET /wizard/state, POST /wizard/mnemonic-preview,\n * POST /wizard/init, WS /wizard/progress.\n *\n * SECURITY: Mnemonic and password are never logged, never stored in module scope.\n */\n\nimport { existsSync, unlinkSync, chmodSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { FastifyInstance } from 'fastify';\nimport type { IncomingMessage } from 'node:http';\nimport { WebSocket } from 'ws';\nimport { generateMnemonic, validateMnemonic } from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english.js';\nimport type { WizardInitRequest, WizardProgressMessage } from '../types.js';\nimport {\n WalletManager,\n encryptWallet,\n saveWallet,\n} from '../../wallet/index.js';\nimport { saveConfig } from '../../config/loader.js';\nimport { getDefaultConfig } from '../../config/defaults.js';\nimport type { TownhouseConfig } from '../../config/schema.js';\nimport type { NodeType } from '../../docker/types.js';\n\nexport interface WizardDeps {\n configPath: string;\n walletPath: string;\n}\n\nexport interface WizardTransitionState {\n mode: 'wizard' | 'normal';\n /** Buffered progress messages for late-connecting WS clients (wizard mode only) */\n progressBuffer?: WizardProgressMessage[];\n /** Active WS connections to forward events to (wizard mode only) */\n progressSockets?: Set<WebSocket>;\n /** Single in-flight init guard — prevents concurrent POST /wizard/init from racing past existsSync */\n initInFlight?: boolean;\n}\n\nexport type OnInitCallback = (\n config: TownhouseConfig,\n wallet: WalletManager,\n profiles: NodeType[]\n) => Promise<void>;\n\n/** Cap progress buffer to bound memory during long Docker pulls */\nexport const PROGRESS_BUFFER_MAX = 200;\n\n/** Allowed Origin hostnames for cross-origin WS upgrades on the wizard */\nconst ALLOWED_WS_ORIGIN_HOSTS = new Set([\n 'localhost',\n '127.0.0.1',\n '[::1]',\n '::1',\n]);\n\nfunction isAllowedWsOrigin(origin: string | undefined): boolean {\n if (!origin) return true; // same-origin WS request has no Origin header in some clients; the OS-level loopback bind already restricts\n try {\n const url = new URL(origin);\n return ALLOWED_WS_ORIGIN_HOSTS.has(url.hostname);\n } catch {\n return false;\n }\n}\n\n/**\n * Register wizard-scoped routes.\n * In 'wizard' mode: all wizard routes are active.\n * In 'normal' mode: only GET /wizard/state returns normal-mode payload; other routes refuse.\n */\nexport function registerWizardRoutes(\n app: FastifyInstance,\n deps: WizardDeps,\n state: WizardTransitionState,\n onInit?: OnInitCallback\n): void {\n // GET /wizard/state — registered in BOTH wizard and normal mode\n app.get('/wizard/state', async (_request, reply) => {\n const configExists = existsSync(deps.configPath);\n const walletExists = existsSync(deps.walletPath);\n // `containers_running` reflects whether the wizard server has transitioned\n // to normal mode (i.e., orchestrator.up() resolved at least once). It does\n // NOT track live container health — a container that dies post-transition\n // will not flip this back to false. The SPA uses this to know it can navigate\n // off /wizard, not as a liveness indicator.\n const containersRunning = state.mode === 'normal';\n\n return reply.status(200).send({\n config_exists: configExists,\n wallet_exists: walletExists,\n containers_running: containersRunning,\n mode: state.mode,\n ts: Date.now(),\n });\n });\n\n // POST /wizard/mnemonic-preview — stateless preview; disabled after transition\n app.post('/wizard/mnemonic-preview', async (_request, reply) => {\n if (state.mode === 'normal') {\n return reply.status(503).send({ error: 'wizard_already_completed' });\n }\n // SECURITY: mnemonic generated fresh per request, never logged, never stored\n const mnemonic = generateMnemonic(wordlist, 128);\n return reply.status(200).send({ mnemonic });\n });\n\n // POST /wizard/init — validate, write wallet + config, fire async launch\n app.post('/wizard/init', async (request, reply) => {\n if (state.mode === 'normal') {\n return reply.status(409).send({\n code: 'wizard_already_completed',\n message: 'Setup is already complete.',\n });\n }\n\n // Concurrent-init guard: serialize against double-clicks and parallel POSTs.\n // The `wallet.enc` write below also uses O_EXCL ('wx') as a TOCTOU backstop.\n if (state.initInFlight) {\n return reply.status(409).send({\n code: 'init_in_flight',\n message: 'A setup is already in progress.',\n });\n }\n state.initInFlight = true;\n\n try {\n const body = request.body as Partial<WizardInitRequest> | null;\n if (!body || typeof body !== 'object') {\n return reply\n .status(400)\n .send({ code: 'invalid_request', message: 'Request body required.' });\n }\n\n // Validate password — boundary-trim trailing whitespace check; passwords with leading/trailing\n // whitespace are silently corrupted by browser autofill and cannot be decrypted later.\n const password = body.password;\n if (\n typeof password !== 'string' ||\n password.length === 0 ||\n password.length > 256\n ) {\n return reply.status(400).send({\n code: 'password_invalid',\n message: 'password must be 1–256 characters.',\n });\n }\n if (password !== password.trim()) {\n return reply.status(400).send({\n code: 'password_invalid',\n message: 'password cannot have leading or trailing whitespace.',\n });\n }\n if (password !== body.password_confirm) {\n return reply.status(400).send({\n code: 'password_mismatch',\n message: 'Passwords do not match.',\n });\n }\n\n // Validate mnemonic_mode\n const mnemonicMode = body.mnemonic_mode;\n if (mnemonicMode !== 'generate' && mnemonicMode !== 'import') {\n return reply.status(400).send({\n code: 'mnemonic_mode_invalid',\n message: 'mnemonic_mode must be \"generate\" or \"import\".',\n });\n }\n\n // Validate mnemonic (both modes require a valid phrase — server validates regardless of source)\n const mnemonic = body.mnemonic;\n if (\n !mnemonic ||\n typeof mnemonic !== 'string' ||\n mnemonic.trim().length === 0\n ) {\n return reply\n .status(400)\n .send({ code: 'mnemonic_invalid', message: 'mnemonic is required.' });\n }\n if (!validateMnemonic(mnemonic.trim(), wordlist)) {\n return reply.status(400).send({\n code: 'mnemonic_invalid',\n message: 'Invalid BIP-39 mnemonic.',\n });\n }\n const cleanMnemonic = mnemonic.trim();\n\n // backup_ack enforcement (Risk R-022) — applies to both generate and import modes\n if (body.backup_ack !== true) {\n return reply.status(400).send({\n code: 'backup_not_acknowledged',\n message:\n 'You must confirm you have backed up your seed phrase before continuing.',\n });\n }\n\n // Validate nodes\n const nodes = body.nodes;\n if (!nodes || typeof nodes !== 'object') {\n return reply\n .status(400)\n .send({ code: 'no_nodes_selected', message: 'nodes is required.' });\n }\n const atLeastOne =\n nodes.town?.enabled || nodes.mill?.enabled || nodes.dvm?.enabled;\n if (!atLeastOne) {\n return reply.status(400).send({\n code: 'no_nodes_selected',\n message: 'At least one node must be enabled.',\n });\n }\n\n // Validate fee ranges\n if (nodes.town?.enabled && nodes.town.feePerEvent !== undefined) {\n if (\n !Number.isInteger(nodes.town.feePerEvent) ||\n nodes.town.feePerEvent < 0 ||\n nodes.town.feePerEvent > 1000\n ) {\n return reply.status(400).send({\n code: 'fee_out_of_range',\n message: 'nodes.town.feePerEvent must be 0–1000.',\n });\n }\n }\n if (nodes.mill?.enabled && nodes.mill.feeBasisPoints !== undefined) {\n if (\n !Number.isInteger(nodes.mill.feeBasisPoints) ||\n nodes.mill.feeBasisPoints < 0 ||\n nodes.mill.feeBasisPoints > 100\n ) {\n return reply.status(400).send({\n code: 'fee_out_of_range',\n message: 'nodes.mill.feeBasisPoints must be 0–100.',\n });\n }\n }\n if (nodes.dvm?.enabled && nodes.dvm.feePerJob !== undefined) {\n if (\n !Number.isInteger(nodes.dvm.feePerJob) ||\n nodes.dvm.feePerJob < 0 ||\n nodes.dvm.feePerJob > 100000\n ) {\n return reply.status(400).send({\n code: 'fee_out_of_range',\n message: 'nodes.dvm.feePerJob must be 0–100000.',\n });\n }\n }\n\n // Validate transport\n const transport = body.transport;\n if (\n !transport ||\n (transport.mode !== 'direct' && transport.mode !== 'ator')\n ) {\n return reply.status(400).send({\n code: 'transport_invalid',\n message: 'transport.mode must be \"direct\" or \"ator\".',\n });\n }\n\n // Conflict checks — TOCTOU-resilient: the wallet.enc write below uses O_EXCL ('wx').\n if (existsSync(deps.walletPath)) {\n return reply.status(409).send({\n code: 'wallet_already_exists',\n message: `A wallet already exists at ${deps.walletPath}. Delete it first.`,\n });\n }\n if (existsSync(deps.configPath)) {\n return reply.status(409).send({\n code: 'config_already_exists',\n message: `A config already exists at ${deps.configPath}. Delete it first.`,\n });\n }\n\n // Create + save wallet. saveWallet writes with mode 0o600 already.\n // Concurrent inits are serialized by `state.initInFlight` above; a stray\n // external process writing wallet.enc between existsSync and saveWallet\n // is an accepted edge case for v1 (single-machine localhost wizard).\n const walletManager = new WalletManager({\n encryptedPath: deps.walletPath,\n });\n await walletManager.fromMnemonic(cleanMnemonic);\n // SECURITY: encrypted immediately, plaintext mnemonic leaves scope after this call\n const encrypted = encryptWallet(cleanMnemonic, password);\n await saveWallet(deps.walletPath, encrypted);\n // Defensive chmod (saveWallet already sets 0o600 but a hostile umask on\n // exotic platforms could still produce a too-open file; cheap to assert).\n try {\n chmodSync(deps.walletPath, 0o600);\n } catch {\n /* best-effort */\n }\n\n // Build + save config — if this throws, roll back the wallet write.\n let config: TownhouseConfig;\n try {\n config = buildConfigFromRequest(\n body as WizardInitRequest,\n deps.configPath\n );\n saveConfig(deps.configPath, config);\n } catch (err) {\n try {\n unlinkSync(deps.walletPath);\n } catch {\n /* best-effort */\n }\n throw err;\n }\n\n // Return 202 before async launch — reply is sent first\n await reply.status(202).send({ status: 'launching' });\n\n // Fire-and-forget: transition to normal mode + start orchestrator.\n // On failure, roll back wallet+config so the operator can retry without\n // hitting 409 wallet_already_exists / config_already_exists.\n if (onInit) {\n const profiles: NodeType[] = [];\n if (nodes.town?.enabled) profiles.push('town');\n if (nodes.mill?.enabled) profiles.push('mill');\n if (nodes.dvm?.enabled) profiles.push('dvm');\n\n onInit(config, walletManager, profiles).catch((err: unknown) => {\n app.log.error({ err }, 'Wizard launch failed');\n try {\n unlinkSync(deps.walletPath);\n } catch {\n /* best-effort */\n }\n try {\n unlinkSync(deps.configPath);\n } catch {\n /* best-effort */\n }\n // Allow a fresh retry: clear the in-flight flag so the next POST passes the guard.\n state.initInFlight = false;\n const errMsg: WizardProgressMessage = {\n type: 'error',\n message: err instanceof Error ? err.message : String(err),\n ts: Date.now(),\n };\n if (state.progressBuffer) {\n state.progressBuffer.push(errMsg);\n if (state.progressBuffer.length > PROGRESS_BUFFER_MAX) {\n state.progressBuffer.splice(\n 0,\n state.progressBuffer.length - PROGRESS_BUFFER_MAX\n );\n }\n }\n if (state.progressSockets) {\n for (const socket of state.progressSockets) {\n try {\n if (socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(errMsg));\n }\n } catch {\n /* best-effort */\n }\n }\n }\n });\n }\n\n return reply;\n } finally {\n // The success path keeps initInFlight=true to block double-submits while\n // the orchestrator boots; only an error in onInit (above) clears it. If\n // we never reached the onInit branch (e.g., 4xx validation), clear here.\n // We detect this by checking whether reply was already sent with 202.\n // Simpler: the outer success path sets it; validation failures must reset.\n const sent = reply.statusCode;\n if (sent !== 202) {\n state.initInFlight = false;\n }\n }\n });\n\n // WS /wizard/progress — only active in wizard mode (progress sockets are wizard-only).\n // CSWSH defense: enforce Origin header allowlist on upgrade.\n app.get('/wizard/progress', { websocket: true }, (socket, req) => {\n const origin = (req.raw as IncomingMessage).headers?.origin;\n if (!isAllowedWsOrigin(origin)) {\n try {\n socket.close(1008, 'origin_not_allowed');\n } catch {\n /* best-effort */\n }\n return;\n }\n\n const sockets = state.progressSockets;\n if (!sockets) {\n // Normal mode: close immediately (wizard is complete)\n socket.close(1001, 'wizard_complete');\n return;\n }\n\n sockets.add(socket);\n\n // Replay buffered messages for late-connecting clients\n if (state.progressBuffer) {\n for (const msg of state.progressBuffer) {\n try {\n socket.send(JSON.stringify(msg));\n } catch {\n /* best-effort */\n }\n }\n }\n\n socket.on('close', () => {\n sockets.delete(socket);\n });\n\n socket.on('error', () => {\n sockets.delete(socket);\n });\n });\n}\n\n/**\n * Build a TownhouseConfig from a WizardInitRequest by merging with defaults.\n * Uses path.dirname/join for cross-platform path handling.\n */\nexport function buildConfigFromRequest(\n request: WizardInitRequest,\n configPath: string\n): TownhouseConfig {\n const config = getDefaultConfig();\n\n // Point wallet path at the same directory as config — works on POSIX and Windows.\n const configDir = dirname(configPath);\n config.wallet.encrypted_path = join(configDir, 'wallet.enc');\n\n // Apply node selections and fees\n config.nodes.town.enabled = request.nodes.town.enabled;\n if (\n request.nodes.town.enabled &&\n request.nodes.town.feePerEvent !== undefined\n ) {\n config.nodes.town.feePerEvent = request.nodes.town.feePerEvent;\n }\n\n config.nodes.mill.enabled = request.nodes.mill.enabled;\n if (\n request.nodes.mill.enabled &&\n request.nodes.mill.feeBasisPoints !== undefined\n ) {\n config.nodes.mill.feeBasisPoints = request.nodes.mill.feeBasisPoints;\n }\n\n config.nodes.dvm.enabled = request.nodes.dvm.enabled;\n if (request.nodes.dvm.enabled && request.nodes.dvm.feePerJob !== undefined) {\n config.nodes.dvm.feePerJob = request.nodes.dvm.feePerJob;\n }\n\n // Apply transport\n config.transport.mode = request.transport.mode;\n\n return config;\n}\n","/**\n * Transport configuration routes.\n *\n * GET /api/transport — live transport status (mode, reachability, latency)\n * PATCH /api/transport — flip transport mode + trigger connector restart\n */\n\nimport type { FastifyInstance, FastifySchema } from 'fastify';\nimport type {\n ApiDeps,\n NodeType,\n TransportStatusPayload,\n TransportPatchRequest,\n TransportPatchResponse,\n} from '../types.js';\nimport { validateConfig } from '../../config/validator.js';\nimport { saveConfig } from '../../config/loader.js';\nimport { acquireConfigMutex, releaseConfigMutex } from '../config-mutex.js';\n\nconst DEFAULT_ATOR_PROXY = 'socks5h://proxy.ator.io:9050';\n\nexport interface RegisterTransportOptions {\n /**\n * 'wizard' — registers GET only (no PATCH at all). Caller must call\n * registerTransportPatchRoute() after wizard transition completes.\n * 'patch-only'— registers PATCH only (used by the wizard-to-normal transition).\n * 'normal' — registers both GET and PATCH (the standalone-server case).\n */\n mode?: 'normal' | 'wizard' | 'patch-only';\n}\n\n/** Normalize a SOCKS5 URL for byte-comparable equality (trailing slash, casing). */\nfunction normalizeProxyUrl(url: string | undefined): string | undefined {\n if (!url) return undefined;\n try {\n return new URL(url).toString();\n } catch {\n return url;\n }\n}\n\nconst patchBodySchema: FastifySchema = {\n body: {\n type: 'object',\n additionalProperties: false,\n required: ['mode'],\n properties: {\n mode: { type: 'string', enum: ['direct', 'ator'] },\n socksProxy: { type: 'string', minLength: 1, maxLength: 2048 },\n },\n },\n};\n\n/**\n * Register transport routes on the given Fastify instance.\n */\nexport function registerTransportRoutes(\n app: FastifyInstance,\n deps: ApiDeps,\n opts: RegisterTransportOptions = {}\n): void {\n const { mode = 'normal' } = opts;\n\n // ── GET /api/transport ────────────────────────────────────────────────────\n // Skipped for 'patch-only' mode (caller already registered GET earlier).\n if (mode !== 'patch-only') {\n app.get('/api/transport', async (_request, reply) => {\n // Read deps.transportProbe per request — the wizard server swaps the\n // probe instance on transition, so we cannot capture it at registration time.\n const probeStatus = deps.transportProbe.getStatus();\n const configTransport = deps.config.transport;\n\n const payload: TransportStatusPayload = {\n mode: configTransport.mode,\n reachable:\n configTransport.mode === 'direct' ? true : probeStatus.reachable,\n latencyProxyMs:\n configTransport.mode === 'direct' ? null : probeStatus.latencyProxyMs,\n latencyDirectMs:\n configTransport.mode === 'direct'\n ? null\n : probeStatus.latencyDirectMs,\n lastProbedAt: probeStatus.lastProbedAt,\n probeError:\n configTransport.mode === 'direct' ? null : probeStatus.probeError,\n ts: Date.now(),\n };\n\n if (configTransport.mode === 'ator') {\n payload.socksProxy = configTransport.socksProxy ?? DEFAULT_ATOR_PROXY;\n }\n\n return reply.status(200).send(payload);\n });\n }\n\n // ── PATCH /api/transport ──────────────────────────────────────────────────\n // Wizard mode: GET only — PATCH is added later via registerTransportRoutes\n // with mode 'patch-only' once the wizard transitions to normal.\n if (mode === 'wizard') {\n return;\n }\n\n // Probe handle for PATCH operations. Stable: PATCH is only registered for\n // the deps object the caller intends to mutate transport against.\n const probe = deps.transportProbe;\n\n app.patch<{ Body: TransportPatchRequest }>(\n '/api/transport',\n { schema: patchBodySchema },\n async (request, reply) => {\n const body = request.body;\n\n // Reject socksProxy when mode is direct — silent ignore is ambiguous to the caller\n if (body.mode === 'direct' && body.socksProxy !== undefined) {\n return reply.status(400).send({\n error: 'invalid_body',\n message: 'socksProxy is not allowed when mode is direct',\n });\n }\n\n // Validate socksProxy URL format if provided\n if (body.socksProxy !== undefined) {\n try {\n const u = new URL(body.socksProxy);\n if (u.protocol !== 'socks5:' && u.protocol !== 'socks5h:') {\n return reply.status(400).send({\n error: 'invalid_socksProxy',\n message: 'socksProxy must use socks5:// or socks5h:// scheme',\n });\n }\n if (!u.hostname) {\n return reply.status(400).send({\n error: 'invalid_socksProxy',\n message: 'socksProxy must have a hostname',\n });\n }\n if (u.username || u.password) {\n return reply.status(400).send({\n error: 'invalid_socksProxy',\n message: 'socksProxy must not include credentials in the URL',\n });\n }\n if (u.pathname && u.pathname !== '/') {\n return reply.status(400).send({\n error: 'invalid_socksProxy',\n message: 'socksProxy must not include a path',\n });\n }\n if (!u.port) {\n return reply.status(400).send({\n error: 'invalid_socksProxy',\n message: 'socksProxy must specify a port',\n });\n }\n const portNum = Number(u.port);\n if (!Number.isInteger(portNum) || portNum < 1 || portNum > 65535) {\n return reply.status(400).send({\n error: 'invalid_socksProxy',\n message: 'socksProxy port must be in range 1-65535',\n });\n }\n } catch {\n return reply.status(400).send({\n error: 'invalid_socksProxy',\n message: 'socksProxy must be a valid URL',\n });\n }\n }\n\n const prevMode = deps.config.transport.mode;\n const prevSocksProxy = deps.config.transport.socksProxy;\n const newMode = body.mode;\n const newSocksProxy =\n newMode === 'ator'\n ? (body.socksProxy ?? prevSocksProxy ?? DEFAULT_ATOR_PROXY)\n : undefined;\n\n // No-op detection: same mode and (for ATOR) URL-normalized same proxy\n const noOp =\n prevMode === newMode &&\n (newMode === 'direct' ||\n normalizeProxyUrl(prevSocksProxy) ===\n normalizeProxyUrl(newSocksProxy));\n\n if (noOp) {\n const noOpResponse: TransportPatchResponse = {\n mode: newMode,\n ...(newMode === 'ator' ? { socksProxy: newSocksProxy } : {}),\n restartTriggered: false,\n };\n return reply.status(200).send(noOpResponse);\n }\n\n // Acquire shared config mutex\n if (!acquireConfigMutex()) {\n return reply.status(409).send({ error: 'config_mutation_in_flight' });\n }\n\n // Snapshot the prior probe URL so a failed flip can restore it.\n const priorProbeUrl =\n prevMode === 'ator' ? (prevSocksProxy ?? DEFAULT_ATOR_PROXY) : '';\n\n // Snapshot the full prior transport block so a failed flip can restore\n // exactly what the operator had — not just mode + socksProxy.\n // hiddenService / externalUrl / relayHiddenService are operator-managed\n // fields that the YAML may have set up independently (story 7e28ea9);\n // the PATCH must preserve them across mode flips, otherwise toggling\n // direct→ator→direct would silently strip the hidden-service setup.\n const priorTransport = { ...deps.config.transport };\n\n try {\n // Mutate in-memory config — carry forward all non-mode fields, then\n // override mode and socksProxy per the request.\n const {\n mode: _droppedMode,\n socksProxy: _droppedProxy,\n ...carryOver\n } = priorTransport;\n deps.config.transport = {\n ...carryOver,\n mode: newMode,\n ...(newMode === 'ator' ? { socksProxy: newSocksProxy } : {}),\n };\n\n // Defensive round-trip validation\n try {\n validateConfig(deps.config);\n } catch (validationError) {\n // Roll back in-memory edit (restore the FULL prior block — preserves\n // hiddenService/externalUrl/relayHiddenService).\n deps.config.transport = priorTransport;\n return reply.status(500).send({\n error: 'config_validation_error',\n message:\n validationError instanceof Error\n ? validationError.message\n : 'Invalid configuration',\n });\n }\n\n // Persist to disk — if this fails, restore in-memory state before bailing.\n try {\n await saveConfig(deps.configPath, deps.config);\n } catch (saveError) {\n deps.config.transport = priorTransport;\n return reply.status(500).send({\n error: 'config_save_failed',\n message:\n saveError instanceof Error\n ? saveError.message\n : 'Failed to persist config',\n });\n }\n\n // Compute active nodes\n const activeNodes = Object.entries(deps.config.nodes)\n .filter(([, cfg]) => cfg.enabled)\n .map(([t]) => t as NodeType);\n\n // Trigger connector restart\n try {\n await deps.orchestrator.regenerateConnectorConfig(activeNodes);\n } catch (restartError) {\n // Rollback: restore in-memory config and persist the restoration\n deps.config.transport = priorTransport;\n try {\n await saveConfig(deps.configPath, deps.config);\n } catch {\n // Best-effort rollback of disk write — if this fails, system is in\n // a bad state but we can't do anything further here.\n }\n // Restore probe to its prior target as well so the dashboard\n // doesn't keep reporting reachability for the failed-flip URL.\n try {\n probe.setProxyUrl(priorProbeUrl);\n if (prevMode === 'ator') {\n probe.start();\n } else {\n probe.stop();\n }\n } catch {\n /* best-effort */\n }\n return reply.status(500).send({\n error: 'connector_restart_failed',\n message:\n restartError instanceof Error\n ? restartError.message\n : 'Connector restart failed',\n });\n }\n\n // Update probe. ATOR→ATOR with a different proxy must restart the\n // probe loop so the new URL is adopted immediately rather than at\n // the next 30 s tick.\n try {\n if (newMode === 'ator') {\n const newProbeUrl = newSocksProxy ?? DEFAULT_ATOR_PROXY;\n if (prevMode === 'ator') {\n probe.stop();\n }\n probe.setProxyUrl(newProbeUrl);\n probe.start();\n } else {\n probe.stop();\n }\n } catch (probeError) {\n // The connector restart already succeeded — log and continue.\n const msg =\n probeError instanceof Error\n ? probeError.message\n : String(probeError);\n request.log.warn(`transport probe update after flip failed: ${msg}`);\n }\n\n const restartedAt = Date.now();\n const successResponse: TransportPatchResponse = {\n mode: newMode,\n ...(newMode === 'ator' ? { socksProxy: newSocksProxy } : {}),\n restartTriggered: true,\n restartedAt,\n };\n return reply.status(200).send(successResponse);\n } finally {\n releaseConfigMutex();\n }\n }\n );\n}\n","/**\n * GET /api/earnings — earnings aggregator route (Story 47.2).\n *\n * Returns the canonical `{ status, apex, peers }` earnings shape from\n * `aggregateEarnings()`. Reads `nodes.yaml` per request and constructs a\n * fresh `PeerTypeResolver` — matching the pattern in `nodes-lifecycle.ts`.\n *\n * The `?since=` parameter from Story D4 is gone — TODAY/MONTH/YEAR deltas\n * are anchored on UTC boundaries by the snapshot writer (Story 47.3).\n *\n * Failure modes:\n * - connector outage → aggregator returns 200 with\n * `status: 'connector_unavailable'`; the SPA surfaces a banner.\n * - malformed `nodes.yaml` (ZodError on shape violation) → 500 with\n * `{ error: 'nodes_yaml_invalid' }`; logged via `request.log.error`.\n */\n\nimport { dirname, join } from 'node:path';\n\nimport type { FastifyInstance } from 'fastify';\nimport type { ApiDeps } from '../types.js';\nimport { aggregateEarnings } from '../../earnings/aggregator.js';\nimport { createDeltaComputer } from '../../earnings/snapshot-reader.js';\nimport { readNodesYaml } from '../../state/nodes-yaml.js';\nimport { PeerTypeResolver } from '../../registry/peer-type-resolver.js';\nimport { earningsResponseSchema } from '../schemas/earnings.js';\n\n/**\n * Convention shared with `nodes-lifecycle.ts`: `nodes.yaml` lives next to\n * `config.yaml` in the operator's `~/.townhouse` dir. Centralised here so\n * any future reader stays coupled to one resolution rule.\n */\nfunction resolveNodesYamlPath(deps: ApiDeps): string {\n return join(dirname(deps.configPath), 'nodes.yaml');\n}\n\nfunction resolveSnapshotPath(deps: ApiDeps): string {\n return join(dirname(deps.configPath), 'earnings-snapshots.jsonl');\n}\n\nexport function registerEarningsRoutes(\n app: FastifyInstance,\n deps: ApiDeps\n): void {\n app.get(\n '/api/earnings',\n { schema: earningsResponseSchema },\n async (request, reply) => {\n let yaml;\n try {\n yaml = await readNodesYaml(resolveNodesYamlPath(deps));\n } catch (err) {\n request.log.error(\n { err: err instanceof Error ? err.message : String(err) },\n 'earnings: nodes.yaml read/validate failed'\n );\n return reply.status(500).send({ error: 'nodes_yaml_invalid' });\n }\n const peerTypeResolver = new PeerTypeResolver(yaml);\n const deltaComputer = createDeltaComputer({\n snapshotPath: resolveSnapshotPath(deps),\n });\n return aggregateEarnings({\n connectorAdmin: deps.connectorAdmin,\n peerTypeResolver,\n deltaComputer,\n logger: request.log,\n });\n }\n );\n}\n","/**\n * Response schema for GET /api/earnings (Story 47.4).\n *\n * Locks the wire-level contract for the TUI / SPA / future Tauri client.\n * Schema library: raw `FastifySchema` JSON Schema — matches the established\n * pattern in `api/routes/transport.ts:42-52`. See Story 47.4 Open Question 1\n * for the decision trail (TypeBox language in the epic AC was superseded by\n * codebase consistency).\n *\n * AC #1 enforcement: amount fields use `pattern: '^-?\\\\d+$'` (decimal-string\n * bigint, no number coercion); timestamps use `format: 'date-time'` (ISO-8601).\n * Validation requires `ajv-formats` in tests (schema.test.ts registers it).\n *\n * Pass-through subobjects (`recentClaim`, `perAsset`) intentionally OMIT\n * `additionalProperties: false` so future connector-shipped fields (e.g. a\n * `RecentClaim.txHash` added in a connector minor release) survive serialization.\n * `peerSchema` and the top-level remain closed — Townhouse owns those shapes.\n *\n * NOTE: Fastify response schemas run a SERIALIZER (fast-json-stringify), not a\n * validator — unknown fields in the handler return value are silently dropped.\n * To validate against this schema, use Ajv directly (see earnings.test.ts).\n */\n\nimport type { FastifySchema } from 'fastify';\n\nconst DECIMAL_STRING_PATTERN = '^-?\\\\d+$';\n\nconst perAssetSchema = {\n type: 'object',\n properties: {\n lifetime: { type: 'string', pattern: DECIMAL_STRING_PATTERN },\n today: { type: 'string', pattern: DECIMAL_STRING_PATTERN },\n month: { type: 'string', pattern: DECIMAL_STRING_PATTERN },\n year: { type: 'string', pattern: DECIMAL_STRING_PATTERN },\n },\n required: ['lifetime', 'today', 'month', 'year'] as const,\n // Open to future connector-derived fields per D2 decision (2026-05-13).\n} as const;\n\nconst routingFeesSchema = {\n type: 'object',\n additionalProperties: perAssetSchema,\n} as const;\n\nconst peerSchema = {\n type: 'object',\n properties: {\n id: { type: 'string' },\n type: {\n type: 'string',\n enum: ['town', 'mill', 'dvm', 'external'] as const,\n },\n byAsset: routingFeesSchema,\n lastClaimAt: {\n oneOf: [{ type: 'string', format: 'date-time' }, { type: 'null' }],\n },\n },\n required: ['id', 'type', 'byAsset', 'lastClaimAt'] as const,\n additionalProperties: false, // Townhouse owns the peer shape.\n} as const;\n\nconst recentClaimSchema = {\n type: 'object',\n properties: {\n peerId: { type: 'string' },\n assetCode: { type: 'string' },\n assetScale: { type: 'integer', minimum: 0 },\n amount: { type: 'string', pattern: DECIMAL_STRING_PATTERN },\n direction: { type: 'string', enum: ['inbound', 'outbound'] as const },\n at: { type: 'string', format: 'date-time' },\n },\n required: [\n 'peerId',\n 'assetCode',\n 'assetScale',\n 'amount',\n 'direction',\n 'at',\n ] as const,\n // Open to future connector-shipped fields per D2 decision (2026-05-13).\n} as const;\n\nexport const earningsResponseSchema: FastifySchema = {\n response: {\n 200: {\n type: 'object',\n properties: {\n status: { type: 'string', enum: ['ok', 'connector_unavailable'] },\n apex: {\n type: 'object',\n properties: {\n routingFees: routingFeesSchema,\n },\n required: ['routingFees'],\n additionalProperties: false,\n },\n peers: {\n type: 'array',\n items: peerSchema,\n },\n recentClaims: {\n type: 'array',\n items: recentClaimSchema,\n },\n eventsRelayed: { type: 'integer', minimum: 0 },\n uptimeSeconds: { type: 'integer', minimum: 0 },\n },\n required: [\n 'status',\n 'apex',\n 'peers',\n 'recentClaims',\n 'eventsRelayed',\n 'uptimeSeconds',\n ],\n additionalProperties: false,\n },\n },\n};\n","/**\n * Live log-tail SSE route (Story D6).\n *\n * GET /api/logs/stream\n *\n * Streams structured JSON lines from running TOON containers (town, mill,\n * dvm, connector) as Server-Sent Events. Each event is one JSON object on\n * a single `data:` line.\n *\n * The route owns its dockerode connection so we don't have to plumb the\n * Docker handle through ApiDeps; the orchestrator's `docker` field is\n * private. This keeps the change surface contained to the new files.\n */\n\nimport type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';\nimport Docker from 'dockerode';\nimport type { ApiDeps } from '../types.js';\nimport {\n tailContainerLogs,\n serviceFromContainerName,\n type LogEvent,\n type LogService,\n} from '../../docker/log-tail.js';\n\n/** Allow the test suite to inject a fake Docker. */\nexport interface RegisterLogsRoutesOptions {\n docker?: Docker;\n /**\n * Override the tail driver. Defaults to `tailContainerLogs`. Tests use this\n * to feed deterministic events without a real Docker daemon.\n */\n tailFn?: typeof tailContainerLogs;\n}\n\n/** Heartbeat cadence — keeps proxies/load-balancers from idling out. */\nconst HEARTBEAT_INTERVAL_MS = 15_000;\n\ninterface RunningContainer {\n name: string;\n service: LogService;\n}\n\n/** Discover running townhouse-managed containers (town/mill/dvm/connector). */\nasync function listTownhouseContainers(\n docker: Docker\n): Promise<RunningContainer[]> {\n const containers = await docker.listContainers({ all: false });\n const out: RunningContainer[] = [];\n for (const c of containers) {\n for (const rawName of c.Names) {\n const name = rawName.startsWith('/') ? rawName.slice(1) : rawName;\n const service = serviceFromContainerName(name);\n if (service) {\n out.push({ name, service });\n break;\n }\n }\n }\n return out;\n}\n\nexport function registerLogsRoutes(\n app: FastifyInstance,\n _deps: ApiDeps,\n opts: RegisterLogsRoutesOptions = {}\n): void {\n const docker = opts.docker ?? new Docker();\n const tailFn = opts.tailFn ?? tailContainerLogs;\n\n app.get('/api/logs/stream', async (request, reply) => {\n await streamLogs(request, reply, docker, tailFn);\n });\n}\n\n/**\n * Internal handler — extracted so tests can drive it directly.\n *\n * We bypass Fastify's reply.send and write to the underlying Node response\n * because SSE requires keeping the connection open and flushing each event.\n */\nasync function streamLogs(\n request: FastifyRequest,\n reply: FastifyReply,\n docker: Docker,\n tailFn: typeof tailContainerLogs\n): Promise<void> {\n const raw = reply.raw;\n raw.statusCode = 200;\n raw.setHeader('Content-Type', 'text/event-stream');\n raw.setHeader('Cache-Control', 'no-cache, no-transform');\n raw.setHeader('Connection', 'keep-alive');\n // Defeat buffering on intermediaries (nginx, fly, etc.)\n raw.setHeader('X-Accel-Buffering', 'no');\n raw.flushHeaders?.();\n\n const controller = new AbortController();\n const heartbeat = setInterval(() => {\n if (raw.writableEnded) return;\n try {\n raw.write(`: heartbeat ${Date.now()}\\n\\n`);\n } catch {\n /* best-effort */\n }\n }, HEARTBEAT_INTERVAL_MS);\n\n function teardown(): void {\n clearInterval(heartbeat);\n controller.abort();\n }\n\n request.raw.on('close', teardown);\n request.raw.on('error', teardown);\n\n // Discover running containers up front; if Docker is unreachable we send a\n // single error event and close. This keeps the dashboard demoable even when\n // dockerd is in a weird state.\n let containers: RunningContainer[];\n try {\n containers = await listTownhouseContainers(docker);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n writeEvent(raw, {\n ts: new Date().toISOString(),\n service: 'connector',\n level: 'error',\n msg: `log-tail: docker unavailable (${msg})`,\n });\n teardown();\n raw.end();\n return;\n }\n\n if (containers.length === 0) {\n writeEvent(raw, {\n ts: new Date().toISOString(),\n service: 'connector',\n level: 'warn',\n msg: 'log-tail: no townhouse containers running',\n });\n }\n\n // Spawn one tail per container; merge into the single SSE stream.\n const tasks = containers.map(async (c) => {\n try {\n for await (const evt of tailFn(docker, c.name, c.service, {\n signal: controller.signal,\n tail: 50,\n })) {\n if (raw.writableEnded) break;\n writeEvent(raw, evt);\n }\n } catch (err) {\n if (controller.signal.aborted) return;\n const msg = err instanceof Error ? err.message : String(err);\n writeEvent(raw, {\n ts: new Date().toISOString(),\n service: c.service,\n level: 'error',\n msg: `log-tail: ${c.name} stream error (${msg})`,\n });\n }\n });\n\n // Wait for all tails (typically until client disconnects + abort fires).\n await Promise.allSettled(tasks);\n teardown();\n if (!raw.writableEnded) {\n raw.end();\n }\n}\n\nfunction writeEvent(\n raw: { write: (chunk: string) => boolean; writableEnded: boolean },\n evt: LogEvent\n): void {\n if (raw.writableEnded) return;\n try {\n raw.write(`data: ${JSON.stringify(evt)}\\n\\n`);\n } catch {\n /* best-effort */\n }\n}\n\n// Exported for tests\nexport const __test__ = { listTownhouseContainers, streamLogs };\n","/**\n * Docker log tailing helpers (Story D6).\n *\n * Wraps `dockerode`'s `container.logs({ follow: true })` stream into an\n * AsyncIterable<LogEvent> emitting structured JSON events. The raw Docker\n * stream is multiplexed (8-byte framing per chunk: stdout/stderr) when the\n * container has no TTY; we strip the frame header and split on newlines.\n *\n * Each emitted event is shaped to be drop-in JSON for the SSE endpoint:\n *\n * { ts: ISO8601, service: 'town'|'mill'|'dvm'|'connector',\n * level: 'info'|'warn'|'error'|'debug', msg: string, raw?: string }\n *\n * The parser is exported separately so the unit tests can exercise the\n * stream-decoding logic in pure form (no dockerode required).\n */\nimport type Docker from 'dockerode';\nimport type { Readable } from 'node:stream';\nimport { CONTAINER_PREFIX } from '../constants.js';\n\nexport type LogService = 'town' | 'mill' | 'dvm' | 'connector';\nexport type LogLevel = 'info' | 'warn' | 'error' | 'debug';\n\nexport interface LogEvent {\n ts: string;\n service: LogService;\n level: LogLevel;\n msg: string;\n raw?: string;\n}\n\n/** Possible service identifiers we tail. */\nexport const LOG_SERVICES: readonly LogService[] = [\n 'town',\n 'mill',\n 'dvm',\n 'connector',\n] as const;\n\n/**\n * Strip Docker's multiplexed-stream 8-byte frame headers, if present.\n *\n * Docker's `/containers/{id}/logs?follow=1` response is a \"raw stream\" when\n * the container has a TTY (just bytes) and a \"multiplexed stream\" when not.\n * In the multiplexed form, every payload chunk is preceded by an 8-byte\n * header: [STREAM_TYPE, 0, 0, 0, SIZE_BE_4]. STREAM_TYPE is 1=stdout, 2=stderr.\n *\n * Heuristic: a buffer is considered framed when the first byte is 1 or 2,\n * the next three bytes are zero, and the declared frame length lands within\n * the buffer. Otherwise we return the bytes as-is (TTY case, partial chunks).\n */\nexport function stripDockerFrame(chunk: Buffer): Buffer {\n if (chunk.length < 8) return chunk;\n const streamType = chunk[0];\n if (\n (streamType !== 1 && streamType !== 2) ||\n chunk[1] !== 0 ||\n chunk[2] !== 0 ||\n chunk[3] !== 0\n ) {\n return chunk;\n }\n const out: Buffer[] = [];\n let offset = 0;\n while (offset + 8 <= chunk.length) {\n const st = chunk[offset];\n if (\n (st !== 1 && st !== 2) ||\n chunk[offset + 1] !== 0 ||\n chunk[offset + 2] !== 0 ||\n chunk[offset + 3] !== 0\n ) {\n // Not a frame — return remainder verbatim.\n out.push(chunk.subarray(offset));\n return Buffer.concat(out);\n }\n const size = chunk.readUInt32BE(offset + 4);\n const start = offset + 8;\n const end = start + size;\n if (end > chunk.length) {\n // Partial frame — consumer will see the un-stripped tail next time.\n out.push(chunk.subarray(start));\n return Buffer.concat(out);\n }\n out.push(chunk.subarray(start, end));\n offset = end;\n }\n return Buffer.concat(out);\n}\n\n/**\n * Map a raw log line to a structured LogEvent. The line may be:\n * - JSON-shaped Pino/Bunyan log (preferred)\n * - \"[level] message\"-style text\n * - free-form text (default level: info)\n *\n * `service` is supplied by the caller (we know which container produced it).\n */\nexport function parseLogLine(\n line: string,\n service: LogService\n): LogEvent | null {\n const trimmed = line.replace(/\\r$/, '').trim();\n if (!trimmed) return null;\n\n // Try JSON first (Pino-style logs from connector / mill / dvm)\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n try {\n const obj = JSON.parse(trimmed) as Record<string, unknown>;\n const level = pinoLevelToLevel(obj['level']);\n const ts = pickTimestamp(obj['time'] ?? obj['ts'] ?? obj['@timestamp']);\n const msg =\n pickMsg(obj['msg'] ?? obj['message'] ?? obj['text']) ?? trimmed;\n return { ts, service, level, msg, raw: trimmed };\n } catch {\n // fall through to text parsing\n }\n }\n\n // Bracketed level prefix: \"[ERROR] something happened\" / \"WARN: ...\"\n const levelMatch = trimmed.match(\n /^\\s*\\[?(DEBUG|INFO|WARN|WARNING|ERROR|ERR|FATAL)\\]?[:\\s]+(.*)$/i\n );\n if (levelMatch && levelMatch[1] !== undefined) {\n const lvl = levelMatch[1].toUpperCase();\n const msg = levelMatch[2] ?? '';\n return {\n ts: new Date().toISOString(),\n service,\n level: textLevelToLevel(lvl),\n msg,\n raw: trimmed,\n };\n }\n\n return {\n ts: new Date().toISOString(),\n service,\n level: 'info',\n msg: trimmed,\n raw: trimmed,\n };\n}\n\nfunction pinoLevelToLevel(raw: unknown): LogLevel {\n if (typeof raw === 'number') {\n // Pino numeric levels: 10 trace, 20 debug, 30 info, 40 warn, 50 error, 60 fatal\n if (raw >= 50) return 'error';\n if (raw >= 40) return 'warn';\n if (raw >= 30) return 'info';\n return 'debug';\n }\n if (typeof raw === 'string') {\n return textLevelToLevel(raw.toUpperCase());\n }\n return 'info';\n}\n\nfunction textLevelToLevel(upper: string): LogLevel {\n switch (upper) {\n case 'DEBUG':\n case 'TRACE':\n return 'debug';\n case 'WARN':\n case 'WARNING':\n return 'warn';\n case 'ERR':\n case 'ERROR':\n case 'FATAL':\n case 'CRITICAL':\n return 'error';\n case 'INFO':\n default:\n return 'info';\n }\n}\n\nfunction pickTimestamp(value: unknown): string {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return new Date(value).toISOString();\n }\n if (typeof value === 'string') {\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return d.toISOString();\n }\n return new Date().toISOString();\n}\n\nfunction pickMsg(value: unknown): string | null {\n if (typeof value === 'string') return value;\n if (value == null) return null;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/**\n * Stateful line splitter — accumulates partial chunks across reads and emits\n * complete lines. Used by the live tail to handle TCP frames that don't align\n * with newlines.\n */\nexport class LineSplitter {\n private buffer = '';\n\n push(chunk: Buffer): string[] {\n this.buffer += stripDockerFrame(chunk).toString('utf8');\n const lines = this.buffer.split('\\n');\n this.buffer = lines.pop() ?? '';\n return lines;\n }\n\n flush(): string[] {\n if (!this.buffer) return [];\n const out = [this.buffer];\n this.buffer = '';\n return out;\n }\n}\n\n/**\n * Map a townhouse-managed container name to the service tag used in the SSE\n * events. Returns null when the name doesn't match any known prefix.\n *\n * Examples:\n * townhouse-town -> 'town'\n * townhouse-mill -> 'mill'\n * townhouse-dvm -> 'dvm'\n * townhouse-connector -> 'connector'\n * townhouse-dev-town-01 -> 'town' (preset multi-instance)\n * townhouse-dev-mill-02 -> 'mill'\n */\nexport function serviceFromContainerName(name: string): LogService | null {\n const clean = name.replace(/^\\//, '');\n if (!clean.startsWith(CONTAINER_PREFIX)) return null;\n const suffix = clean.slice(CONTAINER_PREFIX.length);\n for (const svc of LOG_SERVICES) {\n if (\n suffix === svc ||\n suffix.startsWith(`${svc}-`) ||\n suffix.includes(`-${svc}-`) ||\n suffix.endsWith(`-${svc}`)\n ) {\n return svc;\n }\n }\n return null;\n}\n\nexport interface TailOptions {\n /** Number of historical lines to fetch on attach. Default: 50. */\n tail?: number;\n /** AbortSignal for graceful cancellation. */\n signal?: AbortSignal;\n}\n\n/**\n * Tail one container, yielding structured LogEvents. Resolves silently when\n * the underlying stream ends or the signal aborts.\n */\nexport async function* tailContainerLogs(\n docker: Docker,\n containerName: string,\n service: LogService,\n opts: TailOptions = {}\n): AsyncGenerator<LogEvent> {\n const tail = opts.tail ?? 50;\n const container = docker.getContainer(containerName);\n\n // dockerode's typings vary by version — `logs({follow:true})` returns a\n // Readable. Fall back to `any` only here, to keep the surface tiny.\n const stream = (await container.logs({\n follow: true,\n stdout: true,\n stderr: true,\n tail,\n timestamps: false,\n })) as unknown as Readable;\n\n const splitter = new LineSplitter();\n const queue: LogEvent[] = [];\n let waiter: (() => void) | null = null;\n let done = false;\n let err: Error | null = null;\n\n function wake() {\n if (waiter) {\n const w = waiter;\n waiter = null;\n w();\n }\n }\n\n stream.on('data', (chunk: Buffer) => {\n for (const line of splitter.push(chunk)) {\n const evt = parseLogLine(line, service);\n if (evt) queue.push(evt);\n }\n wake();\n });\n stream.on('end', () => {\n for (const line of splitter.flush()) {\n const evt = parseLogLine(line, service);\n if (evt) queue.push(evt);\n }\n done = true;\n wake();\n });\n stream.on('error', (e: Error) => {\n err = e;\n done = true;\n wake();\n });\n\n if (opts.signal) {\n if (opts.signal.aborted) {\n try {\n stream.destroy();\n } catch {\n /* best-effort */\n }\n done = true;\n } else {\n opts.signal.addEventListener(\n 'abort',\n () => {\n try {\n stream.destroy();\n } catch {\n /* best-effort */\n }\n done = true;\n wake();\n },\n { once: true }\n );\n }\n }\n\n while (true) {\n const next = queue.shift();\n if (next !== undefined) {\n yield next;\n continue;\n }\n if (done) break;\n await new Promise<void>((resolve) => {\n waiter = resolve;\n });\n }\n\n if (err) throw err;\n}\n","/**\n * Wizard API Server Factory.\n *\n * Starts in wizard mode (only wizard routes), transitions to normal mode\n * after POST /wizard/init completes and containers are healthy.\n * SECURITY: Wizard mode hard-rejects non-loopback bind regardless of env var.\n */\n\nimport { WebSocket } from 'ws';\nimport type { FastifyBaseLogger, FastifyInstance } from 'fastify';\nimport type Docker from 'dockerode';\nimport { buildFastifyApp, LOOPBACK_HOSTS } from './build-app.js';\nimport { registerWizardRoutes, PROGRESS_BUFFER_MAX } from './routes/wizard.js';\nimport { registerNodeRoutes } from './routes/nodes.js';\nimport { registerWalletRoutes } from './routes/wallet.js';\nimport { registerWalletBalancesRoutes } from './routes/wallet-balances.js';\nimport { registerWalletRevealRoutes } from './routes/wallet-reveal.js';\nimport { registerWalletWithdrawRoutes } from './routes/wallet-withdraw.js';\nimport { registerConfigPatchRoutes } from './routes/nodes-patch.js';\nimport {\n registerMetricsWsRoutes,\n getOpenWebSockets,\n} from './routes/metrics-ws.js';\nimport { registerTransportRoutes } from './routes/transport.js';\nimport {\n ConnectorAdminClient,\n DEFAULT_ATOR_PROXY,\n TransportProbe,\n} from '../connector/index.js';\nimport { DockerOrchestrator } from '../docker/index.js';\nimport type { WalletManager } from '../wallet/index.js';\nimport type { TownhouseConfig } from '../config/schema.js';\nimport type { NodeType } from '../docker/types.js';\nimport type { WizardProgressMessage } from './types.js';\nimport type { ApiServer } from './types.js';\n\nexport interface WizardInitialDeps {\n /** Directory where ~/.townhouse/ (or override) lives */\n configDir: string;\n /** Full path to config.yaml */\n configPath: string;\n /** Full path to wallet.enc */\n walletPath: string;\n /** Port to bind the API */\n port: number;\n /** Bind host — must be a loopback address; defaults to 127.0.0.1 */\n bindHost?: string;\n docker: Docker;\n logger?: FastifyBaseLogger | boolean;\n}\n\nconst CLOSE_TIMEOUT_MS = 5000;\n\n/**\n * Create the wizard API server. Starts in wizard-only mode.\n * After POST /wizard/init + orchestrator launch, transitions to normal mode.\n */\nexport async function createWizardApiServer(\n initialDeps: WizardInitialDeps\n): Promise<ApiServer> {\n const bindHost = initialDeps.bindHost ?? '127.0.0.1';\n\n // SECURITY: Wizard mode hard-rejects non-loopback regardless of TOWNHOUSE_API_ALLOW_REMOTE.\n // This guard is stricter than buildFastifyApp's normal-mode check because the wizard\n // exposes unauthenticated mutating endpoints (POST /wizard/init).\n if (!LOOPBACK_HOSTS.includes(bindHost)) {\n throw new Error(\n 'The wizard refuses remote bind for security. Edit ~/.townhouse/config.yaml after setup if you need remote API access.'\n );\n }\n\n const state: {\n mode: 'wizard' | 'normal';\n progressBuffer: WizardProgressMessage[];\n progressSockets: Set<WebSocket>;\n transitioned: boolean;\n initInFlight: boolean;\n } = {\n mode: 'wizard',\n progressBuffer: [],\n progressSockets: new Set<WebSocket>(),\n transitioned: false,\n initInFlight: false,\n };\n\n const app = await buildFastifyApp({\n logger: initialDeps.logger ?? true,\n bindHost,\n requireLoopback: true,\n });\n\n // Handler that fires after POST /wizard/init: creates orchestrator, transitions mode.\n // NOTE: state.transitioned is flipped only AFTER orchestrator.up() resolves so that\n // a launch failure leaves the wizard recoverable (the route handler clears initInFlight\n // on rejection and rolls back wallet+config files).\n async function onInit(\n config: TownhouseConfig,\n walletManager: WalletManager,\n profiles: NodeType[]\n ): Promise<void> {\n if (state.transitioned) return;\n\n const orchestrator = new DockerOrchestrator(\n initialDeps.docker,\n config,\n walletManager\n );\n\n // Forward orchestrator events to WS buffer + connected sockets\n orchestrator.on(\n 'pullProgress',\n (event: { image: string; status: string; progress?: string }) => {\n const msg: WizardProgressMessage = {\n type: 'pull_progress',\n image: event.image,\n status: event.status,\n progress: event.progress,\n ts: Date.now(),\n };\n broadcastProgress(msg);\n }\n );\n\n orchestrator.on(\n 'containerState',\n (event: {\n name: string;\n state: string;\n detail?: string;\n error?: string;\n }) => {\n const ts = Date.now();\n let msg: WizardProgressMessage;\n if (event.state === 'running' || event.state === 'starting') {\n msg = { type: 'container_starting', name: event.name, ts };\n } else if (event.state === 'error') {\n // Surface the underlying detail/error if the orchestrator provides one;\n // fall back to the generic 'error' state string.\n const reason = event.detail ?? event.error ?? event.state;\n msg = { type: 'container_failed', name: event.name, reason, ts };\n } else if (event.state === 'stopping' || event.state === 'stopped') {\n // During launch, an unexpected stop means a partial failure — surface it.\n msg = {\n type: 'container_failed',\n name: event.name,\n reason: `container ${event.state} during launch`,\n ts,\n };\n } else {\n return;\n }\n broadcastProgress(msg);\n }\n );\n\n // The orchestrator emits 'healthy' via the `healthCheck` event, not `containerState`.\n // Forward that to container_healthy so the wire contract in AC-7 is actually populated.\n orchestrator.on(\n 'healthCheck',\n (event: { name: string; status: string }) => {\n if (event.status === 'healthy') {\n broadcastProgress({\n type: 'container_healthy',\n name: event.name,\n ts: Date.now(),\n });\n }\n }\n );\n\n // Start containers — if this rejects, the route's .catch will roll back files\n // and clear initInFlight so the operator can retry.\n await orchestrator.up(profiles);\n\n // Register all normal routes on the same Fastify instance\n const connectorAdmin = new ConnectorAdminClient(\n `http://127.0.0.1:${config.connector.adminPort}`\n );\n\n // Stop the wizard probe — the normal probe takes over.\n wizardProbe.stop();\n\n // Build probe for normal mode (after wizard completes)\n const normalProbe = new TransportProbe({\n proxyUrl:\n config.transport.mode === 'ator'\n ? (config.transport.socksProxy ?? DEFAULT_ATOR_PROXY)\n : '',\n });\n if (config.transport.mode === 'ator') {\n normalProbe.start();\n }\n // Swap the GET-route's view to the normal probe + real config. The GET\n // closure reads these per request, so subsequent calls reflect live state.\n wizardTransportDeps.config = config;\n wizardTransportDeps.transportProbe = normalProbe;\n activeProbe = normalProbe;\n\n const apiDeps = {\n configPath: initialDeps.configPath,\n config,\n orchestrator,\n wallet: walletManager,\n connectorAdmin,\n transportProbe: normalProbe,\n };\n\n registerNodeRoutes(app as FastifyInstance, apiDeps);\n registerWalletRoutes(app as FastifyInstance, apiDeps);\n registerWalletBalancesRoutes(app as FastifyInstance, apiDeps);\n registerWalletRevealRoutes(app as FastifyInstance, apiDeps);\n registerWalletWithdrawRoutes(app as FastifyInstance, apiDeps);\n registerConfigPatchRoutes(app as FastifyInstance, apiDeps);\n registerMetricsWsRoutes(app as FastifyInstance, apiDeps);\n // GET /api/transport is already registered (wizard mode). Add PATCH only to\n // avoid Fastify's FST_ERR_DUPLICATED_ROUTE on the wizard happy path.\n registerTransportRoutes(app as FastifyInstance, apiDeps, {\n mode: 'patch-only',\n });\n\n // Transition state — only after everything succeeded.\n state.transitioned = true;\n state.mode = 'normal';\n\n // Broadcast launch_complete\n broadcastProgress({ type: 'launch_complete', ts: Date.now() });\n }\n\n function broadcastProgress(msg: WizardProgressMessage): void {\n state.progressBuffer.push(msg);\n if (state.progressBuffer.length > PROGRESS_BUFFER_MAX) {\n state.progressBuffer.splice(\n 0,\n state.progressBuffer.length - PROGRESS_BUFFER_MAX\n );\n }\n for (const socket of state.progressSockets) {\n try {\n if (socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(msg));\n }\n } catch {\n /* best-effort */\n }\n }\n }\n\n // Lazy ATOR probe for wizard step 3 preview.\n //\n // Privacy: do NOT start the probe at server boot — the wizard fires outbound\n // TCP+HTTPS only when the operator engages the ATOR radio (which calls\n // POST /api/transport/wizard-probe-start). Once started it runs until the\n // wizard transitions to normal mode (when the normal probe takes over) or\n // the server closes.\n const wizardProbe = new TransportProbe({ proxyUrl: DEFAULT_ATOR_PROXY });\n // `activeProbe` lets close() stop whichever probe is currently running.\n let activeProbe: TransportProbe = wizardProbe;\n\n // Wizard transport deps. The route closure reads `transportProbe` and `config`\n // per request, so swapping these on transition is observed by subsequent GETs.\n const wizardTransportConfig = {\n transport: { mode: 'ator' as const, socksProxy: DEFAULT_ATOR_PROXY },\n };\n const wizardTransportDeps = {\n config: wizardTransportConfig,\n transportProbe: wizardProbe,\n } as unknown as Parameters<typeof registerTransportRoutes>[1];\n registerTransportRoutes(app as FastifyInstance, wizardTransportDeps, {\n mode: 'wizard',\n });\n\n // Lazy probe-start endpoint (wizard-only). Idempotent.\n app.post('/api/transport/wizard-probe-start', async (_request, reply) => {\n if (state.mode !== 'wizard') {\n // After transition the normal probe runs based on saved config.\n return reply.status(409).send({ error: 'wizard_not_in_progress' });\n }\n wizardProbe.start();\n return reply.status(200).send({ started: true });\n });\n\n registerWizardRoutes(\n app as FastifyInstance,\n {\n configPath: initialDeps.configPath,\n walletPath: initialDeps.walletPath,\n },\n state,\n onInit\n );\n\n async function close(): Promise<void> {\n try {\n activeProbe.stop();\n } catch {\n /* best-effort */\n }\n // Defensive: stop wizardProbe in case activeProbe is the normal one.\n try {\n wizardProbe.stop();\n } catch {\n /* best-effort */\n }\n\n const openSockets = getOpenWebSockets();\n for (const socket of openSockets) {\n try {\n if (socket.readyState === WebSocket.OPEN) {\n socket.close(1001, 'server_shutdown');\n }\n } catch {\n /* best-effort */\n }\n }\n openSockets.clear();\n for (const socket of state.progressSockets) {\n try {\n socket.close(1001, 'server_shutdown');\n } catch {\n /* best-effort */\n }\n }\n state.progressSockets.clear();\n\n await Promise.race([\n app.close(),\n new Promise<void>((resolve) => setTimeout(resolve, CLOSE_TIMEOUT_MS)),\n ]);\n }\n\n return { app: app as FastifyInstance, close };\n}\n"],"mappings":"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AAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,YAAI,EAAE,CAAC;AACP,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,YAAI,EAAE,CAAC;AACP,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,YAAI,EAAE,CAAC;AACP,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,YAAI,EAAE,CAAC;AACP,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,YAAI,EAAE,CAAC;AACP,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,YAAI,EAAE,CAAC;AACP,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,YAAI,EAAE,CAAC;AACP,cAAM,IAAI;AACV,cAAM,IAAI;AACV,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,YAAI,EAAE,CAAC;AACP,cAAM,IAAI;AACV,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,YAAI,EAAE,EAAE;AACR,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,YAAI,EAAE,EAAE;AACR,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,YAAI,EAAE,EAAE;AACR,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,YAAI,EAAE,EAAE;AACR,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,YAAI,EAAE,EAAE;AACR,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,eAAO,IAAI;AACX,YAAI,EAAE,E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;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;AAAA,QACpC;AAAA,QAAY;AAAA,QAAY;AAAA,QAAY;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AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAA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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":["z","add","HARDENED_OFFSET","hmac","fs","resolve","dir","platform","arch","runtime","abi","require_node_gyp_build","mask","data","require_fallback","Receiver","Sender","parse","EventEmitter","https","http","net","randomBytes","createHash","URL","Receiver","Sender","parse","WebSocket","websocket","key","WebSocket","createWebSocketStream","err","parse","protocol","EventEmitter","http","createHash","WebSocket","WebSocketServer","writeFileSync","join","resolve","err","SECRET_KEYS","result","join","writeFileSync","prev","resolve","existsSync","readFileSync","writeFileSync","join","parse","yamlStringify","join","existsSync","parse","readFileSync","yamlStringify","writeFileSync","readFileSync","writeFileSync","mkdirSync","chmodSync","existsSync","dirname","join","isAbsolute","homedir","dirname","yamlStringify","fs","dirname","fs","dirname","fs","dirname","stat","dirname","randomBytes","fs","z","isBytes","anumber","abytes","ahash","aexists","aoutput","u32","clean","swap32IfBE","bytesToHex","abytes","hexToBytes","abytes","concatBytes","createHasher","randomBytes","ahash","abytes","clean","aexists","hmac","ahash","anumber","hmac","clean","isLE","aexists","abytes","aoutput","clean","split","rotlSH","rotlSL","rotlBH","rotlBL","clean","split","clean","sha256","createHasher","createHasher","isBytes","anumber","join","anumber","padding","isBytes","anumber","isBytes","join","join","sha256","wordlist","abytes","anumber","randomBytes","sha256","anumber","bytesToHex","abytes","anumber","hexToBytes","anumber","concatBytes","gen","_0n","_1n","_0n","_1n","gcd","_1n","anumber","_0n","_1n","abytes","isLE","isLE","abytes","_1n","_0n","_1n","window","_0n","Point","_1n","window","isLE","_0n","Fn","getPublicKey","_2n","_0n","_1n","abytes","_3n","_4n","Fn","concatBytes","Point","hexToBytes","endo","bytesToHex","Fn","Point","randomBytes","abytes","getPublicKey","isBytes","utils","ahash","hmac","_2n","_1n","r","s","hexToBytes","concatBytes","bytesToHex","_0n","_2n","_3n","sha256","z","clean","createHasher","sha256","concatBytes","abytes","hmac","_0n","_1n","_2n","_7n","_0n","_1n","numberToHexUnpadded","hexToNumber","_0n","bytesToNumberBE","bytesToNumberLE","numberToBytesBE","numberToBytesLE","isPosBig","_0n","inRange","aInRange","bitLen","_1n","bitMask","_1n","createHmacDrbg","gen","memoized","_0n","_1n","_2n","_3n","_4n","_5n","_7n","_8n","_9n","_16n","mod","pow2","_0n","invert","mod","_1n","gcd","assertIsSquare","sqrt3mod4","_4n","sqrt5mod8","_5n","_8n","_2n","sqrt9mod16","Field","tonelliShanks","_7n","_16n","_3n","FpLegendre","FpSqrt","_9n","FIELD_FIELDS","validateField","FpPow","_0n","_1n","FpInvertBatch","FpLegendre","_1n","_2n","nLength","Field","isLE","_0n","bitMask","_1n","mod","FpPow","invert","FpSqrt","numberToBytesLE","numberToBytesBE","bytesToNumberLE","bytesToNumberBE","FpInvertBatch","getFieldBytesLength","getMinHashLength","mapHashToField","isLE","bytesToNumberLE","bytesToNumberBE","mod","_1n","numberToBytesLE","numberToBytesBE","_0n","_1n","negateCt","normalizeZ","FpInvertBatch","validateW","calcWOpts","bitMask","calcOffsets","window","pointPrecomputes","pointWindowSizes","getW","assert0","wNAF","Point","mulEndoUnsafe","bitLen","wbits","createField","isLE","validateField","Field","_0n","Fn","divNearest","_2n","_splitEndoScalar","_0n","bitMask","bitLen","_1n","validateSigFormat","validateSigOpts","DERErr","DER","numberToHexUnpadded","bytesToNumberBE","_3n","_4n","Fn","getWLengths","pprefix","Point","memoized","negateCt","endo","normalizeZ","mulEndoUnsafe","wNAF","getWLengths","Fn","ecdh","Point","getMinHashLength","mapHashToField","getPublicKey","utils","ecdsa","randomBytes","hmac","_1n","validateSigFormat","r","s","DER","_2n","pprefix","bytesToNumberBE","bitMask","aInRange","_0n","validateSigOpts","createHmacDrbg","Fn","Field","Point","nLength","weierstrass","ecdsa","weierstrass","secp256k1_CURVE","secp256k1_ENDO","_2n","sqrtMod","secp256k1_CURVE","_3n","pow2","Fpk1","Field","secp256k1","secp256k1_ENDO","mkdir","readFile","stat","writeFile","dirname","dirname","readFile","stat","mkdir","writeFile","_0n","_1n","_2n","_8n","Fn","uvRatio","Point","abytes","hexToBytes","p","bytesToHex","Point","Fn","randomBytes","adjustScalarBytes","abytes","getPublicKey","concatBytes","isBytes","utils","_1n","_1n","_2n","_5n","_8n","_2n","_1n","_0n","_1n","_2n","_7n","_256n","_0x71n","SHA3_PI","SHA3_ROTL","_SHA3_IOTA","IOTAS","split","SHA3_IOTA_H","SHA3_IOTA_L","rotlH","rotlBH","rotlSH","rotlL","rotlBL","rotlSL","keccakP","clean","Keccak","anumber","u32","swap32IfBE","aexists","abytes","aoutput","createHasher","keccak_256","keccak_256","bytesToHex","ed25519DerivePath","computeEvmAddress","secp256k1","toChecksumAddress","resolve","isSnapshotEntry","join","dirname","TIMEOUT_MS","TIMEOUT_MS","entry","after","http","chain","type","fs","dirname","join","resolve","dirname","join","fs","WebSocket","sendReq","existsSync","chmodSync","dirname","join","existsSync","chmodSync","WebSocket","dirname","join","DEFAULT_ATOR_PROXY","patchBodySchema","dirname","join","join","dirname","clean","resolve","HEARTBEAT_INTERVAL_MS","join","dirname","CLOSE_TIMEOUT_MS","WebSocket","resolve","WebSocket","resolve"]}