@aztec/pxe 0.62.0 → 0.63.1
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/config/index.d.ts +2 -3
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +4 -5
- package/dest/contract_data_oracle/index.d.ts +1 -0
- package/dest/contract_data_oracle/index.d.ts.map +1 -1
- package/dest/contract_data_oracle/index.js +5 -1
- package/dest/database/incoming_note_dao.d.ts +1 -1
- package/dest/database/incoming_note_dao.d.ts.map +1 -1
- package/dest/database/kv_pxe_database.d.ts +5 -12
- package/dest/database/kv_pxe_database.d.ts.map +1 -1
- package/dest/database/kv_pxe_database.js +31 -62
- package/dest/database/outgoing_note_dao.d.ts +1 -1
- package/dest/database/outgoing_note_dao.d.ts.map +1 -1
- package/dest/database/pxe_database.d.ts +17 -25
- package/dest/database/pxe_database.d.ts.map +1 -1
- package/dest/kernel_oracle/index.d.ts +3 -3
- package/dest/kernel_oracle/index.d.ts.map +1 -1
- package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.d.ts.map +1 -1
- package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.js +12 -4
- package/dest/kernel_prover/kernel_prover.d.ts +3 -1
- package/dest/kernel_prover/kernel_prover.d.ts.map +1 -1
- package/dest/kernel_prover/kernel_prover.js +39 -7
- package/dest/kernel_prover/test/test_circuit_prover.d.ts +1 -0
- package/dest/kernel_prover/test/test_circuit_prover.d.ts.map +1 -1
- package/dest/kernel_prover/test/test_circuit_prover.js +5 -1
- package/dest/{note_processor/utils → note_decryption_utils}/add_public_values_to_payload.d.ts +1 -1
- package/dest/note_decryption_utils/add_public_values_to_payload.d.ts.map +1 -0
- package/dest/{note_processor/utils → note_decryption_utils}/add_public_values_to_payload.js +1 -1
- package/dest/note_decryption_utils/brute_force_note_info.d.ts.map +1 -0
- package/dest/{note_processor/utils → note_decryption_utils}/brute_force_note_info.js +1 -1
- package/dest/note_decryption_utils/index.d.ts.map +1 -0
- package/dest/{note_processor/utils → note_decryption_utils}/index.js +1 -1
- package/dest/{note_processor/utils → note_decryption_utils}/produce_note_daos.d.ts +5 -8
- package/dest/note_decryption_utils/produce_note_daos.d.ts.map +1 -0
- package/dest/note_decryption_utils/produce_note_daos.js +47 -0
- package/dest/note_decryption_utils/produce_note_daos_for_key.d.ts +8 -0
- package/dest/note_decryption_utils/produce_note_daos_for_key.d.ts.map +1 -0
- package/dest/note_decryption_utils/produce_note_daos_for_key.js +17 -0
- package/dest/pxe_http/pxe_http_server.d.ts +1 -2
- package/dest/pxe_http/pxe_http_server.d.ts.map +1 -1
- package/dest/pxe_http/pxe_http_server.js +5 -51
- package/dest/pxe_service/create_pxe_service.d.ts.map +1 -1
- package/dest/pxe_service/create_pxe_service.js +7 -4
- package/dest/pxe_service/error_enriching.d.ts.map +1 -1
- package/dest/pxe_service/error_enriching.js +7 -6
- package/dest/pxe_service/pxe_service.d.ts +11 -25
- package/dest/pxe_service/pxe_service.d.ts.map +1 -1
- package/dest/pxe_service/pxe_service.js +45 -48
- package/dest/pxe_service/test/pxe_test_suite.d.ts.map +1 -1
- package/dest/pxe_service/test/pxe_test_suite.js +4 -3
- package/dest/simulator_oracle/index.d.ts +15 -16
- package/dest/simulator_oracle/index.d.ts.map +1 -1
- package/dest/simulator_oracle/index.js +195 -65
- package/dest/synchronizer/synchronizer.d.ts +0 -48
- package/dest/synchronizer/synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/synchronizer.js +3 -201
- package/package.json +14 -14
- package/src/config/index.ts +4 -7
- package/src/contract_data_oracle/index.ts +5 -0
- package/src/database/incoming_note_dao.ts +1 -1
- package/src/database/kv_pxe_database.ts +33 -70
- package/src/database/outgoing_note_dao.ts +1 -1
- package/src/database/pxe_database.ts +19 -28
- package/src/kernel_prover/hints/build_private_kernel_reset_private_inputs.ts +13 -3
- package/src/kernel_prover/kernel_prover.ts +49 -5
- package/src/kernel_prover/test/test_circuit_prover.ts +8 -4
- package/src/{note_processor/utils → note_decryption_utils}/add_public_values_to_payload.ts +1 -1
- package/src/{note_processor/utils → note_decryption_utils}/produce_note_daos.ts +6 -16
- package/src/{note_processor/utils → note_decryption_utils}/produce_note_daos_for_key.ts +6 -15
- package/src/pxe_http/pxe_http_server.ts +5 -84
- package/src/pxe_service/create_pxe_service.ts +9 -3
- package/src/pxe_service/error_enriching.ts +12 -5
- package/src/pxe_service/pxe_service.ts +61 -78
- package/src/pxe_service/test/pxe_test_suite.ts +6 -2
- package/src/simulator_oracle/index.ts +280 -60
- package/src/synchronizer/synchronizer.ts +3 -253
- package/dest/database/deferred_note_dao.d.ts +0 -40
- package/dest/database/deferred_note_dao.d.ts.map +0 -1
- package/dest/database/deferred_note_dao.js +0 -38
- package/dest/note_processor/index.d.ts +0 -2
- package/dest/note_processor/index.d.ts.map +0 -1
- package/dest/note_processor/index.js +0 -2
- package/dest/note_processor/note_processor.d.ts +0 -83
- package/dest/note_processor/note_processor.d.ts.map +0 -1
- package/dest/note_processor/note_processor.js +0 -231
- package/dest/note_processor/utils/add_public_values_to_payload.d.ts.map +0 -1
- package/dest/note_processor/utils/brute_force_note_info.d.ts.map +0 -1
- package/dest/note_processor/utils/index.d.ts.map +0 -1
- package/dest/note_processor/utils/produce_note_daos.d.ts.map +0 -1
- package/dest/note_processor/utils/produce_note_daos.js +0 -51
- package/dest/note_processor/utils/produce_note_daos_for_key.d.ts +0 -9
- package/dest/note_processor/utils/produce_note_daos_for_key.d.ts.map +0 -1
- package/dest/note_processor/utils/produce_note_daos_for_key.js +0 -26
- package/src/database/deferred_note_dao.ts +0 -47
- package/src/note_processor/index.ts +0 -1
- package/src/note_processor/note_processor.ts +0 -358
- /package/dest/{note_processor/utils → note_decryption_utils}/brute_force_note_info.d.ts +0 -0
- /package/dest/{note_processor/utils → note_decryption_utils}/index.d.ts +0 -0
- /package/src/{note_processor/utils → note_decryption_utils}/brute_force_note_info.ts +0 -0
- /package/src/{note_processor/utils → note_decryption_utils}/index.ts +0 -0
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
import { L1NotePayload } from '@aztec/circuit-types';
|
|
2
|
-
import { INITIAL_L2_BLOCK_NUM, MAX_NOTE_HASHES_PER_TX, computeAddressSecret, computePoint, } from '@aztec/circuits.js';
|
|
3
|
-
import { createDebugLogger } from '@aztec/foundation/log';
|
|
4
|
-
import { Timer } from '@aztec/foundation/timer';
|
|
5
|
-
import { getAcirSimulator } from '../simulator/index.js';
|
|
6
|
-
import { produceNoteDaos } from './utils/produce_note_daos.js';
|
|
7
|
-
/**
|
|
8
|
-
* NoteProcessor is responsible for decrypting logs and converting them to notes via their originating contracts
|
|
9
|
-
* before storing them against their owner.
|
|
10
|
-
*/
|
|
11
|
-
export class NoteProcessor {
|
|
12
|
-
constructor(account, keyStore, db, node, startingBlock, simulator, log) {
|
|
13
|
-
this.account = account;
|
|
14
|
-
this.keyStore = keyStore;
|
|
15
|
-
this.db = db;
|
|
16
|
-
this.node = node;
|
|
17
|
-
this.startingBlock = startingBlock;
|
|
18
|
-
this.simulator = simulator;
|
|
19
|
-
this.log = log;
|
|
20
|
-
/** Keeps track of processing time since an instance is created. */
|
|
21
|
-
this.timer = new Timer();
|
|
22
|
-
/** Stats accumulated for this processor. */
|
|
23
|
-
this.stats = {
|
|
24
|
-
seen: 0,
|
|
25
|
-
decryptedIncoming: 0,
|
|
26
|
-
decryptedOutgoing: 0,
|
|
27
|
-
deferredIncoming: 0,
|
|
28
|
-
deferredOutgoing: 0,
|
|
29
|
-
failed: 0,
|
|
30
|
-
blocks: 0,
|
|
31
|
-
txs: 0,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
static create(account, keyStore, db, node, startingBlock = INITIAL_L2_BLOCK_NUM, simulator = getAcirSimulator(db, node, keyStore), log = createDebugLogger('aztec:note_processor')) {
|
|
35
|
-
return new NoteProcessor(account, keyStore, db, node, startingBlock, simulator, log);
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Check if the NoteProcessor is synchronized with the remote block number.
|
|
39
|
-
* The function queries the remote block number from the AztecNode and compares it with the syncedToBlock value in the NoteProcessor.
|
|
40
|
-
* If the values are equal, then the NoteProcessor is considered to be synchronized, otherwise not.
|
|
41
|
-
*
|
|
42
|
-
* @returns A boolean indicating whether the NoteProcessor is synchronized with the remote block number or not.
|
|
43
|
-
*/
|
|
44
|
-
async isSynchronized() {
|
|
45
|
-
const remoteBlockNumber = await this.node.getBlockNumber();
|
|
46
|
-
return this.getSyncedToBlock() === remoteBlockNumber;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Returns synchronization status (ie up to which block has been synced ) for this note processor.
|
|
50
|
-
*/
|
|
51
|
-
get status() {
|
|
52
|
-
return { syncedToBlock: this.getSyncedToBlock() };
|
|
53
|
-
}
|
|
54
|
-
getSyncedToBlock() {
|
|
55
|
-
return this.db.getSynchedBlockNumberForAccount(this.account.address) ?? this.startingBlock - 1;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Extracts new user-relevant notes from the information contained in the provided L2 blocks and encrypted logs.
|
|
59
|
-
*
|
|
60
|
-
* @param blocks - L2 blocks to be processed.
|
|
61
|
-
* @returns A promise that resolves once the processing is completed.
|
|
62
|
-
*/
|
|
63
|
-
async process(blocks) {
|
|
64
|
-
if (blocks.length === 0) {
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
const blocksAndNotes = [];
|
|
68
|
-
// Keep track of notes that we couldn't process because the contract was not found.
|
|
69
|
-
const deferredIncomingNotes = [];
|
|
70
|
-
const deferredOutgoingNotes = [];
|
|
71
|
-
const ivskM = await this.keyStore.getMasterSecretKey(this.account.publicKeys.masterIncomingViewingPublicKey);
|
|
72
|
-
const addressSecret = computeAddressSecret(this.account.getPreaddress(), ivskM);
|
|
73
|
-
const ovskM = await this.keyStore.getMasterSecretKey(this.account.publicKeys.masterOutgoingViewingPublicKey);
|
|
74
|
-
// Iterate over both blocks and encrypted logs.
|
|
75
|
-
for (const block of blocks) {
|
|
76
|
-
this.stats.blocks++;
|
|
77
|
-
const { txLogs: encryptedTxLogs } = block.body.noteEncryptedLogs;
|
|
78
|
-
const { txLogs: unencryptedTxLogs } = block.body.unencryptedLogs;
|
|
79
|
-
const dataStartIndexForBlock = block.header.state.partial.noteHashTree.nextAvailableLeafIndex -
|
|
80
|
-
block.body.numberOfTxsIncludingPadded * MAX_NOTE_HASHES_PER_TX;
|
|
81
|
-
// We are using set for `userPertainingTxIndices` to avoid duplicates. This would happen in case there were
|
|
82
|
-
// multiple encrypted logs in a tx pertaining to a user.
|
|
83
|
-
const incomingNotes = [];
|
|
84
|
-
const outgoingNotes = [];
|
|
85
|
-
// Iterate over all the encrypted logs and try decrypting them. If successful, store the note.
|
|
86
|
-
for (let indexOfTxInABlock = 0; indexOfTxInABlock < encryptedTxLogs.length; ++indexOfTxInABlock) {
|
|
87
|
-
this.stats.txs++;
|
|
88
|
-
const dataStartIndexForTx = dataStartIndexForBlock + indexOfTxInABlock * MAX_NOTE_HASHES_PER_TX;
|
|
89
|
-
const noteHashes = block.body.txEffects[indexOfTxInABlock].noteHashes;
|
|
90
|
-
// Note: Each tx generates a `TxL2Logs` object and for this reason we can rely on its index corresponding
|
|
91
|
-
// to the index of a tx in a block.
|
|
92
|
-
const encryptedTxFunctionLogs = encryptedTxLogs[indexOfTxInABlock].functionLogs;
|
|
93
|
-
const unencryptedTxFunctionLogs = unencryptedTxLogs[indexOfTxInABlock].functionLogs;
|
|
94
|
-
const excludedIndices = new Set();
|
|
95
|
-
// We iterate over both encrypted and unencrypted logs to decrypt the notes since partial notes are passed
|
|
96
|
-
// via the unencrypted logs stream.
|
|
97
|
-
for (const txFunctionLogs of [encryptedTxFunctionLogs, unencryptedTxFunctionLogs]) {
|
|
98
|
-
const isFromPublic = txFunctionLogs === unencryptedTxFunctionLogs;
|
|
99
|
-
for (const functionLogs of txFunctionLogs) {
|
|
100
|
-
for (const unprocessedLog of functionLogs.logs) {
|
|
101
|
-
this.stats.seen++;
|
|
102
|
-
const incomingNotePayload = L1NotePayload.decryptAsIncoming(unprocessedLog.data, addressSecret, isFromPublic);
|
|
103
|
-
const outgoingNotePayload = L1NotePayload.decryptAsOutgoing(unprocessedLog.data, ovskM, isFromPublic);
|
|
104
|
-
if (incomingNotePayload || outgoingNotePayload) {
|
|
105
|
-
if (incomingNotePayload && outgoingNotePayload && !incomingNotePayload.equals(outgoingNotePayload)) {
|
|
106
|
-
throw new Error(`Incoming and outgoing note payloads do not match. Incoming: ${JSON.stringify(incomingNotePayload)}, Outgoing: ${JSON.stringify(outgoingNotePayload)}`);
|
|
107
|
-
}
|
|
108
|
-
const payload = incomingNotePayload || outgoingNotePayload;
|
|
109
|
-
const txEffect = block.body.txEffects[indexOfTxInABlock];
|
|
110
|
-
const { incomingNote, outgoingNote, incomingDeferredNote, outgoingDeferredNote } = await produceNoteDaos(this.simulator, this.db, incomingNotePayload ? computePoint(this.account.address) : undefined, outgoingNotePayload ? this.account.publicKeys.masterOutgoingViewingPublicKey : undefined, payload, txEffect.txHash, noteHashes, dataStartIndexForTx, excludedIndices, this.log, txEffect.unencryptedLogs);
|
|
111
|
-
if (incomingNote) {
|
|
112
|
-
incomingNotes.push(incomingNote);
|
|
113
|
-
this.stats.decryptedIncoming++;
|
|
114
|
-
}
|
|
115
|
-
if (outgoingNote) {
|
|
116
|
-
outgoingNotes.push(outgoingNote);
|
|
117
|
-
this.stats.decryptedOutgoing++;
|
|
118
|
-
}
|
|
119
|
-
if (incomingDeferredNote) {
|
|
120
|
-
deferredIncomingNotes.push(incomingDeferredNote);
|
|
121
|
-
this.stats.deferredIncoming++;
|
|
122
|
-
}
|
|
123
|
-
if (outgoingDeferredNote) {
|
|
124
|
-
deferredOutgoingNotes.push(outgoingDeferredNote);
|
|
125
|
-
this.stats.deferredOutgoing++;
|
|
126
|
-
}
|
|
127
|
-
if (incomingNote == undefined && outgoingNote == undefined && incomingDeferredNote == undefined) {
|
|
128
|
-
this.stats.failed++;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
blocksAndNotes.push({
|
|
136
|
-
block,
|
|
137
|
-
incomingNotes,
|
|
138
|
-
outgoingNotes,
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
await this.processBlocksAndNotes(blocksAndNotes);
|
|
142
|
-
await this.processDeferredNotes(deferredIncomingNotes, deferredOutgoingNotes);
|
|
143
|
-
const syncedToBlock = blocks[blocks.length - 1].number;
|
|
144
|
-
await this.db.setSynchedBlockNumberForAccount(this.account.address, syncedToBlock);
|
|
145
|
-
this.log.debug(`Synched block ${syncedToBlock}`);
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Process the given blocks and their associated transaction auxiliary data.
|
|
149
|
-
* This function updates the database with information about new transactions,
|
|
150
|
-
* user-pertaining transaction indices, and auxiliary data. It also removes nullified
|
|
151
|
-
* transaction auxiliary data from the database. This function keeps track of new nullifiers
|
|
152
|
-
* and ensures all other transactions are updated with newly settled block information.
|
|
153
|
-
*
|
|
154
|
-
* @param blocksAndNotes - Array of objects containing L2 blocks, user-pertaining transaction indices, and NoteDaos.
|
|
155
|
-
*/
|
|
156
|
-
async processBlocksAndNotes(blocksAndNotes) {
|
|
157
|
-
const incomingNotes = blocksAndNotes.flatMap(b => b.incomingNotes);
|
|
158
|
-
const outgoingNotes = blocksAndNotes.flatMap(b => b.outgoingNotes);
|
|
159
|
-
if (incomingNotes.length || outgoingNotes.length) {
|
|
160
|
-
await this.db.addNotes(incomingNotes, outgoingNotes, this.account.address);
|
|
161
|
-
incomingNotes.forEach(noteDao => {
|
|
162
|
-
this.log.verbose(`Added incoming note for contract ${noteDao.contractAddress} at slot ${noteDao.storageSlot} with nullifier ${noteDao.siloedNullifier.toString()}`);
|
|
163
|
-
});
|
|
164
|
-
outgoingNotes.forEach(noteDao => {
|
|
165
|
-
this.log.verbose(`Added outgoing note for contract ${noteDao.contractAddress} at slot ${noteDao.storageSlot}`);
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
const nullifiers = blocksAndNotes.flatMap(b => b.block.body.txEffects.flatMap(txEffect => txEffect.nullifiers));
|
|
169
|
-
const removedNotes = await this.db.removeNullifiedNotes(nullifiers, computePoint(this.account.address));
|
|
170
|
-
removedNotes.forEach(noteDao => {
|
|
171
|
-
this.log.verbose(`Removed note for contract ${noteDao.contractAddress} at slot ${noteDao.storageSlot} with nullifier ${noteDao.siloedNullifier.toString()}`);
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Store the given deferred notes in the database for later decoding.
|
|
176
|
-
*
|
|
177
|
-
* @param deferredIncomingNotes - incoming notes that are intended for us but we couldn't process because the contract was not found.
|
|
178
|
-
* @param deferredOutgoingNotes - outgoing notes that we couldn't process because the contract was not found.
|
|
179
|
-
*/
|
|
180
|
-
async processDeferredNotes(deferredIncomingNotes, deferredOutgoingNotes) {
|
|
181
|
-
if (deferredIncomingNotes.length || deferredOutgoingNotes.length) {
|
|
182
|
-
await this.db.addDeferredNotes([...deferredIncomingNotes, ...deferredOutgoingNotes]);
|
|
183
|
-
deferredIncomingNotes.forEach(noteDao => {
|
|
184
|
-
this.log.verbose(`Deferred incoming note for contract ${noteDao.payload.contractAddress} at slot ${noteDao.payload.storageSlot} in tx ${noteDao.txHash.toString()}`);
|
|
185
|
-
});
|
|
186
|
-
deferredOutgoingNotes.forEach(noteDao => {
|
|
187
|
-
this.log.verbose(`Deferred outgoing note for contract ${noteDao.payload.contractAddress} at slot ${noteDao.payload.storageSlot} in tx ${noteDao.txHash.toString()}`);
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Retry decoding the given deferred notes because we now have the contract code.
|
|
193
|
-
*
|
|
194
|
-
* @param deferredNoteDaos - notes that we have previously deferred because the contract was not found
|
|
195
|
-
* @returns An object containing arrays of incoming and outgoing notes that were successfully decoded.
|
|
196
|
-
*
|
|
197
|
-
* @remarks Caller is responsible for making sure that we have the contract for the
|
|
198
|
-
* deferred notes provided: we will not retry notes that fail again.
|
|
199
|
-
*/
|
|
200
|
-
async decodeDeferredNotes(deferredNoteDaos) {
|
|
201
|
-
const excludedIndices = new Set();
|
|
202
|
-
const incomingNotes = [];
|
|
203
|
-
const outgoingNotes = [];
|
|
204
|
-
for (const deferredNote of deferredNoteDaos) {
|
|
205
|
-
const { publicKey, payload, txHash, noteHashes, dataStartIndexForTx, unencryptedLogs } = deferredNote;
|
|
206
|
-
const isIncoming = publicKey.equals(computePoint(this.account.address));
|
|
207
|
-
const isOutgoing = publicKey.equals(this.account.publicKeys.masterOutgoingViewingPublicKey);
|
|
208
|
-
if (!isIncoming && !isOutgoing) {
|
|
209
|
-
// The note does not belong to this note processor
|
|
210
|
-
continue;
|
|
211
|
-
}
|
|
212
|
-
const { incomingNote, outgoingNote } = await produceNoteDaos(this.simulator, this.db, isIncoming ? computePoint(this.account.address) : undefined, isOutgoing ? this.account.publicKeys.masterOutgoingViewingPublicKey : undefined, payload, txHash, noteHashes, dataStartIndexForTx, excludedIndices, this.log, unencryptedLogs);
|
|
213
|
-
if (isIncoming) {
|
|
214
|
-
if (!incomingNote) {
|
|
215
|
-
throw new Error('Deferred incoming note could not be decoded');
|
|
216
|
-
}
|
|
217
|
-
incomingNotes.push(incomingNote);
|
|
218
|
-
this.stats.decryptedIncoming++;
|
|
219
|
-
}
|
|
220
|
-
if (outgoingNote) {
|
|
221
|
-
if (!outgoingNote) {
|
|
222
|
-
throw new Error('Deferred outgoing note could not be decoded');
|
|
223
|
-
}
|
|
224
|
-
outgoingNotes.push(outgoingNote);
|
|
225
|
-
this.stats.decryptedOutgoing++;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
return { incomingNotes, outgoingNotes };
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZV9wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbm90ZV9wcm9jZXNzb3Ivbm90ZV9wcm9jZXNzb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFrQixhQUFhLEVBQWdCLE1BQU0sc0JBQXNCLENBQUM7QUFFbkYsT0FBTyxFQUVMLG9CQUFvQixFQUNwQixzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3BCLFlBQVksR0FDYixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBZSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVFoRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFjL0Q7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFnQnhCLFlBQ2tCLE9BQXdCLEVBQ2hDLFFBQWtCLEVBQ2xCLEVBQWUsRUFDZixJQUFlLEVBQ2YsYUFBcUIsRUFDckIsU0FBd0IsRUFDeEIsR0FBVztRQU5ILFlBQU8sR0FBUCxPQUFPLENBQWlCO1FBQ2hDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFNBQUksR0FBSixJQUFJLENBQVc7UUFDZixrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUNyQixjQUFTLEdBQVQsU0FBUyxDQUFlO1FBQ3hCLFFBQUcsR0FBSCxHQUFHLENBQVE7UUF0QnJCLG1FQUFtRTtRQUNuRCxVQUFLLEdBQVUsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUUzQyw0Q0FBNEM7UUFDNUIsVUFBSyxHQUF1QjtZQUMxQyxJQUFJLEVBQUUsQ0FBQztZQUNQLGlCQUFpQixFQUFFLENBQUM7WUFDcEIsaUJBQWlCLEVBQUUsQ0FBQztZQUNwQixnQkFBZ0IsRUFB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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"add_public_values_to_payload.d.ts","sourceRoot":"","sources":["../../../src/note_processor/utils/add_public_values_to_payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAGhE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAElE;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,WAAW,EACf,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,EAAE,aAAa,GAClF,OAAO,CAAC,IAAI,CAAC,CAgDf"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"brute_force_note_info.d.ts","sourceRoot":"","sources":["../../../src/note_processor/utils/brute_force_note_info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,WAAW,QAAQ;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,EAAE,CAAC;IACV,QAAQ,EAAE,EAAE,CAAC;IACb,eAAe,EAAE,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,aAAa,EACxB,gBAAgB,EAAE,EAAE,EAAE,EACtB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,YAAY,EAC7B,WAAW,EAAE,EAAE,EACf,UAAU,EAAE,YAAY,EACxB,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,EAC5B,gBAAgB,EAAE,OAAO,GACxB,OAAO,CAAC,QAAQ,CAAC,CA+CnB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/note_processor/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"produce_note_daos.d.ts","sourceRoot":"","sources":["../../../src/note_processor/utils/produce_note_daos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,KAAK,MAAM,EAAE,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACjH,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAGlE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,aAAa,EACxB,EAAE,EAAE,WAAW,EACf,YAAY,EAAE,SAAS,GAAG,SAAS,EACnC,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,EAAE,EAAE,EAChB,mBAAmB,EAAE,MAAM,EAC3B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,EAC5B,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,mBAAmB,GACnC,OAAO,CAAC;IACT,YAAY,EAAE,eAAe,GAAG,SAAS,CAAC;IAC1C,YAAY,EAAE,eAAe,GAAG,SAAS,CAAC;IAC1C,oBAAoB,EAAE,eAAe,GAAG,SAAS,CAAC;IAClD,oBAAoB,EAAE,eAAe,GAAG,SAAS,CAAC;CACnD,CAAC,CAgED"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { IncomingNoteDao } from '../../database/incoming_note_dao.js';
|
|
2
|
-
import { OutgoingNoteDao } from '../../database/outgoing_note_dao.js';
|
|
3
|
-
import { produceNoteDaosForKey } from './produce_note_daos_for_key.js';
|
|
4
|
-
/**
|
|
5
|
-
* Decodes a note from a transaction that we know was intended for us.
|
|
6
|
-
* Throws if we do not yet have the contract corresponding to the note in our database.
|
|
7
|
-
* Accepts a set of excluded indices, which are indices that have been assigned a note in the same tx.
|
|
8
|
-
* Inserts the index of the note into the excludedIndices set if the note is successfully decoded.
|
|
9
|
-
*
|
|
10
|
-
* @param simulator - An instance of AcirSimulator.
|
|
11
|
-
* @param db - An instance of PxeDatabase.
|
|
12
|
-
* @param addressPoint - The public counterpart to the address secret, which is used in the decryption of incoming note logs.
|
|
13
|
-
* @param ovpkM - The public counterpart to the secret key to be used in the decryption of outgoing note logs.
|
|
14
|
-
* @param payload - An instance of l1NotePayload.
|
|
15
|
-
* @param txHash - The hash of the transaction that created the note. Equivalent to the first nullifier of the transaction.
|
|
16
|
-
* @param noteHashes - New note hashes in this transaction, one of which belongs to this note.
|
|
17
|
-
* @param dataStartIndexForTx - The next available leaf index for the note hash tree for this transaction.
|
|
18
|
-
* @param excludedIndices - Indices that have been assigned a note in the same tx. Notes in a tx can have the same l1NotePayload, we need to find a different index for each replicate.
|
|
19
|
-
* @param logger - An instance of Logger.
|
|
20
|
-
* @param unencryptedLogs - Unencrypted logs for the transaction (used to complete partial notes).
|
|
21
|
-
* @returns An object containing the incoming, outgoing, and deferred notes.
|
|
22
|
-
*/
|
|
23
|
-
export async function produceNoteDaos(simulator, db, addressPoint, ovpkM, payload, txHash, noteHashes, dataStartIndexForTx, excludedIndices, logger, unencryptedLogs) {
|
|
24
|
-
if (!addressPoint && !ovpkM) {
|
|
25
|
-
throw new Error('Both addressPoint and ovpkM are undefined. Cannot create note.');
|
|
26
|
-
}
|
|
27
|
-
let incomingNote;
|
|
28
|
-
let outgoingNote;
|
|
29
|
-
let incomingDeferredNote;
|
|
30
|
-
let outgoingDeferredNote;
|
|
31
|
-
if (addressPoint) {
|
|
32
|
-
[incomingNote, incomingDeferredNote] = await produceNoteDaosForKey(simulator, db, addressPoint, payload, txHash, noteHashes, dataStartIndexForTx, excludedIndices, logger, unencryptedLogs, IncomingNoteDao.fromPayloadAndNoteInfo);
|
|
33
|
-
}
|
|
34
|
-
if (ovpkM) {
|
|
35
|
-
if (incomingNote) {
|
|
36
|
-
// Incoming note is defined meaning that this PXE has both the incoming and outgoing keys. We can skip computing
|
|
37
|
-
// note hash and note index since we already have them in the incoming note.
|
|
38
|
-
outgoingNote = new OutgoingNoteDao(incomingNote.note, incomingNote.contractAddress, incomingNote.storageSlot, incomingNote.noteTypeId, incomingNote.txHash, incomingNote.nonce, incomingNote.noteHash, incomingNote.index, ovpkM);
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
[outgoingNote, outgoingDeferredNote] = await produceNoteDaosForKey(simulator, db, ovpkM, payload, txHash, noteHashes, dataStartIndexForTx, excludedIndices, logger, unencryptedLogs, OutgoingNoteDao.fromPayloadAndNoteInfo);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return {
|
|
45
|
-
incomingNote,
|
|
46
|
-
outgoingNote,
|
|
47
|
-
incomingDeferredNote,
|
|
48
|
-
outgoingDeferredNote,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjZV9ub3RlX2Rhb3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbm90ZV9wcm9jZXNzb3IvdXRpbHMvcHJvZHVjZV9ub3RlX2Rhb3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUV0RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV2RTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQ25DLFNBQXdCLEVBQ3hCLEVBQWUsRUFDZixZQUFtQyxFQUNuQyxLQUE0QixFQUM1QixPQUFzQixFQUN0QixNQUFjLEVBQ2QsVUFBZ0IsRUFDaEIsbUJBQTJCLEVBQzNCLGVBQTRCLEVBQzVCLE1BQWMsRUFDZCxlQUFvQztJQU9wQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCxJQUFJLFlBQXlDLENBQUM7SUFDOUMsSUFBSSxZQUF5QyxDQUFDO0lBQzlDLElBQUksb0JBQWlELENBQUM7SUFDdEQsSUFBSSxvQkFBaUQsQ0FBQztJQUV0RCxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pCLENBQUMsWUFBWSxFQUFFLG9CQUFvQixDQUFDLEdBQUcsTUFBTSxxQkFBcUIsQ0FDaEUsU0FBUyxFQUNULEVBQUUsRUFDRixZQUFZLEVBQ1osT0FBTyxFQUNQLE1BQU0sRUFDTixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixNQUFNLEVBQ04sZUFBZSxFQUNmLGVBQWUsQ0FBQyxzQkFBc0IsQ0FDdkMsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixnSEFBZ0g7WUFDaEgsNEVBQTRFO1lBQzVFLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FDaEMsWUFBWSxDQUFDLElBQUksRUFDakIsWUFBWSxDQUFDLGVBQWUsRUFDNUIsWUFBWSxDQUFDLFdBQVcsRUFDeEIsWUFBWSxDQUFDLFVBQVUsRUFDdkIsWUFBWSxDQUFDLE1BQU0sRUFDbkIsWUFBWSxDQUFDLEtBQUssRUFDbEIsWUFBWSxDQUFDLFFBQVEsRUFDckIsWUFBWSxDQUFDLEtBQUssRUFDbEIsS0FBSyxDQUNOLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLENBQUMsWUFBWSxFQUFFLG9CQUFvQixDQUFDLEdBQUcsTUFBTSxxQkFBcUIsQ0FDaEUsU0FBUyxFQUNULEVBQUUsRUFDRixLQUFLLEVBQ0wsT0FBTyxFQUNQLE1BQU0sRUFDTixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixNQUFNLEVBQ04sZUFBZSxFQUNmLGVBQWUsQ0FBQyxzQkFBc0IsQ0FDdkMsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLFlBQVk7UUFDWixZQUFZO1FBQ1osb0JBQW9CO1FBQ3BCLG9CQUFvQjtLQUNyQixDQUFDO0FBQ0osQ0FBQyJ9
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { type L1NotePayload, type Note, type TxHash, type UnencryptedTxL2Logs } from '@aztec/circuit-types';
|
|
2
|
-
import { type Fr, type PublicKey } from '@aztec/circuits.js';
|
|
3
|
-
import { type Logger } from '@aztec/foundation/log';
|
|
4
|
-
import { type AcirSimulator } from '@aztec/simulator';
|
|
5
|
-
import { DeferredNoteDao } from '../../database/deferred_note_dao.js';
|
|
6
|
-
import { type PxeDatabase } from '../../database/pxe_database.js';
|
|
7
|
-
import { type NoteInfo } from './brute_force_note_info.js';
|
|
8
|
-
export declare function produceNoteDaosForKey<T>(simulator: AcirSimulator, db: PxeDatabase, pkM: PublicKey, payload: L1NotePayload, txHash: TxHash, noteHashes: Fr[], dataStartIndexForTx: number, excludedIndices: Set<number>, logger: Logger, unencryptedLogs: UnencryptedTxL2Logs, daoConstructor: (note: Note, payload: L1NotePayload, noteInfo: NoteInfo, dataStartIndexForTx: number, pkM: PublicKey) => T): Promise<[T | undefined, DeferredNoteDao | undefined]>;
|
|
9
|
-
//# sourceMappingURL=produce_note_daos_for_key.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"produce_note_daos_for_key.d.ts","sourceRoot":"","sources":["../../../src/note_processor/utils/produce_note_daos_for_key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,IAAI,EAAE,KAAK,MAAM,EAAE,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC5G,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,KAAK,aAAa,EAAyB,MAAM,kBAAkB,CAAC;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAElE,OAAO,EAAE,KAAK,QAAQ,EAAsB,MAAM,4BAA4B,CAAC;AAE/E,wBAAsB,qBAAqB,CAAC,CAAC,EAC3C,SAAS,EAAE,aAAa,EACxB,EAAE,EAAE,WAAW,EACf,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,EAAE,EAAE,EAChB,mBAAmB,EAAE,MAAM,EAC3B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,EAC5B,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,mBAAmB,EACpC,cAAc,EAAE,CACd,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,QAAQ,EAClB,mBAAmB,EAAE,MAAM,EAC3B,GAAG,EAAE,SAAS,KACX,CAAC,GACL,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,eAAe,GAAG,SAAS,CAAC,CAAC,CAiCvD"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { ContractNotFoundError } from '@aztec/simulator';
|
|
2
|
-
import { DeferredNoteDao } from '../../database/deferred_note_dao.js';
|
|
3
|
-
import { getOrderedNoteItems } from './add_public_values_to_payload.js';
|
|
4
|
-
import { bruteForceNoteInfo } from './brute_force_note_info.js';
|
|
5
|
-
export async function produceNoteDaosForKey(simulator, db, pkM, payload, txHash, noteHashes, dataStartIndexForTx, excludedIndices, logger, unencryptedLogs, daoConstructor) {
|
|
6
|
-
let noteDao;
|
|
7
|
-
let deferredNoteDao;
|
|
8
|
-
try {
|
|
9
|
-
// We get the note by merging publicly and privately delivered note values.
|
|
10
|
-
const note = await getOrderedNoteItems(db, payload);
|
|
11
|
-
const noteInfo = await bruteForceNoteInfo(simulator, noteHashes, txHash, payload.contractAddress, payload.storageSlot, payload.noteTypeId, note, excludedIndices, true);
|
|
12
|
-
excludedIndices?.add(noteInfo.noteHashIndex);
|
|
13
|
-
noteDao = daoConstructor(note, payload, noteInfo, dataStartIndexForTx, pkM);
|
|
14
|
-
}
|
|
15
|
-
catch (e) {
|
|
16
|
-
if (e instanceof ContractNotFoundError) {
|
|
17
|
-
logger.warn(e.message);
|
|
18
|
-
deferredNoteDao = new DeferredNoteDao(pkM, payload, txHash, noteHashes, dataStartIndexForTx, unencryptedLogs);
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
logger.error(`Could not process note because of "${e}". Discarding note...`);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return [noteDao, deferredNoteDao];
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjZV9ub3RlX2Rhb3NfZm9yX2tleS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ub3RlX3Byb2Nlc3Nvci91dGlscy9wcm9kdWNlX25vdGVfZGFvc19mb3Jfa2V5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBc0IscUJBQXFCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFdEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFpQixrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRS9FLE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLFNBQXdCLEVBQ3hCLEVBQWUsRUFDZixHQUFjLEVBQ2QsT0FBc0IsRUFDdEIsTUFBYyxFQUNkLFVBQWdCLEVBQ2hCLG1CQUEyQixFQUMzQixlQUE0QixFQUM1QixNQUFjLEVBQ2QsZUFBb0MsRUFDcEMsY0FNTTtJQUVOLElBQUksT0FBc0IsQ0FBQztJQUMzQixJQUFJLGVBQTRDLENBQUM7SUFFakQsSUFBSSxDQUFDO1FBQ0gsMkVBQTJFO1FBQzNFLE1BQU0sSUFBSSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXBELE1BQU0sUUFBUSxHQUFHLE1BQU0sa0JBQWtCLENBQ3ZDLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLE9BQU8sQ0FBQyxlQUFlLEVBQ3ZCLE9BQU8sQ0FBQyxXQUFXLEVBQ25CLE9BQU8sQ0FBQyxVQUFVLEVBQ2xCLElBQUksRUFDSixlQUFlLEVBQ2YsSUFBSSxDQUNMLENBQUM7UUFDRixlQUFlLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUU3QyxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsSUFBSSxDQUFDLFlBQVkscUJBQXFCLEVBQUUsQ0FBQztZQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUV2QixlQUFlLEdBQUcsSUFBSSxlQUFlLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ2hILENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQy9FLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztBQUNwQyxDQUFDIn0=
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { L1NotePayload, TxHash, UnencryptedTxL2Logs } from '@aztec/circuit-types';
|
|
2
|
-
import { Fr, Point, type PublicKey, Vector } from '@aztec/circuits.js';
|
|
3
|
-
import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* A note that is intended for us, but we cannot decode it yet because the contract is not yet in our database.
|
|
7
|
-
*
|
|
8
|
-
* So keep the state that we need to decode it later.
|
|
9
|
-
*/
|
|
10
|
-
export class DeferredNoteDao {
|
|
11
|
-
constructor(
|
|
12
|
-
/** Address Point or OvpkM (depending on if incoming or outgoing) the note was encrypted with. */
|
|
13
|
-
public publicKey: PublicKey,
|
|
14
|
-
/** The note payload delivered via L1. */
|
|
15
|
-
public payload: L1NotePayload,
|
|
16
|
-
/** The hash of the tx the note was created in. Equal to the first nullifier */
|
|
17
|
-
public txHash: TxHash,
|
|
18
|
-
/** New note hashes in this transaction, one of which belongs to this note */
|
|
19
|
-
public noteHashes: Fr[],
|
|
20
|
-
/** The next available leaf index for the note hash tree for this transaction */
|
|
21
|
-
public dataStartIndexForTx: number,
|
|
22
|
-
/** Unencrypted logs for the transaction (used to complete partial notes) */
|
|
23
|
-
public unencryptedLogs: UnencryptedTxL2Logs,
|
|
24
|
-
) {}
|
|
25
|
-
|
|
26
|
-
toBuffer(): Buffer {
|
|
27
|
-
return serializeToBuffer(
|
|
28
|
-
this.publicKey,
|
|
29
|
-
this.payload,
|
|
30
|
-
this.txHash,
|
|
31
|
-
new Vector(this.noteHashes),
|
|
32
|
-
this.dataStartIndexForTx,
|
|
33
|
-
this.unencryptedLogs,
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
static fromBuffer(buffer: Buffer | BufferReader) {
|
|
37
|
-
const reader = BufferReader.asReader(buffer);
|
|
38
|
-
return new DeferredNoteDao(
|
|
39
|
-
reader.readObject(Point),
|
|
40
|
-
reader.readObject(L1NotePayload),
|
|
41
|
-
reader.readObject(TxHash),
|
|
42
|
-
reader.readVector(Fr),
|
|
43
|
-
reader.readNumber(),
|
|
44
|
-
reader.readObject(UnencryptedTxL2Logs),
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './note_processor.js';
|