@aztec/p2p 0.0.1-commit.fcb71a6 → 0.0.1-commit.fffb133c

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 (213) hide show
  1. package/dest/client/interface.d.ts +18 -5
  2. package/dest/client/interface.d.ts.map +1 -1
  3. package/dest/client/p2p_client.d.ts +10 -13
  4. package/dest/client/p2p_client.d.ts.map +1 -1
  5. package/dest/client/p2p_client.js +449 -118
  6. package/dest/config.js +2 -2
  7. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +61 -42
  8. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  9. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  10. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  11. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +237 -263
  12. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +21 -18
  13. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  14. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +113 -108
  15. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +17 -16
  16. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  17. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +89 -128
  18. package/dest/mem_pools/attestation_pool/mocks.d.ts +9 -6
  19. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  20. package/dest/mem_pools/attestation_pool/mocks.js +16 -12
  21. package/dest/mem_pools/instrumentation.d.ts +1 -1
  22. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  23. package/dest/mem_pools/instrumentation.js +4 -13
  24. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +15 -10
  25. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  26. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +91 -50
  27. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +19 -5
  28. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -1
  29. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +59 -3
  30. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +79 -5
  31. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -1
  32. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +47 -0
  33. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  34. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  35. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
  36. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +2 -2
  37. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
  38. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +4 -4
  39. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +2 -0
  41. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +2 -2
  42. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  44. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  45. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  46. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -4
  47. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  48. package/dest/msg_validators/attestation_validator/attestation_validator.js +51 -18
  49. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +5 -5
  50. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  51. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +18 -14
  52. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  53. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  54. package/dest/msg_validators/clock_tolerance.js +37 -0
  55. package/dest/msg_validators/index.d.ts +2 -2
  56. package/dest/msg_validators/index.d.ts.map +1 -1
  57. package/dest/msg_validators/index.js +1 -1
  58. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  59. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  60. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  61. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  62. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  63. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  64. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  65. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  66. package/dest/msg_validators/proposal_validator/index.js +3 -0
  67. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  68. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  69. package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
  70. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  71. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  72. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
  73. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +1 -1
  74. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  75. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  76. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  77. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  78. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  79. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  80. package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
  81. package/dest/msg_validators/tx_validator/gas_validator.d.ts +1 -1
  82. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  83. package/dest/msg_validators/tx_validator/gas_validator.js +8 -14
  84. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  85. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  86. package/dest/msg_validators/tx_validator/index.js +1 -0
  87. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  88. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  89. package/dest/msg_validators/tx_validator/size_validator.d.ts +6 -0
  90. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  91. package/dest/msg_validators/tx_validator/size_validator.js +20 -0
  92. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +1 -1
  93. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  94. package/dest/services/dummy_service.d.ts +6 -2
  95. package/dest/services/dummy_service.d.ts.map +1 -1
  96. package/dest/services/dummy_service.js +3 -0
  97. package/dest/services/encoding.d.ts +1 -1
  98. package/dest/services/encoding.d.ts.map +1 -1
  99. package/dest/services/encoding.js +6 -5
  100. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  101. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  102. package/dest/services/libp2p/instrumentation.js +20 -73
  103. package/dest/services/libp2p/libp2p_service.d.ts +28 -11
  104. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  105. package/dest/services/libp2p/libp2p_service.js +711 -152
  106. package/dest/services/peer-manager/metrics.d.ts +1 -1
  107. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  108. package/dest/services/peer-manager/metrics.js +6 -26
  109. package/dest/services/peer-manager/peer_manager.d.ts +2 -2
  110. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  111. package/dest/services/peer-manager/peer_manager.js +0 -10
  112. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  113. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  114. package/dest/services/peer-manager/peer_scoring.js +2 -5
  115. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +1 -1
  116. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  117. package/dest/services/reqresp/constants.d.ts +12 -0
  118. package/dest/services/reqresp/constants.d.ts.map +1 -0
  119. package/dest/services/reqresp/constants.js +7 -0
  120. package/dest/services/reqresp/metrics.d.ts +1 -1
  121. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  122. package/dest/services/reqresp/metrics.js +5 -21
  123. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +1 -1
  124. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  125. package/dest/services/reqresp/protocols/block_txs/bitvector.js +7 -0
  126. package/dest/services/reqresp/protocols/status.d.ts +1 -1
  127. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  128. package/dest/services/reqresp/protocols/status.js +4 -1
  129. package/dest/services/reqresp/reqresp.js +402 -24
  130. package/dest/services/service.d.ts +16 -3
  131. package/dest/services/service.d.ts.map +1 -1
  132. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  133. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  134. package/dest/services/tx_collection/instrumentation.js +4 -14
  135. package/dest/services/tx_collection/slow_tx_collection.d.ts +3 -3
  136. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  137. package/dest/services/tx_collection/tx_collection.d.ts +5 -5
  138. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  139. package/dest/services/tx_provider.d.ts +3 -3
  140. package/dest/services/tx_provider.d.ts.map +1 -1
  141. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  142. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  143. package/dest/services/tx_provider_instrumentation.js +6 -19
  144. package/dest/testbench/p2p_client_testbench_worker.js +30 -17
  145. package/dest/testbench/worker_client_manager.d.ts +1 -1
  146. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  147. package/dest/testbench/worker_client_manager.js +6 -1
  148. package/package.json +16 -16
  149. package/src/client/interface.ts +19 -4
  150. package/src/client/p2p_client.ts +82 -132
  151. package/src/config.ts +2 -2
  152. package/src/mem_pools/attestation_pool/attestation_pool.ts +68 -41
  153. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +239 -287
  154. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +162 -140
  155. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +141 -164
  156. package/src/mem_pools/attestation_pool/mocks.ts +19 -13
  157. package/src/mem_pools/instrumentation.ts +9 -18
  158. package/src/mem_pools/tx_pool/README.md +28 -13
  159. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +130 -75
  160. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +66 -5
  161. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +119 -4
  162. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
  163. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +4 -2
  164. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  165. package/src/msg_validators/attestation_validator/attestation_validator.ts +36 -21
  166. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +13 -16
  167. package/src/msg_validators/clock_tolerance.ts +51 -0
  168. package/src/msg_validators/index.ts +1 -1
  169. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  170. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  171. package/src/msg_validators/proposal_validator/index.ts +3 -0
  172. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  173. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
  174. package/src/msg_validators/tx_validator/block_header_validator.ts +3 -1
  175. package/src/msg_validators/tx_validator/data_validator.ts +12 -4
  176. package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
  177. package/src/msg_validators/tx_validator/gas_validator.ts +8 -25
  178. package/src/msg_validators/tx_validator/index.ts +1 -0
  179. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  180. package/src/msg_validators/tx_validator/size_validator.ts +18 -0
  181. package/src/msg_validators/tx_validator/timestamp_validator.ts +3 -1
  182. package/src/services/dummy_service.ts +6 -0
  183. package/src/services/encoding.ts +5 -4
  184. package/src/services/libp2p/instrumentation.ts +19 -73
  185. package/src/services/libp2p/libp2p_service.ts +351 -115
  186. package/src/services/peer-manager/metrics.ts +5 -26
  187. package/src/services/peer-manager/peer_manager.ts +1 -2
  188. package/src/services/peer-manager/peer_scoring.ts +1 -5
  189. package/src/services/reqresp/connection-sampler/connection_sampler.ts +3 -1
  190. package/src/services/reqresp/constants.ts +14 -0
  191. package/src/services/reqresp/metrics.ts +7 -23
  192. package/src/services/reqresp/protocols/block_txs/bitvector.ts +9 -0
  193. package/src/services/reqresp/protocols/status.ts +7 -4
  194. package/src/services/service.ts +19 -4
  195. package/src/services/tx_collection/instrumentation.ts +4 -21
  196. package/src/services/tx_collection/slow_tx_collection.ts +2 -2
  197. package/src/services/tx_collection/tx_collection.ts +4 -4
  198. package/src/services/tx_provider.ts +2 -2
  199. package/src/services/tx_provider_instrumentation.ts +11 -24
  200. package/src/testbench/p2p_client_testbench_worker.ts +40 -21
  201. package/src/testbench/worker_client_manager.ts +6 -1
  202. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts +0 -15
  203. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts.map +0 -1
  204. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.js +0 -88
  205. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  206. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  207. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
  208. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  209. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  210. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  211. package/src/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.ts +0 -108
  212. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
  213. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -2,6 +2,7 @@ import { insertIntoSortedArray } from '@aztec/foundation/array';
