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/cmd_classes.py
CHANGED
|
@@ -2,20 +2,19 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import collections
|
|
5
|
+
import dataclasses
|
|
5
6
|
import inspect
|
|
7
|
+
import pathlib
|
|
6
8
|
import sys
|
|
7
|
-
from contextlib import asynccontextmanager
|
|
8
9
|
from dataclasses import MISSING, dataclass, field, fields
|
|
9
10
|
from typing import (
|
|
10
11
|
Any,
|
|
11
|
-
AsyncIterator,
|
|
12
12
|
Callable,
|
|
13
|
-
|
|
14
|
-
List,
|
|
13
|
+
ClassVar,
|
|
15
14
|
Optional,
|
|
16
15
|
Protocol,
|
|
17
|
-
Type,
|
|
18
16
|
Union,
|
|
17
|
+
final,
|
|
19
18
|
get_args,
|
|
20
19
|
get_origin,
|
|
21
20
|
get_type_hints,
|
|
@@ -24,10 +23,9 @@ from typing import (
|
|
|
24
23
|
import click
|
|
25
24
|
from typing_extensions import dataclass_transform
|
|
26
25
|
|
|
27
|
-
from chia.cmds.cmds_util import get_wallet_client
|
|
28
|
-
from chia.rpc.wallet_rpc_client import WalletRpcClient
|
|
29
26
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
30
27
|
from chia.util.byte_types import hexstr_to_bytes
|
|
28
|
+
from chia.util.default_root import DEFAULT_ROOT_PATH
|
|
31
29
|
from chia.util.streamable import is_type_SpecificOptional
|
|
32
30
|
|
|
33
31
|
SyncCmd = Callable[..., None]
|
|
@@ -53,7 +51,7 @@ def option(*param_decls: str, **kwargs: Any) -> Any:
|
|
|
53
51
|
else:
|
|
54
52
|
default_default = MISSING
|
|
55
53
|
|
|
56
|
-
return field(
|
|
54
|
+
return field(
|
|
57
55
|
metadata=dict(
|
|
58
56
|
option_args=dict(
|
|
59
57
|
param_decls=tuple(param_decls),
|
|
@@ -64,6 +62,29 @@ def option(*param_decls: str, **kwargs: Any) -> Any:
|
|
|
64
62
|
)
|
|
65
63
|
|
|
66
64
|
|
|
65
|
+
@final
|
|
66
|
+
@dataclasses.dataclass
|
|
67
|
+
class ChiaCliContext:
|
|
68
|
+
context_dict_key: ClassVar[str] = "_chia_cli_context"
|
|
69
|
+
|
|
70
|
+
root_path: pathlib.Path = DEFAULT_ROOT_PATH
|
|
71
|
+
expected_prefix: Optional[str] = None
|
|
72
|
+
rpc_port: Optional[int] = None
|
|
73
|
+
keys_fingerprint: Optional[int] = None
|
|
74
|
+
keys_filename: Optional[str] = None
|
|
75
|
+
expected_address_prefix: Optional[str] = None
|
|
76
|
+
|
|
77
|
+
@classmethod
|
|
78
|
+
def set_default(cls, ctx: click.Context) -> ChiaCliContext:
|
|
79
|
+
ctx.ensure_object(dict)
|
|
80
|
+
self = ctx.obj.setdefault(cls.context_dict_key, cls())
|
|
81
|
+
assert isinstance(self, cls)
|
|
82
|
+
return self
|
|
83
|
+
|
|
84
|
+
def to_click(self) -> dict[str, object]:
|
|
85
|
+
return {self.context_dict_key: self}
|
|
86
|
+
|
|
87
|
+
|
|
67
88
|
class HexString(click.ParamType):
|
|
68
89
|
name = "hexstring"
|
|
69
90
|
|
|
@@ -96,10 +117,10 @@ _CLASS_TYPES_TO_CLICK_TYPES = {
|
|
|
96
117
|
|
|
97
118
|
@dataclass
|
|
98
119
|
class _CommandParsingStage:
|
|
99
|
-
my_dataclass:
|
|
100
|
-
my_option_decorators:
|
|
101
|
-
my_members:
|
|
102
|
-
my_kwarg_names:
|
|
120
|
+
my_dataclass: type[ChiaCommand]
|
|
121
|
+
my_option_decorators: list[Callable[[SyncCmd], SyncCmd]]
|
|
122
|
+
my_members: dict[str, _CommandParsingStage]
|
|
123
|
+
my_kwarg_names: list[str]
|
|
103
124
|
_needs_context: bool
|
|
104
125
|
|
|
105
126
|
def needs_context(self) -> bool:
|
|
@@ -108,14 +129,14 @@ class _CommandParsingStage:
|
|
|
108
129
|
else:
|
|
109
130
|
return any(member.needs_context() for member in self.my_members.values())
|
|
110
131
|
|
|
111
|
-
def get_all_option_decorators(self) ->
|
|
112
|
-
all_option_decorators:
|
|
132
|
+
def get_all_option_decorators(self) -> list[Callable[[SyncCmd], SyncCmd]]:
|
|
133
|
+
all_option_decorators: list[Callable[[SyncCmd], SyncCmd]] = self.my_option_decorators
|
|
113
134
|
for member in self.my_members.values():
|
|
114
135
|
all_option_decorators.extend(member.get_all_option_decorators())
|
|
115
136
|
return all_option_decorators
|
|
116
137
|
|
|
117
138
|
def initialize_instance(self, **kwargs: Any) -> ChiaCommand:
|
|
118
|
-
kwargs_to_pass:
|
|
139
|
+
kwargs_to_pass: dict[str, Any] = {}
|
|
119
140
|
for kwarg_name in self.my_kwarg_names:
|
|
120
141
|
kwargs_to_pass[kwarg_name] = kwargs[kwarg_name]
|
|
121
142
|
|
|
@@ -130,7 +151,7 @@ class _CommandParsingStage:
|
|
|
130
151
|
|
|
131
152
|
def strip_click_context(func: SyncCmd) -> SyncCmd:
|
|
132
153
|
def _inner(ctx: click.Context, **kwargs: Any) -> None:
|
|
133
|
-
context
|
|
154
|
+
context = ChiaCliContext.set_default(ctx)
|
|
134
155
|
func(context=context, **kwargs)
|
|
135
156
|
|
|
136
157
|
return _inner
|
|
@@ -152,10 +173,10 @@ class _CommandParsingStage:
|
|
|
152
173
|
instance.run()
|
|
153
174
|
|
|
154
175
|
|
|
155
|
-
def _generate_command_parser(cls:
|
|
156
|
-
option_decorators:
|
|
157
|
-
kwarg_names:
|
|
158
|
-
members:
|
|
176
|
+
def _generate_command_parser(cls: type[ChiaCommand]) -> _CommandParsingStage:
|
|
177
|
+
option_decorators: list[Callable[[SyncCmd], SyncCmd]] = []
|
|
178
|
+
kwarg_names: list[str] = []
|
|
179
|
+
members: dict[str, _CommandParsingStage] = {}
|
|
159
180
|
needs_context: bool = False
|
|
160
181
|
|
|
161
182
|
hints = get_type_hints(cls)
|
|
@@ -166,13 +187,13 @@ def _generate_command_parser(cls: Type[ChiaCommand]) -> _CommandParsingStage:
|
|
|
166
187
|
if getattr(hints[field_name], COMMAND_HELPER_ATTRIBUTE_NAME, False):
|
|
167
188
|
members[field_name] = _generate_command_parser(hints[field_name])
|
|
168
189
|
elif field_name == "context":
|
|
169
|
-
if hints[field_name] !=
|
|
190
|
+
if hints[field_name] != ChiaCliContext:
|
|
170
191
|
raise ValueError("only Context can be the hint for variables named 'context'")
|
|
171
192
|
else:
|
|
172
193
|
needs_context = True
|
|
173
194
|
kwarg_names.append(field_name)
|
|
174
195
|
elif "option_args" in _field.metadata:
|
|
175
|
-
option_args:
|
|
196
|
+
option_args: dict[str, Any] = {"multiple": False, "required": False}
|
|
176
197
|
option_args.update(_field.metadata["option_args"])
|
|
177
198
|
|
|
178
199
|
if "type" not in option_args:
|
|
@@ -216,8 +237,9 @@ def _generate_command_parser(cls: Type[ChiaCommand]) -> _CommandParsingStage:
|
|
|
216
237
|
option_decorators.append(
|
|
217
238
|
click.option(
|
|
218
239
|
*option_args["param_decls"],
|
|
240
|
+
field_name,
|
|
219
241
|
type=type_arg,
|
|
220
|
-
**{k: v for k, v in option_args.items() if k not in
|
|
242
|
+
**{k: v for k, v in option_args.items() if k not in {"param_decls", "type"}},
|
|
221
243
|
)
|
|
222
244
|
)
|
|
223
245
|
|
|
@@ -230,86 +252,72 @@ def _generate_command_parser(cls: Type[ChiaCommand]) -> _CommandParsingStage:
|
|
|
230
252
|
)
|
|
231
253
|
|
|
232
254
|
|
|
233
|
-
def _convert_class_to_function(cls:
|
|
255
|
+
def _convert_class_to_function(cls: type[ChiaCommand]) -> SyncCmd:
|
|
234
256
|
command_parser = _generate_command_parser(cls)
|
|
235
257
|
|
|
236
258
|
return command_parser.apply_decorators(command_parser)
|
|
237
259
|
|
|
238
260
|
|
|
239
|
-
@dataclass_transform()
|
|
240
|
-
def chia_command(
|
|
241
|
-
|
|
261
|
+
@dataclass_transform(frozen_default=True)
|
|
262
|
+
def chia_command(
|
|
263
|
+
*,
|
|
264
|
+
group: Optional[click.Group] = None,
|
|
265
|
+
name: str,
|
|
266
|
+
short_help: str,
|
|
267
|
+
help: str,
|
|
268
|
+
) -> Callable[[type[ChiaCommand]], type[ChiaCommand]]:
|
|
269
|
+
def _chia_command(cls: type[ChiaCommand]) -> type[ChiaCommand]:
|
|
242
270
|
# The type ignores here are largely due to the fact that the class information is not preserved after being
|
|
243
271
|
# passed through the dataclass wrapper. Not sure what to do about this right now.
|
|
244
272
|
if sys.version_info < (3, 10): # pragma: no cover
|
|
245
273
|
# stuff below 3.10 doesn't know about kw_only
|
|
246
|
-
wrapped_cls:
|
|
274
|
+
wrapped_cls: type[ChiaCommand] = dataclass( # type: ignore[assignment]
|
|
247
275
|
frozen=True,
|
|
248
276
|
)(cls)
|
|
249
277
|
else:
|
|
250
|
-
wrapped_cls:
|
|
278
|
+
wrapped_cls: type[ChiaCommand] = dataclass( # type: ignore[assignment]
|
|
251
279
|
frozen=True,
|
|
252
280
|
kw_only=True,
|
|
253
281
|
)(cls)
|
|
254
282
|
|
|
255
|
-
|
|
283
|
+
metadata = Metadata(
|
|
284
|
+
command=click.command(
|
|
285
|
+
name=name,
|
|
286
|
+
short_help=short_help,
|
|
287
|
+
help=help,
|
|
288
|
+
)(_convert_class_to_function(wrapped_cls))
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
setattr(wrapped_cls, _chia_command_metadata_attribute, metadata)
|
|
292
|
+
if group is not None:
|
|
293
|
+
group.add_command(metadata.command)
|
|
294
|
+
|
|
256
295
|
return wrapped_cls
|
|
257
296
|
|
|
258
297
|
return _chia_command
|
|
259
298
|
|
|
260
299
|
|
|
261
|
-
|
|
262
|
-
|
|
300
|
+
_chia_command_metadata_attribute = f"_{__name__.replace('.', '_')}_{chia_command.__qualname__}_metadata"
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
@dataclass(frozen=True)
|
|
304
|
+
class Metadata:
|
|
305
|
+
command: click.Command
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def get_chia_command_metadata(cls: type[ChiaCommand]) -> Metadata:
|
|
309
|
+
metadata: Optional[Metadata] = getattr(cls, _chia_command_metadata_attribute, None)
|
|
310
|
+
if metadata is None:
|
|
311
|
+
raise Exception(f"Class is not a chia command: {cls}")
|
|
312
|
+
|
|
313
|
+
return metadata
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
@dataclass_transform(frozen_default=True)
|
|
317
|
+
def command_helper(cls: type[Any]) -> type[Any]:
|
|
263
318
|
if sys.version_info < (3, 10): # stuff below 3.10 doesn't support kw_only
|
|
264
319
|
new_cls = dataclass(frozen=True)(cls) # pragma: no cover
|
|
265
320
|
else:
|
|
266
321
|
new_cls = dataclass(frozen=True, kw_only=True)(cls)
|
|
267
322
|
setattr(new_cls, COMMAND_HELPER_ATTRIBUTE_NAME, True)
|
|
268
323
|
return new_cls
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
Context = Dict[str, Any]
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
@dataclass(frozen=True)
|
|
275
|
-
class WalletClientInfo:
|
|
276
|
-
client: WalletRpcClient
|
|
277
|
-
fingerprint: int
|
|
278
|
-
config: Dict[str, Any]
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
@command_helper
|
|
282
|
-
class NeedsWalletRPC:
|
|
283
|
-
context: Context = field(default_factory=dict) # pylint: disable=invalid-field-call
|
|
284
|
-
client_info: Optional[WalletClientInfo] = None
|
|
285
|
-
wallet_rpc_port: Optional[int] = option(
|
|
286
|
-
"-wp",
|
|
287
|
-
"--wallet-rpc_port",
|
|
288
|
-
help=(
|
|
289
|
-
"Set the port where the Wallet is hosting the RPC interface."
|
|
290
|
-
"See the rpc_port under wallet in config.yaml."
|
|
291
|
-
),
|
|
292
|
-
type=int,
|
|
293
|
-
default=None,
|
|
294
|
-
)
|
|
295
|
-
fingerprint: Optional[int] = option(
|
|
296
|
-
"-f",
|
|
297
|
-
"--fingerprint",
|
|
298
|
-
help="Fingerprint of the wallet to use",
|
|
299
|
-
type=int,
|
|
300
|
-
default=None,
|
|
301
|
-
)
|
|
302
|
-
|
|
303
|
-
@asynccontextmanager
|
|
304
|
-
async def wallet_rpc(self, **kwargs: Any) -> AsyncIterator[WalletClientInfo]:
|
|
305
|
-
if self.client_info is not None:
|
|
306
|
-
yield self.client_info
|
|
307
|
-
else:
|
|
308
|
-
if "root_path" not in kwargs:
|
|
309
|
-
kwargs["root_path"] = self.context["root_path"] # pylint: disable=unsubscriptable-object
|
|
310
|
-
async with get_wallet_client(self.wallet_rpc_port, self.fingerprint, **kwargs) as (
|
|
311
|
-
wallet_client,
|
|
312
|
-
fp,
|
|
313
|
-
config,
|
|
314
|
-
):
|
|
315
|
-
yield WalletClientInfo(wallet_client, fp, config)
|
chia/cmds/cmd_helpers.py
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import AsyncIterator, Coroutine, Sequence
|
|
4
|
+
from contextlib import asynccontextmanager
|
|
5
|
+
from dataclasses import dataclass, field
|
|
6
|
+
from functools import cached_property
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any, Callable, Optional, TypeVar
|
|
9
|
+
|
|
10
|
+
from chia.cmds.cmd_classes import ChiaCliContext, command_helper, option
|
|
11
|
+
from chia.cmds.cmds_util import CMDCoinSelectionConfigLoader, CMDTXConfigLoader, TransactionBundle, get_wallet_client
|
|
12
|
+
from chia.cmds.param_types import AmountParamType, Bytes32ParamType, CliAmount, TransactionFeeParamType, cli_amount_none
|
|
13
|
+
from chia.rpc.wallet_rpc_client import WalletRpcClient
|
|
14
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
15
|
+
from chia.util.ints import uint64
|
|
16
|
+
from chia.wallet.conditions import ConditionValidTimes
|
|
17
|
+
from chia.wallet.transaction_record import TransactionRecord
|
|
18
|
+
from chia.wallet.util.tx_config import CoinSelectionConfig, TXConfig
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass(frozen=True)
|
|
22
|
+
class WalletClientInfo:
|
|
23
|
+
client: WalletRpcClient
|
|
24
|
+
fingerprint: int
|
|
25
|
+
config: dict[str, Any]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@command_helper
|
|
29
|
+
class NeedsWalletRPC:
|
|
30
|
+
context: ChiaCliContext = field(default_factory=ChiaCliContext)
|
|
31
|
+
client_info: Optional[WalletClientInfo] = None
|
|
32
|
+
wallet_rpc_port: Optional[int] = option(
|
|
33
|
+
"-wp",
|
|
34
|
+
"--wallet-rpc_port",
|
|
35
|
+
help=(
|
|
36
|
+
"Set the port where the Wallet is hosting the RPC interface."
|
|
37
|
+
"See the rpc_port under wallet in config.yaml."
|
|
38
|
+
),
|
|
39
|
+
type=int,
|
|
40
|
+
default=None,
|
|
41
|
+
)
|
|
42
|
+
fingerprint: Optional[int] = option(
|
|
43
|
+
"-f",
|
|
44
|
+
"--fingerprint",
|
|
45
|
+
help="Fingerprint of the wallet to use",
|
|
46
|
+
type=int,
|
|
47
|
+
default=None,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
@asynccontextmanager
|
|
51
|
+
async def wallet_rpc(self, **kwargs: Any) -> AsyncIterator[WalletClientInfo]:
|
|
52
|
+
if self.client_info is not None:
|
|
53
|
+
yield self.client_info
|
|
54
|
+
else:
|
|
55
|
+
root_path = kwargs.get("root_path", self.context.root_path)
|
|
56
|
+
async with get_wallet_client(root_path, self.wallet_rpc_port, self.fingerprint, **kwargs) as (
|
|
57
|
+
wallet_client,
|
|
58
|
+
fp,
|
|
59
|
+
config,
|
|
60
|
+
):
|
|
61
|
+
yield WalletClientInfo(wallet_client, fp, config)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@command_helper
|
|
65
|
+
class TransactionsIn:
|
|
66
|
+
transaction_file_in: str = option(
|
|
67
|
+
"--transaction-file-in",
|
|
68
|
+
type=str,
|
|
69
|
+
help="Transaction file to use as input",
|
|
70
|
+
required=True,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
@cached_property
|
|
74
|
+
def transaction_bundle(self) -> TransactionBundle:
|
|
75
|
+
with open(Path(self.transaction_file_in), "rb") as file:
|
|
76
|
+
return TransactionBundle.from_bytes(file.read())
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@command_helper
|
|
80
|
+
class TransactionsOut:
|
|
81
|
+
transaction_file_out: Optional[str] = option(
|
|
82
|
+
"--transaction-file-out",
|
|
83
|
+
type=str,
|
|
84
|
+
default=None,
|
|
85
|
+
help="A file to write relevant transactions to",
|
|
86
|
+
required=False,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
def handle_transaction_output(self, output: list[TransactionRecord]) -> None:
|
|
90
|
+
if self.transaction_file_out is None:
|
|
91
|
+
return
|
|
92
|
+
else:
|
|
93
|
+
with open(Path(self.transaction_file_out), "wb") as file:
|
|
94
|
+
file.write(bytes(TransactionBundle(output)))
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@command_helper
|
|
98
|
+
class NeedsCoinSelectionConfig:
|
|
99
|
+
min_coin_amount: CliAmount = option(
|
|
100
|
+
"-ma",
|
|
101
|
+
"--min-coin-amount",
|
|
102
|
+
"--min-amount",
|
|
103
|
+
help="Ignore coins worth less then this much XCH or CAT units",
|
|
104
|
+
type=AmountParamType(),
|
|
105
|
+
required=False,
|
|
106
|
+
default=cli_amount_none,
|
|
107
|
+
)
|
|
108
|
+
max_coin_amount: CliAmount = option(
|
|
109
|
+
"-l",
|
|
110
|
+
"--max-coin-amount",
|
|
111
|
+
"--max-amount",
|
|
112
|
+
help="Ignore coins worth more then this much XCH or CAT units",
|
|
113
|
+
type=AmountParamType(),
|
|
114
|
+
required=False,
|
|
115
|
+
default=cli_amount_none,
|
|
116
|
+
)
|
|
117
|
+
coins_to_exclude: Sequence[bytes32] = option(
|
|
118
|
+
"--exclude-coin",
|
|
119
|
+
multiple=True,
|
|
120
|
+
type=Bytes32ParamType(),
|
|
121
|
+
help="Exclude this coin from being spent.",
|
|
122
|
+
)
|
|
123
|
+
amounts_to_exclude: Sequence[CliAmount] = option(
|
|
124
|
+
"--exclude-amount",
|
|
125
|
+
multiple=True,
|
|
126
|
+
type=AmountParamType(),
|
|
127
|
+
help="Exclude any coins with this XCH or CAT amount from being included.",
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
def load_coin_selection_config(self, mojo_per_unit: int) -> CoinSelectionConfig:
|
|
131
|
+
return CMDCoinSelectionConfigLoader(
|
|
132
|
+
min_coin_amount=self.min_coin_amount,
|
|
133
|
+
max_coin_amount=self.max_coin_amount,
|
|
134
|
+
excluded_coin_amounts=list(_ for _ in self.amounts_to_exclude),
|
|
135
|
+
excluded_coin_ids=list(_ for _ in self.coins_to_exclude),
|
|
136
|
+
).to_coin_selection_config(mojo_per_unit)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
@command_helper
|
|
140
|
+
class NeedsTXConfig(NeedsCoinSelectionConfig):
|
|
141
|
+
reuse: Optional[bool] = option(
|
|
142
|
+
"--reuse/--new-address",
|
|
143
|
+
"--reuse-puzhash/--generate-new-puzhash",
|
|
144
|
+
help="Reuse existing address for the change.",
|
|
145
|
+
is_flag=True,
|
|
146
|
+
default=None,
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
def load_tx_config(self, mojo_per_unit: int, config: dict[str, Any], fingerprint: int) -> TXConfig:
|
|
150
|
+
return CMDTXConfigLoader(
|
|
151
|
+
min_coin_amount=self.min_coin_amount,
|
|
152
|
+
max_coin_amount=self.max_coin_amount,
|
|
153
|
+
excluded_coin_amounts=list(_ for _ in self.amounts_to_exclude),
|
|
154
|
+
excluded_coin_ids=list(_ for _ in self.coins_to_exclude),
|
|
155
|
+
reuse_puzhash=self.reuse,
|
|
156
|
+
).to_tx_config(mojo_per_unit, config, fingerprint)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def transaction_endpoint_runner(
|
|
160
|
+
func: Callable[[_T_TransactionEndpoint], Coroutine[Any, Any, list[TransactionRecord]]],
|
|
161
|
+
) -> Callable[[_T_TransactionEndpoint], Coroutine[Any, Any, None]]:
|
|
162
|
+
async def wrapped_func(self: _T_TransactionEndpoint) -> None:
|
|
163
|
+
txs = await func(self)
|
|
164
|
+
self.transaction_writer.handle_transaction_output(txs)
|
|
165
|
+
|
|
166
|
+
setattr(wrapped_func, _TRANSACTION_ENDPOINT_DECORATOR_APPLIED, True)
|
|
167
|
+
return wrapped_func
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
_TRANSACTION_ENDPOINT_DECORATOR_APPLIED = (
|
|
171
|
+
f"_{__name__.replace('.', '_')}_{transaction_endpoint_runner.__qualname__}_applied"
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
@dataclass(frozen=True)
|
|
176
|
+
class TransactionEndpoint:
|
|
177
|
+
rpc_info: NeedsWalletRPC
|
|
178
|
+
tx_config_loader: NeedsTXConfig
|
|
179
|
+
transaction_writer: TransactionsOut
|
|
180
|
+
fee: uint64 = option(
|
|
181
|
+
"-m",
|
|
182
|
+
"--fee",
|
|
183
|
+
help="Set the fees for the transaction, in XCH",
|
|
184
|
+
type=TransactionFeeParamType(),
|
|
185
|
+
default="0",
|
|
186
|
+
show_default=True,
|
|
187
|
+
required=True,
|
|
188
|
+
)
|
|
189
|
+
push: bool = option(
|
|
190
|
+
"--push/--no-push", help="Push the transaction to the network", type=bool, is_flag=True, default=True
|
|
191
|
+
)
|
|
192
|
+
valid_at: Optional[int] = option(
|
|
193
|
+
"--valid-at",
|
|
194
|
+
help="UNIX timestamp at which the associated transactions become valid",
|
|
195
|
+
type=int,
|
|
196
|
+
required=False,
|
|
197
|
+
default=None,
|
|
198
|
+
hidden=True,
|
|
199
|
+
)
|
|
200
|
+
expires_at: Optional[int] = option(
|
|
201
|
+
"--expires-at",
|
|
202
|
+
help="UNIX timestamp at which the associated transactions expire",
|
|
203
|
+
type=int,
|
|
204
|
+
required=False,
|
|
205
|
+
default=None,
|
|
206
|
+
hidden=True,
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
def __post_init__(self) -> None:
|
|
210
|
+
if not hasattr(self.run, _TRANSACTION_ENDPOINT_DECORATOR_APPLIED):
|
|
211
|
+
raise TypeError("TransactionEndpoints must utilize @transaction_endpoint_runner on their `run` method")
|
|
212
|
+
|
|
213
|
+
def load_condition_valid_times(self) -> ConditionValidTimes:
|
|
214
|
+
return ConditionValidTimes(
|
|
215
|
+
min_time=uint64.construct_optional(self.valid_at),
|
|
216
|
+
max_time=uint64.construct_optional(self.expires_at),
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
@transaction_endpoint_runner
|
|
220
|
+
async def run(self) -> list[TransactionRecord]:
|
|
221
|
+
raise NotImplementedError("Must implement `.run()` on a TransactionEndpoint subclass") # pragma: no cover
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
@dataclass(frozen=True)
|
|
225
|
+
class TransactionEndpointWithTimelocks(TransactionEndpoint):
|
|
226
|
+
valid_at: Optional[int] = option(
|
|
227
|
+
"--valid-at",
|
|
228
|
+
help="UNIX timestamp at which the associated transactions become valid",
|
|
229
|
+
type=int,
|
|
230
|
+
required=False,
|
|
231
|
+
default=None,
|
|
232
|
+
)
|
|
233
|
+
expires_at: Optional[int] = option(
|
|
234
|
+
"--expires-at",
|
|
235
|
+
help="UNIX timestamp at which the associated transactions expire",
|
|
236
|
+
type=int,
|
|
237
|
+
required=False,
|
|
238
|
+
default=None,
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
_T_TransactionEndpoint = TypeVar("_T_TransactionEndpoint", bound=TransactionEndpoint)
|