@aztec/p2p 0.43.0 → 0.45.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.
Files changed (43) hide show
  1. package/dest/client/index.d.ts.map +1 -1
  2. package/dest/client/index.js +5 -7
  3. package/dest/client/p2p_client.d.ts.map +1 -1
  4. package/dest/client/p2p_client.js +2 -3
  5. package/dest/service/discV5_service.d.ts +5 -2
  6. package/dest/service/discV5_service.d.ts.map +1 -1
  7. package/dest/service/discV5_service.js +26 -9
  8. package/dest/service/dummy_service.d.ts +4 -1
  9. package/dest/service/dummy_service.d.ts.map +1 -1
  10. package/dest/service/dummy_service.js +7 -1
  11. package/dest/service/libp2p_service.d.ts +6 -14
  12. package/dest/service/libp2p_service.d.ts.map +1 -1
  13. package/dest/service/libp2p_service.js +49 -91
  14. package/dest/service/peer_manager.d.ts +25 -3
  15. package/dest/service/peer_manager.d.ts.map +1 -1
  16. package/dest/service/peer_manager.js +152 -12
  17. package/dest/service/service.d.ts +12 -6
  18. package/dest/service/service.d.ts.map +1 -1
  19. package/dest/service/service.js +1 -1
  20. package/dest/tx_pool/aztec_kv_tx_pool.d.ts +2 -1
  21. package/dest/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  22. package/dest/tx_pool/aztec_kv_tx_pool.js +11 -6
  23. package/dest/tx_pool/instrumentation.d.ts +23 -0
  24. package/dest/tx_pool/instrumentation.d.ts.map +1 -0
  25. package/dest/tx_pool/instrumentation.js +48 -0
  26. package/dest/tx_pool/memory_tx_pool.d.ts +3 -1
  27. package/dest/tx_pool/memory_tx_pool.d.ts.map +1 -1
  28. package/dest/tx_pool/memory_tx_pool.js +6 -2
  29. package/package.json +15 -6
  30. package/src/client/index.ts +4 -6
  31. package/src/client/p2p_client.ts +1 -2
  32. package/src/service/discV5_service.ts +28 -11
  33. package/src/service/dummy_service.ts +10 -1
  34. package/src/service/libp2p_service.ts +52 -101
  35. package/src/service/peer_manager.ts +187 -12
  36. package/src/service/service.ts +14 -7
  37. package/src/tx_pool/aztec_kv_tx_pool.ts +12 -3
  38. package/src/tx_pool/instrumentation.ts +58 -0
  39. package/src/tx_pool/memory_tx_pool.ts +8 -1
  40. package/dest/service/known_txs.d.ts +0 -31
  41. package/dest/service/known_txs.d.ts.map +0 -1
  42. package/dest/service/known_txs.js +0 -52
  43. package/src/service/known_txs.ts +0 -56
@@ -1,20 +1,17 @@
1
1
  import { SerialQueue } from '@aztec/foundation/fifo';
2
2
  import { createDebugLogger } from '@aztec/foundation/log';
3
- import { AztecLmdbStore } from '@aztec/kv-store/lmdb';
4
- import { ENR } from '@chainsafe/enr';
3
+ import { RunningPromise } from '@aztec/foundation/running-promise';
5
4
  import { gossipsub } from '@chainsafe/libp2p-gossipsub';
6
5
  import { noise } from '@chainsafe/libp2p-noise';
7
6
  import { yamux } from '@chainsafe/libp2p-yamux';
8
7
  import { identify } from '@libp2p/identify';
9
8
  import '@libp2p/kad-dht';
10
9
  import { mplex } from '@libp2p/mplex';
11
- import { peerIdFromString } from '@libp2p/peer-id';
12
10
  import { createFromJSON, createSecp256k1PeerId } from '@libp2p/peer-id-factory';
13
11
  import { tcp } from '@libp2p/tcp';
14
12
  import { createLibp2p } from 'libp2p';
15
13
  import { convertToMultiaddr } from '../util.js';
16
14
  import { AztecDatastore } from './data_store.js';
17
- import { KnownTxLookup } from './known_txs.js';
18
15
  import { PeerManager } from './peer_manager.js';
19
16
  import { AztecTxMessageCreator, fromTxMessage } from './tx_messages.js';
20
17
  /**
@@ -36,16 +33,13 @@ export async function createLibP2PPeerId(privateKey) {
36
33
  * Lib P2P implementation of the P2PService interface.
37
34
  */
