@permissionless-technologies/upp-sdk 0.4.21 → 0.4.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -3
- package/dist/chunk-2BSIUEPO.js +343 -0
- package/dist/chunk-2BSIUEPO.js.map +1 -0
- package/dist/{chunk-V6MW5VOF.cjs → chunk-632LPXPX.cjs} +4 -4
- package/dist/{chunk-V6MW5VOF.cjs.map → chunk-632LPXPX.cjs.map} +1 -1
- package/dist/{chunk-ND56VNCF.js → chunk-D4VCRPKS.js} +2 -2
- package/dist/{chunk-ND56VNCF.js.map → chunk-D4VCRPKS.js.map} +1 -1
- package/dist/{chunk-YHBUCKVS.cjs → chunk-DYSU7JYL.cjs} +23 -23
- package/dist/{chunk-YHBUCKVS.cjs.map → chunk-DYSU7JYL.cjs.map} +1 -1
- package/dist/{chunk-RYEYGGE7.cjs → chunk-IX7HV5TE.cjs} +18 -5
- package/dist/chunk-IX7HV5TE.cjs.map +1 -0
- package/dist/{chunk-5H27F6W6.cjs → chunk-IYRCJAME.cjs} +13 -9
- package/dist/chunk-IYRCJAME.cjs.map +1 -0
- package/dist/{chunk-KRLRJ3HN.js → chunk-KR4GB6VC.js} +18 -5
- package/dist/chunk-KR4GB6VC.js.map +1 -0
- package/dist/{chunk-C7DUABSG.js → chunk-Q6BLTPWV.js} +13 -9
- package/dist/chunk-Q6BLTPWV.js.map +1 -0
- package/dist/{chunk-7VPW5T5R.js → chunk-UMWY4ICQ.js} +3 -3
- package/dist/{chunk-7VPW5T5R.js.map → chunk-UMWY4ICQ.js.map} +1 -1
- package/dist/{chunk-PZAV2S5E.cjs → chunk-UYPIWBKM.cjs} +2 -2
- package/dist/{chunk-PZAV2S5E.cjs.map → chunk-UYPIWBKM.cjs.map} +1 -1
- package/dist/chunk-VVW5VVY3.cjs +347 -0
- package/dist/chunk-VVW5VVY3.cjs.map +1 -0
- package/dist/{chunk-OLJFKARA.js → chunk-XDWRMHLY.js} +15 -15
- package/dist/{chunk-OLJFKARA.js.map → chunk-XDWRMHLY.js.map} +1 -1
- package/dist/core/index.cjs +80 -67
- package/dist/core/index.d.cts +2 -2
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +5 -4
- package/dist/core/proof-worker-entry.cjs +8 -8
- package/dist/core/proof-worker-entry.cjs.map +1 -1
- package/dist/core/proof-worker-entry.js +8 -8
- package/dist/core/proof-worker-entry.js.map +1 -1
- package/dist/{index-PgqOAfcc.d.cts → index-AooYZ0kF.d.cts} +1 -1
- package/dist/{index-DsXMd8zh.d.ts → index-CpfUNGm9.d.ts} +1 -1
- package/dist/{index-DmowSsZb.d.ts → index-De5B4r0l.d.ts} +9 -3
- package/dist/{index-DcfqeWvk.d.cts → index-hNuffoCo.d.cts} +9 -3
- package/dist/index.cjs +88 -75
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/indexer/index.cjs +6 -6
- package/dist/indexer/index.d.cts +5 -5
- package/dist/indexer/index.d.ts +5 -5
- package/dist/indexer/index.js +1 -1
- package/dist/{proof-VINVGL4F.cjs → proof-X3MVQFFZ.cjs} +14 -13
- package/dist/{proof-VINVGL4F.cjs.map → proof-X3MVQFFZ.cjs.map} +1 -1
- package/dist/{proof-XQG5DN5N.js → proof-YMXBL4D5.js} +4 -3
- package/dist/{proof-XQG5DN5N.js.map → proof-YMXBL4D5.js.map} +1 -1
- package/dist/react/index.cjs +123 -39
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +44 -6
- package/dist/react/index.d.ts +44 -6
- package/dist/react/index.js +90 -18
- package/dist/react/index.js.map +1 -1
- package/dist/{transfer-Cqg235q6.d.ts → transfer-BGzySIhC.d.ts} +124 -5
- package/dist/{transfer-B4q3ZTJK.d.cts → transfer-BhB-UuBP.d.cts} +124 -5
- package/dist/{transfer-7IFAXV5K.cjs → transfer-H6UWWUSN.cjs} +11 -10
- package/dist/{transfer-7IFAXV5K.cjs.map → transfer-H6UWWUSN.cjs.map} +1 -1
- package/dist/{transfer-FWCRUWWM.js → transfer-MLVRASM3.js} +5 -4
- package/dist/{transfer-FWCRUWWM.js.map → transfer-MLVRASM3.js.map} +1 -1
- package/package.json +1 -1
- package/src/deployments/11155111.json +12 -12
- package/dist/chunk-5H27F6W6.cjs.map +0 -1
- package/dist/chunk-C7DUABSG.js.map +0 -1
- package/dist/chunk-KRLRJ3HN.js.map +0 -1
- package/dist/chunk-RYEYGGE7.cjs.map +0 -1
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/core/circuit-cache.ts
|
|
4
|
+
var CIRCUIT_VERSION = "20260330";
|
|
5
|
+
var CIRCUIT_CDN_BASE = `https://circuits.upd.io/${CIRCUIT_VERSION}/`;
|
|
6
|
+
var DB_NAME = "upp-circuit-cache";
|
|
7
|
+
var DB_VERSION = 1;
|
|
8
|
+
var STORE_NAME = "artifacts";
|
|
9
|
+
function openDB() {
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
const request = indexedDB.open(DB_NAME, DB_VERSION);
|
|
12
|
+
request.onupgradeneeded = () => {
|
|
13
|
+
const db = request.result;
|
|
14
|
+
if (!db.objectStoreNames.contains(STORE_NAME)) {
|
|
15
|
+
db.createObjectStore(STORE_NAME, { keyPath: "key" });
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
request.onsuccess = () => resolve(request.result);
|
|
19
|
+
request.onerror = () => reject(request.error);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async function idbGet(key) {
|
|
23
|
+
const db = await openDB();
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
const tx = db.transaction(STORE_NAME, "readonly");
|
|
26
|
+
const store = tx.objectStore(STORE_NAME);
|
|
27
|
+
const req = store.get(key);
|
|
28
|
+
req.onsuccess = () => resolve(req.result);
|
|
29
|
+
req.onerror = () => reject(req.error);
|
|
30
|
+
tx.oncomplete = () => db.close();
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async function idbPut(entry) {
|
|
34
|
+
const db = await openDB();
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
const tx = db.transaction(STORE_NAME, "readwrite");
|
|
37
|
+
const store = tx.objectStore(STORE_NAME);
|
|
38
|
+
store.put(entry);
|
|
39
|
+
tx.oncomplete = () => {
|
|
40
|
+
db.close();
|
|
41
|
+
resolve();
|
|
42
|
+
};
|
|
43
|
+
tx.onerror = () => {
|
|
44
|
+
db.close();
|
|
45
|
+
reject(tx.error);
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async function idbDelete(key) {
|
|
50
|
+
const db = await openDB();
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
const tx = db.transaction(STORE_NAME, "readwrite");
|
|
53
|
+
const store = tx.objectStore(STORE_NAME);
|
|
54
|
+
store.delete(key);
|
|
55
|
+
tx.oncomplete = () => {
|
|
56
|
+
db.close();
|
|
57
|
+
resolve();
|
|
58
|
+
};
|
|
59
|
+
tx.onerror = () => {
|
|
60
|
+
db.close();
|
|
61
|
+
reject(tx.error);
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
async function idbGetAllKeys() {
|
|
66
|
+
const db = await openDB();
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
const tx = db.transaction(STORE_NAME, "readonly");
|
|
69
|
+
const store = tx.objectStore(STORE_NAME);
|
|
70
|
+
const req = store.getAllKeys();
|
|
71
|
+
req.onsuccess = () => resolve(req.result);
|
|
72
|
+
req.onerror = () => reject(req.error);
|
|
73
|
+
tx.oncomplete = () => db.close();
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async function idbGetAll() {
|
|
77
|
+
const db = await openDB();
|
|
78
|
+
return new Promise((resolve, reject) => {
|
|
79
|
+
const tx = db.transaction(STORE_NAME, "readonly");
|
|
80
|
+
const store = tx.objectStore(STORE_NAME);
|
|
81
|
+
const req = store.getAll();
|
|
82
|
+
req.onsuccess = () => resolve(req.result);
|
|
83
|
+
req.onerror = () => reject(req.error);
|
|
84
|
+
tx.oncomplete = () => db.close();
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
async function idbClear() {
|
|
88
|
+
const db = await openDB();
|
|
89
|
+
return new Promise((resolve, reject) => {
|
|
90
|
+
const tx = db.transaction(STORE_NAME, "readwrite");
|
|
91
|
+
const store = tx.objectStore(STORE_NAME);
|
|
92
|
+
store.clear();
|
|
93
|
+
tx.oncomplete = () => {
|
|
94
|
+
db.close();
|
|
95
|
+
resolve();
|
|
96
|
+
};
|
|
97
|
+
tx.onerror = () => {
|
|
98
|
+
db.close();
|
|
99
|
+
reject(tx.error);
|
|
100
|
+
};
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
async function downloadWithProgress(url, circuitType, artifact, onProgress, signal) {
|
|
104
|
+
const response = await fetch(url, { signal });
|
|
105
|
+
if (!response.ok) {
|
|
106
|
+
throw new Error(`Failed to download ${artifact} for ${circuitType}: ${response.status} ${response.statusText}`);
|
|
107
|
+
}
|
|
108
|
+
const contentLength = parseInt(response.headers.get("Content-Length") ?? "0", 10);
|
|
109
|
+
if (response.body && contentLength > 0 && onProgress) {
|
|
110
|
+
const reader = response.body.getReader();
|
|
111
|
+
const chunks = [];
|
|
112
|
+
let bytesDownloaded = 0;
|
|
113
|
+
while (true) {
|
|
114
|
+
const { done, value } = await reader.read();
|
|
115
|
+
if (done) break;
|
|
116
|
+
chunks.push(value);
|
|
117
|
+
bytesDownloaded += value.length;
|
|
118
|
+
onProgress({
|
|
119
|
+
circuitType,
|
|
120
|
+
artifact,
|
|
121
|
+
bytesDownloaded,
|
|
122
|
+
totalBytes: contentLength,
|
|
123
|
+
percent: Math.round(bytesDownloaded / contentLength * 100)
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
const result = new Uint8Array(bytesDownloaded);
|
|
127
|
+
let offset = 0;
|
|
128
|
+
for (const chunk of chunks) {
|
|
129
|
+
result.set(chunk, offset);
|
|
130
|
+
offset += chunk.length;
|
|
131
|
+
}
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
const buffer = await response.arrayBuffer();
|
|
135
|
+
return new Uint8Array(buffer);
|
|
136
|
+
}
|
|
137
|
+
var ALL_CIRCUITS = [
|
|
138
|
+
"transfer",
|
|
139
|
+
"withdraw",
|
|
140
|
+
"merge",
|
|
141
|
+
"merge_transfer_2x2",
|
|
142
|
+
"merge_transfer_4x2",
|
|
143
|
+
"joinsplit"
|
|
144
|
+
];
|
|
145
|
+
var CircuitArtifactCache = class _CircuitArtifactCache {
|
|
146
|
+
// Lazy singleton per JS context (main thread and workers get their own)
|
|
147
|
+
static _instance = null;
|
|
148
|
+
static shared() {
|
|
149
|
+
if (!_CircuitArtifactCache._instance) {
|
|
150
|
+
_CircuitArtifactCache._instance = new _CircuitArtifactCache();
|
|
151
|
+
}
|
|
152
|
+
return _CircuitArtifactCache._instance;
|
|
153
|
+
}
|
|
154
|
+
/** In-flight download deduplication */
|
|
155
|
+
inflight = /* @__PURE__ */ new Map();
|
|
156
|
+
constructor() {
|
|
157
|
+
}
|
|
158
|
+
// --------------------------------------------------------------------------
|
|
159
|
+
// Key helpers
|
|
160
|
+
// --------------------------------------------------------------------------
|
|
161
|
+
key(circuit, artifact, version = CIRCUIT_VERSION) {
|
|
162
|
+
return `${version}_${circuit}_${artifact}`;
|
|
163
|
+
}
|
|
164
|
+
resolveBaseUrl(baseUrl) {
|
|
165
|
+
const url = baseUrl ?? CIRCUIT_CDN_BASE;
|
|
166
|
+
return url.endsWith("/") ? url : `${url}/`;
|
|
167
|
+
}
|
|
168
|
+
// --------------------------------------------------------------------------
|
|
169
|
+
// Public API
|
|
170
|
+
// --------------------------------------------------------------------------
|
|
171
|
+
/**
|
|
172
|
+
* Check if both wasm + zkey are cached for a circuit (current CIRCUIT_VERSION).
|
|
173
|
+
*/
|
|
174
|
+
async isCached(circuit) {
|
|
175
|
+
const [wasm, zkey] = await Promise.all([
|
|
176
|
+
idbGet(this.key(circuit, "wasm")),
|
|
177
|
+
idbGet(this.key(circuit, "zkey"))
|
|
178
|
+
]);
|
|
179
|
+
return wasm !== void 0 && zkey !== void 0;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Download and cache a circuit's artifacts. No-ops if already cached.
|
|
183
|
+
*
|
|
184
|
+
* @param circuit - Which circuit to preload
|
|
185
|
+
* @param baseUrl - CDN base URL (defaults to `https://circuits.upd.io/${CIRCUIT_VERSION}/`)
|
|
186
|
+
* @param onProgress - Byte-level download progress callback
|
|
187
|
+
* @param signal - AbortSignal for cancellation
|
|
188
|
+
*/
|
|
189
|
+
async preload(circuit, baseUrl, onProgress, signal) {
|
|
190
|
+
await this.getArtifacts(circuit, baseUrl, onProgress, signal);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get artifacts from cache, downloading if needed.
|
|
194
|
+
* Returns Uint8Array data ready to pass to snarkjs.plonk.fullProve().
|
|
195
|
+
*/
|
|
196
|
+
async getArtifacts(circuit, baseUrl, onProgress, signal) {
|
|
197
|
+
const [wasm, zkey] = await Promise.all([
|
|
198
|
+
this.getOrDownload(circuit, "wasm", baseUrl, onProgress, signal),
|
|
199
|
+
this.getOrDownload(circuit, "zkey", baseUrl, onProgress, signal)
|
|
200
|
+
]);
|
|
201
|
+
return { wasm, zkey };
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* List all cached circuit types (current version only).
|
|
205
|
+
*/
|
|
206
|
+
async getCachedCircuits() {
|
|
207
|
+
const keys = await idbGetAllKeys();
|
|
208
|
+
const prefix = `${CIRCUIT_VERSION}_`;
|
|
209
|
+
const cached = /* @__PURE__ */ new Set();
|
|
210
|
+
for (const k of keys) {
|
|
211
|
+
if (!k.startsWith(prefix)) continue;
|
|
212
|
+
const rest = k.slice(prefix.length);
|
|
213
|
+
const lastUnderscore = rest.lastIndexOf("_");
|
|
214
|
+
if (lastUnderscore > 0) {
|
|
215
|
+
cached.add(rest.slice(0, lastUnderscore));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return ALL_CIRCUITS.filter((c) => cached.has(c));
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get cache size information.
|
|
222
|
+
*/
|
|
223
|
+
async getCacheSize() {
|
|
224
|
+
const entries = await idbGetAll();
|
|
225
|
+
let total = 0;
|
|
226
|
+
const circuits = {};
|
|
227
|
+
for (const entry of entries) {
|
|
228
|
+
total += entry.size;
|
|
229
|
+
const parts = entry.key.split("_");
|
|
230
|
+
if (parts.length >= 3) {
|
|
231
|
+
const circuit = parts.slice(1, -1).join("_");
|
|
232
|
+
circuits[circuit] = (circuits[circuit] ?? 0) + entry.size;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return { total, circuits };
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get cache status for all circuit types.
|
|
239
|
+
*/
|
|
240
|
+
async getStatus() {
|
|
241
|
+
const entries = await idbGetAll();
|
|
242
|
+
const result = /* @__PURE__ */ new Map();
|
|
243
|
+
const prefix = `${CIRCUIT_VERSION}_`;
|
|
244
|
+
for (const c of ALL_CIRCUITS) {
|
|
245
|
+
result.set(c, { cached: false });
|
|
246
|
+
}
|
|
247
|
+
const wasmMap = /* @__PURE__ */ new Map();
|
|
248
|
+
const zkeyMap = /* @__PURE__ */ new Map();
|
|
249
|
+
for (const entry of entries) {
|
|
250
|
+
if (!entry.key.startsWith(prefix)) continue;
|
|
251
|
+
const rest = entry.key.slice(prefix.length);
|
|
252
|
+
const lastUnderscore = rest.lastIndexOf("_");
|
|
253
|
+
const circuit = rest.slice(0, lastUnderscore);
|
|
254
|
+
const artifact = rest.slice(lastUnderscore + 1);
|
|
255
|
+
if (artifact === "wasm") wasmMap.set(circuit, entry.size);
|
|
256
|
+
else if (artifact === "zkey") zkeyMap.set(circuit, entry.size);
|
|
257
|
+
}
|
|
258
|
+
for (const c of ALL_CIRCUITS) {
|
|
259
|
+
const hasWasm = wasmMap.has(c);
|
|
260
|
+
const hasZkey = zkeyMap.has(c);
|
|
261
|
+
result.set(c, {
|
|
262
|
+
cached: hasWasm && hasZkey,
|
|
263
|
+
wasmSize: wasmMap.get(c),
|
|
264
|
+
zkeySize: zkeyMap.get(c)
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
return result;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Evict a specific circuit from cache (current version).
|
|
271
|
+
*/
|
|
272
|
+
async evict(circuit) {
|
|
273
|
+
await Promise.all([
|
|
274
|
+
idbDelete(this.key(circuit, "wasm")),
|
|
275
|
+
idbDelete(this.key(circuit, "zkey"))
|
|
276
|
+
]);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Evict all cached circuit artifacts (all versions).
|
|
280
|
+
*/
|
|
281
|
+
async evictAll() {
|
|
282
|
+
await idbClear();
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Evict all artifacts for a specific version (for cleaning up after SDK updates).
|
|
286
|
+
*/
|
|
287
|
+
async evictVersion(version) {
|
|
288
|
+
const keys = await idbGetAllKeys();
|
|
289
|
+
const prefix = `${version}_`;
|
|
290
|
+
const toDelete = keys.filter((k) => k.startsWith(prefix));
|
|
291
|
+
for (const k of toDelete) {
|
|
292
|
+
await idbDelete(k);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Request persistent storage to prevent browser from evicting the cache.
|
|
297
|
+
* Returns true if granted, false if denied or unavailable.
|
|
298
|
+
*/
|
|
299
|
+
async requestPersistence() {
|
|
300
|
+
if (typeof navigator !== "undefined" && navigator.storage?.persist) {
|
|
301
|
+
return navigator.storage.persist();
|
|
302
|
+
}
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
// --------------------------------------------------------------------------
|
|
306
|
+
// Internal
|
|
307
|
+
// --------------------------------------------------------------------------
|
|
308
|
+
async getOrDownload(circuit, artifact, baseUrl, onProgress, signal) {
|
|
309
|
+
const cacheKey = this.key(circuit, artifact);
|
|
310
|
+
const cached = await idbGet(cacheKey);
|
|
311
|
+
if (cached) {
|
|
312
|
+
return cached.data;
|
|
313
|
+
}
|
|
314
|
+
const inflightKey = `${cacheKey}_${this.resolveBaseUrl(baseUrl)}`;
|
|
315
|
+
const existing = this.inflight.get(inflightKey);
|
|
316
|
+
if (existing) {
|
|
317
|
+
return existing;
|
|
318
|
+
}
|
|
319
|
+
const downloadPromise = this.downloadAndStore(circuit, artifact, baseUrl, onProgress, signal);
|
|
320
|
+
this.inflight.set(inflightKey, downloadPromise);
|
|
321
|
+
try {
|
|
322
|
+
const data = await downloadPromise;
|
|
323
|
+
return data;
|
|
324
|
+
} finally {
|
|
325
|
+
this.inflight.delete(inflightKey);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
async downloadAndStore(circuit, artifact, baseUrl, onProgress, signal) {
|
|
329
|
+
const base = this.resolveBaseUrl(baseUrl);
|
|
330
|
+
const url = `${base}${circuit}.${artifact}`;
|
|
331
|
+
const data = await downloadWithProgress(url, circuit, artifact, onProgress, signal);
|
|
332
|
+
await idbPut({
|
|
333
|
+
key: this.key(circuit, artifact),
|
|
334
|
+
data,
|
|
335
|
+
size: data.byteLength,
|
|
336
|
+
cachedAt: Date.now(),
|
|
337
|
+
version: CIRCUIT_VERSION
|
|
338
|
+
});
|
|
339
|
+
return data;
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
exports.CIRCUIT_CDN_BASE = CIRCUIT_CDN_BASE;
|
|
344
|
+
exports.CIRCUIT_VERSION = CIRCUIT_VERSION;
|
|
345
|
+
exports.CircuitArtifactCache = CircuitArtifactCache;
|
|
346
|
+
//# sourceMappingURL=chunk-VVW5VVY3.cjs.map
|
|
347
|
+
//# sourceMappingURL=chunk-VVW5VVY3.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/circuit-cache.ts"],"names":[],"mappings":"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","file":"chunk-VVW5VVY3.cjs","sourcesContent":["/**\n * Circuit Artifact Cache — IndexedDB-based caching for PLONK circuit files.\n *\n * Downloads circuit artifacts (wasm + zkey) with progress reporting via\n * ReadableStream, caches them in IndexedDB, and returns Uint8Array data\n * that can be passed directly to snarkjs.plonk.fullProve().\n *\n * Works in both main thread and Web Worker contexts.\n */\n\nimport type { UPPCircuitType } from './proof.js'\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Current circuit artifact version (date-based).\n * Bump this when circuits are recompiled (new trusted setup, circuit changes).\n * Old cached artifacts are ignored (different key prefix in IndexedDB).\n */\nexport const CIRCUIT_VERSION = '20260330'\n\n/** Default CDN base URL for circuit artifacts */\nexport const CIRCUIT_CDN_BASE = `https://circuits.upd.io/${CIRCUIT_VERSION}/`\n\nconst DB_NAME = 'upp-circuit-cache'\nconst DB_VERSION = 1\nconst STORE_NAME = 'artifacts'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Progress report during circuit artifact download */\nexport interface DownloadProgress {\n circuitType: UPPCircuitType\n artifact: 'wasm' | 'zkey'\n bytesDownloaded: number\n totalBytes: number\n /** 0-100 */\n percent: number\n}\n\n/** Resolved (binary) circuit artifacts ready for snarkjs */\nexport interface ResolvedCircuitArtifacts {\n wasm: Uint8Array\n zkey: Uint8Array\n}\n\n/** Cache entry stored in IndexedDB */\ninterface CacheEntry {\n key: string\n data: Uint8Array\n size: number\n cachedAt: number\n version: string\n}\n\n/** Per-circuit cache status */\nexport interface CircuitCacheStatus {\n cached: boolean\n wasmSize?: number\n zkeySize?: number\n}\n\n// ============================================================================\n// IndexedDB Helpers (thin promise wrapper, no external deps)\n// ============================================================================\n\nfunction openDB(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION)\n\n request.onupgradeneeded = () => {\n const db = request.result\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME, { keyPath: 'key' })\n }\n }\n\n request.onsuccess = () => resolve(request.result)\n request.onerror = () => reject(request.error)\n })\n}\n\nasync function idbGet(key: string): Promise<CacheEntry | undefined> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly')\n const store = tx.objectStore(STORE_NAME)\n const req = store.get(key)\n req.onsuccess = () => resolve(req.result as CacheEntry | undefined)\n req.onerror = () => reject(req.error)\n tx.oncomplete = () => db.close()\n })\n}\n\nasync function idbPut(entry: CacheEntry): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const store = tx.objectStore(STORE_NAME)\n store.put(entry)\n tx.oncomplete = () => { db.close(); resolve() }\n tx.onerror = () => { db.close(); reject(tx.error) }\n })\n}\n\nasync function idbDelete(key: string): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const store = tx.objectStore(STORE_NAME)\n store.delete(key)\n tx.oncomplete = () => { db.close(); resolve() }\n tx.onerror = () => { db.close(); reject(tx.error) }\n })\n}\n\nasync function idbGetAllKeys(): Promise<string[]> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly')\n const store = tx.objectStore(STORE_NAME)\n const req = store.getAllKeys()\n req.onsuccess = () => resolve(req.result as string[])\n req.onerror = () => reject(req.error)\n tx.oncomplete = () => db.close()\n })\n}\n\nasync function idbGetAll(): Promise<CacheEntry[]> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly')\n const store = tx.objectStore(STORE_NAME)\n const req = store.getAll()\n req.onsuccess = () => resolve(req.result as CacheEntry[])\n req.onerror = () => reject(req.error)\n tx.oncomplete = () => db.close()\n })\n}\n\nasync function idbClear(): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const store = tx.objectStore(STORE_NAME)\n store.clear()\n tx.oncomplete = () => { db.close(); resolve() }\n tx.onerror = () => { db.close(); reject(tx.error) }\n })\n}\n\n// ============================================================================\n// Download with progress\n// ============================================================================\n\nasync function downloadWithProgress(\n url: string,\n circuitType: UPPCircuitType,\n artifact: 'wasm' | 'zkey',\n onProgress?: (p: DownloadProgress) => void,\n signal?: AbortSignal,\n): Promise<Uint8Array> {\n const response = await fetch(url, { signal })\n\n if (!response.ok) {\n throw new Error(`Failed to download ${artifact} for ${circuitType}: ${response.status} ${response.statusText}`)\n }\n\n const contentLength = parseInt(response.headers.get('Content-Length') ?? '0', 10)\n\n // If ReadableStream is available and we have Content-Length, stream with progress\n if (response.body && contentLength > 0 && onProgress) {\n const reader = response.body.getReader()\n const chunks: Uint8Array[] = []\n let bytesDownloaded = 0\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n chunks.push(value)\n bytesDownloaded += value.length\n\n onProgress({\n circuitType,\n artifact,\n bytesDownloaded,\n totalBytes: contentLength,\n percent: Math.round((bytesDownloaded / contentLength) * 100),\n })\n }\n\n // Combine chunks into single Uint8Array\n const result = new Uint8Array(bytesDownloaded)\n let offset = 0\n for (const chunk of chunks) {\n result.set(chunk, offset)\n offset += chunk.length\n }\n return result\n }\n\n // Fallback: no progress (ReadableStream unavailable or no Content-Length)\n const buffer = await response.arrayBuffer()\n return new Uint8Array(buffer)\n}\n\n// ============================================================================\n// CircuitArtifactCache\n// ============================================================================\n\n/** All UPP circuit types */\nconst ALL_CIRCUITS: UPPCircuitType[] = [\n 'transfer', 'withdraw', 'merge',\n 'merge_transfer_2x2', 'merge_transfer_4x2', 'joinsplit',\n]\n\nexport class CircuitArtifactCache {\n // Lazy singleton per JS context (main thread and workers get their own)\n private static _instance: CircuitArtifactCache | null = null\n\n static shared(): CircuitArtifactCache {\n if (!CircuitArtifactCache._instance) {\n CircuitArtifactCache._instance = new CircuitArtifactCache()\n }\n return CircuitArtifactCache._instance\n }\n\n /** In-flight download deduplication */\n private inflight = new Map<string, Promise<Uint8Array>>()\n\n private constructor() {}\n\n // --------------------------------------------------------------------------\n // Key helpers\n // --------------------------------------------------------------------------\n\n private key(circuit: UPPCircuitType, artifact: 'wasm' | 'zkey', version = CIRCUIT_VERSION): string {\n return `${version}_${circuit}_${artifact}`\n }\n\n private resolveBaseUrl(baseUrl?: string): string {\n const url = baseUrl ?? CIRCUIT_CDN_BASE\n return url.endsWith('/') ? url : `${url}/`\n }\n\n // --------------------------------------------------------------------------\n // Public API\n // --------------------------------------------------------------------------\n\n /**\n * Check if both wasm + zkey are cached for a circuit (current CIRCUIT_VERSION).\n */\n async isCached(circuit: UPPCircuitType): Promise<boolean> {\n const [wasm, zkey] = await Promise.all([\n idbGet(this.key(circuit, 'wasm')),\n idbGet(this.key(circuit, 'zkey')),\n ])\n return wasm !== undefined && zkey !== undefined\n }\n\n /**\n * Download and cache a circuit's artifacts. No-ops if already cached.\n *\n * @param circuit - Which circuit to preload\n * @param baseUrl - CDN base URL (defaults to `https://circuits.upd.io/${CIRCUIT_VERSION}/`)\n * @param onProgress - Byte-level download progress callback\n * @param signal - AbortSignal for cancellation\n */\n async preload(\n circuit: UPPCircuitType,\n baseUrl?: string,\n onProgress?: (p: DownloadProgress) => void,\n signal?: AbortSignal,\n ): Promise<void> {\n await this.getArtifacts(circuit, baseUrl, onProgress, signal)\n }\n\n /**\n * Get artifacts from cache, downloading if needed.\n * Returns Uint8Array data ready to pass to snarkjs.plonk.fullProve().\n */\n async getArtifacts(\n circuit: UPPCircuitType,\n baseUrl?: string,\n onProgress?: (p: DownloadProgress) => void,\n signal?: AbortSignal,\n ): Promise<ResolvedCircuitArtifacts> {\n const [wasm, zkey] = await Promise.all([\n this.getOrDownload(circuit, 'wasm', baseUrl, onProgress, signal),\n this.getOrDownload(circuit, 'zkey', baseUrl, onProgress, signal),\n ])\n return { wasm, zkey }\n }\n\n /**\n * List all cached circuit types (current version only).\n */\n async getCachedCircuits(): Promise<UPPCircuitType[]> {\n const keys = await idbGetAllKeys()\n const prefix = `${CIRCUIT_VERSION}_`\n const cached = new Set<string>()\n\n for (const k of keys) {\n if (!k.startsWith(prefix)) continue\n const rest = k.slice(prefix.length)\n // rest = \"transfer_zkey\" or \"transfer_wasm\"\n const lastUnderscore = rest.lastIndexOf('_')\n if (lastUnderscore > 0) {\n cached.add(rest.slice(0, lastUnderscore))\n }\n }\n\n return ALL_CIRCUITS.filter(c => cached.has(c))\n }\n\n /**\n * Get cache size information.\n */\n async getCacheSize(): Promise<{ total: number; circuits: Record<string, number> }> {\n const entries = await idbGetAll()\n let total = 0\n const circuits: Record<string, number> = {}\n\n for (const entry of entries) {\n total += entry.size\n // Extract circuit name from key: \"{version}_{circuit}_{artifact}\"\n const parts = entry.key.split('_')\n // Reconstruct circuit name (may contain underscores like merge_transfer_2x2)\n if (parts.length >= 3) {\n const circuit = parts.slice(1, -1).join('_')\n circuits[circuit] = (circuits[circuit] ?? 0) + entry.size\n }\n }\n\n return { total, circuits }\n }\n\n /**\n * Get cache status for all circuit types.\n */\n async getStatus(): Promise<Map<UPPCircuitType, CircuitCacheStatus>> {\n const entries = await idbGetAll()\n const result = new Map<UPPCircuitType, CircuitCacheStatus>()\n const prefix = `${CIRCUIT_VERSION}_`\n\n // Initialize all circuits as not cached\n for (const c of ALL_CIRCUITS) {\n result.set(c, { cached: false })\n }\n\n // Check what's actually cached\n const wasmMap = new Map<string, number>()\n const zkeyMap = new Map<string, number>()\n\n for (const entry of entries) {\n if (!entry.key.startsWith(prefix)) continue\n const rest = entry.key.slice(prefix.length)\n const lastUnderscore = rest.lastIndexOf('_')\n const circuit = rest.slice(0, lastUnderscore)\n const artifact = rest.slice(lastUnderscore + 1)\n\n if (artifact === 'wasm') wasmMap.set(circuit, entry.size)\n else if (artifact === 'zkey') zkeyMap.set(circuit, entry.size)\n }\n\n for (const c of ALL_CIRCUITS) {\n const hasWasm = wasmMap.has(c)\n const hasZkey = zkeyMap.has(c)\n result.set(c, {\n cached: hasWasm && hasZkey,\n wasmSize: wasmMap.get(c),\n zkeySize: zkeyMap.get(c),\n })\n }\n\n return result\n }\n\n /**\n * Evict a specific circuit from cache (current version).\n */\n async evict(circuit: UPPCircuitType): Promise<void> {\n await Promise.all([\n idbDelete(this.key(circuit, 'wasm')),\n idbDelete(this.key(circuit, 'zkey')),\n ])\n }\n\n /**\n * Evict all cached circuit artifacts (all versions).\n */\n async evictAll(): Promise<void> {\n await idbClear()\n }\n\n /**\n * Evict all artifacts for a specific version (for cleaning up after SDK updates).\n */\n async evictVersion(version: string): Promise<void> {\n const keys = await idbGetAllKeys()\n const prefix = `${version}_`\n const toDelete = keys.filter(k => k.startsWith(prefix))\n for (const k of toDelete) {\n await idbDelete(k)\n }\n }\n\n /**\n * Request persistent storage to prevent browser from evicting the cache.\n * Returns true if granted, false if denied or unavailable.\n */\n async requestPersistence(): Promise<boolean> {\n if (typeof navigator !== 'undefined' && navigator.storage?.persist) {\n return navigator.storage.persist()\n }\n return false\n }\n\n // --------------------------------------------------------------------------\n // Internal\n // --------------------------------------------------------------------------\n\n private async getOrDownload(\n circuit: UPPCircuitType,\n artifact: 'wasm' | 'zkey',\n baseUrl?: string,\n onProgress?: (p: DownloadProgress) => void,\n signal?: AbortSignal,\n ): Promise<Uint8Array> {\n const cacheKey = this.key(circuit, artifact)\n\n // Check cache first\n const cached = await idbGet(cacheKey)\n if (cached) {\n return cached.data\n }\n\n // Deduplicate in-flight downloads\n const inflightKey = `${cacheKey}_${this.resolveBaseUrl(baseUrl)}`\n const existing = this.inflight.get(inflightKey)\n if (existing) {\n return existing\n }\n\n const downloadPromise = this.downloadAndStore(circuit, artifact, baseUrl, onProgress, signal)\n\n this.inflight.set(inflightKey, downloadPromise)\n try {\n const data = await downloadPromise\n return data\n } finally {\n this.inflight.delete(inflightKey)\n }\n }\n\n private async downloadAndStore(\n circuit: UPPCircuitType,\n artifact: 'wasm' | 'zkey',\n baseUrl?: string,\n onProgress?: (p: DownloadProgress) => void,\n signal?: AbortSignal,\n ): Promise<Uint8Array> {\n const base = this.resolveBaseUrl(baseUrl)\n const url = `${base}${circuit}.${artifact}`\n\n const data = await downloadWithProgress(url, circuit, artifact, onProgress, signal)\n\n // Store in IndexedDB\n await idbPut({\n key: this.key(circuit, artifact),\n data,\n size: data.byteLength,\n cachedAt: Date.now(),\n version: CIRCUIT_VERSION,\n })\n\n return data\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { generateUPPProof, formatPlonkProofForContract, ASP_TREE_DEPTH, STATE_TREE_DEPTH } from './chunk-
|
|
1
|
+
import { generateUPPProof, formatPlonkProofForContract, ASP_TREE_DEPTH, STATE_TREE_DEPTH } from './chunk-KR4GB6VC.js';
|
|
2
2
|
import { buildMerkleTree } from './chunk-GPF72JFR.js';
|
|
3
3
|
import { generateASPProof, DEMO_ASP_ID } from './chunk-6IEYWJVS.js';
|
|
4
4
|
import { init_poseidon, poseidon, computeOwnerHash, computeNoteCommitment } from './chunk-5QSSX3KR.js';
|
|
@@ -27,23 +27,23 @@ var __default = {
|
|
|
27
27
|
|
|
28
28
|
// src/deployments/11155111.json
|
|
29
29
|
var __default2 = {
|
|
30
|
-
UniversalPrivatePool: "
|
|
30
|
+
UniversalPrivatePool: "0xba5405375ee4c1b5fdcb1b755381edcc38ae28f2",
|
|
31
31
|
ASPRegistryHub: "0xfd11c56a23314aa88dfbcc36254f33e5e8b010df",
|
|
32
|
-
TestToken: "
|
|
33
|
-
TestToken2: "
|
|
32
|
+
TestToken: "0xc3cef670aae8228de206c98b67c3d25c520b8f14",
|
|
33
|
+
TestToken2: "0x4de3efd64d4ce9a4b45f538104bdbaadaf170bed",
|
|
34
34
|
verifiers: {
|
|
35
|
-
TransferVerifier: "
|
|
36
|
-
MergeVerifier: "
|
|
37
|
-
WithdrawVerifier: "
|
|
38
|
-
JoinSplitVerifier: "
|
|
39
|
-
MergeTransfer2x2Verifier: "
|
|
40
|
-
MergeTransfer4x2Verifier: "
|
|
35
|
+
TransferVerifier: "0xe4a737e8e3100709986e1992d8e18cf324965320",
|
|
36
|
+
MergeVerifier: "0x3a844672f792d3b1216e4e64acd8c5d0301a3a3e",
|
|
37
|
+
WithdrawVerifier: "0x387afb8566d446c8344e03b8a9c54ba96b22233d",
|
|
38
|
+
JoinSplitVerifier: "0xe03c270de9b33f72a0656b07ed43f3269d586607",
|
|
39
|
+
MergeTransfer2x2Verifier: "0xbc1378d567abdfad063cd32b684e03ca29e79b99",
|
|
40
|
+
MergeTransfer4x2Verifier: "0xd1f75b988e6fd6003204bda6e83eb3186a8dec34"
|
|
41
41
|
},
|
|
42
42
|
starkVerifiers: {
|
|
43
|
-
CircleStarkVerifier: "
|
|
43
|
+
CircleStarkVerifier: "0xc92ba214653c616c4546d7edcb7aba8ced3e0a94"
|
|
44
44
|
},
|
|
45
|
-
deployBlock:
|
|
46
|
-
deployTimestamp:
|
|
45
|
+
deployBlock: 10555332,
|
|
46
|
+
deployTimestamp: 1774895534634};
|
|
47
47
|
|
|
48
48
|
// src/deployments/index.ts
|
|
49
49
|
function parseDeployment(json, chainId) {
|
|
@@ -326,5 +326,5 @@ function formatOutputForContract(note) {
|
|
|
326
326
|
}
|
|
327
327
|
|
|
328
328
|
export { buildTransfer, buildUPPTransferCircuitInputs, computeNullifier, formatOutputForContract, getDeployment, getDeploymentOrThrow, getMerkleProofsForNotes, getSupportedChainIds, getTokenAddress, hasDeployment, registerDeployment, syncMerkleTree };
|
|
329
|
-
//# sourceMappingURL=chunk-
|
|
330
|
-
//# sourceMappingURL=chunk-
|
|
329
|
+
//# sourceMappingURL=chunk-XDWRMHLY.js.map
|
|
330
|
+
//# sourceMappingURL=chunk-XDWRMHLY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/deployments/31337.json","../src/deployments/11155111.json","../src/deployments/index.ts","../src/core/transfer.ts"],"names":["__default"],"mappings":"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","file":"chunk-OLJFKARA.js","sourcesContent":["{\n \"UniversalPrivatePool\": \"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6\",\n \"ASPRegistryHub\": \"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512\",\n \"TestToken\": \"0x610178da211fef7d417bc0e6fed39f05609ad788\",\n \"TestToken2\": \"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e\",\n \"verifiers\": {\n \"TransferVerifier\": \"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0\",\n \"MergeVerifier\": \"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9\",\n \"WithdrawVerifier\": \"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9\",\n \"JoinSplitVerifier\": \"0x5fc8d32690cc91d4c39d9d3abcbd16989f875707\",\n \"MergeTransfer2x2Verifier\": \"0x0165878a594ca255338adfa4d48449f69242eb8f\",\n \"MergeTransfer4x2Verifier\": \"0xa513e6e4b8f2a923d98304ec87f64353c4d5c853\"\n },\n \"starkVerifiers\": {\n \"CircleStarkVerifier\": \"0x0dcd1bf9a1b36ce34237eeafef220932846bcd82\"\n },\n \"deployBlock\": 1,\n \"deployTimestamp\": 1774728354492\n}\n","{\n \"UniversalPrivatePool\": \"0x571f7feba5d25638ba4e05c59668a892ddfeaf4f\",\n \"ASPRegistryHub\": \"0xfd11c56a23314aa88dfbcc36254f33e5e8b010df\",\n \"TestToken\": \"0xace09cebc29a3f04002800aceb26931990786538\",\n \"TestToken2\": \"0x3f10afa4e15949fb36957b1ae3e3b5c93986312c\",\n \"verifiers\": {\n \"TransferVerifier\": \"0x29c822a5b740db73707ea033482cb2772e764357\",\n \"MergeVerifier\": \"0x5fbd1596811a8971be776e477759ed50063fea22\",\n \"WithdrawVerifier\": \"0x49e13844d5e39ba4777f237ffc793e0366212fdd\",\n \"JoinSplitVerifier\": \"0xd0d7200b6684c21213e27713662795ea9bdd5923\",\n \"MergeTransfer2x2Verifier\": \"0x1abf58c52ab366c5e77d7164b7e50631707f682e\",\n \"MergeTransfer4x2Verifier\": \"0x83f097a17f9d0defab6a2fe15aa96f8e8a05f0c3\"\n },\n \"starkVerifiers\": {\n \"CircleStarkVerifier\": \"0x14e8259e31ec564fe5d80680fdabe81da264baa6\"\n },\n \"deployBlock\": 10553557,\n \"deployTimestamp\": 1774873429071,\n \"proofSystem\": \"PLONK\",\n \"curve\": \"BLS12-381\",\n \"verifierType\": \"PlonkVerifierBLS12381\"\n}\n","/**\n * Deployment Configuration Loader\n *\n * Loads contract addresses based on chain ID.\n * Built-in: Anvil (31337) and Sepolia (11155111).\n * Custom chains can be registered at runtime via registerDeployment().\n */\n\nimport type { Address } from \"viem\";\n\n/**\n * Verifier contract addresses\n */\nexport interface VerifierAddresses {\n TransferVerifier: Address;\n MergeVerifier: Address;\n WithdrawVerifier: Address;\n JoinSplitVerifier?: Address;\n MergeTransfer2x2Verifier?: Address;\n MergeTransfer4x2Verifier?: Address;\n}\n\n/**\n * STARK verifier contract addresses\n */\nexport interface StarkVerifierAddresses {\n CircleStarkVerifier?: Address;\n}\n\n/**\n * Deployment configuration for a chain\n */\nexport interface DeploymentConfig {\n /** Universal Private Pool contract address */\n UniversalPrivatePool: Address;\n /** ASP Registry Hub contract address */\n ASPRegistryHub: Address;\n /** Test token address (local/testnet) */\n TestToken?: Address;\n /** Test token 2 address — bonding curve token (local/testnet) */\n TestToken2?: Address;\n /** Verifier contract addresses */\n verifiers: VerifierAddresses;\n /** STARK verifier contract addresses */\n starkVerifiers?: StarkVerifierAddresses;\n /** Chain ID */\n chainId: number;\n /** Block number when contracts were deployed (for efficient scanning) */\n deployBlock: number;\n /** Timestamp when contracts were deployed */\n deployTimestamp?: number;\n}\n\n/**\n * Raw JSON file format (without chainId, which is added dynamically)\n */\ninterface DeploymentJSON {\n UniversalPrivatePool: string;\n ASPRegistryHub: string;\n TestToken?: string;\n TestToken2?: string;\n verifiers: {\n TransferVerifier: string;\n MergeVerifier: string;\n WithdrawVerifier: string;\n JoinSplitVerifier?: string;\n MergeTransfer2x2Verifier?: string;\n MergeTransfer4x2Verifier?: string;\n };\n starkVerifiers?: {\n CircleStarkVerifier?: string;\n };\n deployBlock: number;\n deployTimestamp?: number;\n}\n\n/**\n * Parse raw deployment JSON into typed config\n */\nfunction parseDeployment(\n json: DeploymentJSON,\n chainId: number\n): DeploymentConfig {\n return {\n UniversalPrivatePool: json.UniversalPrivatePool as Address,\n ASPRegistryHub: json.ASPRegistryHub as Address,\n TestToken: json.TestToken as Address | undefined,\n TestToken2: json.TestToken2 as Address | undefined,\n verifiers: {\n TransferVerifier: json.verifiers.TransferVerifier as Address,\n MergeVerifier: json.verifiers.MergeVerifier as Address,\n WithdrawVerifier: json.verifiers.WithdrawVerifier as Address,\n JoinSplitVerifier: json.verifiers.JoinSplitVerifier as Address | undefined,\n MergeTransfer2x2Verifier: json.verifiers\n .MergeTransfer2x2Verifier as Address | undefined,\n MergeTransfer4x2Verifier: json.verifiers\n .MergeTransfer4x2Verifier as Address | undefined,\n },\n starkVerifiers: json.starkVerifiers\n ? {\n CircleStarkVerifier: json.starkVerifiers\n .CircleStarkVerifier as Address | undefined,\n }\n : undefined,\n chainId,\n deployBlock: json.deployBlock,\n deployTimestamp: json.deployTimestamp,\n };\n}\n\n// Import deployment configs\n// These will be updated by the extract-deployment.js script\nimport anvil from \"./31337.json\" with { type: \"json\" };\nimport sepolia from \"./11155111.json\" with { type: \"json\" };\n\nconst deployments: Record<number, DeploymentConfig> = {\n 31337: parseDeployment(anvil as unknown as DeploymentJSON, 31337),\n 11155111: parseDeployment(sepolia as unknown as DeploymentJSON, 11155111),\n};\n\n/**\n * Get deployment config for a chain\n *\n * @param chainId - Chain ID to get deployment for\n * @returns Deployment config or null if not found\n *\n * @example\n * ```ts\n * const deployment = getDeployment(31337)\n * if (deployment) {\n * console.log('Pool address:', deployment.UniversalPrivatePool)\n * }\n * ```\n */\nexport function getDeployment(chainId: number): DeploymentConfig | null {\n return deployments[chainId] ?? null;\n}\n\n/**\n * Get deployment config or throw if not found\n *\n * @param chainId - Chain ID to get deployment for\n * @returns Deployment config\n * @throws Error if deployment not found\n */\nexport function getDeploymentOrThrow(chainId: number): DeploymentConfig {\n const deployment = getDeployment(chainId);\n if (!deployment) {\n throw new Error(\n `No deployment found for chain ${chainId}. ` +\n `Supported chains: ${Object.keys(deployments).join(\", \")}`\n );\n }\n return deployment;\n}\n\n/**\n * Check if a chain has a deployment\n */\nexport function hasDeployment(chainId: number): boolean {\n return chainId in deployments;\n}\n\n/**\n * Get all supported chain IDs\n */\nexport function getSupportedChainIds(): number[] {\n return Object.keys(deployments).map(Number);\n}\n\n/**\n * Get the token address for a chain\n */\nexport function getTokenAddress(chainId: number): Address | null {\n const deployment = getDeployment(chainId);\n if (!deployment) return null;\n return deployment.TestToken ?? null;\n}\n\n/**\n * Register a deployment for a custom chain at runtime.\n *\n * Use this when deploying your own pool on a chain not built into the SDK.\n * Overrides any existing deployment for the same chainId.\n *\n * @example\n * ```ts\n * registerDeployment(8453, {\n * UniversalPrivatePool: '0x...',\n * ASPRegistryHub: '0x...',\n * verifiers: { TransferVerifier: '0x...', MergeVerifier: '0x...', WithdrawVerifier: '0x...' },\n * chainId: 8453,\n * deployBlock: 12345678,\n * })\n * ```\n */\nexport function registerDeployment(chainId: number, config: DeploymentConfig): void {\n deployments[chainId] = { ...config, chainId };\n}\n","/**\n * Transfer Module\n *\n * Core logic for building and executing UPP transfers.\n * This module is framework-agnostic (no React).\n */\n\nimport { toHex, type Address, type Hex, type PublicClient } from 'viem'\nimport { getDeployment } from '../deployments/index.js'\nimport { buildMerkleTree, type MerkleProof } from '../utils/merkle.js'\nimport { poseidon, computeOwnerHash as poseidonOwnerHash, computeNoteCommitment } from '../utils/poseidon.js'\nimport {\n generateUPPProof,\n formatPlonkProofForContract,\n STATE_TREE_DEPTH,\n ASP_TREE_DEPTH,\n type UPPCircuitType,\n type UPPTransferCircuitInputs,\n type PlonkProofStruct,\n} from './proof.js'\nimport { generateASPProof, type ASPProof } from './asp.js'\nimport type { NoteCreationResult } from '../react/use-upp-account.js'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Transfer stage for progress tracking\n */\nexport type TransferStage =\n | 'selecting_notes'\n | 'syncing_merkle'\n | 'creating_outputs'\n | 'generating_proof'\n | 'submitting_tx'\n | 'confirming'\n\n/**\n * A shielded note with all data needed for spending\n *\n * Post-quantum: uses ownerSecret/ownerHash instead of BabyJubJub one-time keys.\n * Ownership is proven via hash preimage: Poseidon(ownerSecret) == ownerHash.\n */\nexport interface SpendableNote {\n amount: bigint\n blinding: bigint\n commitment: string\n /** Owner secret (hash preimage for ownership proof) */\n ownerSecret: string\n /** Owner hash = Poseidon(ownerSecret) - committed in the note */\n ownerHash: string\n leafIndex: number\n /** Origin address (depositor) - required for UPP circuits */\n origin: bigint\n /** Token address - required for UPP circuits */\n token: bigint\n}\n\n/**\n * Merkle proof with associated note\n */\nexport interface MerkleProofWithNote {\n proof: MerkleProof\n note: SpendableNote\n}\n\n/**\n * Transfer context (dependencies)\n */\nexport interface TransferContext {\n /** viem PublicClient for RPC calls */\n publicClient: PublicClient\n /** Contract address */\n contractAddress: Address\n /** Chain ID */\n chainId: number\n /** Circuit base URL (default: '/circuits/') */\n circuitBaseUrl?: string\n /** ASP ID to use (default: DEMO_ASP_ID) */\n aspId?: bigint\n /** All approved origins in the ASP tree (enables multi-origin proofs) */\n aspApprovedOrigins?: bigint[]\n}\n\n/**\n * Transfer result\n */\nexport interface TransferBuildResult {\n /** Circuit type used */\n circuit: UPPCircuitType\n /** Formatted PLONK proof for contract */\n proof: {\n proofStruct: PlonkProofStruct\n publicSignals: bigint[]\n }\n /** Public signals from proof */\n publicSignals: string[]\n /** State tree root */\n stateRoot: bigint\n /** ASP tree root */\n aspRoot: bigint\n /** Nullifier hash */\n nullifier: bigint\n /** Output commitment 1 */\n outputCommitment1: bigint\n /** Output commitment 2 */\n outputCommitment2: bigint\n /** Token address */\n token: bigint\n /** Recipient output */\n recipientOutput: NoteCreationResult\n /** Change output */\n changeOutput: NoteCreationResult\n /** Notes that will be spent */\n spentNotes: SpendableNote[]\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Chunk size for paginated RPC queries on testnets */\nconst RPC_CHUNK_SIZE = 9000n\n\n/**\n * Pad an array to the state tree depth (32 levels)\n * @param arr - Array to pad\n * @param padValue - Value to use for padding (default: '0')\n * @returns Padded array of length STATE_TREE_DEPTH\n */\nfunction padToStateTreeDepth<T>(arr: T[], padValue: T): T[] {\n if (arr.length >= STATE_TREE_DEPTH) {\n return arr.slice(0, STATE_TREE_DEPTH)\n }\n return [...arr, ...Array(STATE_TREE_DEPTH - arr.length).fill(padValue)]\n}\n\n/**\n * Pad an array to the ASP tree depth (20 levels)\n * @param arr - Array to pad\n * @param padValue - Value to use for padding (default: '0')\n * @returns Padded array of length ASP_TREE_DEPTH\n */\nfunction padToASPTreeDepth<T>(arr: T[], padValue: T): T[] {\n if (arr.length >= ASP_TREE_DEPTH) {\n return arr.slice(0, ASP_TREE_DEPTH)\n }\n return [...arr, ...Array(ASP_TREE_DEPTH - arr.length).fill(padValue)]\n}\n\n/**\n * CommitmentInserted event — emitted by _insertLeaf() for ALL leaf insertions\n * (shield, transfer, merge, swap fill, swap claim, swap cancel).\n * This is the single canonical event for Merkle tree reconstruction.\n */\nconst COMMITMENT_INSERTED_EVENT = {\n type: 'event' as const,\n name: 'CommitmentInserted',\n inputs: [\n { type: 'bytes32', name: 'commitment', indexed: true },\n { type: 'uint256', name: 'leafIndex' },\n { type: 'uint256', name: 'timestamp' },\n ],\n}\n\n// ============================================================================\n// Merkle Tree Functions\n// ============================================================================\n\n/**\n * Fetch all commitments from the contract and build a Merkle tree\n *\n * @param publicClient - viem PublicClient\n * @param contractAddress - Contract address\n * @returns Object with tree and leaves array\n */\nexport async function syncMerkleTree(\n publicClient: PublicClient,\n contractAddress: Address\n): Promise<{ tree: ReturnType<typeof buildMerkleTree>; leaves: bigint[] }> {\n const currentBlock = await publicClient.getBlockNumber()\n const chainId = await publicClient.getChainId()\n\n // Use CommitmentInserted events — the canonical event emitted by _insertLeaf()\n // for ALL operations (shield, transfer, merge, swap fill/claim/cancel).\n // Each event has an explicit leafIndex, so ordering is deterministic.\n let commitmentLogs: any[] = []\n\n if (chainId === 31337) {\n // Anvil - single query is fine\n commitmentLogs = await publicClient.getLogs({\n address: contractAddress,\n event: COMMITMENT_INSERTED_EVENT,\n fromBlock: 0n,\n })\n } else {\n // Testnet/mainnet - paginate to avoid RPC limits\n const deployment = getDeployment(chainId)\n let fromBlock = deployment?.deployBlock ? BigInt(deployment.deployBlock) : 0n\n console.log(`[syncMerkleTree] Chain ${chainId}: scanning from block ${fromBlock} to ${currentBlock}`)\n\n while (fromBlock <= currentBlock) {\n const toBlock =\n fromBlock + RPC_CHUNK_SIZE > currentBlock ? currentBlock : fromBlock + RPC_CHUNK_SIZE\n const chunk = await publicClient.getLogs({\n address: contractAddress,\n event: COMMITMENT_INSERTED_EVENT,\n fromBlock,\n toBlock,\n })\n commitmentLogs = commitmentLogs.concat(chunk)\n fromBlock = toBlock + 1n\n }\n }\n\n // Sort by explicit leafIndex (most reliable), falling back to block+logIndex\n commitmentLogs.sort((a: any, b: any) => {\n const idxA = Number(a.args.leafIndex!)\n const idxB = Number(b.args.leafIndex!)\n return idxA - idxB\n })\n\n // Build leaves array using the explicit leafIndex from each event\n const leaves: bigint[] = []\n for (const log of commitmentLogs) {\n const leafIndex = Number(log.args.leafIndex!)\n const commitment = BigInt(log.args.commitment!)\n\n if (leaves.length !== leafIndex) {\n console.warn(\n `[syncMerkleTree] WARNING: Expected leafIndex ${leaves.length} but event has ${leafIndex}. ` +\n `This may indicate missed events or reorg.`\n )\n }\n leaves.push(commitment)\n }\n\n const tree = buildMerkleTree(leaves)\n\n // Debug: compare our root with on-chain root\n const ourRoot = await tree.getRoot()\n const onChainRoot = (await publicClient.readContract({\n address: contractAddress,\n abi: [\n {\n type: 'function',\n name: 'getMerkleRoot',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n ],\n functionName: 'getMerkleRoot',\n })) as bigint\n\n console.log(`[syncMerkleTree] Leaves count: ${leaves.length}`)\n console.log(`[syncMerkleTree] Tree depth: ${tree.depth}`)\n console.log(`[syncMerkleTree] Our computed root: ${ourRoot}`)\n console.log(`[syncMerkleTree] On-chain root: ${onChainRoot}`)\n console.log(`[syncMerkleTree] Roots match: ${ourRoot === onChainRoot}`)\n\n if (ourRoot !== onChainRoot) {\n console.log(`[syncMerkleTree] WARNING: Root mismatch!`)\n console.log(\n `[syncMerkleTree] Leaves:`,\n leaves.map((l) => '0x' + l.toString(16))\n )\n }\n\n return { tree, leaves }\n}\n\n/**\n * Get Merkle proofs for a set of notes\n *\n * @param notes - Notes to get proofs for\n * @param leaves - All leaves in the tree\n * @param tree - Merkle tree instance\n * @returns Array of proofs with associated notes\n */\nexport async function getMerkleProofsForNotes(\n notes: SpendableNote[],\n leaves: bigint[],\n tree: ReturnType<typeof buildMerkleTree>\n): Promise<MerkleProofWithNote[]> {\n const { verifyMerkleProof } = await import('../utils/merkle.js')\n const proofs: MerkleProofWithNote[] = []\n\n for (const note of notes) {\n const commitmentBI = BigInt(note.commitment)\n const leafIndex = leaves.findIndex((l) => l === commitmentBI)\n\n console.log(`[getMerkleProofsForNotes] Note commitment: ${note.commitment}`)\n console.log(`[getMerkleProofsForNotes] Note commitment as BigInt: ${commitmentBI}`)\n console.log(`[getMerkleProofsForNotes] Found at leafIndex: ${leafIndex}`)\n console.log(`[getMerkleProofsForNotes] Note's stored leafIndex: ${note.leafIndex}`)\n\n if (leafIndex === -1) {\n console.log(`[getMerkleProofsForNotes] Leaves in tree:`, leaves.map((l) => l.toString()))\n throw new Error(`Note ${note.commitment.slice(0, 10)}... not found on-chain`)\n }\n\n const proof = await tree.getProof(leafIndex)\n\n console.log(`[getMerkleProofsForNotes] Proof root: ${proof.root}`)\n console.log(`[getMerkleProofsForNotes] Proof leafIndex: ${proof.leafIndex}`)\n console.log(`[getMerkleProofsForNotes] PathElements:`, proof.pathElements.map((e) => e.toString()))\n console.log(`[getMerkleProofsForNotes] PathIndices:`, proof.pathIndices)\n\n // Verify the proof locally before returning\n const isValid = await verifyMerkleProof(commitmentBI, proof)\n console.log(`[getMerkleProofsForNotes] Local proof verification: ${isValid}`)\n\n if (!isValid) {\n console.error(`[getMerkleProofsForNotes] WARNING: Merkle proof is invalid!`)\n }\n\n proofs.push({ proof, note: { ...note, leafIndex } })\n }\n\n return proofs\n}\n\n// ============================================================================\n// Circuit Input Building\n// ============================================================================\n\n/**\n * Compute nullifier for a UPP note (BLS12-381)\n *\n * nullifier = Poseidon(ownerSecret, leafIndex, commitment)\n *\n * @param ownerSecret - Owner secret (hash preimage)\n * @param leafIndex - Leaf index in Merkle tree\n * @param commitment - Note commitment\n * @returns Nullifier as bigint\n */\nexport async function computeNullifier(\n ownerSecret: bigint,\n leafIndex: number,\n commitment: bigint\n): Promise<bigint> {\n return await poseidon([ownerSecret, BigInt(leafIndex), commitment])\n}\n\n/**\n * Note with amount for circuit building\n */\nexport interface NoteWithAmount extends NoteCreationResult {\n amount: bigint\n}\n\n/**\n * Build circuit inputs for UPP transfer (1-in-2-out)\n *\n * @param noteProof - Merkle proof for input note\n * @param aspProof - ASP membership proof for input note's origin\n * @param recipientNote - Output note for recipient\n * @param changeNote - Output note for change\n * @returns UPP transfer circuit inputs\n */\nexport async function buildUPPTransferCircuitInputs(\n noteProof: MerkleProofWithNote,\n aspProof: ASPProof,\n recipientNote: NoteWithAmount,\n changeNote: NoteWithAmount\n): Promise<UPPTransferCircuitInputs> {\n const { proof, note } = noteProof\n\n // Compute owner hash from secret (hash-based ownership)\n const inputOwnerHash = poseidonOwnerHash(BigInt(note.ownerSecret))\n\n // Verify input commitment locally\n // BLS12-381 commitment: Poseidon(amount, ownerHash, blinding, origin, token)\n const localInputCommitment = computeNoteCommitment(\n note.amount,\n inputOwnerHash,\n note.blinding,\n note.origin,\n note.token,\n )\n\n const storedCommitment = BigInt(note.commitment)\n if (localInputCommitment !== storedCommitment) {\n console.error(`[buildUPPTransferCircuitInputs] COMMITMENT MISMATCH`)\n console.error(` amount: ${note.amount}, ownerHash: ${inputOwnerHash}`)\n console.error(` blinding: ${note.blinding}, origin: ${note.origin}, token: ${note.token}`)\n console.error(` local=${localInputCommitment}, stored=${storedCommitment}`)\n throw new Error(\n `Note commitment mismatch — this note was created with an outdated commitment formula. ` +\n `Clear your shielded account (localStorage) and re-shield tokens.`\n )\n }\n\n const nullifier = await computeNullifier(\n BigInt(note.ownerSecret),\n proof.leafIndex,\n BigInt(note.commitment)\n )\n\n return {\n // Public inputs\n stateRoot: String(proof.root),\n aspRoot: String(aspProof.aspRoot),\n nullifier: String(nullifier),\n outputCommitment1: String(recipientNote.commitment),\n outputCommitment2: String(changeNote.commitment),\n token: String(note.token),\n\n // Private inputs - Input Note\n inputAmount: String(note.amount),\n inputOneTimeSecret: String(BigInt(note.ownerSecret)),\n inputBlinding: String(note.blinding),\n inputOrigin: String(note.origin),\n inputLeafIndex: String(proof.leafIndex),\n inputPathElements: padToStateTreeDepth(proof.pathElements.map((e) => String(e)), '0'),\n inputPathIndices: padToStateTreeDepth(proof.pathIndices.map(String), '0'),\n\n // Private inputs - ASP Membership Proof\n aspPathElements: padToASPTreeDepth(aspProof.aspPathElements.map((e) => String(e)), '0'),\n aspPathIndices: padToASPTreeDepth(aspProof.aspPathIndices.map(String), '0'),\n\n // Private inputs - Output Notes (hash-based ownership)\n outputAmount1: String(recipientNote.amount),\n outputOwnerHash1: String(recipientNote.ownerHash),\n outputBlinding1: String(recipientNote.blinding),\n\n outputAmount2: String(changeNote.amount),\n outputOwnerHash2: String(changeNote.ownerHash),\n outputBlinding2: String(changeNote.blinding),\n }\n}\n\n// ============================================================================\n// Transfer Building\n// ============================================================================\n\nimport { DEMO_ASP_ID } from './asp.js'\n\n/**\n * Build a UPP transfer (proof + outputs)\n *\n * This prepares everything needed to submit the transaction.\n * UPP transfer is 1-in-2-out with ASP membership proof.\n *\n * @param ctx - Transfer context\n * @param selectedNote - Note to spend (UPP transfer uses exactly 1 input)\n * @param recipientNote - Output note for recipient\n * @param changeNote - Output note for change\n * @param onStageChange - Optional callback for stage updates\n * @returns Transfer build result with proof and outputs\n */\nexport async function buildTransfer(\n ctx: TransferContext,\n selectedNote: SpendableNote,\n recipientNote: NoteWithAmount,\n changeNote: NoteWithAmount,\n onStageChange?: (stage: TransferStage) => void\n): Promise<TransferBuildResult> {\n // 1. Sync Merkle tree\n onStageChange?.('syncing_merkle')\n const { tree, leaves } = await syncMerkleTree(ctx.publicClient, ctx.contractAddress)\n\n // 2. Get Merkle proof for note\n const noteProofs = await getMerkleProofsForNotes([selectedNote], leaves, tree)\n const noteProof = noteProofs[0]!\n\n // 3. Generate ASP proof for the note's origin\n const aspProof = await generateASPProof(\n ctx.aspId ?? DEMO_ASP_ID,\n selectedNote.origin,\n ctx.aspApprovedOrigins\n )\n\n // 4. Build circuit inputs and generate proof\n onStageChange?.('generating_proof')\n\n const circuitInputs = await buildUPPTransferCircuitInputs(\n noteProof,\n aspProof,\n recipientNote,\n changeNote\n )\n\n const { proof } = await generateUPPProof(\n 'transfer',\n circuitInputs,\n ctx.circuitBaseUrl ?? '/circuits/'\n )\n\n const formattedProof = await formatPlonkProofForContract(proof)\n\n return {\n circuit: 'transfer',\n proof: formattedProof,\n publicSignals: proof.publicSignals,\n stateRoot: BigInt(circuitInputs.stateRoot),\n aspRoot: BigInt(circuitInputs.aspRoot),\n nullifier: BigInt(circuitInputs.nullifier),\n outputCommitment1: BigInt(circuitInputs.outputCommitment1),\n outputCommitment2: BigInt(circuitInputs.outputCommitment2),\n token: BigInt(circuitInputs.token),\n recipientOutput: recipientNote,\n changeOutput: changeNote,\n spentNotes: [selectedNote],\n }\n}\n\n/**\n * Format output for contract call (post-quantum)\n */\nexport function formatOutputForContract(note: NoteCreationResult): {\n commitment: Hex\n searchTag: bigint\n ownerHash: bigint\n encryptedNote: Hex\n} {\n return {\n commitment: toHex(note.commitment, { size: 32 }),\n searchTag: note.searchTag,\n ownerHash: note.ownerHash,\n encryptedNote: note.encryptedNote as Hex,\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/deployments/31337.json","../src/deployments/11155111.json","../src/deployments/index.ts","../src/core/transfer.ts"],"names":["__default"],"mappings":"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","file":"chunk-XDWRMHLY.js","sourcesContent":["{\n \"UniversalPrivatePool\": \"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6\",\n \"ASPRegistryHub\": \"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512\",\n \"TestToken\": \"0x610178da211fef7d417bc0e6fed39f05609ad788\",\n \"TestToken2\": \"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e\",\n \"verifiers\": {\n \"TransferVerifier\": \"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0\",\n \"MergeVerifier\": \"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9\",\n \"WithdrawVerifier\": \"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9\",\n \"JoinSplitVerifier\": \"0x5fc8d32690cc91d4c39d9d3abcbd16989f875707\",\n \"MergeTransfer2x2Verifier\": \"0x0165878a594ca255338adfa4d48449f69242eb8f\",\n \"MergeTransfer4x2Verifier\": \"0xa513e6e4b8f2a923d98304ec87f64353c4d5c853\"\n },\n \"starkVerifiers\": {\n \"CircleStarkVerifier\": \"0x0dcd1bf9a1b36ce34237eeafef220932846bcd82\"\n },\n \"deployBlock\": 1,\n \"deployTimestamp\": 1774728354492\n}\n","{\n \"UniversalPrivatePool\": \"0xba5405375ee4c1b5fdcb1b755381edcc38ae28f2\",\n \"ASPRegistryHub\": \"0xfd11c56a23314aa88dfbcc36254f33e5e8b010df\",\n \"TestToken\": \"0xc3cef670aae8228de206c98b67c3d25c520b8f14\",\n \"TestToken2\": \"0x4de3efd64d4ce9a4b45f538104bdbaadaf170bed\",\n \"verifiers\": {\n \"TransferVerifier\": \"0xe4a737e8e3100709986e1992d8e18cf324965320\",\n \"MergeVerifier\": \"0x3a844672f792d3b1216e4e64acd8c5d0301a3a3e\",\n \"WithdrawVerifier\": \"0x387afb8566d446c8344e03b8a9c54ba96b22233d\",\n \"JoinSplitVerifier\": \"0xe03c270de9b33f72a0656b07ed43f3269d586607\",\n \"MergeTransfer2x2Verifier\": \"0xbc1378d567abdfad063cd32b684e03ca29e79b99\",\n \"MergeTransfer4x2Verifier\": \"0xd1f75b988e6fd6003204bda6e83eb3186a8dec34\"\n },\n \"starkVerifiers\": {\n \"CircleStarkVerifier\": \"0xc92ba214653c616c4546d7edcb7aba8ced3e0a94\"\n },\n \"deployBlock\": 10555332,\n \"deployTimestamp\": 1774895534634,\n \"proofSystem\": \"PLONK\",\n \"curve\": \"BLS12-381\",\n \"verifierType\": \"PlonkVerifierBLS12381\"\n}\n","/**\n * Deployment Configuration Loader\n *\n * Loads contract addresses based on chain ID.\n * Built-in: Anvil (31337) and Sepolia (11155111).\n * Custom chains can be registered at runtime via registerDeployment().\n */\n\nimport type { Address } from \"viem\";\n\n/**\n * Verifier contract addresses\n */\nexport interface VerifierAddresses {\n TransferVerifier: Address;\n MergeVerifier: Address;\n WithdrawVerifier: Address;\n JoinSplitVerifier?: Address;\n MergeTransfer2x2Verifier?: Address;\n MergeTransfer4x2Verifier?: Address;\n}\n\n/**\n * STARK verifier contract addresses\n */\nexport interface StarkVerifierAddresses {\n CircleStarkVerifier?: Address;\n}\n\n/**\n * Deployment configuration for a chain\n */\nexport interface DeploymentConfig {\n /** Universal Private Pool contract address */\n UniversalPrivatePool: Address;\n /** ASP Registry Hub contract address */\n ASPRegistryHub: Address;\n /** Test token address (local/testnet) */\n TestToken?: Address;\n /** Test token 2 address — bonding curve token (local/testnet) */\n TestToken2?: Address;\n /** Verifier contract addresses */\n verifiers: VerifierAddresses;\n /** STARK verifier contract addresses */\n starkVerifiers?: StarkVerifierAddresses;\n /** Chain ID */\n chainId: number;\n /** Block number when contracts were deployed (for efficient scanning) */\n deployBlock: number;\n /** Timestamp when contracts were deployed */\n deployTimestamp?: number;\n}\n\n/**\n * Raw JSON file format (without chainId, which is added dynamically)\n */\ninterface DeploymentJSON {\n UniversalPrivatePool: string;\n ASPRegistryHub: string;\n TestToken?: string;\n TestToken2?: string;\n verifiers: {\n TransferVerifier: string;\n MergeVerifier: string;\n WithdrawVerifier: string;\n JoinSplitVerifier?: string;\n MergeTransfer2x2Verifier?: string;\n MergeTransfer4x2Verifier?: string;\n };\n starkVerifiers?: {\n CircleStarkVerifier?: string;\n };\n deployBlock: number;\n deployTimestamp?: number;\n}\n\n/**\n * Parse raw deployment JSON into typed config\n */\nfunction parseDeployment(\n json: DeploymentJSON,\n chainId: number\n): DeploymentConfig {\n return {\n UniversalPrivatePool: json.UniversalPrivatePool as Address,\n ASPRegistryHub: json.ASPRegistryHub as Address,\n TestToken: json.TestToken as Address | undefined,\n TestToken2: json.TestToken2 as Address | undefined,\n verifiers: {\n TransferVerifier: json.verifiers.TransferVerifier as Address,\n MergeVerifier: json.verifiers.MergeVerifier as Address,\n WithdrawVerifier: json.verifiers.WithdrawVerifier as Address,\n JoinSplitVerifier: json.verifiers.JoinSplitVerifier as Address | undefined,\n MergeTransfer2x2Verifier: json.verifiers\n .MergeTransfer2x2Verifier as Address | undefined,\n MergeTransfer4x2Verifier: json.verifiers\n .MergeTransfer4x2Verifier as Address | undefined,\n },\n starkVerifiers: json.starkVerifiers\n ? {\n CircleStarkVerifier: json.starkVerifiers\n .CircleStarkVerifier as Address | undefined,\n }\n : undefined,\n chainId,\n deployBlock: json.deployBlock,\n deployTimestamp: json.deployTimestamp,\n };\n}\n\n// Import deployment configs\n// These will be updated by the extract-deployment.js script\nimport anvil from \"./31337.json\" with { type: \"json\" };\nimport sepolia from \"./11155111.json\" with { type: \"json\" };\n\nconst deployments: Record<number, DeploymentConfig> = {\n 31337: parseDeployment(anvil as unknown as DeploymentJSON, 31337),\n 11155111: parseDeployment(sepolia as unknown as DeploymentJSON, 11155111),\n};\n\n/**\n * Get deployment config for a chain\n *\n * @param chainId - Chain ID to get deployment for\n * @returns Deployment config or null if not found\n *\n * @example\n * ```ts\n * const deployment = getDeployment(31337)\n * if (deployment) {\n * console.log('Pool address:', deployment.UniversalPrivatePool)\n * }\n * ```\n */\nexport function getDeployment(chainId: number): DeploymentConfig | null {\n return deployments[chainId] ?? null;\n}\n\n/**\n * Get deployment config or throw if not found\n *\n * @param chainId - Chain ID to get deployment for\n * @returns Deployment config\n * @throws Error if deployment not found\n */\nexport function getDeploymentOrThrow(chainId: number): DeploymentConfig {\n const deployment = getDeployment(chainId);\n if (!deployment) {\n throw new Error(\n `No deployment found for chain ${chainId}. ` +\n `Supported chains: ${Object.keys(deployments).join(\", \")}`\n );\n }\n return deployment;\n}\n\n/**\n * Check if a chain has a deployment\n */\nexport function hasDeployment(chainId: number): boolean {\n return chainId in deployments;\n}\n\n/**\n * Get all supported chain IDs\n */\nexport function getSupportedChainIds(): number[] {\n return Object.keys(deployments).map(Number);\n}\n\n/**\n * Get the token address for a chain\n */\nexport function getTokenAddress(chainId: number): Address | null {\n const deployment = getDeployment(chainId);\n if (!deployment) return null;\n return deployment.TestToken ?? null;\n}\n\n/**\n * Register a deployment for a custom chain at runtime.\n *\n * Use this when deploying your own pool on a chain not built into the SDK.\n * Overrides any existing deployment for the same chainId.\n *\n * @example\n * ```ts\n * registerDeployment(8453, {\n * UniversalPrivatePool: '0x...',\n * ASPRegistryHub: '0x...',\n * verifiers: { TransferVerifier: '0x...', MergeVerifier: '0x...', WithdrawVerifier: '0x...' },\n * chainId: 8453,\n * deployBlock: 12345678,\n * })\n * ```\n */\nexport function registerDeployment(chainId: number, config: DeploymentConfig): void {\n deployments[chainId] = { ...config, chainId };\n}\n","/**\n * Transfer Module\n *\n * Core logic for building and executing UPP transfers.\n * This module is framework-agnostic (no React).\n */\n\nimport { toHex, type Address, type Hex, type PublicClient } from 'viem'\nimport { getDeployment } from '../deployments/index.js'\nimport { buildMerkleTree, type MerkleProof } from '../utils/merkle.js'\nimport { poseidon, computeOwnerHash as poseidonOwnerHash, computeNoteCommitment } from '../utils/poseidon.js'\nimport {\n generateUPPProof,\n formatPlonkProofForContract,\n STATE_TREE_DEPTH,\n ASP_TREE_DEPTH,\n type UPPCircuitType,\n type UPPTransferCircuitInputs,\n type PlonkProofStruct,\n} from './proof.js'\nimport { generateASPProof, type ASPProof } from './asp.js'\nimport type { NoteCreationResult } from '../react/use-upp-account.js'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Transfer stage for progress tracking\n */\nexport type TransferStage =\n | 'selecting_notes'\n | 'syncing_merkle'\n | 'creating_outputs'\n | 'generating_proof'\n | 'submitting_tx'\n | 'confirming'\n\n/**\n * A shielded note with all data needed for spending\n *\n * Post-quantum: uses ownerSecret/ownerHash instead of BabyJubJub one-time keys.\n * Ownership is proven via hash preimage: Poseidon(ownerSecret) == ownerHash.\n */\nexport interface SpendableNote {\n amount: bigint\n blinding: bigint\n commitment: string\n /** Owner secret (hash preimage for ownership proof) */\n ownerSecret: string\n /** Owner hash = Poseidon(ownerSecret) - committed in the note */\n ownerHash: string\n leafIndex: number\n /** Origin address (depositor) - required for UPP circuits */\n origin: bigint\n /** Token address - required for UPP circuits */\n token: bigint\n}\n\n/**\n * Merkle proof with associated note\n */\nexport interface MerkleProofWithNote {\n proof: MerkleProof\n note: SpendableNote\n}\n\n/**\n * Transfer context (dependencies)\n */\nexport interface TransferContext {\n /** viem PublicClient for RPC calls */\n publicClient: PublicClient\n /** Contract address */\n contractAddress: Address\n /** Chain ID */\n chainId: number\n /** Circuit base URL (default: '/circuits/') */\n circuitBaseUrl?: string\n /** ASP ID to use (default: DEMO_ASP_ID) */\n aspId?: bigint\n /** All approved origins in the ASP tree (enables multi-origin proofs) */\n aspApprovedOrigins?: bigint[]\n}\n\n/**\n * Transfer result\n */\nexport interface TransferBuildResult {\n /** Circuit type used */\n circuit: UPPCircuitType\n /** Formatted PLONK proof for contract */\n proof: {\n proofStruct: PlonkProofStruct\n publicSignals: bigint[]\n }\n /** Public signals from proof */\n publicSignals: string[]\n /** State tree root */\n stateRoot: bigint\n /** ASP tree root */\n aspRoot: bigint\n /** Nullifier hash */\n nullifier: bigint\n /** Output commitment 1 */\n outputCommitment1: bigint\n /** Output commitment 2 */\n outputCommitment2: bigint\n /** Token address */\n token: bigint\n /** Recipient output */\n recipientOutput: NoteCreationResult\n /** Change output */\n changeOutput: NoteCreationResult\n /** Notes that will be spent */\n spentNotes: SpendableNote[]\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Chunk size for paginated RPC queries on testnets */\nconst RPC_CHUNK_SIZE = 9000n\n\n/**\n * Pad an array to the state tree depth (32 levels)\n * @param arr - Array to pad\n * @param padValue - Value to use for padding (default: '0')\n * @returns Padded array of length STATE_TREE_DEPTH\n */\nfunction padToStateTreeDepth<T>(arr: T[], padValue: T): T[] {\n if (arr.length >= STATE_TREE_DEPTH) {\n return arr.slice(0, STATE_TREE_DEPTH)\n }\n return [...arr, ...Array(STATE_TREE_DEPTH - arr.length).fill(padValue)]\n}\n\n/**\n * Pad an array to the ASP tree depth (20 levels)\n * @param arr - Array to pad\n * @param padValue - Value to use for padding (default: '0')\n * @returns Padded array of length ASP_TREE_DEPTH\n */\nfunction padToASPTreeDepth<T>(arr: T[], padValue: T): T[] {\n if (arr.length >= ASP_TREE_DEPTH) {\n return arr.slice(0, ASP_TREE_DEPTH)\n }\n return [...arr, ...Array(ASP_TREE_DEPTH - arr.length).fill(padValue)]\n}\n\n/**\n * CommitmentInserted event — emitted by _insertLeaf() for ALL leaf insertions\n * (shield, transfer, merge, swap fill, swap claim, swap cancel).\n * This is the single canonical event for Merkle tree reconstruction.\n */\nconst COMMITMENT_INSERTED_EVENT = {\n type: 'event' as const,\n name: 'CommitmentInserted',\n inputs: [\n { type: 'bytes32', name: 'commitment', indexed: true },\n { type: 'uint256', name: 'leafIndex' },\n { type: 'uint256', name: 'timestamp' },\n ],\n}\n\n// ============================================================================\n// Merkle Tree Functions\n// ============================================================================\n\n/**\n * Fetch all commitments from the contract and build a Merkle tree\n *\n * @param publicClient - viem PublicClient\n * @param contractAddress - Contract address\n * @returns Object with tree and leaves array\n */\nexport async function syncMerkleTree(\n publicClient: PublicClient,\n contractAddress: Address\n): Promise<{ tree: ReturnType<typeof buildMerkleTree>; leaves: bigint[] }> {\n const currentBlock = await publicClient.getBlockNumber()\n const chainId = await publicClient.getChainId()\n\n // Use CommitmentInserted events — the canonical event emitted by _insertLeaf()\n // for ALL operations (shield, transfer, merge, swap fill/claim/cancel).\n // Each event has an explicit leafIndex, so ordering is deterministic.\n let commitmentLogs: any[] = []\n\n if (chainId === 31337) {\n // Anvil - single query is fine\n commitmentLogs = await publicClient.getLogs({\n address: contractAddress,\n event: COMMITMENT_INSERTED_EVENT,\n fromBlock: 0n,\n })\n } else {\n // Testnet/mainnet - paginate to avoid RPC limits\n const deployment = getDeployment(chainId)\n let fromBlock = deployment?.deployBlock ? BigInt(deployment.deployBlock) : 0n\n console.log(`[syncMerkleTree] Chain ${chainId}: scanning from block ${fromBlock} to ${currentBlock}`)\n\n while (fromBlock <= currentBlock) {\n const toBlock =\n fromBlock + RPC_CHUNK_SIZE > currentBlock ? currentBlock : fromBlock + RPC_CHUNK_SIZE\n const chunk = await publicClient.getLogs({\n address: contractAddress,\n event: COMMITMENT_INSERTED_EVENT,\n fromBlock,\n toBlock,\n })\n commitmentLogs = commitmentLogs.concat(chunk)\n fromBlock = toBlock + 1n\n }\n }\n\n // Sort by explicit leafIndex (most reliable), falling back to block+logIndex\n commitmentLogs.sort((a: any, b: any) => {\n const idxA = Number(a.args.leafIndex!)\n const idxB = Number(b.args.leafIndex!)\n return idxA - idxB\n })\n\n // Build leaves array using the explicit leafIndex from each event\n const leaves: bigint[] = []\n for (const log of commitmentLogs) {\n const leafIndex = Number(log.args.leafIndex!)\n const commitment = BigInt(log.args.commitment!)\n\n if (leaves.length !== leafIndex) {\n console.warn(\n `[syncMerkleTree] WARNING: Expected leafIndex ${leaves.length} but event has ${leafIndex}. ` +\n `This may indicate missed events or reorg.`\n )\n }\n leaves.push(commitment)\n }\n\n const tree = buildMerkleTree(leaves)\n\n // Debug: compare our root with on-chain root\n const ourRoot = await tree.getRoot()\n const onChainRoot = (await publicClient.readContract({\n address: contractAddress,\n abi: [\n {\n type: 'function',\n name: 'getMerkleRoot',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n ],\n functionName: 'getMerkleRoot',\n })) as bigint\n\n console.log(`[syncMerkleTree] Leaves count: ${leaves.length}`)\n console.log(`[syncMerkleTree] Tree depth: ${tree.depth}`)\n console.log(`[syncMerkleTree] Our computed root: ${ourRoot}`)\n console.log(`[syncMerkleTree] On-chain root: ${onChainRoot}`)\n console.log(`[syncMerkleTree] Roots match: ${ourRoot === onChainRoot}`)\n\n if (ourRoot !== onChainRoot) {\n console.log(`[syncMerkleTree] WARNING: Root mismatch!`)\n console.log(\n `[syncMerkleTree] Leaves:`,\n leaves.map((l) => '0x' + l.toString(16))\n )\n }\n\n return { tree, leaves }\n}\n\n/**\n * Get Merkle proofs for a set of notes\n *\n * @param notes - Notes to get proofs for\n * @param leaves - All leaves in the tree\n * @param tree - Merkle tree instance\n * @returns Array of proofs with associated notes\n */\nexport async function getMerkleProofsForNotes(\n notes: SpendableNote[],\n leaves: bigint[],\n tree: ReturnType<typeof buildMerkleTree>\n): Promise<MerkleProofWithNote[]> {\n const { verifyMerkleProof } = await import('../utils/merkle.js')\n const proofs: MerkleProofWithNote[] = []\n\n for (const note of notes) {\n const commitmentBI = BigInt(note.commitment)\n const leafIndex = leaves.findIndex((l) => l === commitmentBI)\n\n console.log(`[getMerkleProofsForNotes] Note commitment: ${note.commitment}`)\n console.log(`[getMerkleProofsForNotes] Note commitment as BigInt: ${commitmentBI}`)\n console.log(`[getMerkleProofsForNotes] Found at leafIndex: ${leafIndex}`)\n console.log(`[getMerkleProofsForNotes] Note's stored leafIndex: ${note.leafIndex}`)\n\n if (leafIndex === -1) {\n console.log(`[getMerkleProofsForNotes] Leaves in tree:`, leaves.map((l) => l.toString()))\n throw new Error(`Note ${note.commitment.slice(0, 10)}... not found on-chain`)\n }\n\n const proof = await tree.getProof(leafIndex)\n\n console.log(`[getMerkleProofsForNotes] Proof root: ${proof.root}`)\n console.log(`[getMerkleProofsForNotes] Proof leafIndex: ${proof.leafIndex}`)\n console.log(`[getMerkleProofsForNotes] PathElements:`, proof.pathElements.map((e) => e.toString()))\n console.log(`[getMerkleProofsForNotes] PathIndices:`, proof.pathIndices)\n\n // Verify the proof locally before returning\n const isValid = await verifyMerkleProof(commitmentBI, proof)\n console.log(`[getMerkleProofsForNotes] Local proof verification: ${isValid}`)\n\n if (!isValid) {\n console.error(`[getMerkleProofsForNotes] WARNING: Merkle proof is invalid!`)\n }\n\n proofs.push({ proof, note: { ...note, leafIndex } })\n }\n\n return proofs\n}\n\n// ============================================================================\n// Circuit Input Building\n// ============================================================================\n\n/**\n * Compute nullifier for a UPP note (BLS12-381)\n *\n * nullifier = Poseidon(ownerSecret, leafIndex, commitment)\n *\n * @param ownerSecret - Owner secret (hash preimage)\n * @param leafIndex - Leaf index in Merkle tree\n * @param commitment - Note commitment\n * @returns Nullifier as bigint\n */\nexport async function computeNullifier(\n ownerSecret: bigint,\n leafIndex: number,\n commitment: bigint\n): Promise<bigint> {\n return await poseidon([ownerSecret, BigInt(leafIndex), commitment])\n}\n\n/**\n * Note with amount for circuit building\n */\nexport interface NoteWithAmount extends NoteCreationResult {\n amount: bigint\n}\n\n/**\n * Build circuit inputs for UPP transfer (1-in-2-out)\n *\n * @param noteProof - Merkle proof for input note\n * @param aspProof - ASP membership proof for input note's origin\n * @param recipientNote - Output note for recipient\n * @param changeNote - Output note for change\n * @returns UPP transfer circuit inputs\n */\nexport async function buildUPPTransferCircuitInputs(\n noteProof: MerkleProofWithNote,\n aspProof: ASPProof,\n recipientNote: NoteWithAmount,\n changeNote: NoteWithAmount\n): Promise<UPPTransferCircuitInputs> {\n const { proof, note } = noteProof\n\n // Compute owner hash from secret (hash-based ownership)\n const inputOwnerHash = poseidonOwnerHash(BigInt(note.ownerSecret))\n\n // Verify input commitment locally\n // BLS12-381 commitment: Poseidon(amount, ownerHash, blinding, origin, token)\n const localInputCommitment = computeNoteCommitment(\n note.amount,\n inputOwnerHash,\n note.blinding,\n note.origin,\n note.token,\n )\n\n const storedCommitment = BigInt(note.commitment)\n if (localInputCommitment !== storedCommitment) {\n console.error(`[buildUPPTransferCircuitInputs] COMMITMENT MISMATCH`)\n console.error(` amount: ${note.amount}, ownerHash: ${inputOwnerHash}`)\n console.error(` blinding: ${note.blinding}, origin: ${note.origin}, token: ${note.token}`)\n console.error(` local=${localInputCommitment}, stored=${storedCommitment}`)\n throw new Error(\n `Note commitment mismatch — this note was created with an outdated commitment formula. ` +\n `Clear your shielded account (localStorage) and re-shield tokens.`\n )\n }\n\n const nullifier = await computeNullifier(\n BigInt(note.ownerSecret),\n proof.leafIndex,\n BigInt(note.commitment)\n )\n\n return {\n // Public inputs\n stateRoot: String(proof.root),\n aspRoot: String(aspProof.aspRoot),\n nullifier: String(nullifier),\n outputCommitment1: String(recipientNote.commitment),\n outputCommitment2: String(changeNote.commitment),\n token: String(note.token),\n\n // Private inputs - Input Note\n inputAmount: String(note.amount),\n inputOneTimeSecret: String(BigInt(note.ownerSecret)),\n inputBlinding: String(note.blinding),\n inputOrigin: String(note.origin),\n inputLeafIndex: String(proof.leafIndex),\n inputPathElements: padToStateTreeDepth(proof.pathElements.map((e) => String(e)), '0'),\n inputPathIndices: padToStateTreeDepth(proof.pathIndices.map(String), '0'),\n\n // Private inputs - ASP Membership Proof\n aspPathElements: padToASPTreeDepth(aspProof.aspPathElements.map((e) => String(e)), '0'),\n aspPathIndices: padToASPTreeDepth(aspProof.aspPathIndices.map(String), '0'),\n\n // Private inputs - Output Notes (hash-based ownership)\n outputAmount1: String(recipientNote.amount),\n outputOwnerHash1: String(recipientNote.ownerHash),\n outputBlinding1: String(recipientNote.blinding),\n\n outputAmount2: String(changeNote.amount),\n outputOwnerHash2: String(changeNote.ownerHash),\n outputBlinding2: String(changeNote.blinding),\n }\n}\n\n// ============================================================================\n// Transfer Building\n// ============================================================================\n\nimport { DEMO_ASP_ID } from './asp.js'\n\n/**\n * Build a UPP transfer (proof + outputs)\n *\n * This prepares everything needed to submit the transaction.\n * UPP transfer is 1-in-2-out with ASP membership proof.\n *\n * @param ctx - Transfer context\n * @param selectedNote - Note to spend (UPP transfer uses exactly 1 input)\n * @param recipientNote - Output note for recipient\n * @param changeNote - Output note for change\n * @param onStageChange - Optional callback for stage updates\n * @returns Transfer build result with proof and outputs\n */\nexport async function buildTransfer(\n ctx: TransferContext,\n selectedNote: SpendableNote,\n recipientNote: NoteWithAmount,\n changeNote: NoteWithAmount,\n onStageChange?: (stage: TransferStage) => void\n): Promise<TransferBuildResult> {\n // 1. Sync Merkle tree\n onStageChange?.('syncing_merkle')\n const { tree, leaves } = await syncMerkleTree(ctx.publicClient, ctx.contractAddress)\n\n // 2. Get Merkle proof for note\n const noteProofs = await getMerkleProofsForNotes([selectedNote], leaves, tree)\n const noteProof = noteProofs[0]!\n\n // 3. Generate ASP proof for the note's origin\n const aspProof = await generateASPProof(\n ctx.aspId ?? DEMO_ASP_ID,\n selectedNote.origin,\n ctx.aspApprovedOrigins\n )\n\n // 4. Build circuit inputs and generate proof\n onStageChange?.('generating_proof')\n\n const circuitInputs = await buildUPPTransferCircuitInputs(\n noteProof,\n aspProof,\n recipientNote,\n changeNote\n )\n\n const { proof } = await generateUPPProof(\n 'transfer',\n circuitInputs,\n ctx.circuitBaseUrl ?? '/circuits/'\n )\n\n const formattedProof = await formatPlonkProofForContract(proof)\n\n return {\n circuit: 'transfer',\n proof: formattedProof,\n publicSignals: proof.publicSignals,\n stateRoot: BigInt(circuitInputs.stateRoot),\n aspRoot: BigInt(circuitInputs.aspRoot),\n nullifier: BigInt(circuitInputs.nullifier),\n outputCommitment1: BigInt(circuitInputs.outputCommitment1),\n outputCommitment2: BigInt(circuitInputs.outputCommitment2),\n token: BigInt(circuitInputs.token),\n recipientOutput: recipientNote,\n changeOutput: changeNote,\n spentNotes: [selectedNote],\n }\n}\n\n/**\n * Format output for contract call (post-quantum)\n */\nexport function formatOutputForContract(note: NoteCreationResult): {\n commitment: Hex\n searchTag: bigint\n ownerHash: bigint\n encryptedNote: Hex\n} {\n return {\n commitment: toHex(note.commitment, { size: 32 }),\n searchTag: note.searchTag,\n ownerHash: note.ownerHash,\n encryptedNote: note.encryptedNote as Hex,\n }\n}\n"]}
|