@aztec/pxe 0.17.0 → 0.19.0
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 +2 -2
- package/dest/config/index.js +2 -2
- package/dest/contract_data_oracle/index.d.ts +8 -5
- package/dest/contract_data_oracle/index.d.ts.map +1 -1
- package/dest/contract_data_oracle/index.js +13 -10
- package/dest/contract_database/memory_contract_database.d.ts +1 -1
- package/dest/contract_database/memory_contract_database.d.ts.map +1 -1
- package/dest/contract_tree/index.d.ts +1 -1
- package/dest/contract_tree/index.d.ts.map +1 -1
- package/dest/contract_tree/index.js +2 -2
- package/dest/database/deferred_note_dao.d.ts +43 -0
- package/dest/database/deferred_note_dao.d.ts.map +1 -0
- package/dest/database/deferred_note_dao.js +41 -0
- package/dest/database/kv_pxe_database.d.ts +15 -1
- package/dest/database/kv_pxe_database.d.ts.map +1 -1
- package/dest/database/kv_pxe_database.js +59 -4
- package/dest/database/memory_db.d.ts +6 -1
- package/dest/database/memory_db.d.ts.map +1 -1
- package/dest/database/memory_db.js +21 -2
- package/dest/database/note_dao.d.ts +4 -2
- package/dest/database/note_dao.d.ts.map +1 -1
- package/dest/database/note_dao.js +3 -2
- package/dest/database/pxe_database.d.ts +18 -1
- package/dest/database/pxe_database.d.ts.map +1 -1
- package/dest/database/pxe_database_test_suite.js +2 -2
- package/dest/index.d.ts +1 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -2
- package/dest/kernel_oracle/index.d.ts +1 -1
- package/dest/kernel_oracle/index.d.ts.map +1 -1
- package/dest/kernel_oracle/index.js +2 -2
- 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 +24 -5
- package/dest/kernel_prover/proof_creator.d.ts.map +1 -1
- package/dest/kernel_prover/proof_creator.js +1 -1
- package/dest/note_processor/note_processor.d.ts +20 -18
- package/dest/note_processor/note_processor.d.ts.map +1 -1
- package/dest/note_processor/note_processor.js +66 -83
- package/dest/note_processor/produce_note_dao.d.ts +21 -0
- package/dest/note_processor/produce_note_dao.d.ts.map +1 -0
- package/dest/note_processor/produce_note_dao.js +92 -0
- package/dest/pxe_http/pxe_http_server.d.ts +1 -1
- package/dest/pxe_http/pxe_http_server.d.ts.map +1 -1
- package/dest/pxe_http/pxe_http_server.js +2 -2
- package/dest/pxe_service/create_pxe_service.d.ts +1 -1
- package/dest/pxe_service/create_pxe_service.d.ts.map +1 -1
- package/dest/pxe_service/create_pxe_service.js +1 -1
- package/dest/pxe_service/pxe_service.d.ts +3 -2
- package/dest/pxe_service/pxe_service.d.ts.map +1 -1
- package/dest/pxe_service/pxe_service.js +14 -10
- package/dest/pxe_service/test/pxe_test_suite.d.ts +1 -1
- package/dest/pxe_service/test/pxe_test_suite.d.ts.map +1 -1
- package/dest/pxe_service/test/pxe_test_suite.js +2 -2
- package/dest/simulator/index.d.ts +1 -1
- package/dest/simulator/index.d.ts.map +1 -1
- package/dest/simulator_oracle/index.d.ts +2 -2
- package/dest/simulator_oracle/index.d.ts.map +1 -1
- package/dest/simulator_oracle/index.js +2 -2
- package/dest/synchronizer/synchronizer.d.ts +22 -5
- package/dest/synchronizer/synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/synchronizer.js +147 -60
- package/package.json +11 -10
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { ContractNotFoundError } from '@aztec/acir-simulator';
|
|
2
|
+
import { INITIAL_L2_BLOCK_NUM, L1NotePayload, } from '@aztec/circuit-types';
|
|
3
|
+
import { MAX_NEW_COMMITMENTS_PER_TX } from '@aztec/circuits.js';
|
|
3
4
|
import { Grumpkin } from '@aztec/circuits.js/barretenberg';
|
|
4
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
5
5
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
6
6
|
import { Timer } from '@aztec/foundation/timer';
|
|
7
|
-
import {
|
|
8
|
-
import { NoteDao } from '../database/note_dao.js';
|
|
7
|
+
import { DeferredNoteDao } from '../database/deferred_note_dao.js';
|
|
9
8
|
import { getAcirSimulator } from '../simulator/index.js';
|
|
9
|
+
import { produceNoteDao } from './produce_note_dao.js';
|
|
10
10
|
/**
|
|
11
11
|
* NoteProcessor is responsible for decrypting logs and converting them to notes via their originating contracts
|
|
12
12
|
* before storing them against their owner.
|
|
@@ -27,7 +27,7 @@ export class NoteProcessor {
|
|
|
27
27
|
/** Keeps track of processing time since an instance is created. */
|
|
28
28
|
this.timer = new Timer();
|
|
29
29
|
/** Stats accumulated for this processor. */
|
|
30
|
-
this.stats = { seen: 0, decrypted: 0, failed: 0, blocks: 0, txs: 0 };
|
|
30
|
+
this.stats = { seen: 0, decrypted: 0, deferred: 0, failed: 0, blocks: 0, txs: 0 };
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
33
|
* Check if the NoteProcessor is synchronized with the remote block number.
|
|
@@ -66,15 +66,17 @@ export class NoteProcessor {
|
|
|
66
66
|
if (!l2BlockContexts.length) {
|
|
67
67
|
return;
|
|
68
68
|
}
|
|
69
|
-
const blocksAndNotes = [];
|
|
70
69
|
const curve = new Grumpkin();
|
|
70
|
+
const blocksAndNotes = [];
|
|
71
|
+
// Keep track of notes that we couldn't process because the contract was not found.
|
|
72
|
+
const deferredNoteDaos = [];
|
|
71
73
|
// Iterate over both blocks and encrypted logs.
|
|
72
74
|
for (let blockIndex = 0; blockIndex < encryptedL2BlockLogs.length; ++blockIndex) {
|
|
73
75
|
this.stats.blocks++;
|
|
74
76
|
const { txLogs } = encryptedL2BlockLogs[blockIndex];
|
|
75
77
|
const blockContext = l2BlockContexts[blockIndex];
|
|
76
78
|
const block = blockContext.block;
|
|
77
|
-
const
|
|
79
|
+
const dataEndIndexForBlock = block.header.state.partial.noteHashTree.nextAvailableLeafIndex;
|
|
78
80
|
// We are using set for `userPertainingTxIndices` to avoid duplicates. This would happen in case there were
|
|
79
81
|
// multiple encrypted logs in a tx pertaining to a user.
|
|
80
82
|
const noteDaos = [];
|
|
@@ -82,9 +84,8 @@ export class NoteProcessor {
|
|
|
82
84
|
// Iterate over all the encrypted logs and try decrypting them. If successful, store the note.
|
|
83
85
|
for (let indexOfTxInABlock = 0; indexOfTxInABlock < txLogs.length; ++indexOfTxInABlock) {
|
|
84
86
|
this.stats.txs++;
|
|
85
|
-
const dataStartIndexForTx =
|
|
87
|
+
const dataStartIndexForTx = dataEndIndexForBlock - (txLogs.length - indexOfTxInABlock) * MAX_NEW_COMMITMENTS_PER_TX;
|
|
86
88
|
const newCommitments = block.newCommitments.slice(indexOfTxInABlock * MAX_NEW_COMMITMENTS_PER_TX, (indexOfTxInABlock + 1) * MAX_NEW_COMMITMENTS_PER_TX);
|
|
87
|
-
const newNullifiers = block.newNullifiers.slice(indexOfTxInABlock * MAX_NEW_NULLIFIERS_PER_TX, (indexOfTxInABlock + 1) * MAX_NEW_NULLIFIERS_PER_TX);
|
|
88
89
|
// Note: Each tx generates a `TxL2Logs` object and for this reason we can rely on its index corresponding
|
|
89
90
|
// to the index of a tx in a block.
|
|
90
91
|
const txFunctionLogs = txLogs[indexOfTxInABlock].functionLogs;
|
|
@@ -95,16 +96,23 @@ export class NoteProcessor {
|
|
|
95
96
|
const payload = L1NotePayload.fromEncryptedBuffer(logs, privateKey, curve);
|
|
96
97
|
if (payload) {
|
|
97
98
|
// We have successfully decrypted the data.
|
|
99
|
+
const txHash = blockContext.getTxHash(indexOfTxInABlock);
|
|
98
100
|
try {
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
excludedIndices.add(commitmentIndex);
|
|
102
|
-
noteDaos.push(new NoteDao(payload.note, payload.contractAddress, payload.storageSlot, blockContext.getTxHash(indexOfTxInABlock), nonce, innerNoteHash, siloedNullifier, index, this.publicKey));
|
|
101
|
+
const noteDao = await produceNoteDao(this.simulator, this.publicKey, payload, txHash, newCommitments, dataStartIndexForTx, excludedIndices);
|
|
102
|
+
noteDaos.push(noteDao);
|
|
103
103
|
this.stats.decrypted++;
|
|
104
104
|
}
|
|
105
105
|
catch (e) {
|
|
106
|
-
|
|
107
|
-
|
|
106
|
+
if (e instanceof ContractNotFoundError) {
|
|
107
|
+
this.stats.deferred++;
|
|
108
|
+
this.log.warn(e.message);
|
|
109
|
+
const deferredNoteDao = new DeferredNoteDao(this.publicKey, payload.note, payload.contractAddress, payload.storageSlot, txHash, newCommitments, dataStartIndexForTx);
|
|
110
|
+
deferredNoteDaos.push(deferredNoteDao);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
this.stats.failed++;
|
|
114
|
+
this.log.warn(`Could not process note because of "${e}". Discarding note...`);
|
|
115
|
+
}
|
|
108
116
|
}
|
|
109
117
|
}
|
|
110
118
|
}
|
|
@@ -116,76 +124,11 @@ export class NoteProcessor {
|
|
|
116
124
|
});
|
|
117
125
|
}
|
|
118
126
|
await this.processBlocksAndNotes(blocksAndNotes);
|
|
127
|
+
await this.processDeferredNotes(deferredNoteDaos);
|
|
119
128
|
const syncedToBlock = l2BlockContexts[l2BlockContexts.length - 1].block.number;
|
|
120
129
|
await this.db.setSynchedBlockNumberForPublicKey(this.publicKey, syncedToBlock);
|
|
121
130
|
this.log(`Synched block ${syncedToBlock}`);
|
|
122
131
|
}
|
|
123
|
-
/**
|
|
124
|
-
* Find the index of the note in the note hash tree by computing the note hash with different nonce and see which
|
|
125
|
-
* commitment for the current tx matches this value.
|
|
126
|
-
* Compute a nullifier for a given l1NotePayload.
|
|
127
|
-
* The nullifier is calculated using the private key of the account,
|
|
128
|
-
* contract address, and the note associated with the l1NotePayload.
|
|
129
|
-
* This method assists in identifying spent commitments in the private state.
|
|
130
|
-
* @param commitments - Commitments in the tx. One of them should be the note's commitment.
|
|
131
|
-
* @param firstNullifier - First nullifier in the tx.
|
|
132
|
-
* @param l1NotePayload - An instance of l1NotePayload.
|
|
133
|
-
* @param excludedIndices - Indices that have been assigned a note in the same tx. Notes in a tx can have the same
|
|
134
|
-
* l1NotePayload. We need to find a different index for each replicate.
|
|
135
|
-
* @returns Information for a decrypted note, including the index of its commitment, nonce, inner note
|
|
136
|
-
* hash, and the siloed nullifier. Throw if cannot find the nonce for the note.
|
|
137
|
-
*/
|
|
138
|
-
async findNoteIndexAndNullifier(commitments, firstNullifier, { contractAddress, storageSlot, note }, excludedIndices) {
|
|
139
|
-
let commitmentIndex = 0;
|
|
140
|
-
let nonce;
|
|
141
|
-
let innerNoteHash;
|
|
142
|
-
let siloedNoteHash;
|
|
143
|
-
let uniqueSiloedNoteHash;
|
|
144
|
-
let innerNullifier;
|
|
145
|
-
for (; commitmentIndex < commitments.length; ++commitmentIndex) {
|
|
146
|
-
if (excludedIndices.has(commitmentIndex)) {
|
|
147
|
-
continue;
|
|
148
|
-
}
|
|
149
|
-
const commitment = commitments[commitmentIndex];
|
|
150
|
-
if (commitment.equals(Fr.ZERO)) {
|
|
151
|
-
break;
|
|
152
|
-
}
|
|
153
|
-
const expectedNonce = computeCommitmentNonce(firstNullifier, commitmentIndex);
|
|
154
|
-
({ innerNoteHash, siloedNoteHash, uniqueSiloedNoteHash, innerNullifier } =
|
|
155
|
-
await this.simulator.computeNoteHashAndNullifier(contractAddress, expectedNonce, storageSlot, note));
|
|
156
|
-
if (commitment.equals(uniqueSiloedNoteHash)) {
|
|
157
|
-
nonce = expectedNonce;
|
|
158
|
-
break;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
if (!nonce) {
|
|
162
|
-
let errorString;
|
|
163
|
-
if (siloedNoteHash == undefined) {
|
|
164
|
-
errorString = 'Cannot find a matching commitment for the note.';
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
errorString = `We decrypted a log, but couldn't find a corresponding note in the tree.
|
|
168
|
-
This might be because the note was nullified in the same tx which created it.
|
|
169
|
-
In that case, everything is fine. To check whether this is the case, look back through
|
|
170
|
-
the logs for a notification
|
|
171
|
-
'important: chopped commitment for siloed inner hash note
|
|
172
|
-
${siloedNoteHash.toString()}'.
|
|
173
|
-
If you can see that notification. Everything's fine.
|
|
174
|
-
If that's not the case, and you can't find such a notification, something has gone wrong.
|
|
175
|
-
There could be a problem with the way you've defined a custom note, or with the way you're
|
|
176
|
-
serializing / deserializing / hashing / encrypting / decrypting that note.
|
|
177
|
-
Please see the following github issue to track an improvement that we're working on:
|
|
178
|
-
https://github.com/AztecProtocol/aztec-packages/issues/1641`;
|
|
179
|
-
}
|
|
180
|
-
throw new Error(errorString);
|
|
181
|
-
}
|
|
182
|
-
return {
|
|
183
|
-
commitmentIndex,
|
|
184
|
-
nonce,
|
|
185
|
-
innerNoteHash: innerNoteHash,
|
|
186
|
-
siloedNullifier: siloNullifier(contractAddress, innerNullifier),
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
132
|
/**
|
|
190
133
|
* Process the given blocks and their associated transaction auxiliary data.
|
|
191
134
|
* This function updates the database with information about new transactions,
|
|
@@ -209,5 +152,45 @@ https://github.com/AztecProtocol/aztec-packages/issues/1641`;
|
|
|
209
152
|
this.log(`Removed note for contract ${noteDao.contractAddress} at slot ${noteDao.storageSlot} with nullifier ${noteDao.siloedNullifier.toString()}`);
|
|
210
153
|
});
|
|
211
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* Store the given deferred notes in the database for later decoding.
|
|
157
|
+
*
|
|
158
|
+
* @param deferredNoteDaos - notes that are intended for us but we couldn't process because the contract was not found.
|
|
159
|
+
*/
|
|
160
|
+
async processDeferredNotes(deferredNoteDaos) {
|
|
161
|
+
if (deferredNoteDaos.length) {
|
|
162
|
+
await this.db.addDeferredNotes(deferredNoteDaos);
|
|
163
|
+
deferredNoteDaos.forEach(noteDao => {
|
|
164
|
+
this.log(`Deferred note for contract ${noteDao.contractAddress} at slot ${noteDao.storageSlot} in tx ${noteDao.txHash.toString()}`);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Retry decoding the given deferred notes because we now have the contract code.
|
|
170
|
+
*
|
|
171
|
+
* @param deferredNoteDaos - notes that we have previously deferred because the contract was not found
|
|
172
|
+
* @returns An array of NoteDaos that were successfully decoded.
|
|
173
|
+
*
|
|
174
|
+
* @remarks Caller is responsible for making sure that we have the contract for the
|
|
175
|
+
* deferred notes provided: we will not retry notes that fail again.
|
|
176
|
+
*/
|
|
177
|
+
async decodeDeferredNotes(deferredNoteDaos) {
|
|
178
|
+
const excludedIndices = new Set();
|
|
179
|
+
const noteDaos = [];
|
|
180
|
+
for (const deferredNote of deferredNoteDaos) {
|
|
181
|
+
const { note, contractAddress, storageSlot, txHash, newCommitments, dataStartIndexForTx } = deferredNote;
|
|
182
|
+
const payload = new L1NotePayload(note, contractAddress, storageSlot);
|
|
183
|
+
try {
|
|
184
|
+
const noteDao = await produceNoteDao(this.simulator, this.publicKey, payload, txHash, newCommitments, dataStartIndexForTx, excludedIndices);
|
|
185
|
+
noteDaos.push(noteDao);
|
|
186
|
+
this.stats.decrypted++;
|
|
187
|
+
}
|
|
188
|
+
catch (e) {
|
|
189
|
+
this.stats.failed++;
|
|
190
|
+
this.log.warn(`Could not process deferred note because of "${e}". Discarding note...`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return noteDaos;
|
|
194
|
+
}
|
|
212
195
|
}
|
|
213
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZV9wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbm90ZV9wcm9jZXNzb3Ivbm90ZV9wcm9jZXNzb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUVMLG9CQUFvQixFQUVwQixhQUFhLEdBR2QsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQUUsMEJBQTBCLEVBQWEsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUduRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFnQnZEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBT3hCO0lBQ0U7O09BRUc7SUFDYSxTQUFvQixFQUM1QixRQUFrQixFQUNsQixFQUFlLEVBQ2YsSUFBZSxFQUNmLGdCQUF3QixvQkFBb0IsRUFDNUMsWUFBWSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxFQUNoRCxNQUFNLGlCQUFpQixDQUFDLHNCQUFzQixDQUFDO1FBTnZDLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDNUIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsU0FBSSxHQUFKLElBQUksQ0FBVztRQUNmLGtCQUFhLEdBQWIsYUFBYSxDQUErQjtRQUM1QyxjQUFTLEdBQVQsU0FBUyxDQUF1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
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AcirSimulator } from '@aztec/acir-simulator';
|
|
2
|
+
import { L1NotePayload, TxHash } from '@aztec/circuit-types';
|
|
3
|
+
import { Fr, PublicKey } from '@aztec/circuits.js';
|
|
4
|
+
import { NoteDao } from '../database/note_dao.js';
|
|
5
|
+
/**
|
|
6
|
+
* Decodes a note from a transaction that we know was intended for us.
|
|
7
|
+
* Throws if we do not yet have the contract corresponding to the note in our database.
|
|
8
|
+
* Accepts a set of excluded indices, which are indices that have been assigned a note in the same tx.
|
|
9
|
+
* Inserts the index of the note into the excludedIndices set if the note is successfully decoded.
|
|
10
|
+
*
|
|
11
|
+
* @param publicKey - The public counterpart to the private key to be used in note decryption.
|
|
12
|
+
* @param payload - An instance of l1NotePayload.
|
|
13
|
+
* @param txHash - The hash of the transaction that created the note. Equivalent to the first nullifier of the transaction.
|
|
14
|
+
* @param newCommitments - New commitments in this transaction, one of which belongs to this note.
|
|
15
|
+
* @param dataStartIndexForTx - The next available leaf index for the note hash tree for this transaction.
|
|
16
|
+
* @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.
|
|
17
|
+
* @param simulator - An instance of AcirSimulator.
|
|
18
|
+
* @returns an instance of NoteDao, or throws. inserts the index of the note into the excludedIndices set.
|
|
19
|
+
*/
|
|
20
|
+
export declare function produceNoteDao(simulator: AcirSimulator, publicKey: PublicKey, payload: L1NotePayload, txHash: TxHash, newCommitments: Fr[], dataStartIndexForTx: number, excludedIndices: Set<number>): Promise<NoteDao>;
|
|
21
|
+
//# sourceMappingURL=produce_note_dao.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"produce_note_dao.d.ts","sourceRoot":"","sources":["../../src/note_processor/produce_note_dao.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,aAAa,EACxB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,EAAE,EAAE,EACpB,mBAAmB,EAAE,MAAM,EAC3B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,GAC3B,OAAO,CAAC,OAAO,CAAC,CAqBlB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { Fr } from '@aztec/circuits.js';
|
|
2
|
+
import { computeCommitmentNonce, siloNullifier } from '@aztec/circuits.js/abis';
|
|
3
|
+
import { NoteDao } from '../database/note_dao.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 publicKey - The public counterpart to the private key to be used in note decryption.
|
|
11
|
+
* @param payload - An instance of l1NotePayload.
|
|
12
|
+
* @param txHash - The hash of the transaction that created the note. Equivalent to the first nullifier of the transaction.
|
|
13
|
+
* @param newCommitments - New commitments in this transaction, one of which belongs to this note.
|
|
14
|
+
* @param dataStartIndexForTx - The next available leaf index for the note hash tree for this transaction.
|
|
15
|
+
* @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.
|
|
16
|
+
* @param simulator - An instance of AcirSimulator.
|
|
17
|
+
* @returns an instance of NoteDao, or throws. inserts the index of the note into the excludedIndices set.
|
|
18
|
+
*/
|
|
19
|
+
export async function produceNoteDao(simulator, publicKey, payload, txHash, newCommitments, dataStartIndexForTx, excludedIndices) {
|
|
20
|
+
const { commitmentIndex, nonce, innerNoteHash, siloedNullifier } = await findNoteIndexAndNullifier(simulator, newCommitments, txHash, payload, excludedIndices);
|
|
21
|
+
const index = BigInt(dataStartIndexForTx + commitmentIndex);
|
|
22
|
+
excludedIndices?.add(commitmentIndex);
|
|
23
|
+
return new NoteDao(payload.note, payload.contractAddress, payload.storageSlot, txHash, nonce, innerNoteHash, siloedNullifier, index, publicKey);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Find the index of the note in the note hash tree by computing the note hash with different nonce and see which
|
|
27
|
+
* commitment for the current tx matches this value.
|
|
28
|
+
* Compute a nullifier for a given l1NotePayload.
|
|
29
|
+
* The nullifier is calculated using the private key of the account,
|
|
30
|
+
* contract address, and the note associated with the l1NotePayload.
|
|
31
|
+
* This method assists in identifying spent commitments in the private state.
|
|
32
|
+
* @param commitments - Commitments in the tx. One of them should be the note's commitment.
|
|
33
|
+
* @param txHash - First nullifier in the tx.
|
|
34
|
+
* @param l1NotePayload - An instance of l1NotePayload.
|
|
35
|
+
* @param excludedIndices - Indices that have been assigned a note in the same tx. Notes in a tx can have the same
|
|
36
|
+
* l1NotePayload. We need to find a different index for each replicate.
|
|
37
|
+
* @returns Information for a decrypted note, including the index of its commitment, nonce, inner note
|
|
38
|
+
* hash, and the siloed nullifier. Throw if cannot find the nonce for the note.
|
|
39
|
+
*/
|
|
40
|
+
async function findNoteIndexAndNullifier(simulator, commitments, txHash, { contractAddress, storageSlot, note }, excludedIndices) {
|
|
41
|
+
let commitmentIndex = 0;
|
|
42
|
+
let nonce;
|
|
43
|
+
let innerNoteHash;
|
|
44
|
+
let siloedNoteHash;
|
|
45
|
+
let uniqueSiloedNoteHash;
|
|
46
|
+
let innerNullifier;
|
|
47
|
+
const firstNullifier = Fr.fromBuffer(txHash.toBuffer());
|
|
48
|
+
for (; commitmentIndex < commitments.length; ++commitmentIndex) {
|
|
49
|
+
if (excludedIndices.has(commitmentIndex)) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const commitment = commitments[commitmentIndex];
|
|
53
|
+
if (commitment.equals(Fr.ZERO)) {
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
const expectedNonce = computeCommitmentNonce(firstNullifier, commitmentIndex);
|
|
57
|
+
({ innerNoteHash, siloedNoteHash, uniqueSiloedNoteHash, innerNullifier } =
|
|
58
|
+
await simulator.computeNoteHashAndNullifier(contractAddress, expectedNonce, storageSlot, note));
|
|
59
|
+
if (commitment.equals(uniqueSiloedNoteHash)) {
|
|
60
|
+
nonce = expectedNonce;
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (!nonce) {
|
|
65
|
+
let errorString;
|
|
66
|
+
if (siloedNoteHash == undefined) {
|
|
67
|
+
errorString = 'Cannot find a matching commitment for the note.';
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
errorString = `We decrypted a log, but couldn't find a corresponding note in the tree.
|
|
71
|
+
This might be because the note was nullified in the same tx which created it.
|
|
72
|
+
In that case, everything is fine. To check whether this is the case, look back through
|
|
73
|
+
the logs for a notification
|
|
74
|
+
'important: chopped commitment for siloed inner hash note
|
|
75
|
+
${siloedNoteHash.toString()}'.
|
|
76
|
+
If you can see that notification. Everything's fine.
|
|
77
|
+
If that's not the case, and you can't find such a notification, something has gone wrong.
|
|
78
|
+
There could be a problem with the way you've defined a custom note, or with the way you're
|
|
79
|
+
serializing / deserializing / hashing / encrypting / decrypting that note.
|
|
80
|
+
Please see the following github issue to track an improvement that we're working on:
|
|
81
|
+
https://github.com/AztecProtocol/aztec-packages/issues/1641`;
|
|
82
|
+
}
|
|
83
|
+
throw new Error(errorString);
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
commitmentIndex,
|
|
87
|
+
nonce,
|
|
88
|
+
innerNoteHash: innerNoteHash,
|
|
89
|
+
siloedNullifier: siloNullifier(contractAddress, innerNullifier),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjZV9ub3RlX2Rhby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ub3RlX3Byb2Nlc3Nvci9wcm9kdWNlX25vdGVfZGFvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxFQUFFLEVBQWEsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWxEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQ2xDLFNBQXdCLEVBQ3hCLFNBQW9CLEVBQ3BCLE9BQXNCLEVBQ3RCLE1BQWMsRUFDZCxjQUFvQixFQUNwQixtQkFBMkIsRUFDM0IsZUFBNEI7SUFFNUIsTUFBTSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxHQUFHLE1BQU0seUJBQXlCLENBQ2hHLFNBQVMsRUFDVCxjQUFjLEVBQ2QsTUFBTSxFQUNOLE9BQU8sRUFDUCxlQUFlLENBQ2hCLENBQUM7SUFDRixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsbUJBQW1CLEdBQUcsZUFBZSxDQUFDLENBQUM7SUFDNUQsZUFBZSxFQUFFLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN0QyxPQUFPLElBQUksT0FBTyxDQUNoQixPQUFPLENBQUMsSUFBSSxFQUNaLE9BQU8sQ0FBQyxlQUFlLEVBQ3ZCLE9BQU8sQ0FBQyxXQUFXLEVBQ25CLE1BQU0sRUFDTixLQUFLLEVBQ0wsYUFBYSxFQUNiLGVBQWUsRUFDZixLQUFLLEVBQ0wsU0FBUyxDQUNWLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxLQUFLLFVBQVUseUJBQXlCLENBQ3RDLFNBQXdCLEVBQ3hCLFdBQWlCLEVBQ2pCLE1BQWMsRUFDZCxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFpQixFQUNyRCxlQUE0QjtJQUU1QixJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFDeEIsSUFBSSxLQUFxQixDQUFDO0lBQzFCLElBQUksYUFBNkIsQ0FBQztJQUNsQyxJQUFJLGNBQThCLENBQUM7SUFDbkMsSUFBSSxvQkFBb0MsQ0FBQztJQUN6QyxJQUFJLGNBQThCLENBQUM7SUFDbkMsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUV4RCxPQUFPLGVBQWUsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLEVBQUUsZUFBZSxFQUFFO1FBQzlELElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUN4QyxTQUFTO1NBQ1Y7UUFFRCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDaEQsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM5QixNQUFNO1NBQ1A7UUFFRCxNQUFNLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDOUUsQ0FBQyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsY0FBYyxFQUFFO1lBQ3RFLE1BQU0sU0FBUyxDQUFDLDJCQUEyQixDQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEVBQUU7WUFDM0MsS0FBSyxHQUFHLGFBQWEsQ0FBQztZQUN0QixNQUFNO1NBQ1A7S0FDRjtJQUVELElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDVixJQUFJLFdBQVcsQ0FBQztRQUNoQixJQUFJLGNBQWMsSUFBSSxTQUFTLEVBQUU7WUFDL0IsV0FBVyxHQUFHLGlEQUFpRCxDQUFDO1NBQ2pFO2FBQU07WUFDTCxXQUFXLEdBQUc7Ozs7O0VBS2xCLGNBQWMsQ0FBQyxRQUFRLEVBQUU7Ozs7Ozs0REFNaUMsQ0FBQztTQUN4RDtRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7S0FDOUI7SUFFRCxPQUFPO1FBQ0wsZUFBZTtRQUNmLEtBQUs7UUFDTCxhQUFhLEVBQUUsYUFBYztRQUM3QixlQUFlLEVBQUUsYUFBYSxDQUFDLGVBQWUsRUFBRSxjQUFlLENBQUM7S0FDakUsQ0FBQztBQUNKLENBQUMifQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import { PXE } from '@aztec/circuit-types';
|
|
2
3
|
import { JsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
3
|
-
import { PXE } from '@aztec/types';
|
|
4
4
|
import http from 'http';
|
|
5
5
|
export declare const localAnvil: {
|
|
6
6
|
readonly id: 31337;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pxe_http_server.d.ts","sourceRoot":"","sources":["../../src/pxe_http/pxe_http_server.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"pxe_http_server.d.ts","sourceRoot":"","sources":["../../src/pxe_http/pxe_http_server.ts"],"names":[],"mappings":";AAAA,OAAO,EAYL,GAAG,EAKJ,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;CAAU,CAAC;AAElC;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,GAAG,GAAG,aAAa,CA2BjE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,CAQtF"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { AuthWitness, CompleteAddress, ContractData, ExtendedContractData, ExtendedNote, ExtendedUnencryptedL2Log, L2Block, L2BlockL2Logs, L2Tx, LogId, Note, Tx, TxExecutionRequest, TxHash, TxReceipt, } from '@aztec/circuit-types';
|
|
1
2
|
import { FunctionSelector } from '@aztec/circuits.js';
|
|
2
3
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
3
4
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
5
|
import { Fr, GrumpkinScalar, Point } from '@aztec/foundation/fields';
|
|
5
6
|
import { JsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
6
|
-
import { AuthWitness, CompleteAddress, ContractData, ExtendedContractData, ExtendedNote, ExtendedUnencryptedL2Log, L2Block, L2BlockL2Logs, L2Tx, LogId, Note, Tx, TxExecutionRequest, TxHash, TxReceipt, } from '@aztec/types';
|
|
7
7
|
import http from 'http';
|
|
8
8
|
import { foundry } from 'viem/chains';
|
|
9
9
|
export const localAnvil = foundry;
|
|
@@ -46,4 +46,4 @@ export function startPXEHttpServer(pxeService, port) {
|
|
|
46
46
|
httpServer.listen(port);
|
|
47
47
|
return httpServer;
|
|
48
48
|
}
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHhlX2h0dHBfc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B4ZV9odHRwL3B4ZV9odHRwX3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGVBQWUsRUFDZixZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLFlBQVksRUFDWix3QkFBd0IsRUFDeEIsT0FBTyxFQUNQLGFBQWEsRUFDYixJQUFJLEVBQ0osS0FBSyxFQUNMLElBQUksRUFFSixFQUFFLEVBQ0Ysa0JBQWtCLEVBQ2xCLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVsRSxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDO0FBRWxDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxVQUFlO0lBQ2hELE9BQU8sSUFBSSxhQUFhLENBQ3RCLFVBQVUsRUFDVjtRQUNFLGVBQWU7UUFDZixZQUFZO1FBQ1osa0JBQWtCO1FBQ2xCLFlBQVk7UUFDWixvQkFBb0I7UUFDcEIsd0JBQXdCO1FBQ3hCLGdCQUFnQjtRQUNoQixNQUFNO1FBQ04sVUFBVTtRQUNWLEtBQUs7UUFDTCxFQUFFO1FBQ0YsY0FBYztRQUNkLElBQUk7UUFDSixZQUFZO1FBQ1osV0FBVztRQUNYLE9BQU87UUFDUCxJQUFJO1FBQ0osS0FBSztLQUNOLEVBQ0QsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxFQUNoQyxLQUFLLEVBQ0wsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQ2xCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsVUFBZSxFQUFFLElBQXFCO0lBQ3ZFLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWpELE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMvQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFeEIsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create_pxe_service.d.ts","sourceRoot":"","sources":["../../src/pxe_service/create_pxe_service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create_pxe_service.d.ts","sourceRoot":"","sources":["../../src/pxe_service/create_pxe_service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAOjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,gBAAgB,EACxB,YAAY,GAAE,MAAM,GAAG,OAAO,GAAG,SAAqB,uBAuBvD"}
|
|
@@ -29,4 +29,4 @@ export async function createPXEService(aztecNode, config, useLogSuffix = undefin
|
|
|
29
29
|
await server.start();
|
|
30
30
|
return server;
|
|
31
31
|
}
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlX3B4ZV9zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B4ZV9zZXJ2aWNlL2NyZWF0ZV9weGVfc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRzVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFOUM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsU0FBb0IsRUFDcEIsTUFBd0IsRUFDeEIsZUFBNkMsU0FBUztJQUV0RCxNQUFNLFNBQVMsR0FDYixPQUFPLFlBQVksS0FBSyxTQUFTO1FBQy9CLENBQUMsQ0FBQyxZQUFZO1lBQ1osQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEMsQ0FBQyxDQUFDLFNBQVM7UUFDYixDQUFDLENBQUMsWUFBWSxDQUFDO0lBRW5CLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDNUYsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNwRyxNQUFNLFdBQVcsR0FBRyxNQUFNLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBRTdELE1BQU0sUUFBUSxHQUFHLElBQUksWUFBWSxDQUMvQixJQUFJLFFBQVEsRUFBRSxFQUNkLE1BQU0sY0FBYyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUNyRSxDQUFDO0lBQ0YsTUFBTSxFQUFFLEdBQUcsSUFBSSxhQUFhLENBQUMsTUFBTSxjQUFjLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUVoRyxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFMUUsTUFBTSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyJ9
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { AuthWitness, AztecNode, ContractData, DeployedContract, ExtendedContractData, ExtendedNote, GetUnencryptedLogsResponse, KeyStore, L2Block, L2Tx, LogFilter, NoteFilter, PXE, Tx, TxExecutionRequest, TxHash, TxReceipt } from '@aztec/circuit-types';
|
|
1
2
|
import { AztecAddress, CompleteAddress, GrumpkinPrivateKey, PartialAddress } from '@aztec/circuits.js';
|
|
2
3
|
import { DecodedReturn } from '@aztec/foundation/abi';
|
|
3
4
|
import { Fr } from '@aztec/foundation/fields';
|
|
4
|
-
import {
|
|
5
|
+
import { NodeInfo } from '@aztec/types/interfaces';
|
|
5
6
|
import { PXEServiceConfig } from '../config/index.js';
|
|
6
7
|
import { PxeDatabase } from '../database/index.js';
|
|
7
8
|
/**
|
|
@@ -17,7 +18,7 @@ export declare class PXEService implements PXE {
|
|
|
17
18
|
private contractDataOracle;
|
|
18
19
|
private simulator;
|
|
19
20
|
private log;
|
|
20
|
-
private
|
|
21
|
+
private nodeVersion;
|
|
21
22
|
private jobQueue;
|
|
22
23
|
constructor(keyStore: KeyStore, node: AztecNode, db: PxeDatabase, config: PXEServiceConfig, logSuffix?: string);
|
|
23
24
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pxe_service.d.ts","sourceRoot":"","sources":["../../src/pxe_service/pxe_service.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"pxe_service.d.ts","sourceRoot":"","sources":["../../src/pxe_service/pxe_service.ts"],"names":[],"mappings":"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"}
|