@aztec/p2p 0.0.1-commit.f295ac2 → 0.0.1-commit.f2ce05ee
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/dest/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +4 -4
- package/dest/client/factory.d.ts +3 -3
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +11 -8
- package/dest/client/interface.d.ts +9 -2
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +7 -4
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +24 -7
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
- package/dest/config.d.ts +16 -3
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +7 -2
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +94 -87
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +411 -3
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
- 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 +351 -85
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -2
- package/dest/mem_pools/index.d.ts +2 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/index.js +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 +2 -2
- package/dest/mem_pools/interface.d.ts +3 -3
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +3 -3
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +3 -2
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +3 -2
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +8 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +119 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +90 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +89 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +131 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +63 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +91 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +70 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +63 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts +5 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/index.js +4 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +197 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +6 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +71 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +95 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +99 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +332 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +55 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +156 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +69 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +748 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +3 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +41 -10
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +5 -5
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +18 -6
- package/dest/msg_validators/clock_tolerance.d.ts +21 -0
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
- package/dest/msg_validators/clock_tolerance.js +37 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +3 -3
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +55 -31
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +3 -3
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +93 -64
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +5 -4
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +3 -2
- package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +4 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +3 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +8 -3
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +21 -11
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +3 -2
- package/dest/msg_validators/tx_validator/index.d.ts +2 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +1 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
- package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/size_validator.js +23 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
- 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 -2
- 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 +10 -6
- package/dest/services/discv5/discV5_service.js +1 -1
- package/dest/services/dummy_service.d.ts +18 -2
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +42 -0
- package/dest/services/encoding.d.ts +1 -1
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +2 -3
- package/dest/services/gossipsub/index.d.ts +3 -0
- package/dest/services/gossipsub/index.d.ts.map +1 -0
- package/dest/services/gossipsub/index.js +2 -0
- package/dest/services/gossipsub/scoring.d.ts +21 -3
- package/dest/services/gossipsub/scoring.d.ts.map +1 -1
- package/dest/services/gossipsub/scoring.js +24 -7
- package/dest/services/gossipsub/topic_score_params.d.ts +161 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +324 -0
- package/dest/services/index.d.ts +2 -1
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +1 -0
- package/dest/services/libp2p/instrumentation.d.ts +1 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +14 -3
- package/dest/services/libp2p/libp2p_service.d.ts +81 -34
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +356 -288
- package/dest/services/peer-manager/metrics.d.ts +2 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +20 -5
- package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +33 -4
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
- package/dest/services/reqresp/interface.d.ts +5 -3
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +2 -2
- package/dest/services/reqresp/metrics.d.ts +6 -5
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +17 -5
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +5 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +6 -4
- 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 +27 -9
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +23 -6
- 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 +44 -13
- package/dest/services/reqresp/reqresp.d.ts +6 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +58 -22
- package/dest/services/service.d.ts +21 -1
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +4 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +9 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts +5 -4
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +17 -10
- package/dest/services/tx_collection/index.d.ts +2 -1
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +1 -0
- 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 +9 -2
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
- package/dest/services/tx_collection/proposal_tx_collector.js +49 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts +3 -3
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.d.ts +8 -8
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +5 -5
- package/dest/services/tx_file_store/config.d.ts +18 -0
- package/dest/services/tx_file_store/config.d.ts.map +1 -0
- package/dest/services/tx_file_store/config.js +26 -0
- package/dest/services/tx_file_store/index.d.ts +4 -0
- package/dest/services/tx_file_store/index.d.ts.map +1 -0
- package/dest/services/tx_file_store/index.js +3 -0
- package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
- package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_file_store/instrumentation.js +29 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts +47 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
- package/dest/services/tx_file_store/tx_file_store.js +149 -0
- package/dest/services/tx_provider.d.ts +3 -3
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.d.ts +1 -1
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.js +5 -5
- package/dest/test-helpers/index.d.ts +3 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +2 -0
- package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +2 -1
- package/dest/test-helpers/test_tx_provider.d.ts +40 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +41 -0
- package/dest/test-helpers/testbench-utils.d.ts +152 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +308 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +212 -133
- package/dest/testbench/worker_client_manager.d.ts +51 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +226 -44
- package/package.json +14 -14
- package/src/bootstrap/bootstrap.ts +7 -4
- package/src/client/factory.ts +13 -14
- package/src/client/interface.ts +13 -1
- package/src/client/p2p_client.ts +37 -13
- package/src/client/test/tx_proposal_collector/README.md +227 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
- package/src/config.ts +22 -2
- package/src/mem_pools/attestation_pool/attestation_pool.ts +444 -90
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +436 -100
- package/src/mem_pools/attestation_pool/index.ts +9 -2
- package/src/mem_pools/index.ts +1 -1
- package/src/mem_pools/instrumentation.ts +2 -1
- package/src/mem_pools/interface.ts +2 -2
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +2 -2
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +2 -1
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +2 -1
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +10 -7
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +4 -2
- package/src/mem_pools/tx_pool_v2/README.md +209 -0
- package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +147 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +118 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +111 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +23 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +164 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +86 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +72 -0
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
- package/src/mem_pools/tx_pool_v2/index.ts +11 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +227 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +161 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +417 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +212 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +882 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +26 -14
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +16 -10
- package/src/msg_validators/clock_tolerance.ts +51 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +31 -31
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +91 -67
- package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
- package/src/msg_validators/tx_validator/block_header_validator.ts +6 -5
- package/src/msg_validators/tx_validator/data_validator.ts +6 -2
- package/src/msg_validators/tx_validator/double_spend_validator.ts +4 -3
- package/src/msg_validators/tx_validator/factory.ts +64 -23
- package/src/msg_validators/tx_validator/gas_validator.ts +9 -3
- package/src/msg_validators/tx_validator/index.ts +1 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +6 -3
- package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
- package/src/msg_validators/tx_validator/size_validator.ts +22 -0
- package/src/msg_validators/tx_validator/timestamp_validator.ts +6 -3
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
- package/src/services/data_store.ts +10 -7
- package/src/services/discv5/discV5_service.ts +1 -1
- package/src/services/dummy_service.ts +51 -0
- package/src/services/encoding.ts +2 -3
- package/src/services/gossipsub/README.md +626 -0
- package/src/services/gossipsub/index.ts +2 -0
- package/src/services/gossipsub/scoring.ts +29 -5
- package/src/services/gossipsub/topic_score_params.ts +451 -0
- package/src/services/index.ts +1 -0
- package/src/services/libp2p/instrumentation.ts +15 -2
- package/src/services/libp2p/libp2p_service.ts +390 -302
- package/src/services/peer-manager/metrics.ts +21 -4
- package/src/services/peer-manager/peer_scoring.ts +29 -1
- package/src/services/reqresp/batch-tx-requester/README.md +305 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
- package/src/services/reqresp/interface.ts +5 -2
- package/src/services/reqresp/metrics.ts +34 -9
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +7 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -11
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +57 -9
- package/src/services/reqresp/reqresp.ts +66 -19
- package/src/services/service.ts +24 -0
- package/src/services/tx_collection/config.ts +15 -1
- package/src/services/tx_collection/fast_tx_collection.ts +30 -17
- package/src/services/tx_collection/index.ts +5 -0
- package/src/services/tx_collection/instrumentation.ts +11 -2
- package/src/services/tx_collection/proposal_tx_collector.ts +112 -0
- package/src/services/tx_collection/slow_tx_collection.ts +2 -2
- package/src/services/tx_collection/tx_collection.ts +8 -8
- package/src/services/tx_file_store/config.ts +43 -0
- package/src/services/tx_file_store/index.ts +3 -0
- package/src/services/tx_file_store/instrumentation.ts +36 -0
- package/src/services/tx_file_store/tx_file_store.ts +173 -0
- package/src/services/tx_provider.ts +2 -2
- package/src/services/tx_provider_instrumentation.ts +11 -5
- package/src/test-helpers/index.ts +2 -0
- package/src/test-helpers/reqresp-nodes.ts +2 -1
- package/src/test-helpers/test_tx_provider.ts +64 -0
- package/src/test-helpers/testbench-utils.ts +362 -0
- package/src/testbench/p2p_client_testbench_worker.ts +321 -126
- package/src/testbench/worker_client_manager.ts +304 -47
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
3
|
+
import { getFeePayerBalanceDelta } from '../../msg_validators/tx_validator/fee_payer_balance.js';
|
|
4
|
+
import { getTxPriorityFee } from '../tx_pool/priority.js';
|
|
5
|
+
/**
|
|
6
|
+
* Builds TxMetaData from a full Tx object.
|
|
7
|
+
* Extracts all relevant fields for efficient in-memory storage and querying.
|
|
8
|
+
*/ export async function buildTxMetaData(tx) {
|
|
9
|
+
const txHash = tx.getTxHash().toString();
|
|
10
|
+
const anchorBlockHeaderHash = (await tx.data.constants.anchorBlockHeader.hash()).toString();
|
|
11
|
+
const priorityFee = getTxPriorityFee(tx);
|
|
12
|
+
const feePayer = tx.data.feePayer.toString();
|
|
13
|
+
const nullifiers = tx.data.getNonEmptyNullifiers().map((n)=>n.toString());
|
|
14
|
+
const includeByTimestamp = tx.data.includeByTimestamp;
|
|
15
|
+
const { feeLimit, claimAmount } = await getFeePayerBalanceDelta(tx, ProtocolContractAddress.FeeJuice);
|
|
16
|
+
return {
|
|
17
|
+
txHash,
|
|
18
|
+
anchorBlockHeaderHash,
|
|
19
|
+
priorityFee,
|
|
20
|
+
feePayer,
|
|
21
|
+
claimAmount,
|
|
22
|
+
feeLimit,
|
|
23
|
+
nullifiers,
|
|
24
|
+
includeByTimestamp
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Compares two priority fees in ascending order.
|
|
29
|
+
* Returns negative if a < b, positive if a > b, 0 if equal.
|
|
30
|
+
*/ export function compareFee(a, b) {
|
|
31
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Compares two tx hashes in ascending order.
|
|
35
|
+
* Uses field element comparison for deterministic ordering.
|
|
36
|
+
* Returns negative if a < b, positive if a > b, 0 if equal.
|
|
37
|
+
*/ export function compareTxHash(a, b) {
|
|
38
|
+
const fieldA = Fr.fromHexString(a);
|
|
39
|
+
const fieldB = Fr.fromHexString(b);
|
|
40
|
+
return fieldA.cmp(fieldB);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Compares two transactions by priority fee, with txHash as tiebreaker.
|
|
44
|
+
* Returns negative if a < b, positive if a > b, 0 if equal.
|
|
45
|
+
* Use with sort() for ascending order, or negate/reverse for descending.
|
|
46
|
+
*/ export function comparePriority(a, b) {
|
|
47
|
+
const feeComparison = compareFee(a.priorityFee, b.priorityFee);
|
|
48
|
+
if (feeComparison !== 0) {
|
|
49
|
+
return feeComparison;
|
|
50
|
+
}
|
|
51
|
+
return compareTxHash(a.txHash, b.txHash);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Checks for nullifier conflicts between an incoming transaction and existing pool state.
|
|
55
|
+
*
|
|
56
|
+
* When the incoming tx shares nullifiers with existing pending txs:
|
|
57
|
+
* - If the incoming tx has strictly higher priority, mark conflicting txs for eviction
|
|
58
|
+
* - If any conflicting tx has equal or higher priority, ignore the incoming tx
|
|
59
|
+
*
|
|
60
|
+
* @param incomingMeta - Metadata for the incoming transaction
|
|
61
|
+
* @param getTxHashByNullifier - Accessor to find which tx uses a nullifier
|
|
62
|
+
* @param getMetadata - Accessor to get metadata for a tx hash
|
|
63
|
+
*/ export function checkNullifierConflict(incomingMeta, getTxHashByNullifier, getMetadata) {
|
|
64
|
+
const txHashesToEvict = [];
|
|
65
|
+
for (const nullifier of incomingMeta.nullifiers){
|
|
66
|
+
const conflictingHashStr = getTxHashByNullifier(nullifier);
|
|
67
|
+
if (!conflictingHashStr || conflictingHashStr === incomingMeta.txHash) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
// Skip if already marked for eviction
|
|
71
|
+
if (txHashesToEvict.includes(conflictingHashStr)) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const conflictingMeta = getMetadata(conflictingHashStr);
|
|
75
|
+
if (!conflictingMeta) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
// If incoming tx has strictly higher priority, mark for eviction
|
|
79
|
+
// Otherwise, ignore incoming tx (ties go to existing tx)
|
|
80
|
+
// Use comparePriority for deterministic ordering (includes txHash as tiebreaker)
|
|
81
|
+
if (comparePriority(incomingMeta, conflictingMeta) > 0) {
|
|
82
|
+
txHashesToEvict.push(conflictingHashStr);
|
|
83
|
+
} else {
|
|
84
|
+
return {
|
|
85
|
+
shouldIgnore: true,
|
|
86
|
+
txHashesToEvict: [],
|
|
87
|
+
reason: `nullifier conflict with ${conflictingHashStr}`
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
shouldIgnore: false,
|
|
93
|
+
txHashesToEvict
|
|
94
|
+
};
|
|
95
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics types for tx pool benchmarks.
|
|
3
|
+
*/
|
|
4
|
+
export declare enum TxPoolOperation {
|
|
5
|
+
ADD_PENDING_TXS = "addPendingTxs",
|
|
6
|
+
CAN_ADD_PENDING_TX = "canAddPendingTx",
|
|
7
|
+
GET_PENDING_TX_HASHES = "getPendingTxHashes",
|
|
8
|
+
GET_TX_BY_HASH = "getTxByHash",
|
|
9
|
+
GET_TXS_BY_HASH = "getTxsByHash",
|
|
10
|
+
HAS_TXS = "hasTxs",
|
|
11
|
+
HANDLE_MINED_BLOCK = "handleMinedBlock",
|
|
12
|
+
PREPARE_FOR_SLOT = "prepareForSlot",
|
|
13
|
+
HANDLE_PRUNED_BLOCKS = "handlePrunedBlocks",
|
|
14
|
+
GET_LOWEST_PRIORITY_PENDING = "getLowestPriorityPending",
|
|
15
|
+
HYDRATE_FROM_DATABASE = "hydrateFromDatabase"
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Collects and formats tx pool benchmark metrics.
|
|
19
|
+
*/
|
|
20
|
+
export declare class TxPoolBenchMetrics {
|
|
21
|
+
private metrics;
|
|
22
|
+
addMetric(operation: TxPoolOperation, poolSize: number, batchSize: number, value: number): void;
|
|
23
|
+
toPrettyString(): string;
|
|
24
|
+
toGithubActionBenchmarkJSON(indent?: number): string;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfcG9vbF9iZW5jaF9tZXRyaWNzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWVtX3Bvb2xzL3R4X3Bvb2xfdjIvdHhfcG9vbF9iZW5jaF9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsb0JBQVksZUFBZTtJQUN6QixlQUFlLGtCQUFrQjtJQUNqQyxrQkFBa0Isb0JBQW9CO0lBQ3RDLHFCQUFxQix1QkFBdUI7SUFDNUMsY0FBYyxnQkFBZ0I7SUFDOUIsZUFBZSxpQkFBaUI7SUFDaEMsT0FBTyxXQUFXO0lBQ2xCLGtCQUFrQixxQkFBcUI7SUFDdkMsZ0JBQWdCLG1CQUFtQjtJQUNuQyxvQkFBb0IsdUJBQXVCO0lBQzNDLDJCQUEyQiw2QkFBNkI7SUFDeEQscUJBQXFCLHdCQUF3QjtDQUM5QztBQVNEOztHQUVHO0FBQ0gscUJBQWEsa0JBQWtCO0lBQzdCLE9BQU8sQ0FBQyxPQUFPLENBQXlCO0lBRWpDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUU5RjtJQUVNLGNBQWMsSUFBSSxNQUFNLENBd0I5QjtJQUVNLDJCQUEyQixDQUFDLE1BQU0sU0FBSSxHQUFHLE1BQU0sQ0FjckQ7Q0FDRiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_pool_bench_metrics.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,oBAAY,eAAe;IACzB,eAAe,kBAAkB;IACjC,kBAAkB,oBAAoB;IACtC,qBAAqB,uBAAuB;IAC5C,cAAc,gBAAgB;IAC9B,eAAe,iBAAiB;IAChC,OAAO,WAAW;IAClB,kBAAkB,qBAAqB;IACvC,gBAAgB,mBAAmB;IACnC,oBAAoB,uBAAuB;IAC3C,2BAA2B,6BAA6B;IACxD,qBAAqB,wBAAwB;CAC9C;AASD;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAyB;IAEjC,SAAS,CAAC,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAE9F;IAEM,cAAc,IAAI,MAAM,CAwB9B;IAEM,2BAA2B,CAAC,MAAM,SAAI,GAAG,MAAM,CAcrD;CACF"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics types for tx pool benchmarks.
|
|
3
|
+
*/ export var TxPoolOperation = /*#__PURE__*/ function(TxPoolOperation) {
|
|
4
|
+
TxPoolOperation["ADD_PENDING_TXS"] = "addPendingTxs";
|
|
5
|
+
TxPoolOperation["CAN_ADD_PENDING_TX"] = "canAddPendingTx";
|
|
6
|
+
TxPoolOperation["GET_PENDING_TX_HASHES"] = "getPendingTxHashes";
|
|
7
|
+
TxPoolOperation["GET_TX_BY_HASH"] = "getTxByHash";
|
|
8
|
+
TxPoolOperation["GET_TXS_BY_HASH"] = "getTxsByHash";
|
|
9
|
+
TxPoolOperation["HAS_TXS"] = "hasTxs";
|
|
10
|
+
TxPoolOperation["HANDLE_MINED_BLOCK"] = "handleMinedBlock";
|
|
11
|
+
TxPoolOperation["PREPARE_FOR_SLOT"] = "prepareForSlot";
|
|
12
|
+
TxPoolOperation["HANDLE_PRUNED_BLOCKS"] = "handlePrunedBlocks";
|
|
13
|
+
TxPoolOperation["GET_LOWEST_PRIORITY_PENDING"] = "getLowestPriorityPending";
|
|
14
|
+
TxPoolOperation["HYDRATE_FROM_DATABASE"] = "hydrateFromDatabase";
|
|
15
|
+
return TxPoolOperation;
|
|
16
|
+
}({});
|
|
17
|
+
/**
|
|
18
|
+
* Collects and formats tx pool benchmark metrics.
|
|
19
|
+
*/ export class TxPoolBenchMetrics {
|
|
20
|
+
metrics = [];
|
|
21
|
+
addMetric(operation, poolSize, batchSize, value) {
|
|
22
|
+
this.metrics.push({
|
|
23
|
+
operation,
|
|
24
|
+
poolSize,
|
|
25
|
+
batchSize,
|
|
26
|
+
value
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
toPrettyString() {
|
|
30
|
+
let pretty = 'TxPool Benchmark Metrics:\n';
|
|
31
|
+
pretty += '='.repeat(60) + '\n';
|
|
32
|
+
// Group by operation
|
|
33
|
+
const byOperation = new Map();
|
|
34
|
+
for (const metric of this.metrics){
|
|
35
|
+
if (!byOperation.has(metric.operation)) {
|
|
36
|
+
byOperation.set(metric.operation, []);
|
|
37
|
+
}
|
|
38
|
+
byOperation.get(metric.operation).push(metric);
|
|
39
|
+
}
|
|
40
|
+
for (const [operation, opMetrics] of byOperation){
|
|
41
|
+
pretty += `\n${operation}:\n`;
|
|
42
|
+
for (const metric of opMetrics){
|
|
43
|
+
const poolSizeStr = metric.poolSize > 0 ? `pool=${metric.poolSize}` : '';
|
|
44
|
+
const batchSizeStr = metric.batchSize > 0 ? `batch=${metric.batchSize}` : '';
|
|
45
|
+
const params = [
|
|
46
|
+
poolSizeStr,
|
|
47
|
+
batchSizeStr
|
|
48
|
+
].filter(Boolean).join(', ');
|
|
49
|
+
pretty += ` ${params ? `(${params})` : ''}: ${metric.value.toFixed(3)} ms\n`;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return pretty;
|
|
53
|
+
}
|
|
54
|
+
toGithubActionBenchmarkJSON(indent = 2) {
|
|
55
|
+
const data = this.metrics.map((metric)=>{
|
|
56
|
+
const poolSizeStr = metric.poolSize > 0 ? `${metric.poolSize} txs in pool` : '';
|
|
57
|
+
const batchSizeStr = metric.batchSize > 0 ? `batch of ${metric.batchSize}` : '';
|
|
58
|
+
const params = [
|
|
59
|
+
poolSizeStr,
|
|
60
|
+
batchSizeStr
|
|
61
|
+
].filter(Boolean).join('/');
|
|
62
|
+
return {
|
|
63
|
+
name: `TxPool/${metric.operation}${params ? `/${params}` : ''}`,
|
|
64
|
+
value: metric.value,
|
|
65
|
+
unit: 'ms'
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
return JSON.stringify(data, null, indent);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { L2BlockId } from '@aztec/stdlib/block';
|
|
3
|
+
import { type TxMetaData, type TxState } from './tx_metadata.js';
|
|
4
|
+
/**
|
|
5
|
+
* Manages in-memory indices for the transaction pool.
|
|
6
|
+
*
|
|
7
|
+
* Tracks transaction metadata and maintains several indices for efficient querying:
|
|
8
|
+
* - Metadata by txHash (primary store)
|
|
9
|
+
* - Nullifier to txHash mapping (pending txs only)
|
|
10
|
+
* - Fee payer to txHashes mapping (pending txs only)
|
|
11
|
+
* - Priority-ordered pending txs
|
|
12
|
+
* - Protected transaction tracking
|
|
13
|
+
*
|
|
14
|
+
* Key invariant: Only pending txs appear in nullifier/feePayer/priority indices.
|
|
15
|
+
*/
|
|
16
|
+
export declare class TxPoolIndices {
|
|
17
|
+
#private;
|
|
18
|
+
/**
|
|
19
|
+
* Derives the transaction state from its metadata and protection status.
|
|
20
|
+
* A transaction is:
|
|
21
|
+
* - 'mined' if it has a minedL2BlockId
|
|
22
|
+
* - 'protected' if it's in the protectedTransactions map (but not mined)
|
|
23
|
+
* - 'pending' otherwise
|
|
24
|
+
*/
|
|
25
|
+
getTxState(meta: TxMetaData): TxState;
|
|
26
|
+
getMetadata(txHash: string): TxMetaData | undefined;
|
|
27
|
+
has(txHash: string): boolean;
|
|
28
|
+
isEmpty(): boolean;
|
|
29
|
+
getTxCount(): number;
|
|
30
|
+
/**
|
|
31
|
+
* Iterates pending transaction hashes in priority order.
|
|
32
|
+
* @param order - 'desc' for highest priority first, 'asc' for lowest priority first
|
|
33
|
+
*/
|
|
34
|
+
iteratePendingByPriority(order: 'asc' | 'desc'): Generator<string>;
|
|
35
|
+
/** Iterates all metadata entries */
|
|
36
|
+
iterateMetadata(): Generator<[string, TxMetaData]>;
|
|
37
|
+
/** Adds a new pending transaction to all indices */
|
|
38
|
+
addPending(meta: TxMetaData): void;
|
|
39
|
+
/** Adds a new protected transaction (not added to pending indices) */
|
|
40
|
+
addProtected(meta: TxMetaData, slot: SlotNumber): void;
|
|
41
|
+
/** Adds a new mined transaction (not added to pending indices) */
|
|
42
|
+
addMined(meta: TxMetaData): void;
|
|
43
|
+
/** Marks an existing transaction as mined and removes from pending indices */
|
|
44
|
+
markAsMined(meta: TxMetaData, blockId: L2BlockId): void;
|
|
45
|
+
/** Clears the mined status from a transaction */
|
|
46
|
+
markAsUnmined(meta: TxMetaData): void;
|
|
47
|
+
/**
|
|
48
|
+
* Updates protection status for an existing transaction.
|
|
49
|
+
* Removes from pending indices if transitioning from pending to protected.
|
|
50
|
+
*/
|
|
51
|
+
updateProtection(txHash: string, slotNumber: SlotNumber): void;
|
|
52
|
+
/** Sets protection for a txHash that may not have metadata yet */
|
|
53
|
+
setProtection(txHash: string, slotNumber: SlotNumber): void;
|
|
54
|
+
/** Gets the protection slot for a txHash, if protected */
|
|
55
|
+
getProtectionSlot(txHash: string): SlotNumber | undefined;
|
|
56
|
+
/** Removes protection from tx hashes */
|
|
57
|
+
clearProtection(txHashes: string[]): void;
|
|
58
|
+
/** Removes a transaction from all indices */
|
|
59
|
+
remove(txHash: string): void;
|
|
60
|
+
/** Removes a transaction from pending indices only (not metadata) */
|
|
61
|
+
removeFromPendingIndices(meta: TxMetaData): void;
|
|
62
|
+
/** Adds a transaction to pending indices (used during conflict resolution) */
|
|
63
|
+
addToPendingIndices(meta: TxMetaData): void;
|
|
64
|
+
/** Gets all pending transactions for a given fee payer */
|
|
65
|
+
getFeePayerPendingTxs(feePayer: string): TxMetaData[];
|
|
66
|
+
/** Gets the count of pending transactions */
|
|
67
|
+
getPendingTxCount(): number;
|
|
68
|
+
/** Gets the lowest priority pending transaction hashes (up to limit) */
|
|
69
|
+
getLowestPriorityPending(limit: number): string[];
|
|
70
|
+
/** Gets the lowest priority pending transaction */
|
|
71
|
+
getLowestPriorityPendingTx(): TxMetaData | undefined;
|
|
72
|
+
/** Gets all pending transactions */
|
|
73
|
+
getPendingTxs(): TxMetaData[];
|
|
74
|
+
/** Gets all fee payers with pending transactions */
|
|
75
|
+
getPendingFeePayers(): string[];
|
|
76
|
+
/** Gets the txHash that uses a given nullifier (pending txs only) */
|
|
77
|
+
getTxHashByNullifier(nullifier: string): string | undefined;
|
|
78
|
+
/** Gets txHashes for a fee payer */
|
|
79
|
+
getTxHashesByFeePayer(feePayer: string): Set<string> | undefined;
|
|
80
|
+
/** Finds all transactions mined in blocks after the given block number */
|
|
81
|
+
findTxsMinedAfter(blockNumber: number): TxMetaData[];
|
|
82
|
+
/** Finds tx hashes mined at or before the given block number */
|
|
83
|
+
findTxsMinedAtOrBefore(blockNumber: number): string[];
|
|
84
|
+
/** Finds protected tx hashes from slots earlier than the given slot number */
|
|
85
|
+
findExpiredProtectedTxs(slotNumber: SlotNumber): string[];
|
|
86
|
+
/** Filters out transactions that are currently protected */
|
|
87
|
+
filterUnprotected(txs: TxMetaData[]): TxMetaData[];
|
|
88
|
+
/** Filters to transactions that have metadata and are not mined */
|
|
89
|
+
filterRestorable(txHashes: string[]): TxMetaData[];
|
|
90
|
+
/** Counts transactions by state */
|
|
91
|
+
countTxs(): {
|
|
92
|
+
pending: number;
|
|
93
|
+
protected: number;
|
|
94
|
+
mined: number;
|
|
95
|
+
};
|
|
96
|
+
/** Gets all mined transactions with their block IDs */
|
|
97
|
+
getMinedTxs(): [string, L2BlockId][];
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfcG9vbF9pbmRpY2VzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWVtX3Bvb2xzL3R4X3Bvb2xfdjIvdHhfcG9vbF9pbmRpY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsS0FBSyxVQUFVLEVBQUUsS0FBSyxPQUFPLEVBQTZCLE1BQU0sa0JBQWtCLENBQUM7QUFFNUY7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxxQkFBYSxhQUFhOztJQWdCeEI7Ozs7OztPQU1HO0lBQ0gsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsT0FBTyxDQVFwQztJQUVELFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLFVBQVUsR0FBRyxTQUFTLENBRWxEO0lBRUQsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUUzQjtJQUVELE9BQU8sSUFBSSxPQUFPLENBRWpCO0lBRUQsVUFBVSxJQUFJLE1BQU0sQ0FFbkI7SUFNRDs7O09BR0c7SUFDRix3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBZWxFO0lBRUQsb0NBQW9DO0lBQ25DLGVBQWUsSUFBSSxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FFbEQ7SUFNRCxvREFBb0Q7SUFDcEQsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsSUFBSSxDQUdqQztJQUVELHNFQUFzRTtJQUN0RSxZQUFZLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxHQUFHLElBQUksQ0FHckQ7SUFFRCxrRUFBa0U7SUFDbEUsUUFBUSxDQUFDLElBQUksRUFBRSxVQUFVLEdB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_pool_indices.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/tx_pool_v2/tx_pool_indices.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import { compareFee, compareTxHash } from './tx_metadata.js';
|
|
2
|
+
/**
|
|
3
|
+
* Manages in-memory indices for the transaction pool.
|
|
4
|
+
*
|
|
5
|
+
* Tracks transaction metadata and maintains several indices for efficient querying:
|
|
6
|
+
* - Metadata by txHash (primary store)
|
|
7
|
+
* - Nullifier to txHash mapping (pending txs only)
|
|
8
|
+
* - Fee payer to txHashes mapping (pending txs only)
|
|
9
|
+
* - Priority-ordered pending txs
|
|
10
|
+
* - Protected transaction tracking
|
|
11
|
+
*
|
|
12
|
+
* Key invariant: Only pending txs appear in nullifier/feePayer/priority indices.
|
|
13
|
+
*/ export class TxPoolIndices {
|
|
14
|
+
/** Primary metadata store: txHash -> TxMetaData */ #metadata = new Map();
|
|
15
|
+
/** Nullifier to txHash index (pending txs only) */ #nullifierToTxHash = new Map();
|
|
16
|
+
/** Fee payer to txHashes index (pending txs only) */ #feePayerToTxHashes = new Map();
|
|
17
|
+
/** Pending txHashes grouped by priority fee */ #pendingByPriority = new Map();
|
|
18
|
+
/** Protected transactions: txHash -> slotNumber */ #protectedTransactions = new Map();
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// STATE QUERIES
|
|
21
|
+
// ============================================================================
|
|
22
|
+
/**
|
|
23
|
+
* Derives the transaction state from its metadata and protection status.
|
|
24
|
+
* A transaction is:
|
|
25
|
+
* - 'mined' if it has a minedL2BlockId
|
|
26
|
+
* - 'protected' if it's in the protectedTransactions map (but not mined)
|
|
27
|
+
* - 'pending' otherwise
|
|
28
|
+
*/ getTxState(meta) {
|
|
29
|
+
if (meta.minedL2BlockId !== undefined) {
|
|
30
|
+
return 'mined';
|
|
31
|
+
} else if (this.#protectedTransactions.has(meta.txHash)) {
|
|
32
|
+
return 'protected';
|
|
33
|
+
} else {
|
|
34
|
+
return 'pending';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
getMetadata(txHash) {
|
|
38
|
+
return this.#metadata.get(txHash);
|
|
39
|
+
}
|
|
40
|
+
has(txHash) {
|
|
41
|
+
return this.#metadata.has(txHash);
|
|
42
|
+
}
|
|
43
|
+
isEmpty() {
|
|
44
|
+
return this.#metadata.size === 0;
|
|
45
|
+
}
|
|
46
|
+
getTxCount() {
|
|
47
|
+
return this.#metadata.size;
|
|
48
|
+
}
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// ITERATION
|
|
51
|
+
// ============================================================================
|
|
52
|
+
/**
|
|
53
|
+
* Iterates pending transaction hashes in priority order.
|
|
54
|
+
* @param order - 'desc' for highest priority first, 'asc' for lowest priority first
|
|
55
|
+
*/ *iteratePendingByPriority(order) {
|
|
56
|
+
// Use compareFee from tx_metadata, swap args for descending order
|
|
57
|
+
const feeCompareFn = order === 'desc' ? (a, b)=>compareFee(b, a) : compareFee;
|
|
58
|
+
const hashCompareFn = order === 'desc' ? (a, b)=>compareTxHash(b, a) : compareTxHash;
|
|
59
|
+
const sortedFees = [
|
|
60
|
+
...this.#pendingByPriority.keys()
|
|
61
|
+
].sort(feeCompareFn);
|
|
62
|
+
for (const fee of sortedFees){
|
|
63
|
+
const hashesAtFee = this.#pendingByPriority.get(fee);
|
|
64
|
+
// Use compareTxHash from tx_metadata, swap args for descending order
|
|
65
|
+
const sortedHashes = [
|
|
66
|
+
...hashesAtFee
|
|
67
|
+
].sort(hashCompareFn);
|
|
68
|
+
for (const hash of sortedHashes){
|
|
69
|
+
yield hash;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** Iterates all metadata entries */ *iterateMetadata() {
|
|
74
|
+
yield* this.#metadata;
|
|
75
|
+
}
|
|
76
|
+
// ============================================================================
|
|
77
|
+
// INDEX MODIFICATIONS
|
|
78
|
+
// ============================================================================
|
|
79
|
+
/** Adds a new pending transaction to all indices */ addPending(meta) {
|
|
80
|
+
this.#metadata.set(meta.txHash, meta);
|
|
81
|
+
this.#addToPendingIndices(meta);
|
|
82
|
+
}
|
|
83
|
+
/** Adds a new protected transaction (not added to pending indices) */ addProtected(meta, slot) {
|
|
84
|
+
this.#metadata.set(meta.txHash, meta);
|
|
85
|
+
this.#protectedTransactions.set(meta.txHash, slot);
|
|
86
|
+
}
|
|
87
|
+
/** Adds a new mined transaction (not added to pending indices) */ addMined(meta) {
|
|
88
|
+
this.#metadata.set(meta.txHash, meta);
|
|
89
|
+
}
|
|
90
|
+
/** Marks an existing transaction as mined and removes from pending indices */ markAsMined(meta, blockId) {
|
|
91
|
+
meta.minedL2BlockId = blockId;
|
|
92
|
+
// Safe to call unconditionally - removeFromPendingIndices is idempotent
|
|
93
|
+
this.#removeFromPendingIndices(meta);
|
|
94
|
+
}
|
|
95
|
+
/** Clears the mined status from a transaction */ markAsUnmined(meta) {
|
|
96
|
+
meta.minedL2BlockId = undefined;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Updates protection status for an existing transaction.
|
|
100
|
+
* Removes from pending indices if transitioning from pending to protected.
|
|
101
|
+
*/ updateProtection(txHash, slotNumber) {
|
|
102
|
+
const currentSlot = this.#protectedTransactions.get(txHash);
|
|
103
|
+
// Only update if not already protected at an equal or later slot
|
|
104
|
+
if (currentSlot !== undefined && currentSlot >= slotNumber) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
// Remove from pending indices if transitioning from pending to protected
|
|
108
|
+
if (currentSlot === undefined) {
|
|
109
|
+
const meta = this.#metadata.get(txHash);
|
|
110
|
+
if (meta) {
|
|
111
|
+
this.#removeFromPendingIndices(meta);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
this.#protectedTransactions.set(txHash, slotNumber);
|
|
115
|
+
}
|
|
116
|
+
/** Sets protection for a txHash that may not have metadata yet */ setProtection(txHash, slotNumber) {
|
|
117
|
+
this.#protectedTransactions.set(txHash, slotNumber);
|
|
118
|
+
}
|
|
119
|
+
/** Gets the protection slot for a txHash, if protected */ getProtectionSlot(txHash) {
|
|
120
|
+
return this.#protectedTransactions.get(txHash);
|
|
121
|
+
}
|
|
122
|
+
/** Removes protection from tx hashes */ clearProtection(txHashes) {
|
|
123
|
+
for (const txHash of txHashes){
|
|
124
|
+
this.#protectedTransactions.delete(txHash);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/** Removes a transaction from all indices */ remove(txHash) {
|
|
128
|
+
const meta = this.#metadata.get(txHash);
|
|
129
|
+
if (!meta) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
this.#metadata.delete(txHash);
|
|
133
|
+
this.#protectedTransactions.delete(txHash);
|
|
134
|
+
this.#removeFromPendingIndices(meta);
|
|
135
|
+
}
|
|
136
|
+
/** Removes a transaction from pending indices only (not metadata) */ removeFromPendingIndices(meta) {
|
|
137
|
+
this.#removeFromPendingIndices(meta);
|
|
138
|
+
}
|
|
139
|
+
/** Adds a transaction to pending indices (used during conflict resolution) */ addToPendingIndices(meta) {
|
|
140
|
+
this.#addToPendingIndices(meta);
|
|
141
|
+
}
|
|
142
|
+
// ============================================================================
|
|
143
|
+
// QUERIES FOR EVICTION RULES
|
|
144
|
+
// ============================================================================
|
|
145
|
+
/** Gets all pending transactions for a given fee payer */ getFeePayerPendingTxs(feePayer) {
|
|
146
|
+
const txHashes = this.#feePayerToTxHashes.get(feePayer);
|
|
147
|
+
if (!txHashes) {
|
|
148
|
+
return [];
|
|
149
|
+
}
|
|
150
|
+
const result = [];
|
|
151
|
+
for (const txHash of txHashes){
|
|
152
|
+
const meta = this.#metadata.get(txHash);
|
|
153
|
+
if (meta && this.getTxState(meta) === 'pending') {
|
|
154
|
+
result.push(meta);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
/** Gets the count of pending transactions */ getPendingTxCount() {
|
|
160
|
+
let count = 0;
|
|
161
|
+
for (const hashes of this.#pendingByPriority.values()){
|
|
162
|
+
count += hashes.size;
|
|
163
|
+
}
|
|
164
|
+
return count;
|
|
165
|
+
}
|
|
166
|
+
/** Gets the lowest priority pending transaction hashes (up to limit) */ getLowestPriorityPending(limit) {
|
|
167
|
+
if (limit <= 0) {
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
const result = [];
|
|
171
|
+
for (const hash of this.iteratePendingByPriority('asc')){
|
|
172
|
+
result.push(hash);
|
|
173
|
+
if (result.length >= limit) {
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
/** Gets the lowest priority pending transaction */ getLowestPriorityPendingTx() {
|
|
180
|
+
for (const txHash of this.iteratePendingByPriority('asc')){
|
|
181
|
+
const meta = this.#metadata.get(txHash);
|
|
182
|
+
if (meta) {
|
|
183
|
+
return meta;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
/** Gets all pending transactions */ getPendingTxs() {
|
|
189
|
+
const result = [];
|
|
190
|
+
for (const hashSet of this.#pendingByPriority.values()){
|
|
191
|
+
for (const txHash of hashSet){
|
|
192
|
+
const meta = this.#metadata.get(txHash);
|
|
193
|
+
if (meta) {
|
|
194
|
+
result.push(meta);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return result;
|
|
199
|
+
}
|
|
200
|
+
/** Gets all fee payers with pending transactions */ getPendingFeePayers() {
|
|
201
|
+
return Array.from(this.#feePayerToTxHashes.keys());
|
|
202
|
+
}
|
|
203
|
+
/** Gets the txHash that uses a given nullifier (pending txs only) */ getTxHashByNullifier(nullifier) {
|
|
204
|
+
return this.#nullifierToTxHash.get(nullifier);
|
|
205
|
+
}
|
|
206
|
+
/** Gets txHashes for a fee payer */ getTxHashesByFeePayer(feePayer) {
|
|
207
|
+
return this.#feePayerToTxHashes.get(feePayer);
|
|
208
|
+
}
|
|
209
|
+
// ============================================================================
|
|
210
|
+
// FIND/FILTER OPERATIONS
|
|
211
|
+
// ============================================================================
|
|
212
|
+
/** Finds all transactions mined in blocks after the given block number */ findTxsMinedAfter(blockNumber) {
|
|
213
|
+
const result = [];
|
|
214
|
+
for (const meta of this.#metadata.values()){
|
|
215
|
+
if (meta.minedL2BlockId !== undefined && meta.minedL2BlockId.number > blockNumber) {
|
|
216
|
+
result.push(meta);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
/** Finds tx hashes mined at or before the given block number */ findTxsMinedAtOrBefore(blockNumber) {
|
|
222
|
+
const result = [];
|
|
223
|
+
for (const [txHash, meta] of this.#metadata){
|
|
224
|
+
if (meta.minedL2BlockId !== undefined && meta.minedL2BlockId.number <= blockNumber) {
|
|
225
|
+
result.push(txHash);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
230
|
+
/** Finds protected tx hashes from slots earlier than the given slot number */ findExpiredProtectedTxs(slotNumber) {
|
|
231
|
+
const result = [];
|
|
232
|
+
for (const [txHash, protectedSlot] of this.#protectedTransactions){
|
|
233
|
+
if (protectedSlot < slotNumber) {
|
|
234
|
+
result.push(txHash);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return result;
|
|
238
|
+
}
|
|
239
|
+
/** Filters out transactions that are currently protected */ filterUnprotected(txs) {
|
|
240
|
+
return txs.filter((meta)=>!this.#protectedTransactions.has(meta.txHash));
|
|
241
|
+
}
|
|
242
|
+
/** Filters to transactions that have metadata and are not mined */ filterRestorable(txHashes) {
|
|
243
|
+
const result = [];
|
|
244
|
+
for (const txHash of txHashes){
|
|
245
|
+
const meta = this.#metadata.get(txHash);
|
|
246
|
+
if (meta && meta.minedL2BlockId === undefined) {
|
|
247
|
+
result.push(meta);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return result;
|
|
251
|
+
}
|
|
252
|
+
// ============================================================================
|
|
253
|
+
// METRICS
|
|
254
|
+
// ============================================================================
|
|
255
|
+
/** Counts transactions by state */ countTxs() {
|
|
256
|
+
let pending = 0;
|
|
257
|
+
let protected_ = 0;
|
|
258
|
+
let mined = 0;
|
|
259
|
+
for (const meta of this.#metadata.values()){
|
|
260
|
+
const state = this.getTxState(meta);
|
|
261
|
+
if (state === 'pending') {
|
|
262
|
+
pending++;
|
|
263
|
+
} else if (state === 'protected') {
|
|
264
|
+
protected_++;
|
|
265
|
+
} else if (state === 'mined') {
|
|
266
|
+
mined++;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return {
|
|
270
|
+
pending,
|
|
271
|
+
protected: protected_,
|
|
272
|
+
mined
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
/** Gets all mined transactions with their block IDs */ getMinedTxs() {
|
|
276
|
+
const result = [];
|
|
277
|
+
for (const [txHash, meta] of this.#metadata){
|
|
278
|
+
if (meta.minedL2BlockId !== undefined) {
|
|
279
|
+
result.push([
|
|
280
|
+
txHash,
|
|
281
|
+
meta.minedL2BlockId
|
|
282
|
+
]);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return result;
|
|
286
|
+
}
|
|
287
|
+
// ============================================================================
|
|
288
|
+
// PRIVATE HELPERS
|
|
289
|
+
// ============================================================================
|
|
290
|
+
#addToPendingIndices(meta) {
|
|
291
|
+
// Add to nullifier index
|
|
292
|
+
for (const nullifier of meta.nullifiers){
|
|
293
|
+
this.#nullifierToTxHash.set(nullifier, meta.txHash);
|
|
294
|
+
}
|
|
295
|
+
// Add to fee payer index
|
|
296
|
+
let feePayerSet = this.#feePayerToTxHashes.get(meta.feePayer);
|
|
297
|
+
if (!feePayerSet) {
|
|
298
|
+
feePayerSet = new Set();
|
|
299
|
+
this.#feePayerToTxHashes.set(meta.feePayer, feePayerSet);
|
|
300
|
+
}
|
|
301
|
+
feePayerSet.add(meta.txHash);
|
|
302
|
+
// Add to priority bucket
|
|
303
|
+
let prioritySet = this.#pendingByPriority.get(meta.priorityFee);
|
|
304
|
+
if (!prioritySet) {
|
|
305
|
+
prioritySet = new Set();
|
|
306
|
+
this.#pendingByPriority.set(meta.priorityFee, prioritySet);
|
|
307
|
+
}
|
|
308
|
+
prioritySet.add(meta.txHash);
|
|
309
|
+
}
|
|
310
|
+
#removeFromPendingIndices(meta) {
|
|
311
|
+
// Remove from nullifier index
|
|
312
|
+
for (const nullifier of meta.nullifiers){
|
|
313
|
+
this.#nullifierToTxHash.delete(nullifier);
|
|
314
|
+
}
|
|
315
|
+
// Remove from fee payer index
|
|
316
|
+
const feePayerSet = this.#feePayerToTxHashes.get(meta.feePayer);
|
|
317
|
+
if (feePayerSet) {
|
|
318
|
+
feePayerSet.delete(meta.txHash);
|
|
319
|
+
if (feePayerSet.size === 0) {
|
|
320
|
+
this.#feePayerToTxHashes.delete(meta.feePayer);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// Remove from priority map
|
|
324
|
+
const hashSet = this.#pendingByPriority.get(meta.priorityFee);
|
|
325
|
+
if (hashSet) {
|
|
326
|
+
hashSet.delete(meta.txHash);
|
|
327
|
+
if (hashSet.size === 0) {
|
|
328
|
+
this.#pendingByPriority.delete(meta.priorityFee);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|