@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
@@ -0,0 +1,525 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.NocturneDB = void 0;
37
+ const ethers_1 = require("ethers");
38
+ const JSON = __importStar(require("bigint-json-serialization"));
39
+ const core_1 = require("@zill-protocol/core");
40
+ const async_mutex_1 = require("async-mutex");
41
+ const utils_1 = require("./utils");
42
+ const NOTES_BY_INDEX_PREFIX = "NOTES_BY_INDEX";
43
+ const NOTES_BY_ASSET_PREFIX = "NOTES_BY_ASSET";
44
+ const NOTES_BY_NULLIFIER_PREFIX = "NOTES_BY_NULLIFIER";
45
+ const MERKLE_INDEX_TIMESTAMP_PREFIX = "MERKLE_INDEX_TIMESTAMP";
46
+ const OPTIMISTIC_NF_RECORD_PREFIX = "OPTIMISTIC_NF_RECORD";
47
+ const CURRENT_TOTAL_ENTITY_INDEX_KEY = "CURRENT_TOTAL_ENTITY_INDEX";
48
+ const LAST_COMMITTED_MERKLE_INDEX_KEY = "LAST_COMMITTED_MERKLE_INDEX";
49
+ const LAST_SYNCED_MERKLE_INDEX_KEY = "LAST_SYNCED_MERKLE_INDEX";
50
+ const LAST_COMMIT_TEI_KEY = "LAST_COMMIT_TEI";
51
+ const OP_HISTORY_KEY = "OP_HISTORY";
52
+ const OP_DIGEST_PREFIX = "OP_DIGEST_";
53
+ const PENDING_OUTPUT_PREFIX = "PENDING_OUTPUT";
54
+ // ceil(log10(2^32))
55
+ const MAX_MERKLE_INDEX_DIGITS = 10;
56
+ class NocturneDB {
57
+ constructor(kv) {
58
+ this.kv = kv;
59
+ this.mutex = new async_mutex_1.Mutex();
60
+ }
61
+ static formatIndexKey(merkleIndex) {
62
+ return `${NOTES_BY_INDEX_PREFIX}-${(0, core_1.numberToStringPadded)(merkleIndex, MAX_MERKLE_INDEX_DIGITS)}`;
63
+ }
64
+ static formatAssetKey(asset) {
65
+ return `${NOTES_BY_ASSET_PREFIX}-${asset.assetType}-${ethers_1.ethers.utils.getAddress(asset.assetAddr)}-${asset.id.toString()}`;
66
+ }
67
+ static formatNullifierKey(nullifier) {
68
+ return `${NOTES_BY_NULLIFIER_PREFIX}-${nullifier.toString()}`;
69
+ }
70
+ static formatMerkleIndexToTotalEntityIndexKey(merkleIndex) {
71
+ return `${MERKLE_INDEX_TIMESTAMP_PREFIX}-${(0, core_1.numberToStringPadded)(merkleIndex, MAX_MERKLE_INDEX_DIGITS)}`;
72
+ }
73
+ static formatOptimisticNFRecordKey(merkleIndex) {
74
+ return `${OPTIMISTIC_NF_RECORD_PREFIX}-${(0, core_1.numberToStringPadded)(merkleIndex, MAX_MERKLE_INDEX_DIGITS)}`;
75
+ }
76
+ static formatOpHistoryRecordKey(digest) {
77
+ return `${OP_DIGEST_PREFIX}${digest.toString()}`;
78
+ }
79
+ static formatPendingOutputKey(commitment) {
80
+ return `${PENDING_OUTPUT_PREFIX}-${commitment.toString()}`;
81
+ }
82
+ static parseMerkleIndexFromOptimisticNFRecordKey(key) {
83
+ return parseInt(key.split("-")[1]);
84
+ }
85
+ static parseIndexKey(key) {
86
+ return parseInt(key.split("-")[1]);
87
+ }
88
+ static parseAssetKey(key) {
89
+ const [_, assetType, assetAddr, id] = key.split("-");
90
+ return {
91
+ assetType: core_1.AssetTrait.parseAssetType(assetType),
92
+ assetAddr,
93
+ id: BigInt(id),
94
+ };
95
+ }
96
+ async _getHistoryRecord(digest) {
97
+ const key = NocturneDB.formatOpHistoryRecordKey(digest);
98
+ const value = await this.kv.getString(key);
99
+ if (value === undefined) {
100
+ return undefined;
101
+ }
102
+ return JSON.parse(value);
103
+ }
104
+ async _setHistoryRecord(digest, record) {
105
+ const key = NocturneDB.formatOpHistoryRecordKey(digest);
106
+ const value = JSON.stringify(record);
107
+ await this.kv.putString(key, value);
108
+ }
109
+ async getHistoryArray() {
110
+ const value = await this.kv.getString(OP_HISTORY_KEY);
111
+ if (value === undefined) {
112
+ return [];
113
+ }
114
+ return JSON.parse(value);
115
+ }
116
+ async setHistoryArray(history) {
117
+ const value = JSON.stringify(history);
118
+ await this.kv.putString(OP_HISTORY_KEY, value);
119
+ }
120
+ async getHistory(includePending) {
121
+ return await this.mutex.runExclusive(async () => {
122
+ const history = await this.getHistoryArray();
123
+ const records = await Promise.all(history.map((digest) => this._getHistoryRecord(digest)));
124
+ // if any record is missing, something bad happened
125
+ if (records.some((r) => r === undefined)) {
126
+ console.error("missing record in history");
127
+ }
128
+ if (!includePending) {
129
+ return records.filter((r) => r?.status && (0, utils_1.isTerminalOpStatus)(r.status));
130
+ }
131
+ return records;
132
+ });
133
+ }
134
+ async getHistoryRecord(digest) {
135
+ return await this.mutex.runExclusive(async () => await this._getHistoryRecord(digest));
136
+ }
137
+ async setStatusForOp(opDigest, status) {
138
+ await this.mutex.runExclusive(async () => {
139
+ const record = await this._getHistoryRecord(opDigest);
140
+ if (record === undefined) {
141
+ console.warn("attempting to set status of op whose record has been pruned");
142
+ return;
143
+ }
144
+ record.status = status;
145
+ record.lastModified = Date.now();
146
+ await this._setHistoryRecord(opDigest, record);
147
+ // remove the corresponding optimistic nf records if op failed
148
+ if ((0, utils_1.isFailedOpStatus)(status)) {
149
+ await this.removeOptimisticNFRecords(record.spentNoteMerkleIndices);
150
+ }
151
+ });
152
+ }
153
+ async addOpToHistory(op, metadata, status) {
154
+ const digest = core_1.OperationTrait.computeDigest(op);
155
+ const pairs = (0, utils_1.getMerkleIndicesAndNfsFromOp)(op).map(({ merkleIndex, nullifier }) => [Number(merkleIndex), nullifier]);
156
+ const [spentNoteMerkleIndices] = (0, core_1.unzip)(pairs);
157
+ const expirationDate = Date.now() + utils_1.OPTIMISTIC_RECORD_TTL;
158
+ const optimisticNfKvs = pairs.map(([merkleIndex, nullifier]) => NocturneDB.makeOptimisticNFRecordKV(merkleIndex, {
159
+ nullifier,
160
+ expirationDate,
161
+ }));
162
+ await this.mutex.runExclusive(async () => {
163
+ const now = Date.now();
164
+ const record = {
165
+ digest,
166
+ metadata,
167
+ status,
168
+ spentNoteMerkleIndices,
169
+ createdAt: now,
170
+ lastModified: now,
171
+ };
172
+ await this._setHistoryRecord(record.digest, record);
173
+ const history = await this.getHistoryArray();
174
+ history.push(record.digest);
175
+ await this.setHistoryArray(history);
176
+ await this.kv.putMany(optimisticNfKvs);
177
+ });
178
+ }
179
+ async removeOpFromHistory(digest, removeOptimisticNFs) {
180
+ await this.mutex.runExclusive(async () => {
181
+ const history = await this.getHistoryArray();
182
+ const index = history.indexOf(digest);
183
+ if (index !== -1) {
184
+ history.splice(index, 1);
185
+ await this.setHistoryArray(history);
186
+ }
187
+ else {
188
+ console.warn("tried to remove op from history that was not in history");
189
+ }
190
+ if (removeOptimisticNFs) {
191
+ const spentIndices = (await this._getHistoryRecord(digest))?.spentNoteMerkleIndices ?? [];
192
+ await this.removeOptimisticNFRecords(spentIndices);
193
+ }
194
+ await this.kv.remove(NocturneDB.formatOpHistoryRecordKey(digest));
195
+ });
196
+ }
197
+ async pruneOptimisticNFs() {
198
+ const optimsiticNfRecords = await this.getAllOptimisticNFRecords();
199
+ const now = Date.now();
200
+ const keysToRemove = [...optimsiticNfRecords.entries()].flatMap(([merkleIndex, record]) => {
201
+ if (now > record.expirationDate) {
202
+ return [NocturneDB.formatOptimisticNFRecordKey(merkleIndex)];
203
+ }
204
+ return [];
205
+ });
206
+ await this.kv.removeMany(keysToRemove);
207
+ }
208
+ async getOptimisticNFRecord(merkleIndex) {
209
+ const key = NocturneDB.formatOptimisticNFRecordKey(merkleIndex);
210
+ const value = await this.kv.getString(key);
211
+ if (value === undefined) {
212
+ return undefined;
213
+ }
214
+ return JSON.parse(value);
215
+ }
216
+ async getAllOptimisticNFRecords() {
217
+ const map = new Map();
218
+ const kvs = await this.kv.iterPrefix(OPTIMISTIC_NF_RECORD_PREFIX);
219
+ for await (const [key, value] of kvs) {
220
+ const merkleIndex = NocturneDB.parseMerkleIndexFromOptimisticNFRecordKey(key);
221
+ const record = JSON.parse(value);
222
+ map.set(merkleIndex, record);
223
+ }
224
+ return map;
225
+ }
226
+ async removeOptimisticNFRecords(merkleIndices) {
227
+ const keys = merkleIndices.map(NocturneDB.formatOptimisticNFRecordKey);
228
+ await this.kv.removeMany(keys);
229
+ }
230
+ async storeNotes(notesWithTotalEntityIndices) {
231
+ const notes = notesWithTotalEntityIndices.map(({ inner }) => inner);
232
+ // make note KVs
233
+ const noteKVs = notes.map(({ nullifier, ...note }) => NocturneDB.makeNoteKV(note.merkleIndex, note));
234
+ // make the nullifier => merkleIndex KV pairs
235
+ const nullifierKVs = notes.map(({ merkleIndex, nullifier }) => NocturneDB.makeNullifierKV(merkleIndex, nullifier));
236
+ // get the updated asset => merkleIndex[] KV pairs
237
+ const assetKVs = await this.getUpdatedAssetKVsWithNotesAdded(notes);
238
+ const merkleIndexToTotalEntityIndexKVs = notesWithTotalEntityIndices.map(({ inner, totalEntityIndex }) => NocturneDB.makeMerkleIndexToTotalEntityIndexKV(inner.merkleIndex, totalEntityIndex));
239
+ // write them all into the KV store
240
+ await this.kv.putMany([
241
+ ...noteKVs,
242
+ ...nullifierKVs,
243
+ ...assetKVs,
244
+ ...merkleIndexToTotalEntityIndexKVs,
245
+ ]);
246
+ }
247
+ // returns the merkle indices of the notes that were nullified
248
+ async nullifyNotes(nullifiers) {
249
+ // delete nullifier => merkleIndex KV pairs
250
+ const nfKeys = nullifiers.map((nullifier) => NocturneDB.formatNullifierKey(nullifier));
251
+ const kvs = await this.kv.getMany(nfKeys);
252
+ await this.kv.removeMany([...nfKeys]);
253
+ // get the notes we're nullifying
254
+ const indices = kvs.map(([_nfKey, stringifiedIdx]) => parseInt(stringifiedIdx));
255
+ const notes = await this.getNotesByMerkleIndices(indices);
256
+ // get the updated asset => merkleIndex[] KV pairs
257
+ // for each note, remove the note's merkleIndex from its asset's index keys
258
+ const assetKVs = await this.getUpdatedAssetKVsWithNotesRemoved(notes);
259
+ // write the new commitment KV pairs and the new asset => merkleIndex[] KV pairs to the KV store
260
+ await this.kv.putMany(assetKVs);
261
+ // remove any optimistic nf records for the nullified notes
262
+ await this.removeOptimisticNFRecords(indices);
263
+ return indices;
264
+ }
265
+ /**
266
+ * Get all *committed* notes for an asset
267
+ *
268
+ * @param asset the asset to get notes for
269
+ * @param opts optional options. See `GetNotesOpts` for more details.
270
+ * @returns notes an array of notes for the asset. The array has no guaranteed order.
271
+ */
272
+ async getNotesForAsset(asset, opts) {
273
+ const indices = await this.getMerkleIndicesForAsset(asset);
274
+ const notes = await this.getNotesByMerkleIndices(indices);
275
+ return this.filterNotesByOpts(notes, opts);
276
+ }
277
+ async filterNotesByOpts(notes, opts) {
278
+ if (!opts?.includeUncommitted) {
279
+ const latestCommittedMerkleIndex = await this.latestCommittedMerkleIndex();
280
+ if (latestCommittedMerkleIndex === undefined) {
281
+ return [];
282
+ }
283
+ notes = notes.filter((note) => note.merkleIndex <= latestCommittedMerkleIndex);
284
+ }
285
+ if (!opts?.ignoreOptimisticNFs) {
286
+ const hasOptimisticNF = await Promise.all(notes.map(async (note) => !(await this.getOptimisticNFRecord(note.merkleIndex))));
287
+ notes = notes.filter((_, i) => hasOptimisticNF[i]);
288
+ }
289
+ return notes;
290
+ }
291
+ /**
292
+ * Get TotalEntityIndex at which an owned note with merkleIndex `merkleIndex` was inserted into the tree (not necessarily committed)
293
+ *
294
+ * @param merkleIndex the merkleIndex to get the TotalEntityIndex for
295
+ * @returns the totalEntityIndex in unix millis at which the merkleIndex was inserted into the tree,
296
+ * or undefined if the corresponding note is nullified or not owned
297
+ */
298
+ async getTotalEntityIndexForMerkleIndex(merkleIndex) {
299
+ const totalEntityIndexKey = NocturneDB.formatMerkleIndexToTotalEntityIndexKey(merkleIndex);
300
+ return await this.kv.getBigInt(totalEntityIndexKey);
301
+ }
302
+ // return the totalEntityndex that the DB has been synced to
303
+ // this is more/less a "version" number
304
+ async currentTotalEntityIndex() {
305
+ return await this.kv.getBigInt(CURRENT_TOTAL_ENTITY_INDEX_KEY);
306
+ }
307
+ // update `currentTotallEntityIndex()`.
308
+ async setCurrentTotalEntityIndex(totalEntityIndex) {
309
+ await this.kv.putBigInt(CURRENT_TOTAL_ENTITY_INDEX_KEY, totalEntityIndex);
310
+ }
311
+ // index of the last note synced (can be ahead of committed)
312
+ async latestSyncedMerkleIndex() {
313
+ return await this.kv.getNumber(LAST_SYNCED_MERKLE_INDEX_KEY);
314
+ }
315
+ // update `latestSyncedMerkleIndex()`
316
+ async setlatestSyncedMerkleIndex(index) {
317
+ await this.kv.putNumber(LAST_SYNCED_MERKLE_INDEX_KEY, index);
318
+ }
319
+ // index of the last note (dummy or not) to be committed
320
+ async latestCommittedMerkleIndex() {
321
+ return await this.kv.getNumber(LAST_COMMITTED_MERKLE_INDEX_KEY);
322
+ }
323
+ // update `latestCommittedMerkleIndex()`
324
+ async setlatestCommittedMerkleIndex(index) {
325
+ await this.kv.putNumber(LAST_COMMITTED_MERKLE_INDEX_KEY, index);
326
+ }
327
+ // get the total entity index at which the last commit was made
328
+ async lastCommitTotalEntityIndex() {
329
+ return await this.kv.getBigInt(LAST_COMMIT_TEI_KEY);
330
+ }
331
+ // update `lastCommitTotalEntityIndex()`
332
+ async setLastCommitTotalEntityIndex(totalEntityIndex) {
333
+ await this.kv.putBigInt(LAST_COMMIT_TEI_KEY, totalEntityIndex);
334
+ }
335
+ // applies a single state diff to the DB
336
+ // returns the merkle indices of the notes that were nullified
337
+ async applyStateDiff(diff, opts) {
338
+ const { notesAndCommitments, nullifiers, latestNewlySyncedMerkleIndex, latestCommittedMerkleIndex, latestCommitTei, totalEntityIndex, } = diff;
339
+ // NOTE: order matters here - some `notesAndCommitments` may be nullified in the same state diff
340
+ const notesToStore = notesAndCommitments.filter(({ inner }) => !core_1.NoteTrait.isCommitment(inner) &&
341
+ inner.value > 0n);
342
+ // TODO: make this all one write
343
+ await this.storeNotes(notesToStore);
344
+ const nfIndices = await this.nullifyNotes(nullifiers);
345
+ const commitmentsToCheck = notesAndCommitments.map(({ inner }) => core_1.NoteTrait.isCommitment(inner)
346
+ ? inner.noteCommitment
347
+ : core_1.NoteTrait.toCommitment(inner));
348
+ const confirmedPending = await this.removePendingOutputsByCommitments(commitmentsToCheck);
349
+ if (opts?.onPendingOutputsConfirmed && confirmedPending.length > 0) {
350
+ opts.onPendingOutputsConfirmed(confirmedPending);
351
+ }
352
+ if (latestNewlySyncedMerkleIndex) {
353
+ await this.setlatestSyncedMerkleIndex(latestNewlySyncedMerkleIndex);
354
+ }
355
+ if (latestCommittedMerkleIndex) {
356
+ await this.setlatestCommittedMerkleIndex(latestCommittedMerkleIndex);
357
+ }
358
+ if (latestCommitTei) {
359
+ await this.setLastCommitTotalEntityIndex(latestCommitTei);
360
+ }
361
+ await this.setCurrentTotalEntityIndex(totalEntityIndex);
362
+ return nfIndices;
363
+ }
364
+ async addPendingOutputs(outputs) {
365
+ if (!outputs.length) {
366
+ return;
367
+ }
368
+ const kvs = outputs.map((output) => {
369
+ const key = NocturneDB.formatPendingOutputKey(output.commitment);
370
+ return [key, JSON.stringify(output)];
371
+ });
372
+ await this.kv.putMany(kvs);
373
+ }
374
+ async getPendingOutputs(opts) {
375
+ const iterPrefix = await this.kv.iterPrefix(PENDING_OUTPUT_PREFIX);
376
+ const outputs = [];
377
+ for await (const [_key, stringified] of iterPrefix) {
378
+ try {
379
+ const parsed = JSON.parse(stringified);
380
+ if (opts?.asset) {
381
+ const asset = parsed.asset;
382
+ if (asset.assetType !== opts.asset.assetType ||
383
+ asset.assetAddr.toLowerCase() !== opts.asset.assetAddr.toLowerCase() ||
384
+ asset.id !== opts.asset.id) {
385
+ continue;
386
+ }
387
+ }
388
+ outputs.push(parsed);
389
+ }
390
+ catch {
391
+ // ignore malformed pending outputs
392
+ }
393
+ }
394
+ return outputs;
395
+ }
396
+ async getPendingBalanceForAsset(asset) {
397
+ const outputs = await this.getPendingOutputs({ asset });
398
+ return outputs.reduce((sum, output) => sum + output.value, 0n);
399
+ }
400
+ async removePendingOutputsByCommitments(commitments) {
401
+ if (!commitments.length) {
402
+ return [];
403
+ }
404
+ const keys = commitments.map(NocturneDB.formatPendingOutputKey);
405
+ const kvs = await this.kv.getMany(keys);
406
+ const outputs = [];
407
+ for (const [_key, stringified] of kvs) {
408
+ try {
409
+ const parsed = JSON.parse(stringified);
410
+ outputs.push(parsed);
411
+ }
412
+ catch {
413
+ // ignore malformed pending outputs
414
+ }
415
+ }
416
+ await this.kv.removeMany(keys);
417
+ return outputs;
418
+ }
419
+ async removePendingOutputsByOpDigest(opDigest) {
420
+ const outputs = await this.getPendingOutputs();
421
+ const toRemove = outputs
422
+ .filter((output) => output.opDigest === opDigest)
423
+ .map((output) => output.commitment);
424
+ await this.removePendingOutputsByCommitments(toRemove);
425
+ }
426
+ /**
427
+ * Get total value of all notes for a given asset
428
+ *
429
+ * @param asset the asset to get balance for
430
+ * @param opts optional options. See `GetNotesOpts` for more details.
431
+ * @returns total value of all notes for the asset summed up
432
+ */
433
+ async getBalanceForAsset(asset, opts) {
434
+ const notes = await this.getNotesForAsset(asset, opts);
435
+ return notes.reduce((a, b) => a + b.value, 0n);
436
+ }
437
+ /**
438
+ * Get all notes in the KV store
439
+ *
440
+ * @param opts optional options. See `GetNotesOpts` for more details.
441
+ * @returns allNotes a map of all notes in the KV store. keys are the `NoteAssetKey` for an asset,
442
+ * and values are an array of `IncludedNote`s for that asset. The array has no guaranteed order.
443
+ */
444
+ async getAllNotes(opts) {
445
+ const allNotes = new Map();
446
+ const iterPrefix = await this.kv.iterPrefix(NOTES_BY_ASSET_PREFIX);
447
+ for await (const [assetKey, stringifiedIndices] of iterPrefix) {
448
+ const indices = JSON.parse(stringifiedIndices);
449
+ let notes = await this.getNotesByMerkleIndices(indices);
450
+ notes = await this.filterNotesByOpts(notes, opts);
451
+ const notesForAsset = allNotes.get(assetKey) ?? [];
452
+ notesForAsset.push(...notes);
453
+ if (notesForAsset.length !== 0) {
454
+ allNotes.set(assetKey, notesForAsset);
455
+ }
456
+ }
457
+ return allNotes;
458
+ }
459
+ static makeNoteKV(merkleIndex, note) {
460
+ return [NocturneDB.formatIndexKey(merkleIndex), JSON.stringify(note)];
461
+ }
462
+ static makeNullifierKV(merkleIndex, nullifier) {
463
+ return [NocturneDB.formatNullifierKey(nullifier), merkleIndex.toString()];
464
+ }
465
+ static makeMerkleIndexToTotalEntityIndexKV(merkleIndex, totalEntityIndex) {
466
+ return [
467
+ NocturneDB.formatMerkleIndexToTotalEntityIndexKey(merkleIndex),
468
+ totalEntityIndex.toString(),
469
+ ];
470
+ }
471
+ static makeOptimisticNFRecordKV(merkleIndex, record) {
472
+ const key = NocturneDB.formatOptimisticNFRecordKey(merkleIndex);
473
+ const value = JSON.stringify(record);
474
+ return [key, value];
475
+ }
476
+ async getUpdatedAssetKVsWithNotesAdded(notes) {
477
+ const map = new Map();
478
+ for (const note of notes) {
479
+ const assetKey = NocturneDB.formatAssetKey(note.asset);
480
+ let indices = map.get(assetKey);
481
+ if (!indices) {
482
+ indices = new Set(await this.getMerkleIndicesForAsset(note.asset));
483
+ }
484
+ indices.add(note.merkleIndex);
485
+ map.set(assetKey, indices);
486
+ }
487
+ return Array.from(map.entries()).map(([assetKey, indexKeys]) => [
488
+ assetKey,
489
+ JSON.stringify(Array.from(indexKeys)),
490
+ ]);
491
+ }
492
+ async getUpdatedAssetKVsWithNotesRemoved(notes) {
493
+ const map = new Map();
494
+ for (const note of notes) {
495
+ const assetKey = NocturneDB.formatAssetKey(note.asset);
496
+ let indices = map.get(assetKey);
497
+ if (!indices) {
498
+ indices = new Set(await this.getMerkleIndicesForAsset(note.asset));
499
+ }
500
+ indices.delete(note.merkleIndex);
501
+ map.set(assetKey, indices);
502
+ }
503
+ return Array.from(map.entries()).map(([assetKey, indexKeys]) => [
504
+ assetKey,
505
+ JSON.stringify(Array.from(indexKeys)),
506
+ ]);
507
+ }
508
+ async getMerkleIndicesForAsset(asset) {
509
+ const assetKey = NocturneDB.formatAssetKey(asset);
510
+ const value = await this.kv.getString(assetKey);
511
+ if (!value) {
512
+ return [];
513
+ }
514
+ return JSON.parse(value);
515
+ }
516
+ async getNotesByMerkleIndices(indices) {
517
+ const idxKeys = indices.map((index) => NocturneDB.formatIndexKey(index));
518
+ const kvs = await this.kv.getMany(idxKeys);
519
+ return kvs.map(([_, value]) => {
520
+ return JSON.parse(value);
521
+ });
522
+ }
523
+ }
524
+ exports.NocturneDB = NocturneDB;
525
+ //# sourceMappingURL=NocturneDB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NocturneDB.js","sourceRoot":"","sources":["../../src/NocturneDB.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface OpTracker {
2
+ operationIsInFlight(opDigest: bigint): Promise<boolean>;
3
+ }
4
+ export declare class BundlerOpTracker implements OpTracker {
5
+ endpoint: string;
6
+ constructor(bundlerEndpoint: string);
7
+ operationIsInFlight(opDigest: bigint): Promise<boolean>;
8
+ }
9
+ export declare class MockOpTracker implements OpTracker {
10
+ constructor();
11
+ operationIsInFlight(_opDigest: bigint): Promise<boolean>;
12
+ }
13
+ //# sourceMappingURL=OpTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpTracker.d.ts","sourceRoot":"","sources":["../../src/OpTracker.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzD;AAED,qBAAa,gBAAiB,YAAW,SAAS;IAChD,QAAQ,EAAE,MAAM,CAAC;gBAEL,eAAe,EAAE,MAAM;IAI7B,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAsB9D;AAED,qBAAa,aAAc,YAAW,SAAS;;IAGvC,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG/D"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MockOpTracker = exports.BundlerOpTracker = void 0;
4
+ const core_1 = require("@zill-protocol/core");
5
+ class BundlerOpTracker {
6
+ constructor(bundlerEndpoint) {
7
+ this.endpoint = bundlerEndpoint;
8
+ }
9
+ async operationIsInFlight(opDigest) {
10
+ const res = await fetch(`${this.endpoint}/operations/${opDigest.toString()}`, {
11
+ method: "GET",
12
+ });
13
+ let response;
14
+ try {
15
+ response = await res.json();
16
+ }
17
+ catch (err) {
18
+ throw new Error(`failed to parse bundler response: ${err}`);
19
+ }
20
+ return (response.status === core_1.OperationStatus.QUEUED ||
21
+ response.status === core_1.OperationStatus.PRE_BATCH ||
22
+ response.status === core_1.OperationStatus.IN_BATCH ||
23
+ response.status === core_1.OperationStatus.IN_FLIGHT);
24
+ }
25
+ }
26
+ exports.BundlerOpTracker = BundlerOpTracker;
27
+ class MockOpTracker {
28
+ constructor() { }
29
+ async operationIsInFlight(_opDigest) {
30
+ return true;
31
+ }
32
+ }
33
+ exports.MockOpTracker = MockOpTracker;
34
+ //# sourceMappingURL=OpTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpTracker.js","sourceRoot":"","sources":["../../src/OpTracker.ts"],"names":[],"mappings":";;;AAAA,8CAA+E;AAM/E,MAAa,gBAAgB;IAG3B,YAAY,eAAuB;QACjC,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,QAAgB;QACxC,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,IAAI,CAAC,QAAQ,eAAe,QAAQ,CAAC,QAAQ,EAAE,EAAE,EACpD;YACE,MAAM,EAAE,KAAK;SACd,CACF,CAAC;QAEF,IAAI,QAAiC,CAAC;QACtC,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qCAAqC,GAAG,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,CACL,QAAQ,CAAC,MAAM,KAAK,sBAAe,CAAC,MAAM;YAC1C,QAAQ,CAAC,MAAM,KAAK,sBAAe,CAAC,SAAS;YAC7C,QAAQ,CAAC,MAAM,KAAK,sBAAe,CAAC,QAAQ;YAC5C,QAAQ,CAAC,MAAM,KAAK,sBAAe,CAAC,SAAS,CAC9C,CAAC;IACJ,CAAC;CACF;AA7BD,4CA6BC;AAED,MAAa,aAAa;IACxB,gBAAe,CAAC;IAEhB,KAAK,CAAC,mBAAmB,CAAC,SAAiB;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAND,sCAMC"}
@@ -0,0 +1,5 @@
1
+ export declare abstract class EthToTokenConverter {
2
+ abstract weiToTargetErc20(amountWei: bigint, targetTicker: string): Promise<bigint>;
3
+ gasEstimatesInGasAssets(amountWei: bigint, tickers: string[]): Promise<Map<string, bigint>>;
4
+ }
5
+ //# sourceMappingURL=converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../../src/conversion/converter.ts"],"names":[],"mappings":"AAAA,8BAAsB,mBAAmB;IACvC,QAAQ,CAAC,gBAAgB,CACvB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC;IAEZ,uBAAuB,CAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAYhC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EthToTokenConverter = void 0;
4
+ class EthToTokenConverter {
5
+ async gasEstimatesInGasAssets(amountWei, tickers) {
6
+ const gasEstimates = new Map();
7
+ await Promise.all(tickers.map(async (ticker) => {
8
+ const targetErc20 = await this.weiToTargetErc20(amountWei, ticker);
9
+ gasEstimates.set(ticker, targetErc20);
10
+ }));
11
+ return gasEstimates;
12
+ }
13
+ }
14
+ exports.EthToTokenConverter = EthToTokenConverter;
15
+ //# sourceMappingURL=converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converter.js","sourceRoot":"","sources":["../../../src/conversion/converter.ts"],"names":[],"mappings":";;;AAAA,MAAsB,mBAAmB;IAMvC,KAAK,CAAC,uBAAuB,CAC3B,SAAiB,EACjB,OAAiB;QAEjB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE/C,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC3B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACnE,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACxC,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AArBD,kDAqBC"}
@@ -0,0 +1,3 @@
1
+ export * from "./converter";
2
+ export { MockEthToTokenConverter } from "./mock";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/conversion/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAC"}