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
|
@@ -3,10 +3,11 @@ from __future__ import annotations
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import contextlib
|
|
5
5
|
import functools
|
|
6
|
+
from collections.abc import AsyncIterator
|
|
6
7
|
from dataclasses import dataclass, field, replace
|
|
7
8
|
from pathlib import Path
|
|
8
9
|
from shutil import copy
|
|
9
|
-
from typing import Any,
|
|
10
|
+
from typing import Any, Callable, Optional
|
|
10
11
|
|
|
11
12
|
import pytest
|
|
12
13
|
from chia_rs import G1Element
|
|
@@ -43,7 +44,7 @@ def synced(sender: Sender, receiver: Receiver, previous_last_sync_id: int) -> bo
|
|
|
43
44
|
)
|
|
44
45
|
|
|
45
46
|
|
|
46
|
-
def assert_path_list_matches(expected_list:
|
|
47
|
+
def assert_path_list_matches(expected_list: list[str], actual_list: list[str]) -> None:
|
|
47
48
|
assert len(expected_list) == len(actual_list)
|
|
48
49
|
for item in expected_list:
|
|
49
50
|
assert str(item) in actual_list
|
|
@@ -61,12 +62,12 @@ class ExpectedResult:
|
|
|
61
62
|
duplicates_delta: PathListDelta = field(default_factory=PathListDelta)
|
|
62
63
|
callback_passed: bool = False
|
|
63
64
|
|
|
64
|
-
def add_valid(self, list_plots:
|
|
65
|
+
def add_valid(self, list_plots: list[MockPlotInfo]) -> None:
|
|
65
66
|
def create_mock_plot(info: MockPlotInfo) -> Plot:
|
|
66
67
|
return Plot(
|
|
67
68
|
info.prover.get_filename(),
|
|
68
69
|
uint8(0),
|
|
69
|
-
bytes32
|
|
70
|
+
bytes32.zeros,
|
|
70
71
|
None,
|
|
71
72
|
None,
|
|
72
73
|
G1Element(),
|
|
@@ -78,31 +79,31 @@ class ExpectedResult:
|
|
|
78
79
|
self.valid_count += len(list_plots)
|
|
79
80
|
self.valid_delta.additions.update({x.prover.get_filename(): create_mock_plot(x) for x in list_plots})
|
|
80
81
|
|
|
81
|
-
def remove_valid(self, list_paths:
|
|
82
|
+
def remove_valid(self, list_paths: list[Path]) -> None:
|
|
82
83
|
self.valid_count -= len(list_paths)
|
|
83
84
|
self.valid_delta.removals += [str(x) for x in list_paths]
|
|
84
85
|
|
|
85
|
-
def add_invalid(self, list_paths:
|
|
86
|
+
def add_invalid(self, list_paths: list[Path]) -> None:
|
|
86
87
|
self.invalid_count += len(list_paths)
|
|
87
88
|
self.invalid_delta.additions += [str(x) for x in list_paths]
|
|
88
89
|
|
|
89
|
-
def remove_invalid(self, list_paths:
|
|
90
|
+
def remove_invalid(self, list_paths: list[Path]) -> None:
|
|
90
91
|
self.invalid_count -= len(list_paths)
|
|
91
92
|
self.invalid_delta.removals += [str(x) for x in list_paths]
|
|
92
93
|
|
|
93
|
-
def add_keys_missing(self, list_paths:
|
|
94
|
+
def add_keys_missing(self, list_paths: list[Path]) -> None:
|
|
94
95
|
self.keys_missing_count += len(list_paths)
|
|
95
96
|
self.keys_missing_delta.additions += [str(x) for x in list_paths]
|
|
96
97
|
|
|
97
|
-
def remove_keys_missing(self, list_paths:
|
|
98
|
+
def remove_keys_missing(self, list_paths: list[Path]) -> None:
|
|
98
99
|
self.keys_missing_count -= len(list_paths)
|
|
99
100
|
self.keys_missing_delta.removals += [str(x) for x in list_paths]
|
|
100
101
|
|
|
101
|
-
def add_duplicates(self, list_paths:
|
|
102
|
+
def add_duplicates(self, list_paths: list[Path]) -> None:
|
|
102
103
|
self.duplicates_count += len(list_paths)
|
|
103
104
|
self.duplicates_delta.additions += [str(x) for x in list_paths]
|
|
104
105
|
|
|
105
|
-
def remove_duplicates(self, list_paths:
|
|
106
|
+
def remove_duplicates(self, list_paths: list[Path]) -> None:
|
|
106
107
|
self.duplicates_count -= len(list_paths)
|
|
107
108
|
self.duplicates_delta.removals += [str(x) for x in list_paths]
|
|
108
109
|
|
|
@@ -110,9 +111,9 @@ class ExpectedResult:
|
|
|
110
111
|
@dataclass
|
|
111
112
|
class Environment:
|
|
112
113
|
root_path: Path
|
|
113
|
-
harvester_services:
|
|
114
|
+
harvester_services: list[HarvesterService]
|
|
114
115
|
farmer_service: FarmerService
|
|
115
|
-
harvesters:
|
|
116
|
+
harvesters: list[Harvester]
|
|
116
117
|
farmer: Farmer
|
|
117
118
|
dir_1: Directory
|
|
118
119
|
dir_2: Directory
|
|
@@ -121,9 +122,9 @@ class Environment:
|
|
|
121
122
|
dir_invalid: Directory
|
|
122
123
|
dir_keys_missing: Directory
|
|
123
124
|
dir_duplicates: Directory
|
|
124
|
-
expected:
|
|
125
|
+
expected: list[ExpectedResult]
|
|
125
126
|
split_farmer_service_manager: SplitAsyncManager[FarmerService]
|
|
126
|
-
split_harvester_managers:
|
|
127
|
+
split_harvester_managers: list[SplitAsyncManager[Harvester]]
|
|
127
128
|
|
|
128
129
|
def get_harvester(self, peer_id: bytes32) -> Optional[Harvester]:
|
|
129
130
|
for harvester in self.harvesters:
|
|
@@ -218,7 +219,7 @@ class Environment:
|
|
|
218
219
|
async def run_sync_test(self) -> None:
|
|
219
220
|
plot_manager: PlotManager
|
|
220
221
|
assert len(self.harvesters) == len(self.expected)
|
|
221
|
-
last_sync_ids:
|
|
222
|
+
last_sync_ids: list[uint64] = []
|
|
222
223
|
# Run the test in two steps, first trigger the refresh on both harvesters
|
|
223
224
|
for harvester in self.harvesters:
|
|
224
225
|
plot_manager = harvester.plot_manager
|
|
@@ -279,16 +280,16 @@ class Environment:
|
|
|
279
280
|
@pytest.fixture(scope="function")
|
|
280
281
|
async def environment(
|
|
281
282
|
tmp_path: Path,
|
|
282
|
-
farmer_two_harvester_not_started:
|
|
283
|
+
farmer_two_harvester_not_started: tuple[list[HarvesterService], FarmerService, BlockTools],
|
|
283
284
|
) -> AsyncIterator[Environment]:
|
|
284
|
-
def new_test_dir(name: str, plot_list:
|
|
285
|
+
def new_test_dir(name: str, plot_list: list[Path]) -> Directory:
|
|
285
286
|
return Directory(tmp_path / "plots" / name, plot_list)
|
|
286
287
|
|
|
287
|
-
plots:
|
|
288
|
-
plots_invalid:
|
|
289
|
-
plots_keys_missing:
|
|
288
|
+
plots: list[Path] = get_test_plots()
|
|
289
|
+
plots_invalid: list[Path] = get_test_plots()[0:3]
|
|
290
|
+
plots_keys_missing: list[Path] = get_test_plots("not_in_keychain")
|
|
290
291
|
# Create 4 directories where: dir_n contains n plots
|
|
291
|
-
directories:
|
|
292
|
+
directories: list[Directory] = []
|
|
292
293
|
offset: int = 0
|
|
293
294
|
while len(directories) < 4:
|
|
294
295
|
dir_number = len(directories) + 1
|
|
@@ -535,7 +536,7 @@ async def test_farmer_restart(environment: Environment) -> None:
|
|
|
535
536
|
env: Environment = environment
|
|
536
537
|
# Load all directories for both harvesters
|
|
537
538
|
await add_and_validate_all_directories(env)
|
|
538
|
-
last_sync_ids:
|
|
539
|
+
last_sync_ids: list[uint64] = []
|
|
539
540
|
for i in range(0, len(env.harvesters)):
|
|
540
541
|
last_sync_ids.append(env.harvesters[i].plot_sync_sender._last_sync_id)
|
|
541
542
|
# Stop the farmer and make sure both receivers get dropped and refreshing gets stopped on the harvesters
|
|
@@ -569,7 +570,7 @@ async def test_farmer_restart(environment: Environment) -> None:
|
|
|
569
570
|
|
|
570
571
|
@pytest.mark.anyio
|
|
571
572
|
async def test_sync_start_and_disconnect_while_sync_is_active(
|
|
572
|
-
farmer_one_harvester:
|
|
573
|
+
farmer_one_harvester: tuple[list[HarvesterService], FarmerService, BlockTools],
|
|
573
574
|
) -> None:
|
|
574
575
|
harvesters, farmer_service, _ = farmer_one_harvester
|
|
575
576
|
harvester_service = harvesters[0]
|
|
@@ -4,7 +4,7 @@ import dataclasses
|
|
|
4
4
|
import logging
|
|
5
5
|
import random
|
|
6
6
|
import time
|
|
7
|
-
from typing import Any, Callable,
|
|
7
|
+
from typing import Any, Callable, Union
|
|
8
8
|
|
|
9
9
|
import pytest
|
|
10
10
|
from chia_rs import G1Element
|
|
@@ -57,7 +57,7 @@ class SyncStepData:
|
|
|
57
57
|
args: Any
|
|
58
58
|
|
|
59
59
|
def __init__(
|
|
60
|
-
self, state: State, function: Callable[[_T_Streamable], Any], payload_type:
|
|
60
|
+
self, state: State, function: Callable[[_T_Streamable], Any], payload_type: type[_T_Streamable], *args: Any
|
|
61
61
|
) -> None:
|
|
62
62
|
self.state = state
|
|
63
63
|
self.function = function
|
|
@@ -89,7 +89,7 @@ def assert_error_response(plot_sync: Receiver, error_code: ErrorCodes) -> None:
|
|
|
89
89
|
assert response.error.code == error_code.value
|
|
90
90
|
|
|
91
91
|
|
|
92
|
-
def pre_function_validate(receiver: Receiver, data: Union[
|
|
92
|
+
def pre_function_validate(receiver: Receiver, data: Union[list[Plot], list[str]], expected_state: State) -> None:
|
|
93
93
|
if expected_state == State.loaded:
|
|
94
94
|
for plot_info in data:
|
|
95
95
|
assert type(plot_info) is Plot
|
|
@@ -108,7 +108,7 @@ def pre_function_validate(receiver: Receiver, data: Union[List[Plot], List[str]]
|
|
|
108
108
|
assert path not in receiver.duplicates()
|
|
109
109
|
|
|
110
110
|
|
|
111
|
-
def post_function_validate(receiver: Receiver, data: Union[
|
|
111
|
+
def post_function_validate(receiver: Receiver, data: Union[list[Plot], list[str]], expected_state: State) -> None:
|
|
112
112
|
if expected_state == State.loaded:
|
|
113
113
|
for plot_info in data:
|
|
114
114
|
assert type(plot_info) is Plot
|
|
@@ -132,7 +132,7 @@ async def run_sync_step(receiver: Receiver, sync_step: SyncStepData) -> None:
|
|
|
132
132
|
assert receiver.current_sync().state == sync_step.state
|
|
133
133
|
last_sync_time_before = receiver._last_sync.time_done
|
|
134
134
|
# For the list types invoke the trigger function in batches
|
|
135
|
-
if sync_step.payload_type
|
|
135
|
+
if sync_step.payload_type in {PlotSyncPlotList, PlotSyncPathList}:
|
|
136
136
|
step_data, _ = sync_step.args
|
|
137
137
|
assert len(step_data) == 10
|
|
138
138
|
# Invoke batches of: 1, 2, 3, 4 items and validate the data against plot store before and after
|
|
@@ -161,7 +161,7 @@ async def run_sync_step(receiver: Receiver, sync_step: SyncStepData) -> None:
|
|
|
161
161
|
assert receiver._last_sync.time_done == last_sync_time_before
|
|
162
162
|
|
|
163
163
|
|
|
164
|
-
def plot_sync_setup(seeded_random: random.Random) ->
|
|
164
|
+
def plot_sync_setup(seeded_random: random.Random) -> tuple[Receiver, list[SyncStepData]]:
|
|
165
165
|
harvester_connection = get_dummy_connection(NodeType.HARVESTER, bytes32.random(seeded_random))
|
|
166
166
|
receiver = Receiver(harvester_connection, dummy_callback) # type:ignore[arg-type]
|
|
167
167
|
|
|
@@ -188,7 +188,7 @@ def plot_sync_setup(seeded_random: random.Random) -> Tuple[Receiver, List[SyncSt
|
|
|
188
188
|
receiver._total_effective_plot_size = int(
|
|
189
189
|
sum(UI_ACTUAL_SPACE_CONSTANT_FACTOR * int(_expected_plot_size(plot.size)) for plot in receiver.plots().values())
|
|
190
190
|
)
|
|
191
|
-
sync_steps:
|
|
191
|
+
sync_steps: list[SyncStepData] = [
|
|
192
192
|
SyncStepData(
|
|
193
193
|
State.idle,
|
|
194
194
|
receiver.sync_started,
|
|
@@ -223,7 +223,7 @@ def test_default_values(seeded_random: random.Random) -> None:
|
|
|
223
223
|
|
|
224
224
|
@pytest.mark.anyio
|
|
225
225
|
async def test_reset(seeded_random: random.Random) -> None:
|
|
226
|
-
receiver,
|
|
226
|
+
receiver, _sync_steps = plot_sync_setup(seeded_random=seeded_random)
|
|
227
227
|
connection_before = receiver.connection()
|
|
228
228
|
# Assign some dummy values
|
|
229
229
|
receiver._current_sync.state = State.done
|
|
@@ -289,7 +289,7 @@ async def test_to_dict(counts_only: bool, seeded_random: random.Random) -> None:
|
|
|
289
289
|
for state in State:
|
|
290
290
|
await run_sync_step(receiver, sync_steps[state])
|
|
291
291
|
|
|
292
|
-
if state
|
|
292
|
+
if state not in {State.idle, State.removed, State.done}:
|
|
293
293
|
expected_plot_files_processed += len(sync_steps[state].args[0])
|
|
294
294
|
|
|
295
295
|
sync_data = receiver.to_dict()["syncing"]
|
|
@@ -45,7 +45,7 @@ def test_set_connection_values(bt: BlockTools, seeded_random: random.Random) ->
|
|
|
45
45
|
# Test setting a valid connection works
|
|
46
46
|
sender.set_connection(farmer_connection) # type:ignore[arg-type]
|
|
47
47
|
assert sender._connection is not None
|
|
48
|
-
assert sender._connection == farmer_connection
|
|
48
|
+
assert id(sender._connection) == id(farmer_connection)
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
@pytest.mark.anyio
|
|
@@ -6,10 +6,11 @@ import functools
|
|
|
6
6
|
import logging
|
|
7
7
|
import random
|
|
8
8
|
import time
|
|
9
|
+
from collections.abc import AsyncIterator
|
|
9
10
|
from dataclasses import dataclass, field
|
|
10
11
|
from enum import Enum
|
|
11
12
|
from pathlib import Path
|
|
12
|
-
from typing import Any,
|
|
13
|
+
from typing import Any, Optional
|
|
13
14
|
|
|
14
15
|
import pytest
|
|
15
16
|
from chia_rs import G1Element
|
|
@@ -51,19 +52,19 @@ class TestData:
|
|
|
51
52
|
plot_sync_sender: Sender
|
|
52
53
|
plot_sync_receiver: Receiver
|
|
53
54
|
event_loop: asyncio.AbstractEventLoop
|
|
54
|
-
plots:
|
|
55
|
-
invalid:
|
|
56
|
-
keys_missing:
|
|
57
|
-
duplicates:
|
|
55
|
+
plots: dict[Path, PlotInfo] = field(default_factory=dict)
|
|
56
|
+
invalid: list[PlotInfo] = field(default_factory=list)
|
|
57
|
+
keys_missing: list[PlotInfo] = field(default_factory=list)
|
|
58
|
+
duplicates: list[PlotInfo] = field(default_factory=list)
|
|
58
59
|
|
|
59
60
|
async def run(
|
|
60
61
|
self,
|
|
61
62
|
*,
|
|
62
|
-
loaded:
|
|
63
|
-
removed:
|
|
64
|
-
invalid:
|
|
65
|
-
keys_missing:
|
|
66
|
-
duplicates:
|
|
63
|
+
loaded: list[PlotInfo],
|
|
64
|
+
removed: list[PlotInfo],
|
|
65
|
+
invalid: list[PlotInfo],
|
|
66
|
+
keys_missing: list[PlotInfo],
|
|
67
|
+
duplicates: list[PlotInfo],
|
|
67
68
|
initial: bool,
|
|
68
69
|
) -> None:
|
|
69
70
|
for plot_info in loaded:
|
|
@@ -75,10 +76,10 @@ class TestData:
|
|
|
75
76
|
self.keys_missing = keys_missing
|
|
76
77
|
self.duplicates = duplicates
|
|
77
78
|
|
|
78
|
-
removed_paths:
|
|
79
|
-
invalid_dict:
|
|
80
|
-
keys_missing_set:
|
|
81
|
-
duplicates_set:
|
|
79
|
+
removed_paths: list[Path] = [p.prover.get_filename() for p in removed] if removed is not None else []
|
|
80
|
+
invalid_dict: dict[Path, int] = {p.prover.get_filename(): 0 for p in self.invalid}
|
|
81
|
+
keys_missing_set: set[Path] = {p.prover.get_filename() for p in self.keys_missing}
|
|
82
|
+
duplicates_set: set[str] = {p.prover.get_filename() for p in self.duplicates}
|
|
82
83
|
|
|
83
84
|
# Inject invalid plots into `PlotManager` of the harvester so that the callback calls below can use them
|
|
84
85
|
# to sync them to the farmer.
|
|
@@ -158,10 +159,10 @@ class TestData:
|
|
|
158
159
|
|
|
159
160
|
@dataclass
|
|
160
161
|
class TestRunner:
|
|
161
|
-
test_data:
|
|
162
|
+
test_data: list[TestData]
|
|
162
163
|
|
|
163
164
|
def __init__(
|
|
164
|
-
self, harvesters:
|
|
165
|
+
self, harvesters: list[Harvester], farmer: Farmer, event_loop: asyncio.events.AbstractEventLoop
|
|
165
166
|
) -> None:
|
|
166
167
|
self.test_data = []
|
|
167
168
|
for harvester in harvesters:
|
|
@@ -179,11 +180,11 @@ class TestRunner:
|
|
|
179
180
|
self,
|
|
180
181
|
index: int,
|
|
181
182
|
*,
|
|
182
|
-
loaded:
|
|
183
|
-
removed:
|
|
184
|
-
invalid:
|
|
185
|
-
keys_missing:
|
|
186
|
-
duplicates:
|
|
183
|
+
loaded: list[PlotInfo],
|
|
184
|
+
removed: list[PlotInfo],
|
|
185
|
+
invalid: list[PlotInfo],
|
|
186
|
+
keys_missing: list[PlotInfo],
|
|
187
|
+
duplicates: list[PlotInfo],
|
|
187
188
|
initial: bool,
|
|
188
189
|
) -> None:
|
|
189
190
|
await self.test_data[index].run(
|
|
@@ -241,7 +242,7 @@ async def _testable_process(
|
|
|
241
242
|
|
|
242
243
|
@contextlib.asynccontextmanager
|
|
243
244
|
async def create_test_runner(
|
|
244
|
-
harvester_services:
|
|
245
|
+
harvester_services: list[HarvesterService],
|
|
245
246
|
farmer_service: FarmerService,
|
|
246
247
|
event_loop: asyncio.events.AbstractEventLoop,
|
|
247
248
|
) -> AsyncIterator[TestRunner]:
|
|
@@ -262,7 +263,7 @@ async def create_test_runner(
|
|
|
262
263
|
yield TestRunner(harvesters, farmer, event_loop)
|
|
263
264
|
|
|
264
265
|
|
|
265
|
-
def create_example_plots(count: int, seeded_random: random.Random) ->
|
|
266
|
+
def create_example_plots(count: int, seeded_random: random.Random) -> list[PlotInfo]:
|
|
266
267
|
@dataclass
|
|
267
268
|
class DiskProver:
|
|
268
269
|
file_name: str
|
|
@@ -296,7 +297,7 @@ def create_example_plots(count: int, seeded_random: random.Random) -> List[PlotI
|
|
|
296
297
|
|
|
297
298
|
@pytest.mark.anyio
|
|
298
299
|
async def test_sync_simulated(
|
|
299
|
-
farmer_three_harvester_not_started:
|
|
300
|
+
farmer_three_harvester_not_started: tuple[list[HarvesterService], FarmerService, BlockTools],
|
|
300
301
|
event_loop: asyncio.events.AbstractEventLoop,
|
|
301
302
|
seeded_random: random.Random,
|
|
302
303
|
) -> None:
|
|
@@ -376,7 +377,7 @@ async def test_sync_simulated(
|
|
|
376
377
|
)
|
|
377
378
|
@pytest.mark.anyio
|
|
378
379
|
async def test_farmer_error_simulation(
|
|
379
|
-
farmer_one_harvester_not_started:
|
|
380
|
+
farmer_one_harvester_not_started: tuple[list[HarvesterService], FarmerService, BlockTools],
|
|
380
381
|
event_loop: asyncio.events.AbstractEventLoop,
|
|
381
382
|
simulate_error: ErrorSimulation,
|
|
382
383
|
seeded_random: random.Random,
|
|
@@ -402,7 +403,7 @@ async def test_farmer_error_simulation(
|
|
|
402
403
|
@pytest.mark.parametrize("simulate_error", [ErrorSimulation.NonRecoverableError, ErrorSimulation.NotConnected])
|
|
403
404
|
@pytest.mark.anyio
|
|
404
405
|
async def test_sync_reset_cases(
|
|
405
|
-
farmer_one_harvester_not_started:
|
|
406
|
+
farmer_one_harvester_not_started: tuple[list[HarvesterService], FarmerService, BlockTools],
|
|
406
407
|
event_loop: asyncio.events.AbstractEventLoop,
|
|
407
408
|
simulate_error: ErrorSimulation,
|
|
408
409
|
seeded_random: random.Random,
|
chia/_tests/plot_sync/util.py
CHANGED
|
@@ -2,8 +2,9 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import contextlib
|
|
4
4
|
import time
|
|
5
|
+
from collections.abc import AsyncIterator
|
|
5
6
|
from dataclasses import dataclass
|
|
6
|
-
from typing import
|
|
7
|
+
from typing import Optional
|
|
7
8
|
|
|
8
9
|
from chia._tests.util.split_managers import SplitAsyncManager, split_async_manager
|
|
9
10
|
from chia._tests.util.time_out_assert import time_out_assert
|
|
@@ -3,16 +3,18 @@ from __future__ import annotations
|
|
|
3
3
|
import logging
|
|
4
4
|
import sys
|
|
5
5
|
import time
|
|
6
|
+
from collections.abc import Iterator
|
|
6
7
|
from dataclasses import dataclass, replace
|
|
7
8
|
from os import unlink
|
|
8
9
|
from pathlib import Path
|
|
9
10
|
from shutil import copy, move
|
|
10
|
-
from typing import Callable,
|
|
11
|
+
from typing import Callable, Optional, cast
|
|
11
12
|
|
|
12
13
|
import pytest
|
|
13
14
|
from chia_rs import G1Element
|
|
14
15
|
|
|
15
16
|
from chia._tests.plotting.util import get_test_plots
|
|
17
|
+
from chia._tests.util.misc import boolean_datacases
|
|
16
18
|
from chia._tests.util.time_out_assert import time_out_assert
|
|
17
19
|
from chia.plotting.cache import CURRENT_VERSION, CacheDataV1
|
|
18
20
|
from chia.plotting.manager import Cache, PlotManager
|
|
@@ -32,6 +34,9 @@ from chia.util.streamable import VersionedBlob
|
|
|
32
34
|
|
|
33
35
|
log = logging.getLogger(__name__)
|
|
34
36
|
|
|
37
|
+
# These tests are not dependent on consensus rules
|
|
38
|
+
pytestmark = [pytest.mark.limit_consensus_modes(reason="does not depend on consensus rules")]
|
|
39
|
+
|
|
35
40
|
|
|
36
41
|
@dataclass
|
|
37
42
|
class MockDiskProver:
|
|
@@ -48,9 +53,9 @@ class MockPlotInfo:
|
|
|
48
53
|
|
|
49
54
|
class Directory:
|
|
50
55
|
path: Path
|
|
51
|
-
plots:
|
|
56
|
+
plots: list[Path]
|
|
52
57
|
|
|
53
|
-
def __init__(self, path: Path, plots_origin:
|
|
58
|
+
def __init__(self, path: Path, plots_origin: list[Path]):
|
|
54
59
|
self.path = path
|
|
55
60
|
path.mkdir(parents=True, exist_ok=True)
|
|
56
61
|
# Drop the existing files in the test directories
|
|
@@ -66,10 +71,10 @@ class Directory:
|
|
|
66
71
|
def __len__(self):
|
|
67
72
|
return len(self.plots)
|
|
68
73
|
|
|
69
|
-
def plot_info_list(self) ->
|
|
74
|
+
def plot_info_list(self) -> list[MockPlotInfo]:
|
|
70
75
|
return [MockPlotInfo(MockDiskProver(str(x))) for x in self.plots]
|
|
71
76
|
|
|
72
|
-
def path_list(self) ->
|
|
77
|
+
def path_list(self) -> list[Path]:
|
|
73
78
|
return self.plots
|
|
74
79
|
|
|
75
80
|
def drop(self, path: Path):
|
|
@@ -149,7 +154,7 @@ class Environment:
|
|
|
149
154
|
def environment(tmp_path, bt) -> Iterator[Environment]:
|
|
150
155
|
dir_1_count: int = 7
|
|
151
156
|
dir_2_count: int = 3
|
|
152
|
-
plots:
|
|
157
|
+
plots: list[Path] = get_test_plots()
|
|
153
158
|
assert len(plots) >= dir_1_count + dir_2_count
|
|
154
159
|
|
|
155
160
|
dir_1: Directory = Directory(tmp_path / "plots" / "1", plots[0:dir_1_count])
|
|
@@ -180,14 +185,14 @@ async def test_plot_refreshing(environment):
|
|
|
180
185
|
*,
|
|
181
186
|
trigger: Callable,
|
|
182
187
|
test_path: Path,
|
|
183
|
-
expect_loaded:
|
|
184
|
-
expect_removed:
|
|
188
|
+
expect_loaded: list[MockPlotInfo],
|
|
189
|
+
expect_removed: list[Path],
|
|
185
190
|
expect_processed: int,
|
|
186
191
|
expect_duplicates: int,
|
|
187
192
|
expected_directories: int,
|
|
188
193
|
expect_total_plots: int,
|
|
189
194
|
):
|
|
190
|
-
expected_result.loaded = cast(
|
|
195
|
+
expected_result.loaded = cast(list[PlotInfo], expect_loaded)
|
|
191
196
|
expected_result.removed = expect_removed
|
|
192
197
|
expected_result.processed = expect_processed
|
|
193
198
|
trigger(env.root_path, str(test_path))
|
|
@@ -432,7 +437,7 @@ async def test_invalid_plots(environment):
|
|
|
432
437
|
@pytest.mark.anyio
|
|
433
438
|
async def test_keys_missing(environment: Environment) -> None:
|
|
434
439
|
env: Environment = environment
|
|
435
|
-
not_in_keychain_plots:
|
|
440
|
+
not_in_keychain_plots: list[Path] = get_test_plots("not_in_keychain")
|
|
436
441
|
dir_not_in_keychain: Directory = Directory(env.root_path / "plots" / "not_in_keychain", not_in_keychain_plots)
|
|
437
442
|
expected_result = PlotRefreshResult()
|
|
438
443
|
# The plots in "not_in_keychain" directory have infinity g1 elements as farmer/pool key so they should be plots
|
|
@@ -584,7 +589,7 @@ async def test_drop_too_large_cache_entries(environment, bt):
|
|
|
584
589
|
)
|
|
585
590
|
return path
|
|
586
591
|
|
|
587
|
-
def assert_cache(expected:
|
|
592
|
+
def assert_cache(expected: list[MockPlotInfo]) -> None:
|
|
588
593
|
test_cache = Cache(cache_path)
|
|
589
594
|
assert len(test_cache) == 0
|
|
590
595
|
test_cache.load()
|
|
@@ -736,3 +741,41 @@ async def test_recursive_plot_scan(environment: Environment) -> None:
|
|
|
736
741
|
add_plot_directory(env.root_path, str(sub_dir_1_0_1.path))
|
|
737
742
|
expected_result.loaded = []
|
|
738
743
|
await env.refresh_tester.run(expected_result)
|
|
744
|
+
|
|
745
|
+
|
|
746
|
+
@boolean_datacases(name="follow_links", false="no_follow", true="follow")
|
|
747
|
+
@pytest.mark.anyio
|
|
748
|
+
async def test_recursive_plot_scan_symlinks(environment: Environment, follow_links: bool) -> None:
|
|
749
|
+
env: Environment = environment
|
|
750
|
+
# Create a directory tree with some subdirectories containing plots, others not.
|
|
751
|
+
root_plot_dir = env.root_path / "root"
|
|
752
|
+
sub_dir_0: Directory = Directory(root_plot_dir / "0", env.dir_1.plots[0:2])
|
|
753
|
+
sub_dir_0_1: Directory = Directory(sub_dir_0.path / "1", env.dir_1.plots[2:3])
|
|
754
|
+
|
|
755
|
+
# Create a plot directory outside of the root plot directory
|
|
756
|
+
other_plot_dir: Directory = Directory(env.root_path / "other", env.dir_1.plots[3:7])
|
|
757
|
+
|
|
758
|
+
# Create a symlink to the other plot directory from inside the root plot directory
|
|
759
|
+
symlink_path = Path(root_plot_dir / "other")
|
|
760
|
+
symlink_path.symlink_to(env.root_path / "other")
|
|
761
|
+
|
|
762
|
+
# Adding the root without `recursive_plot_scan` and running a test should not load any plots (match an empty result)
|
|
763
|
+
expected_result = PlotRefreshResult()
|
|
764
|
+
add_plot_directory(env.root_path, str(root_plot_dir))
|
|
765
|
+
await env.refresh_tester.run(expected_result)
|
|
766
|
+
|
|
767
|
+
if follow_links:
|
|
768
|
+
expected_plot_list = sub_dir_0.plot_info_list() + sub_dir_0_1.plot_info_list() + other_plot_dir.plot_info_list()
|
|
769
|
+
else:
|
|
770
|
+
expected_plot_list = sub_dir_0.plot_info_list() + sub_dir_0_1.plot_info_list()
|
|
771
|
+
|
|
772
|
+
# Set the recursive scan flag in the config and symlink flag
|
|
773
|
+
with lock_and_load_config(env.root_path, "config.yaml") as config:
|
|
774
|
+
config["harvester"]["recursive_plot_scan"] = True
|
|
775
|
+
config["harvester"]["recursive_follow_links"] = follow_links
|
|
776
|
+
save_config(env.root_path, "config.yaml", config)
|
|
777
|
+
|
|
778
|
+
# With the flag enabled it should load all expected plots
|
|
779
|
+
expected_result.loaded = expected_plot_list # type: ignore[assignment]
|
|
780
|
+
expected_result.processed = len(expected_plot_list)
|
|
781
|
+
await env.refresh_tester.run(expected_result)
|
chia/_tests/plotting/util.py
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from typing import List
|
|
5
4
|
|
|
6
5
|
from chia.simulator.block_tools import get_plot_dir
|
|
7
6
|
|
|
8
7
|
|
|
9
|
-
def get_test_plots(sub_dir: str = "") ->
|
|
8
|
+
def get_test_plots(sub_dir: str = "") -> list[Path]:
|
|
10
9
|
path = get_plot_dir()
|
|
11
10
|
if sub_dir != "":
|
|
12
|
-
path
|
|
11
|
+
path /= sub_dir
|
|
13
12
|
return list(sorted(path.glob("*.plot")))
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from chia._tests.cmds.test_cmd_framework import check_click_parsing
|
|
4
|
+
from chia.cmds.cmd_classes import ChiaCliContext
|
|
5
|
+
from chia.cmds.cmd_helpers import NeedsWalletRPC
|
|
6
|
+
from chia.cmds.param_types import CliAddress
|
|
7
|
+
from chia.cmds.plotnft import (
|
|
8
|
+
ChangePayoutInstructionsPlotNFTCMD,
|
|
9
|
+
ClaimPlotNFTCMD,
|
|
10
|
+
CreatePlotNFTCMD,
|
|
11
|
+
GetLoginLinkCMD,
|
|
12
|
+
InspectPlotNFTCMD,
|
|
13
|
+
JoinPlotNFTCMD,
|
|
14
|
+
LeavePlotNFTCMD,
|
|
15
|
+
ShowPlotNFTCMD,
|
|
16
|
+
)
|
|
17
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
18
|
+
from chia.util.bech32m import encode_puzzle_hash
|
|
19
|
+
from chia.util.ints import uint64
|
|
20
|
+
from chia.wallet.util.address_type import AddressType
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def test_plotnft_command_default_parsing() -> None:
|
|
24
|
+
launcher_id = bytes32([1] * 32)
|
|
25
|
+
check_click_parsing(
|
|
26
|
+
GetLoginLinkCMD(launcher_id=launcher_id),
|
|
27
|
+
"--launcher_id",
|
|
28
|
+
launcher_id.hex(),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
burn_ph = bytes32.from_hexstr("0x000000000000000000000000000000000000000000000000000000000000dead")
|
|
32
|
+
burn_address = encode_puzzle_hash(burn_ph, "xch")
|
|
33
|
+
check_click_parsing(
|
|
34
|
+
ChangePayoutInstructionsPlotNFTCMD(
|
|
35
|
+
launcher_id=launcher_id, address=CliAddress(burn_ph, burn_address, AddressType.XCH)
|
|
36
|
+
),
|
|
37
|
+
"--launcher_id",
|
|
38
|
+
launcher_id.hex(),
|
|
39
|
+
"--address",
|
|
40
|
+
burn_address,
|
|
41
|
+
# Needed for AddressParamType to work correctly without config
|
|
42
|
+
context=ChiaCliContext(expected_prefix="xch"),
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
check_click_parsing(
|
|
46
|
+
ClaimPlotNFTCMD(
|
|
47
|
+
rpc_info=NeedsWalletRPC(client_info=None, wallet_rpc_port=None, fingerprint=None), fee=uint64(1), id=5
|
|
48
|
+
),
|
|
49
|
+
"--id",
|
|
50
|
+
"5",
|
|
51
|
+
"--fee",
|
|
52
|
+
"0.000000000001",
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
check_click_parsing(
|
|
56
|
+
CreatePlotNFTCMD(
|
|
57
|
+
rpc_info=NeedsWalletRPC(client_info=None, wallet_rpc_port=None, fingerprint=None),
|
|
58
|
+
pool_url="http://localhost:1234",
|
|
59
|
+
state="pool",
|
|
60
|
+
fee=uint64(0),
|
|
61
|
+
dont_prompt=False,
|
|
62
|
+
),
|
|
63
|
+
"--state",
|
|
64
|
+
"pool",
|
|
65
|
+
"--pool-url",
|
|
66
|
+
"http://localhost:1234",
|
|
67
|
+
"--fee",
|
|
68
|
+
"0.0",
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
check_click_parsing(
|
|
72
|
+
CreatePlotNFTCMD(
|
|
73
|
+
rpc_info=NeedsWalletRPC(client_info=None, wallet_rpc_port=None, fingerprint=None),
|
|
74
|
+
pool_url=None,
|
|
75
|
+
state="local",
|
|
76
|
+
fee=uint64(0),
|
|
77
|
+
dont_prompt=True,
|
|
78
|
+
),
|
|
79
|
+
"--state",
|
|
80
|
+
"local",
|
|
81
|
+
"-y",
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
check_click_parsing(
|
|
85
|
+
InspectPlotNFTCMD(
|
|
86
|
+
rpc_info=NeedsWalletRPC(client_info=None, wallet_rpc_port=None, fingerprint=None),
|
|
87
|
+
id=5,
|
|
88
|
+
),
|
|
89
|
+
"--id",
|
|
90
|
+
"5",
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
check_click_parsing(
|
|
94
|
+
JoinPlotNFTCMD(
|
|
95
|
+
rpc_info=NeedsWalletRPC(client_info=None, wallet_rpc_port=None, fingerprint=None),
|
|
96
|
+
id=5,
|
|
97
|
+
fee=uint64(3),
|
|
98
|
+
pool_url="http://localhost:1234",
|
|
99
|
+
dont_prompt=True,
|
|
100
|
+
),
|
|
101
|
+
"--id",
|
|
102
|
+
"5",
|
|
103
|
+
"--fee",
|
|
104
|
+
"0.000000000003",
|
|
105
|
+
"--pool-url",
|
|
106
|
+
"http://localhost:1234",
|
|
107
|
+
"-y",
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
check_click_parsing(
|
|
111
|
+
LeavePlotNFTCMD(
|
|
112
|
+
rpc_info=NeedsWalletRPC(client_info=None, wallet_rpc_port=None, fingerprint=None),
|
|
113
|
+
id=5,
|
|
114
|
+
fee=uint64(3),
|
|
115
|
+
dont_prompt=True,
|
|
116
|
+
),
|
|
117
|
+
"--id",
|
|
118
|
+
"5",
|
|
119
|
+
"--fee",
|
|
120
|
+
"0.000000000003",
|
|
121
|
+
"-y",
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
check_click_parsing(
|
|
125
|
+
ShowPlotNFTCMD(rpc_info=NeedsWalletRPC(client_info=None, wallet_rpc_port=None, fingerprint=None), id=5),
|
|
126
|
+
"--id",
|
|
127
|
+
"5",
|
|
128
|
+
)
|