@zill-protocol/client 4.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +18 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/package.json +58 -0
  7. package/dist/src/NocturneClient.d.ts +68 -0
  8. package/dist/src/NocturneClient.d.ts.map +1 -0
  9. package/dist/src/NocturneClient.js +264 -0
  10. package/dist/src/NocturneClient.js.map +1 -0
  11. package/dist/src/NocturneDB.d.ts +100 -0
  12. package/dist/src/NocturneDB.d.ts.map +1 -0
  13. package/dist/src/NocturneDB.js +525 -0
  14. package/dist/src/NocturneDB.js.map +1 -0
  15. package/dist/src/OpTracker.d.ts +13 -0
  16. package/dist/src/OpTracker.d.ts.map +1 -0
  17. package/dist/src/OpTracker.js +34 -0
  18. package/dist/src/OpTracker.js.map +1 -0
  19. package/dist/src/conversion/converter.d.ts +5 -0
  20. package/dist/src/conversion/converter.d.ts.map +1 -0
  21. package/dist/src/conversion/converter.js +15 -0
  22. package/dist/src/conversion/converter.js.map +1 -0
  23. package/dist/src/conversion/index.d.ts +3 -0
  24. package/dist/src/conversion/index.d.ts.map +1 -0
  25. package/dist/src/conversion/index.js +21 -0
  26. package/dist/src/conversion/index.js.map +1 -0
  27. package/dist/src/conversion/mock.d.ts +6 -0
  28. package/dist/src/conversion/mock.d.ts.map +1 -0
  29. package/dist/src/conversion/mock.js +14 -0
  30. package/dist/src/conversion/mock.js.map +1 -0
  31. package/dist/src/index.d.ts +14 -0
  32. package/dist/src/index.d.ts.map +1 -0
  33. package/dist/src/index.js +39 -0
  34. package/dist/src/index.js.map +1 -0
  35. package/dist/src/opRequestGas.d.ts +20 -0
  36. package/dist/src/opRequestGas.d.ts.map +1 -0
  37. package/dist/src/opRequestGas.js +321 -0
  38. package/dist/src/opRequestGas.js.map +1 -0
  39. package/dist/src/operationRequest/builder.d.ts +40 -0
  40. package/dist/src/operationRequest/builder.d.ts.map +1 -0
  41. package/dist/src/operationRequest/builder.js +192 -0
  42. package/dist/src/operationRequest/builder.js.map +1 -0
  43. package/dist/src/operationRequest/index.d.ts +3 -0
  44. package/dist/src/operationRequest/index.d.ts.map +1 -0
  45. package/dist/src/operationRequest/index.js +6 -0
  46. package/dist/src/operationRequest/index.js.map +1 -0
  47. package/dist/src/operationRequest/operationRequest.d.ts +50 -0
  48. package/dist/src/operationRequest/operationRequest.d.ts.map +1 -0
  49. package/dist/src/operationRequest/operationRequest.js +16 -0
  50. package/dist/src/operationRequest/operationRequest.js.map +1 -0
  51. package/dist/src/prepareOperation.d.ts +21 -0
  52. package/dist/src/prepareOperation.d.ts.map +1 -0
  53. package/dist/src/prepareOperation.js +256 -0
  54. package/dist/src/prepareOperation.js.map +1 -0
  55. package/dist/src/proveOperation.d.ts +7 -0
  56. package/dist/src/proveOperation.d.ts.map +1 -0
  57. package/dist/src/proveOperation.js +79 -0
  58. package/dist/src/proveOperation.js.map +1 -0
  59. package/dist/src/signOperation.d.ts +3 -0
  60. package/dist/src/signOperation.d.ts.map +1 -0
  61. package/dist/src/signOperation.js +61 -0
  62. package/dist/src/signOperation.js.map +1 -0
  63. package/dist/src/snapJsonRpc.d.ts +55 -0
  64. package/dist/src/snapJsonRpc.d.ts.map +1 -0
  65. package/dist/src/snapJsonRpc.js +63 -0
  66. package/dist/src/snapJsonRpc.js.map +1 -0
  67. package/dist/src/syncSDK.d.ts +17 -0
  68. package/dist/src/syncSDK.d.ts.map +1 -0
  69. package/dist/src/syncSDK.js +188 -0
  70. package/dist/src/syncSDK.js.map +1 -0
  71. package/dist/src/types.d.ts +60 -0
  72. package/dist/src/types.d.ts.map +1 -0
  73. package/dist/src/types.js +3 -0
  74. package/dist/src/types.js.map +1 -0
  75. package/dist/src/utils/constants.d.ts +3 -0
  76. package/dist/src/utils/constants.d.ts.map +1 -0
  77. package/dist/src/utils/constants.js +20 -0
  78. package/dist/src/utils/constants.js.map +1 -0
  79. package/dist/src/utils/index.d.ts +3 -0
  80. package/dist/src/utils/index.d.ts.map +1 -0
  81. package/dist/src/utils/index.js +19 -0
  82. package/dist/src/utils/index.js.map +1 -0
  83. package/dist/src/utils/misc.d.ts +13 -0
  84. package/dist/src/utils/misc.d.ts.map +1 -0
  85. package/dist/src/utils/misc.js +77 -0
  86. package/dist/src/utils/misc.js.map +1 -0
  87. package/dist/tsconfig.tsbuildinfo +1 -0
  88. package/package.json +58 -0
  89. package/src/NocturneClient.ts +415 -0
  90. package/src/NocturneDB.ts +761 -0
  91. package/src/OpTracker.ts +44 -0
  92. package/src/conversion/converter.ts +22 -0
  93. package/src/conversion/index.ts +2 -0
  94. package/src/conversion/mock.ts +11 -0
  95. package/src/index.ts +14 -0
  96. package/src/opRequestGas.ts +487 -0
  97. package/src/operationRequest/builder.ts +359 -0
  98. package/src/operationRequest/index.ts +16 -0
  99. package/src/operationRequest/operationRequest.ts +87 -0
  100. package/src/prepareOperation.ts +420 -0
  101. package/src/proveOperation.ts +124 -0
  102. package/src/signOperation.ts +116 -0
  103. package/src/snapJsonRpc.ts +109 -0
  104. package/src/syncSDK.ts +285 -0
  105. package/src/types.ts +83 -0
  106. package/src/utils/constants.ts +16 -0
  107. package/src/utils/index.ts +2 -0
  108. package/src/utils/misc.ts +107 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,17 @@
