@aztec/pxe 0.66.0 → 0.67.1-devnet
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/dest/bin/index.js +5 -6
- package/dest/config/index.d.ts +0 -9
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +1 -17
- package/dest/config/package_info.d.ts +5 -0
- package/dest/config/package_info.d.ts.map +1 -0
- package/dest/config/package_info.js +4 -0
- package/dest/contract_data_oracle/index.js +2 -2
- package/dest/database/incoming_note_dao.d.ts +1 -1
- package/dest/database/incoming_note_dao.d.ts.map +1 -1
- package/dest/database/incoming_note_dao.js +2 -2
- package/dest/database/kv_pxe_database.d.ts +10 -13
- package/dest/database/kv_pxe_database.d.ts.map +1 -1
- package/dest/database/kv_pxe_database.js +153 -230
- package/dest/database/outgoing_note_dao.js +2 -2
- package/dest/database/pxe_database.d.ts +7 -25
- package/dest/database/pxe_database.d.ts.map +1 -1
- package/dest/database/pxe_database_test_suite.d.ts.map +1 -1
- package/dest/database/pxe_database_test_suite.js +18 -59
- package/dest/index.d.ts +2 -0
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +3 -1
- package/dest/kernel_oracle/index.d.ts.map +1 -1
- package/dest/kernel_oracle/index.js +4 -4
- package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.js +2 -2
- package/dest/kernel_prover/index.d.ts +1 -0
- package/dest/kernel_prover/index.d.ts.map +1 -1
- package/dest/kernel_prover/index.js +2 -1
- package/dest/kernel_prover/kernel_prover.d.ts +1 -0
- package/dest/kernel_prover/kernel_prover.d.ts.map +1 -1
- package/dest/kernel_prover/kernel_prover.js +42 -5
- package/dest/kernel_prover/test/test_circuit_prover.d.ts +1 -2
- package/dest/kernel_prover/test/test_circuit_prover.d.ts.map +1 -1
- package/dest/kernel_prover/test/test_circuit_prover.js +7 -13
- package/dest/note_decryption_utils/add_public_values_to_payload.js +2 -2
- package/dest/note_decryption_utils/brute_force_note_info.d.ts +3 -3
- package/dest/note_decryption_utils/brute_force_note_info.d.ts.map +1 -1
- package/dest/note_decryption_utils/brute_force_note_info.js +8 -8
- package/dest/note_decryption_utils/produce_note_daos.d.ts +3 -6
- package/dest/note_decryption_utils/produce_note_daos.d.ts.map +1 -1
- package/dest/note_decryption_utils/produce_note_daos.js +5 -19
- package/dest/note_decryption_utils/produce_note_daos_for_key.d.ts +1 -1
- package/dest/note_decryption_utils/produce_note_daos_for_key.d.ts.map +1 -1
- package/dest/pxe_service/error_enriching.d.ts +3 -3
- package/dest/pxe_service/error_enriching.d.ts.map +1 -1
- package/dest/pxe_service/error_enriching.js +10 -10
- package/dest/pxe_service/index.d.ts +0 -1
- package/dest/pxe_service/index.d.ts.map +1 -1
- package/dest/pxe_service/index.js +1 -2
- package/dest/pxe_service/pxe_service.d.ts +2 -16
- package/dest/pxe_service/pxe_service.d.ts.map +1 -1
- package/dest/pxe_service/pxe_service.js +74 -96
- package/dest/pxe_service/test/pxe_test_suite.d.ts.map +1 -1
- package/dest/pxe_service/test/pxe_test_suite.js +1 -3
- package/dest/simulator/index.d.ts +1 -1
- package/dest/simulator/index.d.ts.map +1 -1
- package/dest/simulator/index.js +2 -2
- package/dest/simulator_oracle/index.d.ts +14 -11
- package/dest/simulator_oracle/index.d.ts.map +1 -1
- package/dest/simulator_oracle/index.js +170 -140
- package/dest/simulator_oracle/tagging_utils.d.ts +15 -0
- package/dest/simulator_oracle/tagging_utils.d.ts.map +1 -0
- package/dest/simulator_oracle/tagging_utils.js +23 -0
- package/dest/synchronizer/synchronizer.d.ts +10 -40
- package/dest/synchronizer/synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/synchronizer.js +35 -69
- package/dest/{pxe_service → utils}/create_pxe_service.d.ts +1 -1
- package/dest/utils/create_pxe_service.d.ts.map +1 -0
- package/dest/utils/create_pxe_service.js +52 -0
- package/package.json +31 -19
- package/src/bin/index.ts +4 -5
- package/src/config/index.ts +0 -21
- package/src/config/package_info.ts +3 -0
- package/src/contract_data_oracle/index.ts +1 -1
- package/src/database/incoming_note_dao.ts +2 -2
- package/src/database/kv_pxe_database.ts +214 -309
- package/src/database/outgoing_note_dao.ts +1 -1
- package/src/database/pxe_database.ts +7 -28
- package/src/database/pxe_database_test_suite.ts +20 -75
- package/src/index.ts +2 -0
- package/src/kernel_oracle/index.ts +3 -3
- package/src/kernel_prover/hints/build_private_kernel_reset_private_inputs.ts +1 -1
- package/src/kernel_prover/index.ts +2 -0
- package/src/kernel_prover/kernel_prover.ts +72 -3
- package/src/kernel_prover/test/test_circuit_prover.ts +11 -25
- package/src/note_decryption_utils/add_public_values_to_payload.ts +1 -1
- package/src/note_decryption_utils/brute_force_note_info.ts +9 -9
- package/src/note_decryption_utils/produce_note_daos.ts +5 -48
- package/src/note_decryption_utils/produce_note_daos_for_key.ts +1 -1
- package/src/pxe_service/error_enriching.ts +14 -12
- package/src/pxe_service/index.ts +0 -1
- package/src/pxe_service/pxe_service.ts +127 -174
- package/src/pxe_service/test/pxe_test_suite.ts +0 -3
- package/src/simulator/index.ts +1 -1
- package/src/simulator_oracle/index.ts +201 -188
- package/src/simulator_oracle/tagging_utils.ts +28 -0
- package/src/synchronizer/synchronizer.ts +37 -77
- package/src/{pxe_service → utils}/create_pxe_service.ts +16 -13
- package/dest/pxe_service/create_pxe_service.d.ts.map +0 -1
- package/dest/pxe_service/create_pxe_service.js +0 -49
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
var _SimulatorOracle_instances,
|
|
1
|
+
var _SimulatorOracle_instances, _SimulatorOracle_calculateAppTaggingSecret, _SimulatorOracle_getIndexedTaggingSecretsForContacts, _SimulatorOracle_decryptTaggedLogs;
|
|
2
2
|
import { __classPrivateFieldGet } from "tslib";
|
|
3
3
|
import { L1NotePayload, MerkleTreeId, getNonNullifiedL1ToL2MessageWitness, } from '@aztec/circuit-types';
|
|
4
|
-
import { Fr, IndexedTaggingSecret, PrivateLog, computeAddressSecret,
|
|
4
|
+
import { Fr, IndexedTaggingSecret, PrivateLog, computeAddressSecret, computeTaggingSecretPoint, } from '@aztec/circuits.js';
|
|
5
5
|
import { getFunctionArtifact } from '@aztec/foundation/abi';
|
|
6
6
|
import { poseidon2Hash } from '@aztec/foundation/crypto';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { MessageLoadOracleInputs } from '@aztec/simulator';
|
|
7
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
8
|
+
import { MessageLoadOracleInputs } from '@aztec/simulator/acvm';
|
|
10
9
|
import { produceNoteDaos } from '../note_decryption_utils/produce_note_daos.js';
|
|
11
10
|
import { getAcirSimulator } from '../simulator/index.js';
|
|
11
|
+
import { getIndexedTaggingSecretsForTheWindow, getInitialIndexesMap } from './tagging_utils.js';
|
|
12
12
|
/**
|
|
13
13
|
* A data oracle that provides information needed for simulating a transaction.
|
|
14
14
|
*/
|
|
15
15
|
export class SimulatorOracle {
|
|
16
|
-
constructor(contractDataOracle, db, keyStore, aztecNode, log =
|
|
16
|
+
constructor(contractDataOracle, db, keyStore, aztecNode, log = createLogger('pxe:simulator_oracle')) {
|
|
17
17
|
_SimulatorOracle_instances.add(this);
|
|
18
18
|
this.contractDataOracle = contractDataOracle;
|
|
19
19
|
this.db = db;
|
|
@@ -153,10 +153,10 @@ export class SimulatorOracle {
|
|
|
153
153
|
* Retrieve the databases view of the Block Header object.
|
|
154
154
|
* This structure is fed into the circuits simulator and is used to prove against certain historical roots.
|
|
155
155
|
*
|
|
156
|
-
* @returns A Promise that resolves to a
|
|
156
|
+
* @returns A Promise that resolves to a BlockHeader object.
|
|
157
157
|
*/
|
|
158
|
-
|
|
159
|
-
return
|
|
158
|
+
getBlockHeader() {
|
|
159
|
+
return this.db.getBlockHeader();
|
|
160
160
|
}
|
|
161
161
|
/**
|
|
162
162
|
* Fetches the current block number.
|
|
@@ -178,29 +178,35 @@ export class SimulatorOracle {
|
|
|
178
178
|
return this.db.getContactAddresses();
|
|
179
179
|
}
|
|
180
180
|
/**
|
|
181
|
-
* Returns the tagging secret for a given sender and recipient pair. For this to work, the
|
|
181
|
+
* Returns the tagging secret for a given sender and recipient pair. For this to work, the ivsk_m of the sender must be known.
|
|
182
182
|
* Includes the next index to be used used for tagging with this secret.
|
|
183
183
|
* @param contractAddress - The contract address to silo the secret for
|
|
184
184
|
* @param sender - The address sending the note
|
|
185
185
|
* @param recipient - The address receiving the note
|
|
186
|
-
* @returns
|
|
186
|
+
* @returns An indexed tagging secret that can be used to tag notes.
|
|
187
187
|
*/
|
|
188
|
-
async
|
|
188
|
+
async getIndexedTaggingSecretAsSender(contractAddress, sender, recipient) {
|
|
189
189
|
await this.syncTaggedLogsAsSender(contractAddress, sender, recipient);
|
|
190
|
-
const
|
|
191
|
-
const [index] = await this.db.getTaggingSecretsIndexesAsSender([
|
|
192
|
-
return new IndexedTaggingSecret(
|
|
190
|
+
const appTaggingSecret = await __classPrivateFieldGet(this, _SimulatorOracle_instances, "m", _SimulatorOracle_calculateAppTaggingSecret).call(this, contractAddress, sender, recipient);
|
|
191
|
+
const [index] = await this.db.getTaggingSecretsIndexesAsSender([appTaggingSecret]);
|
|
192
|
+
return new IndexedTaggingSecret(appTaggingSecret, index);
|
|
193
193
|
}
|
|
194
194
|
/**
|
|
195
|
-
* Increments the tagging secret for a given sender and recipient pair. For this to work, the
|
|
195
|
+
* Increments the tagging secret for a given sender and recipient pair. For this to work, the ivsk_m of the sender must be known.
|
|
196
196
|
* @param contractAddress - The contract address to silo the secret for
|
|
197
197
|
* @param sender - The address sending the note
|
|
198
198
|
* @param recipient - The address receiving the note
|
|
199
199
|
*/
|
|
200
200
|
async incrementAppTaggingSecretIndexAsSender(contractAddress, sender, recipient) {
|
|
201
|
-
const secret = await __classPrivateFieldGet(this, _SimulatorOracle_instances, "m",
|
|
201
|
+
const secret = await __classPrivateFieldGet(this, _SimulatorOracle_instances, "m", _SimulatorOracle_calculateAppTaggingSecret).call(this, contractAddress, sender, recipient);
|
|
202
202
|
const contractName = await this.contractDataOracle.getDebugContractName(contractAddress);
|
|
203
|
-
this.log.
|
|
203
|
+
this.log.debug(`Incrementing app tagging secret at ${contractName}(${contractAddress})`, {
|
|
204
|
+
secret,
|
|
205
|
+
sender,
|
|
206
|
+
recipient,
|
|
207
|
+
contractName,
|
|
208
|
+
contractAddress,
|
|
209
|
+
});
|
|
204
210
|
const [index] = await this.db.getTaggingSecretsIndexesAsSender([secret]);
|
|
205
211
|
await this.db.setTaggingSecretsIndexesAsSender([new IndexedTaggingSecret(secret, index + 1)]);
|
|
206
212
|
}
|
|
@@ -212,7 +218,7 @@ export class SimulatorOracle {
|
|
|
212
218
|
* @param recipient - The address of the recipient.
|
|
213
219
|
*/
|
|
214
220
|
async syncTaggedLogsAsSender(contractAddress, sender, recipient) {
|
|
215
|
-
const appTaggingSecret = await __classPrivateFieldGet(this, _SimulatorOracle_instances, "m",
|
|
221
|
+
const appTaggingSecret = await __classPrivateFieldGet(this, _SimulatorOracle_instances, "m", _SimulatorOracle_calculateAppTaggingSecret).call(this, contractAddress, sender, recipient);
|
|
216
222
|
let [currentIndex] = await this.db.getTaggingSecretsIndexesAsSender([appTaggingSecret]);
|
|
217
223
|
const INDEX_OFFSET = 10;
|
|
218
224
|
let previousEmptyBack = 0;
|
|
@@ -248,93 +254,122 @@ export class SimulatorOracle {
|
|
|
248
254
|
const newIndex = currentIndex - (INDEX_OFFSET + previousEmptyBack);
|
|
249
255
|
await this.db.setTaggingSecretsIndexesAsSender([new IndexedTaggingSecret(appTaggingSecret, newIndex)]);
|
|
250
256
|
const contractName = await this.contractDataOracle.getDebugContractName(contractAddress);
|
|
251
|
-
this.log.debug(`Syncing logs for sender ${sender}
|
|
257
|
+
this.log.debug(`Syncing logs for sender ${sender} at contract ${contractName}(${contractAddress})`, {
|
|
258
|
+
sender,
|
|
259
|
+
secret: appTaggingSecret,
|
|
260
|
+
index: currentIndex,
|
|
261
|
+
contractName,
|
|
262
|
+
contractAddress,
|
|
263
|
+
});
|
|
252
264
|
}
|
|
253
265
|
/**
|
|
254
|
-
* Synchronizes the logs tagged with scoped addresses and all the senders in the
|
|
255
|
-
* Returns the unsynched logs and updates the indexes of the secrets used to tag them until there are no more logs
|
|
266
|
+
* Synchronizes the logs tagged with scoped addresses and all the senders in the address book.
|
|
267
|
+
* Returns the unsynched logs and updates the indexes of the secrets used to tag them until there are no more logs
|
|
268
|
+
* to sync.
|
|
256
269
|
* @param contractAddress - The address of the contract that the logs are tagged for
|
|
257
270
|
* @param recipient - The address of the recipient
|
|
258
271
|
* @returns A list of encrypted logs tagged with the recipient's address
|
|
259
272
|
*/
|
|
260
273
|
async syncTaggedLogs(contractAddress, maxBlockNumber, scopes) {
|
|
274
|
+
// Half the size of the window we slide over the tagging secret indexes.
|
|
275
|
+
const WINDOW_HALF_SIZE = 10;
|
|
276
|
+
// Ideally this algorithm would be implemented in noir, exposing its building blocks as oracles.
|
|
277
|
+
// However it is impossible at the moment due to the language not supporting nested slices.
|
|
278
|
+
// This nesting is necessary because for a given set of tags we don't
|
|
279
|
+
// know how many logs we will get back. Furthermore, these logs are of undetermined
|
|
280
|
+
// length, since we don't really know the note they correspond to until we decrypt them.
|
|
261
281
|
const recipients = scopes ? scopes : await this.keyStore.getAccounts();
|
|
262
|
-
|
|
282
|
+
// A map of logs going from recipient address to logs. Note that the logs might have been processed before
|
|
283
|
+
// due to us having a sliding window that "looks back" for logs as well. (We look back as there is no guarantee
|
|
284
|
+
// that a logs will be received ordered by a given tax index and that the tags won't be reused).
|
|
285
|
+
const logsMap = new Map();
|
|
263
286
|
const contractName = await this.contractDataOracle.getDebugContractName(contractAddress);
|
|
264
287
|
for (const recipient of recipients) {
|
|
265
|
-
const
|
|
266
|
-
//
|
|
267
|
-
|
|
268
|
-
//
|
|
269
|
-
//
|
|
270
|
-
//
|
|
271
|
-
//
|
|
272
|
-
|
|
273
|
-
//
|
|
274
|
-
//
|
|
275
|
-
//
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
//
|
|
292
|
-
|
|
293
|
-
//
|
|
294
|
-
|
|
295
|
-
...acc.initialSecretIndexes,
|
|
296
|
-
...{ [appTaggingSecret.secret.toString()]: appTaggingSecret.index },
|
|
297
|
-
},
|
|
298
|
-
}), { currentTagggingSecrets: [], maxIndexesToCheck: {}, secretsToIncrement: {}, initialSecretIndexes: {} });
|
|
299
|
-
let { currentTagggingSecrets } = searchState;
|
|
300
|
-
const { maxIndexesToCheck, secretsToIncrement, initialSecretIndexes } = searchState;
|
|
301
|
-
while (currentTagggingSecrets.length > 0) {
|
|
302
|
-
// 2. Compute tags using the secrets, recipient and index. Obtain logs for each tag (#9380)
|
|
303
|
-
const currentTags = currentTagggingSecrets.map(taggingSecret => taggingSecret.computeSiloedTag(recipient, contractAddress));
|
|
304
|
-
const logsByTags = await this.aztecNode.getLogsByTags(currentTags);
|
|
305
|
-
const newTaggingSecrets = [];
|
|
288
|
+
const logsForRecipient = [];
|
|
289
|
+
// Get all the secrets for the recipient and sender pairs (#9365)
|
|
290
|
+
const secrets = await __classPrivateFieldGet(this, _SimulatorOracle_instances, "m", _SimulatorOracle_getIndexedTaggingSecretsForContacts).call(this, contractAddress, recipient);
|
|
291
|
+
// We fetch logs for a window of indexes in a range:
|
|
292
|
+
// <latest_log_index - WINDOW_HALF_SIZE, latest_log_index + WINDOW_HALF_SIZE>.
|
|
293
|
+
//
|
|
294
|
+
// We use this window approach because it could happen that a sender might have messed up and inadvertently
|
|
295
|
+
// incremented their index without us getting any logs (for example, in case of a revert). If we stopped looking
|
|
296
|
+
// for logs the first time we don't receive any logs for a tag, we might never receive anything from that sender again.
|
|
297
|
+
// Also there's a possibility that we have advanced our index, but the sender has reused it, so we might have missed
|
|
298
|
+
// some logs. For these reasons, we have to look both back and ahead of the stored index.
|
|
299
|
+
let secretsAndWindows = secrets.map(secret => {
|
|
300
|
+
return {
|
|
301
|
+
appTaggingSecret: secret.appTaggingSecret,
|
|
302
|
+
leftMostIndex: Math.max(0, secret.index - WINDOW_HALF_SIZE),
|
|
303
|
+
rightMostIndex: secret.index + WINDOW_HALF_SIZE,
|
|
304
|
+
};
|
|
305
|
+
});
|
|
306
|
+
// As we iterate we store the largest index we have seen for a given secret to later on store it in the db.
|
|
307
|
+
const newLargestIndexMapToStore = {};
|
|
308
|
+
// The initial/unmodified indexes of the secrets stored in a key-value map where key is the app tagging secret.
|
|
309
|
+
const initialIndexesMap = getInitialIndexesMap(secrets);
|
|
310
|
+
while (secretsAndWindows.length > 0) {
|
|
311
|
+
const secretsForTheWholeWindow = getIndexedTaggingSecretsForTheWindow(secretsAndWindows);
|
|
312
|
+
const tagsForTheWholeWindow = secretsForTheWholeWindow.map(secret => secret.computeSiloedTag(recipient, contractAddress));
|
|
313
|
+
// We store the new largest indexes we find in the iteration in the following map to later on construct
|
|
314
|
+
// a new set of secrets and windows to fetch logs for.
|
|
315
|
+
const newLargestIndexMapForIteration = {};
|
|
316
|
+
// Fetch the logs for the tags and iterate over them
|
|
317
|
+
const logsByTags = await this.aztecNode.getLogsByTags(tagsForTheWholeWindow);
|
|
306
318
|
logsByTags.forEach((logsByTag, logIndex) => {
|
|
307
|
-
const { secret: currentSecret, index: currentIndex } = currentTagggingSecrets[logIndex];
|
|
308
|
-
const currentSecretAsStr = currentSecret.toString();
|
|
309
|
-
this.log.debug(`Syncing logs for recipient ${recipient}, secret ${currentSecretAsStr}:${currentIndex} at contract: ${contractName}(${contractAddress})`);
|
|
310
|
-
// 3.1. Append logs to the list and increment the index for the tags that have logs (#9380)
|
|
311
319
|
if (logsByTag.length > 0) {
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
+
// The logs for the given tag exist so we store them for later processing
|
|
321
|
+
logsForRecipient.push(...logsByTag);
|
|
322
|
+
// We retrieve the indexed tagging secret corresponding to the log as I need that to evaluate whether
|
|
323
|
+
// a new largest index have been found.
|
|
324
|
+
const secretCorrespondingToLog = secretsForTheWholeWindow[logIndex];
|
|
325
|
+
const initialIndex = initialIndexesMap[secretCorrespondingToLog.appTaggingSecret.toString()];
|
|
326
|
+
this.log.debug(`Found ${logsByTag.length} logs as recipient ${recipient}`, {
|
|
327
|
+
recipient,
|
|
328
|
+
secret: secretCorrespondingToLog.appTaggingSecret,
|
|
329
|
+
contractName,
|
|
330
|
+
contractAddress,
|
|
331
|
+
});
|
|
332
|
+
if (secretCorrespondingToLog.index >= initialIndex &&
|
|
333
|
+
(newLargestIndexMapForIteration[secretCorrespondingToLog.appTaggingSecret.toString()] === undefined ||
|
|
334
|
+
secretCorrespondingToLog.index >=
|
|
335
|
+
newLargestIndexMapForIteration[secretCorrespondingToLog.appTaggingSecret.toString()])) {
|
|
336
|
+
// We have found a new largest index so we store it for later processing (storing it in the db + fetching
|
|
337
|
+
// the difference of the window sets of current and the next iteration)
|
|
338
|
+
newLargestIndexMapForIteration[secretCorrespondingToLog.appTaggingSecret.toString()] =
|
|
339
|
+
secretCorrespondingToLog.index + 1;
|
|
340
|
+
this.log.debug(`Incrementing index to ${secretCorrespondingToLog.index + 1} at contract ${contractName}(${contractAddress})`);
|
|
320
341
|
}
|
|
321
342
|
}
|
|
322
|
-
// 3.4 Keep increasing the index (inside the window) temporarily for the tags that have no logs
|
|
323
|
-
// There's a chance the sender missed some and we want to catch up
|
|
324
|
-
if (currentIndex < maxIndexesToCheck[currentSecretAsStr]) {
|
|
325
|
-
const newTaggingSecret = new IndexedTaggingSecret(currentSecret, currentIndex + 1);
|
|
326
|
-
newTaggingSecrets.push(newTaggingSecret);
|
|
327
|
-
}
|
|
328
343
|
});
|
|
329
|
-
|
|
330
|
-
|
|
344
|
+
// Now based on the new largest indexes we found, we will construct a new secrets and windows set to fetch logs
|
|
345
|
+
// for. Note that it's very unlikely that a new log from the current window would appear between the iterations
|
|
346
|
+
// so we fetch the logs only for the difference of the window sets.
|
|
347
|
+
const newSecretsAndWindows = [];
|
|
348
|
+
for (const [appTaggingSecret, newIndex] of Object.entries(newLargestIndexMapForIteration)) {
|
|
349
|
+
const secret = secrets.find(secret => secret.appTaggingSecret.toString() === appTaggingSecret);
|
|
350
|
+
if (secret) {
|
|
351
|
+
newSecretsAndWindows.push({
|
|
352
|
+
appTaggingSecret: secret.appTaggingSecret,
|
|
353
|
+
// We set the left most index to the new index to avoid fetching the same logs again
|
|
354
|
+
leftMostIndex: newIndex,
|
|
355
|
+
rightMostIndex: newIndex + WINDOW_HALF_SIZE,
|
|
356
|
+
});
|
|
357
|
+
// We store the new largest index in the map to later store it in the db.
|
|
358
|
+
newLargestIndexMapToStore[appTaggingSecret] = newIndex;
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
throw new Error(`Secret not found for appTaggingSecret ${appTaggingSecret}. This is a bug as it should never happen!`);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
// Now we set the new secrets and windows and proceed to the next iteration.
|
|
365
|
+
secretsAndWindows = newSecretsAndWindows;
|
|
331
366
|
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
//
|
|
335
|
-
|
|
367
|
+
// We filter the logs by block number and store them in the map.
|
|
368
|
+
logsMap.set(recipient.toString(), logsForRecipient.filter(log => log.blockNumber <= maxBlockNumber));
|
|
369
|
+
// At this point we have processed all the logs for the recipient so we store the new largest indexes in the db.
|
|
370
|
+
await this.db.setTaggingSecretsIndexesAsRecipient(Object.entries(newLargestIndexMapToStore).map(([appTaggingSecret, index]) => new IndexedTaggingSecret(Fr.fromHexString(appTaggingSecret), index)));
|
|
336
371
|
}
|
|
337
|
-
return
|
|
372
|
+
return logsMap;
|
|
338
373
|
}
|
|
339
374
|
/**
|
|
340
375
|
* Processes the tagged logs returned by syncTaggedLogs by decrypting them and storing them in the database.
|
|
@@ -342,58 +377,65 @@ export class SimulatorOracle {
|
|
|
342
377
|
* @param recipient - The recipient of the logs.
|
|
343
378
|
*/
|
|
344
379
|
async processTaggedLogs(logs, recipient, simulator) {
|
|
345
|
-
const { incomingNotes
|
|
346
|
-
if (incomingNotes.length
|
|
347
|
-
await this.db.addNotes(incomingNotes,
|
|
380
|
+
const { incomingNotes } = await __classPrivateFieldGet(this, _SimulatorOracle_instances, "m", _SimulatorOracle_decryptTaggedLogs).call(this, logs, recipient, simulator);
|
|
381
|
+
if (incomingNotes.length) {
|
|
382
|
+
await this.db.addNotes(incomingNotes, recipient);
|
|
348
383
|
incomingNotes.forEach(noteDao => {
|
|
349
|
-
this.log.verbose(`Added incoming note for contract ${noteDao.contractAddress} at slot ${noteDao.storageSlot}
|
|
384
|
+
this.log.verbose(`Added incoming note for contract ${noteDao.contractAddress} at slot ${noteDao.storageSlot}`, {
|
|
385
|
+
contract: noteDao.contractAddress,
|
|
386
|
+
slot: noteDao.storageSlot,
|
|
387
|
+
nullifier: noteDao.siloedNullifier.toString(),
|
|
388
|
+
});
|
|
350
389
|
});
|
|
351
|
-
|
|
352
|
-
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
async removeNullifiedNotes(contractAddress) {
|
|
393
|
+
for (const recipient of await this.keyStore.getAccounts()) {
|
|
394
|
+
const currentNotesForRecipient = await this.db.getIncomingNotes({ contractAddress, owner: recipient });
|
|
395
|
+
const nullifiersToCheck = currentNotesForRecipient.map(note => note.siloedNullifier);
|
|
396
|
+
const nullifierIndexes = await this.aztecNode.findNullifiersIndexesWithBlock('latest', nullifiersToCheck);
|
|
397
|
+
const foundNullifiers = nullifiersToCheck
|
|
398
|
+
.map((nullifier, i) => {
|
|
399
|
+
if (nullifierIndexes[i] !== undefined) {
|
|
400
|
+
return { ...nullifierIndexes[i], ...{ data: nullifier } };
|
|
401
|
+
}
|
|
402
|
+
})
|
|
403
|
+
.filter(nullifier => nullifier !== undefined);
|
|
404
|
+
const nullifiedNotes = await this.db.removeNullifiedNotes(foundNullifiers, recipient.toAddressPoint());
|
|
405
|
+
nullifiedNotes.forEach(noteDao => {
|
|
406
|
+
this.log.verbose(`Removed note for contract ${noteDao.contractAddress} at slot ${noteDao.storageSlot}`, {
|
|
407
|
+
contract: noteDao.contractAddress,
|
|
408
|
+
slot: noteDao.storageSlot,
|
|
409
|
+
nullifier: noteDao.siloedNullifier.toString(),
|
|
410
|
+
});
|
|
353
411
|
});
|
|
354
412
|
}
|
|
355
|
-
const nullifiedNotes = [];
|
|
356
|
-
const currentNotesForRecipient = await this.db.getIncomingNotes({ owner: recipient });
|
|
357
|
-
const nullifiersToCheck = currentNotesForRecipient.map(note => note.siloedNullifier);
|
|
358
|
-
const currentBlockNumber = await this.getBlockNumber();
|
|
359
|
-
const nullifierIndexes = await this.aztecNode.findNullifiersIndexesWithBlock(currentBlockNumber, nullifiersToCheck);
|
|
360
|
-
const foundNullifiers = nullifiersToCheck
|
|
361
|
-
.map((nullifier, i) => {
|
|
362
|
-
if (nullifierIndexes[i] !== undefined) {
|
|
363
|
-
return { ...nullifierIndexes[i], ...{ data: nullifier } };
|
|
364
|
-
}
|
|
365
|
-
})
|
|
366
|
-
.filter(nullifier => nullifier !== undefined);
|
|
367
|
-
await this.db.removeNullifiedNotes(foundNullifiers, recipient.toAddressPoint());
|
|
368
|
-
nullifiedNotes.forEach(noteDao => {
|
|
369
|
-
this.log.verbose(`Removed note for contract ${noteDao.contractAddress} at slot ${noteDao.storageSlot} with nullifier ${noteDao.siloedNullifier.toString()}`);
|
|
370
|
-
});
|
|
371
413
|
}
|
|
372
414
|
}
|
|
373
|
-
_SimulatorOracle_instances = new WeakSet(),
|
|
415
|
+
_SimulatorOracle_instances = new WeakSet(), _SimulatorOracle_calculateAppTaggingSecret = async function _SimulatorOracle_calculateAppTaggingSecret(contractAddress, sender, recipient) {
|
|
374
416
|
const senderCompleteAddress = await this.getCompleteAddress(sender);
|
|
375
417
|
const senderIvsk = await this.keyStore.getMasterIncomingViewingSecretKey(sender);
|
|
376
|
-
const
|
|
377
|
-
// Silo the secret
|
|
378
|
-
const
|
|
379
|
-
return
|
|
380
|
-
},
|
|
418
|
+
const secretPoint = computeTaggingSecretPoint(senderCompleteAddress, senderIvsk, recipient);
|
|
419
|
+
// Silo the secret so it can't be used to track other app's notes
|
|
420
|
+
const appSecret = poseidon2Hash([secretPoint.x, secretPoint.y, contractAddress]);
|
|
421
|
+
return appSecret;
|
|
422
|
+
}, _SimulatorOracle_getIndexedTaggingSecretsForContacts =
|
|
381
423
|
/**
|
|
382
|
-
* Returns the
|
|
424
|
+
* Returns the indexed tagging secrets for a given recipient and all the senders in the address book
|
|
383
425
|
* This method should be exposed as an oracle call to allow aztec.nr to perform the orchestration
|
|
384
426
|
* of the syncTaggedLogs and processTaggedLogs methods. However, it is not possible to do so at the moment,
|
|
385
427
|
* so we're keeping it private for now.
|
|
386
428
|
* @param contractAddress - The contract address to silo the secret for
|
|
387
429
|
* @param recipient - The address receiving the notes
|
|
388
|
-
* @returns A list of
|
|
430
|
+
* @returns A list of indexed tagging secrets
|
|
389
431
|
*/
|
|
390
|
-
async function
|
|
432
|
+
async function _SimulatorOracle_getIndexedTaggingSecretsForContacts(contractAddress, recipient) {
|
|
391
433
|
const recipientCompleteAddress = await this.getCompleteAddress(recipient);
|
|
392
434
|
const recipientIvsk = await this.keyStore.getMasterIncomingViewingSecretKey(recipient);
|
|
393
435
|
// We implicitly add all PXE accounts as contacts, this helps us decrypt tags on notes that we send to ourselves (recipient = us, sender = us)
|
|
394
|
-
const contacts = [...this.db.getContactAddresses(), ...(await this.keyStore.getAccounts())].filter((address, index, self) => index === self.findIndex(otherAddress => otherAddress.equals(address)));
|
|
436
|
+
const contacts = [...(await this.db.getContactAddresses()), ...(await this.keyStore.getAccounts())].filter((address, index, self) => index === self.findIndex(otherAddress => otherAddress.equals(address)));
|
|
395
437
|
const appTaggingSecrets = contacts.map(contact => {
|
|
396
|
-
const sharedSecret =
|
|
438
|
+
const sharedSecret = computeTaggingSecretPoint(recipientCompleteAddress, recipientIvsk, contact);
|
|
397
439
|
return poseidon2Hash([sharedSecret.x, sharedSecret.y, contractAddress]);
|
|
398
440
|
});
|
|
399
441
|
const indexes = await this.db.getTaggingSecretsIndexesAsRecipient(appTaggingSecrets);
|
|
@@ -410,26 +452,17 @@ async function _SimulatorOracle_decryptTaggedLogs(scopedLogs, recipient, simulat
|
|
|
410
452
|
const recipientCompleteAddress = await this.getCompleteAddress(recipient);
|
|
411
453
|
const ivskM = await this.keyStore.getMasterSecretKey(recipientCompleteAddress.publicKeys.masterIncomingViewingPublicKey);
|
|
412
454
|
const addressSecret = computeAddressSecret(recipientCompleteAddress.getPreaddress(), ivskM);
|
|
413
|
-
const ovskM = await this.keyStore.getMasterSecretKey(recipientCompleteAddress.publicKeys.masterOutgoingViewingPublicKey);
|
|
414
455
|
// Since we could have notes with the same index for different txs, we need
|
|
415
456
|
// to keep track of them scoping by txHash
|
|
416
457
|
const excludedIndices = new Map();
|
|
417
458
|
const incomingNotes = [];
|
|
418
|
-
const outgoingNotes = [];
|
|
419
459
|
const txEffectsCache = new Map();
|
|
420
460
|
for (const scopedLog of scopedLogs) {
|
|
421
461
|
const incomingNotePayload = scopedLog.isFromPublic
|
|
422
462
|
? L1NotePayload.decryptAsIncomingFromPublic(scopedLog.logData, addressSecret)
|
|
423
463
|
: L1NotePayload.decryptAsIncoming(PrivateLog.fromBuffer(scopedLog.logData), addressSecret);
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
: L1NotePayload.decryptAsOutgoing(PrivateLog.fromBuffer(scopedLog.logData), ovskM);
|
|
427
|
-
if (incomingNotePayload || outgoingNotePayload) {
|
|
428
|
-
if (incomingNotePayload && outgoingNotePayload && !incomingNotePayload.equals(outgoingNotePayload)) {
|
|
429
|
-
this.log.warn(`Incoming and outgoing note payloads do not match. Incoming: ${tryJsonStringify(incomingNotePayload)}, Outgoing: ${tryJsonStringify(outgoingNotePayload)}`);
|
|
430
|
-
continue;
|
|
431
|
-
}
|
|
432
|
-
const payload = incomingNotePayload || outgoingNotePayload;
|
|
464
|
+
if (incomingNotePayload) {
|
|
465
|
+
const payload = incomingNotePayload;
|
|
433
466
|
const txEffect = txEffectsCache.get(scopedLog.txHash.toString()) ?? (await this.aztecNode.getTxEffect(scopedLog.txHash));
|
|
434
467
|
if (!txEffect) {
|
|
435
468
|
this.log.warn(`No tx effect found for ${scopedLog.txHash} while decrypting tagged logs`);
|
|
@@ -439,19 +472,16 @@ async function _SimulatorOracle_decryptTaggedLogs(scopedLogs, recipient, simulat
|
|
|
439
472
|
if (!excludedIndices.has(scopedLog.txHash.toString())) {
|
|
440
473
|
excludedIndices.set(scopedLog.txHash.toString(), new Set());
|
|
441
474
|
}
|
|
442
|
-
const { incomingNote
|
|
475
|
+
const { incomingNote } = await produceNoteDaos(
|
|
443
476
|
// I don't like this at all, but we need a simulator to run `computeNoteHashAndOptionallyANullifier`. This generates
|
|
444
477
|
// a chicken-and-egg problem due to this oracle requiring a simulator, which in turn requires this oracle. Furthermore, since jest doesn't allow
|
|
445
478
|
// mocking ESM exports, we have to pollute the method even more by providing a simulator parameter so tests can inject a fake one.
|
|
446
|
-
simulator ?? getAcirSimulator(this.db, this.aztecNode, this.keyStore, this.contractDataOracle), this.db, incomingNotePayload ? recipient.toAddressPoint() : undefined,
|
|
479
|
+
simulator ?? getAcirSimulator(this.db, this.aztecNode, this.keyStore, this.contractDataOracle), this.db, incomingNotePayload ? recipient.toAddressPoint() : undefined, payload, txEffect.data.txHash, txEffect.l2BlockNumber, txEffect.l2BlockHash, txEffect.data.noteHashes, scopedLog.dataStartIndexForTx, excludedIndices.get(scopedLog.txHash.toString()), this.log);
|
|
447
480
|
if (incomingNote) {
|
|
448
481
|
incomingNotes.push(incomingNote);
|
|
449
482
|
}
|
|
450
|
-
if (outgoingNote) {
|
|
451
|
-
outgoingNotes.push(outgoingNote);
|
|
452
|
-
}
|
|
453
483
|
}
|
|
454
484
|
}
|
|
455
|
-
return { incomingNotes
|
|
485
|
+
return { incomingNotes };
|
|
456
486
|
};
|
|
457
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2ltdWxhdG9yX29yYWNsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFHTCxhQUFhLEVBR2IsWUFBWSxFQU1aLG1DQUFtQyxHQUNwQyxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFJTCxFQUFFLEVBR0Ysb0JBQW9CLEVBR3BCLFVBQVUsRUFDVixvQkFBb0IsRUFDcEIsb0JBQW9CLEdBQ3JCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUF5QixtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25GLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQXFDLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFNOUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXpEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDMUIsWUFDVSxrQkFBc0MsRUFDdEMsRUFBZSxFQUNmLFFBQWtCLEVBQ2xCLFNBQW9CLEVBQ3BCLE1BQU0saUJBQWlCLENBQUMsNEJBQTRCLENBQUM7O1FBSnJELHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixRQUFHLEdBQUgsR0FBRyxDQUFrRDtJQUM1RCxDQUFDO0lBRUosdUJBQXVCLENBQUMsT0FBVyxFQUFFLGVBQTZCO1FBQ2hFLE9B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
|
|
487
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2ltdWxhdG9yX29yYWNsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFHTCxhQUFhLEVBR2IsWUFBWSxFQU1aLG1DQUFtQyxHQUNwQyxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFLTCxFQUFFLEVBRUYsb0JBQW9CLEVBR3BCLFVBQVUsRUFDVixvQkFBb0IsRUFDcEIseUJBQXlCLEdBQzFCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUF5QixtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25GLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFNaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhHOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDMUIsWUFDVSxrQkFBc0MsRUFDdEMsRUFBZSxFQUNmLFFBQWtCLEVBQ2xCLFNBQW9CLEVBQ3BCLE1BQU0sWUFBWSxDQUFDLHNCQUFzQixDQUFDOztRQUoxQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIsUUFBRyxHQUFILEdBQUcsQ0FBdUM7SUFDakQsQ0FBQztJQUVKLHVCQUF1QixDQUFDLE9BQVcsRUFBRSxlQUE2QjtR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
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Fr, IndexedTaggingSecret } from '@aztec/circuits.js';
|
|
2
|
+
export declare function getIndexedTaggingSecretsForTheWindow(secretsAndWindows: {
|
|
3
|
+
appTaggingSecret: Fr;
|
|
4
|
+
leftMostIndex: number;
|
|
5
|
+
rightMostIndex: number;
|
|
6
|
+
}[]): IndexedTaggingSecret[];
|
|
7
|
+
/**
|
|
8
|
+
* Creates a map from app tagging secret to initial index.
|
|
9
|
+
* @param indexedTaggingSecrets - The indexed tagging secrets to get the initial indexes from.
|
|
10
|
+
* @returns The map from app tagging secret to initial index.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getInitialIndexesMap(indexedTaggingSecrets: IndexedTaggingSecret[]): {
|
|
13
|
+
[k: string]: number;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=tagging_utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tagging_utils.d.ts","sourceRoot":"","sources":["../../src/simulator_oracle/tagging_utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAEnE,wBAAgB,oCAAoC,CAClD,iBAAiB,EAAE;IAAE,gBAAgB,EAAE,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,EAAE,GAC3F,oBAAoB,EAAE,CAQxB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,qBAAqB,EAAE,oBAAoB,EAAE,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAQ3G"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { IndexedTaggingSecret } from '@aztec/circuits.js';
|
|
2
|
+
export function getIndexedTaggingSecretsForTheWindow(secretsAndWindows) {
|
|
3
|
+
const secrets = [];
|
|
4
|
+
for (const secretAndWindow of secretsAndWindows) {
|
|
5
|
+
for (let i = secretAndWindow.leftMostIndex; i <= secretAndWindow.rightMostIndex; i++) {
|
|
6
|
+
secrets.push(new IndexedTaggingSecret(secretAndWindow.appTaggingSecret, i));
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return secrets;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Creates a map from app tagging secret to initial index.
|
|
13
|
+
* @param indexedTaggingSecrets - The indexed tagging secrets to get the initial indexes from.
|
|
14
|
+
* @returns The map from app tagging secret to initial index.
|
|
15
|
+
*/
|
|
16
|
+
export function getInitialIndexesMap(indexedTaggingSecrets) {
|
|
17
|
+
const initialIndexes = {};
|
|
18
|
+
for (const indexedTaggingSecret of indexedTaggingSecrets) {
|
|
19
|
+
initialIndexes[indexedTaggingSecret.appTaggingSecret.toString()] = indexedTaggingSecret.index;
|
|
20
|
+
}
|
|
21
|
+
return initialIndexes;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnZ2luZ191dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaW11bGF0b3Jfb3JhY2xlL3RhZ2dpbmdfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFXLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbkUsTUFBTSxVQUFVLG9DQUFvQyxDQUNsRCxpQkFBNEY7SUFFNUYsTUFBTSxPQUFPLEdBQTJCLEVBQUUsQ0FBQztJQUMzQyxLQUFLLE1BQU0sZUFBZSxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDaEQsS0FBSyxJQUFJLENBQUMsR0FBRyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxlQUFlLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckYsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlFLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMscUJBQTZDO0lBQ2hGLE1BQU0sY0FBYyxHQUE0QixFQUFFLENBQUM7SUFFbkQsS0FBSyxNQUFNLG9CQUFvQixJQUFJLHFCQUFxQixFQUFFLENBQUM7UUFDekQsY0FBYyxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDO0lBQ2hHLENBQUM7SUFFRCxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDIn0=
|