@aztec/p2p 0.0.1-commit.96dac018d → 0.0.1-commit.993d240
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -3
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +9 -1
- package/dest/client/factory.d.ts +7 -7
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +34 -16
- package/dest/client/interface.d.ts +17 -8
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +15 -11
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +93 -49
- package/dest/config.d.ts +153 -102
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +134 -35
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/reqresp.error.d.ts +1 -20
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +0 -21
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +99 -59
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +267 -197
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +181 -65
- package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +6 -4
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +4 -2
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +33 -15
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +2 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
- 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 +2 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
- 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 +8 -6
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
- 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 +2 -2
- 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/interfaces.d.ts +12 -5
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +44 -12
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +81 -22
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
- 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 +26 -44
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +6 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +2 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +133 -110
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
- package/dest/msg_validators/clock_tolerance.d.ts +12 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +61 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +10 -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 +10 -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 +21 -8
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +90 -44
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
- package/dest/msg_validators/tx_validator/allowed_public_setup.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 +25 -21
- 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/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +36 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +27 -7
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +47 -17
- 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 +48 -7
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +88 -41
- package/dest/msg_validators/tx_validator/index.d.ts +4 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +3 -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/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/tx_proof_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.js +69 -0
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +5 -5
- package/dest/services/discv5/discV5_service.d.ts +2 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +35 -8
- package/dest/services/dummy_service.d.ts +11 -15
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +12 -16
- package/dest/services/encoding.d.ts +6 -2
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +14 -8
- package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +21 -4
- package/dest/services/libp2p/instrumentation.d.ts +3 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +14 -0
- package/dest/services/libp2p/libp2p_service.d.ts +39 -50
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +299 -250
- 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 +40 -11
- 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 +11 -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 +84 -71
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
- package/dest/services/reqresp/config.d.ts +3 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/interface.d.ts +16 -18
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +10 -20
- package/dest/services/reqresp/metrics.d.ts +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +0 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +4 -2
- package/dest/services/reqresp/protocols/index.d.ts +1 -2
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +0 -1
- package/dest/services/reqresp/protocols/tx.d.ts +1 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +1 -3
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
- package/dest/services/reqresp/reqresp.d.ts +7 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +43 -215
- package/dest/services/service.d.ts +9 -12
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +2 -23
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +2 -55
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
- package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +39 -29
- package/dest/services/tx_collection/index.d.ts +2 -3
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +0 -1
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +0 -2
- package/dest/services/tx_collection/request_tracker.d.ts +53 -0
- package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/request_tracker.js +84 -0
- package/dest/services/tx_collection/tx_collection.d.ts +36 -55
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +275 -119
- package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +2 -2
- package/dest/services/tx_collection/tx_source.d.ts +6 -5
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +9 -7
- package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +4 -14
- package/dest/services/tx_provider.d.ts +3 -1
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +3 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +5 -3
- package/dest/test-helpers/mock-pubsub.d.ts +24 -11
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +45 -45
- package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +17 -19
- package/dest/test-helpers/test_tx_provider.d.ts +3 -1
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
- package/dest/test-helpers/test_tx_provider.js +3 -0
- package/dest/test-helpers/testbench-utils.d.ts +12 -14
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +42 -15
- package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +88 -42
- package/dest/testbench/worker_client_manager.d.ts +12 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +57 -11
- package/dest/util.d.ts +12 -7
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +35 -14
- package/dest/versioning.d.ts +3 -6
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +3 -24
- package/package.json +15 -14
- package/src/bootstrap/bootstrap.ts +9 -1
- package/src/client/factory.ts +65 -21
- package/src/client/interface.ts +18 -20
- package/src/client/p2p_client.ts +108 -82
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +226 -36
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +0 -25
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +318 -242
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +204 -68
- package/src/mem_pools/attestation_pool/mocks.ts +13 -8
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +22 -14
- package/src/mem_pools/tx_pool_v2/README.md +9 -1
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/index.ts +1 -1
- package/src/mem_pools/tx_pool_v2/interfaces.ts +12 -4
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +121 -27
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +16 -1
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +141 -114
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -7
- package/src/msg_validators/clock_tolerance.ts +79 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +24 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +35 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +114 -47
- package/src/msg_validators/tx_validator/README.md +15 -3
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
- package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +44 -1
- package/src/msg_validators/tx_validator/factory.ts +61 -10
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +121 -39
- package/src/msg_validators/tx_validator/index.ts +3 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +102 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +38 -5
- package/src/services/dummy_service.ts +14 -39
- package/src/services/encoding.ts +14 -7
- package/src/services/gossipsub/topic_score_params.ts +36 -4
- package/src/services/libp2p/instrumentation.ts +14 -0
- package/src/services/libp2p/libp2p_service.ts +326 -287
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +46 -11
- package/src/services/peer-manager/peer_scoring.ts +27 -5
- package/src/services/reqresp/README.md +215 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +83 -77
- package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/config.ts +2 -2
- package/src/services/reqresp/interface.ts +21 -47
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +4 -2
- 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 +48 -261
- package/src/services/service.ts +12 -28
- package/src/services/tx_collection/config.ts +3 -80
- package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/index.ts +1 -6
- package/src/services/tx_collection/instrumentation.ts +1 -7
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +331 -176
- package/src/services/tx_collection/tx_collection_sink.ts +2 -2
- package/src/services/tx_collection/tx_source.ts +8 -7
- package/src/services/tx_file_store/tx_file_store.ts +5 -17
- package/src/services/tx_provider.ts +5 -0
- package/src/test-helpers/make-test-p2p-clients.ts +4 -3
- package/src/test-helpers/mock-pubsub.ts +49 -66
- package/src/test-helpers/reqresp-nodes.ts +15 -28
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +53 -28
- package/src/testbench/p2p_client_testbench_worker.ts +91 -61
- package/src/testbench/worker_client_manager.ts +72 -25
- package/src/util.ts +33 -18
- package/src/versioning.ts +3 -33
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -305
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -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/connection-sampler/batch_connection_sampler.d.ts +0 -64
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
- package/dest/services/reqresp/protocols/block.d.ts +0 -9
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.js +0 -32
- package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -327
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
- package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -211
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -346
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -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/connection-sampler/batch_connection_sampler.ts +0 -161
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/fast_tx_collection.ts +0 -387
- package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
- package/src/services/tx_collection/slow_tx_collection.ts +0 -266
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type AttestationPool } from './attestation_pool.js';
|
|
2
2
|
export declare function describeAttestationPool(getAttestationPool: () => AttestationPool): void;
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fcG9vbF90ZXN0X3N1aXRlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWVtX3Bvb2xzL2F0dGVzdGF0aW9uX3Bvb2wvYXR0ZXN0YXRpb25fcG9vbF90ZXN0X3N1aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVlBLE9BQU8sRUFDTCxLQUFLLGVBQWUsRUFHckIsTUFBTSx1QkFBdUIsQ0FBQztBQUsvQix3QkFBZ0IsdUJBQXVCLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLFFBbTBCaEYifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attestation_pool_test_suite.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool_test_suite.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,uBAAuB,CAAC;AAK/B,wBAAgB,uBAAuB,CAAC,kBAAkB,EAAE,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"attestation_pool_test_suite.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool_test_suite.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,uBAAuB,CAAC;AAK/B,wBAAgB,uBAAuB,CAAC,kBAAkB,EAAE,MAAM,eAAe,QAm0BhF"}
|
|
@@ -15,9 +15,17 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
15
15
|
length: NUMBER_OF_SIGNERS_PER_TEST
|
|
16
16
|
}, ()=>Secp256k1Signer.random());
|
|
17
17
|
});
|
|
18
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Build attestations from each signer over the *same* signed payload (same header,
|
|
20
|
+
* archive, feeAssetPriceModifier). Required by the new pool, which deduplicates by
|
|
21
|
+
* payload hash and treats attestations from different signers as distinct entries
|
|
22
|
+
* only when the payload itself matches.
|
|
23
|
+
*/ const createCheckpointAttestationsForSlot = (slotNumber, archive)=>{
|
|
19
24
|
const archiveToUse = archive ?? Fr.random();
|
|
20
|
-
|
|
25
|
+
const sharedHeader = CheckpointHeader.random({
|
|
26
|
+
slotNumber: SlotNumber(slotNumber)
|
|
27
|
+
});
|
|
28
|
+
return signers.map((signer)=>mockCheckpointAttestation(signer, slotNumber, archiveToUse, sharedHeader));
|
|
21
29
|
};
|
|
22
30
|
const mockBlockProposalForPool = (signer, slotNumber, archive = Fr.random())=>{
|
|
23
31
|
const header = makeBlockHeader(1, {
|
|
@@ -41,20 +49,24 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
41
49
|
it('should add attestations to pool', async ()=>{
|
|
42
50
|
const slotNumber = 420;
|
|
43
51
|
const archive = Fr.random();
|
|
44
|
-
const
|
|
52
|
+
const sharedHeader = CheckpointHeader.random({
|
|
53
|
+
slotNumber: SlotNumber(slotNumber)
|
|
54
|
+
});
|
|
55
|
+
const attestations = signers.slice(0, -1).map((signer)=>mockCheckpointAttestation(signer, slotNumber, archive, sharedHeader));
|
|
56
|
+
const payloadHash = attestations[0].getPayloadHash();
|
|
45
57
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
46
|
-
const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber),
|
|
58
|
+
const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
|
|
47
59
|
expect(retrievedAttestations.length).toBe(attestations.length);
|
|
48
60
|
compareCheckpointAttestations(retrievedAttestations, attestations);
|
|
49
61
|
const retrievedAttestationsForSlot = await ap.getCheckpointAttestationsForSlot(SlotNumber(slotNumber));
|
|
50
62
|
expect(retrievedAttestationsForSlot.length).toBe(attestations.length);
|
|
51
63
|
compareCheckpointAttestations(retrievedAttestationsForSlot, attestations);
|
|
52
64
|
// Add another one
|
|
53
|
-
const newAttestation = mockCheckpointAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive);
|
|
65
|
+
const newAttestation = mockCheckpointAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive, sharedHeader);
|
|
54
66
|
await ap.addOwnCheckpointAttestations([
|
|
55
67
|
newAttestation
|
|
56
68
|
]);
|
|
57
|
-
const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber),
|
|
69
|
+
const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
|
|
58
70
|
expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
|
|
59
71
|
compareCheckpointAttestations(retrievedAttestationsAfterAdd, [
|
|
60
72
|
...attestations,
|
|
@@ -68,7 +80,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
68
80
|
]);
|
|
69
81
|
// Delete by slot
|
|
70
82
|
await ap.deleteOlderThan(SlotNumber(slotNumber + 1));
|
|
71
|
-
const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber),
|
|
83
|
+
const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
|
|
72
84
|
expect(retreivedAttestationsAfterDelete.length).toBe(0);
|
|
73
85
|
});
|
|
74
86
|
it('should handle duplicate proposals in a slot', async ()=>{
|
|
@@ -83,9 +95,10 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
83
95
|
for(let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++){
|
|
84
96
|
attestations.push(mockCheckpointAttestation(signer, slotNumber, archive, header));
|
|
85
97
|
}
|
|
98
|
+
const payloadHash = attestations[0].getPayloadHash();
|
|
86
99
|
// Add them to store and check we end up with only one
|
|
87
100
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
88
|
-
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber),
|
|
101
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
|
|
89
102
|
expect(retreivedAttestations.length).toBe(1);
|
|
90
103
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
|
|
91
104
|
expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
|
|
@@ -93,7 +106,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
93
106
|
await ap.addOwnCheckpointAttestations([
|
|
94
107
|
attestations[0]
|
|
95
108
|
]);
|
|
96
|
-
expect(await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber),
|
|
109
|
+
expect(await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash)).toHaveLength(1);
|
|
97
110
|
});
|
|
98
111
|
it('should store attestations by differing slot', async ()=>{
|
|
99
112
|
const slotNumbers = [
|
|
@@ -106,8 +119,8 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
106
119
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
107
120
|
for (const attestation of attestations){
|
|
108
121
|
const slot = attestation.payload.header.slotNumber;
|
|
109
|
-
const
|
|
110
|
-
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
122
|
+
const payloadHash = attestation.getPayloadHash();
|
|
123
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, payloadHash);
|
|
111
124
|
expect(retreivedAttestations.length).toBe(1);
|
|
112
125
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
113
126
|
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
@@ -130,8 +143,8 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
130
143
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
131
144
|
for (const attestation of attestations){
|
|
132
145
|
const slot = attestation.payload.header.slotNumber;
|
|
133
|
-
const
|
|
134
|
-
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
146
|
+
const payloadHash = attestation.getPayloadHash();
|
|
147
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, payloadHash);
|
|
135
148
|
expect(retreivedAttestations.length).toBe(1);
|
|
136
149
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
137
150
|
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
@@ -148,13 +161,14 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
148
161
|
88,
|
|
149
162
|
420
|
|
150
163
|
];
|
|
151
|
-
const
|
|
152
|
-
const
|
|
164
|
+
const attestationsPerSlot = await Promise.all(slotNumbers.map((slotNumber)=>createCheckpointAttestationsForSlot(slotNumber)));
|
|
165
|
+
const attestations = attestationsPerSlot.flat();
|
|
166
|
+
const payloadHashForSlot1 = attestationsPerSlot[0][0].getPayloadHash();
|
|
153
167
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
154
|
-
const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1),
|
|
168
|
+
const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), payloadHashForSlot1);
|
|
155
169
|
expect(attestationsForSlot1.length).toBe(signers.length);
|
|
156
170
|
await ap.deleteOlderThan(SlotNumber(73));
|
|
157
|
-
const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1),
|
|
171
|
+
const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), payloadHashForSlot1);
|
|
158
172
|
expect(attestationsForSlot1AfterDelete.length).toBe(0);
|
|
159
173
|
});
|
|
160
174
|
});
|
|
@@ -163,49 +177,81 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
163
177
|
const slotNumber = 420;
|
|
164
178
|
const archive = Fr.random();
|
|
165
179
|
const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
|
|
166
|
-
const proposalId = proposal.archive.toString();
|
|
167
180
|
const result = await ap.tryAddBlockProposal(proposal);
|
|
168
181
|
expect(result.added).toBe(true);
|
|
169
182
|
expect(result.alreadyExists).toBe(false);
|
|
170
183
|
expect(result.count).toBe(1);
|
|
171
|
-
const retrievedProposal = await ap.
|
|
184
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
172
185
|
expect(retrievedProposal).toBeDefined();
|
|
173
186
|
expect(retrievedProposal).toEqual(proposal);
|
|
174
187
|
});
|
|
175
188
|
it('should return undefined for non-existent block proposal', async ()=>{
|
|
176
189
|
const nonExistentId = Fr.random().toString();
|
|
177
|
-
const retrievedProposal = await ap.
|
|
190
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(nonExistentId);
|
|
178
191
|
expect(retrievedProposal).toBeUndefined();
|
|
179
192
|
});
|
|
180
|
-
it('should return alreadyExists when adding
|
|
193
|
+
it('should return alreadyExists when re-adding the same signed payload', async ()=>{
|
|
181
194
|
const slotNumber = 420;
|
|
182
195
|
const archive = Fr.random();
|
|
183
|
-
const
|
|
184
|
-
const
|
|
185
|
-
const result1 = await ap.tryAddBlockProposal(proposal1);
|
|
196
|
+
const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
|
|
197
|
+
const result1 = await ap.tryAddBlockProposal(proposal);
|
|
186
198
|
expect(result1.added).toBe(true);
|
|
187
199
|
expect(result1.alreadyExists).toBe(false);
|
|
188
|
-
//
|
|
189
|
-
const
|
|
190
|
-
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
200
|
+
// Re-broadcasting the exact same proposal yields alreadyExists.
|
|
201
|
+
const result2 = await ap.tryAddBlockProposal(proposal);
|
|
191
202
|
expect(result2.added).toBe(false);
|
|
192
203
|
expect(result2.alreadyExists).toBe(true);
|
|
193
|
-
|
|
194
|
-
const retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
204
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
195
205
|
expect(retrievedProposal).toBeDefined();
|
|
196
|
-
expect(retrievedProposal.toBuffer()).toEqual(
|
|
206
|
+
expect(retrievedProposal.toBuffer()).toEqual(proposal.toBuffer());
|
|
197
207
|
expect(retrievedProposal.getSender()?.toString()).toBe(signers[0].address.toString());
|
|
198
208
|
});
|
|
209
|
+
it('should retain an exact duplicate block proposal only once', async ()=>{
|
|
210
|
+
const slotNumber = 420;
|
|
211
|
+
const proposal = await mockBlockProposalForPool(signers[0], slotNumber);
|
|
212
|
+
await ap.tryAddBlockProposal(proposal);
|
|
213
|
+
await ap.tryAddBlockProposal(proposal);
|
|
214
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
215
|
+
expect(proposals.blockProposals.map((proposal)=>proposal.toBuffer())).toEqual([
|
|
216
|
+
proposal.withoutSignedTxs().toBuffer()
|
|
217
|
+
]);
|
|
218
|
+
});
|
|
219
|
+
it('should retain all accepted block proposals at a position', async ()=>{
|
|
220
|
+
const slotNumber = 420;
|
|
221
|
+
const blockHeader = makeBlockHeader(1, {
|
|
222
|
+
slotNumber: SlotNumber(slotNumber)
|
|
223
|
+
});
|
|
224
|
+
const proposal1 = await makeBlockProposal({
|
|
225
|
+
signer: signers[0],
|
|
226
|
+
blockHeader,
|
|
227
|
+
archiveRoot: Fr.random(),
|
|
228
|
+
indexWithinCheckpoint: IndexWithinCheckpoint(1)
|
|
229
|
+
});
|
|
230
|
+
const proposal2 = await makeBlockProposal({
|
|
231
|
+
signer: signers[0],
|
|
232
|
+
blockHeader,
|
|
233
|
+
archiveRoot: Fr.random(),
|
|
234
|
+
indexWithinCheckpoint: IndexWithinCheckpoint(1)
|
|
235
|
+
});
|
|
236
|
+
await ap.tryAddBlockProposal(proposal1);
|
|
237
|
+
await ap.tryAddBlockProposal(proposal2);
|
|
238
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
239
|
+
expect(proposals.blockProposals.map((proposal)=>proposal.toBuffer())).toEqual(expect.arrayContaining([
|
|
240
|
+
proposal1.withoutSignedTxs().toBuffer(),
|
|
241
|
+
proposal2.withoutSignedTxs().toBuffer()
|
|
242
|
+
]));
|
|
243
|
+
expect(await ap.getBlockProposalByArchive(proposal2.archive.toString())).toBeDefined();
|
|
244
|
+
});
|
|
199
245
|
});
|
|
200
246
|
describe('CheckpointProposal in attestation pool', ()=>{
|
|
201
|
-
const mockCheckpointProposalForPool = async (signer, slotNumber, archive = Fr.random())=>{
|
|
202
|
-
const
|
|
247
|
+
const mockCheckpointProposalForPool = async (signer, slotNumber, archive = Fr.random(), checkpointHeader)=>{
|
|
248
|
+
const headerToUse = checkpointHeader ?? makeCheckpointHeader(1, {
|
|
203
249
|
slotNumber: SlotNumber(slotNumber)
|
|
204
250
|
});
|
|
205
251
|
const blockHeader = makeBlockHeader(1);
|
|
206
252
|
const proposal = await makeCheckpointProposal({
|
|
207
253
|
signer,
|
|
208
|
-
checkpointHeader,
|
|
254
|
+
checkpointHeader: headerToUse,
|
|
209
255
|
archiveRoot: archive,
|
|
210
256
|
lastBlock: {
|
|
211
257
|
blockHeader
|
|
@@ -218,12 +264,11 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
218
264
|
const slotNumber = 420;
|
|
219
265
|
const archive = Fr.random();
|
|
220
266
|
const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
|
|
221
|
-
const proposalId = proposal.archive.toString();
|
|
222
267
|
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
223
268
|
expect(result.added).toBe(true);
|
|
224
269
|
expect(result.alreadyExists).toBe(false);
|
|
225
270
|
expect(result.count).toBe(1);
|
|
226
|
-
const retrievedProposal = await ap.getCheckpointProposal(
|
|
271
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
227
272
|
expect(retrievedProposal).toBeDefined();
|
|
228
273
|
expect(retrievedProposal.toBuffer()).toEqual(proposal.toBuffer());
|
|
229
274
|
});
|
|
@@ -239,50 +284,121 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
239
284
|
checkpointHeader,
|
|
240
285
|
archiveRoot: archive
|
|
241
286
|
});
|
|
242
|
-
const proposalId = proposal.archive.toString();
|
|
243
287
|
// Add the checkpoint core - block extraction is now caller responsibility
|
|
244
288
|
await ap.tryAddCheckpointProposal(proposal.toCore());
|
|
245
289
|
// The checkpoint proposal should be stored
|
|
246
|
-
const retrievedCheckpointProposal = await ap.getCheckpointProposal(
|
|
290
|
+
const retrievedCheckpointProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
247
291
|
expect(retrievedCheckpointProposal).toBeDefined();
|
|
248
292
|
// No block proposal was extracted (it had none anyway)
|
|
249
|
-
const retrievedBlockProposal = await ap.
|
|
293
|
+
const retrievedBlockProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
250
294
|
expect(retrievedBlockProposal).toBeUndefined();
|
|
251
295
|
});
|
|
252
296
|
it('should return undefined for non-existent checkpoint proposal', async ()=>{
|
|
253
|
-
const
|
|
254
|
-
const retrievedProposal = await ap.getCheckpointProposal(nonExistentId);
|
|
297
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(99999));
|
|
255
298
|
expect(retrievedProposal).toBeUndefined();
|
|
256
299
|
});
|
|
257
|
-
it('should return alreadyExists when adding
|
|
300
|
+
it('should return alreadyExists when re-adding the same signed payload', async ()=>{
|
|
258
301
|
const slotNumber = 420;
|
|
259
302
|
const archive = Fr.random();
|
|
260
|
-
const
|
|
261
|
-
const
|
|
262
|
-
const result1 = await ap.tryAddCheckpointProposal(proposal1);
|
|
303
|
+
const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
|
|
304
|
+
const result1 = await ap.tryAddCheckpointProposal(proposal);
|
|
263
305
|
expect(result1.added).toBe(true);
|
|
264
306
|
expect(result1.alreadyExists).toBe(false);
|
|
265
|
-
//
|
|
266
|
-
const
|
|
267
|
-
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
307
|
+
// Re-broadcasting the exact same signed payload yields alreadyExists.
|
|
308
|
+
const result2 = await ap.tryAddCheckpointProposal(proposal);
|
|
268
309
|
expect(result2.added).toBe(false);
|
|
269
310
|
expect(result2.alreadyExists).toBe(true);
|
|
270
|
-
// Should still have the first proposal
|
|
271
|
-
const retrievedProposal = await ap.getCheckpointProposal(
|
|
311
|
+
// Should still have the first proposal stored at the slot
|
|
312
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
272
313
|
expect(retrievedProposal).toBeDefined();
|
|
273
|
-
expect(retrievedProposal.toBuffer()).toEqual(
|
|
314
|
+
expect(retrievedProposal.toBuffer()).toEqual(proposal.toBuffer());
|
|
274
315
|
expect(retrievedProposal.getSender()?.toString()).toBe(signers[0].address.toString());
|
|
275
316
|
});
|
|
317
|
+
it('should treat distinct payloads at the same slot as equivocations (count = 2)', async ()=>{
|
|
318
|
+
const slotNumber = 420;
|
|
319
|
+
// Two proposals at the same slot but with different headers (distinct payloads).
|
|
320
|
+
const proposal1 = await mockCheckpointProposalForPool(signers[0], slotNumber, Fr.random());
|
|
321
|
+
const proposal2 = await mockCheckpointProposalForPool(signers[0], slotNumber, Fr.random());
|
|
322
|
+
const result1 = await ap.tryAddCheckpointProposal(proposal1);
|
|
323
|
+
expect(result1.added).toBe(true);
|
|
324
|
+
expect(result1.count).toBe(1);
|
|
325
|
+
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
326
|
+
// The second distinct payload is tracked as an equivocation, count goes to 2,
|
|
327
|
+
// and both accepted payloads are retained by payload hash.
|
|
328
|
+
expect(result2.added).toBe(true);
|
|
329
|
+
expect(result2.alreadyExists).toBe(false);
|
|
330
|
+
expect(result2.count).toBe(2);
|
|
331
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
332
|
+
const expectedProposal = [
|
|
333
|
+
proposal1,
|
|
334
|
+
proposal2
|
|
335
|
+
].sort((a, b)=>a.getPayloadHash().localeCompare(b.getPayloadHash()))[0];
|
|
336
|
+
expect(retrievedProposal.toBuffer()).toEqual(expectedProposal.toBuffer());
|
|
337
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
338
|
+
expect(proposals.checkpointProposals.map((proposal)=>proposal.toBuffer())).toEqual(expect.arrayContaining([
|
|
339
|
+
proposal1.toBuffer(),
|
|
340
|
+
proposal2.toBuffer()
|
|
341
|
+
]));
|
|
342
|
+
});
|
|
343
|
+
it('should detect equivocation when only feeAssetPriceModifier differs', async ()=>{
|
|
344
|
+
const slotNumber = 420;
|
|
345
|
+
const archive = Fr.random();
|
|
346
|
+
// Same checkpoint header + archive, but two different feeAssetPriceModifier values.
|
|
347
|
+
// This is the audit-finding scenario: archive collides but the signed payload differs.
|
|
348
|
+
const sharedHeader = makeCheckpointHeader(1, {
|
|
349
|
+
slotNumber: SlotNumber(slotNumber)
|
|
350
|
+
});
|
|
351
|
+
const proposalA = await makeCheckpointProposal({
|
|
352
|
+
signer: signers[0],
|
|
353
|
+
checkpointHeader: sharedHeader,
|
|
354
|
+
archiveRoot: archive,
|
|
355
|
+
feeAssetPriceModifier: 50n
|
|
356
|
+
});
|
|
357
|
+
const proposalB = await makeCheckpointProposal({
|
|
358
|
+
signer: signers[0],
|
|
359
|
+
checkpointHeader: sharedHeader,
|
|
360
|
+
archiveRoot: archive,
|
|
361
|
+
feeAssetPriceModifier: -50n
|
|
362
|
+
});
|
|
363
|
+
const result1 = await ap.tryAddCheckpointProposal(proposalA.toCore());
|
|
364
|
+
expect(result1.count).toBe(1);
|
|
365
|
+
const result2 = await ap.tryAddCheckpointProposal(proposalB.toCore());
|
|
366
|
+
// The fix: archive collision no longer hides the equivocation; payload-hash dedup
|
|
367
|
+
// sees the distinct feeMod and bumps `count` to 2 so libp2p can fire the slash callback.
|
|
368
|
+
expect(result2.added).toBe(true);
|
|
369
|
+
expect(result2.alreadyExists).toBe(false);
|
|
370
|
+
expect(result2.count).toBe(2);
|
|
371
|
+
});
|
|
372
|
+
it('should delete retained proposals older than a given slot', async ()=>{
|
|
373
|
+
const oldSlot = 100;
|
|
374
|
+
const newSlot = 200;
|
|
375
|
+
const oldBlock = await mockBlockProposalForPool(signers[0], oldSlot);
|
|
376
|
+
const newBlock = await mockBlockProposalForPool(signers[1], newSlot);
|
|
377
|
+
const oldCheckpoint = await mockCheckpointProposalForPool(signers[0], oldSlot);
|
|
378
|
+
const newCheckpoint = await mockCheckpointProposalForPool(signers[1], newSlot);
|
|
379
|
+
await ap.tryAddBlockProposal(oldBlock);
|
|
380
|
+
await ap.tryAddBlockProposal(newBlock);
|
|
381
|
+
await ap.tryAddCheckpointProposal(oldCheckpoint);
|
|
382
|
+
await ap.tryAddCheckpointProposal(newCheckpoint);
|
|
383
|
+
await ap.deleteOlderThan(SlotNumber(newSlot));
|
|
384
|
+
expect(await ap.getProposalsForSlot(SlotNumber(oldSlot))).toEqual({
|
|
385
|
+
blockProposals: [],
|
|
386
|
+
checkpointProposals: []
|
|
387
|
+
});
|
|
388
|
+
const newProposals = await ap.getProposalsForSlot(SlotNumber(newSlot));
|
|
389
|
+
expect(newProposals.blockProposals.map((proposal)=>proposal.toBuffer())).toContainEqual(newBlock.withoutSignedTxs().toBuffer());
|
|
390
|
+
expect(newProposals.checkpointProposals.map((proposal)=>proposal.toBuffer())).toContainEqual(newCheckpoint.toBuffer());
|
|
391
|
+
});
|
|
276
392
|
it('should return added=false when exceeding capacity', async ()=>{
|
|
277
393
|
const slotNumber = 420;
|
|
278
|
-
// Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT proposals
|
|
394
|
+
// Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT distinct proposals.
|
|
279
395
|
for(let i = 0; i < MAX_CHECKPOINT_PROPOSALS_PER_SLOT; i++){
|
|
280
396
|
const proposal = await mockCheckpointProposalForPool(signers[i % NUMBER_OF_SIGNERS_PER_TEST], slotNumber);
|
|
281
397
|
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
282
398
|
expect(result.added).toBe(true);
|
|
283
399
|
expect(result.count).toBe(i + 1);
|
|
284
400
|
}
|
|
285
|
-
// The next proposal should not be added
|
|
401
|
+
// The next proposal should not be added.
|
|
286
402
|
const extraProposal = await mockCheckpointProposalForPool(signers[0], slotNumber);
|
|
287
403
|
const result = await ap.tryAddCheckpointProposal(extraProposal);
|
|
288
404
|
expect(result.added).toBe(false);
|
|
@@ -367,11 +483,11 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
367
483
|
const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
|
|
368
484
|
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
369
485
|
expect(result2.count).toBe(2);
|
|
370
|
-
//
|
|
486
|
+
// Third proposal for same position should be rejected (cap is 2)
|
|
371
487
|
const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
|
|
372
488
|
const result3 = await ap.tryAddBlockProposal(proposal3);
|
|
373
|
-
expect(result3.added).toBe(
|
|
374
|
-
expect(result3.count).toBe(
|
|
489
|
+
expect(result3.added).toBe(false);
|
|
490
|
+
expect(result3.count).toBe(2);
|
|
375
491
|
});
|
|
376
492
|
it('should return added=false when exceeding capacity', async ()=>{
|
|
377
493
|
const slotNumber = 100;
|
|
@@ -462,25 +578,25 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
462
578
|
await ap.tryAddBlockProposal(oldProposal);
|
|
463
579
|
await ap.tryAddBlockProposal(newProposal);
|
|
464
580
|
// Verify both proposals exist
|
|
465
|
-
expect(await ap.
|
|
466
|
-
expect(await ap.
|
|
581
|
+
expect(await ap.getBlockProposalByArchive(oldProposal.archive.toString())).toBeDefined();
|
|
582
|
+
expect(await ap.getBlockProposalByArchive(newProposal.archive.toString())).toBeDefined();
|
|
467
583
|
// Delete slots older than newSlot (should delete oldSlot)
|
|
468
584
|
await ap.deleteOlderThan(SlotNumber(newSlot));
|
|
469
585
|
// Old proposal should be deleted from storage
|
|
470
|
-
expect(await ap.
|
|
586
|
+
expect(await ap.getBlockProposalByArchive(oldProposal.archive.toString())).toBeUndefined();
|
|
471
587
|
// New proposal should still exist
|
|
472
|
-
expect(await ap.
|
|
588
|
+
expect(await ap.getBlockProposalByArchive(newProposal.archive.toString())).toBeDefined();
|
|
473
589
|
});
|
|
474
590
|
});
|
|
475
591
|
describe('tryAddCheckpointProposal duplicate detection', ()=>{
|
|
476
|
-
const mockCheckpointProposalCoreForPool = async (signer, slotNumber, archive = Fr.random())=>{
|
|
477
|
-
const
|
|
592
|
+
const mockCheckpointProposalCoreForPool = async (signer, slotNumber, archive = Fr.random(), checkpointHeader)=>{
|
|
593
|
+
const headerToUse = checkpointHeader ?? makeCheckpointHeader(1, {
|
|
478
594
|
slotNumber: SlotNumber(slotNumber)
|
|
479
595
|
});
|
|
480
596
|
const blockHeader = makeBlockHeader(1);
|
|
481
597
|
const proposal = await makeCheckpointProposal({
|
|
482
598
|
signer,
|
|
483
|
-
checkpointHeader,
|
|
599
|
+
checkpointHeader: headerToUse,
|
|
484
600
|
archiveRoot: archive,
|
|
485
601
|
lastBlock: {
|
|
486
602
|
blockHeader
|
|
@@ -537,11 +653,11 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
537
653
|
const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], slotNumber);
|
|
538
654
|
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
539
655
|
expect(result2.count).toBe(2);
|
|
540
|
-
//
|
|
656
|
+
// Third proposal for same slot should be rejected (cap is 2)
|
|
541
657
|
const proposal3 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber);
|
|
542
658
|
const result3 = await ap.tryAddCheckpointProposal(proposal3);
|
|
543
|
-
expect(result3.added).toBe(
|
|
544
|
-
expect(result3.count).toBe(
|
|
659
|
+
expect(result3.added).toBe(false);
|
|
660
|
+
expect(result3.count).toBe(2);
|
|
545
661
|
});
|
|
546
662
|
it('should not count attestations as proposals for duplicate detection', async ()=>{
|
|
547
663
|
const slotNumber = 100;
|
|
@@ -239,4 +239,4 @@ export declare const generateAccount: () => {
|
|
|
239
239
|
* @returns A Checkpoint Attestation
|
|
240
240
|
*/
|
|
241
241
|
export declare const mockCheckpointAttestation: (signer: Secp256k1Signer, slot?: number, archive?: Fr, header?: CheckpointHeader | undefined, feeAssetPriceModifier?: bigint) => CheckpointAttestation;
|
|
242
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
242
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja3MuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvYXR0ZXN0YXRpb25fcG9vbC9tb2Nrcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUNMLHFCQUFxQixFQUl0QixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBS3hEOzs7O0dBSUc7QUFDSCxlQUFPLE1BQU0sZUFBZTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBRzNCLENBQUM7QUFFRjs7Ozs7OztHQU9HO0FBQ0gsZUFBTyxNQUFNLHlCQUF5Qix3SkF3QnJDLENBQUMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mocks.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/mocks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EACL,qBAAqB,EAItB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"mocks.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/mocks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EACL,qBAAqB,EAItB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAKxD;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAG3B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,wJAwBrC,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
-
import { CheckpointAttestation,
|
|
3
|
+
import { CheckpointAttestation, CheckpointProposal, ConsensusPayload, getHashedSignaturePayloadTypedData } from '@aztec/stdlib/p2p';
|
|
4
4
|
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
5
|
+
import { TEST_COORDINATION_SIGNATURE_CONTEXT } from '@aztec/stdlib/testing';
|
|
5
6
|
import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
|
|
6
7
|
/** Generate Account
|
|
7
8
|
*
|
|
@@ -22,10 +23,11 @@ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
|
|
|
22
23
|
header = header ?? CheckpointHeader.random({
|
|
23
24
|
slotNumber: SlotNumber(slot)
|
|
24
25
|
});
|
|
25
|
-
const payload = new ConsensusPayload(header, archive, feeAssetPriceModifier);
|
|
26
|
-
const attestationHash =
|
|
26
|
+
const payload = new ConsensusPayload(header, archive, feeAssetPriceModifier, TEST_COORDINATION_SIGNATURE_CONTEXT);
|
|
27
|
+
const attestationHash = getHashedSignaturePayloadTypedData(payload);
|
|
27
28
|
const attestationSignature = signer.sign(attestationHash);
|
|
28
|
-
const
|
|
29
|
+
const proposal = new CheckpointProposal(header, archive, feeAssetPriceModifier, attestationSignature, TEST_COORDINATION_SIGNATURE_CONTEXT);
|
|
30
|
+
const proposalHash = getHashedSignaturePayloadTypedData(proposal);
|
|
29
31
|
const proposerSignature = signer.sign(proposalHash);
|
|
30
32
|
return new CheckpointAttestation(payload, attestationSignature, proposerSignature);
|
|
31
33
|
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
export { AttestationPool, type AttestationPoolApi } from './attestation_pool/attestation_pool.js';
|
|
2
2
|
export { type MemPools } from './interface.js';
|
|
3
|
-
export { type TxPool } from './tx_pool/tx_pool.js';
|
|
4
3
|
export { type TxPoolV2, type TxPoolV2Config, type TxPoolV2Events, type AddTxsResult } from './tx_pool_v2/index.js';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tZW1fcG9vbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDbEcsT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFFLEtBQUssY0FBYyxFQUFFLEtBQUssY0FBYyxFQUFFLEtBQUssWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mem_pools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAClG,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mem_pools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAClG,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -23,12 +23,14 @@ export declare class PoolInstrumentation<PoolObject extends Gossipable> {
|
|
|
23
23
|
private dbMetrics;
|
|
24
24
|
private defaultAttributes;
|
|
25
25
|
private meter;
|
|
26
|
-
private
|
|
26
|
+
private mempoolItemAddedTimestamp;
|
|
27
27
|
constructor(telemetry: TelemetryClient, name: PoolName, poolStats: PoolStatsCallback, dbStats?: LmdbStatsCallback);
|
|
28
28
|
recordSize(poolObject: PoolObject): void;
|
|
29
29
|
incrementAddedObjects(count: number): void;
|
|
30
30
|
transactionsAdded(transactions: Tx[]): void;
|
|
31
31
|
transactionsRemoved(hashes: Iterable<bigint> | Iterable<string>): void;
|
|
32
|
+
trackMempoolItemAdded(key: bigint | string): void;
|
|
33
|
+
trackMempoolItemRemoved(key: bigint | string): void;
|
|
32
34
|
private observeStats;
|
|
33
35
|
}
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWVtX3Bvb2xzL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzQyxPQUFPLEVBS0wsS0FBSyxpQkFBaUIsRUFLdEIsS0FBSyxlQUFlLEVBR3JCLE1BQU0seUJBQXlCLENBQUM7QUFFakMsb0JBQVksUUFBUTtJQUNsQixPQUFPLFdBQVc7SUFDbEIsZ0JBQWdCLG9CQUFvQjtDQUNyQztBQWtDRCxNQUFNLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxPQUFPLENBQUM7SUFDNUMsU0FBUyxFQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0NBQzVDLENBQUMsQ0FBQztBQUVIOztHQUVHO0FBQ0gscUJBQWEsbUJBQW1CLENBQUMsVUFBVSxTQUFTLFVBQVU7SUFtQjFELE9BQU8sQ0FBQyxTQUFTO0lBbEJuQix1Q0FBdUM7SUFDdkMsT0FBTyxDQUFDLGdCQUFnQixDQUFrQjtJQUMxQyxPQUFPLENBQUMsZ0JBQWdCLENBQWdCO0lBQ3hDLHFCQUFxQjtJQUNyQixPQUFPLENBQUMsVUFBVSxDQUFZO0lBQzlCLHdEQUF3RDtJQUN4RCxPQUFPLENBQUMsVUFBVSxDQUFZO0lBRTlCLE9BQU8sQ0FBQyxTQUFTLENBQWM7SUFFL0IsT0FBTyxDQUFDLGlCQUFpQixDQUFDO0lBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQVE7SUFFckIsT0FBTyxDQUFDLHlCQUF5QixDQUFvRTtJQUVyRyxZQUNFLFNBQVMsRUFBRSxlQUFlLEVBQzFCLElBQUksRUFBRSxRQUFRLEVBQ04sU0FBUyxFQUFFLGlCQUFpQixFQUNwQyxPQUFPLENBQUMsRUFBRSxpQkFBaUIsRUE0QjVCO0lBRU0sVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLFFBRXZDO0lBRU0scUJBQXFCLENBQUMsS0FBSyxFQUFFLE1BQU0sUUFFekM7SUFFTSxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLFFBRTFDO0lBRU0sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBSXJFO0lBRU0scUJBQXFCLENBQUMsR0FBRyxFQUFFLE1BQU0sR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUV2RDtJQUVNLHVCQUF1QixDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FTekQ7SUFFRCxPQUFPLENBQUMsWUFBWSxDQVlsQjtDQUNIIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/mem_pools/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAKL,KAAK,iBAAiB,EAKtB,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,oBAAY,QAAQ;IAClB,OAAO,WAAW;IAClB,gBAAgB,oBAAoB;CACrC;AAkCD,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC;IAC5C,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C,CAAC,CAAC;AAEH;;GAEG;AACH,qBAAa,mBAAmB,CAAC,UAAU,SAAS,UAAU;IAmB1D,OAAO,CAAC,SAAS;IAlBnB,uCAAuC;IACvC,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,gBAAgB,CAAgB;IACxC,qBAAqB;IACrB,OAAO,CAAC,UAAU,CAAY;IAC9B,wDAAwD;IACxD,OAAO,CAAC,UAAU,CAAY;IAE9B,OAAO,CAAC,SAAS,CAAc;IAE/B,OAAO,CAAC,iBAAiB,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/mem_pools/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAKL,KAAK,iBAAiB,EAKtB,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,oBAAY,QAAQ;IAClB,OAAO,WAAW;IAClB,gBAAgB,oBAAoB;CACrC;AAkCD,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC;IAC5C,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C,CAAC,CAAC;AAEH;;GAEG;AACH,qBAAa,mBAAmB,CAAC,UAAU,SAAS,UAAU;IAmB1D,OAAO,CAAC,SAAS;IAlBnB,uCAAuC;IACvC,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,gBAAgB,CAAgB;IACxC,qBAAqB;IACrB,OAAO,CAAC,UAAU,CAAY;IAC9B,wDAAwD;IACxD,OAAO,CAAC,UAAU,CAAY;IAE9B,OAAO,CAAC,SAAS,CAAc;IAE/B,OAAO,CAAC,iBAAiB,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,yBAAyB,CAAoE;IAErG,YACE,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,QAAQ,EACN,SAAS,EAAE,iBAAiB,EACpC,OAAO,CAAC,EAAE,iBAAiB,EA4B5B;IAEM,UAAU,CAAC,UAAU,EAAE,UAAU,QAEvC;IAEM,qBAAqB,CAAC,KAAK,EAAE,MAAM,QAEzC;IAEM,iBAAiB,CAAC,YAAY,EAAE,EAAE,EAAE,QAE1C;IAEM,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,QAIrE;IAEM,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEvD;IAEM,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASzD;IAED,OAAO,CAAC,YAAY,CAYlB;CACH"}
|
|
@@ -37,10 +37,10 @@ export var PoolName = /*#__PURE__*/ function(PoolName) {
|
|
|
37
37
|
dbMetrics;
|
|
38
38
|
defaultAttributes;
|
|
39
39
|
meter;
|
|
40
|
-
|
|
40
|
+
mempoolItemAddedTimestamp;
|
|
41
41
|
constructor(telemetry, name, poolStats, dbStats){
|
|
42
42
|
this.poolStats = poolStats;
|
|
43
|
-
this.
|
|
43
|
+
this.mempoolItemAddedTimestamp = new Map();
|
|
44
44
|
this.observeStats = async (observer)=>{
|
|
45
45
|
const { itemCount } = await this.poolStats();
|
|
46
46
|
if (typeof itemCount === 'number') {
|
|
@@ -65,7 +65,23 @@ export var PoolName = /*#__PURE__*/ function(PoolName) {
|
|
|
65
65
|
[Attributes.DB_DATA_TYPE]: 'tx-pool'
|
|
66
66
|
}, dbStats);
|
|
67
67
|
this.addObjectCounter = createUpDownCounterWithDefault(this.meter, metricsLabels.itemsAdded);
|
|
68
|
-
this.minedDelay = this.meter.createHistogram(metricsLabels.itemMinedDelay
|
|
68
|
+
this.minedDelay = this.meter.createHistogram(metricsLabels.itemMinedDelay, {
|
|
69
|
+
advice: {
|
|
70
|
+
explicitBucketBoundaries: [
|
|
71
|
+
100,
|
|
72
|
+
500,
|
|
73
|
+
1000,
|
|
74
|
+
5000,
|
|
75
|
+
10000,
|
|
76
|
+
30000,
|
|
77
|
+
60000,
|
|
78
|
+
300000,
|
|
79
|
+
600000,
|
|
80
|
+
1800000,
|
|
81
|
+
3600000
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
});
|
|
69
85
|
this.meter.addBatchObservableCallback(this.observeStats, [
|
|
70
86
|
this.objectsInMempool
|
|
71
87
|
]);
|
|
@@ -77,21 +93,23 @@ export var PoolName = /*#__PURE__*/ function(PoolName) {
|
|
|
77
93
|
this.addObjectCounter.add(count);
|
|
78
94
|
}
|
|
79
95
|
transactionsAdded(transactions) {
|
|
80
|
-
|
|
81
|
-
for (const transaction of transactions){
|
|
82
|
-
this.txAddedTimestamp.set(transaction.txHash.toBigInt(), timestamp);
|
|
83
|
-
}
|
|
96
|
+
transactions.forEach((tx)=>this.trackMempoolItemAdded(tx.txHash.toBigInt()));
|
|
84
97
|
}
|
|
85
98
|
transactionsRemoved(hashes) {
|
|
86
|
-
const timestamp = Date.now();
|
|
87
99
|
for (const hash of hashes){
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
100
|
+
this.trackMempoolItemRemoved(BigInt(hash));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
trackMempoolItemAdded(key) {
|
|
104
|
+
this.mempoolItemAddedTimestamp.set(key, Date.now());
|
|
105
|
+
}
|
|
106
|
+
trackMempoolItemRemoved(key) {
|
|
107
|
+
const timestamp = Date.now();
|
|
108
|
+
const addedAt = this.mempoolItemAddedTimestamp.get(key);
|
|
109
|
+
if (addedAt !== undefined) {
|
|
110
|
+
this.mempoolItemAddedTimestamp.delete(key);
|
|
111
|
+
if (addedAt < timestamp) {
|
|
112
|
+
this.minedDelay.record(timestamp - addedAt);
|
|
95
113
|
}
|
|
96
114
|
}
|
|
97
115
|
}
|
|
@@ -14,4 +14,4 @@ export declare class FeePayerBalanceEvictionRule implements EvictionRule {
|
|
|
14
14
|
private evictForFeePayers;
|
|
15
15
|
private getEvictionsForFeePayer;
|
|
16
16
|
}
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlX3BheWVyX2JhbGFuY2VfZXZpY3Rpb25fcnVsZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL21lbV9wb29scy90eF9wb29sX3YyL2V2aWN0aW9uL2ZlZV9wYXllcl9iYWxhbmNlX2V2aWN0aW9uX3J1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUk5RSxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUdyRzs7O0dBR0c7QUFDSCxxQkFBYSwyQkFBNEIsWUFBVyxZQUFZO0lBTWxELE9BQU8sQ0FBQyxVQUFVO0lBTDlCLFNBQWdCLElBQUksNkJBQTZCO0lBQ2pELFNBQWdCLE1BQU0sdUJBQXVCO0lBRTdDLE9BQU8sQ0FBQyxHQUFHLENBQWtFO0lBRTdFLFlBQW9CLFVBQVUsRUFBRSxzQkFBc0IsRUFBSTtJQUVwRCxLQUFLLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FpQ25GO1lBRWEsaUJBQWlCO1lBeUJqQix1QkFBdUI7Q0FzQ3RDIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fee_payer_balance_eviction_rule.d.ts","sourceRoot":"","sources":["../../../../src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAI9E,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGrG;;;GAGG;AACH,qBAAa,2BAA4B,YAAW,YAAY;IAMlD,OAAO,CAAC,UAAU;IAL9B,SAAgB,IAAI,6BAA6B;IACjD,SAAgB,MAAM,uBAAuB;IAE7C,OAAO,CAAC,GAAG,CAAkE;IAE7E,YAAoB,UAAU,EAAE,sBAAsB,EAAI;IAEpD,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"fee_payer_balance_eviction_rule.d.ts","sourceRoot":"","sources":["../../../../src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAI9E,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGrG;;;GAGG;AACH,qBAAa,2BAA4B,YAAW,YAAY;IAMlD,OAAO,CAAC,UAAU;IAL9B,SAAgB,IAAI,6BAA6B;IACjD,SAAgB,MAAM,uBAAuB;IAE7C,OAAO,CAAC,GAAG,CAAkE;IAE7E,YAAoB,UAAU,EAAE,sBAAsB,EAAI;IAEpD,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAiCnF;YAEa,iBAAiB;YAyBjB,uBAAuB;CAsCtC"}
|