@permissionless-technologies/upp-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +194 -0
  3. package/dist/asp-TXSAFFD3.cjs +53 -0
  4. package/dist/asp-TXSAFFD3.cjs.map +1 -0
  5. package/dist/asp-ZA3RGN7G.js +4 -0
  6. package/dist/asp-ZA3RGN7G.js.map +1 -0
  7. package/dist/babyjubjub-2MGQVCKB.js +5 -0
  8. package/dist/babyjubjub-2MGQVCKB.js.map +1 -0
  9. package/dist/babyjubjub-MWZLJOVZ.cjs +66 -0
  10. package/dist/babyjubjub-MWZLJOVZ.cjs.map +1 -0
  11. package/dist/chunk-2JQISXBD.js +150 -0
  12. package/dist/chunk-2JQISXBD.js.map +1 -0
  13. package/dist/chunk-3HQ7A6ZM.cjs +61 -0
  14. package/dist/chunk-3HQ7A6ZM.cjs.map +1 -0
  15. package/dist/chunk-5AKBSMEQ.cjs +1008 -0
  16. package/dist/chunk-5AKBSMEQ.cjs.map +1 -0
  17. package/dist/chunk-5V5HSN6Y.js +81 -0
  18. package/dist/chunk-5V5HSN6Y.js.map +1 -0
  19. package/dist/chunk-BH24DZ5S.cjs +91 -0
  20. package/dist/chunk-BH24DZ5S.cjs.map +1 -0
  21. package/dist/chunk-C7QQOJ7T.cjs +67 -0
  22. package/dist/chunk-C7QQOJ7T.cjs.map +1 -0
  23. package/dist/chunk-ERQE57IA.cjs +404 -0
  24. package/dist/chunk-ERQE57IA.cjs.map +1 -0
  25. package/dist/chunk-EUP7MBAH.cjs +165 -0
  26. package/dist/chunk-EUP7MBAH.cjs.map +1 -0
  27. package/dist/chunk-G7VZBCD6.cjs +35 -0
  28. package/dist/chunk-G7VZBCD6.cjs.map +1 -0
  29. package/dist/chunk-GQV47S3N.cjs +10 -0
  30. package/dist/chunk-GQV47S3N.cjs.map +1 -0
  31. package/dist/chunk-GXZ3MTCQ.cjs +527 -0
  32. package/dist/chunk-GXZ3MTCQ.cjs.map +1 -0
  33. package/dist/chunk-JWNXBALH.cjs +57 -0
  34. package/dist/chunk-JWNXBALH.cjs.map +1 -0
  35. package/dist/chunk-KIKBPJXJ.cjs +348 -0
  36. package/dist/chunk-KIKBPJXJ.cjs.map +1 -0
  37. package/dist/chunk-NCW4AE7L.js +8 -0
  38. package/dist/chunk-NCW4AE7L.js.map +1 -0
  39. package/dist/chunk-NDM5EJEV.cjs +70 -0
  40. package/dist/chunk-NDM5EJEV.cjs.map +1 -0
  41. package/dist/chunk-NUIQHTSA.js +489 -0
  42. package/dist/chunk-NUIQHTSA.js.map +1 -0
  43. package/dist/chunk-OQDSHMXU.js +1002 -0
  44. package/dist/chunk-OQDSHMXU.js.map +1 -0
  45. package/dist/chunk-P37MRZ73.js +58 -0
  46. package/dist/chunk-P37MRZ73.js.map +1 -0
  47. package/dist/chunk-PWHOUQOZ.js +335 -0
  48. package/dist/chunk-PWHOUQOZ.js.map +1 -0
  49. package/dist/chunk-S4B7GYLN.js +112 -0
  50. package/dist/chunk-S4B7GYLN.js.map +1 -0
  51. package/dist/chunk-SGZZL5AC.js +59 -0
  52. package/dist/chunk-SGZZL5AC.js.map +1 -0
  53. package/dist/chunk-SQKBT2SH.cjs +122 -0
  54. package/dist/chunk-SQKBT2SH.cjs.map +1 -0
  55. package/dist/chunk-TSF6HEVS.cjs +201 -0
  56. package/dist/chunk-TSF6HEVS.cjs.map +1 -0
  57. package/dist/chunk-V23OSL25.js +48 -0
  58. package/dist/chunk-V23OSL25.js.map +1 -0
  59. package/dist/chunk-W77GRBO4.js +53 -0
  60. package/dist/chunk-W77GRBO4.js.map +1 -0
  61. package/dist/chunk-XV72HNHN.js +399 -0
  62. package/dist/chunk-XV72HNHN.js.map +1 -0
  63. package/dist/chunk-YOWDERVC.js +186 -0
  64. package/dist/chunk-YOWDERVC.js.map +1 -0
  65. package/dist/chunk-Z6ZWNWWR.js +30 -0
  66. package/dist/chunk-Z6ZWNWWR.js.map +1 -0
  67. package/dist/chunk-ZKZV6OI3.cjs +165 -0
  68. package/dist/chunk-ZKZV6OI3.cjs.map +1 -0
  69. package/dist/chunk-ZU6J7KMY.js +159 -0
  70. package/dist/chunk-ZU6J7KMY.js.map +1 -0
  71. package/dist/core/index.cjs +300 -0
  72. package/dist/core/index.cjs.map +1 -0
  73. package/dist/core/index.d.cts +9 -0
  74. package/dist/core/index.d.ts +9 -0
  75. package/dist/core/index.js +11 -0
  76. package/dist/core/index.js.map +1 -0
  77. package/dist/index-BBzvvrhG.d.ts +757 -0
  78. package/dist/index-BGvapsJy.d.cts +2811 -0
  79. package/dist/index-C-jSNw6j.d.cts +757 -0
  80. package/dist/index-ChGaGPzP.d.ts +2811 -0
  81. package/dist/index.cjs +3652 -0
  82. package/dist/index.cjs.map +1 -0
  83. package/dist/index.d.cts +12 -0
  84. package/dist/index.d.ts +12 -0
  85. package/dist/index.js +3112 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/indexer/index.cjs +58 -0
  88. package/dist/indexer/index.cjs.map +1 -0
  89. package/dist/indexer/index.d.cts +206 -0
  90. package/dist/indexer/index.d.ts +206 -0
  91. package/dist/indexer/index.js +5 -0
  92. package/dist/indexer/index.js.map +1 -0
  93. package/dist/keccak-m31-B_AqBbRF.d.cts +70 -0
  94. package/dist/keccak-m31-B_AqBbRF.d.ts +70 -0
  95. package/dist/keys/index.cjs +68 -0
  96. package/dist/keys/index.cjs.map +1 -0
  97. package/dist/keys/index.d.cts +158 -0
  98. package/dist/keys/index.d.ts +158 -0
  99. package/dist/keys/index.js +7 -0
  100. package/dist/keys/index.js.map +1 -0
  101. package/dist/merkle-7KS2EHRF.js +5 -0
  102. package/dist/merkle-7KS2EHRF.js.map +1 -0
  103. package/dist/merkle-HGDC6OB4.cjs +30 -0
  104. package/dist/merkle-HGDC6OB4.cjs.map +1 -0
  105. package/dist/merkle-mteVOlDf.d.cts +188 -0
  106. package/dist/merkle-mteVOlDf.d.ts +188 -0
  107. package/dist/poseidon-UHTJLWQM.js +7 -0
  108. package/dist/poseidon-UHTJLWQM.js.map +1 -0
  109. package/dist/poseidon-WHJSZSNP.cjs +45 -0
  110. package/dist/poseidon-WHJSZSNP.cjs.map +1 -0
  111. package/dist/proof-5OECB3RQ.cjs +45 -0
  112. package/dist/proof-5OECB3RQ.cjs.map +1 -0
  113. package/dist/proof-C4YBP6RY.js +4 -0
  114. package/dist/proof-C4YBP6RY.js.map +1 -0
  115. package/dist/react/index.cjs +2641 -0
  116. package/dist/react/index.cjs.map +1 -0
  117. package/dist/react/index.d.cts +757 -0
  118. package/dist/react/index.d.ts +757 -0
  119. package/dist/react/index.js +2598 -0
  120. package/dist/react/index.js.map +1 -0
  121. package/dist/transfer-2UDHDS7Q.cjs +37 -0
  122. package/dist/transfer-2UDHDS7Q.cjs.map +1 -0
  123. package/dist/transfer-BlmbO-Rd.d.ts +1270 -0
  124. package/dist/transfer-DKZuJnRM.d.cts +1270 -0
  125. package/dist/transfer-KTCXKHS4.js +8 -0
  126. package/dist/transfer-KTCXKHS4.js.map +1 -0
  127. package/dist/types-CJSbxv4q.d.cts +143 -0
  128. package/dist/types-mLybMxNR.d.ts +143 -0
  129. package/dist/utils/index.cjs +178 -0
  130. package/dist/utils/index.cjs.map +1 -0
  131. package/dist/utils/index.d.cts +88 -0
  132. package/dist/utils/index.d.ts +88 -0
  133. package/dist/utils/index.js +9 -0
  134. package/dist/utils/index.js.map +1 -0
  135. package/package.json +119 -0
  136. package/src/contracts/interfaces/IASPRegistry.sol +36 -0
  137. package/src/contracts/interfaces/IUniversalPrivatePool.sol +260 -0
  138. package/src/contracts/interfaces/IVerifiers.sol +68 -0
  139. package/src/deployments/11155111.json +19 -0
  140. package/src/deployments/31337.json +19 -0
