@aztec/p2p 0.0.1-commit.cd76b27 → 0.0.1-commit.d0fcfb7f

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 (169) hide show
  1. package/dest/client/factory.d.ts +4 -5
  2. package/dest/client/factory.d.ts.map +1 -1
  3. package/dest/client/factory.js +20 -26
  4. package/dest/client/interface.d.ts +6 -13
  5. package/dest/client/interface.d.ts.map +1 -1
  6. package/dest/client/p2p_client.d.ts +5 -13
  7. package/dest/client/p2p_client.d.ts.map +1 -1
  8. package/dest/client/p2p_client.js +11 -84
  9. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +1 -2
  10. package/dest/config.d.ts +28 -10
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +80 -31
  13. package/dest/mem_pools/tx_pool/priority.d.ts +2 -2
  14. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  15. package/dest/mem_pools/tx_pool/priority.js +4 -4
  16. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  17. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  18. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +3 -1
  19. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +1 -1
  20. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
  21. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  22. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +2 -0
  23. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
  24. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  25. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  26. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  27. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  28. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +10 -6
  29. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
  30. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  31. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
  32. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
  33. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  34. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  35. package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
  36. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  37. package/dest/mem_pools/tx_pool_v2/index.js +1 -1
  38. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +7 -5
  39. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
  41. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +38 -7
  42. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +74 -16
  44. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
  45. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +9 -10
  47. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +2 -2
  48. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +2 -2
  50. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  51. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +168 -147
  52. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -4
  53. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  54. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  55. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -4
  56. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  57. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  58. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -8
  59. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  60. package/dest/msg_validators/proposal_validator/proposal_validator.js +48 -36
  61. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
  62. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  63. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  64. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  65. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  66. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  67. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  68. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  69. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  70. package/dest/msg_validators/tx_validator/factory.d.ts +125 -6
  71. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  72. package/dest/msg_validators/tx_validator/factory.js +226 -58
  73. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  74. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  75. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  76. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  77. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  78. package/dest/msg_validators/tx_validator/gas_validator.js +104 -37
  79. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  80. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  81. package/dest/msg_validators/tx_validator/index.js +2 -0
  82. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  83. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  84. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  85. package/dest/msg_validators/tx_validator/phases_validator.d.ts +2 -2
  86. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  87. package/dest/msg_validators/tx_validator/phases_validator.js +44 -23
  88. package/dest/services/dummy_service.d.ts +2 -3
  89. package/dest/services/dummy_service.d.ts.map +1 -1
  90. package/dest/services/dummy_service.js +1 -4
  91. package/dest/services/encoding.d.ts +2 -2
  92. package/dest/services/encoding.d.ts.map +1 -1
  93. package/dest/services/encoding.js +7 -7
  94. package/dest/services/libp2p/libp2p_service.d.ts +15 -13
  95. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  96. package/dest/services/libp2p/libp2p_service.js +87 -92
  97. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  98. package/dest/services/service.d.ts +2 -2
  99. package/dest/services/service.d.ts.map +1 -1
  100. package/dest/services/tx_provider.d.ts +3 -3
  101. package/dest/services/tx_provider.d.ts.map +1 -1
  102. package/dest/services/tx_provider.js +4 -4
  103. package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
  104. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  105. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  106. package/dest/test-helpers/mock-pubsub.d.ts +2 -3
  107. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  108. package/dest/test-helpers/mock-pubsub.js +2 -2
  109. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  110. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  111. package/dest/test-helpers/reqresp-nodes.js +2 -2
  112. package/dest/test-helpers/testbench-utils.d.ts +2 -2
  113. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  114. package/dest/test-helpers/testbench-utils.js +2 -1
  115. package/dest/testbench/p2p_client_testbench_worker.js +7 -6
  116. package/dest/testbench/worker_client_manager.d.ts +3 -1
  117. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  118. package/dest/testbench/worker_client_manager.js +4 -1
  119. package/package.json +14 -14
  120. package/src/client/factory.ts +28 -46
  121. package/src/client/interface.ts +5 -19
  122. package/src/client/p2p_client.ts +9 -114
  123. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +1 -2
  124. package/src/config.ts +115 -33
  125. package/src/mem_pools/tx_pool/priority.ts +4 -4
  126. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +3 -1
  127. package/src/mem_pools/tx_pool_v2/README.md +9 -1
  128. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +1 -1
  129. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -0
  130. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
  131. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +2 -2
  132. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +10 -6
  133. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
  134. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
  135. package/src/mem_pools/tx_pool_v2/index.ts +1 -1
  136. package/src/mem_pools/tx_pool_v2/interfaces.ts +7 -4
  137. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +102 -17
  138. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +11 -11
  139. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +1 -1
  140. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +176 -149
  141. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
  142. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
  143. package/src/msg_validators/proposal_validator/proposal_validator.ts +63 -40
  144. package/src/msg_validators/tx_validator/README.md +115 -0
  145. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -3
  146. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  147. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  148. package/src/msg_validators/tx_validator/factory.ts +366 -77
  149. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  150. package/src/msg_validators/tx_validator/gas_validator.ts +123 -27
  151. package/src/msg_validators/tx_validator/index.ts +2 -0
  152. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  153. package/src/msg_validators/tx_validator/phases_validator.ts +51 -26
  154. package/src/services/dummy_service.ts +1 -5
  155. package/src/services/encoding.ts +5 -6
  156. package/src/services/libp2p/libp2p_service.ts +101 -101
  157. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  158. package/src/services/service.ts +1 -1
  159. package/src/services/tx_provider.ts +2 -2
  160. package/src/test-helpers/make-test-p2p-clients.ts +0 -2
  161. package/src/test-helpers/mock-pubsub.ts +3 -6
  162. package/src/test-helpers/reqresp-nodes.ts +2 -5
  163. package/src/test-helpers/testbench-utils.ts +2 -1
  164. package/src/testbench/p2p_client_testbench_worker.ts +3 -6
  165. package/src/testbench/worker_client_manager.ts +11 -4
  166. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  167. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  168. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  169. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
