@permissionless-technologies/upp-sdk 0.4.21 → 0.4.23
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 +37 -3
- package/dist/chunk-2BSIUEPO.js +343 -0
- package/dist/chunk-2BSIUEPO.js.map +1 -0
- package/dist/{chunk-YHBUCKVS.cjs → chunk-5MK5R7M7.cjs} +24 -24
- package/dist/{chunk-YHBUCKVS.cjs.map → chunk-5MK5R7M7.cjs.map} +1 -1
- 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-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-ND56VNCF.js → chunk-R4O6FOIN.js} +2 -2
- package/dist/{chunk-ND56VNCF.js.map → chunk-R4O6FOIN.js.map} +1 -1
- package/dist/{chunk-OLJFKARA.js → chunk-TVF6FYTQ.js} +16 -16
- package/dist/{chunk-OLJFKARA.js.map → chunk-TVF6FYTQ.js.map} +1 -1
- 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-UWW4GFZ3.cjs} +2 -2
- package/dist/{chunk-PZAV2S5E.cjs.map → chunk-UWW4GFZ3.cjs.map} +1 -1
- package/dist/chunk-VVW5VVY3.cjs +347 -0
- package/dist/chunk-VVW5VVY3.cjs.map +1 -0
- package/dist/core/index.cjs +85 -72
- package/dist/core/index.d.cts +2 -2
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +6 -5
- 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 +231 -218
- 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 +8 -7
- 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-M3PKP4PY.cjs} +12 -11
- package/dist/{transfer-7IFAXV5K.cjs.map → transfer-M3PKP4PY.cjs.map} +1 -1
- package/dist/{transfer-FWCRUWWM.js → transfer-RA7R3KQY.js} +6 -5
- package/dist/{transfer-FWCRUWWM.js.map → transfer-RA7R3KQY.js.map} +1 -1
- package/package.json +2 -2
- 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"]}
|