@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.
@@ -758,6 +758,14 @@ function validateDeliveryCiphertext(value, kind) {
758
758
  return data;
759
759
  }
760
760
 
761
+ // src/delivery/errors.ts
762
+ var DeliveryAuthenticationError = class extends Error {
763
+ constructor(cause) {
764
+ super("delivery authentication failed", { cause });
765
+ this.name = "DeliveryAuthenticationError";
766
+ }
767
+ };
768
+
761
769
  // src/delivery/envelope.ts
762
770
  import { secp256k1 as secp256k12 } from "@noble/curves/secp256k1";
763
771
 
@@ -948,7 +956,11 @@ async function open(key, envelope, context, headerByte, role, payloadKey = false
948
956
  },
949
957
  aes,
950
958
  buffer(data.slice(62))
951
- );
959
+ ).catch((error) => {
960
+ if (error instanceof Error && error.name === "OperationError")
961
+ throw new DeliveryAuthenticationError(error);
962
+ throw error;
963
+ });
952
964
  return new Uint8Array(decrypted);
953
965
  } finally {
954
966
  localKey.fill(0);
@@ -1134,6 +1146,7 @@ export {
1134
1146
  decodeDeliveryHeader,
1135
1147
  deliveryCodec,
1136
1148
  validateDeliveryCiphertext,
1149
+ DeliveryAuthenticationError,
1137
1150
  validateContext,
1138
1151
  noteCommitment,
1139
1152
  creditCommitment,
@@ -1146,4 +1159,4 @@ export {
1146
1159
  decryptNotePayload,
1147
1160
  decryptCreditPayload
1148
1161
  };
1149
- //# sourceMappingURL=chunk-PRUUPDVD.js.map
1162
+ //# sourceMappingURL=chunk-QAC5T4S5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/crypto/domains.ts","../src/crypto/random.ts","../src/crypto/poseidon-constants.ts","../src/crypto/poseidon.ts","../src/notes/commitment.ts","../src/notes/noteContext.ts","../src/credit/state.ts","../src/delivery/note-payload.ts","../src/delivery/delivery-codec.ts","../src/delivery/errors.ts","../src/delivery/envelope.ts","../src/delivery/binary.ts","../src/delivery/validation.ts","../src/delivery/encryption.ts"],"sourcesContent":["/** 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 { D_IDENT, D_NOTE } from \"../crypto/domains\";\nimport { poseidonHash } from \"../crypto/poseidon\";\n\n/** Randomized per-note identity; the full owner address stays private on chain. */\nexport async function computeNoteIdentity(\n ownerAddress: bigint,\n nonce: bigint\n): Promise<`0x${string}`> {\n if (ownerAddress <= 0n || ownerAddress >= 1n << 160n)\n throw new RangeError(\"invalid owner address\");\n return poseidonHash([D_IDENT, ownerAddress, nonce]);\n}\n\n/** Note leaf from a randomized identity, token and positive u128 amount. */\nexport async function computeNoteCommitment(\n chainId: bigint,\n protocolAddress: bigint,\n identity: `0x${string}`,\n tokenAddress: bigint,\n amount: bigint\n): Promise<`0x${string}`> {\n if (chainId < 0n || chainId >= 1n << 64n) throw new RangeError(\"invalid chainId\");\n if (protocolAddress <= 0n || protocolAddress >= 1n << 160n)\n throw new RangeError(\"invalid protocol address\");\n if (tokenAddress < 0n || tokenAddress >= 1n << 160n)\n throw new RangeError(\"invalid token address\");\n if (amount <= 0n || amount >= 1n << 128n) throw new RangeError(\"invalid note amount\");\n if (!/^0x[0-9a-fA-F]{64}$/.test(identity)) throw new Error(\"invalid note identity encoding\");\n return poseidonHash([D_NOTE, chainId, protocolAddress, BigInt(identity), tokenAddress, amount]);\n}\n","import type { ProtocolContext } from \"../types\";\n\n/** Stored notes must belong to the chain and deployment used by an operation. */\nexport function assertNoteContext(note: ProtocolContext, context: ProtocolContext): void {\n if (note.chainId !== context.chainId || note.protocolAddress !== context.protocolAddress) {\n throw new Error(\"note context mismatch\");\n }\n}\n","import {\n D_CNULL,\n D_CREDIT,\n D_CREDIT_KEY_HASH,\n D_CREDIT_RECOVERY,\n D_CREDIT_STATE_NONCE,\n} from \"../crypto/domains\";\nimport { poseidonHash } from \"../crypto/poseidon\";\nimport { FIELD_MODULUS } from \"../crypto/random\";\nimport type {\n CreditState,\n CreditPolicy,\n CreditUsage,\n CreditStateRecovery,\n ProtocolContext,\n} from \"../types\";\nimport { assertNoteContext } from \"../notes/noteContext\";\n\nexport const CREDIT_POLICY_FIELDS = [\"singleLimit\", \"dailyLimit\", \"monthlyLimit\"] as const;\nexport const CREDIT_USAGE_FIELDS = [\n \"lastDay\",\n \"dailySpent\",\n \"lastMonth\",\n \"monthlySpent\",\n \"totalSpent\",\n] as const;\nexport function normalizeCreditPolicy(value: Partial<CreditPolicy> = {}): CreditPolicy {\n return Object.fromEntries(\n CREDIT_POLICY_FIELDS.map((key) => {\n const n = value[key] ?? 0n;\n uint(n, 126, key);\n return [key, n];\n })\n ) as unknown as CreditPolicy;\n}\nexport function normalizeCreditUsage(value: Partial<CreditUsage> = {}): CreditUsage {\n const usage = Object.fromEntries(\n CREDIT_USAGE_FIELDS.map((key) => {\n const n = value[key] ?? 0n;\n uint(n, key === \"lastDay\" || key === \"lastMonth\" ? 64 : 128, key);\n return [key, n];\n })\n ) as unknown as CreditUsage;\n for (const [period, spent] of [\n [\"lastDay\", \"dailySpent\"],\n [\"lastMonth\", \"monthlySpent\"],\n ] as const)\n if (usage[period] === 0n && usage[spent] !== 0n) throw Error(\"noncanonical Credit usage\");\n return usage;\n}\nfunction balance(value: Pick<CreditState, \"availableCredit\" | \"unlimited\">) {\n uint(value.availableCredit, 128, \"availableCredit\");\n if (typeof value.unlimited !== \"boolean\") throw TypeError(\"unlimited must be boolean\");\n if (value.unlimited && value.availableCredit !== 0n)\n throw Error(\"unlimited Credit must have zero available credit\");\n return { availableCredit: value.availableCredit, unlimited: value.unlimited };\n}\n/** UTC Gregorian periods from explicit uint64 chain seconds, without wall-clock defaults. */\nexport function creditPeriods(timestamp: bigint): { currentDay: bigint; currentMonth: bigint } {\n if (typeof timestamp !== \"bigint\") throw new TypeError(\"Credit timestamp required\");\n uint(timestamp, 64, \"timestamp\");\n const days = timestamp / 86400n,\n z = days + 719468n,\n era = z / 146097n,\n doe = z - era * 146097n;\n const yoe = (doe - doe / 1460n + doe / 36524n - doe / 146096n) / 365n;\n let year = yoe + era * 400n;\n const doy = doe - (365n * yoe + yoe / 4n - yoe / 100n),\n mp = (5n * doy + 2n) / 153n;\n const month = mp + (mp < 10n ? 3n : -9n);\n if (month <= 2n) year++;\n return { currentDay: days + 1n, currentMonth: (year - 1970n) * 12n + month };\n}\n/** Accumulate actual debits even when limits are disabled. */\nexport function applyCreditDrawUsage(\n note: Partial<CreditPolicy & CreditUsage> & Pick<CreditState, \"availableCredit\" | \"unlimited\">,\n amount: bigint,\n timestamp: bigint\n): CreditPolicy & CreditUsage & Pick<CreditState, \"availableCredit\" | \"unlimited\"> {\n const policy = {\n ...normalizeCreditPolicy(note),\n ...normalizeCreditUsage(note),\n ...balance(note),\n },\n periods = creditPeriods(timestamp);\n uint(amount, 126, \"draw amount\");\n if (amount === 0n) throw new Error(\"draw amount must be positive\");\n if (policy.singleLimit !== 0n && amount > policy.singleLimit)\n throw new Error(\"single limit exceeded\");\n for (const [limit, last, spent, current] of [\n [\"dailyLimit\", \"lastDay\", \"dailySpent\", \"currentDay\"],\n [\"monthlyLimit\", \"lastMonth\", \"monthlySpent\", \"currentMonth\"],\n ] as const) {\n const period = periods[current];\n if (period < policy[last]) throw new Error(\"Credit period rollback\");\n policy[spent] = (period === policy[last] ? policy[spent] : 0n) + amount;\n uint(policy[spent], 128, spent);\n policy[last] = period;\n if (policy[limit] !== 0n && policy[spent] > policy[limit])\n throw new Error(`${limit} exceeded`);\n }\n policy.totalSpent += amount;\n uint(policy.totalSpent, 128, \"totalSpent\");\n if (!policy.unlimited) {\n if (amount > policy.availableCredit) throw Error(\"available credit exceeded\");\n policy.availableCredit -= amount;\n }\n return policy;\n}\n\nexport async function computeCreditSharedKeyHash(creditSharedKey: bigint): Promise<`0x${string}`> {\n if (creditSharedKey <= 0n || creditSharedKey >= FIELD_MODULUS)\n throw new RangeError(\"invalid Credit shared key\");\n return poseidonHash([D_CREDIT_KEY_HASH, creditSharedKey]);\n}\n\nexport function normalizeCreditState(state: CreditState): CreditState {\n const allowed = [\n \"chainId\",\n \"protocolAddress\",\n \"tokenAddress\",\n \"spenderWalletIdentity\",\n \"ownerWalletIdentity\",\n \"revocationShard\",\n \"revocationSlot\",\n \"nonce\",\n \"expiry\",\n \"creditSharedKey\",\n ...CREDIT_POLICY_FIELDS,\n ...CREDIT_USAGE_FIELDS,\n \"availableCredit\",\n \"unlimited\",\n \"payload\",\n ];\n if (!state || typeof state !== \"object\" || Object.keys(state).some((k) => !allowed.includes(k)))\n throw Error(\"Unsupported Credit fields\");\n for (const [name, bits] of [\n [\"chainId\", 64],\n [\"protocolAddress\", 160],\n [\"tokenAddress\", 160],\n [\"revocationShard\", 64],\n [\"revocationSlot\", 16],\n [\"expiry\", 64],\n ] as const)\n uint(state[name], bits, name);\n for (const id of [state.spenderWalletIdentity, state.ownerWalletIdentity])\n if (!/^0x[0-9a-fA-F]{40}$/.test(id) || BigInt(id) === 0n)\n throw Error(\"invalid Credit identity\");\n if (!state.protocolAddress || !state.tokenAddress || !state.revocationShard || !state.expiry)\n throw Error(\"Credit deployment, token, shard and expiry must be positive\");\n field(state.nonce, \"nonce\");\n field(state.creditSharedKey, \"creditSharedKey\");\n if (!state.creditSharedKey) throw Error(\"Credit shared key must be positive\");\n if (state.payload !== undefined && !(state.payload instanceof Uint8Array))\n throw TypeError(\"payload must be Uint8Array\");\n return {\n ...state,\n ...normalizeCreditPolicy(state),\n ...normalizeCreditUsage(state),\n ...balance(state),\n ...(state.payload !== undefined ? { payload: Uint8Array.from(state.payload) } : {}),\n };\n}\nexport async function computeCreditCommitment(\n state: CreditState,\n keyHash?: `0x${string}`\n): Promise<`0x${string}`> {\n if (keyHash === undefined) state = normalizeCreditState(state);\n for (const [name, bits] of [\n [\"chainId\", 64],\n [\"protocolAddress\", 160],\n [\"tokenAddress\", 160],\n [\"revocationShard\", 64],\n [\"revocationSlot\", 16],\n [\"expiry\", 64],\n ] as const)\n uint(state[name], bits, name);\n for (const identity of [state.spenderWalletIdentity, state.ownerWalletIdentity])\n if (!/^0x[0-9a-fA-F]{40}$/.test(identity) || BigInt(identity) === 0n)\n throw new Error(\"invalid Credit identity\");\n if (state.revocationShard === 0n || state.expiry === 0n)\n throw new Error(\"Credit shard and expiry must be positive\");\n field(state.nonce, \"nonce\");\n const hash = keyHash ?? (await computeCreditSharedKeyHash(state.creditSharedKey));\n field(BigInt(hash), \"Credit shared key hash\");\n return poseidonHash([\n D_CREDIT,\n state.chainId,\n state.protocolAddress,\n BigInt(state.spenderWalletIdentity),\n BigInt(state.ownerWalletIdentity),\n state.tokenAddress,\n state.revocationShard,\n state.revocationSlot,\n state.nonce,\n state.expiry,\n BigInt(hash),\n ...CREDIT_POLICY_FIELDS.map((k) => normalizeCreditPolicy(state)[k]),\n balance(state).availableCredit,\n state.unlimited ? 1n : 0n,\n ...CREDIT_USAGE_FIELDS.map((k) => normalizeCreditUsage(state)[k]),\n ]);\n}\n\nexport async function computeCreditNullifier(\n chainId: bigint,\n creditSharedKey: bigint,\n creditCommitment: `0x${string}`\n): Promise<`0x${string}`> {\n uint(chainId, 64, \"chainId\");\n if (creditSharedKey <= 0n || creditSharedKey >= FIELD_MODULUS)\n throw new RangeError(\"invalid Credit shared key\");\n if (!/^0x[0-9a-fA-F]{64}$/.test(creditCommitment))\n throw new Error(\"invalid Credit commitment encoding\");\n return poseidonHash([D_CNULL, chainId, creditSharedKey, BigInt(creditCommitment)]);\n}\n\n/** Tag10: deterministic successor nonce, scoped to the deployment and spend. */\nexport async function deriveCreditStateNonce(\n chainId: bigint,\n protocolAddress: bigint,\n tokenAddress: bigint,\n creditNullifier: bigint,\n creditSharedKey: bigint\n): Promise<bigint> {\n return BigInt(\n await poseidonHash([\n D_CREDIT_STATE_NONCE,\n chainId,\n protocolAddress,\n tokenAddress,\n creditNullifier,\n creditSharedKey,\n ])\n );\n}\n\n/** Tag9: additive recovery pad; recoveryAmount = (debit + pad) mod p. */\nexport async function computeCreditRecoveryPad(\n chainId: bigint,\n protocolAddress: bigint,\n tokenAddress: bigint,\n creditNullifier: bigint,\n creditSharedKey: bigint\n): Promise<bigint> {\n return BigInt(\n await poseidonHash([\n D_CREDIT_RECOVERY,\n chainId,\n protocolAddress,\n tokenAddress,\n creditNullifier,\n creditSharedKey,\n ])\n );\n}\n\nfunction uint(value: bigint, bits: number, name: string): void {\n if (typeof value !== \"bigint\" || value < 0n || value >= 1n << BigInt(bits))\n throw new RangeError(`${name} out of uint${bits} range`);\n}\n\nfunction field(value: bigint, name: string): void {\n if (typeof value !== \"bigint\" || value < 0n || value >= FIELD_MODULUS)\n throw new RangeError(`${name} out of BN254 field range`);\n}\n\n/** Recover a successor using authenticated draw fields, without a decryptable successor delivery. */\nexport async function recoverCreditState(\n context: ProtocolContext,\n previous: CreditState,\n recovery: CreditStateRecovery\n): Promise<CreditState> {\n assertNoteContext(previous, context);\n const nullifier = await computeCreditNullifier(\n context.chainId,\n previous.creditSharedKey,\n await computeCreditCommitment(previous)\n );\n if (nullifier.toLowerCase() !== recovery.creditNullifier.toLowerCase())\n throw new Error(\"previous Credit nullifier mismatch\");\n field(recovery.recoveryAmount, \"recoveryAmount\");\n const args = [\n context.chainId,\n context.protocolAddress,\n previous.tokenAddress,\n BigInt(nullifier),\n previous.creditSharedKey,\n ] as const;\n const nonce = await deriveCreditStateNonce(...args),\n mask = await computeCreditRecoveryPad(...args);\n const debit = (recovery.recoveryAmount - mask + FIELD_MODULUS) % FIELD_MODULUS;\n uint(debit, 126, \"recovered debit\");\n if (!debit) throw new Error(\"invalid recovered debit\");\n if (nonce === previous.nonce) throw new Error(\"state nonce must change\");\n const { payload, ...financial } = previous;\n const state = {\n ...financial,\n ...applyCreditDrawUsage(previous, debit, recovery.timestamp),\n nonce,\n };\n if ((await computeCreditCommitment(state)) !== recovery.stateCommitment)\n throw new Error(\"recovered Credit commitment mismatch\");\n return state;\n}\n\nexport async function deriveCreditState(\n previous: CreditState,\n debit: bigint,\n timestamp: bigint\n): Promise<{\n state: CreditState;\n stateCommitment: `0x${string}`;\n nullifier: `0x${string}`;\n recoveryAmount: bigint;\n}> {\n const nullifier = await computeCreditNullifier(\n previous.chainId,\n previous.creditSharedKey,\n await computeCreditCommitment(previous)\n );\n const args = [\n previous.chainId,\n previous.protocolAddress,\n previous.tokenAddress,\n BigInt(nullifier),\n previous.creditSharedKey,\n ] as const;\n const nonce = await deriveCreditStateNonce(...args),\n mask = await computeCreditRecoveryPad(...args);\n if (nonce === previous.nonce) throw Error(\"state nonce must change\");\n const state = { ...previous, ...applyCreditDrawUsage(previous, debit, timestamp), nonce };\n return {\n state,\n stateCommitment: await computeCreditCommitment(state),\n nullifier,\n recoveryAmount: (debit + mask) % FIELD_MODULUS,\n };\n}\nexport interface CreditUpdateChanges extends Partial<CreditPolicy> {\n expiry?: bigint;\n unlimited?: boolean;\n increaseAvailableCredit?: bigint;\n decreaseAvailableCredit?: bigint;\n}\nexport async function deriveCreditUpdate(\n previous: CreditState,\n changes: CreditUpdateChanges,\n deadline: bigint\n) {\n for (const key of Object.keys(changes))\n if (\n ![\n ...CREDIT_POLICY_FIELDS,\n \"expiry\",\n \"unlimited\",\n \"increaseAvailableCredit\",\n \"decreaseAvailableCredit\",\n ].includes(key)\n )\n throw Error(\"unsupported Credit update field\");\n const old = normalizeCreditState(previous),\n increase =\n changes.increaseAvailableCredit === undefined ? 0n : changes.increaseAvailableCredit,\n decrease =\n changes.decreaseAvailableCredit === undefined ? 0n : changes.decreaseAvailableCredit;\n uint(increase, 128, \"increaseAvailableCredit\");\n uint(decrease, 128, \"decreaseAvailableCredit\");\n if (increase !== 0n && decrease !== 0n)\n throw Error(\"Credit increase and decrease are mutually exclusive\");\n const unlimited = changes.unlimited === undefined ? old.unlimited : changes.unlimited;\n if (typeof unlimited !== \"boolean\") throw TypeError(\"unlimited must be boolean\");\n let availableCredit = 0n;\n if (unlimited) {\n if (increase !== 0n || decrease !== 0n)\n throw Error(\"unlimited update cannot adjust available credit\");\n } else {\n if (decrease > old.availableCredit)\n throw Error(\"available credit decrease exceeds balance\");\n availableCredit = old.availableCredit + increase - decrease;\n uint(availableCredit, 128, \"availableCredit\");\n }\n uint(deadline, 64, \"deadline\");\n const next = {\n ...old,\n ...normalizeCreditPolicy({ ...old, ...changes }),\n expiry: changes.expiry ?? old.expiry,\n availableCredit,\n unlimited,\n };\n if (previous.expiry < deadline || next.expiry < deadline)\n throw Error(\"expiry before request deadline\");\n const nullifier = await computeCreditNullifier(\n previous.chainId,\n previous.creditSharedKey,\n await computeCreditCommitment(previous)\n );\n const nonce = await deriveCreditStateNonce(\n previous.chainId,\n previous.protocolAddress,\n previous.tokenAddress,\n BigInt(nullifier),\n previous.creditSharedKey\n );\n if (nonce === previous.nonce) throw Error(\"state nonce must change\");\n const state = { ...next, nonce };\n return { state, nullifier, stateCommitment: await computeCreditCommitment(state) };\n}\n","import { secp256k1 } from \"@noble/curves/secp256k1\";\nimport { validateClueKey } from \"../fmd/fmd\";\nimport { normalizeCreditPolicy, normalizeCreditState } from \"../credit/state\";\nimport type { CreditDeliveryState, ReceivingKeys } from \"../types\";\n\nfunction concat(...parts: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(parts.reduce((length, part) => length + part.length, 0));\n let offset = 0;\n for (const part of parts) {\n out.set(part, offset);\n offset += part.length;\n }\n return out;\n}\nfunction uint(value: bigint, bits: number, name: string): void {\n if (value < 0n || value >= 1n << BigInt(bits))\n throw new RangeError(`${name} out of uint${bits} range`);\n}\nfunction encode(value: bigint, length = 32): Uint8Array {\n uint(value, length * 8, \"encoded value\");\n const out = new Uint8Array(length);\n for (let i = length - 1; i >= 0; i--) {\n out[i] = Number(value & 255n);\n value >>= 8n;\n }\n return out;\n}\nfunction decode(value: Uint8Array): bigint {\n return value.reduce((result, byte) => (result << 8n) | BigInt(byte), 0n);\n}\nfunction hexField(value: bigint): `0x${string}` {\n uint(value, 160, \"owner address\");\n return `0x${value.toString(16).padStart(40, \"0\")}`;\n}\nfunction receivingKeys(keys: ReceivingKeys): ReceivingKeys {\n if (\n !keys ||\n !(keys.viewingPublicKey instanceof Uint8Array) ||\n !(keys.clueKey instanceof Uint8Array)\n )\n throw new Error(\"receiving keys required\");\n const viewingPublicKey = Uint8Array.from(keys.viewingPublicKey),\n clueKey = Uint8Array.from(keys.clueKey);\n if (viewingPublicKey.length !== 33 || (viewingPublicKey[0] !== 2 && viewingPublicKey[0] !== 3))\n throw new Error(\"invalid compressed viewing public key\");\n secp256k1.ProjectivePoint.fromHex(viewingPublicKey).assertValidity();\n if (clueKey.length !== 32) throw new Error(\"invalid clue key length\");\n validateClueKey(clueKey);\n return { viewingPublicKey, clueKey };\n}\n\n/** Copy and validate both public key snapshots without exporting any spending material. */\nexport function normalizeCreditDeliveryState(state: CreditDeliveryState): CreditDeliveryState {\n if (!state || typeof state !== \"object\" || !state.note || typeof state.note !== \"object\")\n throw new TypeError(\"complete Credit delivery state required\");\n const allowed = [\n \"chainId\",\n \"protocolAddress\",\n \"tokenAddress\",\n \"spenderWalletIdentity\",\n \"ownerWalletIdentity\",\n \"revocationShard\",\n \"revocationSlot\",\n \"nonce\",\n \"expiry\",\n \"creditSharedKey\",\n \"singleLimit\",\n \"dailyLimit\",\n \"monthlyLimit\",\n \"availableCredit\",\n \"unlimited\",\n \"lastDay\",\n \"dailySpent\",\n \"lastMonth\",\n \"monthlySpent\",\n \"totalSpent\",\n \"payload\",\n ];\n if (Object.keys(state.note).some((k) => !allowed.includes(k)))\n throw Error(\"Unsupported Credit fields\");\n const note = normalizeCreditState(structuredClone(state.note));\n return {\n note: {\n ...note,\n ...normalizeCreditPolicy(note),\n },\n ownerReceivingKeys: receivingKeys(state.ownerReceivingKeys),\n spenderReceivingKeys: receivingKeys(state.spenderReceivingKeys),\n };\n}\n\n/** Length-delimited application bytes are opaque to the fixed note decoder. */\nfunction encodePayload(value?: Uint8Array): Uint8Array {\n if (value !== undefined && !(value instanceof Uint8Array))\n throw new TypeError(\"payload must be Uint8Array\");\n const payload = value ?? new Uint8Array();\n if (payload.length > 65535) throw new RangeError(\"payload length exceeds uint16\");\n return concat(encode(BigInt(payload.length), 2), payload);\n}\nfunction readPayload(plain: Uint8Array, offset: number): Uint8Array {\n if (plain.length < offset + 2) throw new Error(\"missing payload length\");\n const length = Number(decode(plain.slice(offset, offset + 2)));\n if (plain.length !== offset + 2 + length) throw new Error(\"invalid payload length\");\n return Uint8Array.from(plain.subarray(offset + 2));\n}\nexport const fundsEnvelopeV1 = {\n kind: \"funds\" as const,\n version: 1,\n minimum: 160,\n maximum: 4096,\n encode(note: import(\"../types\").Note) {\n return concat(\n encode(BigInt(note.ownerAddress)),\n encode(note.amount, 16),\n encode(note.nonce),\n encodePayload(note.payload)\n );\n },\n decode(plain: Uint8Array, context: import(\"./encryption\").NoteDecryptionContext) {\n return {\n chainId: context.chainId,\n protocolAddress: context.protocolAddress,\n tokenAddress: context.tokenAddress,\n ownerAddress: hexField(decode(plain.slice(0, 32))),\n amount: decode(plain.slice(32, 48)),\n nonce: decode(plain.slice(48, 80)),\n payload: readPayload(plain, 80),\n };\n },\n};\nconst creditWireFields = [\n [\"spenderWalletIdentity\", 32],\n [\"ownerWalletIdentity\", 32],\n [\"revocationShard\", 8],\n [\"revocationSlot\", 2],\n [\"nonce\", 32],\n [\"expiry\", 8],\n [\"creditSharedKey\", 32],\n [\"singleLimit\", 16],\n [\"dailyLimit\", 16],\n [\"monthlyLimit\", 16],\n [\"availableCredit\", 16],\n [\"unlimited\", 1],\n [\"lastDay\", 8],\n [\"dailySpent\", 16],\n [\"lastMonth\", 8],\n [\"monthlySpent\", 16],\n [\"totalSpent\", 16],\n] as const;\nexport const creditEnvelopeV2 = {\n kind: \"credit\" as const,\n version: 2,\n minimum: 485,\n maximum: 4096,\n encode(input: CreditDeliveryState) {\n const state = normalizeCreditDeliveryState(input);\n return concat(\n ...creditWireFields.map(([k, size]) => encode(BigInt(state.note[k]!), size)),\n state.ownerReceivingKeys.viewingPublicKey,\n state.ownerReceivingKeys.clueKey,\n state.spenderReceivingKeys.viewingPublicKey,\n state.spenderReceivingKeys.clueKey,\n encodePayload(state.note.payload)\n );\n },\n decode(plain: Uint8Array, context: import(\"./encryption\").CreditStateDecryptionContext) {\n let offset = 0;\n const note: Record<string, unknown> = {\n chainId: context.chainId,\n protocolAddress: context.protocolAddress,\n tokenAddress: context.tokenAddress,\n };\n for (const [k, size] of creditWireFields) {\n const n = decode(plain.slice(offset, offset + size));\n if (k === \"unlimited\" && n !== 0n && n !== 1n)\n throw Error(\"invalid Credit unlimited byte\");\n note[k] = k === \"unlimited\" ? n === 1n : k.endsWith(\"Identity\") ? hexField(n) : n;\n offset += size;\n }\n const keys = () => {\n const k = {\n viewingPublicKey: plain.slice(offset, offset + 33),\n clueKey: plain.slice(offset + 33, offset + 65),\n };\n offset += 65;\n return k;\n };\n const ownerReceivingKeys = keys(),\n spenderReceivingKeys = keys();\n note.payload = readPayload(plain, offset);\n return normalizeCreditDeliveryState({\n note: note as unknown as import(\"../types\").CreditState,\n ownerReceivingKeys,\n spenderReceivingKeys,\n });\n },\n};\n","import { 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","/** 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":";;;;;AACO,IAAM,UAAU;AAChB,IAAM,SAAS;AACf,IAAM,SAAS;AACf,IAAM,WAAW;AACjB,IAAM,UAAU;AAChB,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;AAC1B,IAAM,uBAAuB;AAE7B,IAAM,aAAa;;;ACPnB,IAAM,gBACT;AAEJ,SAAS,YAAY,SAA0B;AAC3C,QAAMA,SAAQ,IAAI,WAAW,EAAE;AAC/B,aAAS;AACL,WAAO,gBAAgBA,MAAK;AAC5B,UAAM,YAAY;AAAA,MACd,OAAO,MAAM,KAAKA,QAAO,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAAA,IAC5E;AACA,QAAI,YAAY,kBAAkB,CAAC,WAAW,cAAc,IAAK,QAAO;AAAA,EAC5E;AACJ;AAGO,SAAS,gBAAwB;AACpC,SAAO,YAAY,KAAK;AAC5B;AAGO,SAAS,0BAAkC;AAC9C,SAAO,YAAY,IAAI;AAC3B;;;ACxBO,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,MA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","names":["bytes","creditCommitment","uint","viewingPublicKey","secp256k1","concat","uint","field","encode","uint","field","concat","encode","secp256k1"]}
@@ -2,7 +2,7 @@ import {
2
2
  D_NULL,
3
3
  FIELD_MODULUS,
4
4
  poseidonHash
5
- } from "./chunk-PRUUPDVD.js";
5
+ } from "./chunk-QAC5T4S5.js";
6
6
 
7
7
  // src/notes/nullifier.ts
8
8
  async function computeNoteNullifier(chainId, protocolAddress, nonce, commitment) {
@@ -18,4 +18,4 @@ async function computeNoteNullifier(chainId, protocolAddress, nonce, commitment)
18
18
  export {
19
19
  computeNoteNullifier
20
20
  };
21
- //# sourceMappingURL=chunk-TJYV6KTQ.js.map
21
+ //# sourceMappingURL=chunk-XM4B6K37.js.map
package/dist/credit.cjs CHANGED
@@ -835,6 +835,14 @@ function validateDeliveryCiphertext(value, kind) {
835
835
  return data;
836
836
  }
837
837
 
838
+ // src/delivery/errors.ts
839
+ var DeliveryAuthenticationError = class extends Error {
840
+ constructor(cause) {
841
+ super("delivery authentication failed", { cause });
842
+ this.name = "DeliveryAuthenticationError";
843
+ }
844
+ };
845
+
838
846
  // src/delivery/envelope.ts
839
847
  var import_secp256k12 = require("@noble/curves/secp256k1");
840
848
 
@@ -1003,7 +1011,11 @@ async function open(key, envelope, context, headerByte, role, payloadKey = false
1003
1011
  },
1004
1012
  aes,
1005
1013
  buffer(data.slice(62))
1006
- );
1014
+ ).catch((error) => {
1015
+ if (error instanceof Error && error.name === "OperationError")
1016
+ throw new DeliveryAuthenticationError(error);
1017
+ throw error;
1018
+ });
1007
1019
  return new Uint8Array(decrypted);
1008
1020
  } finally {
1009
1021
  localKey.fill(0);