1
+ # Changelog
2
+
3
+ ## 4.1.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Initial publish under the @zill-protocol scope.
8
+ - Updated dependencies
9
+ - @zill-protocol/config@1.7.4
10
+ - @zill-protocol/core@3.3.1
11
+ - @zill-protocol/crypto@0.4.3
12
+
13
+ All notable changes to this package are documented in this file.
14
+
15
+ ## Unreleased
16
+
17
+ - Initial changelog reset.
@@ -0,0 +1,2 @@
1
+ export * from "./src/index";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./src/index"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B"}
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@zill-protocol/client",
3
+ "version": "4.1.2",
4
+ "license": "MIT",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist/**/*",
9
+ "src/**/*"
10
+ ],
11
+ "scripts": {
12
+ "build": "yarn clean; tsc --build",
13
+ "check": "tsc --noEmit",
14
+ "clean": "rm -rf .turbo dist",
15
+ "gen-test-cases:operationhash": "npx ts-node ./scripts/genOperationHashTestCase.ts",
16
+ "gen-test-cases:registryentry": "npx ts-node ./scripts/genCanonAddrRegistryEntryHashTestCase.ts",
17
+ "gen-test-cases:poseidonext": "npx ts-node ./scripts/genPoseidonExtTestCase.ts",
18
+ "lint": "eslint --fix src --ext .ts",
19
+ "prettier:check": "prettier --check ./src ./test",
20
+ "prettier:write": "prettier --write ./src ./test",
21
+ "publish": "yarn build; yarn npm publish --access public",
22
+ "test:unit": "mocha --require ts-node/register test/** --timeout 45000 --exit"
23
+ },
24
+ "dependencies": {
25
+ "@zill-protocol/config": "workspace:^",
26
+ "@zill-protocol/contracts": "^3.0.0",
27
+ "@zill-protocol/core": "workspace:^",
28
+ "@zill-protocol/crypto": "workspace:^",
29
+ "async-mutex": "^0.4.0",
30
+ "big-integer": "^1.6.42",
31
+ "bigint-json-serialization": "^1.0.1",
32
+ "ethers": "^5.7.2",
33
+ "js-sha256": "^0.9.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/chai": "^4.3.3",
37
+ "@types/chai-as-promised": "^7.1.5",
38
+ "@types/mocha": "^10.0.0",
39
+ "@types/node": "^25.0.1",
40
+ "@types/sinon": "^10.0.13",
41
+ "@types/sinon-chai": "^3.2.9",
42
+ "@typescript-eslint/eslint-plugin": "^8.49.0",
43
+ "@typescript-eslint/parser": "^8.49.0",
44
+ "chai": "^4.3.6",
45
+ "chai-as-promised": "^7.1.1",
46
+ "eslint": "^9.39.2",
47
+ "eslint-config-prettier": "^10.1.8",
48
+ "mocha": "^10.1.0",
49
+ "prettier": "^3.7.4",
50
+ "sinon": "^15.0.1",
51
+ "sinon-chai": "^3.7.0",
52
+ "ts-node": "^10.9.2",
53
+ "typescript": "^5.9.3"
54
+ },
55
+ "engines": {
56
+ "node": ">=18"
57
+ }
58
+ }
@@ -0,0 +1,68 @@
1
+ import { NocturneConfig } from "@zill-protocol/config";
2
+ import { Handler } from "@zill-protocol/contracts";
3
+ import { NocturneViewer } from "@zill-protocol/crypto";
4
+ import ethers from "ethers";
5
+ import { GetNotesOpts, NocturneDB } from "./NocturneDB";
6
+ import { OpTracker } from "./OpTracker";
7
+ import { EthToTokenConverter } from "./conversion";
8
+ import { OperationRequest } from "./operationRequest/operationRequest";
9
+ import { SyncOpts } from "./syncSDK";
10
+ import { OpHistoryRecord, OperationMetadata, PendingOutputRecord } from "./types";
11
+ import { Asset, AssetWithBalance, IncludedNote, OperationStatus, PreSignOperation, SDKSyncAdapter, SignedOperation, SparseMerkleProver, TotalEntityIndex } from "@zill-protocol/core";
12
+ export declare class NocturneClient {
13
+ protected provider: ethers.providers.Provider;
14
+ protected config: NocturneConfig;
15
+ protected handlerContract: Handler;
16
+ protected merkleProver: SparseMerkleProver;
17
+ protected db: NocturneDB;
18
+ protected syncAdapter: SDKSyncAdapter;
19
+ protected tokenConverter: EthToTokenConverter;
20
+ protected opTracker: OpTracker;
21
+ protected pendingOutputsListeners: Set<(outputs: PendingOutputRecord[]) => void>;
22
+ readonly viewer: NocturneViewer;
23
+ readonly gasAssets: Map<string, Asset>;
24
+ constructor(viewer: NocturneViewer, provider: ethers.providers.Provider, configOrNetworkName: NocturneConfig | string, merkleProver: SparseMerkleProver, db: NocturneDB, syncAdapter: SDKSyncAdapter, tokenConverter: EthToTokenConverter, nulliferChecker: OpTracker);
25
+ clearDb(): Promise<void>;
26
+ sync(opts?: SyncOpts): Promise<number | undefined>;
27
+ prepareOperation(opRequest: OperationRequest, gasMultiplier: number): Promise<PreSignOperation>;
28
+ getAllAssetBalances(opts?: GetNotesOpts): Promise<AssetWithBalance[]>;
29
+ getBalanceForAsset(asset: Asset, opts?: GetNotesOpts): Promise<bigint>;
30
+ getNotesForAsset(asset: Asset, opts?: GetNotesOpts): Promise<IncludedNote[]>;
31
+ getPrivateBalanceBreakdown(asset: Asset): Promise<{
32
+ confirmed: bigint;
33
+ pendingUncommitted: bigint;
34
+ pendingLocal: bigint;
35
+ pending: bigint;
36
+ total: bigint;
37
+ }>;
38
+ getPendingBalanceForAsset(asset: Asset): Promise<bigint>;
39
+ getPendingOutputs(opts?: {
40
+ asset?: Asset;
41
+ }): Promise<PendingOutputRecord[]>;
42
+ listPendingNotes(opts?: {
43
+ asset?: Asset;
44
+ }): Promise<PendingOutputRecord[]>;
45
+ addPendingOutputs(outputs: PendingOutputRecord[]): Promise<void>;
46
+ addPendingOutputsFromOperation(op: PreSignOperation | SignedOperation): Promise<void>;
47
+ removePendingOutputsByOpDigest(opDigest: bigint): Promise<void>;
48
+ onPendingNoteConfirmed(listener: (outputs: PendingOutputRecord[]) => void): () => void;
49
+ getLatestSyncedMerkleIndex(): Promise<number | undefined>;
50
+ getLatestCommittedMerkleIndex(): Promise<number | undefined>;
51
+ /**
52
+ * Force-nullify notes locally by nullifier. This is useful as a mitigation
53
+ * when the sync source cannot supply nullifiers (e.g. Mirror down) but the
54
+ * bundler reports the nullifier already exists on-chain.
55
+ */
56
+ forceNullifyNotes(nullifiers: bigint[]): Promise<number[]>;
57
+ getCurrentTreeRoot(): bigint;
58
+ hasEnoughBalanceForOperationRequest(opRequest: OperationRequest): Promise<boolean>;
59
+ getCreationBlockOfNewestNoteInOp(op: PreSignOperation | SignedOperation): Promise<number>;
60
+ addOpToHistory(op: PreSignOperation | SignedOperation, metadata: OperationMetadata): Promise<void>;
61
+ removeOpFromHistory(digest: bigint): Promise<void>;
62
+ getOpHistory(includePending?: boolean): Promise<OpHistoryRecord[]>;
63
+ getOpHistoryRecord(digest: bigint): Promise<OpHistoryRecord | undefined>;
64
+ setOpStatusInHistory(digest: bigint, status: OperationStatus): Promise<void>;
65
+ pruneOptimisticNullifiers(): Promise<void>;
66
+ }
67
+ export declare function getTotalEntityIndexOfNewestNoteInOp(db: NocturneDB, op: PreSignOperation | SignedOperation): Promise<TotalEntityIndex>;
68
+ //# sourceMappingURL=NocturneClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NocturneClient.d.ts","sourceRoot":"","sources":["../../src/NocturneClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NocturneClient = void 0;
4
+ exports.getTotalEntityIndexOfNewestNoteInOp = getTotalEntityIndexOfNewestNoteInOp;
5
+ const config_1 = require("@zill-protocol/config");
6
+ const contracts_1 = require("@zill-protocol/contracts");
7
+ const crypto_1 = require("@zill-protocol/crypto");
8
+ const NocturneDB_1 = require("./NocturneDB");
9
+ const opRequestGas_1 = require("./opRequestGas");
10
+ const operationRequest_1 = require("./operationRequest/operationRequest");
11
+ const prepareOperation_1 = require("./prepareOperation");
12
+ const syncSDK_1 = require("./syncSDK");
13
+ const utils_1 = require("./utils");
14
+ const core_1 = require("@zill-protocol/core");
15
+ const PRUNE_OPTIMISTIC_NFS_TIMER = 60 * 1000; // 1 minute
16
+ class NocturneClient {
17
+ constructor(viewer, provider, configOrNetworkName, merkleProver, db, syncAdapter, tokenConverter, nulliferChecker) {
18
+ this.pendingOutputsListeners = new Set();
19
+ if (typeof configOrNetworkName == "string") {
20
+ this.config = (0, config_1.loadNocturneConfig)(configOrNetworkName);
21
+ }
22
+ else {
23
+ this.config = configOrNetworkName;
24
+ }
25
+ this.provider = provider;
26
+ this.gasAssets = new Map(Array.from(this.config.erc20s.entries())
27
+ .filter(([_, config]) => config.isGasAsset)
28
+ .map(([ticker, config]) => {
29
+ return [ticker, core_1.AssetTrait.erc20AddressToAsset(config.address)];
30
+ }));
31
+ this.viewer = viewer;
32
+ console.log(`Canonical address: `, this.viewer.canonicalAddress());
33
+ this.handlerContract = contracts_1.Handler__factory.connect(this.config.handlerAddress, provider);
34
+ this.merkleProver = merkleProver;
35
+ this.db = db;
36
+ this.syncAdapter = syncAdapter;
37
+ this.tokenConverter = tokenConverter;
38
+ this.opTracker = nulliferChecker;
39
+ // set an interval to prune optimistic nfs to ensure they don't get stuck
40
+ const prune = async () => {
41
+ await this.pruneOptimisticNullifiers();
42
+ setTimeout(prune, PRUNE_OPTIMISTIC_NFS_TIMER);
43
+ };
44
+ void prune();
45
+ }
46
+ async clearDb() {
47
+ await this.db.kv.clear();
48
+ }
49
+ // Sync SDK, returning last synced merkle index of last state diff
50
+ async sync(opts) {
51
+ const hasListeners = this.pendingOutputsListeners.size > 0;
52
+ const shouldNotify = hasListeners || opts?.onPendingOutputsConfirmed;
53
+ const onPendingOutputsConfirmed = shouldNotify
54
+ ? (outputs) => {
55
+ if (!outputs.length) {
56
+ return;
57
+ }
58
+ if (hasListeners) {
59
+ for (const listener of this.pendingOutputsListeners) {
60
+ try {
61
+ listener(outputs);
62
+ }
63
+ catch (err) {
64
+ console.warn("[sync] pending output listener failed", err);
65
+ }
66
+ }
67
+ }
68
+ opts?.onPendingOutputsConfirmed?.(outputs);
69
+ }
70
+ : undefined;
71
+ const baseOpts = opts
72
+ ? {
73
+ ...opts,
74
+ finalityBlocks: opts.finalityBlocks ?? this.config.finalityBlocks,
75
+ }
76
+ : undefined;
77
+ const mergedOpts = onPendingOutputsConfirmed
78
+ ? { ...(baseOpts ?? {}), onPendingOutputsConfirmed }
79
+ : baseOpts;
80
+ const latestSyncedMerkleIndex = await (0, syncSDK_1.syncSDK)({ viewer: this.viewer }, this.syncAdapter, this.db, this.merkleProver, mergedOpts);
81
+ return latestSyncedMerkleIndex;
82
+ }
83
+ async prepareOperation(opRequest, gasMultiplier) {
84
+ opRequest = await (0, operationRequest_1.ensureOpRequestChainInfo)(opRequest, this.provider);
85
+ const deps = {
86
+ db: this.db,
87
+ gasAssets: this.gasAssets,
88
+ tokenConverter: this.tokenConverter,
89
+ handlerContract: this.handlerContract,
90
+ merkle: this.merkleProver,
91
+ viewer: this.viewer,
92
+ };
93
+ const gasAccountedOpRequest = await (0, opRequestGas_1.handleGasForOperationRequest)(deps, opRequest, gasMultiplier);
94
+ return await (0, prepareOperation_1.prepareOperation)(deps, gasAccountedOpRequest);
95
+ }
96
+ async getAllAssetBalances(opts) {
97
+ const notes = await this.db.getAllNotes(opts);
98
+ return Array.from(notes.entries()).map(([assetString, notes]) => {
99
+ const asset = NocturneDB_1.NocturneDB.parseAssetKey(assetString);
100
+ const balance = notes.reduce((a, b) => a + b.value, 0n);
101
+ return {
102
+ asset,
103
+ balance,
104
+ numNotes: notes.length,
105
+ };
106
+ });
107
+ }
108
+ async getBalanceForAsset(asset, opts) {
109
+ return await this.db.getBalanceForAsset(asset, opts);
110
+ }
111
+ async getNotesForAsset(asset, opts) {
112
+ return await this.db.getNotesForAsset(asset, opts);
113
+ }
114
+ async getPrivateBalanceBreakdown(asset) {
115
+ const [confirmed, totalUncommitted, pendingLocal] = await Promise.all([
116
+ this.db.getBalanceForAsset(asset),
117
+ this.db.getBalanceForAsset(asset, { includeUncommitted: true }),
118
+ this.db.getPendingBalanceForAsset(asset),
119
+ ]);
120
+ const pendingUncommitted = totalUncommitted > confirmed ? totalUncommitted - confirmed : 0n;
121
+ const pending = pendingUncommitted + pendingLocal;
122
+ return {
123
+ confirmed,
124
+ pendingUncommitted,
125
+ pendingLocal,
126
+ pending,
127
+ total: confirmed + pending,
128
+ };
129
+ }
130
+ async getPendingBalanceForAsset(asset) {
131
+ return await this.db.getPendingBalanceForAsset(asset);
132
+ }
133
+ async getPendingOutputs(opts) {
134
+ return await this.db.getPendingOutputs(opts);
135
+ }
136
+ async listPendingNotes(opts) {
137
+ return await this.db.getPendingOutputs(opts);
138
+ }
139
+ async addPendingOutputs(outputs) {
140
+ await this.db.addPendingOutputs(outputs);
141
+ }
142
+ async addPendingOutputsFromOperation(op) {
143
+ const senderOwner = crypto_1.StealthAddressTrait.fromCanonAddress(this.viewer.canonicalAddress());
144
+ const senderKey = crypto_1.StealthAddressTrait.toString(senderOwner);
145
+ const digest = core_1.OperationTrait.computeDigest(op);
146
+ const outputs = [];
147
+ for (const joinSplit of op.joinSplits) {
148
+ let notes = [];
149
+ if ("newNoteA" in joinSplit) {
150
+ notes = [joinSplit.newNoteA, joinSplit.newNoteB];
151
+ }
152
+ else {
153
+ const decryptedNotes = [
154
+ joinSplit.newNoteAEncrypted,
155
+ joinSplit.newNoteBEncrypted,
156
+ ]
157
+ .map((encryptedNote) => {
158
+ try {
159
+ const { sender, ...note } = (0, core_1.decryptNote)(this.viewer, encryptedNote);
160
+ return note;
161
+ }
162
+ catch (err) {
163
+ return null;
164
+ }
165
+ })
166
+ .filter((note) => note !== null);
167
+ notes = decryptedNotes;
168
+ }
169
+ for (const note of notes) {
170
+ if (note.value <= 0n) {
171
+ continue;
172
+ }
173
+ const ownerKey = crypto_1.StealthAddressTrait.toString(note.owner);
174
+ if (ownerKey !== senderKey) {
175
+ continue;
176
+ }
177
+ outputs.push({
178
+ commitment: core_1.NoteTrait.toCommitment(note),
179
+ asset: note.asset,
180
+ value: note.value,
181
+ createdAt: Date.now(),
182
+ opDigest: digest,
183
+ });
184
+ }
185
+ }
186
+ await this.db.addPendingOutputs(outputs);
187
+ }
188
+ async removePendingOutputsByOpDigest(opDigest) {
189
+ await this.db.removePendingOutputsByOpDigest(opDigest);
190
+ }
191
+ onPendingNoteConfirmed(listener) {
192
+ this.pendingOutputsListeners.add(listener);
193
+ return () => {
194
+ this.pendingOutputsListeners.delete(listener);
195
+ };
196
+ }
197
+ async getLatestSyncedMerkleIndex() {
198
+ return await this.db.latestSyncedMerkleIndex();
199
+ }
200
+ async getLatestCommittedMerkleIndex() {
201
+ return await this.db.latestCommittedMerkleIndex();
202
+ }
203
+ /**
204
+ * Force-nullify notes locally by nullifier. This is useful as a mitigation
205
+ * when the sync source cannot supply nullifiers (e.g. Mirror down) but the
206
+ * bundler reports the nullifier already exists on-chain.
207
+ */
208
+ async forceNullifyNotes(nullifiers) {
209
+ return await this.db.nullifyNotes(nullifiers);
210
+ }
211
+ getCurrentTreeRoot() {
212
+ return this.merkleProver.getRoot();
213
+ }
214
+ async hasEnoughBalanceForOperationRequest(opRequest) {
215
+ const assetRequestedAmounts = new core_1.MapWithObjectKeys();
216
+ for (const joinSplitRequest of opRequest.joinSplitRequests) {
217
+ const asset = joinSplitRequest.asset;
218
+ let currentAmount = assetRequestedAmounts.get(asset) || 0n;
219
+ currentAmount += (0, utils_1.getJoinSplitRequestTotalValue)(joinSplitRequest);
220
+ assetRequestedAmounts.set(asset, currentAmount);
221
+ }
222
+ for (const [asset, requestedAmount] of assetRequestedAmounts.entries()) {
223
+ const balance = await this.db.getBalanceForAsset(asset);
224
+ if (balance < requestedAmount) {
225
+ return false;
226
+ }
227
+ }
228
+ return true;
229
+ }
230
+ async getCreationBlockOfNewestNoteInOp(op) {
231
+ const totalEntityIndex = await getTotalEntityIndexOfNewestNoteInOp(this.db, op);
232
+ return Number(core_1.TotalEntityIndexTrait.toComponents(totalEntityIndex).blockNumber);
233
+ }
234
+ async addOpToHistory(op, metadata) {
235
+ await this.db.addOpToHistory(op, metadata);
236
+ }
237
+ async removeOpFromHistory(digest) {
238
+ await this.db.removeOpFromHistory(digest);
239
+ }
240
+ async getOpHistory(includePending) {
241
+ return await this.db.getHistory(includePending);
242
+ }
243
+ async getOpHistoryRecord(digest) {
244
+ return await this.db.getHistoryRecord(digest);
245
+ }
246
+ async setOpStatusInHistory(digest, status) {
247
+ await this.db.setStatusForOp(digest, status);
248
+ }
249
+ async pruneOptimisticNullifiers() {
250
+ await this.db.pruneOptimisticNFs();
251
+ }
252
+ }
253
+ exports.NocturneClient = NocturneClient;
254
+ async function getTotalEntityIndexOfNewestNoteInOp(db, op) {
255
+ // get the max merkle index of any note in any joinsplit in the op
256
+ const maxMerkleIndex = (0, core_1.maxArray)((0, utils_1.getMerkleIndicesAndNfsFromOp)(op).map(({ merkleIndex }) => merkleIndex));
257
+ // get the corresponding TotalEntityIndex
258
+ const totalEntityIndex = await db.getTotalEntityIndexForMerkleIndex(Number(maxMerkleIndex));
259
+ if (totalEntityIndex === undefined) {
260
+ throw new Error(`totalEntityIndex not found for newest note with merkle index ${maxMerkleIndex}`);
261
+ }
262
+ return totalEntityIndex;
263
+ }
264
+ //# sourceMappingURL=NocturneClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NocturneClient.js","sourceRoot":"","sources":["../../src/NocturneClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ import { OptimisticNFRecord, OpHistoryRecord, OperationMetadata, PendingOutputRecord } from "./types";
2
+ import { Asset, IncludedNote, IncludedNoteWithNullifier, KVStore, StateDiff, TotalEntityIndex, WithTotalEntityIndex, OperationStatus, PreSignOperation, SignedOperation } from "@zill-protocol/core";
3
+ import { Mutex } from "async-mutex";
4
+ export type AssetKey = string;
5
+ type AllNotes = Map<AssetKey, IncludedNote[]>;
6
+ export interface GetNotesOpts {
7
+ includeUncommitted?: boolean;
8
+ ignoreOptimisticNFs?: boolean;
9
+ }
10
+ export declare class NocturneDB {
11
+ kv: KVStore;
12
+ protected mutex: Mutex;
13
+ constructor(kv: KVStore);
14
+ static formatIndexKey(merkleIndex: number): string;
15
+ static formatAssetKey(asset: Asset): string;
16
+ static formatNullifierKey(nullifier: bigint): string;
17
+ static formatMerkleIndexToTotalEntityIndexKey(merkleIndex: number): string;
18
+ static formatOptimisticNFRecordKey(merkleIndex: number): string;
19
+ static formatOpHistoryRecordKey(digest: bigint): string;
20
+ static formatPendingOutputKey(commitment: bigint): string;
21
+ static parseMerkleIndexFromOptimisticNFRecordKey(key: string): number;
22
+ static parseIndexKey(key: string): number;
23
+ static parseAssetKey(key: string): Asset;
24
+ protected _getHistoryRecord(digest: bigint): Promise<OpHistoryRecord | undefined>;
25
+ protected _setHistoryRecord(digest: bigint, record: OpHistoryRecord): Promise<void>;
26
+ protected getHistoryArray(): Promise<bigint[]>;
27
+ protected setHistoryArray(history: bigint[]): Promise<void>;
28
+ getHistory(includePending?: boolean): Promise<OpHistoryRecord[]>;
29
+ getHistoryRecord(digest: bigint): Promise<OpHistoryRecord | undefined>;
30
+ setStatusForOp(opDigest: bigint, status: OperationStatus): Promise<void>;
31
+ addOpToHistory(op: PreSignOperation | SignedOperation, metadata: OperationMetadata, status?: OperationStatus): Promise<void>;
32
+ removeOpFromHistory(digest: bigint, removeOptimisticNFs?: boolean): Promise<void>;
33
+ pruneOptimisticNFs(): Promise<void>;
34
+ getOptimisticNFRecord(merkleIndex: number): Promise<OptimisticNFRecord | undefined>;
35
+ getAllOptimisticNFRecords(): Promise<Map<number, OptimisticNFRecord>>;
36
+ removeOptimisticNFRecords(merkleIndices: number[]): Promise<void>;
37
+ storeNotes(notesWithTotalEntityIndices: WithTotalEntityIndex<IncludedNoteWithNullifier>[]): Promise<void>;
38
+ nullifyNotes(nullifiers: bigint[]): Promise<number[]>;
39
+ /**
40
+ * Get all *committed* notes for an asset
41
+ *
42
+ * @param asset the asset to get notes for
43
+ * @param opts optional options. See `GetNotesOpts` for more details.
44
+ * @returns notes an array of notes for the asset. The array has no guaranteed order.
45
+ */
46
+ getNotesForAsset(asset: Asset, opts?: GetNotesOpts): Promise<IncludedNote[]>;
47
+ private filterNotesByOpts;
48
+ /**
49
+ * Get TotalEntityIndex at which an owned note with merkleIndex `merkleIndex` was inserted into the tree (not necessarily committed)
50
+ *
51
+ * @param merkleIndex the merkleIndex to get the TotalEntityIndex for
52
+ * @returns the totalEntityIndex in unix millis at which the merkleIndex was inserted into the tree,
53
+ * or undefined if the corresponding note is nullified or not owned
54
+ */
55
+ getTotalEntityIndexForMerkleIndex(merkleIndex: number): Promise<bigint | undefined>;
56
+ currentTotalEntityIndex(): Promise<TotalEntityIndex | undefined>;
57
+ setCurrentTotalEntityIndex(totalEntityIndex: TotalEntityIndex): Promise<void>;
58
+ latestSyncedMerkleIndex(): Promise<number | undefined>;
59
+ setlatestSyncedMerkleIndex(index: number): Promise<void>;
60
+ latestCommittedMerkleIndex(): Promise<number | undefined>;
61
+ setlatestCommittedMerkleIndex(index: number): Promise<void>;
62
+ lastCommitTotalEntityIndex(): Promise<TotalEntityIndex | undefined>;
63
+ setLastCommitTotalEntityIndex(totalEntityIndex: TotalEntityIndex): Promise<void>;
64
+ applyStateDiff(diff: StateDiff, opts?: {
65
+ onPendingOutputsConfirmed?: (outputs: PendingOutputRecord[]) => void;
66
+ }): Promise<number[]>;
67
+ addPendingOutputs(outputs: PendingOutputRecord[]): Promise<void>;
68
+ getPendingOutputs(opts?: {
69
+ asset?: Asset;
70
+ }): Promise<PendingOutputRecord[]>;
71
+ getPendingBalanceForAsset(asset: Asset): Promise<bigint>;
72
+ removePendingOutputsByCommitments(commitments: bigint[]): Promise<PendingOutputRecord[]>;
73
+ removePendingOutputsByOpDigest(opDigest: bigint): Promise<void>;
74
+ /**
75
+ * Get total value of all notes for a given asset
76
+ *
77
+ * @param asset the asset to get balance for
78
+ * @param opts optional options. See `GetNotesOpts` for more details.
79
+ * @returns total value of all notes for the asset summed up
80
+ */
81
+ getBalanceForAsset(asset: Asset, opts?: GetNotesOpts): Promise<bigint>;
82
+ /**
83
+ * Get all notes in the KV store
84
+ *
85
+ * @param opts optional options. See `GetNotesOpts` for more details.
86
+ * @returns allNotes a map of all notes in the KV store. keys are the `NoteAssetKey` for an asset,
87
+ * and values are an array of `IncludedNote`s for that asset. The array has no guaranteed order.
88
+ */
89
+ getAllNotes(opts?: GetNotesOpts): Promise<AllNotes>;
90
+ private static makeNoteKV;
91
+ private static makeNullifierKV;
92
+ private static makeMerkleIndexToTotalEntityIndexKV;
93
+ private static makeOptimisticNFRecordKV;
94
+ private getUpdatedAssetKVsWithNotesAdded;
95
+ private getUpdatedAssetKVsWithNotesRemoved;
96
+ private getMerkleIndicesForAsset;
97
+ private getNotesByMerkleIndices;
98
+ }
99
+ export {};
100
+ //# sourceMappingURL=NocturneDB.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NocturneDB.d.ts","sourceRoot":"","sources":["../../src/NocturneDB.ts"],"names":[],"mappings":"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"}