chia-blockchain 2.5.1rc1__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/__init__.py +10 -0
- chia/__main__.py +5 -0
- chia/_tests/README.md +53 -0
- chia/_tests/__init__.py +0 -0
- chia/_tests/blockchain/__init__.py +0 -0
- chia/_tests/blockchain/blockchain_test_utils.py +195 -0
- chia/_tests/blockchain/config.py +4 -0
- chia/_tests/blockchain/test_augmented_chain.py +145 -0
- chia/_tests/blockchain/test_blockchain.py +4202 -0
- chia/_tests/blockchain/test_blockchain_transactions.py +1031 -0
- chia/_tests/blockchain/test_build_chains.py +59 -0
- chia/_tests/blockchain/test_get_block_generator.py +72 -0
- chia/_tests/blockchain/test_lookup_fork_chain.py +194 -0
- chia/_tests/build-init-files.py +92 -0
- chia/_tests/build-job-matrix.py +204 -0
- chia/_tests/check_pytest_monitor_output.py +34 -0
- chia/_tests/check_sql_statements.py +72 -0
- chia/_tests/chia-start-sim +42 -0
- chia/_tests/clvm/__init__.py +0 -0
- chia/_tests/clvm/benchmark_costs.py +23 -0
- chia/_tests/clvm/coin_store.py +149 -0
- chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
- chia/_tests/clvm/test_clvm_step.py +37 -0
- chia/_tests/clvm/test_condition_codes.py +13 -0
- chia/_tests/clvm/test_curry_and_treehash.py +55 -0
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_program.py +150 -0
- chia/_tests/clvm/test_puzzle_compression.py +143 -0
- chia/_tests/clvm/test_puzzle_drivers.py +45 -0
- chia/_tests/clvm/test_puzzles.py +242 -0
- chia/_tests/clvm/test_singletons.py +540 -0
- chia/_tests/clvm/test_spend_sim.py +181 -0
- chia/_tests/cmds/__init__.py +0 -0
- chia/_tests/cmds/cmd_test_utils.py +469 -0
- chia/_tests/cmds/config.py +3 -0
- chia/_tests/cmds/conftest.py +23 -0
- chia/_tests/cmds/test_click_types.py +200 -0
- chia/_tests/cmds/test_cmd_framework.py +620 -0
- chia/_tests/cmds/test_cmds_util.py +97 -0
- chia/_tests/cmds/test_daemon.py +92 -0
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +66 -0
- chia/_tests/cmds/test_show.py +116 -0
- chia/_tests/cmds/test_sim.py +207 -0
- chia/_tests/cmds/test_timelock_args.py +75 -0
- chia/_tests/cmds/test_tx_config_args.py +154 -0
- chia/_tests/cmds/testing_classes.py +59 -0
- chia/_tests/cmds/wallet/__init__.py +0 -0
- chia/_tests/cmds/wallet/test_consts.py +47 -0
- chia/_tests/cmds/wallet/test_dao.py +565 -0
- chia/_tests/cmds/wallet/test_did.py +403 -0
- chia/_tests/cmds/wallet/test_nft.py +471 -0
- chia/_tests/cmds/wallet/test_notifications.py +124 -0
- chia/_tests/cmds/wallet/test_offer.toffer +1 -0
- chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
- chia/_tests/cmds/wallet/test_vcs.py +400 -0
- chia/_tests/cmds/wallet/test_wallet.py +1125 -0
- chia/_tests/cmds/wallet/test_wallet_check.py +109 -0
- chia/_tests/conftest.py +1419 -0
- chia/_tests/connection_utils.py +125 -0
- chia/_tests/core/__init__.py +0 -0
- chia/_tests/core/cmds/__init__.py +0 -0
- chia/_tests/core/cmds/test_beta.py +382 -0
- chia/_tests/core/cmds/test_keys.py +1734 -0
- chia/_tests/core/cmds/test_wallet.py +126 -0
- chia/_tests/core/config.py +3 -0
- chia/_tests/core/consensus/__init__.py +0 -0
- chia/_tests/core/consensus/test_block_creation.py +54 -0
- chia/_tests/core/consensus/test_pot_iterations.py +117 -0
- chia/_tests/core/custom_types/__init__.py +0 -0
- chia/_tests/core/custom_types/test_coin.py +107 -0
- chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
- chia/_tests/core/custom_types/test_spend_bundle.py +70 -0
- chia/_tests/core/daemon/__init__.py +0 -0
- chia/_tests/core/daemon/config.py +4 -0
- chia/_tests/core/daemon/test_daemon.py +2128 -0
- chia/_tests/core/daemon/test_daemon_register.py +109 -0
- chia/_tests/core/daemon/test_keychain_proxy.py +101 -0
- chia/_tests/core/data_layer/__init__.py +0 -0
- chia/_tests/core/data_layer/config.py +5 -0
- chia/_tests/core/data_layer/conftest.py +106 -0
- chia/_tests/core/data_layer/test_data_cli.py +56 -0
- chia/_tests/core/data_layer/test_data_layer.py +83 -0
- chia/_tests/core/data_layer/test_data_layer_util.py +218 -0
- chia/_tests/core/data_layer/test_data_rpc.py +3847 -0
- chia/_tests/core/data_layer/test_data_store.py +2424 -0
- chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
- chia/_tests/core/data_layer/test_plugin.py +91 -0
- chia/_tests/core/data_layer/util.py +233 -0
- chia/_tests/core/farmer/__init__.py +0 -0
- chia/_tests/core/farmer/config.py +3 -0
- chia/_tests/core/farmer/test_farmer_api.py +103 -0
- chia/_tests/core/full_node/__init__.py +0 -0
- chia/_tests/core/full_node/config.py +4 -0
- chia/_tests/core/full_node/dos/__init__.py +0 -0
- chia/_tests/core/full_node/dos/config.py +3 -0
- chia/_tests/core/full_node/full_sync/__init__.py +0 -0
- chia/_tests/core/full_node/full_sync/config.py +4 -0
- chia/_tests/core/full_node/full_sync/test_full_sync.py +443 -0
- chia/_tests/core/full_node/ram_db.py +27 -0
- chia/_tests/core/full_node/stores/__init__.py +0 -0
- chia/_tests/core/full_node/stores/config.py +4 -0
- chia/_tests/core/full_node/stores/test_block_store.py +590 -0
- chia/_tests/core/full_node/stores/test_coin_store.py +897 -0
- chia/_tests/core/full_node/stores/test_full_node_store.py +1219 -0
- chia/_tests/core/full_node/stores/test_hint_store.py +229 -0
- chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
- chia/_tests/core/full_node/test_address_manager.py +588 -0
- chia/_tests/core/full_node/test_block_height_map.py +556 -0
- chia/_tests/core/full_node/test_conditions.py +556 -0
- chia/_tests/core/full_node/test_full_node.py +2700 -0
- chia/_tests/core/full_node/test_generator_tools.py +82 -0
- chia/_tests/core/full_node/test_hint_management.py +104 -0
- chia/_tests/core/full_node/test_node_load.py +34 -0
- chia/_tests/core/full_node/test_performance.py +179 -0
- chia/_tests/core/full_node/test_subscriptions.py +492 -0
- chia/_tests/core/full_node/test_transactions.py +203 -0
- chia/_tests/core/full_node/test_tx_processing_queue.py +155 -0
- chia/_tests/core/large_block.py +2388 -0
- chia/_tests/core/make_block_generator.py +70 -0
- chia/_tests/core/mempool/__init__.py +0 -0
- chia/_tests/core/mempool/config.py +4 -0
- chia/_tests/core/mempool/test_mempool.py +3255 -0
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
- chia/_tests/core/mempool/test_mempool_item_queries.py +190 -0
- chia/_tests/core/mempool/test_mempool_manager.py +2084 -0
- chia/_tests/core/mempool/test_mempool_performance.py +64 -0
- chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
- chia/_tests/core/node_height.py +28 -0
- chia/_tests/core/server/__init__.py +0 -0
- chia/_tests/core/server/config.py +3 -0
- chia/_tests/core/server/flood.py +84 -0
- chia/_tests/core/server/serve.py +135 -0
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +66 -0
- chia/_tests/core/server/test_dos.py +319 -0
- chia/_tests/core/server/test_event_loop.py +109 -0
- chia/_tests/core/server/test_loop.py +294 -0
- chia/_tests/core/server/test_node_discovery.py +73 -0
- chia/_tests/core/server/test_rate_limits.py +482 -0
- chia/_tests/core/server/test_server.py +226 -0
- chia/_tests/core/server/test_upnp.py +8 -0
- chia/_tests/core/services/__init__.py +0 -0
- chia/_tests/core/services/config.py +3 -0
- chia/_tests/core/services/test_services.py +188 -0
- chia/_tests/core/ssl/__init__.py +0 -0
- chia/_tests/core/ssl/config.py +3 -0
- chia/_tests/core/ssl/test_ssl.py +202 -0
- chia/_tests/core/test_coins.py +33 -0
- chia/_tests/core/test_cost_calculation.py +313 -0
- chia/_tests/core/test_crawler.py +175 -0
- chia/_tests/core/test_crawler_rpc.py +53 -0
- chia/_tests/core/test_daemon_rpc.py +24 -0
- chia/_tests/core/test_db_conversion.py +130 -0
- chia/_tests/core/test_db_validation.py +162 -0
- chia/_tests/core/test_farmer_harvester_rpc.py +505 -0
- chia/_tests/core/test_filter.py +35 -0
- chia/_tests/core/test_full_node_rpc.py +768 -0
- chia/_tests/core/test_merkle_set.py +343 -0
- chia/_tests/core/test_program.py +47 -0
- chia/_tests/core/test_rpc_util.py +86 -0
- chia/_tests/core/test_seeder.py +420 -0
- chia/_tests/core/test_setproctitle.py +13 -0
- chia/_tests/core/util/__init__.py +0 -0
- chia/_tests/core/util/config.py +4 -0
- chia/_tests/core/util/test_block_cache.py +44 -0
- chia/_tests/core/util/test_cached_bls.py +57 -0
- chia/_tests/core/util/test_config.py +337 -0
- chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
- chia/_tests/core/util/test_files.py +391 -0
- chia/_tests/core/util/test_jsonify.py +146 -0
- chia/_tests/core/util/test_keychain.py +522 -0
- chia/_tests/core/util/test_keyring_wrapper.py +491 -0
- chia/_tests/core/util/test_lockfile.py +380 -0
- chia/_tests/core/util/test_log_exceptions.py +187 -0
- chia/_tests/core/util/test_lru_cache.py +56 -0
- chia/_tests/core/util/test_significant_bits.py +40 -0
- chia/_tests/core/util/test_streamable.py +883 -0
- chia/_tests/db/__init__.py +0 -0
- chia/_tests/db/test_db_wrapper.py +566 -0
- chia/_tests/environments/__init__.py +0 -0
- chia/_tests/environments/common.py +35 -0
- chia/_tests/environments/full_node.py +47 -0
- chia/_tests/environments/wallet.py +429 -0
- chia/_tests/ether.py +19 -0
- chia/_tests/farmer_harvester/__init__.py +0 -0
- chia/_tests/farmer_harvester/config.py +3 -0
- chia/_tests/farmer_harvester/test_farmer.py +1264 -0
- chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +131 -0
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +528 -0
- chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
- chia/_tests/fee_estimation/__init__.py +0 -0
- chia/_tests/fee_estimation/config.py +3 -0
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +144 -0
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
- chia/_tests/generator/__init__.py +0 -0
- chia/_tests/generator/puzzles/__init__.py +0 -0
- chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
- chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
- chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
- chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
- chia/_tests/generator/test_compression.py +201 -0
- chia/_tests/generator/test_generator_types.py +44 -0
- chia/_tests/generator/test_rom.py +180 -0
- chia/_tests/plot_sync/__init__.py +0 -0
- chia/_tests/plot_sync/config.py +3 -0
- chia/_tests/plot_sync/test_delta.py +101 -0
- chia/_tests/plot_sync/test_plot_sync.py +618 -0
- chia/_tests/plot_sync/test_receiver.py +451 -0
- chia/_tests/plot_sync/test_sender.py +116 -0
- chia/_tests/plot_sync/test_sync_simulated.py +451 -0
- chia/_tests/plot_sync/util.py +68 -0
- chia/_tests/plotting/__init__.py +0 -0
- chia/_tests/plotting/config.py +3 -0
- chia/_tests/plotting/test_plot_manager.py +781 -0
- chia/_tests/plotting/util.py +12 -0
- chia/_tests/pools/__init__.py +0 -0
- chia/_tests/pools/config.py +5 -0
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +1001 -0
- chia/_tests/pools/test_pool_config.py +42 -0
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +397 -0
- chia/_tests/pools/test_pool_rpc.py +1123 -0
- chia/_tests/pools/test_pool_wallet.py +205 -0
- chia/_tests/pools/test_wallet_pool_store.py +161 -0
- chia/_tests/process_junit.py +348 -0
- chia/_tests/rpc/__init__.py +0 -0
- chia/_tests/rpc/test_rpc_client.py +138 -0
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/__init__.py +0 -0
- chia/_tests/simulation/config.py +6 -0
- chia/_tests/simulation/test_simulation.py +501 -0
- chia/_tests/simulation/test_simulator.py +232 -0
- chia/_tests/simulation/test_start_simulator.py +107 -0
- chia/_tests/testconfig.py +13 -0
- chia/_tests/timelord/__init__.py +0 -0
- chia/_tests/timelord/config.py +3 -0
- chia/_tests/timelord/test_new_peak.py +437 -0
- chia/_tests/timelord/test_timelord.py +11 -0
- chia/_tests/tools/1315537.json +170 -0
- chia/_tests/tools/1315544.json +160 -0
- chia/_tests/tools/1315630.json +150 -0
- chia/_tests/tools/300000.json +105 -0
- chia/_tests/tools/442734.json +140 -0
- chia/_tests/tools/466212.json +130 -0
- chia/_tests/tools/__init__.py +0 -0
- chia/_tests/tools/config.py +5 -0
- chia/_tests/tools/test-blockchain-db.sqlite +0 -0
- chia/_tests/tools/test_full_sync.py +30 -0
- chia/_tests/tools/test_legacy_keyring.py +82 -0
- chia/_tests/tools/test_run_block.py +128 -0
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/__init__.py +0 -0
- chia/_tests/util/benchmark_cost.py +170 -0
- chia/_tests/util/benchmarks.py +153 -0
- chia/_tests/util/bip39_test_vectors.json +148 -0
- chia/_tests/util/blockchain.py +134 -0
- chia/_tests/util/blockchain_mock.py +132 -0
- chia/_tests/util/build_network_protocol_files.py +302 -0
- chia/_tests/util/clvm_generator.bin +0 -0
- chia/_tests/util/config.py +3 -0
- chia/_tests/util/constants.py +20 -0
- chia/_tests/util/db_connection.py +37 -0
- chia/_tests/util/full_sync.py +253 -0
- chia/_tests/util/gen_ssl_certs.py +114 -0
- chia/_tests/util/generator_tools_testing.py +45 -0
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +36 -0
- chia/_tests/util/misc.py +675 -0
- chia/_tests/util/network_protocol_data.py +1072 -0
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +2701 -0
- chia/_tests/util/rpc.py +26 -0
- chia/_tests/util/run_block.py +163 -0
- chia/_tests/util/setup_nodes.py +481 -0
- chia/_tests/util/spend_sim.py +492 -0
- chia/_tests/util/split_managers.py +102 -0
- chia/_tests/util/temp_file.py +14 -0
- chia/_tests/util/test_action_scope.py +144 -0
- chia/_tests/util/test_async_pool.py +366 -0
- chia/_tests/util/test_build_job_matrix.py +42 -0
- chia/_tests/util/test_build_network_protocol_files.py +7 -0
- chia/_tests/util/test_chia_version.py +50 -0
- chia/_tests/util/test_collection.py +11 -0
- chia/_tests/util/test_condition_tools.py +229 -0
- chia/_tests/util/test_config.py +426 -0
- chia/_tests/util/test_dump_keyring.py +60 -0
- chia/_tests/util/test_errors.py +10 -0
- chia/_tests/util/test_full_block_utils.py +279 -0
- chia/_tests/util/test_installed.py +20 -0
- chia/_tests/util/test_limited_semaphore.py +53 -0
- chia/_tests/util/test_logging_filter.py +42 -0
- chia/_tests/util/test_misc.py +445 -0
- chia/_tests/util/test_network.py +73 -0
- chia/_tests/util/test_network_protocol_files.py +578 -0
- chia/_tests/util/test_network_protocol_json.py +267 -0
- chia/_tests/util/test_network_protocol_test.py +256 -0
- chia/_tests/util/test_paginator.py +71 -0
- chia/_tests/util/test_pprint.py +17 -0
- chia/_tests/util/test_priority_mutex.py +488 -0
- chia/_tests/util/test_recursive_replace.py +116 -0
- chia/_tests/util/test_replace_str_to_bytes.py +137 -0
- chia/_tests/util/test_service_groups.py +15 -0
- chia/_tests/util/test_ssl_check.py +31 -0
- chia/_tests/util/test_testnet_overrides.py +19 -0
- chia/_tests/util/test_tests_misc.py +38 -0
- chia/_tests/util/test_timing.py +37 -0
- chia/_tests/util/test_trusted_peer.py +51 -0
- chia/_tests/util/time_out_assert.py +191 -0
- chia/_tests/wallet/__init__.py +0 -0
- chia/_tests/wallet/cat_wallet/__init__.py +0 -0
- chia/_tests/wallet/cat_wallet/config.py +4 -0
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1826 -0
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
- chia/_tests/wallet/cat_wallet/test_trades.py +2600 -0
- chia/_tests/wallet/clawback/__init__.py +0 -0
- chia/_tests/wallet/clawback/config.py +3 -0
- chia/_tests/wallet/clawback/test_clawback_decorator.py +78 -0
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
- chia/_tests/wallet/clawback/test_clawback_metadata.py +50 -0
- chia/_tests/wallet/config.py +4 -0
- chia/_tests/wallet/conftest.py +278 -0
- chia/_tests/wallet/dao_wallet/__init__.py +0 -0
- chia/_tests/wallet/dao_wallet/config.py +3 -0
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1330 -0
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
- chia/_tests/wallet/db_wallet/__init__.py +0 -0
- chia/_tests/wallet/db_wallet/config.py +3 -0
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +141 -0
- chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
- chia/_tests/wallet/did_wallet/__init__.py +0 -0
- chia/_tests/wallet/did_wallet/config.py +4 -0
- chia/_tests/wallet/did_wallet/test_did.py +2284 -0
- chia/_tests/wallet/nft_wallet/__init__.py +0 -0
- chia/_tests/wallet/nft_wallet/config.py +4 -0
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1493 -0
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1024 -0
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +375 -0
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2584 -0
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
- chia/_tests/wallet/rpc/__init__.py +0 -0
- chia/_tests/wallet/rpc/config.py +4 -0
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +285 -0
- chia/_tests/wallet/rpc/test_wallet_rpc.py +3153 -0
- chia/_tests/wallet/simple_sync/__init__.py +0 -0
- chia/_tests/wallet/simple_sync/config.py +3 -0
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +718 -0
- chia/_tests/wallet/sync/__init__.py +0 -0
- chia/_tests/wallet/sync/config.py +4 -0
- chia/_tests/wallet/sync/test_wallet_sync.py +1692 -0
- chia/_tests/wallet/test_address_type.py +189 -0
- chia/_tests/wallet/test_bech32m.py +45 -0
- chia/_tests/wallet/test_clvm_streamable.py +244 -0
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +588 -0
- chia/_tests/wallet/test_conditions.py +400 -0
- chia/_tests/wallet/test_debug_spend_bundle.py +218 -0
- chia/_tests/wallet/test_new_wallet_protocol.py +1174 -0
- chia/_tests/wallet/test_nft_store.py +192 -0
- chia/_tests/wallet/test_notifications.py +196 -0
- chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
- chia/_tests/wallet/test_puzzle_store.py +132 -0
- chia/_tests/wallet/test_sign_coin_spends.py +159 -0
- chia/_tests/wallet/test_signer_protocol.py +947 -0
- chia/_tests/wallet/test_singleton.py +122 -0
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
- chia/_tests/wallet/test_singleton_store.py +152 -0
- chia/_tests/wallet/test_taproot.py +19 -0
- chia/_tests/wallet/test_transaction_store.py +945 -0
- chia/_tests/wallet/test_util.py +185 -0
- chia/_tests/wallet/test_wallet.py +2139 -0
- chia/_tests/wallet/test_wallet_action_scope.py +85 -0
- chia/_tests/wallet/test_wallet_blockchain.py +111 -0
- chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
- chia/_tests/wallet/test_wallet_interested_store.py +43 -0
- chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
- chia/_tests/wallet/test_wallet_node.py +780 -0
- chia/_tests/wallet/test_wallet_retry.py +95 -0
- chia/_tests/wallet/test_wallet_state_manager.py +259 -0
- chia/_tests/wallet/test_wallet_test_framework.py +275 -0
- chia/_tests/wallet/test_wallet_trade_store.py +218 -0
- chia/_tests/wallet/test_wallet_user_store.py +34 -0
- chia/_tests/wallet/test_wallet_utils.py +156 -0
- chia/_tests/wallet/vc_wallet/__init__.py +0 -0
- chia/_tests/wallet/vc_wallet/config.py +3 -0
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +830 -0
- chia/_tests/wallet/wallet_block_tools.py +327 -0
- chia/_tests/weight_proof/__init__.py +0 -0
- chia/_tests/weight_proof/config.py +3 -0
- chia/_tests/weight_proof/test_weight_proof.py +528 -0
- chia/apis.py +19 -0
- chia/clvm/__init__.py +0 -0
- chia/cmds/__init__.py +0 -0
- chia/cmds/beta.py +184 -0
- chia/cmds/beta_funcs.py +137 -0
- chia/cmds/check_wallet_db.py +420 -0
- chia/cmds/chia.py +151 -0
- chia/cmds/cmd_classes.py +323 -0
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +488 -0
- chia/cmds/coin_funcs.py +275 -0
- chia/cmds/coins.py +182 -0
- chia/cmds/completion.py +49 -0
- chia/cmds/configure.py +332 -0
- chia/cmds/dao.py +1064 -0
- chia/cmds/dao_funcs.py +598 -0
- chia/cmds/data.py +708 -0
- chia/cmds/data_funcs.py +385 -0
- chia/cmds/db.py +87 -0
- chia/cmds/db_backup_func.py +77 -0
- chia/cmds/db_upgrade_func.py +452 -0
- chia/cmds/db_validate_func.py +184 -0
- chia/cmds/dev.py +18 -0
- chia/cmds/farm.py +100 -0
- chia/cmds/farm_funcs.py +200 -0
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +63 -0
- chia/cmds/init_funcs.py +367 -0
- chia/cmds/installers.py +131 -0
- chia/cmds/keys.py +527 -0
- chia/cmds/keys_funcs.py +863 -0
- chia/cmds/netspace.py +50 -0
- chia/cmds/netspace_funcs.py +54 -0
- chia/cmds/options.py +32 -0
- chia/cmds/param_types.py +238 -0
- chia/cmds/passphrase.py +131 -0
- chia/cmds/passphrase_funcs.py +292 -0
- chia/cmds/peer.py +51 -0
- chia/cmds/peer_funcs.py +129 -0
- chia/cmds/plotnft.py +260 -0
- chia/cmds/plotnft_funcs.py +405 -0
- chia/cmds/plots.py +230 -0
- chia/cmds/plotters.py +18 -0
- chia/cmds/rpc.py +208 -0
- chia/cmds/show.py +72 -0
- chia/cmds/show_funcs.py +215 -0
- chia/cmds/signer.py +296 -0
- chia/cmds/sim.py +225 -0
- chia/cmds/sim_funcs.py +509 -0
- chia/cmds/start.py +24 -0
- chia/cmds/start_funcs.py +109 -0
- chia/cmds/stop.py +62 -0
- chia/cmds/units.py +9 -0
- chia/cmds/wallet.py +1901 -0
- chia/cmds/wallet_funcs.py +1874 -0
- chia/consensus/__init__.py +0 -0
- chia/consensus/block_body_validation.py +562 -0
- chia/consensus/block_creation.py +546 -0
- chia/consensus/block_header_validation.py +1059 -0
- chia/consensus/block_record.py +31 -0
- chia/consensus/block_rewards.py +53 -0
- chia/consensus/blockchain.py +1087 -0
- chia/consensus/blockchain_interface.py +56 -0
- chia/consensus/coinbase.py +30 -0
- chia/consensus/condition_costs.py +9 -0
- chia/consensus/constants.py +49 -0
- chia/consensus/cost_calculator.py +15 -0
- chia/consensus/default_constants.py +89 -0
- chia/consensus/deficit.py +55 -0
- chia/consensus/difficulty_adjustment.py +412 -0
- chia/consensus/find_fork_point.py +111 -0
- chia/consensus/full_block_to_block_record.py +167 -0
- chia/consensus/get_block_challenge.py +106 -0
- chia/consensus/get_block_generator.py +27 -0
- chia/consensus/make_sub_epoch_summary.py +210 -0
- chia/consensus/multiprocess_validation.py +268 -0
- chia/consensus/pos_quality.py +19 -0
- chia/consensus/pot_iterations.py +67 -0
- chia/consensus/puzzles/__init__.py +0 -0
- chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
- chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
- chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
- chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
- chia/consensus/vdf_info_computation.py +156 -0
- chia/daemon/__init__.py +0 -0
- chia/daemon/client.py +252 -0
- chia/daemon/keychain_proxy.py +502 -0
- chia/daemon/keychain_server.py +365 -0
- chia/daemon/server.py +1606 -0
- chia/daemon/windows_signal.py +56 -0
- chia/data_layer/__init__.py +0 -0
- chia/data_layer/data_layer.py +1291 -0
- chia/data_layer/data_layer_api.py +33 -0
- chia/data_layer/data_layer_errors.py +50 -0
- chia/data_layer/data_layer_server.py +170 -0
- chia/data_layer/data_layer_util.py +985 -0
- chia/data_layer/data_layer_wallet.py +1311 -0
- chia/data_layer/data_store.py +2267 -0
- chia/data_layer/dl_wallet_store.py +407 -0
- chia/data_layer/download_data.py +389 -0
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
- chia/data_layer/s3_plugin_config.yml +33 -0
- chia/data_layer/s3_plugin_service.py +468 -0
- chia/data_layer/util/__init__.py +0 -0
- chia/data_layer/util/benchmark.py +107 -0
- chia/data_layer/util/plugin.py +40 -0
- chia/farmer/__init__.py +0 -0
- chia/farmer/farmer.py +923 -0
- chia/farmer/farmer_api.py +820 -0
- chia/full_node/__init__.py +0 -0
- chia/full_node/bitcoin_fee_estimator.py +85 -0
- chia/full_node/block_height_map.py +271 -0
- chia/full_node/block_store.py +576 -0
- chia/full_node/bundle_tools.py +19 -0
- chia/full_node/coin_store.py +647 -0
- chia/full_node/fee_estimate.py +54 -0
- chia/full_node/fee_estimate_store.py +24 -0
- chia/full_node/fee_estimation.py +92 -0
- chia/full_node/fee_estimator.py +90 -0
- chia/full_node/fee_estimator_constants.py +38 -0
- chia/full_node/fee_estimator_interface.py +42 -0
- chia/full_node/fee_history.py +25 -0
- chia/full_node/fee_tracker.py +564 -0
- chia/full_node/full_node.py +3327 -0
- chia/full_node/full_node_api.py +2025 -0
- chia/full_node/full_node_store.py +1033 -0
- chia/full_node/hint_management.py +56 -0
- chia/full_node/hint_store.py +93 -0
- chia/full_node/mempool.py +589 -0
- chia/full_node/mempool_check_conditions.py +146 -0
- chia/full_node/mempool_manager.py +853 -0
- chia/full_node/pending_tx_cache.py +112 -0
- chia/full_node/puzzles/__init__.py +0 -0
- chia/full_node/puzzles/block_program_zero.clsp +14 -0
- chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
- chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
- chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
- chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
- chia/full_node/signage_point.py +16 -0
- chia/full_node/subscriptions.py +247 -0
- chia/full_node/sync_store.py +146 -0
- chia/full_node/tx_processing_queue.py +78 -0
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +1720 -0
- chia/harvester/__init__.py +0 -0
- chia/harvester/harvester.py +272 -0
- chia/harvester/harvester_api.py +380 -0
- chia/introducer/__init__.py +0 -0
- chia/introducer/introducer.py +122 -0
- chia/introducer/introducer_api.py +70 -0
- chia/legacy/__init__.py +0 -0
- chia/legacy/keyring.py +155 -0
- chia/plot_sync/__init__.py +0 -0
- chia/plot_sync/delta.py +61 -0
- chia/plot_sync/exceptions.py +56 -0
- chia/plot_sync/receiver.py +386 -0
- chia/plot_sync/sender.py +340 -0
- chia/plot_sync/util.py +43 -0
- chia/plotters/__init__.py +0 -0
- chia/plotters/bladebit.py +388 -0
- chia/plotters/chiapos.py +63 -0
- chia/plotters/madmax.py +224 -0
- chia/plotters/plotters.py +577 -0
- chia/plotters/plotters_util.py +133 -0
- chia/plotting/__init__.py +0 -0
- chia/plotting/cache.py +213 -0
- chia/plotting/check_plots.py +283 -0
- chia/plotting/create_plots.py +278 -0
- chia/plotting/manager.py +436 -0
- chia/plotting/util.py +336 -0
- chia/pools/__init__.py +0 -0
- chia/pools/pool_config.py +110 -0
- chia/pools/pool_puzzles.py +459 -0
- chia/pools/pool_wallet.py +933 -0
- chia/pools/pool_wallet_info.py +118 -0
- chia/pools/puzzles/__init__.py +0 -0
- chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
- chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
- chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
- chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
- chia/protocols/__init__.py +0 -0
- chia/protocols/farmer_protocol.py +102 -0
- chia/protocols/full_node_protocol.py +219 -0
- chia/protocols/harvester_protocol.py +216 -0
- chia/protocols/introducer_protocol.py +25 -0
- chia/protocols/pool_protocol.py +177 -0
- chia/protocols/protocol_message_types.py +139 -0
- chia/protocols/protocol_state_machine.py +87 -0
- chia/protocols/protocol_timing.py +8 -0
- chia/protocols/shared_protocol.py +86 -0
- chia/protocols/timelord_protocol.py +93 -0
- chia/protocols/wallet_protocol.py +401 -0
- chia/py.typed +0 -0
- chia/rpc/__init__.py +0 -0
- chia/rpc/crawler_rpc_api.py +80 -0
- chia/rpc/data_layer_rpc_api.py +644 -0
- chia/rpc/data_layer_rpc_client.py +188 -0
- chia/rpc/data_layer_rpc_util.py +58 -0
- chia/rpc/farmer_rpc_api.py +365 -0
- chia/rpc/farmer_rpc_client.py +86 -0
- chia/rpc/full_node_rpc_api.py +959 -0
- chia/rpc/full_node_rpc_client.py +292 -0
- chia/rpc/harvester_rpc_api.py +141 -0
- chia/rpc/harvester_rpc_client.py +54 -0
- chia/rpc/rpc_client.py +164 -0
- chia/rpc/rpc_server.py +521 -0
- chia/rpc/timelord_rpc_api.py +32 -0
- chia/rpc/util.py +93 -0
- chia/rpc/wallet_request_types.py +904 -0
- chia/rpc/wallet_rpc_api.py +4943 -0
- chia/rpc/wallet_rpc_client.py +1814 -0
- chia/seeder/__init__.py +0 -0
- chia/seeder/crawl_store.py +425 -0
- chia/seeder/crawler.py +410 -0
- chia/seeder/crawler_api.py +135 -0
- chia/seeder/dns_server.py +593 -0
- chia/seeder/peer_record.py +146 -0
- chia/seeder/start_crawler.py +92 -0
- chia/server/__init__.py +0 -0
- chia/server/address_manager.py +658 -0
- chia/server/address_manager_store.py +237 -0
- chia/server/api_protocol.py +116 -0
- chia/server/capabilities.py +24 -0
- chia/server/chia_policy.py +346 -0
- chia/server/introducer_peers.py +76 -0
- chia/server/node_discovery.py +714 -0
- chia/server/outbound_message.py +33 -0
- chia/server/rate_limit_numbers.py +214 -0
- chia/server/rate_limits.py +153 -0
- chia/server/server.py +741 -0
- chia/server/signal_handlers.py +120 -0
- chia/server/ssl_context.py +32 -0
- chia/server/start_data_layer.py +151 -0
- chia/server/start_farmer.py +98 -0
- chia/server/start_full_node.py +112 -0
- chia/server/start_harvester.py +93 -0
- chia/server/start_introducer.py +81 -0
- chia/server/start_service.py +316 -0
- chia/server/start_timelord.py +89 -0
- chia/server/start_wallet.py +113 -0
- chia/server/upnp.py +118 -0
- chia/server/ws_connection.py +766 -0
- chia/simulator/__init__.py +0 -0
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +2054 -0
- chia/simulator/full_node_simulator.py +794 -0
- chia/simulator/keyring.py +128 -0
- chia/simulator/setup_services.py +506 -0
- chia/simulator/simulator_constants.py +13 -0
- chia/simulator/simulator_full_node_rpc_api.py +99 -0
- chia/simulator/simulator_full_node_rpc_client.py +60 -0
- chia/simulator/simulator_protocol.py +29 -0
- chia/simulator/simulator_test_tools.py +164 -0
- chia/simulator/socket.py +24 -0
- chia/simulator/ssl_certs.py +114 -0
- chia/simulator/ssl_certs_1.py +697 -0
- chia/simulator/ssl_certs_10.py +697 -0
- chia/simulator/ssl_certs_2.py +697 -0
- chia/simulator/ssl_certs_3.py +697 -0
- chia/simulator/ssl_certs_4.py +697 -0
- chia/simulator/ssl_certs_5.py +697 -0
- chia/simulator/ssl_certs_6.py +697 -0
- chia/simulator/ssl_certs_7.py +697 -0
- chia/simulator/ssl_certs_8.py +697 -0
- chia/simulator/ssl_certs_9.py +697 -0
- chia/simulator/start_simulator.py +143 -0
- chia/simulator/wallet_tools.py +246 -0
- chia/ssl/__init__.py +0 -0
- chia/ssl/chia_ca.crt +19 -0
- chia/ssl/chia_ca.key +28 -0
- chia/ssl/create_ssl.py +249 -0
- chia/ssl/dst_root_ca.pem +20 -0
- chia/timelord/__init__.py +0 -0
- chia/timelord/iters_from_block.py +50 -0
- chia/timelord/timelord.py +1226 -0
- chia/timelord/timelord_api.py +138 -0
- chia/timelord/timelord_launcher.py +190 -0
- chia/timelord/timelord_state.py +244 -0
- chia/timelord/types.py +22 -0
- chia/types/__init__.py +0 -0
- chia/types/aliases.py +35 -0
- chia/types/block_protocol.py +20 -0
- chia/types/blockchain_format/__init__.py +0 -0
- chia/types/blockchain_format/classgroup.py +5 -0
- chia/types/blockchain_format/coin.py +28 -0
- chia/types/blockchain_format/foliage.py +8 -0
- chia/types/blockchain_format/pool_target.py +5 -0
- chia/types/blockchain_format/program.py +269 -0
- chia/types/blockchain_format/proof_of_space.py +135 -0
- chia/types/blockchain_format/reward_chain_block.py +6 -0
- chia/types/blockchain_format/serialized_program.py +5 -0
- chia/types/blockchain_format/sized_bytes.py +11 -0
- chia/types/blockchain_format/slots.py +9 -0
- chia/types/blockchain_format/sub_epoch_summary.py +5 -0
- chia/types/blockchain_format/tree_hash.py +72 -0
- chia/types/blockchain_format/vdf.py +86 -0
- chia/types/clvm_cost.py +13 -0
- chia/types/coin_record.py +43 -0
- chia/types/coin_spend.py +115 -0
- chia/types/condition_opcodes.py +73 -0
- chia/types/condition_with_args.py +16 -0
- chia/types/eligible_coin_spends.py +365 -0
- chia/types/end_of_slot_bundle.py +5 -0
- chia/types/fee_rate.py +38 -0
- chia/types/full_block.py +5 -0
- chia/types/generator_types.py +13 -0
- chia/types/header_block.py +5 -0
- chia/types/internal_mempool_item.py +18 -0
- chia/types/mempool_inclusion_status.py +9 -0
- chia/types/mempool_item.py +85 -0
- chia/types/mempool_submission_status.py +30 -0
- chia/types/mojos.py +7 -0
- chia/types/peer_info.py +64 -0
- chia/types/signing_mode.py +29 -0
- chia/types/spend_bundle.py +30 -0
- chia/types/spend_bundle_conditions.py +7 -0
- chia/types/transaction_queue_entry.py +55 -0
- chia/types/unfinished_block.py +5 -0
- chia/types/unfinished_header_block.py +37 -0
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +49 -0
- chia/util/__init__.py +0 -0
- chia/util/action_scope.py +168 -0
- chia/util/async_pool.py +226 -0
- chia/util/augmented_chain.py +134 -0
- chia/util/batches.py +42 -0
- chia/util/bech32m.py +126 -0
- chia/util/beta_metrics.py +119 -0
- chia/util/block_cache.py +56 -0
- chia/util/byte_types.py +12 -0
- chia/util/check_fork_next_block.py +33 -0
- chia/util/chia_logging.py +144 -0
- chia/util/chia_version.py +33 -0
- chia/util/collection.py +17 -0
- chia/util/condition_tools.py +201 -0
- chia/util/config.py +367 -0
- chia/util/cpu.py +22 -0
- chia/util/db_synchronous.py +23 -0
- chia/util/db_version.py +32 -0
- chia/util/db_wrapper.py +430 -0
- chia/util/default_root.py +27 -0
- chia/util/dump_keyring.py +93 -0
- chia/util/english.txt +2048 -0
- chia/util/errors.py +353 -0
- chia/util/file_keyring.py +469 -0
- chia/util/files.py +97 -0
- chia/util/full_block_utils.py +345 -0
- chia/util/generator_tools.py +72 -0
- chia/util/hash.py +31 -0
- chia/util/initial-config.yaml +694 -0
- chia/util/inline_executor.py +26 -0
- chia/util/ints.py +19 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +37 -0
- chia/util/keychain.py +676 -0
- chia/util/keyring_wrapper.py +327 -0
- chia/util/limited_semaphore.py +41 -0
- chia/util/lock.py +49 -0
- chia/util/log_exceptions.py +32 -0
- chia/util/logging.py +36 -0
- chia/util/lru_cache.py +31 -0
- chia/util/math.py +20 -0
- chia/util/network.py +182 -0
- chia/util/paginator.py +48 -0
- chia/util/path.py +31 -0
- chia/util/permissions.py +20 -0
- chia/util/prev_transaction_block.py +21 -0
- chia/util/priority_mutex.py +95 -0
- chia/util/profiler.py +197 -0
- chia/util/recursive_replace.py +24 -0
- chia/util/safe_cancel_task.py +16 -0
- chia/util/service_groups.py +47 -0
- chia/util/setproctitle.py +22 -0
- chia/util/significant_bits.py +32 -0
- chia/util/ssl_check.py +213 -0
- chia/util/streamable.py +642 -0
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +382 -0
- chia/util/timing.py +67 -0
- chia/util/vdf_prover.py +30 -0
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +66 -0
- chia/wallet/__init__.py +0 -0
- chia/wallet/cat_wallet/__init__.py +0 -0
- chia/wallet/cat_wallet/cat_constants.py +75 -0
- chia/wallet/cat_wallet/cat_info.py +47 -0
- chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
- chia/wallet/cat_wallet/cat_utils.py +164 -0
- chia/wallet/cat_wallet/cat_wallet.py +855 -0
- chia/wallet/cat_wallet/dao_cat_info.py +28 -0
- chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
- chia/wallet/cat_wallet/lineage_store.py +74 -0
- chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
- chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
- chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
- chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
- chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
- chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
- chia/wallet/coin_selection.py +188 -0
- chia/wallet/conditions.py +1512 -0
- chia/wallet/dao_wallet/__init__.py +0 -0
- chia/wallet/dao_wallet/dao_info.py +61 -0
- chia/wallet/dao_wallet/dao_utils.py +811 -0
- chia/wallet/dao_wallet/dao_wallet.py +2119 -0
- chia/wallet/db_wallet/__init__.py +0 -0
- chia/wallet/db_wallet/db_wallet_puzzles.py +111 -0
- chia/wallet/derivation_record.py +30 -0
- chia/wallet/derive_keys.py +146 -0
- chia/wallet/did_wallet/__init__.py +0 -0
- chia/wallet/did_wallet/did_info.py +39 -0
- chia/wallet/did_wallet/did_wallet.py +1494 -0
- chia/wallet/did_wallet/did_wallet_puzzles.py +221 -0
- chia/wallet/did_wallet/puzzles/__init__.py +0 -0
- chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
- chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
- chia/wallet/driver_protocol.py +26 -0
- chia/wallet/key_val_store.py +55 -0
- chia/wallet/lineage_proof.py +58 -0
- chia/wallet/nft_wallet/__init__.py +0 -0
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
- chia/wallet/nft_wallet/nft_info.py +120 -0
- chia/wallet/nft_wallet/nft_puzzles.py +305 -0
- chia/wallet/nft_wallet/nft_wallet.py +1687 -0
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
- chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
- chia/wallet/nft_wallet/uncurry_nft.py +217 -0
- chia/wallet/notification_manager.py +117 -0
- chia/wallet/notification_store.py +178 -0
- chia/wallet/outer_puzzles.py +84 -0
- chia/wallet/payment.py +33 -0
- chia/wallet/puzzle_drivers.py +118 -0
- chia/wallet/puzzles/__init__.py +0 -0
- chia/wallet/puzzles/augmented_condition.clsp +13 -0
- chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
- chia/wallet/puzzles/clawback/__init__.py +0 -0
- chia/wallet/puzzles/clawback/drivers.py +188 -0
- chia/wallet/puzzles/clawback/metadata.py +38 -0
- chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
- chia/wallet/puzzles/condition_codes.clib +77 -0
- chia/wallet/puzzles/curry-and-treehash.clib +102 -0
- chia/wallet/puzzles/curry.clib +135 -0
- chia/wallet/puzzles/curry_by_index.clib +16 -0
- chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
- chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
- chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
- chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
- chia/wallet/puzzles/dao_finished_state.clsp +35 -0
- chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
- chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_lockup.clsp +288 -0
- chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
- chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal.clsp +377 -0
- chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_treasury.clsp +115 -0
- chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
- chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
- chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
- chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
- chia/wallet/puzzles/json.clib +25 -0
- chia/wallet/puzzles/load_clvm.py +161 -0
- chia/wallet/puzzles/merkle_utils.clib +18 -0
- chia/wallet/puzzles/notification.clsp +7 -0
- chia/wallet/puzzles/notification.clsp.hex +1 -0
- chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
- chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
- chia/wallet/puzzles/p2_conditions.clsp +3 -0
- chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
- chia/wallet/puzzles/p2_conditions.py +26 -0
- chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
- chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_conditions.py +21 -0
- chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
- chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_puzzle.py +34 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +160 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +21 -0
- chia/wallet/puzzles/p2_parent.clsp +19 -0
- chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
- chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
- chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
- chia/wallet/puzzles/p2_puzzle_hash.py +27 -0
- chia/wallet/puzzles/p2_singleton.clsp +30 -0
- chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
- chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
- chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
- chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/puzzle_utils.py +34 -0
- chia/wallet/puzzles/settlement_payments.clsp +49 -0
- chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
- chia/wallet/puzzles/sha256tree.clib +11 -0
- chia/wallet/puzzles/singleton_launcher.clsp +16 -0
- chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
- chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer.py +296 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +345 -0
- chia/wallet/puzzles/singleton_truths.clib +21 -0
- chia/wallet/puzzles/tails.py +348 -0
- chia/wallet/puzzles/utility_macros.clib +48 -0
- chia/wallet/signer_protocol.py +125 -0
- chia/wallet/singleton.py +106 -0
- chia/wallet/singleton_record.py +30 -0
- chia/wallet/trade_manager.py +1102 -0
- chia/wallet/trade_record.py +67 -0
- chia/wallet/trading/__init__.py +0 -0
- chia/wallet/trading/offer.py +702 -0
- chia/wallet/trading/trade_status.py +13 -0
- chia/wallet/trading/trade_store.py +526 -0
- chia/wallet/transaction_record.py +158 -0
- chia/wallet/transaction_sorting.py +14 -0
- chia/wallet/uncurried_puzzle.py +17 -0
- chia/wallet/util/__init__.py +0 -0
- chia/wallet/util/address_type.py +55 -0
- chia/wallet/util/blind_signer_tl.py +164 -0
- chia/wallet/util/clvm_streamable.py +203 -0
- chia/wallet/util/compute_hints.py +66 -0
- chia/wallet/util/compute_memos.py +43 -0
- chia/wallet/util/curry_and_treehash.py +91 -0
- chia/wallet/util/debug_spend_bundle.py +232 -0
- chia/wallet/util/merkle_tree.py +100 -0
- chia/wallet/util/merkle_utils.py +102 -0
- chia/wallet/util/new_peak_queue.py +82 -0
- chia/wallet/util/notifications.py +12 -0
- chia/wallet/util/peer_request_cache.py +174 -0
- chia/wallet/util/pprint.py +39 -0
- chia/wallet/util/puzzle_compression.py +95 -0
- chia/wallet/util/puzzle_decorator.py +100 -0
- chia/wallet/util/puzzle_decorator_type.py +7 -0
- chia/wallet/util/query_filter.py +59 -0
- chia/wallet/util/transaction_type.py +23 -0
- chia/wallet/util/tx_config.py +158 -0
- chia/wallet/util/wallet_sync_utils.py +351 -0
- chia/wallet/util/wallet_types.py +72 -0
- chia/wallet/vc_wallet/__init__.py +0 -0
- chia/wallet/vc_wallet/cr_cat_drivers.py +664 -0
- chia/wallet/vc_wallet/cr_cat_wallet.py +877 -0
- chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
- chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
- chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
- chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
- chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
- chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
- chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
- chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_drivers.py +838 -0
- chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
- chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
- chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
- chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
- chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
- chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
- chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
- chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_store.py +263 -0
- chia/wallet/vc_wallet/vc_wallet.py +638 -0
- chia/wallet/wallet.py +698 -0
- chia/wallet/wallet_action_scope.py +96 -0
- chia/wallet/wallet_blockchain.py +244 -0
- chia/wallet/wallet_coin_record.py +72 -0
- chia/wallet/wallet_coin_store.py +351 -0
- chia/wallet/wallet_info.py +35 -0
- chia/wallet/wallet_interested_store.py +188 -0
- chia/wallet/wallet_nft_store.py +279 -0
- chia/wallet/wallet_node.py +1765 -0
- chia/wallet/wallet_node_api.py +207 -0
- chia/wallet/wallet_pool_store.py +119 -0
- chia/wallet/wallet_protocol.py +90 -0
- chia/wallet/wallet_puzzle_store.py +396 -0
- chia/wallet/wallet_retry_store.py +70 -0
- chia/wallet/wallet_singleton_store.py +259 -0
- chia/wallet/wallet_spend_bundle.py +25 -0
- chia/wallet/wallet_state_manager.py +2819 -0
- chia/wallet/wallet_transaction_store.py +496 -0
- chia/wallet/wallet_user_store.py +110 -0
- chia/wallet/wallet_weight_proof_handler.py +126 -0
- chia_blockchain-2.5.1rc1.dist-info/LICENSE +201 -0
- chia_blockchain-2.5.1rc1.dist-info/METADATA +156 -0
- chia_blockchain-2.5.1rc1.dist-info/RECORD +1042 -0
- chia_blockchain-2.5.1rc1.dist-info/WHEEL +4 -0
- chia_blockchain-2.5.1rc1.dist-info/entry_points.txt +17 -0
- mozilla-ca/cacert.pem +3611 -0
chia/cmds/sim_funcs.py
ADDED
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import os
|
|
5
|
+
import sys
|
|
6
|
+
from pathlib import Path, PureWindowsPath
|
|
7
|
+
from random import randint
|
|
8
|
+
from typing import Any, Optional
|
|
9
|
+
|
|
10
|
+
from aiohttp import ClientConnectorError
|
|
11
|
+
from chia_rs import PrivateKey
|
|
12
|
+
|
|
13
|
+
from chia.cmds.cmds_util import get_any_service_client
|
|
14
|
+
from chia.cmds.start_funcs import async_start
|
|
15
|
+
from chia.consensus.coinbase import create_puzzlehash_for_pk
|
|
16
|
+
from chia.server.outbound_message import NodeType
|
|
17
|
+
from chia.simulator.simulator_full_node_rpc_client import SimulatorFullNodeRpcClient
|
|
18
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
19
|
+
from chia.types.coin_record import CoinRecord
|
|
20
|
+
from chia.util.bech32m import decode_puzzle_hash, encode_puzzle_hash
|
|
21
|
+
from chia.util.config import load_config, save_config, set_peer_info
|
|
22
|
+
from chia.util.errors import KeychainFingerprintExists
|
|
23
|
+
from chia.util.ints import uint32
|
|
24
|
+
from chia.util.keychain import Keychain, bytes_to_mnemonic
|
|
25
|
+
from chia.wallet.derive_keys import (
|
|
26
|
+
master_sk_to_farmer_sk,
|
|
27
|
+
master_sk_to_pool_sk,
|
|
28
|
+
master_sk_to_wallet_sk,
|
|
29
|
+
master_sk_to_wallet_sk_unhardened,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def get_ph_from_fingerprint(fingerprint: int, key_id: int = 1) -> bytes32:
|
|
34
|
+
priv_key_and_entropy = Keychain().get_private_key_by_fingerprint(fingerprint)
|
|
35
|
+
if priv_key_and_entropy is None:
|
|
36
|
+
raise Exception("Fingerprint not found")
|
|
37
|
+
private_key = priv_key_and_entropy[0]
|
|
38
|
+
sk_for_wallet_id: PrivateKey = master_sk_to_wallet_sk(private_key, uint32(key_id))
|
|
39
|
+
puzzle_hash: bytes32 = create_puzzlehash_for_pk(sk_for_wallet_id.get_g1())
|
|
40
|
+
return puzzle_hash
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def create_chia_directory(
|
|
44
|
+
chia_root: Path,
|
|
45
|
+
fingerprint: int,
|
|
46
|
+
farming_address: Optional[str],
|
|
47
|
+
plot_directory: Optional[str],
|
|
48
|
+
auto_farm: Optional[bool],
|
|
49
|
+
docker_mode: bool,
|
|
50
|
+
) -> dict[str, Any]:
|
|
51
|
+
"""
|
|
52
|
+
This function creates a new chia directory and returns a heavily modified config,
|
|
53
|
+
suitable for use in the simulator.
|
|
54
|
+
"""
|
|
55
|
+
from chia.cmds.init_funcs import chia_init
|
|
56
|
+
|
|
57
|
+
if not chia_root.is_dir() or not Path(chia_root / "config" / "config.yaml").exists():
|
|
58
|
+
# create chia directories & load config
|
|
59
|
+
chia_init(chia_root, testnet=True, fix_ssl_permissions=True)
|
|
60
|
+
config: dict[str, Any] = load_config(chia_root, "config.yaml")
|
|
61
|
+
# apply standard block-tools config.
|
|
62
|
+
config["full_node"]["send_uncompact_interval"] = 0
|
|
63
|
+
config["full_node"]["target_uncompact_proofs"] = 30
|
|
64
|
+
config["full_node"]["peer_connect_interval"] = 50
|
|
65
|
+
config["full_node"]["sanitize_weight_proof_only"] = False
|
|
66
|
+
config["logging"]["log_level"] = "INFO" # extra logs for easier development
|
|
67
|
+
# make sure we don't try to connect to other nodes.
|
|
68
|
+
config["full_node"]["introducer_peer"] = None
|
|
69
|
+
config["wallet"]["introducer_peer"] = None
|
|
70
|
+
config["full_node"]["dns_servers"] = []
|
|
71
|
+
config["wallet"]["dns_servers"] = []
|
|
72
|
+
# create custom testnet (simulator0)
|
|
73
|
+
config["network_overrides"]["constants"]["simulator0"] = config["network_overrides"]["constants"][
|
|
74
|
+
"testnet0"
|
|
75
|
+
].copy()
|
|
76
|
+
config["network_overrides"]["config"]["simulator0"] = config["network_overrides"]["config"]["testnet0"].copy()
|
|
77
|
+
sim_genesis = "eb8c4d20b322be8d9fddbf9412016bdffe9a2901d7edb0e364e94266d0e095f7"
|
|
78
|
+
config["network_overrides"]["constants"]["simulator0"]["GENESIS_CHALLENGE"] = sim_genesis
|
|
79
|
+
# tell services to use simulator0
|
|
80
|
+
config["selected_network"] = "simulator0"
|
|
81
|
+
config["wallet"]["selected_network"] = "simulator0"
|
|
82
|
+
config["full_node"]["selected_network"] = "simulator0"
|
|
83
|
+
config["seeder"]["selected_network"] = "simulator0"
|
|
84
|
+
config["harvester"]["selected_network"] = "simulator0"
|
|
85
|
+
config["pool"]["selected_network"] = "simulator0"
|
|
86
|
+
config["farmer"]["selected_network"] = "simulator0"
|
|
87
|
+
config["timelord"]["selected_network"] = "simulator0"
|
|
88
|
+
config["ui"]["selected_network"] = "simulator0"
|
|
89
|
+
config["introducer"]["selected_network"] = "simulator0"
|
|
90
|
+
config["data_layer"]["selected_network"] = "simulator0"
|
|
91
|
+
if not docker_mode: # We want predictable ports for our docker image.
|
|
92
|
+
# set ports and networks, we don't want to cause a port conflict.
|
|
93
|
+
port_offset = randint(1, 20000)
|
|
94
|
+
config["daemon_port"] -= port_offset
|
|
95
|
+
config["network_overrides"]["config"]["simulator0"]["default_full_node_port"] = 38444 + port_offset
|
|
96
|
+
# wallet
|
|
97
|
+
config["wallet"]["rpc_port"] += port_offset
|
|
98
|
+
# full node
|
|
99
|
+
config["full_node"]["port"] -= port_offset
|
|
100
|
+
config["full_node"]["rpc_port"] += port_offset
|
|
101
|
+
# connect wallet to full node
|
|
102
|
+
set_peer_info(config["wallet"], peer_type=NodeType.FULL_NODE, peer_port=config["full_node"]["port"])
|
|
103
|
+
# ui
|
|
104
|
+
config["ui"]["daemon_port"] = config["daemon_port"]
|
|
105
|
+
else:
|
|
106
|
+
config["self_hostname"] = "0.0.0.0" # Bind to all interfaces.
|
|
107
|
+
config["logging"]["log_stdout"] = True # Log to console.
|
|
108
|
+
else:
|
|
109
|
+
config = load_config(chia_root, "config.yaml")
|
|
110
|
+
# simulator overrides
|
|
111
|
+
sim_config = config["simulator"]
|
|
112
|
+
sim_config["key_fingerprint"] = fingerprint
|
|
113
|
+
if farming_address is None:
|
|
114
|
+
prefix = config["network_overrides"]["config"]["simulator0"]["address_prefix"]
|
|
115
|
+
farming_address = encode_puzzle_hash(get_ph_from_fingerprint(fingerprint), prefix)
|
|
116
|
+
sim_config["farming_address"] = farming_address
|
|
117
|
+
if plot_directory is not None:
|
|
118
|
+
sim_config["plot_directory"] = plot_directory
|
|
119
|
+
# Temporary change to fix win / linux differences.
|
|
120
|
+
sim_config["plot_directory"] = str(Path(sim_config["plot_directory"]))
|
|
121
|
+
if "//" in sim_config["plot_directory"] and os.name != "nt":
|
|
122
|
+
# if we're on linux, we need to convert to a linux path.
|
|
123
|
+
sim_config["plot_directory"] = str(PureWindowsPath(sim_config["plot_directory"]).as_posix())
|
|
124
|
+
sim_config["auto_farm"] = auto_farm if auto_farm is not None else True
|
|
125
|
+
farming_ph = decode_puzzle_hash(farming_address)
|
|
126
|
+
# modify genesis block to give the user the reward
|
|
127
|
+
simulator_consts = config["network_overrides"]["constants"]["simulator0"]
|
|
128
|
+
simulator_consts["GENESIS_PRE_FARM_FARMER_PUZZLE_HASH"] = farming_ph.hex()
|
|
129
|
+
simulator_consts["GENESIS_PRE_FARM_POOL_PUZZLE_HASH"] = farming_ph.hex()
|
|
130
|
+
# get fork heights then write back to config
|
|
131
|
+
if "HARD_FORK_HEIGHT" not in sim_config: # this meh code is done so that we also write to the config file.
|
|
132
|
+
sim_config["HARD_FORK_HEIGHT"] = 0
|
|
133
|
+
if "SOFT_FORK6_HEIGHT" not in sim_config:
|
|
134
|
+
sim_config["SOFT_FORK6_HEIGHT"] = 0
|
|
135
|
+
simulator_consts["HARD_FORK_HEIGHT"] = sim_config["HARD_FORK_HEIGHT"]
|
|
136
|
+
simulator_consts["SOFT_FORK6_HEIGHT"] = sim_config["SOFT_FORK6_HEIGHT"]
|
|
137
|
+
|
|
138
|
+
# save config and return the config
|
|
139
|
+
save_config(chia_root, "config.yaml", config)
|
|
140
|
+
return config
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def display_key_info(fingerprint: int, prefix: str) -> None:
|
|
144
|
+
"""
|
|
145
|
+
Display key info for a given fingerprint, similar to the output of `chia keys show`.
|
|
146
|
+
"""
|
|
147
|
+
print(f"Using fingerprint {fingerprint}")
|
|
148
|
+
private_key_and_seed = Keychain().get_private_key_by_fingerprint(fingerprint)
|
|
149
|
+
if private_key_and_seed is None:
|
|
150
|
+
print(f"Fingerprint {fingerprint} not found")
|
|
151
|
+
return
|
|
152
|
+
sk, seed = private_key_and_seed
|
|
153
|
+
print("\nFingerprint:", sk.get_g1().get_fingerprint())
|
|
154
|
+
print("Master public key (m):", sk.get_g1())
|
|
155
|
+
print("Farmer public key (m/12381/8444/0/0):", master_sk_to_farmer_sk(sk).get_g1())
|
|
156
|
+
print("Pool public key (m/12381/8444/1/0):", master_sk_to_pool_sk(sk).get_g1())
|
|
157
|
+
first_wallet_sk: PrivateKey = master_sk_to_wallet_sk_unhardened(sk, uint32(0))
|
|
158
|
+
wallet_address: str = encode_puzzle_hash(create_puzzlehash_for_pk(first_wallet_sk.get_g1()), prefix)
|
|
159
|
+
print(f"First wallet address: {wallet_address}")
|
|
160
|
+
assert seed is not None
|
|
161
|
+
print("Master private key (m):", bytes(sk).hex())
|
|
162
|
+
print("First wallet secret key (m/12381/8444/2/0):", master_sk_to_wallet_sk(sk, uint32(0)))
|
|
163
|
+
mnemonic = bytes_to_mnemonic(seed)
|
|
164
|
+
print(" Mnemonic seed (24 secret words):")
|
|
165
|
+
print(f"{mnemonic} \n")
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def generate_and_return_fingerprint(mnemonic: Optional[str] = None) -> int:
|
|
169
|
+
"""
|
|
170
|
+
Generate and add new PrivateKey and return its fingerprint.
|
|
171
|
+
"""
|
|
172
|
+
from chia.util.keychain import generate_mnemonic
|
|
173
|
+
|
|
174
|
+
if mnemonic is None:
|
|
175
|
+
print("Generating private key")
|
|
176
|
+
mnemonic = generate_mnemonic()
|
|
177
|
+
try:
|
|
178
|
+
sk = Keychain().add_key(mnemonic, None)
|
|
179
|
+
fingerprint: int = sk.get_g1().get_fingerprint()
|
|
180
|
+
except KeychainFingerprintExists as e:
|
|
181
|
+
fingerprint = e.fingerprint
|
|
182
|
+
print(f"Fingerprint: {fingerprint} for provided private key already exists.")
|
|
183
|
+
return fingerprint
|
|
184
|
+
print(f"Added private key with public key fingerprint {fingerprint}")
|
|
185
|
+
return fingerprint
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def select_fingerprint(
|
|
189
|
+
fingerprint: Optional[int] = None, mnemonic_string: Optional[str] = None, auto_generate_key: bool = False
|
|
190
|
+
) -> Optional[int]:
|
|
191
|
+
"""
|
|
192
|
+
Either select an existing fingerprint or create one and return it.
|
|
193
|
+
"""
|
|
194
|
+
if mnemonic_string:
|
|
195
|
+
fingerprint = generate_and_return_fingerprint(mnemonic_string)
|
|
196
|
+
fingerprints: list[int] = [pk.get_fingerprint() for pk in Keychain().get_all_public_keys()]
|
|
197
|
+
if fingerprint is not None and fingerprint in fingerprints:
|
|
198
|
+
return fingerprint
|
|
199
|
+
elif fingerprint is not None and fingerprint not in fingerprints:
|
|
200
|
+
print(f"Invalid Fingerprint. Fingerprint {fingerprint} was not found.")
|
|
201
|
+
return None
|
|
202
|
+
if auto_generate_key and len(fingerprints) == 1:
|
|
203
|
+
return fingerprints[0]
|
|
204
|
+
if len(fingerprints) == 0:
|
|
205
|
+
if not auto_generate_key:
|
|
206
|
+
if (
|
|
207
|
+
input("No keys in keychain. Press 'q' to quit, or press any other key to generate a new key.").lower()
|
|
208
|
+
== "q"
|
|
209
|
+
):
|
|
210
|
+
return None
|
|
211
|
+
# generate private key and add to wallet
|
|
212
|
+
fingerprint = generate_and_return_fingerprint()
|
|
213
|
+
else:
|
|
214
|
+
print("Fingerprints:")
|
|
215
|
+
print(
|
|
216
|
+
"If you already used one of these keys, select that fingerprint to skip the plotting process."
|
|
217
|
+
" Otherwise, select any key below."
|
|
218
|
+
)
|
|
219
|
+
for i, fp in enumerate(fingerprints):
|
|
220
|
+
row: str = f"{i + 1}) "
|
|
221
|
+
row += f"{fp}"
|
|
222
|
+
print(row)
|
|
223
|
+
val = None
|
|
224
|
+
prompt: str = f"Choose a simulator key [1-{len(fingerprints)}] ('q' to quit, or 'g' to generate a new key): "
|
|
225
|
+
while val is None:
|
|
226
|
+
val = input(prompt)
|
|
227
|
+
if val == "q":
|
|
228
|
+
return None
|
|
229
|
+
elif val == "g":
|
|
230
|
+
fingerprint = generate_and_return_fingerprint()
|
|
231
|
+
break
|
|
232
|
+
elif not val.isdigit():
|
|
233
|
+
val = None
|
|
234
|
+
else:
|
|
235
|
+
index = int(val) - 1
|
|
236
|
+
if index < 0 or index >= len(fingerprints):
|
|
237
|
+
print("Invalid value")
|
|
238
|
+
val = None
|
|
239
|
+
continue
|
|
240
|
+
else:
|
|
241
|
+
fingerprint = fingerprints[index]
|
|
242
|
+
assert fingerprint is not None
|
|
243
|
+
return fingerprint
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
async def generate_plots(config: dict[str, Any], root_path: Path, fingerprint: int, bitfield: bool) -> None:
|
|
247
|
+
"""
|
|
248
|
+
Pre-Generate plots for the new simulator instance.
|
|
249
|
+
"""
|
|
250
|
+
|
|
251
|
+
from chia.simulator.block_tools import BlockTools, test_constants
|
|
252
|
+
from chia.simulator.start_simulator import PLOT_SIZE, PLOTS
|
|
253
|
+
|
|
254
|
+
farming_puzzle_hash = decode_puzzle_hash(config["simulator"]["farming_address"])
|
|
255
|
+
os.environ["CHIA_ROOT"] = str(root_path) # change env variable, to make it match what the daemon would set it to
|
|
256
|
+
|
|
257
|
+
# create block tools and use local keychain
|
|
258
|
+
bt = BlockTools(
|
|
259
|
+
test_constants,
|
|
260
|
+
root_path,
|
|
261
|
+
automated_testing=False,
|
|
262
|
+
plot_dir=config["simulator"].get("plot_directory", "plots"),
|
|
263
|
+
keychain=Keychain(),
|
|
264
|
+
)
|
|
265
|
+
await bt.setup_keys(fingerprint=fingerprint, reward_ph=farming_puzzle_hash)
|
|
266
|
+
existing_plots = await bt.setup_plots(
|
|
267
|
+
num_og_plots=PLOTS, num_pool_plots=0, num_non_keychain_plots=0, plot_size=PLOT_SIZE, bitfield=bitfield
|
|
268
|
+
)
|
|
269
|
+
print(f"{'New plots generated.' if existing_plots else 'Using Existing Plots'}\n")
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
async def get_current_height(root_path: Path) -> int:
|
|
273
|
+
async with get_any_service_client(SimulatorFullNodeRpcClient, root_path=root_path, consume_errors=False) as (
|
|
274
|
+
node_client,
|
|
275
|
+
_,
|
|
276
|
+
):
|
|
277
|
+
num_blocks = len(await node_client.get_all_blocks())
|
|
278
|
+
return num_blocks
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
async def async_config_wizard(
|
|
282
|
+
root_path: Path,
|
|
283
|
+
fingerprint: Optional[int],
|
|
284
|
+
farming_address: Optional[str],
|
|
285
|
+
plot_directory: Optional[str],
|
|
286
|
+
mnemonic_string: Optional[str],
|
|
287
|
+
auto_farm: Optional[bool],
|
|
288
|
+
docker_mode: bool,
|
|
289
|
+
bitfield: bool,
|
|
290
|
+
) -> None:
|
|
291
|
+
# either return passed through fingerprint or get one
|
|
292
|
+
fingerprint = select_fingerprint(fingerprint, mnemonic_string, docker_mode)
|
|
293
|
+
if fingerprint is None:
|
|
294
|
+
# user cancelled wizard
|
|
295
|
+
return
|
|
296
|
+
# create chia directory & get config.
|
|
297
|
+
print("Creating chia directory & config...")
|
|
298
|
+
config = create_chia_directory(root_path, fingerprint, farming_address, plot_directory, auto_farm, docker_mode)
|
|
299
|
+
# Pre-generate plots by running block_tools init functions.
|
|
300
|
+
print("Please Wait, Generating plots...")
|
|
301
|
+
print("This may take up to a minute if you are on a slow machine")
|
|
302
|
+
|
|
303
|
+
await generate_plots(config, root_path, fingerprint, bitfield)
|
|
304
|
+
# final messages
|
|
305
|
+
final_farming_address = config["simulator"]["farming_address"]
|
|
306
|
+
print(f"\nFarming & Prefarm reward address: {final_farming_address}\n")
|
|
307
|
+
print("Configuration Wizard Complete.")
|
|
308
|
+
print("Starting Simulator now...\n\n")
|
|
309
|
+
|
|
310
|
+
sys.argv[0] = str(Path(sys.executable).parent / "chia") # fix path for tests
|
|
311
|
+
await async_start(root_path, config, ("simulator",), restart=False, skip_keyring=False)
|
|
312
|
+
|
|
313
|
+
# now we make sure the simulator has a genesis block
|
|
314
|
+
print("Please wait, generating genesis block.")
|
|
315
|
+
while True:
|
|
316
|
+
try:
|
|
317
|
+
num_blocks: int = await get_current_height(root_path)
|
|
318
|
+
except ClientConnectorError:
|
|
319
|
+
await asyncio.sleep(0.25)
|
|
320
|
+
else:
|
|
321
|
+
if num_blocks == 0:
|
|
322
|
+
await farm_blocks(None, root_path, 1, True, final_farming_address)
|
|
323
|
+
print("Genesis block generated, exiting.")
|
|
324
|
+
else:
|
|
325
|
+
print("Genesis block already exists, exiting.")
|
|
326
|
+
break
|
|
327
|
+
print(f"\nMake sure your CHIA_ROOT Environment Variable is set to: {root_path}")
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
def print_coin_record(
|
|
331
|
+
name: str,
|
|
332
|
+
address_prefix: str,
|
|
333
|
+
coin_record: CoinRecord,
|
|
334
|
+
) -> None:
|
|
335
|
+
from datetime import datetime
|
|
336
|
+
|
|
337
|
+
coin_address = encode_puzzle_hash(coin_record.coin.puzzle_hash, address_prefix)
|
|
338
|
+
print(f"Coin 0x{coin_record.name.hex()}")
|
|
339
|
+
print(f"Wallet Address: {coin_address}")
|
|
340
|
+
print(f"Confirmed at block: {coin_record.confirmed_block_index}")
|
|
341
|
+
print(f"Spent: {f'at Block {coin_record.spent_block_index}' if coin_record.spent else 'No'}")
|
|
342
|
+
print(f"Coin Amount: {coin_record.coin.amount} {name}")
|
|
343
|
+
print(f"Parent Coin ID: 0x{coin_record.coin.parent_coin_info.hex()}")
|
|
344
|
+
print(f"Created at: {datetime.fromtimestamp(float(coin_record.timestamp)).strftime('%Y-%m-%d %H:%M:%S')}\n")
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
async def print_coin_records(
|
|
348
|
+
config: dict[str, Any],
|
|
349
|
+
node_client: SimulatorFullNodeRpcClient,
|
|
350
|
+
include_reward_coins: bool,
|
|
351
|
+
include_spent: bool = False,
|
|
352
|
+
) -> None:
|
|
353
|
+
import sys
|
|
354
|
+
|
|
355
|
+
coin_records: list[CoinRecord] = await node_client.get_all_coins(include_spent)
|
|
356
|
+
coin_records = [coin_record for coin_record in coin_records if not coin_record.coinbase or include_reward_coins]
|
|
357
|
+
address_prefix = config["network_overrides"]["config"][config["selected_network"]]["address_prefix"]
|
|
358
|
+
name = "mojo"
|
|
359
|
+
paginate = False # I might change this later.
|
|
360
|
+
if len(coin_records) != 0:
|
|
361
|
+
print("All Coins: ")
|
|
362
|
+
if paginate is True:
|
|
363
|
+
paginate = sys.stdout.isatty()
|
|
364
|
+
num_per_screen = 5 if paginate else len(coin_records)
|
|
365
|
+
# ripped from cmds/wallet_funcs.
|
|
366
|
+
for i in range(0, len(coin_records), num_per_screen):
|
|
367
|
+
for j in range(0, num_per_screen):
|
|
368
|
+
if i + j >= len(coin_records):
|
|
369
|
+
break
|
|
370
|
+
print_coin_record(
|
|
371
|
+
coin_record=coin_records[i + j],
|
|
372
|
+
name=name,
|
|
373
|
+
address_prefix=address_prefix,
|
|
374
|
+
)
|
|
375
|
+
if i + num_per_screen <= len(coin_records) and paginate:
|
|
376
|
+
print("Press q to quit, or c to continue")
|
|
377
|
+
while True:
|
|
378
|
+
entered_key = sys.stdin.read(1)
|
|
379
|
+
if entered_key == "q":
|
|
380
|
+
return None
|
|
381
|
+
elif entered_key == "c":
|
|
382
|
+
break
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
async def print_wallets(config: dict[str, Any], node_client: SimulatorFullNodeRpcClient) -> None:
|
|
386
|
+
ph_and_amount = await node_client.get_all_puzzle_hashes()
|
|
387
|
+
address_prefix = config["network_overrides"]["config"][config["selected_network"]]["address_prefix"]
|
|
388
|
+
name = "mojo"
|
|
389
|
+
for puzzle_hash, (amount, num_tx) in ph_and_amount.items():
|
|
390
|
+
address = encode_puzzle_hash(puzzle_hash, address_prefix)
|
|
391
|
+
print(f"Address: {address} has a balance of: {amount} {name}, with a total of: {num_tx} transactions.\n")
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
async def print_status(
|
|
395
|
+
rpc_port: Optional[int],
|
|
396
|
+
root_path: Path,
|
|
397
|
+
fingerprint: Optional[int],
|
|
398
|
+
show_key: bool,
|
|
399
|
+
show_coins: bool,
|
|
400
|
+
include_reward_coins: bool,
|
|
401
|
+
show_addresses: bool,
|
|
402
|
+
) -> None:
|
|
403
|
+
"""
|
|
404
|
+
This command allows users to easily get the status of the simulator
|
|
405
|
+
and information about the state of and the coins in the simulated blockchain.
|
|
406
|
+
"""
|
|
407
|
+
from chia.cmds.show_funcs import print_blockchain_state
|
|
408
|
+
from chia.cmds.units import units
|
|
409
|
+
|
|
410
|
+
async with get_any_service_client(SimulatorFullNodeRpcClient, root_path, rpc_port) as (node_client, config):
|
|
411
|
+
# Display keychain info
|
|
412
|
+
if show_key:
|
|
413
|
+
if fingerprint is None:
|
|
414
|
+
fingerprint = config["simulator"]["key_fingerprint"]
|
|
415
|
+
if fingerprint is not None:
|
|
416
|
+
display_key_info(
|
|
417
|
+
fingerprint, config["network_overrides"]["config"][config["selected_network"]]["address_prefix"]
|
|
418
|
+
)
|
|
419
|
+
else:
|
|
420
|
+
print(
|
|
421
|
+
"No fingerprint in config, either rerun 'cdv sim create' "
|
|
422
|
+
"or use --fingerprint to specify one, skipping key information."
|
|
423
|
+
)
|
|
424
|
+
# chain status ( basically chia show -s)
|
|
425
|
+
await print_blockchain_state(node_client, config)
|
|
426
|
+
print("")
|
|
427
|
+
# farming information
|
|
428
|
+
target_ph: bytes32 = await node_client.get_farming_ph()
|
|
429
|
+
farming_coin_records = await node_client.get_coin_records_by_puzzle_hash(target_ph, False)
|
|
430
|
+
prefix = config["network_overrides"]["config"][config["selected_network"]]["address_prefix"]
|
|
431
|
+
print(
|
|
432
|
+
f"Current Farming address: {encode_puzzle_hash(target_ph, prefix)}, "
|
|
433
|
+
f"with a balance of: "
|
|
434
|
+
f"{sum(coin_records.coin.amount for coin_records in farming_coin_records) / units['chia']} TXCH."
|
|
435
|
+
)
|
|
436
|
+
if show_addresses:
|
|
437
|
+
print("All Addresses: ")
|
|
438
|
+
await print_wallets(config, node_client)
|
|
439
|
+
if show_coins:
|
|
440
|
+
await print_coin_records(config, node_client, include_reward_coins)
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
async def revert_block_height(
|
|
444
|
+
rpc_port: Optional[int],
|
|
445
|
+
root_path: Path,
|
|
446
|
+
num_blocks: int,
|
|
447
|
+
num_new_blocks: int,
|
|
448
|
+
reset_chain_to_genesis: bool,
|
|
449
|
+
use_revert_blocks: bool,
|
|
450
|
+
) -> None:
|
|
451
|
+
"""
|
|
452
|
+
This function allows users to easily revert the chain to a previous state or perform a reorg.
|
|
453
|
+
"""
|
|
454
|
+
async with get_any_service_client(SimulatorFullNodeRpcClient, root_path, rpc_port) as (node_client, _):
|
|
455
|
+
if use_revert_blocks:
|
|
456
|
+
if num_new_blocks != 1:
|
|
457
|
+
print(f"Ignoring num_new_blocks: {num_new_blocks}, because we are not performing a reorg.")
|
|
458
|
+
# in this case num_blocks is the number of blocks to delete
|
|
459
|
+
new_height: int = await node_client.revert_blocks(num_blocks, reset_chain_to_genesis)
|
|
460
|
+
print(
|
|
461
|
+
f"All transactions in Block: {new_height + num_blocks} and above were successfully deleted, "
|
|
462
|
+
"you should now delete & restart all wallets."
|
|
463
|
+
)
|
|
464
|
+
else:
|
|
465
|
+
# However, in this case num_blocks is the fork height.
|
|
466
|
+
new_height = await node_client.reorg_blocks(num_blocks, num_new_blocks, use_revert_blocks)
|
|
467
|
+
old_height = new_height - num_new_blocks
|
|
468
|
+
print(f"All transactions in Block: {old_height - num_blocks} and above were successfully reverted.")
|
|
469
|
+
print(f"Block Height is now: {new_height}")
|
|
470
|
+
|
|
471
|
+
|
|
472
|
+
async def farm_blocks(
|
|
473
|
+
rpc_port: Optional[int],
|
|
474
|
+
root_path: Path,
|
|
475
|
+
num_blocks: int,
|
|
476
|
+
transaction_blocks: bool,
|
|
477
|
+
target_address: str,
|
|
478
|
+
) -> None:
|
|
479
|
+
"""
|
|
480
|
+
This function is used to generate new blocks.
|
|
481
|
+
"""
|
|
482
|
+
async with get_any_service_client(SimulatorFullNodeRpcClient, root_path, rpc_port) as (node_client, config):
|
|
483
|
+
if target_address == "":
|
|
484
|
+
target_address = config["simulator"]["farming_address"]
|
|
485
|
+
if target_address is None:
|
|
486
|
+
print(
|
|
487
|
+
"No target address in config, falling back to the temporary address currently in use. "
|
|
488
|
+
"You can use 'cdv sim create' or use --target-address to specify a different address."
|
|
489
|
+
)
|
|
490
|
+
target_ph: bytes32 = await node_client.get_farming_ph()
|
|
491
|
+
else:
|
|
492
|
+
target_ph = decode_puzzle_hash(target_address)
|
|
493
|
+
await node_client.farm_block(target_ph, num_blocks, transaction_blocks)
|
|
494
|
+
print(f"Farmed {num_blocks}{' Transaction' if transaction_blocks else ''} blocks")
|
|
495
|
+
block_height = (await node_client.get_blockchain_state())["peak"].height
|
|
496
|
+
print(f"Block Height is now: {block_height}")
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
async def set_auto_farm(rpc_port: Optional[int], root_path: Path, set_autofarm: bool) -> None:
|
|
500
|
+
"""
|
|
501
|
+
This function can be used to enable or disable Auto Farming.
|
|
502
|
+
"""
|
|
503
|
+
async with get_any_service_client(SimulatorFullNodeRpcClient, root_path, rpc_port) as (node_client, _):
|
|
504
|
+
current = await node_client.get_auto_farming()
|
|
505
|
+
if current == set_autofarm:
|
|
506
|
+
print(f"Auto farming is already {'on' if set_autofarm else 'off'}")
|
|
507
|
+
return
|
|
508
|
+
result = await node_client.set_auto_farming(set_autofarm)
|
|
509
|
+
print(f"Auto farming is now {'on' if result else 'off'}")
|
chia/cmds/start.py
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import click
|
|
4
|
+
|
|
5
|
+
from chia.cmds.cmd_classes import ChiaCliContext
|
|
6
|
+
from chia.util.config import load_config
|
|
7
|
+
from chia.util.service_groups import all_groups
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@click.command("start", help="Start service groups")
|
|
11
|
+
@click.option("-r", "--restart", is_flag=True, type=bool, help="Restart running services")
|
|
12
|
+
@click.option("-s", "--skip-keyring", is_flag=True, type=bool, help="Skip to unlock keyring")
|
|
13
|
+
@click.argument("group", type=click.Choice(list(all_groups())), nargs=-1, required=True)
|
|
14
|
+
@click.pass_context
|
|
15
|
+
def start_cmd(ctx: click.Context, restart: bool, skip_keyring: bool, group: tuple[str, ...]) -> None:
|
|
16
|
+
import asyncio
|
|
17
|
+
|
|
18
|
+
from chia.cmds.beta_funcs import warn_if_beta_enabled
|
|
19
|
+
from chia.cmds.start_funcs import async_start
|
|
20
|
+
|
|
21
|
+
root_path = ChiaCliContext.set_default(ctx).root_path
|
|
22
|
+
config = load_config(root_path, "config.yaml")
|
|
23
|
+
warn_if_beta_enabled(config)
|
|
24
|
+
asyncio.run(async_start(root_path, config, group, restart, skip_keyring=skip_keyring))
|
chia/cmds/start_funcs.py
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import os
|
|
5
|
+
import shutil
|
|
6
|
+
import subprocess
|
|
7
|
+
import sys
|
|
8
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any, Optional
|
|
11
|
+
|
|
12
|
+
from chia.cmds.passphrase_funcs import get_current_passphrase
|
|
13
|
+
from chia.daemon.client import DaemonProxy, connect_to_daemon_and_validate
|
|
14
|
+
from chia.util.errors import KeychainMaxUnlockAttempts
|
|
15
|
+
from chia.util.keychain import Keychain
|
|
16
|
+
from chia.util.service_groups import services_for_groups
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def launch_start_daemon(root_path: Path) -> subprocess.Popen:
|
|
20
|
+
os.environ["CHIA_ROOT"] = str(root_path)
|
|
21
|
+
creationflags = 0
|
|
22
|
+
if sys.platform == "win32":
|
|
23
|
+
creationflags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.CREATE_NO_WINDOW
|
|
24
|
+
|
|
25
|
+
path_helper: Path = Path(sys.argv[0])
|
|
26
|
+
cmd_to_execute = None
|
|
27
|
+
if len(path_helper.suffix) == 0:
|
|
28
|
+
cmd_to_execute = shutil.which(cmd=path_helper.name, path=path_helper.parent)
|
|
29
|
+
|
|
30
|
+
if cmd_to_execute is None:
|
|
31
|
+
cmd_to_execute = sys.argv[0]
|
|
32
|
+
|
|
33
|
+
print(f"Starting daemon: {cmd_to_execute} run_daemon --wait-for-unlock", flush=True)
|
|
34
|
+
process = subprocess.Popen(
|
|
35
|
+
[cmd_to_execute, "run_daemon", "--wait-for-unlock"],
|
|
36
|
+
stdout=subprocess.DEVNULL,
|
|
37
|
+
stderr=subprocess.DEVNULL,
|
|
38
|
+
stdin=subprocess.DEVNULL,
|
|
39
|
+
creationflags=creationflags,
|
|
40
|
+
start_new_session=True,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
return process
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
async def create_start_daemon_connection(
|
|
47
|
+
root_path: Path, config: dict[str, Any], *, skip_keyring: bool
|
|
48
|
+
) -> Optional[DaemonProxy]:
|
|
49
|
+
connection = await connect_to_daemon_and_validate(root_path, config)
|
|
50
|
+
if connection is None:
|
|
51
|
+
print("Starting daemon", flush=True)
|
|
52
|
+
# launch a daemon
|
|
53
|
+
launch_start_daemon(root_path)
|
|
54
|
+
connection = await connect_to_daemon_and_validate(root_path, config, wait_for_start=True)
|
|
55
|
+
if connection:
|
|
56
|
+
if skip_keyring:
|
|
57
|
+
print("Skipping to unlock keyring")
|
|
58
|
+
else:
|
|
59
|
+
passphrase = None
|
|
60
|
+
if await connection.is_keyring_locked():
|
|
61
|
+
passphrase = Keychain.get_cached_master_passphrase()
|
|
62
|
+
if passphrase is None or not Keychain.master_passphrase_is_valid(passphrase):
|
|
63
|
+
with ThreadPoolExecutor(max_workers=1, thread_name_prefix="get_current_passphrase") as executor:
|
|
64
|
+
passphrase = await asyncio.get_running_loop().run_in_executor(executor, get_current_passphrase)
|
|
65
|
+
|
|
66
|
+
if passphrase:
|
|
67
|
+
print("Unlocking daemon keyring")
|
|
68
|
+
await connection.unlock_keyring(passphrase)
|
|
69
|
+
|
|
70
|
+
return connection
|
|
71
|
+
return None
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
async def async_start(
|
|
75
|
+
root_path: Path, config: dict[str, Any], group: tuple[str, ...], restart: bool, *, skip_keyring: bool
|
|
76
|
+
) -> None:
|
|
77
|
+
try:
|
|
78
|
+
daemon = await create_start_daemon_connection(root_path, config, skip_keyring=skip_keyring)
|
|
79
|
+
except KeychainMaxUnlockAttempts:
|
|
80
|
+
print("Failed to unlock keyring")
|
|
81
|
+
return None
|
|
82
|
+
|
|
83
|
+
if daemon is None:
|
|
84
|
+
print("Failed to create the chia daemon")
|
|
85
|
+
return None
|
|
86
|
+
|
|
87
|
+
for service in services_for_groups(group):
|
|
88
|
+
if await daemon.is_running(service_name=service):
|
|
89
|
+
print(f"{service}: ", end="", flush=True)
|
|
90
|
+
if restart:
|
|
91
|
+
if await daemon.stop_service(service_name=service):
|
|
92
|
+
print("stopped")
|
|
93
|
+
else:
|
|
94
|
+
print("stop failed")
|
|
95
|
+
else:
|
|
96
|
+
print("Already running, use `-r` to restart")
|
|
97
|
+
continue
|
|
98
|
+
print(f"{service}: ", end="", flush=True)
|
|
99
|
+
msg = await daemon.start_service(service_name=service)
|
|
100
|
+
success = msg and msg["data"]["success"]
|
|
101
|
+
|
|
102
|
+
if success is True:
|
|
103
|
+
print("started")
|
|
104
|
+
else:
|
|
105
|
+
error = "no response"
|
|
106
|
+
if msg:
|
|
107
|
+
error = msg["data"]["error"]
|
|
108
|
+
print(f"{service} failed to start. Error: {error}")
|
|
109
|
+
await daemon.close()
|