chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__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/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- 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.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import contextlib
|
|
3
4
|
import json
|
|
4
5
|
import operator
|
|
6
|
+
import unittest
|
|
7
|
+
from collections.abc import Iterator
|
|
5
8
|
from dataclasses import asdict, dataclass, field
|
|
6
|
-
from typing import TYPE_CHECKING,
|
|
9
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Union, cast
|
|
7
10
|
|
|
8
11
|
from chia._tests.environments.common import ServiceEnvironment
|
|
12
|
+
from chia.cmds.cmd_helpers import NeedsTXConfig, NeedsWalletRPC, TransactionEndpoint, TransactionsOut, WalletClientInfo
|
|
13
|
+
from chia.cmds.param_types import CliAmount, cli_amount_none
|
|
9
14
|
from chia.rpc.full_node_rpc_client import FullNodeRpcClient
|
|
10
15
|
from chia.rpc.rpc_server import RpcServer
|
|
11
16
|
from chia.rpc.wallet_rpc_api import WalletRpcApi
|
|
@@ -14,9 +19,8 @@ from chia.server.server import ChiaServer
|
|
|
14
19
|
from chia.server.start_service import Service
|
|
15
20
|
from chia.simulator.full_node_simulator import FullNodeSimulator
|
|
16
21
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
17
|
-
from chia.util.ints import uint32
|
|
18
|
-
from chia.wallet.
|
|
19
|
-
from chia.wallet.transaction_record import TransactionRecord
|
|
22
|
+
from chia.util.ints import uint32, uint64
|
|
23
|
+
from chia.wallet.transaction_record import LightTransactionRecord
|
|
20
24
|
from chia.wallet.util.transaction_type import CLAWBACK_INCOMING_TRANSACTION_TYPES
|
|
21
25
|
from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG, TXConfig
|
|
22
26
|
from chia.wallet.wallet import Wallet
|
|
@@ -24,13 +28,29 @@ from chia.wallet.wallet_node import Balance, WalletNode
|
|
|
24
28
|
from chia.wallet.wallet_node_api import WalletNodeAPI
|
|
25
29
|
from chia.wallet.wallet_state_manager import WalletStateManager
|
|
26
30
|
|
|
31
|
+
STANDARD_TX_ENDPOINT_ARGS: dict[str, Any] = TransactionEndpoint(
|
|
32
|
+
rpc_info=NeedsWalletRPC(client_info=None, wallet_rpc_port=None, fingerprint=None),
|
|
33
|
+
tx_config_loader=NeedsTXConfig(
|
|
34
|
+
min_coin_amount=cli_amount_none,
|
|
35
|
+
max_coin_amount=cli_amount_none,
|
|
36
|
+
coins_to_exclude=(),
|
|
37
|
+
amounts_to_exclude=(),
|
|
38
|
+
reuse=None,
|
|
39
|
+
),
|
|
40
|
+
transaction_writer=TransactionsOut(transaction_file_out=None),
|
|
41
|
+
fee=uint64(0),
|
|
42
|
+
push=True,
|
|
43
|
+
valid_at=None,
|
|
44
|
+
expires_at=None,
|
|
45
|
+
).__dict__
|
|
46
|
+
|
|
27
47
|
OPP_DICT = {"<": operator.lt, ">": operator.gt, "<=": operator.le, ">=": operator.ge}
|
|
28
48
|
|
|
29
49
|
|
|
30
50
|
class BalanceCheckingError(Exception):
|
|
31
|
-
errors:
|
|
51
|
+
errors: dict[Union[int, str], list[str]]
|
|
32
52
|
|
|
33
|
-
def __init__(self, errors:
|
|
53
|
+
def __init__(self, errors: dict[Union[int, str], list[str]]) -> None:
|
|
34
54
|
self.errors = errors
|
|
35
55
|
|
|
36
56
|
def __repr__(self) -> str:
|
|
@@ -47,10 +67,10 @@ class WalletState:
|
|
|
47
67
|
|
|
48
68
|
@dataclass
|
|
49
69
|
class WalletStateTransition:
|
|
50
|
-
pre_block_balance_updates:
|
|
51
|
-
post_block_balance_updates:
|
|
52
|
-
pre_block_additional_balance_info:
|
|
53
|
-
post_block_additional_balance_info:
|
|
70
|
+
pre_block_balance_updates: dict[Union[int, str], dict[str, int]] = field(default_factory=dict)
|
|
71
|
+
post_block_balance_updates: dict[Union[int, str], dict[str, int]] = field(default_factory=dict)
|
|
72
|
+
pre_block_additional_balance_info: dict[Union[int, str], dict[str, int]] = field(default_factory=dict)
|
|
73
|
+
post_block_additional_balance_info: dict[Union[int, str], dict[str, int]] = field(default_factory=dict)
|
|
54
74
|
|
|
55
75
|
|
|
56
76
|
@dataclass
|
|
@@ -60,14 +80,14 @@ class WalletEnvironment:
|
|
|
60
80
|
"WalletEnvironment", None
|
|
61
81
|
)
|
|
62
82
|
|
|
63
|
-
__match_args__: ClassVar[
|
|
83
|
+
__match_args__: ClassVar[tuple[str, ...]] = ()
|
|
64
84
|
|
|
65
85
|
service: Service[WalletNode, WalletNodeAPI, WalletRpcApi]
|
|
66
86
|
# TODO: maybe put this in the protocol?
|
|
67
87
|
rpc_client: WalletRpcClient
|
|
68
88
|
# TODO: added the default, but should think through implementing it etc. `.create()`?
|
|
69
|
-
wallet_states:
|
|
70
|
-
wallet_aliases:
|
|
89
|
+
wallet_states: dict[uint32, WalletState] = field(default_factory=dict)
|
|
90
|
+
wallet_aliases: dict[str, int] = field(default_factory=dict)
|
|
71
91
|
|
|
72
92
|
@property
|
|
73
93
|
def node(self) -> WalletNode:
|
|
@@ -113,31 +133,31 @@ class WalletEnvironment:
|
|
|
113
133
|
"""
|
|
114
134
|
This function turns a wallet id into an alias if one is available or the same wallet id if one is not.
|
|
115
135
|
"""
|
|
116
|
-
inverted_wallet_aliases:
|
|
136
|
+
inverted_wallet_aliases: dict[int, str] = {v: k for k, v in self.wallet_aliases.items()}
|
|
117
137
|
if wallet_id in inverted_wallet_aliases:
|
|
118
138
|
return inverted_wallet_aliases[wallet_id]
|
|
119
139
|
else:
|
|
120
140
|
return wallet_id
|
|
121
141
|
|
|
122
|
-
async def check_balances(self, additional_balance_info:
|
|
142
|
+
async def check_balances(self, additional_balance_info: dict[Union[int, str], dict[str, int]] = {}) -> None:
|
|
123
143
|
"""
|
|
124
144
|
This function checks the internal representation of what the balances should be against the balances that the
|
|
125
145
|
wallet actually returns via the RPC.
|
|
126
146
|
|
|
127
147
|
Likely this should be called as part of WalletTestFramework.process_pending_states instead of directly.
|
|
128
148
|
"""
|
|
129
|
-
dealiased_additional_balance_info:
|
|
149
|
+
dealiased_additional_balance_info: dict[uint32, dict[str, int]] = {
|
|
130
150
|
self.dealias_wallet_id(k): v for k, v in additional_balance_info.items()
|
|
131
151
|
}
|
|
132
|
-
errors:
|
|
152
|
+
errors: dict[Union[int, str], list[str]] = {}
|
|
133
153
|
for wallet_id in self.wallet_state_manager.wallets:
|
|
134
154
|
if wallet_id not in self.wallet_states:
|
|
135
155
|
raise KeyError(f"No wallet state for wallet id {wallet_id} (alias: {self.alias_wallet_id(wallet_id)})")
|
|
136
156
|
wallet_state: WalletState = self.wallet_states[wallet_id]
|
|
137
|
-
wallet_errors:
|
|
157
|
+
wallet_errors: list[str] = []
|
|
138
158
|
|
|
139
159
|
assert self.node.logged_in_fingerprint is not None
|
|
140
|
-
expected_result:
|
|
160
|
+
expected_result: dict[str, int] = {
|
|
141
161
|
**wallet_state.balance.to_json_dict(),
|
|
142
162
|
"wallet_id": wallet_id,
|
|
143
163
|
"wallet_type": self.wallet_state_manager.wallets[wallet_id].type().value,
|
|
@@ -148,7 +168,7 @@ class WalletEnvironment:
|
|
|
148
168
|
else {}
|
|
149
169
|
),
|
|
150
170
|
}
|
|
151
|
-
balance_response:
|
|
171
|
+
balance_response: dict[str, int] = await self.rpc_client.get_wallet_balance(wallet_id)
|
|
152
172
|
|
|
153
173
|
if not expected_result.items() <= balance_response.items():
|
|
154
174
|
for key, value in expected_result.items():
|
|
@@ -165,7 +185,7 @@ class WalletEnvironment:
|
|
|
165
185
|
if errors != {}:
|
|
166
186
|
raise BalanceCheckingError(errors)
|
|
167
187
|
|
|
168
|
-
async def change_balances(self, update_dictionary:
|
|
188
|
+
async def change_balances(self, update_dictionary: dict[Union[int, str], dict[str, int]]) -> None:
|
|
169
189
|
"""
|
|
170
190
|
This method changes the internal representation of what the wallet balances should be. This is probably
|
|
171
191
|
necessary to call before check_balances as most wallet operations will result in a balance change that causes
|
|
@@ -193,10 +213,10 @@ class WalletEnvironment:
|
|
|
193
213
|
for wallet_id_or_alias, kwargs in update_dictionary.items():
|
|
194
214
|
wallet_id: uint32 = self.dealias_wallet_id(wallet_id_or_alias)
|
|
195
215
|
|
|
196
|
-
new_values:
|
|
216
|
+
new_values: dict[str, int] = {}
|
|
197
217
|
existing_values: Balance = await self.node.get_balance(wallet_id)
|
|
198
|
-
if "init"
|
|
199
|
-
new_values = {k: v for k, v in kwargs.items() if k not in
|
|
218
|
+
if kwargs.get("init", False):
|
|
219
|
+
new_values = {k: v for k, v in kwargs.items() if k not in {"set_remainder", "init"}}
|
|
200
220
|
elif wallet_id not in self.wallet_states:
|
|
201
221
|
raise ValueError(
|
|
202
222
|
f"Wallet id {wallet_id} (alias: {self.alias_wallet_id(wallet_id)}) does not have a current state. "
|
|
@@ -227,17 +247,13 @@ class WalletEnvironment:
|
|
|
227
247
|
**self.wallet_states,
|
|
228
248
|
wallet_id: WalletState(
|
|
229
249
|
**{
|
|
230
|
-
**({} if "init"
|
|
250
|
+
**({} if kwargs.get("init", False) else asdict(self.wallet_states[wallet_id])),
|
|
231
251
|
"balance": Balance(
|
|
232
252
|
**{
|
|
233
253
|
**(
|
|
234
254
|
asdict(existing_values)
|
|
235
|
-
if "set_remainder"
|
|
236
|
-
else (
|
|
237
|
-
{}
|
|
238
|
-
if "init" in kwargs and kwargs["init"]
|
|
239
|
-
else asdict(self.wallet_states[wallet_id].balance)
|
|
240
|
-
)
|
|
255
|
+
if kwargs.get("set_remainder", False)
|
|
256
|
+
else ({} if kwargs.get("init") else asdict(self.wallet_states[wallet_id].balance))
|
|
241
257
|
),
|
|
242
258
|
**new_values,
|
|
243
259
|
}
|
|
@@ -247,10 +263,10 @@ class WalletEnvironment:
|
|
|
247
263
|
}
|
|
248
264
|
|
|
249
265
|
async def wait_for_transactions_to_settle(
|
|
250
|
-
self, full_node_api: FullNodeSimulator, _exclude_from_mempool_check:
|
|
251
|
-
) ->
|
|
266
|
+
self, full_node_api: FullNodeSimulator, _exclude_from_mempool_check: list[bytes32] = []
|
|
267
|
+
) -> list[LightTransactionRecord]:
|
|
252
268
|
# Gather all pending transactions
|
|
253
|
-
pending_txs:
|
|
269
|
+
pending_txs: list[LightTransactionRecord] = await self.wallet_state_manager.tx_store.get_all_unconfirmed()
|
|
254
270
|
# Filter clawback txs
|
|
255
271
|
pending_txs = [
|
|
256
272
|
tx
|
|
@@ -264,16 +280,62 @@ class WalletEnvironment:
|
|
|
264
280
|
return pending_txs
|
|
265
281
|
|
|
266
282
|
|
|
283
|
+
class NewPuzzleHashError(Exception):
|
|
284
|
+
pass
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
def catch_puzzle_hash_errors(func: Any) -> Any:
|
|
288
|
+
@contextlib.asynccontextmanager
|
|
289
|
+
async def catching_puzhash_errors(self: WalletStateManager, *args: Any, **kwargs: Any) -> Any:
|
|
290
|
+
try:
|
|
291
|
+
async with func(self, *args, **kwargs) as action_scope:
|
|
292
|
+
yield action_scope
|
|
293
|
+
except NewPuzzleHashError:
|
|
294
|
+
pass
|
|
295
|
+
|
|
296
|
+
return catching_puzhash_errors
|
|
297
|
+
|
|
298
|
+
|
|
267
299
|
@dataclass
|
|
268
300
|
class WalletTestFramework:
|
|
269
301
|
full_node: FullNodeSimulator
|
|
270
302
|
full_node_rpc_client: FullNodeRpcClient
|
|
271
303
|
trusted_full_node: bool
|
|
272
|
-
environments:
|
|
304
|
+
environments: list[WalletEnvironment]
|
|
273
305
|
tx_config: TXConfig = DEFAULT_TX_CONFIG
|
|
274
306
|
|
|
307
|
+
def cmd_tx_endpoint_args(self, env: WalletEnvironment) -> dict[str, Any]:
|
|
308
|
+
return {
|
|
309
|
+
**STANDARD_TX_ENDPOINT_ARGS,
|
|
310
|
+
"rpc_info": NeedsWalletRPC(
|
|
311
|
+
client_info=WalletClientInfo(
|
|
312
|
+
env.rpc_client,
|
|
313
|
+
env.wallet_state_manager.root_pubkey.get_fingerprint(),
|
|
314
|
+
env.wallet_state_manager.config,
|
|
315
|
+
)
|
|
316
|
+
),
|
|
317
|
+
"tx_config_loader": NeedsTXConfig(
|
|
318
|
+
min_coin_amount=CliAmount(amount=self.tx_config.min_coin_amount, mojos=True),
|
|
319
|
+
max_coin_amount=CliAmount(amount=self.tx_config.max_coin_amount, mojos=True),
|
|
320
|
+
coins_to_exclude=tuple(self.tx_config.excluded_coin_ids),
|
|
321
|
+
amounts_to_exclude=tuple(
|
|
322
|
+
CliAmount(amount=amt, mojos=True) for amt in self.tx_config.excluded_coin_amounts
|
|
323
|
+
),
|
|
324
|
+
reuse=self.tx_config.reuse_puzhash,
|
|
325
|
+
),
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
@staticmethod
|
|
329
|
+
@contextlib.contextmanager
|
|
330
|
+
def new_puzzle_hashes_allowed() -> Iterator[None]:
|
|
331
|
+
with unittest.mock.patch(
|
|
332
|
+
"chia.wallet.wallet_state_manager.WalletStateManager.new_action_scope",
|
|
333
|
+
catch_puzzle_hash_errors(WalletStateManager.new_action_scope),
|
|
334
|
+
):
|
|
335
|
+
yield
|
|
336
|
+
|
|
275
337
|
async def process_pending_states(
|
|
276
|
-
self, state_transitions:
|
|
338
|
+
self, state_transitions: list[WalletStateTransition], invalid_transactions: list[bytes32] = []
|
|
277
339
|
) -> None:
|
|
278
340
|
"""
|
|
279
341
|
This is the main entry point for processing state in wallet tests. It does the following things:
|
|
@@ -288,21 +350,20 @@ class WalletTestFramework:
|
|
|
288
350
|
"""
|
|
289
351
|
# Take note of the number of puzzle hashes if we're supposed to be reusing
|
|
290
352
|
if self.tx_config.reuse_puzhash:
|
|
291
|
-
puzzle_hash_indexes:
|
|
353
|
+
puzzle_hash_indexes: list[dict[uint32, int]] = []
|
|
292
354
|
for env in self.environments:
|
|
293
|
-
ph_indexes:
|
|
355
|
+
ph_indexes: dict[uint32, int] = {}
|
|
294
356
|
for wallet_id in env.wallet_state_manager.wallets:
|
|
295
|
-
ph_indexes[wallet_id] = (
|
|
296
|
-
await env.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(wallet_id)
|
|
297
|
-
)
|
|
357
|
+
ph_indexes[wallet_id] = await env.wallet_state_manager.puzzle_store.get_unused_count(wallet_id)
|
|
298
358
|
puzzle_hash_indexes.append(ph_indexes)
|
|
299
359
|
|
|
300
|
-
pending_txs:
|
|
301
|
-
|
|
360
|
+
pending_txs: list[list[LightTransactionRecord]] = []
|
|
361
|
+
peak = self.full_node.full_node.blockchain.get_peak_height()
|
|
362
|
+
assert peak is not None
|
|
302
363
|
# Check balances prior to block
|
|
303
364
|
try:
|
|
304
365
|
for i, env in enumerate(self.environments):
|
|
305
|
-
await self.full_node.wait_for_wallet_synced(wallet_node=env.node, timeout=20)
|
|
366
|
+
await self.full_node.wait_for_wallet_synced(wallet_node=env.node, timeout=20, peak_height=peak)
|
|
306
367
|
try:
|
|
307
368
|
pending_txs.append(
|
|
308
369
|
await env.wait_for_transactions_to_settle(
|
|
@@ -322,8 +383,6 @@ class WalletTestFramework:
|
|
|
322
383
|
raise ValueError("Error before block was farmed")
|
|
323
384
|
|
|
324
385
|
# Farm block
|
|
325
|
-
peak = self.full_node.full_node.blockchain.get_peak_height()
|
|
326
|
-
assert peak is not None
|
|
327
386
|
await self.full_node.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
|
|
328
387
|
|
|
329
388
|
# Check balances after block
|
|
@@ -354,7 +413,9 @@ class WalletTestFramework:
|
|
|
354
413
|
try:
|
|
355
414
|
await self.full_node.check_transactions_confirmed(env.wallet_state_manager, txs)
|
|
356
415
|
except TimeoutError: # pragma: no cover
|
|
357
|
-
unconfirmed:
|
|
416
|
+
unconfirmed: list[
|
|
417
|
+
LightTransactionRecord
|
|
418
|
+
] = await env.wallet_state_manager.tx_store.get_all_unconfirmed()
|
|
358
419
|
raise TimeoutError(
|
|
359
420
|
f"ENV-{i} TXs not confirmed: {[tx.to_json_dict() for tx in unconfirmed if tx in txs]}"
|
|
360
421
|
)
|
|
@@ -364,5 +425,5 @@ class WalletTestFramework:
|
|
|
364
425
|
for env, ph_indexes_before in zip(self.environments, puzzle_hash_indexes):
|
|
365
426
|
for wallet_id, ph_index in zip(env.wallet_state_manager.wallets, ph_indexes_before):
|
|
366
427
|
assert ph_indexes_before[wallet_id] == (
|
|
367
|
-
await env.wallet_state_manager.puzzle_store.
|
|
428
|
+
await env.wallet_state_manager.puzzle_store.get_unused_count(wallet_id)
|
|
368
429
|
)
|
|
@@ -5,7 +5,7 @@ import logging
|
|
|
5
5
|
from dataclasses import dataclass
|
|
6
6
|
from time import time
|
|
7
7
|
from types import TracebackType
|
|
8
|
-
from typing import Any,
|
|
8
|
+
from typing import Any, Optional, Union, cast
|
|
9
9
|
from unittest.mock import ANY
|
|
10
10
|
|
|
11
11
|
import pytest
|
|
@@ -39,23 +39,23 @@ log = logging.getLogger(__name__)
|
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
class StripOldEntriesCase:
|
|
42
|
-
pairs:
|
|
42
|
+
pairs: list[tuple[float, int]]
|
|
43
43
|
before: float
|
|
44
|
-
expected_result:
|
|
44
|
+
expected_result: list[tuple[float, int]]
|
|
45
45
|
|
|
46
|
-
def __init__(self, pairs:
|
|
46
|
+
def __init__(self, pairs: list[tuple[float, int]], before: float, expected_result: list[tuple[float, int]]):
|
|
47
47
|
self.pairs = pairs
|
|
48
48
|
self.before = before
|
|
49
49
|
self.expected_result = expected_result
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
class IncrementPoolStatsCase:
|
|
53
|
-
pool_states:
|
|
53
|
+
pool_states: dict[bytes32, Any]
|
|
54
54
|
p2_singleton_puzzle_hash: bytes32
|
|
55
55
|
name: str
|
|
56
56
|
current_time: float
|
|
57
57
|
count: int
|
|
58
|
-
value: Optional[Union[int,
|
|
58
|
+
value: Optional[Union[int, dict[str, Any]]]
|
|
59
59
|
expected_result: Any
|
|
60
60
|
|
|
61
61
|
def __init__(
|
|
@@ -64,7 +64,7 @@ class IncrementPoolStatsCase:
|
|
|
64
64
|
name: str,
|
|
65
65
|
current_time: float,
|
|
66
66
|
count: int,
|
|
67
|
-
value: Optional[Union[int,
|
|
67
|
+
value: Optional[Union[int, dict[str, Any]]],
|
|
68
68
|
expected_result: Any,
|
|
69
69
|
):
|
|
70
70
|
prepared_p2_singleton_puzzle_hash = std_hash(b"11223344")
|
|
@@ -142,10 +142,10 @@ class NewProofOfSpaceCase:
|
|
|
142
142
|
pool_config: PoolWalletConfig
|
|
143
143
|
pool_difficulty: Optional[uint64]
|
|
144
144
|
authentication_token_timeout: Optional[uint8]
|
|
145
|
-
farmer_private_keys:
|
|
146
|
-
authentication_keys:
|
|
145
|
+
farmer_private_keys: list[PrivateKey]
|
|
146
|
+
authentication_keys: dict[bytes32, PrivateKey]
|
|
147
147
|
use_invalid_peer_response: bool
|
|
148
|
-
expected_pool_state:
|
|
148
|
+
expected_pool_state: dict[str, Any]
|
|
149
149
|
marks: Marks = ()
|
|
150
150
|
|
|
151
151
|
# This creates a test case whose proof of space passes plot filter and quality check
|
|
@@ -159,7 +159,7 @@ class NewProofOfSpaceCase:
|
|
|
159
159
|
authentication_token_timeout: Optional[uint8],
|
|
160
160
|
use_invalid_peer_response: bool,
|
|
161
161
|
has_valid_authentication_keys: bool,
|
|
162
|
-
expected_pool_stats:
|
|
162
|
+
expected_pool_stats: dict[str, Any],
|
|
163
163
|
) -> NewProofOfSpaceCase:
|
|
164
164
|
p2_singleton_puzzle_hash = bytes32.fromhex("302e05a1e6af431c22043ae2a9a8f71148c955c372697cb8ab348160976283df")
|
|
165
165
|
pool_config = PoolWalletConfig(
|
|
@@ -348,7 +348,7 @@ def test_increment_pool_stats(case: IncrementPoolStatsCase) -> None:
|
|
|
348
348
|
expected_pool_stats={
|
|
349
349
|
"points_found_since_start": 0,
|
|
350
350
|
# Original item format here is (timestamp, value) but we'll ignore timestamp part
|
|
351
|
-
# so every `xxx_24h` item in this dict will be
|
|
351
|
+
# so every `xxx_24h` item in this dict will be list[Any].
|
|
352
352
|
"points_found_24h": [],
|
|
353
353
|
"points_acknowledged_since_start": 0,
|
|
354
354
|
"points_acknowledged_24h": [],
|
|
@@ -380,7 +380,7 @@ def test_increment_pool_stats(case: IncrementPoolStatsCase) -> None:
|
|
|
380
380
|
expected_pool_stats={
|
|
381
381
|
"points_found_since_start": 0,
|
|
382
382
|
# Original item format here is (timestamp, value) but we'll ignore timestamp part
|
|
383
|
-
# so every `xxx_24h` item in this dict will be
|
|
383
|
+
# so every `xxx_24h` item in this dict will be list[Any].
|
|
384
384
|
"points_found_24h": [],
|
|
385
385
|
"points_acknowledged_since_start": 0,
|
|
386
386
|
"points_acknowledged_24h": [],
|
|
@@ -411,7 +411,7 @@ def test_increment_pool_stats(case: IncrementPoolStatsCase) -> None:
|
|
|
411
411
|
expected_pool_stats={
|
|
412
412
|
"points_found_since_start": 0,
|
|
413
413
|
# Original item format here is (timestamp, value) but we'll ignore timestamp part
|
|
414
|
-
# so every `xxx_24h` item in this dict will be
|
|
414
|
+
# so every `xxx_24h` item in this dict will be list[Any].
|
|
415
415
|
"points_found_24h": [],
|
|
416
416
|
"points_acknowledged_since_start": 0,
|
|
417
417
|
"points_acknowledged_24h": [],
|
|
@@ -442,7 +442,7 @@ def test_increment_pool_stats(case: IncrementPoolStatsCase) -> None:
|
|
|
442
442
|
expected_pool_stats={
|
|
443
443
|
"points_found_since_start": 0,
|
|
444
444
|
# Original item format here is (timestamp, value) but we'll ignore timestamp part
|
|
445
|
-
# so every `xxx_24h` item in this dict will be
|
|
445
|
+
# so every `xxx_24h` item in this dict will be list[Any].
|
|
446
446
|
"points_found_24h": [],
|
|
447
447
|
"points_acknowledged_since_start": 0,
|
|
448
448
|
"points_acknowledged_24h": [],
|
|
@@ -473,7 +473,7 @@ def test_increment_pool_stats(case: IncrementPoolStatsCase) -> None:
|
|
|
473
473
|
expected_pool_stats={
|
|
474
474
|
"points_found_since_start": 0,
|
|
475
475
|
# Original item format here is (timestamp, value) but we'll ignore timestamp part
|
|
476
|
-
# so every `xxx_24h` item in this dict will be
|
|
476
|
+
# so every `xxx_24h` item in this dict will be list[Any].
|
|
477
477
|
"points_found_24h": [],
|
|
478
478
|
"points_acknowledged_since_start": 0,
|
|
479
479
|
"points_acknowledged_24h": [],
|
|
@@ -504,7 +504,7 @@ def test_increment_pool_stats(case: IncrementPoolStatsCase) -> None:
|
|
|
504
504
|
expected_pool_stats={
|
|
505
505
|
"points_found_since_start": 0,
|
|
506
506
|
# Original item format here is (timestamp, value) but we'll ignore timestamp part
|
|
507
|
-
# so every `xxx_24h` item in this dict will be
|
|
507
|
+
# so every `xxx_24h` item in this dict will be list[Any].
|
|
508
508
|
"points_found_24h": [],
|
|
509
509
|
"points_acknowledged_since_start": 0,
|
|
510
510
|
"points_acknowledged_24h": [],
|
|
@@ -535,7 +535,7 @@ def test_increment_pool_stats(case: IncrementPoolStatsCase) -> None:
|
|
|
535
535
|
expected_pool_stats={
|
|
536
536
|
"points_found_since_start": 1,
|
|
537
537
|
# Original item format here is (timestamp, value) but we'll ignore timestamp part
|
|
538
|
-
# so every `xxx_24h` item in this dict will be
|
|
538
|
+
# so every `xxx_24h` item in this dict will be list[Any].
|
|
539
539
|
"points_found_24h": [1],
|
|
540
540
|
"points_acknowledged_since_start": 0,
|
|
541
541
|
"points_acknowledged_24h": [],
|
|
@@ -561,7 +561,7 @@ async def test_farmer_new_proof_of_space_for_pool_stats(
|
|
|
561
561
|
harvester_farmer_environment: HarvesterFarmerEnvironment,
|
|
562
562
|
case: NewProofOfSpaceCase,
|
|
563
563
|
) -> None:
|
|
564
|
-
farmer_service,
|
|
564
|
+
farmer_service, _farmer_rpc_client, _, _, _ = harvester_farmer_environment
|
|
565
565
|
farmer_api = farmer_service._api
|
|
566
566
|
|
|
567
567
|
sp = farmer_protocol.NewSignagePoint(
|
|
@@ -672,7 +672,7 @@ class DummyPoolResponse:
|
|
|
672
672
|
new_difficulty: Optional[int] = None
|
|
673
673
|
|
|
674
674
|
async def text(self) -> str:
|
|
675
|
-
json_dict:
|
|
675
|
+
json_dict: dict[str, Any] = dict()
|
|
676
676
|
if self.error_code:
|
|
677
677
|
json_dict["error_code"] = self.error_code
|
|
678
678
|
json_dict["error_message"] = self.error_message if self.error_message else "error-msg"
|
|
@@ -686,14 +686,14 @@ class DummyPoolResponse:
|
|
|
686
686
|
|
|
687
687
|
async def __aexit__(
|
|
688
688
|
self,
|
|
689
|
-
exc_type: Optional[
|
|
689
|
+
exc_type: Optional[type[BaseException]],
|
|
690
690
|
exc_val: Optional[BaseException],
|
|
691
691
|
exc_tb: Optional[TracebackType],
|
|
692
692
|
) -> None:
|
|
693
693
|
pass
|
|
694
694
|
|
|
695
695
|
|
|
696
|
-
def create_valid_pos(farmer: Farmer) ->
|
|
696
|
+
def create_valid_pos(farmer: Farmer) -> tuple[farmer_protocol.NewSignagePoint, ProofOfSpace, NewProofOfSpace]:
|
|
697
697
|
case = NewProofOfSpaceCase.create_verified_quality_case(
|
|
698
698
|
difficulty=uint64(1),
|
|
699
699
|
sub_slot_iters=uint64(1000000000000),
|
|
@@ -764,11 +764,11 @@ def create_valid_pos(farmer: Farmer) -> Tuple[farmer_protocol.NewSignagePoint, P
|
|
|
764
764
|
return sp, pos, new_pos
|
|
765
765
|
|
|
766
766
|
|
|
767
|
-
def override_pool_state(overrides:
|
|
767
|
+
def override_pool_state(overrides: dict[str, Any]) -> dict[str, Any]:
|
|
768
768
|
pool_state = {
|
|
769
769
|
"points_found_since_start": 0,
|
|
770
770
|
# Original item format here is (timestamp, value) but we'll ignore timestamp part
|
|
771
|
-
# so every `xxx_24h` item in this dict will be
|
|
771
|
+
# so every `xxx_24h` item in this dict will be list[Any].
|
|
772
772
|
"points_found_24h": [],
|
|
773
773
|
"points_acknowledged_since_start": 0,
|
|
774
774
|
"points_acknowledged_24h": [],
|
|
@@ -793,7 +793,7 @@ def override_pool_state(overrides: Dict[str, Any]) -> Dict[str, Any]:
|
|
|
793
793
|
class PoolStateCase:
|
|
794
794
|
id: str
|
|
795
795
|
pool_response: DummyPoolResponse
|
|
796
|
-
expected_pool_state:
|
|
796
|
+
expected_pool_state: dict[str, Any]
|
|
797
797
|
marks: Marks = ()
|
|
798
798
|
|
|
799
799
|
|
|
@@ -867,7 +867,7 @@ class PoolStateCase:
|
|
|
867
867
|
@pytest.mark.anyio
|
|
868
868
|
async def test_farmer_pool_response(
|
|
869
869
|
mocker: MockerFixture,
|
|
870
|
-
farmer_one_harvester:
|
|
870
|
+
farmer_one_harvester: tuple[list[HarvesterService], FarmerService, BlockTools],
|
|
871
871
|
case: PoolStateCase,
|
|
872
872
|
) -> None:
|
|
873
873
|
_, farmer_service, _ = farmer_one_harvester
|
|
@@ -927,7 +927,7 @@ async def test_farmer_pool_response(
|
|
|
927
927
|
assert_stats_24h("missing_partials_24h")
|
|
928
928
|
|
|
929
929
|
|
|
930
|
-
def make_pool_list_entry(overrides:
|
|
930
|
+
def make_pool_list_entry(overrides: dict[str, Any]) -> dict[str, Any]:
|
|
931
931
|
pool_list_entry = {
|
|
932
932
|
"owner_public_key": "84c3fcf9d5581c1ddc702cb0f3b4a06043303b334dd993ab42b2c320ebfa98e5ce558448615b3f69638ba92cf7f43da5", # noqa: E501
|
|
933
933
|
"p2_singleton_puzzle_hash": "302e05a1e6af431c22043ae2a9a8f71148c955c372697cb8ab348160976283df",
|
|
@@ -941,7 +941,7 @@ def make_pool_list_entry(overrides: Dict[str, Any]) -> Dict[str, Any]:
|
|
|
941
941
|
return pool_list_entry
|
|
942
942
|
|
|
943
943
|
|
|
944
|
-
def make_pool_info() ->
|
|
944
|
+
def make_pool_info() -> dict[str, Any]:
|
|
945
945
|
return {
|
|
946
946
|
"name": "Pool Name",
|
|
947
947
|
"description": "Pool Description",
|
|
@@ -955,7 +955,7 @@ def make_pool_info() -> Dict[str, Any]:
|
|
|
955
955
|
}
|
|
956
956
|
|
|
957
957
|
|
|
958
|
-
def make_pool_state(p2_singleton_puzzle_hash: bytes32, overrides:
|
|
958
|
+
def make_pool_state(p2_singleton_puzzle_hash: bytes32, overrides: dict[str, Any]) -> dict[str, Any]:
|
|
959
959
|
pool_info = {
|
|
960
960
|
"p2_singleton_puzzle_hash": p2_singleton_puzzle_hash.hex(),
|
|
961
961
|
"points_found_since_start": 0,
|
|
@@ -995,8 +995,8 @@ class DummyPoolInfoResponse:
|
|
|
995
995
|
ok: bool
|
|
996
996
|
status: int
|
|
997
997
|
url: URL
|
|
998
|
-
pool_info: Optional[
|
|
999
|
-
history:
|
|
998
|
+
pool_info: Optional[dict[str, Any]] = None
|
|
999
|
+
history: tuple[DummyClientResponse, ...] = ()
|
|
1000
1000
|
|
|
1001
1001
|
async def text(self) -> str:
|
|
1002
1002
|
if self.pool_info is None:
|
|
@@ -1009,7 +1009,7 @@ class DummyPoolInfoResponse:
|
|
|
1009
1009
|
|
|
1010
1010
|
async def __aexit__(
|
|
1011
1011
|
self,
|
|
1012
|
-
exc_type: Optional[
|
|
1012
|
+
exc_type: Optional[type[BaseException]],
|
|
1013
1013
|
exc_val: Optional[BaseException],
|
|
1014
1014
|
exc_tb: Optional[TracebackType],
|
|
1015
1015
|
) -> None:
|
|
@@ -1171,7 +1171,7 @@ class PoolInfoCase(DataCase):
|
|
|
1171
1171
|
@pytest.mark.anyio
|
|
1172
1172
|
async def test_farmer_pool_info_config_update(
|
|
1173
1173
|
mocker: MockerFixture,
|
|
1174
|
-
farmer_one_harvester:
|
|
1174
|
+
farmer_one_harvester: tuple[list[HarvesterService], FarmerService, BlockTools],
|
|
1175
1175
|
case: PoolInfoCase,
|
|
1176
1176
|
) -> None:
|
|
1177
1177
|
_, farmer_service, _ = farmer_one_harvester
|
|
@@ -1212,7 +1212,7 @@ async def test_farmer_pool_info_config_update(
|
|
|
1212
1212
|
class PartialSubmitHeaderCase(DataCase):
|
|
1213
1213
|
_id: str
|
|
1214
1214
|
harvester_peer: DummyHarvesterPeer
|
|
1215
|
-
expected_headers:
|
|
1215
|
+
expected_headers: dict[str, str]
|
|
1216
1216
|
marks: Marks = ()
|
|
1217
1217
|
|
|
1218
1218
|
@property
|
|
@@ -1236,7 +1236,7 @@ class PartialSubmitHeaderCase(DataCase):
|
|
|
1236
1236
|
@pytest.mark.anyio
|
|
1237
1237
|
async def test_farmer_additional_headers_on_partial_submit(
|
|
1238
1238
|
mocker: MockerFixture,
|
|
1239
|
-
farmer_one_harvester:
|
|
1239
|
+
farmer_one_harvester: tuple[list[HarvesterService], FarmerService, BlockTools],
|
|
1240
1240
|
case: PartialSubmitHeaderCase,
|
|
1241
1241
|
) -> None:
|
|
1242
1242
|
_, farmer_service, _ = farmer_one_harvester
|