chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__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.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.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.0rc1.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
chia/cmds/keys_funcs.py
CHANGED
|
@@ -5,11 +5,10 @@ import os
|
|
|
5
5
|
import sys
|
|
6
6
|
from enum import Enum
|
|
7
7
|
from pathlib import Path
|
|
8
|
-
from typing import Any,
|
|
8
|
+
from typing import Any, Optional, Union
|
|
9
9
|
|
|
10
10
|
from chia_rs import AugSchemeMPL, G1Element, G2Element, PrivateKey
|
|
11
11
|
|
|
12
|
-
from chia.cmds.passphrase_funcs import obtain_current_passphrase
|
|
13
12
|
from chia.consensus.coinbase import create_puzzlehash_for_pk
|
|
14
13
|
from chia.types.signing_mode import SigningMode
|
|
15
14
|
from chia.util.bech32m import bech32_encode, convertbits, encode_puzzle_hash
|
|
@@ -25,7 +24,7 @@ from chia.util.keychain import (
|
|
|
25
24
|
generate_mnemonic,
|
|
26
25
|
mnemonic_to_seed,
|
|
27
26
|
)
|
|
28
|
-
from chia.util.keyring_wrapper import KeyringWrapper
|
|
27
|
+
from chia.util.keyring_wrapper import KeyringWrapper, obtain_current_passphrase
|
|
29
28
|
from chia.wallet.derive_keys import (
|
|
30
29
|
master_pk_to_wallet_pk_unhardened,
|
|
31
30
|
master_sk_to_farmer_sk,
|
|
@@ -174,8 +173,8 @@ def show_keys(
|
|
|
174
173
|
msg = "Showing all public and private keys"
|
|
175
174
|
print(msg)
|
|
176
175
|
|
|
177
|
-
def process_key_data(key_data: KeyData) ->
|
|
178
|
-
key:
|
|
176
|
+
def process_key_data(key_data: KeyData) -> dict[str, Any]:
|
|
177
|
+
key: dict[str, Any] = {}
|
|
179
178
|
sk = key_data.private_key if key_data.secrets is not None else None
|
|
180
179
|
if key_data.label is not None:
|
|
181
180
|
key["label"] = key_data.label
|
|
@@ -252,7 +251,7 @@ def delete(fingerprint: int) -> None:
|
|
|
252
251
|
|
|
253
252
|
def derive_pk_and_sk_from_hd_path(
|
|
254
253
|
master_pk: G1Element, hd_path_root: str, master_sk: Optional[PrivateKey] = None
|
|
255
|
-
) ->
|
|
254
|
+
) -> tuple[G1Element, Optional[PrivateKey], str]:
|
|
256
255
|
"""
|
|
257
256
|
Derive a private key from the provided HD path. Takes a master key and HD path as input,
|
|
258
257
|
and returns the derived key and the HD path that was used to derive it.
|
|
@@ -264,7 +263,7 @@ def derive_pk_and_sk_from_hd_path(
|
|
|
264
263
|
NONOBSERVER = 0
|
|
265
264
|
OBSERVER = 1
|
|
266
265
|
|
|
267
|
-
path:
|
|
266
|
+
path: list[str] = hd_path_root.split("/")
|
|
268
267
|
if len(path) == 0 or path[0] != "m":
|
|
269
268
|
raise ValueError("Invalid HD path. Must start with 'm'")
|
|
270
269
|
|
|
@@ -273,7 +272,7 @@ def derive_pk_and_sk_from_hd_path(
|
|
|
273
272
|
if len(path) > 0 and path[-1] == "": # remove trailing slash
|
|
274
273
|
path = path[:-1]
|
|
275
274
|
|
|
276
|
-
index_and_derivation_types:
|
|
275
|
+
index_and_derivation_types: list[tuple[int, DerivationType]] = []
|
|
277
276
|
|
|
278
277
|
# Validate path
|
|
279
278
|
for current_index_str in path:
|
|
@@ -361,9 +360,9 @@ def _clear_line_part(n: int) -> None:
|
|
|
361
360
|
def _search_derived(
|
|
362
361
|
current_pk: G1Element,
|
|
363
362
|
current_sk: Optional[PrivateKey],
|
|
364
|
-
search_terms:
|
|
363
|
+
search_terms: tuple[str, ...],
|
|
365
364
|
path: str,
|
|
366
|
-
path_indices: Optional[
|
|
365
|
+
path_indices: Optional[list[int]],
|
|
367
366
|
limit: int,
|
|
368
367
|
non_observer_derivation: bool,
|
|
369
368
|
show_progress: bool,
|
|
@@ -371,7 +370,7 @@ def _search_derived(
|
|
|
371
370
|
search_private_key: bool,
|
|
372
371
|
search_address: bool,
|
|
373
372
|
prefix: str,
|
|
374
|
-
) ->
|
|
373
|
+
) -> list[str]: # Return a subset of search_terms that were found
|
|
375
374
|
"""
|
|
376
375
|
Performs a shallow search of keys derived from the current pk/sk for items matching
|
|
377
376
|
the provided search terms.
|
|
@@ -384,15 +383,15 @@ def _search_derived(
|
|
|
384
383
|
PRIVATE_KEY = "private key"
|
|
385
384
|
WALLET_ADDRESS = "wallet address"
|
|
386
385
|
|
|
387
|
-
remaining_search_terms:
|
|
386
|
+
remaining_search_terms: dict[str, None] = dict.fromkeys(search_terms)
|
|
388
387
|
current_path: str = path
|
|
389
|
-
current_path_indices:
|
|
390
|
-
found_search_terms:
|
|
388
|
+
current_path_indices: list[int] = path_indices if path_indices is not None else []
|
|
389
|
+
found_search_terms: list[str] = []
|
|
391
390
|
|
|
392
391
|
assert not (non_observer_derivation and current_sk is None)
|
|
393
392
|
|
|
394
393
|
for index in range(limit):
|
|
395
|
-
found_items:
|
|
394
|
+
found_items: list[tuple[str, str, DerivedSearchResultType]] = []
|
|
396
395
|
printed_match: bool = False
|
|
397
396
|
current_index_str = str(index) + ("n" if non_observer_derivation else "")
|
|
398
397
|
current_path += f"{current_index_str}"
|
|
@@ -480,11 +479,11 @@ def _search_derived(
|
|
|
480
479
|
def search_derive(
|
|
481
480
|
root_path: Path,
|
|
482
481
|
fingerprint: Optional[int],
|
|
483
|
-
search_terms:
|
|
482
|
+
search_terms: tuple[str, ...],
|
|
484
483
|
limit: int,
|
|
485
484
|
non_observer_derivation: bool,
|
|
486
485
|
show_progress: bool,
|
|
487
|
-
search_types:
|
|
486
|
+
search_types: tuple[str, ...],
|
|
488
487
|
derive_from_hd_path: Optional[str],
|
|
489
488
|
prefix: Optional[str],
|
|
490
489
|
private_key: Optional[PrivateKey],
|
|
@@ -497,13 +496,13 @@ def search_derive(
|
|
|
497
496
|
from time import perf_counter
|
|
498
497
|
|
|
499
498
|
start_time = perf_counter()
|
|
500
|
-
remaining_search_terms:
|
|
499
|
+
remaining_search_terms: dict[str, None] = dict.fromkeys(search_terms) # poor man's ordered set
|
|
501
500
|
search_address = "address" in search_types
|
|
502
501
|
search_public_key = "public_key" in search_types
|
|
503
502
|
search_private_key = "private_key" in search_types
|
|
504
503
|
|
|
505
504
|
if prefix is None:
|
|
506
|
-
config:
|
|
505
|
+
config: dict[str, Any] = load_config(root_path, "config.yaml")
|
|
507
506
|
selected: str = config["selected_network"]
|
|
508
507
|
prefix = config["network_overrides"]["config"][selected]["address_prefix"]
|
|
509
508
|
|
|
@@ -513,8 +512,8 @@ def search_derive(
|
|
|
513
512
|
search_private_key = True
|
|
514
513
|
|
|
515
514
|
if fingerprint is None and private_key is None:
|
|
516
|
-
public_keys:
|
|
517
|
-
private_keys:
|
|
515
|
+
public_keys: list[G1Element] = Keychain().get_all_public_keys()
|
|
516
|
+
private_keys: list[Optional[PrivateKey]] = [
|
|
518
517
|
data.private_key if data.secrets is not None else None for data in Keychain().get_keys(include_secrets=True)
|
|
519
518
|
]
|
|
520
519
|
elif fingerprint is None:
|
|
@@ -530,7 +529,7 @@ def search_derive(
|
|
|
530
529
|
if sk is None and non_observer_derivation:
|
|
531
530
|
continue
|
|
532
531
|
current_path: str = ""
|
|
533
|
-
found_terms:
|
|
532
|
+
found_terms: list[str] = []
|
|
534
533
|
|
|
535
534
|
if show_progress:
|
|
536
535
|
print(f"Searching keys derived from: {pk.get_fingerprint()}")
|
|
@@ -571,7 +570,7 @@ def search_derive(
|
|
|
571
570
|
current_path = hd_path_root
|
|
572
571
|
# Otherwise derive from well-known derivation paths
|
|
573
572
|
else:
|
|
574
|
-
current_path_indices:
|
|
573
|
+
current_path_indices: list[int] = [12381, 8444]
|
|
575
574
|
path_root: str = "m/"
|
|
576
575
|
for i in [12381, 8444]:
|
|
577
576
|
path_root += f"{i}{'n' if non_observer_derivation else ''}/"
|
|
@@ -668,10 +667,10 @@ def derive_wallet_address(
|
|
|
668
667
|
pk = sk.get_g1()
|
|
669
668
|
|
|
670
669
|
if prefix is None:
|
|
671
|
-
config:
|
|
670
|
+
config: dict[str, Any] = load_config(root_path, "config.yaml")
|
|
672
671
|
selected: str = config["selected_network"]
|
|
673
672
|
prefix = config["network_overrides"]["config"][selected]["address_prefix"]
|
|
674
|
-
path_indices:
|
|
673
|
+
path_indices: list[int] = [12381, 8444, 2]
|
|
675
674
|
wallet_hd_path_root: str = "m/"
|
|
676
675
|
for i in path_indices:
|
|
677
676
|
wallet_hd_path_root += f"{i}{'n' if non_observer_derivation else ''}/"
|
|
@@ -728,7 +727,7 @@ def derive_child_key(
|
|
|
728
727
|
|
|
729
728
|
# Key type was specified
|
|
730
729
|
if key_type is not None:
|
|
731
|
-
path_indices:
|
|
730
|
+
path_indices: list[int] = [12381, 8444]
|
|
732
731
|
path_indices.append(
|
|
733
732
|
{
|
|
734
733
|
"farmer": 0,
|
|
@@ -802,11 +801,11 @@ def private_key_for_fingerprint(fingerprint: int) -> Optional[PrivateKey]:
|
|
|
802
801
|
|
|
803
802
|
|
|
804
803
|
def prompt_for_fingerprint() -> Optional[int]:
|
|
805
|
-
fingerprints:
|
|
804
|
+
fingerprints: list[int] = [pk.get_fingerprint() for pk in Keychain().get_all_public_keys()]
|
|
806
805
|
while True:
|
|
807
806
|
print("Choose key:")
|
|
808
807
|
for i, fp in enumerate(fingerprints):
|
|
809
|
-
print(f"{i+1}) {fp}")
|
|
808
|
+
print(f"{i + 1}) {fp}")
|
|
810
809
|
val = None
|
|
811
810
|
while val is None:
|
|
812
811
|
val = input("Enter a number to pick or q to quit: ")
|
|
@@ -826,7 +825,7 @@ def prompt_for_fingerprint() -> Optional[int]:
|
|
|
826
825
|
|
|
827
826
|
def get_private_key_with_fingerprint_or_prompt(
|
|
828
827
|
fingerprint: Optional[int],
|
|
829
|
-
) ->
|
|
828
|
+
) -> tuple[Optional[int], Optional[PrivateKey]]:
|
|
830
829
|
"""
|
|
831
830
|
Get a private key with the specified fingerprint. If fingerprint is not
|
|
832
831
|
specified, prompt the user to select a key.
|
|
@@ -851,8 +850,8 @@ def private_key_from_mnemonic_seed_file(filename: Path) -> PrivateKey:
|
|
|
851
850
|
|
|
852
851
|
|
|
853
852
|
def resolve_derivation_master_key(
|
|
854
|
-
fingerprint_or_filename: Optional[Union[int, str, Path]]
|
|
855
|
-
) ->
|
|
853
|
+
fingerprint_or_filename: Optional[Union[int, str, Path]],
|
|
854
|
+
) -> tuple[Optional[int], Optional[PrivateKey]]:
|
|
856
855
|
"""
|
|
857
856
|
Given a key fingerprint of file containing a mnemonic seed, return the private key.
|
|
858
857
|
"""
|
chia/cmds/netspace.py
CHANGED
|
@@ -4,6 +4,8 @@ from typing import Optional
|
|
|
4
4
|
|
|
5
5
|
import click
|
|
6
6
|
|
|
7
|
+
from chia.cmds.cmd_classes import ChiaCliContext
|
|
8
|
+
|
|
7
9
|
|
|
8
10
|
@click.command("netspace", help="Estimate total farmed space on the network")
|
|
9
11
|
@click.option(
|
|
@@ -36,12 +38,13 @@ import click
|
|
|
36
38
|
type=str,
|
|
37
39
|
default="",
|
|
38
40
|
)
|
|
39
|
-
|
|
41
|
+
@click.pass_context
|
|
42
|
+
def netspace_cmd(ctx: click.Context, rpc_port: Optional[int], delta_block_height: str, start: str) -> None:
|
|
40
43
|
"""
|
|
41
44
|
Calculates the estimated space on the network given two block header hashes.
|
|
42
45
|
"""
|
|
43
46
|
import asyncio
|
|
44
47
|
|
|
45
|
-
from .netspace_funcs import netstorge_async
|
|
48
|
+
from chia.cmds.netspace_funcs import netstorge_async
|
|
46
49
|
|
|
47
|
-
asyncio.run(netstorge_async(rpc_port, delta_block_height, start))
|
|
50
|
+
asyncio.run(netstorge_async(ChiaCliContext.set_default(ctx).root_path, rpc_port, delta_block_height, start))
|
chia/cmds/netspace_funcs.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
from pathlib import Path
|
|
3
4
|
from typing import Optional
|
|
4
5
|
|
|
5
6
|
from chia.cmds.cmds_util import format_bytes, get_any_service_client
|
|
@@ -7,11 +8,11 @@ from chia.rpc.full_node_rpc_client import FullNodeRpcClient
|
|
|
7
8
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
8
9
|
|
|
9
10
|
|
|
10
|
-
async def netstorge_async(rpc_port: Optional[int], delta_block_height: str, start: str) -> None:
|
|
11
|
+
async def netstorge_async(root_path: Path, rpc_port: Optional[int], delta_block_height: str, start: str) -> None:
|
|
11
12
|
"""
|
|
12
13
|
Calculates the estimated space on the network given two block header hashes.
|
|
13
14
|
"""
|
|
14
|
-
async with get_any_service_client(FullNodeRpcClient, rpc_port) as (client, _):
|
|
15
|
+
async with get_any_service_client(FullNodeRpcClient, root_path, rpc_port) as (client, _):
|
|
15
16
|
if delta_block_height:
|
|
16
17
|
if start == "":
|
|
17
18
|
blockchain_state = await client.get_blockchain_state()
|
chia/cmds/param_types.py
CHANGED
|
@@ -6,6 +6,7 @@ from typing import Any, Callable, Optional, Union
|
|
|
6
6
|
|
|
7
7
|
import click
|
|
8
8
|
|
|
9
|
+
from chia.cmds.cmd_classes import ChiaCliContext
|
|
9
10
|
from chia.cmds.units import units
|
|
10
11
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
11
12
|
from chia.util.bech32m import bech32_decode, decode_puzzle_hash
|
|
@@ -170,17 +171,26 @@ class AddressParamType(click.ParamType):
|
|
|
170
171
|
if not isinstance(value, str):
|
|
171
172
|
self.fail("Invalid Type, address must be string.", param, ctx)
|
|
172
173
|
try:
|
|
173
|
-
hrp,
|
|
174
|
-
if hrp in
|
|
174
|
+
hrp, _b32data = bech32_decode(value)
|
|
175
|
+
if hrp in {"xch", "txch"}: # I hate having to load the config here
|
|
175
176
|
addr_type: AddressType = AddressType.XCH
|
|
176
|
-
|
|
177
|
+
|
|
178
|
+
# attempt to get cached prefix
|
|
179
|
+
expected_prefix: Optional[str] = None
|
|
180
|
+
root_path = DEFAULT_ROOT_PATH
|
|
181
|
+
|
|
182
|
+
if ctx is not None:
|
|
183
|
+
context = ChiaCliContext.set_default(ctx)
|
|
184
|
+
root_path = context.root_path
|
|
185
|
+
expected_prefix = context.expected_prefix
|
|
186
|
+
|
|
177
187
|
if expected_prefix is None:
|
|
178
|
-
root_path = ctx.obj["root_path"] if ctx is not None else DEFAULT_ROOT_PATH
|
|
179
188
|
config = load_config(root_path, "config.yaml")
|
|
180
189
|
expected_prefix = selected_network_address_prefix(config)
|
|
181
190
|
|
|
182
|
-
|
|
183
|
-
|
|
191
|
+
if ctx is not None:
|
|
192
|
+
context.expected_prefix = expected_prefix # cache prefix
|
|
193
|
+
|
|
184
194
|
# now that we have the expected prefix, we can validate the address is for the right network
|
|
185
195
|
if hrp != expected_prefix:
|
|
186
196
|
self.fail(f"Unexpected Address Prefix: {hrp}, are you sure its for the right network?", param, ctx)
|
chia/cmds/passphrase.py
CHANGED
|
@@ -7,6 +7,7 @@ from typing import Optional
|
|
|
7
7
|
|
|
8
8
|
import click
|
|
9
9
|
|
|
10
|
+
from chia.cmds.cmd_classes import ChiaCliContext
|
|
10
11
|
from chia.util.config import load_config
|
|
11
12
|
|
|
12
13
|
|
|
@@ -34,7 +35,7 @@ def set_cmd(
|
|
|
34
35
|
current_passphrase_file: Optional[TextIOWrapper],
|
|
35
36
|
hint: Optional[str],
|
|
36
37
|
) -> None:
|
|
37
|
-
from .passphrase_funcs import (
|
|
38
|
+
from chia.cmds.passphrase_funcs import (
|
|
38
39
|
async_update_daemon_passphrase_cache_if_running,
|
|
39
40
|
read_passphrase_from_file,
|
|
40
41
|
set_or_update_passphrase,
|
|
@@ -70,7 +71,7 @@ def set_cmd(
|
|
|
70
71
|
|
|
71
72
|
if success:
|
|
72
73
|
# Attempt to update the daemon's passphrase cache
|
|
73
|
-
root_path = ctx.
|
|
74
|
+
root_path = ChiaCliContext.set_default(ctx).root_path
|
|
74
75
|
config = load_config(root_path, "config.yaml")
|
|
75
76
|
sys.exit(asyncio.run(async_update_daemon_passphrase_cache_if_running(root_path, config)))
|
|
76
77
|
|
|
@@ -86,7 +87,7 @@ def set_cmd(
|
|
|
86
87
|
)
|
|
87
88
|
@click.pass_context
|
|
88
89
|
def remove_cmd(ctx: click.Context, current_passphrase_file: Optional[TextIOWrapper]) -> None:
|
|
89
|
-
from .passphrase_funcs import (
|
|
90
|
+
from chia.cmds.passphrase_funcs import (
|
|
90
91
|
async_update_daemon_passphrase_cache_if_running,
|
|
91
92
|
read_passphrase_from_file,
|
|
92
93
|
remove_passphrase,
|
|
@@ -98,7 +99,7 @@ def remove_cmd(ctx: click.Context, current_passphrase_file: Optional[TextIOWrapp
|
|
|
98
99
|
|
|
99
100
|
if remove_passphrase(current_passphrase):
|
|
100
101
|
# Attempt to update the daemon's passphrase cache
|
|
101
|
-
root_path = ctx.
|
|
102
|
+
root_path = ChiaCliContext.set_default(ctx).root_path
|
|
102
103
|
config = load_config(root_path, "config.yaml")
|
|
103
104
|
sys.exit(asyncio.run(async_update_daemon_passphrase_cache_if_running(root_path, config)))
|
|
104
105
|
|
|
@@ -110,7 +111,7 @@ def hint_cmd() -> None:
|
|
|
110
111
|
|
|
111
112
|
@hint_cmd.command("display", help="Display the keyring passphrase hint")
|
|
112
113
|
def display_hint() -> None:
|
|
113
|
-
from .passphrase_funcs import display_passphrase_hint
|
|
114
|
+
from chia.cmds.passphrase_funcs import display_passphrase_hint
|
|
114
115
|
|
|
115
116
|
display_passphrase_hint()
|
|
116
117
|
|
|
@@ -118,13 +119,13 @@ def display_hint() -> None:
|
|
|
118
119
|
@hint_cmd.command("set", help="Set or update the keyring passphrase hint")
|
|
119
120
|
@click.argument("hint", nargs=1)
|
|
120
121
|
def set_hint(hint: str) -> None:
|
|
121
|
-
from .passphrase_funcs import set_passphrase_hint
|
|
122
|
+
from chia.cmds.passphrase_funcs import set_passphrase_hint
|
|
122
123
|
|
|
123
124
|
set_passphrase_hint(hint)
|
|
124
125
|
|
|
125
126
|
|
|
126
127
|
@hint_cmd.command("remove", help="Remove the keyring passphrase hint")
|
|
127
128
|
def remove_hint() -> None:
|
|
128
|
-
from .passphrase_funcs import remove_passphrase_hint
|
|
129
|
+
from chia.cmds.passphrase_funcs import remove_passphrase_hint
|
|
129
130
|
|
|
130
131
|
remove_passphrase_hint()
|
chia/cmds/passphrase_funcs.py
CHANGED
|
@@ -2,25 +2,18 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
4
|
import sys
|
|
5
|
-
import time
|
|
6
5
|
from getpass import getpass
|
|
7
6
|
from io import TextIOWrapper
|
|
8
7
|
from pathlib import Path
|
|
9
|
-
from typing import Any,
|
|
8
|
+
from typing import Any, Optional
|
|
10
9
|
|
|
10
|
+
import click
|
|
11
11
|
import colorama
|
|
12
12
|
|
|
13
|
-
from chia.cmds.cmds_util import prompt_yes_no
|
|
14
13
|
from chia.daemon.client import acquire_connection_to_daemon
|
|
15
|
-
from chia.util.errors import KeychainMaxUnlockAttempts
|
|
16
14
|
from chia.util.keychain import Keychain, supports_os_passphrase_storage
|
|
17
|
-
from chia.util.keyring_wrapper import DEFAULT_PASSPHRASE_IF_NO_MASTER_PASSPHRASE,
|
|
15
|
+
from chia.util.keyring_wrapper import DEFAULT_PASSPHRASE_IF_NO_MASTER_PASSPHRASE, obtain_current_passphrase
|
|
18
16
|
|
|
19
|
-
DEFAULT_PASSPHRASE_PROMPT = (
|
|
20
|
-
colorama.Fore.YELLOW + colorama.Style.BRIGHT + "(Unlock Keyring)" + colorama.Style.RESET_ALL + " Passphrase: "
|
|
21
|
-
) # noqa: E501
|
|
22
|
-
FAILED_ATTEMPT_DELAY = 0.5
|
|
23
|
-
MAX_RETRIES = 3
|
|
24
17
|
SAVE_MASTER_PASSPHRASE_WARNING = (
|
|
25
18
|
colorama.Fore.YELLOW
|
|
26
19
|
+ colorama.Style.BRIGHT
|
|
@@ -31,49 +24,9 @@ SAVE_MASTER_PASSPHRASE_WARNING = (
|
|
|
31
24
|
)
|
|
32
25
|
|
|
33
26
|
|
|
34
|
-
def obtain_current_passphrase(prompt: str = DEFAULT_PASSPHRASE_PROMPT, use_passphrase_cache: bool = False) -> str:
|
|
35
|
-
"""
|
|
36
|
-
Obtains the master passphrase for the keyring, optionally using the cached
|
|
37
|
-
value (if previously set). If the passphrase isn't already cached, the user is
|
|
38
|
-
prompted interactively to enter their passphrase a max of MAX_RETRIES times
|
|
39
|
-
before failing.
|
|
40
|
-
"""
|
|
41
|
-
|
|
42
|
-
if use_passphrase_cache:
|
|
43
|
-
passphrase, validated = KeyringWrapper.get_shared_instance().get_cached_master_passphrase()
|
|
44
|
-
if passphrase:
|
|
45
|
-
# If the cached passphrase was previously validated, we assume it's... valid
|
|
46
|
-
if validated:
|
|
47
|
-
return passphrase
|
|
48
|
-
|
|
49
|
-
# Cached passphrase needs to be validated
|
|
50
|
-
if KeyringWrapper.get_shared_instance().master_passphrase_is_valid(passphrase):
|
|
51
|
-
KeyringWrapper.get_shared_instance().set_cached_master_passphrase(passphrase, validated=True)
|
|
52
|
-
return passphrase
|
|
53
|
-
else:
|
|
54
|
-
# Cached passphrase is bad, clear the cache
|
|
55
|
-
KeyringWrapper.get_shared_instance().set_cached_master_passphrase(None)
|
|
56
|
-
|
|
57
|
-
# Prompt interactively with up to MAX_RETRIES attempts
|
|
58
|
-
for i in range(MAX_RETRIES):
|
|
59
|
-
colorama.init()
|
|
60
|
-
|
|
61
|
-
passphrase = prompt_for_passphrase(prompt)
|
|
62
|
-
|
|
63
|
-
if KeyringWrapper.get_shared_instance().master_passphrase_is_valid(passphrase):
|
|
64
|
-
# If using the passphrase cache, and the user inputted a passphrase, update the cache
|
|
65
|
-
if use_passphrase_cache:
|
|
66
|
-
KeyringWrapper.get_shared_instance().set_cached_master_passphrase(passphrase, validated=True)
|
|
67
|
-
return passphrase
|
|
68
|
-
|
|
69
|
-
time.sleep(FAILED_ATTEMPT_DELAY)
|
|
70
|
-
print("Incorrect passphrase\n")
|
|
71
|
-
raise KeychainMaxUnlockAttempts()
|
|
72
|
-
|
|
73
|
-
|
|
74
27
|
def verify_passphrase_meets_requirements(
|
|
75
28
|
new_passphrase: str, confirmation_passphrase: str
|
|
76
|
-
) ->
|
|
29
|
+
) -> tuple[bool, Optional[str]]:
|
|
77
30
|
match = new_passphrase == confirmation_passphrase
|
|
78
31
|
min_length = Keychain.minimum_passphrase_length()
|
|
79
32
|
meets_len_requirement = len(new_passphrase) >= min_length
|
|
@@ -88,13 +41,6 @@ def verify_passphrase_meets_requirements(
|
|
|
88
41
|
raise Exception("Unexpected passphrase verification case")
|
|
89
42
|
|
|
90
43
|
|
|
91
|
-
def prompt_for_passphrase(prompt: str) -> str:
|
|
92
|
-
if sys.platform == "win32" or sys.platform == "cygwin":
|
|
93
|
-
print(prompt, end="", flush=True)
|
|
94
|
-
prompt = ""
|
|
95
|
-
return getpass(prompt)
|
|
96
|
-
|
|
97
|
-
|
|
98
44
|
def prompt_to_save_passphrase() -> bool:
|
|
99
45
|
save: bool = False
|
|
100
46
|
|
|
@@ -122,7 +68,7 @@ def prompt_to_save_passphrase() -> bool:
|
|
|
122
68
|
colorama.init()
|
|
123
69
|
|
|
124
70
|
print(warning)
|
|
125
|
-
save =
|
|
71
|
+
save = click.confirm(f"Would you like to save your passphrase to the {location}?", default=None)
|
|
126
72
|
|
|
127
73
|
except Exception as e:
|
|
128
74
|
print(f"Caught exception: {e}")
|
|
@@ -131,7 +77,7 @@ def prompt_to_save_passphrase() -> bool:
|
|
|
131
77
|
return save
|
|
132
78
|
|
|
133
79
|
|
|
134
|
-
def prompt_for_new_passphrase() ->
|
|
80
|
+
def prompt_for_new_passphrase() -> tuple[str, bool]:
|
|
135
81
|
min_length: int = Keychain.minimum_passphrase_length()
|
|
136
82
|
if min_length > 0:
|
|
137
83
|
n = min_length
|
|
@@ -324,7 +270,7 @@ def remove_passphrase_hint() -> None:
|
|
|
324
270
|
print("Passphrase hint was not removed")
|
|
325
271
|
|
|
326
272
|
|
|
327
|
-
async def async_update_daemon_passphrase_cache_if_running(root_path: Path, config:
|
|
273
|
+
async def async_update_daemon_passphrase_cache_if_running(root_path: Path, config: dict[str, Any]) -> None:
|
|
328
274
|
"""
|
|
329
275
|
Attempt to connect to the daemon and update the cached passphrase
|
|
330
276
|
"""
|
chia/cmds/peer.py
CHANGED
|
@@ -4,6 +4,7 @@ from typing import Optional
|
|
|
4
4
|
|
|
5
5
|
import click
|
|
6
6
|
|
|
7
|
+
from chia.cmds.cmd_classes import ChiaCliContext
|
|
7
8
|
from chia.cmds.cmds_util import NODE_TYPES
|
|
8
9
|
from chia.cmds.peer_funcs import peer_async
|
|
9
10
|
|
|
@@ -42,7 +43,7 @@ def peer_cmd(
|
|
|
42
43
|
peer_async(
|
|
43
44
|
node_type,
|
|
44
45
|
rpc_port,
|
|
45
|
-
ctx.
|
|
46
|
+
ChiaCliContext.set_default(ctx).root_path,
|
|
46
47
|
connections,
|
|
47
48
|
add_connection,
|
|
48
49
|
remove_connection,
|
chia/cmds/peer_funcs.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from typing import Any,
|
|
4
|
+
from typing import Any, Optional
|
|
5
5
|
|
|
6
6
|
from chia.cmds.cmds_util import NODE_TYPES, get_any_service_client
|
|
7
7
|
from chia.rpc.rpc_client import RpcClient
|
|
@@ -49,7 +49,7 @@ async def remove_node_connection(rpc_client: RpcClient, remove_connection: str)
|
|
|
49
49
|
print(result_txt)
|
|
50
50
|
|
|
51
51
|
|
|
52
|
-
async def print_connections(rpc_client: RpcClient, trusted_peers:
|
|
52
|
+
async def print_connections(rpc_client: RpcClient, trusted_peers: dict[str, Any], trusted_cidrs: list[str]) -> None:
|
|
53
53
|
import time
|
|
54
54
|
|
|
55
55
|
from chia.server.outbound_message import NodeType
|
|
@@ -116,11 +116,11 @@ async def peer_async(
|
|
|
116
116
|
remove_connection: str,
|
|
117
117
|
) -> None:
|
|
118
118
|
client_type = NODE_TYPES[node_type]
|
|
119
|
-
async with get_any_service_client(client_type,
|
|
119
|
+
async with get_any_service_client(client_type, root_path, rpc_port) as (rpc_client, config):
|
|
120
120
|
# Check or edit node connections
|
|
121
121
|
if show_connections:
|
|
122
|
-
trusted_peers:
|
|
123
|
-
trusted_cidrs:
|
|
122
|
+
trusted_peers: dict[str, Any] = config[node_type].get("trusted_peers", {})
|
|
123
|
+
trusted_cidrs: list[str] = config[node_type].get("trusted_cidrs", [])
|
|
124
124
|
await print_connections(rpc_client, trusted_peers, trusted_cidrs)
|
|
125
125
|
# if called together with state, leave a blank line
|
|
126
126
|
if add_connection:
|