@unlink-xyz/core 0.1.3 → 0.1.4
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 +9 -0
- package/dist/account/{zkAccount.d.ts → account.d.ts} +36 -5
- package/dist/account/account.d.ts.map +1 -0
- package/dist/account/accounts.d.ts +42 -0
- package/dist/account/accounts.d.ts.map +1 -0
- package/dist/account/seed.d.ts +45 -0
- package/dist/account/seed.d.ts.map +1 -0
- package/dist/account/serialization.d.ts +6 -0
- package/dist/account/serialization.d.ts.map +1 -0
- package/dist/browser/index.js +56221 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/wallet/index.js +55942 -0
- package/dist/browser/wallet/index.js.map +1 -0
- package/dist/clients/broadcaster.d.ts +8 -2
- package/dist/clients/broadcaster.d.ts.map +1 -1
- package/dist/clients/http.d.ts +6 -0
- package/dist/clients/http.d.ts.map +1 -1
- package/dist/clients/indexer.d.ts +16 -0
- package/dist/clients/indexer.d.ts.map +1 -1
- package/dist/config.d.ts +30 -9
- package/dist/config.d.ts.map +1 -1
- package/dist/constants.d.ts +6 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/core.d.ts.map +1 -1
- package/dist/crypto/adapters/index.d.ts +17 -0
- package/dist/crypto/adapters/index.d.ts.map +1 -0
- package/dist/crypto/adapters/polyfills.d.ts +5 -0
- package/dist/crypto/adapters/polyfills.d.ts.map +1 -0
- package/dist/crypto/encrypt.d.ts +33 -0
- package/dist/crypto/encrypt.d.ts.map +1 -0
- package/dist/crypto/secure-memory.d.ts +25 -0
- package/dist/crypto/secure-memory.d.ts.map +1 -0
- package/dist/errors.d.ts +17 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/history/index.d.ts +3 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/service.d.ts +46 -0
- package/dist/history/service.d.ts.map +1 -0
- package/dist/history/types.d.ts +21 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/index.d.ts +16 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6721 -19
- package/dist/index.js.map +1 -0
- package/dist/keys/address.d.ts +13 -0
- package/dist/keys/address.d.ts.map +1 -0
- package/dist/keys/derive.d.ts +37 -0
- package/dist/keys/derive.d.ts.map +1 -0
- package/dist/keys/hex.d.ts +14 -0
- package/dist/keys/hex.d.ts.map +1 -0
- package/dist/keys/index.d.ts +5 -0
- package/dist/keys/index.d.ts.map +1 -0
- package/dist/keys/mnemonic.d.ts +6 -0
- package/dist/keys/mnemonic.d.ts.map +1 -0
- package/dist/keys.d.ts +5 -1
- package/dist/keys.d.ts.map +1 -1
- package/dist/prover/config.d.ts +53 -22
- package/dist/prover/config.d.ts.map +1 -1
- package/dist/prover/integrity.d.ts +20 -0
- package/dist/prover/integrity.d.ts.map +1 -0
- package/dist/prover/prover.d.ts +16 -20
- package/dist/prover/prover.d.ts.map +1 -1
- package/dist/prover/registry.d.ts +3 -30
- package/dist/prover/registry.d.ts.map +1 -1
- package/dist/state/merkle/hydrator.d.ts +21 -19
- package/dist/state/merkle/hydrator.d.ts.map +1 -1
- package/dist/state/merkle/index.d.ts +2 -2
- package/dist/state/merkle/index.d.ts.map +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/store/ciphertext-store.d.ts +11 -0
- package/dist/state/store/ciphertext-store.d.ts.map +1 -1
- 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/index.d.ts +3 -2
- package/dist/state/store/index.d.ts.map +1 -1
- 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/jobs.d.ts +70 -25
- package/dist/state/store/jobs.d.ts.map +1 -1
- package/dist/state/store/leaf-store.d.ts +4 -0
- package/dist/state/store/leaf-store.d.ts.map +1 -1
- 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/nullifier-store.d.ts +9 -0
- package/dist/state/store/nullifier-store.d.ts.map +1 -1
- package/dist/state/store/records.d.ts +39 -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/store.d.ts +79 -27
- package/dist/state/store/store.d.ts.map +1 -1
- package/dist/storage/indexeddb.d.ts.map +1 -1
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/transactions/adapter.d.ts +31 -0
- package/dist/transactions/adapter.d.ts.map +1 -0
- package/dist/transactions/deposit.d.ts +12 -15
- package/dist/transactions/deposit.d.ts.map +1 -1
- package/dist/transactions/index.d.ts +9 -4
- package/dist/transactions/index.d.ts.map +1 -1
- package/dist/transactions/note-selection.d.ts +17 -0
- package/dist/transactions/note-selection.d.ts.map +1 -0
- package/dist/transactions/note-sync.d.ts +5 -33
- package/dist/transactions/note-sync.d.ts.map +1 -1
- package/dist/transactions/reconcile.d.ts +9 -11
- package/dist/transactions/reconcile.d.ts.map +1 -1
- package/dist/transactions/transact.d.ts +30 -22
- package/dist/transactions/transact.d.ts.map +1 -1
- package/dist/transactions/transaction-planner.d.ts +34 -0
- package/dist/transactions/transaction-planner.d.ts.map +1 -0
- package/dist/transactions/transfer-planner.d.ts +37 -0
- package/dist/transactions/transfer-planner.d.ts.map +1 -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 +70 -0
- package/dist/transactions/types/domain.d.ts.map +1 -0
- package/dist/transactions/types/index.d.ts +18 -0
- package/dist/transactions/types/index.d.ts.map +1 -0
- package/dist/transactions/types/options.d.ts +54 -0
- package/dist/transactions/types/options.d.ts.map +1 -0
- package/dist/transactions/types/planning.d.ts +82 -0
- package/dist/transactions/types/planning.d.ts.map +1 -0
- package/dist/transactions/types/state-stores.d.ts +151 -0
- package/dist/transactions/types/state-stores.d.ts.map +1 -0
- package/dist/transactions/types/transact.d.ts +83 -0
- package/dist/transactions/types/transact.d.ts.map +1 -0
- package/dist/transactions/withdrawal-planner.d.ts +58 -0
- package/dist/transactions/withdrawal-planner.d.ts.map +1 -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.config.d.ts +8 -0
- package/dist/tsup.config.d.ts.map +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/amounts.d.ts +26 -0
- package/dist/utils/amounts.d.ts.map +1 -0
- package/dist/utils/async.d.ts +9 -0
- package/dist/utils/async.d.ts.map +1 -1
- package/dist/utils/async.js +38 -11
- package/dist/utils/async.js.map +1 -0
- package/dist/utils/bigint.d.ts +0 -2
- package/dist/utils/bigint.d.ts.map +1 -1
- package/dist/utils/format.d.ts +25 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/notes.d.ts +15 -0
- package/dist/utils/notes.d.ts.map +1 -0
- package/dist/utils/polling.d.ts +5 -0
- package/dist/utils/polling.d.ts.map +1 -1
- package/dist/utils/random.d.ts +18 -0
- package/dist/utils/random.d.ts.map +1 -0
- package/dist/utils/signature.d.ts +6 -0
- package/dist/utils/signature.d.ts.map +1 -1
- package/dist/utils/validators.d.ts +21 -10
- package/dist/utils/validators.d.ts.map +1 -1
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/wallet/adapter.d.ts +21 -0
- package/dist/wallet/adapter.d.ts.map +1 -0
- package/dist/wallet/burner/service.d.ts +32 -0
- package/dist/wallet/burner/service.d.ts.map +1 -0
- package/dist/wallet/burner/types.d.ts +47 -0
- package/dist/wallet/burner/types.d.ts.map +1 -0
- package/dist/wallet/index.d.ts +20 -0
- package/dist/wallet/index.d.ts.map +1 -0
- package/dist/wallet/index.js +6462 -0
- package/dist/wallet/index.js.map +1 -0
- package/dist/wallet/sdk.d.ts +48 -0
- package/dist/wallet/sdk.d.ts.map +1 -0
- package/dist/wallet/types.d.ts +457 -0
- package/dist/wallet/types.d.ts.map +1 -0
- package/dist/wallet/unlink-wallet.d.ts +187 -0
- package/dist/wallet/unlink-wallet.d.ts.map +1 -0
- package/package.json +38 -15
- package/.eslintrc.json +0 -4
- package/account/zkAccount.test.ts +0 -316
- package/account/zkAccount.ts +0 -222
- package/circuits.json +0 -26
- 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/account/zkAccount.js +0 -128
- package/dist/circuits.json +0 -26
- package/dist/clients/broadcaster.js +0 -23
- package/dist/clients/http.js +0 -57
- package/dist/clients/indexer.js +0 -67
- package/dist/config.js +0 -29
- package/dist/core.js +0 -12
- package/dist/errors.js +0 -18
- 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/keys.js +0 -41
- package/dist/prover/config.js +0 -80
- package/dist/prover/index.js +0 -1
- package/dist/prover/prover.js +0 -274
- package/dist/prover/registry.js +0 -57
- package/dist/schema.js +0 -14
- 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/index.js +0 -2
- 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/hydrator.js +0 -36
- package/dist/state/merkle/index.js +0 -2
- package/dist/state/merkle/merkle-tree.js +0 -104
- 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/records.js +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/ciphertext-store.js +0 -25
- package/dist/state/store/index.js +0 -8
- package/dist/state/store/job-store.js +0 -118
- package/dist/state/store/jobs.js +0 -1
- package/dist/state/store/leaf-store.js +0 -35
- package/dist/state/store/note-store.js +0 -142
- package/dist/state/store/nullifier-store.js +0 -30
- package/dist/state/store/records.js +0 -1
- package/dist/state/store/root-store.js +0 -30
- package/dist/state/store/store.js +0 -22
- 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/storage/index.js +0 -2
- package/dist/storage/indexeddb.js +0 -205
- package/dist/storage/memory.js +0 -87
- package/dist/transactions/deposit.js +0 -169
- package/dist/transactions/index.js +0 -4
- package/dist/transactions/note-sync.js +0 -320
- package/dist/transactions/reconcile.js +0 -39
- 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/transact.js +0 -561
- package/dist/transactions/types.d.ts +0 -114
- package/dist/transactions/types.d.ts.map +0 -1
- package/dist/transactions/types.js +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/types.js +0 -1
- package/dist/utils/bigint.js +0 -29
- package/dist/utils/crypto.d.ts +0 -12
- package/dist/utils/crypto.d.ts.map +0 -1
- package/dist/utils/crypto.js +0 -39
- package/dist/utils/json-codec.js +0 -25
- package/dist/utils/polling.js +0 -6
- package/dist/utils/signature.js +0 -12
- 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/validators.js +0 -70
- 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 -21
- 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 -15
- 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
|
@@ -1,320 +0,0 @@
|
|
|
1
|
-
import { poseidon } from "@railgun-community/circomlibjs";
|
|
2
|
-
import { createIndexerClient } from "../clients/indexer.js";
|
|
3
|
-
import { serviceConfig } from "../config.js";
|
|
4
|
-
import { CoreError } from "../errors.js";
|
|
5
|
-
import { ByteLength, ByteUtils } from "../key-derivation/bytes.js";
|
|
6
|
-
import { createMerkleTrees, rebuildTreeFromStore, } from "../state/index.js";
|
|
7
|
-
import { formatUint256, parseHexToBigInt } from "../utils/bigint.js";
|
|
8
|
-
import { decryptNote } from "../utils/crypto.js";
|
|
9
|
-
import { ensureChainId } from "../utils/validators.js";
|
|
10
|
-
const DEFAULT_BATCH_SIZE = 256;
|
|
11
|
-
function buildCiphertext(bytes) {
|
|
12
|
-
return {
|
|
13
|
-
data: [
|
|
14
|
-
parseHexToBigInt(bytes[0]),
|
|
15
|
-
parseHexToBigInt(bytes[1]),
|
|
16
|
-
parseHexToBigInt(bytes[2]),
|
|
17
|
-
],
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
function encodeCiphertext(ciphertext) {
|
|
21
|
-
const payload = new Uint8Array(ByteLength.UINT_256 * ciphertext.data.length);
|
|
22
|
-
ciphertext.data.forEach((value, index) => {
|
|
23
|
-
const start = index * ByteLength.UINT_256;
|
|
24
|
-
payload.set(ByteUtils.hexStringToBytes(formatUint256(value)), start);
|
|
25
|
-
});
|
|
26
|
-
return payload;
|
|
27
|
-
}
|
|
28
|
-
export function createNoteSyncService(stateStore, options = {}) {
|
|
29
|
-
const trees = options.merkleTrees ?? createMerkleTrees();
|
|
30
|
-
const limit = options.limit ?? DEFAULT_BATCH_SIZE;
|
|
31
|
-
const status = new Map();
|
|
32
|
-
// Initialize indexer client
|
|
33
|
-
let indexerClient = options.indexerClient;
|
|
34
|
-
if (!indexerClient) {
|
|
35
|
-
const fetchImpl = options.fetch ?? (typeof fetch === "function" ? fetch : undefined);
|
|
36
|
-
if (!fetchImpl) {
|
|
37
|
-
throw new Error("fetch dependency is required to sync indexer commitments");
|
|
38
|
-
}
|
|
39
|
-
indexerClient = createIndexerClient(serviceConfig.indexerBaseUrl, {
|
|
40
|
-
fetch: fetchImpl,
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
// Count-based optimization: avoid per-nullifier lookups when counts are unchanged
|
|
44
|
-
async function shouldQueryNullifiers(chainId) {
|
|
45
|
-
const [onChainCount, localCount] = await Promise.all([
|
|
46
|
-
indexerClient.getNullifierCount(chainId),
|
|
47
|
-
stateStore.countNullifiers(chainId),
|
|
48
|
-
]);
|
|
49
|
-
return onChainCount !== localCount;
|
|
50
|
-
}
|
|
51
|
-
function createNoteRecord(params) {
|
|
52
|
-
const { chainId, index, commitment, token, amount, npk, mpk, random, nullifier, spentAt } = params;
|
|
53
|
-
const base = {
|
|
54
|
-
chainId,
|
|
55
|
-
index,
|
|
56
|
-
token,
|
|
57
|
-
value: amount.toString(),
|
|
58
|
-
commitment,
|
|
59
|
-
npk: formatUint256(npk),
|
|
60
|
-
mpk: formatUint256(mpk),
|
|
61
|
-
random: formatUint256(random),
|
|
62
|
-
nullifier,
|
|
63
|
-
};
|
|
64
|
-
return spentAt === undefined ? base : { ...base, spentAt };
|
|
65
|
-
}
|
|
66
|
-
async function recordCommitment(chainId, record, allowRelaxedOrder = false) {
|
|
67
|
-
const value = parseHexToBigInt(record.commitment);
|
|
68
|
-
const currentLeafCount = trees.getLeafCount(chainId);
|
|
69
|
-
if (record.index >= currentLeafCount) {
|
|
70
|
-
const { index } = trees.addLeaf(chainId, value);
|
|
71
|
-
if (index !== record.index && !allowRelaxedOrder) {
|
|
72
|
-
throw new CoreError("indexed commitments out of order");
|
|
73
|
-
}
|
|
74
|
-
await stateStore.putLeaf({
|
|
75
|
-
chainId,
|
|
76
|
-
index: record.index,
|
|
77
|
-
commitment: record.commitment,
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
await stateStore.putRoot({ chainId, root: record.root });
|
|
81
|
-
}
|
|
82
|
-
async function tryStoreNote(chainId, record, account, shouldCheckNullifiers) {
|
|
83
|
-
const ciphertext = buildCiphertext(record.ciphertext);
|
|
84
|
-
let note;
|
|
85
|
-
try {
|
|
86
|
-
note = decryptNote(ciphertext, account.masterPublicKey);
|
|
87
|
-
}
|
|
88
|
-
catch (err) {
|
|
89
|
-
if (err instanceof CoreError) {
|
|
90
|
-
return null;
|
|
91
|
-
}
|
|
92
|
-
throw err;
|
|
93
|
-
}
|
|
94
|
-
const random = note.random;
|
|
95
|
-
const amount = note.amount;
|
|
96
|
-
const token = note.token;
|
|
97
|
-
const npk = poseidon([account.masterPublicKey, random]);
|
|
98
|
-
const commitment = poseidon([npk, BigInt(token), amount]);
|
|
99
|
-
if (commitment !== parseHexToBigInt(record.commitment)) {
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
const nullifier = poseidon([account.nullifyingKey, BigInt(record.index)]);
|
|
103
|
-
const nullifierHex = formatUint256(nullifier);
|
|
104
|
-
const ciphertextBytes = encodeCiphertext(ciphertext);
|
|
105
|
-
await stateStore.putCiphertext(chainId, record.index, ciphertextBytes);
|
|
106
|
-
const baseNoteParams = {
|
|
107
|
-
chainId,
|
|
108
|
-
index: record.index,
|
|
109
|
-
commitment: record.commitment,
|
|
110
|
-
token,
|
|
111
|
-
amount,
|
|
112
|
-
npk,
|
|
113
|
-
mpk: account.masterPublicKey,
|
|
114
|
-
random,
|
|
115
|
-
nullifier: nullifierHex,
|
|
116
|
-
};
|
|
117
|
-
// Check if this note already exists in local storage
|
|
118
|
-
const existingNote = await stateStore.getNote(chainId, record.index);
|
|
119
|
-
// If note is already marked as spent locally, don't query indexer
|
|
120
|
-
// to ask for nullifier because we already know it's spent
|
|
121
|
-
if (existingNote?.spentAt !== undefined) {
|
|
122
|
-
// Ensure nullifier is stored for count optimization (idempotent)
|
|
123
|
-
await stateStore.putNullifier({
|
|
124
|
-
chainId,
|
|
125
|
-
nullifier: nullifierHex,
|
|
126
|
-
noteIndex: record.index,
|
|
127
|
-
});
|
|
128
|
-
return existingNote;
|
|
129
|
-
}
|
|
130
|
-
// Skip indexer nullifier query if nullifier counts match
|
|
131
|
-
if (!shouldCheckNullifiers) {
|
|
132
|
-
if (existingNote) {
|
|
133
|
-
return existingNote;
|
|
134
|
-
}
|
|
135
|
-
const stored = createNoteRecord(baseNoteParams);
|
|
136
|
-
await stateStore.putNote(stored);
|
|
137
|
-
return stored;
|
|
138
|
-
}
|
|
139
|
-
// Counts mismatched: query individual nullifier to check if this note was spent
|
|
140
|
-
const onChainNullifier = await indexerClient.getNullifier({
|
|
141
|
-
chainId,
|
|
142
|
-
nullifier: nullifierHex,
|
|
143
|
-
});
|
|
144
|
-
if (onChainNullifier) {
|
|
145
|
-
const spentAtMs = onChainNullifier.spentAt * 1000;
|
|
146
|
-
// Store nullifier
|
|
147
|
-
await stateStore.putNullifier({
|
|
148
|
-
chainId,
|
|
149
|
-
nullifier: nullifierHex,
|
|
150
|
-
noteIndex: record.index,
|
|
151
|
-
});
|
|
152
|
-
if (existingNote) {
|
|
153
|
-
// Update existing unspent note to mark as spent
|
|
154
|
-
await stateStore.markNoteSpent(chainId, record.index, spentAtMs);
|
|
155
|
-
return existingNote;
|
|
156
|
-
}
|
|
157
|
-
const stored = createNoteRecord({
|
|
158
|
-
...baseNoteParams,
|
|
159
|
-
spentAt: spentAtMs,
|
|
160
|
-
});
|
|
161
|
-
await stateStore.putNote(stored);
|
|
162
|
-
return stored;
|
|
163
|
-
}
|
|
164
|
-
// Skip re-storing unspent notes that already exist
|
|
165
|
-
if (existingNote) {
|
|
166
|
-
return existingNote;
|
|
167
|
-
}
|
|
168
|
-
const stored = createNoteRecord(baseNoteParams);
|
|
169
|
-
await stateStore.putNote(stored);
|
|
170
|
-
return stored;
|
|
171
|
-
}
|
|
172
|
-
// Pulls commitments from the indexer starting at `start`, updating local tree and notes.
|
|
173
|
-
async function ingestFrom(chainId, start, account) {
|
|
174
|
-
const shouldCheckNullifiers = await shouldQueryNullifiers(chainId);
|
|
175
|
-
let cursor = start;
|
|
176
|
-
for (;;) {
|
|
177
|
-
const batch = await indexerClient.fetchCommitmentBatch({
|
|
178
|
-
chainId,
|
|
179
|
-
start: cursor,
|
|
180
|
-
limit,
|
|
181
|
-
});
|
|
182
|
-
if (batch.commitments.length === 0) {
|
|
183
|
-
break;
|
|
184
|
-
}
|
|
185
|
-
for (const record of batch.commitments) {
|
|
186
|
-
const expectedIndex = trees.getLeafCount(chainId);
|
|
187
|
-
if (record.index !== expectedIndex) {
|
|
188
|
-
throw new Error("indexed commitments out of order");
|
|
189
|
-
}
|
|
190
|
-
const value = ByteUtils.hexToBigInt(record.commitment);
|
|
191
|
-
const { index } = trees.addLeaf(chainId, value);
|
|
192
|
-
if (index !== record.index) {
|
|
193
|
-
throw new Error("local merkle tree desynchronized");
|
|
194
|
-
}
|
|
195
|
-
await stateStore.putLeaf({
|
|
196
|
-
chainId,
|
|
197
|
-
index: record.index,
|
|
198
|
-
commitment: record.commitment,
|
|
199
|
-
});
|
|
200
|
-
await stateStore.putRoot({ chainId, root: record.root });
|
|
201
|
-
await tryStoreNote(chainId, record, account, shouldCheckNullifiers);
|
|
202
|
-
cursor = record.index + 1;
|
|
203
|
-
}
|
|
204
|
-
if (batch.commitments.length < limit) {
|
|
205
|
-
break;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
// Clears local state for a chain and rehydrates fully from the indexer.
|
|
210
|
-
async function fullResync(chainId, account) {
|
|
211
|
-
trees.reset(chainId);
|
|
212
|
-
await stateStore.clearLeaves(chainId);
|
|
213
|
-
await ingestFrom(chainId, 0, account);
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Syncs a single chain into local state, optionally forcing a full rebuild.
|
|
217
|
-
* Skips overlapping runs via `inFlight` and falls back to full resync on
|
|
218
|
-
* ordering/root inconsistencies.
|
|
219
|
-
*/
|
|
220
|
-
async function syncChain(chainId, account, opts = {}) {
|
|
221
|
-
ensureChainId(chainId);
|
|
222
|
-
const current = status.get(chainId) ?? {
|
|
223
|
-
inFlight: false,
|
|
224
|
-
lastSuccess: null,
|
|
225
|
-
};
|
|
226
|
-
if (current.inFlight) {
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
status.set(chainId, { ...current, inFlight: true, lastError: undefined });
|
|
230
|
-
try {
|
|
231
|
-
const start = opts.forceFullResync
|
|
232
|
-
? 0
|
|
233
|
-
: await rebuildTreeFromStore({
|
|
234
|
-
chainId,
|
|
235
|
-
trees,
|
|
236
|
-
loadLeaf: stateStore.getLeaf.bind(stateStore),
|
|
237
|
-
});
|
|
238
|
-
if (opts.forceFullResync) {
|
|
239
|
-
await fullResync(chainId, account);
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
try {
|
|
243
|
-
await ingestFrom(chainId, start, account);
|
|
244
|
-
}
|
|
245
|
-
catch (err) {
|
|
246
|
-
// Fallback to full resync on ordering/root mismatch.
|
|
247
|
-
await fullResync(chainId, account);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
status.set(chainId, {
|
|
251
|
-
inFlight: false,
|
|
252
|
-
lastSuccess: Date.now(),
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
catch (err) {
|
|
256
|
-
status.set(chainId, {
|
|
257
|
-
inFlight: false,
|
|
258
|
-
lastSuccess: current.lastSuccess ?? null,
|
|
259
|
-
lastError: err instanceof Error ? err.message : String(err),
|
|
260
|
-
});
|
|
261
|
-
throw err;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* Syncs multiple chains sequentially.
|
|
266
|
-
*/
|
|
267
|
-
async function syncChains(chainIds, account, opts) {
|
|
268
|
-
for (const chainId of chainIds) {
|
|
269
|
-
await syncChain(chainId, account, opts);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* Legacy sync method that returns synced notes.
|
|
274
|
-
* Kept for backward compatibility.
|
|
275
|
-
*/
|
|
276
|
-
async function sync(chainId, account, opts) {
|
|
277
|
-
ensureChainId(chainId);
|
|
278
|
-
await rebuildTreeFromStore({
|
|
279
|
-
chainId,
|
|
280
|
-
trees,
|
|
281
|
-
loadLeaf: stateStore.getLeaf.bind(stateStore),
|
|
282
|
-
});
|
|
283
|
-
const synced = [];
|
|
284
|
-
let start = opts?.start ?? 0;
|
|
285
|
-
const shouldCheckNullifiers = await shouldQueryNullifiers(chainId);
|
|
286
|
-
let keepFetching = true;
|
|
287
|
-
while (keepFetching) {
|
|
288
|
-
const batch = await indexerClient.fetchCommitmentBatch({
|
|
289
|
-
chainId,
|
|
290
|
-
start,
|
|
291
|
-
limit,
|
|
292
|
-
});
|
|
293
|
-
if (batch.commitments.length === 0) {
|
|
294
|
-
keepFetching = false;
|
|
295
|
-
continue;
|
|
296
|
-
}
|
|
297
|
-
for (const record of batch.commitments) {
|
|
298
|
-
await recordCommitment(chainId, record, !!opts?.forceFullScan);
|
|
299
|
-
const storedNote = await tryStoreNote(chainId, record, account, shouldCheckNullifiers);
|
|
300
|
-
if (storedNote) {
|
|
301
|
-
synced.push(storedNote);
|
|
302
|
-
}
|
|
303
|
-
start = record.index + 1;
|
|
304
|
-
}
|
|
305
|
-
if (batch.commitments.length < limit) {
|
|
306
|
-
keepFetching = false;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
return synced;
|
|
310
|
-
}
|
|
311
|
-
function getStatus() {
|
|
312
|
-
return status;
|
|
313
|
-
}
|
|
314
|
-
return {
|
|
315
|
-
sync,
|
|
316
|
-
syncChain,
|
|
317
|
-
syncChains,
|
|
318
|
-
getStatus,
|
|
319
|
-
};
|
|
320
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
const ACTIVE_STATUSES = ["pending", "submitted", "broadcasting"];
|
|
2
|
-
export function createJobReconciler(deps) {
|
|
3
|
-
const { stateStore, depositClient, transactService } = deps;
|
|
4
|
-
async function reconcileJob(job) {
|
|
5
|
-
if (job.kind === "deposit") {
|
|
6
|
-
return depositClient.syncPendingDeposit(job.relayId);
|
|
7
|
-
}
|
|
8
|
-
return transactService.syncPendingTransact(job.relayId);
|
|
9
|
-
}
|
|
10
|
-
async function reconcileRelay(relayId) {
|
|
11
|
-
const job = await stateStore.getPendingJob(relayId);
|
|
12
|
-
if (!job) {
|
|
13
|
-
throw new Error(`unknown relay ${relayId}`);
|
|
14
|
-
}
|
|
15
|
-
return reconcileJob(job);
|
|
16
|
-
}
|
|
17
|
-
async function reconcileAll(filter = {}) {
|
|
18
|
-
const jobs = await stateStore.listPendingJobs({
|
|
19
|
-
kind: filter.kind,
|
|
20
|
-
statuses: filter.statuses ?? ACTIVE_STATUSES,
|
|
21
|
-
});
|
|
22
|
-
const results = [];
|
|
23
|
-
for (const job of jobs) {
|
|
24
|
-
try {
|
|
25
|
-
const res = await reconcileJob(job);
|
|
26
|
-
results.push(res);
|
|
27
|
-
}
|
|
28
|
-
catch (err) {
|
|
29
|
-
// Allow caller to decide how to handle errors; we keep going.
|
|
30
|
-
results.push(err);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return results;
|
|
34
|
-
}
|
|
35
|
-
return {
|
|
36
|
-
reconcileRelay,
|
|
37
|
-
reconcileAll,
|
|
38
|
-
};
|
|
39
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shield.d.ts","sourceRoot":"","sources":["../../transactions/shield.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAQpB,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,gBAAgB;uBA8DnC,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;EA+BpE"}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { Interface } from 'ethers';
|
|
2
|
-
import { poseidon } from '@railgun-community/circomlibjs'; // TODO: replace with zk-kit
|
|
3
|
-
import { createLocalMerkleTree } from '../state/merkle-tree.js';
|
|
4
|
-
import { ensureAddress, ensureChainId } from '../utils/validators.js';
|
|
5
|
-
const HEX_PAD = 64;
|
|
6
|
-
const DEPOSIT_ABI = [
|
|
7
|
-
'function deposit(address _depositor, (uint256 key, uint256 amount, address token)[] notes)',
|
|
8
|
-
];
|
|
9
|
-
const depositInterface = new Interface(DEPOSIT_ABI);
|
|
10
|
-
export function createShieldService(stateStore) {
|
|
11
|
-
if (!stateStore) {
|
|
12
|
-
throw new Error('stateStore dependency is required');
|
|
13
|
-
}
|
|
14
|
-
const trees = new Map();
|
|
15
|
-
function getTree(chainId) {
|
|
16
|
-
ensureChainId(chainId);
|
|
17
|
-
let tree = trees.get(chainId);
|
|
18
|
-
if (!tree) {
|
|
19
|
-
tree = createLocalMerkleTree();
|
|
20
|
-
trees.set(chainId, tree);
|
|
21
|
-
}
|
|
22
|
-
return tree;
|
|
23
|
-
}
|
|
24
|
-
function buildCalldata(submission, npk) {
|
|
25
|
-
ensureChainId(submission.chainId);
|
|
26
|
-
ensureAddress('pool address', submission.poolAddress);
|
|
27
|
-
ensureAddress('depositor', submission.depositor);
|
|
28
|
-
ensureAddress('token', submission.note.token);
|
|
29
|
-
return depositInterface.encodeFunctionData('deposit', [
|
|
30
|
-
submission.depositor,
|
|
31
|
-
[
|
|
32
|
-
{
|
|
33
|
-
key: npk,
|
|
34
|
-
amount: submission.note.amount,
|
|
35
|
-
token: submission.note.token,
|
|
36
|
-
},
|
|
37
|
-
],
|
|
38
|
-
]);
|
|
39
|
-
}
|
|
40
|
-
function deriveNpk(submission) {
|
|
41
|
-
if (submission.note.mpk < 0n) {
|
|
42
|
-
throw new Error('mpk must be non-negative');
|
|
43
|
-
}
|
|
44
|
-
if (submission.note.random < 0n) {
|
|
45
|
-
throw new Error('random must be non-negative');
|
|
46
|
-
}
|
|
47
|
-
return poseidon([submission.note.mpk, submission.note.random]);
|
|
48
|
-
}
|
|
49
|
-
function computeCommitment(submission, npk) {
|
|
50
|
-
if (submission.note.amount < 0n) {
|
|
51
|
-
throw new Error('amount must be non-negative');
|
|
52
|
-
}
|
|
53
|
-
const tokenScalar = BigInt(submission.note.token);
|
|
54
|
-
if (tokenScalar < 0n) {
|
|
55
|
-
throw new Error('token must map to non-negative scalar');
|
|
56
|
-
}
|
|
57
|
-
return poseidon([npk, tokenScalar, submission.note.amount]);
|
|
58
|
-
}
|
|
59
|
-
async function relayToBroadcaster(chainId, commitment) {
|
|
60
|
-
const tree = getTree(chainId);
|
|
61
|
-
return tree.addLeaf(commitment);
|
|
62
|
-
}
|
|
63
|
-
return {
|
|
64
|
-
async submit(submission) {
|
|
65
|
-
const npk = deriveNpk(submission);
|
|
66
|
-
const calldata = buildCalldata(submission, npk);
|
|
67
|
-
const commitment = computeCommitment(submission, npk);
|
|
68
|
-
const { index, root } = await relayToBroadcaster(submission.chainId, commitment);
|
|
69
|
-
const commitmentHex = toHex(commitment);
|
|
70
|
-
await Promise.all([
|
|
71
|
-
stateStore.putLeaf({
|
|
72
|
-
chainId: submission.chainId,
|
|
73
|
-
index,
|
|
74
|
-
commitment: commitmentHex,
|
|
75
|
-
}),
|
|
76
|
-
stateStore.putRoot({
|
|
77
|
-
chainId: submission.chainId,
|
|
78
|
-
root,
|
|
79
|
-
}),
|
|
80
|
-
]);
|
|
81
|
-
return {
|
|
82
|
-
chainId: submission.chainId,
|
|
83
|
-
index,
|
|
84
|
-
commitment: commitmentHex,
|
|
85
|
-
root,
|
|
86
|
-
calldata,
|
|
87
|
-
};
|
|
88
|
-
},
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
function toHex(value) {
|
|
92
|
-
return `0x${value.toString(16).padStart(HEX_PAD, '0')}`;
|
|
93
|
-
}
|