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
chia/cmds/gh.py
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
import shlex
|
|
6
|
+
import urllib
|
|
7
|
+
import uuid
|
|
8
|
+
import webbrowser
|
|
9
|
+
from collections.abc import Sequence
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Callable, ClassVar, Literal, Optional, Union, overload
|
|
12
|
+
|
|
13
|
+
import anyio
|
|
14
|
+
import click
|
|
15
|
+
import yaml
|
|
16
|
+
|
|
17
|
+
from chia.cmds.cmd_classes import chia_command, option
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class UnexpectedFormError(Exception):
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
Oses = Union[Literal["linux"], Literal["macos-arm"], Literal["macos-intel"], Literal["windows"]]
|
|
25
|
+
Method = Union[Literal["GET"], Literal["POST"]]
|
|
26
|
+
Per = Union[Literal["directory"], Literal["file"]]
|
|
27
|
+
|
|
28
|
+
all_oses: Sequence[Oses] = ("linux", "macos-arm", "macos-intel", "windows")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def report(*args: str) -> None:
|
|
32
|
+
print(" ====", *args)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
async def get_gh_token() -> str:
|
|
36
|
+
command = ["gh", "auth", "token"]
|
|
37
|
+
report(f"running command: {shlex.join(command)}")
|
|
38
|
+
process = await anyio.run_process(command=command, check=False, stderr=None)
|
|
39
|
+
|
|
40
|
+
if process.returncode != 0:
|
|
41
|
+
raise click.ClickException("failed to get gh cli personal access token")
|
|
42
|
+
|
|
43
|
+
return process.stdout.decode("utf-8").strip()
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@overload
|
|
47
|
+
async def run_gh_api(method: Method, args: list[str], error: str) -> None: ...
|
|
48
|
+
@overload
|
|
49
|
+
async def run_gh_api(method: Method, args: list[str], error: str, capture_stdout: Literal[False]) -> None: ...
|
|
50
|
+
@overload
|
|
51
|
+
async def run_gh_api(method: Method, args: list[str], error: str, capture_stdout: Literal[True]) -> str: ...
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
async def run_gh_api(method: Method, args: list[str], error: str, capture_stdout: bool = False) -> Optional[str]:
|
|
55
|
+
command = [
|
|
56
|
+
"gh",
|
|
57
|
+
"api",
|
|
58
|
+
f"--method={method}",
|
|
59
|
+
"-H=Accept: application/vnd.github+json",
|
|
60
|
+
"-H=X-GitHub-Api-Version: 2022-11-28",
|
|
61
|
+
*args,
|
|
62
|
+
]
|
|
63
|
+
report(f"running command: {shlex.join(command)}")
|
|
64
|
+
|
|
65
|
+
if capture_stdout:
|
|
66
|
+
process = await anyio.run_process(command=command, check=False, stderr=None)
|
|
67
|
+
else:
|
|
68
|
+
process = await anyio.run_process(command=command, check=False, stderr=None, stdout=None)
|
|
69
|
+
|
|
70
|
+
if process.returncode != 0:
|
|
71
|
+
raise click.ClickException(error)
|
|
72
|
+
|
|
73
|
+
if capture_stdout:
|
|
74
|
+
return process.stdout.decode("utf-8")
|
|
75
|
+
|
|
76
|
+
return None
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def input_arg(name: str, value: object, cond: bool = True) -> list[str]:
|
|
80
|
+
if not cond:
|
|
81
|
+
return []
|
|
82
|
+
|
|
83
|
+
assert value is not None
|
|
84
|
+
|
|
85
|
+
if isinstance(value, os.PathLike):
|
|
86
|
+
value = os.fspath(value)
|
|
87
|
+
dumped = yaml.safe_dump(value).partition("\n")[0]
|
|
88
|
+
return [f"-f=inputs[{name}]={dumped}"]
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
@click.group("gh", help="For working with GitHub")
|
|
92
|
+
def gh_group() -> None:
|
|
93
|
+
pass
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@chia_command(
|
|
97
|
+
group=gh_group,
|
|
98
|
+
name="test",
|
|
99
|
+
short_help="launch a test run in CI from HEAD or existing remote ref",
|
|
100
|
+
help="""Allows easy triggering and viewing of test workflow runs in CI including
|
|
101
|
+
configuration of parameters. If a ref is specified then it must exist on the
|
|
102
|
+
remote and a run will be launched for it. If ref is not specified then the local
|
|
103
|
+
HEAD will be pushed to a temporary remote branch and a run will be launched for
|
|
104
|
+
that. There is no need to push the local commit first. The temporary remote
|
|
105
|
+
branch will automatically be deleted in most cases.
|
|
106
|
+
|
|
107
|
+
After launching the workflow run GitHub will be queried for the run and the URL
|
|
108
|
+
will be opened in the default browser.
|
|
109
|
+
""",
|
|
110
|
+
)
|
|
111
|
+
class TestCMD:
|
|
112
|
+
workflow_id: ClassVar[str] = "test.yml"
|
|
113
|
+
owner: str = option("-o", "--owner", help="Owner of the repo", type=str, default="Chia-Network")
|
|
114
|
+
repository: str = option("-r", "--repository", help="Repository name", type=str, default="chia-blockchain")
|
|
115
|
+
ref: Optional[str] = option(
|
|
116
|
+
"-f",
|
|
117
|
+
"--ref",
|
|
118
|
+
help="Branch or tag name (commit SHA not supported), if not specified will push HEAD to a temporary branch",
|
|
119
|
+
type=str,
|
|
120
|
+
default=None,
|
|
121
|
+
)
|
|
122
|
+
per: Per = option("-p", "--per", help="Per", type=click.Choice(["directory", "file"]), default="directory")
|
|
123
|
+
only: Optional[Path] = option(
|
|
124
|
+
"-o", "--only", help="Only run this item, a file or directory depending on --per", type=Path
|
|
125
|
+
)
|
|
126
|
+
duplicates: int = option("-d", "--duplicates", help="Number of duplicates", type=int, default=1)
|
|
127
|
+
oses: Sequence[Oses] = option(
|
|
128
|
+
"--os",
|
|
129
|
+
help="Operating systems to run on",
|
|
130
|
+
type=click.Choice(all_oses),
|
|
131
|
+
multiple=True,
|
|
132
|
+
default=all_oses,
|
|
133
|
+
)
|
|
134
|
+
full_python_matrix: bool = option(
|
|
135
|
+
"--full-python-matrix/--default-python-matrix", help="Run on all Python versions", default=False
|
|
136
|
+
)
|
|
137
|
+
remote: str = option("-r", "--remote", help="Name of git remote", type=str, default="origin")
|
|
138
|
+
open_browser: bool = option("--open-browser/--no-open-browser", help="Open browser", default=True)
|
|
139
|
+
|
|
140
|
+
async def run(self) -> None:
|
|
141
|
+
await self.check_only()
|
|
142
|
+
|
|
143
|
+
username = await self.get_username()
|
|
144
|
+
|
|
145
|
+
if self.ref is not None:
|
|
146
|
+
await self.trigger_workflow(self.ref)
|
|
147
|
+
query = "+".join(
|
|
148
|
+
[
|
|
149
|
+
"event=workflow_dispatch",
|
|
150
|
+
f"branch={self.ref}",
|
|
151
|
+
f"actor={username}",
|
|
152
|
+
]
|
|
153
|
+
)
|
|
154
|
+
run_url = f"https://github.com/Chia-Network/chia-blockchain/actions/workflows/test.yml?query={urllib.parse.quote(query)}"
|
|
155
|
+
report(f"waiting a few seconds to load: {run_url}")
|
|
156
|
+
await anyio.sleep(10)
|
|
157
|
+
else:
|
|
158
|
+
process = await anyio.run_process(command=["git", "rev-parse", "HEAD"], check=True, stderr=None)
|
|
159
|
+
if process.returncode != 0:
|
|
160
|
+
raise click.ClickException("Failed to get current commit SHA")
|
|
161
|
+
|
|
162
|
+
commit_sha = process.stdout.decode("utf-8").strip()
|
|
163
|
+
|
|
164
|
+
temp_branch_name = f"tmp/{username}/{commit_sha}/{uuid.uuid4()}"
|
|
165
|
+
|
|
166
|
+
process = await anyio.run_process(
|
|
167
|
+
command=["git", "push", self.remote, f"HEAD:{temp_branch_name}"], check=False, stdout=None, stderr=None
|
|
168
|
+
)
|
|
169
|
+
if process.returncode != 0:
|
|
170
|
+
raise click.ClickException("Failed to push temporary branch")
|
|
171
|
+
|
|
172
|
+
try:
|
|
173
|
+
await self.trigger_workflow(temp_branch_name)
|
|
174
|
+
for _ in range(10):
|
|
175
|
+
await anyio.sleep(1)
|
|
176
|
+
|
|
177
|
+
try:
|
|
178
|
+
report("looking for run")
|
|
179
|
+
html_url, api_url = await self.find_run(temp_branch_name)
|
|
180
|
+
report(f"run found at: {html_url}")
|
|
181
|
+
report(f"run found at: {api_url}")
|
|
182
|
+
except UnexpectedFormError:
|
|
183
|
+
report("run not found")
|
|
184
|
+
continue
|
|
185
|
+
|
|
186
|
+
break
|
|
187
|
+
else:
|
|
188
|
+
raise click.ClickException("Failed to find run url")
|
|
189
|
+
finally:
|
|
190
|
+
report(f"deleting temporary branch: {temp_branch_name}")
|
|
191
|
+
process = await anyio.run_process(
|
|
192
|
+
command=["git", "push", self.remote, "-d", temp_branch_name], check=False, stdout=None, stderr=None
|
|
193
|
+
)
|
|
194
|
+
if process.returncode != 0:
|
|
195
|
+
raise click.ClickException("Failed to dispatch workflow")
|
|
196
|
+
report(f"temporary branch deleted: {temp_branch_name}")
|
|
197
|
+
|
|
198
|
+
report(f"run html url: {html_url}")
|
|
199
|
+
report(f"run api url: {api_url}")
|
|
200
|
+
if self.open_browser:
|
|
201
|
+
webbrowser.open(html_url)
|
|
202
|
+
|
|
203
|
+
async def check_only(self) -> None:
|
|
204
|
+
if self.only is not None:
|
|
205
|
+
import chia._tests
|
|
206
|
+
|
|
207
|
+
test_path = Path(chia._tests.__file__).parent
|
|
208
|
+
effective_path = test_path.joinpath(self.only)
|
|
209
|
+
checks: dict[Per, Callable[[], bool]] = {"directory": effective_path.is_dir, "file": effective_path.is_file}
|
|
210
|
+
check = checks[self.per]
|
|
211
|
+
if not check():
|
|
212
|
+
if effective_path.exists():
|
|
213
|
+
explanation = "wrong type"
|
|
214
|
+
else:
|
|
215
|
+
explanation = "does not exist"
|
|
216
|
+
message = f"expected requested --only to be a {self.per}, {explanation} at: {effective_path.as_posix()}"
|
|
217
|
+
raise click.ClickException(message)
|
|
218
|
+
|
|
219
|
+
async def trigger_workflow(self, ref: str) -> None:
|
|
220
|
+
# https://docs.github.com/en/rest/actions/workflows?apiVersion=2022-11-28#create-a-workflow-dispatch-event
|
|
221
|
+
await run_gh_api(
|
|
222
|
+
method="POST",
|
|
223
|
+
args=[
|
|
224
|
+
f"/repos/{self.owner}/{self.repository}/actions/workflows/{self.workflow_id}/dispatches",
|
|
225
|
+
f"-f=ref={ref}",
|
|
226
|
+
*input_arg("per", self.per),
|
|
227
|
+
*input_arg("only", self.only, self.only is not None),
|
|
228
|
+
*input_arg("duplicates", self.duplicates),
|
|
229
|
+
*(arg for os_name in all_oses for arg in input_arg(f"run-{os_name}", os_name in self.oses)),
|
|
230
|
+
*input_arg("full-python-matrix", self.full_python_matrix),
|
|
231
|
+
],
|
|
232
|
+
error="Failed to dispatch workflow",
|
|
233
|
+
)
|
|
234
|
+
report(f"workflow triggered on branch: {ref}")
|
|
235
|
+
|
|
236
|
+
async def find_run(self, ref: str) -> tuple[str, str]:
|
|
237
|
+
# https://docs.github.com/en/rest/actions/workflow-runs?apiVersion=2022-11-28#list-workflow-runs-for-a-workflow
|
|
238
|
+
stdout = await run_gh_api(
|
|
239
|
+
method="GET",
|
|
240
|
+
args=[
|
|
241
|
+
f"-f=branch={ref}",
|
|
242
|
+
f"/repos/{self.owner}/{self.repository}/actions/workflows/{self.workflow_id}/runs",
|
|
243
|
+
],
|
|
244
|
+
error="Failed to query workflow runs",
|
|
245
|
+
capture_stdout=True,
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
response = json.loads(stdout)
|
|
249
|
+
runs = response["workflow_runs"]
|
|
250
|
+
try:
|
|
251
|
+
[run] = runs
|
|
252
|
+
except ValueError:
|
|
253
|
+
raise UnexpectedFormError(f"expected 1 run, got: {len(runs)}")
|
|
254
|
+
|
|
255
|
+
html_url = run["html_url"]
|
|
256
|
+
assert isinstance(html_url, str), f"expected html url to be a string, got: {html_url!r}"
|
|
257
|
+
|
|
258
|
+
api_url = run["url"]
|
|
259
|
+
assert isinstance(api_url, str), f"expected url to be a string, got: {api_url!r}"
|
|
260
|
+
|
|
261
|
+
return html_url, api_url
|
|
262
|
+
|
|
263
|
+
async def get_username(self) -> str:
|
|
264
|
+
# https://docs.github.com/en/rest/users/users?apiVersion=2022-11-28#get-the-authenticated-user
|
|
265
|
+
stdout = await run_gh_api(
|
|
266
|
+
method="GET",
|
|
267
|
+
args=["/user"],
|
|
268
|
+
error="Failed to get username",
|
|
269
|
+
capture_stdout=True,
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
response = json.loads(stdout)
|
|
273
|
+
username = response["login"]
|
|
274
|
+
assert isinstance(username, str), f"expected username to be a string, got: {username!r}"
|
|
275
|
+
return username
|
chia/cmds/init.py
CHANGED
|
@@ -2,6 +2,8 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import click
|
|
4
4
|
|
|
5
|
+
from chia.cmds.cmd_classes import ChiaCliContext
|
|
6
|
+
|
|
5
7
|
|
|
6
8
|
@click.command("init", help="Create or migrate the configuration")
|
|
7
9
|
@click.option(
|
|
@@ -46,25 +48,16 @@ def init_cmd(
|
|
|
46
48
|
"""
|
|
47
49
|
from pathlib import Path
|
|
48
50
|
|
|
51
|
+
from chia.cmds.init_funcs import init
|
|
49
52
|
from chia.cmds.passphrase_funcs import initialize_passphrase
|
|
50
53
|
|
|
51
|
-
from .init_funcs import init
|
|
52
|
-
|
|
53
54
|
if set_passphrase:
|
|
54
55
|
initialize_passphrase()
|
|
55
56
|
|
|
56
57
|
init(
|
|
57
58
|
Path(create_certs) if create_certs is not None else None,
|
|
58
|
-
ctx.
|
|
59
|
+
ChiaCliContext.set_default(ctx).root_path,
|
|
59
60
|
fix_ssl_permissions,
|
|
60
61
|
testnet,
|
|
61
62
|
v1_db,
|
|
62
63
|
)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if __name__ == "__main__":
|
|
66
|
-
from chia.util.default_root import DEFAULT_ROOT_PATH
|
|
67
|
-
|
|
68
|
-
from .init_funcs import chia_init
|
|
69
|
-
|
|
70
|
-
chia_init(DEFAULT_ROOT_PATH)
|
chia/cmds/init_funcs.py
CHANGED
|
@@ -4,7 +4,7 @@ import os
|
|
|
4
4
|
import shutil
|
|
5
5
|
import sqlite3
|
|
6
6
|
from pathlib import Path
|
|
7
|
-
from typing import Any,
|
|
7
|
+
from typing import Any, Optional
|
|
8
8
|
|
|
9
9
|
import yaml
|
|
10
10
|
|
|
@@ -40,9 +40,9 @@ from chia.wallet.derive_keys import (
|
|
|
40
40
|
)
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
def dict_add_new_default(updated:
|
|
44
|
-
for k in do_not_migrate_keys:
|
|
45
|
-
if k in updated and
|
|
43
|
+
def dict_add_new_default(updated: dict[str, Any], default: dict[str, Any], do_not_migrate_keys: dict[str, Any]) -> None:
|
|
44
|
+
for k, v in do_not_migrate_keys.items():
|
|
45
|
+
if k in updated and v == "":
|
|
46
46
|
updated.pop(k)
|
|
47
47
|
for k, v in default.items():
|
|
48
48
|
ignore = False
|
|
@@ -56,7 +56,7 @@ def dict_add_new_default(updated: Dict[str, Any], default: Dict[str, Any], do_no
|
|
|
56
56
|
# If there is an intermediate key with empty string value, do not migrate all descendants
|
|
57
57
|
if do_not_migrate_keys.get(k, None) == "":
|
|
58
58
|
do_not_migrate_keys[k] = v
|
|
59
|
-
dict_add_new_default(updated[k],
|
|
59
|
+
dict_add_new_default(updated[k], v, do_not_migrate_keys.get(k, {}))
|
|
60
60
|
elif k not in updated or ignore is True:
|
|
61
61
|
updated[k] = v
|
|
62
62
|
|
|
@@ -168,8 +168,8 @@ def copy_files_rec(old_path: Path, new_path: Path) -> None:
|
|
|
168
168
|
def migrate_from(
|
|
169
169
|
old_root: Path,
|
|
170
170
|
new_root: Path,
|
|
171
|
-
manifest:
|
|
172
|
-
do_not_migrate_settings:
|
|
171
|
+
manifest: list[str],
|
|
172
|
+
do_not_migrate_settings: list[str],
|
|
173
173
|
) -> int:
|
|
174
174
|
"""
|
|
175
175
|
Copy all the files in "manifest" to the new config directory.
|
|
@@ -192,7 +192,7 @@ def migrate_from(
|
|
|
192
192
|
|
|
193
193
|
with lock_and_load_config(new_root, "config.yaml") as config:
|
|
194
194
|
config_str: str = initial_config_file("config.yaml")
|
|
195
|
-
default_config:
|
|
195
|
+
default_config: dict[str, Any] = yaml.safe_load(config_str)
|
|
196
196
|
flattened_keys = unflatten_properties({k: "" for k in do_not_migrate_settings})
|
|
197
197
|
dict_add_new_default(config, default_config, flattened_keys)
|
|
198
198
|
|
|
@@ -331,7 +331,7 @@ def chia_init(
|
|
|
331
331
|
if should_check_keys:
|
|
332
332
|
check_keys(root_path)
|
|
333
333
|
|
|
334
|
-
config:
|
|
334
|
+
config: dict[str, Any]
|
|
335
335
|
|
|
336
336
|
db_path_replaced: str
|
|
337
337
|
if v1_db:
|
chia/cmds/installers.py
CHANGED
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import json
|
|
4
4
|
import subprocess
|
|
5
5
|
import tempfile
|
|
6
|
-
from typing import
|
|
6
|
+
from typing import Optional
|
|
7
7
|
|
|
8
8
|
import click
|
|
9
9
|
import packaging.version
|
|
@@ -12,7 +12,7 @@ from chia.daemon.server import executable_for_service
|
|
|
12
12
|
from chia.util.timing import adjusted_timeout
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
def check_plotter(plotter:
|
|
15
|
+
def check_plotter(plotter: list[str], expected_output: bytes, specify_tmp: bool = True) -> None:
|
|
16
16
|
with tempfile.TemporaryDirectory() as path:
|
|
17
17
|
tmp_dir = []
|
|
18
18
|
if specify_tmp:
|
|
@@ -61,6 +61,7 @@ def test_command(expected_chia_version_str: str, require_madmax: bool) -> None:
|
|
|
61
61
|
capture_output=True,
|
|
62
62
|
encoding="utf-8",
|
|
63
63
|
timeout=adjusted_timeout(30),
|
|
64
|
+
check=False,
|
|
64
65
|
)
|
|
65
66
|
assert chia_version_process.returncode == 0
|
|
66
67
|
assert chia_version_process.stderr == ""
|
|
@@ -76,6 +77,7 @@ def test_command(expected_chia_version_str: str, require_madmax: bool) -> None:
|
|
|
76
77
|
capture_output=True,
|
|
77
78
|
encoding="utf-8",
|
|
78
79
|
timeout=adjusted_timeout(30),
|
|
80
|
+
check=False,
|
|
79
81
|
)
|
|
80
82
|
|
|
81
83
|
print()
|
|
@@ -88,7 +90,7 @@ def test_command(expected_chia_version_str: str, require_madmax: bool) -> None:
|
|
|
88
90
|
assert plotter_version_process.stderr == ""
|
|
89
91
|
|
|
90
92
|
found_start = False
|
|
91
|
-
plotter_versions:
|
|
93
|
+
plotter_versions: dict[str, packaging.version.Version] = {}
|
|
92
94
|
for line in plotter_version_process.stdout.splitlines():
|
|
93
95
|
if line.startswith("chiapos:"):
|
|
94
96
|
found_start = True
|
chia/cmds/keys.py
CHANGED
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Optional
|
|
3
|
+
from typing import Optional
|
|
4
4
|
|
|
5
5
|
import click
|
|
6
6
|
from chia_rs import PrivateKey
|
|
7
7
|
|
|
8
8
|
from chia.cmds import options
|
|
9
|
+
from chia.cmds.cmd_classes import ChiaCliContext
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
@click.group("keys", help="Manage your keys")
|
|
12
13
|
@click.pass_context
|
|
13
14
|
def keys_cmd(ctx: click.Context) -> None:
|
|
14
15
|
"""Create, delete, view and use your key pairs"""
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
root_path: Path = ctx.obj["root_path"]
|
|
16
|
+
root_path = ChiaCliContext.set_default(ctx).root_path
|
|
18
17
|
if not root_path.is_dir():
|
|
19
18
|
raise RuntimeError("Please initialize (or migrate) your config directory with chia init")
|
|
20
19
|
|
|
@@ -30,11 +29,11 @@ def keys_cmd(ctx: click.Context) -> None:
|
|
|
30
29
|
)
|
|
31
30
|
@click.pass_context
|
|
32
31
|
def generate_cmd(ctx: click.Context, label: Optional[str]) -> None:
|
|
33
|
-
from .init_funcs import check_keys
|
|
34
|
-
from .keys_funcs import generate_and_add
|
|
32
|
+
from chia.cmds.init_funcs import check_keys
|
|
33
|
+
from chia.cmds.keys_funcs import generate_and_add
|
|
35
34
|
|
|
36
35
|
generate_and_add(label)
|
|
37
|
-
check_keys(ctx.
|
|
36
|
+
check_keys(ChiaCliContext.set_default(ctx).root_path)
|
|
38
37
|
|
|
39
38
|
|
|
40
39
|
@keys_cmd.command("show", help="Displays all the keys in keychain or the key with the given fingerprint")
|
|
@@ -75,9 +74,16 @@ def show_cmd(
|
|
|
75
74
|
fingerprint: Optional[int],
|
|
76
75
|
bech32m_prefix: Optional[str],
|
|
77
76
|
) -> None:
|
|
78
|
-
from .keys_funcs import show_keys
|
|
77
|
+
from chia.cmds.keys_funcs import show_keys
|
|
79
78
|
|
|
80
|
-
show_keys(
|
|
79
|
+
show_keys(
|
|
80
|
+
ChiaCliContext.set_default(ctx).root_path,
|
|
81
|
+
show_mnemonic_seed,
|
|
82
|
+
non_observer_derivation,
|
|
83
|
+
json,
|
|
84
|
+
fingerprint,
|
|
85
|
+
bech32m_prefix,
|
|
86
|
+
)
|
|
81
87
|
|
|
82
88
|
|
|
83
89
|
@keys_cmd.command("add", help="Add a private key by mnemonic or public key as hex")
|
|
@@ -99,8 +105,8 @@ def show_cmd(
|
|
|
99
105
|
)
|
|
100
106
|
@click.pass_context
|
|
101
107
|
def add_cmd(ctx: click.Context, filename: str, label: Optional[str]) -> None:
|
|
102
|
-
from .init_funcs import check_keys
|
|
103
|
-
from .keys_funcs import query_and_add_key_info
|
|
108
|
+
from chia.cmds.init_funcs import check_keys
|
|
109
|
+
from chia.cmds.keys_funcs import query_and_add_key_info
|
|
104
110
|
|
|
105
111
|
mnemonic_or_pk = None
|
|
106
112
|
if filename:
|
|
@@ -109,7 +115,7 @@ def add_cmd(ctx: click.Context, filename: str, label: Optional[str]) -> None:
|
|
|
109
115
|
mnemonic_or_pk = Path(filename).read_text().rstrip()
|
|
110
116
|
|
|
111
117
|
query_and_add_key_info(mnemonic_or_pk, label)
|
|
112
|
-
check_keys(ctx.
|
|
118
|
+
check_keys(ChiaCliContext.set_default(ctx).root_path)
|
|
113
119
|
|
|
114
120
|
|
|
115
121
|
@keys_cmd.group("label", help="Manage your key labels")
|
|
@@ -119,7 +125,7 @@ def label_cmd() -> None:
|
|
|
119
125
|
|
|
120
126
|
@label_cmd.command("show", help="Show the labels of all available keys")
|
|
121
127
|
def show_label_cmd() -> None:
|
|
122
|
-
from .keys_funcs import show_all_key_labels
|
|
128
|
+
from chia.cmds.keys_funcs import show_all_key_labels
|
|
123
129
|
|
|
124
130
|
show_all_key_labels()
|
|
125
131
|
|
|
@@ -134,7 +140,7 @@ def show_label_cmd() -> None:
|
|
|
134
140
|
required=True,
|
|
135
141
|
)
|
|
136
142
|
def set_label_cmd(fingerprint: int, label: str) -> None:
|
|
137
|
-
from .keys_funcs import set_key_label
|
|
143
|
+
from chia.cmds.keys_funcs import set_key_label
|
|
138
144
|
|
|
139
145
|
set_key_label(fingerprint, label)
|
|
140
146
|
|
|
@@ -142,7 +148,7 @@ def set_label_cmd(fingerprint: int, label: str) -> None:
|
|
|
142
148
|
@label_cmd.command("delete", help="Delete the label of a key")
|
|
143
149
|
@options.create_fingerprint(required=True)
|
|
144
150
|
def delete_label_cmd(fingerprint: int) -> None:
|
|
145
|
-
from .keys_funcs import delete_key_label
|
|
151
|
+
from chia.cmds.keys_funcs import delete_key_label
|
|
146
152
|
|
|
147
153
|
delete_key_label(fingerprint)
|
|
148
154
|
|
|
@@ -151,11 +157,11 @@ def delete_label_cmd(fingerprint: int) -> None:
|
|
|
151
157
|
@options.create_fingerprint(required=True)
|
|
152
158
|
@click.pass_context
|
|
153
159
|
def delete_cmd(ctx: click.Context, fingerprint: int) -> None:
|
|
154
|
-
from .init_funcs import check_keys
|
|
155
|
-
from .keys_funcs import delete
|
|
160
|
+
from chia.cmds.init_funcs import check_keys
|
|
161
|
+
from chia.cmds.keys_funcs import delete
|
|
156
162
|
|
|
157
163
|
delete(fingerprint)
|
|
158
|
-
check_keys(ctx.
|
|
164
|
+
check_keys(ChiaCliContext.set_default(ctx).root_path)
|
|
159
165
|
|
|
160
166
|
|
|
161
167
|
@keys_cmd.command("delete_all", help="Delete all private keys in keychain")
|
|
@@ -167,7 +173,7 @@ def delete_all_cmd() -> None:
|
|
|
167
173
|
|
|
168
174
|
@keys_cmd.command("generate_and_print", help="Generates but does NOT add to keychain")
|
|
169
175
|
def generate_and_print_cmd() -> None:
|
|
170
|
-
from .keys_funcs import generate_and_print
|
|
176
|
+
from chia.cmds.keys_funcs import generate_and_print
|
|
171
177
|
|
|
172
178
|
generate_and_print()
|
|
173
179
|
|
|
@@ -203,7 +209,7 @@ def generate_and_print_cmd() -> None:
|
|
|
203
209
|
def sign_cmd(
|
|
204
210
|
message: str, fingerprint: Optional[int], filename: Optional[str], hd_path: str, as_bytes: bool, json: bool
|
|
205
211
|
) -> None:
|
|
206
|
-
from .keys_funcs import resolve_derivation_master_key, sign
|
|
212
|
+
from chia.cmds.keys_funcs import resolve_derivation_master_key, sign
|
|
207
213
|
|
|
208
214
|
_, resolved_sk = resolve_derivation_master_key(filename if filename is not None else fingerprint)
|
|
209
215
|
|
|
@@ -214,7 +220,7 @@ def sign_cmd(
|
|
|
214
220
|
sign(message, resolved_sk, hd_path, as_bytes, json)
|
|
215
221
|
|
|
216
222
|
|
|
217
|
-
def parse_signature_json(json_str: str) ->
|
|
223
|
+
def parse_signature_json(json_str: str) -> tuple[str, str, str, str]:
|
|
218
224
|
import json
|
|
219
225
|
|
|
220
226
|
try:
|
|
@@ -253,7 +259,7 @@ def parse_signature_json(json_str: str) -> Tuple[str, str, str, str]:
|
|
|
253
259
|
type=str,
|
|
254
260
|
)
|
|
255
261
|
def verify_cmd(message: str, public_key: str, signature: str, as_bytes: bool, json: str) -> None:
|
|
256
|
-
from .keys_funcs import as_bytes_from_signing_mode, verify
|
|
262
|
+
from chia.cmds.keys_funcs import as_bytes_from_signing_mode, verify
|
|
257
263
|
|
|
258
264
|
if json is not None:
|
|
259
265
|
parsed_message, parsed_pubkey, parsed_sig, parsed_signing_mode_str = parse_signature_json(json)
|
|
@@ -275,8 +281,9 @@ def verify_cmd(message: str, public_key: str, signature: str, as_bytes: bool, js
|
|
|
275
281
|
)
|
|
276
282
|
@click.pass_context
|
|
277
283
|
def derive_cmd(ctx: click.Context, fingerprint: Optional[int], filename: Optional[str]) -> None:
|
|
278
|
-
|
|
279
|
-
|
|
284
|
+
context = ChiaCliContext.set_default(ctx)
|
|
285
|
+
context.keys_fingerprint = fingerprint
|
|
286
|
+
context.keys_filename = filename
|
|
280
287
|
|
|
281
288
|
|
|
282
289
|
@derive_cmd.command("search", help="Search the keyring for one or more matching derived keys or wallet addresses")
|
|
@@ -320,20 +327,21 @@ def derive_cmd(ctx: click.Context, fingerprint: Optional[int], filename: Optiona
|
|
|
320
327
|
@click.pass_context
|
|
321
328
|
def search_cmd(
|
|
322
329
|
ctx: click.Context,
|
|
323
|
-
search_terms:
|
|
330
|
+
search_terms: tuple[str, ...],
|
|
324
331
|
limit: int,
|
|
325
332
|
non_observer_derivation: bool,
|
|
326
333
|
show_progress: bool,
|
|
327
|
-
search_type:
|
|
334
|
+
search_type: tuple[str, ...],
|
|
328
335
|
derive_from_hd_path: Optional[str],
|
|
329
336
|
prefix: Optional[str],
|
|
330
337
|
) -> None:
|
|
331
338
|
import sys
|
|
332
339
|
|
|
333
|
-
from .keys_funcs import resolve_derivation_master_key, search_derive
|
|
340
|
+
from chia.cmds.keys_funcs import resolve_derivation_master_key, search_derive
|
|
334
341
|
|
|
335
|
-
|
|
336
|
-
|
|
342
|
+
context = ChiaCliContext.set_default(ctx)
|
|
343
|
+
fingerprint: Optional[int] = context.keys_fingerprint
|
|
344
|
+
filename: Optional[str] = context.keys_filename
|
|
337
345
|
|
|
338
346
|
# Specifying the master key is optional for the search command. If not specified, we'll search all keys.
|
|
339
347
|
resolved_sk = None
|
|
@@ -343,7 +351,7 @@ def search_cmd(
|
|
|
343
351
|
print("Could not resolve private key from fingerprint/mnemonic file")
|
|
344
352
|
|
|
345
353
|
found: bool = search_derive(
|
|
346
|
-
|
|
354
|
+
context.root_path,
|
|
347
355
|
fingerprint,
|
|
348
356
|
search_terms,
|
|
349
357
|
limit,
|
|
@@ -364,8 +372,8 @@ class ResolutionError(Exception):
|
|
|
364
372
|
|
|
365
373
|
def _resolve_fingerprint_and_sk(
|
|
366
374
|
filename: Optional[str], fingerprint: Optional[int], non_observer_derivation: bool
|
|
367
|
-
) ->
|
|
368
|
-
from .keys_funcs import resolve_derivation_master_key
|
|
375
|
+
) -> tuple[Optional[int], Optional[PrivateKey]]:
|
|
376
|
+
from chia.cmds.keys_funcs import resolve_derivation_master_key
|
|
369
377
|
|
|
370
378
|
reolved_fp, resolved_sk = resolve_derivation_master_key(filename if filename is not None else fingerprint)
|
|
371
379
|
|
|
@@ -408,10 +416,11 @@ def _resolve_fingerprint_and_sk(
|
|
|
408
416
|
def wallet_address_cmd(
|
|
409
417
|
ctx: click.Context, index: int, count: int, prefix: Optional[str], non_observer_derivation: bool, show_hd_path: bool
|
|
410
418
|
) -> None:
|
|
411
|
-
from .keys_funcs import derive_wallet_address
|
|
419
|
+
from chia.cmds.keys_funcs import derive_wallet_address
|
|
412
420
|
|
|
413
|
-
|
|
414
|
-
|
|
421
|
+
context = ChiaCliContext.set_default(ctx)
|
|
422
|
+
fingerprint = context.keys_fingerprint
|
|
423
|
+
filename = context.keys_filename
|
|
415
424
|
|
|
416
425
|
try:
|
|
417
426
|
fingerprint, sk = _resolve_fingerprint_and_sk(filename, fingerprint, non_observer_derivation)
|
|
@@ -419,7 +428,14 @@ def wallet_address_cmd(
|
|
|
419
428
|
return
|
|
420
429
|
|
|
421
430
|
derive_wallet_address(
|
|
422
|
-
|
|
431
|
+
context.root_path,
|
|
432
|
+
fingerprint,
|
|
433
|
+
index,
|
|
434
|
+
count,
|
|
435
|
+
prefix,
|
|
436
|
+
non_observer_derivation,
|
|
437
|
+
show_hd_path,
|
|
438
|
+
sk,
|
|
423
439
|
)
|
|
424
440
|
|
|
425
441
|
|
|
@@ -483,13 +499,14 @@ def child_key_cmd(
|
|
|
483
499
|
show_hd_path: bool,
|
|
484
500
|
bech32m_prefix: Optional[str],
|
|
485
501
|
) -> None:
|
|
486
|
-
from .keys_funcs import derive_child_key
|
|
502
|
+
from chia.cmds.keys_funcs import derive_child_key
|
|
487
503
|
|
|
488
504
|
if key_type is None and derive_from_hd_path is None:
|
|
489
505
|
ctx.fail("--type or --derive-from-hd-path is required")
|
|
490
506
|
|
|
491
|
-
|
|
492
|
-
|
|
507
|
+
context = ChiaCliContext.set_default(ctx)
|
|
508
|
+
fingerprint = context.keys_fingerprint
|
|
509
|
+
filename = context.keys_filename
|
|
493
510
|
|
|
494
511
|
try:
|
|
495
512
|
fingerprint, sk = _resolve_fingerprint_and_sk(filename, fingerprint, non_observer_derivation)
|