chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.5.8rc1__py3-none-any.whl
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.
- chia/__init__.py +8 -4
- chia/_tests/blockchain/blockchain_test_utils.py +6 -8
- chia/_tests/blockchain/test_augmented_chain.py +4 -4
- chia/_tests/blockchain/test_blockchain.py +165 -190
- chia/_tests/blockchain/test_build_chains.py +2 -4
- chia/_tests/blockchain/test_get_block_generator.py +2 -3
- chia/_tests/clvm/coin_store.py +4 -7
- chia/_tests/clvm/test_clvm_step.py +4 -4
- chia/_tests/clvm/test_puzzle_compression.py +2 -1
- chia/_tests/clvm/test_puzzle_drivers.py +2 -2
- chia/_tests/clvm/test_singletons.py +2 -4
- chia/_tests/clvm/test_spend_sim.py +2 -2
- chia/_tests/cmds/cmd_test_utils.py +27 -45
- chia/_tests/cmds/test_cmd_framework.py +6 -6
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_show.py +4 -4
- chia/_tests/cmds/test_tx_config_args.py +1 -2
- chia/_tests/cmds/testing_classes.py +4 -5
- chia/_tests/cmds/wallet/test_did.py +24 -27
- chia/_tests/cmds/wallet/test_nft.py +12 -10
- chia/_tests/cmds/wallet/test_vcs.py +11 -12
- chia/_tests/cmds/wallet/test_wallet.py +134 -89
- chia/_tests/conftest.py +59 -30
- chia/_tests/connection_utils.py +2 -2
- chia/_tests/core/cmds/test_beta.py +4 -4
- chia/_tests/core/cmds/test_keys.py +2 -3
- chia/_tests/core/cmds/test_wallet.py +15 -15
- chia/_tests/core/consensus/test_pot_iterations.py +19 -73
- chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
- chia/_tests/core/daemon/test_daemon.py +11 -11
- chia/_tests/core/data_layer/conftest.py +2 -2
- chia/_tests/core/data_layer/test_data_rpc.py +28 -14
- chia/_tests/core/data_layer/test_data_store.py +10 -10
- chia/_tests/core/data_layer/util.py +11 -11
- chia/_tests/core/farmer/test_farmer_api.py +2 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
- chia/_tests/core/full_node/stores/test_block_store.py +5 -4
- chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
- chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +3 -4
- chia/_tests/core/full_node/test_conditions.py +21 -23
- chia/_tests/core/full_node/test_full_node.py +225 -62
- chia/_tests/core/full_node/test_hint_management.py +2 -4
- chia/_tests/core/full_node/test_performance.py +0 -1
- chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
- chia/_tests/core/full_node/test_transactions.py +1 -2
- chia/_tests/core/full_node/test_tx_processing_queue.py +109 -25
- chia/_tests/core/mempool/test_mempool.py +29 -37
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
- chia/_tests/core/mempool/test_mempool_manager.py +963 -839
- chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
- chia/_tests/core/server/serve.py +7 -7
- chia/_tests/core/server/test_dos.py +1 -2
- chia/_tests/core/server/test_event_loop.py +12 -4
- chia/_tests/core/server/test_loop.py +7 -8
- chia/_tests/core/server/test_rate_limits.py +9 -8
- chia/_tests/core/server/test_server.py +61 -1
- chia/_tests/core/services/test_services.py +2 -2
- chia/_tests/core/ssl/test_ssl.py +2 -2
- chia/_tests/core/test_cost_calculation.py +2 -6
- chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
- chia/_tests/core/test_filter.py +0 -1
- chia/_tests/core/test_full_node_rpc.py +2 -2
- chia/_tests/core/test_merkle_set.py +1 -2
- chia/_tests/core/test_seeder.py +4 -4
- chia/_tests/core/util/test_config.py +4 -4
- chia/_tests/core/util/test_jsonify.py +2 -2
- chia/_tests/core/util/test_keychain.py +3 -3
- chia/_tests/core/util/test_lockfile.py +2 -1
- chia/_tests/core/util/test_log_exceptions.py +1 -2
- chia/_tests/core/util/test_streamable.py +17 -17
- chia/_tests/db/test_db_wrapper.py +3 -2
- chia/_tests/environments/wallet.py +14 -14
- chia/_tests/ether.py +4 -3
- chia/_tests/farmer_harvester/test_farmer.py +41 -24
- chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
- chia/_tests/harvester/test_harvester_api.py +11 -4
- chia/_tests/plot_sync/test_plot_sync.py +13 -11
- chia/_tests/plot_sync/test_receiver.py +11 -10
- chia/_tests/plot_sync/test_sync_simulated.py +2 -2
- chia/_tests/plot_sync/util.py +1 -2
- chia/_tests/plotting/test_plot_manager.py +7 -6
- chia/_tests/plotting/test_prover.py +30 -38
- chia/_tests/pools/test_pool_cmdline.py +4 -6
- chia/_tests/pools/test_pool_rpc.py +203 -61
- chia/_tests/pools/test_pool_wallet.py +3 -3
- chia/_tests/pools/test_wallet_pool_store.py +1 -4
- chia/_tests/process_junit.py +2 -2
- chia/_tests/rpc/test_rpc_client.py +4 -4
- chia/_tests/rpc/test_rpc_server.py +3 -3
- chia/_tests/simulation/test_simulation.py +12 -25
- chia/_tests/solver/test_solver_service.py +13 -4
- chia/_tests/testconfig.py +2 -2
- chia/_tests/timelord/test_new_peak.py +22 -11
- chia/_tests/tools/test_run_block.py +0 -2
- chia/_tests/tools/test_virtual_project.py +2 -1
- chia/_tests/util/benchmarks.py +1 -0
- chia/_tests/util/blockchain.py +38 -36
- chia/_tests/util/blockchain_mock.py +11 -11
- chia/_tests/util/build_network_protocol_files.py +2 -1
- chia/_tests/util/coin_store.py +2 -1
- chia/_tests/util/config.py +1 -1
- chia/_tests/util/db_connection.py +2 -3
- chia/_tests/util/full_sync.py +9 -11
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/get_name_puzzle_conditions.py +2 -0
- chia/_tests/util/misc.py +24 -24
- chia/_tests/util/network_protocol_data.py +20 -3
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +292 -3
- chia/_tests/util/setup_nodes.py +62 -47
- chia/_tests/util/spend_sim.py +57 -57
- chia/_tests/util/test_async_pool.py +2 -3
- chia/_tests/util/test_chia_version.py +1 -3
- chia/_tests/util/test_config.py +3 -3
- chia/_tests/util/test_full_block_utils.py +6 -3
- chia/_tests/util/test_limited_semaphore.py +1 -2
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_network.py +1 -2
- chia/_tests/util/test_priority_mutex.py +3 -3
- chia/_tests/util/test_recursive_replace.py +5 -6
- chia/_tests/util/test_replace_str_to_bytes.py +8 -10
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/time_out_assert.py +2 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
- chia/_tests/wallet/conftest.py +6 -6
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
- chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
- chia/_tests/wallet/did_wallet/test_did.py +16 -6
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
- chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
- chia/_tests/wallet/sync/test_wallet_sync.py +43 -47
- chia/_tests/wallet/test_clvm_streamable.py +2 -3
- chia/_tests/wallet/test_coin_management.py +2 -2
- chia/_tests/wallet/test_conditions.py +45 -51
- chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
- chia/_tests/wallet/test_new_wallet_protocol.py +4 -6
- chia/_tests/wallet/test_notifications.py +14 -14
- chia/_tests/wallet/test_signer_protocol.py +5 -5
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
- chia/_tests/wallet/test_transaction_store.py +20 -20
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +380 -228
- chia/_tests/wallet/test_wallet_action_scope.py +4 -4
- chia/_tests/wallet/test_wallet_blockchain.py +12 -12
- chia/_tests/wallet/test_wallet_coin_store.py +3 -4
- chia/_tests/wallet/test_wallet_node.py +14 -14
- chia/_tests/wallet/test_wallet_test_framework.py +2 -1
- chia/_tests/wallet/test_wallet_utils.py +2 -3
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
- chia/_tests/wallet/wallet_block_tools.py +12 -11
- chia/_tests/weight_proof/config.py +1 -0
- chia/_tests/weight_proof/test_weight_proof.py +5 -4
- chia/apis/__init__.py +21 -0
- chia/apis/farmer_stub.py +102 -0
- chia/apis/full_node_stub.py +372 -0
- chia/apis/harvester_stub.py +57 -0
- chia/apis/introducer_stub.py +35 -0
- chia/apis/solver_stub.py +30 -0
- chia/apis/stub_protocol_registry.py +21 -0
- chia/apis/timelord_stub.py +39 -0
- chia/apis/wallet_stub.py +161 -0
- chia/cmds/beta.py +3 -4
- chia/cmds/beta_funcs.py +4 -3
- chia/cmds/check_wallet_db.py +4 -4
- chia/cmds/chia.py +1 -2
- chia/cmds/cmd_classes.py +11 -13
- chia/cmds/cmd_helpers.py +11 -11
- chia/cmds/cmds_util.py +15 -15
- chia/cmds/coin_funcs.py +6 -7
- chia/cmds/coins.py +2 -3
- chia/cmds/configure.py +1 -2
- chia/cmds/data.py +42 -42
- chia/cmds/data_funcs.py +81 -81
- chia/cmds/db.py +4 -5
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev/data.py +4 -4
- chia/cmds/dev/gh.py +5 -5
- chia/cmds/dev/installers.py +2 -3
- chia/cmds/dev/mempool.py +3 -4
- chia/cmds/dev/mempool_funcs.py +4 -4
- chia/cmds/dev/sim.py +8 -8
- chia/cmds/dump_keyring.py +3 -3
- chia/cmds/farm.py +6 -8
- chia/cmds/farm_funcs.py +25 -24
- chia/cmds/init_funcs.py +4 -4
- chia/cmds/keys.py +16 -18
- chia/cmds/keys_funcs.py +36 -36
- chia/cmds/netspace.py +1 -3
- chia/cmds/netspace_funcs.py +1 -2
- chia/cmds/options.py +3 -2
- chia/cmds/param_types.py +17 -16
- chia/cmds/passphrase.py +6 -7
- chia/cmds/passphrase_funcs.py +11 -13
- chia/cmds/peer.py +1 -3
- chia/cmds/peer_funcs.py +3 -3
- chia/cmds/plotnft.py +6 -7
- chia/cmds/plotnft_funcs.py +37 -26
- chia/cmds/rpc.py +3 -3
- chia/cmds/show.py +3 -5
- chia/cmds/show_funcs.py +9 -9
- chia/cmds/sim_funcs.py +25 -26
- chia/cmds/solver.py +1 -3
- chia/cmds/solver_funcs.py +1 -2
- chia/cmds/start_funcs.py +2 -2
- chia/cmds/wallet.py +76 -81
- chia/cmds/wallet_funcs.py +206 -177
- chia/consensus/augmented_chain.py +6 -6
- chia/consensus/block_body_validation.py +19 -15
- chia/consensus/block_creation.py +25 -21
- chia/consensus/block_header_validation.py +27 -13
- chia/consensus/block_height_map.py +3 -6
- chia/consensus/block_height_map_protocol.py +2 -2
- chia/consensus/block_record.py +2 -4
- chia/consensus/blockchain.py +58 -40
- chia/consensus/blockchain_interface.py +7 -7
- chia/consensus/coin_store_protocol.py +5 -6
- chia/consensus/condition_tools.py +4 -4
- chia/consensus/cost_calculator.py +2 -3
- chia/consensus/default_constants.py +16 -13
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +3 -5
- chia/consensus/find_fork_point.py +2 -4
- chia/consensus/full_block_to_block_record.py +11 -13
- chia/consensus/generator_tools.py +2 -3
- chia/consensus/get_block_challenge.py +42 -26
- chia/consensus/get_block_generator.py +2 -3
- chia/consensus/make_sub_epoch_summary.py +8 -7
- chia/consensus/multiprocess_validation.py +31 -20
- chia/consensus/pos_quality.py +6 -23
- chia/consensus/pot_iterations.py +17 -44
- chia/consensus/signage_point.py +4 -5
- chia/consensus/vdf_info_computation.py +2 -4
- chia/daemon/client.py +8 -8
- chia/daemon/keychain_proxy.py +31 -37
- chia/daemon/server.py +32 -33
- chia/daemon/windows_signal.py +4 -3
- chia/data_layer/data_layer.py +86 -77
- chia/data_layer/data_layer_rpc_api.py +9 -9
- chia/data_layer/data_layer_rpc_client.py +13 -15
- chia/data_layer/data_layer_server.py +3 -3
- chia/data_layer/data_layer_util.py +14 -14
- chia/data_layer/data_layer_wallet.py +94 -101
- chia/data_layer/data_store.py +50 -50
- chia/data_layer/dl_wallet_store.py +9 -12
- chia/data_layer/download_data.py +8 -9
- chia/data_layer/s3_plugin_service.py +5 -9
- chia/data_layer/start_data_layer.py +5 -5
- chia/farmer/farmer.py +31 -31
- chia/farmer/farmer_api.py +45 -33
- chia/farmer/farmer_rpc_api.py +5 -4
- chia/farmer/farmer_rpc_client.py +6 -6
- chia/farmer/start_farmer.py +6 -6
- chia/full_node/block_store.py +13 -16
- chia/full_node/check_fork_next_block.py +1 -2
- chia/full_node/coin_store.py +15 -16
- chia/full_node/eligible_coin_spends.py +3 -3
- chia/full_node/fee_estimate_store.py +2 -3
- chia/full_node/fee_tracker.py +1 -2
- chia/full_node/full_block_utils.py +4 -4
- chia/full_node/full_node.py +238 -224
- chia/full_node/full_node_api.py +193 -150
- chia/full_node/full_node_rpc_api.py +53 -31
- chia/full_node/full_node_rpc_client.py +18 -19
- chia/full_node/full_node_store.py +45 -43
- chia/full_node/hint_management.py +2 -2
- chia/full_node/mempool.py +17 -19
- chia/full_node/mempool_manager.py +89 -42
- chia/full_node/pending_tx_cache.py +2 -3
- chia/full_node/start_full_node.py +5 -5
- chia/full_node/sync_store.py +3 -4
- chia/full_node/tx_processing_queue.py +34 -13
- chia/full_node/weight_proof.py +61 -48
- chia/harvester/harvester.py +25 -24
- chia/harvester/harvester_api.py +61 -38
- chia/harvester/harvester_rpc_api.py +10 -10
- chia/harvester/start_harvester.py +4 -4
- chia/introducer/introducer.py +3 -3
- chia/introducer/introducer_api.py +6 -4
- chia/introducer/start_introducer.py +4 -4
- chia/legacy/keyring.py +3 -3
- chia/plot_sync/delta.py +1 -2
- chia/plot_sync/receiver.py +20 -17
- chia/plot_sync/sender.py +15 -10
- chia/plotters/bladebit.py +7 -7
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +4 -4
- chia/plotters/plotters.py +4 -4
- chia/plotters/plotters_util.py +3 -3
- chia/plotting/cache.py +20 -14
- chia/plotting/check_plots.py +26 -35
- chia/plotting/create_plots.py +22 -23
- chia/plotting/manager.py +21 -14
- chia/plotting/prover.py +59 -42
- chia/plotting/util.py +16 -16
- chia/pools/pool_config.py +2 -1
- chia/pools/pool_puzzles.py +11 -12
- chia/pools/pool_wallet.py +34 -57
- chia/pools/pool_wallet_info.py +39 -10
- chia/protocols/farmer_protocol.py +8 -9
- chia/protocols/fee_estimate.py +3 -4
- chia/protocols/full_node_protocol.py +3 -4
- chia/protocols/harvester_protocol.py +27 -15
- chia/protocols/outbound_message.py +3 -3
- chia/protocols/pool_protocol.py +8 -9
- chia/protocols/shared_protocol.py +1 -2
- chia/protocols/solver_protocol.py +9 -2
- chia/protocols/timelord_protocol.py +4 -7
- chia/protocols/wallet_protocol.py +11 -12
- chia/rpc/rpc_client.py +9 -9
- chia/rpc/rpc_server.py +17 -17
- chia/rpc/util.py +2 -2
- chia/seeder/crawler.py +8 -8
- chia/seeder/crawler_api.py +21 -27
- chia/seeder/crawler_rpc_api.py +2 -2
- chia/seeder/dns_server.py +21 -21
- chia/seeder/start_crawler.py +4 -4
- chia/server/address_manager.py +15 -16
- chia/server/api_protocol.py +11 -11
- chia/server/chia_policy.py +46 -26
- chia/server/introducer_peers.py +2 -3
- chia/server/node_discovery.py +19 -19
- chia/server/rate_limit_numbers.py +4 -5
- chia/server/rate_limits.py +4 -4
- chia/server/resolve_peer_info.py +4 -4
- chia/server/server.py +49 -52
- chia/server/signal_handlers.py +6 -6
- chia/server/start_service.py +17 -17
- chia/server/upnp.py +4 -6
- chia/server/ws_connection.py +52 -37
- chia/simulator/add_blocks_in_batches.py +1 -3
- chia/simulator/block_tools.py +312 -200
- chia/simulator/full_node_simulator.py +56 -35
- chia/simulator/keyring.py +2 -3
- chia/simulator/setup_services.py +15 -15
- chia/simulator/simulator_full_node_rpc_api.py +1 -2
- chia/simulator/simulator_full_node_rpc_client.py +1 -2
- chia/simulator/simulator_protocol.py +1 -2
- chia/simulator/simulator_test_tools.py +3 -3
- chia/simulator/start_simulator.py +7 -7
- chia/simulator/wallet_tools.py +10 -10
- chia/solver/solver.py +10 -10
- chia/solver/solver_api.py +10 -8
- chia/solver/solver_rpc_api.py +2 -2
- chia/solver/start_solver.py +4 -4
- chia/ssl/cacert.pem +148 -90
- chia/ssl/chia_ca.crt +14 -10
- chia/ssl/chia_ca_old.crt +19 -0
- chia/ssl/create_ssl.py +4 -4
- chia/ssl/renewedselfsignedca.conf +4 -0
- chia/ssl/ssl_check.py +1 -2
- chia/timelord/iters_from_block.py +1 -4
- chia/timelord/start_timelord.py +4 -4
- chia/timelord/timelord.py +44 -40
- chia/timelord/timelord_api.py +6 -4
- chia/timelord/timelord_launcher.py +2 -2
- chia/timelord/timelord_rpc_api.py +2 -2
- chia/timelord/timelord_state.py +11 -12
- chia/types/block_protocol.py +1 -3
- chia/types/blockchain_format/coin.py +1 -3
- chia/types/blockchain_format/program.py +11 -8
- chia/types/blockchain_format/proof_of_space.py +123 -76
- chia/types/blockchain_format/tree_hash.py +3 -3
- chia/types/blockchain_format/vdf.py +1 -2
- chia/types/coin_spend.py +3 -3
- chia/types/mempool_item.py +5 -5
- chia/types/mempool_submission_status.py +2 -3
- chia/types/peer_info.py +1 -2
- chia/types/unfinished_header_block.py +3 -4
- chia/types/validation_state.py +1 -2
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +5 -5
- chia/util/bech32m.py +1 -2
- chia/util/beta_metrics.py +2 -2
- chia/util/block_cache.py +4 -4
- chia/util/chia_logging.py +2 -2
- chia/util/chia_version.py +1 -2
- chia/util/config.py +15 -16
- chia/util/db_wrapper.py +26 -27
- chia/util/default_root.py +1 -2
- chia/util/errors.py +3 -3
- chia/util/file_keyring.py +14 -14
- chia/util/files.py +2 -3
- chia/util/hash.py +4 -4
- chia/util/initial-config.yaml +3 -5
- chia/util/inline_executor.py +2 -1
- chia/util/ip_address.py +1 -2
- chia/util/keychain.py +25 -27
- chia/util/keyring_wrapper.py +18 -19
- chia/util/lock.py +3 -4
- chia/util/log_exceptions.py +1 -2
- chia/util/lru_cache.py +2 -2
- chia/util/network.py +6 -6
- chia/util/path.py +2 -3
- chia/util/priority_mutex.py +2 -2
- chia/util/profiler.py +1 -2
- chia/util/safe_cancel_task.py +1 -2
- chia/util/streamable.py +22 -8
- chia/util/task_referencer.py +1 -1
- chia/util/timing.py +3 -3
- chia/util/virtual_project_analysis.py +6 -5
- chia/util/ws_message.py +2 -2
- chia/wallet/cat_wallet/cat_info.py +3 -4
- chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
- chia/wallet/cat_wallet/cat_utils.py +3 -4
- chia/wallet/cat_wallet/cat_wallet.py +61 -83
- chia/wallet/cat_wallet/lineage_store.py +3 -4
- chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
- chia/wallet/coin_selection.py +9 -10
- chia/wallet/conditions.py +120 -105
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
- chia/wallet/derivation_record.py +1 -2
- chia/wallet/derive_keys.py +2 -4
- chia/wallet/did_wallet/did_info.py +10 -11
- chia/wallet/did_wallet/did_wallet.py +36 -82
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
- chia/wallet/driver_protocol.py +5 -7
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
- chia/wallet/nft_wallet/nft_info.py +8 -9
- chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
- chia/wallet/nft_wallet/nft_wallet.py +79 -116
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
- chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
- chia/wallet/nft_wallet/uncurry_nft.py +10 -11
- chia/wallet/notification_manager.py +3 -3
- chia/wallet/notification_store.py +44 -61
- chia/wallet/outer_puzzles.py +6 -7
- chia/wallet/puzzle_drivers.py +34 -6
- chia/wallet/puzzles/clawback/drivers.py +6 -6
- chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
- chia/wallet/puzzles/load_clvm.py +1 -1
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
- chia/wallet/puzzles/singleton_top_layer.py +2 -3
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
- chia/wallet/puzzles/tails.py +3 -3
- chia/wallet/singleton.py +5 -7
- chia/wallet/singleton_record.py +3 -3
- chia/wallet/start_wallet.py +5 -5
- chia/wallet/trade_manager.py +37 -58
- chia/wallet/trade_record.py +4 -4
- chia/wallet/trading/offer.py +59 -46
- chia/wallet/trading/trade_store.py +8 -9
- chia/wallet/transaction_record.py +8 -8
- chia/wallet/uncurried_puzzle.py +1 -2
- chia/wallet/util/clvm_streamable.py +12 -12
- chia/wallet/util/compute_hints.py +4 -5
- chia/wallet/util/curry_and_treehash.py +1 -2
- chia/wallet/util/merkle_tree.py +2 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/wallet/util/signing.py +85 -0
- chia/wallet/util/tx_config.py +15 -6
- chia/wallet/util/wallet_sync_utils.py +14 -16
- chia/wallet/util/wallet_types.py +2 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
- chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
- chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
- chia/wallet/vc_wallet/vc_drivers.py +27 -27
- chia/wallet/vc_wallet/vc_store.py +5 -6
- chia/wallet/vc_wallet/vc_wallet.py +33 -61
- chia/wallet/wallet.py +50 -78
- chia/wallet/wallet_action_scope.py +11 -11
- chia/wallet/wallet_blockchain.py +12 -12
- chia/wallet/wallet_coin_record.py +12 -6
- chia/wallet/wallet_coin_store.py +24 -25
- chia/wallet/wallet_interested_store.py +3 -5
- chia/wallet/wallet_nft_store.py +10 -11
- chia/wallet/wallet_node.py +53 -61
- chia/wallet/wallet_node_api.py +5 -3
- chia/wallet/wallet_protocol.py +23 -23
- chia/wallet/wallet_puzzle_store.py +15 -18
- chia/wallet/wallet_request_types.py +778 -114
- chia/wallet/wallet_retry_store.py +1 -3
- chia/wallet/wallet_rpc_api.py +572 -909
- chia/wallet/wallet_rpc_client.py +87 -279
- chia/wallet/wallet_singleton_store.py +3 -4
- chia/wallet/wallet_state_manager.py +332 -106
- chia/wallet/wallet_transaction_store.py +11 -14
- chia/wallet/wallet_user_store.py +4 -6
- chia/wallet/wallet_weight_proof_handler.py +4 -4
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
- chia/apis.py +0 -21
- chia/consensus/check_time_locks.py +0 -57
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
- chia/types/coin_record.py +0 -44
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
|
@@ -2,14 +2,17 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import logging
|
|
5
|
+
import math
|
|
5
6
|
import random
|
|
6
|
-
from dataclasses import dataclass
|
|
7
|
-
from typing import
|
|
7
|
+
from dataclasses import dataclass, field
|
|
8
|
+
from typing import cast
|
|
8
9
|
|
|
9
10
|
import pytest
|
|
11
|
+
from chia_rs import G2Element, SpendBundle
|
|
10
12
|
from chia_rs.sized_bytes import bytes32
|
|
13
|
+
from chia_rs.sized_ints import uint64
|
|
11
14
|
|
|
12
|
-
from chia.full_node.tx_processing_queue import TransactionQueue, TransactionQueueEntry, TransactionQueueFull
|
|
15
|
+
from chia.full_node.tx_processing_queue import PeerWithTx, TransactionQueue, TransactionQueueEntry, TransactionQueueFull
|
|
13
16
|
from chia.util.task_referencer import create_referenced_task
|
|
14
17
|
|
|
15
18
|
log = logging.getLogger(__name__)
|
|
@@ -17,12 +20,17 @@ log = logging.getLogger(__name__)
|
|
|
17
20
|
|
|
18
21
|
@dataclass(frozen=True)
|
|
19
22
|
class FakeTransactionQueueEntry:
|
|
20
|
-
index: int
|
|
21
|
-
peer_id:
|
|
23
|
+
index: int = field(compare=False)
|
|
24
|
+
peer_id: bytes32 | None = field(compare=False)
|
|
25
|
+
peers_with_tx: dict[bytes32, PeerWithTx] | None = field(compare=False)
|
|
22
26
|
|
|
23
27
|
|
|
24
|
-
def get_transaction_queue_entry(
|
|
25
|
-
|
|
28
|
+
def get_transaction_queue_entry(
|
|
29
|
+
peer_id: bytes32 | None, tx_index: int, peers_with_tx: dict[bytes32, PeerWithTx] | None = None
|
|
30
|
+
) -> TransactionQueueEntry: # easy shortcut
|
|
31
|
+
if peers_with_tx is None:
|
|
32
|
+
peers_with_tx = {}
|
|
33
|
+
return cast(TransactionQueueEntry, FakeTransactionQueueEntry(tx_index, peer_id, peers_with_tx))
|
|
26
34
|
|
|
27
35
|
|
|
28
36
|
@pytest.mark.anyio
|
|
@@ -30,7 +38,7 @@ async def test_local_txs(seeded_random: random.Random) -> None:
|
|
|
30
38
|
transaction_queue = TransactionQueue(1000, log)
|
|
31
39
|
# test 1 tx
|
|
32
40
|
first_tx = get_transaction_queue_entry(None, 0)
|
|
33
|
-
|
|
41
|
+
transaction_queue.put(first_tx, None)
|
|
34
42
|
|
|
35
43
|
result1 = await transaction_queue.pop()
|
|
36
44
|
|
|
@@ -40,7 +48,7 @@ async def test_local_txs(seeded_random: random.Random) -> None:
|
|
|
40
48
|
num_txs = 2000
|
|
41
49
|
list_txs = [get_transaction_queue_entry(bytes32.random(seeded_random), i) for i in range(num_txs)]
|
|
42
50
|
for tx in list_txs:
|
|
43
|
-
|
|
51
|
+
transaction_queue.put(tx, None)
|
|
44
52
|
|
|
45
53
|
resulting_txs = []
|
|
46
54
|
for _ in range(num_txs):
|
|
@@ -58,12 +66,12 @@ async def test_one_peer_and_await(seeded_random: random.Random) -> None:
|
|
|
58
66
|
|
|
59
67
|
list_txs = [get_transaction_queue_entry(peer_id, i) for i in range(num_txs)]
|
|
60
68
|
for tx in list_txs:
|
|
61
|
-
|
|
69
|
+
transaction_queue.put(tx, peer_id)
|
|
62
70
|
|
|
63
71
|
# test transaction priority
|
|
64
72
|
local_txs = [get_transaction_queue_entry(None, i) for i in range(int(num_txs / 5))] # 20 txs
|
|
65
73
|
for tx in local_txs:
|
|
66
|
-
|
|
74
|
+
transaction_queue.put(tx, None)
|
|
67
75
|
|
|
68
76
|
resulting_txs = []
|
|
69
77
|
for _ in range(num_txs + len(local_txs)):
|
|
@@ -80,7 +88,7 @@ async def test_one_peer_and_await(seeded_random: random.Random) -> None:
|
|
|
80
88
|
with pytest.raises(asyncio.InvalidStateError): # task is not done, so we expect an error when getting result
|
|
81
89
|
task.result()
|
|
82
90
|
# add a tx to test task completion
|
|
83
|
-
|
|
91
|
+
transaction_queue.put(get_transaction_queue_entry(None, 0), None)
|
|
84
92
|
await asyncio.wait_for(task, 1) # we should never time out here
|
|
85
93
|
|
|
86
94
|
|
|
@@ -95,7 +103,7 @@ async def test_lots_of_peers(seeded_random: random.Random) -> None:
|
|
|
95
103
|
# 100 txs per peer
|
|
96
104
|
list_txs = [get_transaction_queue_entry(peer_id, i) for peer_id in peer_ids for i in range(num_txs)]
|
|
97
105
|
for tx in list_txs:
|
|
98
|
-
|
|
106
|
+
transaction_queue.put(tx, tx.peer_id) # type: ignore[attr-defined]
|
|
99
107
|
|
|
100
108
|
resulting_txs = []
|
|
101
109
|
for _ in range(total_txs):
|
|
@@ -117,11 +125,11 @@ async def test_full_queue(seeded_random: random.Random) -> None:
|
|
|
117
125
|
# 999 txs per peer then 1 to fail later
|
|
118
126
|
list_txs = [get_transaction_queue_entry(peer_id, i) for peer_id in peer_ids for i in range(num_txs)]
|
|
119
127
|
for tx in list_txs:
|
|
120
|
-
|
|
128
|
+
transaction_queue.put(tx, tx.peer_id) # type: ignore[attr-defined]
|
|
121
129
|
|
|
122
130
|
# test failure case.
|
|
123
131
|
with pytest.raises(TransactionQueueFull):
|
|
124
|
-
|
|
132
|
+
transaction_queue.put(get_transaction_queue_entry(peer_ids[0], 1001), peer_ids[0])
|
|
125
133
|
|
|
126
134
|
resulting_txs = []
|
|
127
135
|
for _ in range(total_txs):
|
|
@@ -135,20 +143,96 @@ async def test_queue_cleanup_and_fairness(seeded_random: random.Random) -> None:
|
|
|
135
143
|
peer_b = bytes32.random(seeded_random)
|
|
136
144
|
peer_c = bytes32.random(seeded_random)
|
|
137
145
|
|
|
146
|
+
higher_tx_cost = uint64(20)
|
|
147
|
+
lower_tx_cost = uint64(10)
|
|
148
|
+
higher_tx_fee = uint64(5)
|
|
149
|
+
lower_tx_fee = uint64(1)
|
|
138
150
|
# 2 for a, 1 for b, 2 for c
|
|
139
|
-
peer_tx_a = [
|
|
140
|
-
|
|
141
|
-
|
|
151
|
+
peer_tx_a = [
|
|
152
|
+
get_transaction_queue_entry(peer_a, 0, {peer_a: PeerWithTx(str(peer_a), lower_tx_fee, higher_tx_cost)}),
|
|
153
|
+
get_transaction_queue_entry(peer_a, 1, {peer_a: PeerWithTx(str(peer_a), higher_tx_fee, lower_tx_cost)}),
|
|
154
|
+
]
|
|
155
|
+
peer_tx_b = [
|
|
156
|
+
get_transaction_queue_entry(peer_b, 0, {peer_b: PeerWithTx(str(peer_b), higher_tx_fee, lower_tx_cost)})
|
|
157
|
+
]
|
|
158
|
+
peer_tx_c = [
|
|
159
|
+
get_transaction_queue_entry(peer_c, 0, {peer_c: PeerWithTx(str(peer_c), higher_tx_fee, lower_tx_cost)}),
|
|
160
|
+
get_transaction_queue_entry(peer_c, 1, {peer_c: PeerWithTx(str(peer_c), lower_tx_fee, higher_tx_cost)}),
|
|
161
|
+
]
|
|
142
162
|
|
|
143
163
|
list_txs = peer_tx_a + peer_tx_b + peer_tx_c
|
|
144
164
|
for tx in list_txs:
|
|
145
|
-
|
|
165
|
+
transaction_queue.put(tx, tx.peer_id) # type: ignore[attr-defined]
|
|
146
166
|
|
|
147
|
-
|
|
167
|
+
entries = []
|
|
148
168
|
for _ in range(3): # we validate we get one transaction per peer
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
169
|
+
entry = await transaction_queue.pop()
|
|
170
|
+
entries.append((entry.peer_id, entry.index)) # type: ignore[attr-defined]
|
|
171
|
+
assert [(peer_a, 1), (peer_b, 0), (peer_c, 0)] == entries # all peers have been properly included in the queue.
|
|
172
|
+
second_entries = []
|
|
152
173
|
for _ in range(2): # we validate that we properly queue the last 2 transactions
|
|
153
|
-
|
|
154
|
-
|
|
174
|
+
entry = await transaction_queue.pop()
|
|
175
|
+
second_entries.append((entry.peer_id, entry.index)) # type: ignore[attr-defined]
|
|
176
|
+
assert [(peer_a, 0), (peer_c, 1)] == second_entries
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def test_tx_queue_entry_order_compare() -> None:
|
|
180
|
+
"""
|
|
181
|
+
Tests that `TransactionQueueEntry` orders and compares using transaction
|
|
182
|
+
IDs regardless of other fields.
|
|
183
|
+
"""
|
|
184
|
+
# Let's create two items with the same transaction ID but different data
|
|
185
|
+
sb = SpendBundle([], G2Element())
|
|
186
|
+
sb_name = sb.name()
|
|
187
|
+
item1 = TransactionQueueEntry(
|
|
188
|
+
transaction=sb, transaction_bytes=bytes(sb), spend_name=sb_name, peer=None, test=False, peers_with_tx={}
|
|
189
|
+
)
|
|
190
|
+
item2 = TransactionQueueEntry(
|
|
191
|
+
transaction=sb, transaction_bytes=None, spend_name=sb_name, peer=None, test=True, peers_with_tx={}
|
|
192
|
+
)
|
|
193
|
+
# They should be ordered and compared (considered equal) by `spend_name`
|
|
194
|
+
# regardless of other fields.
|
|
195
|
+
assert (item1 < item2) is False
|
|
196
|
+
assert item1 == item2
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
@pytest.mark.anyio
|
|
200
|
+
async def test_peer_queue_prioritization_fallback() -> None:
|
|
201
|
+
"""
|
|
202
|
+
Tests prioritization fallback, when `peer_id` is not in `peers_with_tx`.
|
|
203
|
+
"""
|
|
204
|
+
queue = TransactionQueue(42, log)
|
|
205
|
+
peer1 = bytes32.random()
|
|
206
|
+
peer2 = bytes32.random()
|
|
207
|
+
# We'll be using this peer to test the fallback, so we don't include it in
|
|
208
|
+
# peers with transactions maps.
|
|
209
|
+
peer3 = bytes32.random()
|
|
210
|
+
peers_with_tx1 = {
|
|
211
|
+
# This has FPC of 5.0
|
|
212
|
+
peer1: PeerWithTx(str(peer1), uint64(10), uint64(2)),
|
|
213
|
+
# This has FPC of 2.0 but higher advertised cost
|
|
214
|
+
peer2: PeerWithTx(str(peer2), uint64(20), uint64(10)),
|
|
215
|
+
}
|
|
216
|
+
tx1 = get_transaction_queue_entry(peer3, 0, peers_with_tx1)
|
|
217
|
+
queue.put(tx1, peer3)
|
|
218
|
+
peers_with_tx2 = {
|
|
219
|
+
# This has FPC of 3.0
|
|
220
|
+
peer1: PeerWithTx(str(peer1), uint64(30), uint64(10)),
|
|
221
|
+
# This has FPC of 4.0 but lower advertised cost
|
|
222
|
+
peer2: PeerWithTx(str(peer2), uint64(20), uint64(5)),
|
|
223
|
+
# This has FPC of 1.0 but lower advertised cost
|
|
224
|
+
peer3: PeerWithTx(str(peer3), uint64(4), uint64(4)),
|
|
225
|
+
}
|
|
226
|
+
tx2 = get_transaction_queue_entry(peer3, 1, peers_with_tx2)
|
|
227
|
+
queue.put(tx2, peer3)
|
|
228
|
+
# tx2 gets top priority with FPC 1.0
|
|
229
|
+
assert math.isclose(queue._queue_dict[peer3].queue[0][0], -1.0)
|
|
230
|
+
entry = await queue.pop()
|
|
231
|
+
# NOTE: This whole test file uses `index` as an addition to
|
|
232
|
+
# `TransactionQueueEntry` for easier testing, hence this type ignore here
|
|
233
|
+
# and everywhere else.
|
|
234
|
+
assert entry.index == 1 # type: ignore[attr-defined]
|
|
235
|
+
# tx1 comes next due to lowest priority fallback
|
|
236
|
+
assert math.isinf(queue._queue_dict[peer3].queue[0][0])
|
|
237
|
+
entry = await queue.pop()
|
|
238
|
+
assert entry.index == 0 # type: ignore[attr-defined]
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import dataclasses
|
|
4
4
|
import logging
|
|
5
5
|
import random
|
|
6
|
-
from
|
|
6
|
+
from collections.abc import Callable
|
|
7
7
|
|
|
8
8
|
import pytest
|
|
9
9
|
from chia_rs import (
|
|
@@ -26,6 +26,7 @@ from clvm_tools.binutils import assemble
|
|
|
26
26
|
|
|
27
27
|
from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block
|
|
28
28
|
from chia._tests.connection_utils import add_dummy_connection, connect_and_get_peer
|
|
29
|
+
from chia._tests.core.full_node.test_full_node import find_reward_coin
|
|
29
30
|
from chia._tests.core.mempool.test_mempool_manager import (
|
|
30
31
|
IDENTITY_PUZZLE_HASH,
|
|
31
32
|
TEST_COIN,
|
|
@@ -100,7 +101,7 @@ def wallet_a(bt: BlockTools) -> WalletTool:
|
|
|
100
101
|
def generate_test_spend_bundle(
|
|
101
102
|
wallet: WalletTool,
|
|
102
103
|
coin: Coin,
|
|
103
|
-
condition_dic:
|
|
104
|
+
condition_dic: dict[ConditionOpcode, list[ConditionWithArgs]] | None = None,
|
|
104
105
|
fee: uint64 = uint64(0),
|
|
105
106
|
amount: uint64 = uint64(1000),
|
|
106
107
|
new_puzzle_hash: bytes32 = BURN_PUZZLE_HASH,
|
|
@@ -350,7 +351,7 @@ async def respond_transaction(
|
|
|
350
351
|
peer: WSChiaConnection,
|
|
351
352
|
tx_bytes: bytes = b"",
|
|
352
353
|
test: bool = False,
|
|
353
|
-
) -> tuple[MempoolInclusionStatus,
|
|
354
|
+
) -> tuple[MempoolInclusionStatus, Err | None]:
|
|
354
355
|
"""
|
|
355
356
|
Receives a full transaction from peer.
|
|
356
357
|
If tx is added to mempool, send tx_id to others. (new_transaction)
|
|
@@ -380,7 +381,6 @@ async def next_block(full_node_1: FullNodeSimulator, wallet_a: WalletTool, bt: B
|
|
|
380
381
|
block_list_input=blocks,
|
|
381
382
|
guarantee_transaction_block=True,
|
|
382
383
|
farmer_reward_puzzle_hash=reward_ph,
|
|
383
|
-
pool_reward_puzzle_hash=reward_ph,
|
|
384
384
|
genesis_timestamp=uint64(10_000),
|
|
385
385
|
time_per_block=10,
|
|
386
386
|
)
|
|
@@ -395,7 +395,7 @@ co = ConditionOpcode
|
|
|
395
395
|
mis = MempoolInclusionStatus
|
|
396
396
|
|
|
397
397
|
|
|
398
|
-
async def send_sb(node: FullNodeAPI, sb: SpendBundle) ->
|
|
398
|
+
async def send_sb(node: FullNodeAPI, sb: SpendBundle) -> Message | None:
|
|
399
399
|
tx = wallet_protocol.SendTransaction(sb)
|
|
400
400
|
return await node.send_transaction(tx, test=True)
|
|
401
401
|
|
|
@@ -576,14 +576,14 @@ class TestMempoolManager:
|
|
|
576
576
|
block_list_input=blocks,
|
|
577
577
|
guarantee_transaction_block=True,
|
|
578
578
|
farmer_reward_puzzle_hash=reward_ph,
|
|
579
|
-
pool_reward_puzzle_hash=reward_ph,
|
|
580
579
|
)
|
|
581
580
|
peer = await connect_and_get_peer(server_1, server_2, self_hostname)
|
|
582
581
|
|
|
583
582
|
await add_blocks_in_batches(blocks, full_node_1.full_node)
|
|
584
583
|
await time_out_assert(60, node_height_at_least, True, full_node_1, start_height + 3)
|
|
585
584
|
|
|
586
|
-
|
|
585
|
+
coin_1 = find_reward_coin(blocks[-1], reward_ph)
|
|
586
|
+
spend_bundle1 = generate_test_spend_bundle(wallet_a, coin_1)
|
|
587
587
|
|
|
588
588
|
assert spend_bundle1 is not None
|
|
589
589
|
tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
|
|
@@ -591,9 +591,10 @@ class TestMempoolManager:
|
|
|
591
591
|
assert err is None
|
|
592
592
|
assert status == MempoolInclusionStatus.SUCCESS
|
|
593
593
|
|
|
594
|
+
coin_1 = find_reward_coin(blocks[-1], reward_ph)
|
|
594
595
|
spend_bundle2 = generate_test_spend_bundle(
|
|
595
596
|
wallet_a,
|
|
596
|
-
|
|
597
|
+
coin_1,
|
|
597
598
|
new_puzzle_hash=BURN_PUZZLE_HASH_2,
|
|
598
599
|
)
|
|
599
600
|
assert spend_bundle2 is not None
|
|
@@ -621,7 +622,6 @@ class TestMempoolManager:
|
|
|
621
622
|
block_list_input=blocks,
|
|
622
623
|
guarantee_transaction_block=True,
|
|
623
624
|
farmer_reward_puzzle_hash=reward_ph,
|
|
624
|
-
pool_reward_puzzle_hash=reward_ph,
|
|
625
625
|
)
|
|
626
626
|
|
|
627
627
|
invariant_check_mempool(full_node_1.full_node.mempool_manager.mempool)
|
|
@@ -704,19 +704,17 @@ class TestMempoolManager:
|
|
|
704
704
|
block_list_input=blocks,
|
|
705
705
|
guarantee_transaction_block=True,
|
|
706
706
|
farmer_reward_puzzle_hash=reward_ph,
|
|
707
|
-
pool_reward_puzzle_hash=reward_ph,
|
|
708
707
|
)
|
|
709
708
|
|
|
710
709
|
await add_blocks_in_batches(blocks, full_node_1.full_node)
|
|
711
710
|
await time_out_assert(60, node_height_at_least, True, full_node_1, start_height + 3)
|
|
712
711
|
|
|
713
|
-
|
|
714
|
-
coin1 = next(coins)
|
|
712
|
+
coin1 = find_reward_coin(blocks[-1], reward_ph)
|
|
715
713
|
|
|
716
714
|
sb: SpendBundle = generate_test_spend_bundle(wallet_a, coin1)
|
|
717
715
|
assert sb.aggregated_signature != G2Element.generator()
|
|
718
716
|
sb = sb.replace(aggregated_signature=G2Element.generator())
|
|
719
|
-
res:
|
|
717
|
+
res: Message | None = await send_sb(full_node_1, sb)
|
|
720
718
|
assert res is not None
|
|
721
719
|
ack: TransactionAck = TransactionAck.from_bytes(res.data)
|
|
722
720
|
assert ack.status == MempoolInclusionStatus.FAILED.value
|
|
@@ -730,8 +728,8 @@ class TestMempoolManager:
|
|
|
730
728
|
dic: dict[ConditionOpcode, list[ConditionWithArgs]],
|
|
731
729
|
fee: int = 0,
|
|
732
730
|
num_blocks: int = 3,
|
|
733
|
-
coin:
|
|
734
|
-
) -> tuple[list[FullBlock], SpendBundle, WSChiaConnection, MempoolInclusionStatus,
|
|
731
|
+
coin: Coin | None = None,
|
|
732
|
+
) -> tuple[list[FullBlock], SpendBundle, WSChiaConnection, MempoolInclusionStatus, Err | None]:
|
|
735
733
|
reward_ph = wallet_a.get_new_puzzlehash()
|
|
736
734
|
full_node_1, server_1, bt = one_node_one_block
|
|
737
735
|
blocks = await full_node_1.get_all_full_blocks()
|
|
@@ -741,7 +739,6 @@ class TestMempoolManager:
|
|
|
741
739
|
block_list_input=blocks,
|
|
742
740
|
guarantee_transaction_block=True,
|
|
743
741
|
farmer_reward_puzzle_hash=reward_ph,
|
|
744
|
-
pool_reward_puzzle_hash=reward_ph,
|
|
745
742
|
)
|
|
746
743
|
_, dummy_node_id = await add_dummy_connection(server_1, bt.config["self_hostname"], 100)
|
|
747
744
|
for node_id, wsc in server_1.all_connections.items():
|
|
@@ -755,9 +752,8 @@ class TestMempoolManager:
|
|
|
755
752
|
|
|
756
753
|
await time_out_assert(60, node_height_at_least, True, full_node_1, start_height + num_blocks)
|
|
757
754
|
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
)
|
|
755
|
+
coin1 = find_reward_coin(blocks[2 - num_blocks], reward_ph)
|
|
756
|
+
spend_bundle1 = generate_test_spend_bundle(wallet_a, coin or coin1, dic, uint64(fee))
|
|
761
757
|
|
|
762
758
|
assert spend_bundle1 is not None
|
|
763
759
|
|
|
@@ -772,7 +768,7 @@ class TestMempoolManager:
|
|
|
772
768
|
node_server_bt: tuple[FullNodeSimulator, ChiaServer, BlockTools],
|
|
773
769
|
wallet_a: WalletTool,
|
|
774
770
|
test_fun: Callable[[Coin, Coin], SpendBundle],
|
|
775
|
-
) -> tuple[list[FullBlock], SpendBundle, MempoolInclusionStatus,
|
|
771
|
+
) -> tuple[list[FullBlock], SpendBundle, MempoolInclusionStatus, Err | None]:
|
|
776
772
|
reward_ph = wallet_a.get_new_puzzlehash()
|
|
777
773
|
full_node_1, server_1, bt = node_server_bt
|
|
778
774
|
blocks = await full_node_1.get_all_full_blocks()
|
|
@@ -782,7 +778,6 @@ class TestMempoolManager:
|
|
|
782
778
|
block_list_input=blocks,
|
|
783
779
|
guarantee_transaction_block=True,
|
|
784
780
|
farmer_reward_puzzle_hash=reward_ph,
|
|
785
|
-
pool_reward_puzzle_hash=reward_ph,
|
|
786
781
|
time_per_block=10,
|
|
787
782
|
)
|
|
788
783
|
_, dummy_node_id = await add_dummy_connection(server_1, bt.config["self_hostname"], 100)
|
|
@@ -797,8 +792,8 @@ class TestMempoolManager:
|
|
|
797
792
|
|
|
798
793
|
await time_out_assert(60, node_height_at_least, True, full_node_1, start_height + 3)
|
|
799
794
|
|
|
800
|
-
coin_1 = blocks[-2]
|
|
801
|
-
coin_2 = blocks[-1]
|
|
795
|
+
coin_1 = find_reward_coin(blocks[-2], reward_ph)
|
|
796
|
+
coin_2 = find_reward_coin(blocks[-1], reward_ph)
|
|
802
797
|
|
|
803
798
|
bundle = test_fun(coin_1, coin_2)
|
|
804
799
|
|
|
@@ -1256,7 +1251,7 @@ class TestMempoolManager:
|
|
|
1256
1251
|
self,
|
|
1257
1252
|
assert_garbage: bool,
|
|
1258
1253
|
announce_garbage: bool,
|
|
1259
|
-
expected:
|
|
1254
|
+
expected: Err | None,
|
|
1260
1255
|
expected_included: MempoolInclusionStatus,
|
|
1261
1256
|
one_node_one_block: tuple[FullNodeSimulator, ChiaServer, BlockTools],
|
|
1262
1257
|
wallet_a: WalletTool,
|
|
@@ -1469,7 +1464,7 @@ class TestMempoolManager:
|
|
|
1469
1464
|
self,
|
|
1470
1465
|
assert_garbage: bool,
|
|
1471
1466
|
announce_garbage: bool,
|
|
1472
|
-
expected:
|
|
1467
|
+
expected: Err | None,
|
|
1473
1468
|
expected_included: MempoolInclusionStatus,
|
|
1474
1469
|
one_node_one_block: tuple[FullNodeSimulator, ChiaServer, BlockTools],
|
|
1475
1470
|
wallet_a: WalletTool,
|
|
@@ -1741,7 +1736,6 @@ class TestMempoolManager:
|
|
|
1741
1736
|
block_list_input=blocks,
|
|
1742
1737
|
guarantee_transaction_block=True,
|
|
1743
1738
|
farmer_reward_puzzle_hash=reward_ph,
|
|
1744
|
-
pool_reward_puzzle_hash=reward_ph,
|
|
1745
1739
|
)
|
|
1746
1740
|
|
|
1747
1741
|
peer = await connect_and_get_peer(server_1, server_2, bt.config["self_hostname"])
|
|
@@ -1757,7 +1751,7 @@ class TestMempoolManager:
|
|
|
1757
1751
|
|
|
1758
1752
|
fee = 9
|
|
1759
1753
|
|
|
1760
|
-
coin_1 = blocks[-2]
|
|
1754
|
+
coin_1 = find_reward_coin(blocks[-2], reward_ph)
|
|
1761
1755
|
coin_2 = None
|
|
1762
1756
|
for coin in blocks[-1].get_included_reward_coins():
|
|
1763
1757
|
if coin.amount == coin_1.amount:
|
|
@@ -1801,13 +1795,12 @@ class TestMempoolManager:
|
|
|
1801
1795
|
block_list_input=blocks,
|
|
1802
1796
|
guarantee_transaction_block=True,
|
|
1803
1797
|
farmer_reward_puzzle_hash=reward_ph,
|
|
1804
|
-
pool_reward_puzzle_hash=reward_ph,
|
|
1805
1798
|
)
|
|
1806
1799
|
|
|
1807
1800
|
await add_blocks_in_batches(blocks, full_node_1.full_node)
|
|
1808
1801
|
|
|
1809
1802
|
await time_out_assert(60, node_height_at_least, True, full_node_1, start_height + 3)
|
|
1810
|
-
# coin = blocks[-1]
|
|
1803
|
+
# coin = find_reward_coin(blocks[-1], reward_ph)
|
|
1811
1804
|
# spend_bundle1 = generate_test_spend_bundle(wallet_a, coin)
|
|
1812
1805
|
coin = await next_block(full_node_1, wallet_a, bt)
|
|
1813
1806
|
spend_bundle1 = generate_test_spend_bundle(wallet_a, coin)
|
|
@@ -1849,7 +1842,6 @@ class TestMempoolManager:
|
|
|
1849
1842
|
block_list_input=blocks,
|
|
1850
1843
|
guarantee_transaction_block=True,
|
|
1851
1844
|
farmer_reward_puzzle_hash=reward_ph,
|
|
1852
|
-
pool_reward_puzzle_hash=reward_ph,
|
|
1853
1845
|
)
|
|
1854
1846
|
|
|
1855
1847
|
await add_blocks_in_batches(blocks, full_node_1.full_node)
|
|
@@ -2530,7 +2522,7 @@ class TestGeneratorConditions:
|
|
|
2530
2522
|
],
|
|
2531
2523
|
)
|
|
2532
2524
|
def test_softfork_condition(
|
|
2533
|
-
self, mempool: bool, condition: str, expect_error:
|
|
2525
|
+
self, mempool: bool, condition: str, expect_error: int | None, softfork_height: uint32
|
|
2534
2526
|
) -> None:
|
|
2535
2527
|
npc_result = generator_condition_tester(condition, mempool_mode=mempool, height=softfork_height)
|
|
2536
2528
|
print(npc_result)
|
|
@@ -2550,7 +2542,7 @@ class TestGeneratorConditions:
|
|
|
2550
2542
|
],
|
|
2551
2543
|
)
|
|
2552
2544
|
def test_message_condition(
|
|
2553
|
-
self, mempool: bool, condition: str, expect_error:
|
|
2545
|
+
self, mempool: bool, condition: str, expect_error: int | None, softfork_height: uint32
|
|
2554
2546
|
) -> None:
|
|
2555
2547
|
npc_result = generator_condition_tester(condition, mempool_mode=mempool, height=softfork_height)
|
|
2556
2548
|
print(npc_result)
|
|
@@ -2854,14 +2846,14 @@ class TestMaliciousGenerators:
|
|
|
2854
2846
|
5,
|
|
2855
2847
|
guarantee_transaction_block=True,
|
|
2856
2848
|
farmer_reward_puzzle_hash=reward_ph,
|
|
2857
|
-
pool_reward_puzzle_hash=reward_ph,
|
|
2858
2849
|
)
|
|
2859
2850
|
|
|
2860
2851
|
await add_blocks_in_batches(blocks, full_node_1.full_node)
|
|
2861
2852
|
|
|
2862
2853
|
await time_out_assert(60, node_height_at_least, True, full_node_1, blocks[-1].height)
|
|
2863
2854
|
|
|
2864
|
-
|
|
2855
|
+
coin_1 = find_reward_coin(blocks[-1], reward_ph)
|
|
2856
|
+
spend_bundle = generate_test_spend_bundle(wallet_a, coin_1)
|
|
2865
2857
|
cs = spend_bundle.coin_spends[0]
|
|
2866
2858
|
c = cs.coin
|
|
2867
2859
|
coin_0 = Coin(c.parent_coin_info, bytes32([1] * 32), c.amount)
|
|
@@ -2920,7 +2912,7 @@ def test_items_by_feerate(items: list[MempoolItem], expected: list[Coin]) -> Non
|
|
|
2920
2912
|
|
|
2921
2913
|
assert len(ordered_items) == len(expected)
|
|
2922
2914
|
|
|
2923
|
-
last_fpc:
|
|
2915
|
+
last_fpc: float | None = None
|
|
2924
2916
|
for mi, expected_coin in zip(ordered_items, expected):
|
|
2925
2917
|
assert len(mi.bundle_coin_spends) == 1
|
|
2926
2918
|
assert next(iter(mi.bundle_coin_spends.values())).coin_spend.coin == expected_coin
|
|
@@ -3413,7 +3405,7 @@ async def test_lineage_cache(seeded_random: random.Random) -> None:
|
|
|
3413
3405
|
bytes32.random(seeded_random), bytes32.random(seeded_random), bytes32.random(seeded_random)
|
|
3414
3406
|
)
|
|
3415
3407
|
|
|
3416
|
-
async def callback1(ph: bytes32) ->
|
|
3408
|
+
async def callback1(ph: bytes32) -> UnspentLineageInfo | None:
|
|
3417
3409
|
nonlocal called
|
|
3418
3410
|
called += 1
|
|
3419
3411
|
return info1
|
|
@@ -3432,7 +3424,7 @@ async def test_lineage_cache(seeded_random: random.Random) -> None:
|
|
|
3432
3424
|
|
|
3433
3425
|
called = 0
|
|
3434
3426
|
|
|
3435
|
-
async def callback_none(ph: bytes32) ->
|
|
3427
|
+
async def callback_none(ph: bytes32) -> UnspentLineageInfo | None:
|
|
3436
3428
|
nonlocal called
|
|
3437
3429
|
called += 1
|
|
3438
3430
|
return None
|
|
@@ -62,43 +62,43 @@ async def test_basics() -> None:
|
|
|
62
62
|
async def test_fee_increase() -> None:
|
|
63
63
|
async with DBConnection(db_version=2) as db_wrapper:
|
|
64
64
|
coin_store = await CoinStore.create(db_wrapper)
|
|
65
|
-
|
|
65
|
+
async with MempoolManager.managed(
|
|
66
66
|
coin_store.get_coin_records, coin_store.get_unspent_lineage_info_for_puzzle_hash, test_constants
|
|
67
|
-
)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
67
|
+
) as mempool_manager:
|
|
68
|
+
assert test_constants.MAX_BLOCK_COST_CLVM == mempool_manager.constants.MAX_BLOCK_COST_CLVM
|
|
69
|
+
btc_fee_estimator: BitcoinFeeEstimator = mempool_manager.mempool.fee_estimator # type: ignore
|
|
70
|
+
fee_tracker = btc_fee_estimator.get_tracker()
|
|
71
|
+
estimator = SmartFeeEstimator(fee_tracker, uint64(test_constants.MAX_BLOCK_COST_CLVM))
|
|
72
|
+
random = Random(x=1)
|
|
73
|
+
for i in range(300, 700):
|
|
74
|
+
items = []
|
|
75
|
+
for _ in range(20):
|
|
76
|
+
fee = uint64(0)
|
|
77
|
+
included_height = uint32(random.randint(i - 60, i - 1))
|
|
78
|
+
cost = uint64(5000000)
|
|
79
|
+
mempool_item = MempoolItemInfo(
|
|
80
|
+
cost,
|
|
81
|
+
fee,
|
|
82
|
+
included_height,
|
|
83
|
+
)
|
|
84
|
+
items.append(mempool_item)
|
|
85
|
+
|
|
86
|
+
fee_tracker.process_block(uint32(i), items)
|
|
87
|
+
|
|
88
|
+
short, med, long = fee_tracker.estimate_fees()
|
|
89
|
+
mempool_info = mempool_manager.mempool.fee_estimator.get_mempool_info()
|
|
90
|
+
|
|
91
|
+
result = estimator.get_estimates(mempool_info, ignore_mempool=True)
|
|
92
|
+
|
|
93
|
+
assert short.median == -1
|
|
94
|
+
assert med.median == -1
|
|
95
|
+
assert long.median == 0.0
|
|
96
|
+
|
|
97
|
+
assert result.error is None
|
|
98
|
+
short_estimate = result.estimates[0].estimated_fee_rate
|
|
99
|
+
med_estimate = result.estimates[1].estimated_fee_rate
|
|
100
|
+
long_estimate = result.estimates[2].estimated_fee_rate
|
|
101
|
+
|
|
102
|
+
assert short_estimate.mojos_per_clvm_cost == uint64(fee_tracker.buckets[3] / 1000)
|
|
103
|
+
assert med_estimate.mojos_per_clvm_cost == uint64(fee_tracker.buckets[3] / 1000)
|
|
104
|
+
assert long_estimate.mojos_per_clvm_cost == uint64(0)
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import datetime
|
|
4
|
-
from typing import Union
|
|
5
4
|
|
|
6
5
|
import pytest
|
|
7
6
|
from chia_rs.sized_ints import uint64
|
|
@@ -20,9 +19,7 @@ from chia.wallet.wallet import Wallet
|
|
|
20
19
|
|
|
21
20
|
@pytest.mark.anyio
|
|
22
21
|
async def test_protocol_messages(
|
|
23
|
-
simulator_and_wallet: tuple[
|
|
24
|
-
list[Union[FullNodeAPI, FullNodeSimulator]], list[tuple[Wallet, ChiaServer]], BlockTools
|
|
25
|
-
],
|
|
22
|
+
simulator_and_wallet: tuple[list[FullNodeAPI | FullNodeSimulator], list[tuple[Wallet, ChiaServer]], BlockTools],
|
|
26
23
|
) -> None:
|
|
27
24
|
full_nodes, _wallets, bt = simulator_and_wallet
|
|
28
25
|
a_wallet = bt.get_pool_wallet_tool()
|
|
@@ -31,10 +28,9 @@ async def test_protocol_messages(
|
|
|
31
28
|
35,
|
|
32
29
|
guarantee_transaction_block=True,
|
|
33
30
|
farmer_reward_puzzle_hash=reward_ph,
|
|
34
|
-
pool_reward_puzzle_hash=reward_ph,
|
|
35
31
|
)
|
|
36
32
|
|
|
37
|
-
full_node_sim:
|
|
33
|
+
full_node_sim: FullNodeAPI | FullNodeSimulator = full_nodes[0]
|
|
38
34
|
|
|
39
35
|
for block in blocks:
|
|
40
36
|
await full_node_sim.full_node.add_block(block)
|