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/keys_funcs.py
ADDED
|
@@ -0,0 +1,863 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
import sys
|
|
6
|
+
from enum import Enum
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any, Optional, Union
|
|
9
|
+
|
|
10
|
+
from chia_rs import AugSchemeMPL, G1Element, G2Element, PrivateKey
|
|
11
|
+
|
|
12
|
+
from chia.consensus.coinbase import create_puzzlehash_for_pk
|
|
13
|
+
from chia.types.signing_mode import SigningMode
|
|
14
|
+
from chia.util.bech32m import bech32_encode, convertbits, encode_puzzle_hash
|
|
15
|
+
from chia.util.config import load_config
|
|
16
|
+
from chia.util.errors import KeychainException
|
|
17
|
+
from chia.util.file_keyring import MAX_LABEL_LENGTH
|
|
18
|
+
from chia.util.ints import uint32
|
|
19
|
+
from chia.util.keychain import (
|
|
20
|
+
Keychain,
|
|
21
|
+
KeyData,
|
|
22
|
+
bytes_to_mnemonic,
|
|
23
|
+
check_mnemonic_validity,
|
|
24
|
+
generate_mnemonic,
|
|
25
|
+
mnemonic_to_seed,
|
|
26
|
+
)
|
|
27
|
+
from chia.util.keyring_wrapper import KeyringWrapper, obtain_current_passphrase
|
|
28
|
+
from chia.wallet.derive_keys import (
|
|
29
|
+
master_pk_to_wallet_pk_unhardened,
|
|
30
|
+
master_sk_to_farmer_sk,
|
|
31
|
+
master_sk_to_pool_sk,
|
|
32
|
+
master_sk_to_wallet_sk,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def unlock_keyring() -> None:
|
|
37
|
+
"""
|
|
38
|
+
Used to unlock the keyring interactively, if necessary
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
try:
|
|
42
|
+
if KeyringWrapper.get_shared_instance().has_master_passphrase():
|
|
43
|
+
obtain_current_passphrase(use_passphrase_cache=True)
|
|
44
|
+
except Exception as e:
|
|
45
|
+
print(f"Unable to unlock the keyring: {e}")
|
|
46
|
+
sys.exit(1)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def generate_and_print() -> str:
|
|
50
|
+
"""
|
|
51
|
+
Generates a seed for a private key, and prints the mnemonic to the terminal.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
mnemonic = generate_mnemonic()
|
|
55
|
+
print("Generating private key. Mnemonic (24 secret words):")
|
|
56
|
+
print(mnemonic)
|
|
57
|
+
print("Note that this key has not been added to the keychain. Run chia keys add")
|
|
58
|
+
return mnemonic
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def generate_and_add(label: Optional[str]) -> None:
|
|
62
|
+
"""
|
|
63
|
+
Generates a seed for a private key, prints the mnemonic to the terminal, and adds the key to the keyring.
|
|
64
|
+
"""
|
|
65
|
+
unlock_keyring()
|
|
66
|
+
print("Generating private key")
|
|
67
|
+
query_and_add_key_info(mnemonic_or_pk=generate_mnemonic(), label=label)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def query_and_add_key_info(mnemonic_or_pk: Optional[str], label: Optional[str] = None) -> None:
|
|
71
|
+
unlock_keyring()
|
|
72
|
+
if mnemonic_or_pk is None:
|
|
73
|
+
mnemonic_or_pk = input("Enter the mnemonic/observer key you want to use: ")
|
|
74
|
+
if label is None:
|
|
75
|
+
label = input("Enter the label you want to assign to this key (Press Enter to skip): ")
|
|
76
|
+
if len(label) == 0:
|
|
77
|
+
label = None
|
|
78
|
+
add_key_info(mnemonic_or_pk, label)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def add_key_info(mnemonic_or_pk: str, label: Optional[str]) -> None:
|
|
82
|
+
"""
|
|
83
|
+
Add a private key seed or public key to the keyring, with the given mnemonic and an optional label.
|
|
84
|
+
"""
|
|
85
|
+
unlock_keyring()
|
|
86
|
+
try:
|
|
87
|
+
if check_mnemonic_validity(mnemonic_or_pk):
|
|
88
|
+
sk = Keychain().add_key(mnemonic_or_pk, label, private=True)
|
|
89
|
+
fingerprint = sk.get_g1().get_fingerprint()
|
|
90
|
+
print(f"Added private key with public key fingerprint {fingerprint}")
|
|
91
|
+
else:
|
|
92
|
+
pk = Keychain().add_key(mnemonic_or_pk, label, private=False)
|
|
93
|
+
fingerprint = pk.get_fingerprint()
|
|
94
|
+
print(f"Added public key with fingerprint {fingerprint}")
|
|
95
|
+
|
|
96
|
+
except (ValueError, KeychainException) as e:
|
|
97
|
+
print(e)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def show_all_key_labels() -> None:
|
|
101
|
+
unlock_keyring()
|
|
102
|
+
fingerprint_width = 11
|
|
103
|
+
|
|
104
|
+
def print_line(fingerprint: str, label: str) -> None:
|
|
105
|
+
fingerprint_text = ("{0:<" + str(fingerprint_width) + "}").format(fingerprint)
|
|
106
|
+
label_text = ("{0:<" + str(MAX_LABEL_LENGTH) + "}").format(label)
|
|
107
|
+
print("| " + fingerprint_text + " | " + label_text + " |")
|
|
108
|
+
|
|
109
|
+
keys = Keychain().get_keys()
|
|
110
|
+
|
|
111
|
+
if len(keys) == 0:
|
|
112
|
+
sys.exit("No keys are present in the keychain. Generate them with 'chia keys generate'")
|
|
113
|
+
|
|
114
|
+
print_line("fingerprint", "label")
|
|
115
|
+
print_line("-" * fingerprint_width, "-" * MAX_LABEL_LENGTH)
|
|
116
|
+
|
|
117
|
+
for key_data in keys:
|
|
118
|
+
print_line(str(key_data.fingerprint), key_data.label or "No label assigned")
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def set_key_label(fingerprint: int, label: str) -> None:
|
|
122
|
+
unlock_keyring()
|
|
123
|
+
try:
|
|
124
|
+
Keychain().set_label(fingerprint, label)
|
|
125
|
+
print(f"label {label!r} assigned to {fingerprint!r}")
|
|
126
|
+
except Exception as e:
|
|
127
|
+
sys.exit(f"Error: {e}")
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def delete_key_label(fingerprint: int) -> None:
|
|
131
|
+
unlock_keyring()
|
|
132
|
+
try:
|
|
133
|
+
Keychain().delete_label(fingerprint)
|
|
134
|
+
print(f"label removed for {fingerprint!r}")
|
|
135
|
+
except Exception as e:
|
|
136
|
+
sys.exit(f"Error: {e}")
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def format_pk_bech32_maybe(prefix: Optional[str], pubkey: str) -> str:
|
|
140
|
+
return pubkey if prefix is None else bech32_encode(prefix, convertbits(list(bytes.fromhex(pubkey)), 8, 5))
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def show_keys(
|
|
144
|
+
root_path: Path,
|
|
145
|
+
show_mnemonic: bool,
|
|
146
|
+
non_observer_derivation: bool,
|
|
147
|
+
json_output: bool,
|
|
148
|
+
fingerprint: Optional[int],
|
|
149
|
+
bech32m_prefix: Optional[str],
|
|
150
|
+
) -> None:
|
|
151
|
+
"""
|
|
152
|
+
Prints all keys and mnemonics (if available).
|
|
153
|
+
"""
|
|
154
|
+
unlock_keyring()
|
|
155
|
+
config = load_config(root_path, "config.yaml")
|
|
156
|
+
if fingerprint is None:
|
|
157
|
+
all_keys = Keychain().get_keys(True)
|
|
158
|
+
else:
|
|
159
|
+
all_keys = [Keychain().get_key(fingerprint, True)]
|
|
160
|
+
selected = config["selected_network"]
|
|
161
|
+
prefix = config["network_overrides"]["config"][selected]["address_prefix"]
|
|
162
|
+
|
|
163
|
+
if len(all_keys) == 0:
|
|
164
|
+
if json_output:
|
|
165
|
+
print(json.dumps({"keys": []}))
|
|
166
|
+
else:
|
|
167
|
+
print("There are no saved private keys")
|
|
168
|
+
return None
|
|
169
|
+
|
|
170
|
+
if not json_output:
|
|
171
|
+
msg = "Showing all public keys derived from your master key:"
|
|
172
|
+
if show_mnemonic:
|
|
173
|
+
msg = "Showing all public and private keys"
|
|
174
|
+
print(msg)
|
|
175
|
+
|
|
176
|
+
def process_key_data(key_data: KeyData) -> dict[str, Any]:
|
|
177
|
+
key: dict[str, Any] = {}
|
|
178
|
+
sk = key_data.private_key if key_data.secrets is not None else None
|
|
179
|
+
if key_data.label is not None:
|
|
180
|
+
key["label"] = key_data.label
|
|
181
|
+
|
|
182
|
+
key["fingerprint"] = key_data.fingerprint
|
|
183
|
+
key["master_pk"] = bytes(key_data.public_key).hex()
|
|
184
|
+
if sk is not None:
|
|
185
|
+
key["farmer_pk"] = bytes(master_sk_to_farmer_sk(sk).get_g1()).hex()
|
|
186
|
+
key["pool_pk"] = bytes(master_sk_to_pool_sk(sk).get_g1()).hex()
|
|
187
|
+
else:
|
|
188
|
+
key["farmer_pk"] = None
|
|
189
|
+
key["pool_pk"] = None
|
|
190
|
+
|
|
191
|
+
if non_observer_derivation:
|
|
192
|
+
if sk is None:
|
|
193
|
+
first_wallet_pk: Optional[G1Element] = None
|
|
194
|
+
else:
|
|
195
|
+
first_wallet_pk = master_sk_to_wallet_sk(sk, uint32(0)).get_g1()
|
|
196
|
+
else:
|
|
197
|
+
first_wallet_pk = master_pk_to_wallet_pk_unhardened(key_data.public_key, uint32(0))
|
|
198
|
+
|
|
199
|
+
if first_wallet_pk is not None:
|
|
200
|
+
wallet_address: str = encode_puzzle_hash(create_puzzlehash_for_pk(first_wallet_pk), prefix)
|
|
201
|
+
key["wallet_address"] = wallet_address
|
|
202
|
+
else:
|
|
203
|
+
key["wallet_address"] = None
|
|
204
|
+
|
|
205
|
+
key["non_observer"] = non_observer_derivation
|
|
206
|
+
|
|
207
|
+
if show_mnemonic and sk is not None:
|
|
208
|
+
key["master_sk"] = bytes(sk).hex()
|
|
209
|
+
key["farmer_sk"] = bytes(master_sk_to_farmer_sk(sk)).hex()
|
|
210
|
+
key["wallet_sk"] = bytes(master_sk_to_wallet_sk(sk, uint32(0))).hex()
|
|
211
|
+
key["mnemonic"] = bytes_to_mnemonic(key_data.entropy)
|
|
212
|
+
else:
|
|
213
|
+
key["master_sk"] = None
|
|
214
|
+
key["farmer_sk"] = None
|
|
215
|
+
key["wallet_sk"] = None
|
|
216
|
+
key["mnemonic"] = None
|
|
217
|
+
|
|
218
|
+
return key
|
|
219
|
+
|
|
220
|
+
keys = [process_key_data(key) for key in all_keys]
|
|
221
|
+
|
|
222
|
+
if json_output:
|
|
223
|
+
print(json.dumps({"keys": list(keys)}))
|
|
224
|
+
else:
|
|
225
|
+
for _key in keys:
|
|
226
|
+
key = {k: "N/A" if v is None else v for k, v in _key.items()}
|
|
227
|
+
print("")
|
|
228
|
+
if "label" in key:
|
|
229
|
+
print("Label:", key["label"])
|
|
230
|
+
print("Fingerprint:", key["fingerprint"])
|
|
231
|
+
print("Master public key (m):", format_pk_bech32_maybe(bech32m_prefix, key["master_pk"]))
|
|
232
|
+
print("Farmer public key (m/12381/8444/0/0):", format_pk_bech32_maybe(bech32m_prefix, key["farmer_pk"]))
|
|
233
|
+
print("Pool public key (m/12381/8444/1/0):", format_pk_bech32_maybe(bech32m_prefix, key["pool_pk"]))
|
|
234
|
+
print(f"First wallet address{' (non-observer)' if key['non_observer'] else ''}: {key['wallet_address']}")
|
|
235
|
+
if show_mnemonic:
|
|
236
|
+
print("Master private key (m):", key["master_sk"])
|
|
237
|
+
print("Farmer private key (m/12381/8444/0/0):", key["farmer_sk"])
|
|
238
|
+
print("First wallet secret key (m/12381/8444/2/0):", key["wallet_sk"])
|
|
239
|
+
print(" Mnemonic seed (24 secret words):")
|
|
240
|
+
print(key["mnemonic"])
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def delete(fingerprint: int) -> None:
|
|
244
|
+
"""
|
|
245
|
+
Delete a key by its public key fingerprint (which is an integer).
|
|
246
|
+
"""
|
|
247
|
+
unlock_keyring()
|
|
248
|
+
print(f"Deleting private_key with fingerprint {fingerprint}")
|
|
249
|
+
Keychain().delete_key_by_fingerprint(fingerprint)
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def derive_pk_and_sk_from_hd_path(
|
|
253
|
+
master_pk: G1Element, hd_path_root: str, master_sk: Optional[PrivateKey] = None
|
|
254
|
+
) -> tuple[G1Element, Optional[PrivateKey], str]:
|
|
255
|
+
"""
|
|
256
|
+
Derive a private key from the provided HD path. Takes a master key and HD path as input,
|
|
257
|
+
and returns the derived key and the HD path that was used to derive it.
|
|
258
|
+
"""
|
|
259
|
+
|
|
260
|
+
from chia.wallet.derive_keys import _derive_path, _derive_path_unhardened, _derive_pk_unhardened
|
|
261
|
+
|
|
262
|
+
class DerivationType(Enum):
|
|
263
|
+
NONOBSERVER = 0
|
|
264
|
+
OBSERVER = 1
|
|
265
|
+
|
|
266
|
+
path: list[str] = hd_path_root.split("/")
|
|
267
|
+
if len(path) == 0 or path[0] != "m":
|
|
268
|
+
raise ValueError("Invalid HD path. Must start with 'm'")
|
|
269
|
+
|
|
270
|
+
path = path[1:] # Skip "m"
|
|
271
|
+
|
|
272
|
+
if len(path) > 0 and path[-1] == "": # remove trailing slash
|
|
273
|
+
path = path[:-1]
|
|
274
|
+
|
|
275
|
+
index_and_derivation_types: list[tuple[int, DerivationType]] = []
|
|
276
|
+
|
|
277
|
+
# Validate path
|
|
278
|
+
for current_index_str in path:
|
|
279
|
+
if len(current_index_str) == 0:
|
|
280
|
+
raise ValueError("Invalid HD path. Empty index")
|
|
281
|
+
|
|
282
|
+
non_observer: bool = current_index_str[-1] == "n"
|
|
283
|
+
if non_observer and master_sk is None:
|
|
284
|
+
raise ValueError("Hardened path specified for observer key")
|
|
285
|
+
current_index: int = int(current_index_str[:-1]) if non_observer else int(current_index_str)
|
|
286
|
+
|
|
287
|
+
index_and_derivation_types.append(
|
|
288
|
+
(current_index, DerivationType.NONOBSERVER if non_observer else DerivationType.OBSERVER)
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
# Derive keys along the path
|
|
292
|
+
if master_sk is not None:
|
|
293
|
+
current_sk: Optional[PrivateKey] = master_sk
|
|
294
|
+
assert current_sk is not None
|
|
295
|
+
for current_index, derivation_type in index_and_derivation_types:
|
|
296
|
+
if derivation_type == DerivationType.NONOBSERVER:
|
|
297
|
+
current_sk = _derive_path(current_sk, [current_index])
|
|
298
|
+
elif derivation_type == DerivationType.OBSERVER:
|
|
299
|
+
current_sk = _derive_path_unhardened(current_sk, [current_index])
|
|
300
|
+
else:
|
|
301
|
+
raise ValueError(f"Unhandled derivation type: {derivation_type}") # pragma: no cover
|
|
302
|
+
current_pk: G1Element = current_sk.get_g1()
|
|
303
|
+
else:
|
|
304
|
+
current_sk = None
|
|
305
|
+
current_pk = master_pk
|
|
306
|
+
for current_index, _ in index_and_derivation_types:
|
|
307
|
+
current_pk = _derive_pk_unhardened(current_pk, [current_index])
|
|
308
|
+
|
|
309
|
+
return (current_pk, current_sk, "m/" + "/".join(path) + "/")
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
def sign(message: str, private_key: PrivateKey, hd_path: str, as_bytes: bool, json_output: bool) -> None:
|
|
313
|
+
sk = derive_pk_and_sk_from_hd_path(private_key.get_g1(), hd_path, master_sk=private_key)[1]
|
|
314
|
+
assert sk is not None
|
|
315
|
+
data = bytes.fromhex(message) if as_bytes else bytes(message, "utf-8")
|
|
316
|
+
signing_mode: SigningMode = (
|
|
317
|
+
SigningMode.BLS_MESSAGE_AUGMENTATION_HEX_INPUT if as_bytes else SigningMode.BLS_MESSAGE_AUGMENTATION_UTF8_INPUT
|
|
318
|
+
)
|
|
319
|
+
pubkey_hex: str = bytes(sk.get_g1()).hex()
|
|
320
|
+
signature_hex: str = bytes(AugSchemeMPL.sign(sk, data)).hex()
|
|
321
|
+
if json_output:
|
|
322
|
+
print(
|
|
323
|
+
json.dumps(
|
|
324
|
+
{
|
|
325
|
+
"message": message,
|
|
326
|
+
"pubkey": pubkey_hex,
|
|
327
|
+
"signature": signature_hex,
|
|
328
|
+
"signing_mode": signing_mode.value,
|
|
329
|
+
}
|
|
330
|
+
)
|
|
331
|
+
)
|
|
332
|
+
else:
|
|
333
|
+
print(f"Message: {message}")
|
|
334
|
+
print(f"Public Key: {pubkey_hex}")
|
|
335
|
+
print(f"Signature: {signature_hex}")
|
|
336
|
+
print(f"Signing Mode: {signing_mode.value}")
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
def verify(message: str, public_key: str, signature: str, as_bytes: bool) -> None:
|
|
340
|
+
data = bytes.fromhex(message) if as_bytes else bytes(message, "utf-8")
|
|
341
|
+
pk = G1Element.from_bytes(bytes.fromhex(public_key))
|
|
342
|
+
sig = G2Element.from_bytes(bytes.fromhex(signature))
|
|
343
|
+
print(AugSchemeMPL.verify(pk, data, sig))
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
def as_bytes_from_signing_mode(signing_mode_str: str) -> bool:
|
|
347
|
+
if signing_mode_str == SigningMode.BLS_MESSAGE_AUGMENTATION_HEX_INPUT.value:
|
|
348
|
+
return True
|
|
349
|
+
else:
|
|
350
|
+
return False
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
def _clear_line_part(n: int) -> None:
|
|
354
|
+
# Move backward, overwrite with spaces, then move backward again
|
|
355
|
+
sys.stdout.write("\b" * n)
|
|
356
|
+
sys.stdout.write(" " * n)
|
|
357
|
+
sys.stdout.write("\b" * n)
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
def _search_derived(
|
|
361
|
+
current_pk: G1Element,
|
|
362
|
+
current_sk: Optional[PrivateKey],
|
|
363
|
+
search_terms: tuple[str, ...],
|
|
364
|
+
path: str,
|
|
365
|
+
path_indices: Optional[list[int]],
|
|
366
|
+
limit: int,
|
|
367
|
+
non_observer_derivation: bool,
|
|
368
|
+
show_progress: bool,
|
|
369
|
+
search_public_key: bool,
|
|
370
|
+
search_private_key: bool,
|
|
371
|
+
search_address: bool,
|
|
372
|
+
prefix: str,
|
|
373
|
+
) -> list[str]: # Return a subset of search_terms that were found
|
|
374
|
+
"""
|
|
375
|
+
Performs a shallow search of keys derived from the current pk/sk for items matching
|
|
376
|
+
the provided search terms.
|
|
377
|
+
"""
|
|
378
|
+
|
|
379
|
+
from chia.wallet.derive_keys import _derive_path, _derive_path_unhardened, _derive_pk_unhardened
|
|
380
|
+
|
|
381
|
+
class DerivedSearchResultType(Enum):
|
|
382
|
+
PUBLIC_KEY = "public key"
|
|
383
|
+
PRIVATE_KEY = "private key"
|
|
384
|
+
WALLET_ADDRESS = "wallet address"
|
|
385
|
+
|
|
386
|
+
remaining_search_terms: dict[str, None] = dict.fromkeys(search_terms)
|
|
387
|
+
current_path: str = path
|
|
388
|
+
current_path_indices: list[int] = path_indices if path_indices is not None else []
|
|
389
|
+
found_search_terms: list[str] = []
|
|
390
|
+
|
|
391
|
+
assert not (non_observer_derivation and current_sk is None)
|
|
392
|
+
|
|
393
|
+
for index in range(limit):
|
|
394
|
+
found_items: list[tuple[str, str, DerivedSearchResultType]] = []
|
|
395
|
+
printed_match: bool = False
|
|
396
|
+
current_index_str = str(index) + ("n" if non_observer_derivation else "")
|
|
397
|
+
current_path += f"{current_index_str}"
|
|
398
|
+
current_path_indices.append(index)
|
|
399
|
+
if show_progress:
|
|
400
|
+
# Output just the current index e.g. "25" or "25n"
|
|
401
|
+
sys.stdout.write(f"{current_index_str}")
|
|
402
|
+
sys.stdout.flush()
|
|
403
|
+
|
|
404
|
+
# Derive the private key
|
|
405
|
+
if non_observer_derivation:
|
|
406
|
+
assert current_sk is not None # semantics above guarantee this
|
|
407
|
+
child_sk = _derive_path(current_sk, current_path_indices)
|
|
408
|
+
if search_public_key or search_address:
|
|
409
|
+
child_pk = child_sk.get_g1()
|
|
410
|
+
else:
|
|
411
|
+
if search_public_key or search_address:
|
|
412
|
+
child_pk = _derive_pk_unhardened(current_pk, current_path_indices)
|
|
413
|
+
else:
|
|
414
|
+
child_pk = None
|
|
415
|
+
if search_private_key and current_sk is not None:
|
|
416
|
+
child_sk = _derive_path_unhardened(current_sk, current_path_indices)
|
|
417
|
+
else:
|
|
418
|
+
child_sk = None
|
|
419
|
+
|
|
420
|
+
address: Optional[str] = None
|
|
421
|
+
|
|
422
|
+
if search_address:
|
|
423
|
+
# Generate a wallet address using the standard p2_delegated_puzzle_or_hidden_puzzle puzzle
|
|
424
|
+
assert child_pk is not None
|
|
425
|
+
# TODO: consider generating addresses using other puzzles
|
|
426
|
+
address = encode_puzzle_hash(create_puzzlehash_for_pk(child_pk), prefix)
|
|
427
|
+
|
|
428
|
+
for term in remaining_search_terms:
|
|
429
|
+
found_item: Any = None
|
|
430
|
+
found_item_type: Optional[DerivedSearchResultType] = None
|
|
431
|
+
|
|
432
|
+
if search_private_key and term in str(child_sk):
|
|
433
|
+
assert child_sk is not None # semantics above guarantee this
|
|
434
|
+
found_item = private_key_string_repr(child_sk)
|
|
435
|
+
found_item_type = DerivedSearchResultType.PRIVATE_KEY
|
|
436
|
+
elif search_public_key and child_pk is not None and term in str(child_pk):
|
|
437
|
+
found_item = child_pk
|
|
438
|
+
found_item_type = DerivedSearchResultType.PUBLIC_KEY
|
|
439
|
+
elif search_address and address is not None and term in address:
|
|
440
|
+
found_item = address
|
|
441
|
+
found_item_type = DerivedSearchResultType.WALLET_ADDRESS
|
|
442
|
+
|
|
443
|
+
if found_item is not None and found_item_type is not None:
|
|
444
|
+
found_items.append((term, found_item, found_item_type))
|
|
445
|
+
|
|
446
|
+
if len(found_items) > 0 and show_progress:
|
|
447
|
+
print()
|
|
448
|
+
|
|
449
|
+
for term, found_item, found_item_type in found_items:
|
|
450
|
+
# Update remaining_search_terms and found_search_terms
|
|
451
|
+
del remaining_search_terms[term]
|
|
452
|
+
found_search_terms.append(term)
|
|
453
|
+
|
|
454
|
+
print(
|
|
455
|
+
f"Found {found_item_type.value}: {found_item} (HD path: {current_path})"
|
|
456
|
+
) # lgtm [py/clear-text-logging-sensitive-data]
|
|
457
|
+
|
|
458
|
+
printed_match = True
|
|
459
|
+
|
|
460
|
+
if len(remaining_search_terms) == 0:
|
|
461
|
+
break
|
|
462
|
+
|
|
463
|
+
# Remove the last index from the path
|
|
464
|
+
current_path = current_path[: -len(str(current_index_str))]
|
|
465
|
+
current_path_indices = current_path_indices[:-1]
|
|
466
|
+
|
|
467
|
+
if show_progress:
|
|
468
|
+
if printed_match:
|
|
469
|
+
# Write the path (without current_index_str) since we printed out a match
|
|
470
|
+
# e.g. m/12381/8444/2/
|
|
471
|
+
sys.stdout.write(f"{current_path}") # lgtm [py/clear-text-logging-sensitive-data]
|
|
472
|
+
# Remove the last index from the output
|
|
473
|
+
else:
|
|
474
|
+
_clear_line_part(len(current_index_str))
|
|
475
|
+
|
|
476
|
+
return found_search_terms
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
def search_derive(
|
|
480
|
+
root_path: Path,
|
|
481
|
+
fingerprint: Optional[int],
|
|
482
|
+
search_terms: tuple[str, ...],
|
|
483
|
+
limit: int,
|
|
484
|
+
non_observer_derivation: bool,
|
|
485
|
+
show_progress: bool,
|
|
486
|
+
search_types: tuple[str, ...],
|
|
487
|
+
derive_from_hd_path: Optional[str],
|
|
488
|
+
prefix: Optional[str],
|
|
489
|
+
private_key: Optional[PrivateKey],
|
|
490
|
+
) -> bool:
|
|
491
|
+
"""
|
|
492
|
+
Searches for items derived from the provided private key, or if not specified,
|
|
493
|
+
search each private key in the keyring.
|
|
494
|
+
"""
|
|
495
|
+
|
|
496
|
+
from time import perf_counter
|
|
497
|
+
|
|
498
|
+
start_time = perf_counter()
|
|
499
|
+
remaining_search_terms: dict[str, None] = dict.fromkeys(search_terms) # poor man's ordered set
|
|
500
|
+
search_address = "address" in search_types
|
|
501
|
+
search_public_key = "public_key" in search_types
|
|
502
|
+
search_private_key = "private_key" in search_types
|
|
503
|
+
|
|
504
|
+
if prefix is None:
|
|
505
|
+
config: dict[str, Any] = load_config(root_path, "config.yaml")
|
|
506
|
+
selected: str = config["selected_network"]
|
|
507
|
+
prefix = config["network_overrides"]["config"][selected]["address_prefix"]
|
|
508
|
+
|
|
509
|
+
if "all" in search_types:
|
|
510
|
+
search_address = True
|
|
511
|
+
search_public_key = True
|
|
512
|
+
search_private_key = True
|
|
513
|
+
|
|
514
|
+
if fingerprint is None and private_key is None:
|
|
515
|
+
public_keys: list[G1Element] = Keychain().get_all_public_keys()
|
|
516
|
+
private_keys: list[Optional[PrivateKey]] = [
|
|
517
|
+
data.private_key if data.secrets is not None else None for data in Keychain().get_keys(include_secrets=True)
|
|
518
|
+
]
|
|
519
|
+
elif fingerprint is None:
|
|
520
|
+
assert private_key is not None
|
|
521
|
+
public_keys = [private_key.get_g1()]
|
|
522
|
+
private_keys = [private_key]
|
|
523
|
+
else:
|
|
524
|
+
master_key_data = Keychain().get_key(fingerprint, include_secrets=True)
|
|
525
|
+
public_keys = [master_key_data.public_key]
|
|
526
|
+
private_keys = [master_key_data.private_key if master_key_data.secrets is not None else None]
|
|
527
|
+
|
|
528
|
+
for pk, sk in zip(public_keys, private_keys):
|
|
529
|
+
if sk is None and non_observer_derivation:
|
|
530
|
+
continue
|
|
531
|
+
current_path: str = ""
|
|
532
|
+
found_terms: list[str] = []
|
|
533
|
+
|
|
534
|
+
if show_progress:
|
|
535
|
+
print(f"Searching keys derived from: {pk.get_fingerprint()}")
|
|
536
|
+
|
|
537
|
+
# Derive from the provided HD path
|
|
538
|
+
if derive_from_hd_path is not None:
|
|
539
|
+
derivation_root_pk, derivation_root_sk, hd_path_root = derive_pk_and_sk_from_hd_path(
|
|
540
|
+
pk, derive_from_hd_path, master_sk=sk
|
|
541
|
+
)
|
|
542
|
+
|
|
543
|
+
if show_progress:
|
|
544
|
+
sys.stdout.write(hd_path_root)
|
|
545
|
+
|
|
546
|
+
# Shallow search under hd_path_root
|
|
547
|
+
found_terms = _search_derived(
|
|
548
|
+
derivation_root_pk,
|
|
549
|
+
derivation_root_sk,
|
|
550
|
+
tuple(remaining_search_terms.keys()),
|
|
551
|
+
hd_path_root,
|
|
552
|
+
None,
|
|
553
|
+
limit,
|
|
554
|
+
non_observer_derivation,
|
|
555
|
+
show_progress,
|
|
556
|
+
search_public_key,
|
|
557
|
+
search_private_key,
|
|
558
|
+
search_address,
|
|
559
|
+
prefix,
|
|
560
|
+
)
|
|
561
|
+
|
|
562
|
+
# Update remaining_search_terms
|
|
563
|
+
for term in found_terms:
|
|
564
|
+
del remaining_search_terms[term]
|
|
565
|
+
|
|
566
|
+
if len(remaining_search_terms) == 0:
|
|
567
|
+
# Found everything we were looking for
|
|
568
|
+
break
|
|
569
|
+
|
|
570
|
+
current_path = hd_path_root
|
|
571
|
+
# Otherwise derive from well-known derivation paths
|
|
572
|
+
else:
|
|
573
|
+
current_path_indices: list[int] = [12381, 8444]
|
|
574
|
+
path_root: str = "m/"
|
|
575
|
+
for i in [12381, 8444]:
|
|
576
|
+
path_root += f"{i}{'n' if non_observer_derivation else ''}/"
|
|
577
|
+
|
|
578
|
+
if show_progress:
|
|
579
|
+
# Print the path root (without last index)
|
|
580
|
+
# e.g. m/12381/8444/
|
|
581
|
+
sys.stdout.write(path_root)
|
|
582
|
+
|
|
583
|
+
# 7 account levels for derived keys (0-6):
|
|
584
|
+
# 0 = farmer, 1 = pool, 2 = wallet, 3 = local, 4 = backup key, 5 = singleton, 6 = pooling authentication
|
|
585
|
+
for account in range(7):
|
|
586
|
+
account_str = str(account) + ("n" if non_observer_derivation else "")
|
|
587
|
+
current_path = path_root + f"{account_str}/"
|
|
588
|
+
current_path_indices.append(account)
|
|
589
|
+
if show_progress:
|
|
590
|
+
# Print the current path index
|
|
591
|
+
# e.g. 2/ (example full output: m/12381/8444/2/)
|
|
592
|
+
sys.stdout.write(f"{account_str}/") # lgtm [py/clear-text-logging-sensitive-data]
|
|
593
|
+
|
|
594
|
+
found_terms = _search_derived(
|
|
595
|
+
pk,
|
|
596
|
+
sk,
|
|
597
|
+
tuple(remaining_search_terms.keys()),
|
|
598
|
+
current_path,
|
|
599
|
+
list(current_path_indices), # copy
|
|
600
|
+
limit,
|
|
601
|
+
non_observer_derivation,
|
|
602
|
+
show_progress,
|
|
603
|
+
search_public_key,
|
|
604
|
+
search_private_key,
|
|
605
|
+
search_address,
|
|
606
|
+
prefix,
|
|
607
|
+
)
|
|
608
|
+
|
|
609
|
+
# Update remaining_search_terms
|
|
610
|
+
for found_term in found_terms:
|
|
611
|
+
del remaining_search_terms[found_term]
|
|
612
|
+
|
|
613
|
+
if len(remaining_search_terms) == 0:
|
|
614
|
+
# Found everything we were looking for
|
|
615
|
+
break
|
|
616
|
+
|
|
617
|
+
if show_progress:
|
|
618
|
+
# +1 to remove the trailing slash
|
|
619
|
+
_clear_line_part(1 + len(str(account_str)))
|
|
620
|
+
|
|
621
|
+
current_path_indices = current_path_indices[:-1]
|
|
622
|
+
|
|
623
|
+
if len(remaining_search_terms) == 0:
|
|
624
|
+
# Found everything we were looking for
|
|
625
|
+
break
|
|
626
|
+
|
|
627
|
+
if show_progress:
|
|
628
|
+
# +1 to remove the trailing slash
|
|
629
|
+
_clear_line_part(1 + len(current_path))
|
|
630
|
+
sys.stdout.flush()
|
|
631
|
+
|
|
632
|
+
end_time = perf_counter()
|
|
633
|
+
if len(remaining_search_terms) > 0:
|
|
634
|
+
for term in remaining_search_terms:
|
|
635
|
+
print(f"Could not find '{term}'")
|
|
636
|
+
|
|
637
|
+
if show_progress:
|
|
638
|
+
print()
|
|
639
|
+
print(f"Search completed in {end_time - start_time} seconds")
|
|
640
|
+
|
|
641
|
+
return len(remaining_search_terms) == 0
|
|
642
|
+
|
|
643
|
+
|
|
644
|
+
def derive_wallet_address(
|
|
645
|
+
root_path: Path,
|
|
646
|
+
fingerprint: Optional[int],
|
|
647
|
+
index: int,
|
|
648
|
+
count: int,
|
|
649
|
+
prefix: Optional[str],
|
|
650
|
+
non_observer_derivation: bool,
|
|
651
|
+
show_hd_path: bool,
|
|
652
|
+
private_key: Optional[PrivateKey],
|
|
653
|
+
) -> None:
|
|
654
|
+
"""
|
|
655
|
+
Generate wallet addresses using keys derived from the provided private key.
|
|
656
|
+
"""
|
|
657
|
+
if fingerprint is not None:
|
|
658
|
+
key_data: KeyData = Keychain().get_key(fingerprint, include_secrets=non_observer_derivation)
|
|
659
|
+
if non_observer_derivation:
|
|
660
|
+
sk = key_data.private_key
|
|
661
|
+
else:
|
|
662
|
+
sk = None
|
|
663
|
+
pk = key_data.public_key
|
|
664
|
+
else:
|
|
665
|
+
assert private_key is not None
|
|
666
|
+
sk = private_key
|
|
667
|
+
pk = sk.get_g1()
|
|
668
|
+
|
|
669
|
+
if prefix is None:
|
|
670
|
+
config: dict[str, Any] = load_config(root_path, "config.yaml")
|
|
671
|
+
selected: str = config["selected_network"]
|
|
672
|
+
prefix = config["network_overrides"]["config"][selected]["address_prefix"]
|
|
673
|
+
path_indices: list[int] = [12381, 8444, 2]
|
|
674
|
+
wallet_hd_path_root: str = "m/"
|
|
675
|
+
for i in path_indices:
|
|
676
|
+
wallet_hd_path_root += f"{i}{'n' if non_observer_derivation else ''}/"
|
|
677
|
+
for i in range(index, index + count):
|
|
678
|
+
if non_observer_derivation:
|
|
679
|
+
assert sk is not None
|
|
680
|
+
pubkey = master_sk_to_wallet_sk(sk, uint32(i)).get_g1()
|
|
681
|
+
else:
|
|
682
|
+
pubkey = master_pk_to_wallet_pk_unhardened(pk, uint32(i))
|
|
683
|
+
# Generate a wallet address using the standard p2_delegated_puzzle_or_hidden_puzzle puzzle
|
|
684
|
+
# TODO: consider generating addresses using other puzzles
|
|
685
|
+
address = encode_puzzle_hash(create_puzzlehash_for_pk(pubkey), prefix)
|
|
686
|
+
if show_hd_path:
|
|
687
|
+
print(
|
|
688
|
+
f"Wallet address {i} "
|
|
689
|
+
f"({wallet_hd_path_root + str(i) + ('n' if non_observer_derivation else '')}): {address}"
|
|
690
|
+
)
|
|
691
|
+
else:
|
|
692
|
+
print(f"Wallet address {i}: {address}")
|
|
693
|
+
|
|
694
|
+
|
|
695
|
+
def private_key_string_repr(private_key: PrivateKey) -> str:
|
|
696
|
+
"""Print a PrivateKey in a human-readable formats"""
|
|
697
|
+
|
|
698
|
+
s = str(private_key)
|
|
699
|
+
return s[len("<PrivateKey ") : s.rfind(">")] if s.startswith("<PrivateKey ") else s
|
|
700
|
+
|
|
701
|
+
|
|
702
|
+
def derive_child_key(
|
|
703
|
+
fingerprint: Optional[int],
|
|
704
|
+
key_type: Optional[str],
|
|
705
|
+
derive_from_hd_path: Optional[str],
|
|
706
|
+
index: int,
|
|
707
|
+
count: int,
|
|
708
|
+
non_observer_derivation: bool,
|
|
709
|
+
show_private_keys: bool,
|
|
710
|
+
show_hd_path: bool,
|
|
711
|
+
private_key: Optional[PrivateKey],
|
|
712
|
+
bech32m_prefix: Optional[str],
|
|
713
|
+
) -> None:
|
|
714
|
+
"""
|
|
715
|
+
Derive child keys from the provided master key.
|
|
716
|
+
"""
|
|
717
|
+
from chia.wallet.derive_keys import _derive_path, _derive_path_unhardened, _derive_pk_unhardened
|
|
718
|
+
|
|
719
|
+
if fingerprint is not None:
|
|
720
|
+
key_data: KeyData = Keychain().get_key(fingerprint, include_secrets=True)
|
|
721
|
+
current_pk: G1Element = key_data.public_key
|
|
722
|
+
current_sk: Optional[PrivateKey] = key_data.private_key if key_data.secrets is not None else None
|
|
723
|
+
else:
|
|
724
|
+
assert private_key is not None
|
|
725
|
+
current_pk = private_key.get_g1()
|
|
726
|
+
current_sk = private_key
|
|
727
|
+
|
|
728
|
+
# Key type was specified
|
|
729
|
+
if key_type is not None:
|
|
730
|
+
path_indices: list[int] = [12381, 8444]
|
|
731
|
+
path_indices.append(
|
|
732
|
+
{
|
|
733
|
+
"farmer": 0,
|
|
734
|
+
"pool": 1,
|
|
735
|
+
"wallet": 2,
|
|
736
|
+
"local": 3,
|
|
737
|
+
"backup": 4,
|
|
738
|
+
"singleton": 5,
|
|
739
|
+
"pool_auth": 6,
|
|
740
|
+
}[key_type]
|
|
741
|
+
)
|
|
742
|
+
|
|
743
|
+
if non_observer_derivation:
|
|
744
|
+
assert current_sk is not None # semantics above guarantee this
|
|
745
|
+
current_sk = _derive_path(current_sk, path_indices)
|
|
746
|
+
else:
|
|
747
|
+
if current_sk is not None:
|
|
748
|
+
current_sk = _derive_path_unhardened(current_sk, path_indices)
|
|
749
|
+
else:
|
|
750
|
+
current_pk = _derive_pk_unhardened(current_pk, path_indices)
|
|
751
|
+
|
|
752
|
+
derivation_root_sk = current_sk
|
|
753
|
+
derivation_root_pk = current_pk
|
|
754
|
+
hd_path_root = "m/"
|
|
755
|
+
for i in path_indices:
|
|
756
|
+
hd_path_root += f"{i}{'n' if non_observer_derivation else ''}/"
|
|
757
|
+
# Arbitrary HD path was specified
|
|
758
|
+
elif derive_from_hd_path is not None:
|
|
759
|
+
derivation_root_pk, derivation_root_sk, hd_path_root = derive_pk_and_sk_from_hd_path(
|
|
760
|
+
current_pk, derive_from_hd_path, master_sk=current_sk
|
|
761
|
+
)
|
|
762
|
+
else:
|
|
763
|
+
raise Exception("Neither key type nor HD path was specified")
|
|
764
|
+
|
|
765
|
+
# Derive child keys from derivation_root_sk
|
|
766
|
+
for i in range(index, index + count):
|
|
767
|
+
if non_observer_derivation:
|
|
768
|
+
assert derivation_root_sk is not None # semantics above guarantee this
|
|
769
|
+
sk = _derive_path(derivation_root_sk, [i])
|
|
770
|
+
pk = sk.get_g1()
|
|
771
|
+
else:
|
|
772
|
+
if derivation_root_sk is not None:
|
|
773
|
+
sk = _derive_path_unhardened(derivation_root_sk, [i])
|
|
774
|
+
pk = sk.get_g1()
|
|
775
|
+
else:
|
|
776
|
+
sk = None
|
|
777
|
+
pk = _derive_pk_unhardened(derivation_root_pk, [i])
|
|
778
|
+
hd_path: str = (
|
|
779
|
+
" (" + hd_path_root + str(i) + ("n" if non_observer_derivation else "") + ")" if show_hd_path else ""
|
|
780
|
+
)
|
|
781
|
+
key_type_str: Optional[str]
|
|
782
|
+
|
|
783
|
+
if key_type is not None:
|
|
784
|
+
key_type_str = key_type.capitalize()
|
|
785
|
+
else:
|
|
786
|
+
key_type_str = "Non-Observer" if non_observer_derivation else "Observer"
|
|
787
|
+
|
|
788
|
+
print(f"{key_type_str} public key {i}{hd_path}: {format_pk_bech32_maybe(bech32m_prefix, bytes(pk).hex())}")
|
|
789
|
+
if show_private_keys and sk is not None:
|
|
790
|
+
print(f"{key_type_str} private key {i}{hd_path}: {private_key_string_repr(sk)}")
|
|
791
|
+
|
|
792
|
+
|
|
793
|
+
def private_key_for_fingerprint(fingerprint: int) -> Optional[PrivateKey]:
|
|
794
|
+
unlock_keyring()
|
|
795
|
+
private_keys = Keychain().get_all_private_keys()
|
|
796
|
+
|
|
797
|
+
for sk, _ in private_keys:
|
|
798
|
+
if sk.get_g1().get_fingerprint() == fingerprint:
|
|
799
|
+
return sk
|
|
800
|
+
return None
|
|
801
|
+
|
|
802
|
+
|
|
803
|
+
def prompt_for_fingerprint() -> Optional[int]:
|
|
804
|
+
fingerprints: list[int] = [pk.get_fingerprint() for pk in Keychain().get_all_public_keys()]
|
|
805
|
+
while True:
|
|
806
|
+
print("Choose key:")
|
|
807
|
+
for i, fp in enumerate(fingerprints):
|
|
808
|
+
print(f"{i + 1}) {fp}")
|
|
809
|
+
val = None
|
|
810
|
+
while val is None:
|
|
811
|
+
val = input("Enter a number to pick or q to quit: ")
|
|
812
|
+
if val == "q":
|
|
813
|
+
return None
|
|
814
|
+
if not val.isdigit():
|
|
815
|
+
val = None
|
|
816
|
+
else:
|
|
817
|
+
index = int(val) - 1
|
|
818
|
+
if index >= len(fingerprints):
|
|
819
|
+
print("Invalid value")
|
|
820
|
+
val = None
|
|
821
|
+
continue
|
|
822
|
+
else:
|
|
823
|
+
return fingerprints[index]
|
|
824
|
+
|
|
825
|
+
|
|
826
|
+
def get_private_key_with_fingerprint_or_prompt(
|
|
827
|
+
fingerprint: Optional[int],
|
|
828
|
+
) -> tuple[Optional[int], Optional[PrivateKey]]:
|
|
829
|
+
"""
|
|
830
|
+
Get a private key with the specified fingerprint. If fingerprint is not
|
|
831
|
+
specified, prompt the user to select a key.
|
|
832
|
+
"""
|
|
833
|
+
|
|
834
|
+
# Return the private key matching the specified fingerprint
|
|
835
|
+
if fingerprint is not None:
|
|
836
|
+
return fingerprint, private_key_for_fingerprint(fingerprint)
|
|
837
|
+
|
|
838
|
+
fingerprint_prompt = prompt_for_fingerprint()
|
|
839
|
+
return fingerprint_prompt, None if fingerprint_prompt is None else private_key_for_fingerprint(fingerprint_prompt)
|
|
840
|
+
|
|
841
|
+
|
|
842
|
+
def private_key_from_mnemonic_seed_file(filename: Path) -> PrivateKey:
|
|
843
|
+
"""
|
|
844
|
+
Create a private key from a mnemonic seed file.
|
|
845
|
+
"""
|
|
846
|
+
|
|
847
|
+
mnemonic = filename.read_text().rstrip()
|
|
848
|
+
seed = mnemonic_to_seed(mnemonic)
|
|
849
|
+
return AugSchemeMPL.key_gen(seed)
|
|
850
|
+
|
|
851
|
+
|
|
852
|
+
def resolve_derivation_master_key(
|
|
853
|
+
fingerprint_or_filename: Optional[Union[int, str, Path]],
|
|
854
|
+
) -> tuple[Optional[int], Optional[PrivateKey]]:
|
|
855
|
+
"""
|
|
856
|
+
Given a key fingerprint of file containing a mnemonic seed, return the private key.
|
|
857
|
+
"""
|
|
858
|
+
|
|
859
|
+
if fingerprint_or_filename is not None and (isinstance(fingerprint_or_filename, (str, Path))):
|
|
860
|
+
sk = private_key_from_mnemonic_seed_file(Path(os.fspath(fingerprint_or_filename)))
|
|
861
|
+
return sk.get_g1().get_fingerprint(), sk
|
|
862
|
+
else:
|
|
863
|
+
return get_private_key_with_fingerprint_or_prompt(fingerprint_or_filename)
|