@aztec/p2p 0.0.1-commit.e2b2873ed → 0.0.1-commit.e304674f1
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/client/factory.d.ts +7 -7
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +37 -30
- package/dest/client/interface.d.ts +22 -20
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +11 -19
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +83 -102
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +20 -10
- package/dest/config.d.ts +43 -15
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +91 -37
- 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/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- 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 +7 -5
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +16 -6
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
- package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +2 -2
- 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 +4 -2
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +16 -14
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +30 -13
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +91 -20
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
- 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 +7 -3
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
- 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 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -5
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
- package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +1 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +28 -10
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +56 -15
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +112 -19
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +50 -45
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -5
- 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 +17 -6
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
- 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 +319 -147
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +5 -4
- package/dest/msg_validators/clock_tolerance.d.ts +1 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +4 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -4
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -4
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -8
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +53 -41
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -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 +1 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +35 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +247 -60
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +112 -43
- 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/metadata_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +2 -2
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
- package/dest/services/dummy_service.d.ts +7 -5
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +9 -5
- package/dest/services/encoding.d.ts +6 -2
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +16 -9
- package/dest/services/gossipsub/topic_score_params.d.ts +18 -6
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +32 -10
- package/dest/services/libp2p/libp2p_service.d.ts +29 -36
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +213 -197
- package/dest/services/peer-manager/metrics.d.ts +3 -1
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +6 -0
- 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 +24 -9
- 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 +12 -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 +83 -106
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
- package/dest/services/reqresp/interface.d.ts +1 -9
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +0 -11
- 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/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 +1 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +20 -11
- package/dest/services/service.d.ts +9 -4
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +13 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +30 -0
- package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +65 -75
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +38 -29
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +126 -77
- package/dest/services/tx_collection/file_store_tx_source.d.ts +17 -6
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +53 -10
- 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 +2 -1
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
- 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/slow_tx_collection.d.ts +5 -3
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +17 -12
- package/dest/services/tx_collection/tx_collection.d.ts +9 -9
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +26 -10
- package/dest/services/tx_collection/tx_collection_sink.d.ts +6 -5
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +13 -22
- package/dest/services/tx_collection/tx_source.d.ts +13 -7
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +26 -7
- package/dest/services/tx_file_store/tx_file_store.d.ts +3 -2
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +9 -6
- package/dest/services/tx_provider.d.ts +3 -3
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +4 -4
- package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +1 -2
- package/dest/test-helpers/mock-pubsub.d.ts +4 -4
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +8 -2
- package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +2 -4
- package/dest/test-helpers/testbench-utils.d.ts +8 -3
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +30 -4
- package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +78 -26
- package/dest/testbench/worker_client_manager.d.ts +10 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +55 -3
- package/dest/util.d.ts +3 -3
- package/dest/util.d.ts.map +1 -1
- package/package.json +14 -14
- package/src/client/factory.ts +68 -48
- package/src/client/interface.ts +26 -21
- package/src/client/p2p_client.ts +91 -132
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +33 -14
- package/src/config.ts +133 -43
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +20 -9
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
- package/src/mem_pools/attestation_pool/mocks.ts +2 -1
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +17 -13
- package/src/mem_pools/tx_pool_v2/README.md +52 -28
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +109 -22
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +7 -3
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
- package/src/mem_pools/tx_pool_v2/index.ts +1 -1
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +30 -10
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +163 -27
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +58 -45
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +34 -8
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +353 -143
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
- package/src/msg_validators/clock_tolerance.ts +4 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +69 -45
- package/src/msg_validators/tx_validator/README.md +119 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -3
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +42 -1
- package/src/msg_validators/tx_validator/factory.ts +394 -78
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +145 -33
- package/src/msg_validators/tx_validator/index.ts +2 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
- package/src/msg_validators/tx_validator/timestamp_validator.ts +7 -7
- package/src/services/dummy_service.ts +12 -7
- package/src/services/encoding.ts +16 -8
- package/src/services/gossipsub/README.md +29 -14
- package/src/services/gossipsub/topic_score_params.ts +49 -13
- package/src/services/libp2p/libp2p_service.ts +228 -223
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +28 -9
- package/src/services/peer-manager/peer_scoring.ts +27 -5
- package/src/services/reqresp/README.md +229 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +79 -112
- package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
- package/src/services/reqresp/interface.ts +0 -11
- package/src/services/reqresp/metrics.ts +0 -1
- 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 +23 -13
- package/src/services/service.ts +17 -3
- package/src/services/tx_collection/config.ts +42 -0
- package/src/services/tx_collection/fast_tx_collection.ts +71 -76
- package/src/services/tx_collection/file_store_tx_collection.ts +143 -93
- package/src/services/tx_collection/file_store_tx_source.ts +69 -10
- package/src/services/tx_collection/instrumentation.ts +7 -1
- package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/slow_tx_collection.ts +17 -13
- package/src/services/tx_collection/tx_collection.ts +46 -17
- package/src/services/tx_collection/tx_collection_sink.ts +15 -29
- package/src/services/tx_collection/tx_source.ts +28 -8
- package/src/services/tx_file_store/tx_file_store.ts +6 -4
- package/src/services/tx_provider.ts +2 -2
- package/src/test-helpers/make-test-p2p-clients.ts +1 -3
- package/src/test-helpers/mock-pubsub.ts +13 -6
- package/src/test-helpers/reqresp-nodes.ts +3 -8
- package/src/test-helpers/testbench-utils.ts +41 -6
- package/src/testbench/p2p_client_testbench_worker.ts +89 -29
- package/src/testbench/worker_client_manager.ts +68 -6
- package/src/util.ts +8 -2
- 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 -15
- 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 -400
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
- 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/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 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
- package/src/services/reqresp/protocols/block.ts +0 -37
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BlockNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import type { Logger } from '@aztec/foundation/log';
|
|
3
|
+
import type { DateProvider } from '@aztec/foundation/timer';
|
|
3
4
|
import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store';
|
|
4
5
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
5
6
|
import { computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
|
|
@@ -8,6 +9,7 @@ import type { L2Block, L2BlockId, L2BlockSource } from '@aztec/stdlib/block';
|
|
|
8
9
|
import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
9
10
|
import { DatabasePublicStateSource } from '@aztec/stdlib/trees';
|
|
10
11
|
import { BlockHeader, Tx, TxHash, type TxValidator } from '@aztec/stdlib/tx';
|
|
12
|
+
import type { TelemetryClient } from '@aztec/telemetry-client';
|
|
11
13
|
|
|
12
14
|
import { TxArchive } from './archive/index.js';
|
|
13
15
|
import { DeletedPool } from './deleted_pool.js';
|
|
@@ -21,8 +23,12 @@ import {
|
|
|
21
23
|
LowPriorityPreAddRule,
|
|
22
24
|
NullifierConflictRule,
|
|
23
25
|
type PoolOperations,
|
|
26
|
+
type PreAddContext,
|
|
24
27
|
type PreAddPoolAccess,
|
|
28
|
+
TxPoolRejectionCode,
|
|
29
|
+
type TxPoolRejectionError,
|
|
25
30
|
} from './eviction/index.js';
|
|
31
|
+
import { TxPoolV2Instrumentation } from './instrumentation.js';
|
|
26
32
|
import {
|
|
27
33
|
type AddTxsResult,
|
|
28
34
|
DEFAULT_TX_POOL_V2_CONFIG,
|
|
@@ -39,6 +45,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
39
45
|
export interface TxPoolV2Callbacks {
|
|
40
46
|
onTxsAdded: (txs: Tx[], opts: { source?: string }) => void;
|
|
41
47
|
onTxsRemoved: (txHashes: string[] | bigint[]) => void;
|
|
48
|
+
onTxsMined: (txHashes: string[]) => void;
|
|
42
49
|
}
|
|
43
50
|
|
|
44
51
|
/**
|
|
@@ -55,6 +62,7 @@ export class TxPoolV2Impl {
|
|
|
55
62
|
#l2BlockSource: L2BlockSource;
|
|
56
63
|
#worldStateSynchronizer: WorldStateSynchronizer;
|
|
57
64
|
#createTxValidator: TxPoolV2Dependencies['createTxValidator'];
|
|
65
|
+
#checkAllowedSetupCalls: TxPoolV2Dependencies['checkAllowedSetupCalls'];
|
|
58
66
|
|
|
59
67
|
// === In-Memory Indices ===
|
|
60
68
|
#indices: TxPoolIndices = new TxPoolIndices();
|
|
@@ -64,6 +72,9 @@ export class TxPoolV2Impl {
|
|
|
64
72
|
#archive: TxArchive;
|
|
65
73
|
#deletedPool: DeletedPool;
|
|
66
74
|
#evictionManager: EvictionManager;
|
|
75
|
+
#dateProvider: DateProvider;
|
|
76
|
+
#instrumentation: TxPoolV2Instrumentation;
|
|
77
|
+
#evictedTxHashes: Set<string> = new Set();
|
|
67
78
|
#log: Logger;
|
|
68
79
|
#callbacks: TxPoolV2Callbacks;
|
|
69
80
|
|
|
@@ -72,7 +83,9 @@ export class TxPoolV2Impl {
|
|
|
72
83
|
archiveStore: AztecAsyncKVStore,
|
|
73
84
|
deps: TxPoolV2Dependencies,
|
|
74
85
|
callbacks: TxPoolV2Callbacks,
|
|
86
|
+
telemetry: TelemetryClient,
|
|
75
87
|
config: Partial<TxPoolV2Config> = {},
|
|
88
|
+
dateProvider: DateProvider,
|
|
76
89
|
log: Logger,
|
|
77
90
|
) {
|
|
78
91
|
this.#store = store;
|
|
@@ -81,10 +94,13 @@ export class TxPoolV2Impl {
|
|
|
81
94
|
this.#l2BlockSource = deps.l2BlockSource;
|
|
82
95
|
this.#worldStateSynchronizer = deps.worldStateSynchronizer;
|
|
83
96
|
this.#createTxValidator = deps.createTxValidator;
|
|
97
|
+
this.#checkAllowedSetupCalls = deps.checkAllowedSetupCalls;
|
|
84
98
|
|
|
85
99
|
this.#config = { ...DEFAULT_TX_POOL_V2_CONFIG, ...config };
|
|
86
100
|
this.#archive = new TxArchive(archiveStore, this.#config.archivedTxLimit, log);
|
|
87
101
|
this.#deletedPool = new DeletedPool(store, this.#txsDB, log);
|
|
102
|
+
this.#dateProvider = dateProvider;
|
|
103
|
+
this.#instrumentation = new TxPoolV2Instrumentation(telemetry, () => this.#indices.getTotalMetadataBytes());
|
|
88
104
|
this.#log = log;
|
|
89
105
|
this.#callbacks = callbacks;
|
|
90
106
|
|
|
@@ -164,16 +180,45 @@ export class TxPoolV2Impl {
|
|
|
164
180
|
await this.#txsDB.delete(txHashStr);
|
|
165
181
|
}
|
|
166
182
|
});
|
|
167
|
-
this.#log.info(`Deleted ${toDelete.length} invalid/rejected transactions on startup
|
|
183
|
+
this.#log.info(`Deleted ${toDelete.length} invalid/rejected transactions on startup`, { txHashes: toDelete });
|
|
168
184
|
}
|
|
169
185
|
|
|
170
|
-
async addPendingTxs(txs: Tx[], opts: { source?: string }): Promise<AddTxsResult> {
|
|
186
|
+
async addPendingTxs(txs: Tx[], opts: { source?: string; feeComparisonOnly?: boolean }): Promise<AddTxsResult> {
|
|
171
187
|
const accepted: TxHash[] = [];
|
|
172
188
|
const ignored: TxHash[] = [];
|
|
173
189
|
const rejected: TxHash[] = [];
|
|
190
|
+
const errors = new Map<string, TxPoolRejectionError>();
|
|
174
191
|
const acceptedPending = new Set<string>();
|
|
175
192
|
|
|
193
|
+
// Phase 1: Pre-compute all throwable I/O outside the transaction.
|
|
194
|
+
// If any pre-computation throws, the entire call fails before mutations happen.
|
|
195
|
+
const precomputed = new Map<string, { meta: TxMetaData; minedBlockId: L2BlockId | undefined; isValid: boolean }>();
|
|
196
|
+
|
|
197
|
+
const validator = await this.#createTxValidator();
|
|
198
|
+
|
|
199
|
+
for (const tx of txs) {
|
|
200
|
+
const txHash = tx.getTxHash();
|
|
201
|
+
const txHashStr = txHash.toString();
|
|
202
|
+
|
|
203
|
+
const meta = await buildTxMetaData(tx);
|
|
204
|
+
const minedBlockId = await this.#getMinedBlockId(txHash);
|
|
205
|
+
|
|
206
|
+
// Validate non-mined txs (mined and pre-protected txs bypass validation inside the transaction)
|
|
207
|
+
let isValid = true;
|
|
208
|
+
if (!minedBlockId) {
|
|
209
|
+
isValid = await this.#validateMeta(meta, validator);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
precomputed.set(txHashStr, { meta, minedBlockId, isValid });
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Phase 2: Apply mutations inside the transaction using only pre-computed results,
|
|
216
|
+
// in-memory reads, and buffered DB writes. Nothing here can throw an unhandled exception.
|
|
176
217
|
const poolAccess = this.#createPreAddPoolAccess();
|
|
218
|
+
const preAddContext: PreAddContext | undefined =
|
|
219
|
+
opts.feeComparisonOnly !== undefined
|
|
220
|
+
? { feeComparisonOnly: opts.feeComparisonOnly, priceBumpPercentage: this.#config.priceBumpPercentage }
|
|
221
|
+
: undefined;
|
|
177
222
|
|
|
178
223
|
await this.#store.transactionAsync(async () => {
|
|
179
224
|
for (const tx of txs) {
|
|
@@ -186,30 +231,46 @@ export class TxPoolV2Impl {
|
|
|
186
231
|
continue;
|
|
187
232
|
}
|
|
188
233
|
|
|
189
|
-
|
|
190
|
-
const minedBlockId = await this.#getMinedBlockId(txHash);
|
|
234
|
+
const { meta, minedBlockId, isValid } = precomputed.get(txHashStr)!;
|
|
191
235
|
const preProtectedSlot = this.#indices.getProtectionSlot(txHashStr);
|
|
192
236
|
|
|
193
237
|
if (minedBlockId) {
|
|
194
238
|
// Already mined - add directly (protection already set if pre-protected)
|
|
195
|
-
await this.#addTx(tx, { mined: minedBlockId }, opts);
|
|
239
|
+
await this.#addTx(tx, { mined: minedBlockId }, opts, meta);
|
|
196
240
|
accepted.push(txHash);
|
|
197
241
|
} else if (preProtectedSlot !== undefined) {
|
|
198
242
|
// Pre-protected and not mined - add as protected (bypass validation)
|
|
199
|
-
await this.#addTx(tx, { protected: preProtectedSlot }, opts);
|
|
243
|
+
await this.#addTx(tx, { protected: preProtectedSlot }, opts, meta);
|
|
200
244
|
accepted.push(txHash);
|
|
245
|
+
} else if (!isValid) {
|
|
246
|
+
// Failed pre-computed validation
|
|
247
|
+
rejected.push(txHash);
|
|
201
248
|
} else {
|
|
202
|
-
// Regular pending tx -
|
|
203
|
-
const result = await this.#tryAddRegularPendingTx(
|
|
249
|
+
// Regular pending tx - run pre-add rules using pre-computed metadata
|
|
250
|
+
const result = await this.#tryAddRegularPendingTx(
|
|
251
|
+
tx,
|
|
252
|
+
meta,
|
|
253
|
+
opts,
|
|
254
|
+
poolAccess,
|
|
255
|
+
acceptedPending,
|
|
256
|
+
ignored,
|
|
257
|
+
errors,
|
|
258
|
+
preAddContext,
|
|
259
|
+
);
|
|
204
260
|
if (result.status === 'accepted') {
|
|
205
261
|
acceptedPending.add(txHashStr);
|
|
206
|
-
} else if (result.status === 'rejected') {
|
|
207
|
-
rejected.push(txHash);
|
|
208
262
|
} else {
|
|
209
263
|
ignored.push(txHash);
|
|
210
264
|
}
|
|
211
265
|
}
|
|
212
266
|
}
|
|
267
|
+
|
|
268
|
+
// Run post-add eviction rules for pending txs (inside transaction for atomicity)
|
|
269
|
+
if (acceptedPending.size > 0) {
|
|
270
|
+
const feePayers = Array.from(acceptedPending).map(txHash => this.#indices.getMetadata(txHash)!.feePayer);
|
|
271
|
+
const uniqueFeePayers = new Set<string>(feePayers);
|
|
272
|
+
await this.#evictionManager.evictAfterNewTxs(Array.from(acceptedPending), [...uniqueFeePayers]);
|
|
273
|
+
}
|
|
213
274
|
});
|
|
214
275
|
|
|
215
276
|
// Build final accepted list for pending txs (excludes intra-batch evictions)
|
|
@@ -217,96 +278,124 @@ export class TxPoolV2Impl {
|
|
|
217
278
|
accepted.push(TxHash.fromString(txHashStr));
|
|
218
279
|
}
|
|
219
280
|
|
|
220
|
-
//
|
|
221
|
-
if (
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
281
|
+
// Record metrics
|
|
282
|
+
if (ignored.length > 0) {
|
|
283
|
+
this.#instrumentation.recordIgnored(ignored.length);
|
|
284
|
+
}
|
|
285
|
+
if (rejected.length > 0) {
|
|
286
|
+
this.#instrumentation.recordRejected(rejected.length);
|
|
225
287
|
}
|
|
226
288
|
|
|
227
|
-
return { accepted, ignored, rejected };
|
|
289
|
+
return { accepted, ignored, rejected, ...(errors.size > 0 ? { errors } : {}) };
|
|
228
290
|
}
|
|
229
291
|
|
|
230
|
-
/**
|
|
292
|
+
/** Adds a validated pending tx, running pre-add rules and evicting conflicts. */
|
|
231
293
|
async #tryAddRegularPendingTx(
|
|
232
294
|
tx: Tx,
|
|
295
|
+
precomputedMeta: TxMetaData,
|
|
233
296
|
opts: { source?: string },
|
|
234
297
|
poolAccess: PreAddPoolAccess,
|
|
235
298
|
acceptedPending: Set<string>,
|
|
236
299
|
ignored: TxHash[],
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
// Build metadata and validate using metadata
|
|
242
|
-
const meta = await buildTxMetaData(tx);
|
|
243
|
-
if (!(await this.#validateMeta(meta))) {
|
|
244
|
-
return { status: 'rejected' };
|
|
245
|
-
}
|
|
300
|
+
errors: Map<string, TxPoolRejectionError>,
|
|
301
|
+
preAddContext?: PreAddContext,
|
|
302
|
+
): Promise<{ status: 'accepted' | 'ignored' }> {
|
|
303
|
+
const txHashStr = tx.getTxHash().toString();
|
|
246
304
|
|
|
247
305
|
// Run pre-add rules
|
|
248
|
-
const preAddResult = await this.#evictionManager.runPreAddRules(
|
|
306
|
+
const preAddResult = await this.#evictionManager.runPreAddRules(precomputedMeta, poolAccess, preAddContext);
|
|
249
307
|
|
|
250
308
|
if (preAddResult.shouldIgnore) {
|
|
251
|
-
this.#log.debug(`Ignoring tx ${txHashStr}: ${preAddResult.reason}`);
|
|
309
|
+
this.#log.debug(`Ignoring tx ${txHashStr}: ${preAddResult.reason?.message ?? 'unknown reason'}`);
|
|
310
|
+
if (preAddResult.reason && preAddResult.reason.code !== TxPoolRejectionCode.INTERNAL_ERROR) {
|
|
311
|
+
errors.set(txHashStr, preAddResult.reason);
|
|
312
|
+
}
|
|
252
313
|
return { status: 'ignored' };
|
|
253
314
|
}
|
|
254
315
|
|
|
255
|
-
// Evict conflicts
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
316
|
+
// Evict conflicts, grouped by rule name for metrics
|
|
317
|
+
if (preAddResult.evictions && preAddResult.evictions.length > 0) {
|
|
318
|
+
const byReason = new Map<string, string[]>();
|
|
319
|
+
for (const { txHash: evictHash, reason } of preAddResult.evictions) {
|
|
320
|
+
const group = byReason.get(reason);
|
|
321
|
+
if (group) {
|
|
322
|
+
group.push(evictHash);
|
|
323
|
+
} else {
|
|
324
|
+
byReason.set(reason, [evictHash]);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
for (const [reason, hashes] of byReason) {
|
|
328
|
+
await this.#evictTxs(hashes, reason);
|
|
329
|
+
}
|
|
330
|
+
for (const evictHashStr of preAddResult.txHashesToEvict) {
|
|
331
|
+
this.#log.debug(`Evicted tx ${evictHashStr} due to higher-fee tx ${txHashStr}`, {
|
|
332
|
+
evictedTxHash: evictHashStr,
|
|
333
|
+
replacementTxHash: txHashStr,
|
|
334
|
+
});
|
|
335
|
+
if (acceptedPending.has(evictHashStr)) {
|
|
336
|
+
// Evicted tx was from this batch - mark as ignored in result
|
|
337
|
+
acceptedPending.delete(evictHashStr);
|
|
338
|
+
ignored.push(TxHash.fromString(evictHashStr));
|
|
339
|
+
}
|
|
263
340
|
}
|
|
264
341
|
}
|
|
265
342
|
|
|
343
|
+
// Randomly drop the transaction for testing purposes (report as accepted so it propagates)
|
|
344
|
+
if (this.#config.dropTransactionsProbability > 0 && Math.random() < this.#config.dropTransactionsProbability) {
|
|
345
|
+
this.#log.debug(`Dropping tx ${txHashStr} (simulated drop for testing)`);
|
|
346
|
+
return { status: 'accepted' };
|
|
347
|
+
}
|
|
348
|
+
|
|
266
349
|
// Add the transaction
|
|
267
|
-
await this.#addTx(tx, 'pending', opts);
|
|
350
|
+
await this.#addTx(tx, 'pending', opts, precomputedMeta);
|
|
268
351
|
return { status: 'accepted' };
|
|
269
352
|
}
|
|
270
353
|
|
|
271
|
-
async canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored'
|
|
354
|
+
async canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored'> {
|
|
272
355
|
const txHashStr = tx.getTxHash().toString();
|
|
273
356
|
|
|
274
357
|
// Check if already in pool
|
|
275
358
|
if (this.#indices.has(txHashStr)) {
|
|
359
|
+
this.#log.verbose(`canAddPendingTx: tx ${txHashStr} already in pool`);
|
|
276
360
|
return 'ignored';
|
|
277
361
|
}
|
|
278
362
|
|
|
279
|
-
// Build metadata and
|
|
363
|
+
// Build metadata and check pre-add rules
|
|
280
364
|
const meta = await buildTxMetaData(tx);
|
|
281
|
-
const validationResult = await this.#validateMeta(meta, undefined, 'can add pending');
|
|
282
|
-
if (validationResult !== true) {
|
|
283
|
-
return 'rejected';
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// Use pre-add rules
|
|
287
365
|
const poolAccess = this.#createPreAddPoolAccess();
|
|
288
366
|
const preAddResult = await this.#evictionManager.runPreAddRules(meta, poolAccess);
|
|
289
367
|
|
|
290
|
-
|
|
368
|
+
if (preAddResult.shouldIgnore) {
|
|
369
|
+
this.#log.verbose(`canAddPendingTx: tx ${txHashStr} ignored by pre-add rule`, {
|
|
370
|
+
reason: preAddResult.reason?.message ?? 'no reason provided',
|
|
371
|
+
});
|
|
372
|
+
return 'ignored';
|
|
373
|
+
}
|
|
374
|
+
return 'accepted';
|
|
291
375
|
}
|
|
292
376
|
|
|
293
377
|
async addProtectedTxs(txs: Tx[], block: BlockHeader, opts: { source?: string }): Promise<void> {
|
|
294
378
|
const slotNumber = block.globalVariables.slotNumber;
|
|
295
379
|
|
|
380
|
+
// Precompute setup-call allow-list flags outside the store transaction
|
|
381
|
+
const allowedFlags = await Promise.all(txs.map(tx => this.#checkAllowedSetupCalls(tx)));
|
|
382
|
+
|
|
296
383
|
await this.#store.transactionAsync(async () => {
|
|
297
|
-
for (
|
|
384
|
+
for (let i = 0; i < txs.length; i++) {
|
|
385
|
+
const tx = txs[i];
|
|
298
386
|
const txHash = tx.getTxHash();
|
|
299
387
|
const txHashStr = txHash.toString();
|
|
300
388
|
const isNew = !this.#indices.has(txHashStr);
|
|
301
389
|
const minedBlockId = await this.#getMinedBlockId(txHash);
|
|
302
390
|
|
|
303
391
|
if (isNew) {
|
|
392
|
+
const meta = await buildTxMetaData(tx, allowedFlags[i]);
|
|
304
393
|
// New tx - add as mined or protected (callback emitted by #addTx)
|
|
305
394
|
if (minedBlockId) {
|
|
306
|
-
await this.#addTx(tx, { mined: minedBlockId }, opts);
|
|
395
|
+
await this.#addTx(tx, { mined: minedBlockId }, opts, meta);
|
|
307
396
|
this.#indices.setProtection(txHashStr, slotNumber);
|
|
308
397
|
} else {
|
|
309
|
-
await this.#addTx(tx, { protected: slotNumber }, opts);
|
|
398
|
+
await this.#addTx(tx, { protected: slotNumber }, opts, meta);
|
|
310
399
|
}
|
|
311
400
|
} else {
|
|
312
401
|
// Existing tx - update protection and mined status
|
|
@@ -320,23 +409,58 @@ export class TxPoolV2Impl {
|
|
|
320
409
|
});
|
|
321
410
|
}
|
|
322
411
|
|
|
323
|
-
protectTxs(txHashes: TxHash[], block: BlockHeader): TxHash[] {
|
|
412
|
+
async protectTxs(txHashes: TxHash[], block: BlockHeader): Promise<TxHash[]> {
|
|
324
413
|
const slotNumber = block.globalVariables.slotNumber;
|
|
325
414
|
const missing: TxHash[] = [];
|
|
415
|
+
let softDeletedHits = 0;
|
|
416
|
+
let missingPreviouslyEvicted = 0;
|
|
326
417
|
|
|
327
|
-
|
|
328
|
-
const
|
|
418
|
+
await this.#store.transactionAsync(async () => {
|
|
419
|
+
for (const txHash of txHashes) {
|
|
420
|
+
const txHashStr = txHash.toString();
|
|
329
421
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
422
|
+
if (this.#indices.has(txHashStr)) {
|
|
423
|
+
// Update protection for existing tx
|
|
424
|
+
this.#indices.updateProtection(txHashStr, slotNumber);
|
|
425
|
+
} else if (this.#deletedPool.isSoftDeleted(txHashStr)) {
|
|
426
|
+
// Resurrect soft-deleted tx as protected
|
|
427
|
+
const buffer = await this.#txsDB.getAsync(txHashStr);
|
|
428
|
+
if (buffer) {
|
|
429
|
+
const tx = Tx.fromBuffer(buffer);
|
|
430
|
+
await this.#addTx(tx, { protected: slotNumber });
|
|
431
|
+
softDeletedHits++;
|
|
432
|
+
} else {
|
|
433
|
+
// Data missing despite soft-delete flag — treat as truly missing
|
|
434
|
+
this.#indices.setProtection(txHashStr, slotNumber);
|
|
435
|
+
missing.push(txHash);
|
|
436
|
+
}
|
|
437
|
+
} else {
|
|
438
|
+
// Truly missing — pre-record protection for tx we don't have yet
|
|
439
|
+
this.#indices.setProtection(txHashStr, slotNumber);
|
|
440
|
+
missing.push(txHash);
|
|
441
|
+
if (this.#evictedTxHashes.has(txHashStr)) {
|
|
442
|
+
missingPreviouslyEvicted++;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
337
445
|
}
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
// Record metrics
|
|
449
|
+
if (softDeletedHits > 0) {
|
|
450
|
+
this.#instrumentation.recordSoftDeletedHits(softDeletedHits);
|
|
451
|
+
}
|
|
452
|
+
if (missing.length > 0) {
|
|
453
|
+
this.#log.debug(`protectTxs missing tx hashes: ${missing.map(h => h.toString()).join(', ')}`);
|
|
454
|
+
this.#instrumentation.recordMissingOnProtect(missing.length);
|
|
455
|
+
}
|
|
456
|
+
if (missingPreviouslyEvicted > 0) {
|
|
457
|
+
this.#instrumentation.recordMissingPreviouslyEvicted(missingPreviouslyEvicted);
|
|
338
458
|
}
|
|
339
459
|
|
|
460
|
+
this.#log.info(
|
|
461
|
+
`Protected ${txHashes.length} txs, missing: ${missing.length}, soft-deleted hits: ${softDeletedHits}`,
|
|
462
|
+
);
|
|
463
|
+
|
|
340
464
|
return missing;
|
|
341
465
|
}
|
|
342
466
|
|
|
@@ -380,54 +504,67 @@ export class TxPoolV2Impl {
|
|
|
380
504
|
}
|
|
381
505
|
}
|
|
382
506
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
507
|
+
await this.#store.transactionAsync(async () => {
|
|
508
|
+
// Step 4: Mark txs as mined (only those we have in the pool)
|
|
509
|
+
for (const meta of found) {
|
|
510
|
+
this.#indices.markAsMined(meta, blockId);
|
|
511
|
+
await this.#deletedPool.clearIfMinedHigher(meta.txHash, blockId.number);
|
|
512
|
+
}
|
|
388
513
|
|
|
389
|
-
|
|
390
|
-
|
|
514
|
+
// Step 5: Run post-event eviction rules (inside transaction for atomicity)
|
|
515
|
+
await this.#evictionManager.evictAfterNewBlock(block.header, nullifiers, feePayers);
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
if (found.length > 0) {
|
|
519
|
+
this.#callbacks.onTxsMined(found.map(m => m.txHash));
|
|
520
|
+
}
|
|
391
521
|
|
|
392
522
|
this.#log.info(`Marked ${found.length} txs as mined in block ${blockId.number}`);
|
|
393
523
|
}
|
|
394
524
|
|
|
395
525
|
async prepareForSlot(slotNumber: SlotNumber): Promise<void> {
|
|
396
|
-
|
|
397
|
-
|
|
526
|
+
await this.#store.transactionAsync(async () => {
|
|
527
|
+
// Step 0: Clean up slot-deleted txs from previous slots
|
|
528
|
+
await this.#deletedPool.cleanupSlotDeleted(slotNumber);
|
|
398
529
|
|
|
399
|
-
|
|
400
|
-
|
|
530
|
+
// Step 1: Find expired protected txs
|
|
531
|
+
const expiredProtected = this.#indices.findExpiredProtectedTxs(slotNumber);
|
|
401
532
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
if (txsToRestore.length === 0) {
|
|
405
|
-
return;
|
|
406
|
-
}
|
|
533
|
+
// Step 2: Clear protection for all expired entries (including those without metadata)
|
|
534
|
+
this.#indices.clearProtection(expiredProtected);
|
|
407
535
|
|
|
408
|
-
|
|
536
|
+
// Step 3: Filter to only txs that have metadata and are not mined
|
|
537
|
+
const txsToRestore = this.#indices.filterRestorable(expiredProtected);
|
|
538
|
+
if (txsToRestore.length === 0) {
|
|
539
|
+
this.#log.debug(`Preparing for slot ${slotNumber}, no txs to unprotect`);
|
|
540
|
+
return;
|
|
541
|
+
}
|
|
409
542
|
|
|
410
|
-
|
|
411
|
-
const { valid, invalid } = await this.#revalidateMetadata(txsToRestore, 'during prepareForSlot');
|
|
543
|
+
this.#log.info(`Preparing for slot ${slotNumber}: unprotecting ${txsToRestore.length} txs`);
|
|
412
544
|
|
|
413
|
-
|
|
414
|
-
|
|
545
|
+
// Step 4: Validate for pending pool
|
|
546
|
+
const { valid, invalid } = await this.#revalidateMetadata(txsToRestore, 'during prepareForSlot');
|
|
415
547
|
|
|
416
|
-
|
|
417
|
-
|
|
548
|
+
// Step 5: Resolve nullifier conflicts and add winners to pending indices
|
|
549
|
+
const { added, toEvict } = this.#applyNullifierConflictResolution(valid);
|
|
418
550
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
551
|
+
// Step 6: Delete invalid txs and evict conflict losers
|
|
552
|
+
await this.#deleteTxsBatch(invalid);
|
|
553
|
+
await this.#evictTxs(toEvict, 'NullifierConflict');
|
|
554
|
+
|
|
555
|
+
// Step 7: Run eviction rules (enforce pool size limit)
|
|
556
|
+
if (added.length > 0) {
|
|
557
|
+
const feePayers = added.map(meta => meta.feePayer);
|
|
558
|
+
const uniqueFeePayers = new Set<string>(feePayers);
|
|
559
|
+
await this.#evictionManager.evictAfterNewTxs(
|
|
560
|
+
added.map(m => m.txHash),
|
|
561
|
+
[...uniqueFeePayers],
|
|
562
|
+
);
|
|
563
|
+
}
|
|
564
|
+
});
|
|
428
565
|
}
|
|
429
566
|
|
|
430
|
-
async handlePrunedBlocks(latestBlock: L2BlockId): Promise<void> {
|
|
567
|
+
async handlePrunedBlocks(latestBlock: L2BlockId, options?: { deleteAllTxs?: boolean }): Promise<void> {
|
|
431
568
|
// Step 1: Find transactions mined after the prune point
|
|
432
569
|
const txsToUnmine = this.#indices.findTxsMinedAfter(latestBlock.number);
|
|
433
570
|
if (txsToUnmine.length === 0) {
|
|
@@ -437,43 +574,62 @@ export class TxPoolV2Impl {
|
|
|
437
574
|
|
|
438
575
|
this.#log.info(`Handling prune to block ${latestBlock.number}: un-mining ${txsToUnmine.length} txs`);
|
|
439
576
|
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
577
|
+
await this.#store.transactionAsync(async () => {
|
|
578
|
+
// Step 2: Mark ALL un-mined txs with their original mined block number
|
|
579
|
+
// This ensures they get soft-deleted if removed later, and only hard-deleted
|
|
580
|
+
// when their original mined block is finalized
|
|
581
|
+
await this.#deletedPool.markFromPrunedBlock(
|
|
582
|
+
txsToUnmine.map(m => ({
|
|
583
|
+
txHash: m.txHash,
|
|
584
|
+
minedAtBlock: BlockNumber(m.minedL2BlockId!.number),
|
|
585
|
+
})),
|
|
586
|
+
);
|
|
449
587
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
588
|
+
// Step 3: Unmine - clear mined status from metadata
|
|
589
|
+
for (const meta of txsToUnmine) {
|
|
590
|
+
this.#indices.markAsUnmined(meta);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
// If deleteAllTxs is set (epoch prune), delete all un-mined txs and return early
|
|
594
|
+
if (options?.deleteAllTxs) {
|
|
595
|
+
const allTxHashes = txsToUnmine.map(m => m.txHash);
|
|
596
|
+
await this.#deleteTxsBatch(allTxHashes);
|
|
597
|
+
this.#log.info(
|
|
598
|
+
`Handled prune to block ${latestBlock.number} with deleteAllTxs: deleted ${allTxHashes.length} txs`,
|
|
599
|
+
);
|
|
600
|
+
return;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
// Step 4: Filter out protected txs (they'll be handled by prepareForSlot)
|
|
604
|
+
const unprotectedTxs = this.#indices.filterUnprotected(txsToUnmine);
|
|
454
605
|
|
|
455
|
-
|
|
456
|
-
|
|
606
|
+
// Step 5: Validate for pending pool
|
|
607
|
+
const { valid, invalid } = await this.#revalidateMetadata(unprotectedTxs, 'during handlePrunedBlocks');
|
|
457
608
|
|
|
458
|
-
|
|
459
|
-
|
|
609
|
+
// Step 6: Resolve nullifier conflicts and add winners to pending indices
|
|
610
|
+
const { toEvict } = this.#applyNullifierConflictResolution(valid);
|
|
460
611
|
|
|
461
|
-
|
|
462
|
-
|
|
612
|
+
// Step 7: Delete invalid txs and evict conflict losers
|
|
613
|
+
await this.#deleteTxsBatch(invalid);
|
|
614
|
+
await this.#evictTxs(toEvict, 'NullifierConflict');
|
|
463
615
|
|
|
464
|
-
|
|
465
|
-
|
|
616
|
+
this.#log.info(
|
|
617
|
+
`Handled prune to block ${latestBlock.number}: ${valid.length} txs restored to pending, ${invalid.length} invalid, ${toEvict.length} evicted due to nullifier conflicts`,
|
|
618
|
+
{ txHashesRestored: valid.map(m => m.txHash), txHashesInvalid: invalid, txHashesEvicted: toEvict },
|
|
619
|
+
);
|
|
466
620
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
621
|
+
// Step 8: Run eviction rules for ALL pending txs (not just restored ones)
|
|
622
|
+
// This handles cases like existing pending txs with invalid fee payer balances
|
|
623
|
+
await this.#evictionManager.evictAfterChainPrune(latestBlock.number);
|
|
624
|
+
});
|
|
470
625
|
}
|
|
471
626
|
|
|
472
627
|
async handleFailedExecution(txHashes: TxHash[]): Promise<void> {
|
|
473
|
-
|
|
474
|
-
|
|
628
|
+
await this.#store.transactionAsync(async () => {
|
|
629
|
+
await this.#deleteTxsBatch(txHashes.map(h => h.toString()));
|
|
630
|
+
});
|
|
475
631
|
|
|
476
|
-
this.#log.info(`Deleted ${txHashes.length} failed txs
|
|
632
|
+
this.#log.info(`Deleted ${txHashes.length} failed txs`, { txHashes: txHashes.map(h => h.toString()) });
|
|
477
633
|
}
|
|
478
634
|
|
|
479
635
|
async handleFinalizedBlock(block: BlockHeader): Promise<void> {
|
|
@@ -482,30 +638,34 @@ export class TxPoolV2Impl {
|
|
|
482
638
|
// Step 1: Find mined txs at or before finalized block
|
|
483
639
|
const minedTxsToFinalize = this.#indices.findTxsMinedAtOrBefore(blockNumber);
|
|
484
640
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
const
|
|
490
|
-
|
|
491
|
-
|
|
641
|
+
await this.#store.transactionAsync(async () => {
|
|
642
|
+
// Step 2: Collect mined txs for archiving (before deletion)
|
|
643
|
+
const txsToArchive: Tx[] = [];
|
|
644
|
+
if (this.#archive.isEnabled()) {
|
|
645
|
+
for (const txHashStr of minedTxsToFinalize) {
|
|
646
|
+
const buffer = await this.#txsDB.getAsync(txHashStr);
|
|
647
|
+
if (buffer) {
|
|
648
|
+
txsToArchive.push(Tx.fromBuffer(buffer));
|
|
649
|
+
}
|
|
492
650
|
}
|
|
493
651
|
}
|
|
494
|
-
}
|
|
495
652
|
|
|
496
|
-
|
|
497
|
-
|
|
653
|
+
// Step 3: Delete mined txs from active pool
|
|
654
|
+
await this.#deleteTxsBatch(minedTxsToFinalize);
|
|
498
655
|
|
|
499
|
-
|
|
500
|
-
|
|
656
|
+
// Step 4: Finalize soft-deleted txs
|
|
657
|
+
await this.#deletedPool.finalizeBlock(blockNumber);
|
|
501
658
|
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
659
|
+
// Step 5: Archive mined txs
|
|
660
|
+
if (txsToArchive.length > 0) {
|
|
661
|
+
await this.#archive.archiveTxs(txsToArchive);
|
|
662
|
+
}
|
|
663
|
+
});
|
|
506
664
|
|
|
507
665
|
if (minedTxsToFinalize.length > 0) {
|
|
508
|
-
this.#log.info(`Finalized ${minedTxsToFinalize.length} mined txs from blocks up to ${blockNumber}
|
|
666
|
+
this.#log.info(`Finalized ${minedTxsToFinalize.length} mined txs from blocks up to ${blockNumber}`, {
|
|
667
|
+
txHashes: minedTxsToFinalize,
|
|
668
|
+
});
|
|
509
669
|
}
|
|
510
670
|
}
|
|
511
671
|
|
|
@@ -549,6 +709,13 @@ export class TxPoolV2Impl {
|
|
|
549
709
|
return [...this.#indices.iteratePendingByPriority('desc')].map(hash => TxHash.fromString(hash));
|
|
550
710
|
}
|
|
551
711
|
|
|
712
|
+
getEligiblePendingTxHashes(): TxHash[] {
|
|
713
|
+
const maxReceivedAt = this.#dateProvider.now() - this.#config.minTxPoolAgeMs;
|
|
714
|
+
return [...this.#indices.iterateEligiblePendingByPriority('desc', maxReceivedAt)].map(hash =>
|
|
715
|
+
TxHash.fromString(hash),
|
|
716
|
+
);
|
|
717
|
+
}
|
|
718
|
+
|
|
552
719
|
getPendingTxCount(): number {
|
|
553
720
|
return this.#indices.getPendingTxCount();
|
|
554
721
|
}
|
|
@@ -593,6 +760,9 @@ export class TxPoolV2Impl {
|
|
|
593
760
|
this.#config.archivedTxLimit = config.archivedTxLimit;
|
|
594
761
|
this.#archive.updateLimit(config.archivedTxLimit);
|
|
595
762
|
}
|
|
763
|
+
if (config.minTxPoolAgeMs !== undefined) {
|
|
764
|
+
this.#config.minTxPoolAgeMs = config.minTxPoolAgeMs;
|
|
765
|
+
}
|
|
596
766
|
// Update eviction rules with new config
|
|
597
767
|
this.#evictionManager.updateConfig(config);
|
|
598
768
|
}
|
|
@@ -610,8 +780,17 @@ export class TxPoolV2Impl {
|
|
|
610
780
|
|
|
611
781
|
// === Metrics ===
|
|
612
782
|
|
|
613
|
-
countTxs(): {
|
|
614
|
-
|
|
783
|
+
countTxs(): {
|
|
784
|
+
pending: number;
|
|
785
|
+
protected: number;
|
|
786
|
+
mined: number;
|
|
787
|
+
softDeleted: number;
|
|
788
|
+
totalMetadataBytes: number;
|
|
789
|
+
} {
|
|
790
|
+
return {
|
|
791
|
+
...this.#indices.countTxs(),
|
|
792
|
+
softDeleted: this.#deletedPool.getSoftDeletedCount(),
|
|
793
|
+
};
|
|
615
794
|
}
|
|
616
795
|
|
|
617
796
|
// ============================================================================
|
|
@@ -626,11 +805,14 @@ export class TxPoolV2Impl {
|
|
|
626
805
|
tx: Tx,
|
|
627
806
|
state: 'pending' | { protected: SlotNumber } | { mined: L2BlockId },
|
|
628
807
|
opts: { source?: string } = {},
|
|
808
|
+
precomputedMeta?: TxMetaData,
|
|
629
809
|
): Promise<TxMetaData> {
|
|
630
810
|
const txHashStr = tx.getTxHash().toString();
|
|
631
|
-
const meta = await buildTxMetaData(tx);
|
|
811
|
+
const meta = precomputedMeta ?? (await buildTxMetaData(tx));
|
|
812
|
+
meta.receivedAt = this.#dateProvider.now();
|
|
632
813
|
|
|
633
814
|
await this.#txsDB.set(txHashStr, tx.toBuffer());
|
|
815
|
+
await this.#deletedPool.clearSoftDeleted(txHashStr);
|
|
634
816
|
this.#callbacks.onTxsAdded([tx], opts);
|
|
635
817
|
|
|
636
818
|
if (state === 'pending') {
|
|
@@ -643,9 +825,11 @@ export class TxPoolV2Impl {
|
|
|
643
825
|
}
|
|
644
826
|
|
|
645
827
|
const stateStr = typeof state === 'string' ? state : Object.keys(state)[0];
|
|
646
|
-
this.#log.
|
|
828
|
+
this.#log.debug(`Added tx ${txHashStr} as ${stateStr}`, {
|
|
647
829
|
eventName: 'tx-added-to-pool',
|
|
830
|
+
txHash: txHashStr,
|
|
648
831
|
state: stateStr,
|
|
832
|
+
source: opts.source,
|
|
649
833
|
});
|
|
650
834
|
|
|
651
835
|
return meta;
|
|
@@ -673,6 +857,29 @@ export class TxPoolV2Impl {
|
|
|
673
857
|
}
|
|
674
858
|
}
|
|
675
859
|
|
|
860
|
+
/** Evicts transactions: records eviction metric with reason, caches hashes, then deletes. */
|
|
861
|
+
async #evictTxs(txHashes: string[], reason: string): Promise<void> {
|
|
862
|
+
if (txHashes.length === 0) {
|
|
863
|
+
return;
|
|
864
|
+
}
|
|
865
|
+
this.#instrumentation.recordEvictions(txHashes.length, reason);
|
|
866
|
+
for (const txHashStr of txHashes) {
|
|
867
|
+
this.#log.debug(`Evicting tx ${txHashStr}`, { txHash: txHashStr, reason });
|
|
868
|
+
this.#addToEvictedCache(txHashStr);
|
|
869
|
+
}
|
|
870
|
+
await this.#deleteTxsBatch(txHashes);
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
/** Adds a tx hash to the bounded evicted cache, evicting the oldest entry if at capacity. */
|
|
874
|
+
#addToEvictedCache(txHashStr: string): void {
|
|
875
|
+
if (this.#evictedTxHashes.size >= this.#config.evictedTxCacheSize) {
|
|
876
|
+
// FIFO eviction: remove the first (oldest) entry
|
|
877
|
+
const oldest = this.#evictedTxHashes.values().next().value!;
|
|
878
|
+
this.#evictedTxHashes.delete(oldest);
|
|
879
|
+
}
|
|
880
|
+
this.#evictedTxHashes.add(txHashStr);
|
|
881
|
+
}
|
|
882
|
+
|
|
676
883
|
// ============================================================================
|
|
677
884
|
// PRIVATE HELPERS - Validation & Conflict Resolution
|
|
678
885
|
// ============================================================================
|
|
@@ -783,7 +990,8 @@ export class TxPoolV2Impl {
|
|
|
783
990
|
|
|
784
991
|
try {
|
|
785
992
|
const tx = Tx.fromBuffer(buffer);
|
|
786
|
-
const
|
|
993
|
+
const allowedSetupCalls = await this.#checkAllowedSetupCalls(tx);
|
|
994
|
+
const meta = await buildTxMetaData(tx, allowedSetupCalls);
|
|
787
995
|
loaded.push({ tx, meta });
|
|
788
996
|
} catch (err) {
|
|
789
997
|
this.#log.warn(`Failed to deserialize tx ${txHashStr}, deleting`, { err });
|
|
@@ -828,7 +1036,9 @@ export class TxPoolV2Impl {
|
|
|
828
1036
|
if (preAddResult.shouldIgnore) {
|
|
829
1037
|
// Transaction rejected - mark for deletion from DB
|
|
830
1038
|
rejected.push(meta.txHash);
|
|
831
|
-
this.#log.debug(
|
|
1039
|
+
this.#log.debug(
|
|
1040
|
+
`Rejected tx ${meta.txHash} during rebuild: ${preAddResult.reason?.message ?? 'unknown reason'}`,
|
|
1041
|
+
);
|
|
832
1042
|
continue;
|
|
833
1043
|
}
|
|
834
1044
|
|
|
@@ -864,7 +1074,7 @@ export class TxPoolV2Impl {
|
|
|
864
1074
|
getFeePayerPendingTxs: (feePayer: string) => this.#indices.getFeePayerPendingTxs(feePayer),
|
|
865
1075
|
getPendingTxCount: () => this.#indices.getPendingTxCount(),
|
|
866
1076
|
getLowestPriorityPending: (limit: number) => this.#indices.getLowestPriorityPending(limit),
|
|
867
|
-
deleteTxs: (txHashes: string[]) => this.#
|
|
1077
|
+
deleteTxs: (txHashes: string[], reason?: string) => this.#evictTxs(txHashes, reason ?? 'unknown'),
|
|
868
1078
|
};
|
|
869
1079
|
}
|
|
870
1080
|
|