38
35
  export class LibP2PService {
39
- constructor(config, node, peerDiscoveryService, protocolId, txPool, bootstrapPeerIds = [], logger = createDebugLogger('aztec:libp2p_service')) {
36
+ constructor(config, node, peerDiscoveryService, txPool, logger = createDebugLogger('aztec:libp2p_service')) {
40
37
  this.config = config;
41
38
  this.node = node;
42
39
  this.peerDiscoveryService = peerDiscoveryService;
43
- this.protocolId = protocolId;
44
40
  this.txPool = txPool;
45
- this.bootstrapPeerIds = bootstrapPeerIds;
46
41
  this.logger = logger;
47
42
  this.jobQueue = new SerialQueue();
48
- this.knownTxLookup = new KnownTxLookup();
49
43
  this.messageCreator = new AztecTxMessageCreator(config.txGossipVersion);
50
44
  this.peerManager = new PeerManager(node, peerDiscoveryService, config, logger);
51
45
  }
@@ -54,9 +48,11 @@ export class LibP2PService {
54
48
  * @returns An empty promise.
55
49
  */
56
50
  async start() {
51
+ // Check if service is already started
57
52
  if (this.node.status === 'started') {
58
53
  throw new Error('P2P service already started');
59
54
  }
55
+ // Log listen & announce addresses
60
56
  const { tcpListenAddress, tcpAnnounceAddress } = this.config;
61
57
  this.logger.info(`Starting P2P node on ${tcpListenAddress}`);
62
58
  if (!tcpAnnounceAddress) {
@@ -64,36 +60,24 @@ export class LibP2PService {
64
60
  }
65
61
  const announceTcpMultiaddr = convertToMultiaddr(tcpAnnounceAddress, 'tcp');
66
62
  this.logger.info(`Announcing at ${announceTcpMultiaddr}`);
67
- // handle discovered peers from external discovery service
68
- this.peerDiscoveryService.on('peer:discovered', async (enr) => {
69
- await this.addPeer(enr);
70
- });
71
- this.node.addEventListener('peer:connect', async (evt) => {
72
- const peerId = evt.detail;
73
- await this.handleNewConnection(peerId);
74
- });
75
- this.node.addEventListener('peer:disconnect', async (evt) => {
76
- const peerId = evt.detail;
77
- if (this.isBootstrapPeer(peerId)) {
78
- this.logger.info(`Disconnect from bootstrap peer ${peerId.toString()}`);
79
- }
80
- else {
81
- this.logger.info(`Disconnected from transaction peer ${peerId.toString()}`);
82
- await this.peerManager.updateDiscoveryService();
83
- }
84
- });
63
+ // Start job queue, peer discovery service and libp2p node
85
64
  this.jobQueue.start();
86
65
  await this.peerDiscoveryService.start();
87
66
  await this.node.start();
88
67
  this.logger.info(`Started P2P client with Peer ID ${this.node.peerId.toString()}`);
89
- // Subscribe to standard topics by default
68
+ // Subscribe to standard GossipSub topics by default
90
69
  this.subscribeToTopic(this.messageCreator.getTopic());
91
- // add gossipsub listener
70
+ // add GossipSub listener
92
71
  this.node.services.pubsub.addEventListener('gossipsub:message', async (e) => {
93
72
  const { msg } = e.detail;
94
73
  this.logger.debug(`Received PUBSUB message.`);
95
74
  await this.jobQueue.put(() => this.handleNewGossipMessage(msg.topic, msg.data));
96
75
  });
76
+ // Start running promise for peer discovery
77
+ this.discoveryRunningPromise = new RunningPromise(() => {
78
+ this.peerManager.discover();
79
+ }, this.config.p2pPeerCheckIntervalMS);
80
+ this.discoveryRunningPromise.start();
97
81
  }
98
82
  /**
99
83
  * Stops the LibP2P service.
@@ -102,8 +86,12 @@ export class LibP2PService {
102
86
  async stop() {
103
87
  this.logger.debug('Stopping job queue...');
104
88
  await this.jobQueue.end();
89
+ this.logger.debug('Stopping running promise...');
90
+ await this.discoveryRunningPromise?.stop();
91
+ this.logger.debug('Stopping peer discovery service...');
92
+ await this.peerDiscoveryService.stop();
105
93
  this.logger.debug('Stopping LibP2P...');
106
- await this.node.stop();
94
+ await this.stopLibP2P();
107
95
  this.logger.info('LibP2P service stopped');
108
96
  }
109
97
  /**
@@ -112,10 +100,12 @@ export class LibP2PService {
112
100
  * @param txPool - The transaction pool to be accessed by the service.
113
101
  * @returns The new service.
114
102
  */
115
- static async new(config, peerDiscoveryService, peerId, txPool) {
116
- const { tcpListenAddress, minPeerCount, maxPeerCount, transactionProtocol: protocolId } = config;
103
+ static async new(config, peerDiscoveryService, peerId, txPool, store) {
104
+ const { tcpListenAddress, tcpAnnounceAddress, minPeerCount, maxPeerCount } = config;
117
105
  const bindAddrTcp = convertToMultiaddr(tcpListenAddress, 'tcp');
118
- const datastore = new AztecDatastore(AztecLmdbStore.open());
106
+ // We know tcpAnnounceAddress cannot be null here because we set it or throw when setting up the service.
107
+ const announceAddrTcp = convertToMultiaddr(tcpAnnounceAddress, 'tcp');
108
+ const datastore = new AztecDatastore(store);
119
109
  // The autonat service seems quite problematic in that using it seems to cause a lot of attempts
120
110
  // to dial ephemeral ports. I suspect that it works better if you can get the uPNPnat service to
121
111
  // work as then you would have a permanent port to be dialled.
@@ -134,10 +124,19 @@ export class LibP2PService {
134
124
  peerId,
135
125
  addresses: {
136
126
  listen: [bindAddrTcp],
127
+ announce: [announceAddrTcp],
137
128
  },
138
129
  transports: [
139
130
  tcp({
140
131
  maxConnections: config.maxPeerCount,
132
+ // socket option: the maximum length of the queue of pending connections
133
+ // https://nodejs.org/dist/latest-v18.x/docs/api/net.html#serverlisten
134
+ // it's not safe if we increase this number
135
+ backlog: 5,
136
+ closeServerOnMaxConnections: {
137
+ closeAbove: maxPeerCount ?? Infinity,
138
+ listenBelow: maxPeerCount ?? Infinity,
139
+ },
141
140
  }),
142
141
  ],
143
142
  datastore,
@@ -162,12 +161,7 @@ export class LibP2PService {
162
161
  }),
163
162
  },
164
163
  });
165
- // extract bootstrap node peer IDs
166
- let bootstrapPeerIds = [];
167
- if (config.bootstrapNodes.length) {
168
- bootstrapPeerIds = await Promise.all(config.bootstrapNodes.map(bootnodeEnr => ENR.decodeTxt(bootnodeEnr).peerId()));
169
- }
170
- return new LibP2PService(config, node, peerDiscoveryService, protocolId, txPool, bootstrapPeerIds);
164
+ return new LibP2PService(config, node, peerDiscoveryService, txPool);
171
165
  }
172
166
  /**
173
167
  * Subscribes to a topic.
@@ -212,67 +206,31 @@ export class LibP2PService {
212
206
  propagateTx(tx) {
213
207
  void this.jobQueue.put(() => Promise.resolve(this.sendTxToPeers(tx)));
214
208
  }
215
- /**
216
- * Handles the settling of a new batch of transactions.
217
- * @param txHashes - The hashes of the newly settled transactions.
218
- */
219
- settledTxs(txHashes) {
220
- this.knownTxLookup.handleSettledTxs(txHashes.map(x => x.toString()));
221
- }
222
- async addPeer(enr) {
223
- const peerMultiAddr = await enr.getFullMultiaddr('tcp');
224
- if (!peerMultiAddr) {
225
- // No TCP address, can't connect
226
- return;
227
- }
228
- const peerIdStr = peerMultiAddr.getPeerId();
229
- if (!peerIdStr) {
230
- this.logger.debug(`Peer ID not found in discovered node's multiaddr: ${peerMultiAddr}`);
231
- return;
232
- }
233
- // check if peer is already known
234
- const peerId = peerIdFromString(peerIdStr);
235
- const hasPeer = await this.node.peerStore.has(peerId);
236
- // add to peer store if not already known
237
- if (!hasPeer) {
238
- this.logger.info(`Discovered peer ${peerIdStr}. Adding to libp2p peer list`);
239
- let stream;
240
- try {
241
- stream = await this.node.dialProtocol(peerMultiAddr, this.protocolId);
242
- }
243
- catch (err) {
244
- this.logger.debug(`Failed to dial peer ${peerIdStr}: ${err}`);
245
- }
246
- finally {
247
- if (stream) {
248
- await stream.close();
249
- }
250
- }
251
- }
252
- }
253
- async handleNewConnection(peerId) {
254
- if (this.isBootstrapPeer(peerId)) {
255
- this.logger.info(`Connected to bootstrap peer ${peerId.toString()}`);
256
- }
257
- else {
258
- this.logger.info(`Connected to transaction peer ${peerId.toString()}`);
259
- await this.peerManager.updateDiscoveryService();
260
- }
261
- }
262
209
  async processTxFromPeer(tx) {
263
210
  const txHash = tx.getTxHash();
264
211
  const txHashString = txHash.toString();
265
- this.logger.debug(`Received tx ${txHashString} from external peer.`);
212
+ this.logger.verbose(`Received tx ${txHashString} from external peer.`);
266
213
  await this.txPool.addTxs([tx]);
267
214
  }
268
215
  async sendTxToPeers(tx) {
269
216
  const { data: txData } = this.messageCreator.createTxMessage(tx);
270
- this.logger.debug(`Sending tx ${tx.getTxHash().toString()} to peers`);
217
+ this.logger.verbose(`Sending tx ${tx.getTxHash().toString()} to peers`);
271
218
  const recipientsNum = await this.publishToTopic(this.messageCreator.getTopic(), txData);
272
- this.logger.debug(`Sent tx ${tx.getTxHash().toString()} to ${recipientsNum} peers`);
219
+ this.logger.verbose(`Sent tx ${tx.getTxHash().toString()} to ${recipientsNum} peers`);
273
220
  }
274
- isBootstrapPeer(peer) {
275
- return this.bootstrapPeerIds.some(bootstrapPeer => bootstrapPeer.equals(peer));
221
+ // Libp2p seems to hang sometimes if new peers are initiating connections.
222
+ async stopLibP2P() {
223
+ const TIMEOUT_MS = 5000; // 5 seconds timeout
224
+ const timeout = new Promise((resolve, reject) => {
225
+ setTimeout(() => reject(new Error('Timeout during libp2p.stop()')), TIMEOUT_MS);
226
+ });
227
+ try {
228
+ await Promise.race([this.node.stop(), timeout]);
229
+ this.logger.debug('Libp2p stopped');
230
+ }
231
+ catch (error) {
232
+ this.logger.error('Error during stop or timeout:', error);
233
+ }
276
234
  }
277
235
  }
278
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicDJwX3NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZS9saWJwMnBfc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXRELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQXdCLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBSW5ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFReEU7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCLENBQUMsVUFBbUI7SUFDMUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN4QixPQUFPLE1BQU0scUJBQXFCLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sTUFBTSxjQUFjLENBQUM7UUFDMUIsRUFBRSxFQUFFLEVBQUU7UUFDTixPQUFPLEVBQUUsTUFBTTtLQUNoQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQUt4QixZQUNVLE1BQWlCLEVBQ2pCLElBQWtCLEVBQ2xCLG9CQUEwQyxFQUMxQyxVQUFrQixFQUNsQixNQUFjLEVBQ2QsbUJBQTZCLEVBQUUsRUFDL0IsU0FBUyxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQztRQU5sRCxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLFNBQUksR0FBSixJQUFJLENBQWM7UUFDbEIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyxlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWU7UUFDL0IsV0FBTSxHQUFOLE1BQU0sQ0FBNEM7UUFYcEQsYUFBUSxHQUFnQixJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzFDLGtCQUFhLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7UUFZekQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzdELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFFN0QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRCxNQUFNLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTNFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDMUQsMERBQTBEO1FBQzFELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLEdBQVEsRUFBRSxFQUFFO1lBQ2pFLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBQyxHQUFHLEVBQUMsRUFBRTtZQUNyRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQWdCLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxFQUFDLEdBQUcsRUFBQyxFQUFFO1lBQ3hELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDMUIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDNUUsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDbEQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVuRiwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUV0RCx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLEtBQUssRUFBQyxDQUFDLEVBQUMsRUFBRTtZQUN4RSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBRTlDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLElBQUk7UUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUNyQixNQUFpQixFQUNqQixvQkFBMEMsRUFDMUMsTUFBYyxFQUNkLE1BQWM7UUFFZCxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFDakcsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFaEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFNUQsZ0dBQWdHO1FBQ2hHLGdHQUFnRztRQUNoRyw4REFBOEQ7UUFDOUQsNEZBQTRGO1FBQzVGLGtFQUFrRTtRQUNsRSx1RkFBdUY7UUFDdkYsK0JBQStCO1FBQy9CLG1CQUFtQjtRQUNuQix3Q0FBd0M7UUFDeEMsK0JBQStCO1FBQy9CLFFBQVE7UUFDUix5Q0FBeUM7UUFDekMsSUFBSTtRQUVKLE1BQU0sSUFBSSxHQUFHLE1BQU0sWUFBWSxDQUFDO1lBQzlCLEtBQUssRUFBRSxLQUFLO1lBQ1osTUFBTTtZQUNOLFNBQVMsRUFBRTtnQkFDVCxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUM7YUFDdEI7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsR0FBRyxDQUFDO29CQUNGLGNBQWMsRUFBRSxNQUFNLENBQUMsWUFBWTtpQkFDcEMsQ0FBQzthQUNIO1lBQ0QsU0FBUztZQUNULFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2hDLG9CQUFvQixFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDL0IsaUJBQWlCLEVBQUU7Z0JBQ2pCLGNBQWMsRUFBRSxZQUFZO2dCQUM1QixjQUFjLEVBQUUsWUFBWTthQUM3QjtZQUNELFFBQVEsRUFBRTtnQkFDUixRQUFRLEVBQUUsUUFBUSxDQUFDO29CQUNqQixjQUFjLEVBQUUsT0FBTztpQkFDeEIsQ0FBQztnQkFDRixNQUFNLEVBQUUsU0FBUyxDQUFDO29CQUNoQiw0QkFBNEIsRUFBRSxJQUFJO29CQUNsQyxDQUFDLEVBQUUsQ0FBQztvQkFDSixHQUFHLEVBQUUsQ0FBQztvQkFDTixHQUFHLEVBQUUsRUFBRTtvQkFDUCxpQkFBaUIsRUFBRSxJQUFLO29CQUN4QixZQUFZLEVBQUUsQ0FBQztvQkFDZixZQUFZLEVBQUUsQ0FBQztpQkFDaEIsQ0FBQzthQUNIO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsa0NBQWtDO1FBQ2xDLElBQUksZ0JBQWdCLEdBQWEsRUFBRSxDQUFDO1FBQ3BDLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQyxnQkFBZ0IsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2xDLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUM5RSxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDckcsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGdCQUFnQixDQUFDLEtBQWE7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBYSxFQUFFLElBQWdCO1FBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFcEUsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxLQUFhLEVBQUUsSUFBZ0I7UUFDbEUsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQzdDLDJCQUEyQjtZQUMzQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDNUMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFdBQVcsQ0FBQyxFQUFNO1FBQ3ZCLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksVUFBVSxDQUFDLFFBQWtCO1FBQ2xDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBUTtRQUM1QixNQUFNLGFBQWEsR0FBRyxNQUFNLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsZ0NBQWdDO1lBQ2hDLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRTVDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ3hGLE9BQU87UUFDVCxDQUFDO1FBRUQsaUNBQWlDO1FBQ2pDLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXRELHlDQUF5QztRQUN6QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsU0FBUyw4QkFBOEIsQ0FBQyxDQUFDO1lBQzdFLElBQUksTUFBMEIsQ0FBQztZQUMvQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN4RSxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsU0FBUyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDaEUsQ0FBQztvQkFBUyxDQUFDO2dCQUNULElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ1gsTUFBTSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsTUFBYztRQUM5QyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywrQkFBK0IsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2RSxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ2xELENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQU07UUFDcEMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLFlBQVksc0JBQXNCLENBQUMsQ0FBQztRQUNyRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFNO1FBQ2hDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsRUFBRSxPQUFPLGFBQWEsUUFBUSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVPLGVBQWUsQ0FBQyxJQUFZO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRixDQUFDO0NBQ0YifQ==
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicDJwX3NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZS9saWJwMnBfc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBR25FLE9BQU8sRUFBd0IsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsT0FBTyxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sRUFBZSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFJbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBT3hFOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUFDLFVBQW1CO0lBQzFELElBQUksQ0FBQyxVQUFVLEVBQUUs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
@@ -1,12 +1,34 @@
1
+ import { type ENR } from '@chainsafe/enr';
2
+ import { type PeerId } from '@libp2p/interface';
3
+ import { type Multiaddr } from '@multiformats/multiaddr';
1
4
  import { type Libp2p } from 'libp2p';
2
5
  import { type P2PConfig } from '../config.js';
3
6
  import { type PeerDiscoveryService } from './service.js';
7
+ type CachedPeer = {
8
+ peerId: PeerId;
9
+ enr: ENR;
10
+ multiaddrTcp: Multiaddr;
11
+ dialAttempts: number;
12
+ };
4
13
  export declare class PeerManager {
5
14
  private libP2PNode;
6
- private discV5Node;
15
+ private peerDiscoveryService;
7
16
  private config;
8
17
  private logger;
9
- constructor(libP2PNode: Libp2p, discV5Node: PeerDiscoveryService, config: P2PConfig, logger?: import("@aztec/foundation/log").Logger);
10
- updateDiscoveryService(): Promise<void>;
18
+ private cachedPeers;
19
+ constructor(libP2PNode: Libp2p, peerDiscoveryService: PeerDiscoveryService, config: P2PConfig, logger?: import("@aztec/foundation/log").Logger);
20
+ /**
21
+ * Discovers peers.
22
+ */
23
+ discover(): void;
24
+ /**
25
+ * Handles a discovered peer.
26
+ * @param enr - The discovered peer's ENR.
27
+ */
28
+ private handleDiscoveredPeer;
29
+ dialPeer(peer: CachedPeer): Promise<void>;
30
+ private shouldDialPeer;
31
+ private pruneCachedPeers;
11
32
  }
33
+ export {};
12
34
  //# sourceMappingURL=peer_manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../src/service/peer_manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,oBAAoB,EAAsB,MAAM,cAAc,CAAC;AAE7E,qBAAa,WAAW;IAEpB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;gBAHN,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,oBAAoB,EAChC,MAAM,EAAE,SAAS,EACjB,MAAM,yCAA8C;IAGxD,sBAAsB;CAU7B"}
1
+ {"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../src/service/peer_manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAKzD,KAAK,UAAU,GAAG;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,GAAG,CAAC;IACT,YAAY,EAAE,SAAS,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,qBAAa,WAAW;IAGpB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IALhB,OAAO,CAAC,WAAW,CAAsC;gBAE/C,UAAU,EAAE,MAAM,EAClB,oBAAoB,EAAE,oBAAoB,EAC1C,MAAM,EAAE,SAAS,EACjB,MAAM,yCAA8C;IA4B9D;;OAEG;IACI,QAAQ;IAkDf;;;OAGG;YACW,oBAAoB;IA8C5B,QAAQ,CAAC,IAAI,EAAE,UAAU;IAkB/B,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,gBAAgB;CAezB"}
@@ -1,22 +1,162 @@
1
1
  import { createDebugLogger } from '@aztec/foundation/log';
2
- import { PeerDiscoveryState } from './service.js';
2
+ const MAX_DIAL_ATTEMPTS = 3;
3
+ const MAX_CACHED_PEERS = 100;
3
4
  export class PeerManager {
4
- constructor(libP2PNode, discV5Node, config, logger = createDebugLogger('aztec:p2p:peer_manager')) {
5
+ constructor(libP2PNode, peerDiscoveryService, config, logger = createDebugLogger('aztec:p2p:peer_manager')) {
5
6
  this.libP2PNode = libP2PNode;
6
- this.discV5Node = discV5Node;
7
+ this.peerDiscoveryService = peerDiscoveryService;
7
8
  this.config = config;
8
9
  this.logger = logger;
10
+ this.cachedPeers = new Map();
11
+ // Handle new established connections
12
+ this.libP2PNode.addEventListener('peer:connect', evt => {
13
+ const peerId = evt.detail;
14
+ if (this.peerDiscoveryService.isBootstrapPeer(peerId)) {
15
+ this.logger.debug(`Connected to bootstrap peer ${peerId.toString()}`);
16
+ }
17
+ else {
18
+ this.logger.debug(`Connected to transaction peer ${peerId.toString()}`);
19
+ }
20
+ });
21
+ // Handle lost connections
22
+ this.libP2PNode.addEventListener('peer:disconnect', evt => {
23
+ const peerId = evt.detail;
24
+ if (this.peerDiscoveryService.isBootstrapPeer(peerId)) {
25
+ this.logger.debug(`Disconnected from bootstrap peer ${peerId.toString()}`);
26
+ }
27
+ else {
28
+ this.logger.debug(`Disconnected from transaction peer ${peerId.toString()}`);
29
+ }
30
+ });
31
+ // Handle Discovered peers
32
+ this.peerDiscoveryService.on('peer:discovered', async (enr) => {
33
+ await this.handleDiscoveredPeer(enr);
34
+ });
9
35
  }
10
- async updateDiscoveryService() {
11
- const peerCount = this.libP2PNode.getPeers().length;
12
- if (peerCount >= this.config.maxPeerCount && this.discV5Node.getStatus() === PeerDiscoveryState.RUNNING) {
13
- this.logger.debug('Max peer count reached, stopping discovery service');
14
- await this.discV5Node.stop();
36
+ /**
37
+ * Discovers peers.
38
+ */
39
+ discover() {
40
+ // Get current connections
41
+ const connections = this.libP2PNode.getConnections();
42
+ // Calculate how many connections we're looking to make
43
+ const peersToConnect = this.config.maxPeerCount - connections.length;
44
+ this.logger.debug(`Connections: ${connections.length}, Peers to connect: ${peersToConnect}, maxPeerCount: ${this.config.maxPeerCount}, cachedPeers: ${this.cachedPeers.size}`);
45
+ // Exit if no peers to connect
46
+ if (peersToConnect <= 0) {
47
+ return;
15
48
  }
16
- else if (peerCount <= this.config.minPeerCount && this.discV5Node.getStatus() === PeerDiscoveryState.STOPPED) {
17
- this.logger.debug('Min peer count reached, starting discovery service');
18
- await this.discV5Node.start();
49
+ const cachedPeersToDial = [];
50
+ const pendingDials = new Set(this.libP2PNode
51
+ .getDialQueue()
52
+ .map(pendingDial => pendingDial.peerId?.toString())
53
+ .filter(Boolean));
54
+ for (const [id, peerData] of this.cachedPeers.entries()) {
55
+ // if already dialling or connected to, remove from cache
56
+ if (pendingDials.has(id) || connections.some(conn => conn.remotePeer.equals(peerData.peerId))) {
57
+ this.cachedPeers.delete(id);
58
+ }
59
+ else {
60
+ // cachedPeersToDial.set(id, enr);
61
+ cachedPeersToDial.push(peerData);
62
+ }
63
+ }
64
+ // reverse to dial older entries first
65
+ cachedPeersToDial.reverse();
66
+ for (const peer of cachedPeersToDial) {
67
+ this.cachedPeers.delete(peer.peerId.toString());
68
+ void this.dialPeer(peer);
69
+ }
70
+ // if we need more peers, start randomNodesQuery
71
+ if (peersToConnect > 0) {
72
+ this.logger.debug('Running random nodes query');
73
+ void this.peerDiscoveryService.runRandomNodesQuery();
74
+ }
75
+ }
76
+ /**
77
+ * Handles a discovered peer.
78
+ * @param enr - The discovered peer's ENR.
79
+ */
80
+ async handleDiscoveredPeer(enr) {
81
+ // TODO: Will be handling peer scoring here
82
+ // check if peer is already connected
83
+ const [peerId, multiaddrTcp] = await Promise.all([enr.peerId(), enr.getFullMultiaddr('tcp')]);
84
+ this.logger.debug(`Handling discovered peer ${peerId.toString()}, ${multiaddrTcp?.toString()}`);
85
+ // throw if no tcp addr in multiaddr
86
+ if (!multiaddrTcp) {
87
+ this.logger.debug(`No TCP address in discovered node's multiaddr: ${enr.toString()}`);
88
+ return;
89
+ }
90
+ const connections = this.libP2PNode.getConnections();
91
+ if (connections.some(conn => conn.remotePeer.equals(peerId))) {
92
+ this.logger.debug(`Already connected to peer ${peerId.toString()}`);
93
+ return;
94
+ }
95
+ // check if peer is already in cache
96
+ const id = peerId.toString();
97
+ if (this.cachedPeers.has(id)) {
98
+ this.logger.debug(`Already in cache ${id}`);
99
+ return;
100
+ }
101
+ // create cached peer object
102
+ const cachedPeer = {
103
+ peerId,
104
+ enr,
105
+ multiaddrTcp,
106
+ dialAttempts: 0,
107
+ };
108
+ // Determine if we should dial immediately or not
109
+ if (this.shouldDialPeer()) {
110
+ this.logger.debug(`Dialing peer ${id}`);
111
+ void this.dialPeer(cachedPeer);
112
+ }
113
+ else {
114
+ this.logger.debug(`Caching peer ${id}`);
115
+ this.cachedPeers.set(id, cachedPeer);
116
+ // Prune set of cached peers
117
+ this.pruneCachedPeers();
118
+ }
119
+ }
120
+ async dialPeer(peer) {
121
+ const id = peer.peerId.toString();
122
+ await this.libP2PNode.peerStore.merge(peer.peerId, { multiaddrs: [peer.multiaddrTcp] });
123
+ this.logger.debug(`Dialing peer ${id}`);
124
+ try {
125
+ await this.libP2PNode.dial(peer.multiaddrTcp);
126
+ }
127
+ catch {
128
+ this.logger.debug(`Failed to dial peer ${id}`);
129
+ peer.dialAttempts++;
130
+ if (peer.dialAttempts < MAX_DIAL_ATTEMPTS) {
131
+ this.cachedPeers.set(id, peer);
132
+ }
133
+ else {
134
+ this.cachedPeers.delete(id);
135
+ }
136
+ }
137
+ }
138
+ shouldDialPeer() {
139
+ const connections = this.libP2PNode.getConnections().length;
140
+ this.logger.debug(`Connections: ${connections}, maxPeerCount: ${this.config.maxPeerCount}`);
141
+ if (connections >= this.config.maxPeerCount) {
142
+ this.logger.debug('Not dialing peer, maxPeerCount reached');
143
+ return false;
144
+ }
145
+ return true;
146
+ }
147
+ pruneCachedPeers() {
148
+ let peersToDelete = this.cachedPeers.size - MAX_CACHED_PEERS;
149
+ if (peersToDelete <= 0) {
150
+ return;
151
+ }
152
+ // Remove the oldest peers
153
+ for (const key of this.cachedPeers.keys()) {
154
+ this.cachedPeers.delete(key);
155
+ peersToDelete--;
156
+ if (peersToDelete <= 0) {
157
+ break;
158
+ }
19
159
  }
20
160
  }
21
161
  }
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2UvcGVlcl9tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSzFELE9BQU8sRUFBNkIsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0UsTUFBTSxPQUFPLFdBQVc7SUFDdEIsWUFDVSxVQUFrQixFQUNsQixVQUFnQyxFQUNoQyxNQUFpQixFQUNqQixTQUFTLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDO1FBSHBELGVBQVUsR0FBVixVQUFVLENBQVE7UUFDbEIsZUFBVSxHQUFWLFVBQVUsQ0FBc0I7UUFDaEMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixXQUFNLEdBQU4sTUFBTSxDQUE4QztJQUMzRCxDQUFDO0lBRUosS0FBSyxDQUFDLHNCQUFzQjtRQUMxQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNwRCxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxLQUFLLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7WUFDeEUsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9CLENBQUM7YUFBTSxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxLQUFLLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQy9HLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7WUFDeEUsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2UvcGVlcl9tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBVTFELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0FBUzdCLE1BQU0sT0FBTyxXQUFXO0lBRXRCLFlBQ1UsVUFBa0IsRUFDbEIsb0JBQTBDLEVBQzFDLE1BQWlCLEVBQ2pCLFNBQVMsaUJBQWlCLENBQUMsd0JBQXdCLENBQUM7UUFIcEQsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUNsQix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQzFDLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsV0FBTSxHQUFOLE1BQU0sQ0FBOEM7UUFMdEQsZ0JBQVcsR0FBNEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQU92RCxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDckQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUMxQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsK0JBQStCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDeEUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILDBCQUEwQjtRQUMxQixJQUFJLENBQUMs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
@@ -1,6 +1,7 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
- import type { Tx, TxHash } from '@aztec/circuit-types';
2
+ import type { Tx } from '@aztec/circuit-types';
3
3
  import type { ENR } from '@chainsafe/enr';
4
+ import type { PeerId } from '@libp2p/interface';
4
5
  import type EventEmitter from 'events';
5
6
  export declare enum PeerDiscoveryState {
6
7
  RUNNING = "running",
@@ -25,11 +26,6 @@ export interface P2PService {
25
26
  * @param tx - The transaction to be propagated.
26
27
  */
27
28
  propagateTx(tx: Tx): void;
28
- /**
29
- * Called upon receipt of settled transactions.
30
- * @param txHashes - The hashes of the settled transactions.
31
- */
32
- settledTxs(txHashes: TxHash[]): void;
33
29
  }
34
30
  /**
35
31
  * The interface for a peer discovery service implementation.
@@ -48,6 +44,16 @@ export interface PeerDiscoveryService extends EventEmitter {
48
44
  * @returns An array of peer ENRs.
49
45
  */
50
46
  getAllPeers(): ENR[];
47
+ /**
48
+ * Runs findRandomNode query.
49
+ */
50
+ runRandomNodesQuery(): Promise<void>;
51
+ /**
52
+ * Checks if the given peer is a bootstrap peer.
53
+ * @param peerId - The peer ID to check.
54
+ * @returns True if the peer is a bootstrap peer.
55
+ */
56
+ isBootstrapPeer(peerId: PeerId): boolean;
51
57
  /**
52
58
  * Event emitted when a new peer is discovered.
53
59
  */
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/service/service.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,YAAY,MAAM,QAAQ,CAAC;AAEvC,oBAAY,kBAAkB;IAC5B,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;OAGG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;;OAGG;IACH,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IAE1B;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD;;SAEK;IACL,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;SAEK;IACL,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;;OAGG;IACH,WAAW,IAAI,GAAG,EAAE,CAAC;IAErB;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IACjE,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC;IAElD,SAAS,IAAI,kBAAkB,CAAC;CACjC"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/service/service.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,YAAY,MAAM,QAAQ,CAAC;AAEvC,oBAAY,kBAAkB;IAC5B,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;OAGG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;;OAGG;IACH,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD;;SAEK;IACL,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;SAEK;IACL,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;;OAGG;IACH,WAAW,IAAI,GAAG,EAAE,CAAC;IAErB;;OAEG;IACH,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC;;;;OAIG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAEzC;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IACjE,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC;IAElD,SAAS,IAAI,kBAAkB,CAAC;CACjC"}
@@ -3,4 +3,4 @@ export var PeerDiscoveryState;
3
3
  PeerDiscoveryState["RUNNING"] = "running";
4
4
  PeerDiscoveryState["STOPPED"] = "stopped";
5
5
  })(PeerDiscoveryState || (PeerDiscoveryState = {}));
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxDQUFOLElBQVksa0JBR1g7QUFIRCxXQUFZLGtCQUFrQjtJQUM1Qix5Q0FBbUIsQ0FBQTtJQUNuQix5Q0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBSFcsa0JBQWtCLEtBQWxCLGtCQUFrQixRQUc3QiJ9
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsTUFBTSxDQUFOLElBQVksa0JBR1g7QUFIRCxXQUFZLGtCQUFrQjtJQUM1Qix5Q0FBbUIsQ0FBQTtJQUNuQix5Q0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBSFcsa0JBQWtCLEtBQWxCLGtCQUFrQixRQUc3QiJ9
@@ -1,6 +1,7 @@
1
1
  import { Tx, TxHash } from '@aztec/circuit-types';
2
2
  import { type Logger } from '@aztec/foundation/log';
3
3
  import { type AztecKVStore } from '@aztec/kv-store';
4
+ import { type TelemetryClient } from '@aztec/telemetry-client';
4
5
  import { type TxPool } from './tx_pool.js';
5
6
  /**
6
7
  * In-memory implementation of the Transaction Pool.
@@ -12,7 +13,7 @@ export declare class AztecKVTxPool implements TxPool {
12
13
  * @param store - A KV store.
13
14
  * @param log - A logger.
14
15
  */
15
- constructor(store: AztecKVStore, log?: Logger);
16
+ constructor(store: AztecKVStore, telemetry: TelemetryClient, log?: Logger);
16
17
  /**
17
18
  * Checks if a transaction exists in the pool and returns it.
18
19
  * @param txHash - The generated tx hash.
@@ -1 +1 @@
1
- {"version":3,"file":"aztec_kv_tx_pool.d.ts","sourceRoot":"","sources":["../../src/tx_pool/aztec_kv_tx_pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,KAAK,MAAM,EAAqB,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,KAAK,YAAY,EAAiB,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;GAEG;AACH,qBAAa,aAAc,YAAW,MAAM;;IAU1C;;;;OAIG;gBACS,KAAK,EAAE,YAAY,EAAE,GAAG,SAAqC;IAMzE;;;;OAIG;IACI,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,GAAG,SAAS;IAKlD;;;;OAIG;IACU,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7C;;;;OAIG;IACI,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnD;;;OAGG;IACI,SAAS,IAAI,EAAE,EAAE;IAIxB;;;OAGG;IACI,cAAc,IAAI,MAAM,EAAE;IAIjC;;;;OAIG;IACI,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;CAGtC"}
1
+ {"version":3,"file":"aztec_kv_tx_pool.d.ts","sourceRoot":"","sources":["../../src/tx_pool/aztec_kv_tx_pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,KAAK,MAAM,EAAqB,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,KAAK,YAAY,EAAiB,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;GAEG;AACH,qBAAa,aAAc,YAAW,MAAM;;IAY1C;;;;OAIG;gBACS,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,SAAqC;IAOrG;;;;OAIG;IACI,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,GAAG,SAAS;IAKlD;;;;OAIG;IACI,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBvC;;;;OAIG;IACI,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnD;;;OAGG;IACI,SAAS,IAAI,EAAE,EAAE;IAIxB;;;OAGG;IACI,cAAc,IAAI,MAAM,EAAE;IAIjC;;;;OAIG;IACI,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;CAGtC"}