@ocash/sdk 0.1.0

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":["../src/assets/defaultAssetsOverride.ts","../src/memo/memoKit.ts","../src/crypto/babyJubjub.ts","../src/crypto/field.ts","../src/crypto/recordCodec.ts","../src/crypto/keyManager.ts","../src/utils/random.ts","../src/crypto/cryptoToolkit.ts","../src/crypto/poseidon2.ts","../src/errors.ts","../src/ledger/relayerConfig.ts","../src/ledger/validate.ts","../src/ledger/ledgerInfo.ts","../src/utils/hex.ts","../src/ledger/tokenNormalize.ts","../src/abi/app.ts","../src/abi/erc20.ts","../src/ledger/poolsFromContract.ts","../src/dummy/dummyFactory.ts","../src/utils/json.ts","../src/utils/index.ts","../src/utils/ocashBindings.ts","../src/store/operationTypes.ts","../src/store/operationsQuery.ts","../src/store/entryMemoQuery.ts","../src/store/entryNullifierQuery.ts","../src/store/utxoQuery.ts","../src/store/memoryStore.ts","../src/store/persistedWalletState.ts","../src/store/keyValueStore.ts","../src/crypto/records.ts","../src/runtime/cache.ts","../src/runtime/wasmBridge.ts","../src/core/events.ts","../src/core/sdk-core.ts","../src/proof/proofEngine.ts","../src/memo/worker.ts","../src/wallet/walletService.ts","../src/utils/httpDebug.ts","../src/utils/url.ts","../src/sync/entryClient.ts","../src/utils/signal.ts","../src/sync/syncEngine.ts","../src/planner/planner.ts","../src/tx/txBuilder.ts","../src/merkle/merkleClient.ts","../src/merkle/zeroHashes.ts","../src/merkle/merkleEngine.ts","../src/ops/ops.ts","../src/ops/relayerClient.ts","../src/utils/bigint.ts","../src/ops/pickMerkleRootIndex.ts","../src/index.ts"],"sourcesContent":["import type { AssetsOverride } from '../types';\n\nexport const defaultAssetsOverride: AssetsOverride = {\n 'wasm_exec.js': 'https://testnet-app.o.cash/wasm_exec.js',\n 'app.wasm': [\n 'https://testnet-app.o.cash/wasm/app_wasm_6_11328f2b/00',\n 'https://testnet-app.o.cash/wasm/app_wasm_6_11328f2b/01',\n 'https://testnet-app.o.cash/wasm/app_wasm_6_11328f2b/02',\n 'https://testnet-app.o.cash/wasm/app_wasm_6_11328f2b/03',\n 'https://testnet-app.o.cash/wasm/app_wasm_6_11328f2b/04',\n 'https://testnet-app.o.cash/wasm/app_wasm_6_11328f2b/05',\n ],\n 'transfer.r1cs': [\n 'https://testnet-app.o.cash/wasm/transfer_r1cs_3_27e55c1f/00',\n 'https://testnet-app.o.cash/wasm/transfer_r1cs_3_27e55c1f/01',\n 'https://testnet-app.o.cash/wasm/transfer_r1cs_3_27e55c1f/02',\n ],\n 'transfer.pk': [\n 'https://testnet-app.o.cash/wasm/transfer_pk_8_a2f49c4d/00',\n 'https://testnet-app.o.cash/wasm/transfer_pk_8_a2f49c4d/01',\n 'https://testnet-app.o.cash/wasm/transfer_pk_8_a2f49c4d/02',\n 'https://testnet-app.o.cash/wasm/transfer_pk_8_a2f49c4d/03',\n 'https://testnet-app.o.cash/wasm/transfer_pk_8_a2f49c4d/04',\n 'https://testnet-app.o.cash/wasm/transfer_pk_8_a2f49c4d/05',\n 'https://testnet-app.o.cash/wasm/transfer_pk_8_a2f49c4d/06',\n 'https://testnet-app.o.cash/wasm/transfer_pk_8_a2f49c4d/07',\n ],\n 'withdraw.r1cs': 'https://testnet-app.o.cash/wasm/withdraw_13dc54c7.r1cs',\n 'withdraw.pk': [\n 'https://testnet-app.o.cash/wasm/withdraw_pk_3_ba3d9460/00',\n 'https://testnet-app.o.cash/wasm/withdraw_pk_3_ba3d9460/01',\n 'https://testnet-app.o.cash/wasm/withdraw_pk_3_ba3d9460/02',\n ],\n};\n","import nacl from 'tweetnacl';\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils';\nimport { keccak256, toBytes } from 'viem';\nimport { BabyJubjub, BABYJUBJUB_ORDER } from '../crypto/babyJubjub';\nimport type { CommitmentData, Hex } from '../types';\nimport { RecordCodec } from '../crypto/recordCodec';\nimport { KeyManager } from '../crypto/keyManager';\nimport { randomBytes32Bigint } from '../utils/random';\n\nconst memoNonce = (ephemeralPublicKey: [bigint, bigint], userPublicKey: [bigint, bigint]): Uint8Array => {\n const revert = new Uint8Array(64);\n revert.set(BabyJubjub.compressPoint(ephemeralPublicKey), 0);\n revert.set(BabyJubjub.compressPoint(userPublicKey), 32);\n const hex = keccak256(revert);\n return toBytes(hex).slice(0, 24);\n};\n\nexport class MemoKit {\n static createMemo(ro: CommitmentData): `0x${string}` {\n const messageHex = RecordCodec.encode(ro).slice(2);\n const message = hexToBytes(messageHex);\n\n const ephemeralSecretKey = randomBytes32Bigint(true) % BABYJUBJUB_ORDER;\n const ephemeralPublicKey = BabyJubjub.scalarMult(ephemeralSecretKey);\n const sharedPoint = BabyJubjub.mulPoint(ro.user_pk.user_address, ephemeralSecretKey);\n const sharedKey = BabyJubjub.compressPoint(sharedPoint);\n const nonce = memoNonce(ephemeralPublicKey, ro.user_pk.user_address);\n const ciphertext = nacl.secretbox(message, nonce, sharedKey);\n if (!ciphertext) throw new Error('Failed to encrypt memo');\n\n const sealed = new Uint8Array(32 + ciphertext.length);\n sealed.set(BabyJubjub.compressPoint(ephemeralPublicKey), 0);\n sealed.set(ciphertext, 32);\n return `0x${bytesToHex(sealed)}`;\n }\n\n static decryptMemo(secretKey: bigint, encoded: `0x${string}`): CommitmentData | null {\n const payload = hexToBytes(encoded.replace(/^0x/, ''));\n const bobPublicKey = BabyJubjub.scalarMult(secretKey);\n const ephemeralPublicKey = BabyJubjub.decompressPoint(payload.slice(0, 32));\n const ciphertext = payload.slice(32);\n const sharedPoint = BabyJubjub.mulPoint(ephemeralPublicKey, secretKey);\n const sharedKey = BabyJubjub.compressPoint(sharedPoint);\n const nonce = memoNonce(ephemeralPublicKey, bobPublicKey);\n try {\n const decrypted = nacl.secretbox.open(ciphertext, nonce, sharedKey);\n if (!decrypted) return null;\n const hexResult = bytesToHex(decrypted);\n return RecordCodec.decode(`0x${hexResult}`);\n } catch {\n return null;\n }\n }\n\n static decodeMemoForOwner(input: { secretKey: bigint; memo: Hex; expectedAddress?: Hex | null; isTransparent?: boolean }): CommitmentData | null {\n const tryTransparent = () => {\n try {\n const decoded = RecordCodec.decode(input.memo);\n if (!input.expectedAddress) return decoded;\n const decodedAddress = KeyManager.userPkToAddress(decoded.user_pk);\n if (decodedAddress.toLowerCase() !== input.expectedAddress.toLowerCase()) return null;\n return decoded;\n } catch {\n return null;\n }\n };\n\n if (input.isTransparent) {\n return tryTransparent();\n }\n\n const decrypted = MemoKit.decryptMemo(input.secretKey, input.memo as `0x${string}`);\n if (decrypted) return decrypted;\n return tryTransparent();\n }\n\n static memoNonce(ephemeralPublicKey: [bigint, bigint], userPublicKey: [bigint, bigint]): Uint8Array {\n return memoNonce(ephemeralPublicKey, userPublicKey);\n }\n}\n","import { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex, toBytes } from '@noble/hashes/utils';\nimport type { Hash } from 'viem';\nimport type { UserKeyPair } from '../types';\nimport { BN254_FIELD_MODULUS } from './field';\n\n// BabyJubjub 曲线参数\n// Prime order of the alt_bn128 curve (used for curve operations)\nexport const BABYJUBJUB_SCALAR_FIELD = BN254_FIELD_MODULUS;\n\n// Baby JubJub curve order (from gnark-crypto) - 这是私钥标量要使用的模数\nexport const BABYJUBJUB_ORDER = BigInt('2736030358979909402780800718157159386076813972158567259200215660948447373041');\n\n// BabyJubjub Cofactor (from gnark-crypto) - 协因子,用于子群验证\nexport const BABYJUBJUB_COFACTOR = 8n;\n\n// BabyJubjub 基点 (from gnark-crypto)\nconst BABYJUBJUB_BASE_POINT = {\n x: BigInt('9671717474070082183213120605117400219616337014328744928644933853176787189663'),\n y: BigInt('16950150798460657717958625567821834550301663161624707787222815936182638968203'),\n};\n\n// Curve parameters for equation ax^2 + y^2 = 1 + dx^2y^2 (from gnark-crypto)\n// A = -1 in finite field (represented as p - 1)\nconst BABYJUBJUB_A = BABYJUBJUB_SCALAR_FIELD - 1n;\nconst BABYJUBJUB_D = BigInt('12181644023421730124874158521699555681764249180949974110617291017600649128846');\n\n/**\n * BabyJubjub 曲线点乘运算\n * 使用 double-and-add 算法进行标量乘法\n */\nfunction babyJubjubScalarMult(scalar: bigint): [bigint, bigint] {\n if (scalar === 0n) {\n return [0n, 1n]; // 单位元 (identity element)\n }\n\n let result: [bigint, bigint] = [0n, 1n]; // 单位元\n let base: [bigint, bigint] = [BABYJUBJUB_BASE_POINT.x, BABYJUBJUB_BASE_POINT.y];\n let rem = scalar;\n\n while (rem > 0n) {\n if (rem & 1n) {\n result = babyJubjubPointAdd(result, base);\n }\n base = babyJubjubPointAdd(base, base);\n rem >>= 1n;\n }\n\n return result;\n}\n\n/**\n * BabyJubjub 曲线点加法\n * 使用 Twisted Edwards 曲线加法公式\n */\nfunction babyJubjubPointAdd(p1: [bigint, bigint], p2: [bigint, bigint]): [bigint, bigint] {\n const [x1, y1] = p1;\n const [x2, y2] = p2;\n\n if (x1 === 0n && y1 === 1n) return [x2, y2]; // p1 是单位元\n if (x2 === 0n && y2 === 1n) return [x1, y1]; // p2 是单位元\n\n // 使用预定义的曲线参数\n const a = BABYJUBJUB_A;\n const d = BABYJUBJUB_D;\n const p = BABYJUBJUB_SCALAR_FIELD;\n\n // Edwards 曲线加法公式,按照 zk-kit 实现\n // beta = x1*y2\n const beta = (x1 * y2) % p;\n // gamma = y1*x2\n const gamma = (y1 * x2) % p;\n // delta = (y1-(a*x1))*(x2+y2)\n const delta = (((y1 - ((a * x1) % p) + p) % p) * ((x2 + y2) % p)) % p;\n // tau = x1*x2*y1*y2\n const tau = (beta * gamma) % p;\n // dtau = d*x1*x2*y1*y2\n const dtau = (d * tau) % p;\n\n // x3 = (x1*y2 + y1*x2)/(1 + d*x1*x2*y1*y2)\n const x3 = (((beta + gamma) % p) * modInverse((1n + dtau) % p, p)) % p;\n\n // y3 = (y1*y2 - a*x1*x2)/(1 - d*x1*x2*y1*y2)\n // 使用 zk-kit 的优化公式: y3 = (delta + a*beta - gamma) / (1 - dtau)\n const y3Numerator = (delta + ((a * beta) % p) - gamma + p) % p;\n const y3Denominator = (1n - dtau + p) % p;\n const y3 = (y3Numerator * modInverse(y3Denominator, p)) % p;\n\n return [x3, y3];\n}\n\n/**\n * 模逆运算\n */\nfunction modInverse(a: bigint, m: bigint): bigint {\n if (a < 0n) a = ((a % m) + m) % m;\n\n const g = extgcd(a, m);\n if (g[0] !== 1n) {\n throw new Error('Modular inverse does not exist');\n }\n\n return ((g[1] % m) + m) % m;\n}\n\n/**\n * 扩展欧几里得算法\n */\nfunction extgcd(a: bigint, b: bigint): [bigint, bigint, bigint] {\n if (a === 0n) return [b, 0n, 1n];\n\n const [gcd, x1, y1] = extgcd(b % a, a);\n const x = y1 - (b / a) * x1;\n const y = x1;\n\n return [gcd, x, y];\n}\n\n/**\n * 从种子创建密钥对\n */\nexport function createKeyPairFromSeed(seed: Hash): UserKeyPair {\n const seedBytes = toBytes(seed);\n\n // 计算 seedHash = sha256(seed)\n const seedHash = sha256(seedBytes);\n\n // 生成 BabyJubjub 密钥对用于地址\n // 将 seedHash 转换为标量字段内的值,使用Baby Jubjub order作为模数(与Go保持一致)\n const hashBigInt = BigInt('0x' + bytesToHex(seedHash));\n const addressSk = hashBigInt % BABYJUBJUB_ORDER;\n // 计算公钥: addressPk = addressSk * G\n const [pubX, pubY] = babyJubjubScalarMult(addressSk);\n\n return {\n user_pk: {\n user_address: [pubX, pubY],\n },\n user_sk: {\n address_sk: addressSk,\n },\n };\n}\n\n/**\n * 验证点是否在 BabyJubjub 曲线上\n * 验证曲线方程 ax^2 + y^2 = 1 + dx^2y^2\n */\nexport function isPointOnCurve(point: [bigint, bigint]): boolean {\n const [x, y] = point;\n const p = BABYJUBJUB_SCALAR_FIELD;\n const a = BABYJUBJUB_A;\n const d = BABYJUBJUB_D;\n\n const x2 = (x * x) % p;\n const y2 = (y * y) % p;\n\n const left = (a * x2 + y2) % p;\n const right = (1n + ((d * x2 * y2) % p)) % p;\n\n return left === right;\n}\n\n/**\n * 通用的点乘法函数,可以乘以任意基点\n */\nexport function mulPoint(base: [bigint, bigint], scalar: bigint): [bigint, bigint] {\n if (scalar === 0n) {\n return [0n, 1n]; // 单位元\n }\n\n let result: [bigint, bigint] = [0n, 1n]; // 单位元\n let currentBase = base;\n let rem = scalar;\n\n while (rem > 0n) {\n if (rem & 1n) {\n result = babyJubjubPointAdd(result, currentBase);\n }\n currentBase = babyJubjubPointAdd(currentBase, currentBase);\n rem >>= 1n;\n }\n\n return result;\n}\n\n/**\n * 验证密钥对是否有效\n */\nexport function validateKeyPair(keyPair: UserKeyPair): boolean {\n try {\n // 验证 BabyJubjub 密钥对\n const addressSk = BigInt(keyPair.user_sk.address_sk);\n const [pubX, pubY] = babyJubjubScalarMult(addressSk);\n\n const actualX = BigInt(keyPair.user_pk.user_address[0]);\n const actualY = BigInt(keyPair.user_pk.user_address[1]);\n\n if (pubX !== actualX || pubY !== actualY) {\n return false;\n }\n\n // 验证点是否在曲线上\n if (!isPointOnCurve([actualX, actualY])) {\n return false;\n }\n\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * 验证点是否在素数阶子群中\n * 通过验证 COFACTOR * point = O (无穷远点) 来确保点不在小子群中\n */\nexport function isInPrimeSubgroup(point: [bigint, bigint]): boolean {\n // 如果点不在曲线上,直接返回 false\n if (!isPointOnCurve(point)) {\n return false;\n }\n\n // A point in the prime-order subgroup has order l (prime).\n // cofactor * P = O only for points in the small (cofactor) subgroup.\n // For prime-subgroup points, cofactor * P ≠ O.\n const cofactorPoint = mulPoint(point, BABYJUBJUB_COFACTOR);\n return !(cofactorPoint[0] === 0n && cofactorPoint[1] === 1n);\n}\n\n/**\n * 判断一个有限域元素是否字典序较大\n * 根据 gnark-crypto 的实现逻辑,一个元素如果其二进制表示\n * 字典序大于其负数的二进制表示,则认为是\"字典序较大\"\n * @param x 有限域元素\n * @returns 是否字典序较大\n */\nfunction isLexicographicallyLargest(x: bigint): boolean {\n const p = BABYJUBJUB_SCALAR_FIELD;\n const negX = (p - x) % p;\n\n // 将两个数转换为字节数组进行比较\n const xBytes = bigIntToFixedBytes(x, 32);\n const negXBytes = bigIntToFixedBytes(negX, 32);\n\n // 从高位到低位比较(大端序比较)\n for (let i = 31; i >= 0; i--) {\n if (xBytes[i] > negXBytes[i]) return true;\n if (xBytes[i] < negXBytes[i]) return false;\n }\n\n return false; // 相等的情况\n}\n\n/**\n * 椭圆曲线点压缩(gnark-crypto 兼容格式)\n * 将点 (x, y) 压缩为 32 字节:Y坐标 + X坐标符号位\n * 遵循 gnark-crypto 实现和 RFC 8032 标准\n * @param point [x, y] 坐标对\n * @returns 压缩后的字节数组\n */\nfunction compressPoint(point: [bigint, bigint]): Uint8Array {\n const [x, y] = point;\n\n // 验证点是否在曲线上\n if (!isPointOnCurve(point)) {\n throw new Error('Point is not on the BabyJubjub curve');\n }\n\n // Y坐标转换为32字节(小端序)\n const compressed = bigIntToFixedBytes(y, 32);\n\n // 判断X坐标的字典序符号\n if (isLexicographicallyLargest(x)) {\n compressed[31] |= 0x80; // 设置最高位\n } else {\n compressed[31] &= 0x7f; // 清除最高位\n }\n\n return compressed;\n}\n\n/**\n * 椭圆曲线点解压缩(gnark-crypto 兼容格式)\n * 从 32 字节压缩格式恢复点 (x, y)\n * 遵循 gnark-crypto 实现和 RFC 8032 标准\n * @param compressed 压缩的32字节数组\n * @returns [x, y] 坐标对\n */\nfunction decompressPoint(compressed: Uint8Array): [bigint, bigint] {\n if (compressed.length !== 32) {\n throw new Error(`Invalid compressed point length: expected 32 bytes, got ${compressed.length}`);\n }\n\n // 提取符号位\n const isXLexLargest = (compressed[31] & 0x80) !== 0;\n\n // 清除符号位,获取Y坐标\n const yBytes = new Uint8Array(compressed);\n yBytes[31] &= 0x7f; // 清除MSB\n const y = fixedBytesToBigInt(yBytes, 32);\n\n try {\n // 从Y坐标计算X坐标\n const x = recoverXCoordinate(y, isXLexLargest);\n\n const point: [bigint, bigint] = [x, y];\n\n // 验证恢复的点是否在曲线上\n if (!isPointOnCurve(point)) {\n throw new Error('Recovered point is not on the BabyJubjub curve');\n }\n\n return point;\n } catch (error) {\n throw new Error(`Failed to decompress elliptic curve point: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * 从Y坐标恢复X坐标\n * BabyJubjub 曲线方程: ax^2 + y^2 = 1 + dx^2y^2\n * 重新整理按照gnark-crypto的computeX实现: x^2 = (1 - y^2) / (a - dy^2)\n * @param y Y坐标\n * @param isXLexLargest X坐标是否字典序较大\n * @returns X坐标\n */\nfunction recoverXCoordinate(y: bigint, isXLexLargest: boolean): bigint {\n const p = BABYJUBJUB_SCALAR_FIELD;\n const a = BABYJUBJUB_A;\n const d = BABYJUBJUB_D;\n\n // 计算 y^2 mod p\n const y2 = (y * y) % p;\n\n // 按照gnark-crypto的computeX实现\n // numerator = 1 - y^2\n const numerator = (1n - y2 + p) % p;\n\n // denominator = a - d * y^2\n const denominator = (a - ((d * y2) % p) + p) % p;\n\n // 计算 x^2 = numerator / denominator\n const x2 = (numerator * modInverse(denominator, p)) % p;\n\n // 计算 x^2 的平方根\n const x = modSqrt(x2, p);\n\n if (x === null) {\n throw new Error('No square root exists for the given y coordinate');\n }\n\n // 根据字典序符号选择正确的根\n const xActual = isLexicographicallyLargest(x) === isXLexLargest ? x : (p - x) % p;\n\n return xActual;\n}\n\n/**\n * 将 BigInt 转换为固定长度的字节数组(小端序)\n * @param value 要转换的 BigInt\n * @param byteLength 字节长度\n * @returns 字节数组\n */\nfunction bigIntToFixedBytes(value: bigint, byteLength: number): Uint8Array {\n const bytes = new Uint8Array(byteLength);\n let val = value;\n\n // 小端序:低位字节存储在低地址(数组前面)\n for (let i = 0; i < byteLength; i++) {\n bytes[i] = Number(val & 0xffn);\n val >>= 8n;\n }\n\n return bytes;\n}\n\n/**\n * 从固定长度字节数组转换为 BigInt(小端序)\n * @param bytes 字节数组\n * @param byteLength 字节长度\n * @returns BigInt值\n */\nfunction fixedBytesToBigInt(bytes: Uint8Array, byteLength: number): bigint {\n let result = 0n;\n\n // 小端序:从低位字节开始读取\n for (let i = 0; i < byteLength; i++) {\n result |= BigInt(bytes[i]) << (BigInt(i) * 8n);\n }\n\n return result;\n}\n\n/**\n * 模平方根计算\n * 使用 Tonelli-Shanks 算法计算 sqrt(n) mod p\n * @param n 被开方数\n * @param p 模数(必须是素数)\n * @returns 平方根,如果不存在则返回 null\n */\nfunction modSqrt(n: bigint, p: bigint): bigint | null {\n // 特殊情况:n = 0\n if (n === 0n) {\n return 0n;\n }\n\n // 检查是否存在平方根(勒让德符号)\n if (legendre(n, p) !== 1n) {\n return null;\n }\n\n // 特殊情况:p ≡ 3 (mod 4)\n if (p % 4n === 3n) {\n return modPow(n, (p + 1n) / 4n, p);\n }\n\n // 一般情况:使用 Tonelli-Shanks 算法\n return tonelliShanks(n, p);\n}\n\n/**\n * 勒让德符号计算\n * 计算 (a/p),判断 a 是否为模 p 的二次剩余\n * @param a 被判断数\n * @param p 模数(奇素数)\n * @returns 1 表示是二次剩余,-1 表示不是,0 表示 a ≡ 0 (mod p)\n */\nfunction legendre(a: bigint, p: bigint): bigint {\n const result = modPow(a, (p - 1n) / 2n, p);\n return result === p - 1n ? -1n : result;\n}\n\n/**\n * 快速模幂运算\n * 计算 (base^exponent) mod modulus\n * @param base 底数\n * @param exponent 指数\n * @param modulus 模数\n * @returns 结果\n */\nfunction modPow(base: bigint, exponent: bigint, modulus: bigint): bigint {\n if (modulus === 1n) return 0n;\n\n let result = 1n;\n let b = base % modulus;\n let e = exponent;\n\n while (e > 0n) {\n if (e % 2n === 1n) {\n result = (result * b) % modulus;\n }\n e = e / 2n;\n b = (b * b) % modulus;\n }\n\n return result;\n}\n\n/**\n * Tonelli-Shanks 算法计算模平方根\n * @param n 被开方数\n * @param p 模数(奇素数)\n * @returns 平方根\n */\nfunction tonelliShanks(n: bigint, p: bigint): bigint {\n // 找到 Q 和 S 使得 p - 1 = Q * 2^S,其中 Q 是奇数\n let Q = p - 1n;\n let S = 0n;\n while (Q % 2n === 0n) {\n Q = Q / 2n;\n S++;\n }\n\n // 特殊情况:S = 1\n if (S === 1n) {\n return modPow(n, (p + 1n) / 4n, p);\n }\n\n // 找到一个二次非剩余 z\n let z = 2n;\n while (legendre(z, p) !== -1n) {\n z++;\n }\n\n let M = S;\n let c = modPow(z, Q, p);\n let t = modPow(n, Q, p);\n let R = modPow(n, (Q + 1n) / 2n, p);\n\n while (t !== 1n) {\n // 找到最小的 i 使得 t^(2^i) ≡ 1 (mod p)\n let i = 1n;\n let temp = (t * t) % p;\n while (temp !== 1n && i < M) {\n temp = (temp * temp) % p;\n i++;\n }\n\n // 更新变量\n const b = modPow(c, modPow(2n, M - i - 1n, p - 1n), p);\n M = i;\n c = (b * b) % p;\n t = (t * c) % p;\n R = (R * b) % p;\n }\n\n return R;\n}\n\n/**\n * 导出 BabyJubjub 相关常量和函数,以便其他模块使用\n */\nexport const BabyJubjub = {\n SCALAR_FIELD: BABYJUBJUB_SCALAR_FIELD,\n ORDER: BABYJUBJUB_ORDER,\n COFACTOR: BABYJUBJUB_COFACTOR,\n BASE_POINT: BABYJUBJUB_BASE_POINT,\n A: BABYJUBJUB_A,\n D: BABYJUBJUB_D,\n addPoint: babyJubjubPointAdd,\n mulPoint: mulPoint,\n isOnCurve: isPointOnCurve,\n isInPrimeSubgroup: isInPrimeSubgroup,\n scalarMult: babyJubjubScalarMult,\n compressPoint: compressPoint,\n decompressPoint: decompressPoint,\n};\n","// BN254 / alt_bn128 prime field modulus.\n// Used for Poseidon hash and BabyJubjub curve arithmetic.\nexport const BN254_FIELD_MODULUS = 21888242871839275222246405745257275088548364400416034343698204186575808495617n;\n\n","import { Hash, encodeAbiParameters, decodeAbiParameters, parseAbiParameters, toHex, toBytes } from 'viem';\nimport { CommitmentData } from '../types';\nimport { BabyJubjub } from './babyJubjub';\n\nconst ABI_PARAMETERS = parseAbiParameters('uint256, uint256, uint256, uint256, bool');\n\nexport class RecordCodec {\n static encode(ro: CommitmentData): Hash {\n const userAddressX = BigInt(ro.user_pk.user_address[0]);\n const userAddressY = BigInt(ro.user_pk.user_address[1]);\n\n if (!BabyJubjub.isOnCurve([userAddressX, userAddressY])) {\n throw new Error('Invalid BabyJubJub point');\n }\n\n const compressedPoint = BabyJubjub.compressPoint([userAddressX, userAddressY]);\n const compressedHex = toHex(compressedPoint) as `0x${string}`;\n\n return encodeAbiParameters(ABI_PARAMETERS, [\n BigInt(ro.asset_id),\n BigInt(ro.asset_amount),\n BigInt(compressedHex),\n BigInt(ro.blinding_factor),\n ro.is_frozen,\n ]) as Hash;\n }\n\n static decode(hexData: string): CommitmentData {\n if (!hexData) throw new Error('Missing record payload');\n const normalized = hexData.startsWith('0x') ? (hexData as Hash) : (`0x${hexData}` as Hash);\n const decoded = decodeAbiParameters(ABI_PARAMETERS, normalized) as readonly [bigint, bigint, bigint, bigint, boolean];\n // `decoded[2]` 是压缩后的 BabyJubjub 公钥,ABI 解析会去掉前导 0,需要重新补齐 32 字节\n const compressed = toBytes(decoded[2], { size: 32 });\n const [userX, userY] = BabyJubjub.decompressPoint(compressed);\n\n return {\n asset_id: decoded[0],\n asset_amount: decoded[1],\n user_pk: { user_address: [userX, userY] },\n blinding_factor: decoded[3],\n is_frozen: decoded[4],\n };\n }\n}\n","import { hkdf } from '@noble/hashes/hkdf';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex, hexToBytes, utf8ToBytes } from '@noble/hashes/utils';\nimport { BabyJubjub, createKeyPairFromSeed, validateKeyPair } from './babyJubjub';\nimport type { Hex, UserKeyPair, UserPublicKey, UserSecretKey } from '../types';\nimport { toHex } from 'viem';\n\nconst HKDF_INFO = 'OCash.KeyGen';\n\nconst deriveSeed = (seed: string, nonce?: string): `0x${string}` => {\n if (seed.length < 16) throw new Error('Seed must be at least 16 characters');\n const ikm = utf8ToBytes(seed);\n const info = utf8ToBytes(nonce ? `${HKDF_INFO}:${nonce}` : HKDF_INFO);\n const okm = hkdf(sha256, ikm, undefined, info, 32);\n return `0x${bytesToHex(okm)}` as const;\n};\n\nconst seedToKeyPair = (seed: string, nonce?: string): UserKeyPair => {\n const derivedSeed = deriveSeed(seed, nonce);\n const keyPair = createKeyPairFromSeed(derivedSeed);\n if (!validateKeyPair(keyPair)) {\n throw new Error('Generated key pair validation failed');\n }\n return keyPair as UserKeyPair;\n};\n\nexport class KeyManager {\n static deriveKeyPair(seed: string, nonce?: string): UserKeyPair {\n return seedToKeyPair(seed, nonce);\n }\n\n static getPublicKeyBySeed(seed: string, nonce?: string): UserPublicKey {\n const keyPair = seedToKeyPair(seed, nonce);\n return { user_pk: keyPair.user_pk };\n }\n\n static getSecretKeyBySeed(seed: string, nonce?: string): UserSecretKey {\n return seedToKeyPair(seed, nonce);\n }\n\n static userPkToAddress(userPk: { user_address: [bigint | string, bigint | string] }): Hex {\n const x = BigInt(userPk.user_address[0]);\n const y = BigInt(userPk.user_address[1]);\n if (!BabyJubjub.isOnCurve([x, y])) {\n throw new Error('Invalid elliptic curve point');\n }\n const compressed = BabyJubjub.compressPoint([x, y]);\n return toHex(compressed);\n }\n\n static addressToUserPk(address: Hex): { user_address: [bigint, bigint] } {\n const payload = address.startsWith('0x') ? address.slice(2) : address;\n const bytes = hexToBytes(payload);\n const point = BabyJubjub.decompressPoint(bytes);\n if (!BabyJubjub.isOnCurve(point)) {\n throw new Error('Invalid OCash address');\n }\n return { user_address: [point[0], point[1]] };\n }\n}\n","import { BN254_FIELD_MODULUS } from '../crypto/field';\n\nconst getRandomBytes = (size: number): Uint8Array => {\n if (typeof globalThis.crypto === 'undefined' || typeof globalThis.crypto.getRandomValues !== 'function') {\n throw new Error('Secure random generator is not available in this environment');\n }\n const array = new Uint8Array(size);\n globalThis.crypto.getRandomValues(array);\n return array;\n};\n\nexport const randomBytes32 = (): Uint8Array => getRandomBytes(32);\n\nconst bytesToHex = (bytes: Uint8Array): string => Array.from(bytes, (x) => x.toString(16).padStart(2, '0')).join('');\n\n/**\n * 生成 32 字节随机数,并根据需要截断为 BN254 有限域元素\n */\nexport const randomBytes32Bigint = (isBabyJubScalar = false): bigint => {\n const buf = randomBytes32();\n let result = BigInt(`0x${bytesToHex(buf)}`);\n if (isBabyJubScalar) {\n result %= BN254_FIELD_MODULUS;\n }\n return result;\n};\n","import { toHex } from 'viem';\nimport { BabyJubjub, BABYJUBJUB_ORDER } from './babyJubjub';\nimport type { CommitmentData, Hex } from '../types';\nimport { Poseidon2, Poseidon2Domain } from './poseidon2';\nimport { randomBytes32Bigint } from '../utils/random';\n\nexport class CryptoToolkit {\n static commitment(record: CommitmentData, format: 'hex'): Hex;\n static commitment(record: CommitmentData, format: 'bigint'): bigint;\n static commitment(record: CommitmentData, format?: 'hex' | 'bigint'): Hex | bigint {\n let amount = BigInt(record.asset_amount);\n if (record.is_frozen) {\n amount |= 1n << 128n;\n }\n const elements = [\n BigInt(record.user_pk.user_address[0]),\n BigInt(record.user_pk.user_address[1]),\n BigInt(record.blinding_factor),\n BigInt(record.asset_id),\n amount,\n ];\n const h = Poseidon2.hashSequenceWithDomain(elements, Poseidon2Domain.Record);\n const hex = toHex(h, { size: 32 }) as Hex;\n return format === 'bigint' ? BigInt(hex) : hex;\n }\n\n static nullifier(secretKey: bigint, commitment: `0x${string}`, freezerPk?: [bigint, bigint]): `0x${string}` {\n let nullifierKey: bigint;\n const defaultFreezer = !freezerPk || (freezerPk[0] === 0n && freezerPk[1] === 1n);\n if (defaultFreezer) {\n nullifierKey = secretKey;\n } else {\n if (!BabyJubjub.isOnCurve(freezerPk!)) {\n throw new Error('Freezer public key is not on BabyJubjub curve');\n }\n const shared = BabyJubjub.mulPoint(freezerPk!, secretKey);\n nullifierKey = Poseidon2.hashDomain(shared[0], shared[1], Poseidon2Domain.KeyDerivation);\n }\n\n const n = Poseidon2.hashDomain(nullifierKey, BigInt(commitment), Poseidon2Domain.Nullifier);\n return toHex(n, { size: 32 }) as `0x${string}`;\n }\n\n static createRecordOpening(input: {\n asset_id: bigint | number | string;\n asset_amount: bigint | number | string;\n user_pk: { user_address: [bigint | number | string, bigint | number | string] };\n blinding_factor?: bigint | number | string;\n is_frozen?: boolean;\n }): CommitmentData {\n const hasCustomBlinding = input.blinding_factor !== undefined;\n const attempts = hasCustomBlinding ? 1 : 5;\n for (let attempt = 0; attempt < attempts; attempt++) {\n const blinding =\n hasCustomBlinding && attempt === 0 ? BigInt(input.blinding_factor!) : randomBytes32Bigint(true);\n const record: CommitmentData = {\n asset_id: BigInt(input.asset_id),\n asset_amount: BigInt(input.asset_amount),\n user_pk: {\n user_address: [BigInt(input.user_pk.user_address[0]), BigInt(input.user_pk.user_address[1])],\n },\n blinding_factor: blinding,\n is_frozen: Boolean(input.is_frozen),\n };\n if (hasCustomBlinding) return record;\n const commitment = Poseidon2.hashSequenceWithDomain(\n [\n record.user_pk.user_address[0],\n record.user_pk.user_address[1],\n record.blinding_factor,\n record.asset_id,\n record.asset_amount,\n ],\n Poseidon2Domain.Record,\n );\n if (commitment !== 0n) {\n return record;\n }\n }\n throw new Error('Failed to derive non-zero commitment');\n }\n\n static viewingRandomness(): Uint8Array {\n const scalar = randomBytes32Bigint(true) % BABYJUBJUB_ORDER;\n const buf = new Uint8Array(32);\n const hex = scalar.toString(16).padStart(64, '0');\n for (let i = 0; i < 32; i++) {\n buf[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n return buf;\n }\n\n static poolId(tokenAddress: Hex | bigint | number | string, viewerPk: [bigint, bigint], freezerPk: [bigint, bigint]): bigint {\n const inputs = [BigInt(viewerPk[0]), BigInt(viewerPk[1]), BigInt(freezerPk[0]), BigInt(freezerPk[1])];\n const seed = typeof tokenAddress === 'bigint' ? tokenAddress : BigInt(tokenAddress);\n return Poseidon2.hashSequenceWithDomain(inputs, Poseidon2Domain.Policy, seed);\n }\n}\n","/**\n * Poseidon2 hash implementation (t = 3, rate = 2, capacity = 1) for the BN254 scalar field.\n * Mirrors the on-chain Solidity implementation that powers the upgraded circuits with\n * domain-separated hashing.\n */\n\nimport { BN254_FIELD_MODULUS } from './field';\n\nexport const Poseidon2Domain = {\n None: 0x0000000000000000n,\n Record: 0x5245434f52440000n, // \"RECORD\"\n Nullifier: 0x4e554c4c49464945n, // \"NULLIFIE\"\n Merkle: 0x4d45524b4c450000n, // \"MERKLE\"\n Policy: 0x504f4c4943590000n, // \"POLICY\"\n Array: 0x4152524159000000n, // \"ARRAY\"\n Memo: 0x4d454d4f00000000n, // \"MEMO\"\n Asset: 0x4153534554000000n, // \"ASSET\"\n KeyDerivation: 0x4b45594445520000n, // \"KEYDER\"\n} as const;\n\ntype DomainValue = (typeof Poseidon2Domain)[keyof typeof Poseidon2Domain];\ntype HashInput = bigint | number | string;\n\nexport class Poseidon2 {\n // BN254 scalar field prime\n private static readonly P = BN254_FIELD_MODULUS;\n\n // Round keys generated from gnark-crypto (identical to the Solidity contract)\n private static readonly FULL_ROUND_KEYS_START: readonly [bigint, bigint, bigint][] = [\n [\n 0x2ba117aea05b03e08d3e8cdc3441e489710b7eae2127240261f1161a4c375ec3n,\n 0x13d62b66e9d5236b1c4349076bc462097eca577bcd980e3e5262986898001a95n,\n 0x2ceb56ddb7d8c8886771c2f12a458edd58886a852e29ea9a157cb6c3ba8201a2n,\n ],\n [\n 0xba9383b6a5ba188031f7377b152f8df895115269e8437f9eccdc767ecaf458fn,\n 0x188b8a2dd4baa4aeda8cf74c2cb3f5dfa482de9987f03fdeafd832f6c3be19c6n,\n 0x2672744cbbe045c930be1dcaae5b38cf4f0b9673514cbe5129908164ef7d7b58n,\n ],\n [\n 0x1e0365a9b92d37b502579f6a3c3236df558f8417be56e58908897fa5cfbf15bbn,\n 0x2060426d53c6386a3f2f4e29d886bfc8e1be0ddafbdb50a9fd0be33143d1004an,\n 0x1b917ac39485d49545e20d21e06735af839b1360e077daa4dfc2938ff91ce4d0n,\n ],\n [\n 0x2065aa0d75c8773cd397593ca429c21ad2d10c066a09dea04378fed619021786n,\n 0x4767c771c63b9efcaee16d3463c0457ba7f029dd533e5c7f4b3ccef3677db6bn,\n 0x2b632ce28c5d4908c11b68f4ed9e3da0dd104c018d2376eaa0abd28f9cf8bd76n,\n ],\n ];\n\n private static readonly PARTIAL_ROUND_KEYS: readonly bigint[] = [\n 0x122bd8150e3bf5129ed1f41b201d3881fe41c68ed194ffe6b414de857f03765dn,\n 0x23d4440906f4412f8994c3fa4cc08e849c0fbd10dc12518a07c0e8d77562c13fn,\n 0x2c5e99b87c743de13935855afed6cf836d6dd62ce31dfdca21efcfe197c9e321n,\n 0x6fba87a3924cbbb4117b782aa697bbc23900de6bf31a28ecc2f6a9225aebfe4n,\n 0xc954d8f108f43ece97439775cfa22e1343a6cacae91604c76601eb6c7e90e1bn,\n 0x20980b82aa1ac356a0a48bc8101468c74f1efd47cd29ea01a852d6af93836a44n,\n 0x7e9df3ac21d190f9281b2ac56bf9dcce410bf95bd7fc196f4cfbb86acb60ec6n,\n 0x1e7459f591496f37d759e6eb427fa073eb923d9a67b066271dabe8e793ad796n,\n 0xc1b5194e4c1af42dc01dadde54c73624ce1b8a0302d25ad499b2036f768e6e8n,\n 0xcfd0f94030d285ffb85c8aa9f0675ac7077133b5a329c78b74656932fac8a27n,\n 0x212ea73cc21625d7f1e361ad3df28c9f9cfd57fec66fb1bf69f1ab7cd11c55cn,\n 0x25fbc0b1fa13ea08b022f853e9b07a5c0fe9d5fb23c26eec54599100e60d57f6n,\n 0x74521adcc4a9387f4d6feeac681b1115b92f5e98e35d6d591d79b75d61d204cn,\n 0x267f9f5e6eea2a9d8816d7b683ab95d8121adeeaae66990bd24be95b6f0a0cd9n,\n 0x2fdf445c73cde6a7f4f23bef9bf520ceb72f08dabd391b118a253630f2878aden,\n 0x2645e68b2890d258fa7eaffbc587c5ca8f7099cc4ddf923e23672c6153a8ae7n,\n 0xc9e3d4841852fcf02818cdd86c3d86dcae4c1f7c140c3b17edc1f17b2652079n,\n 0xa42e90f71ff44221ec000e0ff81b6f229292b0cb4470ff7c66c1fe06d9e69aan,\n 0x1fb9a7d91fcf3173a1d80d3749192ed7d8a5b50cfd631571dc15154d0e71d7a2n,\n 0x10bff373cf04aca27c90792eaa545000503d6f118f4d9c5a906203aefe316d42n,\n 0x956799581ce2c42ed5b55a130fb853683014e7cb9c3f32b9dfa4cf5c53127an,\n 0x2b0bd2da61cae5f4f442b449cb1e9cc6af7a6d126b02ffd65aa887278741ab07n,\n 0x1c76af7e47ec30b4139081219fd7d173d498ba2e2ca928fb2b26019b16e5c64n,\n 0x2d9e586bd3c8cde82932cd1397db8564cbdebfc4f5c970e28a2d9f559db9d696n,\n 0x2c4b2a625ac29f468cc94f6a3ebdb7bb962f245568676073b829b95ace6d1cccn,\n 0x27299c22883e4d52b8251a0724083c063e7be0a7f0070fba1c8d4d206841e6an,\n 0x2af17121feea81979d98fa13cfdb5cf7f1f1717168ee7bf2da3709e589c381e7n,\n 0x9ad5501e4c9db7fee67f2fda8ce71162e6b2e0fc252f03c3d40470168ed4ea7n,\n 0x276bf230a40c51dac71697a84d603ac0423e3d8f23cc9330a23306976f7f902dn,\n 0xb40af0d626b972c04b83a3897031c9bd0b4acc3b138fc505e15fdb6b60ba5f8n,\n 0x15c6033f97a1337ce18e37d0d22cf07f6c80f96af620c4d67c351e7210d688cfn,\n 0x27a5134eeea854449d10ae3dd3e17cbfc0f24c21a4265bb1e99982af48eb3966n,\n 0xa3f27bafac251bbc63797868e84434a412400913e2e11616cb18f3bd01eb0d7n,\n 0x9409ff82de14430d5f1f16dd157c8175372a4f922b3563550230390c4476c59n,\n 0x1b6b39381a0b663344ee9a8cff259b84c593b709cf543014996ec33c7a00008bn,\n 0x16ac5b58d45468a298e60cbb92055daa665f29dd7194c77cac679c35f6f64552n,\n 0x121fb0f41bab603e46a4f4cb110d0a56bceff1f3af5577e7715e3777a5cfe7d8n,\n 0x56f262099a9d3e1d0060799732486358ad8b7bd2f515dd8767c2d19917d282dn,\n 0x626740e4ff0fe7b8df127d56310c0c1fc47a07f630983bd55800ee8e24911d8n,\n 0xb2b0b1213bed0c4b40fe2c938d076c65f22fe21eef4767b507561a63eea2874n,\n 0x1674784dcc6d6b3ef6467ee673c85311d1375aa39122ecf4b942caba565a6982n,\n 0x690678b4bc42090fdbed7a334b323db5441a24c92b5b234f54ec16cff367db3n,\n 0x186719b1d7d0fb0087396c72ba57f53a5b67dc1077b82caadc62d5cdf7cd8db4n,\n 0x178ed1e5ce3430020a30f0684fb01c60136e731a9a8c6afcbad139af2e8fcf7n,\n 0x1f31dc123a2384c71b57678dcf5a2fa6294f88a21a333cbec5facbc69424306cn,\n 0x17d928d2e3dbbe3a273f0bec79f881f8b75f4d333002b528fb1ae737cbf13ebn,\n 0x2f4fb0605668c045469510611c0137828be267709c0fa9392c28c2d95f9504bbn,\n 0x2ee2627a181d62b24501da3efccba9b4a9b61e6d9a7cdaa152c39347bdebe481n,\n 0x254cd2d79997885ca82e0ec5998aab8de0b09a02d04f54dcbd1a6f8776fd537bn,\n 0x2aa675a61643b83ad60d88b16c574a4695fc1b463dd44f8bbd674d1a1294dbfen,\n 0x2dbc70b7e86794439ebd7d10cee37147e51769ed7a441187f6e22e644a003a51n,\n 0x19fc425ab24feca173ddab7070ebb4a2eeb9b82bee3a399ebedef2affe3ecd96n,\n 0x1b7a37f7ef7ce586df66295e955aba1b9b15052673534d4c13e02c19f02959e2n,\n 0x772f989bc7bc4361340c9887a0225b92a192c14a85dc3ade21f6135b9239341n,\n 0x13f24e0e97fad4c45866626b9a1b9f3cc46f4ab2a018f0bda5bdade2087a07cfn,\n 0x1976c62d2c2c4ba095ff81bef054fe0757d7301950ede83426a34dd6cc12a4a5n,\n ];\n\n private static readonly FULL_ROUND_KEYS_END: readonly [bigint, bigint, bigint][] = [\n [\n 0x1ea7aeca90530805e5fa1b676a6f12ace24c1c0f5b6cd68bf01558be11bb864an,\n 0x70249ba94928b35fe02f56b12590e86f21a8a19e949ec10b62a5fcefea5c2b3n,\n 0x2cd4b5f5d87caaac64f78c44a62c408211c2e1d70a69549f9f1d36bd8a46073n,\n ],\n [\n 0x7f4c9774540f9f81fa29a73910899ad91d950e8f83a4f52d37ccc35a982f152n,\n 0x2d8b931d897f634fd9cdae140a7b3f4d4bab1814e009fe84e754c4a23ae23ccn,\n 0x2b9e86726e0cfec43981d9898da6ddb631ae469a473aa73e570274ecd2376899n,\n ],\n [\n 0xc96c00773943b1de5a3dfb5959f30975f85adc57cc641bc2cea037837447191n,\n 0x258a43226d21462808593a8701f2dce2aaa28668f8fe35647a706fa4a81d5d47n,\n 0x26688ac841f42286102d1494db773e91760d8cad9cfb1a654284ed630a9bee42n,\n ],\n [\n 0xb39f30858ad21e1805c8ced014837777cfdd776fc2d4c07a97b2351f21764b1n,\n 0xb114bc66867e038d6648a6ab3556243a5f78ea3db7aa997ba13961735792377n,\n 0xc08b1719426f8ff2dee487f9f41ac785ffdb8a7be5fc869754689cb02999e51n,\n ],\n ];\n\n /**\n * Hash two field elements with the default (zero) domain.\n */\n public static hash(a: bigint, b: bigint): bigint {\n return this.hashDomain(a, b, Poseidon2Domain.None);\n }\n\n /**\n * Hash two inputs with an explicit domain (matches Solidity's hashDomain).\n */\n public static hashDomain(a: HashInput, b: HashInput, domain: HashInput | DomainValue): bigint {\n let state0 = this.normalize(a);\n let state1 = this.normalize(b);\n let state2 = this.normalize(domain);\n\n [state0, state1, state2] = this.permutation(state0, state1, state2);\n return state0;\n }\n\n /**\n * Convenience helper that accepts generic inputs (numbers / strings / bigint)\n * and allows passing an optional domain (defaults to Poseidon2Domain.None).\n */\n public static hashInputs(a: HashInput, b: HashInput, domain: HashInput | DomainValue = Poseidon2Domain.None): bigint {\n return this.hashDomain(a, b, domain);\n }\n\n /**\n * Hash helper that mirrors Solidity's folding pattern:\n * h = hashDomain(inputs[0], inputs[1]); h = hashDomain(h, inputs[2]); ...\n * If a seed is provided it is used as the left input for the first element, allowing\n * constructions such as array hashes that start from zero.\n */\n public static hashSequenceWithDomain(\n inputs: HashInput[],\n domain: HashInput | DomainValue,\n seed?: HashInput,\n ): bigint {\n if (inputs.length === 0) {\n if (seed === undefined) {\n throw new Error('Poseidon2.hashSequenceWithDomain requires at least one input or a seed.');\n }\n return this.normalize(seed);\n }\n\n if (inputs.length === 1 && seed === undefined) {\n return this.hashDomain(0n, inputs[0], domain);\n }\n\n let acc: bigint;\n let startIndex: number;\n if (seed !== undefined) {\n acc = this.hashDomain(seed, inputs[0], domain);\n startIndex = 1;\n } else {\n acc = this.hashDomain(inputs[0], inputs[1], domain);\n startIndex = 2;\n }\n\n for (let i = startIndex; i < inputs.length; i++) {\n acc = this.hashDomain(acc, inputs[i], domain);\n }\n\n return acc;\n }\n\n /**\n * Hash two inputs and return a 0x-prefixed hex string.\n */\n public static hashToHex(a: HashInput, b: HashInput, domain: HashInput | DomainValue = Poseidon2Domain.None): string {\n const result = this.hashInputs(a, b, domain);\n return `0x${result.toString(16).padStart(64, '0')}`;\n }\n\n /**\n * Apply one Poseidon2 permutation (64 rounds) to the current state.\n */\n private static permutation(state0: bigint, state1: bigint, state2: bigint): [bigint, bigint, bigint] {\n [state0, state1, state2] = this.externalMatrix(state0, state1, state2);\n\n for (const [c0, c1, c2] of this.FULL_ROUND_KEYS_START) {\n state0 = this.sbox(this.addMod(state0, c0));\n state1 = this.sbox(this.addMod(state1, c1));\n state2 = this.sbox(this.addMod(state2, c2));\n [state0, state1, state2] = this.externalMatrix(state0, state1, state2);\n }\n\n for (const constant of this.PARTIAL_ROUND_KEYS) {\n state0 = this.sbox(this.addMod(state0, constant));\n [state0, state1, state2] = this.partialMatrix(state0, state1, state2);\n }\n\n for (const [c0, c1, c2] of this.FULL_ROUND_KEYS_END) {\n state0 = this.sbox(this.addMod(state0, c0));\n state1 = this.sbox(this.addMod(state1, c1));\n state2 = this.sbox(this.addMod(state2, c2));\n [state0, state1, state2] = this.externalMatrix(state0, state1, state2);\n }\n\n return [state0, state1, state2];\n }\n\n private static normalize(value: HashInput): bigint {\n const normalized = typeof value === 'bigint' ? value : BigInt(value);\n const mod = normalized % this.P;\n return mod >= 0n ? mod : mod + this.P;\n }\n\n private static addMod(a: bigint, b: bigint): bigint {\n const sum = a + b;\n const mod = sum % this.P;\n return mod >= 0n ? mod : mod + this.P;\n }\n\n private static mulMod(a: bigint, b: bigint): bigint {\n return (a * b) % this.P;\n }\n\n private static sbox(x: bigint): bigint {\n const x2 = this.mulMod(x, x);\n const x4 = this.mulMod(x2, x2);\n return this.mulMod(x4, x);\n }\n\n private static externalMatrix(state0: bigint, state1: bigint, state2: bigint): [bigint, bigint, bigint] {\n const sum = this.addMod(this.addMod(state0, state1), state2);\n return [this.addMod(state0, sum), this.addMod(state1, sum), this.addMod(state2, sum)];\n }\n\n private static partialMatrix(state0: bigint, state1: bigint, state2: bigint): [bigint, bigint, bigint] {\n const sum = this.addMod(this.addMod(state0, state1), state2);\n const newState0 = this.addMod(state0, sum);\n const newState1 = this.addMod(state1, sum);\n const doubledState2 = this.addMod(state2, state2);\n const newState2 = this.addMod(doubledState2, sum);\n return [newState0, newState1, newState2];\n }\n}\n","import type { SdkErrorCode, SdkErrorPayload } from './types';\n\nexport class SdkError extends Error implements SdkErrorPayload {\n code: SdkErrorCode;\n detail?: unknown;\n cause?: unknown;\n\n constructor(code: SdkErrorCode, message: string, detail?: unknown, cause?: unknown) {\n super(message);\n this.name = 'SdkError';\n this.code = code;\n this.detail = detail;\n this.cause = cause;\n }\n}\n","import type { ChainConfigInput, RelayerConfig } from '../types';\nimport { SdkError } from '../errors';\n\nconst RELAYER_ENDPOINT = '/api/v1/relayer_config';\n\nconst normalizeRelayerConfig = (payload: RelayerConfig): RelayerConfig => {\n return {\n ...payload,\n fee_configure: {\n valid_time: payload.fee_configure.valid_time,\n transfer: payload.fee_configure.transfer || {},\n withdraw: payload.fee_configure.withdraw || {},\n },\n fetched_at: Date.now(),\n };\n};\n\nexport const fetchRelayerConfigFromRelayerUrl = async (\n relayerUrl: string,\n options?: { signal?: AbortSignal },\n): Promise<RelayerConfig> => {\n const url = `${relayerUrl.replace(/\\/$/, '')}${RELAYER_ENDPOINT}`;\n const response = await fetch(url, { signal: options?.signal });\n if (!response.ok) {\n throw new SdkError('ASSETS', 'Failed to fetch relayer config', { status: response.status, url });\n }\n const payload = (await response.json()) as RelayerConfig;\n return normalizeRelayerConfig(payload);\n};\n\nexport class RelayerConfigManager {\n private readonly cache = new Map<number, RelayerConfig>();\n\n constructor(private readonly getChains: () => ChainConfigInput[]) {}\n\n private resolveChain(chainId: number): ChainConfigInput {\n const chain = this.getChains().find((entry) => entry.chainId === chainId);\n if (!chain) {\n throw new SdkError('CONFIG', `Chain ${chainId} not found when syncing relayer config`);\n }\n return chain;\n }\n\n private async fetchConfig(url: string): Promise<RelayerConfig> {\n const response = await fetch(url);\n if (!response.ok) throw new SdkError('ASSETS', 'Failed to fetch relayer config', { status: response.status, url });\n const payload = (await response.json()) as RelayerConfig;\n return normalizeRelayerConfig(payload);\n }\n\n private normalizeUrl(relayerUrl: string) {\n return `${relayerUrl.replace(/\\/$/, '')}${RELAYER_ENDPOINT}`;\n }\n\n async sync(chainOrId: ChainConfigInput | number): Promise<RelayerConfig> {\n const chain = typeof chainOrId === 'number' ? this.resolveChain(chainOrId) : chainOrId;\n if (!chain.relayerUrl) {\n throw new SdkError('CONFIG', `Chain ${chain.chainId} has no relayerUrl`);\n }\n const url = this.normalizeUrl(chain.relayerUrl);\n const config = await this.fetchConfig(url);\n this.cache.set(chain.chainId, config);\n return config;\n }\n\n get(chainId: number): RelayerConfig | undefined {\n const cached = this.cache.get(chainId);\n if (!cached) return undefined;\n const validDuration = 5 * 60 * 1000;\n if (cached.fetched_at && Date.now() - cached.fetched_at > validDuration) {\n this.cache.delete(chainId);\n return undefined;\n }\n return cached;\n }\n\n async syncAll() {\n await Promise.all(this.getChains().map((chain) => this.sync(chain).catch(() => undefined)));\n }\n}\n","import type { Address } from 'viem';\nimport type { ChainConfigInput, TokenMetadata } from '../types';\nimport { SdkError } from '../errors';\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => Boolean(value) && typeof value === 'object';\n\nconst isAddress = (value: unknown): value is Address => typeof value === 'string' && /^0x[0-9a-fA-F]{40}$/.test(value);\n\nconst assertArray = (value: unknown, name: string): unknown[] => {\n if (!Array.isArray(value)) throw new SdkError('CONFIG', `Invalid ${name}: expected array`, { value });\n return value;\n};\n\nconst assertString = (value: unknown, name: string): string => {\n if (typeof value !== 'string' || !value.length) throw new SdkError('CONFIG', `Invalid ${name}: expected non-empty string`, { value });\n return value;\n};\n\nconst assertOptionalString = (value: unknown, name: string): string | undefined => {\n if (value == null) return undefined;\n if (typeof value !== 'string') throw new SdkError('CONFIG', `Invalid ${name}: expected string`, { value });\n return value;\n};\n\nconst assertNumber = (value: unknown, name: string): number => {\n if (typeof value !== 'number' || !Number.isFinite(value)) throw new SdkError('CONFIG', `Invalid ${name}: expected number`, { value });\n return value;\n};\n\nconst assertOptionalBps = (value: unknown, name: string): number | undefined => {\n if (value == null) return undefined;\n const n = assertNumber(value, name);\n const i = Math.floor(n);\n if (i !== n) throw new SdkError('CONFIG', `Invalid ${name}: expected integer`, { value });\n if (i < 0 || i > 10000) throw new SdkError('CONFIG', `Invalid ${name}: expected 0..10000`, { value });\n return i;\n};\n\nconst assertBigIntString = (value: unknown, name: string): string => {\n const s = assertString(value, name);\n try {\n BigInt(s);\n } catch (error) {\n throw new SdkError('CONFIG', `Invalid ${name}: expected bigint decimal string`, { value }, error);\n }\n return s;\n};\n\nconst assertOptionalBigintLike = (value: unknown, name: string): bigint | string | undefined => {\n if (value == null) return undefined;\n if (typeof value === 'bigint') return value;\n if (typeof value === 'string') {\n try {\n BigInt(value);\n return value;\n } catch (error) {\n throw new SdkError('CONFIG', `Invalid ${name}: expected bigint|string`, { value }, error);\n }\n }\n throw new SdkError('CONFIG', `Invalid ${name}: expected bigint|string`, { value });\n};\n\nconst assertBigintPairStrings = (value: unknown, name: string): [string, string] => {\n const arr = assertArray(value, name);\n if (arr.length !== 2) throw new SdkError('CONFIG', `Invalid ${name}: expected [x,y]`, { value });\n return [assertBigIntString(arr[0], `${name}[0]`), assertBigIntString(arr[1], `${name}[1]`)];\n};\n\nexport function assertTokenMetadata(value: unknown, name = 'token'): asserts value is TokenMetadata {\n if (!isRecord(value)) throw new SdkError('CONFIG', `Invalid ${name}: expected object`, { value });\n const token = value as Record<string, unknown>;\n\n const id = assertString(token.id, `${name}.id`);\n const wrapped = token.wrappedErc20;\n if (!isAddress(wrapped)) throw new SdkError('CONFIG', `Invalid ${name}.wrappedErc20: expected EVM address`, { value: wrapped });\n\n const viewerPk = token.viewerPk;\n const freezerPk = token.freezerPk;\n assertBigintPairStrings(viewerPk, `${name}.viewerPk`);\n assertBigintPairStrings(freezerPk, `${name}.freezerPk`);\n\n const symbol = token.symbol;\n if (typeof symbol !== 'string') throw new SdkError('CONFIG', `Invalid ${name}.symbol: expected string`, { value: symbol });\n\n const decimals = token.decimals;\n const decimalsNum = assertNumber(decimals, `${name}.decimals`);\n const decimalsInt = Math.floor(decimalsNum);\n if (decimalsInt !== decimalsNum || decimalsInt < 0 || decimalsInt > 255) {\n throw new SdkError('CONFIG', `Invalid ${name}.decimals: expected uint8`, { value: decimals });\n }\n\n assertOptionalBps(token.depositFeeBps, `${name}.depositFeeBps`);\n assertOptionalBps(token.withdrawFeeBps, `${name}.withdrawFeeBps`);\n assertOptionalBigintLike(token.transferMaxAmount, `${name}.transferMaxAmount`);\n assertOptionalBigintLike(token.withdrawMaxAmount, `${name}.withdrawMaxAmount`);\n\n // id is used as a string key; keep it stable.\n if (!id.length) throw new SdkError('CONFIG', `Invalid ${name}.id`, { value: token.id });\n}\n\nexport function assertTokenList(value: unknown, name = 'tokens'): asserts value is TokenMetadata[] {\n const arr = assertArray(value, name);\n for (let i = 0; i < arr.length; i++) {\n assertTokenMetadata(arr[i], `${name}[${i}]`);\n }\n}\n\nexport function assertChainConfigInput(value: unknown, name = 'chain'): asserts value is ChainConfigInput {\n if (!isRecord(value)) throw new SdkError('CONFIG', `Invalid ${name}: expected object`, { value });\n const chain = value as Record<string, unknown>;\n\n assertNumber(chain.chainId, `${name}.chainId`);\n assertOptionalString(chain.rpcUrl, `${name}.rpcUrl`);\n assertOptionalString(chain.entryUrl, `${name}.entryUrl`);\n assertOptionalString(chain.relayerUrl, `${name}.relayerUrl`);\n assertOptionalString(chain.merkleProofUrl, `${name}.merkleProofUrl`);\n\n const contract = chain.contract;\n if (contract != null && !isAddress(contract)) throw new SdkError('CONFIG', `Invalid ${name}.contract: expected address`, { value: contract });\n const ocashContractAddress = chain.ocashContractAddress;\n if (ocashContractAddress != null && !isAddress(ocashContractAddress)) {\n throw new SdkError('CONFIG', `Invalid ${name}.ocashContractAddress: expected address`, { value: ocashContractAddress });\n }\n\n if (chain.tokens != null) assertTokenList(chain.tokens, `${name}.tokens`);\n}\n","import type { ChainConfigInput, RelayerConfig, TokenMetadata } from '../types';\nimport type { Address } from 'viem';\nimport { SdkError } from '../errors';\nimport { RelayerConfigManager } from './relayerConfig';\nimport { assertChainConfigInput, assertTokenMetadata } from './validate';\n\ninterface LedgerConfigResponse {\n chains?: ChainConfigInput[];\n}\n\nconst cloneTokens = (tokens: TokenMetadata[]): TokenMetadata[] => tokens.map((token) => ({ ...token }));\n\nexport class LedgerInfo {\n private readonly chains = new Map<number, ChainConfigInput>();\n private readonly relayerManager: RelayerConfigManager;\n\n constructor(initialChains: ChainConfigInput[] = []) {\n initialChains.forEach((chain) => this.upsertChain(chain));\n this.relayerManager = new RelayerConfigManager(() => this.getChains());\n }\n\n private upsertChain(chain: ChainConfigInput) {\n // Runtime validation: `ChainConfigInput` may come from JSON / JS hosts.\n assertChainConfigInput(chain, `chains[${chain.chainId}]`);\n const tokens = cloneTokens(chain.tokens ?? []);\n this.chains.set(chain.chainId, {\n ...chain,\n tokens,\n });\n }\n\n getChains(): ChainConfigInput[] {\n return Array.from(this.chains.values()).map((chain) => ({\n ...chain,\n tokens: cloneTokens(chain.tokens || []),\n }));\n }\n\n getChain(chainId: number): ChainConfigInput {\n const chain = this.chains.get(chainId);\n if (!chain) {\n throw new SdkError('CONFIG', `Chain ${chainId} not found`);\n }\n return {\n ...chain,\n tokens: cloneTokens(chain.tokens || []),\n };\n }\n\n getTokens(chainId: number): TokenMetadata[] {\n return this.getChain(chainId).tokens || [];\n }\n\n getPoolInfo(chainId: number, tokenId: string): TokenMetadata | undefined {\n return this.getTokens(chainId).find((token) => token.id === tokenId);\n }\n\n getAllowanceTarget(chainId: number): Address {\n const chain = this.getChain(chainId);\n const target = chain.ocashContractAddress ?? chain.contract;\n if (!target) {\n throw new SdkError('CONFIG', `Chain ${chainId} has no ocashContractAddress/contract`);\n }\n return target;\n }\n\n appendTokens(chainId: number, tokens: TokenMetadata[]) {\n const chain = this.chains.get(chainId);\n if (!chain) {\n throw new SdkError('CONFIG', `Chain ${chainId} not found`);\n }\n const tokenMap = new Map<string, TokenMetadata>();\n chain.tokens?.forEach((token) => {\n assertTokenMetadata(token, `chain(${chainId}).tokens(existing)`);\n tokenMap.set(token.id, { ...token });\n });\n tokens.forEach((token) => {\n assertTokenMetadata(token, `chain(${chainId}).tokens(append)`);\n tokenMap.set(token.id, { ...token });\n });\n chain.tokens = Array.from(tokenMap.values());\n this.chains.set(chainId, chain);\n }\n\n async loadFromUrl(url: string) {\n const response = await fetch(url);\n if (!response.ok) {\n throw new SdkError('ASSETS', `Failed to load ledger config from ${url}`, { status: response.status });\n }\n const payloadUnknown = (await response.json()) as unknown;\n const payload = payloadUnknown as LedgerConfigResponse;\n if (!payload || typeof payload !== 'object' || !Array.isArray((payload as any).chains)) {\n throw new SdkError('CONFIG', 'INVALID_LEDGER_CONFIG', payloadUnknown);\n }\n (payload as any).chains.forEach((chain: unknown) => this.upsertChain(chain as ChainConfigInput));\n await this.relayerManager.syncAll();\n }\n\n getRelayerConfig(chainId: number): RelayerConfig | undefined {\n return this.relayerManager.get(chainId);\n }\n\n async syncRelayerConfig(chainId: number): Promise<RelayerConfig> {\n const chain = this.getChain(chainId);\n return this.relayerManager.sync(chain);\n }\n\n async syncAllRelayerConfigs() {\n await this.relayerManager.syncAll();\n }\n}\n","import type { Hex } from '../types';\n\n/**\n * Strict `0x`-prefixed hex string validation.\n * - Only hex chars [0-9a-fA-F]\n * - Even-length payload (whole bytes)\n * - Optional minimum payload length (in bytes)\n */\nexport const isHexStrict = (value: unknown, options?: { minBytes?: number }): value is Hex => {\n if (typeof value !== 'string') return false;\n if (!/^0x[0-9a-fA-F]*$/.test(value)) return false;\n if (value.length % 2 !== 0) return false;\n const payloadChars = value.length - 2;\n if (payloadChars <= 0) return false;\n const minBytes = options?.minBytes;\n if (minBytes != null && Number.isFinite(minBytes)) {\n const minChars = Math.max(0, Math.floor(minBytes)) * 2;\n if (payloadChars < minChars) return false;\n }\n return true;\n};\n\n","import type { Address } from 'viem';\nimport type { TokenMetadata } from '../types';\nimport { SdkError } from '../errors';\nimport { isHexStrict } from '../utils/hex';\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => Boolean(value) && typeof value === 'object';\n\nconst get = (obj: Record<string, unknown>, key: string): unknown => obj[key];\n\nconst getFirstDefined = (obj: Record<string, unknown>, keys: string[]): unknown => {\n for (const k of keys) {\n const v = get(obj, k);\n if (v !== undefined) return v;\n }\n return undefined;\n};\n\nconst toStringPair = (value: unknown, name: string): [string, string] => {\n const arr = Array.isArray(value) ? value : null;\n if (!arr || arr.length !== 2) throw new SdkError('CONFIG', `Invalid ${name}: expected [x,y]`, { value });\n return [String(arr[0] ?? ''), String(arr[1] ?? '')];\n};\n\nconst toFiniteNumberOrUndefined = (value: unknown): number | undefined => {\n if (value == null) return undefined;\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'bigint') return Number(value);\n if (typeof value === 'string' && value.length) {\n const n = Number(value);\n if (Number.isFinite(n)) return n;\n }\n return undefined;\n};\n\nconst toAddressOrThrow = (value: unknown, name: string): Address => {\n if (isHexStrict(value, { minBytes: 20 })) return value as Address;\n throw new SdkError('CONFIG', `Invalid ${name}: expected 20-byte hex address`, { value });\n};\n\nconst toBigintStringOrUndefined = (value: unknown): bigint | string | undefined => {\n if (value == null) return undefined;\n if (typeof value === 'bigint') return value;\n if (typeof value === 'string' && value.length) {\n try {\n BigInt(value);\n return value;\n } catch {\n return undefined;\n }\n }\n if (typeof value === 'number' && Number.isFinite(value)) return BigInt(Math.floor(value));\n return undefined;\n};\n\n/**\n * Normalize token metadata from app-style or sdk-style shapes.\n *\n * Supported legacy fields (app):\n * - `wrapped_erc20` (instead of `wrappedErc20`)\n * - `viewerPK` / `freezerPK` (instead of `viewerPk` / `freezerPk`)\n * - `depositFeeBPS` / `withdrawFeeBPS` (instead of `depositFeeBps` / `withdrawFeeBps`)\n */\nexport const normalizeTokenMetadata = (input: unknown): TokenMetadata => {\n if (!isRecord(input)) throw new SdkError('CONFIG', 'Invalid token metadata', { input });\n\n const idRaw = getFirstDefined(input, ['id', 'poolId']);\n const id = typeof idRaw === 'string' ? idRaw : idRaw != null ? String(idRaw) : '';\n if (!id.length) throw new SdkError('CONFIG', 'Token id is required', { input });\n\n const wrappedErc20 = toAddressOrThrow(getFirstDefined(input, ['wrappedErc20', 'wrapped_erc20', 'token']), 'token.wrappedErc20');\n const viewerPk = toStringPair(getFirstDefined(input, ['viewerPk', 'viewerPK']), 'token.viewerPk');\n const freezerPk = toStringPair(getFirstDefined(input, ['freezerPk', 'freezerPK']), 'token.freezerPk');\n\n const symbolRaw = get(input, 'symbol');\n const symbol = typeof symbolRaw === 'string' ? symbolRaw : '';\n const decimalsRaw = get(input, 'decimals');\n const decimals = typeof decimalsRaw === 'number' && Number.isFinite(decimalsRaw) ? decimalsRaw : 0;\n\n const depositFeeBps = toFiniteNumberOrUndefined(getFirstDefined(input, ['depositFeeBps', 'depositFeeBPS']));\n const withdrawFeeBps = toFiniteNumberOrUndefined(getFirstDefined(input, ['withdrawFeeBps', 'withdrawFeeBPS']));\n\n const transferMaxAmount = toBigintStringOrUndefined(get(input, 'transferMaxAmount'));\n const withdrawMaxAmount = toBigintStringOrUndefined(get(input, 'withdrawMaxAmount'));\n\n return {\n id,\n symbol,\n decimals,\n wrappedErc20,\n viewerPk,\n freezerPk,\n depositFeeBps,\n withdrawFeeBps,\n transferMaxAmount,\n withdrawMaxAmount,\n };\n};\n","export const App_ABI = [\n {\n type: 'function',\n name: 'depositRelayerFee',\n inputs: [],\n outputs: [{ name: '', type: 'uint128' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'poolIds',\n inputs: [{ name: '', type: 'uint256' }],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getPoolInfo',\n inputs: [{ name: 'poolId', type: 'uint256' }],\n outputs: [\n {\n name: '',\n type: 'tuple',\n components: [\n { name: 'token', type: 'address' },\n { name: 'depositFeeBPS', type: 'uint16' },\n { name: 'withdrawFeeBPS', type: 'uint16' },\n { name: 'accumulatedFee', type: 'uint128' },\n { name: 'viewerPK', type: 'uint256[2]' },\n { name: 'freezerPK', type: 'uint256[2]' },\n { name: 'transferMaxAmount', type: 'uint128' },\n { name: 'withdrawMaxAmount', type: 'uint128' },\n ],\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'deposit',\n inputs: [\n { name: 'poolId', type: 'uint256' },\n { name: 'amount', type: 'uint128' },\n { name: 'userPK', type: 'uint256[2]' },\n { name: 'nonce', type: 'uint256' },\n { name: '', type: 'bytes' },\n ],\n outputs: [],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'getArray',\n inputs: [],\n outputs: [{ name: '', type: 'uint256[]' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'digest',\n inputs: [],\n outputs: [\n { name: 'merkleTreeRoot', type: 'uint256' },\n { name: 'currentArrayHash', type: 'uint256' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'totalElements',\n inputs: [],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'merkleRoots',\n inputs: [{ name: '', type: 'uint256' }],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'event',\n name: 'ArrayMergedToTree',\n inputs: [\n { name: 'batchIndex', type: 'uint256', indexed: true },\n { name: 'newRoot', type: 'uint256', indexed: true },\n ],\n anonymous: false,\n },\n] as const;\n","export const ERC20_ABI = [\n {\n type: 'function',\n name: 'name',\n inputs: [],\n outputs: [{ name: '', type: 'string' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'symbol',\n inputs: [],\n outputs: [{ name: '', type: 'string' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'decimals',\n inputs: [],\n outputs: [{ name: '', type: 'uint8' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'allowance',\n inputs: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n ],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'approve',\n inputs: [\n { name: 'spender', type: 'address' },\n { name: 'amount', type: 'uint256' },\n ],\n outputs: [{ name: '', type: 'bool' }],\n stateMutability: 'nonpayable',\n },\n] as const;\n","import type { Address, PublicClient } from 'viem';\nimport { SdkError } from '../errors';\nimport type { TokenMetadata } from '../types';\nimport { App_ABI } from '../abi/app';\nimport { ERC20_ABI } from '../abi/erc20';\nimport { normalizeTokenMetadata } from './tokenNormalize';\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as const;\n\ntype PoolInfo = {\n token: Address;\n depositFeeBPS: number | bigint;\n withdrawFeeBPS: number | bigint;\n viewerPK: readonly [bigint, bigint] | readonly [string, string] | readonly unknown[];\n freezerPK: readonly [bigint, bigint] | readonly [string, string] | readonly unknown[];\n transferMaxAmount: bigint;\n withdrawMaxAmount: bigint;\n};\n\nconst toPoolInfo = (value: unknown): PoolInfo => {\n if (!value || typeof value !== 'object') throw new Error('invalid pool info');\n const v: any = value;\n if (typeof v.token === 'string') return v as PoolInfo;\n if (Array.isArray(v)) {\n return {\n token: v[0],\n depositFeeBPS: v[1],\n withdrawFeeBPS: v[2],\n viewerPK: v[4],\n freezerPK: v[5],\n transferMaxAmount: v[6],\n withdrawMaxAmount: v[7],\n } as PoolInfo;\n }\n return v as PoolInfo;\n};\n\nexport async function fetchPoolTokensFromContract(input: {\n publicClient: PublicClient;\n chainId: number;\n contractAddress: Address;\n maxPools?: number;\n includeErc20Metadata?: boolean;\n}) {\n const maxPools = input.maxPools == null ? 16 : Math.max(1, Math.floor(input.maxPools));\n const includeErc20Metadata = Boolean(input.includeErc20Metadata);\n\n const poolIdsReq = Array.from({ length: maxPools }, (_, idx) => ({\n chainId: input.chainId,\n address: input.contractAddress,\n abi: App_ABI,\n functionName: 'poolIds' as const,\n args: [BigInt(idx)],\n }));\n\n let poolIdsRes: any[];\n try {\n poolIdsRes = (await (input.publicClient as any).multicall({ contracts: poolIdsReq, allowFailure: true })) as any[];\n } catch (error) {\n throw new SdkError('CONFIG', 'Failed to fetch poolIds via multicall', { chainId: input.chainId, contract: input.contractAddress }, error);\n }\n\n const poolIds = poolIdsRes\n .map((r) => (r && r.status === 'success' ? (r.result as bigint) : null))\n .filter((id): id is bigint => typeof id === 'bigint' && id !== 0n);\n\n if (!poolIds.length) return [];\n\n const poolInfoReq = poolIds.map((poolId) => ({\n chainId: input.chainId,\n address: input.contractAddress,\n abi: App_ABI,\n functionName: 'getPoolInfo' as const,\n args: [poolId],\n }));\n\n let poolInfoRes: any[];\n try {\n poolInfoRes = (await (input.publicClient as any).multicall({ contracts: poolInfoReq, allowFailure: true })) as any[];\n } catch (error) {\n throw new SdkError('CONFIG', 'Failed to fetch getPoolInfo via multicall', { chainId: input.chainId, contract: input.contractAddress }, error);\n }\n\n const tokens: TokenMetadata[] = [];\n const tokenAddrByIndex: Address[] = [];\n\n for (let i = 0; i < poolInfoRes.length; i++) {\n const row = poolInfoRes[i];\n if (!row || row.status !== 'success') continue;\n const poolId = poolIds[i]!;\n let info: PoolInfo;\n try {\n info = toPoolInfo(row.result);\n } catch (error) {\n throw new SdkError('CONFIG', 'Invalid getPoolInfo payload', { chainId: input.chainId, poolId: poolId.toString() }, error);\n }\n if (!info?.token || String(info.token).toLowerCase() === ZERO_ADDRESS) continue;\n\n const token: TokenMetadata = normalizeTokenMetadata({\n id: poolId.toString(),\n wrappedErc20: info.token,\n viewerPk: info.viewerPK as any,\n freezerPk: info.freezerPK as any,\n depositFeeBPS: info.depositFeeBPS as any,\n withdrawFeeBPS: info.withdrawFeeBPS as any,\n transferMaxAmount: info.transferMaxAmount,\n withdrawMaxAmount: info.withdrawMaxAmount,\n symbol: '',\n decimals: 0,\n });\n tokens.push(token);\n tokenAddrByIndex.push(info.token);\n }\n\n if (!includeErc20Metadata || !tokens.length) return tokens;\n\n const erc20Req = tokenAddrByIndex.flatMap((address) => [\n { chainId: input.chainId, address, abi: ERC20_ABI, functionName: 'symbol' as const, args: [] as const },\n { chainId: input.chainId, address, abi: ERC20_ABI, functionName: 'decimals' as const, args: [] as const },\n ]);\n\n let erc20Res: any[];\n try {\n erc20Res = (await (input.publicClient as any).multicall({ contracts: erc20Req, allowFailure: true })) as any[];\n } catch (error) {\n // Metadata is best-effort. Return bare tokens.\n return tokens;\n }\n\n for (let i = 0; i < tokens.length; i++) {\n const symbolRow = erc20Res[i * 2];\n const decimalsRow = erc20Res[i * 2 + 1];\n if (symbolRow?.status === 'success' && typeof symbolRow.result === 'string') {\n tokens[i] = { ...tokens[i]!, symbol: symbolRow.result };\n }\n if (decimalsRow?.status === 'success') {\n const dec = decimalsRow.result;\n const decimals = typeof dec === 'number' && Number.isFinite(dec) ? dec : typeof dec === 'bigint' ? Number(dec) : undefined;\n if (decimals != null) tokens[i] = { ...tokens[i]!, decimals };\n }\n }\n\n return tokens;\n}\n\n","import type { CommitmentData, InputSecret, ProofBridge } from '../types';\n\nexport class DummyFactory {\n constructor(private readonly bridge: ProofBridge) {}\n\n async createRecordOpening(): Promise<CommitmentData> {\n return this.bridge.createDummyRecordOpening();\n }\n\n async createInputSecret(): Promise<InputSecret> {\n return this.bridge.createDummyInputSecret();\n }\n}\n","export const bigintReplacer = (_key: string, value: unknown) => {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n return value;\n};\n\nexport const serializeBigInt = <T>(value: T): string => JSON.stringify(value, bigintReplacer);\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (value == null || typeof value !== 'object') return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n};\n\nconst stable = (value: unknown): unknown => {\n if (value == null) return value;\n if (Array.isArray(value)) return value.map((v) => stable(v));\n if (!isPlainObject(value)) return value;\n const obj = value;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(obj).sort()) {\n const v = obj[key];\n if (v === undefined) continue;\n out[key] = stable(v);\n }\n return out;\n};\n\nexport const stableStringify = (value: unknown): string => JSON.stringify(stable(value), bigintReplacer);\n","import { serializeBigInt as serializeBigIntHelper } from './json';\nimport { randomBytes32 as coreRandomBytes32, randomBytes32Bigint } from './random';\n\nconst BASIS_POINTS = 10_000n;\n\nexport const calcDepositFee = (amount: bigint, feeBps?: number): bigint => {\n if (!feeBps) return 0n;\n return (amount * BigInt(feeBps)) / BASIS_POINTS;\n};\n\nexport const randomBytes32 = () => coreRandomBytes32();\n\nexport const serializeBigInt = <T>(value: T): string => serializeBigIntHelper(value);\n\nexport const Utils = {\n calcDepositFee,\n randomBytes32,\n randomBytes32Bigint,\n serializeBigInt,\n};\n","import { encodeAbiParameters, getAddress, keccak256 } from 'viem';\nimport { BABYJUBJUB_SCALAR_FIELD } from '../crypto/babyJubjub';\nimport type { TransferExtraData, Hex } from '../types';\n\nexport function calcTransferProofBinding(input: { relayer: string; extraData: TransferExtraData }) {\n const encodedExtra = encodeAbiParameters([{ type: 'bytes[3]' }], [input.extraData]);\n const packed = encodeAbiParameters([{ type: 'address' }, { type: 'bytes' }], [getAddress(input.relayer), encodedExtra]);\n return BigInt(keccak256(packed)) % BABYJUBJUB_SCALAR_FIELD;\n}\n\nexport function calcWithdrawProofBinding(input: {\n recipient: string;\n amount: bigint;\n relayer: string;\n relayerFee: bigint;\n gasDropValue: bigint;\n extraData: Hex;\n}) {\n const packed = encodeAbiParameters(\n [{ type: 'address' }, { type: 'uint128' }, { type: 'address' }, { type: 'uint128' }, { type: 'uint128' }, { type: 'bytes' }],\n [getAddress(input.recipient), input.amount, getAddress(input.relayer), input.relayerFee, input.gasDropValue, input.extraData],\n );\n return BigInt(keccak256(packed)) % BABYJUBJUB_SCALAR_FIELD;\n}\n","export type OperationStatus = 'created' | 'submitted' | 'confirmed' | 'failed';\n\nexport type OperationType = 'deposit' | 'transfer' | 'withdraw' | (string & {});\n\ntype Hex = `0x${string}`;\n\nexport type ListOperationsQuery = {\n limit?: number;\n offset?: number;\n chainId?: number;\n tokenId?: string;\n type?: OperationType | OperationType[];\n status?: OperationStatus | OperationStatus[];\n sort?: 'desc' | 'asc';\n};\n\nexport type DepositOperationDetail = {\n token: string;\n amount: string;\n protocolFee?: string;\n depositRelayerFee?: string;\n inputCommitments?: Hex[];\n outputCommitments?: Hex[];\n};\n\nexport type TransferOperationDetail = {\n token: string;\n amount: string;\n fee?: string;\n relayerFeeTotal?: string;\n protocolFeeTotal?: string;\n mergeCount?: number;\n feeCount?: number;\n to: Hex;\n inputCommitments?: Hex[];\n outputCommitments?: Hex[];\n};\n\nexport type WithdrawOperationDetail = {\n token: string;\n amount: string;\n burnAmount?: string;\n protocolFee?: string;\n relayerFee?: string;\n relayerFeeTotal?: string;\n protocolFeeTotal?: string;\n mergeCount?: number;\n feeCount?: number;\n recipient: Hex;\n inputCommitments?: Hex[];\n outputCommitments?: Hex[];\n};\n\nexport type BuiltinOperationDetailByType = {\n deposit: DepositOperationDetail;\n transfer: TransferOperationDetail;\n withdraw: WithdrawOperationDetail;\n};\n\nexport type OperationDetailFor<TType extends OperationType> = TType extends keyof BuiltinOperationDetailByType\n ? BuiltinOperationDetailByType[TType]\n : Record<string, unknown>;\n\nexport type StoredOperation<TDetail = Record<string, unknown>> = {\n id: string;\n type: OperationType;\n createdAt: number;\n chainId?: number;\n tokenId?: string;\n\n status: OperationStatus;\n requestUrl?: string;\n relayerTxHash?: `0x${string}`;\n txHash?: `0x${string}`;\n\n detail?: TDetail;\n error?: string;\n};\n\nexport type OperationCreateInput<TType extends OperationType = OperationType> = Omit<\n StoredOperation<OperationDetailFor<TType>>,\n 'id' | 'createdAt' | 'status'\n> &\n Partial<Pick<StoredOperation<OperationDetailFor<TType>>, 'createdAt' | 'id' | 'status'>> & { type: TType };\n\nexport const newOperationId = () => globalThis.crypto.randomUUID();\n\nexport type DepositOperation = Omit<StoredOperation<DepositOperationDetail>, 'type'> & { type: 'deposit'; detail?: DepositOperationDetail };\nexport type TransferOperation = Omit<StoredOperation<TransferOperationDetail>, 'type'> & { type: 'transfer'; detail?: TransferOperationDetail };\nexport type WithdrawOperation = Omit<StoredOperation<WithdrawOperationDetail>, 'type'> & { type: 'withdraw'; detail?: WithdrawOperationDetail };\n","import type { ListOperationsQuery, OperationStatus, OperationType, StoredOperation } from './operationTypes';\n\nconst toSet = <T extends string>(value: T | T[] | undefined): Set<T> | undefined => {\n if (value == null) return undefined;\n return new Set(Array.isArray(value) ? value : [value]);\n};\n\nconst defaultLimit = 50;\n\nexport function applyOperationsQuery(operations: StoredOperation[], input?: number | ListOperationsQuery): StoredOperation[] {\n const query: ListOperationsQuery = typeof input === 'number' || input == null ? { limit: input } : input;\n const limit = query.limit ?? defaultLimit;\n const offset = query.offset ?? 0;\n const typeSet = toSet<OperationType>(query.type);\n const statusSet = toSet<OperationStatus>(query.status);\n\n const source = query.sort === 'asc' ? [...operations].reverse() : operations;\n\n const filtered = source.filter((op) => {\n if (query.chainId != null && op.chainId !== query.chainId) return false;\n if (query.tokenId != null && op.tokenId !== query.tokenId) return false;\n if (typeSet && !typeSet.has(op.type as OperationType)) return false;\n if (statusSet && !statusSet.has(op.status)) return false;\n return true;\n });\n\n return filtered.slice(offset, offset + limit);\n}\n\n","import type { EntryMemoRecord, ListEntryMemosQuery, ListEntryMemosResult } from '../types';\n\nfunction normalizeNumber(value: number | undefined) {\n if (value == null) return undefined;\n const num = Math.floor(value);\n return Number.isFinite(num) ? num : undefined;\n}\n\nfunction compareCreatedAt(a: EntryMemoRecord, b: EntryMemoRecord, factor: number) {\n const aHas = a.createdAt != null;\n const bHas = b.createdAt != null;\n if (aHas !== bHas) return aHas ? -1 : 1;\n if (!aHas || !bHas) return 0;\n const diff = (a.createdAt as number) - (b.createdAt as number);\n return diff === 0 ? 0 : diff * factor;\n}\n\nexport function applyEntryMemoQuery(rows: EntryMemoRecord[], query: ListEntryMemosQuery): ListEntryMemosResult {\n const orderBy = query.orderBy ?? 'cid';\n const order = query.order ?? 'asc';\n const factor = order === 'desc' ? -1 : 1;\n\n const cidFrom = normalizeNumber(query.cidFrom);\n const cidTo = normalizeNumber(query.cidTo);\n const createdAtFrom = normalizeNumber(query.createdAtFrom);\n const createdAtTo = normalizeNumber(query.createdAtTo);\n\n let filtered = rows;\n if (cidFrom != null) filtered = filtered.filter((row) => row.cid >= cidFrom);\n if (cidTo != null) filtered = filtered.filter((row) => row.cid <= cidTo);\n if (createdAtFrom != null) filtered = filtered.filter((row) => row.createdAt != null && row.createdAt >= createdAtFrom);\n if (createdAtTo != null) filtered = filtered.filter((row) => row.createdAt != null && row.createdAt <= createdAtTo);\n\n const sorted = [...filtered].sort((a, b) => {\n if (orderBy === 'createdAt') {\n const createdDiff = compareCreatedAt(a, b, factor);\n if (createdDiff !== 0) return createdDiff;\n const cidDiff = a.cid - b.cid;\n return cidDiff === 0 ? 0 : cidDiff * factor;\n }\n const cidDiff = a.cid - b.cid;\n if (cidDiff !== 0) return cidDiff * factor;\n const createdDiff = compareCreatedAt(a, b, factor);\n return createdDiff;\n });\n\n const total = sorted.length;\n const offset = Math.max(0, Math.floor(query.offset ?? 0));\n const limit = query.limit == null ? undefined : Math.max(0, Math.floor(query.limit));\n const rowsPage = limit == null ? sorted.slice(offset) : sorted.slice(offset, offset + limit);\n return { total, rows: rowsPage };\n}\n","import type { EntryNullifierRecord, ListEntryNullifiersQuery, ListEntryNullifiersResult } from '../types';\n\nfunction normalizeNumber(value: number | undefined) {\n if (value == null) return undefined;\n const num = Math.floor(value);\n return Number.isFinite(num) ? num : undefined;\n}\n\nfunction compareCreatedAt(a: EntryNullifierRecord, b: EntryNullifierRecord, factor: number) {\n const aHas = a.createdAt != null;\n const bHas = b.createdAt != null;\n if (aHas !== bHas) return aHas ? -1 : 1;\n if (!aHas || !bHas) return 0;\n const diff = (a.createdAt as number) - (b.createdAt as number);\n return diff === 0 ? 0 : diff * factor;\n}\n\nexport function applyEntryNullifierQuery(rows: EntryNullifierRecord[], query: ListEntryNullifiersQuery): ListEntryNullifiersResult {\n const orderBy = query.orderBy ?? 'nid';\n const order = query.order ?? 'asc';\n const factor = order === 'desc' ? -1 : 1;\n\n const nidFrom = normalizeNumber(query.nidFrom);\n const nidTo = normalizeNumber(query.nidTo);\n const createdAtFrom = normalizeNumber(query.createdAtFrom);\n const createdAtTo = normalizeNumber(query.createdAtTo);\n\n let filtered = rows;\n if (nidFrom != null) filtered = filtered.filter((row) => row.nid >= nidFrom);\n if (nidTo != null) filtered = filtered.filter((row) => row.nid <= nidTo);\n if (createdAtFrom != null) filtered = filtered.filter((row) => row.createdAt != null && row.createdAt >= createdAtFrom);\n if (createdAtTo != null) filtered = filtered.filter((row) => row.createdAt != null && row.createdAt <= createdAtTo);\n\n const sorted = [...filtered].sort((a, b) => {\n if (orderBy === 'createdAt') {\n const createdDiff = compareCreatedAt(a, b, factor);\n if (createdDiff !== 0) return createdDiff;\n const nidDiff = a.nid - b.nid;\n return nidDiff === 0 ? 0 : nidDiff * factor;\n }\n const nidDiff = a.nid - b.nid;\n if (nidDiff !== 0) return nidDiff * factor;\n const createdDiff = compareCreatedAt(a, b, factor);\n return createdDiff;\n });\n\n const total = sorted.length;\n const offset = Math.max(0, Math.floor(query.offset ?? 0));\n const limit = query.limit == null ? undefined : Math.max(0, Math.floor(query.limit));\n const rowsPage = limit == null ? sorted.slice(offset) : sorted.slice(offset, offset + limit);\n return { total, rows: rowsPage };\n}\n","import type { ListUtxosQuery, ListUtxosResult, UtxoRecord } from '../types';\n\nfunction normalizeNumber(value: number | undefined) {\n if (value == null) return undefined;\n const num = Math.floor(value);\n return Number.isFinite(num) ? num : undefined;\n}\n\nfunction compareCreatedAt(a: UtxoRecord, b: UtxoRecord, factor: number) {\n const aHas = a.createdAt != null;\n const bHas = b.createdAt != null;\n if (aHas !== bHas) return aHas ? -1 : 1;\n if (!aHas || !bHas) return 0;\n const diff = (a.createdAt as number) - (b.createdAt as number);\n return diff === 0 ? 0 : diff * factor;\n}\n\nexport function applyUtxoQuery(rows: UtxoRecord[], query?: ListUtxosQuery): ListUtxosResult {\n const includeSpent = query?.includeSpent ?? false;\n const includeFrozen = query?.includeFrozen ?? false;\n const spentFilter = query?.spent;\n const frozenFilter = query?.frozen;\n const orderBy = query?.orderBy ?? 'mkIndex';\n const order = query?.order ?? 'asc';\n const factor = order === 'desc' ? -1 : 1;\n\n let filtered = rows.filter((utxo) => {\n if (query?.chainId != null && utxo.chainId !== query.chainId) return false;\n if (query?.assetId != null && utxo.assetId !== query.assetId) return false;\n if (spentFilter != null) {\n if (utxo.isSpent !== spentFilter) return false;\n } else if (!includeSpent && utxo.isSpent) {\n return false;\n }\n if (frozenFilter != null) {\n if (utxo.isFrozen !== frozenFilter) return false;\n } else if (!includeFrozen && utxo.isFrozen) {\n return false;\n }\n return true;\n });\n\n const sorted = [...filtered].sort((a, b) => {\n if (orderBy === 'createdAt') {\n const createdDiff = compareCreatedAt(a, b, factor);\n if (createdDiff !== 0) return createdDiff;\n const mkDiff = a.mkIndex - b.mkIndex;\n return mkDiff === 0 ? 0 : mkDiff * factor;\n }\n const mkDiff = a.mkIndex - b.mkIndex;\n if (mkDiff !== 0) return mkDiff * factor;\n const createdDiff = compareCreatedAt(a, b, factor);\n return createdDiff;\n });\n\n const total = sorted.length;\n const offset = Math.max(0, Math.floor(query?.offset ?? 0));\n const limit = query?.limit == null ? undefined : Math.max(0, Math.floor(query.limit));\n const rowsPage = limit == null ? sorted.slice(offset) : sorted.slice(offset, offset + limit);\n return { total, rows: rowsPage };\n}\n","import type {\n EntryMemoRecord,\n EntryNullifierRecord,\n ListEntryMemosQuery,\n ListEntryNullifiersQuery,\n ListUtxosQuery,\n MerkleLeafRecord,\n MerkleNodeRecord,\n MerkleTreeState,\n StorageAdapter,\n SyncCursor,\n UtxoRecord,\n Hex,\n} from '../types';\nimport type { ListOperationsQuery, OperationDetailFor, OperationType, StoredOperation } from './operationTypes';\nimport { newOperationId } from './operationTypes';\nimport { applyOperationsQuery } from './operationsQuery';\nimport { applyEntryMemoQuery } from './entryMemoQuery';\nimport { applyEntryNullifierQuery } from './entryNullifierQuery';\nimport { applyUtxoQuery } from './utxoQuery';\n\nexport class MemoryStore implements StorageAdapter {\n private walletId: string | undefined;\n private readonly cursors = new Map<number, SyncCursor>();\n private readonly utxos = new Map<string, UtxoRecord>();\n private operations: Array<StoredOperation> = [];\n private readonly merkleLeavesByChain = new Map<number, Array<{ cid: number; commitment: Hex }>>();\n private readonly merkleTreesByChain = new Map<number, MerkleTreeState>();\n private readonly merkleNodesByChain = new Map<number, Map<string, MerkleNodeRecord>>();\n private readonly entryMemosByChain = new Map<number, Map<number, EntryMemoRecord>>();\n private readonly entryNullifiersByChain = new Map<number, Map<number, EntryNullifierRecord>>();\n private readonly maxOperations: number;\n\n constructor(options?: { maxOperations?: number }) {\n const max = options?.maxOperations;\n this.maxOperations = max == null ? Number.POSITIVE_INFINITY : Math.max(0, Math.floor(max));\n }\n\n init(options?: { walletId?: string }) {\n const nextWalletId = options?.walletId ?? this.walletId;\n if (nextWalletId !== this.walletId) {\n this.cursors.clear();\n this.utxos.clear();\n this.operations = [];\n this.merkleLeavesByChain.clear();\n this.merkleTreesByChain.clear();\n this.merkleNodesByChain.clear();\n this.entryMemosByChain.clear();\n this.entryNullifiersByChain.clear();\n }\n this.walletId = nextWalletId;\n }\n\n close() {\n // no-op\n }\n\n private enforceMaxOperations(): number {\n if (!Number.isFinite(this.maxOperations)) return 0;\n const before = this.operations.length;\n this.operations = this.operations.slice(0, this.maxOperations);\n return before - this.operations.length;\n }\n\n getSyncCursor(chainId: number): Promise<SyncCursor | undefined> {\n const cursor = this.cursors.get(chainId);\n return Promise.resolve(cursor ? { ...cursor } : undefined);\n }\n\n setSyncCursor(chainId: number, cursor: SyncCursor): Promise<void> {\n this.cursors.set(chainId, { ...cursor });\n return Promise.resolve();\n }\n\n upsertUtxos(utxos: UtxoRecord[]): Promise<void> {\n for (const utxo of utxos) {\n const key = `${utxo.chainId}:${utxo.commitment}`;\n const prev = this.utxos.get(key);\n this.utxos.set(key, { ...utxo, isSpent: prev?.isSpent ?? utxo.isSpent });\n }\n return Promise.resolve();\n }\n\n listUtxos(query?: ListUtxosQuery): Promise<{ total: number; rows: UtxoRecord[] }> {\n const records = Array.from(this.utxos.values());\n const paged = applyUtxoQuery(records, query);\n return Promise.resolve({ total: paged.total, rows: paged.rows.map((utxo) => ({ ...utxo })) });\n }\n\n markSpent(input: { chainId: number; nullifiers: Hex[] }): Promise<number> {\n const wanted = new Set(input.nullifiers.map((nf) => nf.toLowerCase()));\n let updated = 0;\n for (const [key, utxo] of this.utxos.entries()) {\n if (utxo.chainId !== input.chainId) continue;\n if (!wanted.has(utxo.nullifier.toLowerCase())) continue;\n if (!utxo.isSpent) {\n this.utxos.set(key, { ...utxo, isSpent: true });\n updated++;\n }\n }\n return Promise.resolve(updated);\n }\n\n async getMerkleLeaves(chainId: number): Promise<Array<{ cid: number; commitment: Hex }> | undefined> {\n const rows = this.merkleLeavesByChain.get(chainId);\n if (!rows || rows.length === 0) return undefined;\n return rows.map((r) => ({ ...r }));\n }\n\n async appendMerkleLeaves(chainId: number, leaves: Array<{ cid: number; commitment: Hex }>): Promise<void> {\n if (!leaves.length) return;\n const sorted = [...leaves].sort((a, b) => a.cid - b.cid);\n const existing = this.merkleLeavesByChain.get(chainId) ?? [];\n let next = existing.length;\n\n // Drop already persisted leaves (e.g. when resyncing from cid=0)\n const fresh = sorted.filter((l) => Number.isFinite(l.cid) && l.cid >= next);\n if (!fresh.length) {\n this.merkleLeavesByChain.set(chainId, existing);\n return;\n }\n if (fresh[0]!.cid !== next) {\n throw new Error(`Non-contiguous merkle leaves append: expected cid=${next}, got cid=${fresh[0]!.cid}`);\n }\n for (const row of fresh) {\n if (row.cid !== next) throw new Error(`Non-contiguous merkle leaves append: expected cid=${next}, got cid=${row.cid}`);\n existing.push({ cid: row.cid, commitment: row.commitment });\n next++;\n }\n this.merkleLeavesByChain.set(chainId, existing);\n }\n\n async clearMerkleLeaves(chainId: number): Promise<void> {\n this.merkleLeavesByChain.delete(chainId);\n }\n\n async getMerkleLeaf(chainId: number, cid: number): Promise<MerkleLeafRecord | undefined> {\n const rows = this.merkleLeavesByChain.get(chainId);\n const row = rows?.[cid];\n if (!row) return undefined;\n return { chainId, cid: row.cid, commitment: row.commitment };\n }\n\n async getMerkleNode(chainId: number, id: string): Promise<MerkleNodeRecord | undefined> {\n return this.merkleNodesByChain.get(chainId)?.get(id);\n }\n\n async upsertMerkleNodes(chainId: number, nodes: MerkleNodeRecord[]): Promise<void> {\n if (!nodes.length) return;\n let map = this.merkleNodesByChain.get(chainId);\n if (!map) {\n map = new Map();\n this.merkleNodesByChain.set(chainId, map);\n }\n for (const node of nodes) {\n map.set(node.id, { ...node, chainId });\n }\n }\n\n async clearMerkleNodes(chainId: number): Promise<void> {\n this.merkleNodesByChain.delete(chainId);\n }\n\n async getMerkleTree(chainId: number): Promise<MerkleTreeState | undefined> {\n const tree = this.merkleTreesByChain.get(chainId);\n return tree ? { ...tree } : undefined;\n }\n\n async setMerkleTree(chainId: number, tree: MerkleTreeState): Promise<void> {\n this.merkleTreesByChain.set(chainId, { ...tree, chainId });\n }\n\n async clearMerkleTree(chainId: number): Promise<void> {\n this.merkleTreesByChain.delete(chainId);\n }\n\n async upsertEntryMemos(memos: EntryMemoRecord[]): Promise<number> {\n let updated = 0;\n for (const memo of memos) {\n if (!Number.isInteger(memo.cid) || memo.cid < 0) continue;\n let byCid = this.entryMemosByChain.get(memo.chainId);\n if (!byCid) {\n byCid = new Map();\n this.entryMemosByChain.set(memo.chainId, byCid);\n }\n const prev = byCid.get(memo.cid);\n if (!prev) updated++;\n byCid.set(memo.cid, { ...memo });\n }\n return updated;\n }\n\n async listEntryMemos(query: ListEntryMemosQuery): Promise<{ total: number; rows: EntryMemoRecord[] }> {\n const byCid = this.entryMemosByChain.get(query.chainId);\n if (!byCid || byCid.size === 0) return { total: 0, rows: [] };\n const rows = Array.from(byCid.values());\n const paged = applyEntryMemoQuery(rows, query);\n return { total: paged.total, rows: paged.rows.map((r) => ({ ...r })) };\n }\n\n async clearEntryMemos(chainId: number): Promise<void> {\n this.entryMemosByChain.delete(chainId);\n }\n\n async upsertEntryNullifiers(nullifiers: EntryNullifierRecord[]): Promise<number> {\n let updated = 0;\n for (const row of nullifiers) {\n if (!Number.isInteger(row.nid) || row.nid < 0) continue;\n let byNid = this.entryNullifiersByChain.get(row.chainId);\n if (!byNid) {\n byNid = new Map();\n this.entryNullifiersByChain.set(row.chainId, byNid);\n }\n if (!byNid.has(row.nid)) updated++;\n byNid.set(row.nid, { ...row });\n }\n return updated;\n }\n\n async listEntryNullifiers(query: ListEntryNullifiersQuery): Promise<{ total: number; rows: EntryNullifierRecord[] }> {\n const byNid = this.entryNullifiersByChain.get(query.chainId);\n if (!byNid || byNid.size === 0) return { total: 0, rows: [] };\n const rows = Array.from(byNid.values());\n const paged = applyEntryNullifierQuery(rows, query);\n return { total: paged.total, rows: paged.rows.map((r) => ({ ...r })) };\n }\n\n async clearEntryNullifiers(chainId: number): Promise<void> {\n this.entryNullifiersByChain.delete(chainId);\n }\n\n createOperation<TType extends OperationType>(\n input: Omit<StoredOperation<OperationDetailFor<TType>>, 'id' | 'createdAt' | 'status'> & Partial<Pick<StoredOperation<OperationDetailFor<TType>>, 'createdAt' | 'id' | 'status'>> & { type: TType },\n ): StoredOperation<OperationDetailFor<TType>> & { type: TType } {\n const created = {\n ...(input as StoredOperation<OperationDetailFor<TType>>),\n id: input.id ?? newOperationId(),\n createdAt: input.createdAt ?? Date.now(),\n status: input.status ?? 'created',\n } as StoredOperation<OperationDetailFor<TType>> & { type: TType };\n this.operations.unshift(created);\n this.enforceMaxOperations();\n return created;\n }\n\n updateOperation(id: string, patch: Partial<StoredOperation>): void {\n const idx = this.operations.findIndex((op) => op.id === id);\n if (idx === -1) return;\n this.operations[idx] = { ...this.operations[idx]!, ...patch };\n }\n\n deleteOperation(id: string): boolean {\n const idx = this.operations.findIndex((op) => op.id === id);\n if (idx === -1) return false;\n this.operations.splice(idx, 1);\n return true;\n }\n\n clearOperations(): void {\n this.operations = [];\n }\n\n pruneOperations(options?: { max?: number }): number {\n const max = options?.max;\n const limit = max == null ? this.maxOperations : Math.max(0, Math.floor(max));\n const before = this.operations.length;\n this.operations = this.operations.slice(0, limit);\n return before - this.operations.length;\n }\n\n listOperations(input?: number | ListOperationsQuery): StoredOperation[] {\n return applyOperationsQuery(this.operations, input);\n }\n}\n","import type { SyncCursor, UtxoRecord } from '../types';\n\nexport type PersistedUtxoRecord = Omit<UtxoRecord, 'amount'> & { amount: string };\n\nexport type PersistedWalletState = {\n walletId?: string;\n cursors: Record<string, SyncCursor>;\n utxos: Record<string, PersistedUtxoRecord>;\n};\n\nexport const defaultCursor = (): SyncCursor => ({ memo: 0, nullifier: 0, merkle: 0 });\n\nexport function serializeWalletState(input: { walletId?: string; cursors: Map<number, SyncCursor>; utxos: Map<string, UtxoRecord> }): PersistedWalletState {\n const cursors: PersistedWalletState['cursors'] = {};\n for (const [chainId, cursor] of input.cursors.entries()) {\n cursors[String(chainId)] = cursor;\n }\n\n const utxos: PersistedWalletState['utxos'] = {};\n for (const [key, utxo] of input.utxos.entries()) {\n utxos[key] = { ...utxo, amount: utxo.amount.toString() };\n }\n\n return { walletId: input.walletId, cursors, utxos };\n}\n\nexport function hydrateWalletState(state: PersistedWalletState | undefined) {\n const cursors = new Map<number, SyncCursor>();\n const utxos = new Map<string, UtxoRecord>();\n\n for (const [k, v] of Object.entries(state?.cursors ?? {})) {\n const raw = (v ?? {}) as Partial<SyncCursor>;\n const memo = Number((raw as any).memo);\n const nullifier = Number((raw as any).nullifier);\n const merkle = Number((raw as any).merkle);\n cursors.set(Number(k), {\n memo: Number.isFinite(memo) ? memo : 0,\n nullifier: Number.isFinite(nullifier) ? nullifier : 0,\n merkle: Number.isFinite(merkle) ? merkle : 0,\n });\n }\n\n for (const [k, v] of Object.entries(state?.utxos ?? {})) {\n try {\n utxos.set(k, { ...(v as any), amount: BigInt((v as any).amount) });\n } catch {\n // ignore bad utxo rows\n }\n }\n\n return { walletId: state?.walletId, cursors, utxos };\n}\n","import type {\n EntryMemoRecord,\n EntryNullifierRecord,\n Hex,\n ListEntryMemosQuery,\n ListEntryNullifiersQuery,\n ListUtxosQuery,\n MerkleNodeRecord,\n MerkleTreeState,\n StorageAdapter,\n SyncCursor,\n UtxoRecord,\n} from '../types';\nimport type { ListOperationsQuery, OperationDetailFor, OperationType, StoredOperation } from './operationTypes';\nimport type { PersistedWalletState } from './persistedWalletState';\nimport { hydrateWalletState, serializeWalletState } from './persistedWalletState';\nimport type { PersistedStoreState } from './persisted';\nimport { newOperationId } from './operationTypes';\nimport { applyOperationsQuery } from './operationsQuery';\nimport { applyEntryMemoQuery } from './entryMemoQuery';\nimport { applyEntryNullifierQuery } from './entryNullifierQuery';\nimport { applyUtxoQuery } from './utxoQuery';\n\nexport type KeyValueStoreOptions = {\n client: KeyValueClient;\n keyPrefix?: string;\n maxOperations?: number;\n};\n\nexport class KeyValueStore implements StorageAdapter {\n private walletId: string | undefined;\n private readonly cursors = new Map<number, SyncCursor>();\n private readonly utxos = new Map<string, UtxoRecord>();\n private operations: Array<StoredOperation> = [];\n private merkleLeaves: Record<string, Array<{ cid: number; commitment: Hex }>> = {};\n private merkleTrees: Record<string, MerkleTreeState> = {};\n private merkleNodes: Record<string, Record<string, MerkleNodeRecord>> = {};\n private entryMemos: Record<string, EntryMemoRecord[]> = {};\n private entryNullifiers: Record<string, EntryNullifierRecord[]> = {};\n private saveChain: Promise<void> = Promise.resolve();\n private readonly maxOperations: number;\n\n constructor(private readonly options: KeyValueStoreOptions) {\n const max = options.maxOperations;\n this.maxOperations = max == null ? Number.POSITIVE_INFINITY : Math.max(0, Math.floor(max));\n }\n\n async init(options?: { walletId?: string }) {\n this.walletId = options?.walletId ?? this.walletId;\n await this.load();\n }\n\n async close() {\n await this.save();\n }\n\n private stateKey() {\n const prefix = this.options.keyPrefix ?? 'ocash:sdk:store';\n const id = this.walletId ?? 'default';\n return `${prefix}:${id}`;\n }\n\n private async load() {\n // Reset local state first; if the remote has no state for this wallet, we should not leak data from a previous walletId.\n this.cursors.clear();\n this.utxos.clear();\n this.operations = [];\n this.merkleLeaves = {};\n this.merkleTrees = {};\n this.merkleNodes = {};\n this.entryMemos = {};\n this.entryNullifiers = {};\n\n const raw = await this.options.client.get(this.stateKey());\n if (!raw) return;\n try {\n const parsed = JSON.parse(raw) as Partial<PersistedStoreState>;\n const hydrated = hydrateWalletState(parsed.wallet as PersistedWalletState | undefined);\n for (const [k, v] of hydrated.cursors.entries()) this.cursors.set(k, v);\n for (const [k, v] of hydrated.utxos.entries()) this.utxos.set(k, v);\n\n const operations = Array.isArray(parsed.operations) ? (parsed.operations as StoredOperation[]) : [];\n this.operations = operations;\n\n const extra = parsed as Record<string, unknown>;\n\n if (extra.merkleLeaves && typeof extra.merkleLeaves === 'object' && !Array.isArray(extra.merkleLeaves)) {\n this.merkleLeaves = extra.merkleLeaves as typeof this.merkleLeaves;\n }\n\n if (extra.merkleTrees && typeof extra.merkleTrees === 'object' && !Array.isArray(extra.merkleTrees)) {\n this.merkleTrees = extra.merkleTrees as typeof this.merkleTrees;\n }\n\n if (extra.merkleNodes && typeof extra.merkleNodes === 'object' && !Array.isArray(extra.merkleNodes)) {\n this.merkleNodes = extra.merkleNodes as typeof this.merkleNodes;\n }\n\n if (extra.entryMemos && typeof extra.entryMemos === 'object' && !Array.isArray(extra.entryMemos)) {\n this.entryMemos = extra.entryMemos as typeof this.entryMemos;\n }\n\n if (extra.entryNullifiers && typeof extra.entryNullifiers === 'object' && !Array.isArray(extra.entryNullifiers)) {\n this.entryNullifiers = extra.entryNullifiers as typeof this.entryNullifiers;\n }\n } catch {\n // ignore bad state\n }\n\n const pruned = this.pruneOperations();\n if (pruned) void this.save().catch(() => undefined);\n }\n\n private async save() {\n this.saveChain = this.saveChain\n .catch(() => undefined)\n .then(async () => {\n const wallet = serializeWalletState({ walletId: this.walletId, cursors: this.cursors, utxos: this.utxos });\n const state: PersistedStoreState = {\n wallet,\n operations: this.operations,\n merkleLeaves: this.merkleLeaves,\n merkleTrees: this.merkleTrees,\n merkleNodes: this.merkleNodes,\n entryMemos: this.entryMemos,\n entryNullifiers: this.entryNullifiers,\n };\n await this.options.client.set(this.stateKey(), JSON.stringify(state));\n });\n return this.saveChain;\n }\n\n async getMerkleNode(chainId: number, id: string): Promise<MerkleNodeRecord | undefined> {\n const node = this.merkleNodes[String(chainId)]?.[id];\n if (!node) return undefined;\n const hash = (node as any).hash as Hex;\n if (typeof hash !== 'string' || !hash.startsWith('0x')) return undefined;\n return { ...(node as any), chainId };\n }\n\n async upsertMerkleNodes(chainId: number, nodes: MerkleNodeRecord[]): Promise<void> {\n if (!nodes.length) return;\n const key = String(chainId);\n const existing = this.merkleNodes[key] ?? {};\n for (const node of nodes) {\n existing[node.id] = { ...node, chainId };\n }\n this.merkleNodes[key] = existing;\n await this.save();\n }\n\n async clearMerkleNodes(chainId: number): Promise<void> {\n delete this.merkleNodes[String(chainId)];\n await this.save();\n }\n\n async getMerkleTree(chainId: number): Promise<MerkleTreeState | undefined> {\n const row = this.merkleTrees[String(chainId)];\n if (!row) return undefined;\n const totalElements = Number((row as any).totalElements);\n const lastUpdated = Number((row as any).lastUpdated);\n const root = (row as any).root as Hex;\n if (typeof root !== 'string' || !root.startsWith('0x')) return undefined;\n if (!Number.isFinite(totalElements) || totalElements < 0) return undefined;\n return { chainId, root, totalElements: Math.floor(totalElements), lastUpdated: Number.isFinite(lastUpdated) ? Math.floor(lastUpdated) : 0 };\n }\n\n async setMerkleTree(chainId: number, tree: MerkleTreeState): Promise<void> {\n this.merkleTrees[String(chainId)] = { ...tree, chainId };\n await this.save();\n }\n\n async clearMerkleTree(chainId: number): Promise<void> {\n delete this.merkleTrees[String(chainId)];\n await this.save();\n }\n\n async upsertEntryMemos(memos: EntryMemoRecord[]): Promise<number> {\n let updated = 0;\n const grouped = new Map<number, EntryMemoRecord[]>();\n for (const memo of memos) {\n if (!Number.isInteger(memo.cid) || memo.cid < 0) continue;\n const list = grouped.get(memo.chainId) ?? [];\n list.push(memo);\n grouped.set(memo.chainId, list);\n }\n for (const [chainId, list] of grouped.entries()) {\n const key = String(chainId);\n const existing = Array.isArray(this.entryMemos[key]) ? this.entryMemos[key]! : [];\n const byCid = new Map<number, EntryMemoRecord>();\n for (const row of existing) {\n const cid = Number((row as any).cid);\n if (!Number.isFinite(cid) || cid < 0) continue;\n byCid.set(Math.floor(cid), row as any);\n }\n for (const row of list) {\n if (!byCid.has(row.cid)) updated++;\n byCid.set(row.cid, { ...row });\n }\n this.entryMemos[key] = Array.from(byCid.values()).sort((a, b) => a.cid - b.cid);\n }\n if (updated) await this.save();\n return updated;\n }\n\n async listEntryMemos(query: ListEntryMemosQuery): Promise<{ total: number; rows: EntryMemoRecord[] }> {\n const rows = this.entryMemos[String(query.chainId)];\n if (!Array.isArray(rows) || rows.length === 0) return { total: 0, rows: [] };\n const paged = applyEntryMemoQuery(rows as EntryMemoRecord[], query);\n return { total: paged.total, rows: paged.rows.map((r) => ({ ...(r as any) })) };\n }\n\n async clearEntryMemos(chainId: number): Promise<void> {\n delete this.entryMemos[String(chainId)];\n await this.save();\n }\n\n async upsertEntryNullifiers(nullifiers: EntryNullifierRecord[]): Promise<number> {\n let updated = 0;\n const grouped = new Map<number, EntryNullifierRecord[]>();\n for (const row of nullifiers) {\n const list = grouped.get(row.chainId) ?? [];\n list.push(row);\n grouped.set(row.chainId, list);\n }\n for (const [chainId, list] of grouped.entries()) {\n const key = String(chainId);\n const existing = Array.isArray(this.entryNullifiers[key]) ? this.entryNullifiers[key]! : [];\n const byNid = new Map<number, EntryNullifierRecord>();\n for (const row of existing) {\n const nid = Number((row as any).nid);\n if (!Number.isFinite(nid) || nid < 0) continue;\n byNid.set(Math.floor(nid), row as any);\n }\n for (const row of list) {\n if (!Number.isInteger(row.nid) || row.nid < 0) continue;\n if (!byNid.has(row.nid)) updated++;\n byNid.set(row.nid, { ...row });\n }\n this.entryNullifiers[key] = Array.from(byNid.values()).sort((a, b) => a.nid - b.nid);\n }\n if (updated) await this.save();\n return updated;\n }\n\n async listEntryNullifiers(query: ListEntryNullifiersQuery): Promise<{ total: number; rows: EntryNullifierRecord[] }> {\n const rows = this.entryNullifiers[String(query.chainId)];\n if (!Array.isArray(rows) || rows.length === 0) return { total: 0, rows: [] };\n const paged = applyEntryNullifierQuery(rows as EntryNullifierRecord[], query);\n return { total: paged.total, rows: paged.rows.map((r) => ({ ...(r as any) })) };\n }\n\n async clearEntryNullifiers(chainId: number): Promise<void> {\n delete this.entryNullifiers[String(chainId)];\n await this.save();\n }\n\n async getMerkleLeaves(chainId: number): Promise<Array<{ cid: number; commitment: Hex }> | undefined> {\n const rows = this.merkleLeaves[String(chainId)];\n if (!Array.isArray(rows) || rows.length === 0) return undefined;\n const out: Array<{ cid: number; commitment: Hex }> = [];\n for (const row of rows) {\n const cid = Number((row as any)?.cid);\n const commitment = (row as any)?.commitment as Hex;\n if (!Number.isFinite(cid) || cid < 0) continue;\n if (typeof commitment !== 'string' || !commitment.startsWith('0x')) continue;\n out.push({ cid: Math.floor(cid), commitment });\n }\n out.sort((a, b) => a.cid - b.cid);\n return out.length ? out : undefined;\n }\n\n async getMerkleLeaf(chainId: number, cid: number) {\n const rows = await this.getMerkleLeaves(chainId);\n const row = rows?.[cid];\n if (!row) return undefined;\n return { chainId, cid: row.cid, commitment: row.commitment };\n }\n\n async appendMerkleLeaves(chainId: number, leaves: Array<{ cid: number; commitment: Hex }>): Promise<void> {\n if (!leaves.length) return;\n const key = String(chainId);\n const existing = (await this.getMerkleLeaves(chainId)) ?? [];\n const sorted = [...leaves].sort((a, b) => a.cid - b.cid);\n let next = existing.length;\n const fresh = sorted.filter((l) => Number.isFinite(l.cid) && l.cid >= next);\n if (!fresh.length) {\n this.merkleLeaves[key] = existing;\n return;\n }\n if (fresh[0]!.cid !== next) {\n throw new Error(`Non-contiguous merkle leaves append: expected cid=${next}, got cid=${fresh[0]!.cid}`);\n }\n for (const row of fresh) {\n if (row.cid !== next) throw new Error(`Non-contiguous merkle leaves append: expected cid=${next}, got cid=${row.cid}`);\n existing.push({ cid: row.cid, commitment: row.commitment });\n next++;\n }\n this.merkleLeaves[key] = existing;\n await this.save();\n }\n\n async clearMerkleLeaves(chainId: number): Promise<void> {\n delete this.merkleLeaves[String(chainId)];\n await this.save();\n }\n\n async getSyncCursor(chainId: number): Promise<SyncCursor | undefined> {\n const cursor = this.cursors.get(chainId);\n return cursor ? { ...cursor } : undefined;\n }\n\n async setSyncCursor(chainId: number, cursor: SyncCursor): Promise<void> {\n this.cursors.set(chainId, { ...cursor });\n await this.save();\n }\n\n async upsertUtxos(utxos: UtxoRecord[]): Promise<void> {\n for (const utxo of utxos) {\n const key = `${utxo.chainId}:${utxo.commitment}`;\n const prev = this.utxos.get(key);\n this.utxos.set(key, { ...utxo, isSpent: prev?.isSpent ?? utxo.isSpent });\n }\n await this.save();\n }\n\n async listUtxos(query?: ListUtxosQuery): Promise<{ total: number; rows: UtxoRecord[] }> {\n const records = Array.from(this.utxos.values());\n const paged = applyUtxoQuery(records, query);\n return { total: paged.total, rows: paged.rows.map((utxo) => ({ ...utxo })) };\n }\n\n async markSpent(input: { chainId: number; nullifiers: Hex[] }): Promise<number> {\n const wanted = new Set(input.nullifiers.map((nf) => nf.toLowerCase()));\n let updated = 0;\n for (const [key, utxo] of this.utxos.entries()) {\n if (utxo.chainId !== input.chainId) continue;\n if (!wanted.has(utxo.nullifier.toLowerCase())) continue;\n if (!utxo.isSpent) {\n this.utxos.set(key, { ...utxo, isSpent: true });\n updated++;\n }\n }\n if (updated) await this.save();\n return updated;\n }\n\n createOperation<TType extends OperationType>(\n input: Omit<StoredOperation<OperationDetailFor<TType>>, 'id' | 'createdAt' | 'status'> & Partial<Pick<StoredOperation<OperationDetailFor<TType>>, 'createdAt' | 'id' | 'status'>> & { type: TType },\n ) {\n const created = {\n ...(input as StoredOperation<OperationDetailFor<TType>>),\n id: input.id ?? newOperationId(),\n createdAt: input.createdAt ?? Date.now(),\n status: input.status ?? 'created',\n } as StoredOperation<OperationDetailFor<TType>> & { type: TType };\n this.operations.unshift(created);\n this.pruneOperations();\n void this.save().catch(() => undefined);\n return created;\n }\n\n updateOperation(id: string, patch: Partial<StoredOperation>) {\n const idx = this.operations.findIndex((op) => op.id === id);\n if (idx === -1) return;\n this.operations[idx] = { ...this.operations[idx]!, ...patch };\n void this.save().catch(() => undefined);\n }\n\n deleteOperation(id: string): boolean {\n const idx = this.operations.findIndex((op) => op.id === id);\n if (idx === -1) return false;\n this.operations.splice(idx, 1);\n void this.save().catch(() => undefined);\n return true;\n }\n\n clearOperations(): void {\n this.operations = [];\n void this.save().catch(() => undefined);\n }\n\n pruneOperations(options?: { max?: number }): number {\n const limit = Math.max(0, Math.floor(options?.max ?? this.maxOperations));\n const before = this.operations.length;\n this.operations = this.operations.slice(0, limit);\n return before - this.operations.length;\n }\n\n listOperations(input?: number | ListOperationsQuery) {\n return applyOperationsQuery(this.operations, input);\n }\n}\n\nexport type RedisStoreOptions = KeyValueStoreOptions;\nexport class RedisStore extends KeyValueStore {\n constructor(options: RedisStoreOptions) {\n super({ ...options, keyPrefix: options.keyPrefix ?? 'ocash:sdk:redis:store' });\n }\n}\n\nexport type SqliteStoreOptions = KeyValueStoreOptions;\nexport class SqliteStore extends KeyValueStore {\n constructor(options: SqliteStoreOptions) {\n super({ ...options, keyPrefix: options.keyPrefix ?? 'ocash:sdk:sqlite:store' });\n }\n}\n\nexport interface KeyValueClient {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<void>;\n del?(key: string): Promise<void>;\n}\n","export interface AppRecordOpening<T = bigint> {\n asset_id: T;\n asset_amount: T;\n user_pk: { user_address: [T, T] };\n blinding_factor: T;\n is_frozen: boolean;\n}\n\nimport type { CommitmentData } from '../types';\n\nexport interface CommitmentDataJSON extends AppRecordOpening<string> {}\n\nexport const toCommitmentData = (ro: AppRecordOpening<number | bigint | string>): CommitmentData => ({\n asset_id: BigInt(ro.asset_id),\n asset_amount: BigInt(ro.asset_amount),\n user_pk: {\n user_address: [BigInt(ro.user_pk.user_address[0]), BigInt(ro.user_pk.user_address[1])],\n },\n blinding_factor: BigInt(ro.blinding_factor),\n is_frozen: Boolean(ro.is_frozen),\n});\n\nexport const toRecordOpeningJson = (ro: CommitmentData): AppRecordOpening<string> => ({\n asset_id: ro.asset_id.toString(),\n asset_amount: ro.asset_amount.toString(),\n user_pk: {\n user_address: [ro.user_pk.user_address[0].toString(), ro.user_pk.user_address[1].toString()],\n },\n blinding_factor: ro.blinding_factor.toString(),\n is_frozen: ro.is_frozen,\n});\n","export interface CacheControllerConfig {\n baseDir?: string;\n enable?: boolean;\n}\n\nexport class CacheController {\n private readonly baseDir: string;\n private readonly enabled: boolean;\n\n constructor(private readonly config: CacheControllerConfig = {}) {\n this.enabled = config.enable !== false && Boolean(config.baseDir);\n this.baseDir = config.baseDir ?? '';\n }\n\n private async resolvePath(key: string): Promise<string | null> {\n if (!this.enabled) return null;\n try {\n const path = await import('node:path');\n return path.resolve(this.baseDir, key);\n } catch {\n return null;\n }\n }\n\n async load(key: string, maxAgeMs?: number): Promise<ArrayBuffer | null> {\n if (!this.enabled) return null;\n try {\n const filePath = await this.resolvePath(key);\n if (!filePath) return null;\n const fs = await import('node:fs/promises');\n const meta = await fs.stat(filePath);\n if (maxAgeMs && Date.now() - meta.mtimeMs > maxAgeMs) {\n return null;\n }\n const buffer = await fs.readFile(filePath);\n return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);\n } catch {\n return null;\n }\n }\n\n async save(key: string, payload: ArrayBuffer) {\n if (!this.enabled) return;\n try {\n const filePath = await this.resolvePath(key);\n if (!filePath) return;\n const [fs, path] = await Promise.all([import('node:fs/promises'), import('node:path')]);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n const buffer = Buffer.from(payload);\n await fs.writeFile(filePath, buffer);\n } catch {\n // ignore cache failures\n }\n }\n}\n","import type { CommitmentData, InputSecret, ProofBridge, AssetOverrideEntry, AssetsOverride, OCashSdkConfig } from '../types';\nimport { MemoKit } from '../memo/memoKit';\nimport { CryptoToolkit } from '../crypto/cryptoToolkit';\nimport { toCommitmentData } from '../crypto/records';\nimport { CacheController } from './cache';\nimport { SdkError } from '../errors';\n\nconst arrayBufferToHex = (buffer: ArrayBuffer): string => {\n const view = new Uint8Array(buffer);\n return Array.from(view, (byte) => byte.toString(16).padStart(2, '0')).join('');\n};\n\nexport interface WasmBridgeConfig {\n assetsOverride?: AssetsOverride;\n cacheDir?: string;\n runtime?: 'auto' | 'browser' | 'node' | 'hybrid';\n}\n\nconst getGlobal = <T = any>(key: string): T | undefined => (globalThis as any)[key];\n\ntype AssetSource = { kind: 'url'; url: string } | { kind: 'file'; filePath: string };\n\nconst fileUrlToPathCompat = (url: string): string => {\n const u = new URL(url);\n if (u.protocol !== 'file:') {\n throw new SdkError('CONFIG', 'Only file:// URLs are supported for local assets', { url });\n }\n let pathname = decodeURIComponent(u.pathname);\n // On Windows `file:///C:/...` becomes `/C:/...` in URL.pathname\n if (/^\\/[a-zA-Z]:\\//.test(pathname)) pathname = pathname.slice(1);\n return pathname;\n};\n\nexport class UniversalWasmBridge implements ProofBridge {\n private goInstance: any | null = null;\n private initialized = false;\n private transferReady = false;\n private withdrawReady = false;\n private readonly cache: CacheController;\n private readonly runtime: 'browser' | 'node' | 'hybrid';\n private readonly textDecoder = new TextDecoder();\n\n constructor(private readonly config: WasmBridgeConfig = {}) {\n this.runtime = this.detectRuntime(config.runtime);\n this.cache = new CacheController({ baseDir: config.cacheDir, enable: this.runtime !== 'browser' });\n }\n\n private detectRuntime(preferred?: OCashSdkConfig['runtime']): 'browser' | 'node' | 'hybrid' {\n if (preferred === 'browser') return 'browser';\n if (preferred === 'node') return 'node';\n if (preferred === 'hybrid') return 'hybrid';\n if (typeof window !== 'undefined' && typeof window.document !== 'undefined') return 'browser';\n // Workers (no `window.document`) still behave like browsers.\n if (typeof globalThis.location !== 'undefined') return 'browser';\n if (typeof process !== 'undefined' && Boolean((process as any)?.versions?.node)) return 'node';\n return 'browser';\n }\n\n private cacheKey(url: string) {\n return url.replace(/^[a-z]+:\\/\\//i, '').replace(/[^a-zA-Z0-9._-]/g, '_');\n }\n\n private async fetchBinary(filename: string): Promise<ArrayBuffer> {\n const override = this.config.assetsOverride?.[filename];\n if (!override) {\n throw new SdkError('ASSETS', `Missing assetsOverride for ${filename}`, { filename });\n }\n return this.fetchOverride(filename, override);\n }\n\n private async fetchOverride(key: string, override: AssetOverrideEntry): Promise<ArrayBuffer> {\n if (typeof override === 'string') {\n return this.fetchSourceCached(key, await this.resolveAssetSource(override));\n }\n if (Array.isArray(override)) {\n return this.fetchShards(key, override);\n }\n throw new SdkError('ASSETS', 'Unknown asset override format', { key, overrideType: typeof override });\n }\n\n private async resolveAssetSource(pathOrUrl: string): Promise<AssetSource> {\n if (/^https?:\\/\\//i.test(pathOrUrl)) return { kind: 'url', url: pathOrUrl };\n\n const origin = typeof globalThis.location?.origin === 'string' ? globalThis.location.origin : undefined;\n if (this.runtime === 'browser' || (this.runtime === 'hybrid' && origin)) {\n if (/^file:\\/\\//i.test(pathOrUrl)) {\n throw new SdkError('CONFIG', 'file:// assets are not supported in browser runtime', { pathOrUrl });\n }\n if (!origin) {\n throw new SdkError('CONFIG', 'Cannot resolve relative asset URL without location.origin', { pathOrUrl, runtime: this.runtime });\n }\n return { kind: 'url', url: new URL(pathOrUrl, origin).toString() };\n }\n\n // Node (or hybrid without `window.location`): treat as a local filesystem path.\n if (/^file:\\/\\//i.test(pathOrUrl)) {\n return { kind: 'file', filePath: fileUrlToPathCompat(pathOrUrl) };\n }\n const nodePath = await import('node:path');\n return {\n kind: 'file',\n filePath: nodePath.isAbsolute(pathOrUrl) ? pathOrUrl : nodePath.resolve(process.cwd(), pathOrUrl),\n };\n }\n\n private async fetchUrlCached(key: string, url: string): Promise<ArrayBuffer> {\n const cacheKey = `${key}/${this.cacheKey(url)}`;\n const cached = await this.cache.load(cacheKey);\n if (cached) return cached;\n const response = await fetch(url);\n if (!response.ok) {\n throw new SdkError('ASSETS', `Failed to load resource: ${url} (${response.status})`, { url, status: response.status });\n }\n const buffer = await response.arrayBuffer();\n await this.cache.save(cacheKey, buffer);\n return buffer;\n }\n\n private async readLocalFile(filePath: string): Promise<ArrayBuffer> {\n try {\n const fs = await import('node:fs/promises');\n const buffer = await fs.readFile(filePath);\n return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);\n } catch (error) {\n throw new SdkError('ASSETS', `Failed to read local asset: ${filePath}`, { filePath }, error);\n }\n }\n\n private async fetchSourceCached(key: string, source: AssetSource): Promise<ArrayBuffer> {\n if (source.kind === 'file') return this.readLocalFile(source.filePath);\n return this.fetchUrlCached(key, source.url);\n }\n\n private async fetchShards(key: string, paths: string[]): Promise<ArrayBuffer> {\n if (!paths.length) {\n throw new SdkError('ASSETS', 'Asset shards must include at least one path', { key });\n }\n const shardSources = await Promise.all(paths.map((pathOrUrl) => this.resolveAssetSource(pathOrUrl)));\n const buffers = await Promise.all(shardSources.map((source, index) => this.fetchSourceCached(`${key}/${index}`, source)));\n const total = buffers.reduce((sum, buf) => sum + buf.byteLength, 0);\n const merged = new Uint8Array(total);\n let offset = 0;\n for (const buf of buffers) {\n merged.set(new Uint8Array(buf), offset);\n offset += buf.byteLength;\n }\n return merged.buffer;\n }\n\n private async fetchHex(filename: string): Promise<string> {\n const buffer = await this.fetchBinary(filename);\n return arrayBufferToHex(buffer);\n }\n\n private async fetchText(filename: string): Promise<string> {\n const override = this.config.assetsOverride?.[filename];\n if (!override) {\n throw new SdkError('ASSETS', `Missing assetsOverride for ${filename}`, { filename });\n }\n if (typeof override !== 'string') {\n throw new SdkError('ASSETS', `Asset ${filename} must be provided as a single URL or file path`, { filename });\n }\n const source = await this.resolveAssetSource(override);\n if (source.kind === 'file') {\n try {\n const fs = await import('node:fs/promises');\n const text = await fs.readFile(source.filePath, 'utf8');\n return text;\n } catch (error) {\n throw new SdkError('ASSETS', `Failed to read local text asset: ${filename}`, { filename, filePath: source.filePath }, error);\n }\n }\n const cacheKey = `text/${filename}/${this.cacheKey(source.url)}`;\n const cached = await this.cache.load(cacheKey);\n if (cached) {\n const text = this.textDecoder.decode(cached);\n return text;\n }\n\n const response = await fetch(source.url);\n if (!response.ok) {\n throw new SdkError('ASSETS', `Failed to load resource: ${source.url} (${response.status})`, { url: source.url, status: response.status });\n }\n const buffer = await response.arrayBuffer();\n const text = this.textDecoder.decode(buffer);\n await this.cache.save(cacheKey, buffer);\n return text;\n }\n\n private async ensureGoRuntime() {\n if (typeof getGlobal('Go') === 'function') return;\n const scriptText = await this.fetchText('wasm_exec.js');\n // eslint-disable-next-line no-new-func\n const initializer = new Function(scriptText + '\\nreturn Go;');\n const GoClass = initializer.call(globalThis);\n (globalThis as any).Go = GoClass;\n }\n\n async init(): Promise<void> {\n if (this.initialized) return;\n await this.ensureGoRuntime();\n const GoClass = getGlobal<any>('Go');\n if (typeof GoClass !== 'function') {\n throw new SdkError('ASSETS', 'Go runtime not available after loading wasm_exec.js');\n }\n const wasmBytes = await this.fetchBinary('app.wasm');\n this.goInstance = new GoClass();\n const { instance } = await WebAssembly.instantiate(wasmBytes, this.goInstance.importObject);\n this.goInstance.run(instance);\n this.initialized = true;\n }\n\n async initTransfer(): Promise<void> {\n if (this.transferReady) return;\n await this.init();\n const [csHex, pkHex] = await Promise.all([this.fetchHex('transfer.r1cs'), this.fetchHex('transfer.pk')]);\n const result = getGlobal<(cs: string, pk: string) => string>('initTransferCircuit');\n if (!result) throw new SdkError('PROOF', 'initTransferCircuit not found');\n const response = JSON.parse(result(csHex, pkHex));\n if (!response?.success && !String(response?.err).toLowerCase().includes('prover already exists')) {\n throw new SdkError('PROOF', response?.err || 'initTransferCircuit failed', { response });\n }\n this.transferReady = true;\n }\n\n async initWithdraw(): Promise<void> {\n if (this.withdrawReady) return;\n await this.init();\n const [csHex, pkHex] = await Promise.all([this.fetchHex('withdraw.r1cs'), this.fetchHex('withdraw.pk')]);\n const result = getGlobal<(cs: string, pk: string) => string>('initWithdrawCircuit');\n if (!result) throw new SdkError('PROOF', 'initWithdrawCircuit not found');\n const response = JSON.parse(result(csHex, pkHex));\n if (!response?.success && !String(response?.err).toLowerCase().includes('prover already exists')) {\n throw new SdkError('PROOF', response?.err || 'initWithdrawCircuit failed', { response });\n }\n this.withdrawReady = true;\n }\n\n async proveTransfer(witness: string): Promise<string> {\n await this.initTransfer();\n const handler = getGlobal<(witness: string, mode: 1 | 2) => string>('proveTransfer');\n if (!handler) {\n throw new SdkError('PROOF', 'proveTransfer is not available');\n }\n return handler(witness, 2);\n }\n\n async proveWithdraw(witness: string): Promise<string> {\n await this.initWithdraw();\n const handler = getGlobal<(witness: string, mode: 1 | 2) => string>('proveWithdraw');\n if (!handler) {\n throw new SdkError('PROOF', 'proveWithdraw is not available');\n }\n return handler(witness, 2);\n }\n\n createMemo(ro: CommitmentData) {\n return MemoKit.createMemo(ro);\n }\n\n decryptMemo(secretKey: bigint, memo: `0x${string}`) {\n return MemoKit.decryptMemo(secretKey, memo);\n }\n\n commitment(ro: CommitmentData, format: 'hex' | 'bigint' = 'hex') {\n return format === 'bigint' ? CryptoToolkit.commitment(ro, 'bigint') : CryptoToolkit.commitment(ro, 'hex');\n }\n\n nullifier(secretKey: bigint, commitment: `0x${string}`, freezerPk?: [bigint, bigint]) {\n return CryptoToolkit.nullifier(secretKey, commitment, freezerPk);\n }\n\n async createDummyRecordOpening(): Promise<CommitmentData> {\n await this.init();\n const handler = getGlobal<() => string>('createDummyRecordOpening');\n if (!handler) {\n throw new SdkError('WITNESS', 'createDummyRecordOpening not available');\n }\n const response = JSON.parse(handler());\n if (!response?.success) {\n throw new SdkError('WITNESS', response?.err || 'createDummyRecordOpening failed', { response });\n }\n return toCommitmentData(response.record_opening);\n }\n\n async createDummyInputSecret(): Promise<InputSecret> {\n await this.init();\n const handler = getGlobal<() => string>('createDummyInputSecret');\n if (!handler) throw new SdkError('WITNESS', 'createDummyInputSecret not available');\n const response = JSON.parse(handler());\n if (!response?.success) {\n throw new SdkError('WITNESS', response?.err || 'createDummyInputSecret failed', { response });\n }\n const input = response.input_secret;\n return {\n owner_keypair: {\n user_pk: {\n user_address: [BigInt(input.owner_keypair.user_pk.user_address[0]), BigInt(input.owner_keypair.user_pk.user_address[1])] as [bigint, bigint],\n aead_encryption_key: input.owner_keypair.user_pk.aead_encryption_key,\n },\n user_sk: {\n address_sk: input.owner_keypair.user_sk.address_sk,\n aead_decryption_key: input.owner_keypair.user_sk.aead_decryption_key,\n },\n },\n ro: toCommitmentData(input.ro),\n acc_member_witness: input.acc_member_witness,\n };\n }\n}\n","import EventEmitter from 'eventemitter3';\nimport type { SdkEvent } from '../types';\n\nexport class SdkEventBus {\n private readonly emitter = new EventEmitter<SdkEvent['type']>();\n\n emit(event: SdkEvent) {\n this.emitter.emit(event.type, event);\n }\n\n on<T extends SdkEvent['type']>(type: T, handler: (event: Extract<SdkEvent, { type: T }>) => void) {\n this.emitter.on(type, handler as any);\n }\n\n off<T extends SdkEvent['type']>(type: T, handler: (event: Extract<SdkEvent, { type: T }>) => void) {\n this.emitter.off(type, handler as any);\n }\n\n removeAllListeners() {\n this.emitter.removeAllListeners();\n }\n}\n","import type { OCashSdkConfig, SdkEvent, ProofBridge } from '../types';\nimport { SdkEventBus } from './events';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex, utf8ToBytes } from '@noble/hashes/utils';\nimport { stableStringify } from '../utils/json';\n\nconst computeAssetsVersion = (assetsOverride: OCashSdkConfig['assetsOverride']): string => {\n if (!assetsOverride) return 'none';\n const json = stableStringify(assetsOverride);\n const digest = sha256(utf8ToBytes(json));\n return `sha256:${bytesToHex(digest)}`;\n};\n\nexport class SdkCore {\n private initialized = false;\n private readonly eventBus = new SdkEventBus();\n\n constructor(\n private readonly config: OCashSdkConfig,\n private readonly proofBridge: ProofBridge,\n ) {\n // `config.onEvent` is invoked for every emitted event in `emit()`.\n }\n\n async ready(onProgress?: (value: number) => void) {\n if (this.initialized) {\n onProgress?.(1);\n return;\n }\n const startedAt = Date.now();\n const progress = (value: number) => {\n if (onProgress) onProgress(value);\n this.emit({\n type: 'core:progress',\n payload: { stage: 'fetch', loaded: Math.floor(value * 100), total: 100 },\n });\n };\n progress(0.4);\n await this.proofBridge.init();\n progress(1);\n this.initialized = true;\n this.emit({\n type: 'core:ready',\n payload: { durationMs: Date.now() - startedAt, assetsVersion: computeAssetsVersion(this.config.assetsOverride) },\n });\n }\n\n reset() {\n this.initialized = false;\n this.eventBus.removeAllListeners();\n }\n\n on<T extends SdkEvent['type']>(type: T, handler: (event: Extract<SdkEvent, { type: T }>) => void) {\n this.eventBus.on(type, handler);\n }\n\n off<T extends SdkEvent['type']>(type: T, handler: (event: Extract<SdkEvent, { type: T }>) => void) {\n this.eventBus.off(type, handler);\n }\n\n emit(event: SdkEvent) {\n this.eventBus.emit(event);\n this.config.onEvent?.(event);\n }\n}\n","import type { ProofBridge, ProofResult, TransferWitnessInput, WitnessBuildResult, WitnessContext, WithdrawWitnessInput } from '../types';\nimport { bigintReplacer } from '../utils/json';\nimport type { SdkEvent } from '../types';\nimport { SdkCore } from '../core/sdk-core';\n\nexport class ProofEngine {\n constructor(\n private readonly bridge: ProofBridge,\n private readonly core: SdkCore,\n ) {}\n\n async createWitnessTransfer(input: TransferWitnessInput, context: WitnessContext = {}): Promise<WitnessBuildResult> {\n return this.composeBuildResult('transfer', input, context);\n }\n\n async createWitnessWithdraw(input: WithdrawWitnessInput, context: WitnessContext = {}): Promise<WitnessBuildResult> {\n return this.composeBuildResult('withdraw', input, context);\n }\n\n async proveTransfer(witness: TransferWitnessInput | string, context: WitnessContext = {}): Promise<ProofResult> {\n return this.prove('transfer', witness, context);\n }\n\n async proveWithdraw(witness: WithdrawWitnessInput | string, context: WitnessContext = {}): Promise<ProofResult> {\n return this.prove('withdraw', witness, context);\n }\n\n private composeBuildResult(type: 'transfer' | 'withdraw', witness: TransferWitnessInput | WithdrawWitnessInput, context: WitnessContext): WitnessBuildResult {\n return {\n witness,\n witness_type: type,\n array_hash_index: context.array_hash_index,\n merkle_root_index: context.merkle_root_index,\n relayer: context.relayer,\n extra_data: context.extra_data,\n relayer_fee: context.relayer_fee,\n gas_drop_value: context.gas_drop_value,\n array_hash_digest: context.array_hash_digest,\n };\n }\n\n private async prove(type: 'transfer' | 'withdraw', witness: TransferWitnessInput | WithdrawWitnessInput | string, context: WitnessContext): Promise<ProofResult> {\n const payload = typeof witness === 'string' ? witness : JSON.stringify(witness, bigintReplacer);\n this.emit({ type: 'zkp:start', payload: { circuit: type } });\n const startedAt = Date.now();\n try {\n const raw = type === 'transfer' ? await this.bridge.proveTransfer(payload) : await this.bridge.proveWithdraw(payload);\n const parsed = JSON.parse(raw);\n if (!parsed.success) {\n throw new Error(parsed.err || `prove${type === 'transfer' ? 'Transfer' : 'Withdraw'} failed`);\n }\n const publicInput = parsed.input ?? parsed.public_input;\n const result: ProofResult = {\n proof: parsed.proof,\n flatten_input: parsed.flatten_input,\n public_input: publicInput,\n array_hash_index: parsed.array_hash_index ?? context.array_hash_index,\n merkle_root_index: parsed.merkle_root_index ?? context.merkle_root_index,\n relayer: parsed.relayer ?? context.relayer,\n recipient: parsed.recipient ?? context.recipient,\n withdraw_amount: parsed.withdraw_amount ? BigInt(parsed.withdraw_amount) : context.withdraw_amount,\n extra_data: parsed.extra_data ?? context.extra_data,\n relayer_fee: parsed.relayer_fee ? BigInt(parsed.relayer_fee) : context.relayer_fee,\n gas_drop_value: parsed.gas_drop_value ? BigInt(parsed.gas_drop_value) : context.gas_drop_value,\n array_hash_digest: parsed.array_hash_digest ?? context.array_hash_digest,\n gnark_output: parsed.gnark_output,\n witness_json: parsed.witness_json,\n err: parsed.err ?? null,\n warnings: parsed.warnings,\n };\n const elapsed = Date.now() - startedAt;\n this.emit({\n type: 'zkp:done',\n payload: {\n circuit: type,\n costMs: elapsed,\n },\n });\n return result;\n } catch (error) {\n this.emit({\n type: 'error',\n payload: {\n code: 'PROOF',\n message: error instanceof Error ? error.message : 'Proof failed',\n detail: { circuit: type },\n cause: error,\n },\n });\n throw error;\n }\n }\n\n private emit(event: SdkEvent) {\n this.core.emit(event);\n }\n}\n","import { MemoKit } from './memoKit';\nimport type { CommitmentData, MemoDecryptRequest, MemoDecryptResult, MemoWorkerConfig } from '../types';\nimport { SdkError } from '../errors';\n\nconst DEFAULT_CONCURRENCY = typeof navigator !== 'undefined' && typeof navigator.hardwareConcurrency === 'number' ? Math.max(1, Math.floor(navigator.hardwareConcurrency / 2)) : 2;\n\ninterface WorkerMessageResult {\n index: number;\n record?: CommitmentData | null;\n error?: string;\n}\n\ninterface WorkerResponsePayload {\n id: string;\n type: 'success' | 'error';\n data?: WorkerMessageResult[];\n error?: string;\n}\n\nexport class MemoWorker {\n private worker: Worker | null = null;\n private readonly pending = new Map<\n string,\n { resolve: (value: MemoDecryptResult[]) => void; reject: (error: Error) => void; chunk: MemoDecryptRequest[] }\n >();\n private messageId = 0;\n private readonly config: MemoWorkerConfig;\n\n constructor(config?: MemoWorkerConfig) {\n this.config = config ?? {};\n }\n\n private get concurrency() {\n return this.config.concurrency ?? DEFAULT_CONCURRENCY;\n }\n\n private ensureWorker() {\n if (this.worker || typeof Worker === 'undefined') return;\n const workerUrl = this.config.workerUrl;\n if (!workerUrl) {\n throw new SdkError('CONFIG', 'Memo worker requires workerUrl configuration');\n }\n this.worker = new Worker(workerUrl, { type: this.config.type ?? 'module' });\n this.worker.onmessage = (event: MessageEvent<WorkerResponsePayload>) => {\n const payload = event.data;\n const pending = this.pending.get(payload.id);\n if (!pending) return;\n this.pending.delete(payload.id);\n if (payload.type === 'success' && payload.data) {\n const normalized = payload.data.map((entry) => this.normalizeWorkerResult(entry, pending.chunk));\n pending.resolve(normalized);\n } else {\n pending.reject(new Error(payload.error || 'Memo worker error'));\n }\n };\n this.worker.onerror = (error) => {\n this.pending.forEach(({ reject }) => reject(error instanceof Error ? error : new Error(String(error))));\n this.pending.clear();\n this.worker?.terminate();\n this.worker = null;\n };\n }\n\n private normalizeWorkerResult(entry: WorkerMessageResult, chunk: MemoDecryptRequest[]): MemoDecryptResult {\n const source = chunk[entry.index];\n return {\n memo: source?.memo ?? ('0x' as `0x${string}`),\n record: entry.record ?? null,\n metadata: source?.metadata,\n error: entry.error ? { message: entry.error } : undefined,\n };\n }\n\n private dispatch(secretKey: bigint, chunk: MemoDecryptRequest[]): Promise<MemoDecryptResult[]> {\n this.ensureWorker();\n const worker = this.worker;\n if (!worker) {\n return Promise.reject(new SdkError('CRYPTO', 'Memo worker not available'));\n }\n const id = `memo_${++this.messageId}`;\n const payload = {\n id,\n type: 'DECRYPT_MEMOS',\n data: {\n secretKey: secretKey.toString(),\n memos: chunk.map((entry, index) => ({ index, memo: entry.memo })),\n },\n };\n return new Promise<MemoDecryptResult[]>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pending.delete(id);\n reject(new SdkError('CRYPTO', 'Memo worker timeout'));\n }, 120000);\n this.pending.set(id, {\n chunk,\n resolve: (result) => {\n clearTimeout(timeout);\n const merged = result.map((entry, index) => {\n const source = chunk[index];\n const errorMessage = entry.error?.message;\n return {\n memo: source.memo,\n record: entry.record ?? null,\n metadata: source.metadata,\n error: errorMessage ? { message: errorMessage } : undefined,\n };\n });\n resolve(merged);\n },\n reject: (error) => {\n clearTimeout(timeout);\n reject(error);\n },\n });\n worker.postMessage(payload);\n });\n }\n\n private async decryptWithKey(secretKey: bigint, requests: MemoDecryptRequest[]): Promise<MemoDecryptResult[]> {\n if (!this.config.workerUrl || typeof Worker === 'undefined') {\n return requests.map((req) => this.decryptSingle(secretKey, req));\n }\n const chunkSize = Math.max(1, Math.ceil(requests.length / this.concurrency));\n const batches: Promise<MemoDecryptResult[]>[] = [];\n for (let i = 0; i < requests.length; i += chunkSize) {\n const chunk = requests.slice(i, i + chunkSize);\n batches.push(this.dispatch(secretKey, chunk));\n }\n const responses = await Promise.all(batches);\n return responses.flat();\n }\n\n async decryptBatch(requests: MemoDecryptRequest[]): Promise<MemoDecryptResult[]> {\n if (!requests.length) return [];\n const groups = new Map<string, { secret: bigint; items: MemoDecryptRequest[] }>();\n requests.forEach((request) => {\n const key = request.secretKey.toString();\n if (!groups.has(key)) {\n groups.set(key, { secret: request.secretKey, items: [] });\n }\n groups.get(key)!.items.push(request);\n });\n const tasks = Array.from(groups.values()).map(({ secret, items }) => this.decryptWithKey(secret, items));\n const results = await Promise.all(tasks);\n return results.flat();\n }\n\n private decryptSingle(secretKey: bigint, request: MemoDecryptRequest): MemoDecryptResult {\n try {\n const record = MemoKit.decryptMemo(secretKey, request.memo);\n return { memo: request.memo, record, metadata: request.metadata };\n } catch (error) {\n return {\n memo: request.memo,\n record: null,\n metadata: request.metadata,\n error: { message: error instanceof Error ? error.message : String(error) },\n };\n }\n }\n\n terminate() {\n this.worker?.terminate();\n this.worker = null;\n this.pending.clear();\n }\n}\n","import type { AssetsApi, ChainConfigInput, Hex, ListUtxosQuery, ListUtxosResult, SdkEvent, StorageAdapter, UtxoRecord, WalletSessionInput } from '../types';\nimport { SdkError } from '../errors';\nimport { KeyManager } from '../crypto/keyManager';\nimport { CryptoToolkit } from '../crypto/cryptoToolkit';\nimport { MemoKit } from '../memo/memoKit';\n\ntype AssetLookup = {\n assetId: string;\n viewerPk: [bigint, bigint];\n freezerPk: [bigint, bigint];\n};\n\nconst normalizeSeed = (seed: string | Uint8Array): string => {\n if (typeof seed === 'string') return seed;\n return Array.from(seed, (b) => b.toString(16).padStart(2, '0')).join('');\n};\n\nconst toBigintPoint = (input: [string, string]): [bigint, bigint] => [BigInt(input[0]), BigInt(input[1])];\n\nexport class WalletService {\n private opened = false;\n private secretKey: bigint | null = null;\n private address: Hex | null = null;\n private assetByChainPoolId = new Map<string, AssetLookup>();\n\n constructor(\n private readonly assets: AssetsApi,\n private readonly storage: StorageAdapter,\n private readonly emit: (evt: SdkEvent) => void,\n ) {}\n\n async open(session: WalletSessionInput) {\n const seed = normalizeSeed(session.seed);\n const nonce = session.accountNonce != null ? String(session.accountNonce) : undefined;\n const keyPair = KeyManager.deriveKeyPair(seed, nonce);\n this.secretKey = keyPair.user_sk.address_sk;\n this.address = KeyManager.userPkToAddress(keyPair.user_pk);\n this.assetByChainPoolId = this.buildAssetLookup(this.assets.getChains());\n await this.storage.init?.({ walletId: this.address });\n this.opened = true;\n }\n\n async close() {\n this.opened = false;\n // JS BigInt is immutable — cannot be securely zeroed in-place.\n // Setting to null removes the reference; actual memory clearing depends on GC.\n this.secretKey = null;\n this.address = null;\n await this.storage.close?.();\n }\n\n getViewingAddress(): Hex {\n if (!this.opened || !this.address) {\n throw new SdkError('CONFIG', 'Wallet is not opened');\n }\n return this.address;\n }\n\n private getSecretKey(): bigint {\n if (!this.opened || this.secretKey == null) {\n throw new SdkError('CONFIG', 'Wallet is not opened');\n }\n return this.secretKey;\n }\n\n async getUtxos(query?: ListUtxosQuery): Promise<ListUtxosResult> {\n this.getViewingAddress();\n return this.storage.listUtxos(query);\n }\n\n async getBalance(query?: { chainId?: number; assetId?: string }): Promise<bigint> {\n const utxosResult = await this.storage.listUtxos({\n chainId: query?.chainId,\n assetId: query?.assetId,\n includeSpent: false,\n includeFrozen: false,\n });\n return utxosResult.rows.reduce((sum, utxo) => sum + utxo.amount, 0n);\n }\n\n async markSpent(input: { chainId: number; nullifiers: Hex[] }) {\n this.getViewingAddress();\n const updated = await this.storage.markSpent({ chainId: input.chainId, nullifiers: input.nullifiers });\n if (updated > 0) {\n this.emit({ type: 'wallet:utxo:update', payload: { chainId: input.chainId, added: 0, spent: updated, frozen: 0 } });\n }\n }\n\n async applyMemos(\n chainId: number,\n memos: Array<{\n memo: Hex;\n commitment: Hex;\n cid: number | null;\n created_at?: number | null;\n is_transparent?: boolean;\n asset_id?: Hex | null;\n amount?: Hex | null;\n partial_hash?: Hex | null;\n }>,\n ): Promise<number> {\n this.getViewingAddress();\n const secretKey = this.getSecretKey();\n const addedByKey = new Map<string, UtxoRecord>();\n let refreshedAssets = false;\n for (const entry of memos) {\n if (typeof entry.cid !== 'number' || !Number.isInteger(entry.cid) || entry.cid < 0) continue;\n const ro = MemoKit.decodeMemoForOwner({\n secretKey,\n memo: entry.memo,\n expectedAddress: this.address,\n isTransparent: entry.is_transparent,\n });\n if (!ro) continue;\n if (entry.amount && entry.asset_id && entry.partial_hash) {\n try {\n ro.asset_id = BigInt(entry.asset_id);\n ro.asset_amount = BigInt(entry.amount);\n } catch {\n // ignore overrides if payload is malformed\n }\n }\n const localCommitment = CryptoToolkit.commitment(ro, 'hex');\n if (localCommitment.toLowerCase() !== entry.commitment.toLowerCase()) continue;\n const poolKey = ro.asset_id.toString();\n const lookupKey = `${chainId}:${poolKey}`;\n let asset = this.assetByChainPoolId.get(lookupKey);\n if (!asset && !refreshedAssets) {\n refreshedAssets = true;\n this.assetByChainPoolId = this.buildAssetLookup(this.assets.getChains());\n asset = this.assetByChainPoolId.get(lookupKey);\n }\n const nullifier = CryptoToolkit.nullifier(secretKey, localCommitment, asset?.freezerPk);\n const mkIndex = entry.cid;\n const utxo: UtxoRecord = {\n chainId,\n assetId: asset?.assetId ?? poolKey,\n amount: ro.asset_amount,\n commitment: localCommitment,\n nullifier,\n mkIndex,\n isFrozen: ro.is_frozen,\n isSpent: false,\n memo: entry.memo,\n createdAt: entry.created_at ?? undefined,\n };\n const utxoKey = `${chainId}:${localCommitment.toLowerCase()}`;\n if (!addedByKey.has(utxoKey)) addedByKey.set(utxoKey, utxo);\n }\n const added = Array.from(addedByKey.values());\n if (!added.length) return 0;\n await this.storage.upsertUtxos(added);\n const frozen = added.filter((u) => u.isFrozen).length;\n this.emit({ type: 'wallet:utxo:update', payload: { chainId, added: added.length, spent: 0, frozen } });\n return added.length;\n }\n\n private buildAssetLookup(chains: ChainConfigInput[]) {\n const map = new Map<string, AssetLookup>();\n for (const chain of chains) {\n for (const token of chain.tokens ?? []) {\n const viewerPk = toBigintPoint(token.viewerPk);\n const freezerPk = toBigintPoint(token.freezerPk);\n const poolId = CryptoToolkit.poolId(token.wrappedErc20, viewerPk, freezerPk);\n map.set(`${chain.chainId}:${poolId.toString()}`, { assetId: token.id, viewerPk, freezerPk });\n }\n }\n return map;\n }\n}\n","export const truncate = (s: string, max = 2048) => (s.length > max ? `${s.slice(0, max)}…` : s);\n\nexport const errorToDebug = (error: unknown) => {\n if (error instanceof Error) {\n return { name: error.name, message: error.message, cause: (error as any).cause };\n }\n return { message: String(error) };\n};\n\nexport const nonOkResponseDetail = async (response: Response, url: string) => {\n const statusText = (response as any)?.statusText;\n const contentType = response.headers.get('content-type') ?? undefined;\n let bodyText: string | undefined;\n let bodyJson: unknown | undefined;\n try {\n const rawText = await response.text();\n bodyText = truncate(rawText);\n const wasTruncated = bodyText.length !== rawText.length;\n if (!wasTruncated && contentType?.includes('application/json')) {\n try {\n bodyJson = JSON.parse(rawText);\n } catch {\n bodyJson = undefined;\n }\n }\n } catch {\n bodyText = undefined;\n }\n return { status: response.status, statusText, url, contentType, bodyText, bodyJson };\n};\n","export const joinUrl = (base: string, path: string) => `${base.replace(/\\/$/, '')}${path}`;\n","import type { Hex, SdkEvent } from '../types';\nimport { SdkError } from '../errors';\nimport { isHexStrict } from '../utils/hex';\nimport { errorToDebug, nonOkResponseDetail } from '../utils/httpDebug';\n\nexport interface EntryMemo {\n commitment: Hex;\n memo: Hex;\n cid: number | null;\n is_transparent?: boolean;\n asset_id?: Hex | null;\n amount?: Hex | null;\n partial_hash?: Hex | null;\n txhash?: Hex | null;\n created_at?: number | null;\n}\n\nexport interface EntryNullifier {\n nullifier: Hex;\n created_at?: number | null;\n}\n\ninterface EntryListResponse<T> {\n code?: number;\n message?: string;\n data?: { data?: T[]; total?: number } | { data?: T[]; total?: number; ready?: boolean };\n}\n\nimport { joinUrl } from '../utils/url';\n\nconst withQuery = (url: string, params: Record<string, string | number | undefined>) => {\n const search = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v == null) continue;\n search.set(k, String(v));\n }\n const qs = search.toString();\n return qs ? `${url}?${qs}` : url;\n};\n\nconst isHex = (value: unknown): value is Hex => isHexStrict(value);\n\nconst normalizeOptionalHex = (value: unknown): Hex | null | undefined => {\n if (value == null) return undefined;\n if (isHex(value)) return value;\n return null;\n};\n\nconst normalizeTotal = (value: unknown): number => {\n const n = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : Number.NaN;\n if (!Number.isFinite(n) || n < 0) return 0;\n return Math.floor(n);\n};\n\nconst normalizeMemoEntry = (raw: any): EntryMemo => {\n if (!raw || typeof raw !== 'object') {\n throw new SdkError('SYNC', 'Invalid entry memo item', { item: raw });\n }\n if (!isHex(raw.commitment)) throw new SdkError('SYNC', 'Invalid entry memo commitment', { commitment: raw.commitment });\n if (!isHex(raw.memo)) throw new SdkError('SYNC', 'Invalid entry memo payload', { memo: raw.memo });\n const cid = raw.cid;\n if (cid != null && !(typeof cid === 'number' && Number.isInteger(cid) && cid >= 0)) {\n throw new SdkError('SYNC', 'Invalid entry memo cid', { cid });\n }\n const createdAt = raw.created_at;\n if (createdAt != null && !(typeof createdAt === 'number' && Number.isInteger(createdAt) && createdAt >= 0)) {\n throw new SdkError('SYNC', 'Invalid entry memo created_at', { created_at: createdAt });\n }\n const isTransparent = raw.is_transparent;\n if (isTransparent != null && typeof isTransparent !== 'boolean') {\n throw new SdkError('SYNC', 'Invalid entry memo is_transparent', { is_transparent: isTransparent });\n }\n const assetId = normalizeOptionalHex(raw.asset_id);\n const amount = normalizeOptionalHex(raw.amount);\n const partialHash = normalizeOptionalHex(raw.partial_hash);\n const txHash = normalizeOptionalHex(raw.txhash);\n return {\n commitment: raw.commitment,\n memo: raw.memo,\n cid: cid ?? null,\n is_transparent: isTransparent ?? undefined,\n asset_id: assetId ?? undefined,\n amount: amount ?? undefined,\n partial_hash: partialHash ?? undefined,\n txhash: txHash ?? undefined,\n created_at: createdAt ?? null,\n };\n};\n\nconst normalizeNullifierEntry = (raw: any): EntryNullifier => {\n if (!raw || typeof raw !== 'object') {\n throw new SdkError('SYNC', 'Invalid entry nullifier item', { item: raw });\n }\n if (!isHex(raw.nullifier)) throw new SdkError('SYNC', 'Invalid entry nullifier', { nullifier: raw.nullifier });\n const createdAt = raw.created_at;\n if (createdAt != null && !(typeof createdAt === 'number' && Number.isInteger(createdAt) && createdAt >= 0)) {\n throw new SdkError('SYNC', 'Invalid entry nullifier created_at', { created_at: createdAt });\n }\n return { nullifier: raw.nullifier, created_at: createdAt ?? null };\n};\n\nconst unwrapList = <T>(payload: EntryListResponse<T>, detail: Record<string, unknown>) => {\n if (typeof payload?.code === 'number' && payload.code !== 0) {\n throw new SdkError('SYNC', payload.message || 'EntryService request failed', payload);\n }\n const itemsRaw = (payload as any)?.data?.data;\n const totalRaw = (payload as any)?.data?.total;\n if (itemsRaw != null && !Array.isArray(itemsRaw)) {\n throw new SdkError('SYNC', 'Invalid entry response: data.data must be an array', { ...detail, data: (payload as any)?.data });\n }\n return { items: (itemsRaw ?? []) as T[], total: normalizeTotal(totalRaw) };\n};\n\nconst unwrapListWithReady = <T>(payload: EntryListResponse<T>, detail: Record<string, unknown>) => {\n const base = unwrapList(payload, detail);\n const ready = (payload as any)?.data?.ready;\n return { ...base, ready: ready == null ? true : Boolean(ready) };\n};\n\ntype DebugEmitter = (event: Extract<SdkEvent, { type: 'debug' }>) => void;\n\nexport class EntryClient {\n constructor(\n private readonly baseUrl: string,\n private readonly debugEmit?: DebugEmitter,\n ) {}\n\n async listMemos(input: { chainId: number; address: string; offset: number; limit: number; signal?: AbortSignal }) {\n const url = withQuery(joinUrl(this.baseUrl, '/api/v1/viewing/memos/list'), {\n offset: input.offset,\n limit: input.limit,\n chain_id: input.chainId,\n address: input.address,\n order: 'asc',\n });\n this.debugEmit?.({\n type: 'debug',\n payload: { scope: 'http:entry', message: 'request', detail: { method: 'GET', url } },\n });\n let response: Response;\n try {\n response = await fetch(url, { signal: input.signal });\n } catch (error) {\n this.debugEmit?.({ type: 'debug', payload: { scope: 'http:entry', message: 'network_error', detail: { url, error: errorToDebug(error) } } });\n throw error;\n }\n this.debugEmit?.({\n type: 'debug',\n payload: { scope: 'http:entry', message: 'response', detail: { url, status: response.status, ok: response.ok } },\n });\n if (!response.ok) {\n throw new SdkError('SYNC', 'EntryService memos request failed', await nonOkResponseDetail(response, url));\n }\n const payload = (await response.json()) as EntryListResponse<EntryMemo>;\n const { items, total } = unwrapList(payload, { url });\n return { items: items.map(normalizeMemoEntry), total };\n }\n\n async listNullifiers(input: { chainId: number; address: string; offset: number; limit: number; signal?: AbortSignal }) {\n const url = withQuery(joinUrl(this.baseUrl, '/api/v1/viewing/nullifier/list'), {\n offset: input.offset,\n limit: input.limit,\n chain_id: input.chainId,\n address: input.address,\n order: 'asc',\n });\n this.debugEmit?.({\n type: 'debug',\n payload: { scope: 'http:entry', message: 'request', detail: { method: 'GET', url } },\n });\n let response: Response;\n try {\n response = await fetch(url, { signal: input.signal });\n } catch (error) {\n this.debugEmit?.({ type: 'debug', payload: { scope: 'http:entry', message: 'network_error', detail: { url, error: errorToDebug(error) } } });\n throw error;\n }\n this.debugEmit?.({\n type: 'debug',\n payload: { scope: 'http:entry', message: 'response', detail: { url, status: response.status, ok: response.ok } },\n });\n if (!response.ok) {\n throw new SdkError('SYNC', 'EntryService nullifier request failed', await nonOkResponseDetail(response, url));\n }\n const payload = (await response.json()) as EntryListResponse<EntryNullifier>;\n const { items, total } = unwrapList(payload, { url });\n return { items: items.map(normalizeNullifierEntry), total };\n }\n\n async listNullifiersByBlock(input: { chainId: number; address: string; offset: number; limit: number; signal?: AbortSignal }) {\n const url = withQuery(joinUrl(this.baseUrl, '/api/v1/viewing/nullifier/list_by_block'), {\n offset: input.offset,\n limit: input.limit,\n chain_id: input.chainId,\n address: input.address,\n order: 'asc',\n });\n this.debugEmit?.({\n type: 'debug',\n payload: { scope: 'http:entry', message: 'request', detail: { method: 'GET', url } },\n });\n let response: Response;\n try {\n response = await fetch(url, { signal: input.signal });\n } catch (error) {\n this.debugEmit?.({ type: 'debug', payload: { scope: 'http:entry', message: 'network_error', detail: { url, error: errorToDebug(error) } } });\n throw error;\n }\n this.debugEmit?.({\n type: 'debug',\n payload: { scope: 'http:entry', message: 'response', detail: { url, status: response.status, ok: response.ok } },\n });\n if (!response.ok) {\n throw new SdkError('SYNC', 'EntryService nullifier list_by_block request failed', await nonOkResponseDetail(response, url));\n }\n const payload = (await response.json()) as EntryListResponse<EntryNullifier>;\n const { items, total, ready } = unwrapListWithReady(payload, { url });\n return { items: items.map(normalizeNullifierEntry), total, ready };\n }\n}\n","export const signalTimeout = (ms: number): AbortSignal => {\n const anyAbortSignal = AbortSignal as any;\n if (typeof anyAbortSignal?.timeout === 'function') return anyAbortSignal.timeout(ms) as AbortSignal;\n const controller = new AbortController();\n const t = setTimeout(() => controller.abort(new Error('timeout')), ms);\n controller.signal.addEventListener('abort', () => clearTimeout(t), { once: true });\n return controller.signal;\n};\n\nexport const signalAny = (signals: Array<AbortSignal | undefined>): AbortSignal | undefined => {\n const list = signals.filter(Boolean) as AbortSignal[];\n if (!list.length) return undefined;\n const anyAbortSignal = AbortSignal as any;\n if (typeof anyAbortSignal?.any === 'function') return anyAbortSignal.any(list) as AbortSignal;\n const controller = new AbortController();\n const onAbort = (s: AbortSignal) => controller.abort((s as any).reason);\n for (const s of list) {\n if (s.aborted) {\n onAbort(s);\n break;\n }\n s.addEventListener('abort', () => onAbort(s), { once: true });\n }\n return controller.signal;\n};\n","import type { AssetsApi, SdkEvent, StorageAdapter, SyncApi, SyncChainStatus, SyncCursor } from '../types';\nimport { SdkError } from '../errors';\nimport { EntryClient } from './entryClient';\nimport { WalletService } from '../wallet/walletService';\nimport type { MerkleEngine } from '../merkle/merkleEngine';\n\nconst DEFAULT_PAGE_SIZE = 512;\nconst DEFAULT_POLL_MS = 15_000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 20_000;\nconst MERKLE_TEMP_ARRAY_SIZE_DEFAULT = 32;\n\nexport type SyncEngineOptions = {\n pageSize?: number;\n pollMs?: number;\n requestTimeoutMs?: number;\n retry?: { attempts?: number; baseDelayMs?: number; maxDelayMs?: number };\n};\n\ntype NormalizedSyncEngineOptions = Omit<Required<SyncEngineOptions>, 'retry'> & {\n retry: { attempts: number; baseDelayMs: number; maxDelayMs: number };\n};\n\nconst toBoundedInt = (value: unknown, fallback: number, bounds: { min: number; max?: number }): number => {\n if (typeof value !== 'number' || !Number.isFinite(value)) return fallback;\n const floored = Math.floor(value);\n if (!Number.isFinite(floored)) return fallback;\n const max = bounds.max ?? Number.POSITIVE_INFINITY;\n return Math.min(max, Math.max(bounds.min, floored));\n};\n\nconst normalizeSyncEngineOptions = (options?: SyncEngineOptions): NormalizedSyncEngineOptions => {\n const merged = {\n pageSize: DEFAULT_PAGE_SIZE,\n pollMs: DEFAULT_POLL_MS,\n requestTimeoutMs: DEFAULT_REQUEST_TIMEOUT_MS,\n retry: {},\n ...(options ?? {}),\n };\n const retryAttempts = merged.retry?.attempts;\n const retryBaseDelayMs = merged.retry?.baseDelayMs;\n const retryMaxDelayMs = merged.retry?.maxDelayMs;\n return {\n pageSize: toBoundedInt(merged.pageSize, DEFAULT_PAGE_SIZE, { min: 1 }),\n pollMs: toBoundedInt(merged.pollMs, DEFAULT_POLL_MS, { min: 250 }),\n requestTimeoutMs: toBoundedInt(merged.requestTimeoutMs, DEFAULT_REQUEST_TIMEOUT_MS, { min: 1000 }),\n retry: {\n attempts: retryAttempts == null ? 1 : toBoundedInt(retryAttempts, 1, { min: 1 }),\n baseDelayMs: retryBaseDelayMs == null ? 250 : toBoundedInt(retryBaseDelayMs, 250, { min: 0 }),\n maxDelayMs: retryMaxDelayMs == null ? 5_000 : toBoundedInt(retryMaxDelayMs, 5_000, { min: 0 }),\n },\n };\n};\n\nconst defaultCursor = (): SyncCursor => ({ memo: 0, nullifier: 0, merkle: 0 });\n\n// Merkle cursor represents the current merkle root index (not leaf/cid).\n// The on-chain accumulator advances the root index in fixed batches (default 32 leaves).\nconst currentMerkleRootIndex = (totalElements: number, tempArraySize = MERKLE_TEMP_ARRAY_SIZE_DEFAULT) => {\n if (!Number.isFinite(totalElements) || totalElements <= 0) return 0;\n if (totalElements <= tempArraySize) return 0;\n return Math.floor((totalElements - 1) / tempArraySize);\n};\n\nconst sanitizeContiguousMemos = <T extends { cid: number | null }>(memos: T[], expectedCid: number): T[] => {\n const sorted = memos.filter((m): m is T & { cid: number } => typeof m.cid === 'number').sort((a, b) => a.cid - b.cid);\n const contiguous: T[] = [];\n let next = expectedCid;\n for (const memo of sorted) {\n if (memo.cid < next) continue;\n if (memo.cid > next) break;\n contiguous.push(memo as T);\n next++;\n }\n return contiguous;\n};\n\nconst minCid = (memos: Array<{ cid: number | null }>): number | null => {\n let min: number | null = null;\n for (const memo of memos) {\n const cid = memo.cid;\n if (typeof cid !== 'number' || !Number.isFinite(cid)) continue;\n if (min == null || cid < min) min = cid;\n }\n return min;\n};\n\nconst sampleCids = (memos: Array<{ cid: number | null }>, limit = 10): number[] => {\n const out = memos\n .map((m) => m.cid)\n .filter((cid): cid is number => typeof cid === 'number' && Number.isFinite(cid))\n .sort((a, b) => a - b);\n return out.slice(0, limit);\n};\n\nimport { signalTimeout, signalAny } from '../utils/signal';\n\nconst findDuplicate = (values: string[]): string | null => {\n const seen = new Set<string>();\n for (const v of values) {\n const key = v.toLowerCase();\n if (seen.has(key)) return v;\n seen.add(key);\n }\n return null;\n};\n\nconst stringifyError = (error: unknown): string => {\n if (error instanceof Error) return error.message;\n return String(error);\n};\n\nconst formatSyncErrorMessage = (error: unknown): string => {\n if (error instanceof SdkError) {\n const base = error.message;\n const detail = error.detail as any;\n const status = detail?.status;\n const url = detail?.url;\n if (typeof status === 'number' && typeof url === 'string') {\n const statusText = typeof detail?.statusText === 'string' && detail.statusText.length ? ` ${detail.statusText}` : '';\n const bodyMessage =\n typeof detail?.bodyJson?.message === 'string'\n ? detail.bodyJson.message\n : typeof detail?.bodyJson?.error === 'string'\n ? detail.bodyJson.error\n : typeof detail?.bodyText === 'string' && detail.bodyText.length\n ? detail.bodyText\n : undefined;\n const extra = bodyMessage ? `: ${String(bodyMessage).slice(0, 240)}` : '';\n return `${base} (HTTP ${status}${statusText}) ${url}${extra}`;\n }\n if (typeof url === 'string') {\n const causeMsg = error.cause && typeof (error.cause as any)?.message === 'string' ? `: ${(error.cause as any).message}` : '';\n return `${base} ${url}${causeMsg}`;\n }\n return base;\n }\n return stringifyError(error);\n};\n\nexport class SyncEngine implements SyncApi {\n private readonly status: Record<number, SyncChainStatus> = {};\n private timer: ReturnType<typeof setInterval> | null = null;\n private abortController: AbortController | null = null;\n private readonly runningChains = new Set<number>();\n private readonly options: NormalizedSyncEngineOptions;\n\n constructor(\n private readonly assets: AssetsApi,\n private readonly storage: StorageAdapter,\n private readonly wallet: WalletService,\n private readonly emit: (evt: SdkEvent) => void,\n private readonly merkle?: Pick<MerkleEngine, 'ingestEntryMemos'>,\n options?: SyncEngineOptions,\n ) {\n this.options = normalizeSyncEngineOptions(options);\n }\n\n getStatus() {\n return { ...this.status };\n }\n\n async start(options?: { chainIds?: number[]; pollMs?: number }) {\n if (this.timer) return;\n this.abortController = new AbortController();\n const signal = this.abortController.signal;\n await this.syncOnce({ chainIds: options?.chainIds, signal, continueOnError: true });\n const pollMs = options?.pollMs != null ? toBoundedInt(options.pollMs, this.options.pollMs, { min: 250 }) : this.options.pollMs;\n this.timer = setInterval(() => {\n if (this.runningChains.size) return;\n void this.syncOnce({ chainIds: options?.chainIds, signal, continueOnError: true }).catch(() => undefined);\n }, pollMs);\n }\n\n stop() {\n this.abortController?.abort();\n this.abortController = null;\n if (this.timer) clearInterval(this.timer);\n this.timer = null;\n }\n\n async syncOnce(options?: { chainIds?: number[]; resources?: Array<'memo' | 'nullifier' | 'merkle'>; signal?: AbortSignal; requestTimeoutMs?: number; pageSize?: number; continueOnError?: boolean }) {\n const chainIds = options?.chainIds ?? this.assets.getChains().map((c) => c.chainId);\n const requestTimeoutMs = toBoundedInt(options?.requestTimeoutMs, this.options.requestTimeoutMs, { min: 1000 });\n const pageSize = toBoundedInt(options?.pageSize, this.options.pageSize, { min: 1 });\n const tasks = chainIds.map((chainId) => {\n if (options?.signal?.aborted) {\n return Promise.reject(options.signal.reason ?? new SdkError('SYNC', 'Aborted'));\n }\n if (this.runningChains.has(chainId)) {\n this.emit({\n type: 'error',\n payload: {\n code: 'SYNC',\n message: 'Sync skipped: chain already syncing',\n detail: { chainId, skipped: true },\n },\n });\n return Promise.resolve();\n }\n this.runningChains.add(chainId);\n return this.syncChain(chainId, options?.resources, {\n signal: options?.signal,\n requestTimeoutMs,\n pageSize,\n }).finally(() => {\n this.runningChains.delete(chainId);\n });\n });\n\n if (options?.continueOnError) {\n await Promise.all(tasks.map((t) => t.catch(() => undefined)));\n return;\n }\n await Promise.all(tasks);\n }\n\n private initChainStatus(chainId: number): SyncChainStatus {\n return (\n this.status[chainId] ??\n (this.status[chainId] = {\n memo: { status: 'idle', downloaded: 0 },\n nullifier: { status: 'idle', downloaded: 0 },\n merkle: { status: 'idle', cursor: 0 },\n })\n );\n }\n\n private async syncChain(chainId: number, resources?: Array<'memo' | 'nullifier' | 'merkle'>, options?: { signal?: AbortSignal; requestTimeoutMs: number; pageSize: number }) {\n const chain = this.assets.getChain(chainId);\n const cursor = (await this.storage.getSyncCursor(chainId)) ?? defaultCursor();\n this.emit({\n type: 'debug',\n payload: {\n scope: 'sync',\n message: 'syncChain:init',\n detail: {\n chainId,\n resources: resources ?? ['memo', 'nullifier', 'merkle'],\n cursor,\n pageSize: options?.pageSize,\n requestTimeoutMs: options?.requestTimeoutMs,\n },\n },\n });\n\n const enabled = new Set(resources ?? ['memo', 'nullifier', 'merkle']);\n const status = this.initChainStatus(chainId);\n this.emit({ type: 'sync:start', payload: { chainId, source: 'entry' } });\n let hadError = false;\n try {\n // `cursor.merkle` tracks the merkle root index cursor, derived from memo sync (total elements).\n // Proof fetching is on-demand during transfer/withdraw and is not part of sync.\n if (enabled.has('merkle') && !enabled.has('memo')) {\n hadError = true;\n status.merkle = {\n status: 'error',\n cursor: cursor.merkle,\n errorMessage: 'Merkle sync is derived from memo sync; include resource \"memo\"',\n };\n this.emit({\n type: 'error',\n payload: {\n code: 'SYNC',\n message: status.merkle.errorMessage,\n detail: { chainId, resource: 'merkle', reason: 'requires_memo' },\n },\n });\n }\n\n const needsEntry = enabled.has('memo') || enabled.has('nullifier');\n const client = needsEntry ? (chain.entryUrl ? new EntryClient(chain.entryUrl, (e) => this.emit(e)) : null) : null;\n let viewingAddress: string | null = null;\n const contractAddress = (chain.ocashContractAddress ?? chain.contract) as string | undefined;\n if (needsEntry) {\n try {\n viewingAddress = this.wallet.getViewingAddress();\n this.emit({\n type: 'debug',\n payload: { scope: 'sync', message: 'wallet:viewingAddress', detail: { chainId, viewingAddress } },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (enabled.has('memo')) status.memo = { status: 'error', downloaded: cursor.memo, errorMessage: message };\n if (enabled.has('nullifier')) status.nullifier = { status: 'error', downloaded: cursor.nullifier, errorMessage: message };\n this.emit({\n type: 'error',\n payload: { code: 'CONFIG', message, detail: { chainId, resource: 'entry', reason: 'wallet_not_open' }, cause: error },\n });\n hadError = true;\n return;\n }\n }\n if (needsEntry && !client) {\n const message = `Chain ${chainId} missing entryUrl`;\n if (enabled.has('memo')) status.memo = { status: 'error', downloaded: cursor.memo, errorMessage: message };\n if (enabled.has('nullifier')) status.nullifier = { status: 'error', downloaded: cursor.nullifier, errorMessage: message };\n this.emit({\n type: 'error',\n payload: { code: 'CONFIG', message, detail: { chainId, resource: 'entry', reason: 'missing_entryUrl' } },\n });\n hadError = true;\n return;\n }\n if (needsEntry && !contractAddress) {\n const message = `Chain ${chainId} missing ocashContractAddress`;\n if (enabled.has('memo')) status.memo = { status: 'error', downloaded: cursor.memo, errorMessage: message };\n if (enabled.has('nullifier')) status.nullifier = { status: 'error', downloaded: cursor.nullifier, errorMessage: message };\n this.emit({\n type: 'error',\n payload: { code: 'CONFIG', message, detail: { chainId, resource: 'entry', reason: 'missing_ocashContractAddress' } },\n });\n hadError = true;\n return;\n }\n if (needsEntry) {\n this.emit({\n type: 'debug',\n payload: { scope: 'sync', message: 'entry:contractAddress', detail: { chainId, contractAddress } },\n });\n }\n\n if (enabled.has('memo')) {\n try {\n status.memo = { status: 'syncing', downloaded: cursor.memo };\n if (enabled.has('merkle')) status.merkle = { status: 'syncing', cursor: cursor.merkle };\n\n // Derive merkle root-index cursor from the memo cursor (total elements).\n // This keeps cursor/status consistent even when there are no new memos in the current run.\n const derivedMerkleCursor = currentMerkleRootIndex(cursor.memo);\n if (cursor.merkle !== derivedMerkleCursor) {\n cursor.merkle = derivedMerkleCursor;\n await this.storage.setSyncCursor(chainId, cursor);\n }\n if (enabled.has('merkle')) status.merkle.cursor = cursor.merkle;\n\n let offset = cursor.memo;\n while (true) {\n if (options?.signal?.aborted) throw options.signal.reason ?? new SdkError('SYNC', 'Aborted');\n const signal = signalAny([options?.signal, signalTimeout(options?.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS)]);\n const pageSize = options?.pageSize ?? DEFAULT_PAGE_SIZE;\n this.emit({ type: 'debug', payload: { scope: 'sync:memo', message: 'page:request', detail: { chainId, offset, limit: pageSize } } });\n const page = await this.withRetries(() => client!.listMemos({ chainId, address: contractAddress!, offset, limit: pageSize, signal }), { chainId, resource: 'memo', signal });\n status.memo.total = page.total;\n const contiguous = sanitizeContiguousMemos(page.items, offset);\n if (page.items.length > 0 && contiguous.length === 0) {\n throw new SdkError('SYNC', 'EntryService memos are not contiguous', {\n chainId,\n expectedCid: offset,\n firstCid: minCid(page.items),\n cids: sampleCids(page.items),\n returned: page.items.length,\n total: page.total,\n });\n }\n this.emit({ type: 'sync:progress', payload: { chainId, resource: 'memo', downloaded: offset, total: page.total } });\n if (!contiguous.length) break;\n if (this.storage.upsertEntryMemos) {\n try {\n await this.storage.upsertEntryMemos(\n contiguous\n .filter((m): m is typeof m & { cid: number } => typeof m.cid === 'number' && Number.isInteger(m.cid) && m.cid >= 0)\n .map((m) => ({\n chainId,\n cid: m.cid as number,\n commitment: m.commitment,\n memo: m.memo,\n isTransparent: m.is_transparent ?? undefined,\n assetId: m.asset_id ?? undefined,\n amount: m.amount ?? undefined,\n partialHash: m.partial_hash ?? undefined,\n txHash: m.txhash ?? undefined,\n createdAt: m.created_at ?? null,\n })),\n );\n } catch {\n // best-effort cache\n }\n }\n await this.merkle?.ingestEntryMemos?.(chainId, contiguous);\n const added = await this.wallet.applyMemos(chainId, contiguous);\n this.emit({\n type: 'debug',\n payload: { scope: 'sync:memo', message: 'page:applied', detail: { chainId, offset, returned: page.items.length, contiguous: contiguous.length, added } },\n });\n const lastCid = contiguous[contiguous.length - 1]!.cid as number;\n offset = lastCid + 1;\n cursor.memo = offset;\n // Update merkle root-index cursor from total elements.\n cursor.merkle = currentMerkleRootIndex(offset);\n await this.storage.setSyncCursor(chainId, cursor);\n status.memo.downloaded = offset;\n if (enabled.has('merkle')) status.merkle.cursor = cursor.merkle;\n if (contiguous.length < page.items.length) {\n throw new SdkError('SYNC', 'EntryService memos are not contiguous', {\n chainId,\n expectedCid: offset,\n firstCid: minCid(page.items),\n cids: sampleCids(page.items),\n contiguousApplied: contiguous.length,\n returned: page.items.length,\n total: page.total,\n });\n }\n if (contiguous.length < pageSize) break;\n }\n status.memo.status = 'synced';\n if (enabled.has('merkle')) status.merkle.status = 'synced';\n } catch (error) {\n hadError = true;\n status.memo = {\n status: 'error',\n downloaded: status.memo.downloaded ?? cursor.memo,\n errorMessage: formatSyncErrorMessage(error),\n };\n this.emit({ type: 'error', payload: { code: 'SYNC', message: status.memo.errorMessage, detail: { chainId, resource: 'memo' }, cause: error } });\n if (enabled.has('merkle')) {\n status.merkle = {\n status: 'error',\n cursor: status.merkle.cursor ?? cursor.merkle,\n errorMessage: status.memo.errorMessage,\n };\n this.emit({\n type: 'error',\n payload: { code: 'SYNC', message: status.merkle.errorMessage, detail: { chainId, resource: 'merkle', reason: 'memo_failed' }, cause: error },\n });\n }\n }\n }\n\n if (enabled.has('nullifier')) {\n try {\n status.nullifier = { status: 'syncing', downloaded: cursor.nullifier };\n let offset = cursor.nullifier;\n while (true) {\n if (options?.signal?.aborted) throw options.signal.reason ?? new SdkError('SYNC', 'Aborted');\n const signal = signalAny([options?.signal, signalTimeout(options?.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS)]);\n const pageSize = options?.pageSize ?? DEFAULT_PAGE_SIZE;\n this.emit({\n type: 'debug',\n payload: { scope: 'sync:nullifier', message: 'page:request', detail: { chainId, offset, limit: pageSize, endpoint: 'list_by_block' } },\n });\n const page = await this.withRetries(() => client!.listNullifiersByBlock({ chainId, address: contractAddress!, offset, limit: pageSize, signal }), {\n chainId,\n resource: 'nullifier',\n signal,\n });\n status.nullifier.total = page.total;\n this.emit({\n type: 'sync:progress',\n payload: { chainId, resource: 'nullifier', downloaded: offset, total: page.total },\n });\n if (!page.items.length) {\n if (page.total > offset) {\n if ((page as any).ready === false) break;\n throw new SdkError('SYNC', 'EntryService nullifiers returned empty page before reaching total', { chainId, offset, total: page.total, limit: pageSize });\n }\n break;\n }\n const duplicate = findDuplicate(page.items.map((n) => n.nullifier));\n if (duplicate) {\n throw new SdkError('SYNC', 'EntryService nullifiers contain duplicates', { chainId, offset, duplicate });\n }\n if (this.storage.upsertEntryNullifiers) {\n try {\n await this.storage.upsertEntryNullifiers(\n page.items.map((n, idx) => ({\n chainId,\n nid: offset + idx,\n nullifier: n.nullifier,\n createdAt: (n as any).created_at ?? null,\n })),\n );\n } catch {\n // best-effort cache\n }\n }\n await this.wallet.markSpent({ chainId, nullifiers: page.items.map((n) => n.nullifier) });\n this.emit({\n type: 'debug',\n payload: { scope: 'sync:nullifier', message: 'page:applied', detail: { chainId, offset, returned: page.items.length, total: page.total, ready: (page as any).ready } },\n });\n offset += page.items.length;\n cursor.nullifier = offset;\n await this.storage.setSyncCursor(chainId, cursor);\n status.nullifier.downloaded = offset;\n if (page.items.length < pageSize) break;\n }\n status.nullifier.status = 'synced';\n } catch (error) {\n hadError = true;\n status.nullifier = {\n status: 'error',\n downloaded: status.nullifier.downloaded ?? cursor.nullifier,\n errorMessage: formatSyncErrorMessage(error),\n };\n this.emit({\n type: 'error',\n payload: { code: 'SYNC', message: status.nullifier.errorMessage, detail: { chainId, resource: 'nullifier' }, cause: error },\n });\n }\n }\n } finally {\n this.emit({ type: 'sync:done', payload: { chainId, cursor } });\n }\n }\n\n private async withRetries<T>(fn: () => Promise<T>, meta: { chainId: number; resource: 'memo' | 'nullifier' | 'merkle'; signal?: AbortSignal }): Promise<T> {\n const attempts = this.options.retry.attempts;\n const baseDelayMs = this.options.retry.baseDelayMs;\n const maxDelayMs = this.options.retry.maxDelayMs;\n let lastError: unknown;\n for (let attempt = 1; attempt <= attempts; attempt++) {\n if (meta.signal?.aborted) throw (meta.signal as any).reason ?? new SdkError('SYNC', 'Aborted');\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n const retryable = this.shouldRetry(error);\n if (!retryable || attempt >= attempts) break;\n const delay = Math.min(maxDelayMs, Math.floor(baseDelayMs * Math.min(32, 2 ** (attempt - 1))));\n this.emit({\n type: 'error',\n payload: {\n code: 'SYNC',\n message: 'Sync request failed, retrying',\n detail: { chainId: meta.chainId, resource: meta.resource, attempt, delayMs: delay },\n cause: error,\n },\n });\n await new Promise<void>((resolve, reject) => {\n const t = setTimeout(resolve, delay);\n const onAbort = () => {\n clearTimeout(t);\n reject((meta.signal as any).reason ?? new SdkError('SYNC', 'Aborted'));\n };\n if (meta.signal) {\n if (meta.signal.aborted) return onAbort();\n meta.signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n }\n }\n throw lastError;\n }\n\n private shouldRetry(error: unknown): boolean {\n if (error instanceof SdkError) {\n const status = (error.detail as any)?.status;\n if (typeof status === 'number') {\n if (status === 429) return true;\n if (status >= 500) return true;\n return false;\n }\n // If there's no HTTP status, assume it's not a transient transport issue.\n return false;\n }\n return true;\n }\n}\n","import { maxUint256, toHex } from 'viem';\nimport type {\n AssetsApi,\n CommitmentData,\n PlannerApi,\n PlannerFeeSummary,\n PlannerMaxEstimateResult,\n TransferPlan,\n RelayerConfig,\n TokenMetadata,\n UtxoRecord,\n} from '../types';\nimport { SdkError } from '../errors';\nimport { KeyManager } from '../crypto/keyManager';\nimport { CryptoToolkit } from '../crypto/cryptoToolkit';\nimport type { WalletService } from '../wallet/walletService';\nimport type { ProofBridge } from '../types';\nimport { MemoKit } from '../memo/memoKit';\nimport { calcTransferProofBinding, calcWithdrawProofBinding } from '../utils/ocashBindings';\nimport { isHexStrict } from '../utils/hex';\nimport { fetchRelayerConfigFromRelayerUrl } from '../ledger/relayerConfig';\n\ntype PlanTransferInput = {\n action: 'transfer';\n chainId: number;\n assetId: string;\n amount: bigint;\n to: `0x${string}`;\n payIncludesFee?: boolean;\n relayerUrl?: string;\n autoMerge?: boolean;\n};\n\ntype PlanWithdrawInput = {\n action: 'withdraw';\n chainId: number;\n assetId: string;\n amount: bigint;\n recipient: `0x${string}`;\n gasDropValue?: bigint;\n payIncludesFee?: boolean;\n relayerUrl?: string;\n};\n\ntype PlanInput = PlanTransferInput | PlanWithdrawInput;\n\nconst requireHex = (value: unknown, name: string): `0x${string}` => {\n if (isHexStrict(value, { minBytes: 1 })) return value as `0x${string}`;\n throw new SdkError('CONFIG', `${name} must be a hex string starting with 0x`);\n};\n\nconst parsePlanInput = (input: Record<string, unknown>): PlanInput => {\n const action = input.action;\n if (action !== 'transfer' && action !== 'withdraw') {\n throw new SdkError('CONFIG', 'Planner.plan requires action=transfer|withdraw');\n }\n const chainId = input.chainId;\n if (typeof chainId !== 'number' || !Number.isFinite(chainId)) throw new SdkError('CONFIG', 'Planner.plan requires chainId');\n const assetId = input.assetId;\n if (typeof assetId !== 'string' || !assetId) throw new SdkError('CONFIG', 'Planner.plan requires assetId');\n const amount = input.amount;\n if (typeof amount !== 'bigint') throw new SdkError('CONFIG', 'Planner.plan requires amount as bigint');\n const payIncludesFee = input.payIncludesFee === null ? undefined : input.payIncludesFee;\n if (payIncludesFee != null && typeof payIncludesFee !== 'boolean') throw new SdkError('CONFIG', 'payIncludesFee must be boolean');\n const relayerUrl = input.relayerUrl;\n if (relayerUrl != null && (typeof relayerUrl !== 'string' || !relayerUrl.length)) {\n throw new SdkError('CONFIG', 'relayerUrl must be a non-empty string');\n }\n const autoMerge = input.autoMerge === null ? undefined : input.autoMerge;\n if (autoMerge != null && typeof autoMerge !== 'boolean') throw new SdkError('CONFIG', 'autoMerge must be boolean');\n\n if (action === 'transfer') {\n const to = requireHex(input.to, 'Planner.plan(transfer).to');\n return { action, chainId, assetId, amount, to, payIncludesFee, relayerUrl: relayerUrl ?? undefined, autoMerge };\n }\n\n const recipient = requireHex(input.recipient, 'Planner.plan(withdraw).recipient');\n const gasDropValue = input.gasDropValue === null ? undefined : input.gasDropValue;\n if (gasDropValue != null && typeof gasDropValue !== 'bigint') throw new SdkError('CONFIG', 'gasDropValue must be bigint');\n return { action, chainId, assetId, amount, recipient, gasDropValue, payIncludesFee, relayerUrl: relayerUrl ?? undefined };\n};\n\n// Relayer config fee map keys are serialized as 32-byte B256 hex strings.\n// Use `size: 32` to match the relayer's canonical key format (leading zeros included).\nconst tokenFeeKey = (token: TokenMetadata) => toHex(BigInt(token.id), { size: 32 }).toLowerCase();\n\nconst selectTransferInputs = (utxos: UtxoRecord[], required: bigint, maxInputs = 3) => {\n const sorted = [...utxos].sort((a, b) => (b.amount > a.amount ? 1 : b.amount < a.amount ? -1 : 0));\n const selected: UtxoRecord[] = [];\n let sum = 0n;\n for (const utxo of sorted) {\n selected.push(utxo);\n sum += utxo.amount;\n if (selected.length >= maxInputs || sum >= required) break;\n }\n return { selected, sum };\n};\n\nconst selectWithdrawInput = (utxos: UtxoRecord[], required: bigint) => {\n const sorted = [...utxos].sort((a, b) => (b.amount > a.amount ? 1 : b.amount < a.amount ? -1 : 0));\n return sorted.find((u) => u.amount >= required) ?? null;\n};\n\nconst INPUT_NUMBER = 3;\n\nconst recordsFee = (\n input: { withdrawFeeBps?: number },\n _records: bigint[],\n expectedOutput: bigint,\n action: 'transfer' | 'withdraw',\n relayerFee: { transfer: bigint; withdraw: bigint },\n expectedIsWithFee?: boolean,\n) => {\n const records = [..._records];\n let feeCount = 0;\n let fee = 0n;\n let cost = 0n;\n let total = 0n;\n let relayFee = 0n;\n let protocolFee = 0n;\n let outputAmount = 0n;\n\n while (records.length > 0) {\n feeCount++;\n const moreThenInputs = records.length > INPUT_NUMBER;\n const burnMoreThenInputs = action === 'withdraw' && records.length > 1;\n if (moreThenInputs || burnMoreThenInputs) {\n const merges = records.splice(0, INPUT_NUMBER);\n const mergeTotal = merges.reduce((acc, cur) => acc + cur, 0n);\n records.push(mergeTotal);\n continue;\n }\n\n if (action === 'transfer') {\n total = records.reduce((acc, cur) => acc + cur, 0n);\n fee = BigInt(feeCount) * relayerFee.transfer;\n relayFee = fee;\n if (maxUint256 === expectedOutput) {\n cost = total;\n outputAmount = total - fee;\n if (outputAmount < 0n) {\n outputAmount = 0n;\n cost = 0n;\n }\n } else {\n cost = expectedIsWithFee ? expectedOutput : expectedOutput + fee;\n }\n if (total < cost) {\n cost = 0n;\n }\n break;\n }\n\n if (action === 'withdraw') {\n const relayFeePay = relayerFee.withdraw;\n const withdrawFeeBps = BigInt(input.withdrawFeeBps ?? 0);\n const bpsBase = 10000n;\n const withdrawFeeDenominator = bpsBase + withdrawFeeBps;\n total = records.reduce((acc, cur) => acc + cur, 0n);\n fee = BigInt(feeCount - 1) * relayerFee.transfer;\n if (maxUint256 === expectedOutput) {\n const withdrawBase = ((total - fee) * bpsBase) / withdrawFeeDenominator;\n outputAmount = withdrawBase - relayFeePay;\n relayFee = fee + relayFeePay;\n if (outputAmount < 0n) {\n outputAmount = 0n;\n cost = 0n;\n break;\n }\n protocolFee = (withdrawBase * withdrawFeeBps) / bpsBase;\n const burnFee = protocolFee + relayFeePay;\n fee += burnFee;\n cost = outputAmount + fee;\n if (cost > total) {\n cost = 0n;\n }\n } else {\n if (expectedOutput > total) {\n cost = 0n;\n break;\n }\n relayFee = fee + relayFeePay;\n if (expectedIsWithFee) {\n const withdrawBase = ((expectedOutput - fee) * bpsBase) / withdrawFeeDenominator;\n outputAmount = withdrawBase - relayFeePay;\n } else {\n outputAmount = expectedOutput;\n }\n if (outputAmount < 0n) {\n cost = 0n;\n break;\n }\n const withdrawBase = outputAmount + relayFeePay;\n protocolFee = (withdrawBase * withdrawFeeBps) / bpsBase;\n const burnFee = protocolFee + relayFeePay;\n fee += burnFee;\n cost = outputAmount + fee;\n if (cost > total) {\n cost = 0n;\n }\n }\n break;\n }\n }\n\n return {\n total,\n fee,\n feeCount,\n cost,\n outputAmount,\n relayFee,\n protocolFee,\n };\n};\n\nconst buildFeeSummary = (info: ReturnType<typeof recordsFee>, inputCount: number): PlannerFeeSummary => {\n return {\n mergeCount: Math.max(0, info.feeCount - 1),\n feeCount: info.feeCount,\n relayerFeeTotal: info.relayFee,\n protocolFeeTotal: info.protocolFee,\n totalInput: info.total,\n outputAmount: info.outputAmount,\n cost: info.cost,\n inputCount,\n };\n};\n\nconst estimateRecords = (input: {\n records: bigint[];\n expectedOutput: bigint;\n action: 'transfer' | 'withdraw';\n relayerFee: { transfer: bigint; withdraw: bigint };\n withdrawFeeBps?: number;\n expectedIsWithFee?: boolean;\n}) => {\n const sorted = [...input.records].sort((a, b) => (b > a ? 1 : b < a ? -1 : 0));\n const payRecords: bigint[] = [];\n let payInfo = recordsFee(\n { withdrawFeeBps: input.withdrawFeeBps },\n [...payRecords],\n input.expectedOutput,\n input.action,\n input.relayerFee,\n input.expectedIsWithFee,\n );\n\n const maxRecords: bigint[] = [];\n let maxInfo = recordsFee(\n { withdrawFeeBps: input.withdrawFeeBps },\n [...maxRecords],\n maxUint256,\n input.action,\n input.relayerFee,\n input.expectedIsWithFee,\n );\n\n for (const record of sorted) {\n const isExceedPay = input.expectedIsWithFee ? payInfo.cost >= input.expectedOutput : payInfo.outputAmount >= input.expectedOutput;\n if (payInfo.cost === 0n || !isExceedPay) {\n payRecords.push(record);\n payInfo = recordsFee(\n { withdrawFeeBps: input.withdrawFeeBps },\n [...payRecords],\n input.expectedOutput,\n input.action,\n input.relayerFee,\n input.expectedIsWithFee,\n );\n }\n\n maxRecords.push(record);\n const tempMax = recordsFee(\n { withdrawFeeBps: input.withdrawFeeBps },\n [...maxRecords],\n maxUint256,\n input.action,\n input.relayerFee,\n input.expectedIsWithFee,\n );\n if (maxInfo.cost === 0n || tempMax.outputAmount > maxInfo.outputAmount) {\n maxInfo = tempMax;\n }\n }\n\n return { payRecords, payInfo, maxRecords, maxInfo };\n};\n\nexport class Planner implements PlannerApi {\n constructor(\n private readonly assets: AssetsApi,\n private readonly wallet: WalletService,\n private readonly bridge: ProofBridge,\n ) {}\n\n private selectMergeInputs(utxos: UtxoRecord[], count = INPUT_NUMBER) {\n const sorted = [...utxos].sort((a, b) => (a.amount > b.amount ? 1 : a.amount < b.amount ? -1 : 0));\n return sorted.slice(0, count);\n }\n\n private async buildTransferPlan(input: {\n chainId: number;\n assetId: string;\n token: TokenMetadata;\n requestedAmount: bigint;\n to: `0x${string}`;\n relayer: `0x${string}`;\n relayerUrl?: string;\n relayerFee: bigint;\n payIncludesFee?: boolean;\n selectedInputs: UtxoRecord[];\n ownerPk: { user_address: [bigint, bigint] };\n feeSummary: PlannerFeeSummary;\n maxSummary: PlannerFeeSummary;\n okWithMerge: boolean;\n }): Promise<TransferPlan> {\n const required = input.payIncludesFee ? input.requestedAmount : input.requestedAmount + input.relayerFee;\n const sendAmount = input.payIncludesFee ? input.requestedAmount - input.relayerFee : input.requestedAmount;\n if (sendAmount < 0n) {\n throw new SdkError('CONFIG', 'amount is too small to cover relayer fee', { relayerFee: input.relayerFee.toString() });\n }\n const selectedSum = input.selectedInputs.reduce((acc, cur) => acc + cur.amount, 0n);\n if (selectedSum < required) {\n throw new SdkError('CONFIG', 'insufficient shielded balance', { required: required.toString(), selectedSum: selectedSum.toString() });\n }\n\n const recipientPk = KeyManager.addressToUserPk(input.to);\n const output0 = CryptoToolkit.createRecordOpening({\n asset_id: BigInt(input.token.id),\n asset_amount: sendAmount,\n user_pk: { user_address: recipientPk.user_address },\n });\n const change = selectedSum - required;\n const output1 =\n change > 0n\n ? CryptoToolkit.createRecordOpening({\n asset_id: BigInt(input.token.id),\n asset_amount: change,\n user_pk: { user_address: input.ownerPk.user_address },\n })\n : await this.bridge.createDummyRecordOpening();\n const output2 = await this.bridge.createDummyRecordOpening();\n\n const outputs = [output0, output1, output2] as const;\n const extraData = [MemoKit.createMemo(output0), MemoKit.createMemo(output1), MemoKit.createMemo(output2)] as const;\n const proofBinding = calcTransferProofBinding({ relayer: input.relayer, extraData });\n\n return {\n action: 'transfer' as const,\n chainId: input.chainId,\n assetId: input.assetId,\n token: input.token,\n requestedAmount: input.requestedAmount,\n sendAmount,\n to: input.to,\n relayer: input.relayer,\n relayerUrl: input.relayerUrl ?? undefined,\n relayerFee: input.relayerFee,\n required,\n okWithMerge: input.okWithMerge,\n feeSummary: input.feeSummary,\n maxSummary: input.maxSummary,\n selectedInputs: input.selectedInputs,\n selectedSum,\n outputs,\n extraData,\n proofBinding: proofBinding.toString(),\n };\n }\n\n async estimate(input: { chainId: number; assetId: string; action: 'transfer' | 'withdraw'; amount: bigint; payIncludesFee?: boolean }) {\n const token = this.assets.getPoolInfo(input.chainId, input.assetId);\n if (!token) {\n throw new SdkError('CONFIG', `Token ${input.assetId} not found in chain ${input.chainId}`);\n }\n\n const relayerConfig = await this.getRelayerConfig(input.chainId);\n const relayerFee = this.getRelayerFee(relayerConfig, token, input.action);\n\n if (input.action === 'transfer') {\n const required = input.payIncludesFee ? input.amount : input.amount + relayerFee;\n const sendAmount = input.payIncludesFee ? input.amount - relayerFee : input.amount;\n if (sendAmount < 0n) {\n throw new SdkError('CONFIG', 'amount is too small to cover relayer fee', { relayerFee: relayerFee.toString() });\n }\n const utxos = (await this.wallet.getUtxos({ chainId: input.chainId, assetId: input.assetId, includeSpent: false, includeFrozen: false })).rows;\n const { selected, sum } = selectTransferInputs(utxos, required, 3);\n const records = utxos.map((u) => u.amount).filter((v) => v > 0n);\n const estimates = estimateRecords({\n records,\n expectedOutput: input.amount,\n action: 'transfer',\n relayerFee: { transfer: relayerFee, withdraw: 0n },\n withdrawFeeBps: token.withdrawFeeBps,\n expectedIsWithFee: input.payIncludesFee,\n });\n const feeSummary = buildFeeSummary(estimates.payInfo, estimates.payRecords.length);\n const maxSummary = buildFeeSummary(estimates.maxInfo, estimates.maxRecords.length);\n const okWithMerge = feeSummary.cost > 0n;\n return {\n action: 'transfer' as const,\n chainId: input.chainId,\n assetId: input.assetId,\n sendAmount,\n relayerFee,\n required,\n selectedInputs: selected,\n selectedSum: sum,\n ok: sum >= required,\n okWithMerge,\n feeSummary,\n maxSummary,\n constraints: { maxInputs: 3 },\n };\n }\n\n const withdrawBase = input.payIncludesFee ? input.amount : input.amount + relayerFee;\n const protocolFee = (withdrawBase * BigInt(token.withdrawFeeBps ?? 0)) / 10000n;\n const burnAmount = input.payIncludesFee ? input.amount : input.amount + relayerFee + protocolFee;\n\n const utxos = (await this.wallet.getUtxos({ chainId: input.chainId, assetId: input.assetId, includeSpent: false, includeFrozen: false })).rows;\n const chosen = selectWithdrawInput(utxos, burnAmount);\n const records = utxos.map((u) => u.amount).filter((v) => v > 0n);\n const estimates = estimateRecords({\n records,\n expectedOutput: input.amount,\n action: 'withdraw',\n relayerFee: { transfer: this.getRelayerFee(relayerConfig, token, 'transfer'), withdraw: relayerFee },\n withdrawFeeBps: token.withdrawFeeBps,\n expectedIsWithFee: input.payIncludesFee,\n });\n const feeSummary = buildFeeSummary(estimates.payInfo, estimates.payRecords.length);\n const maxSummary = buildFeeSummary(estimates.maxInfo, estimates.maxRecords.length);\n const okWithMerge = feeSummary.cost > 0n;\n return {\n action: 'withdraw' as const,\n chainId: input.chainId,\n assetId: input.assetId,\n requestedAmount: input.amount,\n relayerFee,\n protocolFee,\n burnAmount,\n selectedInput: chosen,\n ok: Boolean(chosen),\n okWithMerge,\n feeSummary,\n maxSummary,\n constraints: { requiresSingleInput: true as const },\n };\n }\n\n async estimateMax(input: { chainId: number; assetId: string; action: 'transfer' | 'withdraw'; payIncludesFee?: boolean }): Promise<PlannerMaxEstimateResult> {\n const token = this.assets.getPoolInfo(input.chainId, input.assetId);\n if (!token) {\n throw new SdkError('CONFIG', `Token ${input.assetId} not found in chain ${input.chainId}`);\n }\n\n const relayerConfig = await this.getRelayerConfig(input.chainId);\n const relayerFee = this.getRelayerFee(relayerConfig, token, input.action);\n const transferFee = input.action === 'withdraw' ? this.getRelayerFee(relayerConfig, token, 'transfer') : relayerFee;\n\n const utxos = (await this.wallet.getUtxos({ chainId: input.chainId, assetId: input.assetId, includeSpent: false, includeFrozen: false })).rows;\n const records = utxos.map((u) => u.amount).filter((v) => v > 0n);\n const estimates = estimateRecords({\n records,\n expectedOutput: maxUint256,\n action: input.action,\n relayerFee: { transfer: transferFee, withdraw: relayerFee },\n withdrawFeeBps: token.withdrawFeeBps,\n expectedIsWithFee: input.payIncludesFee,\n });\n const maxSummary = buildFeeSummary(estimates.maxInfo, estimates.maxRecords.length);\n const ok = maxSummary.cost > 0n;\n\n return {\n action: input.action,\n chainId: input.chainId,\n assetId: input.assetId,\n ok,\n maxSummary,\n };\n }\n\n async plan(input: Record<string, unknown>) {\n const parsed = parsePlanInput(input);\n const token = this.assets.getPoolInfo(parsed.chainId, parsed.assetId);\n if (!token) {\n throw new SdkError('CONFIG', `Token ${parsed.assetId} not found in chain ${parsed.chainId}`);\n }\n\n const relayerConfig = await this.getRelayerConfig(parsed.chainId, parsed.relayerUrl);\n const relayerFee = this.getRelayerFee(relayerConfig, token, parsed.action);\n const relayer = relayerConfig.config.relayer_address;\n const relayerUrl = parsed.relayerUrl ?? this.assets.getChain(parsed.chainId).relayerUrl;\n\n const ownerViewingAddress = this.wallet.getViewingAddress();\n const ownerPk = KeyManager.addressToUserPk(ownerViewingAddress);\n\n if (parsed.action === 'transfer') {\n const required = parsed.payIncludesFee ? parsed.amount : parsed.amount + relayerFee;\n const sendAmount = parsed.payIncludesFee ? parsed.amount - relayerFee : parsed.amount;\n if (sendAmount < 0n) {\n throw new SdkError('CONFIG', 'amount is too small to cover relayer fee', { relayerFee: relayerFee.toString() });\n }\n\n const utxos = (await this.wallet.getUtxos({\n chainId: parsed.chainId,\n assetId: parsed.assetId,\n includeSpent: false,\n includeFrozen: false,\n })).rows;\n const { selected, sum } = selectTransferInputs(utxos, required, 3);\n const estimates = estimateRecords({\n records: utxos.map((u) => u.amount).filter((v) => v > 0n),\n expectedOutput: parsed.amount,\n action: 'transfer',\n relayerFee: { transfer: relayerFee, withdraw: 0n },\n withdrawFeeBps: token.withdrawFeeBps,\n expectedIsWithFee: parsed.payIncludesFee,\n });\n const feeSummary = buildFeeSummary(estimates.payInfo, estimates.payRecords.length);\n const maxSummary = buildFeeSummary(estimates.maxInfo, estimates.maxRecords.length);\n const okWithMerge = feeSummary.cost > 0n;\n\n if (sum < required) {\n const total = utxos.reduce((acc, cur) => acc + cur.amount, 0n);\n if (!okWithMerge || total < required) {\n throw new SdkError('CONFIG', 'insufficient shielded balance', { required: required.toString(), selectedSum: sum.toString() });\n }\n if (!parsed.autoMerge) {\n throw new SdkError('CONFIG', 'insufficient shielded balance', { required: required.toString(), selectedSum: sum.toString() });\n }\n\n let mergeInputs = this.selectMergeInputs(utxos, INPUT_NUMBER);\n if (mergeInputs.length < INPUT_NUMBER) {\n throw new SdkError('CONFIG', 'insufficient shielded balance for auto-merge', { required: required.toString(), selectedSum: sum.toString() });\n }\n let mergeSum = mergeInputs.reduce((acc, cur) => acc + cur.amount, 0n);\n if (mergeSum <= relayerFee) {\n const largest = [...utxos].sort((a, b) => (b.amount > a.amount ? 1 : b.amount < a.amount ? -1 : 0)).slice(0, INPUT_NUMBER);\n const largestSum = largest.reduce((acc, cur) => acc + cur.amount, 0n);\n if (largestSum <= relayerFee) {\n throw new SdkError('CONFIG', 'insufficient shielded balance for merge fee', {\n relayerFee: relayerFee.toString(),\n mergeSum: mergeSum.toString(),\n });\n }\n mergeInputs = largest;\n mergeSum = largestSum;\n }\n const mergeAmount = mergeSum - relayerFee;\n const mergeEstimates = estimateRecords({\n records: mergeInputs.map((u) => u.amount).filter((v) => v > 0n),\n expectedOutput: mergeAmount,\n action: 'transfer',\n relayerFee: { transfer: relayerFee, withdraw: 0n },\n withdrawFeeBps: token.withdrawFeeBps,\n expectedIsWithFee: false,\n });\n const mergeFeeSummary = buildFeeSummary(mergeEstimates.payInfo, mergeEstimates.payRecords.length);\n const mergeMaxSummary = buildFeeSummary(mergeEstimates.maxInfo, mergeEstimates.maxRecords.length);\n const mergeOkWithMerge = mergeFeeSummary.cost > 0n;\n\n const mergePlan = await this.buildTransferPlan({\n chainId: parsed.chainId,\n assetId: parsed.assetId,\n token,\n requestedAmount: mergeAmount,\n to: ownerViewingAddress,\n relayer,\n relayerUrl: relayerUrl ?? undefined,\n relayerFee,\n payIncludesFee: false,\n selectedInputs: mergeInputs,\n ownerPk,\n feeSummary: mergeFeeSummary,\n maxSummary: mergeMaxSummary,\n okWithMerge: mergeOkWithMerge,\n });\n\n return {\n action: 'transfer-merge' as const,\n chainId: parsed.chainId,\n assetId: parsed.assetId,\n requestedAmount: parsed.amount,\n sendAmount,\n to: parsed.to,\n relayer,\n relayerUrl: relayerUrl ?? undefined,\n relayerFee,\n required,\n okWithMerge,\n feeSummary,\n maxSummary,\n mergePlan,\n };\n }\n\n return this.buildTransferPlan({\n chainId: parsed.chainId,\n assetId: parsed.assetId,\n token,\n requestedAmount: parsed.amount,\n to: parsed.to,\n relayer,\n relayerUrl: relayerUrl ?? undefined,\n relayerFee,\n payIncludesFee: parsed.payIncludesFee,\n selectedInputs: selected,\n ownerPk,\n feeSummary,\n maxSummary,\n okWithMerge,\n });\n }\n\n const gasDropValue = parsed.gasDropValue ?? 0n;\n const withdrawBase = parsed.payIncludesFee ? parsed.amount : parsed.amount + relayerFee;\n const protocolFee = (withdrawBase * BigInt(token.withdrawFeeBps ?? 0)) / 10000n;\n const burnAmount = parsed.payIncludesFee ? parsed.amount : parsed.amount + relayerFee + protocolFee;\n\n const utxos = (await this.wallet.getUtxos({\n chainId: parsed.chainId,\n assetId: parsed.assetId,\n includeSpent: false,\n includeFrozen: false,\n })).rows;\n const chosen = selectWithdrawInput(utxos, burnAmount);\n if (!chosen) {\n throw new SdkError('CONFIG', 'no single utxo can cover burn amount', { burnAmount: burnAmount.toString() });\n }\n const estimates = estimateRecords({\n records: utxos.map((u) => u.amount).filter((v) => v > 0n),\n expectedOutput: parsed.amount,\n action: 'withdraw',\n relayerFee: { transfer: this.getRelayerFee(relayerConfig, token, 'transfer'), withdraw: relayerFee },\n withdrawFeeBps: token.withdrawFeeBps,\n expectedIsWithFee: parsed.payIncludesFee,\n });\n const feeSummary = buildFeeSummary(estimates.payInfo, estimates.payRecords.length);\n const maxSummary = buildFeeSummary(estimates.maxInfo, estimates.maxRecords.length);\n const okWithMerge = feeSummary.cost > 0n;\n\n const change = chosen.amount - burnAmount;\n const outputRo =\n change > 0n\n ? CryptoToolkit.createRecordOpening({\n asset_id: BigInt(token.id),\n asset_amount: change,\n user_pk: { user_address: ownerPk.user_address },\n })\n : await this.bridge.createDummyRecordOpening();\n\n const extraData = MemoKit.createMemo(outputRo);\n const proofBinding = calcWithdrawProofBinding({\n recipient: parsed.recipient,\n amount: parsed.amount,\n relayer,\n relayerFee,\n gasDropValue,\n extraData,\n });\n\n return {\n action: 'withdraw' as const,\n chainId: parsed.chainId,\n assetId: parsed.assetId,\n token,\n requestedAmount: parsed.amount,\n relayer,\n relayerUrl: relayerUrl ?? undefined,\n relayerFee,\n protocolFee,\n burnAmount,\n gasDropValue,\n okWithMerge,\n feeSummary,\n maxSummary,\n selectedInput: chosen,\n outputRecordOpening: outputRo,\n extraData,\n proofBinding: proofBinding.toString(),\n recipient: parsed.recipient,\n };\n }\n\n private async getRelayerConfig(chainId: number, relayerUrlOverride?: string): Promise<RelayerConfig> {\n if (relayerUrlOverride) {\n const config = await fetchRelayerConfigFromRelayerUrl(relayerUrlOverride);\n if (config.config.chain_id !== chainId) {\n throw new SdkError('CONFIG', 'Relayer config chain_id mismatch', { chainId, relayerUrl: relayerUrlOverride, configChainId: config.config.chain_id });\n }\n return config;\n }\n const cached = this.assets.getRelayerConfig(chainId);\n if (cached) return cached;\n return this.assets.syncRelayerConfig(chainId);\n }\n\n private getRelayerFee(config: RelayerConfig, token: TokenMetadata, action: 'transfer' | 'withdraw'): bigint {\n const key = tokenFeeKey(token);\n const table = action === 'transfer' ? config.fee_configure.transfer : config.fee_configure.withdraw;\n const fee = (table as any)?.[key]?.fee;\n // No fee entry → default to zero (favorable to user, no charge)\n return fee != null ? BigInt(fee) : 0n;\n }\n}\n","import type { ProofResult, RelayerRequest, TxBuilderApi } from '../types';\nimport { SdkError } from '../errors';\nimport { getAddress, type Address } from 'viem';\nimport { isHexStrict } from '../utils/hex';\n\nconst requireNumber = (value: unknown, name: string): number => {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n throw new SdkError('CONFIG', `Missing ${name}`);\n};\n\nconst requireHex = (value: unknown, name: string): `0x${string}` => {\n if (isHexStrict(value, { minBytes: 1 })) return value as `0x${string}`;\n throw new SdkError('CONFIG', `Missing ${name}`);\n};\n\nconst requireAddress = (value: unknown, name: string): Address => {\n if (typeof value !== 'string') {\n throw new SdkError('CONFIG', `Missing ${name}`);\n }\n return getAddress(value);\n};\n\nconst requireBigint = (value: unknown, name: string): bigint => {\n if (typeof value === 'bigint') return value;\n if (typeof value === 'string' && value.length) return BigInt(value);\n if (typeof value === 'number' && Number.isSafeInteger(value)) return BigInt(value);\n throw new SdkError('CONFIG', `Missing ${name}`);\n};\n\nexport class TxBuilder implements TxBuilderApi {\n async buildTransferCalldata(input: { chainId: number; proof: ProofResult }): Promise<RelayerRequest> {\n const proof = input.proof;\n const arrayHashIndex = requireNumber(proof.array_hash_index, 'array_hash_index');\n const merkleRootIndex = requireNumber(proof.merkle_root_index, 'merkle_root_index');\n const relayer = requireAddress(proof.relayer, 'relayer');\n\n const extraData = proof.extra_data;\n if (!Array.isArray(extraData) || extraData.length !== 3) {\n throw new SdkError('CONFIG', 'Transfer requires extra_data as bytes[3]');\n }\n extraData.forEach((entry, idx) => requireHex(entry, `extra_data[${idx}]`));\n\n const request: RelayerRequest = {\n kind: 'relayer',\n method: 'POST',\n path: '/api/v1/transfer',\n body: {\n proof: proof.proof,\n input: proof.public_input,\n extra_data: extraData,\n merkle_root_index: merkleRootIndex,\n array_hash_index: arrayHashIndex,\n relayer,\n flatten_input: proof.flatten_input,\n },\n };\n\n return request;\n }\n\n async buildWithdrawCalldata(input: { chainId: number; proof: ProofResult }): Promise<RelayerRequest> {\n const proof = input.proof;\n const arrayHashIndex = requireNumber(proof.array_hash_index, 'array_hash_index');\n const merkleRootIndex = requireNumber(proof.merkle_root_index, 'merkle_root_index');\n const relayer = requireAddress(proof.relayer, 'relayer');\n const recipientAddress = requireAddress(proof.recipient, 'recipient');\n\n const relayerFee = requireBigint(proof.relayer_fee, 'relayer_fee');\n const gasDropValue = requireBigint(proof.gas_drop_value ?? 0n, 'gas_drop_value');\n\n const burnAmount =\n proof.withdraw_amount ??\n (proof.public_input && Object.prototype.hasOwnProperty.call(proof.public_input, 'amount')\n ? requireBigint((proof.public_input as any).amount, 'input.amount')\n : undefined);\n if (burnAmount == null) {\n throw new SdkError('CONFIG', 'Missing withdraw_amount (burn_amount)');\n }\n\n const extraData = proof.extra_data;\n if (Array.isArray(extraData)) {\n throw new SdkError('CONFIG', 'Withdraw requires extra_data as bytes');\n }\n const extraDataHex = requireHex(extraData, 'extra_data');\n\n const request: RelayerRequest = {\n kind: 'relayer',\n method: 'POST',\n path: '/api/v1/burn',\n body: {\n proof: proof.proof,\n input: proof.public_input,\n extra_data: extraDataHex,\n merkle_root_index: merkleRootIndex,\n array_hash_index: arrayHashIndex,\n recipient_address: recipientAddress,\n relayer,\n relayer_fee: relayerFee.toString(),\n gas_drop_value: gasDropValue.toString(),\n burn_amount: burnAmount.toString(),\n flatten_input: proof.flatten_input,\n },\n };\n\n return request;\n }\n}\n","import { SdkError } from '../errors';\nimport type { RemoteMerkleProofResponse, SdkEvent } from '../types';\nimport { errorToDebug, nonOkResponseDetail } from '../utils/httpDebug';\nimport { signalTimeout, signalAny } from '../utils/signal';\nimport { joinUrl } from '../utils/url';\n\nconst DEFAULT_MERKLE_REQUEST_TIMEOUT_MS = 15_000;\n\nconst withRepeatedQuery = (url: string, key: string, values: Array<string | number>) => {\n const search = new URLSearchParams();\n for (const v of values) search.append(key, String(v));\n const qs = search.toString();\n return qs ? `${url}?${qs}` : url;\n};\n\nconst normalizeLatestCid = (value: unknown): number => {\n const n = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : Number.NaN;\n if (!Number.isFinite(n) || n < 0) {\n throw new SdkError('MERKLE', 'Invalid merkle latest_cid', { latest_cid: value });\n }\n return Math.floor(n);\n};\n\nconst normalizePathEntry = (value: unknown): string => {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' && Number.isFinite(value)) return String(value);\n if (typeof value === 'bigint') return value.toString();\n throw new SdkError('MERKLE', 'Invalid merkle proof path entry', { value });\n};\n\nconst normalizeLeafIndex = (value: unknown): string | number => {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string' && value.length) return value;\n throw new SdkError('MERKLE', 'Invalid merkle leaf_index', { leaf_index: value });\n};\n\nconst normalizeMerkleRoot = (value: unknown): string => {\n if (typeof value === 'string' && value.length) {\n try {\n // allow both 0x... and decimal-like strings\n void BigInt(value);\n return value;\n } catch {\n throw new SdkError('MERKLE', 'Invalid merkle_root', { merkle_root: value });\n }\n }\n if (typeof value === 'bigint') return value.toString();\n throw new SdkError('MERKLE', 'Invalid merkle_root', { merkle_root: value });\n};\n\nconst normalizeResponse = (raw: unknown): RemoteMerkleProofResponse => {\n if (!raw || typeof raw !== 'object') {\n throw new SdkError('MERKLE', 'Invalid merkle proof response', { raw });\n }\n const obj = raw as any;\n const proofRaw = obj.proof;\n if (!Array.isArray(proofRaw)) {\n throw new SdkError('MERKLE', 'Invalid merkle proof response: missing proof[]', { raw });\n }\n const proof = proofRaw.map((entry: any, idx: number) => {\n if (!entry || typeof entry !== 'object') {\n throw new SdkError('MERKLE', 'Invalid merkle proof entry', { index: idx, entry });\n }\n if (!Array.isArray(entry.path)) {\n throw new SdkError('MERKLE', 'Invalid merkle proof entry: missing path[]', { index: idx, entry });\n }\n return {\n path: entry.path.map(normalizePathEntry),\n leaf_index: normalizeLeafIndex(entry.leaf_index),\n };\n });\n\n return {\n proof,\n merkle_root: normalizeMerkleRoot(obj.merkle_root),\n latest_cid: normalizeLatestCid(obj.latest_cid),\n } as RemoteMerkleProofResponse;\n};\n\ntype DebugEmitter = (event: Extract<SdkEvent, { type: 'debug' }>) => void;\n\nexport class MerkleClient {\n constructor(\n private readonly baseUrl: string,\n private readonly debugEmit?: DebugEmitter,\n ) {}\n\n async getProofByCids(\n cids: number[],\n options?: { signal?: AbortSignal; requestTimeoutMs?: number },\n ): Promise<RemoteMerkleProofResponse> {\n if (!Array.isArray(cids) || cids.length === 0) {\n throw new SdkError('MERKLE', 'Merkle proof requires at least one cid', { cids });\n }\n const url = withRepeatedQuery(joinUrl(this.baseUrl, '/api/v1/merkle'), 'cid', cids);\n this.debugEmit?.({ type: 'debug', payload: { scope: 'http:merkle', message: 'request', detail: { method: 'GET', url } } });\n let response: Response;\n const requestTimeoutMs =\n typeof options?.requestTimeoutMs === 'number' && Number.isFinite(options.requestTimeoutMs)\n ? Math.max(1000, Math.floor(options.requestTimeoutMs))\n : DEFAULT_MERKLE_REQUEST_TIMEOUT_MS;\n const signal = signalAny([options?.signal, signalTimeout(requestTimeoutMs)]);\n try {\n response = await fetch(url, { signal });\n } catch (error) {\n this.debugEmit?.({ type: 'debug', payload: { scope: 'http:merkle', message: 'network_error', detail: { url, error: errorToDebug(error) } } });\n throw new SdkError(\n 'MERKLE',\n 'Merkle proof request failed',\n { url, reason: 'network_error', requestTimeoutMs },\n error,\n );\n }\n this.debugEmit?.({\n type: 'debug',\n payload: { scope: 'http:merkle', message: 'response', detail: { url, status: response.status, ok: response.ok } },\n });\n if (!response.ok) {\n throw new SdkError('MERKLE', 'Merkle proof request failed', await nonOkResponseDetail(response, url));\n }\n const json = await response.json();\n return normalizeResponse(json);\n }\n}\n","export const TREE_DEPTH_DEFAULT = 32;\n\n/**\n * Zero hashes for the on-chain Merkle tree.\n * Must match the Solidity contract's `getZerotree()` output.\n */\nexport function getZeroHash(level: number): `0x${string}` {\n const zeroHashes: Record<number, `0x${string}`> = {\n 0: '0x0000000000000000000000000000000000000000000000000000000000000000',\n 1: '0x0c740b5d5661a25942f5aec3aa675b31c36714fa5026100b49af73236c2a265b',\n 2: '0x2dda8b6adb639dd4516e4d371ddf59c3b64b641be442b359774e4f08294578af',\n 3: '0x08bcf2c4cfee2ac031b52b315e75189f362a7bbdaf59767aa1c362acbd113419',\n 4: '0x2ae2a5f66632e926fb622035497debdc5902d667035f1211cb86b0fbf1a89e18',\n 5: '0x0194ca797fa11abd0fdf4042d0aaab02f57ad13f06bdcd4b9026eabb71fa6b65',\n 6: '0x173839dafdf0159d97514d06983efa414a9f8a4202c73b0a2e9660ee3e4f58a2',\n 7: '0x1b075787c4d0b4a075f8aaae92eaae2dafc9ca85d97a9c4bdcae981ff5e209f3',\n 8: '0x09326901b8704de14de1a00dfd80a074b832cbd65861d950a6a53995ecb7a528',\n 9: '0x1f5e2833033ace14e1b43c12b5c55e491abf98b0a96d0be0d4d8a17d1b390232',\n 10: '0x1a1168950d8fa4ecb93c40299070fd26893a447dec6ba7257ed0eb13761fcd4c',\n 11: '0x0550b54a45c982dfa2353f568e1ff29ad1e628c8331d07a6582eaa487559a240',\n 12: '0x02ab29f1ec9986780c0b65862861cfb9155ebc1d67d421c0b0c8521410cefac2',\n 13: '0x012c5234f4b66229c3e8630859716b268a04852b68125eb0adb0c619b58ccb72',\n 14: '0x23099bd0d72b0d04a5b2d68e6fee66f0cc5a7299104eba58bf0bddbfc17cabb7',\n 15: '0x1fa7911a66de8cc674dc0dcfa05fbf483f2998194150a764d7402f5d3fda3957',\n 16: '0x201215fcba3d3299a929fdb26322a93a088e3a72a3ede417670923125da731db',\n 17: '0x230368789a3a13ce4ef5d0c76e3910ff44cee2c474d759f932b6231ae575d837',\n 18: '0x0324b55ec4323910fc2d98f35778fc966298283a2613aeefdee757da8772ba14',\n 19: '0x23a6aa1a50ee5a7acabb1d30d672404102cd73e3e10568e1fee02bef2033ef50',\n 20: '0x0873c0433d55a801c675eabb4ecd16a0b06b48813c7bc8aee6783aa993504dff',\n 21: '0x2b40cf6d86fa31458292e9fd6229c810f60e0c0a99f7cd6195715f5140e59f4a',\n 22: '0x1ff6607fcf0170c83806f52f9955f6502299b925cf1f1565567d900a94585f1a',\n 23: '0x226d8e183f552483ab09bb9981da924645970fc43c6b25483ffe21238a0284cd',\n 24: '0x066d8efd0435d96291209ced94e2ee1b6028fe1f25a9639f0f53096349f4b298',\n 25: '0x23faf33cbce15c7bdf3facb33a86a7366133b2553005dbe799d2b5cd978f58b2',\n 26: '0x170e73814a05fba295e7a03fc5bb292fa6a8c4fbb515aefc56ccf7bd1457618c',\n 27: '0x1cd2d392493e7d0c8cfedfc3660969ba0a3c0c3a5e580d3f99bf3e4aab90d7e6',\n 28: '0x109f691ab1c14c204c6d46e6b8f66284cfd9c965cd71d7e29bc7fec3f69596ad',\n 29: '0x1bb7501506c802880e1776b6729be7ab184fb2efa8a52cb8b75f2cd90f8988e6',\n 30: '0x2bc603264ffed8e521886c85c055834b9bbebb554d8163cdeab68b1cda1a86c4',\n 31: '0x07fb3838f408ece56bc2d50c545cc46dbad4139e6d728e35325fa151b313c679',\n 32: '0x2520e295b7f5a56ab3e4b476dde6b81f8e27ea082a7674e7fb9eb052e1470e52',\n };\n\n return zeroHashes[level] || zeroHashes[0]!;\n}\n\n","import type { MerkleApi, ProofBridge, RemoteMerkleProofResponse, Hex, AccMemberWitness, InputSecret, MerkleNodeRecord, StorageAdapter, UserKeyPair } from '../types';\nimport { SdkError } from '../errors';\nimport { MerkleClient } from './merkleClient';\nimport { getZeroHash, TREE_DEPTH_DEFAULT } from './zeroHashes';\nimport { Poseidon2, Poseidon2Domain } from '../crypto/poseidon2';\nimport { MemoKit } from '../memo/memoKit';\nimport { KeyManager } from '../crypto/keyManager';\n\nconst TEMP_ARRAY_SIZE_DEFAULT = 32;\nconst SUBTREE_SIZE = 32;\nconst SUBTREE_DEPTH = 5;\n\nconst toDecString = (value: string | bigint) => {\n try {\n return typeof value === 'bigint' ? value.toString() : BigInt(value).toString();\n } catch {\n return String(value);\n }\n};\n\nexport class MerkleEngine implements MerkleApi {\n private readonly mode: 'remote' | 'local' | 'hybrid';\n private readonly treeDepth: number;\n private readonly pendingLeavesByChain = new Map<number, Hex[]>();\n private readonly chainStateByChain = new Map<number, { mergedElements: number; root: Hex }>();\n private readonly hydratedChains = new Set<number>();\n private readonly hydrateInFlight = new Map<number, Promise<void>>();\n\n constructor(\n private readonly getChain: (chainId: number) => { merkleProofUrl?: string },\n private readonly bridge: ProofBridge,\n options?: { mode?: 'remote' | 'local' | 'hybrid'; treeDepth?: number },\n private readonly storage?: Pick<\n StorageAdapter,\n | 'getMerkleLeaves'\n | 'appendMerkleLeaves'\n | 'clearMerkleLeaves'\n | 'getMerkleLeaf'\n | 'getMerkleNode'\n | 'upsertMerkleNodes'\n | 'clearMerkleNodes'\n | 'getMerkleTree'\n | 'setMerkleTree'\n | 'clearMerkleTree'\n >,\n ) {\n this.mode = options?.mode ?? 'hybrid';\n this.treeDepth = Math.max(1, Math.floor(options?.treeDepth ?? TREE_DEPTH_DEFAULT));\n }\n\n currentMerkleRootIndex(totalElements: number, tempArraySize: number = TEMP_ARRAY_SIZE_DEFAULT) {\n if (totalElements <= tempArraySize) return 0;\n return Math.floor((totalElements - 1) / tempArraySize);\n }\n\n private ensurePendingLeaves(chainId: number) {\n let pending = this.pendingLeavesByChain.get(chainId);\n if (!pending) {\n pending = [];\n this.pendingLeavesByChain.set(chainId, pending);\n }\n return pending;\n }\n\n private ensureChainState(chainId: number) {\n let state = this.chainStateByChain.get(chainId);\n if (!state) {\n state = { mergedElements: 0, root: getZeroHash(this.treeDepth) };\n this.chainStateByChain.set(chainId, state);\n }\n return state;\n }\n\n private static hashPair(left: Hex, right: Hex): Hex {\n return Poseidon2.hashToHex(BigInt(left), BigInt(right), Poseidon2Domain.Merkle) as Hex;\n }\n\n private static buildSubtree(leafCommitments: Hex[], baseIndex: number): { subtreeRoot: Hex; nodesToStore: MerkleNodeRecord[] } {\n if (leafCommitments.length !== SUBTREE_SIZE) {\n throw new SdkError('MERKLE', 'Subtree must have exactly 32 leaf nodes', { got: leafCommitments.length });\n }\n if (baseIndex % SUBTREE_SIZE !== 0) {\n throw new SdkError('MERKLE', 'Subtree baseIndex must be aligned to 32', { baseIndex });\n }\n const nodesToStore: MerkleNodeRecord[] = [];\n let currentLevel = [...leafCommitments];\n for (let level = 1; level <= SUBTREE_DEPTH; level++) {\n const next: Hex[] = [];\n for (let i = 0; i < currentLevel.length; i += 2) {\n next.push(MerkleEngine.hashPair(currentLevel[i]!, currentLevel[i + 1]!));\n }\n const basePos = baseIndex >> level;\n for (let i = 0; i < next.length; i++) {\n const position = basePos + i;\n nodesToStore.push({\n chainId: 0,\n id: `${level}-${position}`,\n level,\n position,\n hash: next[i]!,\n });\n }\n currentLevel = next;\n }\n return { subtreeRoot: currentLevel[0]!, nodesToStore };\n }\n\n private async getNodeHash(chainId: number, id: string): Promise<Hex | undefined> {\n const node = await this.storage?.getMerkleNode?.(chainId, id);\n return node?.hash;\n }\n\n private async mergeSubtreeToMainTree(input: { chainId: number; subtreeRoot: Hex; newTotalElements: number }): Promise<{ finalRoot: Hex; nodesToStore: MerkleNodeRecord[] }> {\n let currentValue = input.subtreeRoot;\n let frontierUpdated = false;\n const nodesToStore: MerkleNodeRecord[] = [];\n\n for (let level = SUBTREE_DEPTH; level < this.treeDepth; level++) {\n const nodeIndex = (input.newTotalElements - 1) >> level;\n\n if ((nodeIndex & 1) === 0) {\n if (!frontierUpdated) {\n nodesToStore.push({\n chainId: input.chainId,\n id: `frontier-${level}`,\n level,\n position: nodeIndex,\n hash: currentValue,\n });\n frontierUpdated = true;\n }\n currentValue = MerkleEngine.hashPair(currentValue, getZeroHash(level));\n } else {\n const leftHash = (await this.getNodeHash(input.chainId, `frontier-${level}`)) ?? getZeroHash(level);\n currentValue = MerkleEngine.hashPair(leftHash, currentValue);\n }\n\n const nextLevel = level + 1;\n nodesToStore.push({\n chainId: input.chainId,\n id: `${nextLevel}-${nodeIndex >> 1}`,\n level: nextLevel,\n position: nodeIndex >> 1,\n hash: currentValue,\n });\n }\n\n return { finalRoot: currentValue, nodesToStore };\n }\n\n private static totalElementsInTree(totalElements: bigint, tempArraySize: number = TEMP_ARRAY_SIZE_DEFAULT): number {\n if (tempArraySize <= 0) throw new SdkError('MERKLE', 'tempArraySize must be greater than zero', { tempArraySize });\n if (totalElements <= 0n) return 0;\n const size = BigInt(tempArraySize);\n return Number(((totalElements - 1n) / size) * size);\n }\n\n private async hydrateFromStorage(chainId: number) {\n if (this.mode === 'remote') return;\n if (this.hydratedChains.has(chainId)) return;\n const existing = this.hydrateInFlight.get(chainId);\n if (existing) return existing;\n\n const task = (async () => {\n try {\n const state = this.ensureChainState(chainId);\n const leaves = await this.storage?.getMerkleLeaves?.(chainId);\n if (!leaves || leaves.length === 0) return;\n const sorted = [...leaves]\n .map((l) => ({\n cid: l.cid,\n commitment: MerkleEngine.normalizeHex32(l.commitment, 'memo.commitment'),\n }))\n .sort((a, b) => a.cid - b.cid);\n for (let i = 0; i < sorted.length; i++) {\n if (sorted[i]!.cid !== i) throw new Error(`Non-contiguous persisted merkle leaves: expected cid=${i}, got cid=${sorted[i]!.cid}`);\n }\n\n const totalElements = BigInt(sorted.length);\n const mergedElements = MerkleEngine.totalElementsInTree(totalElements);\n\n const pending = this.ensurePendingLeaves(chainId);\n pending.length = 0;\n state.mergedElements = mergedElements;\n\n if (sorted.length > mergedElements) {\n pending.push(...sorted.slice(mergedElements).map((l) => l.commitment));\n }\n\n const storedTree = await this.storage?.getMerkleTree?.(chainId);\n if (storedTree?.root) {\n state.root = MerkleEngine.normalizeHex32(storedTree.root, 'merkleTree.root');\n } else {\n const rootNode = await this.storage?.getMerkleNode?.(chainId, `${this.treeDepth}-0`);\n state.root = rootNode?.hash ?? getZeroHash(this.treeDepth);\n }\n } catch (error) {\n if (this.mode === 'hybrid') return;\n throw new SdkError('MERKLE', 'Failed to hydrate local merkle from storage', { chainId }, error);\n } finally {\n this.hydratedChains.add(chainId);\n this.hydrateInFlight.delete(chainId);\n }\n })();\n\n this.hydrateInFlight.set(chainId, task);\n return task;\n }\n\n private static normalizeHex32(value: unknown, name: string): Hex {\n try {\n const bi = BigInt(value as any);\n if (bi < 0n) throw new Error('negative');\n const hex = bi.toString(16).padStart(64, '0');\n if (hex.length > 64) throw new Error('too_large');\n return `0x${hex}` as Hex;\n } catch (error) {\n throw new SdkError('MERKLE', `Invalid ${name}`, { value }, error);\n }\n }\n\n /**\n * Feed contiguous (cid-ordered) memo leaves into the local merkle tree.\n *\n * This mirrors the client/app behavior: only after we have a full consecutive batch of 32 leaves\n * do we merge them into the main tree. Leaves that are still in the buffer do not get local proofs.\n */\n async ingestEntryMemos(chainId: number, memos: Array<{ cid: number | null; commitment: Hex | string | bigint }>) {\n if (this.mode === 'remote') return;\n await this.hydrateFromStorage(chainId);\n\n const state = this.ensureChainState(chainId);\n const pending = this.ensurePendingLeaves(chainId);\n\n const leaves = memos\n .filter((m): m is typeof m & { cid: number } => typeof m.cid === 'number' && Number.isInteger(m.cid) && m.cid >= 0)\n .map((m) => ({\n index: m.cid,\n commitment: MerkleEngine.normalizeHex32(m.commitment, 'memo.commitment'),\n }));\n if (!leaves.length) return;\n\n const sorted = [...leaves].sort((a, b) => a.index - b.index);\n const persistLeaves = sorted.map((l) => ({ cid: l.index, commitment: l.commitment }));\n void this.storage?.appendMerkleLeaves?.(chainId, persistLeaves).catch(() => undefined);\n\n try {\n let expected = state.mergedElements + pending.length;\n for (const leaf of sorted) {\n if (leaf.index < expected) continue; // already ingested/persisted\n if (leaf.index !== expected) {\n throw new Error(`Non-contiguous merkle leaves: expected index=${expected}, got index=${leaf.index}`);\n }\n pending.push(leaf.commitment);\n expected++;\n\n while (pending.length >= SUBTREE_SIZE) {\n const batch = pending.splice(0, SUBTREE_SIZE);\n const baseIndex = state.mergedElements;\n const subtree = MerkleEngine.buildSubtree(batch, baseIndex);\n const merged = await this.mergeSubtreeToMainTree({ chainId, subtreeRoot: subtree.subtreeRoot, newTotalElements: baseIndex + SUBTREE_SIZE });\n\n const nodes = [...subtree.nodesToStore, ...merged.nodesToStore].map((n) => ({ ...n, chainId }));\n await this.storage?.upsertMerkleNodes?.(chainId, nodes);\n\n state.mergedElements += SUBTREE_SIZE;\n state.root = merged.finalRoot;\n await this.storage?.setMerkleTree?.(chainId, {\n chainId,\n root: state.root,\n totalElements: state.mergedElements,\n lastUpdated: Date.now(),\n });\n }\n }\n this.hydratedChains.add(chainId);\n } catch (error) {\n if (this.mode === 'hybrid' && error instanceof Error && /Non-contiguous merkle leaves/i.test(error.message)) {\n return;\n }\n throw new SdkError('MERKLE', 'Failed to ingest local merkle leaves', { chainId, leafCount: leaves.length }, error);\n }\n }\n\n async getProofByCid(input: { chainId: number; cid: number; totalElements: bigint }): Promise<RemoteMerkleProofResponse> {\n return this.getProofByCids({ chainId: input.chainId, cids: [input.cid], totalElements: input.totalElements });\n }\n\n async getProofByCids(input: { chainId: number; cids: number[]; totalElements: bigint }): Promise<RemoteMerkleProofResponse> {\n const cids = [...input.cids];\n if (cids.length === 0) throw new SdkError('MERKLE', 'No cids provided', { chainId: input.chainId });\n for (const cid of cids) {\n if (!Number.isInteger(cid) || cid < 0) {\n throw new SdkError('MERKLE', 'Invalid cid', { chainId: input.chainId, cid });\n }\n }\n\n const totalElements = typeof input.totalElements === 'bigint' ? input.totalElements : BigInt(input.totalElements as any);\n const contractTreeElements = MerkleEngine.totalElementsInTree(totalElements);\n const needsTreeProof = cids.filter((cid) => cid < contractTreeElements);\n\n await this.hydrateFromStorage(input.chainId);\n\n const canUseLocal = this.mode !== 'remote';\n if (canUseLocal) {\n const tree = await this.storage?.getMerkleTree?.(input.chainId);\n const hasDb = typeof this.storage?.getMerkleLeaf === 'function' && typeof this.storage?.getMerkleNode === 'function' && typeof tree?.totalElements === 'number' && typeof tree?.root === 'string';\n\n if (hasDb && tree) {\n if (tree.totalElements < contractTreeElements) {\n if (this.mode === 'local') {\n throw new SdkError('MERKLE', 'Local merkle db is behind contract', {\n chainId: input.chainId,\n cids,\n localTotalElements: tree.totalElements,\n contractTreeElements,\n });\n }\n // hybrid fallback: remote proof service will be authoritative.\n } else {\n try {\n const proof = [];\n for (const cid of cids) {\n if (cid >= contractTreeElements) {\n proof.push({ leaf_index: cid, path: new Array(this.treeDepth + 1).fill('0') as any });\n continue;\n }\n const leaf = await this.storage!.getMerkleLeaf!(input.chainId, cid);\n if (!leaf) throw new Error(`missing_leaf:${cid}`);\n const path: Hex[] = [leaf.commitment];\n for (let level = 1; level <= this.treeDepth; level++) {\n const siblingIndex = (cid >> (level - 1)) ^ 1;\n if (level === 1) {\n const siblingLeaf = await this.storage!.getMerkleLeaf!(input.chainId, siblingIndex);\n path.push(siblingLeaf?.commitment ?? getZeroHash(0));\n continue;\n }\n const targetLevel = level - 1;\n const siblingNode = await this.storage!.getMerkleNode!(input.chainId, `${targetLevel}-${siblingIndex}`);\n path.push(siblingNode?.hash ?? getZeroHash(targetLevel));\n }\n proof.push({ leaf_index: cid, path });\n }\n return {\n proof,\n merkle_root: MerkleEngine.normalizeHex32(tree.root, 'merkleTree.root'),\n latest_cid: totalElements > 0n ? Number(totalElements - 1n) : -1,\n };\n } catch (error) {\n if (this.mode === 'local') {\n throw new SdkError('MERKLE', 'Local merkle proof build failed', { chainId: input.chainId, cids }, error);\n }\n // hybrid fallback: ignore and try remote proof server\n }\n }\n } else if (this.mode === 'local' && needsTreeProof.length) {\n throw new SdkError('MERKLE', 'Local merkle db unavailable', { chainId: input.chainId, cids, reason: 'missing_adapter_merkle_db' });\n }\n }\n\n // Remote fallback: only fetch proofs for leaves that are already merged into the main tree.\n // Leaves still sitting in the on-chain buffer do not have Merkle proofs yet.\n if (needsTreeProof.length === 0) {\n // We still need a stable root for witness generation.\n // If nothing has been merged into the tree yet, the root is the depth-level zero hash.\n const root = contractTreeElements === 0 ? getZeroHash(this.treeDepth) : await this.fetchRemoteRootOnly(input.chainId);\n return {\n proof: cids.map((cid) => ({ leaf_index: cid, path: new Array(this.treeDepth + 1).fill('0') as any })),\n merkle_root: root,\n latest_cid: totalElements > 0n ? Number(totalElements - 1n) : -1,\n };\n }\n\n const remote = await this.fetchRemoteProofFromService({ chainId: input.chainId, cids: needsTreeProof });\n let remoteIdx = 0;\n return {\n merkle_root: remote.merkle_root,\n latest_cid: remote.latest_cid,\n proof: cids.map((cid) => {\n if (cid >= contractTreeElements) return { leaf_index: cid, path: new Array(this.treeDepth + 1).fill('0') as any };\n const hit = remote.proof[remoteIdx++];\n if (!hit) throw new SdkError('MERKLE', 'Remote merkle proof entry missing', { chainId: input.chainId, cid });\n return hit;\n }),\n };\n }\n\n private async fetchRemoteRootOnly(chainId: number): Promise<Hex> {\n const remote = await this.fetchRemoteProofFromService({ chainId, cids: [0] });\n return MerkleEngine.normalizeHex32(remote.merkle_root, 'remote.merkle_root');\n }\n\n private async fetchRemoteProofFromService(input: { chainId: number; cids: number[] }): Promise<RemoteMerkleProofResponse> {\n const chain = this.getChain(input.chainId);\n if (!chain.merkleProofUrl) {\n throw new SdkError('CONFIG', `Chain ${input.chainId} missing merkleProofUrl`);\n }\n const client = new MerkleClient(chain.merkleProofUrl);\n return client.getProofByCids(input.cids);\n }\n\n buildAccMemberWitnesses(input: { remote: RemoteMerkleProofResponse; utxos: Array<{ commitment: Hex; mkIndex: number }>; arrayHash: bigint; totalElements: bigint }): AccMemberWitness[] {\n return input.utxos.map((utxo, idx) => {\n const remoteProof = input.remote.proof[idx];\n if (!remoteProof) {\n throw new SdkError('MERKLE', 'Missing merkle proof entry for utxo index', { index: idx });\n }\n return {\n root: toDecString(input.remote.merkle_root),\n path: remoteProof.path.map((p) => toDecString(p)),\n index: Number(remoteProof.leaf_index),\n };\n });\n }\n\n async buildInputSecretsFromUtxos(input: {\n remote: RemoteMerkleProofResponse;\n utxos: Array<{ commitment: Hex; memo?: Hex; mkIndex: number }>;\n ownerKeyPair: UserKeyPair;\n arrayHash: bigint;\n totalElements: bigint;\n maxInputs?: number;\n }): Promise<InputSecret[]> {\n if (!Array.isArray(input.utxos) || input.utxos.length === 0) {\n throw new SdkError('MERKLE', 'No utxos provided', { count: 0 });\n }\n const maxInputs = input.maxInputs == null ? undefined : Math.max(0, Math.floor(input.maxInputs));\n if (typeof maxInputs === 'number' && input.utxos.length > maxInputs) {\n throw new SdkError('MERKLE', 'Too many input utxos for circuit', { count: input.utxos.length, maxInputs });\n }\n const owner = input.ownerKeyPair;\n const secretKey = typeof owner.user_sk.address_sk === 'bigint' ? owner.user_sk.address_sk : BigInt(owner.user_sk.address_sk);\n const ownerAddress = KeyManager.userPkToAddress(owner.user_pk);\n const witnesses = this.buildAccMemberWitnesses({\n remote: input.remote,\n utxos: input.utxos,\n arrayHash: input.arrayHash,\n totalElements: input.totalElements,\n });\n\n const out: InputSecret[] = [];\n let valid = 0;\n for (let i = 0; i < input.utxos.length; i++) {\n const utxo = input.utxos[i]!;\n const witness = witnesses[i]!;\n if (!utxo.memo) {\n out.push(await this.bridge.createDummyInputSecret());\n continue;\n }\n const ro = MemoKit.decodeMemoForOwner({\n secretKey,\n memo: utxo.memo,\n expectedAddress: ownerAddress,\n });\n if (!ro) {\n throw new SdkError('MERKLE', 'Failed to decrypt utxo memo', { commitment: utxo.commitment });\n }\n valid++;\n out.push({\n owner_keypair: owner,\n ro,\n acc_member_witness: witness,\n });\n }\n if (valid === 0) {\n throw new SdkError('MERKLE', 'No valid utxo found (missing memos)', {\n count: input.utxos.length,\n commitments: input.utxos.map((u) => u.commitment),\n });\n }\n\n if (typeof maxInputs === 'number') {\n while (out.length < maxInputs) {\n out.push(await this.bridge.createDummyInputSecret());\n }\n }\n return out;\n }\n}\n","import { createPublicClient, http, type Address, type PublicClient } from 'viem';\nimport { App_ABI } from '../abi/app';\nimport { ERC20_ABI } from '../abi/erc20';\nimport type {\n AssetsApi,\n CommitmentData,\n Hex,\n MerkleApi,\n OpsApi,\n OperationCreateInput,\n PlannerApi,\n RelayerRequest,\n SdkErrorCode,\n SdkEvent,\n TransferMergePlan,\n TransferPlan,\n TokenMetadata,\n TransferWitnessInput,\n TxBuilderApi,\n UserKeyPair,\n UserPublicKey,\n WithdrawPlan,\n WithdrawWitnessInput,\n WalletApi,\n ZkpApi,\n} from '../types';\nimport { CryptoToolkit } from '../crypto/cryptoToolkit';\nimport { Utils } from '../utils';\nimport { MemoKit } from '../memo/memoKit';\nimport { SdkError } from '../errors';\nimport { RelayerClient } from './relayerClient';\nimport type { StorageAdapter } from '../types';\nimport { pickMerkleRootIndex } from './pickMerkleRootIndex';\nimport { isHexStrict } from '../utils/hex';\nimport { toBigintOrThrow } from '../utils/bigint';\n\nconst ARRAY_HASH_SIZE = 2048n;\nconst NATIVE_ADDRESS = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE' as const;\nconst isHex = (value: unknown): value is Hex => isHexStrict(value);\n\nconst toFrPointJson = (input: [string, string]) => ({ X: BigInt(input[0]), Y: BigInt(input[1]) });\nconst toViewerPkJson = (input: [string, string]) => ({ EncryptionKey: { Key: toFrPointJson(input) } });\nconst toFreezerPkJson = (input: [string, string]) => ({ Point: toFrPointJson(input) });\n\nconst buildTransferWitness = (input: { token: TokenMetadata; inputSecrets: any[]; outputs: any[]; array: any; relayerFee: bigint; proofBinding: string }): TransferWitnessInput => {\n const token = input.token;\n return {\n asset_id: token.id,\n asset_token_id: BigInt(token.wrappedErc20).toString(),\n asset_policy: {\n viewer_pk: toViewerPkJson(token.viewerPk),\n freezer_pk: toFreezerPkJson(token.freezerPk),\n },\n input_secrets: input.inputSecrets as any,\n array: input.array as any,\n fee: input.relayerFee,\n max_amount: token.transferMaxAmount\n ? toBigintOrThrow(token.transferMaxAmount, {\n code: 'CONFIG',\n name: 'token.transferMaxAmount',\n detail: { tokenId: token.id },\n })\n : 0n,\n output_record_openings: input.outputs as any,\n viewing_memo_randomness: Array.from(CryptoToolkit.viewingRandomness()),\n proof_binding: input.proofBinding,\n } as any;\n};\n\nconst buildWithdrawWitness = (input: {\n token: TokenMetadata;\n inputSecret: any;\n outputRecordOpening: any;\n array: any;\n burnAmount: bigint;\n relayerFee: bigint;\n gasDropValue: bigint;\n proofBinding: string;\n}): WithdrawWitnessInput => {\n const token = input.token;\n return {\n asset_id: token.id,\n asset_token_id: BigInt(token.wrappedErc20).toString(),\n asset_policy: {\n viewer_pk: toViewerPkJson(token.viewerPk),\n freezer_pk: toFreezerPkJson(token.freezerPk),\n },\n input_secret: input.inputSecret as any,\n output_record_opening: input.outputRecordOpening as any,\n array: input.array as any,\n amount: input.burnAmount,\n relayer_fee: input.relayerFee,\n gas_drop_value: input.gasDropValue,\n viewing_memo_randomness: Array.from(CryptoToolkit.viewingRandomness()),\n proof_binding: input.proofBinding,\n } as any;\n};\n\nexport class Ops implements OpsApi {\n private readonly publicClients = new Map<number, PublicClient>();\n\n constructor(\n private readonly assets: AssetsApi,\n private readonly planner: PlannerApi,\n private readonly merkle: MerkleApi,\n private readonly zkp: ZkpApi,\n private readonly tx: TxBuilderApi,\n private readonly wallet: Pick<WalletApi, 'markSpent'>,\n private readonly store?: Pick<StorageAdapter, 'createOperation' | 'updateOperation'>,\n private readonly emit?: (evt: SdkEvent) => void,\n ) {}\n\n private debug(scope: string, message: string, detail?: Record<string, unknown>) {\n this.emit?.({ type: 'debug', payload: { scope, message, detail } } as any);\n }\n\n private emitOperationUpdate(payload: Extract<SdkEvent, { type: 'operations:update' }>['payload']) {\n this.emit?.({ type: 'operations:update', payload } as SdkEvent);\n }\n\n private getPublicClient(chainId: number): PublicClient {\n const cached = this.publicClients.get(chainId);\n if (cached) return cached;\n const chain = this.assets.getChain(chainId);\n if (!chain?.rpcUrl) {\n throw new SdkError('CONFIG', `chain ${chainId} missing rpcUrl`, { chainId });\n }\n const client = createPublicClient({ transport: http(chain.rpcUrl) }) as PublicClient;\n this.publicClients.set(chainId, client);\n return client;\n }\n\n private async timed<T>(scope: string, label: string, detail: Record<string, unknown>, fn: () => Promise<T>): Promise<T> {\n const startedAt = Date.now();\n this.debug(scope, `${label}:start`, detail);\n try {\n const result = await fn();\n this.debug(scope, `${label}:done`, { ...detail, costMs: Date.now() - startedAt });\n return result;\n } catch (error) {\n this.debug(scope, `${label}:error`, {\n ...detail,\n costMs: Date.now() - startedAt,\n error: error instanceof Error ? { name: error.name, message: error.message } : { message: String(error) },\n });\n throw error;\n }\n }\n\n private updateOperation(operationId: string | undefined, patch: Parameters<StorageAdapter['updateOperation']>[1]) {\n if (!operationId) return;\n try {\n this.store?.updateOperation(operationId, patch);\n this.emitOperationUpdate({ action: 'update', operationId, patch });\n } catch {\n // ignore operation store errors\n }\n }\n\n private async stage<T>(code: SdkErrorCode, message: string, detail: Record<string, unknown>, fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n if (error instanceof SdkError) throw error;\n throw new SdkError(code, message, detail, error);\n }\n }\n\n private async prepareTransferFromPlan(input: { plan: TransferPlan; ownerKeyPair: UserKeyPair; publicClient: PublicClient }) {\n const scope = 'ops:prepareTransfer';\n const chain = this.assets.getChain(input.plan.chainId);\n if (!chain.ocashContractAddress) {\n throw new SdkError('CONFIG', `chain ${input.plan.chainId} missing ocashContractAddress`, { chainId: input.plan.chainId });\n }\n const contractAddress = chain.ocashContractAddress;\n\n const selected = input.plan.selectedInputs;\n if (!Array.isArray(selected) || !selected.length) {\n throw new SdkError('CONFIG', 'planner returned no selectedInputs', { chainId: input.plan.chainId, assetId: input.plan.assetId });\n }\n const token = input.plan.token as TokenMetadata;\n const relayerFee = BigInt(input.plan.relayerFee ?? 0n);\n const extraData = input.plan.extraData;\n const outputs = input.plan.outputs;\n const proofBinding = input.plan.proofBinding as string;\n\n const [array, digest, totalElements] = await this.timed(scope, 'readContract.state', { chainId: input.plan.chainId, contract: contractAddress }, () =>\n this.stage('CONFIG', 'prepareTransfer failed to read contract state', { chainId: input.plan.chainId, contract: contractAddress }, () =>\n Promise.all([\n input.publicClient.readContract({ address: contractAddress, abi: App_ABI, functionName: 'getArray', args: [] }),\n input.publicClient.readContract({ address: contractAddress, abi: App_ABI, functionName: 'digest', args: [] }),\n input.publicClient.readContract({\n address: contractAddress,\n abi: App_ABI,\n functionName: 'totalElements',\n args: [],\n }),\n ]),\n ),\n );\n\n const digestArrayHash = Array.isArray(digest) ? (digest as any)[1] : (digest as any)?.[1];\n const arrayHash = toBigintOrThrow(digestArrayHash, {\n code: 'CONFIG',\n name: 'digest[1] (array hash)',\n detail: { chainId: input.plan.chainId, contractAddress },\n });\n const totalElementsBig = toBigintOrThrow(totalElements, {\n code: 'CONFIG',\n name: 'totalElements',\n detail: { chainId: input.plan.chainId, contractAddress },\n });\n const arrayHashIndex = totalElementsBig > 0n ? Math.max(0, Number((((totalElementsBig - 1n) % ARRAY_HASH_SIZE) + ARRAY_HASH_SIZE) % ARRAY_HASH_SIZE)) : 0;\n\n const remote = await this.timed(scope, 'merkle.getProofByCids', { chainId: input.plan.chainId, cids: selected.map((u) => u.mkIndex) }, () =>\n this.stage('MERKLE', 'prepareTransfer merkle proof fetch failed', { chainId: input.plan.chainId, cids: selected.map((u) => u.mkIndex) }, () =>\n this.merkle.getProofByCids({ chainId: input.plan.chainId, cids: selected.map((u) => u.mkIndex), totalElements: totalElementsBig }),\n ),\n );\n const totalElementsInProof = (remote.latest_cid ?? 0) + 1;\n const mkRootIndex = this.merkle.currentMerkleRootIndex(totalElementsInProof);\n const merkleRootIndex = await this.timed(scope, 'pickMerkleRootIndex', { chainId: input.plan.chainId, currentIndex: mkRootIndex }, () =>\n this.stage('MERKLE', 'prepareTransfer failed to pick merkle root index', { chainId: input.plan.chainId, currentIndex: mkRootIndex }, () =>\n pickMerkleRootIndex({\n chainId: input.plan.chainId,\n publicClient: input.publicClient,\n contractAddress,\n currentIndex: mkRootIndex,\n remoteMerkleRoot: remote.merkle_root,\n onDebug: (event) => this.debug(scope, `pickMerkleRootIndex:${event.message}`, event.detail),\n }),\n ),\n );\n\n const witnessInputSecrets = await this.timed(scope, 'merkle.buildInputSecretsFromUtxos', { chainId: input.plan.chainId, count: selected.length }, () =>\n this.stage('WITNESS', 'prepareTransfer failed to build input secrets', { chainId: input.plan.chainId, count: selected.length }, () =>\n this.merkle.buildInputSecretsFromUtxos({\n remote,\n utxos: selected,\n ownerKeyPair: input.ownerKeyPair,\n arrayHash,\n totalElements: totalElementsBig,\n maxInputs: 3,\n }),\n ),\n );\n\n const witness = buildTransferWitness({\n token,\n inputSecrets: witnessInputSecrets,\n outputs: [...outputs],\n array,\n relayerFee,\n proofBinding,\n });\n\n const proof = await this.timed(scope, 'zkp.proveTransfer', { chainId: input.plan.chainId }, () =>\n this.stage('PROOF', 'prepareTransfer proof failed', { chainId: input.plan.chainId }, () =>\n this.zkp.proveTransfer(witness, {\n merkle_root_index: merkleRootIndex,\n array_hash_index: arrayHashIndex,\n relayer: input.plan.relayer,\n extra_data: extraData,\n }),\n ),\n );\n\n const request = await this.timed(scope, 'tx.buildTransferCalldata', { chainId: input.plan.chainId }, () =>\n this.stage('CONFIG', 'prepareTransfer tx request build failed', { chainId: input.plan.chainId }, () => this.tx.buildTransferCalldata({ chainId: input.plan.chainId, proof })),\n );\n this.debug(scope, 'done', { chainId: input.plan.chainId });\n return {\n plan: input.plan,\n witness,\n proof,\n request,\n meta: { arrayHashIndex, merkleRootIndex: merkleRootIndex, relayer: input.plan.relayer },\n };\n }\n\n async prepareTransfer(input: { chainId: number; assetId: string; amount: bigint; to: Hex; ownerKeyPair: UserKeyPair; publicClient: PublicClient; relayerUrl?: string; autoMerge?: boolean }) {\n const scope = 'ops:prepareTransfer';\n this.debug(scope, 'start', { chainId: input.chainId, assetId: input.assetId, to: input.to });\n const chain = this.assets.getChain(input.chainId);\n if (!chain.ocashContractAddress) {\n throw new SdkError('CONFIG', `chain ${input.chainId} missing ocashContractAddress`, { chainId: input.chainId });\n }\n const relayerUrl = input.relayerUrl ?? chain.relayerUrl;\n if (!relayerUrl) throw new SdkError('CONFIG', `chain ${input.chainId} missing relayerUrl`, { chainId: input.chainId });\n\n const plan = await this.timed(scope, 'planner.plan', { chainId: input.chainId, assetId: input.assetId, relayerUrl }, () =>\n this.stage('CONFIG', 'prepareTransfer planner failed', { chainId: input.chainId, assetId: input.assetId }, () =>\n this.planner.plan({\n action: 'transfer',\n chainId: input.chainId,\n assetId: input.assetId,\n amount: input.amount,\n to: input.to,\n relayerUrl,\n autoMerge: input.autoMerge,\n }),\n ),\n );\n const planAction = plan?.action;\n if (planAction && planAction !== 'transfer' && planAction !== 'transfer-merge') {\n throw new SdkError('CONFIG', 'planner returned non-transfer plan', { chainId: input.chainId, assetId: input.assetId, action: planAction });\n }\n\n if (planAction === 'transfer-merge') {\n const typedPlan = plan as TransferMergePlan;\n const prepared = await this.prepareTransferFromPlan({\n plan: typedPlan.mergePlan,\n ownerKeyPair: input.ownerKeyPair,\n publicClient: input.publicClient,\n });\n return {\n kind: 'merge' as const,\n plan: typedPlan,\n merge: prepared,\n nextInput: {\n chainId: input.chainId,\n assetId: input.assetId,\n amount: input.amount,\n to: input.to,\n relayerUrl,\n autoMerge: input.autoMerge,\n },\n };\n }\n\n const typedPlan = plan as TransferPlan;\n const prepared = await this.prepareTransferFromPlan({\n plan: typedPlan,\n ownerKeyPair: input.ownerKeyPair,\n publicClient: input.publicClient,\n });\n return { kind: 'transfer' as const, ...prepared };\n }\n\n async prepareWithdraw(input: {\n chainId: number;\n assetId: string;\n amount: bigint;\n recipient: Address;\n ownerKeyPair: UserKeyPair;\n publicClient: PublicClient;\n gasDropValue?: bigint;\n relayerUrl?: string;\n }) {\n const scope = 'ops:prepareWithdraw';\n this.debug(scope, 'start', { chainId: input.chainId, assetId: input.assetId, recipient: input.recipient });\n const chain = this.assets.getChain(input.chainId);\n if (!chain.ocashContractAddress) {\n throw new SdkError('CONFIG', `chain ${input.chainId} missing ocashContractAddress`, { chainId: input.chainId });\n }\n const relayerUrl = input.relayerUrl ?? chain.relayerUrl;\n if (!relayerUrl) throw new SdkError('CONFIG', `chain ${input.chainId} missing relayerUrl`, { chainId: input.chainId });\n const contractAddress = chain.ocashContractAddress;\n\n const gasDropValue = input.gasDropValue ?? 0n;\n\n const plan = await this.timed(scope, 'planner.plan', { chainId: input.chainId, assetId: input.assetId, relayerUrl }, () =>\n this.stage('CONFIG', 'prepareWithdraw planner failed', { chainId: input.chainId, assetId: input.assetId }, () =>\n this.planner.plan({\n action: 'withdraw',\n chainId: input.chainId,\n assetId: input.assetId,\n amount: input.amount,\n recipient: input.recipient,\n gasDropValue,\n relayerUrl,\n }),\n ),\n );\n const planAction = (plan as any)?.action;\n if (planAction && planAction !== 'withdraw') {\n throw new SdkError('CONFIG', 'planner returned non-withdraw plan', { chainId: input.chainId, assetId: input.assetId, action: planAction });\n }\n\n const typedPlan = plan as WithdrawPlan;\n const token = typedPlan.token as TokenMetadata;\n const relayerFee = BigInt(typedPlan.relayerFee ?? 0n);\n const burnAmount = BigInt(typedPlan.burnAmount ?? input.amount);\n const utxo = typedPlan.selectedInput as any;\n if (!utxo) {\n throw new SdkError('CONFIG', 'planner returned no selectedInput', {\n chainId: input.chainId,\n assetId: input.assetId,\n burnAmount: burnAmount.toString(),\n });\n }\n\n const outputRo = typedPlan.outputRecordOpening as any;\n const extraData = typedPlan.extraData as any;\n const proofBinding = typedPlan.proofBinding as string;\n\n const [array, digest, totalElements] = await this.timed(scope, 'readContract.state', { chainId: input.chainId, contract: contractAddress }, () =>\n this.stage('CONFIG', 'prepareWithdraw failed to read contract state', { chainId: input.chainId, contract: contractAddress }, () =>\n Promise.all([\n (input.publicClient.readContract as any)({ address: contractAddress, abi: App_ABI as any, functionName: 'getArray', args: [] }),\n (input.publicClient.readContract as any)({ address: contractAddress, abi: App_ABI as any, functionName: 'digest', args: [] }),\n (input.publicClient.readContract as any)({\n address: contractAddress,\n abi: App_ABI as any,\n functionName: 'totalElements',\n args: [],\n }),\n ]),\n ),\n );\n const digestArrayHash = Array.isArray(digest) ? (digest as any)[1] : (digest as any)?.[1];\n const arrayHash = toBigintOrThrow(digestArrayHash, {\n code: 'CONFIG',\n name: 'digest[1] (array hash)',\n detail: { chainId: input.chainId, contractAddress },\n });\n const totalElementsBig = toBigintOrThrow(totalElements, {\n code: 'CONFIG',\n name: 'totalElements',\n detail: { chainId: input.chainId, contractAddress },\n });\n const arrayHashIndex = totalElementsBig > 0n ? Math.max(0, Number((((totalElementsBig - 1n) % ARRAY_HASH_SIZE) + ARRAY_HASH_SIZE) % ARRAY_HASH_SIZE)) : 0;\n\n const remote = await this.timed(scope, 'merkle.getProofByCids', { chainId: input.chainId, cids: [utxo.mkIndex] }, () =>\n this.stage('MERKLE', 'prepareWithdraw merkle proof fetch failed', { chainId: input.chainId, cids: [utxo.mkIndex] }, () =>\n this.merkle.getProofByCids({ chainId: input.chainId, cids: [utxo.mkIndex], totalElements: totalElementsBig }),\n ),\n );\n const totalElementsInProof = (remote.latest_cid ?? 0) + 1;\n const mkRootIndex = this.merkle.currentMerkleRootIndex(totalElementsInProof);\n const merkleRootIndex = await this.timed(scope, 'pickMerkleRootIndex', { chainId: input.chainId, currentIndex: mkRootIndex }, () =>\n this.stage('MERKLE', 'prepareWithdraw failed to pick merkle root index', { chainId: input.chainId, currentIndex: mkRootIndex }, () =>\n pickMerkleRootIndex({\n chainId: input.chainId,\n publicClient: input.publicClient,\n contractAddress,\n currentIndex: mkRootIndex,\n remoteMerkleRoot: remote.merkle_root,\n onDebug: (event) => this.debug(scope, `pickMerkleRootIndex:${event.message}`, event.detail),\n }),\n ),\n );\n\n const [inputSecret] = await this.timed(scope, 'merkle.buildInputSecretsFromUtxos', { chainId: input.chainId, assetId: input.assetId }, () =>\n this.stage('WITNESS', 'prepareWithdraw failed to build input secrets', { chainId: input.chainId, assetId: input.assetId }, () =>\n this.merkle.buildInputSecretsFromUtxos({\n remote,\n utxos: [utxo],\n ownerKeyPair: input.ownerKeyPair,\n arrayHash,\n totalElements: totalElementsBig,\n }),\n ),\n );\n if (!inputSecret) {\n throw new SdkError('WITNESS', 'failed to build inputSecret', { chainId: input.chainId, assetId: input.assetId });\n }\n\n const witness = buildWithdrawWitness({\n token,\n inputSecret,\n outputRecordOpening: outputRo,\n array,\n burnAmount,\n relayerFee,\n gasDropValue,\n proofBinding,\n });\n\n const proof = await this.timed(scope, 'zkp.proveWithdraw', { chainId: input.chainId }, () =>\n this.stage('PROOF', 'prepareWithdraw proof failed', { chainId: input.chainId }, () =>\n this.zkp.proveWithdraw(witness as any, {\n merkle_root_index: merkleRootIndex,\n array_hash_index: arrayHashIndex,\n relayer: typedPlan.relayer,\n recipient: input.recipient,\n withdraw_amount: burnAmount,\n relayer_fee: relayerFee,\n gas_drop_value: gasDropValue,\n extra_data: extraData,\n }),\n ),\n );\n\n const request = await this.timed(scope, 'tx.buildWithdrawCalldata', { chainId: input.chainId }, () =>\n this.stage('CONFIG', 'prepareWithdraw tx request build failed', { chainId: input.chainId }, () => this.tx.buildWithdrawCalldata({ chainId: input.chainId, proof })),\n );\n this.debug(scope, 'done', { chainId: input.chainId });\n return {\n plan: typedPlan,\n witness,\n proof,\n request,\n meta: { arrayHashIndex, merkleRootIndex: merkleRootIndex, relayer: typedPlan.relayer },\n };\n }\n\n private buildOperationFromPlan(plan: TransferPlan | WithdrawPlan): OperationCreateInput {\n if (plan.action === 'transfer') {\n const inputCommitments = plan.selectedInputs.map((u) => u.commitment);\n const outputCommitments = plan.outputs.filter((o) => o.asset_amount > 0n).map((o) => CryptoToolkit.commitment(o, 'hex') as Hex);\n return {\n type: 'transfer',\n chainId: plan.chainId,\n tokenId: plan.assetId,\n detail: {\n token: plan.token.symbol,\n amount: plan.requestedAmount.toString(),\n fee: plan.relayerFee.toString(),\n relayerFeeTotal: plan.feeSummary.relayerFeeTotal.toString(),\n protocolFeeTotal: plan.feeSummary.protocolFeeTotal.toString(),\n mergeCount: plan.feeSummary.mergeCount,\n feeCount: plan.feeSummary.feeCount,\n to: plan.to,\n inputCommitments,\n outputCommitments,\n },\n };\n }\n\n const inputCommitments = [plan.selectedInput.commitment];\n const outputCommitments = plan.outputRecordOpening.asset_amount > 0n ? [CryptoToolkit.commitment(plan.outputRecordOpening, 'hex') as Hex] : [];\n return {\n type: 'withdraw',\n chainId: plan.chainId,\n tokenId: plan.assetId,\n detail: {\n token: plan.token.symbol,\n amount: plan.requestedAmount.toString(),\n burnAmount: plan.burnAmount.toString(),\n protocolFee: plan.protocolFee.toString(),\n relayerFee: plan.relayerFee.toString(),\n relayerFeeTotal: plan.feeSummary.relayerFeeTotal.toString(),\n protocolFeeTotal: plan.feeSummary.protocolFeeTotal.toString(),\n mergeCount: plan.feeSummary.mergeCount,\n feeCount: plan.feeSummary.feeCount,\n recipient: plan.recipient,\n inputCommitments,\n outputCommitments,\n },\n };\n }\n\n async submitRelayerRequest<T = unknown>(input: {\n prepared: { plan: TransferPlan | WithdrawPlan; request: RelayerRequest; kind?: 'transfer' | 'merge' };\n relayerUrl?: string;\n signal?: AbortSignal;\n operationId?: string;\n operation?: OperationCreateInput;\n publicClient?: PublicClient;\n relayerTimeoutMs?: number;\n relayerIntervalMs?: number;\n receiptTimeoutMs?: number;\n receiptPollIntervalMs?: number;\n confirmations?: number;\n }): Promise<{\n result: T;\n operationId?: string;\n updateOperation: (patch: Parameters<StorageAdapter['updateOperation']>[1]) => void;\n waitRelayerTxHash: Promise<Hex>;\n transactionReceipt?: Promise<Awaited<ReturnType<PublicClient['waitForTransactionReceipt']>>>;\n }> {\n const prepared = input.prepared;\n if (prepared?.kind === 'merge') {\n throw new SdkError('CONFIG', 'submitRelayerRequest does not accept merge plan; submit merge request first', { action: 'transfer-merge' });\n }\n\n const plan = prepared?.plan;\n const relayerUrl = input.relayerUrl ?? plan?.relayerUrl ?? (plan ? this.assets.getChain(plan.chainId).relayerUrl : undefined);\n if (!relayerUrl) {\n const chainId = plan?.chainId;\n throw new SdkError('CONFIG', `chain ${chainId ?? 'unknown'} missing relayerUrl`, { chainId });\n }\n const request = prepared.request;\n const client = new RelayerClient(relayerUrl);\n const requestUrl = `${relayerUrl.replace(/\\/$/, '')}${request.path}`;\n\n let operationId = input.operationId;\n const operation = input.operation ?? (plan ? this.buildOperationFromPlan(plan) : undefined);\n if (!operationId && operation) {\n const created = this.store?.createOperation(operation as any);\n if (created) this.emitOperationUpdate({ action: 'create', operation: created });\n operationId = created?.id ?? operationId;\n }\n try {\n const result = await client.submit<T>(request, { signal: input.signal });\n this.updateOperation(operationId, {\n status: 'submitted',\n requestUrl,\n relayerTxHash: isHex(result) ? (result as Hex) : undefined,\n });\n const updateOperation = (patch: Parameters<StorageAdapter['updateOperation']>[1]) => {\n this.updateOperation(operationId, patch);\n };\n const waitRelayerTxHash = (() => {\n const relayerTxHash = isHex(result) ? (result as Hex) : undefined;\n if (!relayerTxHash) {\n return Promise.reject(new SdkError('RELAYER', 'relayerTxHash unavailable', { relayerUrl, requestUrl }));\n }\n return this.waitRelayerTxHash({\n relayerUrl,\n relayerTxHash,\n timeoutMs: input.relayerTimeoutMs,\n intervalMs: input.relayerIntervalMs,\n signal: input.signal,\n operationId,\n requestUrl,\n });\n })();\n waitRelayerTxHash.catch(() => {});\n const receiptClient = input.publicClient ?? (plan ? this.getPublicClient(plan.chainId) : undefined);\n const transactionReceipt = receiptClient\n ? waitRelayerTxHash.then((txHash) =>\n this.waitForTransactionReceipt({\n publicClient: receiptClient,\n txHash,\n timeoutMs: input.receiptTimeoutMs,\n pollIntervalMs: input.receiptPollIntervalMs,\n confirmations: input.confirmations,\n operationId,\n }),\n )\n : undefined;\n const planForReceipt = plan as TransferPlan | WithdrawPlan | undefined;\n let autoMarkReceipt = transactionReceipt;\n if (transactionReceipt && planForReceipt) {\n const getNullifiers = (planInput: TransferPlan | WithdrawPlan) => {\n if (planInput.action === 'transfer') {\n return planInput.selectedInputs.map((u) => u.nullifier);\n }\n const nullifier = planInput.selectedInput?.nullifier;\n return nullifier ? [nullifier] : [];\n };\n autoMarkReceipt = transactionReceipt.then(async (receipt) => {\n if (receipt?.status === 'success') {\n const nullifiers = getNullifiers(planForReceipt);\n if (nullifiers.length) {\n try {\n await this.wallet.markSpent({ chainId: planForReceipt.chainId, nullifiers });\n } catch (error) {\n this.debug('ops:autoMarkSpent', 'markSpent failed', {\n chainId: planForReceipt.chainId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n return receipt;\n });\n }\n transactionReceipt?.catch(() => {});\n autoMarkReceipt?.catch(() => {});\n return {\n result,\n operationId,\n updateOperation,\n waitRelayerTxHash,\n transactionReceipt: autoMarkReceipt,\n };\n } catch (error) {\n if (error instanceof SdkError) {\n if (error.code === 'RELAYER') {\n this.updateOperation(operationId, { status: 'failed', error: error.message, requestUrl });\n throw new SdkError('RELAYER', error.message, { ...(error.detail as any), relayerUrl, request }, error);\n }\n this.updateOperation(operationId, { status: 'failed', error: error.message, requestUrl });\n throw error;\n }\n this.updateOperation(operationId, {\n status: 'failed',\n error: error instanceof Error ? error.message : String(error),\n requestUrl,\n });\n throw new SdkError('RELAYER', 'Relayer request failed', { relayerUrl, request }, error);\n }\n }\n\n async prepareDeposit(input: { chainId: number; assetId: string; amount: bigint; ownerPublicKey: UserPublicKey; account: Address; publicClient: PublicClient }): Promise<{\n chainId: number;\n assetId: string;\n amount: bigint;\n token: TokenMetadata;\n recordOpening: CommitmentData;\n memo: Hex;\n protocolFee: bigint;\n payAmount: bigint;\n depositRelayerFee: bigint;\n value: bigint;\n approveNeeded: boolean;\n approveRequest?: {\n chainId: number;\n address: Address;\n abi: any;\n functionName: 'approve';\n args: [Address, bigint];\n };\n depositRequest: {\n chainId: number;\n address: Address;\n abi: any;\n functionName: 'deposit';\n args: [bigint, bigint, [bigint, bigint], bigint, Hex];\n value: bigint;\n };\n }> {\n const chain = this.assets.getChain(input.chainId);\n if (!chain.ocashContractAddress) {\n throw new SdkError('CONFIG', `chain ${input.chainId} missing ocashContractAddress`, { chainId: input.chainId });\n }\n const contractAddress = chain.ocashContractAddress;\n\n const token = this.assets.getPoolInfo(input.chainId, input.assetId);\n if (!token) {\n throw new SdkError('CONFIG', `token ${input.assetId} not found in chain ${input.chainId}`, {\n chainId: input.chainId,\n assetId: input.assetId,\n });\n }\n\n const protocolFee = Utils.calcDepositFee(input.amount, token.depositFeeBps);\n const payAmount = input.amount + protocolFee;\n\n const depositRelayerFee = (await this.stage(\n 'CONFIG',\n 'prepareDeposit failed to read depositRelayerFee',\n { chainId: input.chainId, contract: contractAddress },\n () =>\n (input.publicClient.readContract as any)({\n address: contractAddress,\n abi: App_ABI as any,\n functionName: 'depositRelayerFee',\n args: [],\n }) as any,\n )) as unknown as bigint;\n\n const userAddress = input.ownerPublicKey.user_pk.user_address;\n const userPK: [bigint, bigint] = [BigInt(userAddress[0]), BigInt(userAddress[1])];\n\n const recordOpening = CryptoToolkit.createRecordOpening({\n asset_id: BigInt(token.id),\n asset_amount: input.amount,\n user_pk: { user_address: userPK },\n });\n\n const memo = MemoKit.createMemo(recordOpening);\n\n const isNative = token.wrappedErc20.toLowerCase() === NATIVE_ADDRESS.toLowerCase();\n const value = isNative ? payAmount + depositRelayerFee : depositRelayerFee;\n\n const depositArgs: [bigint, bigint, [bigint, bigint], bigint, Hex] = [BigInt(token.id), input.amount, userPK, recordOpening.blinding_factor, memo];\n\n const depositRequest = {\n chainId: input.chainId,\n address: contractAddress,\n abi: App_ABI as any,\n functionName: 'deposit' as const,\n args: depositArgs,\n value,\n };\n\n if (isNative) {\n return {\n chainId: input.chainId,\n assetId: input.assetId,\n amount: input.amount,\n token,\n recordOpening,\n memo,\n protocolFee,\n payAmount,\n depositRelayerFee,\n value,\n approveNeeded: false,\n depositRequest,\n };\n }\n\n const allowance = (await this.stage(\n 'CONFIG',\n 'prepareDeposit failed to read ERC20 allowance',\n { chainId: input.chainId, token: token.wrappedErc20, account: input.account, spender: contractAddress },\n () =>\n (input.publicClient.readContract as any)({\n address: token.wrappedErc20,\n abi: ERC20_ABI as any,\n functionName: 'allowance',\n args: [input.account, contractAddress],\n }) as any,\n )) as unknown as bigint;\n\n const approveNeeded = allowance < payAmount;\n const approveRequest = approveNeeded\n ? {\n chainId: input.chainId,\n address: token.wrappedErc20,\n abi: ERC20_ABI as any,\n functionName: 'approve' as const,\n args: [contractAddress, payAmount] as [Address, bigint],\n }\n : undefined;\n\n return {\n chainId: input.chainId,\n assetId: input.assetId,\n amount: input.amount,\n token,\n recordOpening,\n memo,\n protocolFee,\n payAmount,\n depositRelayerFee,\n value,\n approveNeeded,\n approveRequest,\n depositRequest,\n };\n }\n\n async submitDeposit(input: {\n prepared: Awaited<ReturnType<Ops['prepareDeposit']>>;\n walletClient: { writeContract: (request: { address: Address; abi: any; functionName: string; args: any; value?: bigint; chainId?: number }) => Promise<Hex> };\n publicClient: PublicClient;\n autoApprove?: boolean;\n confirmations?: number;\n operationId?: string;\n }): Promise<{ txHash: Hex; approveTxHash?: Hex; receipt?: Awaited<ReturnType<PublicClient['waitForTransactionReceipt']>>; operationId?: string }> {\n const prepared = input.prepared;\n const outputCommitments = [CryptoToolkit.commitment(prepared.recordOpening, 'hex') as Hex];\n let operationId = input.operationId;\n if (!operationId) {\n const created = this.store?.createOperation({\n type: 'deposit',\n chainId: prepared.chainId,\n tokenId: prepared.assetId,\n detail: {\n token: prepared.token.symbol,\n amount: prepared.amount.toString(),\n protocolFee: prepared.protocolFee.toString(),\n depositRelayerFee: prepared.depositRelayerFee.toString(),\n outputCommitments,\n },\n } as any);\n if (created) this.emitOperationUpdate({ action: 'create', operation: created });\n operationId = created?.id ?? operationId;\n }\n\n let approveTxHash: Hex | undefined;\n if (input.autoApprove && prepared.approveNeeded && prepared.approveRequest) {\n approveTxHash = await input.walletClient.writeContract(prepared.approveRequest as any);\n await input.publicClient.waitForTransactionReceipt({ hash: approveTxHash });\n }\n\n const txHash = await input.walletClient.writeContract(prepared.depositRequest as any);\n this.updateOperation(operationId, { status: 'submitted', txHash });\n\n const receipt = await input.publicClient.waitForTransactionReceipt({\n hash: txHash,\n confirmations: input.confirmations,\n });\n this.updateOperation(operationId, { status: receipt.status === 'success' ? 'confirmed' : 'failed' });\n\n return { txHash, approveTxHash, receipt, operationId };\n }\n\n async waitRelayerTxHash(input: { relayerUrl: string; relayerTxHash: Hex; timeoutMs?: number; intervalMs?: number; signal?: AbortSignal; operationId?: string; requestUrl?: string }): Promise<Hex> {\n const timeoutMs = input.timeoutMs ?? 120_000;\n const intervalMs = input.intervalMs ?? 2_000;\n const client = new RelayerClient(input.relayerUrl);\n const requestUrl = input.requestUrl ?? input.relayerUrl;\n const startedAt = Date.now();\n while (Date.now() - startedAt < timeoutMs) {\n if (input.signal?.aborted) {\n this.updateOperation(input.operationId, { status: 'failed', error: 'waitRelayerTxHash aborted', requestUrl });\n throw new SdkError('RELAYER', 'waitRelayerTxHash aborted', { relayerUrl: input.relayerUrl, relayerTxHash: input.relayerTxHash }, (input.signal as any).reason);\n }\n let txhash: Hex | null;\n try {\n txhash = await client.getTxHash({ relayerTxHash: input.relayerTxHash, signal: input.signal });\n } catch (error) {\n this.updateOperation(input.operationId, {\n status: 'failed',\n error: error instanceof Error ? error.message : 'waitRelayerTxHash polling failed',\n requestUrl,\n });\n throw new SdkError('RELAYER', 'waitRelayerTxHash polling failed', { relayerUrl: input.relayerUrl, relayerTxHash: input.relayerTxHash }, error);\n }\n if (txhash) {\n this.updateOperation(input.operationId, { status: 'submitted', txHash: txhash, requestUrl });\n return txhash;\n }\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n this.updateOperation(input.operationId, { status: 'failed', error: 'waitRelayerTxHash timeout', requestUrl });\n throw new SdkError('RELAYER', 'waitRelayerTxHash timeout', { relayerUrl: input.relayerUrl, relayerTxHash: input.relayerTxHash });\n }\n\n async waitForTransactionReceipt(input: {\n publicClient: PublicClient;\n txHash: Hex;\n timeoutMs?: number;\n pollIntervalMs?: number;\n confirmations?: number;\n operationId?: string;\n }): Promise<Awaited<ReturnType<PublicClient['waitForTransactionReceipt']>>> {\n try {\n const receipt = await input.publicClient.waitForTransactionReceipt({\n hash: input.txHash,\n timeout: input.timeoutMs,\n pollingInterval: input.pollIntervalMs,\n confirmations: input.confirmations,\n });\n if (receipt.status === 'success') {\n this.updateOperation(input.operationId, { status: 'confirmed', txHash: input.txHash });\n } else {\n this.updateOperation(input.operationId, { status: 'failed', txHash: input.txHash, error: 'transaction reverted' });\n }\n return receipt;\n } catch (error) {\n this.updateOperation(input.operationId, {\n status: 'failed',\n txHash: input.txHash,\n error: error instanceof Error ? error.message : 'waitForTransactionReceipt failed',\n });\n throw new SdkError('RELAYER', 'waitForTransactionReceipt failed', { txHash: input.txHash }, error);\n }\n }\n}\n","import type { Hex, RelayerRequest } from '../types';\nimport { SdkError } from '../errors';\nimport { isHexStrict } from '../utils/hex';\nimport { signalTimeout, signalAny } from '../utils/signal';\nimport { joinUrl } from '../utils/url';\n\ntype ApiResponse<T> = { code?: number; message?: string; user_message?: string; data?: T };\n\nconst DEFAULT_RELAYER_REQUEST_TIMEOUT_MS = 60_000;\n\nexport class RelayerClient {\n constructor(private readonly baseUrl: string) {}\n\n async submit<T = unknown>(request: RelayerRequest, options?: { signal?: AbortSignal; requestTimeoutMs?: number }): Promise<T> {\n const url = joinUrl(this.baseUrl, request.path);\n const requestTimeoutMs = options?.requestTimeoutMs ?? DEFAULT_RELAYER_REQUEST_TIMEOUT_MS;\n const signal = signalAny([options?.signal, signalTimeout(requestTimeoutMs)]);\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(request.body),\n signal,\n });\n if (!res.ok) {\n throw new SdkError('RELAYER', 'Relayer request failed', { status: res.status, method: 'POST', url });\n }\n const payload = (await res.json()) as ApiResponse<T>;\n if (payload?.code) {\n throw new SdkError('RELAYER', payload.user_message || payload.message || 'Relayer request failed', payload);\n }\n return payload.data as T;\n }\n\n async getTxHash(input: { relayerTxHash: Hex; signal?: AbortSignal; requestTimeoutMs?: number }): Promise<Hex | null> {\n const url = new URL(joinUrl(this.baseUrl, '/api/v1/txhash'));\n url.searchParams.set('txhash', input.relayerTxHash);\n const requestTimeoutMs = input.requestTimeoutMs ?? DEFAULT_RELAYER_REQUEST_TIMEOUT_MS;\n const signal = signalAny([input.signal, signalTimeout(requestTimeoutMs)]);\n const res = await fetch(url.toString(), { signal });\n if (!res.ok) {\n throw new SdkError('RELAYER', 'Relayer txhash request failed', { status: res.status, method: 'GET', url: url.toString() });\n }\n const payload = (await res.json()) as ApiResponse<Hex>;\n if (payload?.code) {\n throw new SdkError('RELAYER', payload.user_message || payload.message || 'Relayer request failed', payload);\n }\n if (payload.data == null) return null;\n if (!isHexStrict(payload.data, { minBytes: 1 })) {\n throw new SdkError('RELAYER', 'Invalid relayer txhash', { txhash: payload.data, url: url.toString() });\n }\n return payload.data as Hex;\n }\n}\n","import type { SdkErrorCode } from '../types';\nimport { SdkError } from '../errors';\n\nexport const toBigintOrThrow = (\n value: unknown,\n input: { code: SdkErrorCode; name: string; detail: Record<string, unknown> },\n): bigint => {\n if (typeof value === 'bigint') return value;\n try {\n if (typeof value === 'string' && value.length) return BigInt(value);\n if (typeof value === 'number' && Number.isFinite(value)) return BigInt(value);\n return BigInt(value as any);\n } catch (error) {\n throw new SdkError(input.code, `Invalid ${input.name}`, { ...input.detail, value }, error);\n }\n};\n","import type { Address, PublicClient } from 'viem';\nimport { App_ABI } from '../abi/app';\nimport { SdkError } from '../errors';\nimport { toBigintOrThrow } from '../utils/bigint';\n\nconst tryToDecString = (value: string | bigint) => {\n try {\n return BigInt(value).toString();\n } catch {\n return String(value);\n }\n};\n\nexport async function pickMerkleRootIndex(input: {\n chainId?: number;\n publicClient: PublicClient;\n contractAddress: Address;\n currentIndex: number;\n remoteMerkleRoot: string | bigint;\n onDebug?: (event: { message: string; detail?: Record<string, unknown> }) => void;\n /**\n * Search window around `currentIndex` (inclusive).\n * Defaults to a small window to tolerate off-by-some roots caused by lagging remote proof services.\n */\n search?: { back?: number; forward?: number };\n}): Promise<number> {\n const remoteRootDec = tryToDecString(input.remoteMerkleRoot);\n const back = Math.max(0, Math.floor(input.search?.back ?? 2));\n const forward = Math.max(0, Math.floor(input.search?.forward ?? 8));\n\n const indices: number[] = [];\n for (let i = input.currentIndex; i <= input.currentIndex + forward; i++) indices.push(i);\n for (let i = input.currentIndex - 1; i >= input.currentIndex - back; i--) indices.push(i);\n\n for (const idx of indices) {\n if (idx < 0) continue;\n let root: unknown;\n try {\n input.onDebug?.({ message: 'readContract merkleRoots', detail: { triedIndex: idx } });\n root = await input.publicClient.readContract({\n address: input.contractAddress,\n abi: App_ABI as any,\n functionName: 'merkleRoots',\n args: [BigInt(idx)],\n });\n } catch (error) {\n throw new SdkError(\n 'MERKLE',\n 'Failed to read on-chain merkleRoots',\n { chainId: input.chainId, contractAddress: input.contractAddress, currentIndex: input.currentIndex, triedIndex: idx },\n error,\n );\n }\n\n const rootDec = toBigintOrThrow(root, {\n code: 'MERKLE',\n name: 'on-chain merkle root',\n detail: { chainId: input.chainId, contractAddress: input.contractAddress, currentIndex: input.currentIndex, triedIndex: idx },\n }).toString();\n\n if (rootDec === remoteRootDec) return idx;\n }\n\n throw new SdkError('MERKLE', 'Remote merkle root not found on-chain', {\n chainId: input.chainId,\n contractAddress: input.contractAddress,\n currentIndex: input.currentIndex,\n remoteMerkleRoot: remoteRootDec,\n tried: indices.filter((i) => i >= 0),\n });\n}\n","export type {\n OCashSdk,\n OCashSdkConfig,\n SdkEvent,\n ChainConfigInput,\n Hex,\n TokenMetadata,\n CommitmentData,\n ProofResult,\n TransferWitnessInput,\n WithdrawWitnessInput,\n WitnessBuildResult,\n WitnessContext,\n TransactionReceipt,\n AssetsOverride,\n AssetOverrideEntry,\n StorageAdapter,\n ListUtxosQuery,\n EntryMemoRecord,\n EntryNullifierRecord,\n ListEntryMemosQuery,\n ListEntryNullifiersQuery,\n MerkleLeafRecord,\n MerkleNodeRecord,\n MerkleTreeState,\n SyncChainStatus,\n SyncCursor,\n PlannerEstimateTransferResult,\n PlannerEstimateWithdrawResult,\n UtxoRecord,\n WalletSessionInput,\n OpsApi,\n RelayerRequest,\n} from './types';\nexport { defaultAssetsOverride } from './assets/defaultAssetsOverride';\nexport { MemoKit } from './memo/memoKit';\nexport { CryptoToolkit } from './crypto/cryptoToolkit';\nexport { KeyManager } from './crypto/keyManager';\nexport { LedgerInfo } from './ledger/ledgerInfo';\nexport { normalizeTokenMetadata } from './ledger/tokenNormalize';\nexport { assertTokenMetadata, assertTokenList, assertChainConfigInput } from './ledger/validate';\nexport { fetchPoolTokensFromContract } from './ledger/poolsFromContract';\nexport { DummyFactory } from './dummy/dummyFactory';\nexport { Utils } from './utils';\nexport { BABYJUBJUB_SCALAR_FIELD } from './crypto/babyJubjub';\nexport { calcTransferProofBinding, calcWithdrawProofBinding } from './utils/ocashBindings';\nexport { App_ABI } from './abi/app';\nexport { ERC20_ABI } from './abi/erc20';\nexport { MemoryStore } from './store/memoryStore';\nexport { KeyValueStore, RedisStore, SqliteStore, type KeyValueStoreOptions, type RedisStoreOptions, type SqliteStoreOptions, type KeyValueClient } from './store/keyValueStore';\nexport {\n type StoredOperation,\n type OperationStatus,\n type OperationType,\n type OperationCreateInput,\n type ListOperationsQuery,\n type DepositOperation,\n type TransferOperation,\n type WithdrawOperation,\n type DepositOperationDetail,\n type TransferOperationDetail,\n type WithdrawOperationDetail,\n} from './store/operationTypes';\n\nimport type { AssetsApi, CommitmentData, Hex, OCashSdk, OCashSdkConfig, SdkEvent, StorageAdapter } from './types';\nimport { defaultAssetsOverride } from './assets/defaultAssetsOverride';\nimport { UniversalWasmBridge } from './runtime/wasmBridge';\nimport { SdkCore } from './core/sdk-core';\nimport { ProofEngine } from './proof/proofEngine';\nimport { MemoKit } from './memo/memoKit';\nimport { CryptoToolkit } from './crypto/cryptoToolkit';\nimport { KeyManager } from './crypto/keyManager';\nimport { DummyFactory } from './dummy/dummyFactory';\nimport { LedgerInfo } from './ledger/ledgerInfo';\nimport { Utils } from './utils';\nimport { MemoWorker } from './memo/worker';\nimport { MemoryStore } from './store/memoryStore';\nimport { WalletService } from './wallet/walletService';\nimport { SyncEngine } from './sync/syncEngine';\nimport { Planner } from './planner/planner';\nimport { TxBuilder } from './tx/txBuilder';\nimport { MerkleEngine } from './merkle/merkleEngine';\nimport { Ops } from './ops/ops';\n\nfunction commitment(ro: CommitmentData, format: 'hex'): Hex;\nfunction commitment(ro: CommitmentData, format: 'bigint'): bigint;\nfunction commitment(ro: CommitmentData, format?: undefined): Hex;\nfunction commitment(ro: CommitmentData, format?: 'hex' | 'bigint') {\n return format === 'bigint' ? CryptoToolkit.commitment(ro, 'bigint') : CryptoToolkit.commitment(ro, 'hex');\n}\n\nexport const createSdk = (config: OCashSdkConfig): OCashSdk => {\n const normalizedConfig: OCashSdkConfig = {\n ...config,\n assetsOverride: config.assetsOverride ?? defaultAssetsOverride,\n };\n const bridge = new UniversalWasmBridge({\n assetsOverride: normalizedConfig.assetsOverride,\n cacheDir: normalizedConfig.cacheDir,\n runtime: normalizedConfig.runtime,\n });\n\n const core = new SdkCore(normalizedConfig, bridge);\n const zkp = new ProofEngine(bridge, core);\n const dummy = new DummyFactory(bridge);\n const ledger = new LedgerInfo(normalizedConfig.chains ?? []);\n const memoWorker = new MemoWorker(normalizedConfig.memoWorker);\n const store: StorageAdapter = normalizedConfig.storage ?? new MemoryStore();\n const assetsApi: AssetsApi = {\n getChains: () => ledger.getChains(),\n getChain: (chainId: number) => ledger.getChain(chainId),\n getTokens: (chainId: number) => ledger.getTokens(chainId),\n getPoolInfo: (chainId: number, tokenId: string) => ledger.getPoolInfo(chainId, tokenId),\n getAllowanceTarget: (chainId: number) => ledger.getAllowanceTarget(chainId),\n appendTokens: (chainId: number, tokens) => ledger.appendTokens(chainId, tokens),\n loadFromUrl: (url: string) => ledger.loadFromUrl(url),\n getRelayerConfig: (chainId: number) => ledger.getRelayerConfig(chainId),\n syncRelayerConfig: (chainId: number) => ledger.syncRelayerConfig(chainId),\n syncAllRelayerConfigs: () => ledger.syncAllRelayerConfigs(),\n };\n\n const emit = (evt: SdkEvent) => core.emit(evt);\n\n const walletService = new WalletService(assetsApi, store, emit);\n const merkle = new MerkleEngine((chainId) => assetsApi.getChain(chainId), bridge, normalizedConfig.merkle, store);\n const syncEngine = new SyncEngine(assetsApi, store, walletService, emit, merkle, normalizedConfig.sync);\n const planner = new Planner(assetsApi, walletService, bridge);\n const tx = new TxBuilder();\n const ops = new Ops(assetsApi, planner, merkle, zkp, tx, walletService, store, emit);\n\n return {\n core: {\n ready: (cb) => core.ready(cb),\n reset: () => core.reset(),\n on: (type, handler) => core.on(type, handler as any),\n off: (type, handler) => core.off(type, handler as any),\n },\n crypto: {\n commitment,\n nullifier: (secret, commitment, freezerPk) => CryptoToolkit.nullifier(secret, commitment, freezerPk),\n createRecordOpening: (input) => CryptoToolkit.createRecordOpening(input),\n poolId: (token, viewerPk, freezerPk) => CryptoToolkit.poolId(token, viewerPk, freezerPk),\n viewingRandomness: () => CryptoToolkit.viewingRandomness(),\n memo: {\n createMemo: (ro) => MemoKit.createMemo(ro),\n memoNonce: (ephemeral, user) => MemoKit.memoNonce(ephemeral, user),\n decryptMemo: (secret, memo) => MemoKit.decryptMemo(secret, memo),\n decryptBatch: (requests) => memoWorker.decryptBatch(requests),\n },\n dummy: {\n createRecordOpening: () => dummy.createRecordOpening(),\n createInputSecret: () => dummy.createInputSecret(),\n },\n utils: {\n calcDepositFee: (amount, feeBps) => Utils.calcDepositFee(amount, feeBps),\n randomBytes32: () => Utils.randomBytes32(),\n randomBytes32Bigint: (scalar) => Utils.randomBytes32Bigint(scalar),\n serializeBigInt: (value) => Utils.serializeBigInt(value),\n },\n },\n keys: {\n deriveKeyPair: (seed, nonce) => KeyManager.deriveKeyPair(seed, nonce),\n getPublicKeyBySeed: (seed, nonce) => KeyManager.getPublicKeyBySeed(seed, nonce),\n getSecretKeyBySeed: (seed, nonce) => KeyManager.getSecretKeyBySeed(seed, nonce),\n userPkToAddress: (userPk) => KeyManager.userPkToAddress(userPk),\n addressToUserPk: (address) => KeyManager.addressToUserPk(address),\n },\n assets: {\n ...assetsApi,\n },\n storage: {\n getAdapter: () => store,\n },\n merkle,\n wallet: {\n open: (session) => walletService.open(session),\n close: () => walletService.close(),\n getUtxos: (query) => walletService.getUtxos(query),\n getBalance: (query) => walletService.getBalance(query),\n markSpent: (input) => walletService.markSpent(input),\n },\n sync: syncEngine,\n planner,\n zkp: {\n createWitnessTransfer: (input, context) => zkp.createWitnessTransfer(input, context),\n createWitnessWithdraw: (input, context) => zkp.createWitnessWithdraw(input, context),\n proveTransfer: (witness, context) => zkp.proveTransfer(witness, context),\n proveWithdraw: (witness, context) => zkp.proveWithdraw(witness, context),\n },\n tx,\n ops,\n };\n};\n\nconst OcashSdk = {\n createSdk,\n MemoKit,\n CryptoToolkit,\n KeyManager,\n LedgerInfo,\n DummyFactory,\n Utils,\n MemoryStore,\n} as const;\n\nexport default OcashSdk;\n"],"mappings":"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","names":["bytesToHex","hexToBytes","toBytes","toBytes","toBytes","sha256","bytesToHex","toHex","sha256","bytesToHex","bytesToHex","toBytes","hexToBytes","bytesToHex","toHex","toHex","commitment","isRecord","randomBytes32","serializeBigInt","encodeAbiParameters","keccak256","encodeAbiParameters","keccak256","createdDiff","cidDiff","normalizeNumber","compareCreatedAt","createdDiff","nidDiff","compareCreatedAt","createdDiff","mkDiff","commitment","text","commitment","sha256","bytesToHex","utf8ToBytes","sha256","utf8ToBytes","bytesToHex","toHex","toHex","withdrawBase","utxos","records","estimates","feeSummary","maxSummary","okWithMerge","getAddress","requireHex","getAddress","isHex","typedPlan","prepared","inputCommitments","outputCommitments","commitment"]}