@aztec/p2p 0.0.1-commit.b33fc05d0 → 0.0.1-commit.b3d3157a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -3
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +9 -1
- package/dest/client/factory.d.ts +4 -3
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +26 -14
- package/dest/client/interface.d.ts +14 -5
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +13 -9
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +88 -26
- package/dest/config.d.ts +135 -99
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +62 -7
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/reqresp.error.d.ts +1 -20
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +0 -21
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +99 -59
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +265 -199
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +181 -65
- package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +6 -4
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +1 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +17 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -5
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +1 -7
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +2 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +10 -5
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +13 -3
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +20 -7
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +3 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +84 -86
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
- package/dest/msg_validators/clock_tolerance.d.ts +12 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +56 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -2
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -2
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +10 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +46 -12
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +36 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +14 -5
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +36 -13
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +36 -4
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +50 -33
- package/dest/msg_validators/tx_validator/index.d.ts +3 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +2 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +21 -1
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +28 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +5 -5
- package/dest/services/discv5/discV5_service.d.ts +2 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +35 -8
- package/dest/services/dummy_service.d.ts +11 -15
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +12 -16
- package/dest/services/encoding.d.ts +5 -1
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +7 -1
- package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +21 -4
- package/dest/services/libp2p/instrumentation.d.ts +3 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +14 -0
- package/dest/services/libp2p/libp2p_service.d.ts +36 -46
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +272 -262
- package/dest/services/peer-manager/peer_manager.d.ts +6 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +38 -10
- package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +32 -10
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -8
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +81 -86
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
- package/dest/services/reqresp/config.d.ts +3 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/interface.d.ts +16 -18
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +10 -20
- package/dest/services/reqresp/metrics.d.ts +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +0 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
- package/dest/services/reqresp/protocols/index.d.ts +1 -2
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +0 -1
- package/dest/services/reqresp/protocols/tx.d.ts +1 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +1 -3
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
- package/dest/services/reqresp/reqresp.d.ts +7 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +41 -214
- package/dest/services/service.d.ts +9 -12
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +2 -23
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +2 -55
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
- package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +39 -29
- package/dest/services/tx_collection/index.d.ts +2 -3
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +0 -1
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +0 -2
- package/dest/services/tx_collection/request_tracker.d.ts +53 -0
- package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/request_tracker.js +84 -0
- package/dest/services/tx_collection/tx_collection.d.ts +36 -55
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +275 -119
- package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +2 -2
- package/dest/services/tx_collection/tx_source.d.ts +6 -5
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +9 -7
- package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +4 -14
- package/dest/services/tx_provider.d.ts +3 -1
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +3 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +5 -2
- package/dest/test-helpers/mock-pubsub.d.ts +23 -9
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +44 -44
- package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +16 -18
- package/dest/test-helpers/test_tx_provider.d.ts +3 -1
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
- package/dest/test-helpers/test_tx_provider.js +3 -0
- package/dest/test-helpers/testbench-utils.d.ts +12 -14
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +38 -14
- package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +83 -38
- package/dest/testbench/worker_client_manager.d.ts +10 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +51 -9
- package/dest/util.d.ts +11 -6
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +35 -14
- package/dest/versioning.d.ts +3 -6
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +3 -24
- package/package.json +15 -14
- package/src/bootstrap/bootstrap.ts +9 -1
- package/src/client/factory.ts +49 -7
- package/src/client/interface.ts +15 -11
- package/src/client/p2p_client.ts +104 -47
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +123 -6
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +0 -25
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +316 -241
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +204 -68
- package/src/mem_pools/attestation_pool/mocks.ts +13 -8
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +5 -1
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
- package/src/mem_pools/tx_pool_v2/interfaces.ts +9 -4
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +31 -9
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +13 -1
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +85 -92
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -7
- package/src/msg_validators/clock_tolerance.ts +73 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +12 -2
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +17 -2
- package/src/msg_validators/proposal_validator/proposal_validator.ts +54 -10
- package/src/msg_validators/tx_validator/README.md +15 -3
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +3 -3
- package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
- package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +44 -1
- package/src/msg_validators/tx_validator/factory.ts +46 -8
- package/src/msg_validators/tx_validator/gas_validator.ts +82 -33
- package/src/msg_validators/tx_validator/index.ts +2 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +31 -1
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +38 -5
- package/src/services/dummy_service.ts +14 -39
- package/src/services/encoding.ts +9 -1
- package/src/services/gossipsub/topic_score_params.ts +36 -4
- package/src/services/libp2p/instrumentation.ts +14 -0
- package/src/services/libp2p/libp2p_service.ts +302 -300
- package/src/services/peer-manager/peer_manager.ts +44 -10
- package/src/services/peer-manager/peer_scoring.ts +27 -5
- package/src/services/reqresp/README.md +215 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +77 -95
- package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/config.ts +2 -2
- package/src/services/reqresp/interface.ts +21 -47
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/tx.ts +1 -3
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
- package/src/services/reqresp/reqresp.ts +45 -260
- package/src/services/service.ts +12 -28
- package/src/services/tx_collection/config.ts +3 -80
- package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/index.ts +1 -6
- package/src/services/tx_collection/instrumentation.ts +1 -7
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +331 -176
- package/src/services/tx_collection/tx_collection_sink.ts +2 -2
- package/src/services/tx_collection/tx_source.ts +8 -7
- package/src/services/tx_file_store/tx_file_store.ts +5 -17
- package/src/services/tx_provider.ts +5 -0
- package/src/test-helpers/make-test-p2p-clients.ts +3 -0
- package/src/test-helpers/mock-pubsub.ts +46 -60
- package/src/test-helpers/reqresp-nodes.ts +12 -22
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +50 -28
- package/src/testbench/p2p_client_testbench_worker.ts +87 -54
- package/src/testbench/worker_client_manager.ts +59 -20
- package/src/util.ts +32 -17
- package/src/versioning.ts +3 -33
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -16
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -402
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
- package/dest/services/reqresp/protocols/block.d.ts +0 -9
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.js +0 -32
- package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -327
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
- package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -211
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -23
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -321
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/fast_tx_collection.ts +0 -387
- package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
- package/src/services/tx_collection/slow_tx_collection.ts +0 -266
|
@@ -28,9 +28,16 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
28
28
|
signers = Array.from({ length: NUMBER_OF_SIGNERS_PER_TEST }, () => Secp256k1Signer.random());
|
|
29
29
|
});
|
|
30
30
|
|
|
31
|
+
/**
|
|
32
|
+
* Build attestations from each signer over the *same* signed payload (same header,
|
|
33
|
+
* archive, feeAssetPriceModifier). Required by the new pool, which deduplicates by
|
|
34
|
+
* payload hash and treats attestations from different signers as distinct entries
|
|
35
|
+
* only when the payload itself matches.
|
|
36
|
+
*/
|
|
31
37
|
const createCheckpointAttestationsForSlot = (slotNumber: number, archive?: Fr) => {
|
|
32
38
|
const archiveToUse = archive ?? Fr.random();
|
|
33
|
-
|
|
39
|
+
const sharedHeader = CheckpointHeader.random({ slotNumber: SlotNumber(slotNumber) });
|
|
40
|
+
return signers.map(signer => mockCheckpointAttestation(signer, slotNumber, archiveToUse, sharedHeader));
|
|
34
41
|
};
|
|
35
42
|
|
|
36
43
|
const mockBlockProposalForPool = (
|
|
@@ -59,13 +66,17 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
59
66
|
it('should add attestations to pool', async () => {
|
|
60
67
|
const slotNumber = 420;
|
|
61
68
|
const archive = Fr.random();
|
|
62
|
-
const
|
|
69
|
+
const sharedHeader = CheckpointHeader.random({ slotNumber: SlotNumber(slotNumber) });
|
|
70
|
+
const attestations = signers
|
|
71
|
+
.slice(0, -1)
|
|
72
|
+
.map(signer => mockCheckpointAttestation(signer, slotNumber, archive, sharedHeader));
|
|
73
|
+
const payloadHash = attestations[0].getPayloadHash();
|
|
63
74
|
|
|
64
75
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
65
76
|
|
|
66
77
|
const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
67
78
|
SlotNumber(slotNumber),
|
|
68
|
-
|
|
79
|
+
payloadHash,
|
|
69
80
|
);
|
|
70
81
|
expect(retrievedAttestations.length).toBe(attestations.length);
|
|
71
82
|
compareCheckpointAttestations(retrievedAttestations, attestations);
|
|
@@ -75,11 +86,16 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
75
86
|
compareCheckpointAttestations(retrievedAttestationsForSlot, attestations);
|
|
76
87
|
|
|
77
88
|
// Add another one
|
|
78
|
-
const newAttestation = mockCheckpointAttestation(
|
|
89
|
+
const newAttestation = mockCheckpointAttestation(
|
|
90
|
+
signers[NUMBER_OF_SIGNERS_PER_TEST - 1],
|
|
91
|
+
slotNumber,
|
|
92
|
+
archive,
|
|
93
|
+
sharedHeader,
|
|
94
|
+
);
|
|
79
95
|
await ap.addOwnCheckpointAttestations([newAttestation]);
|
|
80
96
|
const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
81
97
|
SlotNumber(slotNumber),
|
|
82
|
-
|
|
98
|
+
payloadHash,
|
|
83
99
|
);
|
|
84
100
|
expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
|
|
85
101
|
compareCheckpointAttestations(retrievedAttestationsAfterAdd, [...attestations, newAttestation]);
|
|
@@ -92,7 +108,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
92
108
|
|
|
93
109
|
const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
94
110
|
SlotNumber(slotNumber),
|
|
95
|
-
|
|
111
|
+
payloadHash,
|
|
96
112
|
);
|
|
97
113
|
expect(retreivedAttestationsAfterDelete.length).toBe(0);
|
|
98
114
|
});
|
|
@@ -108,13 +124,14 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
108
124
|
for (let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++) {
|
|
109
125
|
attestations.push(mockCheckpointAttestation(signer, slotNumber, archive, header));
|
|
110
126
|
}
|
|
127
|
+
const payloadHash = attestations[0].getPayloadHash();
|
|
111
128
|
|
|
112
129
|
// Add them to store and check we end up with only one
|
|
113
130
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
114
131
|
|
|
115
132
|
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
116
133
|
SlotNumber(slotNumber),
|
|
117
|
-
|
|
134
|
+
payloadHash,
|
|
118
135
|
);
|
|
119
136
|
expect(retreivedAttestations.length).toBe(1);
|
|
120
137
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
|
|
@@ -122,9 +139,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
122
139
|
|
|
123
140
|
// Try adding them on another operation and check they are still not duplicated
|
|
124
141
|
await ap.addOwnCheckpointAttestations([attestations[0]]);
|
|
125
|
-
expect(
|
|
126
|
-
await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString()),
|
|
127
|
-
).toHaveLength(1);
|
|
142
|
+
expect(await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash)).toHaveLength(1);
|
|
128
143
|
});
|
|
129
144
|
|
|
130
145
|
it('should store attestations by differing slot', async () => {
|
|
@@ -135,9 +150,9 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
135
150
|
|
|
136
151
|
for (const attestation of attestations) {
|
|
137
152
|
const slot = attestation.payload.header.slotNumber;
|
|
138
|
-
const
|
|
153
|
+
const payloadHash = attestation.getPayloadHash();
|
|
139
154
|
|
|
140
|
-
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
155
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, payloadHash);
|
|
141
156
|
expect(retreivedAttestations.length).toBe(1);
|
|
142
157
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
143
158
|
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
@@ -153,9 +168,9 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
153
168
|
|
|
154
169
|
for (const attestation of attestations) {
|
|
155
170
|
const slot = attestation.payload.header.slotNumber;
|
|
156
|
-
const
|
|
171
|
+
const payloadHash = attestation.getPayloadHash();
|
|
157
172
|
|
|
158
|
-
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
173
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, payloadHash);
|
|
159
174
|
expect(retreivedAttestations.length).toBe(1);
|
|
160
175
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
161
176
|
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
@@ -164,21 +179,25 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
164
179
|
|
|
165
180
|
it('should delete attestations older than a given slot', async () => {
|
|
166
181
|
const slotNumbers = [1, 2, 3, 69, 72, 74, 88, 420];
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
)
|
|
170
|
-
const
|
|
182
|
+
const attestationsPerSlot = await Promise.all(
|
|
183
|
+
slotNumbers.map(slotNumber => createCheckpointAttestationsForSlot(slotNumber)),
|
|
184
|
+
);
|
|
185
|
+
const attestations = attestationsPerSlot.flat();
|
|
186
|
+
const payloadHashForSlot1 = attestationsPerSlot[0][0].getPayloadHash();
|
|
171
187
|
|
|
172
188
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
173
189
|
|
|
174
|
-
const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
190
|
+
const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
191
|
+
SlotNumber(1),
|
|
192
|
+
payloadHashForSlot1,
|
|
193
|
+
);
|
|
175
194
|
expect(attestationsForSlot1.length).toBe(signers.length);
|
|
176
195
|
|
|
177
196
|
await ap.deleteOlderThan(SlotNumber(73));
|
|
178
197
|
|
|
179
198
|
const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
180
199
|
SlotNumber(1),
|
|
181
|
-
|
|
200
|
+
payloadHashForSlot1,
|
|
182
201
|
);
|
|
183
202
|
expect(attestationsForSlot1AfterDelete.length).toBe(0);
|
|
184
203
|
});
|
|
@@ -189,7 +208,6 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
189
208
|
const slotNumber = 420;
|
|
190
209
|
const archive = Fr.random();
|
|
191
210
|
const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
|
|
192
|
-
const proposalId = proposal.archive.toString();
|
|
193
211
|
|
|
194
212
|
const result = await ap.tryAddBlockProposal(proposal);
|
|
195
213
|
|
|
@@ -197,7 +215,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
197
215
|
expect(result.alreadyExists).toBe(false);
|
|
198
216
|
expect(result.count).toBe(1);
|
|
199
217
|
|
|
200
|
-
const retrievedProposal = await ap.
|
|
218
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
201
219
|
|
|
202
220
|
expect(retrievedProposal).toBeDefined();
|
|
203
221
|
expect(retrievedProposal!).toEqual(proposal);
|
|
@@ -205,33 +223,68 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
205
223
|
|
|
206
224
|
it('should return undefined for non-existent block proposal', async () => {
|
|
207
225
|
const nonExistentId = Fr.random().toString();
|
|
208
|
-
const retrievedProposal = await ap.
|
|
226
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(nonExistentId);
|
|
209
227
|
expect(retrievedProposal).toBeUndefined();
|
|
210
228
|
});
|
|
211
229
|
|
|
212
|
-
it('should return alreadyExists when adding
|
|
230
|
+
it('should return alreadyExists when re-adding the same signed payload', async () => {
|
|
213
231
|
const slotNumber = 420;
|
|
214
232
|
const archive = Fr.random();
|
|
215
|
-
const
|
|
216
|
-
const proposalId = proposal1.archive.toString();
|
|
233
|
+
const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
|
|
217
234
|
|
|
218
|
-
const result1 = await ap.tryAddBlockProposal(
|
|
235
|
+
const result1 = await ap.tryAddBlockProposal(proposal);
|
|
219
236
|
expect(result1.added).toBe(true);
|
|
220
237
|
expect(result1.alreadyExists).toBe(false);
|
|
221
238
|
|
|
222
|
-
//
|
|
223
|
-
const
|
|
224
|
-
|
|
225
|
-
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
239
|
+
// Re-broadcasting the exact same proposal yields alreadyExists.
|
|
240
|
+
const result2 = await ap.tryAddBlockProposal(proposal);
|
|
226
241
|
expect(result2.added).toBe(false);
|
|
227
242
|
expect(result2.alreadyExists).toBe(true);
|
|
228
243
|
|
|
229
|
-
|
|
230
|
-
const retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
244
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
231
245
|
expect(retrievedProposal).toBeDefined();
|
|
232
|
-
expect(retrievedProposal!.toBuffer()).toEqual(
|
|
246
|
+
expect(retrievedProposal!.toBuffer()).toEqual(proposal.toBuffer());
|
|
233
247
|
expect(retrievedProposal!.getSender()?.toString()).toBe(signers[0].address.toString());
|
|
234
248
|
});
|
|
249
|
+
|
|
250
|
+
it('should retain an exact duplicate block proposal only once', async () => {
|
|
251
|
+
const slotNumber = 420;
|
|
252
|
+
const proposal = await mockBlockProposalForPool(signers[0], slotNumber);
|
|
253
|
+
|
|
254
|
+
await ap.tryAddBlockProposal(proposal);
|
|
255
|
+
await ap.tryAddBlockProposal(proposal);
|
|
256
|
+
|
|
257
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
258
|
+
expect(proposals.blockProposals.map(proposal => proposal.toBuffer())).toEqual([
|
|
259
|
+
proposal.withoutSignedTxs().toBuffer(),
|
|
260
|
+
]);
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
it('should retain all accepted block proposals at a position', async () => {
|
|
264
|
+
const slotNumber = 420;
|
|
265
|
+
const blockHeader = makeBlockHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
266
|
+
const proposal1 = await makeBlockProposal({
|
|
267
|
+
signer: signers[0],
|
|
268
|
+
blockHeader,
|
|
269
|
+
archiveRoot: Fr.random(),
|
|
270
|
+
indexWithinCheckpoint: IndexWithinCheckpoint(1),
|
|
271
|
+
});
|
|
272
|
+
const proposal2 = await makeBlockProposal({
|
|
273
|
+
signer: signers[0],
|
|
274
|
+
blockHeader,
|
|
275
|
+
archiveRoot: Fr.random(),
|
|
276
|
+
indexWithinCheckpoint: IndexWithinCheckpoint(1),
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
await ap.tryAddBlockProposal(proposal1);
|
|
280
|
+
await ap.tryAddBlockProposal(proposal2);
|
|
281
|
+
|
|
282
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
283
|
+
expect(proposals.blockProposals.map(proposal => proposal.toBuffer())).toEqual(
|
|
284
|
+
expect.arrayContaining([proposal1.withoutSignedTxs().toBuffer(), proposal2.withoutSignedTxs().toBuffer()]),
|
|
285
|
+
);
|
|
286
|
+
expect(await ap.getBlockProposalByArchive(proposal2.archive.toString())).toBeDefined();
|
|
287
|
+
});
|
|
235
288
|
});
|
|
236
289
|
|
|
237
290
|
describe('CheckpointProposal in attestation pool', () => {
|
|
@@ -239,12 +292,13 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
239
292
|
signer: Secp256k1Signer,
|
|
240
293
|
slotNumber: number,
|
|
241
294
|
archive: Fr = Fr.random(),
|
|
295
|
+
checkpointHeader?: CheckpointHeader,
|
|
242
296
|
): Promise<CheckpointProposalCore> => {
|
|
243
|
-
const
|
|
297
|
+
const headerToUse = checkpointHeader ?? makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
244
298
|
const blockHeader = makeBlockHeader(1);
|
|
245
299
|
const proposal = await makeCheckpointProposal({
|
|
246
300
|
signer,
|
|
247
|
-
checkpointHeader,
|
|
301
|
+
checkpointHeader: headerToUse,
|
|
248
302
|
archiveRoot: archive,
|
|
249
303
|
lastBlock: { blockHeader },
|
|
250
304
|
});
|
|
@@ -256,7 +310,6 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
256
310
|
const slotNumber = 420;
|
|
257
311
|
const archive = Fr.random();
|
|
258
312
|
const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
|
|
259
|
-
const proposalId = proposal.archive.toString();
|
|
260
313
|
|
|
261
314
|
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
262
315
|
|
|
@@ -264,7 +317,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
264
317
|
expect(result.alreadyExists).toBe(false);
|
|
265
318
|
expect(result.count).toBe(1);
|
|
266
319
|
|
|
267
|
-
const retrievedProposal = await ap.getCheckpointProposal(
|
|
320
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
268
321
|
|
|
269
322
|
expect(retrievedProposal).toBeDefined();
|
|
270
323
|
expect(retrievedProposal!.toBuffer()).toEqual(proposal.toBuffer());
|
|
@@ -281,54 +334,136 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
281
334
|
archiveRoot: archive,
|
|
282
335
|
// No lastBlock
|
|
283
336
|
});
|
|
284
|
-
const proposalId = proposal.archive.toString();
|
|
285
337
|
|
|
286
338
|
// Add the checkpoint core - block extraction is now caller responsibility
|
|
287
339
|
await ap.tryAddCheckpointProposal(proposal.toCore());
|
|
288
340
|
|
|
289
341
|
// The checkpoint proposal should be stored
|
|
290
|
-
const retrievedCheckpointProposal = await ap.getCheckpointProposal(
|
|
342
|
+
const retrievedCheckpointProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
291
343
|
expect(retrievedCheckpointProposal).toBeDefined();
|
|
292
344
|
|
|
293
345
|
// No block proposal was extracted (it had none anyway)
|
|
294
|
-
const retrievedBlockProposal = await ap.
|
|
346
|
+
const retrievedBlockProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
295
347
|
expect(retrievedBlockProposal).toBeUndefined();
|
|
296
348
|
});
|
|
297
349
|
|
|
298
350
|
it('should return undefined for non-existent checkpoint proposal', async () => {
|
|
299
|
-
const
|
|
300
|
-
const retrievedProposal = await ap.getCheckpointProposal(nonExistentId);
|
|
351
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(99999));
|
|
301
352
|
expect(retrievedProposal).toBeUndefined();
|
|
302
353
|
});
|
|
303
354
|
|
|
304
|
-
it('should return alreadyExists when adding
|
|
355
|
+
it('should return alreadyExists when re-adding the same signed payload', async () => {
|
|
305
356
|
const slotNumber = 420;
|
|
306
357
|
const archive = Fr.random();
|
|
307
|
-
const
|
|
308
|
-
const proposalId = proposal1.archive.toString();
|
|
358
|
+
const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
|
|
309
359
|
|
|
310
|
-
const result1 = await ap.tryAddCheckpointProposal(
|
|
360
|
+
const result1 = await ap.tryAddCheckpointProposal(proposal);
|
|
311
361
|
expect(result1.added).toBe(true);
|
|
312
362
|
expect(result1.alreadyExists).toBe(false);
|
|
313
363
|
|
|
314
|
-
//
|
|
315
|
-
const
|
|
316
|
-
|
|
317
|
-
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
364
|
+
// Re-broadcasting the exact same signed payload yields alreadyExists.
|
|
365
|
+
const result2 = await ap.tryAddCheckpointProposal(proposal);
|
|
318
366
|
expect(result2.added).toBe(false);
|
|
319
367
|
expect(result2.alreadyExists).toBe(true);
|
|
320
368
|
|
|
321
|
-
// Should still have the first proposal
|
|
322
|
-
const retrievedProposal = await ap.getCheckpointProposal(
|
|
369
|
+
// Should still have the first proposal stored at the slot
|
|
370
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
323
371
|
expect(retrievedProposal).toBeDefined();
|
|
324
|
-
expect(retrievedProposal!.toBuffer()).toEqual(
|
|
372
|
+
expect(retrievedProposal!.toBuffer()).toEqual(proposal.toBuffer());
|
|
325
373
|
expect(retrievedProposal!.getSender()?.toString()).toBe(signers[0].address.toString());
|
|
326
374
|
});
|
|
327
375
|
|
|
376
|
+
it('should treat distinct payloads at the same slot as equivocations (count = 2)', async () => {
|
|
377
|
+
const slotNumber = 420;
|
|
378
|
+
// Two proposals at the same slot but with different headers (distinct payloads).
|
|
379
|
+
const proposal1 = await mockCheckpointProposalForPool(signers[0], slotNumber, Fr.random());
|
|
380
|
+
const proposal2 = await mockCheckpointProposalForPool(signers[0], slotNumber, Fr.random());
|
|
381
|
+
|
|
382
|
+
const result1 = await ap.tryAddCheckpointProposal(proposal1);
|
|
383
|
+
expect(result1.added).toBe(true);
|
|
384
|
+
expect(result1.count).toBe(1);
|
|
385
|
+
|
|
386
|
+
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
387
|
+
// The second distinct payload is tracked as an equivocation, count goes to 2,
|
|
388
|
+
// and both accepted payloads are retained by payload hash.
|
|
389
|
+
expect(result2.added).toBe(true);
|
|
390
|
+
expect(result2.alreadyExists).toBe(false);
|
|
391
|
+
expect(result2.count).toBe(2);
|
|
392
|
+
|
|
393
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
394
|
+
const expectedProposal = [proposal1, proposal2].sort((a, b) =>
|
|
395
|
+
a.getPayloadHash().localeCompare(b.getPayloadHash()),
|
|
396
|
+
)[0];
|
|
397
|
+
expect(retrievedProposal!.toBuffer()).toEqual(expectedProposal.toBuffer());
|
|
398
|
+
|
|
399
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
400
|
+
expect(proposals.checkpointProposals.map(proposal => proposal.toBuffer())).toEqual(
|
|
401
|
+
expect.arrayContaining([proposal1.toBuffer(), proposal2.toBuffer()]),
|
|
402
|
+
);
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
it('should detect equivocation when only feeAssetPriceModifier differs', async () => {
|
|
406
|
+
const slotNumber = 420;
|
|
407
|
+
const archive = Fr.random();
|
|
408
|
+
// Same checkpoint header + archive, but two different feeAssetPriceModifier values.
|
|
409
|
+
// This is the audit-finding scenario: archive collides but the signed payload differs.
|
|
410
|
+
const sharedHeader = makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
411
|
+
const proposalA = await makeCheckpointProposal({
|
|
412
|
+
signer: signers[0],
|
|
413
|
+
checkpointHeader: sharedHeader,
|
|
414
|
+
archiveRoot: archive,
|
|
415
|
+
feeAssetPriceModifier: 50n,
|
|
416
|
+
});
|
|
417
|
+
const proposalB = await makeCheckpointProposal({
|
|
418
|
+
signer: signers[0],
|
|
419
|
+
checkpointHeader: sharedHeader,
|
|
420
|
+
archiveRoot: archive,
|
|
421
|
+
feeAssetPriceModifier: -50n,
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
const result1 = await ap.tryAddCheckpointProposal(proposalA.toCore());
|
|
425
|
+
expect(result1.count).toBe(1);
|
|
426
|
+
|
|
427
|
+
const result2 = await ap.tryAddCheckpointProposal(proposalB.toCore());
|
|
428
|
+
// The fix: archive collision no longer hides the equivocation; payload-hash dedup
|
|
429
|
+
// sees the distinct feeMod and bumps `count` to 2 so libp2p can fire the slash callback.
|
|
430
|
+
expect(result2.added).toBe(true);
|
|
431
|
+
expect(result2.alreadyExists).toBe(false);
|
|
432
|
+
expect(result2.count).toBe(2);
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
it('should delete retained proposals older than a given slot', async () => {
|
|
436
|
+
const oldSlot = 100;
|
|
437
|
+
const newSlot = 200;
|
|
438
|
+
const oldBlock = await mockBlockProposalForPool(signers[0], oldSlot);
|
|
439
|
+
const newBlock = await mockBlockProposalForPool(signers[1], newSlot);
|
|
440
|
+
const oldCheckpoint = await mockCheckpointProposalForPool(signers[0], oldSlot);
|
|
441
|
+
const newCheckpoint = await mockCheckpointProposalForPool(signers[1], newSlot);
|
|
442
|
+
|
|
443
|
+
await ap.tryAddBlockProposal(oldBlock);
|
|
444
|
+
await ap.tryAddBlockProposal(newBlock);
|
|
445
|
+
await ap.tryAddCheckpointProposal(oldCheckpoint);
|
|
446
|
+
await ap.tryAddCheckpointProposal(newCheckpoint);
|
|
447
|
+
|
|
448
|
+
await ap.deleteOlderThan(SlotNumber(newSlot));
|
|
449
|
+
|
|
450
|
+
expect(await ap.getProposalsForSlot(SlotNumber(oldSlot))).toEqual({
|
|
451
|
+
blockProposals: [],
|
|
452
|
+
checkpointProposals: [],
|
|
453
|
+
});
|
|
454
|
+
const newProposals = await ap.getProposalsForSlot(SlotNumber(newSlot));
|
|
455
|
+
expect(newProposals.blockProposals.map(proposal => proposal.toBuffer())).toContainEqual(
|
|
456
|
+
newBlock.withoutSignedTxs().toBuffer(),
|
|
457
|
+
);
|
|
458
|
+
expect(newProposals.checkpointProposals.map(proposal => proposal.toBuffer())).toContainEqual(
|
|
459
|
+
newCheckpoint.toBuffer(),
|
|
460
|
+
);
|
|
461
|
+
});
|
|
462
|
+
|
|
328
463
|
it('should return added=false when exceeding capacity', async () => {
|
|
329
464
|
const slotNumber = 420;
|
|
330
465
|
|
|
331
|
-
// Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT proposals
|
|
466
|
+
// Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT distinct proposals.
|
|
332
467
|
for (let i = 0; i < MAX_CHECKPOINT_PROPOSALS_PER_SLOT; i++) {
|
|
333
468
|
const proposal = await mockCheckpointProposalForPool(signers[i % NUMBER_OF_SIGNERS_PER_TEST], slotNumber);
|
|
334
469
|
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
@@ -336,7 +471,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
336
471
|
expect(result.count).toBe(i + 1);
|
|
337
472
|
}
|
|
338
473
|
|
|
339
|
-
// The next proposal should not be added
|
|
474
|
+
// The next proposal should not be added.
|
|
340
475
|
const extraProposal = await mockCheckpointProposalForPool(signers[0], slotNumber);
|
|
341
476
|
const result = await ap.tryAddCheckpointProposal(extraProposal);
|
|
342
477
|
expect(result.added).toBe(false);
|
|
@@ -446,12 +581,12 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
446
581
|
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
447
582
|
expect(result2.count).toBe(2);
|
|
448
583
|
|
|
449
|
-
//
|
|
584
|
+
// Third proposal for same position should be rejected (cap is 2)
|
|
450
585
|
const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
|
|
451
586
|
const result3 = await ap.tryAddBlockProposal(proposal3);
|
|
452
587
|
|
|
453
|
-
expect(result3.added).toBe(
|
|
454
|
-
expect(result3.count).toBe(
|
|
588
|
+
expect(result3.added).toBe(false);
|
|
589
|
+
expect(result3.count).toBe(2);
|
|
455
590
|
});
|
|
456
591
|
|
|
457
592
|
it('should return added=false when exceeding capacity', async () => {
|
|
@@ -571,17 +706,17 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
571
706
|
await ap.tryAddBlockProposal(newProposal);
|
|
572
707
|
|
|
573
708
|
// Verify both proposals exist
|
|
574
|
-
expect(await ap.
|
|
575
|
-
expect(await ap.
|
|
709
|
+
expect(await ap.getBlockProposalByArchive(oldProposal.archive.toString())).toBeDefined();
|
|
710
|
+
expect(await ap.getBlockProposalByArchive(newProposal.archive.toString())).toBeDefined();
|
|
576
711
|
|
|
577
712
|
// Delete slots older than newSlot (should delete oldSlot)
|
|
578
713
|
await ap.deleteOlderThan(SlotNumber(newSlot));
|
|
579
714
|
|
|
580
715
|
// Old proposal should be deleted from storage
|
|
581
|
-
expect(await ap.
|
|
716
|
+
expect(await ap.getBlockProposalByArchive(oldProposal.archive.toString())).toBeUndefined();
|
|
582
717
|
|
|
583
718
|
// New proposal should still exist
|
|
584
|
-
expect(await ap.
|
|
719
|
+
expect(await ap.getBlockProposalByArchive(newProposal.archive.toString())).toBeDefined();
|
|
585
720
|
});
|
|
586
721
|
});
|
|
587
722
|
|
|
@@ -590,12 +725,13 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
590
725
|
signer: Secp256k1Signer,
|
|
591
726
|
slotNumber: number,
|
|
592
727
|
archive: Fr = Fr.random(),
|
|
728
|
+
checkpointHeader?: CheckpointHeader,
|
|
593
729
|
): Promise<CheckpointProposalCore> => {
|
|
594
|
-
const
|
|
730
|
+
const headerToUse = checkpointHeader ?? makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
595
731
|
const blockHeader = makeBlockHeader(1);
|
|
596
732
|
const proposal = await makeCheckpointProposal({
|
|
597
733
|
signer,
|
|
598
|
-
checkpointHeader,
|
|
734
|
+
checkpointHeader: headerToUse,
|
|
599
735
|
archiveRoot: archive,
|
|
600
736
|
lastBlock: { blockHeader },
|
|
601
737
|
});
|
|
@@ -666,12 +802,12 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
666
802
|
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
667
803
|
expect(result2.count).toBe(2);
|
|
668
804
|
|
|
669
|
-
//
|
|
805
|
+
// Third proposal for same slot should be rejected (cap is 2)
|
|
670
806
|
const proposal3 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber);
|
|
671
807
|
const result3 = await ap.tryAddCheckpointProposal(proposal3);
|
|
672
808
|
|
|
673
|
-
expect(result3.added).toBe(
|
|
674
|
-
expect(result3.count).toBe(
|
|
809
|
+
expect(result3.added).toBe(false);
|
|
810
|
+
expect(result3.count).toBe(2);
|
|
675
811
|
});
|
|
676
812
|
|
|
677
813
|
it('should not count attestations as proposals for duplicate detection', async () => {
|
|
@@ -3,11 +3,12 @@ import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer'
|
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
4
|
import {
|
|
5
5
|
CheckpointAttestation,
|
|
6
|
+
CheckpointProposal,
|
|
6
7
|
ConsensusPayload,
|
|
7
|
-
|
|
8
|
-
getHashedSignaturePayloadEthSignedMessage,
|
|
8
|
+
getHashedSignaturePayloadTypedData,
|
|
9
9
|
} from '@aztec/stdlib/p2p';
|
|
10
10
|
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
11
|
+
import { TEST_COORDINATION_SIGNATURE_CONTEXT } from '@aztec/stdlib/testing';
|
|
11
12
|
|
|
12
13
|
import { type LocalAccount, generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
|
|
13
14
|
|
|
@@ -37,15 +38,19 @@ export const mockCheckpointAttestation = (
|
|
|
37
38
|
feeAssetPriceModifier: bigint = 0n,
|
|
38
39
|
): CheckpointAttestation => {
|
|
39
40
|
header = header ?? CheckpointHeader.random({ slotNumber: SlotNumber(slot) });
|
|
40
|
-
const payload = new ConsensusPayload(header, archive, feeAssetPriceModifier);
|
|
41
|
+
const payload = new ConsensusPayload(header, archive, feeAssetPriceModifier, TEST_COORDINATION_SIGNATURE_CONTEXT);
|
|
41
42
|
|
|
42
|
-
const attestationHash =
|
|
43
|
-
payload,
|
|
44
|
-
SignatureDomainSeparator.checkpointAttestation,
|
|
45
|
-
);
|
|
43
|
+
const attestationHash = getHashedSignaturePayloadTypedData(payload);
|
|
46
44
|
const attestationSignature = signer.sign(attestationHash);
|
|
47
45
|
|
|
48
|
-
const
|
|
46
|
+
const proposal = new CheckpointProposal(
|
|
47
|
+
header,
|
|
48
|
+
archive,
|
|
49
|
+
feeAssetPriceModifier,
|
|
50
|
+
attestationSignature,
|
|
51
|
+
TEST_COORDINATION_SIGNATURE_CONTEXT,
|
|
52
|
+
);
|
|
53
|
+
const proposalHash = getHashedSignaturePayloadTypedData(proposal);
|
|
49
54
|
const proposerSignature = signer.sign(proposalHash);
|
|
50
55
|
|
|
51
56
|
return new CheckpointAttestation(payload, attestationSignature, proposerSignature);
|
package/src/mem_pools/index.ts
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
1
|
export { AttestationPool, type AttestationPoolApi } from './attestation_pool/attestation_pool.js';
|
|
2
2
|
export { type MemPools } from './interface.js';
|
|
3
|
-
// Old TxPool exports - kept temporarily for external consumers
|
|
4
|
-
export { type TxPool } from './tx_pool/tx_pool.js';
|
|
5
|
-
// New TxPoolV2 exports
|
|
6
3
|
export { type TxPoolV2, type TxPoolV2Config, type TxPoolV2Events, type AddTxsResult } from './tx_pool_v2/index.js';
|
|
@@ -100,7 +100,11 @@ export class PoolInstrumentation<PoolObject extends Gossipable> {
|
|
|
100
100
|
|
|
101
101
|
this.addObjectCounter = createUpDownCounterWithDefault(this.meter, metricsLabels.itemsAdded);
|
|
102
102
|
|
|
103
|
-
this.minedDelay = this.meter.createHistogram(metricsLabels.itemMinedDelay
|
|
103
|
+
this.minedDelay = this.meter.createHistogram(metricsLabels.itemMinedDelay, {
|
|
104
|
+
advice: {
|
|
105
|
+
explicitBucketBoundaries: [100, 500, 1000, 5000, 10000, 30000, 60000, 300000, 600000, 1800000, 3600000],
|
|
106
|
+
},
|
|
107
|
+
});
|
|
104
108
|
|
|
105
109
|
this.meter.addBatchObservableCallback(this.observeStats, [this.objectsInMempool]);
|
|
106
110
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
2
2
|
import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store';
|
|
3
|
-
import { ChonkProof } from '@aztec/stdlib/proofs';
|
|
4
3
|
import { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
5
4
|
|
|
6
5
|
/**
|
|
@@ -70,7 +69,7 @@ export class TxArchive {
|
|
|
70
69
|
}
|
|
71
70
|
|
|
72
71
|
// Archive the transaction with stripped proof
|
|
73
|
-
const archivedTx =
|
|
72
|
+
const archivedTx = tx.withoutProof();
|
|
74
73
|
const txHash = tx.getTxHash().toString();
|
|
75
74
|
await this.#txs.set(txHash, archivedTx.toBuffer());
|
|
76
75
|
await this.#indices.set(headIdx, txHash);
|
|
@@ -101,13 +100,6 @@ export class TxArchive {
|
|
|
101
100
|
return head - tail;
|
|
102
101
|
}
|
|
103
102
|
|
|
104
|
-
/**
|
|
105
|
-
* Strips the proof from a transaction for archival.
|
|
106
|
-
*/
|
|
107
|
-
private stripProof(tx: Tx): Tx {
|
|
108
|
-
return new Tx(tx.txHash, tx.data, ChonkProof.empty(), tx.contractClassLogFields, tx.publicFunctionCalldata);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
103
|
private async getHeadIndex(): Promise<number> {
|
|
112
104
|
const entry = await this.#indices.entriesAsync({ limit: 1, reverse: true }).next();
|
|
113
105
|
return (entry.value?.[0] ?? -1) + 1;
|
|
@@ -29,7 +29,8 @@ export class FeePayerBalanceEvictionRule implements EvictionRule {
|
|
|
29
29
|
|
|
30
30
|
if (context.event === EvictionEvent.BLOCK_MINED) {
|
|
31
31
|
const blockNumber = context.block.getBlockNumber();
|
|
32
|
-
await
|
|
32
|
+
const blockHash = await context.block.hash();
|
|
33
|
+
await this.worldState.syncImmediate(blockNumber, blockHash);
|
|
33
34
|
return await this.evictForFeePayers(context.feePayers, this.worldState.getSnapshot(blockNumber), pool);
|
|
34
35
|
}
|
|
35
36
|
|
|
@@ -21,6 +21,7 @@ export { FeePayerBalancePreAddRule } from './fee_payer_balance_pre_add_rule.js';
|
|
|
21
21
|
export { LowPriorityPreAddRule } from './low_priority_pre_add_rule.js';
|
|
22
22
|
|
|
23
23
|
// Post-event eviction rules
|
|
24
|
+
export { InsufficientFeePerGasEvictionRule } from './insufficient_fee_per_gas_eviction_rule.js';
|
|
24
25
|
export { InvalidTxsAfterMiningRule } from './invalid_txs_after_mining_rule.js';
|
|
25
26
|
export { InvalidTxsAfterReorgRule } from './invalid_txs_after_reorg_rule.js';
|
|
26
27
|
export { FeePayerBalanceEvictionRule } from './fee_payer_balance_eviction_rule.js';
|