@invisi-labs/primitives 1.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-PRUUPDVD.js → chunk-QAC5T4S5.js} +15 -2
- package/dist/chunk-QAC5T4S5.js.map +1 -0
- package/dist/{chunk-TJYV6KTQ.js → chunk-XM4B6K37.js} +2 -2
- package/dist/credit.cjs +13 -1
- package/dist/credit.cjs.map +1 -1
- package/dist/credit.d.cts +1 -1
- package/dist/credit.d.ts +1 -1
- package/dist/credit.js +1 -1
- package/dist/{encryption-D06YBTW0.d.ts → encryption-Bzsl9VQk.d.ts} +2 -0
- package/dist/{encryption-0HQXc3tT.d.cts → encryption-P2HJ89FQ.d.cts} +2 -0
- package/dist/index.cjs +38 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -5
- package/dist/index.d.ts +24 -5
- package/dist/index.js +27 -2
- package/dist/index.js.map +1 -1
- package/dist/note.cjs +13 -1
- package/dist/note.cjs.map +1 -1
- package/dist/note.d.cts +1 -1
- package/dist/note.d.ts +1 -1
- package/dist/note.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-PRUUPDVD.js.map +0 -1
- /package/dist/{chunk-TJYV6KTQ.js.map → chunk-XM4B6K37.js.map} +0 -0
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/address/address.ts","../src/fmd/fmd.ts","../src/fmd/decaf377.ts","../src/errors.ts","../src/address/receiving-address.ts","../src/crypto/domains.ts","../src/crypto/random.ts","../src/crypto/poseidon-constants.ts","../src/crypto/poseidon.ts","../src/delivery/delivery-codec.ts","../src/delivery/note-payload.ts","../src/notes/noteContext.ts","../src/credit/state.ts","../src/delivery/envelope.ts","../src/delivery/binary.ts","../src/notes/commitment.ts","../src/delivery/validation.ts","../src/delivery/encryption.ts","../src/disclosure/disclosure.ts","../src/notes/nullifier.ts","../src/wallet/capabilities.ts","../src/wallet/wallet.ts","../src/wallet/wallet-object.ts","../src/delivery/memo.ts","../src/wallet/signing-request.ts","../src/delivery/payload.ts","../src/delivery/decryptor.ts","../src/wallet/wallet-wire.ts","../src/provenance/intent-hash.ts"],"sourcesContent":["export { decodeAddress } from \"./address/address\";\nexport type { DecodedAddress, ReceivingKeyLookup } from \"./address/address\";\nexport { ReceivingAddress } from \"./address/receiving-address\";\nexport {\n D_CNULL,\n D_CREDIT,\n D_CREDIT_KEY_HASH,\n D_CREDIT_RECOVERY,\n D_CREDIT_STATE_NONCE,\n D_IDENT,\n D_NOTE,\n D_NULL,\n TREE_DEPTH,\n} from \"./crypto/domains\";\nexport { poseidonHash } from \"./crypto/poseidon\";\nexport { FIELD_MODULUS, generateCreditSharedKey, generateNonce } from \"./crypto/random\";\nexport {\n decryptCreditState,\n decryptPrivateTransferNote,\n encryptCreditState,\n encryptPrivateTransferNote,\n normalizeCreditDeliveryState,\n viewingPublicKey,\n} from \"./delivery/encryption\";\nexport type {\n CreditStateDecryptionContext,\n CreditStateEncryptionContext,\n NoteBytes,\n NoteDecryptionContext,\n NoteEncryptionContext,\n} from \"./delivery/encryption\";\nexport { Disclosure } from \"./disclosure/disclosure\";\nexport type {\n CreditOpening,\n DisclosureExport,\n DisclosureOutput,\n DisclosureResult,\n} from \"./disclosure/disclosure\";\nexport { MissingCapabilityError } from \"./errors\";\nexport { createClue, createClueFromSeed, deriveClueKey, validateClueKey } from \"./fmd/fmd\";\nexport { computeNoteCommitment, computeNoteIdentity } from \"./notes/commitment\";\nexport {\n CREDIT_POLICY_FIELDS,\n CREDIT_USAGE_FIELDS,\n deriveCreditState,\n deriveCreditUpdate,\n applyCreditDrawUsage,\n computeCreditCommitment,\n computeCreditNullifier,\n computeCreditRecoveryPad,\n computeCreditSharedKeyHash,\n creditPeriods,\n deriveCreditStateNonce,\n normalizeCreditPolicy,\n normalizeCreditUsage,\n normalizeCreditState,\n recoverCreditState,\n} from \"./credit/state\";\nexport { computeNoteNullifier } from \"./notes/nullifier\";\nexport type {\n CreditDeliveryState,\n CreditState,\n CreditPolicy,\n CreditUsage,\n CreditStateRecovery,\n Note,\n ProtocolContext,\n ReceivingKeys,\n} from \"./types\";\nexport {\n AuthorizedStatement,\n Detector,\n NullifierCapability,\n ViewingCapability,\n} from \"./wallet/capabilities\";\nexport {\n WALLET_AUTHORIZATION_TYPES,\n computeOwnerAddress,\n computeWalletAuthorizationDigest,\n verifyWalletAuthorization,\n walletAuthorizationTypedData,\n} from \"./wallet/wallet\";\nexport type {\n WalletAuthorizationRequest,\n WalletAuthorizationWitness,\n WalletBytes,\n WalletOperation,\n} from \"./wallet/wallet\";\nexport { Wallet } from \"./wallet/wallet-object\";\n\nexport type { Address, Hex } from \"./crypto/primitives\";\n\nexport { MAX_MEMO_BYTES, decodeMemoText, encodeMemo, type Memo } from \"./delivery/memo\";\nexport { createSigningRequest } from \"./wallet/signing-request\";\nexport type { SigningRequest } from \"./wallet/signing-request\";\n\nexport {\n MAX_CIPHERTEXT_BYTES,\n deliveryCodec,\n deliveryHeader,\n validateDeliveryCiphertext,\n} from \"./delivery/delivery-codec\";\n\nexport { decodeDeliveryHeader } from \"./delivery/delivery-codec\";\nexport type { DeliveryKind } from \"./delivery/delivery-codec\";\nexport { creditV1, fundsV1 } from \"./delivery/payload\";\n\nexport type { CreditDataV1, FundsDataV1 } from \"./types\";\n\nexport type { CreditUpdateChanges } from \"./credit/state\";\n\nexport {\n prepareWalletRequest,\n acceptWalletResponse,\n acceptWalletResponses,\n validateWalletBatch,\n validateWalletResponses,\n NativeWalletError,\n MAX_WALLET_BATCH_BYTES,\n} from \"./wallet/wallet-wire\";\nexport type {\n WalletAcceptedResults,\n WalletHex,\n WalletMethod,\n WalletWireContext,\n WalletDecryptContext,\n WalletParams,\n WalletResults,\n WalletRequest,\n WalletResponse,\n PreparedWalletRequest,\n} from \"./wallet/wallet-wire\";\n\nexport { provenanceIntentHash } from \"./provenance/intent-hash\";\n\nexport { authenticatedDecryptor, DeliveryDecryptionError } from \"./delivery/decryptor\";\nexport type { DeliveryDecryptor } from \"./delivery/decryptor\";\n","import { secp256k1 } from \"@noble/curves/secp256k1\";\nimport { keccak_256 } from \"@noble/hashes/sha3\";\nimport { bytesToHex, concatBytes, hexToBytes, utf8ToBytes } from \"@noble/hashes/utils\";\nimport { getAddress } from \"ethers\";\nimport { validateClueKey } from \"../fmd/fmd\";\n\nexport interface ReceivingAddress {\n ownerAddress: `0x${string}`;\n viewingPublicKey: Uint8Array;\n clueKey: Uint8Array;\n}\nexport type DecodedAddress =\n ({ kind: \"long\" } & ReceivingAddress) | { kind: \"short\"; ownerAddress: `0x${string}` };\nexport type ReceivingKeyLookup = (\n ownerAddress: `0x${string}`\n) => Promise<Pick<ReceivingAddress, \"viewingPublicKey\" | \"clueKey\"> | null | undefined>;\nconst ALPHABET = \"qpzry9x8gf2tvdw0s3jn54khce6mua7l\";\ntype Identity = bigint | `0x${string}`;\n\nfunction identityBytes(value: Identity): Uint8Array {\n if (\n typeof value !== \"bigint\" &&\n (typeof value !== \"string\" || !/^0x[0-9a-fA-F]{40}$/.test(value))\n )\n throw new Error(\"invalid owner address encoding\");\n const n = BigInt(value);\n if (n <= 0n || n >= 1n << 160n)\n throw new RangeError(\"owner address must be a nonzero EVM owner address\");\n return hexToBytes(n.toString(16).padStart(40, \"0\"));\n}\nfunction receivingKeys(keys: Pick<ReceivingAddress, \"viewingPublicKey\" | \"clueKey\">) {\n const publicKey = keys.viewingPublicKey;\n if (\n !(publicKey instanceof Uint8Array) ||\n publicKey.length !== 33 ||\n (publicKey[0] !== 2 && publicKey[0] !== 3)\n )\n throw new Error(\"invalid compressed viewing public key\");\n secp256k1.ProjectivePoint.fromHex(publicKey).assertValidity();\n validateClueKey(keys.clueKey);\n return { viewingPublicKey: Uint8Array.from(publicKey), clueKey: Uint8Array.from(keys.clueKey) };\n}\nfunction checkedText(prefix: string, data: string): string {\n const digest = keccak_256(utf8ToBytes(\"Invisi.AddressCaseChecksum.v1:\" + prefix + data));\n return (\n prefix +\n Array.from(data, (character, i) =>\n (digest[i >> 3]! >> (7 - (i & 7))) & 1 ? character.toUpperCase() : character\n ).join(\"\")\n );\n}\nfunction encode(prefix: string, payload: Uint8Array): string {\n let buffer = 0,\n bits = 0,\n data = \"\";\n for (const byte of payload) {\n buffer = (buffer << 8) | byte;\n bits += 8;\n while (bits >= 5) {\n bits -= 5;\n data += ALPHABET[(buffer >>> bits) & 31];\n }\n buffer &= (1 << bits) - 1;\n }\n if (bits) data += ALPHABET[(buffer << (5 - bits)) & 31];\n return checkedText(prefix, data);\n}\n\n/** 138 characters: 0i plus the complete offline receiving materials. */\nexport function encodeLongAddress(recipient: ReceivingAddress): string {\n const identity = identityBytes(recipient.ownerAddress),\n keys = receivingKeys(recipient);\n return encode(\"0i\", concatBytes(identity, keys.viewingPublicKey, keys.clueKey));\n}\n/** The owner's 42-character checksummed EVM address; receiving keys require a chosen registry. */\nexport function encodeShortAddress(ownerAddress: Identity): string {\n const identity = identityBytes(ownerAddress);\n return getAddress(\n typeof ownerAddress === \"string\" ? ownerAddress : `0x${bytesToHex(identity)}`\n );\n}\n\n/** Standard EVM short addresses or a full 0i address with a strict custom Base32 case checksum. */\nexport function decodeAddress(address: string): DecodedAddress {\n if (typeof address !== \"string\") throw new TypeError(\"address must be text\");\n if (address.startsWith(\"0x\")) {\n const owner = getAddress(address) as `0x${string}`;\n return { kind: \"short\", ownerAddress: `0x${bytesToHex(identityBytes(owner))}` };\n }\n if (!address.startsWith(\"0i\")) throw new Error(\"invalid Invisi address prefix\");\n const prefix = \"0i\";\n if (address.length !== 138) throw new Error(\"invalid address length\");\n const data = address.slice(prefix.length).toLowerCase();\n if (Array.from(data).some((character) => !ALPHABET.includes(character)))\n throw new Error(\"invalid address alphabet\");\n if (checkedText(prefix, data) !== address) throw new Error(\"invalid address case checksum\");\n let buffer = 0,\n bits = 0;\n const payload: number[] = [];\n for (const character of data) {\n buffer = (buffer << 5) | ALPHABET.indexOf(character);\n bits += 5;\n if (bits >= 8) {\n bits -= 8;\n payload.push((buffer >>> bits) & 255);\n }\n buffer &= (1 << bits) - 1;\n }\n if (bits !== 0 || buffer !== 0) throw new Error(\"noncanonical address padding\");\n const raw = Uint8Array.from(payload);\n const ownerAddress =\n `0x${bytesToHex(identityBytes(`0x${bytesToHex(raw.subarray(0, 20))}`))}` as const;\n return {\n kind: \"long\",\n ownerAddress,\n ...receivingKeys({ viewingPublicKey: raw.slice(20, 53), clueKey: raw.slice(53) }),\n };\n}\n\n/** Normalize either address into the same payment input. Long addresses never query. */\nexport async function resolveAddress(\n address: string,\n options: { lookup?: ReceivingKeyLookup } = {}\n): Promise<ReceivingAddress> {\n const decoded = decodeAddress(address);\n if (decoded.kind === \"long\")\n return {\n ownerAddress: decoded.ownerAddress,\n viewingPublicKey: decoded.viewingPublicKey,\n clueKey: decoded.clueKey,\n };\n if (!options.lookup) throw new Error(\"short address requires an explicit registry lookup\");\n const keys = await options.lookup(decoded.ownerAddress);\n if (!keys) throw new Error(\"owner address is not registered\");\n return { ownerAddress: decoded.ownerAddress, ...receivingKeys(keys) };\n}\n","/**\n * Frozen S-FMD profile: decaf377-fmd 2.1.1, 24-bit clues (68 bytes).\n * Only FMD detection keys belong here; these are not transaction ownership keys.\n *\n * SECURITY: the noble Edwards arithmetic and this exact Decaf codec port use\n * JavaScript BigInt. They do not provide constant-time execution or reliable\n * secret erasure. This new composition has not received an independent audit.\n */\nimport { blake2b } from \"@noble/hashes/blake2b\";\nimport { concatBytes, utf8ToBytes } from \"@noble/hashes/utils\";\nimport {\n FR,\n decodePoint,\n encodePoint,\n generator,\n inverseScalar,\n isIdentity,\n multiply,\n readLE,\n secureRandomBytes,\n writeLE,\n} from \"./decaf377.js\";\n\nconst PRECISION = 24;\nfunction requireBytes(value: Uint8Array, length: number, name: string): void {\n if (!(value instanceof Uint8Array) || value.length !== length)\n throw new TypeError(`${name} must be a ${length}-byte Uint8Array`);\n}\nfunction detectionScalar(key: Uint8Array): bigint {\n requireBytes(key, 32, \"Detection key\");\n const scalar = readLE(key);\n if (scalar === 0n || scalar >= FR)\n throw new Error(\"Detection key must be a canonical nonzero Decaf377 scalar\");\n return scalar;\n}\nfunction hash(domain: string, ...parts: Uint8Array[]): Uint8Array {\n // Rust blake2b_simd defaults to 64 output bytes and zero-pads personalization.\n const personalization = new Uint8Array(16);\n personalization.set(utf8ToBytes(`decaf377-fmd.${domain}`));\n return blake2b(concatBytes(...parts), { dkLen: 64, personalization });\n}\nconst hashScalar = (domain: string, ...parts: Uint8Array[]) => readLE(hash(domain, ...parts)) % FR;\nconst childOffset = (clueKey: Uint8Array, index: number) =>\n hashScalar(\"hkd\", clueKey, Uint8Array.of(index));\nconst hashBit = (p: Uint8Array, shared: Uint8Array, q: Uint8Array) =>\n hash(\"bit\", p, shared, q)[0]! & 1;\n\n/** Derive the canonical 32-byte Decaf377 clue key from a nonzero FMD scalar. */\nexport function deriveClueKey(detectionKey: Uint8Array): Uint8Array {\n return encodePoint(multiply(generator, detectionScalar(detectionKey)));\n}\n/** Reject malformed, noncanonical, or identity clue keys. */\nexport function validateClueKey(clueKey: Uint8Array): void {\n requireBytes(clueKey, 32, \"Clue key\");\n if (isIdentity(decodePoint(clueKey))) throw new Error(\"Clue key must not be the identity\");\n}\n/** Create a fixed 24-bit clue using a fresh WebCrypto random seed. */\nexport function createClue(clueKey: Uint8Array): Uint8Array {\n validateClueKey(clueKey);\n return createClueFromSeed(clueKey, secureRandomBytes(32));\n}\n/**\n * Deterministic interoperability/backend entry point. Seed must be independently\n * generated with a CSPRNG for every production clue; never reuse a fixed seed.\n */\nexport function createClueFromSeed(clueKey: Uint8Array, seed32: Uint8Array): Uint8Array {\n validateClueKey(clueKey);\n requireBytes(seed32, 32, \"Clue seed\");\n const root = decodePoint(clueKey);\n const r = hashScalar(\"rdv\", clueKey, seed32);\n const z = hashScalar(\"zdv\", clueKey, seed32);\n if (r === 0n) throw new Error(\"Degenerate clue seed\");\n const p = encodePoint(multiply(generator, r));\n const q = encodePoint(multiply(generator, z));\n const ciphertext = new Uint8Array(3);\n for (let i = 0; i < PRECISION; i++) {\n const child = root.add(multiply(generator, childOffset(clueKey, i)));\n const shared = encodePoint(multiply(child, r));\n ciphertext[i >> 3] = ciphertext[i >> 3]! | ((hashBit(p, shared, q) ^ 1) << (i & 7));\n }\n const m = hashScalar(\"sca\", p, Uint8Array.of(PRECISION), ciphertext);\n const y = ((z - m + FR) * inverseScalar(r)) % FR;\n if (y === 0n) throw new Error(\"Degenerate clue seed\");\n return concatBytes(p, writeLE(y), Uint8Array.of(PRECISION), ciphertext);\n}\n\n/** Check a full-precision clue locally without exporting the detection key. */\nexport function detectClue(detectionKey: Uint8Array, clue: Uint8Array): boolean {\n const scalar = detectionScalar(detectionKey);\n requireBytes(clue, 68, \"Clue\");\n if (clue[64] !== PRECISION) return false;\n const p = clue.slice(0, 32),\n y = readLE(clue.slice(32, 64));\n if (y === 0n || y >= FR) return false;\n let point;\n try {\n point = decodePoint(p);\n } catch {\n return false;\n }\n if (isIdentity(point)) return false;\n const ciphertext = clue.slice(65);\n const m = hashScalar(\"sca\", p, Uint8Array.of(PRECISION), ciphertext);\n const q = encodePoint(multiply(generator, m).add(multiply(point, y)));\n const clueKey = deriveClueKey(detectionKey);\n for (let i = 0; i < PRECISION; i++) {\n const child = (scalar + childOffset(clueKey, i)) % FR;\n const bit = hashBit(p, encodePoint(multiply(point, child)), q);\n if ((bit ^ ((ciphertext[i >> 3]! >> (i & 7)) & 1)) !== 1) return false;\n }\n return true;\n}\n","/**\n * Internal Decaf377 codec, ported from decaf377 0.10.1 min_curve/element.rs.\n * Edwards group/field arithmetic is supplied by @noble/curves 1.9.1. The\n * Montgomery constants below are converted to ordinary field integers.\n * This JavaScript BigInt backend is NOT constant-time and has not been audited.\n */\nimport { twistedEdwards, type ExtPointType } from \"@noble/curves/abstract/edwards\";\nimport { Field, mod } from \"@noble/curves/abstract/modular\";\nimport { blake2b } from \"@noble/hashes/blake2b\";\n\nexport const FQ = 8444461749428370424248824938781546531375899335154063827935233455917409239041n;\nexport const FR = 2111115437357092606062206234695386632838870926408408195193685246394721360383n;\nconst field = Field(FQ, 253, true);\nconst f = (n: bigint) => mod(n, FQ);\nconst abs = (n: bigint) => ((n & 1n) === 0n ? n : f(-n));\n\nexport function secureRandomBytes(length: number): Uint8Array {\n const webCrypto = (\n globalThis as { crypto?: { getRandomValues(array: Uint8Array): Uint8Array } }\n ).crypto;\n if (!webCrypto?.getRandomValues) throw new Error(\"WebCrypto secure randomness is unavailable\");\n return webCrypto.getRandomValues(new Uint8Array(length));\n}\n\nconst curve = twistedEdwards({\n a: FQ - 1n,\n d: 3021n,\n Fp: field,\n n: FR,\n h: 4n,\n Gx: 4959445789346820725352484487855828915252512307947624787834978378872129235627n,\n Gy: 6060471950081851567114691557659790004756535011754163002297540472747064943288n,\n hash: blake2b,\n randomBytes: (length = 32) => secureRandomBytes(length),\n});\nexport type DecafPoint = ExtPointType;\nexport const generator: DecafPoint = curve.ExtendedPoint.BASE;\n\nexport function readLE(bytes: Uint8Array): bigint {\n let n = 0n;\n for (let i = bytes.length - 1; i >= 0; i--) n = (n << 8n) | BigInt(bytes[i]!);\n return n;\n}\nexport function writeLE(n: bigint): Uint8Array {\n const bytes = new Uint8Array(32);\n for (let i = 0; i < 32; i++) {\n bytes[i] = Number(n & 255n);\n n >>= 8n;\n }\n return bytes;\n}\nexport function multiply(point: DecafPoint, scalar: bigint): DecafPoint {\n return scalar === 0n ? curve.ExtendedPoint.ZERO : point.multiply(scalar);\n}\nexport function inverseScalar(scalar: bigint): bigint {\n // Noble's field inversion uses Euclid. Neither this nor BigInt is constant-time.\n return Field(FR).inv(scalar);\n}\n\n/** Canonical Decaf decoding, including the low-bit sign convention. */\nexport function decodePoint(bytes: Uint8Array): DecafPoint {\n if (!(bytes instanceof Uint8Array) || bytes.length !== 32)\n throw new Error(\"Invalid Decaf377 encoding length\");\n const s = readLE(bytes);\n if (s >= FQ || (s & 1n) !== 0n || bytes[31]! >> 5 !== 0)\n throw new Error(\"Invalid Decaf377 encoding\");\n const ss = f(s * s);\n const u1 = f(1n - ss);\n const u2 = f(u1 * u1 - 4n * 3021n * ss);\n const denominator = f(u2 * u1 * u1);\n // This is the square branch of Rust sqrt_ratio_zeta(1, denominator).\n // Decompression rejects the nonsquare branch; root sign is fixed below.\n if (denominator === 0n) throw new Error(\"Invalid Decaf377 encoding\");\n let v: bigint;\n try {\n v = field.sqrt(field.inv(denominator));\n } catch {\n throw new Error(\"Invalid Decaf377 encoding\");\n }\n const twoSU1 = f(2n * s * u1);\n if ((f(twoSU1 * v) & 1n) !== 0n) v = f(-v);\n const x = f(twoSU1 * v * v * u2);\n const y = f((1n + ss) * v * u1);\n return curve.ExtendedPoint.fromAffine({ x, y });\n}\nexport function encodePoint(point: DecafPoint): Uint8Array {\n const { ex: x, ez: z, et: t } = point;\n if (x === 0n) return new Uint8Array(32);\n const aMinusD = -3022n;\n const u1 = f((x + t) * (x - t));\n const denominator = f(u1 * aMinusD * x * x);\n const v = field.sqrt(field.inv(denominator));\n const u2 = abs(f(v * u1));\n const u3 = f(u2 * z - t);\n return writeLE(abs(f(aMinusD * v * u3 * x)));\n}\nexport function isIdentity(point: DecafPoint): boolean {\n return point.ex === 0n;\n}\n","/** A requested permission was not explicitly supplied to this component. */\nexport class MissingCapabilityError extends Error {\n readonly code = \"MISSING_CAPABILITY\";\n constructor(readonly capability: string) {\n super(`Missing ${capability} capability`);\n this.name = \"MissingCapabilityError\";\n }\n}\n","import { MissingCapabilityError } from \"../errors\";\nimport type { ReceivingKeys } from \"../types\";\nimport {\n decodeAddress,\n encodeLongAddress,\n encodeShortAddress,\n type ReceivingAddress as ReceivingData,\n type ReceivingKeyLookup,\n} from \"./address\";\n\n/** Validated public receiving material. A short address requires an explicit resolver. */\nexport class ReceivingAddress {\n readonly #text: string;\n\n private constructor(text: string) {\n const decoded = decodeAddress(text);\n this.#text = decoded.kind === \"short\" ? encodeShortAddress(decoded.ownerAddress) : text;\n Object.freeze(this);\n }\n\n static parse(text: string): ReceivingAddress {\n return new ReceivingAddress(text);\n }\n\n static from(recipient: ReceivingData): ReceivingAddress {\n return new ReceivingAddress(encodeLongAddress(recipient));\n }\n\n static fromIdentity(identity: bigint | `0x${string}`): ReceivingAddress {\n return new ReceivingAddress(encodeShortAddress(identity));\n }\n\n get ownerAddress(): `0x${string}` {\n return decodeAddress(this.#text).ownerAddress;\n }\n\n get kind(): \"long\" | \"short\" {\n return decodeAddress(this.#text).kind;\n }\n\n getReceivingKeys(): ReceivingKeys {\n const decoded = decodeAddress(this.#text);\n if (decoded.kind === \"short\") {\n throw new MissingCapabilityError(\"resolved receiving keys\");\n }\n return { viewingPublicKey: decoded.viewingPublicKey, clueKey: decoded.clueKey };\n }\n\n async resolve(lookup?: ReceivingKeyLookup): Promise<ReceivingAddress> {\n if (this.kind === \"long\") {\n return this;\n }\n if (!lookup) {\n throw new MissingCapabilityError(\"explicit registry lookup\");\n }\n const keys = await lookup(this.ownerAddress);\n if (!keys) {\n throw new Error(\"owner address is not registered\");\n }\n return ReceivingAddress.from({\n ownerAddress: this.ownerAddress,\n viewingPublicKey: keys.viewingPublicKey,\n clueKey: keys.clueKey,\n });\n }\n\n get viewingPublicKey(): Uint8Array {\n return this.getReceivingKeys().viewingPublicKey;\n }\n\n get clueKey(): Uint8Array {\n return this.getReceivingKeys().clueKey;\n }\n\n toString(): string {\n return this.#text;\n }\n\n toJSON(): string {\n return this.#text;\n }\n}\n","/** Current protocol Poseidon2 domain tags. */\nexport const D_IDENT = 2n;\nexport const D_NOTE = 3n;\nexport const D_NULL = 4n;\nexport const D_CREDIT = 5n;\nexport const D_CNULL = 6n;\nexport const D_CREDIT_KEY_HASH = 7n;\nexport const D_CREDIT_RECOVERY = 9n;\nexport const D_CREDIT_STATE_NONCE = 10n;\n\nexport const TREE_DEPTH = 16;\n","declare const crypto: { getRandomValues<T extends ArrayBufferView>(array: T): T };\n\n/** BN254 scalar field modulus. */\nexport const FIELD_MODULUS =\n 21888242871839275222246405745257275088548364400416034343698204186575808495617n;\n\nfunction sampleField(nonzero: boolean): bigint {\n const bytes = new Uint8Array(32);\n for (;;) {\n crypto.getRandomValues(bytes);\n const candidate = BigInt(\n \"0x\" + Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\")\n );\n if (candidate < FIELD_MODULUS && (!nonzero || candidate !== 0n)) return candidate;\n }\n}\n\n/** Uniform canonical BN254 nonce, sampled using browser/Node Web Crypto. */\nexport function generateNonce(): bigint {\n return sampleField(false);\n}\n\n/** Independent shared Credit secret. Never derive it from a note/master secret. */\nexport function generateCreditSharedKey(): bigint {\n return sampleField(true);\n}\n","// BN254 Poseidon2 t=4 parameters shared with Noir, Barretenberg, Go and Rust.\nexport const INTERNAL_DIAGONAL = [\n 0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7n,\n 0x0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740bn,\n 0x00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15n,\n 0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428bn,\n];\nexport const ROUND_CONSTANTS = [\n [\n 0x19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e5n,\n 0x265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d6n,\n 0x199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aan,\n 0x157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8n,\n ],\n [\n 0x2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac94902n,\n 0x0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1en,\n 0x251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b996n,\n 0x13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4en,\n ],\n [\n 0x0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd4738n,\n 0x011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca06n,\n 0x0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f367549n,\n 0x04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789bn,\n ],\n [\n 0x0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e8n,\n 0x259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323fn,\n 0x28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a1n,\n 0x0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447n,\n ],\n [0x0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cfn, 0x0n, 0x0n, 0x0n],\n [0x123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811n, 0x0n, 0x0n, 0x0n],\n [0x26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75n, 0x0n, 0x0n, 0x0n],\n [0x1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5n, 0x0n, 0x0n, 0x0n],\n [0x1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0n, 0x0n, 0x0n, 0x0n],\n [0x011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574n, 0x0n, 0x0n, 0x0n],\n [0x2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8cn, 0x0n, 0x0n, 0x0n],\n [0x2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5n, 0x0n, 0x0n, 0x0n],\n [0x0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951dn, 0x0n, 0x0n, 0x0n],\n [0x192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527bn, 0x0n, 0x0n, 0x0n],\n [0x1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85n, 0x0n, 0x0n, 0x0n],\n [0x179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfbn, 0x0n, 0x0n, 0x0n],\n [0x29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1cn, 0x0n, 0x0n, 0x0n],\n [0x225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08n, 0x0n, 0x0n, 0x0n],\n [0x064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59n, 0x0n, 0x0n, 0x0n],\n [0x10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87n, 0x0n, 0x0n, 0x0n],\n [0x0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471cn, 0x0n, 0x0n, 0x0n],\n [0x1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fbn, 0x0n, 0x0n, 0x0n],\n [0x1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070bn, 0x0n, 0x0n, 0x0n],\n [0x2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17dbn, 0x0n, 0x0n, 0x0n],\n [0x2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926n, 0x0n, 0x0n, 0x0n],\n [0x062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8n, 0x0n, 0x0n, 0x0n],\n [0x0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59bn, 0x0n, 0x0n, 0x0n],\n [0x20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0dn, 0x0n, 0x0n, 0x0n],\n [0x25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5an, 0x0n, 0x0n, 0x0n],\n [0x23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4bn, 0x0n, 0x0n, 0x0n],\n [0x22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0n, 0x0n, 0x0n, 0x0n],\n [0x26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5n, 0x0n, 0x0n, 0x0n],\n [0x070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9n, 0x0n, 0x0n, 0x0n],\n [0x12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250dan, 0x0n, 0x0n, 0x0n],\n [0x248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729n, 0x0n, 0x0n, 0x0n],\n [0x1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaan, 0x0n, 0x0n, 0x0n],\n [0x28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cfn, 0x0n, 0x0n, 0x0n],\n [0x0094975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7en, 0x0n, 0x0n, 0x0n],\n [0x04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65n, 0x0n, 0x0n, 0x0n],\n [0x2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187n, 0x0n, 0x0n, 0x0n],\n [0x2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3n, 0x0n, 0x0n, 0x0n],\n [0x03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0n, 0x0n, 0x0n, 0x0n],\n [0x00b7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64n, 0x0n, 0x0n, 0x0n],\n [0x159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9an, 0x0n, 0x0n, 0x0n],\n [0x1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431fn, 0x0n, 0x0n, 0x0n],\n [0x1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30dn, 0x0n, 0x0n, 0x0n],\n [0x2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33fn, 0x0n, 0x0n, 0x0n],\n [0x0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173n, 0x0n, 0x0n, 0x0n],\n [0x02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16n, 0x0n, 0x0n, 0x0n],\n [0x0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705n, 0x0n, 0x0n, 0x0n],\n [0x0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53an, 0x0n, 0x0n, 0x0n],\n [0x22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9n, 0x0n, 0x0n, 0x0n],\n [0x25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16n, 0x0n, 0x0n, 0x0n],\n [0x1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0n, 0x0n, 0x0n, 0x0n],\n [0x2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5n, 0x0n, 0x0n, 0x0n],\n [0x2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505n, 0x0n, 0x0n, 0x0n],\n [0x044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43dn, 0x0n, 0x0n, 0x0n],\n [0x227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025n, 0x0n, 0x0n, 0x0n],\n [0x02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355n, 0x0n, 0x0n, 0x0n],\n [0x0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befacn, 0x0n, 0x0n, 0x0n],\n [\n 0x1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d38n,\n 0x0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e5n,\n 0x1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5cn,\n 0x25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5fn,\n ],\n [\n 0x0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75an,\n 0x13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a96n,\n 0x2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391cen,\n 0x21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959n,\n ],\n [\n 0x05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185bn,\n 0x0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a4n,\n 0x0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bfn,\n 0x09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455n,\n ],\n [\n 0x0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd4335n,\n 0x2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34bn,\n 0x1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412dfn,\n 0x176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404n,\n ],\n];\n","import { FIELD_MODULUS as P } from \"./random\";\nimport { INTERNAL_DIAGONAL, ROUND_CONSTANTS } from \"./poseidon-constants\";\nconst mod = (n: bigint) => n % P;\nconst fifth = (n: bigint) => {\n const x = mod(n),\n x2 = mod(x * x);\n return mod(x * x2 * x2);\n};\nfunction external(s: bigint[]): void {\n const t0 = s[0]! + s[1]!,\n t1 = s[2]! + s[3]!,\n t2 = 2n * s[1]! + t1,\n t3 = 2n * s[3]! + t0;\n const t4 = 4n * t1 + t3,\n t5 = 4n * t0 + t2;\n s[0] = mod(t3 + t5);\n s[1] = mod(t5);\n s[2] = mod(t2 + t4);\n s[3] = mod(t4);\n}\nfunction permute(s: bigint[]): void {\n external(s);\n for (let r = 0; r < 64; r++) {\n const full = r < 4 || r >= 60,\n rc = ROUND_CONSTANTS[r]!;\n if (full) {\n for (let i = 0; i < 4; i++) s[i] = fifth(s[i]! + rc[i]!);\n external(s);\n } else {\n s[0] = fifth(s[0]! + rc[0]!);\n const sum = s.reduce((a, b) => a + b, 0n);\n for (let i = 0; i < 4; i++) s[i] = mod(s[i]! * INTERNAL_DIAGONAL[i]! + sum);\n }\n }\n}\n/** Barretenberg's length-separated rate-three BN254 Poseidon2 sponge. */\nexport async function poseidonHash(inputs: bigint[]): Promise<`0x${string}`> {\n for (let i = 0; i < inputs.length; i++)\n if (inputs[i]! < 0n || inputs[i]! >= P)\n throw new RangeError(\n `poseidonHash: input[${i}] out of BN254 field range [0, FIELD_MODULUS): ${inputs[i]}`\n );\n const state = [0n, 0n, 0n, BigInt(inputs.length) << 64n];\n let used = 0;\n for (const input of inputs) {\n if (used === 3) {\n permute(state);\n used = 0;\n }\n state[used] = mod(state[used]! + input);\n used++;\n }\n permute(state);\n return `0x${state[0]!.toString(16).padStart(64, \"0\")}`;\n}\n","import { getBytes, type BytesLike } from \"ethers\";\nimport { creditEnvelopeV2, fundsEnvelopeV1 } from \"./note-payload\";\n\n/** Stable transport resource bound; applications do not select the SDK envelope version. */\nexport const MAX_CIPHERTEXT_BYTES = 4096;\nexport type DeliveryKind = \"funds\" | \"credit\";\nexport function deliveryHeader(kind: DeliveryKind): number {\n if (kind !== \"funds\" && kind !== \"credit\") throw new Error(\"unsupported delivery kind\");\n return kind === \"credit\" ? 0x82 : 0x01;\n}\nexport function decodeDeliveryHeader(header: number): { kind: DeliveryKind; version: number } {\n if (!Number.isInteger(header) || header < 0 || header > 255)\n throw new Error(\"delivery header must be one byte\");\n const kind = header >>> 7 ? \"credit\" : \"funds\";\n const version = header & 0x7f;\n if (version === 0) throw new Error(\"invalid envelope version\");\n return { kind, version };\n}\n/** Dispatch only SDK-owned envelope implementations. Future versions are added here. */\nexport function deliveryCodec(header: number) {\n const { kind, version } = decodeDeliveryHeader(header);\n if (version !== (kind === \"credit\" ? 2 : 1))\n throw new Error(`unsupported envelope version ${version}`);\n const codec = kind === \"funds\" ? fundsEnvelopeV1 : creditEnvelopeV2;\n return {\n ...codec,\n domain: `Invisi.${kind === \"funds\" ? \"Note\" : \"Credit\"}Delivery.v${kind === \"credit\" ? 2 : 1}`,\n };\n}\nexport function validateDeliveryCiphertext(value: BytesLike, kind?: DeliveryKind): Uint8Array {\n const data = Uint8Array.from(getBytes(value));\n if (data.length === 0 || data.length > MAX_CIPHERTEXT_BYTES)\n throw new Error(\"invalid envelope length\");\n const codec = deliveryCodec(data[0]!);\n if (kind !== undefined && codec.kind !== kind) throw new Error(\"unexpected envelope kind\");\n if (data.length < codec.minimum || data.length > codec.maximum)\n throw new Error(\"invalid envelope length\");\n return data;\n}\n","import { secp256k1 } from \"@noble/curves/secp256k1\";\nimport { validateClueKey } from \"../fmd/fmd\";\nimport { normalizeCreditPolicy, normalizeCreditState } from \"../credit/state\";\nimport type { CreditDeliveryState, ReceivingKeys } from \"../types\";\n\nfunction concat(...parts: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(parts.reduce((length, part) => length + part.length, 0));\n let offset = 0;\n for (const part of parts) {\n out.set(part, offset);\n offset += part.length;\n }\n return out;\n}\nfunction uint(value: bigint, bits: number, name: string): void {\n if (value < 0n || value >= 1n << BigInt(bits))\n throw new RangeError(`${name} out of uint${bits} range`);\n}\nfunction encode(value: bigint, length = 32): Uint8Array {\n uint(value, length * 8, \"encoded value\");\n const out = new Uint8Array(length);\n for (let i = length - 1; i >= 0; i--) {\n out[i] = Number(value & 255n);\n value >>= 8n;\n }\n return out;\n}\nfunction decode(value: Uint8Array): bigint {\n return value.reduce((result, byte) => (result << 8n) | BigInt(byte), 0n);\n}\nfunction hexField(value: bigint): `0x${string}` {\n uint(value, 160, \"owner address\");\n return `0x${value.toString(16).padStart(40, \"0\")}`;\n}\nfunction receivingKeys(keys: ReceivingKeys): ReceivingKeys {\n if (\n !keys ||\n !(keys.viewingPublicKey instanceof Uint8Array) ||\n !(keys.clueKey instanceof Uint8Array)\n )\n throw new Error(\"receiving keys required\");\n const viewingPublicKey = Uint8Array.from(keys.viewingPublicKey),\n clueKey = Uint8Array.from(keys.clueKey);\n if (viewingPublicKey.length !== 33 || (viewingPublicKey[0] !== 2 && viewingPublicKey[0] !== 3))\n throw new Error(\"invalid compressed viewing public key\");\n secp256k1.ProjectivePoint.fromHex(viewingPublicKey).assertValidity();\n if (clueKey.length !== 32) throw new Error(\"invalid clue key length\");\n validateClueKey(clueKey);\n return { viewingPublicKey, clueKey };\n}\n\n/** Copy and validate both public key snapshots without exporting any spending material. */\nexport function normalizeCreditDeliveryState(state: CreditDeliveryState): CreditDeliveryState {\n if (!state || typeof state !== \"object\" || !state.note || typeof state.note !== \"object\")\n throw new TypeError(\"complete Credit delivery state required\");\n const allowed = [\n \"chainId\",\n \"protocolAddress\",\n \"tokenAddress\",\n \"spenderWalletIdentity\",\n \"ownerWalletIdentity\",\n \"revocationShard\",\n \"revocationSlot\",\n \"nonce\",\n \"expiry\",\n \"creditSharedKey\",\n \"singleLimit\",\n \"dailyLimit\",\n \"monthlyLimit\",\n \"availableCredit\",\n \"unlimited\",\n \"lastDay\",\n \"dailySpent\",\n \"lastMonth\",\n \"monthlySpent\",\n \"totalSpent\",\n \"payload\",\n ];\n if (Object.keys(state.note).some((k) => !allowed.includes(k)))\n throw Error(\"Unsupported Credit fields\");\n const note = normalizeCreditState(structuredClone(state.note));\n return {\n note: {\n ...note,\n ...normalizeCreditPolicy(note),\n },\n ownerReceivingKeys: receivingKeys(state.ownerReceivingKeys),\n spenderReceivingKeys: receivingKeys(state.spenderReceivingKeys),\n };\n}\n\n/** Length-delimited application bytes are opaque to the fixed note decoder. */\nfunction encodePayload(value?: Uint8Array): Uint8Array {\n if (value !== undefined && !(value instanceof Uint8Array))\n throw new TypeError(\"payload must be Uint8Array\");\n const payload = value ?? new Uint8Array();\n if (payload.length > 65535) throw new RangeError(\"payload length exceeds uint16\");\n return concat(encode(BigInt(payload.length), 2), payload);\n}\nfunction readPayload(plain: Uint8Array, offset: number): Uint8Array {\n if (plain.length < offset + 2) throw new Error(\"missing payload length\");\n const length = Number(decode(plain.slice(offset, offset + 2)));\n if (plain.length !== offset + 2 + length) throw new Error(\"invalid payload length\");\n return Uint8Array.from(plain.subarray(offset + 2));\n}\nexport const fundsEnvelopeV1 = {\n kind: \"funds\" as const,\n version: 1,\n minimum: 160,\n maximum: 4096,\n encode(note: import(\"../types\").Note) {\n return concat(\n encode(BigInt(note.ownerAddress)),\n encode(note.amount, 16),\n encode(note.nonce),\n encodePayload(note.payload)\n );\n },\n decode(plain: Uint8Array, context: import(\"./encryption\").NoteDecryptionContext) {\n return {\n chainId: context.chainId,\n protocolAddress: context.protocolAddress,\n tokenAddress: context.tokenAddress,\n ownerAddress: hexField(decode(plain.slice(0, 32))),\n amount: decode(plain.slice(32, 48)),\n nonce: decode(plain.slice(48, 80)),\n payload: readPayload(plain, 80),\n };\n },\n};\nconst creditWireFields = [\n [\"spenderWalletIdentity\", 32],\n [\"ownerWalletIdentity\", 32],\n [\"revocationShard\", 8],\n [\"revocationSlot\", 2],\n [\"nonce\", 32],\n [\"expiry\", 8],\n [\"creditSharedKey\", 32],\n [\"singleLimit\", 16],\n [\"dailyLimit\", 16],\n [\"monthlyLimit\", 16],\n [\"availableCredit\", 16],\n [\"unlimited\", 1],\n [\"lastDay\", 8],\n [\"dailySpent\", 16],\n [\"lastMonth\", 8],\n [\"monthlySpent\", 16],\n [\"totalSpent\", 16],\n] as const;\nexport const creditEnvelopeV2 = {\n kind: \"credit\" as const,\n version: 2,\n minimum: 485,\n maximum: 4096,\n encode(input: CreditDeliveryState) {\n const state = normalizeCreditDeliveryState(input);\n return concat(\n ...creditWireFields.map(([k, size]) => encode(BigInt(state.note[k]!), size)),\n state.ownerReceivingKeys.viewingPublicKey,\n state.ownerReceivingKeys.clueKey,\n state.spenderReceivingKeys.viewingPublicKey,\n state.spenderReceivingKeys.clueKey,\n encodePayload(state.note.payload)\n );\n },\n decode(plain: Uint8Array, context: import(\"./encryption\").CreditStateDecryptionContext) {\n let offset = 0;\n const note: Record<string, unknown> = {\n chainId: context.chainId,\n protocolAddress: context.protocolAddress,\n tokenAddress: context.tokenAddress,\n };\n for (const [k, size] of creditWireFields) {\n const n = decode(plain.slice(offset, offset + size));\n if (k === \"unlimited\" && n !== 0n && n !== 1n)\n throw Error(\"invalid Credit unlimited byte\");\n note[k] = k === \"unlimited\" ? n === 1n : k.endsWith(\"Identity\") ? hexField(n) : n;\n offset += size;\n }\n const keys = () => {\n const k = {\n viewingPublicKey: plain.slice(offset, offset + 33),\n clueKey: plain.slice(offset + 33, offset + 65),\n };\n offset += 65;\n return k;\n };\n const ownerReceivingKeys = keys(),\n spenderReceivingKeys = keys();\n note.payload = readPayload(plain, offset);\n return normalizeCreditDeliveryState({\n note: note as unknown as import(\"../types\").CreditState,\n ownerReceivingKeys,\n spenderReceivingKeys,\n });\n },\n};\n","import type { ProtocolContext } from \"../types\";\n\n/** Stored notes must belong to the chain and deployment used by an operation. */\nexport function assertNoteContext(note: ProtocolContext, context: ProtocolContext): void {\n if (note.chainId !== context.chainId || note.protocolAddress !== context.protocolAddress) {\n throw new Error(\"note context mismatch\");\n }\n}\n","import {\n D_CNULL,\n D_CREDIT,\n D_CREDIT_KEY_HASH,\n D_CREDIT_RECOVERY,\n D_CREDIT_STATE_NONCE,\n} from \"../crypto/domains\";\nimport { poseidonHash } from \"../crypto/poseidon\";\nimport { FIELD_MODULUS } from \"../crypto/random\";\nimport type {\n CreditState,\n CreditPolicy,\n CreditUsage,\n CreditStateRecovery,\n ProtocolContext,\n} from \"../types\";\nimport { assertNoteContext } from \"../notes/noteContext\";\n\nexport const CREDIT_POLICY_FIELDS = [\"singleLimit\", \"dailyLimit\", \"monthlyLimit\"] as const;\nexport const CREDIT_USAGE_FIELDS = [\n \"lastDay\",\n \"dailySpent\",\n \"lastMonth\",\n \"monthlySpent\",\n \"totalSpent\",\n] as const;\nexport function normalizeCreditPolicy(value: Partial<CreditPolicy> = {}): CreditPolicy {\n return Object.fromEntries(\n CREDIT_POLICY_FIELDS.map((key) => {\n const n = value[key] ?? 0n;\n uint(n, 126, key);\n return [key, n];\n })\n ) as unknown as CreditPolicy;\n}\nexport function normalizeCreditUsage(value: Partial<CreditUsage> = {}): CreditUsage {\n const usage = Object.fromEntries(\n CREDIT_USAGE_FIELDS.map((key) => {\n const n = value[key] ?? 0n;\n uint(n, key === \"lastDay\" || key === \"lastMonth\" ? 64 : 128, key);\n return [key, n];\n })\n ) as unknown as CreditUsage;\n for (const [period, spent] of [\n [\"lastDay\", \"dailySpent\"],\n [\"lastMonth\", \"monthlySpent\"],\n ] as const)\n if (usage[period] === 0n && usage[spent] !== 0n) throw Error(\"noncanonical Credit usage\");\n return usage;\n}\nfunction balance(value: Pick<CreditState, \"availableCredit\" | \"unlimited\">) {\n uint(value.availableCredit, 128, \"availableCredit\");\n if (typeof value.unlimited !== \"boolean\") throw TypeError(\"unlimited must be boolean\");\n if (value.unlimited && value.availableCredit !== 0n)\n throw Error(\"unlimited Credit must have zero available credit\");\n return { availableCredit: value.availableCredit, unlimited: value.unlimited };\n}\n/** UTC Gregorian periods from explicit uint64 chain seconds, without wall-clock defaults. */\nexport function creditPeriods(timestamp: bigint): { currentDay: bigint; currentMonth: bigint } {\n if (typeof timestamp !== \"bigint\") throw new TypeError(\"Credit timestamp required\");\n uint(timestamp, 64, \"timestamp\");\n const days = timestamp / 86400n,\n z = days + 719468n,\n era = z / 146097n,\n doe = z - era * 146097n;\n const yoe = (doe - doe / 1460n + doe / 36524n - doe / 146096n) / 365n;\n let year = yoe + era * 400n;\n const doy = doe - (365n * yoe + yoe / 4n - yoe / 100n),\n mp = (5n * doy + 2n) / 153n;\n const month = mp + (mp < 10n ? 3n : -9n);\n if (month <= 2n) year++;\n return { currentDay: days + 1n, currentMonth: (year - 1970n) * 12n + month };\n}\n/** Accumulate actual debits even when limits are disabled. */\nexport function applyCreditDrawUsage(\n note: Partial<CreditPolicy & CreditUsage> & Pick<CreditState, \"availableCredit\" | \"unlimited\">,\n amount: bigint,\n timestamp: bigint\n): CreditPolicy & CreditUsage & Pick<CreditState, \"availableCredit\" | \"unlimited\"> {\n const policy = {\n ...normalizeCreditPolicy(note),\n ...normalizeCreditUsage(note),\n ...balance(note),\n },\n periods = creditPeriods(timestamp);\n uint(amount, 126, \"draw amount\");\n if (amount === 0n) throw new Error(\"draw amount must be positive\");\n if (policy.singleLimit !== 0n && amount > policy.singleLimit)\n throw new Error(\"single limit exceeded\");\n for (const [limit, last, spent, current] of [\n [\"dailyLimit\", \"lastDay\", \"dailySpent\", \"currentDay\"],\n [\"monthlyLimit\", \"lastMonth\", \"monthlySpent\", \"currentMonth\"],\n ] as const) {\n const period = periods[current];\n if (period < policy[last]) throw new Error(\"Credit period rollback\");\n policy[spent] = (period === policy[last] ? policy[spent] : 0n) + amount;\n uint(policy[spent], 128, spent);\n policy[last] = period;\n if (policy[limit] !== 0n && policy[spent] > policy[limit])\n throw new Error(`${limit} exceeded`);\n }\n policy.totalSpent += amount;\n uint(policy.totalSpent, 128, \"totalSpent\");\n if (!policy.unlimited) {\n if (amount > policy.availableCredit) throw Error(\"available credit exceeded\");\n policy.availableCredit -= amount;\n }\n return policy;\n}\n\nexport async function computeCreditSharedKeyHash(creditSharedKey: bigint): Promise<`0x${string}`> {\n if (creditSharedKey <= 0n || creditSharedKey >= FIELD_MODULUS)\n throw new RangeError(\"invalid Credit shared key\");\n return poseidonHash([D_CREDIT_KEY_HASH, creditSharedKey]);\n}\n\nexport function normalizeCreditState(state: CreditState): CreditState {\n const allowed = [\n \"chainId\",\n \"protocolAddress\",\n \"tokenAddress\",\n \"spenderWalletIdentity\",\n \"ownerWalletIdentity\",\n \"revocationShard\",\n \"revocationSlot\",\n \"nonce\",\n \"expiry\",\n \"creditSharedKey\",\n ...CREDIT_POLICY_FIELDS,\n ...CREDIT_USAGE_FIELDS,\n \"availableCredit\",\n \"unlimited\",\n \"payload\",\n ];\n if (!state || typeof state !== \"object\" || Object.keys(state).some((k) => !allowed.includes(k)))\n throw Error(\"Unsupported Credit fields\");\n for (const [name, bits] of [\n [\"chainId\", 64],\n [\"protocolAddress\", 160],\n [\"tokenAddress\", 160],\n [\"revocationShard\", 64],\n [\"revocationSlot\", 16],\n [\"expiry\", 64],\n ] as const)\n uint(state[name], bits, name);\n for (const id of [state.spenderWalletIdentity, state.ownerWalletIdentity])\n if (!/^0x[0-9a-fA-F]{40}$/.test(id) || BigInt(id) === 0n)\n throw Error(\"invalid Credit identity\");\n if (!state.protocolAddress || !state.tokenAddress || !state.revocationShard || !state.expiry)\n throw Error(\"Credit deployment, token, shard and expiry must be positive\");\n field(state.nonce, \"nonce\");\n field(state.creditSharedKey, \"creditSharedKey\");\n if (!state.creditSharedKey) throw Error(\"Credit shared key must be positive\");\n if (state.payload !== undefined && !(state.payload instanceof Uint8Array))\n throw TypeError(\"payload must be Uint8Array\");\n return {\n ...state,\n ...normalizeCreditPolicy(state),\n ...normalizeCreditUsage(state),\n ...balance(state),\n ...(state.payload !== undefined ? { payload: Uint8Array.from(state.payload) } : {}),\n };\n}\nexport async function computeCreditCommitment(\n state: CreditState,\n keyHash?: `0x${string}`\n): Promise<`0x${string}`> {\n if (keyHash === undefined) state = normalizeCreditState(state);\n for (const [name, bits] of [\n [\"chainId\", 64],\n [\"protocolAddress\", 160],\n [\"tokenAddress\", 160],\n [\"revocationShard\", 64],\n [\"revocationSlot\", 16],\n [\"expiry\", 64],\n ] as const)\n uint(state[name], bits, name);\n for (const identity of [state.spenderWalletIdentity, state.ownerWalletIdentity])\n if (!/^0x[0-9a-fA-F]{40}$/.test(identity) || BigInt(identity) === 0n)\n throw new Error(\"invalid Credit identity\");\n if (state.revocationShard === 0n || state.expiry === 0n)\n throw new Error(\"Credit shard and expiry must be positive\");\n field(state.nonce, \"nonce\");\n const hash = keyHash ?? (await computeCreditSharedKeyHash(state.creditSharedKey));\n field(BigInt(hash), \"Credit shared key hash\");\n return poseidonHash([\n D_CREDIT,\n state.chainId,\n state.protocolAddress,\n BigInt(state.spenderWalletIdentity),\n BigInt(state.ownerWalletIdentity),\n state.tokenAddress,\n state.revocationShard,\n state.revocationSlot,\n state.nonce,\n state.expiry,\n BigInt(hash),\n ...CREDIT_POLICY_FIELDS.map((k) => normalizeCreditPolicy(state)[k]),\n balance(state).availableCredit,\n state.unlimited ? 1n : 0n,\n ...CREDIT_USAGE_FIELDS.map((k) => normalizeCreditUsage(state)[k]),\n ]);\n}\n\nexport async function computeCreditNullifier(\n chainId: bigint,\n creditSharedKey: bigint,\n creditCommitment: `0x${string}`\n): Promise<`0x${string}`> {\n uint(chainId, 64, \"chainId\");\n if (creditSharedKey <= 0n || creditSharedKey >= FIELD_MODULUS)\n throw new RangeError(\"invalid Credit shared key\");\n if (!/^0x[0-9a-fA-F]{64}$/.test(creditCommitment))\n throw new Error(\"invalid Credit commitment encoding\");\n return poseidonHash([D_CNULL, chainId, creditSharedKey, BigInt(creditCommitment)]);\n}\n\n/** Tag10: deterministic successor nonce, scoped to the deployment and spend. */\nexport async function deriveCreditStateNonce(\n chainId: bigint,\n protocolAddress: bigint,\n tokenAddress: bigint,\n creditNullifier: bigint,\n creditSharedKey: bigint\n): Promise<bigint> {\n return BigInt(\n await poseidonHash([\n D_CREDIT_STATE_NONCE,\n chainId,\n protocolAddress,\n tokenAddress,\n creditNullifier,\n creditSharedKey,\n ])\n );\n}\n\n/** Tag9: additive recovery pad; recoveryAmount = (debit + pad) mod p. */\nexport async function computeCreditRecoveryPad(\n chainId: bigint,\n protocolAddress: bigint,\n tokenAddress: bigint,\n creditNullifier: bigint,\n creditSharedKey: bigint\n): Promise<bigint> {\n return BigInt(\n await poseidonHash([\n D_CREDIT_RECOVERY,\n chainId,\n protocolAddress,\n tokenAddress,\n creditNullifier,\n creditSharedKey,\n ])\n );\n}\n\nfunction uint(value: bigint, bits: number, name: string): void {\n if (typeof value !== \"bigint\" || value < 0n || value >= 1n << BigInt(bits))\n throw new RangeError(`${name} out of uint${bits} range`);\n}\n\nfunction field(value: bigint, name: string): void {\n if (typeof value !== \"bigint\" || value < 0n || value >= FIELD_MODULUS)\n throw new RangeError(`${name} out of BN254 field range`);\n}\n\n/** Recover a successor using authenticated draw fields, without a decryptable successor delivery. */\nexport async function recoverCreditState(\n context: ProtocolContext,\n previous: CreditState,\n recovery: CreditStateRecovery\n): Promise<CreditState> {\n assertNoteContext(previous, context);\n const nullifier = await computeCreditNullifier(\n context.chainId,\n previous.creditSharedKey,\n await computeCreditCommitment(previous)\n );\n if (nullifier.toLowerCase() !== recovery.creditNullifier.toLowerCase())\n throw new Error(\"previous Credit nullifier mismatch\");\n field(recovery.recoveryAmount, \"recoveryAmount\");\n const args = [\n context.chainId,\n context.protocolAddress,\n previous.tokenAddress,\n BigInt(nullifier),\n previous.creditSharedKey,\n ] as const;\n const nonce = await deriveCreditStateNonce(...args),\n mask = await computeCreditRecoveryPad(...args);\n const debit = (recovery.recoveryAmount - mask + FIELD_MODULUS) % FIELD_MODULUS;\n uint(debit, 126, \"recovered debit\");\n if (!debit) throw new Error(\"invalid recovered debit\");\n if (nonce === previous.nonce) throw new Error(\"state nonce must change\");\n const { payload, ...financial } = previous;\n const state = {\n ...financial,\n ...applyCreditDrawUsage(previous, debit, recovery.timestamp),\n nonce,\n };\n if ((await computeCreditCommitment(state)) !== recovery.stateCommitment)\n throw new Error(\"recovered Credit commitment mismatch\");\n return state;\n}\n\nexport async function deriveCreditState(\n previous: CreditState,\n debit: bigint,\n timestamp: bigint\n): Promise<{\n state: CreditState;\n stateCommitment: `0x${string}`;\n nullifier: `0x${string}`;\n recoveryAmount: bigint;\n}> {\n const nullifier = await computeCreditNullifier(\n previous.chainId,\n previous.creditSharedKey,\n await computeCreditCommitment(previous)\n );\n const args = [\n previous.chainId,\n previous.protocolAddress,\n previous.tokenAddress,\n BigInt(nullifier),\n previous.creditSharedKey,\n ] as const;\n const nonce = await deriveCreditStateNonce(...args),\n mask = await computeCreditRecoveryPad(...args);\n if (nonce === previous.nonce) throw Error(\"state nonce must change\");\n const state = { ...previous, ...applyCreditDrawUsage(previous, debit, timestamp), nonce };\n return {\n state,\n stateCommitment: await computeCreditCommitment(state),\n nullifier,\n recoveryAmount: (debit + mask) % FIELD_MODULUS,\n };\n}\nexport interface CreditUpdateChanges extends Partial<CreditPolicy> {\n expiry?: bigint;\n unlimited?: boolean;\n increaseAvailableCredit?: bigint;\n decreaseAvailableCredit?: bigint;\n}\nexport async function deriveCreditUpdate(\n previous: CreditState,\n changes: CreditUpdateChanges,\n deadline: bigint\n) {\n for (const key of Object.keys(changes))\n if (\n ![\n ...CREDIT_POLICY_FIELDS,\n \"expiry\",\n \"unlimited\",\n \"increaseAvailableCredit\",\n \"decreaseAvailableCredit\",\n ].includes(key)\n )\n throw Error(\"unsupported Credit update field\");\n const old = normalizeCreditState(previous),\n increase =\n changes.increaseAvailableCredit === undefined ? 0n : changes.increaseAvailableCredit,\n decrease =\n changes.decreaseAvailableCredit === undefined ? 0n : changes.decreaseAvailableCredit;\n uint(increase, 128, \"increaseAvailableCredit\");\n uint(decrease, 128, \"decreaseAvailableCredit\");\n if (increase !== 0n && decrease !== 0n)\n throw Error(\"Credit increase and decrease are mutually exclusive\");\n const unlimited = changes.unlimited === undefined ? old.unlimited : changes.unlimited;\n if (typeof unlimited !== \"boolean\") throw TypeError(\"unlimited must be boolean\");\n let availableCredit = 0n;\n if (unlimited) {\n if (increase !== 0n || decrease !== 0n)\n throw Error(\"unlimited update cannot adjust available credit\");\n } else {\n if (decrease > old.availableCredit)\n throw Error(\"available credit decrease exceeds balance\");\n availableCredit = old.availableCredit + increase - decrease;\n uint(availableCredit, 128, \"availableCredit\");\n }\n uint(deadline, 64, \"deadline\");\n const next = {\n ...old,\n ...normalizeCreditPolicy({ ...old, ...changes }),\n expiry: changes.expiry ?? old.expiry,\n availableCredit,\n unlimited,\n };\n if (previous.expiry < deadline || next.expiry < deadline)\n throw Error(\"expiry before request deadline\");\n const nullifier = await computeCreditNullifier(\n previous.chainId,\n previous.creditSharedKey,\n await computeCreditCommitment(previous)\n );\n const nonce = await deriveCreditStateNonce(\n previous.chainId,\n previous.protocolAddress,\n previous.tokenAddress,\n BigInt(nullifier),\n previous.creditSharedKey\n );\n if (nonce === previous.nonce) throw Error(\"state nonce must change\");\n const state = { ...next, nonce };\n return { state, nullifier, stateCommitment: await computeCreditCommitment(state) };\n}\n","import { secp256k1 } from \"@noble/curves/secp256k1\";\nimport { ascii, bytes, concat, encode } from \"./binary\";\nimport { deliveryCodec, validateDeliveryCiphertext } from \"./delivery-codec\";\nimport { NoteBytes, NoteDecryptionContext, NoteEncryptionContext } from \"./types\";\nimport { validateContext } from \"./validation\";\n\n// Minimal Web Crypto declarations avoid adding DOM/Node types to this package API.\ntype GcmParameters = {\n name: string;\n iv: ArrayBuffer;\n additionalData: ArrayBuffer;\n tagLength: number;\n};\n\ndeclare const crypto: {\n getRandomValues<T extends ArrayBufferView>(array: T): T;\n subtle: {\n importKey(\n format: string,\n data: ArrayBuffer,\n algorithm: string,\n extractable: boolean,\n usages: string[]\n ): Promise<unknown>;\n exportKey(format: \"raw\", key: unknown): Promise<ArrayBuffer>;\n deriveKey(\n parameters: { name: string; hash: string; salt: ArrayBuffer; info: ArrayBuffer },\n key: unknown,\n algorithm: { name: string; length: number },\n extractable: boolean,\n usages: string[]\n ): Promise<unknown>;\n encrypt(parameters: GcmParameters, key: unknown, data: ArrayBuffer): Promise<ArrayBuffer>;\n decrypt(parameters: GcmParameters, key: unknown, data: ArrayBuffer): Promise<ArrayBuffer>;\n };\n};\n\nfunction aad(\n domain: Uint8Array,\n context: NoteEncryptionContext,\n tokenAddress: bigint,\n header: Uint8Array,\n role: number\n): Uint8Array {\n validateContext(context, tokenAddress);\n return concat(\n domain,\n header,\n new Uint8Array([role]),\n encode(context.chainId, 8),\n encode(context.protocolAddress, 20),\n encode(tokenAddress, 20),\n encode(BigInt(context.outputCommitment))\n );\n}\n\nfunction privateKey(value: NoteBytes): Uint8Array {\n const key = bytes(value, 32);\n if (!secp256k1.utils.isValidPrivateKey(key)) throw new Error(\"invalid viewing private key\");\n return key;\n}\n\nexport function publicKey(value: NoteBytes): Uint8Array {\n const key = bytes(value, 33);\n if (key[0] !== 2 && key[0] !== 3) throw new Error(\"expected compressed secp256k1 public key\");\n // Parsing checks that the compressed x coordinate is on the curve.\n secp256k1.ProjectivePoint.fromHex(key);\n return key;\n}\n\n/** Compressed secp256k1 viewing key (33 bytes), independent of spending authority. */\nexport function viewingPublicKey(key: NoteBytes): Uint8Array {\n return secp256k1.getPublicKey(privateKey(key), true);\n}\n\nfunction random(length: number): Uint8Array {\n return crypto.getRandomValues(new Uint8Array(length));\n}\n\nfunction ephemeralKey(): Uint8Array {\n for (;;) {\n const key = random(32);\n if (secp256k1.utils.isValidPrivateKey(key)) return key;\n }\n}\n\n// ArrayBuffer copies keep browser BufferSource types independent of Node Buffers.\nconst buffer = (value: Uint8Array): ArrayBuffer => Uint8Array.from(value).buffer;\n\nasync function derivedKey(\n key: Uint8Array,\n peer: Uint8Array,\n header: Uint8Array,\n recipient: Uint8Array,\n domain: Uint8Array,\n extractable = false\n) {\n // Node's computeSecret returns the raw shared point X coordinate (32 bytes).\n const secret = secp256k1.getSharedSecret(key, peer, true).slice(1);\n const material = await crypto.subtle.importKey(\"raw\", buffer(secret), \"HKDF\", false, [\n \"deriveKey\",\n ]);\n try {\n return await crypto.subtle.deriveKey(\n {\n name: \"HKDF\",\n hash: \"SHA-256\",\n salt: buffer(header.slice(34, 50)),\n info: buffer(concat(domain, header.slice(1, 34), recipient)),\n },\n material,\n { name: \"AES-GCM\", length: 256 },\n extractable,\n [\"encrypt\", \"decrypt\"]\n );\n } finally {\n secret.fill(0);\n }\n}\n\nexport async function seal(\n viewingKey: NoteBytes,\n plaintext: Uint8Array,\n context: NoteEncryptionContext,\n tokenAddress: bigint,\n headerByte: number,\n role: number\n): Promise<Uint8Array> {\n const peer = publicKey(viewingKey),\n key = ephemeralKey();\n const salt = random(16),\n iv = random(12),\n domain = deliveryDomain(headerByte);\n const header = concat(\n new Uint8Array([headerByte]),\n secp256k1.getPublicKey(key, true),\n salt,\n iv\n );\n const additionalData = aad(domain, context, tokenAddress, header, role);\n try {\n const encrypted = await crypto.subtle.encrypt(\n {\n name: \"AES-GCM\",\n iv: buffer(iv),\n additionalData: buffer(additionalData),\n tagLength: 128,\n },\n await derivedKey(key, peer, header, peer, domain),\n buffer(plaintext)\n );\n return concat(header, new Uint8Array(encrypted));\n } finally {\n key.fill(0);\n plaintext.fill(0);\n }\n}\n\nexport async function open(\n key: NoteBytes,\n envelope: NoteBytes,\n context: NoteDecryptionContext,\n headerByte: number,\n role: number,\n payloadKey = false\n): Promise<Uint8Array> {\n const data = envelopeBytes(envelope, deliveryCodec(headerByte).kind === \"credit\");\n if (data[0] !== headerByte) throw new Error(\"unsupported envelope version\");\n const domain = deliveryDomain(headerByte);\n const additionalData = aad(domain, context, context.tokenAddress, data.slice(0, 62), role);\n const localKey = payloadKey ? bytes(key, 32) : privateKey(key);\n try {\n const aes = payloadKey\n ? await crypto.subtle.importKey(\"raw\", buffer(bytes(key, 32)), \"AES-GCM\", false, [\n \"decrypt\",\n ])\n : await derivedKey(\n localKey,\n publicKey(data.slice(1, 34)),\n data.slice(0, 62),\n secp256k1.getPublicKey(localKey, true),\n domain\n );\n const decrypted = await crypto.subtle.decrypt(\n {\n name: \"AES-GCM\",\n iv: buffer(data.slice(50, 62)),\n additionalData: buffer(additionalData),\n tagLength: 128,\n },\n aes,\n buffer(data.slice(62))\n );\n return new Uint8Array(decrypted);\n } finally {\n localKey.fill(0);\n }\n}\n\nfunction deliveryDomain(headerByte: number): Uint8Array {\n return ascii(deliveryCodec(headerByte).domain);\n}\n\nexport async function exportPayloadKey(\n key: NoteBytes,\n envelope: NoteBytes,\n credit: boolean\n): Promise<Uint8Array> {\n const data = envelopeBytes(envelope, credit);\n\n const localKey = privateKey(key);\n try {\n const aes = await derivedKey(\n localKey,\n publicKey(data.slice(1, 34)),\n data.slice(0, 62),\n viewingPublicKey(localKey),\n deliveryDomain(data[0]!),\n true\n );\n return new Uint8Array(await crypto.subtle.exportKey(\"raw\", aes));\n } finally {\n localKey.fill(0);\n }\n}\n\nexport function envelopeBytes(value: NoteBytes, credit: boolean): Uint8Array {\n return validateDeliveryCiphertext(value, credit ? \"credit\" : \"funds\");\n}\n","import { FIELD_MODULUS } from \"../crypto/random\";\nimport { NoteBytes } from \"./types\";\n\nexport const ascii = (value: string) =>\n Uint8Array.from(value, (character) => character.charCodeAt(0));\n\nexport function concat(...parts: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(parts.reduce((size, p) => size + p.length, 0));\n let offset = 0;\n for (const part of parts) {\n out.set(part, offset);\n offset += part.length;\n }\n return out;\n}\n\nexport function bytes(value: NoteBytes, length: number): Uint8Array {\n let out: Uint8Array;\n if (typeof value === \"string\") {\n if (!/^0x(?:[0-9a-fA-F]{2})*$/.test(value)) throw new Error(\"invalid hexadecimal bytes\");\n out = Uint8Array.from(value.slice(2).match(/../g) ?? [], (b) => parseInt(b, 16));\n } else if (value instanceof Uint8Array) out = Uint8Array.from(value);\n else throw new Error(\"expected hexadecimal bytes or Uint8Array\");\n if (out.length !== length) throw new Error(`expected ${length} bytes`);\n return out;\n}\n\nexport function uint(value: bigint, bits: number, name: string): void {\n if (value < 0n || value >= 1n << BigInt(bits))\n throw new RangeError(`${name} out of uint${bits} range`);\n}\n\nexport function field(value: bigint, name: string): void {\n if (value < 0n || value >= FIELD_MODULUS)\n throw new RangeError(`${name} out of BN254 field range`);\n}\n\nexport function encode(value: bigint, length = 32): Uint8Array {\n uint(value, length * 8, \"encoded value\");\n const out = new Uint8Array(length);\n for (let i = length - 1; i >= 0; i--) {\n out[i] = Number(value & 255n);\n value >>= 8n;\n }\n return out;\n}\n\nexport function decode(value: Uint8Array): bigint {\n return value.reduce((n, b) => (n << 8n) | BigInt(b), 0n);\n}\n\nfunction hexField(value: bigint): `0x${string}` {\n uint(value, 160, \"owner address\");\n return `0x${value.toString(16).padStart(40, \"0\")}`;\n}\n","import { D_IDENT, D_NOTE } from \"../crypto/domains\";\nimport { poseidonHash } from \"../crypto/poseidon\";\n\n/** Randomized per-note identity; the full owner address stays private on chain. */\nexport async function computeNoteIdentity(\n ownerAddress: bigint,\n nonce: bigint\n): Promise<`0x${string}`> {\n if (ownerAddress <= 0n || ownerAddress >= 1n << 160n)\n throw new RangeError(\"invalid owner address\");\n return poseidonHash([D_IDENT, ownerAddress, nonce]);\n}\n\n/** Note leaf from a randomized identity, token and positive u128 amount. */\nexport async function computeNoteCommitment(\n chainId: bigint,\n protocolAddress: bigint,\n identity: `0x${string}`,\n tokenAddress: bigint,\n amount: bigint\n): Promise<`0x${string}`> {\n if (chainId < 0n || chainId >= 1n << 64n) throw new RangeError(\"invalid chainId\");\n if (protocolAddress <= 0n || protocolAddress >= 1n << 160n)\n throw new RangeError(\"invalid protocol address\");\n if (tokenAddress < 0n || tokenAddress >= 1n << 160n)\n throw new RangeError(\"invalid token address\");\n if (amount <= 0n || amount >= 1n << 128n) throw new RangeError(\"invalid note amount\");\n if (!/^0x[0-9a-fA-F]{64}$/.test(identity)) throw new Error(\"invalid note identity encoding\");\n return poseidonHash([D_NOTE, chainId, protocolAddress, BigInt(identity), tokenAddress, amount]);\n}\n","import { computeNoteCommitment, computeNoteIdentity } from \"../notes/commitment\";\nimport { computeCreditCommitment, computeCreditSharedKeyHash } from \"../credit/state\";\nimport { assertNoteContext } from \"../notes/noteContext\";\nimport type { CreditState, Note } from \"../types\";\nimport { field, uint } from \"./binary\";\nimport { NoteEncryptionContext } from \"./types\";\n\nexport function validateContext(context: NoteEncryptionContext, tokenAddress: bigint): void {\n uint(context.chainId, 64, \"chainId\");\n uint(context.protocolAddress, 160, \"protocolAddress\");\n uint(tokenAddress, 160, \"tokenAddress\");\n field(BigInt(context.outputCommitment), \"outputCommitment\");\n}\n\nfunction validateNote(note: Note): void {\n uint(note.amount, 128, \"amount\");\n if (note.amount === 0n) throw new Error(\"amount must be positive\");\n field(note.nonce, \"nonce\");\n uint(BigInt(note.ownerAddress), 160, \"ownerAddress\");\n if (BigInt(note.ownerAddress) === 0n) throw new Error(\"owner address must be positive\");\n uint(note.tokenAddress, 160, \"tokenAddress\");\n}\n\nexport async function noteCommitment(context: NoteEncryptionContext, note: Note): Promise<void> {\n validateContext(context, note.tokenAddress);\n assertNoteContext(note, context);\n validateNote(note);\n const commitment = await computeNoteCommitment(\n context.chainId,\n BigInt(context.protocolAddress),\n await computeNoteIdentity(BigInt(note.ownerAddress), note.nonce),\n note.tokenAddress,\n note.amount\n );\n if (BigInt(commitment) !== BigInt(context.outputCommitment))\n throw new Error(\"output commitment mismatch\");\n}\n\nexport async function creditCommitment(\n context: NoteEncryptionContext,\n note: CreditState\n): Promise<void> {\n validateContext(context, note.tokenAddress);\n assertNoteContext(note, context);\n const commitment = await computeCreditCommitment(note);\n if (BigInt(commitment) !== BigInt(context.outputCommitment))\n throw new Error(\"credit commitment mismatch\");\n}\n","import type { CreditDeliveryState, CreditState, Note } from \"../types\";\nimport { deliveryCodec, deliveryHeader } from \"./delivery-codec\";\nimport { envelopeBytes, open, publicKey, seal, viewingPublicKey } from \"./envelope\";\nimport { normalizeCreditDeliveryState } from \"./note-payload\";\nimport {\n CreditStateDecryptionContext,\n CreditStateEncryptionContext,\n NoteBytes,\n NoteDecryptionContext,\n NoteEncryptionContext,\n} from \"./types\";\nimport { creditCommitment, noteCommitment } from \"./validation\";\n\nexport { normalizeCreditDeliveryState } from \"./note-payload\";\n\nfunction copyPayload(value: Uint8Array, codec: { minimum: number; maximum: number }): Uint8Array {\n if (!(value instanceof Uint8Array)) throw new Error(\"codec encode must return Uint8Array\");\n if (value.length + 78 < codec.minimum || value.length + 78 > codec.maximum)\n throw new Error(\"invalid codec payload length\");\n return Uint8Array.from(value);\n}\n\n/** SDK v1 funds envelope with a fixed financial prefix and opaque application bytes. */\nexport async function encryptPrivateTransferNote(\n viewingKey: NoteBytes,\n note: Note,\n context: NoteEncryptionContext\n): Promise<Uint8Array> {\n const scopedNote = structuredClone(note),\n scopedContext = { ...context };\n const codec = deliveryCodec(deliveryHeader(\"funds\"));\n if (codec.kind !== \"funds\") throw new Error(\"unexpected envelope kind\");\n await noteCommitment(scopedContext, scopedNote);\n const plaintext = copyPayload(codec.encode(structuredClone(scopedNote)), codec);\n return seal(\n viewingKey,\n plaintext,\n scopedContext,\n scopedNote.tokenAddress,\n deliveryHeader(\"funds\"),\n 0\n );\n}\n\n/** Authenticates the context and output commitment before returning the ordinary note. */\nasync function readNote(\n key: NoteBytes,\n envelope: NoteBytes,\n context: NoteDecryptionContext,\n payloadKey = false\n): Promise<Note & { payload: Uint8Array }> {\n const authenticatedContext = { ...context };\n const data = envelopeBytes(envelope, false);\n const headerByte = data[0]!;\n const plain = await open(key, data, authenticatedContext, headerByte, 0, payloadKey);\n try {\n const codec = deliveryCodec(headerByte);\n if (codec.kind !== \"funds\") throw new Error(\"unexpected envelope kind\");\n const note = structuredClone(\n codec.decode(plain, Object.freeze({ ...authenticatedContext }))\n );\n\n if (BigInt(note.ownerAddress) !== BigInt(authenticatedContext.ownerAddress))\n throw new Error(\"recipient owner address mismatch\");\n if (note.tokenAddress !== authenticatedContext.tokenAddress)\n throw new Error(\"note token context mismatch\");\n await noteCommitment(authenticatedContext, note);\n return note;\n } finally {\n plain.fill(0);\n }\n}\n\nfunction creditRole(role: string): number {\n if (role !== \"owner\" && role !== \"spender\")\n throw new Error(\"Credit role must be owner or spender\");\n return role === \"owner\" ? 1 : 2;\n}\n\nfunction matchCreditRecipient(\n state: CreditDeliveryState,\n role: \"owner\" | \"spender\",\n recipient: Uint8Array\n): void {\n const keys = role === \"owner\" ? state.ownerReceivingKeys : state.spenderReceivingKeys;\n if (!keys.viewingPublicKey.every((value, index) => value === recipient[index]))\n throw new Error(\"recipient receiving key mismatch\");\n}\n\n/** SDK v1 Credit envelope with a fixed recovery prefix and opaque application bytes. */\nexport async function encryptCreditState(\n viewingKey: NoteBytes,\n state: CreditDeliveryState,\n context: CreditStateEncryptionContext\n): Promise<Uint8Array> {\n const scopedState = normalizeCreditDeliveryState(state),\n scopedNote = scopedState.note;\n const scopedContext = { ...context };\n const codec = deliveryCodec(deliveryHeader(\"credit\"));\n if (codec.kind !== \"credit\") throw new Error(\"unexpected envelope kind\");\n creditRole(scopedContext.role);\n matchCreditRecipient(scopedState, scopedContext.role, publicKey(viewingKey));\n await creditCommitment(scopedContext, scopedNote);\n const plaintext = copyPayload(codec.encode(structuredClone(scopedState)), codec);\n return seal(\n viewingKey,\n plaintext,\n scopedContext,\n scopedNote.tokenAddress,\n deliveryHeader(\"credit\"),\n creditRole(scopedContext.role)\n );\n}\n\n/** Authenticates the complete Credit header, context and output commitment. */\nasync function readCredit(\n key: NoteBytes,\n envelope: NoteBytes,\n context: CreditStateDecryptionContext,\n payloadKey = false\n): Promise<CreditDeliveryState & { note: CreditState & { payload: Uint8Array } }> {\n const authenticatedContext = { ...context };\n const data = envelopeBytes(envelope, true);\n const plain = await open(\n key,\n data,\n authenticatedContext,\n data[0]!,\n creditRole(authenticatedContext.role),\n payloadKey\n );\n try {\n const codec = deliveryCodec(data[0]!);\n if (codec.kind !== \"credit\") throw new Error(\"unexpected envelope kind\");\n const state = normalizeCreditDeliveryState(\n structuredClone(codec.decode(plain, Object.freeze({ ...authenticatedContext })))\n );\n const note = state.note;\n if (\n BigInt(\n authenticatedContext.role === \"owner\"\n ? note.ownerWalletIdentity\n : note.spenderWalletIdentity\n ) !== BigInt(authenticatedContext.ownerAddress)\n )\n throw new Error(\"recipient owner address mismatch\");\n\n if (!payloadKey)\n matchCreditRecipient(state, authenticatedContext.role, viewingPublicKey(key));\n if (note.tokenAddress !== authenticatedContext.tokenAddress)\n throw new Error(\"Credit token context mismatch\");\n await creditCommitment(authenticatedContext, note);\n return {\n ...state,\n note: { ...state.note, payload: Uint8Array.from(state.note.payload ?? []) },\n };\n } finally {\n plain.fill(0);\n }\n}\n\n/** Authenticated recipient decryption. Application payload bytes are never decoded here. */\nexport function decryptPrivateTransferNote(\n key: NoteBytes,\n envelope: NoteBytes,\n context: NoteDecryptionContext\n): Promise<Note & { payload: Uint8Array }> {\n return readNote(key, envelope, context);\n}\n\n/** Authenticated Credit decryption, including role and historical receiving keys. */\nexport function decryptCreditState(\n key: NoteBytes,\n envelope: NoteBytes,\n context: CreditStateDecryptionContext\n): Promise<CreditDeliveryState & { note: CreditState & { payload: Uint8Array } }> {\n return readCredit(key, envelope, context);\n}\n\n// Internal disclosure primitives. Public callers use Disclosure or ViewingCapability.\nexport function decryptNotePayload(\n key: NoteBytes,\n envelope: NoteBytes,\n context: NoteDecryptionContext\n): Promise<Note & { payload: Uint8Array }> {\n return readNote(key, envelope, context, true);\n}\n\nexport function decryptCreditPayload(\n key: NoteBytes,\n envelope: NoteBytes,\n context: CreditStateDecryptionContext\n): Promise<CreditDeliveryState & { note: CreditState & { payload: Uint8Array } }> {\n return readCredit(key, envelope, context, true);\n}\n\nexport {\n CreditStateDecryptionContext,\n CreditStateEncryptionContext,\n NoteBytes,\n NoteDecryptionContext,\n NoteEncryptionContext,\n} from \"./types\";\n\nexport { exportPayloadKey, viewingPublicKey } from \"./envelope\";\n","import { bytesToHex } from \"@noble/hashes/utils\";\nimport { FIELD_MODULUS } from \"../crypto/random\";\nimport {\n decryptCreditState,\n decryptCreditPayload,\n decryptNotePayload,\n decryptPrivateTransferNote,\n exportPayloadKey,\n type CreditStateDecryptionContext,\n type NoteBytes,\n type NoteDecryptionContext,\n} from \"../delivery/encryption\";\nimport { computeNoteCommitment, computeNoteIdentity } from \"../notes/commitment\";\nimport {\n computeCreditCommitment,\n computeCreditSharedKeyHash,\n normalizeCreditPolicy,\n normalizeCreditUsage,\n} from \"../credit/state\";\nimport type { CreditState, CreditPolicy, CreditUsage, Note } from \"../types\";\n\n/** A Credit commitment opening excludes encrypted memos and the shared recovery/nullifier secret. */\nexport interface CreditOpening\n extends\n Omit<CreditState, \"creditSharedKey\" | \"memo\" | keyof CreditPolicy | keyof CreditUsage>,\n CreditPolicy,\n CreditUsage {\n creditSharedKeyHash: `0x${string}`;\n}\n\n/** Independently authenticated output data. Core verification alone does not establish inclusion. */\nexport interface DisclosureOutput {\n chainId: bigint;\n protocolAddress: bigint;\n tokenAddress: bigint;\n outputCommitment: `0x${string}`;\n role: \"funds\" | \"owner\" | \"spender\";\n ciphertext?: NoteBytes | undefined;\n}\n\n/** Sensitive transport material: obtain it only through the explicit export() operation. */\nexport interface DisclosureExport {\n version: 1;\n kind: \"note\" | \"credit\";\n method: \"opening\" | \"payload-key\";\n context: {\n chainId: string;\n protocolAddress: string;\n tokenAddress: string;\n outputCommitment: `0x${string}`;\n };\n data: Record<string, string>;\n}\n\nexport type DisclosureResult =\n | { kind: \"note\"; note: Readonly<Note> }\n | { kind: \"credit\"; note: Readonly<CreditOpening & { payload?: Uint8Array }> };\n\nconst NOTE_FIELDS = [\"ownerAddress\", \"amount\", \"nonce\"] as const;\nconst CREDIT_FIELDS = [\n \"spenderWalletIdentity\",\n \"ownerWalletIdentity\",\n \"revocationShard\",\n \"revocationSlot\",\n \"nonce\",\n \"expiry\",\n \"creditSharedKeyHash\",\n \"singleLimit\",\n \"dailyLimit\",\n \"monthlyLimit\",\n \"availableCredit\",\n \"unlimited\",\n \"lastDay\",\n \"dailySpent\",\n \"lastMonth\",\n \"monthlySpent\",\n \"totalSpent\",\n] as const;\n\nfunction record(value: unknown, fields: readonly string[]): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n throw new Error(\"invalid disclosure object\");\n const keys = Object.keys(value);\n if (keys.length !== fields.length || keys.some((key) => !fields.includes(key)))\n throw new Error(\"unexpected disclosure fields\");\n return value as Record<string, unknown>;\n}\n\nfunction number(value: unknown, bits: number, label: string): bigint {\n if (typeof value !== \"bigint\" || value < 0n || value >= 1n << BigInt(bits))\n throw new Error(`invalid disclosure ${label}`);\n return value;\n}\n\nfunction decimal(value: unknown, bits: number, label: string): bigint {\n if (typeof value !== \"string\" || !/^(0|[1-9][0-9]*)$/.test(value) || value.length > 78)\n throw new Error(`invalid disclosure ${label}`);\n return number(BigInt(value), bits, label);\n}\n\nfunction hash(value: unknown, label: string, field = true): `0x${string}` {\n if (typeof value !== \"string\" || !/^0x[0-9a-fA-F]{64}$/.test(value))\n throw new Error(`invalid disclosure ${label}`);\n if (field && BigInt(value) >= FIELD_MODULUS) throw new Error(`invalid disclosure ${label}`);\n return value.toLowerCase() as `0x${string}`;\n}\n\nfunction owner(value: unknown, label: string): `0x${string}` {\n if (typeof value !== \"string\" || !/^0x[0-9a-fA-F]{40}$/.test(value) || BigInt(value) === 0n)\n throw new Error(`invalid disclosure ${label}`);\n return value.toLowerCase() as `0x${string}`;\n}\n\nfunction nonce(value: bigint): bigint {\n if (value < 0n || value >= FIELD_MODULUS) throw new Error(\"invalid disclosure nonce\");\n return value;\n}\n\nfunction context(value: Pick<DisclosureOutput, \"chainId\" | \"protocolAddress\" | \"tokenAddress\">) {\n const result = {\n chainId: number(value.chainId, 64, \"chainId\"),\n protocolAddress: number(value.protocolAddress, 160, \"protocolAddress\"),\n tokenAddress: number(value.tokenAddress, 160, \"tokenAddress\"),\n };\n if (result.protocolAddress === 0n || result.tokenAddress === 0n)\n throw new Error(\"disclosure addresses must be nonzero\");\n return result;\n}\n\nfunction encode(values: Record<string, bigint | string>): Record<string, string> {\n return Object.fromEntries(\n Object.entries(values).map(([key, value]) => [key, value.toString()])\n );\n}\n\nasync function creditOpening(note: CreditState): Promise<CreditOpening> {\n const copied = { ...note };\n return {\n ...context(copied),\n ...normalizeCreditPolicy(copied),\n ...normalizeCreditUsage(copied),\n availableCredit: number(copied.availableCredit, 128, \"availableCredit\"),\n unlimited: copied.unlimited,\n spenderWalletIdentity: owner(copied.spenderWalletIdentity, \"spender identity\"),\n ownerWalletIdentity: owner(copied.ownerWalletIdentity, \"owner identity\"),\n revocationShard: number(copied.revocationShard, 64, \"revocation shard\"),\n revocationSlot: number(copied.revocationSlot, 16, \"revocation slot\"),\n nonce: nonce(copied.nonce),\n expiry: number(copied.expiry, 64, \"expiry\"),\n creditSharedKeyHash: await computeCreditSharedKeyHash(copied.creditSharedKey),\n };\n}\n\nasync function commitment(note: Note | CreditOpening): Promise<`0x${string}`> {\n if (\"creditSharedKeyHash\" in note) {\n return computeCreditCommitment({ ...note, creditSharedKey: 0n }, note.creditSharedKeyHash);\n }\n return computeNoteCommitment(\n note.chainId,\n BigInt(note.protocolAddress),\n await computeNoteIdentity(BigInt(note.ownerAddress), note.nonce),\n note.tokenAddress,\n note.amount\n );\n}\n\n/** Scoped disclosure material. Default JSON/inspection is redacted; export() is deliberately sensitive. */\nexport class Disclosure {\n readonly #material: DisclosureExport;\n\n private constructor(material: DisclosureExport) {\n this.#material = {\n ...material,\n context: Object.freeze({ ...material.context }),\n data: Object.freeze({ ...material.data }),\n };\n Object.freeze(this.#material);\n Object.freeze(this);\n }\n\n static async fromNote(value: Note): Promise<Disclosure> {\n const copied = { ...value };\n const note: Note = {\n ...context(copied),\n ownerAddress: owner(copied.ownerAddress, \"owner address\"),\n amount: number(copied.amount, 128, \"amount\"),\n nonce: nonce(copied.nonce),\n };\n return new Disclosure({\n version: 1,\n kind: \"note\",\n method: \"opening\",\n context: {\n ...encode(context(note)),\n outputCommitment: await commitment(note),\n } as DisclosureExport[\"context\"],\n data: encode({\n ownerAddress: note.ownerAddress,\n amount: note.amount,\n nonce: note.nonce,\n }),\n });\n }\n\n static async fromCredit(value: CreditState): Promise<Disclosure> {\n const note = await creditOpening(value);\n const data = Object.fromEntries(\n CREDIT_FIELDS.map((key) => [\n key,\n key === \"unlimited\" ? (note.unlimited ? \"1\" : \"0\") : note[key].toString(),\n ])\n );\n return new Disclosure({\n version: 1,\n kind: \"credit\",\n method: \"opening\",\n context: {\n ...encode(context(note)),\n outputCommitment: await commitment(note),\n } as DisclosureExport[\"context\"],\n data,\n });\n }\n\n /** Low-level factory; normally use wallet.getViewer().discloseNote(). */\n static async fromEncryptedNote(\n key: NoteBytes,\n envelope: NoteBytes,\n value: NoteDecryptionContext\n ): Promise<Disclosure> {\n const scoped = { ...value };\n const copied = typeof envelope === \"string\" ? envelope : Uint8Array.from(envelope);\n const localKey = typeof key === \"string\" ? key : Uint8Array.from(key);\n try {\n await decryptPrivateTransferNote(localKey, copied, scoped);\n return await Disclosure.fromEnvelope(localKey, copied, scoped, \"funds\");\n } finally {\n if (localKey instanceof Uint8Array) localKey.fill(0);\n }\n }\n\n /** Exposes the full selected Credit envelope, including its shared key and receiving snapshots. */\n static async fromEncryptedCredit(\n key: NoteBytes,\n envelope: NoteBytes,\n value: CreditStateDecryptionContext\n ): Promise<Disclosure> {\n const scoped = { ...value };\n const copied = typeof envelope === \"string\" ? envelope : Uint8Array.from(envelope);\n const localKey = typeof key === \"string\" ? key : Uint8Array.from(key);\n try {\n await decryptCreditState(localKey, copied, scoped);\n return await Disclosure.fromEnvelope(localKey, copied, scoped, scoped.role);\n } finally {\n if (localKey instanceof Uint8Array) localKey.fill(0);\n }\n }\n\n private static async fromEnvelope(\n key: NoteBytes,\n envelope: NoteBytes,\n scoped: NoteDecryptionContext,\n role: DisclosureOutput[\"role\"]\n ): Promise<Disclosure> {\n const payloadKey = await exportPayloadKey(key, envelope, role !== \"funds\");\n try {\n return new Disclosure({\n version: 1,\n kind: role === \"funds\" ? \"note\" : \"credit\",\n method: \"payload-key\",\n context: {\n ...encode(context(scoped)),\n outputCommitment: hash(scoped.outputCommitment, \"commitment\"),\n } as DisclosureExport[\"context\"],\n data: {\n payloadKey: `0x${bytesToHex(payloadKey)}`,\n ownerAddress: owner(scoped.ownerAddress, \"owner address\"),\n role,\n },\n });\n } finally {\n payloadKey.fill(0);\n }\n }\n\n /** Parse untrusted JSON material; verification against an independent output is still required. */\n static async fromExport(value: unknown): Promise<Disclosure> {\n const root = record(value, [\"version\", \"kind\", \"method\", \"context\", \"data\"]);\n if (\n root.version !== 1 ||\n (root.kind !== \"note\" && root.kind !== \"credit\") ||\n (root.method !== \"opening\" && root.method !== \"payload-key\")\n )\n throw new Error(\"unsupported disclosure format\");\n const rawContext = record(root.context, [\n \"chainId\",\n \"protocolAddress\",\n \"tokenAddress\",\n \"outputCommitment\",\n ]);\n const scoped = context({\n chainId: decimal(rawContext.chainId, 64, \"chainId\"),\n protocolAddress: decimal(rawContext.protocolAddress, 160, \"protocolAddress\"),\n tokenAddress: decimal(rawContext.tokenAddress, 160, \"tokenAddress\"),\n });\n const outputCommitment = hash(rawContext.outputCommitment, \"commitment\");\n const fields =\n root.method === \"payload-key\"\n ? [\"payloadKey\", \"ownerAddress\", \"role\"]\n : root.kind === \"note\"\n ? NOTE_FIELDS\n : CREDIT_FIELDS;\n const raw = record(root.data, fields);\n const data: Record<string, string> = {};\n for (const key of fields) {\n if (key === \"role\") {\n if (\n root.kind === \"note\"\n ? raw[key] !== \"funds\"\n : raw[key] !== \"owner\" && raw[key] !== \"spender\"\n )\n throw new Error(\"invalid disclosure role\");\n data[key] = raw[key] as string;\n } else if (\n key === \"payloadKey\" ||\n key.endsWith(\"Identity\") ||\n key === \"ownerAddress\" ||\n key === \"creditSharedKeyHash\"\n ) {\n data[key] =\n key.endsWith(\"Identity\") || key === \"ownerAddress\"\n ? owner(raw[key], key)\n : hash(raw[key], key, key !== \"payloadKey\");\n } else if (key === \"unlimited\") {\n if (raw[key] !== \"0\" && raw[key] !== \"1\")\n throw Error(\"invalid disclosure unlimited\");\n data[key] = raw[key] as string;\n } else {\n const bits =\n key === \"availableCredit\"\n ? 128\n : key.endsWith(\"Payout\")\n ? 160\n : key === \"expiry\"\n ? 64\n : key === \"amount\"\n ? root.kind === \"note\"\n ? 128\n : 126\n : 254;\n const parsed = decimal(raw[key], bits, key);\n if (key === \"nonce\") nonce(parsed);\n data[key] = parsed.toString();\n }\n }\n const material: DisclosureExport = {\n version: 1,\n kind: root.kind,\n method: root.method,\n context: { ...encode(scoped), outputCommitment } as DisclosureExport[\"context\"],\n data,\n };\n const result = new Disclosure(material);\n if (material.method === \"opening\")\n await result.verify({\n ...scoped,\n outputCommitment,\n role: material.kind === \"note\" ? \"funds\" : \"owner\",\n });\n return result;\n }\n\n getScope() {\n const { version, kind, method } = this.#material;\n return {\n version,\n kind,\n method,\n permitsOwnerSweep: kind === \"note\",\n revealsNoteConsumption: kind === \"note\",\n revealsCreditSharedKey: kind === \"credit\" && method === \"payload-key\",\n revealsReceivingKeys: kind === \"credit\" && method === \"payload-key\",\n revealsMemo: method === \"payload-key\",\n revealsPayload: method === \"payload-key\",\n };\n }\n\n /** Explicitly export sensitive, JSON-compatible material for a chosen recipient. */\n export(): DisclosureExport {\n return {\n ...this.#material,\n context: { ...this.#material.context },\n data: { ...this.#material.data },\n };\n }\n\n async verify(value: DisclosureOutput): Promise<DisclosureResult> {\n const output = {\n ...value,\n ciphertext:\n value.ciphertext instanceof Uint8Array\n ? Uint8Array.from(value.ciphertext)\n : value.ciphertext,\n };\n const scoped = context(output);\n const material = this.#material;\n for (const field of [\"chainId\", \"protocolAddress\", \"tokenAddress\"] as const) {\n if (scoped[field].toString() !== material.context[field])\n throw new Error(\"disclosure deployment context mismatch\");\n }\n if (hash(output.outputCommitment, \"commitment\") !== material.context.outputCommitment)\n throw new Error(\"disclosure output commitment mismatch\");\n if (\n material.kind === \"note\"\n ? output.role !== \"funds\"\n : output.role !== \"owner\" && output.role !== \"spender\"\n )\n throw new Error(\"disclosure output role mismatch\");\n const data = material.data;\n if (material.method === \"payload-key\") {\n if (output.role !== data.role || output.ciphertext === undefined)\n throw new Error(\"disclosure requires the selected role envelope\");\n const decryption = {\n ...scoped,\n outputCommitment: output.outputCommitment,\n ownerAddress: data.ownerAddress as `0x${string}`,\n };\n if (material.kind === \"note\")\n return {\n kind: \"note\",\n note: Object.freeze(\n await decryptNotePayload(\n data.payloadKey as `0x${string}`,\n output.ciphertext,\n decryption\n )\n ),\n };\n const state = await decryptCreditPayload(\n data.payloadKey as `0x${string}`,\n output.ciphertext,\n { ...decryption, role: output.role as \"owner\" | \"spender\" }\n );\n return {\n kind: \"credit\",\n note: Object.freeze({\n ...(await creditOpening(state.note)),\n ...(state.note.payload === undefined\n ? {}\n : { payload: structuredClone(state.note.payload) }),\n }),\n };\n }\n if (material.kind === \"note\") {\n const note: Note = {\n ...scoped,\n ownerAddress: data.ownerAddress as `0x${string}`,\n amount: BigInt(data.amount!),\n nonce: BigInt(data.nonce!),\n };\n if ((await commitment(note)) !== material.context.outputCommitment)\n throw new Error(\"disclosure opening commitment mismatch\");\n return { kind: \"note\", note: Object.freeze(note) };\n }\n const note: CreditOpening = {\n ...scoped,\n spenderWalletIdentity: data.spenderWalletIdentity as `0x${string}`,\n ownerWalletIdentity: data.ownerWalletIdentity as `0x${string}`,\n revocationShard: BigInt(data.revocationShard!),\n revocationSlot: BigInt(data.revocationSlot!),\n nonce: BigInt(data.nonce!),\n expiry: BigInt(data.expiry!),\n ...normalizeCreditPolicy(\n Object.fromEntries(\n [\"singleLimit\", \"dailyLimit\", \"monthlyLimit\"].map((k) => [k, BigInt(data[k]!)])\n )\n ),\n ...normalizeCreditUsage(\n Object.fromEntries(\n [\"lastDay\", \"dailySpent\", \"lastMonth\", \"monthlySpent\", \"totalSpent\"].map(\n (k) => [k, BigInt(data[k]!)]\n )\n )\n ),\n availableCredit: BigInt(data.availableCredit!),\n unlimited: data.unlimited === \"1\",\n creditSharedKeyHash: data.creditSharedKeyHash as `0x${string}`,\n };\n if ((await commitment(note)) !== material.context.outputCommitment)\n throw new Error(\"disclosure opening commitment mismatch\");\n return { kind: \"credit\", note: Object.freeze(note) };\n }\n\n toJSON() {\n return { capability: \"disclosure\", ...this.getScope() };\n }\n\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n return this.toJSON();\n }\n}\n","import { D_NULL } from \"../crypto/domains\";\nimport { poseidonHash } from \"../crypto/poseidon\";\nimport { FIELD_MODULUS } from \"../crypto/random\";\n\n/** Bind the complete note leaf to its committed private nonce. */\nexport async function computeNoteNullifier(\n chainId: bigint,\n protocolAddress: bigint,\n nonce: bigint,\n commitment: `0x${string}`\n): Promise<`0x${string}`> {\n if (chainId < 0n || chainId >= 1n << 64n) throw new RangeError(\"invalid chainId\");\n if (protocolAddress <= 0n || protocolAddress >= 1n << 160n)\n throw new RangeError(\"invalid protocol address\");\n if (nonce < 0n || nonce >= FIELD_MODULUS) throw new RangeError(\"invalid note nonce\");\n if (!/^0x[0-9a-fA-F]{64}$/.test(commitment))\n throw new Error(\"invalid note commitment encoding\");\n return poseidonHash([D_NULL, chainId, protocolAddress, nonce, BigInt(commitment)]);\n}\n","import { secp256k1 } from \"@noble/curves/secp256k1\";\nimport { bytesToHex, hexToBytes } from \"@noble/hashes/utils\";\nimport { ReceivingAddress } from \"../address/receiving-address\";\nimport {\n decryptCreditState,\n decryptPrivateTransferNote,\n viewingPublicKey,\n type CreditStateDecryptionContext,\n type NoteBytes,\n type NoteDecryptionContext,\n} from \"../delivery/encryption\";\nimport { Disclosure } from \"../disclosure/disclosure\";\nimport { deriveClueKey } from \"../fmd/fmd\";\nimport { computeNoteNullifier } from \"../notes/nullifier\";\nimport {\n buildWalletAuthorizationWitness,\n computeOwnerAddress,\n computeWalletAuthorizationDigest,\n type WalletAuthorizationRequest,\n type WalletAuthorizationWitness,\n type WalletBytes,\n} from \"./wallet\";\n\ntype Identity = `0x${string}`;\n\nconst copyWitness = (witness: WalletAuthorizationWitness): WalletAuthorizationWitness => ({\n public_key_x: [...witness.public_key_x],\n public_key_y: [...witness.public_key_y],\n signature: [...witness.signature],\n});\n\nconst inspect = Symbol.for(\"nodejs.util.inspect.custom\");\n\nfunction copyBytes(value: WalletBytes): Uint8Array {\n if (typeof value === \"string\" && !/^0x(?:[0-9a-fA-F]{2})+$/.test(value)) {\n throw new Error(\"invalid hexadecimal bytes\");\n }\n return typeof value === \"string\" ? hexToBytes(value.slice(2)) : Uint8Array.from(value);\n}\n\nfunction identity(value: Identity): Identity {\n return ReceivingAddress.fromIdentity(value).ownerAddress;\n}\n\n/** Local viewing permission, permitting note recovery and owner-only sweep, without arbitrary spending. */\nexport class ViewingCapability {\n readonly #key: Uint8Array;\n readonly ownerAddress: Identity;\n\n constructor(ownerAddress: Identity, privateKey: WalletBytes, expectedPublicKey?: Uint8Array) {\n this.ownerAddress = identity(ownerAddress);\n this.#key = copyBytes(privateKey);\n const publicKey = viewingPublicKey(this.#key);\n if (expectedPublicKey && bytesToHex(publicKey) !== bytesToHex(expectedPublicKey)) {\n throw new Error(\"viewing key pair mismatch\");\n }\n Object.freeze(this);\n }\n\n decryptNote(envelope: NoteBytes, context: Omit<NoteDecryptionContext, \"ownerAddress\">) {\n return decryptPrivateTransferNote(this.#key, envelope, {\n ...context,\n ownerAddress: this.ownerAddress,\n });\n }\n\n decryptCredit(\n envelope: NoteBytes,\n context: Omit<CreditStateDecryptionContext, \"ownerAddress\">\n ) {\n return decryptCreditState(this.#key, envelope, {\n ...context,\n ownerAddress: this.ownerAddress,\n });\n }\n\n getPublicKey(): Uint8Array {\n return viewingPublicKey(this.#key);\n }\n\n /** Disclose this authenticated output's payload key, without exporting the wallet viewing key. */\n discloseNote(envelope: NoteBytes, context: Omit<NoteDecryptionContext, \"ownerAddress\">) {\n return Disclosure.fromEncryptedNote(this.#key, envelope, {\n ...context,\n ownerAddress: this.ownerAddress,\n });\n }\n\n /** Exposes the entire Credit envelope; prefer Disclosure.fromCredit() for hash-only opening. */\n discloseCredit(\n envelope: NoteBytes,\n context: Omit<CreditStateDecryptionContext, \"ownerAddress\">\n ) {\n return Disclosure.fromEncryptedCredit(this.#key, envelope, {\n ...context,\n ownerAddress: this.ownerAddress,\n });\n }\n\n /** Explicit sensitive export for delegating viewing. It grants note recovery and owner-only sweep permission. */\n exportKey(): Uint8Array {\n return Uint8Array.from(this.#key);\n }\n\n toJSON() {\n return { capability: \"viewing\", ownerAddress: this.ownerAddress };\n }\n\n [inspect]() {\n return this.toJSON();\n }\n}\n\n/** Delegated candidate detection key, without viewing or spending. */\nexport class Detector {\n readonly #key: Uint8Array;\n readonly #clueKey: Uint8Array;\n\n constructor(key: Uint8Array) {\n this.#key = Uint8Array.from(key);\n this.#clueKey = deriveClueKey(this.#key);\n Object.freeze(this);\n }\n\n getClueKey(): Uint8Array {\n return Uint8Array.from(this.#clueKey);\n }\n\n /** Full detection delegation; the receiver chooses the checked prefix length. */\n exportKey(): Uint8Array {\n return Uint8Array.from(this.#key);\n }\n\n toJSON() {\n return { capability: \"detection\" };\n }\n\n [inspect]() {\n return this.toJSON();\n }\n}\n\n/** Note-derived spent-state calculation; the note opening supplies its nonce. */\nexport class NullifierCapability {\n readonly ownerAddress: Identity;\n\n private constructor(ownerAddress: Identity) {\n this.ownerAddress = identity(ownerAddress);\n Object.freeze(this);\n }\n\n static fromIdentity(ownerAddress: Identity): NullifierCapability {\n return new NullifierCapability(ownerAddress);\n }\n\n compute(\n chainId: bigint,\n protocolAddress: bigint,\n commitment: Identity,\n nonce: bigint\n ): Promise<Identity> {\n return computeNoteNullifier(chainId, protocolAddress, nonce, commitment);\n }\n\n toJSON() {\n return { capability: \"nullifier\", ownerAddress: this.ownerAddress };\n }\n\n [inspect]() {\n return this.toJSON();\n }\n}\n\n/** Frozen local authorization. Witness access is an explicit trusted proving boundary. */\nexport class AuthorizedStatement {\n readonly #witness: WalletAuthorizationWitness;\n readonly digest: Identity;\n readonly ownerAddress: Identity;\n\n constructor(ownerAddress: Identity, digest: Identity, witness: WalletAuthorizationWitness) {\n this.ownerAddress = ownerAddress;\n this.digest = digest;\n this.#witness = copyWitness(witness);\n Object.freeze(this);\n }\n\n withWitness<T>(assemble: (witness: WalletAuthorizationWitness) => T): T {\n return assemble(copyWitness(this.#witness));\n }\n\n toJSON() {\n return { ownerAddress: this.ownerAddress, digest: this.digest };\n }\n\n [inspect]() {\n return this.toJSON();\n }\n}\n\nexport interface WalletAuthorizationProvider {\n readonly ownerAddress: Identity;\n authorize(request: WalletAuthorizationRequest): Promise<AuthorizedStatement>;\n}\n\n/** Invisi circuit authorization, independent of an EVM funding wallet or submitter. */\nexport class WalletAuthorization implements WalletAuthorizationProvider {\n readonly #privateKey: Uint8Array;\n readonly #publicKey: Uint8Array;\n readonly ownerAddress: Identity;\n\n private constructor(ownerAddress: Identity, privateKey: Uint8Array, publicKey: Uint8Array) {\n this.ownerAddress = ownerAddress;\n this.#privateKey = privateKey;\n this.#publicKey = publicKey;\n Object.freeze(this);\n }\n\n static async fromMaterial(\n ownerAddress: Identity,\n privateKey: WalletBytes\n ): Promise<WalletAuthorization> {\n const privateBytes = copyBytes(privateKey);\n const publicBytes = secp256k1.getPublicKey(privateBytes, false);\n if ((await computeOwnerAddress(publicBytes)) !== identity(ownerAddress)) {\n throw new Error(\"owner address mismatch\");\n }\n return new WalletAuthorization(identity(ownerAddress), privateBytes, publicBytes);\n }\n\n getPublicKey(): Uint8Array {\n return Uint8Array.from(this.#publicKey);\n }\n\n async authorize(request: WalletAuthorizationRequest): Promise<AuthorizedStatement> {\n const frozen = { ...request, context: { ...request.context }, words: [...request.words] };\n const digest = computeWalletAuthorizationDigest(frozen);\n const witness = await buildWalletAuthorizationWitness(\n {\n ownerAddress: this.ownerAddress,\n spendingPrivateKey: this.#privateKey,\n spendingPublicKey: this.#publicKey,\n },\n frozen\n );\n return new AuthorizedStatement(this.ownerAddress, digest, witness);\n }\n\n toJSON() {\n return { capability: \"wallet-authorization\", ownerAddress: this.ownerAddress };\n }\n\n [inspect]() {\n return this.toJSON();\n }\n}\n","import { secp256k1 } from \"@noble/curves/secp256k1\";\nimport { hkdf } from \"@noble/hashes/hkdf\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { keccak_256 } from \"@noble/hashes/sha3\";\nimport { bytesToHex, concatBytes, hexToBytes, utf8ToBytes } from \"@noble/hashes/utils\";\nimport { FIELD_MODULUS } from \"../crypto/random\";\nimport { deriveClueKey } from \"../fmd/fmd\";\nimport type { ProtocolContext } from \"../types\";\n\nexport type WalletBytes = Uint8Array | `0x${string}`;\nexport interface InvisiWallet {\n spendingPrivateKey: Uint8Array;\n spendingPublicKey: Uint8Array;\n viewingPrivateKey: Uint8Array;\n viewingPublicKey: Uint8Array;\n detectionSeed: Uint8Array;\n detectionKey: Uint8Array;\n clueKey: Uint8Array;\n ownerAddress: `0x${string}`;\n}\nconst OPERATIONS = {\n transact: \"Transact\",\n \"create-credit\": \"CreateCredit\",\n \"credit-draw\": \"CreditDraw\",\n \"update-credit\": \"UpdateCredit\",\n} as const;\nexport type WalletOperation = keyof typeof OPERATIONS;\nexport interface WalletAuthorizationRequest {\n context: ProtocolContext;\n operation: WalletOperation;\n capacity: number;\n /** Complete, canonically padded operation words before the two digest limbs. */\n words: readonly bigint[];\n}\nexport const WALLET_AUTHORIZATION_TYPES = {\n WalletAuthorization: [\n { name: \"operation\", type: \"bytes32\" },\n { name: \"statementHash\", type: \"bytes32\" },\n ],\n} as const;\nconst FMD_SCALAR_MODULUS =\n 2111115437357092606062206234695386632838870926408408195193685246394721360383n;\nconst hex = (value: Uint8Array): `0x${string}` => `0x${bytesToHex(value)}`;\nfunction bytes(value: string | Uint8Array, length?: number): Uint8Array {\n if (typeof value === \"string\" && !/^0x(?:[0-9a-fA-F]{2})*$/.test(value))\n throw new Error(\"invalid hexadecimal bytes\");\n if (typeof value !== \"string\" && !(value instanceof Uint8Array))\n throw new TypeError(\"expected bytes\");\n const result = typeof value === \"string\" ? hexToBytes(value.slice(2)) : Uint8Array.from(value);\n if (length !== undefined && result.length !== length)\n throw new Error(`expected ${length} bytes`);\n return result;\n}\nfunction integer(value: Uint8Array): bigint {\n return BigInt(\"0x\" + bytesToHex(value));\n}\nfunction word(value: bigint): Uint8Array {\n if (value < 0n || value >= 1n << 256n) throw new RangeError(\"value exceeds uint256\");\n return hexToBytes(value.toString(16).padStart(64, \"0\"));\n}\nfunction nonzeroField(value: bigint, name: string): void {\n if (typeof value !== \"bigint\" || value <= 0n || value >= FIELD_MODULUS)\n throw new RangeError(`invalid ${name}`);\n}\nfunction deriveScalar(\n key: Uint8Array,\n salt: string,\n littleEndian = false,\n modulus = FIELD_MODULUS\n): Uint8Array {\n for (let counter = 0; counter <= 0xffffffff; counter++) {\n const info = new Uint8Array([counter >>> 24, counter >>> 16, counter >>> 8, counter]);\n const result = hkdf(sha256, key, utf8ToBytes(salt), info, 32);\n if (littleEndian) result[31] = result[31]! & 7;\n const candidate = integer(littleEndian ? result.slice().reverse() : result);\n if (candidate > 0n && candidate < (littleEndian ? FMD_SCALAR_MODULUS : modulus))\n return result;\n result.fill(0);\n }\n throw new Error(\"scalar derivation exhausted\");\n}\n\n/** Standard EVM owner address from a validated secp256k1 public key. */\nexport async function computeOwnerAddress(publicKey: WalletBytes): Promise<`0x${string}`> {\n const point = secp256k1.ProjectivePoint.fromHex(bytes(publicKey));\n point.assertValidity();\n return hex(keccak_256(point.toRawBytes(false).slice(1)).slice(12));\n}\n\n/** Derive a complete Invisi wallet from an EVM account private key, independent of HD paths. */\nexport async function deriveWallet(privateKey: string | Uint8Array): Promise<InvisiWallet> {\n const input = bytes(privateKey, 32);\n let root: Uint8Array | undefined;\n let spendingPrivateKey: Uint8Array | undefined;\n let viewingPrivateKey: Uint8Array | undefined;\n let detectionSeed: Uint8Array | undefined;\n let detectionKey: Uint8Array | undefined;\n let complete = false;\n try {\n if (!secp256k1.utils.isValidPrivateKey(input)) {\n throw new RangeError(\"invalid EVM account private key\");\n }\n root = hkdf(sha256, input, utf8ToBytes(\"Invisi.WalletRoot.v1\"), new Uint8Array(), 32);\n spendingPrivateKey = Uint8Array.from(input);\n viewingPrivateKey = deriveScalar(\n root,\n \"Invisi.WalletViewingKey.v1\",\n false,\n secp256k1.CURVE.n\n );\n detectionSeed = hkdf(\n sha256,\n root,\n utf8ToBytes(\"Invisi.WalletDetectionSeed.v1\"),\n new Uint8Array(),\n 32\n );\n const spendingPublicKey = secp256k1.getPublicKey(spendingPrivateKey, false);\n const ownerAddress = await computeOwnerAddress(spendingPublicKey);\n nonzeroField(BigInt(ownerAddress), \"owner address\");\n detectionKey = deriveScalar(detectionSeed, \"Invisi.WalletDetectionKey.v1\", true);\n const wallet = {\n spendingPrivateKey,\n spendingPublicKey,\n viewingPrivateKey,\n viewingPublicKey: secp256k1.getPublicKey(viewingPrivateKey, true),\n detectionSeed,\n detectionKey,\n clueKey: deriveClueKey(detectionKey),\n ownerAddress,\n };\n complete = true;\n return wallet;\n } finally {\n input.fill(0);\n root?.fill(0);\n if (!complete) {\n spendingPrivateKey?.fill(0);\n viewingPrivateKey?.fill(0);\n detectionSeed?.fill(0);\n detectionKey?.fill(0);\n }\n }\n}\n\n/** EIP712 data for private circuit authorization, independent of EVM funding signatures. */\nexport function walletAuthorizationTypedData(request: WalletAuthorizationRequest) {\n const { context, operation, capacity, words } = request;\n if (!Object.hasOwn(OPERATIONS, operation)) throw new Error(\"unsupported wallet operation\");\n const allowed =\n operation === \"transact\"\n ? [\n 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130,\n 140, 150, 160, 170, 180, 190,\n ]\n : operation === \"credit-draw\"\n ? [1, 2, 3, 4, 5, 10, 20, 30, 40, 50, 60, 70, 80]\n : [1];\n if (!allowed.includes(capacity)) throw new Error(\"invalid operation capacity\");\n if (!Array.isArray(words) || words.length < 2) throw new Error(\"public words required\");\n for (const value of words)\n if (typeof value !== \"bigint\" || value < 0n || value >= FIELD_MODULUS)\n throw new RangeError(\"noncanonical public field\");\n const { chainId, protocolAddress } = context;\n if (typeof chainId !== \"bigint\" || chainId < 0n || chainId >= 1n << 64n)\n throw new RangeError(\"invalid chain id\");\n if (\n typeof protocolAddress !== \"bigint\" ||\n protocolAddress <= 0n ||\n protocolAddress >= 1n << 160n\n )\n throw new RangeError(\"invalid protocol address\");\n if (words[0] !== chainId) throw new Error(\"statement chain mismatch\");\n if (words[1] !== protocolAddress) throw new Error(\"statement instance mismatch\");\n const statement = concatBytes(\n word(BigInt(capacity)),\n word(64n),\n word(BigInt(words.length)),\n ...words.map(word)\n );\n return {\n domain: {\n name: \"InvisibleProtocol\",\n version: \"1\",\n chainId,\n verifyingContract:\n `0x${protocolAddress.toString(16).padStart(40, \"0\")}` as `0x${string}`,\n },\n types: WALLET_AUTHORIZATION_TYPES,\n primaryType: \"WalletAuthorization\" as const,\n message: {\n operation: hex(\n keccak_256(\n utf8ToBytes(\n `Invisi.${OPERATIONS[operation]}.${operation === \"transact\" ? \"v1\" : \"v4\"}`\n )\n )\n ),\n statementHash: hex(keccak_256(statement)),\n },\n };\n}\n\nexport function computeWalletAuthorizationDigest(\n request: WalletAuthorizationRequest\n): `0x${string}` {\n const data = walletAuthorizationTypedData(request),\n hashText = (text: string) => keccak_256(utf8ToBytes(text));\n const domain = keccak_256(\n concatBytes(\n hashText(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n ),\n hashText(data.domain.name),\n hashText(data.domain.version),\n word(data.domain.chainId),\n word(BigInt(data.domain.verifyingContract))\n )\n );\n const structure = keccak_256(\n concatBytes(\n hashText(\"WalletAuthorization(bytes32 operation,bytes32 statementHash)\"),\n bytes(data.message.operation),\n bytes(data.message.statementHash)\n )\n );\n return hex(keccak_256(concatBytes(new Uint8Array([0x19, 0x01]), domain, structure)));\n}\n\n/** Raw low-s r||s; this signature stays in the private proving witness. */\nexport function signWalletAuthorization(\n privateKey: WalletBytes,\n request: WalletAuthorizationRequest\n): `0x${string}` {\n return hex(\n secp256k1\n .sign(bytes(computeWalletAuthorizationDigest(request)), bytes(privateKey, 32), {\n lowS: true,\n })\n .toCompactRawBytes()\n );\n}\n\nexport async function verifyWalletAuthorization(\n expectedIdentity: `0x${string}`,\n publicKey: WalletBytes,\n signature: WalletBytes,\n request: WalletAuthorizationRequest\n): Promise<boolean> {\n const raw = bytes(signature, 64),\n digest = bytes(computeWalletAuthorizationDigest(request));\n if ((await computeOwnerAddress(publicKey)) !== expectedIdentity) return false;\n return secp256k1.verify(raw, digest, bytes(publicKey), { lowS: true });\n}\n\nexport interface WalletAuthorizationWitness {\n public_key_x: number[];\n public_key_y: number[];\n signature: number[];\n}\n/** Local signature witness; never serialize this as an ordinary application request. */\nexport async function buildWalletAuthorizationWitness(\n wallet: Pick<InvisiWallet, \"spendingPrivateKey\" | \"spendingPublicKey\" | \"ownerAddress\">,\n request: WalletAuthorizationRequest\n): Promise<WalletAuthorizationWitness> {\n const publicKey = secp256k1.ProjectivePoint.fromHex(bytes(wallet.spendingPublicKey)).toRawBytes(\n false\n );\n const privateKey = bytes(wallet.spendingPrivateKey, 32),\n identity = wallet.ownerAddress;\n const statement = { ...request, context: { ...request.context }, words: [...request.words] };\n try {\n const derived = secp256k1.getPublicKey(privateKey, false);\n if (!derived.every((value, i) => value === publicKey[i]))\n throw new Error(\"spending key pair mismatch\");\n if (BigInt(await computeOwnerAddress(publicKey)) !== BigInt(identity))\n throw new Error(\"owner address mismatch\");\n return {\n public_key_x: Array.from(publicKey.slice(1, 33)),\n public_key_y: Array.from(publicKey.slice(33)),\n signature: Array.from(bytes(signWalletAuthorization(privateKey, statement), 64)),\n };\n } finally {\n privateKey.fill(0);\n }\n}\n","import { ReceivingAddress } from \"../address/receiving-address\";\nimport { MissingCapabilityError } from \"../errors\";\nimport { NullifierCapability } from \"./capabilities\";\n\n/** Public identity and receiving keys. */\nexport class WalletAddress {\n readonly #address: ReceivingAddress;\n\n protected constructor(address: ReceivingAddress) {\n this.#address = address;\n }\n\n get ownerAddress(): `0x${string}` {\n return this.#address.ownerAddress;\n }\n\n get viewingPublicKey(): Uint8Array {\n return this.#address.viewingPublicKey;\n }\n\n get clueKey(): Uint8Array {\n return this.#address.clueKey;\n }\n\n /** Complete 0i receiving address. Owner-only wallets must first resolve their receiving keys. */\n getAddress(): string {\n if (this.#address.kind !== \"long\") {\n throw new MissingCapabilityError(\"resolved receiving keys\");\n }\n return this.#address.toString();\n }\n\n getReceivingAddress(): ReceivingAddress {\n return this.#address;\n }\n\n /** Nullifiers derive from public identity and do not grant spending authority. */\n exportNullifier(): NullifierCapability {\n return NullifierCapability.fromIdentity(this.ownerAddress);\n }\n\n toJSON() {\n return { ownerAddress: this.ownerAddress, address: this.#address.toString() };\n }\n\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n return this.toJSON();\n }\n}\n\n/** Address-only wallet. Contains no private keys or private capability methods. */\nexport class Wallet extends WalletAddress {\n private constructor(address: ReceivingAddress) {\n super(address);\n Object.freeze(this);\n }\n\n /** Parse a complete 0i address or an EVM owner address without network access. */\n static fromAddress(address: ReceivingAddress | string): Wallet {\n if (typeof address !== \"string\" && !(address instanceof ReceivingAddress)) {\n throw new TypeError(\"expected a validated receiving address\");\n }\n return new Wallet(typeof address === \"string\" ? ReceivingAddress.parse(address) : address);\n }\n}\n","/** Optional encrypted output metadata; never part of a financial commitment. */\nexport type Memo = string | Uint8Array;\nexport const MAX_MEMO_BYTES = 256;\ndeclare const TextEncoder: { new (): { encode(value: string): Uint8Array } };\ndeclare const TextDecoder: {\n new (\n label: string,\n options: { fatal: boolean; ignoreBOM: boolean }\n ): { decode(value: Uint8Array): string };\n};\n/** Encode text strictly as UTF-8, or copy opaque bytes, with a 256-byte limit. */\nexport function encodeMemo(memo?: Memo): Uint8Array {\n if (memo === undefined) return new Uint8Array();\n let encoded: Uint8Array;\n if (typeof memo === \"string\") {\n for (let i = 0; i < memo.length; i++) {\n const unit = memo.charCodeAt(i);\n if (unit >= 0xd800 && unit <= 0xdbff) {\n const next = memo.charCodeAt(++i);\n if (!(next >= 0xdc00 && next <= 0xdfff))\n throw new Error(\"memo contains an invalid surrogate\");\n } else if (unit >= 0xdc00 && unit <= 0xdfff)\n throw new Error(\"memo contains an invalid surrogate\");\n }\n encoded = new TextEncoder().encode(memo);\n } else if (memo instanceof Uint8Array) encoded = Uint8Array.from(memo);\n else throw new TypeError(\"memo must be text or Uint8Array\");\n if (encoded.length > MAX_MEMO_BYTES) throw new RangeError(\"memo exceeds 256 bytes\");\n return encoded;\n}\n/** Explicit strict UTF-8 decoding; opaque bytes remain valid even when decoding fails. */\nexport function decodeMemoText(memo: Uint8Array): string {\n return new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true }).decode(memo);\n}\n","import { TypedDataEncoder, type TypedDataDomain, type TypedDataField } from \"ethers\";\n\n/** JSON-safe EIP-712 data, directly consumable by an external signing tool. */\nexport interface SigningRequest {\n domain: {\n name?: string;\n version?: string;\n chainId?: string;\n verifyingContract?: string;\n salt?: string;\n };\n primaryType: string;\n types: Record<string, TypedDataField[]>;\n message: Record<string, unknown>;\n}\n\n/** Normalize through ethers; do not implement a second typed-data encoder. */\nexport function createSigningRequest(data: {\n domain: TypedDataDomain;\n primaryType: string;\n types: Record<string, readonly TypedDataField[]>;\n message: Record<string, unknown>;\n}): SigningRequest {\n const types = Object.fromEntries(\n Object.entries(data.types).map(([name, fields]) => [name, [...fields]])\n );\n const payload = TypedDataEncoder.getPayload(data.domain, types, data.message);\n if (payload.primaryType !== data.primaryType) {\n throw new Error(\"signing request primary type mismatch\");\n }\n // signTypedData builds its own domain type; wallet RPC transports can add it themselves.\n delete payload.types.EIP712Domain;\n return structuredClone(payload);\n}\n","import type { CreditDataV1, FundsDataV1 } from \"../types\";\nimport { encodeMemo } from \"./memo\";\n\nfunction encodeData(data: unknown): Uint8Array {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n throw new TypeError(\"v1 payload data must be an object\");\n }\n for (const key of Object.keys(data)) {\n if (key !== \"memo\") throw new Error(`unsupported v1 payload field ${key}`);\n }\n const memo = encodeMemo((data as FundsDataV1).memo);\n return new Uint8Array([1, ...memo]);\n}\nfunction readData(value: Uint8Array): { memo?: Uint8Array } {\n if (!(value instanceof Uint8Array) || value.length < 1) {\n throw new Error(\"payload version required\");\n }\n if (value[0] !== 1) throw new Error(\"unsupported payload version\");\n const memo = Uint8Array.from(value.subarray(1));\n if (memo.length > 256) throw new Error(\"invalid memo length\");\n return memo.length === 0 ? {} : { memo };\n}\n/** Pure memo codec: payload version1 followed by memo bytes; no flags or address semantics. */\nexport const fundsV1 = Object.freeze({\n encode(data: FundsDataV1 = {}): Uint8Array {\n return encodeData(data);\n },\n decode(value: Uint8Array): { memo?: Uint8Array } {\n return readData(value);\n },\n});\n/** Credit uses the same memo-only application layout, independently of its financial fields. */\nexport const creditV1 = Object.freeze({\n encode(data: CreditDataV1 = {}): Uint8Array {\n return encodeData(data);\n },\n decode(value: Uint8Array): { memo?: Uint8Array } {\n return readData(value);\n },\n});\n","import { bytesToHex } from \"@noble/hashes/utils\";\nimport type { Wallet } from \"../wallet/wallet-object\";\nimport { deliveryCodec, validateDeliveryCiphertext } from \"./delivery-codec\";\nimport { noteCommitment, creditCommitment } from \"./validation\";\nimport type { NoteBytes, NoteDecryptionContext, CreditStateDecryptionContext } from \"./types\";\n\n/** App-owned decryption. Only null means nonrecipient; operational failures must reject. */\nexport interface DeliveryDecryptor {\n decryptNote(envelope: NoteBytes, context: NoteDecryptionContext): Promise<Uint8Array | null>;\n decryptCredit(\n envelope: NoteBytes,\n context: CreditStateDecryptionContext\n ): Promise<Uint8Array | null>;\n}\n\n/** Keeps App failures and invalid plaintext distinct from unrelated local scan candidates. */\nexport class DeliveryDecryptionError extends Error {\n constructor(cause: unknown) {\n super(cause instanceof Error ? cause.message : \"delivery decryption failed\", { cause });\n this.name = \"DeliveryDecryptionError\";\n }\n}\n\nfunction checkedPlaintext(\n plaintext: Uint8Array,\n codec: { minimum: number; maximum: number }\n): Uint8Array {\n if (!(plaintext instanceof Uint8Array)) throw new Error(\"invalid decrypted plaintext\");\n if (plaintext.length + 78 < codec.minimum || plaintext.length + 78 > codec.maximum)\n throw new Error(\"invalid plaintext length\");\n return plaintext.slice();\n}\n\n/** Bind untrusted App plaintext to the requested wallet, deployment, token and commitment. */\nexport function authenticatedDecryptor(wallet: Wallet, decryptor: DeliveryDecryptor) {\n const ownerAddress = wallet.ownerAddress;\n return {\n ownerAddress,\n async decryptNote(\n envelope: NoteBytes,\n context: Omit<NoteDecryptionContext, \"ownerAddress\">\n ) {\n context = { ...context };\n try {\n const bytes = validateDeliveryCiphertext(envelope, \"funds\");\n const full = { ...context, ownerAddress };\n const plaintext = await decryptor.decryptNote(bytes.slice(), { ...full });\n if (plaintext === null) return null;\n const codec = deliveryCodec(bytes[0]!);\n if (codec.kind !== \"funds\") throw new Error(\"unexpected envelope kind\");\n const note = codec.decode(checkedPlaintext(plaintext, codec), full);\n if (\n BigInt(note.ownerAddress) !== BigInt(ownerAddress) ||\n note.tokenAddress !== context.tokenAddress\n )\n throw new Error(\"decrypted note context mismatch\");\n await noteCommitment(full, note);\n return note;\n } catch (cause) {\n throw new DeliveryDecryptionError(cause);\n }\n },\n async decryptCredit(\n envelope: NoteBytes,\n context: Omit<CreditStateDecryptionContext, \"ownerAddress\">\n ) {\n context = { ...context };\n try {\n const bytes = validateDeliveryCiphertext(envelope, \"credit\");\n const full = { ...context, ownerAddress };\n const plaintext = await decryptor.decryptCredit(bytes.slice(), { ...full });\n if (plaintext === null) return null;\n const codec = deliveryCodec(bytes[0]!);\n if (codec.kind !== \"credit\") throw new Error(\"unexpected envelope kind\");\n const state = codec.decode(checkedPlaintext(plaintext, codec), full);\n const identity =\n context.role === \"owner\"\n ? state.note.ownerWalletIdentity\n : state.note.spenderWalletIdentity;\n if (\n BigInt(identity) !== BigInt(ownerAddress) ||\n state.note.tokenAddress !== context.tokenAddress\n )\n throw new Error(\"decrypted credit context mismatch\");\n if (wallet.getReceivingAddress().kind === \"long\") {\n const keys =\n context.role === \"owner\"\n ? state.ownerReceivingKeys\n : state.spenderReceivingKeys;\n if (bytesToHex(keys.viewingPublicKey) !== bytesToHex(wallet.viewingPublicKey))\n throw new Error(\"decrypted credit receiving key mismatch\");\n }\n await creditCommitment(full, state.note);\n return state;\n } catch (cause) {\n throw new DeliveryDecryptionError(cause);\n }\n },\n };\n}\n","import { authenticatedDecryptor } from \"../delivery/decryptor\";\nimport type { Note, CreditDeliveryState, CreditState } from \"../types\";\nimport { bytesToHex, hexToBytes } from \"@noble/hashes/utils\";\nimport { ReceivingAddress } from \"../address/receiving-address\";\nimport { validateDeliveryCiphertext } from \"../delivery/delivery-codec\";\nimport { validateContext } from \"../delivery/validation\";\nimport type { CreditStateDecryptionContext, NoteDecryptionContext } from \"../delivery/types\";\nimport { AuthorizedStatement } from \"./capabilities\";\nimport { Wallet } from \"./wallet-object\";\nimport {\n computeOwnerAddress,\n computeWalletAuthorizationDigest,\n verifyWalletAuthorization,\n type WalletAuthorizationRequest,\n type WalletOperation,\n} from \"./wallet\";\n\nexport type WalletHex = `0x${string}`;\nexport type WalletMethod =\n | \"wallet.public\"\n | \"wallet.detect\"\n | \"wallet.decryptNote\"\n | \"wallet.decryptCredit\"\n | \"wallet.authorize\";\nexport interface WalletWireContext {\n chainId: string;\n protocolAddress: string;\n}\nexport interface WalletDecryptContext extends WalletWireContext {\n tokenAddress: string;\n outputCommitment: WalletHex;\n role?: \"owner\" | \"spender\";\n}\nexport interface WalletParams {\n \"wallet.public\": Record<string, never>;\n \"wallet.detect\": { clues: WalletHex[] };\n \"wallet.decryptNote\": { envelope: WalletHex; context: WalletDecryptContext };\n \"wallet.decryptCredit\": { envelope: WalletHex; context: WalletDecryptContext };\n \"wallet.authorize\": {\n operation: WalletOperation;\n capacity: number;\n words: string[];\n context: WalletWireContext;\n };\n}\nexport interface WalletResults {\n \"wallet.public\": {\n viewingPublicKey: WalletHex;\n spendingPublicKey: WalletHex;\n clueKey: WalletHex;\n };\n \"wallet.detect\": { matches: boolean[] };\n \"wallet.decryptNote\": { plaintext: WalletHex };\n \"wallet.decryptCredit\": { plaintext: WalletHex };\n \"wallet.authorize\": { spendingPublicKey: WalletHex; signature: WalletHex; digest: WalletHex };\n}\nexport interface WalletAcceptedResults {\n \"wallet.public\": WalletResults[\"wallet.public\"];\n \"wallet.detect\": WalletResults[\"wallet.detect\"];\n \"wallet.decryptNote\": Note & { payload: Uint8Array };\n \"wallet.decryptCredit\": CreditDeliveryState & { note: CreditState & { payload: Uint8Array } };\n \"wallet.authorize\": AuthorizedStatement;\n}\nexport type WalletRequest<M extends WalletMethod = WalletMethod> = {\n version: 1;\n id: string;\n ownerAddress: WalletHex;\n method: M;\n params: WalletParams[M];\n};\nexport type WalletResponse<M extends WalletMethod = WalletMethod> = {\n version: 1;\n id: string;\n ownerAddress: WalletHex;\n method: M;\n} & ({ result: WalletResults[M]; error?: never } | { error: { code: string }; result?: never });\nexport interface PreparedWalletRequest<M extends WalletMethod = WalletMethod> {\n readonly request: WalletRequest<M>;\n}\nexport const walletHex = (bytes: Uint8Array): WalletHex => `0x${bytesToHex(bytes)}`;\nexport function walletBytes(value: unknown, length?: number): Uint8Array {\n if (typeof value !== \"string\" || !/^0x(?:[0-9a-f]{2})*$/.test(value))\n throw new Error(\"invalid canonical hex bytes\");\n const bytes = hexToBytes(value.slice(2));\n if (length !== undefined && bytes.length !== length) throw new Error(\"invalid byte length\");\n return bytes;\n}\nexport function walletInteger(value: unknown): bigint {\n if (typeof value !== \"string\" || !/^(0|[1-9][0-9]*)$/.test(value) || value.length > 78)\n throw new Error(\"invalid canonical integer\");\n return BigInt(value);\n}\nexport function walletAuthorizationParams(\n params: WalletParams[\"wallet.authorize\"]\n): WalletAuthorizationRequest {\n return {\n ...params,\n words: params.words.map(walletInteger),\n context: {\n chainId: walletInteger(params.context.chainId),\n protocolAddress: walletInteger(params.context.protocolAddress),\n },\n };\n}\nexport function walletDecryptionContext(\n request: WalletRequest<\"wallet.decryptNote\" | \"wallet.decryptCredit\">\n): NoteDecryptionContext & { role?: \"owner\" | \"spender\" } {\n const context = request.params.context;\n return {\n chainId: walletInteger(context.chainId),\n protocolAddress: walletInteger(context.protocolAddress),\n tokenAddress: walletInteger(context.tokenAddress),\n outputCommitment: context.outputCommitment,\n ownerAddress: request.ownerAddress,\n ...(context.role ? { role: context.role } : {}),\n };\n}\nfunction freeze<T>(value: T): T {\n if (value && typeof value === \"object\") {\n Object.values(value).forEach(freeze);\n Object.freeze(value);\n }\n return value;\n}\nfunction exactKeys(value: unknown, keys: string[]): void {\n if (\n !value ||\n typeof value !== \"object\" ||\n Array.isArray(value) ||\n Object.keys(value).some((key) => !keys.includes(key)) ||\n keys.some((key) => !Object.hasOwn(value, key))\n )\n throw new Error(\"unexpected wallet fields\");\n}\nexport function validateWalletRequest(request: WalletRequest): void {\n exactKeys(request, [\"version\", \"id\", \"ownerAddress\", \"method\", \"params\"]);\n if (\n request.version !== 1 ||\n typeof request.id !== \"string\" ||\n !/^[\\x21-\\x7e]{1,128}$/.test(request.id)\n )\n throw new Error(\"invalid wallet request envelope\");\n walletBytes(request.ownerAddress, 20);\n ReceivingAddress.fromIdentity(request.ownerAddress);\n switch (request.method) {\n case \"wallet.public\":\n exactKeys(request.params, []);\n break;\n case \"wallet.detect\": {\n exactKeys(request.params, [\"clues\"]);\n const { clues } = request.params as WalletParams[\"wallet.detect\"];\n if (!Array.isArray(clues) || clues.length > 1024) throw new Error(\"invalid clues\");\n clues.forEach((clue) => walletBytes(clue, 68));\n break;\n }\n case \"wallet.authorize\": {\n exactKeys(request.params, [\"operation\", \"capacity\", \"words\", \"context\"]);\n const params = request.params as WalletParams[\"wallet.authorize\"];\n exactKeys(params.context, [\"chainId\", \"protocolAddress\"]);\n if (!Array.isArray(params.words) || params.words.length > 8192)\n throw new Error(\"invalid authorization words\");\n computeWalletAuthorizationDigest(walletAuthorizationParams(params));\n break;\n }\n case \"wallet.decryptNote\":\n case \"wallet.decryptCredit\": {\n const typed = request as WalletRequest<\"wallet.decryptNote\" | \"wallet.decryptCredit\">;\n exactKeys(typed.params, [\"envelope\", \"context\"]);\n exactKeys(typed.params.context, [\n \"chainId\",\n \"protocolAddress\",\n \"tokenAddress\",\n \"outputCommitment\",\n ...(request.method === \"wallet.decryptCredit\" ? [\"role\"] : []),\n ]);\n const context = walletDecryptionContext(typed);\n walletBytes(context.outputCommitment, 32);\n validateContext(context, context.tokenAddress);\n if (\n request.method === \"wallet.decryptCredit\" &&\n context.role !== \"owner\" &&\n context.role !== \"spender\"\n )\n throw new Error(\"invalid credit role\");\n if (request.method === \"wallet.decryptNote\" && context.role !== undefined)\n throw new Error(\"unexpected note role\");\n walletBytes(typed.params.envelope);\n validateDeliveryCiphertext(\n typed.params.envelope,\n request.method === \"wallet.decryptCredit\" ? \"credit\" : \"funds\"\n );\n break;\n }\n default:\n throw new Error(\"unsupported wallet method\");\n }\n}\nconst retainedWallets = new WeakMap<PreparedWalletRequest, Wallet>();\nexport function prepareWalletRequest<M extends WalletMethod>(\n wallet: Wallet,\n id: string,\n method: M,\n params: WalletParams[M]\n): PreparedWalletRequest<M> {\n if (!(wallet instanceof Wallet)) throw new TypeError(\"public Wallet required\");\n const request = structuredClone({\n version: 1 as const,\n id,\n ownerAddress: wallet.ownerAddress.toLowerCase() as WalletHex,\n method,\n params,\n });\n validateWalletRequest(request);\n const prepared = freeze({ request });\n retainedWallets.set(prepared, wallet);\n return prepared;\n}\n/** Validate native output against the retained request before using it in business state. */\nexport async function acceptWalletResponse<M extends WalletMethod>(\n prepared: PreparedWalletRequest<M>,\n response: WalletResponse<M>\n): Promise<WalletAcceptedResults[M]> {\n return acceptResponse(prepared, response);\n}\nasync function acceptResponse(\n prepared: PreparedWalletRequest,\n response: WalletResponse\n): Promise<any> {\n const wallet = retainedWallets.get(prepared);\n if (!wallet) throw new Error(\"wallet request was not prepared by this SDK instance\");\n const request = prepared.request;\n validateWalletRequest(request);\n const safe = structuredClone(response);\n if (\n safe.version !== request.version ||\n safe.id !== request.id ||\n safe.ownerAddress !== request.ownerAddress ||\n safe.method !== request.method\n )\n throw new Error(\"wallet response envelope mismatch\");\n validateWalletResponses([request], [safe]);\n if (\"error\" in safe) throw new NativeWalletError(safe.error!.code);\n const result = safe.result as any;\n exactKeys(\n result,\n request.method === \"wallet.public\"\n ? [\"viewingPublicKey\", \"spendingPublicKey\", \"clueKey\"]\n : request.method === \"wallet.authorize\"\n ? [\"spendingPublicKey\", \"signature\", \"digest\"]\n : request.method === \"wallet.detect\"\n ? [\"matches\"]\n : [\"plaintext\"]\n );\n if (request.method === \"wallet.public\") {\n walletBytes(result.spendingPublicKey, 65);\n walletBytes(result.viewingPublicKey, 33);\n walletBytes(result.clueKey, 32);\n if ((await computeOwnerAddress(result.spendingPublicKey)) !== request.ownerAddress)\n throw new Error(\"wallet public identity mismatch\");\n if (\n wallet.getReceivingAddress().kind === \"long\" &&\n (walletHex(wallet.viewingPublicKey) !== result.viewingPublicKey ||\n walletHex(wallet.clueKey) !== result.clueKey)\n )\n throw new Error(\"wallet receiving key mismatch\");\n ReceivingAddress.from({\n ownerAddress: request.ownerAddress,\n viewingPublicKey: walletBytes(result.viewingPublicKey),\n clueKey: walletBytes(result.clueKey),\n });\n } else if (request.method === \"wallet.authorize\") {\n const auth = walletAuthorizationParams(request.params as WalletParams[\"wallet.authorize\"]);\n if (\n result.digest !== computeWalletAuthorizationDigest(auth) ||\n !(await verifyWalletAuthorization(\n request.ownerAddress,\n result.spendingPublicKey,\n result.signature,\n auth\n ))\n )\n throw new Error(\"invalid wallet authorization response\");\n const publicKey = walletBytes(result.spendingPublicKey, 65);\n return new AuthorizedStatement(request.ownerAddress, result.digest, {\n public_key_x: Array.from(publicKey.slice(1, 33)),\n public_key_y: Array.from(publicKey.slice(33)),\n signature: Array.from(walletBytes(result.signature, 64)),\n });\n } else if (request.method === \"wallet.detect\") {\n if (\n !Array.isArray(result.matches) ||\n result.matches.length !==\n (request.params as WalletParams[\"wallet.detect\"]).clues.length ||\n result.matches.some((v: unknown) => typeof v !== \"boolean\")\n )\n throw new Error(\"invalid detection response\");\n } else {\n const typed = request as WalletRequest<\"wallet.decryptNote\" | \"wallet.decryptCredit\">;\n const context = walletDecryptionContext(typed);\n const plaintext = walletBytes(result.plaintext);\n const viewing = authenticatedDecryptor(wallet, {\n decryptNote: async () => plaintext,\n decryptCredit: async () => plaintext,\n });\n return typed.method === \"wallet.decryptNote\"\n ? viewing.decryptNote(typed.params.envelope, context)\n : viewing.decryptCredit(typed.params.envelope, context as CreditStateDecryptionContext);\n }\n return result;\n}\n\n/** Native errors contain machine-readable codes only. */\nexport class NativeWalletError extends Error {\n constructor(readonly code: string) {\n super(code);\n this.name = \"NativeWalletError\";\n }\n}\nexport const MAX_WALLET_BATCH_BYTES = 16 * 1024 * 1024;\nfunction boundedJson(value: unknown): void {\n const json = JSON.stringify(value);\n if (typeof json !== \"string\" || new TextEncoder().encode(json).length > MAX_WALLET_BATCH_BYTES)\n throw new Error(\"wallet batch exceeds encoded size limit\");\n}\nexport function validateWalletBatch(requests: readonly WalletRequest[]): void {\n if (!Array.isArray(requests) || requests.length > 1024) throw new Error(\"invalid wallet batch\");\n boundedJson(requests);\n const ids = new Set<string>();\n for (const request of requests) {\n validateWalletRequest(request);\n if (ids.has(request.id)) throw new Error(\"duplicate wallet request id\");\n if (request.ownerAddress !== requests[0]!.ownerAddress)\n throw new Error(\"mixed wallet batch owners\");\n ids.add(request.id);\n }\n}\n/** Check every envelope before returning responses in request order. */\nexport function validateWalletResponses(\n requests: readonly WalletRequest[],\n responses: readonly WalletResponse[]\n): WalletResponse[] {\n validateWalletBatch(requests);\n if (!Array.isArray(responses) || responses.length !== requests.length)\n throw new Error(\"wallet response batch length mismatch\");\n boundedJson(responses);\n const expected = new Map(requests.map((request) => [request.id, request]));\n const found = new Map<string, WalletResponse>();\n for (const response of responses) {\n if (!response || typeof response !== \"object\") throw new Error(\"invalid wallet response\");\n const request = expected.get(response.id);\n if (\n !request ||\n found.has(response.id) ||\n response.version !== 1 ||\n response.method !== request.method ||\n response.ownerAddress !== request.ownerAddress\n )\n throw new Error(\"wallet response envelope mismatch\");\n if (Object.hasOwn(response, \"error\")) {\n exactKeys(response, [\"version\", \"id\", \"ownerAddress\", \"method\", \"error\"]);\n exactKeys(response.error, [\"code\"]);\n if (\n typeof response.error?.code !== \"string\" ||\n !/^[A-Z][A-Z0-9_]{0,127}$/.test(response.error.code)\n )\n throw new Error(\"invalid native wallet error\");\n } else {\n exactKeys(response, [\"version\", \"id\", \"ownerAddress\", \"method\", \"result\"]);\n if (\n !response.result ||\n typeof response.result !== \"object\" ||\n Array.isArray(response.result)\n )\n throw new Error(\"invalid wallet result\");\n const result = response.result as any;\n exactKeys(\n result,\n request.method === \"wallet.public\"\n ? [\"viewingPublicKey\", \"spendingPublicKey\", \"clueKey\"]\n : request.method === \"wallet.authorize\"\n ? [\"spendingPublicKey\", \"signature\", \"digest\"]\n : request.method === \"wallet.detect\"\n ? [\"matches\"]\n : [\"plaintext\"]\n );\n if (request.method === \"wallet.public\") {\n walletBytes(result.viewingPublicKey, 33);\n walletBytes(result.spendingPublicKey, 65);\n walletBytes(result.clueKey, 32);\n } else if (request.method === \"wallet.authorize\") {\n walletBytes(result.spendingPublicKey, 65);\n walletBytes(result.signature, 64);\n walletBytes(result.digest, 32);\n } else if (request.method === \"wallet.detect\") {\n if (\n !Array.isArray(result.matches) ||\n result.matches.length !==\n (request.params as WalletParams[\"wallet.detect\"]).clues.length ||\n result.matches.some((value: unknown) => typeof value !== \"boolean\")\n )\n throw new Error(\"invalid detection response\");\n } else {\n walletBytes(result.plaintext);\n }\n }\n found.set(response.id, response);\n }\n return requests.map((request) => found.get(request.id)!);\n}\nexport async function acceptWalletResponses(\n prepared: readonly PreparedWalletRequest[],\n responses: readonly WalletResponse[]\n): Promise<unknown[]> {\n for (const item of prepared) {\n if (!retainedWallets.has(item))\n throw new Error(\"wallet request was not prepared by this SDK instance\");\n }\n const ordered = validateWalletResponses(\n prepared.map((item) => item.request),\n structuredClone(responses)\n );\n return Promise.all(prepared.map((item, index) => acceptWalletResponse(item, ordered[index]!)));\n}\n","import { AbiCoder, keccak256, toBeHex } from \"ethers\";\nexport function provenanceIntentHash(originalRequestHash: string): string {\n return keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\"string\", \"bytes32\"],\n [\"InvisiBroadcasterProvenanceIntentV1\", toBeHex(BigInt(originalRequestHash), 32)]\n )\n );\n}\n"],"mappings":"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,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAA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","names":["import_utils","import_blake2b","bytes","publicKey","buffer","identity","owner","identity","bytes","mod","import_ethers","import_secp256k1","context","field","identity","hash","creditCommitment","context","nonce","uint","encode","receivingKeys","viewingPublicKey","context","import_secp256k1","concat","uint","field","encode","nonce","identity","context","uint","field","commitment","context","concat","encode","context","import_utils","hash","field","encode","note","nonce","commitment","import_secp256k1","import_utils","import_secp256k1","import_sha3","import_utils","bytes","publicKey","bytes","context","bytes","privateKey","publicKey","identity","privateKey","publicKey","context","commitment","nonce","import_ethers","import_utils","context","bytes","identity","import_utils","bytes","context","publicKey","import_ethers"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/address/address.ts","../src/fmd/fmd.ts","../src/fmd/decaf377.ts","../src/errors.ts","../src/address/receiving-address.ts","../src/crypto/domains.ts","../src/crypto/random.ts","../src/crypto/poseidon-constants.ts","../src/crypto/poseidon.ts","../src/delivery/delivery-codec.ts","../src/delivery/note-payload.ts","../src/notes/noteContext.ts","../src/credit/state.ts","../src/delivery/errors.ts","../src/delivery/envelope.ts","../src/delivery/binary.ts","../src/notes/commitment.ts","../src/delivery/validation.ts","../src/delivery/encryption.ts","../src/disclosure/disclosure.ts","../src/notes/nullifier.ts","../src/wallet/capabilities.ts","../src/wallet/wallet.ts","../src/wallet/wallet-object.ts","../src/delivery/memo.ts","../src/wallet/signing-request.ts","../src/delivery/payload.ts","../src/delivery/decryptor.ts","../src/wallet/wallet-wire.ts","../src/provenance/intent-hash.ts"],"sourcesContent":["export { decodeAddress } from \"./address/address\";\nexport type { DecodedAddress, ReceivingKeyLookup } from \"./address/address\";\nexport { ReceivingAddress } from \"./address/receiving-address\";\nexport {\n D_CNULL,\n D_CREDIT,\n D_CREDIT_KEY_HASH,\n D_CREDIT_RECOVERY,\n D_CREDIT_STATE_NONCE,\n D_IDENT,\n D_NOTE,\n D_NULL,\n TREE_DEPTH,\n} from \"./crypto/domains\";\nexport { poseidonHash } from \"./crypto/poseidon\";\nexport { FIELD_MODULUS, generateCreditSharedKey, generateNonce } from \"./crypto/random\";\nexport {\n decryptCreditState,\n decryptPrivateTransferNote,\n encryptCreditState,\n encryptPrivateTransferNote,\n normalizeCreditDeliveryState,\n viewingPublicKey,\n} from \"./delivery/encryption\";\nexport type {\n CreditStateDecryptionContext,\n CreditStateEncryptionContext,\n NoteBytes,\n NoteDecryptionContext,\n NoteEncryptionContext,\n} from \"./delivery/encryption\";\nexport { Disclosure } from \"./disclosure/disclosure\";\nexport type {\n CreditOpening,\n DisclosureExport,\n DisclosureOutput,\n DisclosureResult,\n} from \"./disclosure/disclosure\";\nexport { MissingCapabilityError } from \"./errors\";\nexport { createClue, createClueFromSeed, deriveClueKey, validateClueKey } from \"./fmd/fmd\";\nexport { computeNoteCommitment, computeNoteIdentity } from \"./notes/commitment\";\nexport {\n CREDIT_POLICY_FIELDS,\n CREDIT_USAGE_FIELDS,\n deriveCreditState,\n deriveCreditUpdate,\n applyCreditDrawUsage,\n computeCreditCommitment,\n computeCreditNullifier,\n computeCreditRecoveryPad,\n computeCreditSharedKeyHash,\n creditPeriods,\n deriveCreditStateNonce,\n normalizeCreditPolicy,\n normalizeCreditUsage,\n normalizeCreditState,\n recoverCreditState,\n} from \"./credit/state\";\nexport { computeNoteNullifier } from \"./notes/nullifier\";\nexport type {\n CreditDeliveryState,\n CreditState,\n CreditPolicy,\n CreditUsage,\n CreditStateRecovery,\n Note,\n ProtocolContext,\n ReceivingKeys,\n} from \"./types\";\nexport {\n AuthorizedStatement,\n Detector,\n NullifierCapability,\n ViewingCapability,\n} from \"./wallet/capabilities\";\nexport {\n WALLET_AUTHORIZATION_TYPES,\n computeOwnerAddress,\n computeWalletAuthorizationDigest,\n verifyWalletAuthorization,\n walletAuthorizationTypedData,\n} from \"./wallet/wallet\";\nexport type {\n WalletAuthorizationRequest,\n WalletAuthorizationWitness,\n WalletBytes,\n WalletOperation,\n} from \"./wallet/wallet\";\nexport { Wallet } from \"./wallet/wallet-object\";\n\nexport type { Address, Hex } from \"./crypto/primitives\";\n\nexport { MAX_MEMO_BYTES, decodeMemoText, encodeMemo, type Memo } from \"./delivery/memo\";\nexport { createSigningRequest } from \"./wallet/signing-request\";\nexport type { SigningRequest } from \"./wallet/signing-request\";\n\nexport {\n MAX_CIPHERTEXT_BYTES,\n deliveryCodec,\n deliveryHeader,\n validateDeliveryCiphertext,\n} from \"./delivery/delivery-codec\";\n\nexport { decodeDeliveryHeader } from \"./delivery/delivery-codec\";\nexport type { DeliveryKind } from \"./delivery/delivery-codec\";\nexport { creditV1, fundsV1 } from \"./delivery/payload\";\n\nexport type { CreditDataV1, FundsDataV1 } from \"./types\";\n\nexport type { CreditUpdateChanges } from \"./credit/state\";\n\nexport {\n prepareWalletRequest,\n acceptWalletResponse,\n acceptWalletResponses,\n validateWalletBatch,\n validateWalletResponses,\n NativeWalletError,\n MAX_WALLET_BATCH_BYTES,\n} from \"./wallet/wallet-wire\";\nexport type {\n WalletAcceptedResults,\n WalletHex,\n WalletMethod,\n WalletWireContext,\n WalletDecryptContext,\n WalletParams,\n WalletResults,\n WalletRequest,\n WalletResponse,\n PreparedWalletRequest,\n} from \"./wallet/wallet-wire\";\n\nexport { provenanceIntentHash } from \"./provenance/intent-hash\";\n\nexport { authenticatedDecryptor, DeliveryDecryptionError } from \"./delivery/decryptor\";\nexport type {\n DeliveryDecryptor,\n DeliveryDecryptionResult,\n DeliveryDetectionCandidate,\n DeliveryDetectionBatch,\n} from \"./delivery/decryptor\";\nexport { DeliveryAuthenticationError } from \"./delivery/errors\";\n","import { secp256k1 } from \"@noble/curves/secp256k1\";\nimport { keccak_256 } from \"@noble/hashes/sha3\";\nimport { bytesToHex, concatBytes, hexToBytes, utf8ToBytes } from \"@noble/hashes/utils\";\nimport { getAddress } from \"ethers\";\nimport { validateClueKey } from \"../fmd/fmd\";\n\nexport interface ReceivingAddress {\n ownerAddress: `0x${string}`;\n viewingPublicKey: Uint8Array;\n clueKey: Uint8Array;\n}\nexport type DecodedAddress =\n ({ kind: \"long\" } & ReceivingAddress) | { kind: \"short\"; ownerAddress: `0x${string}` };\nexport type ReceivingKeyLookup = (\n ownerAddress: `0x${string}`\n) => Promise<Pick<ReceivingAddress, \"viewingPublicKey\" | \"clueKey\"> | null | undefined>;\nconst ALPHABET = \"qpzry9x8gf2tvdw0s3jn54khce6mua7l\";\ntype Identity = bigint | `0x${string}`;\n\nfunction identityBytes(value: Identity): Uint8Array {\n if (\n typeof value !== \"bigint\" &&\n (typeof value !== \"string\" || !/^0x[0-9a-fA-F]{40}$/.test(value))\n )\n throw new Error(\"invalid owner address encoding\");\n const n = BigInt(value);\n if (n <= 0n || n >= 1n << 160n)\n throw new RangeError(\"owner address must be a nonzero EVM owner address\");\n return hexToBytes(n.toString(16).padStart(40, \"0\"));\n}\nfunction receivingKeys(keys: Pick<ReceivingAddress, \"viewingPublicKey\" | \"clueKey\">) {\n const publicKey = keys.viewingPublicKey;\n if (\n !(publicKey instanceof Uint8Array) ||\n publicKey.length !== 33 ||\n (publicKey[0] !== 2 && publicKey[0] !== 3)\n )\n throw new Error(\"invalid compressed viewing public key\");\n secp256k1.ProjectivePoint.fromHex(publicKey).assertValidity();\n validateClueKey(keys.clueKey);\n return { viewingPublicKey: Uint8Array.from(publicKey), clueKey: Uint8Array.from(keys.clueKey) };\n}\nfunction checkedText(prefix: string, data: string): string {\n const digest = keccak_256(utf8ToBytes(\"Invisi.AddressCaseChecksum.v1:\" + prefix + data));\n return (\n prefix +\n Array.from(data, (character, i) =>\n (digest[i >> 3]! >> (7 - (i & 7))) & 1 ? character.toUpperCase() : character\n ).join(\"\")\n );\n}\nfunction encode(prefix: string, payload: Uint8Array): string {\n let buffer = 0,\n bits = 0,\n data = \"\";\n for (const byte of payload) {\n buffer = (buffer << 8) | byte;\n bits += 8;\n while (bits >= 5) {\n bits -= 5;\n data += ALPHABET[(buffer >>> bits) & 31];\n }\n buffer &= (1 << bits) - 1;\n }\n if (bits) data += ALPHABET[(buffer << (5 - bits)) & 31];\n return checkedText(prefix, data);\n}\n\n/** 138 characters: 0i plus the complete offline receiving materials. */\nexport function encodeLongAddress(recipient: ReceivingAddress): string {\n const identity = identityBytes(recipient.ownerAddress),\n keys = receivingKeys(recipient);\n return encode(\"0i\", concatBytes(identity, keys.viewingPublicKey, keys.clueKey));\n}\n/** The owner's 42-character checksummed EVM address; receiving keys require a chosen registry. */\nexport function encodeShortAddress(ownerAddress: Identity): string {\n const identity = identityBytes(ownerAddress);\n return getAddress(\n typeof ownerAddress === \"string\" ? ownerAddress : `0x${bytesToHex(identity)}`\n );\n}\n\n/** Standard EVM short addresses or a full 0i address with a strict custom Base32 case checksum. */\nexport function decodeAddress(address: string): DecodedAddress {\n if (typeof address !== \"string\") throw new TypeError(\"address must be text\");\n if (address.startsWith(\"0x\")) {\n const owner = getAddress(address) as `0x${string}`;\n return { kind: \"short\", ownerAddress: `0x${bytesToHex(identityBytes(owner))}` };\n }\n if (!address.startsWith(\"0i\")) throw new Error(\"invalid Invisi address prefix\");\n const prefix = \"0i\";\n if (address.length !== 138) throw new Error(\"invalid address length\");\n const data = address.slice(prefix.length).toLowerCase();\n if (Array.from(data).some((character) => !ALPHABET.includes(character)))\n throw new Error(\"invalid address alphabet\");\n if (checkedText(prefix, data) !== address) throw new Error(\"invalid address case checksum\");\n let buffer = 0,\n bits = 0;\n const payload: number[] = [];\n for (const character of data) {\n buffer = (buffer << 5) | ALPHABET.indexOf(character);\n bits += 5;\n if (bits >= 8) {\n bits -= 8;\n payload.push((buffer >>> bits) & 255);\n }\n buffer &= (1 << bits) - 1;\n }\n if (bits !== 0 || buffer !== 0) throw new Error(\"noncanonical address padding\");\n const raw = Uint8Array.from(payload);\n const ownerAddress =\n `0x${bytesToHex(identityBytes(`0x${bytesToHex(raw.subarray(0, 20))}`))}` as const;\n return {\n kind: \"long\",\n ownerAddress,\n ...receivingKeys({ viewingPublicKey: raw.slice(20, 53), clueKey: raw.slice(53) }),\n };\n}\n\n/** Normalize either address into the same payment input. Long addresses never query. */\nexport async function resolveAddress(\n address: string,\n options: { lookup?: ReceivingKeyLookup } = {}\n): Promise<ReceivingAddress> {\n const decoded = decodeAddress(address);\n if (decoded.kind === \"long\")\n return {\n ownerAddress: decoded.ownerAddress,\n viewingPublicKey: decoded.viewingPublicKey,\n clueKey: decoded.clueKey,\n };\n if (!options.lookup) throw new Error(\"short address requires an explicit registry lookup\");\n const keys = await options.lookup(decoded.ownerAddress);\n if (!keys) throw new Error(\"owner address is not registered\");\n return { ownerAddress: decoded.ownerAddress, ...receivingKeys(keys) };\n}\n","/**\n * Frozen S-FMD profile: decaf377-fmd 2.1.1, 24-bit clues (68 bytes).\n * Only FMD detection keys belong here; these are not transaction ownership keys.\n *\n * SECURITY: the noble Edwards arithmetic and this exact Decaf codec port use\n * JavaScript BigInt. They do not provide constant-time execution or reliable\n * secret erasure. This new composition has not received an independent audit.\n */\nimport { blake2b } from \"@noble/hashes/blake2b\";\nimport { concatBytes, utf8ToBytes } from \"@noble/hashes/utils\";\nimport {\n FR,\n decodePoint,\n encodePoint,\n generator,\n inverseScalar,\n isIdentity,\n multiply,\n readLE,\n secureRandomBytes,\n writeLE,\n} from \"./decaf377.js\";\n\nconst PRECISION = 24;\nfunction requireBytes(value: Uint8Array, length: number, name: string): void {\n if (!(value instanceof Uint8Array) || value.length !== length)\n throw new TypeError(`${name} must be a ${length}-byte Uint8Array`);\n}\nfunction detectionScalar(key: Uint8Array): bigint {\n requireBytes(key, 32, \"Detection key\");\n const scalar = readLE(key);\n if (scalar === 0n || scalar >= FR)\n throw new Error(\"Detection key must be a canonical nonzero Decaf377 scalar\");\n return scalar;\n}\nfunction hash(domain: string, ...parts: Uint8Array[]): Uint8Array {\n // Rust blake2b_simd defaults to 64 output bytes and zero-pads personalization.\n const personalization = new Uint8Array(16);\n personalization.set(utf8ToBytes(`decaf377-fmd.${domain}`));\n return blake2b(concatBytes(...parts), { dkLen: 64, personalization });\n}\nconst hashScalar = (domain: string, ...parts: Uint8Array[]) => readLE(hash(domain, ...parts)) % FR;\nconst childOffset = (clueKey: Uint8Array, index: number) =>\n hashScalar(\"hkd\", clueKey, Uint8Array.of(index));\nconst hashBit = (p: Uint8Array, shared: Uint8Array, q: Uint8Array) =>\n hash(\"bit\", p, shared, q)[0]! & 1;\n\n/** Derive the canonical 32-byte Decaf377 clue key from a nonzero FMD scalar. */\nexport function deriveClueKey(detectionKey: Uint8Array): Uint8Array {\n return encodePoint(multiply(generator, detectionScalar(detectionKey)));\n}\n/** Reject malformed, noncanonical, or identity clue keys. */\nexport function validateClueKey(clueKey: Uint8Array): void {\n requireBytes(clueKey, 32, \"Clue key\");\n if (isIdentity(decodePoint(clueKey))) throw new Error(\"Clue key must not be the identity\");\n}\n/** Create a fixed 24-bit clue using a fresh WebCrypto random seed. */\nexport function createClue(clueKey: Uint8Array): Uint8Array {\n validateClueKey(clueKey);\n return createClueFromSeed(clueKey, secureRandomBytes(32));\n}\n/**\n * Deterministic interoperability/backend entry point. Seed must be independently\n * generated with a CSPRNG for every production clue; never reuse a fixed seed.\n */\nexport function createClueFromSeed(clueKey: Uint8Array, seed32: Uint8Array): Uint8Array {\n validateClueKey(clueKey);\n requireBytes(seed32, 32, \"Clue seed\");\n const root = decodePoint(clueKey);\n const r = hashScalar(\"rdv\", clueKey, seed32);\n const z = hashScalar(\"zdv\", clueKey, seed32);\n if (r === 0n) throw new Error(\"Degenerate clue seed\");\n const p = encodePoint(multiply(generator, r));\n const q = encodePoint(multiply(generator, z));\n const ciphertext = new Uint8Array(3);\n for (let i = 0; i < PRECISION; i++) {\n const child = root.add(multiply(generator, childOffset(clueKey, i)));\n const shared = encodePoint(multiply(child, r));\n ciphertext[i >> 3] = ciphertext[i >> 3]! | ((hashBit(p, shared, q) ^ 1) << (i & 7));\n }\n const m = hashScalar(\"sca\", p, Uint8Array.of(PRECISION), ciphertext);\n const y = ((z - m + FR) * inverseScalar(r)) % FR;\n if (y === 0n) throw new Error(\"Degenerate clue seed\");\n return concatBytes(p, writeLE(y), Uint8Array.of(PRECISION), ciphertext);\n}\n\n/** Check a full-precision clue locally without exporting the detection key. */\nexport function detectClue(detectionKey: Uint8Array, clue: Uint8Array): boolean {\n const scalar = detectionScalar(detectionKey);\n requireBytes(clue, 68, \"Clue\");\n if (clue[64] !== PRECISION) return false;\n const p = clue.slice(0, 32),\n y = readLE(clue.slice(32, 64));\n if (y === 0n || y >= FR) return false;\n let point;\n try {\n point = decodePoint(p);\n } catch {\n return false;\n }\n if (isIdentity(point)) return false;\n const ciphertext = clue.slice(65);\n const m = hashScalar(\"sca\", p, Uint8Array.of(PRECISION), ciphertext);\n const q = encodePoint(multiply(generator, m).add(multiply(point, y)));\n const clueKey = deriveClueKey(detectionKey);\n for (let i = 0; i < PRECISION; i++) {\n const child = (scalar + childOffset(clueKey, i)) % FR;\n const bit = hashBit(p, encodePoint(multiply(point, child)), q);\n if ((bit ^ ((ciphertext[i >> 3]! >> (i & 7)) & 1)) !== 1) return false;\n }\n return true;\n}\n","/**\n * Internal Decaf377 codec, ported from decaf377 0.10.1 min_curve/element.rs.\n * Edwards group/field arithmetic is supplied by @noble/curves 1.9.1. The\n * Montgomery constants below are converted to ordinary field integers.\n * This JavaScript BigInt backend is NOT constant-time and has not been audited.\n */\nimport { twistedEdwards, type ExtPointType } from \"@noble/curves/abstract/edwards\";\nimport { Field, mod } from \"@noble/curves/abstract/modular\";\nimport { blake2b } from \"@noble/hashes/blake2b\";\n\nexport const FQ = 8444461749428370424248824938781546531375899335154063827935233455917409239041n;\nexport const FR = 2111115437357092606062206234695386632838870926408408195193685246394721360383n;\nconst field = Field(FQ, 253, true);\nconst f = (n: bigint) => mod(n, FQ);\nconst abs = (n: bigint) => ((n & 1n) === 0n ? n : f(-n));\n\nexport function secureRandomBytes(length: number): Uint8Array {\n const webCrypto = (\n globalThis as { crypto?: { getRandomValues(array: Uint8Array): Uint8Array } }\n ).crypto;\n if (!webCrypto?.getRandomValues) throw new Error(\"WebCrypto secure randomness is unavailable\");\n return webCrypto.getRandomValues(new Uint8Array(length));\n}\n\nconst curve = twistedEdwards({\n a: FQ - 1n,\n d: 3021n,\n Fp: field,\n n: FR,\n h: 4n,\n Gx: 4959445789346820725352484487855828915252512307947624787834978378872129235627n,\n Gy: 6060471950081851567114691557659790004756535011754163002297540472747064943288n,\n hash: blake2b,\n randomBytes: (length = 32) => secureRandomBytes(length),\n});\nexport type DecafPoint = ExtPointType;\nexport const generator: DecafPoint = curve.ExtendedPoint.BASE;\n\nexport function readLE(bytes: Uint8Array): bigint {\n let n = 0n;\n for (let i = bytes.length - 1; i >= 0; i--) n = (n << 8n) | BigInt(bytes[i]!);\n return n;\n}\nexport function writeLE(n: bigint): Uint8Array {\n const bytes = new Uint8Array(32);\n for (let i = 0; i < 32; i++) {\n bytes[i] = Number(n & 255n);\n n >>= 8n;\n }\n return bytes;\n}\nexport function multiply(point: DecafPoint, scalar: bigint): DecafPoint {\n return scalar === 0n ? curve.ExtendedPoint.ZERO : point.multiply(scalar);\n}\nexport function inverseScalar(scalar: bigint): bigint {\n // Noble's field inversion uses Euclid. Neither this nor BigInt is constant-time.\n return Field(FR).inv(scalar);\n}\n\n/** Canonical Decaf decoding, including the low-bit sign convention. */\nexport function decodePoint(bytes: Uint8Array): DecafPoint {\n if (!(bytes instanceof Uint8Array) || bytes.length !== 32)\n throw new Error(\"Invalid Decaf377 encoding length\");\n const s = readLE(bytes);\n if (s >= FQ || (s & 1n) !== 0n || bytes[31]! >> 5 !== 0)\n throw new Error(\"Invalid Decaf377 encoding\");\n const ss = f(s * s);\n const u1 = f(1n - ss);\n const u2 = f(u1 * u1 - 4n * 3021n * ss);\n const denominator = f(u2 * u1 * u1);\n // This is the square branch of Rust sqrt_ratio_zeta(1, denominator).\n // Decompression rejects the nonsquare branch; root sign is fixed below.\n if (denominator === 0n) throw new Error(\"Invalid Decaf377 encoding\");\n let v: bigint;\n try {\n v = field.sqrt(field.inv(denominator));\n } catch {\n throw new Error(\"Invalid Decaf377 encoding\");\n }\n const twoSU1 = f(2n * s * u1);\n if ((f(twoSU1 * v) & 1n) !== 0n) v = f(-v);\n const x = f(twoSU1 * v * v * u2);\n const y = f((1n + ss) * v * u1);\n return curve.ExtendedPoint.fromAffine({ x, y });\n}\nexport function encodePoint(point: DecafPoint): Uint8Array {\n const { ex: x, ez: z, et: t } = point;\n if (x === 0n) return new Uint8Array(32);\n const aMinusD = -3022n;\n const u1 = f((x + t) * (x - t));\n const denominator = f(u1 * aMinusD * x * x);\n const v = field.sqrt(field.inv(denominator));\n const u2 = abs(f(v * u1));\n const u3 = f(u2 * z - t);\n return writeLE(abs(f(aMinusD * v * u3 * x)));\n}\nexport function isIdentity(point: DecafPoint): boolean {\n return point.ex === 0n;\n}\n","/** A requested permission was not explicitly supplied to this component. */\nexport class MissingCapabilityError extends Error {\n readonly code = \"MISSING_CAPABILITY\";\n constructor(readonly capability: string) {\n super(`Missing ${capability} capability`);\n this.name = \"MissingCapabilityError\";\n }\n}\n","import { MissingCapabilityError } from \"../errors\";\nimport type { ReceivingKeys } from \"../types\";\nimport {\n decodeAddress,\n encodeLongAddress,\n encodeShortAddress,\n type ReceivingAddress as ReceivingData,\n type ReceivingKeyLookup,\n} from \"./address\";\n\n/** Validated public receiving material. A short address requires an explicit resolver. */\nexport class ReceivingAddress {\n readonly #text: string;\n\n private constructor(text: string) {\n const decoded = decodeAddress(text);\n this.#text = decoded.kind === \"short\" ? encodeShortAddress(decoded.ownerAddress) : text;\n Object.freeze(this);\n }\n\n static parse(text: string): ReceivingAddress {\n return new ReceivingAddress(text);\n }\n\n static from(recipient: ReceivingData): ReceivingAddress {\n return new ReceivingAddress(encodeLongAddress(recipient));\n }\n\n static fromIdentity(identity: bigint | `0x${string}`): ReceivingAddress {\n return new ReceivingAddress(encodeShortAddress(identity));\n }\n\n get ownerAddress(): `0x${string}` {\n return decodeAddress(this.#text).ownerAddress;\n }\n\n get kind(): \"long\" | \"short\" {\n return decodeAddress(this.#text).kind;\n }\n\n getReceivingKeys(): ReceivingKeys {\n const decoded = decodeAddress(this.#text);\n if (decoded.kind === \"short\") {\n throw new MissingCapabilityError(\"resolved receiving keys\");\n }\n return { viewingPublicKey: decoded.viewingPublicKey, clueKey: decoded.clueKey };\n }\n\n async resolve(lookup?: ReceivingKeyLookup): Promise<ReceivingAddress> {\n if (this.kind === \"long\") {\n return this;\n }\n if (!lookup) {\n throw new MissingCapabilityError(\"explicit registry lookup\");\n }\n const keys = await lookup(this.ownerAddress);\n if (!keys) {\n throw new Error(\"owner address is not registered\");\n }\n return ReceivingAddress.from({\n ownerAddress: this.ownerAddress,\n viewingPublicKey: keys.viewingPublicKey,\n clueKey: keys.clueKey,\n });\n }\n\n get viewingPublicKey(): Uint8Array {\n return this.getReceivingKeys().viewingPublicKey;\n }\n\n get clueKey(): Uint8Array {\n return this.getReceivingKeys().clueKey;\n }\n\n toString(): string {\n return this.#text;\n }\n\n toJSON(): string {\n return this.#text;\n }\n}\n","/** Current protocol Poseidon2 domain tags. */\nexport const D_IDENT = 2n;\nexport const D_NOTE = 3n;\nexport const D_NULL = 4n;\nexport const D_CREDIT = 5n;\nexport const D_CNULL = 6n;\nexport const D_CREDIT_KEY_HASH = 7n;\nexport const D_CREDIT_RECOVERY = 9n;\nexport const D_CREDIT_STATE_NONCE = 10n;\n\nexport const TREE_DEPTH = 16;\n","declare const crypto: { getRandomValues<T extends ArrayBufferView>(array: T): T };\n\n/** BN254 scalar field modulus. */\nexport const FIELD_MODULUS =\n 21888242871839275222246405745257275088548364400416034343698204186575808495617n;\n\nfunction sampleField(nonzero: boolean): bigint {\n const bytes = new Uint8Array(32);\n for (;;) {\n crypto.getRandomValues(bytes);\n const candidate = BigInt(\n \"0x\" + Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\")\n );\n if (candidate < FIELD_MODULUS && (!nonzero || candidate !== 0n)) return candidate;\n }\n}\n\n/** Uniform canonical BN254 nonce, sampled using browser/Node Web Crypto. */\nexport function generateNonce(): bigint {\n return sampleField(false);\n}\n\n/** Independent shared Credit secret. Never derive it from a note/master secret. */\nexport function generateCreditSharedKey(): bigint {\n return sampleField(true);\n}\n","// BN254 Poseidon2 t=4 parameters shared with Noir, Barretenberg, Go and Rust.\nexport const INTERNAL_DIAGONAL = [\n 0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7n,\n 0x0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740bn,\n 0x00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15n,\n 0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428bn,\n];\nexport const ROUND_CONSTANTS = [\n [\n 0x19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e5n,\n 0x265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d6n,\n 0x199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aan,\n 0x157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8n,\n ],\n [\n 0x2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac94902n,\n 0x0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1en,\n 0x251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b996n,\n 0x13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4en,\n ],\n [\n 0x0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd4738n,\n 0x011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca06n,\n 0x0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f367549n,\n 0x04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789bn,\n ],\n [\n 0x0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e8n,\n 0x259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323fn,\n 0x28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a1n,\n 0x0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447n,\n ],\n [0x0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cfn, 0x0n, 0x0n, 0x0n],\n [0x123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811n, 0x0n, 0x0n, 0x0n],\n [0x26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75n, 0x0n, 0x0n, 0x0n],\n [0x1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5n, 0x0n, 0x0n, 0x0n],\n [0x1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0n, 0x0n, 0x0n, 0x0n],\n [0x011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574n, 0x0n, 0x0n, 0x0n],\n [0x2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8cn, 0x0n, 0x0n, 0x0n],\n [0x2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5n, 0x0n, 0x0n, 0x0n],\n [0x0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951dn, 0x0n, 0x0n, 0x0n],\n [0x192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527bn, 0x0n, 0x0n, 0x0n],\n [0x1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85n, 0x0n, 0x0n, 0x0n],\n [0x179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfbn, 0x0n, 0x0n, 0x0n],\n [0x29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1cn, 0x0n, 0x0n, 0x0n],\n [0x225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08n, 0x0n, 0x0n, 0x0n],\n [0x064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59n, 0x0n, 0x0n, 0x0n],\n [0x10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87n, 0x0n, 0x0n, 0x0n],\n [0x0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471cn, 0x0n, 0x0n, 0x0n],\n [0x1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fbn, 0x0n, 0x0n, 0x0n],\n [0x1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070bn, 0x0n, 0x0n, 0x0n],\n [0x2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17dbn, 0x0n, 0x0n, 0x0n],\n [0x2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926n, 0x0n, 0x0n, 0x0n],\n [0x062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8n, 0x0n, 0x0n, 0x0n],\n [0x0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59bn, 0x0n, 0x0n, 0x0n],\n [0x20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0dn, 0x0n, 0x0n, 0x0n],\n [0x25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5an, 0x0n, 0x0n, 0x0n],\n [0x23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4bn, 0x0n, 0x0n, 0x0n],\n [0x22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0n, 0x0n, 0x0n, 0x0n],\n [0x26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5n, 0x0n, 0x0n, 0x0n],\n [0x070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9n, 0x0n, 0x0n, 0x0n],\n [0x12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250dan, 0x0n, 0x0n, 0x0n],\n [0x248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729n, 0x0n, 0x0n, 0x0n],\n [0x1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaan, 0x0n, 0x0n, 0x0n],\n [0x28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cfn, 0x0n, 0x0n, 0x0n],\n [0x0094975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7en, 0x0n, 0x0n, 0x0n],\n [0x04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65n, 0x0n, 0x0n, 0x0n],\n [0x2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187n, 0x0n, 0x0n, 0x0n],\n [0x2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3n, 0x0n, 0x0n, 0x0n],\n [0x03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0n, 0x0n, 0x0n, 0x0n],\n [0x00b7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64n, 0x0n, 0x0n, 0x0n],\n [0x159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9an, 0x0n, 0x0n, 0x0n],\n [0x1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431fn, 0x0n, 0x0n, 0x0n],\n [0x1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30dn, 0x0n, 0x0n, 0x0n],\n [0x2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33fn, 0x0n, 0x0n, 0x0n],\n [0x0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173n, 0x0n, 0x0n, 0x0n],\n [0x02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16n, 0x0n, 0x0n, 0x0n],\n [0x0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705n, 0x0n, 0x0n, 0x0n],\n [0x0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53an, 0x0n, 0x0n, 0x0n],\n [0x22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9n, 0x0n, 0x0n, 0x0n],\n [0x25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16n, 0x0n, 0x0n, 0x0n],\n [0x1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0n, 0x0n, 0x0n, 0x0n],\n [0x2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5n, 0x0n, 0x0n, 0x0n],\n [0x2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505n, 0x0n, 0x0n, 0x0n],\n [0x044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43dn, 0x0n, 0x0n, 0x0n],\n [0x227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025n, 0x0n, 0x0n, 0x0n],\n [0x02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355n, 0x0n, 0x0n, 0x0n],\n [0x0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befacn, 0x0n, 0x0n, 0x0n],\n [\n 0x1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d38n,\n 0x0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e5n,\n 0x1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5cn,\n 0x25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5fn,\n ],\n [\n 0x0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75an,\n 0x13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a96n,\n 0x2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391cen,\n 0x21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959n,\n ],\n [\n 0x05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185bn,\n 0x0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a4n,\n 0x0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bfn,\n 0x09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455n,\n ],\n [\n 0x0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd4335n,\n 0x2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34bn,\n 0x1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412dfn,\n 0x176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404n,\n ],\n];\n","import { FIELD_MODULUS as P } from \"./random\";\nimport { INTERNAL_DIAGONAL, ROUND_CONSTANTS } from \"./poseidon-constants\";\nconst mod = (n: bigint) => n % P;\nconst fifth = (n: bigint) => {\n const x = mod(n),\n x2 = mod(x * x);\n return mod(x * x2 * x2);\n};\nfunction external(s: bigint[]): void {\n const t0 = s[0]! + s[1]!,\n t1 = s[2]! + s[3]!,\n t2 = 2n * s[1]! + t1,\n t3 = 2n * s[3]! + t0;\n const t4 = 4n * t1 + t3,\n t5 = 4n * t0 + t2;\n s[0] = mod(t3 + t5);\n s[1] = mod(t5);\n s[2] = mod(t2 + t4);\n s[3] = mod(t4);\n}\nfunction permute(s: bigint[]): void {\n external(s);\n for (let r = 0; r < 64; r++) {\n const full = r < 4 || r >= 60,\n rc = ROUND_CONSTANTS[r]!;\n if (full) {\n for (let i = 0; i < 4; i++) s[i] = fifth(s[i]! + rc[i]!);\n external(s);\n } else {\n s[0] = fifth(s[0]! + rc[0]!);\n const sum = s.reduce((a, b) => a + b, 0n);\n for (let i = 0; i < 4; i++) s[i] = mod(s[i]! * INTERNAL_DIAGONAL[i]! + sum);\n }\n }\n}\n/** Barretenberg's length-separated rate-three BN254 Poseidon2 sponge. */\nexport async function poseidonHash(inputs: bigint[]): Promise<`0x${string}`> {\n for (let i = 0; i < inputs.length; i++)\n if (inputs[i]! < 0n || inputs[i]! >= P)\n throw new RangeError(\n `poseidonHash: input[${i}] out of BN254 field range [0, FIELD_MODULUS): ${inputs[i]}`\n );\n const state = [0n, 0n, 0n, BigInt(inputs.length) << 64n];\n let used = 0;\n for (const input of inputs) {\n if (used === 3) {\n permute(state);\n used = 0;\n }\n state[used] = mod(state[used]! + input);\n used++;\n }\n permute(state);\n return `0x${state[0]!.toString(16).padStart(64, \"0\")}`;\n}\n","import { getBytes, type BytesLike } from \"ethers\";\nimport { creditEnvelopeV2, fundsEnvelopeV1 } from \"./note-payload\";\n\n/** Stable transport resource bound; applications do not select the SDK envelope version. */\nexport const MAX_CIPHERTEXT_BYTES = 4096;\nexport type DeliveryKind = \"funds\" | \"credit\";\nexport function deliveryHeader(kind: DeliveryKind): number {\n if (kind !== \"funds\" && kind !== \"credit\") throw new Error(\"unsupported delivery kind\");\n return kind === \"credit\" ? 0x82 : 0x01;\n}\nexport function decodeDeliveryHeader(header: number): { kind: DeliveryKind; version: number } {\n if (!Number.isInteger(header) || header < 0 || header > 255)\n throw new Error(\"delivery header must be one byte\");\n const kind = header >>> 7 ? \"credit\" : \"funds\";\n const version = header & 0x7f;\n if (version === 0) throw new Error(\"invalid envelope version\");\n return { kind, version };\n}\n/** Dispatch only SDK-owned envelope implementations. Future versions are added here. */\nexport function deliveryCodec(header: number) {\n const { kind, version } = decodeDeliveryHeader(header);\n if (version !== (kind === \"credit\" ? 2 : 1))\n throw new Error(`unsupported envelope version ${version}`);\n const codec = kind === \"funds\" ? fundsEnvelopeV1 : creditEnvelopeV2;\n return {\n ...codec,\n domain: `Invisi.${kind === \"funds\" ? \"Note\" : \"Credit\"}Delivery.v${kind === \"credit\" ? 2 : 1}`,\n };\n}\nexport function validateDeliveryCiphertext(value: BytesLike, kind?: DeliveryKind): Uint8Array {\n const data = Uint8Array.from(getBytes(value));\n if (data.length === 0 || data.length > MAX_CIPHERTEXT_BYTES)\n throw new Error(\"invalid envelope length\");\n const codec = deliveryCodec(data[0]!);\n if (kind !== undefined && codec.kind !== kind) throw new Error(\"unexpected envelope kind\");\n if (data.length < codec.minimum || data.length > codec.maximum)\n throw new Error(\"invalid envelope length\");\n return data;\n}\n","import { secp256k1 } from \"@noble/curves/secp256k1\";\nimport { validateClueKey } from \"../fmd/fmd\";\nimport { normalizeCreditPolicy, normalizeCreditState } from \"../credit/state\";\nimport type { CreditDeliveryState, ReceivingKeys } from \"../types\";\n\nfunction concat(...parts: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(parts.reduce((length, part) => length + part.length, 0));\n let offset = 0;\n for (const part of parts) {\n out.set(part, offset);\n offset += part.length;\n }\n return out;\n}\nfunction uint(value: bigint, bits: number, name: string): void {\n if (value < 0n || value >= 1n << BigInt(bits))\n throw new RangeError(`${name} out of uint${bits} range`);\n}\nfunction encode(value: bigint, length = 32): Uint8Array {\n uint(value, length * 8, \"encoded value\");\n const out = new Uint8Array(length);\n for (let i = length - 1; i >= 0; i--) {\n out[i] = Number(value & 255n);\n value >>= 8n;\n }\n return out;\n}\nfunction decode(value: Uint8Array): bigint {\n return value.reduce((result, byte) => (result << 8n) | BigInt(byte), 0n);\n}\nfunction hexField(value: bigint): `0x${string}` {\n uint(value, 160, \"owner address\");\n return `0x${value.toString(16).padStart(40, \"0\")}`;\n}\nfunction receivingKeys(keys: ReceivingKeys): ReceivingKeys {\n if (\n !keys ||\n !(keys.viewingPublicKey instanceof Uint8Array) ||\n !(keys.clueKey instanceof Uint8Array)\n )\n throw new Error(\"receiving keys required\");\n const viewingPublicKey = Uint8Array.from(keys.viewingPublicKey),\n clueKey = Uint8Array.from(keys.clueKey);\n if (viewingPublicKey.length !== 33 || (viewingPublicKey[0] !== 2 && viewingPublicKey[0] !== 3))\n throw new Error(\"invalid compressed viewing public key\");\n secp256k1.ProjectivePoint.fromHex(viewingPublicKey).assertValidity();\n if (clueKey.length !== 32) throw new Error(\"invalid clue key length\");\n validateClueKey(clueKey);\n return { viewingPublicKey, clueKey };\n}\n\n/** Copy and validate both public key snapshots without exporting any spending material. */\nexport function normalizeCreditDeliveryState(state: CreditDeliveryState): CreditDeliveryState {\n if (!state || typeof state !== \"object\" || !state.note || typeof state.note !== \"object\")\n throw new TypeError(\"complete Credit delivery state required\");\n const allowed = [\n \"chainId\",\n \"protocolAddress\",\n \"tokenAddress\",\n \"spenderWalletIdentity\",\n \"ownerWalletIdentity\",\n \"revocationShard\",\n \"revocationSlot\",\n \"nonce\",\n \"expiry\",\n \"creditSharedKey\",\n \"singleLimit\",\n \"dailyLimit\",\n \"monthlyLimit\",\n \"availableCredit\",\n \"unlimited\",\n \"lastDay\",\n \"dailySpent\",\n \"lastMonth\",\n \"monthlySpent\",\n \"totalSpent\",\n \"payload\",\n ];\n if (Object.keys(state.note).some((k) => !allowed.includes(k)))\n throw Error(\"Unsupported Credit fields\");\n const note = normalizeCreditState(structuredClone(state.note));\n return {\n note: {\n ...note,\n ...normalizeCreditPolicy(note),\n },\n ownerReceivingKeys: receivingKeys(state.ownerReceivingKeys),\n spenderReceivingKeys: receivingKeys(state.spenderReceivingKeys),\n };\n}\n\n/** Length-delimited application bytes are opaque to the fixed note decoder. */\nfunction encodePayload(value?: Uint8Array): Uint8Array {\n if (value !== undefined && !(value instanceof Uint8Array))\n throw new TypeError(\"payload must be Uint8Array\");\n const payload = value ?? new Uint8Array();\n if (payload.length > 65535) throw new RangeError(\"payload length exceeds uint16\");\n return concat(encode(BigInt(payload.length), 2), payload);\n}\nfunction readPayload(plain: Uint8Array, offset: number): Uint8Array {\n if (plain.length < offset + 2) throw new Error(\"missing payload length\");\n const length = Number(decode(plain.slice(offset, offset + 2)));\n if (plain.length !== offset + 2 + length) throw new Error(\"invalid payload length\");\n return Uint8Array.from(plain.subarray(offset + 2));\n}\nexport const fundsEnvelopeV1 = {\n kind: \"funds\" as const,\n version: 1,\n minimum: 160,\n maximum: 4096,\n encode(note: import(\"../types\").Note) {\n return concat(\n encode(BigInt(note.ownerAddress)),\n encode(note.amount, 16),\n encode(note.nonce),\n encodePayload(note.payload)\n );\n },\n decode(plain: Uint8Array, context: import(\"./encryption\").NoteDecryptionContext) {\n return {\n chainId: context.chainId,\n protocolAddress: context.protocolAddress,\n tokenAddress: context.tokenAddress,\n ownerAddress: hexField(decode(plain.slice(0, 32))),\n amount: decode(plain.slice(32, 48)),\n nonce: decode(plain.slice(48, 80)),\n payload: readPayload(plain, 80),\n };\n },\n};\nconst creditWireFields = [\n [\"spenderWalletIdentity\", 32],\n [\"ownerWalletIdentity\", 32],\n [\"revocationShard\", 8],\n [\"revocationSlot\", 2],\n [\"nonce\", 32],\n [\"expiry\", 8],\n [\"creditSharedKey\", 32],\n [\"singleLimit\", 16],\n [\"dailyLimit\", 16],\n [\"monthlyLimit\", 16],\n [\"availableCredit\", 16],\n [\"unlimited\", 1],\n [\"lastDay\", 8],\n [\"dailySpent\", 16],\n [\"lastMonth\", 8],\n [\"monthlySpent\", 16],\n [\"totalSpent\", 16],\n] as const;\nexport const creditEnvelopeV2 = {\n kind: \"credit\" as const,\n version: 2,\n minimum: 485,\n maximum: 4096,\n encode(input: CreditDeliveryState) {\n const state = normalizeCreditDeliveryState(input);\n return concat(\n ...creditWireFields.map(([k, size]) => encode(BigInt(state.note[k]!), size)),\n state.ownerReceivingKeys.viewingPublicKey,\n state.ownerReceivingKeys.clueKey,\n state.spenderReceivingKeys.viewingPublicKey,\n state.spenderReceivingKeys.clueKey,\n encodePayload(state.note.payload)\n );\n },\n decode(plain: Uint8Array, context: import(\"./encryption\").CreditStateDecryptionContext) {\n let offset = 0;\n const note: Record<string, unknown> = {\n chainId: context.chainId,\n protocolAddress: context.protocolAddress,\n tokenAddress: context.tokenAddress,\n };\n for (const [k, size] of creditWireFields) {\n const n = decode(plain.slice(offset, offset + size));\n if (k === \"unlimited\" && n !== 0n && n !== 1n)\n throw Error(\"invalid Credit unlimited byte\");\n note[k] = k === \"unlimited\" ? n === 1n : k.endsWith(\"Identity\") ? hexField(n) : n;\n offset += size;\n }\n const keys = () => {\n const k = {\n viewingPublicKey: plain.slice(offset, offset + 33),\n clueKey: plain.slice(offset + 33, offset + 65),\n };\n offset += 65;\n return k;\n };\n const ownerReceivingKeys = keys(),\n spenderReceivingKeys = keys();\n note.payload = readPayload(plain, offset);\n return normalizeCreditDeliveryState({\n note: note as unknown as import(\"../types\").CreditState,\n ownerReceivingKeys,\n spenderReceivingKeys,\n });\n },\n};\n","import type { ProtocolContext } from \"../types\";\n\n/** Stored notes must belong to the chain and deployment used by an operation. */\nexport function assertNoteContext(note: ProtocolContext, context: ProtocolContext): void {\n if (note.chainId !== context.chainId || note.protocolAddress !== context.protocolAddress) {\n throw new Error(\"note context mismatch\");\n }\n}\n","import {\n D_CNULL,\n D_CREDIT,\n D_CREDIT_KEY_HASH,\n D_CREDIT_RECOVERY,\n D_CREDIT_STATE_NONCE,\n} from \"../crypto/domains\";\nimport { poseidonHash } from \"../crypto/poseidon\";\nimport { FIELD_MODULUS } from \"../crypto/random\";\nimport type {\n CreditState,\n CreditPolicy,\n CreditUsage,\n CreditStateRecovery,\n ProtocolContext,\n} from \"../types\";\nimport { assertNoteContext } from \"../notes/noteContext\";\n\nexport const CREDIT_POLICY_FIELDS = [\"singleLimit\", \"dailyLimit\", \"monthlyLimit\"] as const;\nexport const CREDIT_USAGE_FIELDS = [\n \"lastDay\",\n \"dailySpent\",\n \"lastMonth\",\n \"monthlySpent\",\n \"totalSpent\",\n] as const;\nexport function normalizeCreditPolicy(value: Partial<CreditPolicy> = {}): CreditPolicy {\n return Object.fromEntries(\n CREDIT_POLICY_FIELDS.map((key) => {\n const n = value[key] ?? 0n;\n uint(n, 126, key);\n return [key, n];\n })\n ) as unknown as CreditPolicy;\n}\nexport function normalizeCreditUsage(value: Partial<CreditUsage> = {}): CreditUsage {\n const usage = Object.fromEntries(\n CREDIT_USAGE_FIELDS.map((key) => {\n const n = value[key] ?? 0n;\n uint(n, key === \"lastDay\" || key === \"lastMonth\" ? 64 : 128, key);\n return [key, n];\n })\n ) as unknown as CreditUsage;\n for (const [period, spent] of [\n [\"lastDay\", \"dailySpent\"],\n [\"lastMonth\", \"monthlySpent\"],\n ] as const)\n if (usage[period] === 0n && usage[spent] !== 0n) throw Error(\"noncanonical Credit usage\");\n return usage;\n}\nfunction balance(value: Pick<CreditState, \"availableCredit\" | \"unlimited\">) {\n uint(value.availableCredit, 128, \"availableCredit\");\n if (typeof value.unlimited !== \"boolean\") throw TypeError(\"unlimited must be boolean\");\n if (value.unlimited && value.availableCredit !== 0n)\n throw Error(\"unlimited Credit must have zero available credit\");\n return { availableCredit: value.availableCredit, unlimited: value.unlimited };\n}\n/** UTC Gregorian periods from explicit uint64 chain seconds, without wall-clock defaults. */\nexport function creditPeriods(timestamp: bigint): { currentDay: bigint; currentMonth: bigint } {\n if (typeof timestamp !== \"bigint\") throw new TypeError(\"Credit timestamp required\");\n uint(timestamp, 64, \"timestamp\");\n const days = timestamp / 86400n,\n z = days + 719468n,\n era = z / 146097n,\n doe = z - era * 146097n;\n const yoe = (doe - doe / 1460n + doe / 36524n - doe / 146096n) / 365n;\n let year = yoe + era * 400n;\n const doy = doe - (365n * yoe + yoe / 4n - yoe / 100n),\n mp = (5n * doy + 2n) / 153n;\n const month = mp + (mp < 10n ? 3n : -9n);\n if (month <= 2n) year++;\n return { currentDay: days + 1n, currentMonth: (year - 1970n) * 12n + month };\n}\n/** Accumulate actual debits even when limits are disabled. */\nexport function applyCreditDrawUsage(\n note: Partial<CreditPolicy & CreditUsage> & Pick<CreditState, \"availableCredit\" | \"unlimited\">,\n amount: bigint,\n timestamp: bigint\n): CreditPolicy & CreditUsage & Pick<CreditState, \"availableCredit\" | \"unlimited\"> {\n const policy = {\n ...normalizeCreditPolicy(note),\n ...normalizeCreditUsage(note),\n ...balance(note),\n },\n periods = creditPeriods(timestamp);\n uint(amount, 126, \"draw amount\");\n if (amount === 0n) throw new Error(\"draw amount must be positive\");\n if (policy.singleLimit !== 0n && amount > policy.singleLimit)\n throw new Error(\"single limit exceeded\");\n for (const [limit, last, spent, current] of [\n [\"dailyLimit\", \"lastDay\", \"dailySpent\", \"currentDay\"],\n [\"monthlyLimit\", \"lastMonth\", \"monthlySpent\", \"currentMonth\"],\n ] as const) {\n const period = periods[current];\n if (period < policy[last]) throw new Error(\"Credit period rollback\");\n policy[spent] = (period === policy[last] ? policy[spent] : 0n) + amount;\n uint(policy[spent], 128, spent);\n policy[last] = period;\n if (policy[limit] !== 0n && policy[spent] > policy[limit])\n throw new Error(`${limit} exceeded`);\n }\n policy.totalSpent += amount;\n uint(policy.totalSpent, 128, \"totalSpent\");\n if (!policy.unlimited) {\n if (amount > policy.availableCredit) throw Error(\"available credit exceeded\");\n policy.availableCredit -= amount;\n }\n return policy;\n}\n\nexport async function computeCreditSharedKeyHash(creditSharedKey: bigint): Promise<`0x${string}`> {\n if (creditSharedKey <= 0n || creditSharedKey >= FIELD_MODULUS)\n throw new RangeError(\"invalid Credit shared key\");\n return poseidonHash([D_CREDIT_KEY_HASH, creditSharedKey]);\n}\n\nexport function normalizeCreditState(state: CreditState): CreditState {\n const allowed = [\n \"chainId\",\n \"protocolAddress\",\n \"tokenAddress\",\n \"spenderWalletIdentity\",\n \"ownerWalletIdentity\",\n \"revocationShard\",\n \"revocationSlot\",\n \"nonce\",\n \"expiry\",\n \"creditSharedKey\",\n ...CREDIT_POLICY_FIELDS,\n ...CREDIT_USAGE_FIELDS,\n \"availableCredit\",\n \"unlimited\",\n \"payload\",\n ];\n if (!state || typeof state !== \"object\" || Object.keys(state).some((k) => !allowed.includes(k)))\n throw Error(\"Unsupported Credit fields\");\n for (const [name, bits] of [\n [\"chainId\", 64],\n [\"protocolAddress\", 160],\n [\"tokenAddress\", 160],\n [\"revocationShard\", 64],\n [\"revocationSlot\", 16],\n [\"expiry\", 64],\n ] as const)\n uint(state[name], bits, name);\n for (const id of [state.spenderWalletIdentity, state.ownerWalletIdentity])\n if (!/^0x[0-9a-fA-F]{40}$/.test(id) || BigInt(id) === 0n)\n throw Error(\"invalid Credit identity\");\n if (!state.protocolAddress || !state.tokenAddress || !state.revocationShard || !state.expiry)\n throw Error(\"Credit deployment, token, shard and expiry must be positive\");\n field(state.nonce, \"nonce\");\n field(state.creditSharedKey, \"creditSharedKey\");\n if (!state.creditSharedKey) throw Error(\"Credit shared key must be positive\");\n if (state.payload !== undefined && !(state.payload instanceof Uint8Array))\n throw TypeError(\"payload must be Uint8Array\");\n return {\n ...state,\n ...normalizeCreditPolicy(state),\n ...normalizeCreditUsage(state),\n ...balance(state),\n ...(state.payload !== undefined ? { payload: Uint8Array.from(state.payload) } : {}),\n };\n}\nexport async function computeCreditCommitment(\n state: CreditState,\n keyHash?: `0x${string}`\n): Promise<`0x${string}`> {\n if (keyHash === undefined) state = normalizeCreditState(state);\n for (const [name, bits] of [\n [\"chainId\", 64],\n [\"protocolAddress\", 160],\n [\"tokenAddress\", 160],\n [\"revocationShard\", 64],\n [\"revocationSlot\", 16],\n [\"expiry\", 64],\n ] as const)\n uint(state[name], bits, name);\n for (const identity of [state.spenderWalletIdentity, state.ownerWalletIdentity])\n if (!/^0x[0-9a-fA-F]{40}$/.test(identity) || BigInt(identity) === 0n)\n throw new Error(\"invalid Credit identity\");\n if (state.revocationShard === 0n || state.expiry === 0n)\n throw new Error(\"Credit shard and expiry must be positive\");\n field(state.nonce, \"nonce\");\n const hash = keyHash ?? (await computeCreditSharedKeyHash(state.creditSharedKey));\n field(BigInt(hash), \"Credit shared key hash\");\n return poseidonHash([\n D_CREDIT,\n state.chainId,\n state.protocolAddress,\n BigInt(state.spenderWalletIdentity),\n BigInt(state.ownerWalletIdentity),\n state.tokenAddress,\n state.revocationShard,\n state.revocationSlot,\n state.nonce,\n state.expiry,\n BigInt(hash),\n ...CREDIT_POLICY_FIELDS.map((k) => normalizeCreditPolicy(state)[k]),\n balance(state).availableCredit,\n state.unlimited ? 1n : 0n,\n ...CREDIT_USAGE_FIELDS.map((k) => normalizeCreditUsage(state)[k]),\n ]);\n}\n\nexport async function computeCreditNullifier(\n chainId: bigint,\n creditSharedKey: bigint,\n creditCommitment: `0x${string}`\n): Promise<`0x${string}`> {\n uint(chainId, 64, \"chainId\");\n if (creditSharedKey <= 0n || creditSharedKey >= FIELD_MODULUS)\n throw new RangeError(\"invalid Credit shared key\");\n if (!/^0x[0-9a-fA-F]{64}$/.test(creditCommitment))\n throw new Error(\"invalid Credit commitment encoding\");\n return poseidonHash([D_CNULL, chainId, creditSharedKey, BigInt(creditCommitment)]);\n}\n\n/** Tag10: deterministic successor nonce, scoped to the deployment and spend. */\nexport async function deriveCreditStateNonce(\n chainId: bigint,\n protocolAddress: bigint,\n tokenAddress: bigint,\n creditNullifier: bigint,\n creditSharedKey: bigint\n): Promise<bigint> {\n return BigInt(\n await poseidonHash([\n D_CREDIT_STATE_NONCE,\n chainId,\n protocolAddress,\n tokenAddress,\n creditNullifier,\n creditSharedKey,\n ])\n );\n}\n\n/** Tag9: additive recovery pad; recoveryAmount = (debit + pad) mod p. */\nexport async function computeCreditRecoveryPad(\n chainId: bigint,\n protocolAddress: bigint,\n tokenAddress: bigint,\n creditNullifier: bigint,\n creditSharedKey: bigint\n): Promise<bigint> {\n return BigInt(\n await poseidonHash([\n D_CREDIT_RECOVERY,\n chainId,\n protocolAddress,\n tokenAddress,\n creditNullifier,\n creditSharedKey,\n ])\n );\n}\n\nfunction uint(value: bigint, bits: number, name: string): void {\n if (typeof value !== \"bigint\" || value < 0n || value >= 1n << BigInt(bits))\n throw new RangeError(`${name} out of uint${bits} range`);\n}\n\nfunction field(value: bigint, name: string): void {\n if (typeof value !== \"bigint\" || value < 0n || value >= FIELD_MODULUS)\n throw new RangeError(`${name} out of BN254 field range`);\n}\n\n/** Recover a successor using authenticated draw fields, without a decryptable successor delivery. */\nexport async function recoverCreditState(\n context: ProtocolContext,\n previous: CreditState,\n recovery: CreditStateRecovery\n): Promise<CreditState> {\n assertNoteContext(previous, context);\n const nullifier = await computeCreditNullifier(\n context.chainId,\n previous.creditSharedKey,\n await computeCreditCommitment(previous)\n );\n if (nullifier.toLowerCase() !== recovery.creditNullifier.toLowerCase())\n throw new Error(\"previous Credit nullifier mismatch\");\n field(recovery.recoveryAmount, \"recoveryAmount\");\n const args = [\n context.chainId,\n context.protocolAddress,\n previous.tokenAddress,\n BigInt(nullifier),\n previous.creditSharedKey,\n ] as const;\n const nonce = await deriveCreditStateNonce(...args),\n mask = await computeCreditRecoveryPad(...args);\n const debit = (recovery.recoveryAmount - mask + FIELD_MODULUS) % FIELD_MODULUS;\n uint(debit, 126, \"recovered debit\");\n if (!debit) throw new Error(\"invalid recovered debit\");\n if (nonce === previous.nonce) throw new Error(\"state nonce must change\");\n const { payload, ...financial } = previous;\n const state = {\n ...financial,\n ...applyCreditDrawUsage(previous, debit, recovery.timestamp),\n nonce,\n };\n if ((await computeCreditCommitment(state)) !== recovery.stateCommitment)\n throw new Error(\"recovered Credit commitment mismatch\");\n return state;\n}\n\nexport async function deriveCreditState(\n previous: CreditState,\n debit: bigint,\n timestamp: bigint\n): Promise<{\n state: CreditState;\n stateCommitment: `0x${string}`;\n nullifier: `0x${string}`;\n recoveryAmount: bigint;\n}> {\n const nullifier = await computeCreditNullifier(\n previous.chainId,\n previous.creditSharedKey,\n await computeCreditCommitment(previous)\n );\n const args = [\n previous.chainId,\n previous.protocolAddress,\n previous.tokenAddress,\n BigInt(nullifier),\n previous.creditSharedKey,\n ] as const;\n const nonce = await deriveCreditStateNonce(...args),\n mask = await computeCreditRecoveryPad(...args);\n if (nonce === previous.nonce) throw Error(\"state nonce must change\");\n const state = { ...previous, ...applyCreditDrawUsage(previous, debit, timestamp), nonce };\n return {\n state,\n stateCommitment: await computeCreditCommitment(state),\n nullifier,\n recoveryAmount: (debit + mask) % FIELD_MODULUS,\n };\n}\nexport interface CreditUpdateChanges extends Partial<CreditPolicy> {\n expiry?: bigint;\n unlimited?: boolean;\n increaseAvailableCredit?: bigint;\n decreaseAvailableCredit?: bigint;\n}\nexport async function deriveCreditUpdate(\n previous: CreditState,\n changes: CreditUpdateChanges,\n deadline: bigint\n) {\n for (const key of Object.keys(changes))\n if (\n ![\n ...CREDIT_POLICY_FIELDS,\n \"expiry\",\n \"unlimited\",\n \"increaseAvailableCredit\",\n \"decreaseAvailableCredit\",\n ].includes(key)\n )\n throw Error(\"unsupported Credit update field\");\n const old = normalizeCreditState(previous),\n increase =\n changes.increaseAvailableCredit === undefined ? 0n : changes.increaseAvailableCredit,\n decrease =\n changes.decreaseAvailableCredit === undefined ? 0n : changes.decreaseAvailableCredit;\n uint(increase, 128, \"increaseAvailableCredit\");\n uint(decrease, 128, \"decreaseAvailableCredit\");\n if (increase !== 0n && decrease !== 0n)\n throw Error(\"Credit increase and decrease are mutually exclusive\");\n const unlimited = changes.unlimited === undefined ? old.unlimited : changes.unlimited;\n if (typeof unlimited !== \"boolean\") throw TypeError(\"unlimited must be boolean\");\n let availableCredit = 0n;\n if (unlimited) {\n if (increase !== 0n || decrease !== 0n)\n throw Error(\"unlimited update cannot adjust available credit\");\n } else {\n if (decrease > old.availableCredit)\n throw Error(\"available credit decrease exceeds balance\");\n availableCredit = old.availableCredit + increase - decrease;\n uint(availableCredit, 128, \"availableCredit\");\n }\n uint(deadline, 64, \"deadline\");\n const next = {\n ...old,\n ...normalizeCreditPolicy({ ...old, ...changes }),\n expiry: changes.expiry ?? old.expiry,\n availableCredit,\n unlimited,\n };\n if (previous.expiry < deadline || next.expiry < deadline)\n throw Error(\"expiry before request deadline\");\n const nullifier = await computeCreditNullifier(\n previous.chainId,\n previous.creditSharedKey,\n await computeCreditCommitment(previous)\n );\n const nonce = await deriveCreditStateNonce(\n previous.chainId,\n previous.protocolAddress,\n previous.tokenAddress,\n BigInt(nullifier),\n previous.creditSharedKey\n );\n if (nonce === previous.nonce) throw Error(\"state nonce must change\");\n const state = { ...next, nonce };\n return { state, nullifier, stateCommitment: await computeCreditCommitment(state) };\n}\n","/** AEAD failure is ambiguous: wrong recipient key, wrong context or damaged ciphertext. */\nexport class DeliveryAuthenticationError extends Error {\n constructor(cause?: unknown) {\n super(\"delivery authentication failed\", { cause });\n this.name = \"DeliveryAuthenticationError\";\n }\n}\n","import { DeliveryAuthenticationError } from \"./errors\";\nimport { secp256k1 } from \"@noble/curves/secp256k1\";\nimport { ascii, bytes, concat, encode } from \"./binary\";\nimport { deliveryCodec, validateDeliveryCiphertext } from \"./delivery-codec\";\nimport { NoteBytes, NoteDecryptionContext, NoteEncryptionContext } from \"./types\";\nimport { validateContext } from \"./validation\";\n\n// Minimal Web Crypto declarations avoid adding DOM/Node types to this package API.\ntype GcmParameters = {\n name: string;\n iv: ArrayBuffer;\n additionalData: ArrayBuffer;\n tagLength: number;\n};\n\ndeclare const crypto: {\n getRandomValues<T extends ArrayBufferView>(array: T): T;\n subtle: {\n importKey(\n format: string,\n data: ArrayBuffer,\n algorithm: string,\n extractable: boolean,\n usages: string[]\n ): Promise<unknown>;\n exportKey(format: \"raw\", key: unknown): Promise<ArrayBuffer>;\n deriveKey(\n parameters: { name: string; hash: string; salt: ArrayBuffer; info: ArrayBuffer },\n key: unknown,\n algorithm: { name: string; length: number },\n extractable: boolean,\n usages: string[]\n ): Promise<unknown>;\n encrypt(parameters: GcmParameters, key: unknown, data: ArrayBuffer): Promise<ArrayBuffer>;\n decrypt(parameters: GcmParameters, key: unknown, data: ArrayBuffer): Promise<ArrayBuffer>;\n };\n};\n\nfunction aad(\n domain: Uint8Array,\n context: NoteEncryptionContext,\n tokenAddress: bigint,\n header: Uint8Array,\n role: number\n): Uint8Array {\n validateContext(context, tokenAddress);\n return concat(\n domain,\n header,\n new Uint8Array([role]),\n encode(context.chainId, 8),\n encode(context.protocolAddress, 20),\n encode(tokenAddress, 20),\n encode(BigInt(context.outputCommitment))\n );\n}\n\nfunction privateKey(value: NoteBytes): Uint8Array {\n const key = bytes(value, 32);\n if (!secp256k1.utils.isValidPrivateKey(key)) throw new Error(\"invalid viewing private key\");\n return key;\n}\n\nexport function publicKey(value: NoteBytes): Uint8Array {\n const key = bytes(value, 33);\n if (key[0] !== 2 && key[0] !== 3) throw new Error(\"expected compressed secp256k1 public key\");\n // Parsing checks that the compressed x coordinate is on the curve.\n secp256k1.ProjectivePoint.fromHex(key);\n return key;\n}\n\n/** Compressed secp256k1 viewing key (33 bytes), independent of spending authority. */\nexport function viewingPublicKey(key: NoteBytes): Uint8Array {\n return secp256k1.getPublicKey(privateKey(key), true);\n}\n\nfunction random(length: number): Uint8Array {\n return crypto.getRandomValues(new Uint8Array(length));\n}\n\nfunction ephemeralKey(): Uint8Array {\n for (;;) {\n const key = random(32);\n if (secp256k1.utils.isValidPrivateKey(key)) return key;\n }\n}\n\n// ArrayBuffer copies keep browser BufferSource types independent of Node Buffers.\nconst buffer = (value: Uint8Array): ArrayBuffer => Uint8Array.from(value).buffer;\n\nasync function derivedKey(\n key: Uint8Array,\n peer: Uint8Array,\n header: Uint8Array,\n recipient: Uint8Array,\n domain: Uint8Array,\n extractable = false\n) {\n // Node's computeSecret returns the raw shared point X coordinate (32 bytes).\n const secret = secp256k1.getSharedSecret(key, peer, true).slice(1);\n const material = await crypto.subtle.importKey(\"raw\", buffer(secret), \"HKDF\", false, [\n \"deriveKey\",\n ]);\n try {\n return await crypto.subtle.deriveKey(\n {\n name: \"HKDF\",\n hash: \"SHA-256\",\n salt: buffer(header.slice(34, 50)),\n info: buffer(concat(domain, header.slice(1, 34), recipient)),\n },\n material,\n { name: \"AES-GCM\", length: 256 },\n extractable,\n [\"encrypt\", \"decrypt\"]\n );\n } finally {\n secret.fill(0);\n }\n}\n\nexport async function seal(\n viewingKey: NoteBytes,\n plaintext: Uint8Array,\n context: NoteEncryptionContext,\n tokenAddress: bigint,\n headerByte: number,\n role: number\n): Promise<Uint8Array> {\n const peer = publicKey(viewingKey),\n key = ephemeralKey();\n const salt = random(16),\n iv = random(12),\n domain = deliveryDomain(headerByte);\n const header = concat(\n new Uint8Array([headerByte]),\n secp256k1.getPublicKey(key, true),\n salt,\n iv\n );\n const additionalData = aad(domain, context, tokenAddress, header, role);\n try {\n const encrypted = await crypto.subtle.encrypt(\n {\n name: \"AES-GCM\",\n iv: buffer(iv),\n additionalData: buffer(additionalData),\n tagLength: 128,\n },\n await derivedKey(key, peer, header, peer, domain),\n buffer(plaintext)\n );\n return concat(header, new Uint8Array(encrypted));\n } finally {\n key.fill(0);\n plaintext.fill(0);\n }\n}\n\nexport async function open(\n key: NoteBytes,\n envelope: NoteBytes,\n context: NoteDecryptionContext,\n headerByte: number,\n role: number,\n payloadKey = false\n): Promise<Uint8Array> {\n const data = envelopeBytes(envelope, deliveryCodec(headerByte).kind === \"credit\");\n if (data[0] !== headerByte) throw new Error(\"unsupported envelope version\");\n const domain = deliveryDomain(headerByte);\n const additionalData = aad(domain, context, context.tokenAddress, data.slice(0, 62), role);\n const localKey = payloadKey ? bytes(key, 32) : privateKey(key);\n try {\n const aes = payloadKey\n ? await crypto.subtle.importKey(\"raw\", buffer(bytes(key, 32)), \"AES-GCM\", false, [\n \"decrypt\",\n ])\n : await derivedKey(\n localKey,\n publicKey(data.slice(1, 34)),\n data.slice(0, 62),\n secp256k1.getPublicKey(localKey, true),\n domain\n );\n const decrypted = await crypto.subtle\n .decrypt(\n {\n name: \"AES-GCM\",\n iv: buffer(data.slice(50, 62)),\n additionalData: buffer(additionalData),\n tagLength: 128,\n },\n aes,\n buffer(data.slice(62))\n )\n .catch((error: unknown) => {\n if (error instanceof Error && error.name === \"OperationError\")\n throw new DeliveryAuthenticationError(error);\n throw error;\n });\n return new Uint8Array(decrypted);\n } finally {\n localKey.fill(0);\n }\n}\n\nfunction deliveryDomain(headerByte: number): Uint8Array {\n return ascii(deliveryCodec(headerByte).domain);\n}\n\nexport async function exportPayloadKey(\n key: NoteBytes,\n envelope: NoteBytes,\n credit: boolean\n): Promise<Uint8Array> {\n const data = envelopeBytes(envelope, credit);\n\n const localKey = privateKey(key);\n try {\n const aes = await derivedKey(\n localKey,\n publicKey(data.slice(1, 34)),\n data.slice(0, 62),\n viewingPublicKey(localKey),\n deliveryDomain(data[0]!),\n true\n );\n return new Uint8Array(await crypto.subtle.exportKey(\"raw\", aes));\n } finally {\n localKey.fill(0);\n }\n}\n\nexport function envelopeBytes(value: NoteBytes, credit: boolean): Uint8Array {\n return validateDeliveryCiphertext(value, credit ? \"credit\" : \"funds\");\n}\n","import { FIELD_MODULUS } from \"../crypto/random\";\nimport { NoteBytes } from \"./types\";\n\nexport const ascii = (value: string) =>\n Uint8Array.from(value, (character) => character.charCodeAt(0));\n\nexport function concat(...parts: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(parts.reduce((size, p) => size + p.length, 0));\n let offset = 0;\n for (const part of parts) {\n out.set(part, offset);\n offset += part.length;\n }\n return out;\n}\n\nexport function bytes(value: NoteBytes, length: number): Uint8Array {\n let out: Uint8Array;\n if (typeof value === \"string\") {\n if (!/^0x(?:[0-9a-fA-F]{2})*$/.test(value)) throw new Error(\"invalid hexadecimal bytes\");\n out = Uint8Array.from(value.slice(2).match(/../g) ?? [], (b) => parseInt(b, 16));\n } else if (value instanceof Uint8Array) out = Uint8Array.from(value);\n else throw new Error(\"expected hexadecimal bytes or Uint8Array\");\n if (out.length !== length) throw new Error(`expected ${length} bytes`);\n return out;\n}\n\nexport function uint(value: bigint, bits: number, name: string): void {\n if (value < 0n || value >= 1n << BigInt(bits))\n throw new RangeError(`${name} out of uint${bits} range`);\n}\n\nexport function field(value: bigint, name: string): void {\n if (value < 0n || value >= FIELD_MODULUS)\n throw new RangeError(`${name} out of BN254 field range`);\n}\n\nexport function encode(value: bigint, length = 32): Uint8Array {\n uint(value, length * 8, \"encoded value\");\n const out = new Uint8Array(length);\n for (let i = length - 1; i >= 0; i--) {\n out[i] = Number(value & 255n);\n value >>= 8n;\n }\n return out;\n}\n\nexport function decode(value: Uint8Array): bigint {\n return value.reduce((n, b) => (n << 8n) | BigInt(b), 0n);\n}\n\nfunction hexField(value: bigint): `0x${string}` {\n uint(value, 160, \"owner address\");\n return `0x${value.toString(16).padStart(40, \"0\")}`;\n}\n","import { D_IDENT, D_NOTE } from \"../crypto/domains\";\nimport { poseidonHash } from \"../crypto/poseidon\";\n\n/** Randomized per-note identity; the full owner address stays private on chain. */\nexport async function computeNoteIdentity(\n ownerAddress: bigint,\n nonce: bigint\n): Promise<`0x${string}`> {\n if (ownerAddress <= 0n || ownerAddress >= 1n << 160n)\n throw new RangeError(\"invalid owner address\");\n return poseidonHash([D_IDENT, ownerAddress, nonce]);\n}\n\n/** Note leaf from a randomized identity, token and positive u128 amount. */\nexport async function computeNoteCommitment(\n chainId: bigint,\n protocolAddress: bigint,\n identity: `0x${string}`,\n tokenAddress: bigint,\n amount: bigint\n): Promise<`0x${string}`> {\n if (chainId < 0n || chainId >= 1n << 64n) throw new RangeError(\"invalid chainId\");\n if (protocolAddress <= 0n || protocolAddress >= 1n << 160n)\n throw new RangeError(\"invalid protocol address\");\n if (tokenAddress < 0n || tokenAddress >= 1n << 160n)\n throw new RangeError(\"invalid token address\");\n if (amount <= 0n || amount >= 1n << 128n) throw new RangeError(\"invalid note amount\");\n if (!/^0x[0-9a-fA-F]{64}$/.test(identity)) throw new Error(\"invalid note identity encoding\");\n return poseidonHash([D_NOTE, chainId, protocolAddress, BigInt(identity), tokenAddress, amount]);\n}\n","import { computeNoteCommitment, computeNoteIdentity } from \"../notes/commitment\";\nimport { computeCreditCommitment, computeCreditSharedKeyHash } from \"../credit/state\";\nimport { assertNoteContext } from \"../notes/noteContext\";\nimport type { CreditState, Note } from \"../types\";\nimport { field, uint } from \"./binary\";\nimport { NoteEncryptionContext } from \"./types\";\n\nexport function validateContext(context: NoteEncryptionContext, tokenAddress: bigint): void {\n uint(context.chainId, 64, \"chainId\");\n uint(context.protocolAddress, 160, \"protocolAddress\");\n uint(tokenAddress, 160, \"tokenAddress\");\n field(BigInt(context.outputCommitment), \"outputCommitment\");\n}\n\nfunction validateNote(note: Note): void {\n uint(note.amount, 128, \"amount\");\n if (note.amount === 0n) throw new Error(\"amount must be positive\");\n field(note.nonce, \"nonce\");\n uint(BigInt(note.ownerAddress), 160, \"ownerAddress\");\n if (BigInt(note.ownerAddress) === 0n) throw new Error(\"owner address must be positive\");\n uint(note.tokenAddress, 160, \"tokenAddress\");\n}\n\nexport async function noteCommitment(context: NoteEncryptionContext, note: Note): Promise<void> {\n validateContext(context, note.tokenAddress);\n assertNoteContext(note, context);\n validateNote(note);\n const commitment = await computeNoteCommitment(\n context.chainId,\n BigInt(context.protocolAddress),\n await computeNoteIdentity(BigInt(note.ownerAddress), note.nonce),\n note.tokenAddress,\n note.amount\n );\n if (BigInt(commitment) !== BigInt(context.outputCommitment))\n throw new Error(\"output commitment mismatch\");\n}\n\nexport async function creditCommitment(\n context: NoteEncryptionContext,\n note: CreditState\n): Promise<void> {\n validateContext(context, note.tokenAddress);\n assertNoteContext(note, context);\n const commitment = await computeCreditCommitment(note);\n if (BigInt(commitment) !== BigInt(context.outputCommitment))\n throw new Error(\"credit commitment mismatch\");\n}\n","import type { CreditDeliveryState, CreditState, Note } from \"../types\";\nimport { deliveryCodec, deliveryHeader } from \"./delivery-codec\";\nimport { envelopeBytes, open, publicKey, seal, viewingPublicKey } from \"./envelope\";\nimport { normalizeCreditDeliveryState } from \"./note-payload\";\nimport {\n CreditStateDecryptionContext,\n CreditStateEncryptionContext,\n NoteBytes,\n NoteDecryptionContext,\n NoteEncryptionContext,\n} from \"./types\";\nimport { creditCommitment, noteCommitment } from \"./validation\";\n\nexport { normalizeCreditDeliveryState } from \"./note-payload\";\n\nfunction copyPayload(value: Uint8Array, codec: { minimum: number; maximum: number }): Uint8Array {\n if (!(value instanceof Uint8Array)) throw new Error(\"codec encode must return Uint8Array\");\n if (value.length + 78 < codec.minimum || value.length + 78 > codec.maximum)\n throw new Error(\"invalid codec payload length\");\n return Uint8Array.from(value);\n}\n\n/** SDK v1 funds envelope with a fixed financial prefix and opaque application bytes. */\nexport async function encryptPrivateTransferNote(\n viewingKey: NoteBytes,\n note: Note,\n context: NoteEncryptionContext\n): Promise<Uint8Array> {\n const scopedNote = structuredClone(note),\n scopedContext = { ...context };\n const codec = deliveryCodec(deliveryHeader(\"funds\"));\n if (codec.kind !== \"funds\") throw new Error(\"unexpected envelope kind\");\n await noteCommitment(scopedContext, scopedNote);\n const plaintext = copyPayload(codec.encode(structuredClone(scopedNote)), codec);\n return seal(\n viewingKey,\n plaintext,\n scopedContext,\n scopedNote.tokenAddress,\n deliveryHeader(\"funds\"),\n 0\n );\n}\n\n/** Authenticates the context and output commitment before returning the ordinary note. */\nasync function readNote(\n key: NoteBytes,\n envelope: NoteBytes,\n context: NoteDecryptionContext,\n payloadKey = false\n): Promise<Note & { payload: Uint8Array }> {\n const authenticatedContext = { ...context };\n const data = envelopeBytes(envelope, false);\n const headerByte = data[0]!;\n const plain = await open(key, data, authenticatedContext, headerByte, 0, payloadKey);\n try {\n const codec = deliveryCodec(headerByte);\n if (codec.kind !== \"funds\") throw new Error(\"unexpected envelope kind\");\n const note = structuredClone(\n codec.decode(plain, Object.freeze({ ...authenticatedContext }))\n );\n\n if (BigInt(note.ownerAddress) !== BigInt(authenticatedContext.ownerAddress))\n throw new Error(\"recipient owner address mismatch\");\n if (note.tokenAddress !== authenticatedContext.tokenAddress)\n throw new Error(\"note token context mismatch\");\n await noteCommitment(authenticatedContext, note);\n return note;\n } finally {\n plain.fill(0);\n }\n}\n\nfunction creditRole(role: string): number {\n if (role !== \"owner\" && role !== \"spender\")\n throw new Error(\"Credit role must be owner or spender\");\n return role === \"owner\" ? 1 : 2;\n}\n\nfunction matchCreditRecipient(\n state: CreditDeliveryState,\n role: \"owner\" | \"spender\",\n recipient: Uint8Array\n): void {\n const keys = role === \"owner\" ? state.ownerReceivingKeys : state.spenderReceivingKeys;\n if (!keys.viewingPublicKey.every((value, index) => value === recipient[index]))\n throw new Error(\"recipient receiving key mismatch\");\n}\n\n/** SDK v1 Credit envelope with a fixed recovery prefix and opaque application bytes. */\nexport async function encryptCreditState(\n viewingKey: NoteBytes,\n state: CreditDeliveryState,\n context: CreditStateEncryptionContext\n): Promise<Uint8Array> {\n const scopedState = normalizeCreditDeliveryState(state),\n scopedNote = scopedState.note;\n const scopedContext = { ...context };\n const codec = deliveryCodec(deliveryHeader(\"credit\"));\n if (codec.kind !== \"credit\") throw new Error(\"unexpected envelope kind\");\n creditRole(scopedContext.role);\n matchCreditRecipient(scopedState, scopedContext.role, publicKey(viewingKey));\n await creditCommitment(scopedContext, scopedNote);\n const plaintext = copyPayload(codec.encode(structuredClone(scopedState)), codec);\n return seal(\n viewingKey,\n plaintext,\n scopedContext,\n scopedNote.tokenAddress,\n deliveryHeader(\"credit\"),\n creditRole(scopedContext.role)\n );\n}\n\n/** Authenticates the complete Credit header, context and output commitment. */\nasync function readCredit(\n key: NoteBytes,\n envelope: NoteBytes,\n context: CreditStateDecryptionContext,\n payloadKey = false\n): Promise<CreditDeliveryState & { note: CreditState & { payload: Uint8Array } }> {\n const authenticatedContext = { ...context };\n const data = envelopeBytes(envelope, true);\n const plain = await open(\n key,\n data,\n authenticatedContext,\n data[0]!,\n creditRole(authenticatedContext.role),\n payloadKey\n );\n try {\n const codec = deliveryCodec(data[0]!);\n if (codec.kind !== \"credit\") throw new Error(\"unexpected envelope kind\");\n const state = normalizeCreditDeliveryState(\n structuredClone(codec.decode(plain, Object.freeze({ ...authenticatedContext })))\n );\n const note = state.note;\n if (\n BigInt(\n authenticatedContext.role === \"owner\"\n ? note.ownerWalletIdentity\n : note.spenderWalletIdentity\n ) !== BigInt(authenticatedContext.ownerAddress)\n )\n throw new Error(\"recipient owner address mismatch\");\n\n if (!payloadKey)\n matchCreditRecipient(state, authenticatedContext.role, viewingPublicKey(key));\n if (note.tokenAddress !== authenticatedContext.tokenAddress)\n throw new Error(\"Credit token context mismatch\");\n await creditCommitment(authenticatedContext, note);\n return {\n ...state,\n note: { ...state.note, payload: Uint8Array.from(state.note.payload ?? []) },\n };\n } finally {\n plain.fill(0);\n }\n}\n\n/** Authenticated recipient decryption. Application payload bytes are never decoded here. */\nexport function decryptPrivateTransferNote(\n key: NoteBytes,\n envelope: NoteBytes,\n context: NoteDecryptionContext\n): Promise<Note & { payload: Uint8Array }> {\n return readNote(key, envelope, context);\n}\n\n/** Authenticated Credit decryption, including role and historical receiving keys. */\nexport function decryptCreditState(\n key: NoteBytes,\n envelope: NoteBytes,\n context: CreditStateDecryptionContext\n): Promise<CreditDeliveryState & { note: CreditState & { payload: Uint8Array } }> {\n return readCredit(key, envelope, context);\n}\n\n// Internal disclosure primitives. Public callers use Disclosure or ViewingCapability.\nexport function decryptNotePayload(\n key: NoteBytes,\n envelope: NoteBytes,\n context: NoteDecryptionContext\n): Promise<Note & { payload: Uint8Array }> {\n return readNote(key, envelope, context, true);\n}\n\nexport function decryptCreditPayload(\n key: NoteBytes,\n envelope: NoteBytes,\n context: CreditStateDecryptionContext\n): Promise<CreditDeliveryState & { note: CreditState & { payload: Uint8Array } }> {\n return readCredit(key, envelope, context, true);\n}\n\nexport {\n CreditStateDecryptionContext,\n CreditStateEncryptionContext,\n NoteBytes,\n NoteDecryptionContext,\n NoteEncryptionContext,\n} from \"./types\";\n\nexport { exportPayloadKey, viewingPublicKey } from \"./envelope\";\n","import { bytesToHex } from \"@noble/hashes/utils\";\nimport { FIELD_MODULUS } from \"../crypto/random\";\nimport {\n decryptCreditState,\n decryptCreditPayload,\n decryptNotePayload,\n decryptPrivateTransferNote,\n exportPayloadKey,\n type CreditStateDecryptionContext,\n type NoteBytes,\n type NoteDecryptionContext,\n} from \"../delivery/encryption\";\nimport { computeNoteCommitment, computeNoteIdentity } from \"../notes/commitment\";\nimport {\n computeCreditCommitment,\n computeCreditSharedKeyHash,\n normalizeCreditPolicy,\n normalizeCreditUsage,\n} from \"../credit/state\";\nimport type { CreditState, CreditPolicy, CreditUsage, Note } from \"../types\";\n\n/** A Credit commitment opening excludes encrypted memos and the shared recovery/nullifier secret. */\nexport interface CreditOpening\n extends\n Omit<CreditState, \"creditSharedKey\" | \"memo\" | keyof CreditPolicy | keyof CreditUsage>,\n CreditPolicy,\n CreditUsage {\n creditSharedKeyHash: `0x${string}`;\n}\n\n/** Independently authenticated output data. Core verification alone does not establish inclusion. */\nexport interface DisclosureOutput {\n chainId: bigint;\n protocolAddress: bigint;\n tokenAddress: bigint;\n outputCommitment: `0x${string}`;\n role: \"funds\" | \"owner\" | \"spender\";\n ciphertext?: NoteBytes | undefined;\n}\n\n/** Sensitive transport material: obtain it only through the explicit export() operation. */\nexport interface DisclosureExport {\n version: 1;\n kind: \"note\" | \"credit\";\n method: \"opening\" | \"payload-key\";\n context: {\n chainId: string;\n protocolAddress: string;\n tokenAddress: string;\n outputCommitment: `0x${string}`;\n };\n data: Record<string, string>;\n}\n\nexport type DisclosureResult =\n | { kind: \"note\"; note: Readonly<Note> }\n | { kind: \"credit\"; note: Readonly<CreditOpening & { payload?: Uint8Array }> };\n\nconst NOTE_FIELDS = [\"ownerAddress\", \"amount\", \"nonce\"] as const;\nconst CREDIT_FIELDS = [\n \"spenderWalletIdentity\",\n \"ownerWalletIdentity\",\n \"revocationShard\",\n \"revocationSlot\",\n \"nonce\",\n \"expiry\",\n \"creditSharedKeyHash\",\n \"singleLimit\",\n \"dailyLimit\",\n \"monthlyLimit\",\n \"availableCredit\",\n \"unlimited\",\n \"lastDay\",\n \"dailySpent\",\n \"lastMonth\",\n \"monthlySpent\",\n \"totalSpent\",\n] as const;\n\nfunction record(value: unknown, fields: readonly string[]): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n throw new Error(\"invalid disclosure object\");\n const keys = Object.keys(value);\n if (keys.length !== fields.length || keys.some((key) => !fields.includes(key)))\n throw new Error(\"unexpected disclosure fields\");\n return value as Record<string, unknown>;\n}\n\nfunction number(value: unknown, bits: number, label: string): bigint {\n if (typeof value !== \"bigint\" || value < 0n || value >= 1n << BigInt(bits))\n throw new Error(`invalid disclosure ${label}`);\n return value;\n}\n\nfunction decimal(value: unknown, bits: number, label: string): bigint {\n if (typeof value !== \"string\" || !/^(0|[1-9][0-9]*)$/.test(value) || value.length > 78)\n throw new Error(`invalid disclosure ${label}`);\n return number(BigInt(value), bits, label);\n}\n\nfunction hash(value: unknown, label: string, field = true): `0x${string}` {\n if (typeof value !== \"string\" || !/^0x[0-9a-fA-F]{64}$/.test(value))\n throw new Error(`invalid disclosure ${label}`);\n if (field && BigInt(value) >= FIELD_MODULUS) throw new Error(`invalid disclosure ${label}`);\n return value.toLowerCase() as `0x${string}`;\n}\n\nfunction owner(value: unknown, label: string): `0x${string}` {\n if (typeof value !== \"string\" || !/^0x[0-9a-fA-F]{40}$/.test(value) || BigInt(value) === 0n)\n throw new Error(`invalid disclosure ${label}`);\n return value.toLowerCase() as `0x${string}`;\n}\n\nfunction nonce(value: bigint): bigint {\n if (value < 0n || value >= FIELD_MODULUS) throw new Error(\"invalid disclosure nonce\");\n return value;\n}\n\nfunction context(value: Pick<DisclosureOutput, \"chainId\" | \"protocolAddress\" | \"tokenAddress\">) {\n const result = {\n chainId: number(value.chainId, 64, \"chainId\"),\n protocolAddress: number(value.protocolAddress, 160, \"protocolAddress\"),\n tokenAddress: number(value.tokenAddress, 160, \"tokenAddress\"),\n };\n if (result.protocolAddress === 0n || result.tokenAddress === 0n)\n throw new Error(\"disclosure addresses must be nonzero\");\n return result;\n}\n\nfunction encode(values: Record<string, bigint | string>): Record<string, string> {\n return Object.fromEntries(\n Object.entries(values).map(([key, value]) => [key, value.toString()])\n );\n}\n\nasync function creditOpening(note: CreditState): Promise<CreditOpening> {\n const copied = { ...note };\n return {\n ...context(copied),\n ...normalizeCreditPolicy(copied),\n ...normalizeCreditUsage(copied),\n availableCredit: number(copied.availableCredit, 128, \"availableCredit\"),\n unlimited: copied.unlimited,\n spenderWalletIdentity: owner(copied.spenderWalletIdentity, \"spender identity\"),\n ownerWalletIdentity: owner(copied.ownerWalletIdentity, \"owner identity\"),\n revocationShard: number(copied.revocationShard, 64, \"revocation shard\"),\n revocationSlot: number(copied.revocationSlot, 16, \"revocation slot\"),\n nonce: nonce(copied.nonce),\n expiry: number(copied.expiry, 64, \"expiry\"),\n creditSharedKeyHash: await computeCreditSharedKeyHash(copied.creditSharedKey),\n };\n}\n\nasync function commitment(note: Note | CreditOpening): Promise<`0x${string}`> {\n if (\"creditSharedKeyHash\" in note) {\n return computeCreditCommitment({ ...note, creditSharedKey: 0n }, note.creditSharedKeyHash);\n }\n return computeNoteCommitment(\n note.chainId,\n BigInt(note.protocolAddress),\n await computeNoteIdentity(BigInt(note.ownerAddress), note.nonce),\n note.tokenAddress,\n note.amount\n );\n}\n\n/** Scoped disclosure material. Default JSON/inspection is redacted; export() is deliberately sensitive. */\nexport class Disclosure {\n readonly #material: DisclosureExport;\n\n private constructor(material: DisclosureExport) {\n this.#material = {\n ...material,\n context: Object.freeze({ ...material.context }),\n data: Object.freeze({ ...material.data }),\n };\n Object.freeze(this.#material);\n Object.freeze(this);\n }\n\n static async fromNote(value: Note): Promise<Disclosure> {\n const copied = { ...value };\n const note: Note = {\n ...context(copied),\n ownerAddress: owner(copied.ownerAddress, \"owner address\"),\n amount: number(copied.amount, 128, \"amount\"),\n nonce: nonce(copied.nonce),\n };\n return new Disclosure({\n version: 1,\n kind: \"note\",\n method: \"opening\",\n context: {\n ...encode(context(note)),\n outputCommitment: await commitment(note),\n } as DisclosureExport[\"context\"],\n data: encode({\n ownerAddress: note.ownerAddress,\n amount: note.amount,\n nonce: note.nonce,\n }),\n });\n }\n\n static async fromCredit(value: CreditState): Promise<Disclosure> {\n const note = await creditOpening(value);\n const data = Object.fromEntries(\n CREDIT_FIELDS.map((key) => [\n key,\n key === \"unlimited\" ? (note.unlimited ? \"1\" : \"0\") : note[key].toString(),\n ])\n );\n return new Disclosure({\n version: 1,\n kind: \"credit\",\n method: \"opening\",\n context: {\n ...encode(context(note)),\n outputCommitment: await commitment(note),\n } as DisclosureExport[\"context\"],\n data,\n });\n }\n\n /** Low-level factory; normally use wallet.getViewer().discloseNote(). */\n static async fromEncryptedNote(\n key: NoteBytes,\n envelope: NoteBytes,\n value: NoteDecryptionContext\n ): Promise<Disclosure> {\n const scoped = { ...value };\n const copied = typeof envelope === \"string\" ? envelope : Uint8Array.from(envelope);\n const localKey = typeof key === \"string\" ? key : Uint8Array.from(key);\n try {\n await decryptPrivateTransferNote(localKey, copied, scoped);\n return await Disclosure.fromEnvelope(localKey, copied, scoped, \"funds\");\n } finally {\n if (localKey instanceof Uint8Array) localKey.fill(0);\n }\n }\n\n /** Exposes the full selected Credit envelope, including its shared key and receiving snapshots. */\n static async fromEncryptedCredit(\n key: NoteBytes,\n envelope: NoteBytes,\n value: CreditStateDecryptionContext\n ): Promise<Disclosure> {\n const scoped = { ...value };\n const copied = typeof envelope === \"string\" ? envelope : Uint8Array.from(envelope);\n const localKey = typeof key === \"string\" ? key : Uint8Array.from(key);\n try {\n await decryptCreditState(localKey, copied, scoped);\n return await Disclosure.fromEnvelope(localKey, copied, scoped, scoped.role);\n } finally {\n if (localKey instanceof Uint8Array) localKey.fill(0);\n }\n }\n\n private static async fromEnvelope(\n key: NoteBytes,\n envelope: NoteBytes,\n scoped: NoteDecryptionContext,\n role: DisclosureOutput[\"role\"]\n ): Promise<Disclosure> {\n const payloadKey = await exportPayloadKey(key, envelope, role !== \"funds\");\n try {\n return new Disclosure({\n version: 1,\n kind: role === \"funds\" ? \"note\" : \"credit\",\n method: \"payload-key\",\n context: {\n ...encode(context(scoped)),\n outputCommitment: hash(scoped.outputCommitment, \"commitment\"),\n } as DisclosureExport[\"context\"],\n data: {\n payloadKey: `0x${bytesToHex(payloadKey)}`,\n ownerAddress: owner(scoped.ownerAddress, \"owner address\"),\n role,\n },\n });\n } finally {\n payloadKey.fill(0);\n }\n }\n\n /** Parse untrusted JSON material; verification against an independent output is still required. */\n static async fromExport(value: unknown): Promise<Disclosure> {\n const root = record(value, [\"version\", \"kind\", \"method\", \"context\", \"data\"]);\n if (\n root.version !== 1 ||\n (root.kind !== \"note\" && root.kind !== \"credit\") ||\n (root.method !== \"opening\" && root.method !== \"payload-key\")\n )\n throw new Error(\"unsupported disclosure format\");\n const rawContext = record(root.context, [\n \"chainId\",\n \"protocolAddress\",\n \"tokenAddress\",\n \"outputCommitment\",\n ]);\n const scoped = context({\n chainId: decimal(rawContext.chainId, 64, \"chainId\"),\n protocolAddress: decimal(rawContext.protocolAddress, 160, \"protocolAddress\"),\n tokenAddress: decimal(rawContext.tokenAddress, 160, \"tokenAddress\"),\n });\n const outputCommitment = hash(rawContext.outputCommitment, \"commitment\");\n const fields =\n root.method === \"payload-key\"\n ? [\"payloadKey\", \"ownerAddress\", \"role\"]\n : root.kind === \"note\"\n ? NOTE_FIELDS\n : CREDIT_FIELDS;\n const raw = record(root.data, fields);\n const data: Record<string, string> = {};\n for (const key of fields) {\n if (key === \"role\") {\n if (\n root.kind === \"note\"\n ? raw[key] !== \"funds\"\n : raw[key] !== \"owner\" && raw[key] !== \"spender\"\n )\n throw new Error(\"invalid disclosure role\");\n data[key] = raw[key] as string;\n } else if (\n key === \"payloadKey\" ||\n key.endsWith(\"Identity\") ||\n key === \"ownerAddress\" ||\n key === \"creditSharedKeyHash\"\n ) {\n data[key] =\n key.endsWith(\"Identity\") || key === \"ownerAddress\"\n ? owner(raw[key], key)\n : hash(raw[key], key, key !== \"payloadKey\");\n } else if (key === \"unlimited\") {\n if (raw[key] !== \"0\" && raw[key] !== \"1\")\n throw Error(\"invalid disclosure unlimited\");\n data[key] = raw[key] as string;\n } else {\n const bits =\n key === \"availableCredit\"\n ? 128\n : key.endsWith(\"Payout\")\n ? 160\n : key === \"expiry\"\n ? 64\n : key === \"amount\"\n ? root.kind === \"note\"\n ? 128\n : 126\n : 254;\n const parsed = decimal(raw[key], bits, key);\n if (key === \"nonce\") nonce(parsed);\n data[key] = parsed.toString();\n }\n }\n const material: DisclosureExport = {\n version: 1,\n kind: root.kind,\n method: root.method,\n context: { ...encode(scoped), outputCommitment } as DisclosureExport[\"context\"],\n data,\n };\n const result = new Disclosure(material);\n if (material.method === \"opening\")\n await result.verify({\n ...scoped,\n outputCommitment,\n role: material.kind === \"note\" ? \"funds\" : \"owner\",\n });\n return result;\n }\n\n getScope() {\n const { version, kind, method } = this.#material;\n return {\n version,\n kind,\n method,\n permitsOwnerSweep: kind === \"note\",\n revealsNoteConsumption: kind === \"note\",\n revealsCreditSharedKey: kind === \"credit\" && method === \"payload-key\",\n revealsReceivingKeys: kind === \"credit\" && method === \"payload-key\",\n revealsMemo: method === \"payload-key\",\n revealsPayload: method === \"payload-key\",\n };\n }\n\n /** Explicitly export sensitive, JSON-compatible material for a chosen recipient. */\n export(): DisclosureExport {\n return {\n ...this.#material,\n context: { ...this.#material.context },\n data: { ...this.#material.data },\n };\n }\n\n async verify(value: DisclosureOutput): Promise<DisclosureResult> {\n const output = {\n ...value,\n ciphertext:\n value.ciphertext instanceof Uint8Array\n ? Uint8Array.from(value.ciphertext)\n : value.ciphertext,\n };\n const scoped = context(output);\n const material = this.#material;\n for (const field of [\"chainId\", \"protocolAddress\", \"tokenAddress\"] as const) {\n if (scoped[field].toString() !== material.context[field])\n throw new Error(\"disclosure deployment context mismatch\");\n }\n if (hash(output.outputCommitment, \"commitment\") !== material.context.outputCommitment)\n throw new Error(\"disclosure output commitment mismatch\");\n if (\n material.kind === \"note\"\n ? output.role !== \"funds\"\n : output.role !== \"owner\" && output.role !== \"spender\"\n )\n throw new Error(\"disclosure output role mismatch\");\n const data = material.data;\n if (material.method === \"payload-key\") {\n if (output.role !== data.role || output.ciphertext === undefined)\n throw new Error(\"disclosure requires the selected role envelope\");\n const decryption = {\n ...scoped,\n outputCommitment: output.outputCommitment,\n ownerAddress: data.ownerAddress as `0x${string}`,\n };\n if (material.kind === \"note\")\n return {\n kind: \"note\",\n note: Object.freeze(\n await decryptNotePayload(\n data.payloadKey as `0x${string}`,\n output.ciphertext,\n decryption\n )\n ),\n };\n const state = await decryptCreditPayload(\n data.payloadKey as `0x${string}`,\n output.ciphertext,\n { ...decryption, role: output.role as \"owner\" | \"spender\" }\n );\n return {\n kind: \"credit\",\n note: Object.freeze({\n ...(await creditOpening(state.note)),\n ...(state.note.payload === undefined\n ? {}\n : { payload: structuredClone(state.note.payload) }),\n }),\n };\n }\n if (material.kind === \"note\") {\n const note: Note = {\n ...scoped,\n ownerAddress: data.ownerAddress as `0x${string}`,\n amount: BigInt(data.amount!),\n nonce: BigInt(data.nonce!),\n };\n if ((await commitment(note)) !== material.context.outputCommitment)\n throw new Error(\"disclosure opening commitment mismatch\");\n return { kind: \"note\", note: Object.freeze(note) };\n }\n const note: CreditOpening = {\n ...scoped,\n spenderWalletIdentity: data.spenderWalletIdentity as `0x${string}`,\n ownerWalletIdentity: data.ownerWalletIdentity as `0x${string}`,\n revocationShard: BigInt(data.revocationShard!),\n revocationSlot: BigInt(data.revocationSlot!),\n nonce: BigInt(data.nonce!),\n expiry: BigInt(data.expiry!),\n ...normalizeCreditPolicy(\n Object.fromEntries(\n [\"singleLimit\", \"dailyLimit\", \"monthlyLimit\"].map((k) => [k, BigInt(data[k]!)])\n )\n ),\n ...normalizeCreditUsage(\n Object.fromEntries(\n [\"lastDay\", \"dailySpent\", \"lastMonth\", \"monthlySpent\", \"totalSpent\"].map(\n (k) => [k, BigInt(data[k]!)]\n )\n )\n ),\n availableCredit: BigInt(data.availableCredit!),\n unlimited: data.unlimited === \"1\",\n creditSharedKeyHash: data.creditSharedKeyHash as `0x${string}`,\n };\n if ((await commitment(note)) !== material.context.outputCommitment)\n throw new Error(\"disclosure opening commitment mismatch\");\n return { kind: \"credit\", note: Object.freeze(note) };\n }\n\n toJSON() {\n return { capability: \"disclosure\", ...this.getScope() };\n }\n\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n return this.toJSON();\n }\n}\n","import { D_NULL } from \"../crypto/domains\";\nimport { poseidonHash } from \"../crypto/poseidon\";\nimport { FIELD_MODULUS } from \"../crypto/random\";\n\n/** Bind the complete note leaf to its committed private nonce. */\nexport async function computeNoteNullifier(\n chainId: bigint,\n protocolAddress: bigint,\n nonce: bigint,\n commitment: `0x${string}`\n): Promise<`0x${string}`> {\n if (chainId < 0n || chainId >= 1n << 64n) throw new RangeError(\"invalid chainId\");\n if (protocolAddress <= 0n || protocolAddress >= 1n << 160n)\n throw new RangeError(\"invalid protocol address\");\n if (nonce < 0n || nonce >= FIELD_MODULUS) throw new RangeError(\"invalid note nonce\");\n if (!/^0x[0-9a-fA-F]{64}$/.test(commitment))\n throw new Error(\"invalid note commitment encoding\");\n return poseidonHash([D_NULL, chainId, protocolAddress, nonce, BigInt(commitment)]);\n}\n","import { secp256k1 } from \"@noble/curves/secp256k1\";\nimport { bytesToHex, hexToBytes } from \"@noble/hashes/utils\";\nimport { ReceivingAddress } from \"../address/receiving-address\";\nimport {\n decryptCreditState,\n decryptPrivateTransferNote,\n viewingPublicKey,\n type CreditStateDecryptionContext,\n type NoteBytes,\n type NoteDecryptionContext,\n} from \"../delivery/encryption\";\nimport { Disclosure } from \"../disclosure/disclosure\";\nimport { deriveClueKey } from \"../fmd/fmd\";\nimport { computeNoteNullifier } from \"../notes/nullifier\";\nimport {\n buildWalletAuthorizationWitness,\n computeOwnerAddress,\n computeWalletAuthorizationDigest,\n type WalletAuthorizationRequest,\n type WalletAuthorizationWitness,\n type WalletBytes,\n} from \"./wallet\";\n\ntype Identity = `0x${string}`;\n\nconst copyWitness = (witness: WalletAuthorizationWitness): WalletAuthorizationWitness => ({\n public_key_x: [...witness.public_key_x],\n public_key_y: [...witness.public_key_y],\n signature: [...witness.signature],\n});\n\nconst inspect = Symbol.for(\"nodejs.util.inspect.custom\");\n\nfunction copyBytes(value: WalletBytes): Uint8Array {\n if (typeof value === \"string\" && !/^0x(?:[0-9a-fA-F]{2})+$/.test(value)) {\n throw new Error(\"invalid hexadecimal bytes\");\n }\n return typeof value === \"string\" ? hexToBytes(value.slice(2)) : Uint8Array.from(value);\n}\n\nfunction identity(value: Identity): Identity {\n return ReceivingAddress.fromIdentity(value).ownerAddress;\n}\n\n/** Local viewing permission, permitting note recovery and owner-only sweep, without arbitrary spending. */\nexport class ViewingCapability {\n readonly #key: Uint8Array;\n readonly ownerAddress: Identity;\n\n constructor(ownerAddress: Identity, privateKey: WalletBytes, expectedPublicKey?: Uint8Array) {\n this.ownerAddress = identity(ownerAddress);\n this.#key = copyBytes(privateKey);\n const publicKey = viewingPublicKey(this.#key);\n if (expectedPublicKey && bytesToHex(publicKey) !== bytesToHex(expectedPublicKey)) {\n throw new Error(\"viewing key pair mismatch\");\n }\n Object.freeze(this);\n }\n\n decryptNote(envelope: NoteBytes, context: Omit<NoteDecryptionContext, \"ownerAddress\">) {\n return decryptPrivateTransferNote(this.#key, envelope, {\n ...context,\n ownerAddress: this.ownerAddress,\n });\n }\n\n decryptCredit(\n envelope: NoteBytes,\n context: Omit<CreditStateDecryptionContext, \"ownerAddress\">\n ) {\n return decryptCreditState(this.#key, envelope, {\n ...context,\n ownerAddress: this.ownerAddress,\n });\n }\n\n getPublicKey(): Uint8Array {\n return viewingPublicKey(this.#key);\n }\n\n /** Disclose this authenticated output's payload key, without exporting the wallet viewing key. */\n discloseNote(envelope: NoteBytes, context: Omit<NoteDecryptionContext, \"ownerAddress\">) {\n return Disclosure.fromEncryptedNote(this.#key, envelope, {\n ...context,\n ownerAddress: this.ownerAddress,\n });\n }\n\n /** Exposes the entire Credit envelope; prefer Disclosure.fromCredit() for hash-only opening. */\n discloseCredit(\n envelope: NoteBytes,\n context: Omit<CreditStateDecryptionContext, \"ownerAddress\">\n ) {\n return Disclosure.fromEncryptedCredit(this.#key, envelope, {\n ...context,\n ownerAddress: this.ownerAddress,\n });\n }\n\n /** Explicit sensitive export for delegating viewing. It grants note recovery and owner-only sweep permission. */\n exportKey(): Uint8Array {\n return Uint8Array.from(this.#key);\n }\n\n toJSON() {\n return { capability: \"viewing\", ownerAddress: this.ownerAddress };\n }\n\n [inspect]() {\n return this.toJSON();\n }\n}\n\n/** Delegated candidate detection key, without viewing or spending. */\nexport class Detector {\n readonly #key: Uint8Array;\n readonly #clueKey: Uint8Array;\n\n constructor(key: Uint8Array) {\n this.#key = Uint8Array.from(key);\n this.#clueKey = deriveClueKey(this.#key);\n Object.freeze(this);\n }\n\n getClueKey(): Uint8Array {\n return Uint8Array.from(this.#clueKey);\n }\n\n /** Full detection delegation; the receiver chooses the checked prefix length. */\n exportKey(): Uint8Array {\n return Uint8Array.from(this.#key);\n }\n\n toJSON() {\n return { capability: \"detection\" };\n }\n\n [inspect]() {\n return this.toJSON();\n }\n}\n\n/** Note-derived spent-state calculation; the note opening supplies its nonce. */\nexport class NullifierCapability {\n readonly ownerAddress: Identity;\n\n private constructor(ownerAddress: Identity) {\n this.ownerAddress = identity(ownerAddress);\n Object.freeze(this);\n }\n\n static fromIdentity(ownerAddress: Identity): NullifierCapability {\n return new NullifierCapability(ownerAddress);\n }\n\n compute(\n chainId: bigint,\n protocolAddress: bigint,\n commitment: Identity,\n nonce: bigint\n ): Promise<Identity> {\n return computeNoteNullifier(chainId, protocolAddress, nonce, commitment);\n }\n\n toJSON() {\n return { capability: \"nullifier\", ownerAddress: this.ownerAddress };\n }\n\n [inspect]() {\n return this.toJSON();\n }\n}\n\n/** Frozen local authorization. Witness access is an explicit trusted proving boundary. */\nexport class AuthorizedStatement {\n readonly #witness: WalletAuthorizationWitness;\n readonly digest: Identity;\n readonly ownerAddress: Identity;\n\n constructor(ownerAddress: Identity, digest: Identity, witness: WalletAuthorizationWitness) {\n this.ownerAddress = ownerAddress;\n this.digest = digest;\n this.#witness = copyWitness(witness);\n Object.freeze(this);\n }\n\n withWitness<T>(assemble: (witness: WalletAuthorizationWitness) => T): T {\n return assemble(copyWitness(this.#witness));\n }\n\n toJSON() {\n return { ownerAddress: this.ownerAddress, digest: this.digest };\n }\n\n [inspect]() {\n return this.toJSON();\n }\n}\n\nexport interface WalletAuthorizationProvider {\n readonly ownerAddress: Identity;\n authorize(request: WalletAuthorizationRequest): Promise<AuthorizedStatement>;\n}\n\n/** Invisi circuit authorization, independent of an EVM funding wallet or submitter. */\nexport class WalletAuthorization implements WalletAuthorizationProvider {\n readonly #privateKey: Uint8Array;\n readonly #publicKey: Uint8Array;\n readonly ownerAddress: Identity;\n\n private constructor(ownerAddress: Identity, privateKey: Uint8Array, publicKey: Uint8Array) {\n this.ownerAddress = ownerAddress;\n this.#privateKey = privateKey;\n this.#publicKey = publicKey;\n Object.freeze(this);\n }\n\n static async fromMaterial(\n ownerAddress: Identity,\n privateKey: WalletBytes\n ): Promise<WalletAuthorization> {\n const privateBytes = copyBytes(privateKey);\n const publicBytes = secp256k1.getPublicKey(privateBytes, false);\n if ((await computeOwnerAddress(publicBytes)) !== identity(ownerAddress)) {\n throw new Error(\"owner address mismatch\");\n }\n return new WalletAuthorization(identity(ownerAddress), privateBytes, publicBytes);\n }\n\n getPublicKey(): Uint8Array {\n return Uint8Array.from(this.#publicKey);\n }\n\n async authorize(request: WalletAuthorizationRequest): Promise<AuthorizedStatement> {\n const frozen = { ...request, context: { ...request.context }, words: [...request.words] };\n const digest = computeWalletAuthorizationDigest(frozen);\n const witness = await buildWalletAuthorizationWitness(\n {\n ownerAddress: this.ownerAddress,\n spendingPrivateKey: this.#privateKey,\n spendingPublicKey: this.#publicKey,\n },\n frozen\n );\n return new AuthorizedStatement(this.ownerAddress, digest, witness);\n }\n\n toJSON() {\n return { capability: \"wallet-authorization\", ownerAddress: this.ownerAddress };\n }\n\n [inspect]() {\n return this.toJSON();\n }\n}\n","import { secp256k1 } from \"@noble/curves/secp256k1\";\nimport { hkdf } from \"@noble/hashes/hkdf\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { keccak_256 } from \"@noble/hashes/sha3\";\nimport { bytesToHex, concatBytes, hexToBytes, utf8ToBytes } from \"@noble/hashes/utils\";\nimport { FIELD_MODULUS } from \"../crypto/random\";\nimport { deriveClueKey } from \"../fmd/fmd\";\nimport type { ProtocolContext } from \"../types\";\n\nexport type WalletBytes = Uint8Array | `0x${string}`;\nexport interface InvisiWallet {\n spendingPrivateKey: Uint8Array;\n spendingPublicKey: Uint8Array;\n viewingPrivateKey: Uint8Array;\n viewingPublicKey: Uint8Array;\n detectionSeed: Uint8Array;\n detectionKey: Uint8Array;\n clueKey: Uint8Array;\n ownerAddress: `0x${string}`;\n}\nconst OPERATIONS = {\n transact: \"Transact\",\n \"create-credit\": \"CreateCredit\",\n \"credit-draw\": \"CreditDraw\",\n \"update-credit\": \"UpdateCredit\",\n} as const;\nexport type WalletOperation = keyof typeof OPERATIONS;\nexport interface WalletAuthorizationRequest {\n context: ProtocolContext;\n operation: WalletOperation;\n capacity: number;\n /** Complete, canonically padded operation words before the two digest limbs. */\n words: readonly bigint[];\n}\nexport const WALLET_AUTHORIZATION_TYPES = {\n WalletAuthorization: [\n { name: \"operation\", type: \"bytes32\" },\n { name: \"statementHash\", type: \"bytes32\" },\n ],\n} as const;\nconst FMD_SCALAR_MODULUS =\n 2111115437357092606062206234695386632838870926408408195193685246394721360383n;\nconst hex = (value: Uint8Array): `0x${string}` => `0x${bytesToHex(value)}`;\nfunction bytes(value: string | Uint8Array, length?: number): Uint8Array {\n if (typeof value === \"string\" && !/^0x(?:[0-9a-fA-F]{2})*$/.test(value))\n throw new Error(\"invalid hexadecimal bytes\");\n if (typeof value !== \"string\" && !(value instanceof Uint8Array))\n throw new TypeError(\"expected bytes\");\n const result = typeof value === \"string\" ? hexToBytes(value.slice(2)) : Uint8Array.from(value);\n if (length !== undefined && result.length !== length)\n throw new Error(`expected ${length} bytes`);\n return result;\n}\nfunction integer(value: Uint8Array): bigint {\n return BigInt(\"0x\" + bytesToHex(value));\n}\nfunction word(value: bigint): Uint8Array {\n if (value < 0n || value >= 1n << 256n) throw new RangeError(\"value exceeds uint256\");\n return hexToBytes(value.toString(16).padStart(64, \"0\"));\n}\nfunction nonzeroField(value: bigint, name: string): void {\n if (typeof value !== \"bigint\" || value <= 0n || value >= FIELD_MODULUS)\n throw new RangeError(`invalid ${name}`);\n}\nfunction deriveScalar(\n key: Uint8Array,\n salt: string,\n littleEndian = false,\n modulus = FIELD_MODULUS\n): Uint8Array {\n for (let counter = 0; counter <= 0xffffffff; counter++) {\n const info = new Uint8Array([counter >>> 24, counter >>> 16, counter >>> 8, counter]);\n const result = hkdf(sha256, key, utf8ToBytes(salt), info, 32);\n if (littleEndian) result[31] = result[31]! & 7;\n const candidate = integer(littleEndian ? result.slice().reverse() : result);\n if (candidate > 0n && candidate < (littleEndian ? FMD_SCALAR_MODULUS : modulus))\n return result;\n result.fill(0);\n }\n throw new Error(\"scalar derivation exhausted\");\n}\n\n/** Standard EVM owner address from a validated secp256k1 public key. */\nexport async function computeOwnerAddress(publicKey: WalletBytes): Promise<`0x${string}`> {\n const point = secp256k1.ProjectivePoint.fromHex(bytes(publicKey));\n point.assertValidity();\n return hex(keccak_256(point.toRawBytes(false).slice(1)).slice(12));\n}\n\n/** Derive a complete Invisi wallet from an EVM account private key, independent of HD paths. */\nexport async function deriveWallet(privateKey: string | Uint8Array): Promise<InvisiWallet> {\n const input = bytes(privateKey, 32);\n let root: Uint8Array | undefined;\n let spendingPrivateKey: Uint8Array | undefined;\n let viewingPrivateKey: Uint8Array | undefined;\n let detectionSeed: Uint8Array | undefined;\n let detectionKey: Uint8Array | undefined;\n let complete = false;\n try {\n if (!secp256k1.utils.isValidPrivateKey(input)) {\n throw new RangeError(\"invalid EVM account private key\");\n }\n root = hkdf(sha256, input, utf8ToBytes(\"Invisi.WalletRoot.v1\"), new Uint8Array(), 32);\n spendingPrivateKey = Uint8Array.from(input);\n viewingPrivateKey = deriveScalar(\n root,\n \"Invisi.WalletViewingKey.v1\",\n false,\n secp256k1.CURVE.n\n );\n detectionSeed = hkdf(\n sha256,\n root,\n utf8ToBytes(\"Invisi.WalletDetectionSeed.v1\"),\n new Uint8Array(),\n 32\n );\n const spendingPublicKey = secp256k1.getPublicKey(spendingPrivateKey, false);\n const ownerAddress = await computeOwnerAddress(spendingPublicKey);\n nonzeroField(BigInt(ownerAddress), \"owner address\");\n detectionKey = deriveScalar(detectionSeed, \"Invisi.WalletDetectionKey.v1\", true);\n const wallet = {\n spendingPrivateKey,\n spendingPublicKey,\n viewingPrivateKey,\n viewingPublicKey: secp256k1.getPublicKey(viewingPrivateKey, true),\n detectionSeed,\n detectionKey,\n clueKey: deriveClueKey(detectionKey),\n ownerAddress,\n };\n complete = true;\n return wallet;\n } finally {\n input.fill(0);\n root?.fill(0);\n if (!complete) {\n spendingPrivateKey?.fill(0);\n viewingPrivateKey?.fill(0);\n detectionSeed?.fill(0);\n detectionKey?.fill(0);\n }\n }\n}\n\n/** EIP712 data for private circuit authorization, independent of EVM funding signatures. */\nexport function walletAuthorizationTypedData(request: WalletAuthorizationRequest) {\n const { context, operation, capacity, words } = request;\n if (!Object.hasOwn(OPERATIONS, operation)) throw new Error(\"unsupported wallet operation\");\n const allowed =\n operation === \"transact\"\n ? [\n 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130,\n 140, 150, 160, 170, 180, 190,\n ]\n : operation === \"credit-draw\"\n ? [1, 2, 3, 4, 5, 10, 20, 30, 40, 50, 60, 70, 80]\n : [1];\n if (!allowed.includes(capacity)) throw new Error(\"invalid operation capacity\");\n if (!Array.isArray(words) || words.length < 2) throw new Error(\"public words required\");\n for (const value of words)\n if (typeof value !== \"bigint\" || value < 0n || value >= FIELD_MODULUS)\n throw new RangeError(\"noncanonical public field\");\n const { chainId, protocolAddress } = context;\n if (typeof chainId !== \"bigint\" || chainId < 0n || chainId >= 1n << 64n)\n throw new RangeError(\"invalid chain id\");\n if (\n typeof protocolAddress !== \"bigint\" ||\n protocolAddress <= 0n ||\n protocolAddress >= 1n << 160n\n )\n throw new RangeError(\"invalid protocol address\");\n if (words[0] !== chainId) throw new Error(\"statement chain mismatch\");\n if (words[1] !== protocolAddress) throw new Error(\"statement instance mismatch\");\n const statement = concatBytes(\n word(BigInt(capacity)),\n word(64n),\n word(BigInt(words.length)),\n ...words.map(word)\n );\n return {\n domain: {\n name: \"InvisibleProtocol\",\n version: \"1\",\n chainId,\n verifyingContract:\n `0x${protocolAddress.toString(16).padStart(40, \"0\")}` as `0x${string}`,\n },\n types: WALLET_AUTHORIZATION_TYPES,\n primaryType: \"WalletAuthorization\" as const,\n message: {\n operation: hex(\n keccak_256(\n utf8ToBytes(\n `Invisi.${OPERATIONS[operation]}.${operation === \"transact\" ? \"v1\" : \"v4\"}`\n )\n )\n ),\n statementHash: hex(keccak_256(statement)),\n },\n };\n}\n\nexport function computeWalletAuthorizationDigest(\n request: WalletAuthorizationRequest\n): `0x${string}` {\n const data = walletAuthorizationTypedData(request),\n hashText = (text: string) => keccak_256(utf8ToBytes(text));\n const domain = keccak_256(\n concatBytes(\n hashText(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n ),\n hashText(data.domain.name),\n hashText(data.domain.version),\n word(data.domain.chainId),\n word(BigInt(data.domain.verifyingContract))\n )\n );\n const structure = keccak_256(\n concatBytes(\n hashText(\"WalletAuthorization(bytes32 operation,bytes32 statementHash)\"),\n bytes(data.message.operation),\n bytes(data.message.statementHash)\n )\n );\n return hex(keccak_256(concatBytes(new Uint8Array([0x19, 0x01]), domain, structure)));\n}\n\n/** Raw low-s r||s; this signature stays in the private proving witness. */\nexport function signWalletAuthorization(\n privateKey: WalletBytes,\n request: WalletAuthorizationRequest\n): `0x${string}` {\n return hex(\n secp256k1\n .sign(bytes(computeWalletAuthorizationDigest(request)), bytes(privateKey, 32), {\n lowS: true,\n })\n .toCompactRawBytes()\n );\n}\n\nexport async function verifyWalletAuthorization(\n expectedIdentity: `0x${string}`,\n publicKey: WalletBytes,\n signature: WalletBytes,\n request: WalletAuthorizationRequest\n): Promise<boolean> {\n const raw = bytes(signature, 64),\n digest = bytes(computeWalletAuthorizationDigest(request));\n if ((await computeOwnerAddress(publicKey)) !== expectedIdentity) return false;\n return secp256k1.verify(raw, digest, bytes(publicKey), { lowS: true });\n}\n\nexport interface WalletAuthorizationWitness {\n public_key_x: number[];\n public_key_y: number[];\n signature: number[];\n}\n/** Local signature witness; never serialize this as an ordinary application request. */\nexport async function buildWalletAuthorizationWitness(\n wallet: Pick<InvisiWallet, \"spendingPrivateKey\" | \"spendingPublicKey\" | \"ownerAddress\">,\n request: WalletAuthorizationRequest\n): Promise<WalletAuthorizationWitness> {\n const publicKey = secp256k1.ProjectivePoint.fromHex(bytes(wallet.spendingPublicKey)).toRawBytes(\n false\n );\n const privateKey = bytes(wallet.spendingPrivateKey, 32),\n identity = wallet.ownerAddress;\n const statement = { ...request, context: { ...request.context }, words: [...request.words] };\n try {\n const derived = secp256k1.getPublicKey(privateKey, false);\n if (!derived.every((value, i) => value === publicKey[i]))\n throw new Error(\"spending key pair mismatch\");\n if (BigInt(await computeOwnerAddress(publicKey)) !== BigInt(identity))\n throw new Error(\"owner address mismatch\");\n return {\n public_key_x: Array.from(publicKey.slice(1, 33)),\n public_key_y: Array.from(publicKey.slice(33)),\n signature: Array.from(bytes(signWalletAuthorization(privateKey, statement), 64)),\n };\n } finally {\n privateKey.fill(0);\n }\n}\n","import { ReceivingAddress } from \"../address/receiving-address\";\nimport { MissingCapabilityError } from \"../errors\";\nimport { NullifierCapability } from \"./capabilities\";\n\n/** Public identity and receiving keys. */\nexport class WalletAddress {\n readonly #address: ReceivingAddress;\n\n protected constructor(address: ReceivingAddress) {\n this.#address = address;\n }\n\n get ownerAddress(): `0x${string}` {\n return this.#address.ownerAddress;\n }\n\n get viewingPublicKey(): Uint8Array {\n return this.#address.viewingPublicKey;\n }\n\n get clueKey(): Uint8Array {\n return this.#address.clueKey;\n }\n\n /** Complete 0i receiving address. Owner-only wallets must first resolve their receiving keys. */\n getAddress(): string {\n if (this.#address.kind !== \"long\") {\n throw new MissingCapabilityError(\"resolved receiving keys\");\n }\n return this.#address.toString();\n }\n\n getReceivingAddress(): ReceivingAddress {\n return this.#address;\n }\n\n /** Nullifiers derive from public identity and do not grant spending authority. */\n exportNullifier(): NullifierCapability {\n return NullifierCapability.fromIdentity(this.ownerAddress);\n }\n\n toJSON() {\n return { ownerAddress: this.ownerAddress, address: this.#address.toString() };\n }\n\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n return this.toJSON();\n }\n}\n\n/** Address-only wallet. Contains no private keys or private capability methods. */\nexport class Wallet extends WalletAddress {\n private constructor(address: ReceivingAddress) {\n super(address);\n Object.freeze(this);\n }\n\n /** Parse a complete 0i address or an EVM owner address without network access. */\n static fromAddress(address: ReceivingAddress | string): Wallet {\n if (typeof address !== \"string\" && !(address instanceof ReceivingAddress)) {\n throw new TypeError(\"expected a validated receiving address\");\n }\n return new Wallet(typeof address === \"string\" ? ReceivingAddress.parse(address) : address);\n }\n}\n","/** Optional encrypted output metadata; never part of a financial commitment. */\nexport type Memo = string | Uint8Array;\nexport const MAX_MEMO_BYTES = 256;\ndeclare const TextEncoder: { new (): { encode(value: string): Uint8Array } };\ndeclare const TextDecoder: {\n new (\n label: string,\n options: { fatal: boolean; ignoreBOM: boolean }\n ): { decode(value: Uint8Array): string };\n};\n/** Encode text strictly as UTF-8, or copy opaque bytes, with a 256-byte limit. */\nexport function encodeMemo(memo?: Memo): Uint8Array {\n if (memo === undefined) return new Uint8Array();\n let encoded: Uint8Array;\n if (typeof memo === \"string\") {\n for (let i = 0; i < memo.length; i++) {\n const unit = memo.charCodeAt(i);\n if (unit >= 0xd800 && unit <= 0xdbff) {\n const next = memo.charCodeAt(++i);\n if (!(next >= 0xdc00 && next <= 0xdfff))\n throw new Error(\"memo contains an invalid surrogate\");\n } else if (unit >= 0xdc00 && unit <= 0xdfff)\n throw new Error(\"memo contains an invalid surrogate\");\n }\n encoded = new TextEncoder().encode(memo);\n } else if (memo instanceof Uint8Array) encoded = Uint8Array.from(memo);\n else throw new TypeError(\"memo must be text or Uint8Array\");\n if (encoded.length > MAX_MEMO_BYTES) throw new RangeError(\"memo exceeds 256 bytes\");\n return encoded;\n}\n/** Explicit strict UTF-8 decoding; opaque bytes remain valid even when decoding fails. */\nexport function decodeMemoText(memo: Uint8Array): string {\n return new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true }).decode(memo);\n}\n","import { TypedDataEncoder, type TypedDataDomain, type TypedDataField } from \"ethers\";\n\n/** JSON-safe EIP-712 data, directly consumable by an external signing tool. */\nexport interface SigningRequest {\n domain: {\n name?: string;\n version?: string;\n chainId?: string;\n verifyingContract?: string;\n salt?: string;\n };\n primaryType: string;\n types: Record<string, TypedDataField[]>;\n message: Record<string, unknown>;\n}\n\n/** Normalize through ethers; do not implement a second typed-data encoder. */\nexport function createSigningRequest(data: {\n domain: TypedDataDomain;\n primaryType: string;\n types: Record<string, readonly TypedDataField[]>;\n message: Record<string, unknown>;\n}): SigningRequest {\n const types = Object.fromEntries(\n Object.entries(data.types).map(([name, fields]) => [name, [...fields]])\n );\n const payload = TypedDataEncoder.getPayload(data.domain, types, data.message);\n if (payload.primaryType !== data.primaryType) {\n throw new Error(\"signing request primary type mismatch\");\n }\n // signTypedData builds its own domain type; wallet RPC transports can add it themselves.\n delete payload.types.EIP712Domain;\n return structuredClone(payload);\n}\n","import type { CreditDataV1, FundsDataV1 } from \"../types\";\nimport { encodeMemo } from \"./memo\";\n\nfunction encodeData(data: unknown): Uint8Array {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n throw new TypeError(\"v1 payload data must be an object\");\n }\n for (const key of Object.keys(data)) {\n if (key !== \"memo\") throw new Error(`unsupported v1 payload field ${key}`);\n }\n const memo = encodeMemo((data as FundsDataV1).memo);\n return new Uint8Array([1, ...memo]);\n}\nfunction readData(value: Uint8Array): { memo?: Uint8Array } {\n if (!(value instanceof Uint8Array) || value.length < 1) {\n throw new Error(\"payload version required\");\n }\n if (value[0] !== 1) throw new Error(\"unsupported payload version\");\n const memo = Uint8Array.from(value.subarray(1));\n if (memo.length > 256) throw new Error(\"invalid memo length\");\n return memo.length === 0 ? {} : { memo };\n}\n/** Pure memo codec: payload version1 followed by memo bytes; no flags or address semantics. */\nexport const fundsV1 = Object.freeze({\n encode(data: FundsDataV1 = {}): Uint8Array {\n return encodeData(data);\n },\n decode(value: Uint8Array): { memo?: Uint8Array } {\n return readData(value);\n },\n});\n/** Credit uses the same memo-only application layout, independently of its financial fields. */\nexport const creditV1 = Object.freeze({\n encode(data: CreditDataV1 = {}): Uint8Array {\n return encodeData(data);\n },\n decode(value: Uint8Array): { memo?: Uint8Array } {\n return readData(value);\n },\n});\n","import { DeliveryAuthenticationError } from \"./errors\";\nimport { bytesToHex } from \"@noble/hashes/utils\";\nimport type { Wallet } from \"../wallet/wallet-object\";\nimport { deliveryCodec, validateDeliveryCiphertext } from \"./delivery-codec\";\nimport { noteCommitment, creditCommitment } from \"./validation\";\nimport type { NoteBytes, NoteDecryptionContext, CreditStateDecryptionContext } from \"./types\";\n\nexport type DeliveryDecryptionResult = Uint8Array | null | { status: \"authentication-failed\" };\nexport interface DeliveryDetectionCandidate extends NoteDecryptionContext {\n role: \"funds\" | \"owner\" | \"spender\";\n clue: `0x${string}`;\n ciphertext: `0x${string}`;\n}\nexport interface DeliveryDetectionBatch {\n ownerAddress: `0x${string}`;\n results: readonly (\"candidate\" | \"not-recipient\" | \"unresolved\")[];\n}\n/** App-owned decryption. Only null means nonrecipient; operational failures must reject. */\nexport interface DeliveryDecryptor {\n detect?(candidates: readonly DeliveryDetectionCandidate[]): Promise<DeliveryDetectionBatch>;\n decryptNote(\n envelope: NoteBytes,\n context: NoteDecryptionContext\n ): Promise<DeliveryDecryptionResult>;\n decryptCredit(\n envelope: NoteBytes,\n context: CreditStateDecryptionContext\n ): Promise<DeliveryDecryptionResult>;\n}\n\n/** Keeps App failures and invalid plaintext distinct from unrelated local scan candidates. */\nexport class DeliveryDecryptionError extends Error {\n constructor(cause: unknown) {\n super(cause instanceof Error ? cause.message : \"delivery decryption failed\", { cause });\n this.name = \"DeliveryDecryptionError\";\n }\n}\n\nfunction checkedPlaintext(\n plaintext: Uint8Array,\n codec: { minimum: number; maximum: number }\n): Uint8Array {\n if (!(plaintext instanceof Uint8Array)) throw new Error(\"invalid decrypted plaintext\");\n if (plaintext.length + 78 < codec.minimum || plaintext.length + 78 > codec.maximum)\n throw new Error(\"invalid plaintext length\");\n return plaintext.slice();\n}\n\n/** Bind untrusted App plaintext to the requested wallet, deployment, token and commitment. */\nexport function authenticatedDecryptor(wallet: Wallet, decryptor: DeliveryDecryptor) {\n const ownerAddress = wallet.ownerAddress;\n return {\n ownerAddress,\n async detectCandidates(candidates: readonly DeliveryDetectionCandidate[]) {\n if (!decryptor.detect) return candidates.map(() => \"candidate\" as const);\n const result = await decryptor.detect(structuredClone(candidates));\n if (\n !result ||\n BigInt(result.ownerAddress) !== BigInt(ownerAddress) ||\n !Array.isArray(result.results) ||\n result.results.length !== candidates.length ||\n result.results.some(\n (value) => ![\"candidate\", \"not-recipient\", \"unresolved\"].includes(value)\n )\n )\n throw new DeliveryDecryptionError(\n new Error(\"invalid detection batch or wrong account\")\n );\n return [...result.results];\n },\n async decryptNote(\n envelope: NoteBytes,\n context: Omit<NoteDecryptionContext, \"ownerAddress\">\n ) {\n context = { ...context };\n try {\n const bytes = validateDeliveryCiphertext(envelope, \"funds\");\n const full = { ...context, ownerAddress };\n const plaintext = await decryptor.decryptNote(bytes.slice(), { ...full });\n if (plaintext === null) return null;\n if (!(plaintext instanceof Uint8Array)) {\n if (plaintext?.status === \"authentication-failed\")\n throw new DeliveryAuthenticationError();\n throw new Error(\"invalid decryption result\");\n }\n const codec = deliveryCodec(bytes[0]!);\n if (codec.kind !== \"funds\") throw new Error(\"unexpected envelope kind\");\n const note = codec.decode(checkedPlaintext(plaintext, codec), full);\n if (\n BigInt(note.ownerAddress) !== BigInt(ownerAddress) ||\n note.tokenAddress !== context.tokenAddress\n )\n throw new Error(\"decrypted note context mismatch\");\n await noteCommitment(full, note);\n return note;\n } catch (cause) {\n if (cause instanceof DeliveryAuthenticationError) throw cause;\n throw new DeliveryDecryptionError(cause);\n }\n },\n async decryptCredit(\n envelope: NoteBytes,\n context: Omit<CreditStateDecryptionContext, \"ownerAddress\">\n ) {\n context = { ...context };\n try {\n const bytes = validateDeliveryCiphertext(envelope, \"credit\");\n const full = { ...context, ownerAddress };\n const plaintext = await decryptor.decryptCredit(bytes.slice(), { ...full });\n if (plaintext === null) return null;\n if (!(plaintext instanceof Uint8Array)) {\n if (plaintext?.status === \"authentication-failed\")\n throw new DeliveryAuthenticationError();\n throw new Error(\"invalid decryption result\");\n }\n const codec = deliveryCodec(bytes[0]!);\n if (codec.kind !== \"credit\") throw new Error(\"unexpected envelope kind\");\n const state = codec.decode(checkedPlaintext(plaintext, codec), full);\n const identity =\n context.role === \"owner\"\n ? state.note.ownerWalletIdentity\n : state.note.spenderWalletIdentity;\n if (\n BigInt(identity) !== BigInt(ownerAddress) ||\n state.note.tokenAddress !== context.tokenAddress\n )\n throw new Error(\"decrypted credit context mismatch\");\n if (wallet.getReceivingAddress().kind === \"long\") {\n const keys =\n context.role === \"owner\"\n ? state.ownerReceivingKeys\n : state.spenderReceivingKeys;\n if (bytesToHex(keys.viewingPublicKey) !== bytesToHex(wallet.viewingPublicKey))\n throw new Error(\"decrypted credit receiving key mismatch\");\n }\n await creditCommitment(full, state.note);\n return state;\n } catch (cause) {\n if (cause instanceof DeliveryAuthenticationError) throw cause;\n throw new DeliveryDecryptionError(cause);\n }\n },\n };\n}\n","import { authenticatedDecryptor } from \"../delivery/decryptor\";\nimport type { Note, CreditDeliveryState, CreditState } from \"../types\";\nimport { bytesToHex, hexToBytes } from \"@noble/hashes/utils\";\nimport { ReceivingAddress } from \"../address/receiving-address\";\nimport { validateDeliveryCiphertext } from \"../delivery/delivery-codec\";\nimport { validateContext } from \"../delivery/validation\";\nimport type { CreditStateDecryptionContext, NoteDecryptionContext } from \"../delivery/types\";\nimport { AuthorizedStatement } from \"./capabilities\";\nimport { Wallet } from \"./wallet-object\";\nimport {\n computeOwnerAddress,\n computeWalletAuthorizationDigest,\n verifyWalletAuthorization,\n type WalletAuthorizationRequest,\n type WalletOperation,\n} from \"./wallet\";\n\nexport type WalletHex = `0x${string}`;\nexport type WalletMethod =\n | \"wallet.public\"\n | \"wallet.detect\"\n | \"wallet.decryptNote\"\n | \"wallet.decryptCredit\"\n | \"wallet.authorize\";\nexport interface WalletWireContext {\n chainId: string;\n protocolAddress: string;\n}\nexport interface WalletDecryptContext extends WalletWireContext {\n tokenAddress: string;\n outputCommitment: WalletHex;\n role?: \"owner\" | \"spender\";\n}\nexport interface WalletParams {\n \"wallet.public\": Record<string, never>;\n \"wallet.detect\": { clues: WalletHex[] };\n \"wallet.decryptNote\": { envelope: WalletHex; context: WalletDecryptContext };\n \"wallet.decryptCredit\": { envelope: WalletHex; context: WalletDecryptContext };\n \"wallet.authorize\": {\n operation: WalletOperation;\n capacity: number;\n words: string[];\n context: WalletWireContext;\n };\n}\nexport interface WalletResults {\n \"wallet.public\": {\n viewingPublicKey: WalletHex;\n spendingPublicKey: WalletHex;\n clueKey: WalletHex;\n };\n \"wallet.detect\": { matches: boolean[] };\n \"wallet.decryptNote\": { plaintext: WalletHex };\n \"wallet.decryptCredit\": { plaintext: WalletHex };\n \"wallet.authorize\": { spendingPublicKey: WalletHex; signature: WalletHex; digest: WalletHex };\n}\nexport interface WalletAcceptedResults {\n \"wallet.public\": WalletResults[\"wallet.public\"];\n \"wallet.detect\": WalletResults[\"wallet.detect\"];\n \"wallet.decryptNote\": Note & { payload: Uint8Array };\n \"wallet.decryptCredit\": CreditDeliveryState & { note: CreditState & { payload: Uint8Array } };\n \"wallet.authorize\": AuthorizedStatement;\n}\nexport type WalletRequest<M extends WalletMethod = WalletMethod> = {\n version: 1;\n id: string;\n ownerAddress: WalletHex;\n method: M;\n params: WalletParams[M];\n};\nexport type WalletResponse<M extends WalletMethod = WalletMethod> = {\n version: 1;\n id: string;\n ownerAddress: WalletHex;\n method: M;\n} & ({ result: WalletResults[M]; error?: never } | { error: { code: string }; result?: never });\nexport interface PreparedWalletRequest<M extends WalletMethod = WalletMethod> {\n readonly request: WalletRequest<M>;\n}\nexport const walletHex = (bytes: Uint8Array): WalletHex => `0x${bytesToHex(bytes)}`;\nexport function walletBytes(value: unknown, length?: number): Uint8Array {\n if (typeof value !== \"string\" || !/^0x(?:[0-9a-f]{2})*$/.test(value))\n throw new Error(\"invalid canonical hex bytes\");\n const bytes = hexToBytes(value.slice(2));\n if (length !== undefined && bytes.length !== length) throw new Error(\"invalid byte length\");\n return bytes;\n}\nexport function walletInteger(value: unknown): bigint {\n if (typeof value !== \"string\" || !/^(0|[1-9][0-9]*)$/.test(value) || value.length > 78)\n throw new Error(\"invalid canonical integer\");\n return BigInt(value);\n}\nexport function walletAuthorizationParams(\n params: WalletParams[\"wallet.authorize\"]\n): WalletAuthorizationRequest {\n return {\n ...params,\n words: params.words.map(walletInteger),\n context: {\n chainId: walletInteger(params.context.chainId),\n protocolAddress: walletInteger(params.context.protocolAddress),\n },\n };\n}\nexport function walletDecryptionContext(\n request: WalletRequest<\"wallet.decryptNote\" | \"wallet.decryptCredit\">\n): NoteDecryptionContext & { role?: \"owner\" | \"spender\" } {\n const context = request.params.context;\n return {\n chainId: walletInteger(context.chainId),\n protocolAddress: walletInteger(context.protocolAddress),\n tokenAddress: walletInteger(context.tokenAddress),\n outputCommitment: context.outputCommitment,\n ownerAddress: request.ownerAddress,\n ...(context.role ? { role: context.role } : {}),\n };\n}\nfunction freeze<T>(value: T): T {\n if (value && typeof value === \"object\") {\n Object.values(value).forEach(freeze);\n Object.freeze(value);\n }\n return value;\n}\nfunction exactKeys(value: unknown, keys: string[]): void {\n if (\n !value ||\n typeof value !== \"object\" ||\n Array.isArray(value) ||\n Object.keys(value).some((key) => !keys.includes(key)) ||\n keys.some((key) => !Object.hasOwn(value, key))\n )\n throw new Error(\"unexpected wallet fields\");\n}\nexport function validateWalletRequest(request: WalletRequest): void {\n exactKeys(request, [\"version\", \"id\", \"ownerAddress\", \"method\", \"params\"]);\n if (\n request.version !== 1 ||\n typeof request.id !== \"string\" ||\n !/^[\\x21-\\x7e]{1,128}$/.test(request.id)\n )\n throw new Error(\"invalid wallet request envelope\");\n walletBytes(request.ownerAddress, 20);\n ReceivingAddress.fromIdentity(request.ownerAddress);\n switch (request.method) {\n case \"wallet.public\":\n exactKeys(request.params, []);\n break;\n case \"wallet.detect\": {\n exactKeys(request.params, [\"clues\"]);\n const { clues } = request.params as WalletParams[\"wallet.detect\"];\n if (!Array.isArray(clues) || clues.length > 1024) throw new Error(\"invalid clues\");\n clues.forEach((clue) => walletBytes(clue, 68));\n break;\n }\n case \"wallet.authorize\": {\n exactKeys(request.params, [\"operation\", \"capacity\", \"words\", \"context\"]);\n const params = request.params as WalletParams[\"wallet.authorize\"];\n exactKeys(params.context, [\"chainId\", \"protocolAddress\"]);\n if (!Array.isArray(params.words) || params.words.length > 8192)\n throw new Error(\"invalid authorization words\");\n computeWalletAuthorizationDigest(walletAuthorizationParams(params));\n break;\n }\n case \"wallet.decryptNote\":\n case \"wallet.decryptCredit\": {\n const typed = request as WalletRequest<\"wallet.decryptNote\" | \"wallet.decryptCredit\">;\n exactKeys(typed.params, [\"envelope\", \"context\"]);\n exactKeys(typed.params.context, [\n \"chainId\",\n \"protocolAddress\",\n \"tokenAddress\",\n \"outputCommitment\",\n ...(request.method === \"wallet.decryptCredit\" ? [\"role\"] : []),\n ]);\n const context = walletDecryptionContext(typed);\n walletBytes(context.outputCommitment, 32);\n validateContext(context, context.tokenAddress);\n if (\n request.method === \"wallet.decryptCredit\" &&\n context.role !== \"owner\" &&\n context.role !== \"spender\"\n )\n throw new Error(\"invalid credit role\");\n if (request.method === \"wallet.decryptNote\" && context.role !== undefined)\n throw new Error(\"unexpected note role\");\n walletBytes(typed.params.envelope);\n validateDeliveryCiphertext(\n typed.params.envelope,\n request.method === \"wallet.decryptCredit\" ? \"credit\" : \"funds\"\n );\n break;\n }\n default:\n throw new Error(\"unsupported wallet method\");\n }\n}\nconst retainedWallets = new WeakMap<PreparedWalletRequest, Wallet>();\nexport function prepareWalletRequest<M extends WalletMethod>(\n wallet: Wallet,\n id: string,\n method: M,\n params: WalletParams[M]\n): PreparedWalletRequest<M> {\n if (!(wallet instanceof Wallet)) throw new TypeError(\"public Wallet required\");\n const request = structuredClone({\n version: 1 as const,\n id,\n ownerAddress: wallet.ownerAddress.toLowerCase() as WalletHex,\n method,\n params,\n });\n validateWalletRequest(request);\n const prepared = freeze({ request });\n retainedWallets.set(prepared, wallet);\n return prepared;\n}\n/** Validate native output against the retained request before using it in business state. */\nexport async function acceptWalletResponse<M extends WalletMethod>(\n prepared: PreparedWalletRequest<M>,\n response: WalletResponse<M>\n): Promise<WalletAcceptedResults[M]> {\n return acceptResponse(prepared, response);\n}\nasync function acceptResponse(\n prepared: PreparedWalletRequest,\n response: WalletResponse\n): Promise<any> {\n const wallet = retainedWallets.get(prepared);\n if (!wallet) throw new Error(\"wallet request was not prepared by this SDK instance\");\n const request = prepared.request;\n validateWalletRequest(request);\n const safe = structuredClone(response);\n if (\n safe.version !== request.version ||\n safe.id !== request.id ||\n safe.ownerAddress !== request.ownerAddress ||\n safe.method !== request.method\n )\n throw new Error(\"wallet response envelope mismatch\");\n validateWalletResponses([request], [safe]);\n if (\"error\" in safe) throw new NativeWalletError(safe.error!.code);\n const result = safe.result as any;\n exactKeys(\n result,\n request.method === \"wallet.public\"\n ? [\"viewingPublicKey\", \"spendingPublicKey\", \"clueKey\"]\n : request.method === \"wallet.authorize\"\n ? [\"spendingPublicKey\", \"signature\", \"digest\"]\n : request.method === \"wallet.detect\"\n ? [\"matches\"]\n : [\"plaintext\"]\n );\n if (request.method === \"wallet.public\") {\n walletBytes(result.spendingPublicKey, 65);\n walletBytes(result.viewingPublicKey, 33);\n walletBytes(result.clueKey, 32);\n if ((await computeOwnerAddress(result.spendingPublicKey)) !== request.ownerAddress)\n throw new Error(\"wallet public identity mismatch\");\n if (\n wallet.getReceivingAddress().kind === \"long\" &&\n (walletHex(wallet.viewingPublicKey) !== result.viewingPublicKey ||\n walletHex(wallet.clueKey) !== result.clueKey)\n )\n throw new Error(\"wallet receiving key mismatch\");\n ReceivingAddress.from({\n ownerAddress: request.ownerAddress,\n viewingPublicKey: walletBytes(result.viewingPublicKey),\n clueKey: walletBytes(result.clueKey),\n });\n } else if (request.method === \"wallet.authorize\") {\n const auth = walletAuthorizationParams(request.params as WalletParams[\"wallet.authorize\"]);\n if (\n result.digest !== computeWalletAuthorizationDigest(auth) ||\n !(await verifyWalletAuthorization(\n request.ownerAddress,\n result.spendingPublicKey,\n result.signature,\n auth\n ))\n )\n throw new Error(\"invalid wallet authorization response\");\n const publicKey = walletBytes(result.spendingPublicKey, 65);\n return new AuthorizedStatement(request.ownerAddress, result.digest, {\n public_key_x: Array.from(publicKey.slice(1, 33)),\n public_key_y: Array.from(publicKey.slice(33)),\n signature: Array.from(walletBytes(result.signature, 64)),\n });\n } else if (request.method === \"wallet.detect\") {\n if (\n !Array.isArray(result.matches) ||\n result.matches.length !==\n (request.params as WalletParams[\"wallet.detect\"]).clues.length ||\n result.matches.some((v: unknown) => typeof v !== \"boolean\")\n )\n throw new Error(\"invalid detection response\");\n } else {\n const typed = request as WalletRequest<\"wallet.decryptNote\" | \"wallet.decryptCredit\">;\n const context = walletDecryptionContext(typed);\n const plaintext = walletBytes(result.plaintext);\n const viewing = authenticatedDecryptor(wallet, {\n decryptNote: async () => plaintext,\n decryptCredit: async () => plaintext,\n });\n return typed.method === \"wallet.decryptNote\"\n ? viewing.decryptNote(typed.params.envelope, context)\n : viewing.decryptCredit(typed.params.envelope, context as CreditStateDecryptionContext);\n }\n return result;\n}\n\n/** Native errors contain machine-readable codes only. */\nexport class NativeWalletError extends Error {\n constructor(readonly code: string) {\n super(code);\n this.name = \"NativeWalletError\";\n }\n}\nexport const MAX_WALLET_BATCH_BYTES = 16 * 1024 * 1024;\nfunction boundedJson(value: unknown): void {\n const json = JSON.stringify(value);\n if (typeof json !== \"string\" || new TextEncoder().encode(json).length > MAX_WALLET_BATCH_BYTES)\n throw new Error(\"wallet batch exceeds encoded size limit\");\n}\nexport function validateWalletBatch(requests: readonly WalletRequest[]): void {\n if (!Array.isArray(requests) || requests.length > 1024) throw new Error(\"invalid wallet batch\");\n boundedJson(requests);\n const ids = new Set<string>();\n for (const request of requests) {\n validateWalletRequest(request);\n if (ids.has(request.id)) throw new Error(\"duplicate wallet request id\");\n if (request.ownerAddress !== requests[0]!.ownerAddress)\n throw new Error(\"mixed wallet batch owners\");\n ids.add(request.id);\n }\n}\n/** Check every envelope before returning responses in request order. */\nexport function validateWalletResponses(\n requests: readonly WalletRequest[],\n responses: readonly WalletResponse[]\n): WalletResponse[] {\n validateWalletBatch(requests);\n if (!Array.isArray(responses) || responses.length !== requests.length)\n throw new Error(\"wallet response batch length mismatch\");\n boundedJson(responses);\n const expected = new Map(requests.map((request) => [request.id, request]));\n const found = new Map<string, WalletResponse>();\n for (const response of responses) {\n if (!response || typeof response !== \"object\") throw new Error(\"invalid wallet response\");\n const request = expected.get(response.id);\n if (\n !request ||\n found.has(response.id) ||\n response.version !== 1 ||\n response.method !== request.method ||\n response.ownerAddress !== request.ownerAddress\n )\n throw new Error(\"wallet response envelope mismatch\");\n if (Object.hasOwn(response, \"error\")) {\n exactKeys(response, [\"version\", \"id\", \"ownerAddress\", \"method\", \"error\"]);\n exactKeys(response.error, [\"code\"]);\n if (\n typeof response.error?.code !== \"string\" ||\n !/^[A-Z][A-Z0-9_]{0,127}$/.test(response.error.code)\n )\n throw new Error(\"invalid native wallet error\");\n } else {\n exactKeys(response, [\"version\", \"id\", \"ownerAddress\", \"method\", \"result\"]);\n if (\n !response.result ||\n typeof response.result !== \"object\" ||\n Array.isArray(response.result)\n )\n throw new Error(\"invalid wallet result\");\n const result = response.result as any;\n exactKeys(\n result,\n request.method === \"wallet.public\"\n ? [\"viewingPublicKey\", \"spendingPublicKey\", \"clueKey\"]\n : request.method === \"wallet.authorize\"\n ? [\"spendingPublicKey\", \"signature\", \"digest\"]\n : request.method === \"wallet.detect\"\n ? [\"matches\"]\n : [\"plaintext\"]\n );\n if (request.method === \"wallet.public\") {\n walletBytes(result.viewingPublicKey, 33);\n walletBytes(result.spendingPublicKey, 65);\n walletBytes(result.clueKey, 32);\n } else if (request.method === \"wallet.authorize\") {\n walletBytes(result.spendingPublicKey, 65);\n walletBytes(result.signature, 64);\n walletBytes(result.digest, 32);\n } else if (request.method === \"wallet.detect\") {\n if (\n !Array.isArray(result.matches) ||\n result.matches.length !==\n (request.params as WalletParams[\"wallet.detect\"]).clues.length ||\n result.matches.some((value: unknown) => typeof value !== \"boolean\")\n )\n throw new Error(\"invalid detection response\");\n } else {\n walletBytes(result.plaintext);\n }\n }\n found.set(response.id, response);\n }\n return requests.map((request) => found.get(request.id)!);\n}\nexport async function acceptWalletResponses(\n prepared: readonly PreparedWalletRequest[],\n responses: readonly WalletResponse[]\n): Promise<unknown[]> {\n for (const item of prepared) {\n if (!retainedWallets.has(item))\n throw new Error(\"wallet request was not prepared by this SDK instance\");\n }\n const ordered = validateWalletResponses(\n prepared.map((item) => item.request),\n structuredClone(responses)\n );\n return Promise.all(prepared.map((item, index) => acceptWalletResponse(item, ordered[index]!)));\n}\n","import { AbiCoder, keccak256, toBeHex } from \"ethers\";\nexport function provenanceIntentHash(originalRequestHash: string): string {\n return keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\"string\", \"bytes32\"],\n [\"InvisiBroadcasterProvenanceIntentV1\", toBeHex(BigInt(originalRequestHash), 32)]\n )\n );\n}\n"],"mappings":"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;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAqE,MAAM,MAAM,IAAI;AAAA,EACtF,CAAC,qEAAq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","names":["import_utils","import_blake2b","bytes","publicKey","buffer","identity","owner","identity","bytes","mod","import_ethers","import_secp256k1","context","field","identity","hash","creditCommitment","context","nonce","uint","encode","receivingKeys","viewingPublicKey","context","import_secp256k1","concat","uint","field","encode","nonce","identity","context","uint","field","commitment","context","concat","encode","context","import_utils","hash","field","encode","note","nonce","commitment","import_secp256k1","import_utils","import_secp256k1","import_sha3","import_utils","bytes","publicKey","bytes","context","bytes","privateKey","publicKey","identity","privateKey","publicKey","context","commitment","nonce","import_ethers","import_utils","context","bytes","identity","import_utils","bytes","context","publicKey","import_ethers"]}
|