@unlink-xyz/core 0.1.2 → 0.1.3-canary.0877bfe
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/dist/account/{zkAccount.d.ts → account.d.ts} +7 -5
- package/dist/account/account.d.ts.map +1 -0
- package/dist/account/{zkAccount.js → account.js} +57 -43
- package/dist/browser/index.js +108202 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/circuits.json +74 -0
- package/dist/clients/broadcaster.d.ts +7 -2
- package/dist/clients/broadcaster.d.ts.map +1 -1
- package/dist/clients/broadcaster.js +9 -1
- package/dist/clients/http.d.ts +6 -0
- package/dist/clients/http.d.ts.map +1 -1
- package/dist/clients/http.js +24 -9
- package/dist/clients/indexer.d.ts +11 -0
- package/dist/clients/indexer.d.ts.map +1 -1
- package/dist/clients/indexer.js +40 -11
- package/dist/config.d.ts +28 -9
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +33 -26
- package/dist/constants.d.ts +6 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +5 -0
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +5 -2
- package/dist/crypto-adapters/auto-init.d.ts +2 -0
- package/dist/crypto-adapters/auto-init.d.ts.map +1 -0
- package/dist/crypto-adapters/auto-init.js +7 -0
- package/dist/crypto-adapters/index.d.ts +22 -0
- package/dist/crypto-adapters/index.d.ts.map +1 -0
- package/dist/crypto-adapters/index.js +47 -0
- package/dist/crypto-adapters/polyfills.d.ts +5 -0
- package/dist/crypto-adapters/polyfills.d.ts.map +1 -0
- package/dist/crypto-adapters/polyfills.js +8 -0
- package/dist/errors.d.ts +9 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +18 -0
- package/dist/history/index.d.ts +3 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/index.js +2 -0
- package/dist/history/service.d.ts +46 -0
- package/dist/history/service.d.ts.map +1 -0
- package/dist/history/service.js +354 -0
- package/dist/history/types.d.ts +21 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/index.d.ts +12 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -4
- package/dist/keys/address.d.ts +13 -0
- package/dist/keys/address.d.ts.map +1 -0
- package/dist/keys/address.js +55 -0
- package/dist/keys/derive.d.ts +37 -0
- package/dist/keys/derive.d.ts.map +1 -0
- package/dist/keys/derive.js +112 -0
- package/dist/keys/hex.d.ts +17 -0
- package/dist/keys/hex.d.ts.map +1 -0
- package/dist/keys/hex.js +66 -0
- package/dist/keys/index.d.ts +5 -0
- package/dist/keys/index.d.ts.map +1 -0
- package/dist/keys/index.js +4 -0
- package/dist/keys/mnemonic.d.ts +8 -0
- package/dist/keys/mnemonic.d.ts.map +1 -0
- package/dist/keys/mnemonic.js +23 -0
- package/dist/keys.d.ts +4 -1
- package/dist/keys.d.ts.map +1 -1
- package/dist/keys.js +4 -0
- package/dist/prover/config.d.ts +1 -15
- package/dist/prover/config.d.ts.map +1 -1
- package/dist/prover/config.js +1 -11
- package/dist/prover/prover.d.ts +15 -4
- package/dist/prover/prover.d.ts.map +1 -1
- package/dist/prover/prover.js +115 -98
- package/dist/prover/registry.d.ts +3 -30
- package/dist/prover/registry.d.ts.map +1 -1
- package/dist/prover/registry.js +12 -51
- package/dist/state/merkle/hydrator.d.ts.map +1 -1
- package/dist/state/merkle/hydrator.js +3 -2
- package/dist/state/merkle/index.d.ts +1 -1
- package/dist/state/merkle/index.d.ts.map +1 -1
- package/dist/state/merkle/index.js +1 -1
- package/dist/state/merkle/merkle-tree.d.ts +8 -0
- package/dist/state/merkle/merkle-tree.d.ts.map +1 -1
- package/dist/state/merkle/merkle-tree.js +16 -7
- package/dist/state/store/ciphertext-store.d.ts +4 -0
- package/dist/state/store/ciphertext-store.d.ts.map +1 -1
- package/dist/state/store/ciphertext-store.js +12 -0
- package/dist/state/store/history-store.d.ts +24 -0
- package/dist/state/store/history-store.d.ts.map +1 -0
- package/dist/state/store/history-store.js +53 -0
- package/dist/state/store/index.d.ts +3 -2
- package/dist/state/store/index.d.ts.map +1 -1
- package/dist/state/store/index.js +1 -0
- package/dist/state/store/job-store.d.ts +7 -7
- package/dist/state/store/job-store.d.ts.map +1 -1
- package/dist/state/store/job-store.js +65 -39
- package/dist/state/store/jobs.d.ts +65 -18
- package/dist/state/store/jobs.d.ts.map +1 -1
- package/dist/state/store/leaf-store.d.ts.map +1 -1
- package/dist/state/store/leaf-store.js +0 -3
- package/dist/state/store/note-store.d.ts +7 -7
- package/dist/state/store/note-store.d.ts.map +1 -1
- package/dist/state/store/note-store.js +38 -34
- package/dist/state/store/nullifier-store.d.ts +9 -0
- package/dist/state/store/nullifier-store.d.ts.map +1 -1
- package/dist/state/store/nullifier-store.js +32 -2
- package/dist/state/store/records.d.ts +31 -2
- package/dist/state/store/records.d.ts.map +1 -1
- package/dist/state/store/root-store.d.ts.map +1 -1
- package/dist/state/store/root-store.js +0 -4
- package/dist/state/store/store.d.ts +61 -27
- package/dist/state/store/store.d.ts.map +1 -1
- package/dist/state/store/store.js +92 -1
- package/dist/storage/indexeddb.js +1 -1
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/storage/memory.js +5 -1
- package/dist/transactions/deposit.d.ts +12 -15
- package/dist/transactions/deposit.d.ts.map +1 -1
- package/dist/transactions/deposit.js +203 -152
- package/dist/transactions/index.d.ts +7 -4
- package/dist/transactions/index.d.ts.map +1 -1
- package/dist/transactions/index.js +7 -2
- package/dist/transactions/note-selection.d.ts +17 -0
- package/dist/transactions/note-selection.d.ts.map +1 -0
- package/dist/transactions/note-selection.js +201 -0
- package/dist/transactions/note-sync.d.ts +5 -33
- package/dist/transactions/note-sync.d.ts.map +1 -1
- package/dist/transactions/note-sync.js +320 -155
- package/dist/transactions/reconcile.d.ts +10 -12
- package/dist/transactions/reconcile.d.ts.map +1 -1
- package/dist/transactions/reconcile.js +53 -7
- package/dist/transactions/transact.d.ts +13 -24
- package/dist/transactions/transact.d.ts.map +1 -1
- package/dist/transactions/transact.js +393 -507
- package/dist/transactions/transaction-planner.d.ts +34 -0
- package/dist/transactions/transaction-planner.d.ts.map +1 -0
- package/dist/transactions/transaction-planner.js +116 -0
- package/dist/transactions/transfer-planner.d.ts +36 -0
- package/dist/transactions/transfer-planner.d.ts.map +1 -0
- package/dist/transactions/transfer-planner.js +85 -0
- package/dist/transactions/types/deposit.d.ts +67 -0
- package/dist/transactions/types/deposit.d.ts.map +1 -0
- package/dist/transactions/types/domain.d.ts +67 -0
- package/dist/transactions/types/domain.d.ts.map +1 -0
- package/dist/transactions/types/domain.js +4 -0
- package/dist/transactions/types/index.d.ts +18 -0
- package/dist/transactions/types/index.d.ts.map +1 -0
- package/dist/transactions/types/index.js +17 -0
- package/dist/transactions/types/options.d.ts +45 -0
- package/dist/transactions/types/options.d.ts.map +1 -0
- package/dist/transactions/types/options.js +1 -0
- package/dist/transactions/types/planning.d.ts +80 -0
- package/dist/transactions/types/planning.d.ts.map +1 -0
- package/dist/transactions/types/planning.js +1 -0
- package/dist/transactions/types/state-stores.d.ts +103 -0
- package/dist/transactions/types/state-stores.d.ts.map +1 -0
- package/dist/transactions/types/state-stores.js +1 -0
- package/dist/transactions/types/transact.d.ts +76 -0
- package/dist/transactions/types/transact.d.ts.map +1 -0
- package/dist/transactions/types/transact.js +1 -0
- package/dist/transactions/withdrawal-planner.d.ts +58 -0
- package/dist/transactions/withdrawal-planner.d.ts.map +1 -0
- package/dist/transactions/withdrawal-planner.js +128 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsup.browser.config.d.ts +7 -0
- package/dist/tsup.browser.config.d.ts.map +1 -0
- package/dist/tsup.browser.config.js +34 -0
- package/dist/utils/amounts.d.ts +39 -0
- package/dist/utils/amounts.d.ts.map +1 -0
- package/dist/utils/amounts.js +89 -0
- package/dist/utils/async.d.ts +9 -0
- package/dist/utils/async.d.ts.map +1 -1
- package/dist/utils/async.js +24 -0
- package/dist/utils/bigint.js +7 -7
- package/dist/utils/crypto.d.ts +11 -5
- package/dist/utils/crypto.d.ts.map +1 -1
- package/dist/utils/crypto.js +12 -6
- package/dist/utils/format.d.ts +25 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +33 -0
- package/dist/utils/json-codec.js +1 -1
- package/dist/utils/notes.d.ts +15 -0
- package/dist/utils/notes.d.ts.map +1 -0
- package/dist/utils/notes.js +14 -0
- package/dist/utils/polling.d.ts +5 -0
- package/dist/utils/polling.d.ts.map +1 -1
- package/dist/utils/polling.js +5 -0
- package/dist/utils/random.d.ts +13 -0
- package/dist/utils/random.d.ts.map +1 -0
- package/dist/utils/random.js +27 -0
- package/dist/utils/secure-memory.d.ts +25 -0
- package/dist/utils/secure-memory.d.ts.map +1 -0
- package/dist/utils/secure-memory.js +28 -0
- package/dist/utils/signature.d.ts +6 -0
- package/dist/utils/signature.d.ts.map +1 -1
- package/dist/utils/signature.js +8 -6
- package/dist/utils/validators.d.ts +21 -10
- package/dist/utils/validators.d.ts.map +1 -1
- package/dist/utils/validators.js +37 -11
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +13 -0
- package/package.json +28 -11
- package/.eslintrc.json +0 -4
- package/account/zkAccount.test.ts +0 -316
- package/account/zkAccount.ts +0 -222
- package/clients/broadcaster.ts +0 -67
- package/clients/http.ts +0 -94
- package/clients/indexer.ts +0 -150
- package/config.ts +0 -39
- package/core.ts +0 -17
- package/dist/account/railgun-imports-prototype.d.ts +0 -12
- package/dist/account/railgun-imports-prototype.d.ts.map +0 -1
- package/dist/account/railgun-imports-prototype.js +0 -30
- package/dist/account/zkAccount.d.ts.map +0 -1
- package/dist/key-derivation/babyjubjub.d.ts +0 -9
- package/dist/key-derivation/babyjubjub.d.ts.map +0 -1
- package/dist/key-derivation/babyjubjub.js +0 -9
- package/dist/key-derivation/bech32.d.ts +0 -22
- package/dist/key-derivation/bech32.d.ts.map +0 -1
- package/dist/key-derivation/bech32.js +0 -86
- package/dist/key-derivation/bip32.d.ts +0 -17
- package/dist/key-derivation/bip32.d.ts.map +0 -1
- package/dist/key-derivation/bip32.js +0 -41
- package/dist/key-derivation/bip39.d.ts +0 -22
- package/dist/key-derivation/bip39.d.ts.map +0 -1
- package/dist/key-derivation/bip39.js +0 -56
- package/dist/key-derivation/bytes.d.ts +0 -19
- package/dist/key-derivation/bytes.d.ts.map +0 -1
- package/dist/key-derivation/bytes.js +0 -92
- package/dist/key-derivation/hash.d.ts +0 -3
- package/dist/key-derivation/hash.d.ts.map +0 -1
- package/dist/key-derivation/hash.js +0 -10
- package/dist/key-derivation/index.d.ts +0 -8
- package/dist/key-derivation/index.d.ts.map +0 -1
- package/dist/key-derivation/index.js +0 -7
- package/dist/key-derivation/wallet-node.d.ts +0 -45
- package/dist/key-derivation/wallet-node.d.ts.map +0 -1
- package/dist/key-derivation/wallet-node.js +0 -109
- package/dist/state/ciphertext-store.d.ts +0 -12
- package/dist/state/ciphertext-store.d.ts.map +0 -1
- package/dist/state/ciphertext-store.js +0 -25
- package/dist/state/hydrator.d.ts +0 -16
- package/dist/state/hydrator.d.ts.map +0 -1
- package/dist/state/hydrator.js +0 -18
- package/dist/state/job-store.d.ts +0 -12
- package/dist/state/job-store.d.ts.map +0 -1
- package/dist/state/job-store.js +0 -118
- package/dist/state/jobs.d.ts +0 -50
- package/dist/state/jobs.d.ts.map +0 -1
- package/dist/state/jobs.js +0 -1
- package/dist/state/leaf-store.d.ts +0 -17
- package/dist/state/leaf-store.d.ts.map +0 -1
- package/dist/state/leaf-store.js +0 -35
- package/dist/state/merkle-tree.d.ts +0 -34
- package/dist/state/merkle-tree.d.ts.map +0 -1
- package/dist/state/merkle-tree.js +0 -104
- package/dist/state/note-store.d.ts +0 -37
- package/dist/state/note-store.d.ts.map +0 -1
- package/dist/state/note-store.js +0 -133
- package/dist/state/nullifier-store.d.ts +0 -13
- package/dist/state/nullifier-store.d.ts.map +0 -1
- package/dist/state/nullifier-store.js +0 -21
- package/dist/state/records.d.ts +0 -57
- package/dist/state/records.d.ts.map +0 -1
- package/dist/state/root-store.d.ts +0 -13
- package/dist/state/root-store.d.ts.map +0 -1
- package/dist/state/root-store.js +0 -30
- package/dist/state/store.d.ts +0 -26
- package/dist/state/store.d.ts.map +0 -1
- package/dist/state/store.js +0 -19
- package/dist/state.d.ts +0 -83
- package/dist/state.d.ts.map +0 -1
- package/dist/state.js +0 -171
- package/dist/transactions/shield.d.ts +0 -5
- package/dist/transactions/shield.d.ts.map +0 -1
- package/dist/transactions/shield.js +0 -93
- package/dist/transactions/types.d.ts +0 -114
- package/dist/transactions/types.d.ts.map +0 -1
- package/dist/transactions/utils.d.ts +0 -10
- package/dist/transactions/utils.d.ts.map +0 -1
- package/dist/transactions/utils.js +0 -17
- package/dist/utils/time.d.ts +0 -2
- package/dist/utils/time.d.ts.map +0 -1
- package/dist/utils/time.js +0 -3
- package/dist/utils/witness.d.ts +0 -11
- package/dist/utils/witness.d.ts.map +0 -1
- package/dist/utils/witness.js +0 -19
- package/errors.ts +0 -20
- package/index.ts +0 -17
- package/key-derivation/babyjubjub.ts +0 -11
- package/key-derivation/bech32.test.ts +0 -90
- package/key-derivation/bech32.ts +0 -124
- package/key-derivation/bip32.ts +0 -56
- package/key-derivation/bip39.ts +0 -76
- package/key-derivation/bytes.ts +0 -118
- package/key-derivation/hash.ts +0 -13
- package/key-derivation/index.ts +0 -7
- package/key-derivation/wallet-node.ts +0 -155
- package/keys.ts +0 -47
- package/prover/config.ts +0 -104
- package/prover/index.ts +0 -1
- package/prover/prover.integration.test.ts +0 -162
- package/prover/prover.test.ts +0 -309
- package/prover/prover.ts +0 -405
- package/prover/registry.test.ts +0 -90
- package/prover/registry.ts +0 -82
- package/schema.ts +0 -17
- package/setup-artifacts.sh +0 -57
- package/state/index.ts +0 -2
- package/state/merkle/hydrator.ts +0 -69
- package/state/merkle/index.ts +0 -12
- package/state/merkle/merkle-tree.test.ts +0 -50
- package/state/merkle/merkle-tree.ts +0 -163
- package/state/store/ciphertext-store.ts +0 -28
- package/state/store/index.ts +0 -24
- package/state/store/job-store.ts +0 -162
- package/state/store/jobs.ts +0 -64
- package/state/store/leaf-store.ts +0 -39
- package/state/store/note-store.ts +0 -177
- package/state/store/nullifier-store.ts +0 -39
- package/state/store/records.ts +0 -61
- package/state/store/root-store.ts +0 -34
- package/state/store/store.ts +0 -25
- package/state.test.ts +0 -235
- package/storage/index.ts +0 -3
- package/storage/indexeddb.test.ts +0 -99
- package/storage/indexeddb.ts +0 -235
- package/storage/memory.test.ts +0 -59
- package/storage/memory.ts +0 -93
- package/transactions/deposit.test.ts +0 -160
- package/transactions/deposit.ts +0 -227
- package/transactions/index.ts +0 -20
- package/transactions/note-sync.test.ts +0 -155
- package/transactions/note-sync.ts +0 -452
- package/transactions/reconcile.ts +0 -73
- package/transactions/transact.test.ts +0 -451
- package/transactions/transact.ts +0 -811
- package/transactions/types.ts +0 -141
- package/tsconfig.json +0 -14
- package/types/global.d.ts +0 -15
- package/types.ts +0 -24
- package/utils/async.ts +0 -15
- package/utils/bigint.ts +0 -34
- package/utils/crypto.test.ts +0 -69
- package/utils/crypto.ts +0 -58
- package/utils/json-codec.ts +0 -38
- package/utils/polling.ts +0 -6
- package/utils/signature.ts +0 -16
- package/utils/validators.test.ts +0 -64
- package/utils/validators.ts +0 -86
- /package/dist/{transactions → history}/types.js +0 -0
- /package/dist/{state/records.js → transactions/types/deposit.js} +0 -0
package/dist/prover/prover.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as snarkjs from "snarkjs";
|
|
2
|
-
import {
|
|
3
|
-
import { ArtifactType, buildArtifactUrl,
|
|
2
|
+
import { ProofError } from "../errors.js";
|
|
3
|
+
import { ArtifactType, buildArtifactUrl, getLocalArtifactPath, Runtime, } from "./config.js";
|
|
4
4
|
import { getCircuitConfig, SUPPORTED_CIRCUITS, } from "./registry.js";
|
|
5
5
|
// Cache for loaded artifacts to avoid reloading 18MB of files on every call
|
|
6
6
|
// Now keyed by circuit name to support multiple circuits
|
|
@@ -10,116 +10,130 @@ const artifactCache = {};
|
|
|
10
10
|
* @param inputs Number of inputs (nullifiers)
|
|
11
11
|
* @param outputs Number of outputs (commitments)
|
|
12
12
|
* @returns Circuit configuration
|
|
13
|
-
* @throws
|
|
13
|
+
* @throws ProofError if no matching circuit is found
|
|
14
14
|
*/
|
|
15
15
|
function selectCircuit(inputs, outputs) {
|
|
16
16
|
const config = getCircuitConfig(inputs, outputs);
|
|
17
17
|
if (!config) {
|
|
18
|
-
throw new
|
|
18
|
+
throw new ProofError(`No circuit available for ${inputs} inputs and ${outputs} outputs. ` +
|
|
19
19
|
`Supported circuits: ${SUPPORTED_CIRCUITS.join(", ")}`);
|
|
20
20
|
}
|
|
21
21
|
return config;
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
|
-
* Fetch circuit artifacts
|
|
25
|
-
* Supports both browser (remote) and Node.js (local) environments
|
|
24
|
+
* Fetch circuit artifacts from server or local files (for tests)
|
|
26
25
|
* @param circuitName Full circuit name (e.g., "joinsplit_2x3_16")
|
|
26
|
+
* @param rpcUrl Base URL for fetching artifacts
|
|
27
27
|
* @returns Artifacts object with wasm, zkey, and vkey
|
|
28
28
|
*/
|
|
29
|
-
async function fetchCircuitArtifacts(circuitName) {
|
|
29
|
+
async function fetchCircuitArtifacts(circuitName, rpcUrl) {
|
|
30
30
|
// Check cache first
|
|
31
31
|
if (artifactCache[circuitName]) {
|
|
32
32
|
return artifactCache[circuitName];
|
|
33
33
|
}
|
|
34
|
-
|
|
35
|
-
let zkey;
|
|
36
|
-
let vkey;
|
|
37
|
-
// Browser environment: fetch from artifact server
|
|
34
|
+
// Browser: always requires rpcUrl and fetches from server
|
|
38
35
|
if (Runtime.isBrowser()) {
|
|
36
|
+
if (!rpcUrl) {
|
|
37
|
+
throw new ProofError("rpcUrl is required. Please configure it via UnlinkProvider or pass it to the SDK.");
|
|
38
|
+
}
|
|
39
|
+
return fetchFromServer(circuitName, rpcUrl);
|
|
40
|
+
}
|
|
41
|
+
// Node.js: try server first if rpcUrl provided, fall back to local files
|
|
42
|
+
if (rpcUrl) {
|
|
39
43
|
try {
|
|
40
|
-
|
|
41
|
-
const wasmUrl = buildArtifactUrl(circuitName, ArtifactType.WASM, baseUrl);
|
|
42
|
-
const zkeyUrl = buildArtifactUrl(circuitName, ArtifactType.ZKEY, baseUrl);
|
|
43
|
-
const vkeyUrl = buildArtifactUrl(circuitName, ArtifactType.VKEY, baseUrl);
|
|
44
|
-
const [wasmRes, zkeyRes, vkeyRes] = await Promise.all([
|
|
45
|
-
fetch(wasmUrl),
|
|
46
|
-
fetch(zkeyUrl),
|
|
47
|
-
fetch(vkeyUrl),
|
|
48
|
-
]);
|
|
49
|
-
if (!wasmRes.ok || !zkeyRes.ok || !vkeyRes.ok) {
|
|
50
|
-
throw new CoreError(`Failed to fetch artifacts for ${circuitName} from ${baseUrl}. ` +
|
|
51
|
-
`Status: wasm=${wasmRes.status}, zkey=${zkeyRes.status}, vkey=${vkeyRes.status}`);
|
|
52
|
-
}
|
|
53
|
-
wasm = new Uint8Array(await wasmRes.arrayBuffer());
|
|
54
|
-
zkey = new Uint8Array(await zkeyRes.arrayBuffer());
|
|
55
|
-
vkey = await vkeyRes.json();
|
|
44
|
+
return await fetchFromServer(circuitName, rpcUrl);
|
|
56
45
|
}
|
|
57
|
-
catch
|
|
58
|
-
|
|
46
|
+
catch {
|
|
47
|
+
// Server not available, fall back to local files (useful for tests)
|
|
59
48
|
}
|
|
60
49
|
}
|
|
61
|
-
// Node.js
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
50
|
+
// Node.js: try local files (for tests and development)
|
|
51
|
+
try {
|
|
52
|
+
return await fetchFromLocalFiles(circuitName);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new ProofError("rpcUrl is required. Local artifacts not found. " +
|
|
56
|
+
"If running tests, ensure artifacts are built with 'pnpm run zk:build'.");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function fetchFromServer(circuitName, rpcUrl) {
|
|
60
|
+
const wasmUrl = buildArtifactUrl(circuitName, ArtifactType.WASM, rpcUrl);
|
|
61
|
+
const zkeyUrl = buildArtifactUrl(circuitName, ArtifactType.ZKEY, rpcUrl);
|
|
62
|
+
const vkeyUrl = buildArtifactUrl(circuitName, ArtifactType.VKEY, rpcUrl);
|
|
63
|
+
const [wasmRes, zkeyRes, vkeyRes] = await Promise.all([
|
|
64
|
+
fetch(wasmUrl),
|
|
65
|
+
fetch(zkeyUrl),
|
|
66
|
+
fetch(vkeyUrl),
|
|
67
|
+
]);
|
|
68
|
+
if (!wasmRes.ok || !zkeyRes.ok || !vkeyRes.ok) {
|
|
69
|
+
throw new ProofError(`Failed to fetch artifacts for ${circuitName} from ${rpcUrl}. ` +
|
|
70
|
+
`Status: wasm=${wasmRes.status}, zkey=${zkeyRes.status}, vkey=${vkeyRes.status}`);
|
|
71
|
+
}
|
|
72
|
+
const wasm = new Uint8Array(await wasmRes.arrayBuffer());
|
|
73
|
+
const zkey = new Uint8Array(await zkeyRes.arrayBuffer());
|
|
74
|
+
const vkey = (await vkeyRes.json());
|
|
75
|
+
const artifacts = { wasm, zkey, vkey };
|
|
76
|
+
artifactCache[circuitName] = artifacts;
|
|
77
|
+
return artifacts;
|
|
78
|
+
}
|
|
79
|
+
async function fetchFromLocalFiles(circuitName) {
|
|
80
|
+
const wasmCandidates = getLocalArtifactPath(circuitName, ArtifactType.WASM);
|
|
81
|
+
const zkeyCandidates = getLocalArtifactPath(circuitName, ArtifactType.ZKEY);
|
|
82
|
+
const vkeyCandidates = getLocalArtifactPath(circuitName, ArtifactType.VKEY);
|
|
83
|
+
let wasm;
|
|
84
|
+
let zkey;
|
|
85
|
+
let vkey;
|
|
86
|
+
let wasmLoaded = false;
|
|
87
|
+
for (const candidate of wasmCandidates) {
|
|
88
|
+
try {
|
|
89
|
+
wasm = await readBinaryResource(candidate);
|
|
90
|
+
wasmLoaded = true;
|
|
91
|
+
break;
|
|
76
92
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
`Please run 'pnpm run build:all' in the circuits package.`);
|
|
93
|
+
catch {
|
|
94
|
+
// Try next candidate
|
|
80
95
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
96
|
+
}
|
|
97
|
+
if (!wasmLoaded) {
|
|
98
|
+
throw new ProofError(`Could not find WASM artifact for ${circuitName}. ` +
|
|
99
|
+
`Please run 'pnpm run build:all' in the circuits package.`);
|
|
100
|
+
}
|
|
101
|
+
// Load zkey
|
|
102
|
+
let zkeyLoaded = false;
|
|
103
|
+
for (const candidate of zkeyCandidates) {
|
|
104
|
+
try {
|
|
105
|
+
zkey = await readBinaryResource(candidate);
|
|
106
|
+
zkeyLoaded = true;
|
|
107
|
+
break;
|
|
92
108
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
`Please run 'pnpm run build:all' in the circuits package.`);
|
|
109
|
+
catch {
|
|
110
|
+
// Try next candidate
|
|
96
111
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
112
|
+
}
|
|
113
|
+
if (!zkeyLoaded) {
|
|
114
|
+
throw new ProofError(`Could not find zkey artifact for ${circuitName}. ` +
|
|
115
|
+
`Please run 'pnpm run build:all' in the circuits package.`);
|
|
116
|
+
}
|
|
117
|
+
// Load vkey
|
|
118
|
+
let vkeyLoaded = false;
|
|
119
|
+
for (const candidate of vkeyCandidates) {
|
|
120
|
+
try {
|
|
121
|
+
const vkeyText = await readTextResource(candidate);
|
|
122
|
+
vkey = JSON.parse(vkeyText);
|
|
123
|
+
vkeyLoaded = true;
|
|
124
|
+
break;
|
|
109
125
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
`Please run 'pnpm run build:all' in the circuits package.`);
|
|
126
|
+
catch {
|
|
127
|
+
// Try next candidate
|
|
113
128
|
}
|
|
114
129
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
`Missing: ${!wasm ? "wasm " : ""}${!zkey ? "zkey " : ""}${!vkey ? "vkey" : ""}`);
|
|
130
|
+
if (!vkeyLoaded) {
|
|
131
|
+
throw new ProofError(`Could not find verification key for ${circuitName}. ` +
|
|
132
|
+
`Please run 'pnpm run build:all' in the circuits package.`);
|
|
119
133
|
}
|
|
120
134
|
// Cache the artifacts for future calls
|
|
121
135
|
// TypeScript now knows these are defined after the check above
|
|
122
|
-
const artifacts = { wasm, zkey, vkey };
|
|
136
|
+
const artifacts = { wasm: wasm, zkey: zkey, vkey: vkey };
|
|
123
137
|
artifactCache[circuitName] = artifacts;
|
|
124
138
|
return artifacts;
|
|
125
139
|
}
|
|
@@ -143,12 +157,12 @@ async function readBinaryResource(relativePath) {
|
|
|
143
157
|
}
|
|
144
158
|
const response = await fetch(url);
|
|
145
159
|
if (!response.ok) {
|
|
146
|
-
throw new
|
|
160
|
+
throw new ProofError(`failed to fetch ${relativePath}: ${response.statusText}`);
|
|
147
161
|
}
|
|
148
162
|
return new Uint8Array(await response.arrayBuffer());
|
|
149
163
|
}
|
|
150
164
|
catch (error) {
|
|
151
|
-
throw new
|
|
165
|
+
throw new ProofError(`failed to read binary resource ${relativePath}: ${error.message}`);
|
|
152
166
|
}
|
|
153
167
|
}
|
|
154
168
|
async function readTextResource(relativePath) {
|
|
@@ -170,24 +184,24 @@ async function readTextResource(relativePath) {
|
|
|
170
184
|
}
|
|
171
185
|
const response = await fetch(url);
|
|
172
186
|
if (!response.ok) {
|
|
173
|
-
throw new
|
|
187
|
+
throw new ProofError(`failed to fetch ${relativePath}: ${response.statusText}`);
|
|
174
188
|
}
|
|
175
189
|
return response.text();
|
|
176
190
|
}
|
|
177
|
-
export async function proveTransaction(input) {
|
|
191
|
+
export async function proveTransaction(input, options) {
|
|
178
192
|
try {
|
|
179
193
|
// Auto-detect circuit based on input dimensions
|
|
180
194
|
const nInputs = input.nullifiers.length;
|
|
181
195
|
const nOutputs = input.commitmentsOut.length;
|
|
182
196
|
const circuit = selectCircuit(nInputs, nOutputs);
|
|
183
197
|
// Fetch circuit artifacts (wasm and zkey)
|
|
184
|
-
const { wasm, vkey, zkey } = await fetchCircuitArtifacts(circuit.name);
|
|
198
|
+
const { wasm, vkey, zkey } = await fetchCircuitArtifacts(circuit.name, options?.rpcUrl);
|
|
185
199
|
const inputSignals = input;
|
|
186
200
|
const { proof, publicSignals } = await snarkjs.groth16.fullProve(inputSignals, wasm, zkey);
|
|
187
201
|
// Additional verification step (optional)
|
|
188
202
|
const isValid = await snarkjs.groth16.verify(vkey, publicSignals, proof);
|
|
189
203
|
if (!isValid) {
|
|
190
|
-
throw new
|
|
204
|
+
throw new ProofError("generated proof is invalid");
|
|
191
205
|
}
|
|
192
206
|
return {
|
|
193
207
|
proof,
|
|
@@ -195,23 +209,24 @@ export async function proveTransaction(input) {
|
|
|
195
209
|
};
|
|
196
210
|
}
|
|
197
211
|
catch (error) {
|
|
198
|
-
throw new
|
|
212
|
+
throw new ProofError("proof generation failed: " + error.message);
|
|
199
213
|
}
|
|
200
214
|
}
|
|
201
215
|
/**
|
|
202
216
|
* Get verification key for a specific circuit configuration
|
|
203
217
|
* @param inputs Number of inputs (nullifiers)
|
|
204
218
|
* @param outputs Number of outputs (commitments)
|
|
219
|
+
* @param options Configuration including rpcUrl
|
|
205
220
|
* @returns Verification key for the circuit
|
|
206
221
|
*/
|
|
207
|
-
export async function getVerificationKey(inputs, outputs) {
|
|
222
|
+
export async function getVerificationKey(inputs, outputs, options) {
|
|
208
223
|
try {
|
|
209
224
|
const circuit = selectCircuit(inputs, outputs);
|
|
210
|
-
const { vkey } = await fetchCircuitArtifacts(circuit.name);
|
|
225
|
+
const { vkey } = await fetchCircuitArtifacts(circuit.name, options?.rpcUrl);
|
|
211
226
|
return vkey;
|
|
212
227
|
}
|
|
213
228
|
catch (error) {
|
|
214
|
-
throw new
|
|
229
|
+
throw new ProofError("failed to load verification key: " + error.message);
|
|
215
230
|
}
|
|
216
231
|
}
|
|
217
232
|
/**
|
|
@@ -219,9 +234,10 @@ export async function getVerificationKey(inputs, outputs) {
|
|
|
219
234
|
* Auto-detects the circuit from the public signals structure
|
|
220
235
|
* @param proof Groth16 proof
|
|
221
236
|
* @param publicSignals Public signals array
|
|
237
|
+
* @param options Optional configuration including rpcUrl
|
|
222
238
|
* @returns True if proof is valid
|
|
223
239
|
*/
|
|
224
|
-
export async function verifyProof(proof, publicSignals) {
|
|
240
|
+
export async function verifyProof(proof, publicSignals, options) {
|
|
225
241
|
try {
|
|
226
242
|
// Public signals structure: [merkleRoot, boundParamsHash, ...nullifiers, ...commitments]
|
|
227
243
|
// We need to determine the circuit from the length
|
|
@@ -239,18 +255,18 @@ export async function verifyProof(proof, publicSignals) {
|
|
|
239
255
|
const parts = circuitKey.split("x");
|
|
240
256
|
const config = getCircuitConfig(parseInt(parts[0]), parseInt(parts[1]));
|
|
241
257
|
if (config && config.inputs + config.outputs === variableCount) {
|
|
242
|
-
const artifacts = await fetchCircuitArtifacts(config.name);
|
|
258
|
+
const artifacts = await fetchCircuitArtifacts(config.name, options?.rpcUrl);
|
|
243
259
|
vkey = artifacts.vkey;
|
|
244
260
|
break;
|
|
245
261
|
}
|
|
246
262
|
}
|
|
247
263
|
if (!vkey) {
|
|
248
|
-
throw new
|
|
264
|
+
throw new ProofError(`Could not determine circuit from ${totalLength} public signals`);
|
|
249
265
|
}
|
|
250
266
|
return await snarkjs.groth16.verify(vkey, publicSignals, proof);
|
|
251
267
|
}
|
|
252
268
|
catch (error) {
|
|
253
|
-
throw new
|
|
269
|
+
throw new ProofError("proof verification failed: " + error.message);
|
|
254
270
|
}
|
|
255
271
|
}
|
|
256
272
|
/**
|
|
@@ -260,15 +276,16 @@ export async function verifyProof(proof, publicSignals) {
|
|
|
260
276
|
* @param publicSignals Public signals array
|
|
261
277
|
* @param inputs Number of inputs (nullifiers)
|
|
262
278
|
* @param outputs Number of outputs (commitments)
|
|
279
|
+
* @param options Optional configuration including rpcUrl
|
|
263
280
|
* @returns True if proof is valid
|
|
264
281
|
*/
|
|
265
|
-
export async function verifyProofWithCircuit(proof, publicSignals, inputs, outputs) {
|
|
282
|
+
export async function verifyProofWithCircuit(proof, publicSignals, inputs, outputs, options) {
|
|
266
283
|
try {
|
|
267
284
|
const circuit = selectCircuit(inputs, outputs);
|
|
268
|
-
const { vkey } = await fetchCircuitArtifacts(circuit.name);
|
|
285
|
+
const { vkey } = await fetchCircuitArtifacts(circuit.name, options?.rpcUrl);
|
|
269
286
|
return await snarkjs.groth16.verify(vkey, publicSignals, proof);
|
|
270
287
|
}
|
|
271
288
|
catch (error) {
|
|
272
|
-
throw new
|
|
289
|
+
throw new ProofError("proof verification failed: " + error.message);
|
|
273
290
|
}
|
|
274
291
|
}
|
|
@@ -1,39 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Circuit registry for automatic prover selection
|
|
3
|
-
* Maps circuit dimensions (inputs x outputs) to circuit configurations
|
|
4
|
-
*/
|
|
5
1
|
export interface CircuitConfig {
|
|
6
|
-
/** Full circuit name (e.g., "joinsplit_2x3_16") */
|
|
7
2
|
readonly name: string;
|
|
8
|
-
/** Number of inputs (nullifiers) */
|
|
9
3
|
readonly inputs: number;
|
|
10
|
-
/** Number of outputs (commitments) */
|
|
11
4
|
readonly outputs: number;
|
|
12
|
-
/** Merkle tree depth */
|
|
13
5
|
readonly depth: number;
|
|
14
6
|
}
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
* Auto-generated from circuits/circuits.json
|
|
19
|
-
*/
|
|
20
|
-
export declare const CIRCUIT_REGISTRY: Record<CircuitKey, CircuitConfig>;
|
|
21
|
-
/**
|
|
22
|
-
* Get list of all supported circuit keys
|
|
23
|
-
*/
|
|
24
|
-
export declare const SUPPORTED_CIRCUITS: CircuitKey[];
|
|
25
|
-
/**
|
|
26
|
-
* Get circuit configuration by dimensions
|
|
27
|
-
* @param inputs Number of inputs (nullifiers)
|
|
28
|
-
* @param outputs Number of outputs (commitments)
|
|
29
|
-
* @returns Circuit configuration or undefined if not supported
|
|
30
|
-
*/
|
|
7
|
+
export declare const CIRCUIT_REGISTRY: Record<string, CircuitConfig>;
|
|
8
|
+
export type CircuitKey = keyof typeof CIRCUIT_REGISTRY & string;
|
|
9
|
+
export declare const SUPPORTED_CIRCUITS: string[];
|
|
31
10
|
export declare function getCircuitConfig(inputs: number, outputs: number): CircuitConfig | undefined;
|
|
32
|
-
/**
|
|
33
|
-
* Check if a circuit configuration is supported
|
|
34
|
-
* @param inputs Number of inputs (nullifiers)
|
|
35
|
-
* @param outputs Number of outputs (commitments)
|
|
36
|
-
* @returns True if supported
|
|
37
|
-
*/
|
|
38
11
|
export declare function isCircuitSupported(inputs: number, outputs: number): boolean;
|
|
39
12
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../prover/registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../prover/registry.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAYD,eAAO,MAAM,gBAAgB,EAAe,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAE1E,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,gBAAgB,GAAG,MAAM,CAAC;AAEhE,eAAO,MAAM,kBAAkB,UAAgC,CAAC;AAEhE,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,aAAa,GAAG,SAAS,CAE3B;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAE3E"}
|
package/dist/prover/registry.js
CHANGED
|
@@ -1,57 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
inputs: 3,
|
|
13
|
-
outputs: 3,
|
|
14
|
-
depth: 16,
|
|
15
|
-
},
|
|
16
|
-
"2x3": {
|
|
17
|
-
name: "joinsplit_2x3_16",
|
|
18
|
-
inputs: 2,
|
|
19
|
-
outputs: 3,
|
|
20
|
-
depth: 16,
|
|
21
|
-
},
|
|
22
|
-
"1x2": {
|
|
23
|
-
name: "joinsplit_1x2_16",
|
|
24
|
-
inputs: 1,
|
|
25
|
-
outputs: 2,
|
|
26
|
-
depth: 16,
|
|
27
|
-
},
|
|
28
|
-
"1x1": {
|
|
29
|
-
name: "joinsplit_1x1_16",
|
|
30
|
-
inputs: 1,
|
|
31
|
-
outputs: 1,
|
|
32
|
-
depth: 16,
|
|
33
|
-
},
|
|
34
|
-
};
|
|
35
|
-
/**
|
|
36
|
-
* Get list of all supported circuit keys
|
|
37
|
-
*/
|
|
1
|
+
import circuitsJson from "../circuits.json" with { type: "json" };
|
|
2
|
+
// Build registry from circuits.json — keyed by "NxM" (inputs x outputs)
|
|
3
|
+
const registry = {};
|
|
4
|
+
for (const [name, def] of Object.entries(circuitsJson)) {
|
|
5
|
+
const params = def.params;
|
|
6
|
+
const inputs = params[0];
|
|
7
|
+
const outputs = params[1];
|
|
8
|
+
const depth = params[2];
|
|
9
|
+
registry[`${inputs}x${outputs}`] = { name, inputs, outputs, depth };
|
|
10
|
+
}
|
|
11
|
+
export const CIRCUIT_REGISTRY = registry;
|
|
38
12
|
export const SUPPORTED_CIRCUITS = Object.keys(CIRCUIT_REGISTRY);
|
|
39
|
-
/**
|
|
40
|
-
* Get circuit configuration by dimensions
|
|
41
|
-
* @param inputs Number of inputs (nullifiers)
|
|
42
|
-
* @param outputs Number of outputs (commitments)
|
|
43
|
-
* @returns Circuit configuration or undefined if not supported
|
|
44
|
-
*/
|
|
45
13
|
export function getCircuitConfig(inputs, outputs) {
|
|
46
|
-
|
|
47
|
-
return CIRCUIT_REGISTRY[key];
|
|
14
|
+
return CIRCUIT_REGISTRY[`${inputs}x${outputs}`];
|
|
48
15
|
}
|
|
49
|
-
/**
|
|
50
|
-
* Check if a circuit configuration is supported
|
|
51
|
-
* @param inputs Number of inputs (nullifiers)
|
|
52
|
-
* @param outputs Number of outputs (commitments)
|
|
53
|
-
* @returns True if supported
|
|
54
|
-
*/
|
|
55
16
|
export function isCircuitSupported(inputs, outputs) {
|
|
56
17
|
return getCircuitConfig(inputs, outputs) !== undefined;
|
|
57
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hydrator.d.ts","sourceRoot":"","sources":["../../../state/merkle/hydrator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hydrator.d.ts","sourceRoot":"","sources":["../../../state/merkle/hydrator.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,CACvB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,KACV,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAAC;AAE5C,wBAAsB,oBAAoB,CAAC,EACzC,OAAO,EACP,KAAK,EACL,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QACL,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QAC3D,YAAY,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;KACxC,CAAC;IACF,QAAQ,EAAE,UAAU,CAAC;CACtB,mBAeA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QACL,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;KAC5D,CAAC;IACF,QAAQ,EAAE,UAAU,CAAC;IACrB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACvB,CAAC;AAKF,wBAAsB,YAAY,CAAC,EACjC,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,EAAE,kBAAkB,iBAcpB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CoreError } from "../../errors.js";
|
|
1
2
|
import { parseHexToBigInt } from "../../utils/bigint.js";
|
|
2
3
|
export async function rebuildTreeFromStore({ chainId, trees, loadLeaf, }) {
|
|
3
4
|
trees.reset(chainId);
|
|
@@ -8,7 +9,7 @@ export async function rebuildTreeFromStore({ chainId, trees, loadLeaf, }) {
|
|
|
8
9
|
break;
|
|
9
10
|
const { index } = trees.addLeaf(chainId, parseHexToBigInt(leaf.commitment));
|
|
10
11
|
if (index !== idx) {
|
|
11
|
-
throw new
|
|
12
|
+
throw new CoreError(`stored leaves are inconsistent with local tree, expected ${idx}, got ${index}`);
|
|
12
13
|
}
|
|
13
14
|
idx += 1;
|
|
14
15
|
}
|
|
@@ -28,7 +29,7 @@ export async function hydrateChain({ chainId, trees, loadLeaf, hydrated, }) {
|
|
|
28
29
|
break;
|
|
29
30
|
const { index } = trees.addLeaf(chainId, parseHexToBigInt(leaf.commitment));
|
|
30
31
|
if (index !== idx) {
|
|
31
|
-
throw new
|
|
32
|
+
throw new CoreError("stored leaves are inconsistent with local tree");
|
|
32
33
|
}
|
|
33
34
|
idx += 1;
|
|
34
35
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { createLocalMerkleTree, createMerkleTrees, type LocalMerkleTree, type LocalMerkleTrees, type MerkleProof, } from "./merkle-tree.js";
|
|
1
|
+
export { createLocalMerkleTree, createMerkleTrees, resolveMerkleTrees, type LocalMerkleTree, type LocalMerkleTrees, type MerkleProof, } from "./merkle-tree.js";
|
|
2
2
|
export { hydrateChain, rebuildTreeFromStore, type HydrateChainParams, } from "./hydrator.js";
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../state/merkle/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,KAAK,kBAAkB,GACxB,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../state/merkle/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,KAAK,kBAAkB,GACxB,MAAM,eAAe,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { createLocalMerkleTree, createMerkleTrees, } from "./merkle-tree.js";
|
|
1
|
+
export { createLocalMerkleTree, createMerkleTrees, resolveMerkleTrees, } from "./merkle-tree.js";
|
|
2
2
|
export { hydrateChain, rebuildTreeFromStore, } from "./hydrator.js";
|
|
@@ -31,4 +31,12 @@ export type LocalMerkleTrees = {
|
|
|
31
31
|
reset(chainId: number): void;
|
|
32
32
|
};
|
|
33
33
|
export declare function createMerkleTrees(): LocalMerkleTrees;
|
|
34
|
+
/**
|
|
35
|
+
* Resolve merkle trees from options or create new instance.
|
|
36
|
+
* @param opts - Options object that may contain merkle trees
|
|
37
|
+
* @returns Merkle trees instance
|
|
38
|
+
*/
|
|
39
|
+
export declare function resolveMerkleTrees(opts?: {
|
|
40
|
+
merkleTrees?: LocalMerkleTrees;
|
|
41
|
+
}): LocalMerkleTrees;
|
|
34
42
|
//# sourceMappingURL=merkle-tree.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merkle-tree.d.ts","sourceRoot":"","sources":["../../../state/merkle/merkle-tree.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"merkle-tree.d.ts","sourceRoot":"","sources":["../../../state/merkle/merkle-tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAGf,MAAM,aAAa,CAAC;AAarB,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAaF,wBAAgB,qBAAqB;qBAUX,MAAM,KAAG,aAAa;;;qBAsBtB,MAAM;+BAQI,MAAM,KAAG,cAAc;mBAUxC,MAAM;;;EAiBxB;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEvE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAC;IAClD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAAC;IAC9C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC;IACvD,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC;IAClE,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,wBAAgB,iBAAiB,IAAI,gBAAgB,CAwCpD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE;IACxC,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC,GAAG,gBAAgB,CAEnB"}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
|
-
import { poseidon } from "@railgun-community/circomlibjs";
|
|
2
1
|
import { IMT, } from "@zk-kit/imt";
|
|
3
|
-
import {
|
|
2
|
+
import { poseidon } from "../../crypto-adapters/index.js";
|
|
3
|
+
import { CoreError } from "../../errors.js";
|
|
4
|
+
import { FieldSize, Hex } from "../../keys/hex.js";
|
|
4
5
|
import { ensureChainId } from "../../utils/validators.js";
|
|
5
6
|
const DEFAULT_DEPTH = 16;
|
|
6
7
|
const DEFAULT_ARITY = 2;
|
|
7
|
-
const ZERO_BYTE_LENGTH =
|
|
8
|
+
const ZERO_BYTE_LENGTH = FieldSize.SCALAR;
|
|
8
9
|
// Simple adapter: IMTNode[] -> poseidon(bigint[])
|
|
9
10
|
const hash = (values) => poseidon(values.map((v) => BigInt(v)));
|
|
10
|
-
const formatNode = (value) =>
|
|
11
|
+
const formatNode = (value) => Hex.fromBigInt(value, ZERO_BYTE_LENGTH, true);
|
|
11
12
|
export function createLocalMerkleTree() {
|
|
12
13
|
const zeroLeaf = 0n;
|
|
13
14
|
const capacity = 2 ** DEFAULT_DEPTH;
|
|
14
15
|
const tree = new IMT(hash, DEFAULT_DEPTH, zeroLeaf, DEFAULT_ARITY);
|
|
15
16
|
function addLeaf(value) {
|
|
16
17
|
if (tree.leaves.length >= capacity) {
|
|
17
|
-
throw new
|
|
18
|
+
throw new CoreError("merkle tree is full");
|
|
18
19
|
}
|
|
19
20
|
const insertedIndex = tree.leaves.length;
|
|
20
21
|
tree.insert(value);
|
|
@@ -32,7 +33,7 @@ export function createLocalMerkleTree() {
|
|
|
32
33
|
function getLeaf(index) {
|
|
33
34
|
const leaf = tree.leaves[index];
|
|
34
35
|
if (leaf === undefined) {
|
|
35
|
-
throw new
|
|
36
|
+
throw new CoreError("leaf does not exist in this tree");
|
|
36
37
|
}
|
|
37
38
|
return formatNode(BigInt(leaf));
|
|
38
39
|
}
|
|
@@ -51,7 +52,7 @@ export function createLocalMerkleTree() {
|
|
|
51
52
|
}
|
|
52
53
|
const zero = tree.zeroes[level];
|
|
53
54
|
if (zero === undefined) {
|
|
54
|
-
throw new
|
|
55
|
+
throw new CoreError("invalid level");
|
|
55
56
|
}
|
|
56
57
|
return formatNode(zero);
|
|
57
58
|
},
|
|
@@ -102,3 +103,11 @@ export function createMerkleTrees() {
|
|
|
102
103
|
},
|
|
103
104
|
};
|
|
104
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Resolve merkle trees from options or create new instance.
|
|
108
|
+
* @param opts - Options object that may contain merkle trees
|
|
109
|
+
* @returns Merkle trees instance
|
|
110
|
+
*/
|
|
111
|
+
export function resolveMerkleTrees(opts) {
|
|
112
|
+
return opts?.merkleTrees ?? createMerkleTrees();
|
|
113
|
+
}
|
|
@@ -8,5 +8,9 @@ export declare function createCiphertextStore(storage: Storage): {
|
|
|
8
8
|
* Retrieve encrypted note payloads; returns null when the ciphertext is missing.
|
|
9
9
|
*/
|
|
10
10
|
getCiphertext(chainId: number, index: number): Promise<Uint8Array<ArrayBuffer> | null>;
|
|
11
|
+
/**
|
|
12
|
+
* Remove all cached ciphertexts for a chain.
|
|
13
|
+
*/
|
|
14
|
+
clearCiphertexts(chainId: number): Promise<void>;
|
|
11
15
|
};
|
|
12
16
|
//# sourceMappingURL=ciphertext-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ciphertext-store.d.ts","sourceRoot":"","sources":["../../../state/store/ciphertext-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO;IAElD;;OAEG;2BAC0B,MAAM,SAAS,MAAM,WAAW,UAAU;IAQvE;;OAEG;2BAC0B,MAAM,SAAS,MAAM;
|
|
1
|
+
{"version":3,"file":"ciphertext-store.d.ts","sourceRoot":"","sources":["../../../state/store/ciphertext-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO;IAElD;;OAEG;2BAC0B,MAAM,SAAS,MAAM,WAAW,UAAU;IAQvE;;OAEG;2BAC0B,MAAM,SAAS,MAAM;IAOlD;;OAEG;8BAC6B,MAAM;EASzC"}
|
|
@@ -21,5 +21,17 @@ export function createCiphertextStore(storage) {
|
|
|
21
21
|
const data = await storage.get(keys.ciphertext(chainId, index));
|
|
22
22
|
return data ? new Uint8Array(data) : null;
|
|
23
23
|
},
|
|
24
|
+
/**
|
|
25
|
+
* Remove all cached ciphertexts for a chain.
|
|
26
|
+
*/
|
|
27
|
+
async clearCiphertexts(chainId) {
|
|
28
|
+
ensureChainId(chainId);
|
|
29
|
+
const prefix = `ciphertexts:${chainId}:`;
|
|
30
|
+
const entries = await storage.iter({ prefix });
|
|
31
|
+
if (entries.length === 0)
|
|
32
|
+
return;
|
|
33
|
+
const deletions = entries.map(({ key }) => ({ del: key }));
|
|
34
|
+
await storage.batch(deletions);
|
|
35
|
+
},
|
|
24
36
|
};
|
|
25
37
|
}
|