@@ -0,0 +1,201 @@
1
+ 'use strict';
2
+
3
+ var chunkJWNXBALH_cjs = require('./chunk-JWNXBALH.cjs');
4
+
5
+ // src/utils/babyjubjub.ts
6
+ chunkJWNXBALH_cjs.init_poseidon();
7
+ var babyjubInstance = null;
8
+ async function initBabyJub() {
9
+ if (babyjubInstance === null) {
10
+ const { buildBabyjub } = await import('circomlibjs');
11
+ babyjubInstance = await buildBabyjub();
12
+ }
13
+ return babyjubInstance;
14
+ }
15
+ async function getSubOrder() {
16
+ const babyjub = await initBabyJub();
17
+ return babyjub.subOrder;
18
+ }
19
+ async function getBasePoint() {
20
+ const babyjub = await initBabyJub();
21
+ return {
22
+ x: babyjub.F.toObject(babyjub.Base8[0]),
23
+ y: babyjub.F.toObject(babyjub.Base8[1])
24
+ };
25
+ }
26
+ async function isOnCurve(point) {
27
+ const babyjub = await initBabyJub();
28
+ const internal = [babyjub.F.e(point.x), babyjub.F.e(point.y)];
29
+ return babyjub.inCurve(internal);
30
+ }
31
+ async function mulPointScalar(point, scalar) {
32
+ const babyjub = await initBabyJub();
33
+ const internal = [babyjub.F.e(point.x), babyjub.F.e(point.y)];
34
+ const result = babyjub.mulPointEscalar(internal, scalar);
35
+ return {
36
+ x: babyjub.F.toObject(result[0]),
37
+ y: babyjub.F.toObject(result[1])
38
+ };
39
+ }
40
+ async function addPoints(p1, p2) {
41
+ const babyjub = await initBabyJub();
42
+ const internal1 = [babyjub.F.e(p1.x), babyjub.F.e(p1.y)];
43
+ const internal2 = [babyjub.F.e(p2.x), babyjub.F.e(p2.y)];
44
+ const result = babyjub.addPoint(internal1, internal2);
45
+ return {
46
+ x: babyjub.F.toObject(result[0]),
47
+ y: babyjub.F.toObject(result[1])
48
+ };
49
+ }
50
+ async function privateToPublic(privateKey) {
51
+ const babyjub = await initBabyJub();
52
+ const scalar = privateKey % babyjub.subOrder;
53
+ const result = babyjub.mulPointEscalar(babyjub.Base8, scalar);
54
+ return {
55
+ x: babyjub.F.toObject(result[0]),
56
+ y: babyjub.F.toObject(result[1])
57
+ };
58
+ }
59
+ async function computeSharedSecret(myPrivateKey, theirPublicKey) {
60
+ return mulPointScalar(theirPublicKey, myPrivateKey);
61
+ }
62
+ function packPoint(point) {
63
+ const ySign = point.y % 2n;
64
+ return point.x | ySign << 254n;
65
+ }
66
+ function pointToTuple(point) {
67
+ return [point.x, point.y];
68
+ }
69
+ function tupleToPoint(tuple) {
70
+ return { x: tuple[0], y: tuple[1] };
71
+ }
72
+ var BABYJUBJUB_A = 168700n;
73
+ var BABYJUBJUB_D = 168696n;
74
+ var BABYJUBJUB_P = 21888242871839275222246405745257275088548364400416034343698204186575808495617n;
75
+ function modPow(base, exp, p) {
76
+ let result = 1n;
77
+ base = (base % p + p) % p;
78
+ while (exp > 0n) {
79
+ if (exp % 2n === 1n) {
80
+ result = result * base % p;
81
+ }
82
+ exp = exp / 2n;
83
+ base = base * base % p;
84
+ }
85
+ return result;
86
+ }
87
+ function modInverse(a, p) {
88
+ return modPow(a, p - 2n, p);
89
+ }
90
+ function modSqrt(n, p) {
91
+ n = (n % p + p) % p;
92
+ if (n === 0n) return 0n;
93
+ if (modPow(n, (p - 1n) / 2n, p) !== 1n) {
94
+ return null;
95
+ }
96
+ let q = p - 1n;
97
+ let s = 0n;
98
+ while (q % 2n === 0n) {
99
+ q = q / 2n;
100
+ s++;
101
+ }
102
+ let z = 2n;
103
+ while (modPow(z, (p - 1n) / 2n, p) !== p - 1n) {
104
+ z++;
105
+ }
106
+ let m = s;
107
+ let c = modPow(z, q, p);
108
+ let t = modPow(n, q, p);
109
+ let r = modPow(n, (q + 1n) / 2n, p);
110
+ while (true) {
111
+ if (t === 1n) return r;
112
+ let i = 1n;
113
+ let temp = t * t % p;
114
+ while (temp !== 1n) {
115
+ temp = temp * temp % p;
116
+ i++;
117
+ }
118
+ const b = modPow(c, modPow(2n, m - i - 1n, p - 1n), p);
119
+ m = i;
120
+ c = b * b % p;
121
+ t = t * c % p;
122
+ r = r * b % p;
123
+ }
124
+ }
125
+ async function reconstructPointFromX(x) {
126
+ const p = BABYJUBJUB_P;
127
+ x = (x % p + p) % p;
128
+ const x2 = x * x % p;
129
+ const numerator = ((1n - BABYJUBJUB_A * x2) % p + p) % p;
130
+ const denominator = ((1n - BABYJUBJUB_D * x2) % p + p) % p;
131
+ if (denominator === 0n) {
132
+ return null;
133
+ }
134
+ const y2 = numerator * modInverse(denominator, p) % p;
135
+ const y = modSqrt(y2, p);
136
+ if (y === null) {
137
+ return null;
138
+ }
139
+ const yAlt = p - y;
140
+ const yCanonical = y < yAlt ? y : yAlt;
141
+ const point = { x, y: yCanonical };
142
+ if (!await isOnCurve(point)) {
143
+ const pointAlt = { x, y: y < yAlt ? yAlt : y };
144
+ if (!await isOnCurve(pointAlt)) {
145
+ return null;
146
+ }
147
+ return pointAlt;
148
+ }
149
+ return point;
150
+ }
151
+ async function reconstructPointFromXWithParity(x, yParity) {
152
+ const p = BABYJUBJUB_P;
153
+ x = (x % p + p) % p;
154
+ const x2 = x * x % p;
155
+ const numerator = ((1n - BABYJUBJUB_A * x2) % p + p) % p;
156
+ const denominator = ((1n - BABYJUBJUB_D * x2) % p + p) % p;
157
+ if (denominator === 0n) return null;
158
+ const y2 = numerator * modInverse(denominator, p) % p;
159
+ const y = modSqrt(y2, p);
160
+ if (y === null) return null;
161
+ const actualParity = Number(y % 2n);
162
+ const finalY = actualParity === yParity ? y : p - y;
163
+ return { x, y: finalY };
164
+ }
165
+ async function deriveEncryptionViewingKey(masterViewingPubKey, nonce) {
166
+ const { poseidonScalar } = await import('./poseidon-WHJSZSNP.cjs');
167
+ const babyjub = await initBabyJub();
168
+ const scalar = await poseidonScalar([masterViewingPubKey.x, masterViewingPubKey.y, nonce]);
169
+ const offset = babyjub.mulPointEscalar(babyjub.Base8, scalar);
170
+ const mvkInternal = [
171
+ babyjub.F.e(masterViewingPubKey.x),
172
+ babyjub.F.e(masterViewingPubKey.y)
173
+ ];
174
+ const result = babyjub.addPoint(mvkInternal, offset);
175
+ return {
176
+ x: babyjub.F.toObject(result[0]),
177
+ y: babyjub.F.toObject(result[1])
178
+ };
179
+ }
180
+ async function deriveDecryptionViewingKey(masterViewingPrivKey, masterViewingPubKey, nonce) {
181
+ const { poseidonScalar } = await import('./poseidon-WHJSZSNP.cjs');
182
+ const scalar = await poseidonScalar([masterViewingPubKey.x, masterViewingPubKey.y, nonce]);
183
+ return (masterViewingPrivKey + scalar) % chunkJWNXBALH_cjs.BABYJUBJUB_SUBORDER;
184
+ }
185
+
186
+ exports.addPoints = addPoints;
187
+ exports.computeSharedSecret = computeSharedSecret;
188
+ exports.deriveDecryptionViewingKey = deriveDecryptionViewingKey;
189
+ exports.deriveEncryptionViewingKey = deriveEncryptionViewingKey;
190
+ exports.getBasePoint = getBasePoint;
191
+ exports.getSubOrder = getSubOrder;
192
+ exports.isOnCurve = isOnCurve;
193
+ exports.mulPointScalar = mulPointScalar;
194
+ exports.packPoint = packPoint;
195
+ exports.pointToTuple = pointToTuple;
196
+ exports.privateToPublic = privateToPublic;
197
+ exports.reconstructPointFromX = reconstructPointFromX;
198
+ exports.reconstructPointFromXWithParity = reconstructPointFromXWithParity;
199
+ exports.tupleToPoint = tupleToPoint;
200
+ //# sourceMappingURL=chunk-TSF6HEVS.cjs.map
201
+ //# sourceMappingURL=chunk-TSF6HEVS.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/babyjubjub.ts"],"names":["init_poseidon","BABYJUBJUB_SUBORDER"],"mappings":"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","file":"chunk-TSF6HEVS.cjs","sourcesContent":["/**\n * BabyJubJub Elliptic Curve Utilities\n *\n * Wrapper around circomlibjs BabyJubJub implementation.\n * Used for stealth addresses, key derivation, and ECDH.\n *\n * BabyJubJub is a twisted Edwards curve embedded in BN254's scalar field,\n * making it efficient for use in zk-SNARKs.\n */\n\nimport { BABYJUBJUB_SUBORDER } from './poseidon.js'\n\n/**\n * A point on the BabyJubJub curve\n */\nexport interface Point {\n x: bigint\n y: bigint\n}\n\n/**\n * Internal BabyJubJub field type from circomlibjs\n */\ntype BabyJubJubField = {\n e: (val: bigint) => unknown\n toObject: (val: unknown) => bigint\n}\n\n/**\n * BabyJubJub instance type from circomlibjs\n */\ntype BabyJubJub = {\n F: BabyJubJubField\n Base8: [unknown, unknown]\n subOrder: bigint\n mulPointEscalar: (p: [unknown, unknown], scalar: bigint) => [unknown, unknown]\n addPoint: (p1: [unknown, unknown], p2: [unknown, unknown]) => [unknown, unknown]\n inCurve: (p: [unknown, unknown]) => boolean\n}\n\n// Lazily initialized BabyJubJub instance\nlet babyjubInstance: BabyJubJub | null = null\n\n/**\n * Initialize BabyJubJub curve (lazy loading)\n */\nasync function initBabyJub(): Promise<BabyJubJub> {\n if (babyjubInstance === null) {\n const { buildBabyjub } = await import('circomlibjs')\n babyjubInstance = await buildBabyjub() as BabyJubJub\n }\n return babyjubInstance as BabyJubJub\n}\n\n/**\n * Get the BabyJubJub subgroup order\n */\nexport async function getSubOrder(): Promise<bigint> {\n const babyjub = await initBabyJub()\n return babyjub.subOrder\n}\n\n/**\n * Get the generator point (Base8)\n */\nexport async function getBasePoint(): Promise<Point> {\n const babyjub = await initBabyJub()\n return {\n x: babyjub.F.toObject(babyjub.Base8[0]),\n y: babyjub.F.toObject(babyjub.Base8[1]),\n }\n}\n\n/**\n * Check if a point is on the curve\n */\nexport async function isOnCurve(point: Point): Promise<boolean> {\n const babyjub = await initBabyJub()\n const internal = [babyjub.F.e(point.x), babyjub.F.e(point.y)] as [unknown, unknown]\n return babyjub.inCurve(internal)\n}\n\n/**\n * Scalar multiplication: point * scalar\n *\n * @param point - Point on the curve\n * @param scalar - Scalar value (mod subOrder)\n * @returns Resulting point\n */\nexport async function mulPointScalar(point: Point, scalar: bigint): Promise<Point> {\n const babyjub = await initBabyJub()\n\n // Convert to internal format\n const internal = [babyjub.F.e(point.x), babyjub.F.e(point.y)] as [unknown, unknown]\n\n // Perform scalar multiplication\n const result = babyjub.mulPointEscalar(internal, scalar)\n\n return {\n x: babyjub.F.toObject(result[0]),\n y: babyjub.F.toObject(result[1]),\n }\n}\n\n/**\n * Point addition: p1 + p2\n */\nexport async function addPoints(p1: Point, p2: Point): Promise<Point> {\n const babyjub = await initBabyJub()\n\n // Convert to internal format\n const internal1 = [babyjub.F.e(p1.x), babyjub.F.e(p1.y)] as [unknown, unknown]\n const internal2 = [babyjub.F.e(p2.x), babyjub.F.e(p2.y)] as [unknown, unknown]\n\n // Add points\n const result = babyjub.addPoint(internal1, internal2)\n\n return {\n x: babyjub.F.toObject(result[0]),\n y: babyjub.F.toObject(result[1]),\n }\n}\n\n/**\n * Generate public key from private key\n * pubKey = privateKey * Base8\n *\n * @param privateKey - Private key scalar (must be < subOrder)\n * @returns Public key point\n */\nexport async function privateToPublic(privateKey: bigint): Promise<Point> {\n const babyjub = await initBabyJub()\n\n // Ensure private key is in valid range\n const scalar = privateKey % babyjub.subOrder\n\n // pubKey = scalar * Base8\n const result = babyjub.mulPointEscalar(babyjub.Base8, scalar)\n\n return {\n x: babyjub.F.toObject(result[0]),\n y: babyjub.F.toObject(result[1]),\n }\n}\n\n/**\n * Compute ECDH shared secret\n * sharedSecret = myPrivateKey * theirPublicKey\n *\n * @param myPrivateKey - Your private key\n * @param theirPublicKey - Their public key\n * @returns Shared secret point\n */\nexport async function computeSharedSecret(\n myPrivateKey: bigint,\n theirPublicKey: Point\n): Promise<Point> {\n return mulPointScalar(theirPublicKey, myPrivateKey)\n}\n\n/**\n * Pack a point into a single bigint (compressed form)\n * Uses the x-coordinate and a sign bit for y\n */\nexport function packPoint(point: Point): bigint {\n // Use x-coordinate with y sign bit in high position\n const ySign = point.y % 2n\n return point.x | (ySign << 254n)\n}\n\n/**\n * Convert a point to tuple format [x, y] for use with snarkjs\n */\nexport function pointToTuple(point: Point): [bigint, bigint] {\n return [point.x, point.y]\n}\n\n/**\n * Convert a tuple [x, y] to Point format\n */\nexport function tupleToPoint(tuple: [bigint, bigint]): Point {\n return { x: tuple[0], y: tuple[1] }\n}\n\n// BabyJubJub curve parameters\n// Curve: a*x² + y² = 1 + d*x²*y²\nconst BABYJUBJUB_A = 168700n\nconst BABYJUBJUB_D = 168696n\n// Field prime (BN254 scalar field)\nconst BABYJUBJUB_P = 21888242871839275222246405745257275088548364400416034343698204186575808495617n\n\n/**\n * Modular exponentiation: base^exp mod p\n */\nfunction modPow(base: bigint, exp: bigint, p: bigint): bigint {\n let result = 1n\n base = ((base % p) + p) % p\n while (exp > 0n) {\n if (exp % 2n === 1n) {\n result = (result * base) % p\n }\n exp = exp / 2n\n base = (base * base) % p\n }\n return result\n}\n\n/**\n * Modular inverse using Fermat's little theorem: a^(-1) = a^(p-2) mod p\n */\nfunction modInverse(a: bigint, p: bigint): bigint {\n return modPow(a, p - 2n, p)\n}\n\n/**\n * Tonelli-Shanks algorithm for modular square root\n * Returns sqrt(n) mod p, or null if no square root exists\n */\nfunction modSqrt(n: bigint, p: bigint): bigint | null {\n n = ((n % p) + p) % p\n if (n === 0n) return 0n\n\n // Check if n is a quadratic residue (Euler's criterion)\n if (modPow(n, (p - 1n) / 2n, p) !== 1n) {\n return null // No square root exists\n }\n\n // For p ≡ 3 (mod 4), sqrt(n) = n^((p+1)/4) mod p\n // BN254 scalar field: p ≡ 1 (mod 4), so we need Tonelli-Shanks\n\n // Factor out powers of 2 from p - 1\n let q = p - 1n\n let s = 0n\n while (q % 2n === 0n) {\n q = q / 2n\n s++\n }\n\n // Find a quadratic non-residue\n let z = 2n\n while (modPow(z, (p - 1n) / 2n, p) !== p - 1n) {\n z++\n }\n\n let m = s\n let c = modPow(z, q, p)\n let t = modPow(n, q, p)\n let r = modPow(n, (q + 1n) / 2n, p)\n\n while (true) {\n if (t === 1n) return r\n\n // Find the least i such that t^(2^i) = 1\n let i = 1n\n let temp = (t * t) % p\n while (temp !== 1n) {\n temp = (temp * temp) % p\n i++\n }\n\n // Update values\n const b = modPow(c, modPow(2n, m - i - 1n, p - 1n), p)\n m = i\n c = (b * b) % p\n t = (t * c) % p\n r = (r * b) % p\n }\n}\n\n/**\n * Reconstruct a BabyJubJub point from its x-coordinate\n *\n * BabyJubJub curve equation: a*x² + y² = 1 + d*x²*y²\n * Solving for y²: y² = (1 - a*x²) / (1 - d*x²)\n *\n * Returns the point with the smaller y value (canonical form),\n * or null if x is not on the curve.\n *\n * @param x - The x-coordinate\n * @returns Point with the given x, or null if invalid\n */\nexport async function reconstructPointFromX(x: bigint): Promise<Point | null> {\n const p = BABYJUBJUB_P\n x = ((x % p) + p) % p\n\n // Compute x²\n const x2 = (x * x) % p\n\n // Compute numerator: 1 - a*x²\n const numerator = ((1n - BABYJUBJUB_A * x2) % p + p) % p\n\n // Compute denominator: 1 - d*x²\n const denominator = ((1n - BABYJUBJUB_D * x2) % p + p) % p\n\n if (denominator === 0n) {\n return null // Division by zero\n }\n\n // Compute y² = numerator / denominator\n const y2 = (numerator * modInverse(denominator, p)) % p\n\n // Compute y = sqrt(y²)\n const y = modSqrt(y2, p)\n if (y === null) {\n return null // x is not on the curve\n }\n\n // Return the point with smaller y (canonical form)\n const yAlt = p - y\n const yCanonical = y < yAlt ? y : yAlt\n\n const point = { x, y: yCanonical }\n\n // Verify the point is actually on the curve\n if (!(await isOnCurve(point))) {\n // Try the other y\n const pointAlt = { x, y: y < yAlt ? yAlt : y }\n if (!(await isOnCurve(pointAlt))) {\n return null\n }\n return pointAlt\n }\n\n return point\n}\n\n/**\n * Reconstruct a BabyJubJub point from x-coordinate and y parity bit\n *\n * @param x - The x-coordinate\n * @param yParity - 0 for even y, 1 for odd y\n * @returns Point with matching parity, or null if invalid\n */\nexport async function reconstructPointFromXWithParity(\n x: bigint,\n yParity: 0 | 1\n): Promise<Point | null> {\n const p = BABYJUBJUB_P\n x = ((x % p) + p) % p\n\n const x2 = (x * x) % p\n const numerator = ((1n - BABYJUBJUB_A * x2) % p + p) % p\n const denominator = ((1n - BABYJUBJUB_D * x2) % p + p) % p\n\n if (denominator === 0n) return null\n\n const y2 = (numerator * modInverse(denominator, p)) % p\n const y = modSqrt(y2, p)\n if (y === null) return null\n\n // Select y based on parity\n const actualParity = Number(y % 2n)\n const finalY = actualParity === yParity ? y : p - y\n\n return { x, y: finalY }\n}\n\n/**\n * Derive a per-transaction viewing public key (EVK)\n *\n * EVK = MVK_pub + Poseidon(MVK_pub.x, MVK_pub.y, nonce) * Base8\n *\n * This allows the sender to derive a unique encryption key for each transaction\n * without knowing the recipient's private key.\n *\n * @param masterViewingPubKey - Recipient's master viewing public key\n * @param nonce - Unique per-note nonce (R.x — ephemeral public key x-coordinate)\n * @returns Per-transaction encryption viewing key\n */\nexport async function deriveEncryptionViewingKey(\n masterViewingPubKey: Point,\n nonce: bigint\n): Promise<Point> {\n // Import poseidonScalar to avoid circular dependency\n const { poseidonScalar } = await import('./poseidon.js')\n\n const babyjub = await initBabyJub()\n\n // Compute scalar: Poseidon(MVK_pub.x, MVK_pub.y, nonce) mod subOrder\n const scalar = await poseidonScalar([masterViewingPubKey.x, masterViewingPubKey.y, nonce])\n\n // Compute offset: scalar * Base8\n const offset = babyjub.mulPointEscalar(babyjub.Base8, scalar)\n\n // Convert MVK_pub to internal format\n const mvkInternal = [\n babyjub.F.e(masterViewingPubKey.x),\n babyjub.F.e(masterViewingPubKey.y),\n ] as [unknown, unknown]\n\n // EVK = MVK_pub + offset\n const result = babyjub.addPoint(mvkInternal, offset)\n\n return {\n x: babyjub.F.toObject(result[0]),\n y: babyjub.F.toObject(result[1]),\n }\n}\n\n/**\n * Derive a per-transaction viewing private key (DVK)\n *\n * DVK = MVK_priv + Poseidon(MVK_pub.x, MVK_pub.y, nonce)\n *\n * Only the owner with MVK_priv can compute this.\n * DVK can be shared with auditors to decrypt specific transactions.\n *\n * @param masterViewingPrivKey - Owner's master viewing private key\n * @param masterViewingPubKey - Owner's master viewing public key\n * @param nonce - Unique per-note nonce (R.x — ephemeral public key x-coordinate)\n * @returns Per-transaction decryption viewing key\n */\nexport async function deriveDecryptionViewingKey(\n masterViewingPrivKey: bigint,\n masterViewingPubKey: Point,\n nonce: bigint\n): Promise<bigint> {\n // Import poseidonScalar to avoid circular dependency\n const { poseidonScalar } = await import('./poseidon.js')\n\n // Compute scalar: Poseidon(MVK_pub.x, MVK_pub.y, nonce) mod subOrder\n const scalar = await poseidonScalar([masterViewingPubKey.x, masterViewingPubKey.y, nonce])\n\n // DVK = MVK_priv + scalar (mod subOrder)\n return (masterViewingPrivKey + scalar) % BABYJUBJUB_SUBORDER\n}\n\n"]}
@@ -0,0 +1,48 @@
1
+ import { __esm } from './chunk-Z6ZWNWWR.js';
2
+
3
+ // src/utils/poseidon.ts
4
+ async function initPoseidon() {
5
+ if (!poseidonInstance) {
6
+ const { buildPoseidon } = await import('circomlibjs');
7
+ poseidonInstance = await buildPoseidon();
8
+ }
9
+ return poseidonInstance;
10
+ }
11
+ async function poseidon(inputs) {
12
+ const poseidonFn = await initPoseidon();
13
+ const hash = poseidonFn(inputs);
14
+ return poseidonFn.F.toObject(hash);
15
+ }
16
+ async function poseidonHash(inputs) {
17
+ const hash = await poseidon(inputs);
18
+ return `0x${hash.toString(16).padStart(64, "0")}`;
19
+ }
20
+ async function poseidonScalar(inputs) {
21
+ const hash = await poseidon(inputs);
22
+ return hash % BABYJUBJUB_SUBORDER;
23
+ }
24
+ function addressToField(address) {
25
+ return BigInt(address);
26
+ }
27
+ function fieldToAddress(field) {
28
+ const masked = field & (1n << 160n) - 1n;
29
+ return `0x${masked.toString(16).padStart(40, "0")}`;
30
+ }
31
+ function isValidFieldElement(value) {
32
+ return value >= 0n && value < FIELD_PRIME;
33
+ }
34
+ function toFieldElement(value) {
35
+ return (value % FIELD_PRIME + FIELD_PRIME) % FIELD_PRIME;
36
+ }
37
+ var poseidonInstance, FIELD_PRIME, BABYJUBJUB_SUBORDER;
38
+ var init_poseidon = __esm({
39
+ "src/utils/poseidon.ts"() {
40
+ poseidonInstance = null;
41
+ FIELD_PRIME = 21888242871839275222246405745257275088548364400416034343698204186575808495617n;
42
+ BABYJUBJUB_SUBORDER = 2736030358979909402780800718157159386076813972158567259200215660948447373041n;
43
+ }
44
+ });
45
+
46
+ export { BABYJUBJUB_SUBORDER, FIELD_PRIME, addressToField, fieldToAddress, init_poseidon, isValidFieldElement, poseidon, poseidonHash, poseidonScalar, toFieldElement };
47
+ //# sourceMappingURL=chunk-V23OSL25.js.map
48
+ //# sourceMappingURL=chunk-V23OSL25.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/poseidon.ts"],"names":[],"mappings":";;;AAgCA,eAAe,YAAA,GAAoC;AACjD,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,aAAa,CAAA;AACpD,IAAA,gBAAA,GAAmB,MAAM,aAAA,EAAc;AAAA,EACzC;AACA,EAAA,OAAO,gBAAA;AACT;AAaA,eAAsB,SAAS,MAAA,EAAmC;AAChE,EAAA,MAAM,UAAA,GAAa,MAAM,YAAA,EAAa;AACtC,EAAA,MAAM,IAAA,GAAO,WAAW,MAAM,CAAA;AAC9B,EAAA,OAAO,UAAA,CAAW,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA;AACnC;AAKA,eAAsB,aAAa,MAAA,EAA0C;AAC3E,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,MAAM,CAAA;AAClC,EAAA,OAAO,CAAA,EAAA,EAAK,KAAK,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAC,CAAA,CAAA;AACjD;AAMA,eAAsB,eAAe,MAAA,EAAmC;AACtE,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,MAAM,CAAA;AAClC,EAAA,OAAO,IAAA,GAAO,mBAAA;AAChB;AAKO,SAAS,eAAe,OAAA,EAAgC;AAC7D,EAAA,OAAO,OAAO,OAAO,CAAA;AACvB;AAKO,SAAS,eAAe,KAAA,EAA8B;AAE3D,EAAA,MAAM,MAAA,GAAS,KAAA,GAAA,CAAU,EAAA,IAAM,IAAA,IAAQ,EAAA;AACvC,EAAA,OAAO,CAAA,EAAA,EAAK,OAAO,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAC,CAAA,CAAA;AACnD;AAKO,SAAS,oBAAoB,KAAA,EAAwB;AAC1D,EAAA,OAAO,KAAA,IAAS,MAAM,KAAA,GAAQ,WAAA;AAChC;AAKO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,OAAA,CAAS,KAAA,GAAQ,cAAe,WAAA,IAAe,WAAA;AACjD;AAtGA,IAiBI,kBAKS,WAAA,CAAA,CAKA;AA3Bb,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uBAAA,GAAA;AAiBA,IAAI,gBAAA,GAAsC,IAAA;AAKnC,IAAM,WAAA,GAAc,8EAAA;AAKpB,IAAM,mBAAA,GAAsB,6EAAA;AAAA,EAAA;AAAA,CAAA","file":"chunk-V23OSL25.js","sourcesContent":["/**\n * Poseidon Hash Utilities\n *\n * Wrapper around circomlibjs Poseidon hash implementation.\n * Used for commitments, nullifiers, and key derivation.\n */\n\n// circomlibjs types (not exported by the library)\ntype PoseidonFn = {\n (inputs: bigint[]): Uint8Array\n F: {\n toObject: (val: Uint8Array) => bigint\n e: (val: bigint) => unknown\n }\n}\n\n// Lazily initialized Poseidon instance\nlet poseidonInstance: PoseidonFn | null = null\n\n/**\n * BN254 field prime (same as used in Circom/snarkjs)\n */\nexport const FIELD_PRIME = 21888242871839275222246405745257275088548364400416034343698204186575808495617n\n\n/**\n * BabyJubJub subgroup order\n */\nexport const BABYJUBJUB_SUBORDER = 2736030358979909402780800718157159386076813972158567259200215660948447373041n\n\n/**\n * Initialize Poseidon hash function (lazy loading)\n */\nasync function initPoseidon(): Promise<PoseidonFn> {\n if (!poseidonInstance) {\n const { buildPoseidon } = await import('circomlibjs')\n poseidonInstance = await buildPoseidon()\n }\n return poseidonInstance\n}\n\n/**\n * Compute Poseidon hash of inputs\n *\n * @param inputs - Array of field elements to hash (up to 16 elements)\n * @returns Hash as bigint\n *\n * @example\n * ```ts\n * const commitment = await poseidon([amount, blinding, origin, token])\n * ```\n */\nexport async function poseidon(inputs: bigint[]): Promise<bigint> {\n const poseidonFn = await initPoseidon()\n const hash = poseidonFn(inputs)\n return poseidonFn.F.toObject(hash)\n}\n\n/**\n * Compute Poseidon hash and return as hex string\n */\nexport async function poseidonHash(inputs: bigint[]): Promise<`0x${string}`> {\n const hash = await poseidon(inputs)\n return `0x${hash.toString(16).padStart(64, '0')}`\n}\n\n/**\n * Compute Poseidon hash modulo BabyJubJub suborder\n * Used for deriving scalars for curve operations\n */\nexport async function poseidonScalar(inputs: bigint[]): Promise<bigint> {\n const hash = await poseidon(inputs)\n return hash % BABYJUBJUB_SUBORDER\n}\n\n/**\n * Convert an address to a field element\n */\nexport function addressToField(address: `0x${string}`): bigint {\n return BigInt(address)\n}\n\n/**\n * Convert a field element to an address (20 bytes)\n */\nexport function fieldToAddress(field: bigint): `0x${string}` {\n // Mask to 160 bits (20 bytes) for address\n const masked = field & ((1n << 160n) - 1n)\n return `0x${masked.toString(16).padStart(40, '0')}`\n}\n\n/**\n * Check if a value is within the field\n */\nexport function isValidFieldElement(value: bigint): boolean {\n return value >= 0n && value < FIELD_PRIME\n}\n\n/**\n * Reduce a value modulo field prime\n */\nexport function toFieldElement(value: bigint): bigint {\n return ((value % FIELD_PRIME) + FIELD_PRIME) % FIELD_PRIME\n}\n"]}
@@ -0,0 +1,53 @@
1
+ import { init_poseidon, FIELD_PRIME } from './chunk-V23OSL25.js';
2
+ import { __esm } from './chunk-Z6ZWNWWR.js';
3
+
4
+ // src/utils/crypto.ts
5
+ function randomBytes(length) {
6
+ const bytes = new Uint8Array(length);
7
+ crypto.getRandomValues(bytes);
8
+ return bytes;
9
+ }
10
+ function randomFieldElement() {
11
+ const bytes = randomBytes(32);
12
+ let value = 0n;
13
+ for (let i = 0; i < bytes.length; i++) {
14
+ value = (value << 8n) + BigInt(bytes[i]);
15
+ }
16
+ return value % FIELD_PRIME;
17
+ }
18
+ function bytesToHex(bytes) {
19
+ return `0x${Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("")}`;
20
+ }
21
+ function hexToBytes(hex) {
22
+ const str = hex.slice(2);
23
+ const bytes = new Uint8Array(str.length / 2);
24
+ for (let i = 0; i < bytes.length; i++) {
25
+ bytes[i] = parseInt(str.slice(i * 2, i * 2 + 2), 16);
26
+ }
27
+ return bytes;
28
+ }
29
+ function bigintToBytes(value, length) {
30
+ const bytes = new Uint8Array(length);
31
+ let temp = value;
32
+ for (let i = length - 1; i >= 0; i--) {
33
+ bytes[i] = Number(temp & 0xffn);
34
+ temp >>= 8n;
35
+ }
36
+ return bytes;
37
+ }
38
+ function bytesToBigint(bytes) {
39
+ let value = 0n;
40
+ for (let i = 0; i < bytes.length; i++) {
41
+ value = (value << 8n) + BigInt(bytes[i]);
42
+ }
43
+ return value;
44
+ }
45
+ var init_crypto = __esm({
46
+ "src/utils/crypto.ts"() {
47
+ init_poseidon();
48
+ }
49
+ });
50
+
51
+ export { bigintToBytes, bytesToBigint, bytesToHex, hexToBytes, init_crypto, randomBytes, randomFieldElement };
52
+ //# sourceMappingURL=chunk-W77GRBO4.js.map
53
+ //# sourceMappingURL=chunk-W77GRBO4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/crypto.ts"],"names":[],"mappings":";;;;AAWO,SAAS,YAAY,MAAA,EAA4B;AACtD,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAM,CAAA;AACnC,EAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAC5B,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,kBAAA,GAA6B;AAE3C,EAAA,MAAM,KAAA,GAAQ,YAAY,EAAE,CAAA;AAG5B,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,KAAA,GAAA,CAAS,KAAA,IAAS,EAAA,IAAM,MAAA,CAAO,KAAA,CAAM,CAAC,CAAE,CAAA;AAAA,EAC1C;AAGA,EAAA,OAAO,KAAA,GAAQ,WAAA;AACjB;AAKO,SAAS,WAAW,KAAA,EAAkC;AAC3D,EAAA,OAAO,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,CACzB,GAAA,CAAI,OAAK,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CACxC,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA;AACb;AAKO,SAAS,WAAW,GAAA,EAAgC;AACzD,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA;AACvB,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,GAAA,CAAI,SAAS,CAAC,CAAA;AAC3C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,aAAA,CAAc,OAAe,MAAA,EAA4B;AACvE,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAM,CAAA;AACnC,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACpC,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,IAAA,GAAO,KAAK,CAAA;AAC9B,IAAA,IAAA,KAAS,EAAA;AAAA,EACX;AACA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,cAAc,KAAA,EAA2B;AACvD,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,KAAA,GAAA,CAAS,KAAA,IAAS,EAAA,IAAM,MAAA,CAAO,KAAA,CAAM,CAAC,CAAE,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,KAAA;AACT;AA/EA,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qBAAA,GAAA;AAMA,IAAA,aAAA,EAAA;AAAA,EAAA;AAAA,CAAA","file":"chunk-W77GRBO4.js","sourcesContent":["/**\n * Cryptographic Utilities\n *\n * Secure random number generation and field arithmetic.\n */\n\nimport { FIELD_PRIME } from './poseidon.js'\n\n/**\n * Generate cryptographically secure random bytes\n */\nexport function randomBytes(length: number): Uint8Array {\n const bytes = new Uint8Array(length)\n crypto.getRandomValues(bytes)\n return bytes\n}\n\n/**\n * Generate a random field element (for blinding factors, etc.)\n *\n * Returns a value in range [0, FIELD_PRIME)\n */\nexport function randomFieldElement(): bigint {\n // Generate 32 bytes of randomness\n const bytes = randomBytes(32)\n\n // Convert to bigint\n let value = 0n\n for (let i = 0; i < bytes.length; i++) {\n value = (value << 8n) + BigInt(bytes[i]!)\n }\n\n // Reduce modulo field prime\n return value % FIELD_PRIME\n}\n\n/**\n * Convert bytes to hex string\n */\nexport function bytesToHex(bytes: Uint8Array): `0x${string}` {\n return `0x${Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')}`\n}\n\n/**\n * Convert hex string to bytes\n */\nexport function hexToBytes(hex: `0x${string}`): Uint8Array {\n const str = hex.slice(2)\n const bytes = new Uint8Array(str.length / 2)\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(str.slice(i * 2, i * 2 + 2), 16)\n }\n return bytes\n}\n\n/**\n * Convert bigint to bytes (big-endian)\n */\nexport function bigintToBytes(value: bigint, length: number): Uint8Array {\n const bytes = new Uint8Array(length)\n let temp = value\n for (let i = length - 1; i >= 0; i--) {\n bytes[i] = Number(temp & 0xffn)\n temp >>= 8n\n }\n return bytes\n}\n\n/**\n * Convert bytes to bigint (big-endian)\n */\nexport function bytesToBigint(bytes: Uint8Array): bigint {\n let value = 0n\n for (let i = 0; i < bytes.length; i++) {\n value = (value << 8n) + BigInt(bytes[i]!)\n }\n return value\n}\n\n/**\n * Modular exponentiation: base^exp mod modulus\n */\nexport function modPow(base: bigint, exp: bigint, modulus: bigint): bigint {\n let result = 1n\n base = base % modulus\n\n while (exp > 0n) {\n if (exp % 2n === 1n) {\n result = (result * base) % modulus\n }\n exp = exp >> 1n\n base = (base * base) % modulus\n }\n\n return result\n}\n\n/**\n * Modular inverse using extended Euclidean algorithm\n */\nexport function modInverse(a: bigint, modulus: bigint): bigint {\n let [oldR, r] = [a, modulus]\n let [oldS, s] = [1n, 0n]\n\n while (r !== 0n) {\n const quotient = oldR / r\n ;[oldR, r] = [r, oldR - quotient * r]\n ;[oldS, s] = [s, oldS - quotient * s]\n }\n\n if (oldR !== 1n) {\n throw new Error('Modular inverse does not exist')\n }\n\n return ((oldS % modulus) + modulus) % modulus\n}\n"]}