@@ -1,5 +1,6 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
2
  import { BlockNumber, type SlotNumber } from '@aztec/foundation/branded-types';
3
+ import { maxBy } from '@aztec/foundation/collection';
3
4
  import { Fr } from '@aztec/foundation/curves/bn254';
4
5
  import { type Logger, createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
5
6
  import { RunningPromise } from '@aztec/foundation/running-promise';
@@ -16,13 +17,13 @@ import {
16
17
  CheckpointProposal,
17
18
  type CheckpointProposalCore,
18
19
  type Gossipable,
19
- P2PClientType,
20
20
  P2PMessage,
21
21
  type ValidationResult as P2PValidationResult,
22
22
  PeerErrorSeverity,
23
+ PeerErrorSeverityByHarshness,
23
24
  TopicType,
24
25
  createTopicString,
25
- getTopicsForClientAndConfig,
26
+ getTopicsForConfig,
26
27
  metricsTopicStrToLabels,
27
28
  } from '@aztec/stdlib/p2p';
28
29
  import { MerkleTreeId } from '@aztec/stdlib/trees';
@@ -69,9 +70,11 @@ import {
69
70
  } from '../../msg_validators/index.js';
70
71
  import { MessageSeenValidator } from '../../msg_validators/msg_seen_validator/msg_seen_validator.js';
71
72
  import {
72
- type MessageValidator,
73
- createTxMessageValidators,
74
- createTxReqRespValidator,
73
+ type TransactionValidator,
74
+ createFirstStageTxValidationsForGossipedTransactions,
75
+ createSecondStageTxValidationsForGossipedTransactions,
76
+ createTxValidatorForBlockProposalReceivedTxs,
77
+ createTxValidatorForReqResponseReceivedTxs,
75
78
  } from '../../msg_validators/tx_validator/factory.js';
76
79
  import { GossipSubEvent } from '../../types/index.js';
77
80
  import { type PubSubLibp2p, convertToMultiaddr } from '../../util.js';
@@ -87,6 +90,9 @@ import { PeerScoring } from '../peer-manager/peer_scoring.js';
87
90
  import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
88
91
  import type { P2PReqRespConfig } from '../reqresp/config.js';
89
92
  import {
93
+ AuthRequest,
94
+ BlockTxsRequest,
95
+ BlockTxsResponse,
90
96
  DEFAULT_SUB_PROTOCOL_VALIDATORS,
91
97
  type ReqRespInterface,
92
98
  type ReqRespResponse,
@@ -94,14 +100,9 @@ import {
94
100
  type ReqRespSubProtocolHandler,
95
101
  type ReqRespSubProtocolHandlers,
96
102
  type ReqRespSubProtocolValidators,
103
+ StatusMessage,
97
104
  type SubProtocolMap,
98
105
  ValidationError,
99
- } from '../reqresp/index.js';
100
- import {
101
- AuthRequest,
102
- BlockTxsRequest,
103
- BlockTxsResponse,
104
- StatusMessage,
105
106
  pingHandler,
106
107
  reqGoodbyeHandler,
107
108
  reqRespBlockHandler,
@@ -135,7 +136,7 @@ type ReceivedMessageValidationResult<T, M = undefined> =
135
136
  /**
136
137
  * Lib P2P implementation of the P2PService interface.
137
138
  */
138
- export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends WithTracer implements P2PService {
139
+ export class LibP2PService extends WithTracer implements P2PService {
139
140
  private discoveryRunningPromise?: RunningPromise;
140
141
  private msgIdSeenValidators: Record<TopicType, MessageSeenValidator> = {} as Record<TopicType, MessageSeenValidator>;
141
142
 
@@ -182,7 +183,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
182
183
  protected logger: Logger;
183
184
 
184
185
  constructor(
185
- private clientType: T,
186
186
  private config: P2PConfig,
187
187
  protected node: PubSubLibp2p,
188
188
  private peerDiscoveryService: PeerDiscoveryService,
@@ -224,10 +224,12 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
224
224
  this.protocolVersion,
225
225
  );
226
226
 
227
- this.blockProposalValidator = new BlockProposalValidator(epochCache, { txsPermitted: !config.disableTransactions });
228
- this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, {
227
+ const proposalValidatorOpts = {
229
228
  txsPermitted: !config.disableTransactions,
230
- });
229
+ maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint,
230
+ };
231
+ this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
232
+ this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
231
233
  this.checkpointAttestationValidator = config.fishermanMode
232
234
  ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry)
233
235
  : new CheckpointAttestationValidator(epochCache);
@@ -235,11 +237,11 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
235
237
  this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
236
238
 
237
239
  this.blockReceivedCallback = async (block: BlockProposal): Promise<boolean> => {
238
- this.logger.debug(
239
- `Handler not yet registered: Block received callback not set. Received block for slot ${block.slotNumber} from peer.`,
240
+ this.logger.warn(
241
+ `Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`,
240
242
  { p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier() },
241
243
  );
242
- return false;
244
+ return true;
243
245
  };
244
246
 
245
247
  this.checkpointReceivedCallback = (
@@ -262,8 +264,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
262
264
  * @param txPool - The transaction pool to be accessed by the service.
263
265
  * @returns The new service.
264
266
  */
265
- public static async new<T extends P2PClientType>(
266
- clientType: T,
267
+ public static async new(
267
268
  config: P2PConfig,
268
269
  peerId: PeerId,
269
270
  deps: {
@@ -475,7 +476,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
475
476
  peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId);
476
477
 
477
478
  return new LibP2PService(
478
- clientType,
479
479
  config,
480
480
  node,
481
481
  peerDiscoveryService,
@@ -549,7 +549,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
549
549
  await this.node.start();
550
550
 
551
551
  // Subscribe to standard GossipSub topics by default
552
- for (const topic of getTopicsForClientAndConfig(this.clientType, this.config.disableTransactions)) {
552
+ for (const topic of getTopicsForConfig(this.config.disableTransactions)) {
553
553
  this.subscribeToTopic(this.topicStrings[topic]);
554
554
  }
555
555
 
@@ -818,9 +818,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
818
818
  if (msg.topic === this.topicStrings[TopicType.tx]) {
819
819
  await this.handleGossipedTx(p2pMessage.payload, msgId, source);
820
820
  } else if (msg.topic === this.topicStrings[TopicType.checkpoint_attestation]) {
821
- if (this.clientType === P2PClientType.Full) {
822
- await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
823
- }
821
+ await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
824
822
  } else if (msg.topic === this.topicStrings[TopicType.block_proposal]) {
825
823
  await this.processBlockFromPeer(p2pMessage.payload, msgId, source);
826
824
  } else if (msg.topic === this.topicStrings[TopicType.checkpoint_proposal]) {
@@ -906,15 +904,45 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
906
904
  protected async handleGossipedTx(payloadData: Buffer, msgId: string, source: PeerId) {
907
905
  const validationFunc: () => Promise<ReceivedMessageValidationResult<Tx>> = async () => {
908
906
  const tx = Tx.fromBuffer(payloadData);
909
- const isValid = await this.validatePropagatedTx(tx, source);
910
- if (!isValid) {
911
- this.logger.trace(`Rejecting invalid propagated tx`, {
912
- [Attributes.P2P_ID]: source.toString(),
913
- });
907
+
908
+ const currentBlockNumber = await this.archiver.getBlockNumber();
909
+ const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
910
+
911
+ // Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header)
912
+ const firstStageValidators = await this.createFirstStageMessageValidators(currentBlockNumber, nextSlotTimestamp);
913
+ const firstStageOutcome = await this.runValidations(tx, firstStageValidators);
914
+ if (!firstStageOutcome.allPassed) {
915
+ const { name } = firstStageOutcome.failure;
916
+ let { severity } = firstStageOutcome.failure;
917
+
918
+ // Double spend validator has a special case handler. We perform more detailed examination
919
+ // as to how recently the nullifier was entered into the tree and if the transaction should
920
+ // have 'known' the nullifier existed. This determines the severity of the penalty applied to the peer.
921
+ if (name === 'doubleSpendValidator') {
922
+ const txBlockNumber = BlockNumber(currentBlockNumber + 1);
923
+ severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
924
+ }
925
+
926
+ this.peerManager.penalizePeer(source, severity);
927
+ return { result: TopicValidatorResult.Reject };
928
+ }
929
+
930
+ // Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
931
+ const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
932
+ if (canAdd === 'ignored') {
933
+ return { result: TopicValidatorResult.Ignore, obj: tx };
934
+ }
935
+
936
+ // Stage 2: expensive proof verification
937
+ const secondStageValidators = this.createSecondStageMessageValidators();
938
+ const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
939
+ if (!secondStageOutcome.allPassed) {
940
+ const { severity } = secondStageOutcome.failure;
941
+ this.peerManager.penalizePeer(source, severity);
914
942
  return { result: TopicValidatorResult.Reject };
915
943
  }
916
944
 
917
- // Propagate only on pool acceptance
945
+ // Pool add: persist the tx
918
946
  const txHash = tx.getTxHash();
919
947
  const addResult = await this.mempools.txPool.addPendingTxs([tx], { source: 'gossip' });
920
948
 
@@ -922,7 +950,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
922
950
  const wasIgnored = addResult.ignored.some(h => h.equals(txHash));
923
951
 
924
952
  this.logger.trace(`Validate propagated tx`, {
925
- isValid,
926
953
  wasAccepted,
927
954
  wasIgnored,
928
955
  [Attributes.P2P_ID]: source.toString(),
@@ -1165,7 +1192,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1165
1192
  // Note: Validators do NOT attest to individual blocks, only to checkpoint proposals.
1166
1193
  const isValid = await this.blockReceivedCallback(block, sender);
1167
1194
  if (!isValid) {
1168
- this.logger.warn(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
1195
+ this.logger.info(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
1169
1196
  }
1170
1197
  }
1171
1198
 
@@ -1537,43 +1564,12 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1537
1564
  }
1538
1565
 
1539
1566
  protected createRequestedTxValidator(): TxValidator {
1540
- return createTxReqRespValidator(this.proofVerifier, {
1567
+ return createTxValidatorForReqResponseReceivedTxs(this.proofVerifier, {
1541
1568
  l1ChainId: this.config.l1ChainId,
1542
1569
  rollupVersion: this.config.rollupVersion,
1543
1570
  });
1544
1571
  }
1545
1572
 
1546
- @trackSpan('Libp2pService.validatePropagatedTx', tx => ({
1547
- [Attributes.TX_HASH]: tx.getTxHash().toString(),
1548
- }))
1549
- protected async validatePropagatedTx(tx: Tx, peerId: PeerId): Promise<boolean> {
1550
- const currentBlockNumber = await this.archiver.getBlockNumber();
1551
-
1552
- // We accept transactions if they are not expired by the next slot (checked based on the ExpirationTimestamp field)
1553
- const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
1554
- const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp);
1555
-
1556
- for (const validator of messageValidators) {
1557
- const outcome = await this.runValidations(tx, validator);
1558
-
1559
- if (outcome.allPassed) {
1560
- continue;
1561
- }
1562
- const { name } = outcome.failure;
1563
- let { severity } = outcome.failure;
1564
-
1565
- // Double spend validator has a special case handler
1566
- if (name === 'doubleSpendValidator') {
1567
- const txBlockNumber = BlockNumber(currentBlockNumber + 1); // tx is expected to be in the next block
1568
- severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
1569
- }
1570
-
1571
- this.peerManager.penalizePeer(peerId, severity);
1572
- return false;
1573
- }
1574
- return true;
1575
- }
1576
-
1577
1573
  private async getGasFees(blockNumber: BlockNumber): Promise<GasFees> {
1578
1574
  if (blockNumber === this.feesCache?.blockNumber) {
1579
1575
  return this.feesCache.gasFees;
@@ -1601,60 +1597,62 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1601
1597
  };
1602
1598
  }
1603
1599
 
1604
- public async validate(txs: Tx[]): Promise<void> {
1605
- const currentBlockNumber = await this.archiver.getBlockNumber();
1606
-
1607
- // We accept transactions if they are not expired by the next slot (checked based on the ExpirationTimestamp field)
1608
- const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
1609
- const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp);
1600
+ public async validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void> {
1601
+ const validator = createTxValidatorForBlockProposalReceivedTxs(
1602
+ this.proofVerifier,
1603
+ { l1ChainId: this.config.l1ChainId, rollupVersion: this.config.rollupVersion },
1604
+ this.logger.getBindings(),
1605
+ );
1610
1606
 
1611
- await Promise.all(
1607
+ const results = await Promise.all(
1612
1608
  txs.map(async tx => {
1613
- for (const validator of messageValidators) {
1614
- const outcome = await this.runValidations(tx, validator);
1615
- if (!outcome.allPassed) {
1616
- throw new Error('Invalid tx detected', { cause: { outcome } });
1617
- }
1618
- }
1609
+ const result = await validator.validateTx(tx);
1610
+ return result.result !== 'invalid';
1619
1611
  }),
1620
1612
  );
1613
+ if (results.some(value => value === false)) {
1614
+ throw new Error('Invalid tx detected');
1615
+ }
1621
1616
  }
1622
1617
 
1623
- /**
1624
- * Create message validators for the given block number and timestamp.
1625
- *
1626
- * Each validator is a pair of a validator and a severity.
1627
- * If a validator fails, the peer is penalized with the severity of the validator.
1628
- *
1629
- * @param currentBlockNumber - The current synced block number.
1630
- * @param nextSlotTimestamp - The timestamp of the next slot (used to validate txs are not expired).
1631
- * @returns The message validators.
1632
- */
1633
- private async createMessageValidators(
1618
+ /** Creates the first stage (fast) validators for gossiped transactions. */
1619
+ protected async createFirstStageMessageValidators(
1634
1620
  currentBlockNumber: BlockNumber,
1635
1621
  nextSlotTimestamp: UInt64,
1636
- ): Promise<Record<string, MessageValidator>[]> {
1622
+ ): Promise<Record<string, TransactionValidator>> {
1637
1623
  const gasFees = await this.getGasFees(currentBlockNumber);
1638
- const allowedInSetup = this.config.txPublicSetupAllowList ?? (await getDefaultAllowedSetupFunctions());
1639
-
1640
- const blockNumberInWhichTheTxIsConsideredToBeIncluded = BlockNumber(currentBlockNumber + 1);
1641
-
1642
- return createTxMessageValidators(
1624
+ const allowedInSetup = [
1625
+ ...(await getDefaultAllowedSetupFunctions()),
1626
+ ...(this.config.txPublicSetupAllowListExtend ?? []),
1627
+ ];
1628
+ const blockNumber = BlockNumber(currentBlockNumber + 1);
1629
+ const l1Constants = await this.archiver.getL1Constants();
1630
+
1631
+ return createFirstStageTxValidationsForGossipedTransactions(
1643
1632
  nextSlotTimestamp,
1644
- blockNumberInWhichTheTxIsConsideredToBeIncluded,
1633
+ blockNumber,
1645
1634
  this.worldStateSynchronizer,
1646
1635
  gasFees,
1647
1636
  this.config.l1ChainId,
1648
1637
  this.config.rollupVersion,
1649
1638
  protocolContractsHash,
1650
1639
  this.archiver,
1651
- this.proofVerifier,
1652
1640
  !this.config.disableTransactions,
1653
1641
  allowedInSetup,
1654
1642
  this.logger.getBindings(),
1643
+ {
1644
+ rollupManaLimit: l1Constants.rollupManaLimit,
1645
+ maxBlockL2Gas: this.config.validateMaxL2BlockGas,
1646
+ maxBlockDAGas: this.config.validateMaxDABlockGas,
1647
+ },
1655
1648
  );
1656
1649
  }
1657
1650
 
1651
+ /** Creates the second stage (expensive proof verification) validators for gossiped transactions. */
1652
+ protected createSecondStageMessageValidators(): Record<string, TransactionValidator> {
1653
+ return createSecondStageTxValidationsForGossipedTransactions(this.proofVerifier, this.logger.getBindings());
1654
+ }
1655
+
1658
1656
  /**
1659
1657
  * Run validations on a tx.
1660
1658
  * @param tx - The tx to validate.
@@ -1663,7 +1661,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1663
1661
  */
1664
1662
  private async runValidations(
1665
1663
  tx: Tx,
1666
- messageValidators: Record<string, MessageValidator>,
1664
+ messageValidators: Record<string, TransactionValidator>,
1667
1665
  ): Promise<ValidationOutcome> {
1668
1666
  const validationPromises = Object.entries(messageValidators).map(async ([name, { validator, severity }]) => {
1669
1667
  const { result } = await validator.validateTx(tx);
@@ -1672,8 +1670,10 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1672
1670
 
1673
1671
  // A promise that resolves when all validations have been run
1674
1672
  const allValidations = await Promise.all(validationPromises);
1675
- const failed = allValidations.find(x => !x.isValid);
1676
- if (failed) {
1673
+ const failures = allValidations.filter(x => !x.isValid);
1674
+ if (failures.length > 0) {
1675
+ // Pick the most severe failure (lowest tolerance = harshest penalty)
1676
+ const failed = maxBy(failures, f => PeerErrorSeverityByHarshness.indexOf(f.severity))!;
1677
1677
  return {
1678
1678
  allPassed: false,
1679
1679
  failure: {
@@ -1,7 +1,7 @@
1
1
  import type { ClientProtocolCircuitVerifier } from '@aztec/stdlib/interfaces/server';
2
2
  import { Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
3
3
 
4
- import { createTxReqRespValidator } from '../../../msg_validators/tx_validator/factory.js';
4
+ import { createTxValidatorForReqResponseReceivedTxs } from '../../../msg_validators/index.js';
5
5
 
6
6
  export interface BatchRequestTxValidatorConfig {
7
7
  l1ChainId: number;
@@ -29,7 +29,7 @@ export class BatchRequestTxValidator implements IBatchRequestTxValidator {
29
29
  }
30
30
 
31
31
  static createRequestedTxValidator(config: BatchRequestTxValidatorConfig): TxValidator {
32
- return createTxReqRespValidator(config.proofVerifier, {
32
+ return createTxValidatorForReqResponseReceivedTxs(config.proofVerifier, {
33
33
  l1ChainId: config.l1ChainId,
34
34
  rollupVersion: config.rollupVersion,
35
35
  });
@@ -139,7 +139,7 @@ export interface P2PService {
139
139
  /** Returns the number of peers in the GossipSub mesh for a given topic type. */
140
140
  getGossipMeshPeerCount(topicType: TopicType): number;
141
141
 
142
- validate(txs: Tx[]): Promise<void>;
142
+ validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void>;
143
143
 
144
144
  addReqRespSubProtocol(
145
145
  subProtocol: ReqRespSubProtocol,
@@ -25,7 +25,7 @@ export class TxProvider implements ITxProvider {
25
25
  constructor(
26
26
  private txCollection: TxCollection,
27
27
  private txPool: TxPoolV2,
28
- private txValidator: Pick<P2PClient, 'validate'>,
28
+ private blockProposalTransactionValidator: Pick<P2PClient, 'validateTxsReceivedInBlockProposal'>,
29
29
  private log: Logger = createLogger('p2p:tx-collector'),
30
30
  client: TelemetryClient = getTelemetryClient(),
31
31
  ) {
@@ -227,7 +227,7 @@ export class TxProvider implements ITxProvider {
227
227
  if (txs.length === 0) {
228
228
  return;
229
229
  }
230
- await this.txValidator.validate(txs);
230
+ await this.blockProposalTransactionValidator.validateTxsReceivedInBlockProposal(txs);
231
231
  await this.txPool.addProtectedTxs(txs, blockHeader);
232
232
  }
233
233
  }
@@ -7,7 +7,6 @@ import { sleep } from '@aztec/foundation/sleep';
7
7
  import type { DataStoreConfig } from '@aztec/kv-store/config';
8
8
  import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
9
9
  import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
10
- import { P2PClientType } from '@aztec/stdlib/p2p';
11
10
 
12
11
  import { createP2PClient } from '../client/index.js';
13
12
  import type { P2PClient } from '../client/p2p_client.js';
@@ -98,7 +97,6 @@ export async function makeTestP2PClient(
98
97
  const kvStore = await openTmpStore('test');
99
98
 
100
99
  const client = await createP2PClient(
101
- P2PClientType.Full,
102
100
  config,
103
101
  l2BlockSource,
104
102
  proofVerifier,
@@ -4,7 +4,6 @@ import type { AztecAsyncKVStore } from '@aztec/kv-store';
4
4
  import type { L2BlockSource } from '@aztec/stdlib/block';
5
5
  import type { ContractDataSource } from '@aztec/stdlib/contract';
6
6
  import type { ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
7
- import { P2PClientType } from '@aztec/stdlib/p2p';
8
7
  import type { TelemetryClient } from '@aztec/telemetry-client';
9
8
 
10
9
  import type { GossipsubEvents, GossipsubMessage } from '@chainsafe/libp2p-gossipsub';
@@ -42,11 +41,10 @@ type GossipSubService = PubSubLibp2p['services']['pubsub'];
42
41
  * Given a mock gossip sub network, returns a factory function that creates an instance LibP2PService connected to it.
43
42
  * Designed to be used in tests in P2PClientDeps.p2pServiceFactory.
44
43
  */
45
- export function getMockPubSubP2PServiceFactory<T extends P2PClientType>(
44
+ export function getMockPubSubP2PServiceFactory(
46
45
  network: MockGossipSubNetwork,
47
- ): (...args: Parameters<(typeof LibP2PService<T>)['new']>) => Promise<LibP2PService<T>> {
46
+ ): (...args: Parameters<(typeof LibP2PService)['new']>) => Promise<LibP2PService> {
48
47
  return (
49
- clientType: P2PClientType,
50
48
  config: P2PConfig,
51
49
  peerId: PeerId,
52
50
  deps: {
@@ -66,8 +64,7 @@ export function getMockPubSubP2PServiceFactory<T extends P2PClientType>(
66
64
  const peerManager = new DummyPeerManager(peerId, network);
67
65
  const reqresp: ReqRespInterface = new MockReqResp(peerId, network);
68
66
  const peerDiscoveryService = new DummyPeerDiscoveryService();
69
- const service = new LibP2PService<T>(
70
- clientType as T,
67
+ const service = new LibP2PService(
71
68
  config,
72
69
  libp2p,
73
70
  peerDiscoveryService,
@@ -12,7 +12,6 @@ import type {
12
12
  IVCProofVerificationResult,
13
13
  WorldStateSynchronizer,
14
14
  } from '@aztec/stdlib/interfaces/server';
15
- import type { P2PClientType } from '@aztec/stdlib/p2p';
16
15
  import type { Tx } from '@aztec/stdlib/tx';
17
16
  import { compressComponentVersions } from '@aztec/stdlib/versioning';
18
17
  import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
@@ -107,8 +106,7 @@ export async function createLibp2pNode(
107
106
  *
108
107
  *
109
108
  */
110
- export async function createTestLibP2PService<T extends P2PClientType>(
111
- clientType: T,
109
+ export async function createTestLibP2PService(
112
110
  boostrapAddrs: string[] = [],
113
111
  archiver: L2BlockSource & ContractDataSource,
114
112
  worldStateSynchronizer: WorldStateSynchronizer,
@@ -159,8 +157,7 @@ export async function createTestLibP2PService<T extends P2PClientType>(
159
157
  p2pNode.services.pubsub.score.params.appSpecificScore = (peerId: string) =>
160
158
  peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId);
161
159
 
162
- return new LibP2PService<T>(
163
- clientType,
160
+ return new LibP2PService(
164
161
  config,
165
162
  p2pNode as PubSubLibp2p,
166
163
  discoveryService,
@@ -76,7 +76,7 @@ export class InMemoryTxPool extends EventEmitter implements TxPoolV2 {
76
76
  return Promise.resolve({ accepted, ignored: [], rejected: [] });
77
77
  }
78
78
 
79
- canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored' | 'rejected'> {
79
+ canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored'> {
80
80
  const key = tx.getTxHash().toString();
81
81
  if (this.txsByHash.has(key)) {
82
82
  return Promise.resolve('ignored');
@@ -292,6 +292,7 @@ export function createMockEpochCache(): EpochCacheInterface {
292
292
  ethereumSlotDuration: 1,
293
293
  proofSubmissionEpochs: 1,
294
294
  targetCommitteeSize: 48,
295
+ rollupManaLimit: Number.MAX_SAFE_INTEGER,
295
296
  }),
296
297
  };
297
298
  }
@@ -19,7 +19,7 @@ import { protocolContractsHash } from '@aztec/protocol-contracts';
19
19
  import type { L2BlockSource } from '@aztec/stdlib/block';
20
20
  import type { ContractDataSource } from '@aztec/stdlib/contract';
21
21
  import type { ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
22
- import { type BlockProposal, P2PClientType, P2PMessage } from '@aztec/stdlib/p2p';
22
+ import { type BlockProposal, P2PMessage } from '@aztec/stdlib/p2p';
23
23
  import { ChonkProof } from '@aztec/stdlib/proofs';
24
24
  import { makeAztecAddress, makeBlockHeader, makeBlockProposal, mockTx } from '@aztec/stdlib/testing';
25
25
  import { Tx, TxHash, type TxValidationResult } from '@aztec/stdlib/tx';
@@ -86,12 +86,11 @@ export interface BenchReadyMessage {
86
86
  }
87
87
  const txCache = new Map<number, Tx[]>();
88
88
 
89
- class TestLibP2PService<T extends P2PClientType = P2PClientType.Full> extends LibP2PService<T> {
89
+ class TestLibP2PService extends LibP2PService {
90
90
  private disableTxValidation: boolean;
91
91
  private gossipMessageCount = 0;
92
92
 
93
93
  constructor(
94
- clientType: T,
95
94
  config: P2PConfig,
96
95
  node: PubSubLibp2p,
97
96
  peerDiscoveryService: PeerDiscoveryService,
@@ -107,7 +106,6 @@ class TestLibP2PService<T extends P2PClientType = P2PClientType.Full> extends Li
107
106
  disableTxValidation = true,
108
107
  ) {
109
108
  super(
110
- clientType,
111
109
  config,
112
110
  node,
113
111
  peerDiscoveryService,
@@ -342,6 +340,7 @@ process.on('message', async msg => {
342
340
  const config: P2PConfig = {
343
341
  ...rawConfig,
344
342
  peerIdPrivateKey: rawConfig.peerIdPrivateKey ? new SecretValue(rawConfig.peerIdPrivateKey) : undefined,
343
+ priceBumpPercentage: 10n,
345
344
  } as P2PConfig;
346
345
 
347
346
  workerConfig = config;
@@ -365,7 +364,6 @@ process.on('message', async msg => {
365
364
  };
366
365
 
367
366
  const client = await createP2PClient(
368
- P2PClientType.Full,
369
367
  config as P2PConfig & DataStoreConfig,
370
368
  l2BlockSource,
371
369
  proofVerifier as ClientProtocolCircuitVerifier,
@@ -378,7 +376,6 @@ process.on('message', async msg => {
378
376
  );
379
377
 
380
378
  const testService = new TestLibP2PService(
381
- P2PClientType.Full,
382
379
  config,
383
380
  (client as any).p2pService.node,
384
381
  (client as any).p2pService.peerDiscoveryService,
@@ -81,13 +81,15 @@ class WorkerClientManager {
81
81
  * Note: We send the raw peerIdPrivateKey string instead of SecretValue
82
82
  * because SecretValue.toJSON() returns '[Redacted]', losing the value.
83
83
  * The worker must re-wrap it in SecretValue.
84
+ * We also omit priceBumpPercentage since it's a bigint and can't be
85
+ * serialized over IPC (which uses JSON under the hood).
84
86
  */
85
87
  private createClientConfig(
86
88
  clientIndex: number,
87
89
  port: number,
88
90
  otherNodes: string[],
89
- ): Omit<P2PConfig, 'peerIdPrivateKey'> & { peerIdPrivateKey: string } & Partial<ChainConfig> {
90
- return {
91
+ ): Omit<P2PConfig, 'peerIdPrivateKey' | 'priceBumpPercentage'> & { peerIdPrivateKey: string } & Partial<ChainConfig> {
92
+ const { priceBumpPercentage: _, ...config } = {
91
93
  ...getP2PDefaultConfig(),
92
94
  p2pEnabled: true,
93
95
  peerIdPrivateKey: this.peerIdPrivateKeys[clientIndex],
@@ -96,7 +98,10 @@ class WorkerClientManager {
96
98
  p2pPort: port,
97
99
  bootstrapNodes: [...otherNodes],
98
100
  ...this.p2pConfig,
99
- } as Omit<P2PConfig, 'peerIdPrivateKey'> & { peerIdPrivateKey: string } & Partial<ChainConfig>;
101
+ };
102
+ return config as Omit<P2PConfig, 'peerIdPrivateKey' | 'priceBumpPercentage'> & {
103
+ peerIdPrivateKey: string;
104
+ } & Partial<ChainConfig>;
100
105
  }
101
106
 
102
107
  /**
@@ -104,7 +109,9 @@ class WorkerClientManager {
104
109
  * Config uses raw string for peerIdPrivateKey (not SecretValue) for IPC serialization.
105
110
  */
106
111
  private spawnWorkerProcess(
107
- config: Omit<P2PConfig, 'peerIdPrivateKey'> & { peerIdPrivateKey: string } & Partial<ChainConfig>,
112
+ config: Omit<P2PConfig, 'peerIdPrivateKey' | 'priceBumpPercentage'> & {
113
+ peerIdPrivateKey: string;
114
+ } & Partial<ChainConfig>,
108
115
  clientIndex: number,
109
116
  ): [ChildProcess, Promise<void>] {
110
117
  const useCompiled = existsSync(workerJsPath);
@@ -1,23 +0,0 @@
1
- import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
- import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
3
- import type { EthAddress } from '@aztec/foundation/eth-address';
4
- import { type BlockProposal, type CheckpointProposal, type ValidationResult } from '@aztec/stdlib/p2p';
5
- import type { TxHash } from '@aztec/stdlib/tx';
6
- import type { MockProxy } from 'jest-mock-extended';
7
- export interface ProposalValidatorTestParams<TProposal extends BlockProposal | CheckpointProposal> {
8
- validatorFactory: (epochCache: EpochCacheInterface, opts: {
9
- txsPermitted: boolean;
10
- }) => {
11
- validate: (proposal: TProposal) => Promise<ValidationResult>;
12
- };
13
- makeProposal: (options?: any) => Promise<TProposal>;
14
- makeHeader: (epochNumber: number | bigint, slotNumber: number | bigint, blockNumber: number | bigint) => any;
15
- getSigner: () => Secp256k1Signer;
16
- getAddress: (signer?: Secp256k1Signer) => EthAddress;
17
- getSlot: (slot: number | bigint) => any;
18
- getTxHashes: (n: number) => TxHash[];
19
- getTxs: () => any[];
20
- epochCacheMock: () => MockProxy<EpochCacheInterface>;
21
- }
22
- export declare function sharedProposalValidatorTests<TProposal extends BlockProposal | CheckpointProposal>(params: ProposalValidatorTestParams<TProposal>): void;
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfdmFsaWRhdG9yX3Rlc3Rfc3VpdGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy9wcm9wb3NhbF92YWxpZGF0b3IvcHJvcG9zYWxfdmFsaWRhdG9yX3Rlc3Rfc3VpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsS0FBSyxhQUFhLEVBQ2xCLEtBQUssa0JBQWtCLEVBRXZCLEtBQUssZ0JBQWdCLEVBQ3RCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFL0MsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsTUFBTSxXQUFXLDJCQUEyQixDQUFDLFNBQVMsU0FBUyxhQUFhLEdBQUcsa0JBQWtCO0lBQy9GLGdCQUFnQixFQUFFLENBQ2hCLFVBQVUsRUFBRSxtQkFBbUIsRUFDL0IsSUFBSSxFQUFFO1FBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQTtLQUFFLEtBQzVCO1FBQUUsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsS0FBSyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtLQUFFLENBQUM7SUFDdEUsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwRCxVQUFVLEVBQUUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxHQUFHLE1BQU0sS0FBSyxHQUFHLENBQUM7SUFDN0csU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0lBQ2pDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLGVBQWUsS0FBSyxVQUFVLENBQUM7SUFDckQsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxNQUFNLEtBQUssR0FBRyxDQUFDO0lBQ3hDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7SUFDckMsTUFBTSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDcEIsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7Q0FDdEQ7QUFFRCx3QkFBZ0IsNEJBQTRCLENBQUMsU0FBUyxTQUFTLGFBQWEsR0FBRyxrQkFBa0IsRUFDL0YsTUFBTSxFQUFFLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxRQXdNL0MifQ==
@@ -1 +0,0 @@
1
- {"version":3,"file":"proposal_validator_test_suite.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/proposal_validator_test_suite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EAEvB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,2BAA2B,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB;IAC/F,gBAAgB,EAAE,CAChB,UAAU,EAAE,mBAAmB,EAC/B,IAAI,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,KAC5B;QAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAA;KAAE,CAAC;IACtE,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC;IAC7G,SAAS,EAAE,MAAM,eAAe,CAAC;IACjC,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,eAAe,KAAK,UAAU,CAAC;IACrD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC;IACxC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,SAAS,CAAC,mBAAmB,CAAC,CAAC;CACtD;AAED,wBAAgB,4BAA4B,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB,EAC/F,MAAM,EAAE,2BAA2B,CAAC,SAAS,CAAC,QAwM/C"}