2
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { toArray } from '@aztec/foundation/iterable';
4
4
  import { createLogger } from '@aztec/foundation/log';
5
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
5
6
  import { ChonkProof } from '@aztec/stdlib/proofs';
6
7
  import { Tx, TxHash } from '@aztec/stdlib/tx';
7
8
  import { getTelemetryClient } from '@aztec/telemetry-client';
@@ -10,10 +11,12 @@ import EventEmitter from 'node:events';
10
11
  import { ArchiveCache } from '../../msg_validators/tx_validator/archive_cache.js';
11
12
  import { PoolInstrumentation, PoolName } from '../instrumentation.js';
12
13
  import { EvictionManager } from './eviction/eviction_manager.js';
13
- import { InsufficientFeePayerBalanceRule } from './eviction/insufficient_fee_payer_balance_rule.js';
14
+ import { FeePayerTxInfo } from './eviction/eviction_strategy.js';
15
+ import { FeePayerBalanceEvictionRule } from './eviction/fee_payer_balance_eviction_rule.js';
14
16
  import { InvalidTxsAfterMiningRule } from './eviction/invalid_txs_after_mining_rule.js';
15
17
  import { InvalidTxsAfterReorgRule } from './eviction/invalid_txs_after_reorg_rule.js';
16
18
  import { LowPriorityEvictionRule } from './eviction/low_priority_eviction_rule.js';
19
+ import { NullifierConflictPreAddRule } from './eviction/nullifier_conflict_pre_add_rule.js';
17
20
  import { getPendingTxPriority } from './priority.js';
18
21
  /**
19
22
  * KV implementation of the Transaction Pool.
@@ -26,7 +29,8 @@ import { getPendingTxPriority } from './priority.js';
26
29
  /** Map from tx hash to the block number it was originally mined in (for soft-deleted txs). */ #deletedMinedTxHashes;
27
30
  /** MultiMap from block number to deleted mined tx hashes for efficient cleanup. */ #blockToDeletedMinedTxHash;
28
31
  #historicalHeaderToTxHash;
29
- #feePayerToTxHash;
32
+ #feePayerToBalanceEntry;
33
+ /** Index from nullifier to pending tx hash */ #pendingNullifierToTxHash;
30
34
  /** In-memory set of txs that should not be evicted from the pool. */ #nonEvictableTxs;
31
35
  /** KV store for archived txs. */ #archive;
32
36
  /** Archived txs map for future lookup. */ #archivedTxs;
@@ -48,11 +52,12 @@ import { getPendingTxPriority } from './priority.js';
48
52
  this.#evictionManager = new EvictionManager(this);
49
53
  this.#evictionManager.registerRule(new InvalidTxsAfterMiningRule());
50
54
  this.#evictionManager.registerRule(new InvalidTxsAfterReorgRule(worldState));
51
- this.#evictionManager.registerRule(new InsufficientFeePayerBalanceRule(worldState));
55
+ this.#evictionManager.registerRule(new FeePayerBalanceEvictionRule(worldState));
52
56
  this.#evictionManager.registerRule(new LowPriorityEvictionRule({
53
57
  //NOTE: 0 effectively disables low priority eviction
54
58
  maxPoolSize: config.maxPendingTxCount ?? 0
55
59
  }));
60
+ this.#evictionManager.registerPreAddRule(new NullifierConflictPreAddRule());
56
61
  this.updateConfig(config);
57
62
  this.#txs = store.openMap('txs');
58
63
  this.#minedTxHashToBlock = store.openMap('txHashToBlockMined');
@@ -61,7 +66,8 @@ import { getPendingTxPriority } from './priority.js';
61
66
  this.#blockToDeletedMinedTxHash = store.openMultiMap('blockToDeletedMinedTxHash');
62
67
  this.#pendingTxHashToHistoricalBlockHeaderHash = store.openMap('txHistoricalBlock');
63
68
  this.#historicalHeaderToTxHash = store.openMultiMap('historicalHeaderToPendingTxHash');
64
- this.#feePayerToTxHash = store.openMultiMap('feePayerToPendingTxHash');
69
+ this.#feePayerToBalanceEntry = store.openMultiMap('feePayerToBalanceEntry');
70
+ this.#pendingNullifierToTxHash = store.openMap('pendingNullifierToTxHash');
65
71
  this.#nonEvictableTxs = new Set();
66
72
  this.#archivedTxs = archive.openMap('archivedTxs');
67
73
  this.#archivedTxIndices = archive.openMap('archivedTxIndices');
