@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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/credit/index.ts","../src/crypto/domains.ts","../src/crypto/random.ts","../src/crypto/poseidon-constants.ts","../src/crypto/poseidon.ts","../src/notes/noteContext.ts","../src/credit/state.ts","../src/delivery/delivery-codec.ts","../src/delivery/note-payload.ts","../src/fmd/fmd.ts","../src/fmd/decaf377.ts","../src/delivery/envelope.ts","../src/delivery/binary.ts","../src/delivery/validation.ts","../src/delivery/encryption.ts"],"sourcesContent":["export * from \"./state\";\nexport {\n encryptCreditState,\n decryptCreditState,\n normalizeCreditDeliveryState,\n} from \"../delivery/encryption\";\nexport type {\n CreditState,\n CreditPolicy,\n CreditUsage,\n CreditDeliveryState,\n CreditStateRecovery,\n} from \"../types\";\n\nexport * from \"./state\";\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 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 { 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","/**\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","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 { 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"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACIO,IAAM,WAAW;AACjB,IAAM,UAAU;AAChB,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;AAC1B,IAAM,uBAAuB;;;ACL7B,IAAM,gBACT;;;ACHG,IAAM,oBAAoB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AACO,IAAM,kBAAkB;AAAA,EAC3B;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAAA,EACA;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAAA,EACA;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAAA,EACA;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAAA,EACA,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,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,qE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","names":["creditCommitment","import_blake2b","field","field","bytes","bytes","field","uint","viewingPublicKey","import_secp256k1","concat","uint","field","encode","uint","field","concat","encode"]}
1
+ {"version":3,"sources":["../src/credit/index.ts","../src/crypto/domains.ts","../src/crypto/random.ts","../src/crypto/poseidon-constants.ts","../src/crypto/poseidon.ts","../src/notes/noteContext.ts","../src/credit/state.ts","../src/delivery/delivery-codec.ts","../src/delivery/note-payload.ts","../src/fmd/fmd.ts","../src/fmd/decaf377.ts","../src/delivery/errors.ts","../src/delivery/envelope.ts","../src/delivery/binary.ts","../src/delivery/validation.ts","../src/delivery/encryption.ts"],"sourcesContent":["export * from \"./state\";\nexport {\n encryptCreditState,\n decryptCreditState,\n normalizeCreditDeliveryState,\n} from \"../delivery/encryption\";\nexport type {\n CreditState,\n CreditPolicy,\n CreditUsage,\n CreditDeliveryState,\n CreditStateRecovery,\n} from \"../types\";\n\nexport * from \"./state\";\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 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 { 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","/**\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","/** 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 { 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"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACIO,IAAM,WAAW;AACjB,IAAM,UAAU;AAChB,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;AAC1B,IAAM,uBAAuB;;;ACL7B,IAAM,gBACT;;;ACHG,IAAM,oBAAoB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AACO,IAAM,kBAAkB;AAAA,EAC3B;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAAA,EACA;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAAA,EACA;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAAA,EACA;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAAA,EACA,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,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,qE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","names":["creditCommitment","import_blake2b","field","field","bytes","bytes","field","uint","viewingPublicKey","import_secp256k1","concat","uint","field","encode","uint","field","concat","encode"]}
package/dist/credit.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { C as CreditDeliveryState, b as CreditPolicy, c as CreditUsage, a as CreditState, P as ProtocolContext, e as CreditStateRecovery } from './types-CEAuh35C.cjs';
2
- export { d as decryptCreditState, f as encryptCreditState } from './encryption-0HQXc3tT.cjs';
2
+ export { d as decryptCreditState, f as encryptCreditState } from './encryption-P2HJ89FQ.cjs';
3
3
 
4
4
  /** Copy and validate both public key snapshots without exporting any spending material. */
5
5
  declare function normalizeCreditDeliveryState(state: CreditDeliveryState): CreditDeliveryState;
package/dist/credit.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { C as CreditDeliveryState, b as CreditPolicy, c as CreditUsage, a as CreditState, P as ProtocolContext, e as CreditStateRecovery } from './types-CEAuh35C.js';
2
- export { d as decryptCreditState, f as encryptCreditState } from './encryption-D06YBTW0.js';
2
+ export { d as decryptCreditState, f as encryptCreditState } from './encryption-Bzsl9VQk.js';
3
3
 
4
4
  /** Copy and validate both public key snapshots without exporting any spending material. */
5
5
  declare function normalizeCreditDeliveryState(state: CreditDeliveryState): CreditDeliveryState;
package/dist/credit.js CHANGED
@@ -17,7 +17,7 @@ import {
17
17
  normalizeCreditState,
18
18
  normalizeCreditUsage,
19
19
  recoverCreditState
20
- } from "./chunk-PRUUPDVD.js";
20
+ } from "./chunk-QAC5T4S5.js";
21
21
  import "./chunk-Q3NNEKKR.js";
22
22
  export {
23
23
  CREDIT_POLICY_FIELDS,
@@ -5,6 +5,8 @@ interface NoteEncryptionContext extends ProtocolContext {
5
5
  outputCommitment: `0x${string}`;
6
6
  }
7
7
  interface NoteDecryptionContext extends NoteEncryptionContext {
8
+ /** Present for discovery; absent for an explicitly supplied standalone envelope. */
9
+ clue?: `0x${string}`;
8
10
  tokenAddress: bigint;
9
11
  ownerAddress: `0x${string}`;
10
12
  }
@@ -5,6 +5,8 @@ interface NoteEncryptionContext extends ProtocolContext {
5
5
  outputCommitment: `0x${string}`;
6
6
  }
7
7
  interface NoteDecryptionContext extends NoteEncryptionContext {
8
+ /** Present for discovery; absent for an explicitly supplied standalone envelope. */
9
+ clue?: `0x${string}`;
8
10
  tokenAddress: bigint;
9
11
  ownerAddress: `0x${string}`;
10
12
  }
package/dist/index.cjs CHANGED
@@ -31,6 +31,7 @@ __export(src_exports, {
31
31
  D_IDENT: () => D_IDENT,
32
32
  D_NOTE: () => D_NOTE,
33
33
  D_NULL: () => D_NULL,
34
+ DeliveryAuthenticationError: () => DeliveryAuthenticationError,
34
35
  DeliveryDecryptionError: () => DeliveryDecryptionError,
35
36
  Detector: () => Detector,
36
37
  Disclosure: () => Disclosure,
@@ -1142,6 +1143,14 @@ function validateDeliveryCiphertext(value, kind) {
1142
1143
  return data;
1143
1144
  }
1144
1145
 
1146
+ // src/delivery/errors.ts
1147
+ var DeliveryAuthenticationError = class extends Error {
1148
+ constructor(cause) {
1149
+ super("delivery authentication failed", { cause });
1150
+ this.name = "DeliveryAuthenticationError";
1151
+ }
1152
+ };
1153
+
1145
1154
  // src/delivery/envelope.ts
1146
1155
  var import_secp256k13 = require("@noble/curves/secp256k1");
1147
1156
 
@@ -1349,7 +1358,11 @@ async function open(key, envelope, context2, headerByte, role, payloadKey = fals
1349
1358
  },
1350
1359
  aes,
1351
1360
  buffer(data.slice(62))
1352
- );
1361
+ ).catch((error) => {
1362
+ if (error instanceof Error && error.name === "OperationError")
1363
+ throw new DeliveryAuthenticationError(error);
1364
+ throw error;
1365
+ });
1353
1366
  return new Uint8Array(decrypted);
1354
1367
  } finally {
1355
1368
  localKey.fill(0);
@@ -2362,6 +2375,17 @@ function authenticatedDecryptor(wallet, decryptor) {
2362
2375
  const ownerAddress = wallet.ownerAddress;
2363
2376
  return {
2364
2377
  ownerAddress,
2378
+ async detectCandidates(candidates) {
2379
+ if (!decryptor.detect) return candidates.map(() => "candidate");
2380
+ const result = await decryptor.detect(structuredClone(candidates));
2381
+ if (!result || BigInt(result.ownerAddress) !== BigInt(ownerAddress) || !Array.isArray(result.results) || result.results.length !== candidates.length || result.results.some(
2382
+ (value) => !["candidate", "not-recipient", "unresolved"].includes(value)
2383
+ ))
2384
+ throw new DeliveryDecryptionError(
2385
+ new Error("invalid detection batch or wrong account")
2386
+ );
2387
+ return [...result.results];
2388
+ },
2365
2389
  async decryptNote(envelope, context2) {
2366
2390
  context2 = { ...context2 };
2367
2391
  try {
@@ -2369,6 +2393,11 @@ function authenticatedDecryptor(wallet, decryptor) {
2369
2393
  const full = { ...context2, ownerAddress };
2370
2394
  const plaintext = await decryptor.decryptNote(bytes3.slice(), { ...full });
2371
2395
  if (plaintext === null) return null;
2396
+ if (!(plaintext instanceof Uint8Array)) {
2397
+ if (plaintext?.status === "authentication-failed")
2398
+ throw new DeliveryAuthenticationError();
2399
+ throw new Error("invalid decryption result");
2400
+ }
2372
2401
  const codec = deliveryCodec(bytes3[0]);
2373
2402
  if (codec.kind !== "funds") throw new Error("unexpected envelope kind");
2374
2403
  const note = codec.decode(checkedPlaintext(plaintext, codec), full);
@@ -2377,6 +2406,7 @@ function authenticatedDecryptor(wallet, decryptor) {
2377
2406
  await noteCommitment(full, note);
2378
2407
  return note;
2379
2408
  } catch (cause) {
2409
+ if (cause instanceof DeliveryAuthenticationError) throw cause;
2380
2410
  throw new DeliveryDecryptionError(cause);
2381
2411
  }
2382
2412
  },
@@ -2387,6 +2417,11 @@ function authenticatedDecryptor(wallet, decryptor) {
2387
2417
  const full = { ...context2, ownerAddress };
2388
2418
  const plaintext = await decryptor.decryptCredit(bytes3.slice(), { ...full });
2389
2419
  if (plaintext === null) return null;
2420
+ if (!(plaintext instanceof Uint8Array)) {
2421
+ if (plaintext?.status === "authentication-failed")
2422
+ throw new DeliveryAuthenticationError();
2423
+ throw new Error("invalid decryption result");
2424
+ }
2390
2425
  const codec = deliveryCodec(bytes3[0]);
2391
2426
  if (codec.kind !== "credit") throw new Error("unexpected envelope kind");
2392
2427
  const state = codec.decode(checkedPlaintext(plaintext, codec), full);
@@ -2401,6 +2436,7 @@ function authenticatedDecryptor(wallet, decryptor) {
2401
2436
  await creditCommitment(full, state.note);
2402
2437
  return state;
2403
2438
  } catch (cause) {
2439
+ if (cause instanceof DeliveryAuthenticationError) throw cause;
2404
2440
  throw new DeliveryDecryptionError(cause);
2405
2441
  }
2406
2442
  }
@@ -2690,6 +2726,7 @@ function provenanceIntentHash(originalRequestHash) {
2690
2726
  D_IDENT,
2691
2727
  D_NOTE,
2692
2728
  D_NULL,
2729
+ DeliveryAuthenticationError,
2693
2730
  DeliveryDecryptionError,
2694
2731
  Detector,
2695
2732
  Disclosure,