@@ -104,7 +110,7 @@ import { getPendingTxPriority } from './priority.js';
104
110
  for (const hash of txHashes){
105
111
  const key = hash.toString();
106
112
  await this.#minedTxHashToBlock.set(key, blockHeader.globalVariables.blockNumber);
107
- const tx = await this.getPendingTxByHash(hash);
113
+ const tx = await this.getTxByHash(hash);
108
114
  if (tx) {
109
115
  const nullifiers = tx.data.getNonEmptyNullifiers();
110
116
  nullifiers.forEach((nullifier)=>insertIntoSortedArray(uniqueMinedNullifiers, nullifier, Fr.cmp, false));
@@ -139,8 +145,15 @@ import { getPendingTxPriority } from './priority.js';
139
145
  for (const hash of txHashes){
140
146
  const key = hash.toString();
141
147
  await this.#minedTxHashToBlock.delete(key);
148
+ // Clear soft-delete metadata if this tx was previously soft-deleted,
149
+ // so cleanupDeletedMinedTxs won't later hard-delete it while it's pending
150
+ const deletedBlock = await this.#deletedMinedTxHashes.getAsync(key);
151
+ if (deletedBlock !== undefined) {
152
+ await this.#deletedMinedTxHashes.delete(key);
153
+ await this.#blockToDeletedMinedTxHash.deleteValue(deletedBlock, key);
154
+ }
142
155
  // Rehydrate the tx in the in-memory pending txs mapping
143
- const tx = await this.getPendingTxByHash(hash);
156
+ const tx = await this.getTxByHash(hash);
144
157
  if (tx) {
145
158
  await this.addPendingTxIndicesInDbTx(tx, key);
146
159
  }
@@ -190,6 +203,8 @@ import { getPendingTxPriority } from './priority.js';
190
203
  }
191
204
  /**
192
205
  * Adds a list of transactions to the pool. Duplicates are ignored.
206
+ * Handles nullifier deduplication: if an incoming tx has a nullifier conflict with
207
+ * existing pending txs, it will either replace them (if higher fee) or be rejected.
193
208
  * @param txs - An array of txs to be added to the pool.
194
209
  * @returns count of added transactions
195
210
  */ async addTxs(txs, opts = {}) {
@@ -197,38 +212,59 @@ import { getPendingTxPriority } from './priority.js';
197
212
  return Promise.resolve(0);
198
213
  }
199
214
  const addedTxs = [];
215
+ const uniqueFeePayers = [];
216
+ const replacedTxHashes = [];
200
217
  const hashesAndStats = txs.map((tx)=>({
201
218
  txHash: tx.getTxHash(),
202
219
  txStats: tx.getStats()
203
220
  }));
204
221
  try {
205
222
  await this.#store.transactionAsync(async ()=>{
206
- await Promise.all(txs.map(async (tx, i)=>{
223
+ for(let i = 0; i < txs.length; i++){
224
+ const tx = txs[i];
207
225
  const { txHash, txStats } = hashesAndStats[i];
208
226
  const key = txHash.toString();
209
227
  if (await this.#txs.hasAsync(key)) {
210
- this.#log.debug(`Tx ${txHash.toString()} already exists in the pool`);
211
- return;
228
+ this.#log.debug(`Tx ${key} already exists in the pool`);
229
+ continue;
212
230
  }
213
- this.#log.verbose(`Adding tx ${txHash.toString()} to pool`, {
231
+ const poolAccess = this.getPreAddPoolAccess();
232
+ const { shouldReject, txHashesToEvict } = await this.#evictionManager.runPreAddRules(tx, poolAccess);
233
+ if (shouldReject) {
234
+ continue;
235
+ }
236
+ for (const txHashToEvict of txHashesToEvict){
237
+ const txToDelete = await this.getTxByHash(txHashToEvict);
238
+ if (txToDelete) {
239
+ const evictedKey = txHashToEvict.toString();
240
+ await this.deletePendingTxInDbTx(txToDelete, evictedKey);
241
+ replacedTxHashes.push(txHashToEvict);
242
+ this.#log.verbose(`Evicted tx ${evictedKey} due to higher-fee tx ${key}`);
243
+ }
244
+ }
245
+ this.#log.verbose(`Adding tx ${key} to pool`, {
214
246
  eventName: 'tx-added-to-pool',
215
247
  ...txStats
216
248
  });
217
249
  await this.#txs.set(key, tx.toBuffer());
218
250
  addedTxs.push(tx);
251
+ insertIntoSortedArray(uniqueFeePayers, tx.data.feePayer, (a, b)=>a.toField().cmp(b.toField()), false);
219
252
  await this.#pendingTxHashToHistoricalBlockHeaderHash.set(key, (await tx.data.constants.anchorBlockHeader.hash()).toString());
220
253
  if (!await this.#minedTxHashToBlock.hasAsync(key)) {
221
254
  await this.addPendingTxIndicesInDbTx(tx, key);
222
255
  this.#metrics.recordSize(tx);
223
256
  }
224
- }));
257
+ }
225
258
  });
226
- await this.#evictionManager.evictAfterNewTxs(addedTxs.map(({ txHash })=>txHash));
259
+ await this.#evictionManager.evictAfterNewTxs(addedTxs.map(({ txHash })=>txHash), uniqueFeePayers);
227
260
  } catch (err) {
228
261
  this.#log.warn('Unexpected error when adding txs', {
229
262
  err
230
263
  });
231
264
  }
265
+ if (replacedTxHashes.length > 0) {
266
+ this.#metrics.transactionsRemoved(replacedTxHashes.map((hash)=>hash.toBigInt()));
267
+ }
232
268
  if (addedTxs.length > 0) {
233
269
  this.#metrics.transactionsAdded(addedTxs);
234
270
  this.emit('txs-added', {
@@ -259,7 +295,7 @@ import { getPendingTxPriority } from './priority.js';
259
295
  const minedBlockNumber = await this.#minedTxHashToBlock.getAsync(key);
260
296
  const txIsPending = minedBlockNumber === undefined;
261
297
  if (txIsPending) {
262
- await this.deletePendingTx(tx, key);
298
+ await this.deletePendingTxInDbTx(tx, key);
263
299
  } else {
264
300
  await this.deleteMinedTx(key, minedBlockNumber, opts?.permanently ?? false);
265
301
  const shouldArchiveTx = this.#archivedTxLimit && !opts?.permanently;
@@ -287,10 +323,11 @@ import { getPendingTxPriority } from './priority.js';
287
323
  await this.#deletedMinedTxHashes.set(txHash, minedBlockNumber);
288
324
  await this.#blockToDeletedMinedTxHash.set(minedBlockNumber, txHash);
289
325
  }
290
- async deletePendingTx(tx, txHash) {
326
+ // Assumes being called within a DB transaction
327
+ async deletePendingTxInDbTx(tx, txHash) {
291
328
  // We always permanently delete pending transactions
292
329
  this.#log.trace(`Deleting pending tx ${txHash} from pool`);
293
- await this.removePendingTxIndices(tx, txHash);
330
+ await this.removePendingTxIndicesInDbTx(tx, txHash);
294
331
  await this.#txs.delete(txHash);
295
332
  await this.#pendingTxHashToHistoricalBlockHeaderHash.delete(txHash);
296
333
  }
@@ -317,7 +354,7 @@ import { getPendingTxPriority } from './priority.js';
317
354
  let historicalBlockHash = await this.#pendingTxHashToHistoricalBlockHeaderHash.getAsync(txHash.toString());
318
355
  // Not all tx might have this index created.
319
356
  if (!historicalBlockHash) {
320
- const tx = await this.getPendingTxByHash(txHash);
357
+ const tx = await this.getTxByHash(txHash);
321
358
  if (!tx) {
322
359
  this.#log.warn(`PendingTxInfo:tx ${txHash} not found`);
323
360
  return undefined;
@@ -343,14 +380,20 @@ import { getPendingTxPriority } from './priority.js';
343
380
  }
344
381
  return result;
345
382
  }
346
- async getPendingTxsWithFeePayer(feePayers) {
347
- const result = [];
348
- for (const feePayer of feePayers){
349
- const chunk = await toArray(this.#feePayerToTxHash.getValuesAsync(feePayer.toString()));
350
- const infos = await Promise.all(chunk.map((txHash)=>this.getPendingTxInfo(TxHash.fromString(txHash))));
351
- result.push(...infos.filter((info)=>info !== undefined));
383
+ async getPendingFeePayers() {
384
+ const feePayers = [];
385
+ for await (const feePayer of this.#feePayerToBalanceEntry.keysAsync()){
386
+ const address = AztecAddress.fromString(feePayer);
387
+ insertIntoSortedArray(feePayers, address, (a, b)=>a.toField().cmp(b.toField()), false);
388
+ }
389
+ return feePayers;
390
+ }
391
+ async *getFeePayerTxInfos(feePayer) {
392
+ for await (const value of this.#feePayerToBalanceEntry.getValuesAsync(feePayer.toString())){
393
+ const info = FeePayerTxInfo.decode(value);
394
+ info.isEvictable = !this.#nonEvictableTxs.has(info.txHash.toString());
395
+ yield info;
352
396
  }
353
- return result;
354
397
  }
355
398
  async getMinedTxHashes() {
356
399
  const vals = await toArray(this.#minedTxHashToBlock.entriesAsync());
@@ -447,21 +490,6 @@ import { getPendingTxPriority } from './priority.js';
447
490
  return new ArchiveCache(db);
448
491
  }
449
492
  /**
450
- * Checks if a cached transaction exists in the in-memory pending tx pool and returns it.
451
- * Otherwise, it checks the tx pool, updates the pending tx pool, and returns the tx.
452
- * @param txHash - The generated tx hash.
453
- * @returns The transaction, if found, 'undefined' otherwise.
454
- */ async getPendingTxByHash(txHash) {
455
- if (typeof txHash === 'string') {
456
- txHash = TxHash.fromString(txHash);
457
- }
458
- const tx = await this.getTxByHash(txHash);
459
- if (tx) {
460
- return tx;
461
- }
462
- return undefined;
463
- }
464
- /**
465
493
  * Archives a list of txs for future reference. The number of archived txs is limited by the specified archivedTxLimit.
466
494
  * Note: Pending txs should not be archived, only finalized txs
467
495
  * @param txs - The list of transactions to archive.
@@ -515,23 +543,23 @@ import { getPendingTxPriority } from './priority.js';
515
543
  async addPendingTxIndicesInDbTx(tx, txHash) {
516
544
  await this.#pendingTxPriorityToHash.set(getPendingTxPriority(tx), txHash);
517
545
  await this.#historicalHeaderToTxHash.set((await tx.data.constants.anchorBlockHeader.hash()).toString(), txHash);
518
- await this.#feePayerToTxHash.set(tx.data.feePayer.toString(), txHash);
519
- }
520
- async addPendingTxIndices(tx, txHash) {
521
- return await this.#store.transactionAsync(async ()=>{
522
- await this.addPendingTxIndicesInDbTx(tx, txHash);
523
- });
546
+ await this.#feePayerToBalanceEntry.set(tx.data.feePayer.toString(), await FeePayerTxInfo.encode(tx, txHash));
547
+ // Add nullifier entries for conflict detection
548
+ const nullifiers = tx.data.getNonEmptyNullifiers();
549
+ for (const nullifier of nullifiers){
550
+ await this.#pendingNullifierToTxHash.set(nullifier.toString(), txHash);
551
+ }
524
552
  }
525
553
  // Assumes being called within a DB transaction
526
554
  async removePendingTxIndicesInDbTx(tx, txHash) {
527
555
  await this.#pendingTxPriorityToHash.deleteValue(getPendingTxPriority(tx), txHash);
528
556
  await this.#historicalHeaderToTxHash.deleteValue((await tx.data.constants.anchorBlockHeader.hash()).toString(), txHash);
529
- await this.#feePayerToTxHash.deleteValue(tx.data.feePayer.toString(), txHash);
530
- }
531
- async removePendingTxIndices(tx, txHash) {
532
- return await this.#store.transactionAsync(async ()=>{
533
- await this.removePendingTxIndicesInDbTx(tx, txHash);
534
- });
557
+ await this.#feePayerToBalanceEntry.deleteValue(tx.data.feePayer.toString(), await FeePayerTxInfo.encode(tx, txHash));
558
+ // Remove nullifier entries
559
+ const nullifiers = tx.data.getNonEmptyNullifiers();
560
+ for (const nullifier of nullifiers){
561
+ await this.#pendingNullifierToTxHash.delete(nullifier.toString());
562
+ }
535
563
  }
536
564
  /**
537
565
  * Returns up to `limit` lowest-priority evictable pending tx hashes without hydrating transactions.
@@ -552,4 +580,17 @@ import { getPendingTxPriority } from './priority.js';
552
580
  }
553
581
  return txsToEvict;
554
582
  }
583
+ /**
584
+ * Creates a PreAddPoolAccess object for use by pre-add eviction rules.
585
+ * Provides read-only access to pool state during addTxs transaction.
586
+ */ getPreAddPoolAccess() {
587
+ return {
588
+ getTxHashByNullifier: async (nullifier)=>{
589
+ const hashStr = await this.#pendingNullifierToTxHash.getAsync(nullifier.toString());
590
+ return hashStr ? TxHash.fromString(hashStr) : undefined;
591
+ },
592
+ getPendingTxByHash: this.getTxByHash.bind(this),
593
+ getTxPriority: getPendingTxPriority
594
+ };
595
+ }
555
596
  }
@@ -1,18 +1,32 @@
1
+ import type { BlockNumber } from '@aztec/foundation/branded-types';
1
2
  import { Fr } from '@aztec/foundation/curves/bn254';
2
3
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
- import { BlockHeader, TxHash } from '@aztec/stdlib/tx';
4
+ import { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
4
5
  import type { TxPoolOptions } from '../tx_pool.js';
5
- import { type EvictionRule, type TxPoolOperations } from './eviction_strategy.js';
6
+ import { type EvictionRule, type PreAddEvictionResult, type PreAddEvictionRule, type PreAddPoolAccess, type TxPoolOperations } from './eviction_strategy.js';
6
7
  export declare class EvictionManager {
7
8
  private txPool;
8
9
  private log;
9
10
  private rules;
11
+ /** Pre-add eviction rules (run inside addTxs transaction) */
12
+ private preAddRules;
10
13
  constructor(txPool: TxPoolOperations, log?: import("@aztec/foundation/log").Logger);
11
- evictAfterNewTxs(newTxs: TxHash[]): Promise<void>;
14
+ evictAfterNewTxs(newTxs: TxHash[], feePayers: AztecAddress[]): Promise<void>;
12
15
  evictAfterNewBlock(block: BlockHeader, newNullifiers: Fr[], minedFeePayers: AztecAddress[]): Promise<void>;
13
- evictAfterChainPrune(blockNumber: number): Promise<void>;
16
+ evictAfterChainPrune(blockNumber: BlockNumber): Promise<void>;
17
+ /**
18
+ * Runs pre-add eviction rules to determine if an incoming tx should be added
19
+ * and which existing txs should be evicted.
20
+ * Called from inside the addTxs database transaction for atomicity.
21
+ *
22
+ * @param tx - The incoming transaction
23
+ * @param poolAccess - Read-only access to pool state
24
+ * @returns Combined result from all pre-add rules
25
+ */
26
+ runPreAddRules(tx: Tx, poolAccess: PreAddPoolAccess): Promise<PreAddEvictionResult>;
14
27
  registerRule(rule: EvictionRule): void;
28
+ registerPreAddRule(rule: PreAddEvictionRule): void;
15
29
  updateConfig(config: TxPoolOptions): void;
16
30
  private runEvictionRules;
17
31
  }
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZpY3Rpb25fbWFuYWdlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL21lbV9wb29scy90eF9wb29sL2V2aWN0aW9uL2V2aWN0aW9uX21hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdkQsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBdUMsS0FBSyxZQUFZLEVBQUUsS0FBSyxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXZILHFCQUFhLGVBQWU7SUFJeEIsT0FBTyxDQUFDLE1BQU07SUFDZCxPQUFPLENBQUMsR0FBRztJQUpiLE9BQU8sQ0FBQyxLQUFLLENBQXNCO0lBRW5DLFlBQ1UsTUFBTSxFQUFFLGdCQUFnQixFQUN4QixHQUFHLHlDQUF1RCxFQUNoRTtJQUVTLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBTTdEO0lBRVksa0JBQWtCLENBQzdCLEtBQUssRUFBRSxXQUFXLEVBQ2xCLGFBQWEsRUFBRSxFQUFFLEVBQUUsRUFDbkIsY0FBYyxFQUFFLFlBQVksRUFBRSxHQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLENBU2Y7SUFFWSxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FNcEU7SUFFTSxZQUFZLENBQUMsSUFBSSxFQUFFLFlBQVksUUFFckM7SUFFTSxZQUFZLENBQUMsTUFBTSxFQUFFLGFBQWEsR0FBRyxJQUFJLENBSS9DO1lBRWEsZ0JBQWdCO0NBYS9CIn0=
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZpY3Rpb25fbWFuYWdlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL21lbV9wb29scy90eF9wb29sL2V2aWN0aW9uL2V2aWN0aW9uX21hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTNELE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBR0wsS0FBSyxZQUFZLEVBQ2pCLEtBQUssb0JBQW9CLEVBQ3pCLEtBQUssa0JBQWtCLEVBQ3ZCLEtBQUssZ0JBQWdCLEVBQ3JCLEtBQUssZ0JBQWdCLEVBQ3RCLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMscUJBQWEsZUFBZTtJQU94QixPQUFPLENBQUMsTUFBTTtJQUNkLE9BQU8sQ0FBQyxHQUFHO0lBUGIsT0FBTyxDQUFDLEtBQUssQ0FBc0I7SUFFbkMsNkRBQTZEO0lBQzdELE9BQU8sQ0FBQyxXQUFXLENBQTRCO0lBRS9DLFlBQ1UsTUFBTSxFQUFFLGdCQUFnQixFQUN4QixHQUFHLHlDQUF1RCxFQUNoRTtJQUVTLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQU94RjtJQUVZLGtCQUFrQixDQUM3QixLQUFLLEVBQUUsV0FBVyxFQUNsQixhQUFhLEVBQUUsRUFBRSxFQUFFLEVBQ25CLGNBQWMsRUFBRSxZQUFZLEVBQUUsR0FDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQVNmO0lBRVksb0JBQW9CLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBTXpFO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDVSxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBNkIvRjtJQUVNLFlBQVksQ0FBQyxJQUFJLEVBQUUsWUFBWSxRQUVyQztJQUVNLGtCQUFrQixDQUFDLElBQUksRUFBRSxrQkFBa0IsUUFFakQ7SUFFTSxZQUFZLENBQUMsTUFBTSxFQUFFLGFBQWEsR0FBRyxJQUFJLENBTy9DO1lBRWEsZ0JBQWdCO0NBYS9CIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"eviction_manager.d.ts","sourceRoot":"","sources":["../../../../src/mem_pools/tx_pool/eviction/eviction_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAuC,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEvH,qBAAa,eAAe;IAIxB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,GAAG;IAJb,OAAO,CAAC,KAAK,CAAsB;IAEnC,YACU,MAAM,EAAE,gBAAgB,EACxB,GAAG,yCAAuD,EAChE;IAES,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7D;IAEY,kBAAkB,CAC7B,KAAK,EAAE,WAAW,EAClB,aAAa,EAAE,EAAE,EAAE,EACnB,cAAc,EAAE,YAAY,EAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CASf;IAEY,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMpE;IAEM,YAAY,CAAC,IAAI,EAAE,YAAY,QAErC;IAEM,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAI/C;YAEa,gBAAgB;CAa/B"}
1
+ {"version":3,"file":"eviction_manager.d.ts","sourceRoot":"","sources":["../../../../src/mem_pools/tx_pool/eviction/eviction_manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAEhC,qBAAa,eAAe;IAOxB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,GAAG;IAPb,OAAO,CAAC,KAAK,CAAsB;IAEnC,6DAA6D;IAC7D,OAAO,CAAC,WAAW,CAA4B;IAE/C,YACU,MAAM,EAAE,gBAAgB,EACxB,GAAG,yCAAuD,EAChE;IAES,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAOxF;IAEY,kBAAkB,CAC7B,KAAK,EAAE,WAAW,EAClB,aAAa,EAAE,EAAE,EAAE,EACnB,cAAc,EAAE,YAAY,EAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CASf;IAEY,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAMzE;IAED;;;;;;;;OAQG;IACU,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA6B/F;IAEM,YAAY,CAAC,IAAI,EAAE,YAAY,QAErC;IAEM,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,QAEjD;IAEM,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAO/C;YAEa,gBAAgB;CAa/B"}
@@ -1,18 +1,23 @@
1
+ import { findIndexInSortedArray, insertIntoSortedArray } from '@aztec/foundation/array';
2
+ import { Fr } from '@aztec/foundation/curves/bn254';
1
3
  import { createLogger } from '@aztec/foundation/log';
2
4
  import { EvictionEvent } from './eviction_strategy.js';
3
5
  export class EvictionManager {
4
6
  txPool;
5
7
  log;
6
8
  rules;
9
+ /** Pre-add eviction rules (run inside addTxs transaction) */ preAddRules;
7
10
  constructor(txPool, log = createLogger('p2p:mempool:tx_pool:eviction_manager')){
8
11
  this.txPool = txPool;
9
12
  this.log = log;
10
13
  this.rules = [];
14
+ this.preAddRules = [];
11
15
  }
12
- async evictAfterNewTxs(newTxs) {
16
+ async evictAfterNewTxs(newTxs, feePayers) {
13
17
  const ctx = {
14
18
  event: EvictionEvent.TXS_ADDED,
15
- newTxs
19
+ newTxs,
20
+ feePayers
16
21
  };
17
22
  await this.runEvictionRules(ctx);
18
23
  }
@@ -21,7 +26,7 @@ export class EvictionManager {
21
26
  event: EvictionEvent.BLOCK_MINED,
22
27
  block,
23
28
  newNullifiers,
24
- minedFeePayers
29
+ feePayers: minedFeePayers
25
30
  };
26
31
  await this.runEvictionRules(ctx);
27
32
  }
@@ -32,13 +37,64 @@ export class EvictionManager {
32
37
  };
33
38
  await this.runEvictionRules(ctx);
34
39
  }
40
+ /**
41
+ * Runs pre-add eviction rules to determine if an incoming tx should be added
42
+ * and which existing txs should be evicted.
43
+ * Called from inside the addTxs database transaction for atomicity.
44
+ *
45
+ * @param tx - The incoming transaction
46
+ * @param poolAccess - Read-only access to pool state
47
+ * @returns Combined result from all pre-add rules
48
+ */ async runPreAddRules(tx, poolAccess) {
49
+ const allTxHashesToEvict = [];
50
+ const cmpTxHash = (a, b)=>Fr.cmp(a.hash, b.hash);
51
+ for (const rule of this.preAddRules){
52
+ try {
53
+ const result = await rule.check(tx, poolAccess);
54
+ if (result.shouldReject) {
55
+ return {
56
+ shouldReject: true,
57
+ txHashesToEvict: [],
58
+ reason: result.reason
59
+ };
60
+ }
61
+ for (const txHashToEvict of result.txHashesToEvict){
62
+ // Only add if not already present (dedup)
63
+ if (findIndexInSortedArray(allTxHashesToEvict, txHashToEvict, cmpTxHash) === -1) {
64
+ insertIntoSortedArray(allTxHashesToEvict, txHashToEvict, cmpTxHash);
65
+ }
66
+ }
67
+ } catch (err) {
68
+ this.log.warn(`Pre-add eviction rule ${rule.name} unexpected error: ${String(err)}`, {
69
+ err,
70
+ preAddRule: rule.name
71
+ });
72
+ // On error, reject the tx to be safe
73
+ return {
74
+ shouldReject: true,
75
+ txHashesToEvict: [],
76
+ reason: `rule error: ${String(err)}`
77
+ };
78
+ }
79
+ }
80
+ return {
81
+ shouldReject: false,
82
+ txHashesToEvict: allTxHashesToEvict
83
+ };
84
+ }
35
85
  registerRule(rule) {
36
86
  this.rules.push(rule);
37
87
  }
88
+ registerPreAddRule(rule) {
89
+ this.preAddRules.push(rule);
90
+ }
38
91
  updateConfig(config) {
39
92
  for (const rule of this.rules){
40
93
  rule.updateConfig(config);
41
94
  }
95
+ for (const rule of this.preAddRules){
96
+ rule.updateConfig?.(config);
97
+ }
42
98
  }
43
99
  async runEvictionRules(ctx) {
44
100
  for (const rule of this.rules){
@@ -1,6 +1,7 @@
1
+ import type { BlockNumber } from '@aztec/foundation/branded-types';
1
2
  import { Fr } from '@aztec/foundation/curves/bn254';
2
3
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
- import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
4
+ import { type BlockHeader, type Tx, TxHash } from '@aztec/stdlib/tx';
4
5
  import type { TxPoolOptions } from '../tx_pool.js';
5
6
  export declare const EvictionEvent: {
6
7
  readonly TXS_ADDED: "txs_added";
@@ -11,14 +12,15 @@ type EvictionEvent = (typeof EvictionEvent)[keyof typeof EvictionEvent];
11
12
  export type EvictionContext = {
12
13
  event: typeof EvictionEvent.TXS_ADDED;
13
14
  newTxs: TxHash[];
15
+ feePayers: AztecAddress[];
14
16
  } | {
15
17
  event: typeof EvictionEvent.CHAIN_PRUNED;
16
- blockNumber: number;
18
+ blockNumber: BlockNumber;
17
19
  } | {
18
20
  event: typeof EvictionEvent.BLOCK_MINED;
19
21
  block: BlockHeader;
20
22
  newNullifiers: Fr[];
21
- minedFeePayers: AztecAddress[];
23
+ feePayers: AztecAddress[];
22
24
  };
23
25
  /**
24
26
  * Result of an eviction operation
@@ -52,7 +54,8 @@ export interface TxPoolOperations {
52
54
  getTxByHash(txHash: TxHash): Promise<Tx | undefined>;
53
55
  getPendingTxInfos(): Promise<PendingTxInfo[]>;
54
56
  getPendingTxsReferencingBlocks(blockHashes: Fr[]): Promise<TxBlockReference[]>;
55
- getPendingTxsWithFeePayer(feePayer: AztecAddress[]): Promise<PendingTxInfo[]>;
57
+ getPendingFeePayers(): Promise<AztecAddress[]>;
58
+ getFeePayerTxInfos(feePayer: AztecAddress): AsyncIterable<FeePayerTxInfo>;
56
59
  /** Cheap count of current pending transactions. */
57
60
  getPendingTxCount(): Promise<number>;
58
61
  /**
@@ -79,5 +82,76 @@ export interface EvictionRule {
79
82
  */
80
83
  updateConfig(config: TxPoolOptions): void;
81
84
  }
85
+ /**
86
+ * Balance-related information about a transaction for a fee payer.
87
+ */
88
+ export declare class FeePayerTxInfo {
89
+ txHash: TxHash;
90
+ priority: bigint;
91
+ feeLimit: bigint;
92
+ claimAmount: bigint;
93
+ isEvictable: boolean;
94
+ constructor(fields: {
95
+ txHash: TxHash;
96
+ priority: bigint;
97
+ feeLimit: bigint;
98
+ claimAmount: bigint;
99
+ isEvictable: boolean;
100
+ });
101
+ static encode(tx: Tx, txHash: string | TxHash): Promise<Buffer>;
102
+ static decode(value: Buffer, isEvictable?: boolean): FeePayerTxInfo;
103
+ }
104
+ /**
105
+ * Read-only access to pool state for pre-add eviction checks.
106
+ * Passed to pre-add rules during the addTxs transaction.
107
+ */
108
+ export interface PreAddPoolAccess {
109
+ /**
110
+ * Get the pending tx hash that uses a specific nullifier, if any.
111
+ * Returns undefined if no pending tx uses this nullifier.
112
+ */
113
+ getTxHashByNullifier(nullifier: Fr): Promise<TxHash | undefined>;
114
+ /**
115
+ * Get a pending transaction by its hash.
116
+ */
117
+ getPendingTxByHash(hash: TxHash): Promise<Tx | undefined>;
118
+ /**
119
+ * Get the priority string for a transaction (for fee comparison).
120
+ */
121
+ getTxPriority(tx: Tx): string;
122
+ }
123
+ /**
124
+ * Result of a pre-add eviction check for a single transaction.
125
+ */
126
+ export interface PreAddEvictionResult {
127
+ /** Whether the incoming tx should be rejected */
128
+ readonly shouldReject: boolean;
129
+ /** Sorted array of existing tx hashes that should be evicted if this tx is added */
130
+ readonly txHashesToEvict: TxHash[];
131
+ /** Optional reason for rejection */
132
+ readonly reason?: string;
133
+ }
134
+ /**
135
+ * Strategy interface for pre-add eviction rules.
136
+ * These run inside the addTxs transaction before a tx is added,
137
+ * deciding whether to evict existing txs or reject the incoming tx.
138
+ */
139
+ export interface PreAddEvictionRule {
140
+ readonly name: string;
141
+ /**
142
+ * Check if incoming tx should be added and which existing txs to evict.
143
+ * Called inside the addTxs database transaction for atomicity.
144
+ *
145
+ * @param tx - The incoming transaction to check
146
+ * @param poolAccess - Read-only access to current pool state
147
+ * @returns Result indicating whether to reject and what to evict
148
+ */
149
+ check(tx: Tx, poolAccess: PreAddPoolAccess): Promise<PreAddEvictionResult>;
150
+ /**
151
+ * Updates the configuration for this rule.
152
+ * Rules should ignore config options that don't apply to them.
153
+ */
154
+ updateConfig?(config: TxPoolOptions): void;
155
+ }
82
156
  export {};
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZpY3Rpb25fc3RyYXRlZ3kuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvdHhfcG9vbC9ldmljdGlvbi9ldmljdGlvbl9zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVoRSxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsZUFBTyxNQUFNLGFBQWE7Ozs7Q0FJaEIsQ0FBQztBQUVYLEtBQUssYUFBYSxHQUFHLENBQUMsT0FBTyxhQUFhLENBQUMsQ0FBQyxNQUFNLE9BQU8sYUFBYSxDQUFDLENBQUM7QUFFeEUsTUFBTSxNQUFNLGVBQWUsR0FDdkI7SUFDRSxLQUFLLEVBQUUsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDO0lBQ3RDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNsQixHQUNEO0lBQ0UsS0FBSyxFQUFFLE9BQU8sYUFBYSxDQUFDLFlBQVksQ0FBQztJQUN6QyxXQUFXLEVBQUUsTUFBTSxDQUFDO0NBQ3JCLEdBQ0Q7SUFDRSxLQUFLLEVBQUUsT0FBTyxhQUFhLENBQUMsV0FBVyxDQUFDO0lBQ3hDLEtBQUssRUFBRSxXQUFXLENBQUM7SUFDbkIsYUFBYSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3BCLGNBQWMsRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUNoQyxDQUFDO0FBRU47O0dBRUc7QUFDSCxNQUFNLFdBQVcsY0FBYztJQUM3QixRQUFRLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzlCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ3hCLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDO0lBQzFCLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUM7Q0FDeEI7QUFFRDs7R0FFRztBQUNILE1BQU0sV0FBVyxhQUFhO0lBQzVCLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDZixTQUFTLEVBQUUsRUFBRSxDQUFDO0lBQ2QsV0FBVyxFQUFFLE9BQU8sQ0FBQztDQUN0QjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxXQUFXLGdCQUFnQjtJQUMvQixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2YsU0FBUyxFQUFFLEVBQUUsQ0FBQztJQUNkLFdBQVcsRUFBRSxPQUFPLENBQUM7Q0FDdEI7QUFFRDs7R0FFRztBQUNILE1BQU0sV0FBVyxnQkFBZ0I7SUFDL0IsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUNyRCxpQkFBaUIsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUM5Qyw4QkFBOEIsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztJQUMvRSx5QkFBeUIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDOUUsbURBQW1EO0lBQ25ELGlCQUFpQixJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQzs7O09BR0c7SUFDSCwwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzdELFNBQVMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7UUFBRSxXQUFXLENBQUMsRUFBRSxPQUFPLENBQUE7S0FBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNoRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxXQUFXLFlBQVk7SUFDM0IsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7SUFFdEI7O09BRUc7SUFDSCxLQUFLLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRW5GOzs7T0FHRztJQUNILFlBQVksQ0FBQyxNQUFNLEVBQUUsYUFBYSxHQUFHLElBQUksQ0FBQztDQUMzQyJ9
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZpY3Rpb25fc3RyYXRlZ3kuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvdHhfcG9vbC9ldmljdGlvbi9ldmljdGlvbl9zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVuRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFcEQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSXJFLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxlQUFPLE1BQU0sYUFBYTs7OztDQUloQixDQUFDO0FBRVgsS0FBSyxhQUFhLEdBQUcsQ0FBQyxPQUFPLGFBQWEsQ0FBQyxDQUFDLE1BQU0sT0FBTyxhQUFhLENBQUMsQ0FBQztBQUV4RSxNQUFNLE1BQU0sZUFBZSxHQUN2QjtJQUNFLEtBQUssRUFBRSxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUM7SUFDdEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ2pCLFNBQVMsRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUMzQixHQUNEO0lBQ0UsS0FBSyxFQUFFLE9BQU8sYUFBYSxDQUFDLFlBQVksQ0FBQztJQUN6QyxXQUFXLEVBQUUsV0FBVyxDQUFDO0NBQzFCLEdBQ0Q7SUFDRSxLQUFLLEVBQUUsT0FBTyxhQUFhLENBQUMsV0FBVyxDQUFDO0lBQ3hDLEtBQUssRUFBRSxXQUFXLENBQUM7SUFDbkIsYUFBYSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3BCLFNBQVMsRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUMzQixDQUFDO0FBRU47O0dBRUc7QUFDSCxNQUFN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
@@ -1 +1 @@
1
- {"version":3,"file":"eviction_strategy.d.ts","sourceRoot":"","sources":["../../../../src/mem_pools/tx_pool/eviction/eviction_strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,eAAO,MAAM,aAAa;;;;CAIhB,CAAC;AAEX,KAAK,aAAa,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAExE,MAAM,MAAM,eAAe,GACvB;IACE,KAAK,EAAE,OAAO,aAAa,CAAC,SAAS,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,GACD;IACE,KAAK,EAAE,OAAO,aAAa,CAAC,YAAY,CAAC;IACzC,WAAW,EAAE,MAAM,CAAC;CACrB,GACD;IACE,KAAK,EAAE,OAAO,aAAa,CAAC,WAAW,CAAC;IACxC,KAAK,EAAE,WAAW,CAAC;IACnB,aAAa,EAAE,EAAE,EAAE,CAAC;IACpB,cAAc,EAAE,YAAY,EAAE,CAAC;CAChC,CAAC;AAEN;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,EAAE,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,EAAE,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC;IACrD,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC9C,8BAA8B,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC/E,yBAAyB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC9E,mDAAmD;IACnD,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC;;;OAGG;IACH,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7D,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChF;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEnF;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;CAC3C"}
1
+ {"version":3,"file":"eviction_strategy.d.ts","sourceRoot":"","sources":["../../../../src/mem_pools/tx_pool/eviction/eviction_strategy.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,52 @@
1
+ import { Buffer32 } from '@aztec/foundation/buffer';
2
+ import { ProtocolContractAddress } from '@aztec/protocol-contracts';
3
+ import { TxHash } from '@aztec/stdlib/tx';
4
+ import { getFeePayerBalanceDelta } from '../../../msg_validators/tx_validator/fee_payer_balance.js';
5
+ import { getTxPriorityFee } from '../priority.js';
1
6
  export const EvictionEvent = {
2
7
  TXS_ADDED: 'txs_added',
3
8
  BLOCK_MINED: 'block_mined',
4
9
  CHAIN_PRUNED: 'chain_pruned'
5
10
  };
11
+ /**
12
+ * Balance-related information about a transaction for a fee payer.
13
+ */ export class FeePayerTxInfo {
14
+ txHash;
15
+ priority;
16
+ feeLimit;
17
+ claimAmount;
18
+ isEvictable;
19
+ constructor(fields){
20
+ this.txHash = fields.txHash;
21
+ this.priority = fields.priority;
22
+ this.feeLimit = fields.feeLimit;
23
+ this.claimAmount = fields.claimAmount;
24
+ this.isEvictable = fields.isEvictable;
25
+ }
26
+ static async encode(tx, txHash) {
27
+ const { feeLimit, claimAmount } = await getFeePayerBalanceDelta(tx, ProtocolContractAddress.FeeJuice);
28
+ const priority = Buffer32.fromBigInt(getTxPriorityFee(tx)).toBuffer();
29
+ const hashBuffer = (typeof txHash === 'string' ? TxHash.fromString(txHash) : txHash).toBuffer();
30
+ const feeLimitBuffer = Buffer32.fromBigInt(feeLimit).toBuffer();
31
+ const claimAmountBuffer = Buffer32.fromBigInt(claimAmount).toBuffer();
32
+ return Buffer.concat([
33
+ priority,
34
+ hashBuffer,
35
+ feeLimitBuffer,
36
+ claimAmountBuffer
37
+ ]);
38
+ }
39
+ static decode(value, isEvictable = true) {
40
+ const priority = Buffer32.fromBuffer(value.subarray(0, Buffer32.SIZE)).toBigInt();
41
+ const hashOffset = Buffer32.SIZE;
42
+ const feeLimitOffset = hashOffset + TxHash.SIZE;
43
+ const claimOffset = feeLimitOffset + Buffer32.SIZE;
44
+ return new FeePayerTxInfo({
45
+ txHash: TxHash.fromBuffer(value.subarray(hashOffset, feeLimitOffset)),
46
+ priority,
47
+ feeLimit: Buffer32.fromBuffer(value.subarray(feeLimitOffset, claimOffset)).toBigInt(),
48
+ claimAmount: Buffer32.fromBuffer(value.subarray(claimOffset, claimOffset + Buffer32.SIZE)).toBigInt(),
49
+ isEvictable
50
+ });
51
+ }
52
+ }