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.
Files changed (1042) hide show
  1. chia/__init__.py +10 -0
  2. chia/__main__.py +5 -0
  3. chia/_tests/README.md +53 -0
  4. chia/_tests/__init__.py +0 -0
  5. chia/_tests/blockchain/__init__.py +0 -0
  6. chia/_tests/blockchain/blockchain_test_utils.py +195 -0
  7. chia/_tests/blockchain/config.py +4 -0
  8. chia/_tests/blockchain/test_augmented_chain.py +145 -0
  9. chia/_tests/blockchain/test_blockchain.py +4202 -0
  10. chia/_tests/blockchain/test_blockchain_transactions.py +1031 -0
  11. chia/_tests/blockchain/test_build_chains.py +59 -0
  12. chia/_tests/blockchain/test_get_block_generator.py +72 -0
  13. chia/_tests/blockchain/test_lookup_fork_chain.py +194 -0
  14. chia/_tests/build-init-files.py +92 -0
  15. chia/_tests/build-job-matrix.py +204 -0
  16. chia/_tests/check_pytest_monitor_output.py +34 -0
  17. chia/_tests/check_sql_statements.py +72 -0
  18. chia/_tests/chia-start-sim +42 -0
  19. chia/_tests/clvm/__init__.py +0 -0
  20. chia/_tests/clvm/benchmark_costs.py +23 -0
  21. chia/_tests/clvm/coin_store.py +149 -0
  22. chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
  23. chia/_tests/clvm/test_clvm_step.py +37 -0
  24. chia/_tests/clvm/test_condition_codes.py +13 -0
  25. chia/_tests/clvm/test_curry_and_treehash.py +55 -0
  26. chia/_tests/clvm/test_message_conditions.py +184 -0
  27. chia/_tests/clvm/test_program.py +150 -0
  28. chia/_tests/clvm/test_puzzle_compression.py +143 -0
  29. chia/_tests/clvm/test_puzzle_drivers.py +45 -0
  30. chia/_tests/clvm/test_puzzles.py +242 -0
  31. chia/_tests/clvm/test_singletons.py +540 -0
  32. chia/_tests/clvm/test_spend_sim.py +181 -0
  33. chia/_tests/cmds/__init__.py +0 -0
  34. chia/_tests/cmds/cmd_test_utils.py +469 -0
  35. chia/_tests/cmds/config.py +3 -0
  36. chia/_tests/cmds/conftest.py +23 -0
  37. chia/_tests/cmds/test_click_types.py +200 -0
  38. chia/_tests/cmds/test_cmd_framework.py +620 -0
  39. chia/_tests/cmds/test_cmds_util.py +97 -0
  40. chia/_tests/cmds/test_daemon.py +92 -0
  41. chia/_tests/cmds/test_dev_gh.py +131 -0
  42. chia/_tests/cmds/test_farm_cmd.py +66 -0
  43. chia/_tests/cmds/test_show.py +116 -0
  44. chia/_tests/cmds/test_sim.py +207 -0
  45. chia/_tests/cmds/test_timelock_args.py +75 -0
  46. chia/_tests/cmds/test_tx_config_args.py +154 -0
  47. chia/_tests/cmds/testing_classes.py +59 -0
  48. chia/_tests/cmds/wallet/__init__.py +0 -0
  49. chia/_tests/cmds/wallet/test_consts.py +47 -0
  50. chia/_tests/cmds/wallet/test_dao.py +565 -0
  51. chia/_tests/cmds/wallet/test_did.py +403 -0
  52. chia/_tests/cmds/wallet/test_nft.py +471 -0
  53. chia/_tests/cmds/wallet/test_notifications.py +124 -0
  54. chia/_tests/cmds/wallet/test_offer.toffer +1 -0
  55. chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
  56. chia/_tests/cmds/wallet/test_vcs.py +400 -0
  57. chia/_tests/cmds/wallet/test_wallet.py +1125 -0
  58. chia/_tests/cmds/wallet/test_wallet_check.py +109 -0
  59. chia/_tests/conftest.py +1419 -0
  60. chia/_tests/connection_utils.py +125 -0
  61. chia/_tests/core/__init__.py +0 -0
  62. chia/_tests/core/cmds/__init__.py +0 -0
  63. chia/_tests/core/cmds/test_beta.py +382 -0
  64. chia/_tests/core/cmds/test_keys.py +1734 -0
  65. chia/_tests/core/cmds/test_wallet.py +126 -0
  66. chia/_tests/core/config.py +3 -0
  67. chia/_tests/core/consensus/__init__.py +0 -0
  68. chia/_tests/core/consensus/test_block_creation.py +54 -0
  69. chia/_tests/core/consensus/test_pot_iterations.py +117 -0
  70. chia/_tests/core/custom_types/__init__.py +0 -0
  71. chia/_tests/core/custom_types/test_coin.py +107 -0
  72. chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
  73. chia/_tests/core/custom_types/test_spend_bundle.py +70 -0
  74. chia/_tests/core/daemon/__init__.py +0 -0
  75. chia/_tests/core/daemon/config.py +4 -0
  76. chia/_tests/core/daemon/test_daemon.py +2128 -0
  77. chia/_tests/core/daemon/test_daemon_register.py +109 -0
  78. chia/_tests/core/daemon/test_keychain_proxy.py +101 -0
  79. chia/_tests/core/data_layer/__init__.py +0 -0
  80. chia/_tests/core/data_layer/config.py +5 -0
  81. chia/_tests/core/data_layer/conftest.py +106 -0
  82. chia/_tests/core/data_layer/test_data_cli.py +56 -0
  83. chia/_tests/core/data_layer/test_data_layer.py +83 -0
  84. chia/_tests/core/data_layer/test_data_layer_util.py +218 -0
  85. chia/_tests/core/data_layer/test_data_rpc.py +3847 -0
  86. chia/_tests/core/data_layer/test_data_store.py +2424 -0
  87. chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
  88. chia/_tests/core/data_layer/test_plugin.py +91 -0
  89. chia/_tests/core/data_layer/util.py +233 -0
  90. chia/_tests/core/farmer/__init__.py +0 -0
  91. chia/_tests/core/farmer/config.py +3 -0
  92. chia/_tests/core/farmer/test_farmer_api.py +103 -0
  93. chia/_tests/core/full_node/__init__.py +0 -0
  94. chia/_tests/core/full_node/config.py +4 -0
  95. chia/_tests/core/full_node/dos/__init__.py +0 -0
  96. chia/_tests/core/full_node/dos/config.py +3 -0
  97. chia/_tests/core/full_node/full_sync/__init__.py +0 -0
  98. chia/_tests/core/full_node/full_sync/config.py +4 -0
  99. chia/_tests/core/full_node/full_sync/test_full_sync.py +443 -0
  100. chia/_tests/core/full_node/ram_db.py +27 -0
  101. chia/_tests/core/full_node/stores/__init__.py +0 -0
  102. chia/_tests/core/full_node/stores/config.py +4 -0
  103. chia/_tests/core/full_node/stores/test_block_store.py +590 -0
  104. chia/_tests/core/full_node/stores/test_coin_store.py +897 -0
  105. chia/_tests/core/full_node/stores/test_full_node_store.py +1219 -0
  106. chia/_tests/core/full_node/stores/test_hint_store.py +229 -0
  107. chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
  108. chia/_tests/core/full_node/test_address_manager.py +588 -0
  109. chia/_tests/core/full_node/test_block_height_map.py +556 -0
  110. chia/_tests/core/full_node/test_conditions.py +556 -0
  111. chia/_tests/core/full_node/test_full_node.py +2700 -0
  112. chia/_tests/core/full_node/test_generator_tools.py +82 -0
  113. chia/_tests/core/full_node/test_hint_management.py +104 -0
  114. chia/_tests/core/full_node/test_node_load.py +34 -0
  115. chia/_tests/core/full_node/test_performance.py +179 -0
  116. chia/_tests/core/full_node/test_subscriptions.py +492 -0
  117. chia/_tests/core/full_node/test_transactions.py +203 -0
  118. chia/_tests/core/full_node/test_tx_processing_queue.py +155 -0
  119. chia/_tests/core/large_block.py +2388 -0
  120. chia/_tests/core/make_block_generator.py +70 -0
  121. chia/_tests/core/mempool/__init__.py +0 -0
  122. chia/_tests/core/mempool/config.py +4 -0
  123. chia/_tests/core/mempool/test_mempool.py +3255 -0
  124. chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
  125. chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
  126. chia/_tests/core/mempool/test_mempool_item_queries.py +190 -0
  127. chia/_tests/core/mempool/test_mempool_manager.py +2084 -0
  128. chia/_tests/core/mempool/test_mempool_performance.py +64 -0
  129. chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
  130. chia/_tests/core/node_height.py +28 -0
  131. chia/_tests/core/server/__init__.py +0 -0
  132. chia/_tests/core/server/config.py +3 -0
  133. chia/_tests/core/server/flood.py +84 -0
  134. chia/_tests/core/server/serve.py +135 -0
  135. chia/_tests/core/server/test_api_protocol.py +21 -0
  136. chia/_tests/core/server/test_capabilities.py +66 -0
  137. chia/_tests/core/server/test_dos.py +319 -0
  138. chia/_tests/core/server/test_event_loop.py +109 -0
  139. chia/_tests/core/server/test_loop.py +294 -0
  140. chia/_tests/core/server/test_node_discovery.py +73 -0
  141. chia/_tests/core/server/test_rate_limits.py +482 -0
  142. chia/_tests/core/server/test_server.py +226 -0
  143. chia/_tests/core/server/test_upnp.py +8 -0
  144. chia/_tests/core/services/__init__.py +0 -0
  145. chia/_tests/core/services/config.py +3 -0
  146. chia/_tests/core/services/test_services.py +188 -0
  147. chia/_tests/core/ssl/__init__.py +0 -0
  148. chia/_tests/core/ssl/config.py +3 -0
  149. chia/_tests/core/ssl/test_ssl.py +202 -0
  150. chia/_tests/core/test_coins.py +33 -0
  151. chia/_tests/core/test_cost_calculation.py +313 -0
  152. chia/_tests/core/test_crawler.py +175 -0
  153. chia/_tests/core/test_crawler_rpc.py +53 -0
  154. chia/_tests/core/test_daemon_rpc.py +24 -0
  155. chia/_tests/core/test_db_conversion.py +130 -0
  156. chia/_tests/core/test_db_validation.py +162 -0
  157. chia/_tests/core/test_farmer_harvester_rpc.py +505 -0
  158. chia/_tests/core/test_filter.py +35 -0
  159. chia/_tests/core/test_full_node_rpc.py +768 -0
  160. chia/_tests/core/test_merkle_set.py +343 -0
  161. chia/_tests/core/test_program.py +47 -0
  162. chia/_tests/core/test_rpc_util.py +86 -0
  163. chia/_tests/core/test_seeder.py +420 -0
  164. chia/_tests/core/test_setproctitle.py +13 -0
  165. chia/_tests/core/util/__init__.py +0 -0
  166. chia/_tests/core/util/config.py +4 -0
  167. chia/_tests/core/util/test_block_cache.py +44 -0
  168. chia/_tests/core/util/test_cached_bls.py +57 -0
  169. chia/_tests/core/util/test_config.py +337 -0
  170. chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
  171. chia/_tests/core/util/test_files.py +391 -0
  172. chia/_tests/core/util/test_jsonify.py +146 -0
  173. chia/_tests/core/util/test_keychain.py +522 -0
  174. chia/_tests/core/util/test_keyring_wrapper.py +491 -0
  175. chia/_tests/core/util/test_lockfile.py +380 -0
  176. chia/_tests/core/util/test_log_exceptions.py +187 -0
  177. chia/_tests/core/util/test_lru_cache.py +56 -0
  178. chia/_tests/core/util/test_significant_bits.py +40 -0
  179. chia/_tests/core/util/test_streamable.py +883 -0
  180. chia/_tests/db/__init__.py +0 -0
  181. chia/_tests/db/test_db_wrapper.py +566 -0
  182. chia/_tests/environments/__init__.py +0 -0
  183. chia/_tests/environments/common.py +35 -0
  184. chia/_tests/environments/full_node.py +47 -0
  185. chia/_tests/environments/wallet.py +429 -0
  186. chia/_tests/ether.py +19 -0
  187. chia/_tests/farmer_harvester/__init__.py +0 -0
  188. chia/_tests/farmer_harvester/config.py +3 -0
  189. chia/_tests/farmer_harvester/test_farmer.py +1264 -0
  190. chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
  191. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +131 -0
  192. chia/_tests/farmer_harvester/test_third_party_harvesters.py +528 -0
  193. chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
  194. chia/_tests/fee_estimation/__init__.py +0 -0
  195. chia/_tests/fee_estimation/config.py +3 -0
  196. chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
  197. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
  198. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +144 -0
  199. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
  200. chia/_tests/generator/__init__.py +0 -0
  201. chia/_tests/generator/puzzles/__init__.py +0 -0
  202. chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
  203. chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
  204. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
  205. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
  206. chia/_tests/generator/test_compression.py +201 -0
  207. chia/_tests/generator/test_generator_types.py +44 -0
  208. chia/_tests/generator/test_rom.py +180 -0
  209. chia/_tests/plot_sync/__init__.py +0 -0
  210. chia/_tests/plot_sync/config.py +3 -0
  211. chia/_tests/plot_sync/test_delta.py +101 -0
  212. chia/_tests/plot_sync/test_plot_sync.py +618 -0
  213. chia/_tests/plot_sync/test_receiver.py +451 -0
  214. chia/_tests/plot_sync/test_sender.py +116 -0
  215. chia/_tests/plot_sync/test_sync_simulated.py +451 -0
  216. chia/_tests/plot_sync/util.py +68 -0
  217. chia/_tests/plotting/__init__.py +0 -0
  218. chia/_tests/plotting/config.py +3 -0
  219. chia/_tests/plotting/test_plot_manager.py +781 -0
  220. chia/_tests/plotting/util.py +12 -0
  221. chia/_tests/pools/__init__.py +0 -0
  222. chia/_tests/pools/config.py +5 -0
  223. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  224. chia/_tests/pools/test_pool_cmdline.py +1001 -0
  225. chia/_tests/pools/test_pool_config.py +42 -0
  226. chia/_tests/pools/test_pool_puzzles_lifecycle.py +397 -0
  227. chia/_tests/pools/test_pool_rpc.py +1123 -0
  228. chia/_tests/pools/test_pool_wallet.py +205 -0
  229. chia/_tests/pools/test_wallet_pool_store.py +161 -0
  230. chia/_tests/process_junit.py +348 -0
  231. chia/_tests/rpc/__init__.py +0 -0
  232. chia/_tests/rpc/test_rpc_client.py +138 -0
  233. chia/_tests/rpc/test_rpc_server.py +183 -0
  234. chia/_tests/simulation/__init__.py +0 -0
  235. chia/_tests/simulation/config.py +6 -0
  236. chia/_tests/simulation/test_simulation.py +501 -0
  237. chia/_tests/simulation/test_simulator.py +232 -0
  238. chia/_tests/simulation/test_start_simulator.py +107 -0
  239. chia/_tests/testconfig.py +13 -0
  240. chia/_tests/timelord/__init__.py +0 -0
  241. chia/_tests/timelord/config.py +3 -0
  242. chia/_tests/timelord/test_new_peak.py +437 -0
  243. chia/_tests/timelord/test_timelord.py +11 -0
  244. chia/_tests/tools/1315537.json +170 -0
  245. chia/_tests/tools/1315544.json +160 -0
  246. chia/_tests/tools/1315630.json +150 -0
  247. chia/_tests/tools/300000.json +105 -0
  248. chia/_tests/tools/442734.json +140 -0
  249. chia/_tests/tools/466212.json +130 -0
  250. chia/_tests/tools/__init__.py +0 -0
  251. chia/_tests/tools/config.py +5 -0
  252. chia/_tests/tools/test-blockchain-db.sqlite +0 -0
  253. chia/_tests/tools/test_full_sync.py +30 -0
  254. chia/_tests/tools/test_legacy_keyring.py +82 -0
  255. chia/_tests/tools/test_run_block.py +128 -0
  256. chia/_tests/tools/test_virtual_project.py +591 -0
  257. chia/_tests/util/__init__.py +0 -0
  258. chia/_tests/util/benchmark_cost.py +170 -0
  259. chia/_tests/util/benchmarks.py +153 -0
  260. chia/_tests/util/bip39_test_vectors.json +148 -0
  261. chia/_tests/util/blockchain.py +134 -0
  262. chia/_tests/util/blockchain_mock.py +132 -0
  263. chia/_tests/util/build_network_protocol_files.py +302 -0
  264. chia/_tests/util/clvm_generator.bin +0 -0
  265. chia/_tests/util/config.py +3 -0
  266. chia/_tests/util/constants.py +20 -0
  267. chia/_tests/util/db_connection.py +37 -0
  268. chia/_tests/util/full_sync.py +253 -0
  269. chia/_tests/util/gen_ssl_certs.py +114 -0
  270. chia/_tests/util/generator_tools_testing.py +45 -0
  271. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  272. chia/_tests/util/key_tool.py +36 -0
  273. chia/_tests/util/misc.py +675 -0
  274. chia/_tests/util/network_protocol_data.py +1072 -0
  275. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  276. chia/_tests/util/protocol_messages_json.py +2701 -0
  277. chia/_tests/util/rpc.py +26 -0
  278. chia/_tests/util/run_block.py +163 -0
  279. chia/_tests/util/setup_nodes.py +481 -0
  280. chia/_tests/util/spend_sim.py +492 -0
  281. chia/_tests/util/split_managers.py +102 -0
  282. chia/_tests/util/temp_file.py +14 -0
  283. chia/_tests/util/test_action_scope.py +144 -0
  284. chia/_tests/util/test_async_pool.py +366 -0
  285. chia/_tests/util/test_build_job_matrix.py +42 -0
  286. chia/_tests/util/test_build_network_protocol_files.py +7 -0
  287. chia/_tests/util/test_chia_version.py +50 -0
  288. chia/_tests/util/test_collection.py +11 -0
  289. chia/_tests/util/test_condition_tools.py +229 -0
  290. chia/_tests/util/test_config.py +426 -0
  291. chia/_tests/util/test_dump_keyring.py +60 -0
  292. chia/_tests/util/test_errors.py +10 -0
  293. chia/_tests/util/test_full_block_utils.py +279 -0
  294. chia/_tests/util/test_installed.py +20 -0
  295. chia/_tests/util/test_limited_semaphore.py +53 -0
  296. chia/_tests/util/test_logging_filter.py +42 -0
  297. chia/_tests/util/test_misc.py +445 -0
  298. chia/_tests/util/test_network.py +73 -0
  299. chia/_tests/util/test_network_protocol_files.py +578 -0
  300. chia/_tests/util/test_network_protocol_json.py +267 -0
  301. chia/_tests/util/test_network_protocol_test.py +256 -0
  302. chia/_tests/util/test_paginator.py +71 -0
  303. chia/_tests/util/test_pprint.py +17 -0
  304. chia/_tests/util/test_priority_mutex.py +488 -0
  305. chia/_tests/util/test_recursive_replace.py +116 -0
  306. chia/_tests/util/test_replace_str_to_bytes.py +137 -0
  307. chia/_tests/util/test_service_groups.py +15 -0
  308. chia/_tests/util/test_ssl_check.py +31 -0
  309. chia/_tests/util/test_testnet_overrides.py +19 -0
  310. chia/_tests/util/test_tests_misc.py +38 -0
  311. chia/_tests/util/test_timing.py +37 -0
  312. chia/_tests/util/test_trusted_peer.py +51 -0
  313. chia/_tests/util/time_out_assert.py +191 -0
  314. chia/_tests/wallet/__init__.py +0 -0
  315. chia/_tests/wallet/cat_wallet/__init__.py +0 -0
  316. chia/_tests/wallet/cat_wallet/config.py +4 -0
  317. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
  318. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
  319. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1826 -0
  320. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
  321. chia/_tests/wallet/cat_wallet/test_trades.py +2600 -0
  322. chia/_tests/wallet/clawback/__init__.py +0 -0
  323. chia/_tests/wallet/clawback/config.py +3 -0
  324. chia/_tests/wallet/clawback/test_clawback_decorator.py +78 -0
  325. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
  326. chia/_tests/wallet/clawback/test_clawback_metadata.py +50 -0
  327. chia/_tests/wallet/config.py +4 -0
  328. chia/_tests/wallet/conftest.py +278 -0
  329. chia/_tests/wallet/dao_wallet/__init__.py +0 -0
  330. chia/_tests/wallet/dao_wallet/config.py +3 -0
  331. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1330 -0
  332. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
  333. chia/_tests/wallet/db_wallet/__init__.py +0 -0
  334. chia/_tests/wallet/db_wallet/config.py +3 -0
  335. chia/_tests/wallet/db_wallet/test_db_graftroot.py +141 -0
  336. chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
  337. chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
  338. chia/_tests/wallet/did_wallet/__init__.py +0 -0
  339. chia/_tests/wallet/did_wallet/config.py +4 -0
  340. chia/_tests/wallet/did_wallet/test_did.py +2284 -0
  341. chia/_tests/wallet/nft_wallet/__init__.py +0 -0
  342. chia/_tests/wallet/nft_wallet/config.py +4 -0
  343. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1493 -0
  344. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1024 -0
  345. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +375 -0
  346. chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
  347. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
  348. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2584 -0
  349. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
  350. chia/_tests/wallet/rpc/__init__.py +0 -0
  351. chia/_tests/wallet/rpc/config.py +4 -0
  352. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +285 -0
  353. chia/_tests/wallet/rpc/test_wallet_rpc.py +3153 -0
  354. chia/_tests/wallet/simple_sync/__init__.py +0 -0
  355. chia/_tests/wallet/simple_sync/config.py +3 -0
  356. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +718 -0
  357. chia/_tests/wallet/sync/__init__.py +0 -0
  358. chia/_tests/wallet/sync/config.py +4 -0
  359. chia/_tests/wallet/sync/test_wallet_sync.py +1692 -0
  360. chia/_tests/wallet/test_address_type.py +189 -0
  361. chia/_tests/wallet/test_bech32m.py +45 -0
  362. chia/_tests/wallet/test_clvm_streamable.py +244 -0
  363. chia/_tests/wallet/test_coin_management.py +354 -0
  364. chia/_tests/wallet/test_coin_selection.py +588 -0
  365. chia/_tests/wallet/test_conditions.py +400 -0
  366. chia/_tests/wallet/test_debug_spend_bundle.py +218 -0
  367. chia/_tests/wallet/test_new_wallet_protocol.py +1174 -0
  368. chia/_tests/wallet/test_nft_store.py +192 -0
  369. chia/_tests/wallet/test_notifications.py +196 -0
  370. chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
  371. chia/_tests/wallet/test_puzzle_store.py +132 -0
  372. chia/_tests/wallet/test_sign_coin_spends.py +159 -0
  373. chia/_tests/wallet/test_signer_protocol.py +947 -0
  374. chia/_tests/wallet/test_singleton.py +122 -0
  375. chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
  376. chia/_tests/wallet/test_singleton_store.py +152 -0
  377. chia/_tests/wallet/test_taproot.py +19 -0
  378. chia/_tests/wallet/test_transaction_store.py +945 -0
  379. chia/_tests/wallet/test_util.py +185 -0
  380. chia/_tests/wallet/test_wallet.py +2139 -0
  381. chia/_tests/wallet/test_wallet_action_scope.py +85 -0
  382. chia/_tests/wallet/test_wallet_blockchain.py +111 -0
  383. chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
  384. chia/_tests/wallet/test_wallet_interested_store.py +43 -0
  385. chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
  386. chia/_tests/wallet/test_wallet_node.py +780 -0
  387. chia/_tests/wallet/test_wallet_retry.py +95 -0
  388. chia/_tests/wallet/test_wallet_state_manager.py +259 -0
  389. chia/_tests/wallet/test_wallet_test_framework.py +275 -0
  390. chia/_tests/wallet/test_wallet_trade_store.py +218 -0
  391. chia/_tests/wallet/test_wallet_user_store.py +34 -0
  392. chia/_tests/wallet/test_wallet_utils.py +156 -0
  393. chia/_tests/wallet/vc_wallet/__init__.py +0 -0
  394. chia/_tests/wallet/vc_wallet/config.py +3 -0
  395. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
  396. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
  397. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +830 -0
  398. chia/_tests/wallet/wallet_block_tools.py +327 -0
  399. chia/_tests/weight_proof/__init__.py +0 -0
  400. chia/_tests/weight_proof/config.py +3 -0
  401. chia/_tests/weight_proof/test_weight_proof.py +528 -0
  402. chia/apis.py +19 -0
  403. chia/clvm/__init__.py +0 -0
  404. chia/cmds/__init__.py +0 -0
  405. chia/cmds/beta.py +184 -0
  406. chia/cmds/beta_funcs.py +137 -0
  407. chia/cmds/check_wallet_db.py +420 -0
  408. chia/cmds/chia.py +151 -0
  409. chia/cmds/cmd_classes.py +323 -0
  410. chia/cmds/cmd_helpers.py +242 -0
  411. chia/cmds/cmds_util.py +488 -0
  412. chia/cmds/coin_funcs.py +275 -0
  413. chia/cmds/coins.py +182 -0
  414. chia/cmds/completion.py +49 -0
  415. chia/cmds/configure.py +332 -0
  416. chia/cmds/dao.py +1064 -0
  417. chia/cmds/dao_funcs.py +598 -0
  418. chia/cmds/data.py +708 -0
  419. chia/cmds/data_funcs.py +385 -0
  420. chia/cmds/db.py +87 -0
  421. chia/cmds/db_backup_func.py +77 -0
  422. chia/cmds/db_upgrade_func.py +452 -0
  423. chia/cmds/db_validate_func.py +184 -0
  424. chia/cmds/dev.py +18 -0
  425. chia/cmds/farm.py +100 -0
  426. chia/cmds/farm_funcs.py +200 -0
  427. chia/cmds/gh.py +275 -0
  428. chia/cmds/init.py +63 -0
  429. chia/cmds/init_funcs.py +367 -0
  430. chia/cmds/installers.py +131 -0
  431. chia/cmds/keys.py +527 -0
  432. chia/cmds/keys_funcs.py +863 -0
  433. chia/cmds/netspace.py +50 -0
  434. chia/cmds/netspace_funcs.py +54 -0
  435. chia/cmds/options.py +32 -0
  436. chia/cmds/param_types.py +238 -0
  437. chia/cmds/passphrase.py +131 -0
  438. chia/cmds/passphrase_funcs.py +292 -0
  439. chia/cmds/peer.py +51 -0
  440. chia/cmds/peer_funcs.py +129 -0
  441. chia/cmds/plotnft.py +260 -0
  442. chia/cmds/plotnft_funcs.py +405 -0
  443. chia/cmds/plots.py +230 -0
  444. chia/cmds/plotters.py +18 -0
  445. chia/cmds/rpc.py +208 -0
  446. chia/cmds/show.py +72 -0
  447. chia/cmds/show_funcs.py +215 -0
  448. chia/cmds/signer.py +296 -0
  449. chia/cmds/sim.py +225 -0
  450. chia/cmds/sim_funcs.py +509 -0
  451. chia/cmds/start.py +24 -0
  452. chia/cmds/start_funcs.py +109 -0
  453. chia/cmds/stop.py +62 -0
  454. chia/cmds/units.py +9 -0
  455. chia/cmds/wallet.py +1901 -0
  456. chia/cmds/wallet_funcs.py +1874 -0
  457. chia/consensus/__init__.py +0 -0
  458. chia/consensus/block_body_validation.py +562 -0
  459. chia/consensus/block_creation.py +546 -0
  460. chia/consensus/block_header_validation.py +1059 -0
  461. chia/consensus/block_record.py +31 -0
  462. chia/consensus/block_rewards.py +53 -0
  463. chia/consensus/blockchain.py +1087 -0
  464. chia/consensus/blockchain_interface.py +56 -0
  465. chia/consensus/coinbase.py +30 -0
  466. chia/consensus/condition_costs.py +9 -0
  467. chia/consensus/constants.py +49 -0
  468. chia/consensus/cost_calculator.py +15 -0
  469. chia/consensus/default_constants.py +89 -0
  470. chia/consensus/deficit.py +55 -0
  471. chia/consensus/difficulty_adjustment.py +412 -0
  472. chia/consensus/find_fork_point.py +111 -0
  473. chia/consensus/full_block_to_block_record.py +167 -0
  474. chia/consensus/get_block_challenge.py +106 -0
  475. chia/consensus/get_block_generator.py +27 -0
  476. chia/consensus/make_sub_epoch_summary.py +210 -0
  477. chia/consensus/multiprocess_validation.py +268 -0
  478. chia/consensus/pos_quality.py +19 -0
  479. chia/consensus/pot_iterations.py +67 -0
  480. chia/consensus/puzzles/__init__.py +0 -0
  481. chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
  482. chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
  483. chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
  484. chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
  485. chia/consensus/vdf_info_computation.py +156 -0
  486. chia/daemon/__init__.py +0 -0
  487. chia/daemon/client.py +252 -0
  488. chia/daemon/keychain_proxy.py +502 -0
  489. chia/daemon/keychain_server.py +365 -0
  490. chia/daemon/server.py +1606 -0
  491. chia/daemon/windows_signal.py +56 -0
  492. chia/data_layer/__init__.py +0 -0
  493. chia/data_layer/data_layer.py +1291 -0
  494. chia/data_layer/data_layer_api.py +33 -0
  495. chia/data_layer/data_layer_errors.py +50 -0
  496. chia/data_layer/data_layer_server.py +170 -0
  497. chia/data_layer/data_layer_util.py +985 -0
  498. chia/data_layer/data_layer_wallet.py +1311 -0
  499. chia/data_layer/data_store.py +2267 -0
  500. chia/data_layer/dl_wallet_store.py +407 -0
  501. chia/data_layer/download_data.py +389 -0
  502. chia/data_layer/puzzles/__init__.py +0 -0
  503. chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
  504. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
  505. chia/data_layer/s3_plugin_config.yml +33 -0
  506. chia/data_layer/s3_plugin_service.py +468 -0
  507. chia/data_layer/util/__init__.py +0 -0
  508. chia/data_layer/util/benchmark.py +107 -0
  509. chia/data_layer/util/plugin.py +40 -0
  510. chia/farmer/__init__.py +0 -0
  511. chia/farmer/farmer.py +923 -0
  512. chia/farmer/farmer_api.py +820 -0
  513. chia/full_node/__init__.py +0 -0
  514. chia/full_node/bitcoin_fee_estimator.py +85 -0
  515. chia/full_node/block_height_map.py +271 -0
  516. chia/full_node/block_store.py +576 -0
  517. chia/full_node/bundle_tools.py +19 -0
  518. chia/full_node/coin_store.py +647 -0
  519. chia/full_node/fee_estimate.py +54 -0
  520. chia/full_node/fee_estimate_store.py +24 -0
  521. chia/full_node/fee_estimation.py +92 -0
  522. chia/full_node/fee_estimator.py +90 -0
  523. chia/full_node/fee_estimator_constants.py +38 -0
  524. chia/full_node/fee_estimator_interface.py +42 -0
  525. chia/full_node/fee_history.py +25 -0
  526. chia/full_node/fee_tracker.py +564 -0
  527. chia/full_node/full_node.py +3327 -0
  528. chia/full_node/full_node_api.py +2025 -0
  529. chia/full_node/full_node_store.py +1033 -0
  530. chia/full_node/hint_management.py +56 -0
  531. chia/full_node/hint_store.py +93 -0
  532. chia/full_node/mempool.py +589 -0
  533. chia/full_node/mempool_check_conditions.py +146 -0
  534. chia/full_node/mempool_manager.py +853 -0
  535. chia/full_node/pending_tx_cache.py +112 -0
  536. chia/full_node/puzzles/__init__.py +0 -0
  537. chia/full_node/puzzles/block_program_zero.clsp +14 -0
  538. chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
  539. chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
  540. chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
  541. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
  542. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
  543. chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
  544. chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
  545. chia/full_node/signage_point.py +16 -0
  546. chia/full_node/subscriptions.py +247 -0
  547. chia/full_node/sync_store.py +146 -0
  548. chia/full_node/tx_processing_queue.py +78 -0
  549. chia/full_node/util/__init__.py +0 -0
  550. chia/full_node/weight_proof.py +1720 -0
  551. chia/harvester/__init__.py +0 -0
  552. chia/harvester/harvester.py +272 -0
  553. chia/harvester/harvester_api.py +380 -0
  554. chia/introducer/__init__.py +0 -0
  555. chia/introducer/introducer.py +122 -0
  556. chia/introducer/introducer_api.py +70 -0
  557. chia/legacy/__init__.py +0 -0
  558. chia/legacy/keyring.py +155 -0
  559. chia/plot_sync/__init__.py +0 -0
  560. chia/plot_sync/delta.py +61 -0
  561. chia/plot_sync/exceptions.py +56 -0
  562. chia/plot_sync/receiver.py +386 -0
  563. chia/plot_sync/sender.py +340 -0
  564. chia/plot_sync/util.py +43 -0
  565. chia/plotters/__init__.py +0 -0
  566. chia/plotters/bladebit.py +388 -0
  567. chia/plotters/chiapos.py +63 -0
  568. chia/plotters/madmax.py +224 -0
  569. chia/plotters/plotters.py +577 -0
  570. chia/plotters/plotters_util.py +133 -0
  571. chia/plotting/__init__.py +0 -0
  572. chia/plotting/cache.py +213 -0
  573. chia/plotting/check_plots.py +283 -0
  574. chia/plotting/create_plots.py +278 -0
  575. chia/plotting/manager.py +436 -0
  576. chia/plotting/util.py +336 -0
  577. chia/pools/__init__.py +0 -0
  578. chia/pools/pool_config.py +110 -0
  579. chia/pools/pool_puzzles.py +459 -0
  580. chia/pools/pool_wallet.py +933 -0
  581. chia/pools/pool_wallet_info.py +118 -0
  582. chia/pools/puzzles/__init__.py +0 -0
  583. chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
  584. chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
  585. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
  586. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
  587. chia/protocols/__init__.py +0 -0
  588. chia/protocols/farmer_protocol.py +102 -0
  589. chia/protocols/full_node_protocol.py +219 -0
  590. chia/protocols/harvester_protocol.py +216 -0
  591. chia/protocols/introducer_protocol.py +25 -0
  592. chia/protocols/pool_protocol.py +177 -0
  593. chia/protocols/protocol_message_types.py +139 -0
  594. chia/protocols/protocol_state_machine.py +87 -0
  595. chia/protocols/protocol_timing.py +8 -0
  596. chia/protocols/shared_protocol.py +86 -0
  597. chia/protocols/timelord_protocol.py +93 -0
  598. chia/protocols/wallet_protocol.py +401 -0
  599. chia/py.typed +0 -0
  600. chia/rpc/__init__.py +0 -0
  601. chia/rpc/crawler_rpc_api.py +80 -0
  602. chia/rpc/data_layer_rpc_api.py +644 -0
  603. chia/rpc/data_layer_rpc_client.py +188 -0
  604. chia/rpc/data_layer_rpc_util.py +58 -0
  605. chia/rpc/farmer_rpc_api.py +365 -0
  606. chia/rpc/farmer_rpc_client.py +86 -0
  607. chia/rpc/full_node_rpc_api.py +959 -0
  608. chia/rpc/full_node_rpc_client.py +292 -0
  609. chia/rpc/harvester_rpc_api.py +141 -0
  610. chia/rpc/harvester_rpc_client.py +54 -0
  611. chia/rpc/rpc_client.py +164 -0
  612. chia/rpc/rpc_server.py +521 -0
  613. chia/rpc/timelord_rpc_api.py +32 -0
  614. chia/rpc/util.py +93 -0
  615. chia/rpc/wallet_request_types.py +904 -0
  616. chia/rpc/wallet_rpc_api.py +4943 -0
  617. chia/rpc/wallet_rpc_client.py +1814 -0
  618. chia/seeder/__init__.py +0 -0
  619. chia/seeder/crawl_store.py +425 -0
  620. chia/seeder/crawler.py +410 -0
  621. chia/seeder/crawler_api.py +135 -0
  622. chia/seeder/dns_server.py +593 -0
  623. chia/seeder/peer_record.py +146 -0
  624. chia/seeder/start_crawler.py +92 -0
  625. chia/server/__init__.py +0 -0
  626. chia/server/address_manager.py +658 -0
  627. chia/server/address_manager_store.py +237 -0
  628. chia/server/api_protocol.py +116 -0
  629. chia/server/capabilities.py +24 -0
  630. chia/server/chia_policy.py +346 -0
  631. chia/server/introducer_peers.py +76 -0
  632. chia/server/node_discovery.py +714 -0
  633. chia/server/outbound_message.py +33 -0
  634. chia/server/rate_limit_numbers.py +214 -0
  635. chia/server/rate_limits.py +153 -0
  636. chia/server/server.py +741 -0
  637. chia/server/signal_handlers.py +120 -0
  638. chia/server/ssl_context.py +32 -0
  639. chia/server/start_data_layer.py +151 -0
  640. chia/server/start_farmer.py +98 -0
  641. chia/server/start_full_node.py +112 -0
  642. chia/server/start_harvester.py +93 -0
  643. chia/server/start_introducer.py +81 -0
  644. chia/server/start_service.py +316 -0
  645. chia/server/start_timelord.py +89 -0
  646. chia/server/start_wallet.py +113 -0
  647. chia/server/upnp.py +118 -0
  648. chia/server/ws_connection.py +766 -0
  649. chia/simulator/__init__.py +0 -0
  650. chia/simulator/add_blocks_in_batches.py +54 -0
  651. chia/simulator/block_tools.py +2054 -0
  652. chia/simulator/full_node_simulator.py +794 -0
  653. chia/simulator/keyring.py +128 -0
  654. chia/simulator/setup_services.py +506 -0
  655. chia/simulator/simulator_constants.py +13 -0
  656. chia/simulator/simulator_full_node_rpc_api.py +99 -0
  657. chia/simulator/simulator_full_node_rpc_client.py +60 -0
  658. chia/simulator/simulator_protocol.py +29 -0
  659. chia/simulator/simulator_test_tools.py +164 -0
  660. chia/simulator/socket.py +24 -0
  661. chia/simulator/ssl_certs.py +114 -0
  662. chia/simulator/ssl_certs_1.py +697 -0
  663. chia/simulator/ssl_certs_10.py +697 -0
  664. chia/simulator/ssl_certs_2.py +697 -0
  665. chia/simulator/ssl_certs_3.py +697 -0
  666. chia/simulator/ssl_certs_4.py +697 -0
  667. chia/simulator/ssl_certs_5.py +697 -0
  668. chia/simulator/ssl_certs_6.py +697 -0
  669. chia/simulator/ssl_certs_7.py +697 -0
  670. chia/simulator/ssl_certs_8.py +697 -0
  671. chia/simulator/ssl_certs_9.py +697 -0
  672. chia/simulator/start_simulator.py +143 -0
  673. chia/simulator/wallet_tools.py +246 -0
  674. chia/ssl/__init__.py +0 -0
  675. chia/ssl/chia_ca.crt +19 -0
  676. chia/ssl/chia_ca.key +28 -0
  677. chia/ssl/create_ssl.py +249 -0
  678. chia/ssl/dst_root_ca.pem +20 -0
  679. chia/timelord/__init__.py +0 -0
  680. chia/timelord/iters_from_block.py +50 -0
  681. chia/timelord/timelord.py +1226 -0
  682. chia/timelord/timelord_api.py +138 -0
  683. chia/timelord/timelord_launcher.py +190 -0
  684. chia/timelord/timelord_state.py +244 -0
  685. chia/timelord/types.py +22 -0
  686. chia/types/__init__.py +0 -0
  687. chia/types/aliases.py +35 -0
  688. chia/types/block_protocol.py +20 -0
  689. chia/types/blockchain_format/__init__.py +0 -0
  690. chia/types/blockchain_format/classgroup.py +5 -0
  691. chia/types/blockchain_format/coin.py +28 -0
  692. chia/types/blockchain_format/foliage.py +8 -0
  693. chia/types/blockchain_format/pool_target.py +5 -0
  694. chia/types/blockchain_format/program.py +269 -0
  695. chia/types/blockchain_format/proof_of_space.py +135 -0
  696. chia/types/blockchain_format/reward_chain_block.py +6 -0
  697. chia/types/blockchain_format/serialized_program.py +5 -0
  698. chia/types/blockchain_format/sized_bytes.py +11 -0
  699. chia/types/blockchain_format/slots.py +9 -0
  700. chia/types/blockchain_format/sub_epoch_summary.py +5 -0
  701. chia/types/blockchain_format/tree_hash.py +72 -0
  702. chia/types/blockchain_format/vdf.py +86 -0
  703. chia/types/clvm_cost.py +13 -0
  704. chia/types/coin_record.py +43 -0
  705. chia/types/coin_spend.py +115 -0
  706. chia/types/condition_opcodes.py +73 -0
  707. chia/types/condition_with_args.py +16 -0
  708. chia/types/eligible_coin_spends.py +365 -0
  709. chia/types/end_of_slot_bundle.py +5 -0
  710. chia/types/fee_rate.py +38 -0
  711. chia/types/full_block.py +5 -0
  712. chia/types/generator_types.py +13 -0
  713. chia/types/header_block.py +5 -0
  714. chia/types/internal_mempool_item.py +18 -0
  715. chia/types/mempool_inclusion_status.py +9 -0
  716. chia/types/mempool_item.py +85 -0
  717. chia/types/mempool_submission_status.py +30 -0
  718. chia/types/mojos.py +7 -0
  719. chia/types/peer_info.py +64 -0
  720. chia/types/signing_mode.py +29 -0
  721. chia/types/spend_bundle.py +30 -0
  722. chia/types/spend_bundle_conditions.py +7 -0
  723. chia/types/transaction_queue_entry.py +55 -0
  724. chia/types/unfinished_block.py +5 -0
  725. chia/types/unfinished_header_block.py +37 -0
  726. chia/types/validation_state.py +14 -0
  727. chia/types/weight_proof.py +49 -0
  728. chia/util/__init__.py +0 -0
  729. chia/util/action_scope.py +168 -0
  730. chia/util/async_pool.py +226 -0
  731. chia/util/augmented_chain.py +134 -0
  732. chia/util/batches.py +42 -0
  733. chia/util/bech32m.py +126 -0
  734. chia/util/beta_metrics.py +119 -0
  735. chia/util/block_cache.py +56 -0
  736. chia/util/byte_types.py +12 -0
  737. chia/util/check_fork_next_block.py +33 -0
  738. chia/util/chia_logging.py +144 -0
  739. chia/util/chia_version.py +33 -0
  740. chia/util/collection.py +17 -0
  741. chia/util/condition_tools.py +201 -0
  742. chia/util/config.py +367 -0
  743. chia/util/cpu.py +22 -0
  744. chia/util/db_synchronous.py +23 -0
  745. chia/util/db_version.py +32 -0
  746. chia/util/db_wrapper.py +430 -0
  747. chia/util/default_root.py +27 -0
  748. chia/util/dump_keyring.py +93 -0
  749. chia/util/english.txt +2048 -0
  750. chia/util/errors.py +353 -0
  751. chia/util/file_keyring.py +469 -0
  752. chia/util/files.py +97 -0
  753. chia/util/full_block_utils.py +345 -0
  754. chia/util/generator_tools.py +72 -0
  755. chia/util/hash.py +31 -0
  756. chia/util/initial-config.yaml +694 -0
  757. chia/util/inline_executor.py +26 -0
  758. chia/util/ints.py +19 -0
  759. chia/util/ip_address.py +39 -0
  760. chia/util/json_util.py +37 -0
  761. chia/util/keychain.py +676 -0
  762. chia/util/keyring_wrapper.py +327 -0
  763. chia/util/limited_semaphore.py +41 -0
  764. chia/util/lock.py +49 -0
  765. chia/util/log_exceptions.py +32 -0
  766. chia/util/logging.py +36 -0
  767. chia/util/lru_cache.py +31 -0
  768. chia/util/math.py +20 -0
  769. chia/util/network.py +182 -0
  770. chia/util/paginator.py +48 -0
  771. chia/util/path.py +31 -0
  772. chia/util/permissions.py +20 -0
  773. chia/util/prev_transaction_block.py +21 -0
  774. chia/util/priority_mutex.py +95 -0
  775. chia/util/profiler.py +197 -0
  776. chia/util/recursive_replace.py +24 -0
  777. chia/util/safe_cancel_task.py +16 -0
  778. chia/util/service_groups.py +47 -0
  779. chia/util/setproctitle.py +22 -0
  780. chia/util/significant_bits.py +32 -0
  781. chia/util/ssl_check.py +213 -0
  782. chia/util/streamable.py +642 -0
  783. chia/util/task_referencer.py +59 -0
  784. chia/util/task_timing.py +382 -0
  785. chia/util/timing.py +67 -0
  786. chia/util/vdf_prover.py +30 -0
  787. chia/util/virtual_project_analysis.py +540 -0
  788. chia/util/ws_message.py +66 -0
  789. chia/wallet/__init__.py +0 -0
  790. chia/wallet/cat_wallet/__init__.py +0 -0
  791. chia/wallet/cat_wallet/cat_constants.py +75 -0
  792. chia/wallet/cat_wallet/cat_info.py +47 -0
  793. chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
  794. chia/wallet/cat_wallet/cat_utils.py +164 -0
  795. chia/wallet/cat_wallet/cat_wallet.py +855 -0
  796. chia/wallet/cat_wallet/dao_cat_info.py +28 -0
  797. chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
  798. chia/wallet/cat_wallet/lineage_store.py +74 -0
  799. chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
  800. chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
  801. chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
  802. chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
  803. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
  804. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
  805. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
  806. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
  807. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
  808. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
  809. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
  810. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
  811. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
  812. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
  813. chia/wallet/coin_selection.py +188 -0
  814. chia/wallet/conditions.py +1512 -0
  815. chia/wallet/dao_wallet/__init__.py +0 -0
  816. chia/wallet/dao_wallet/dao_info.py +61 -0
  817. chia/wallet/dao_wallet/dao_utils.py +811 -0
  818. chia/wallet/dao_wallet/dao_wallet.py +2119 -0
  819. chia/wallet/db_wallet/__init__.py +0 -0
  820. chia/wallet/db_wallet/db_wallet_puzzles.py +111 -0
  821. chia/wallet/derivation_record.py +30 -0
  822. chia/wallet/derive_keys.py +146 -0
  823. chia/wallet/did_wallet/__init__.py +0 -0
  824. chia/wallet/did_wallet/did_info.py +39 -0
  825. chia/wallet/did_wallet/did_wallet.py +1494 -0
  826. chia/wallet/did_wallet/did_wallet_puzzles.py +221 -0
  827. chia/wallet/did_wallet/puzzles/__init__.py +0 -0
  828. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
  829. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
  830. chia/wallet/driver_protocol.py +26 -0
  831. chia/wallet/key_val_store.py +55 -0
  832. chia/wallet/lineage_proof.py +58 -0
  833. chia/wallet/nft_wallet/__init__.py +0 -0
  834. chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
  835. chia/wallet/nft_wallet/nft_info.py +120 -0
  836. chia/wallet/nft_wallet/nft_puzzles.py +305 -0
  837. chia/wallet/nft_wallet/nft_wallet.py +1687 -0
  838. chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
  839. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  840. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
  841. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
  842. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
  843. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
  844. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
  845. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
  846. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
  847. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
  848. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
  849. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
  850. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
  851. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
  852. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
  853. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
  854. chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
  855. chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
  856. chia/wallet/nft_wallet/uncurry_nft.py +217 -0
  857. chia/wallet/notification_manager.py +117 -0
  858. chia/wallet/notification_store.py +178 -0
  859. chia/wallet/outer_puzzles.py +84 -0
  860. chia/wallet/payment.py +33 -0
  861. chia/wallet/puzzle_drivers.py +118 -0
  862. chia/wallet/puzzles/__init__.py +0 -0
  863. chia/wallet/puzzles/augmented_condition.clsp +13 -0
  864. chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
  865. chia/wallet/puzzles/clawback/__init__.py +0 -0
  866. chia/wallet/puzzles/clawback/drivers.py +188 -0
  867. chia/wallet/puzzles/clawback/metadata.py +38 -0
  868. chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
  869. chia/wallet/puzzles/condition_codes.clib +77 -0
  870. chia/wallet/puzzles/curry-and-treehash.clib +102 -0
  871. chia/wallet/puzzles/curry.clib +135 -0
  872. chia/wallet/puzzles/curry_by_index.clib +16 -0
  873. chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
  874. chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
  875. chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
  876. chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
  877. chia/wallet/puzzles/dao_finished_state.clsp +35 -0
  878. chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
  879. chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
  880. chia/wallet/puzzles/dao_lockup.clsp +288 -0
  881. chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
  882. chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
  883. chia/wallet/puzzles/dao_proposal.clsp +377 -0
  884. chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
  885. chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
  886. chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
  887. chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
  888. chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
  889. chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
  890. chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
  891. chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
  892. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
  893. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
  894. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
  895. chia/wallet/puzzles/dao_treasury.clsp +115 -0
  896. chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
  897. chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
  898. chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
  899. chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
  900. chia/wallet/puzzles/json.clib +25 -0
  901. chia/wallet/puzzles/load_clvm.py +161 -0
  902. chia/wallet/puzzles/merkle_utils.clib +18 -0
  903. chia/wallet/puzzles/notification.clsp +7 -0
  904. chia/wallet/puzzles/notification.clsp.hex +1 -0
  905. chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
  906. chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
  907. chia/wallet/puzzles/p2_conditions.clsp +3 -0
  908. chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
  909. chia/wallet/puzzles/p2_conditions.py +26 -0
  910. chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
  911. chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
  912. chia/wallet/puzzles/p2_delegated_conditions.py +21 -0
  913. chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
  914. chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
  915. chia/wallet/puzzles/p2_delegated_puzzle.py +34 -0
  916. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
  917. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
  918. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +160 -0
  919. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
  920. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
  921. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +21 -0
  922. chia/wallet/puzzles/p2_parent.clsp +19 -0
  923. chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
  924. chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
  925. chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
  926. chia/wallet/puzzles/p2_puzzle_hash.py +27 -0
  927. chia/wallet/puzzles/p2_singleton.clsp +30 -0
  928. chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
  929. chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
  930. chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
  931. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
  932. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
  933. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
  934. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
  935. chia/wallet/puzzles/puzzle_utils.py +34 -0
  936. chia/wallet/puzzles/settlement_payments.clsp +49 -0
  937. chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
  938. chia/wallet/puzzles/sha256tree.clib +11 -0
  939. chia/wallet/puzzles/singleton_launcher.clsp +16 -0
  940. chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
  941. chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
  942. chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
  943. chia/wallet/puzzles/singleton_top_layer.py +296 -0
  944. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
  945. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
  946. chia/wallet/puzzles/singleton_top_layer_v1_1.py +345 -0
  947. chia/wallet/puzzles/singleton_truths.clib +21 -0
  948. chia/wallet/puzzles/tails.py +348 -0
  949. chia/wallet/puzzles/utility_macros.clib +48 -0
  950. chia/wallet/signer_protocol.py +125 -0
  951. chia/wallet/singleton.py +106 -0
  952. chia/wallet/singleton_record.py +30 -0
  953. chia/wallet/trade_manager.py +1102 -0
  954. chia/wallet/trade_record.py +67 -0
  955. chia/wallet/trading/__init__.py +0 -0
  956. chia/wallet/trading/offer.py +702 -0
  957. chia/wallet/trading/trade_status.py +13 -0
  958. chia/wallet/trading/trade_store.py +526 -0
  959. chia/wallet/transaction_record.py +158 -0
  960. chia/wallet/transaction_sorting.py +14 -0
  961. chia/wallet/uncurried_puzzle.py +17 -0
  962. chia/wallet/util/__init__.py +0 -0
  963. chia/wallet/util/address_type.py +55 -0
  964. chia/wallet/util/blind_signer_tl.py +164 -0
  965. chia/wallet/util/clvm_streamable.py +203 -0
  966. chia/wallet/util/compute_hints.py +66 -0
  967. chia/wallet/util/compute_memos.py +43 -0
  968. chia/wallet/util/curry_and_treehash.py +91 -0
  969. chia/wallet/util/debug_spend_bundle.py +232 -0
  970. chia/wallet/util/merkle_tree.py +100 -0
  971. chia/wallet/util/merkle_utils.py +102 -0
  972. chia/wallet/util/new_peak_queue.py +82 -0
  973. chia/wallet/util/notifications.py +12 -0
  974. chia/wallet/util/peer_request_cache.py +174 -0
  975. chia/wallet/util/pprint.py +39 -0
  976. chia/wallet/util/puzzle_compression.py +95 -0
  977. chia/wallet/util/puzzle_decorator.py +100 -0
  978. chia/wallet/util/puzzle_decorator_type.py +7 -0
  979. chia/wallet/util/query_filter.py +59 -0
  980. chia/wallet/util/transaction_type.py +23 -0
  981. chia/wallet/util/tx_config.py +158 -0
  982. chia/wallet/util/wallet_sync_utils.py +351 -0
  983. chia/wallet/util/wallet_types.py +72 -0
  984. chia/wallet/vc_wallet/__init__.py +0 -0
  985. chia/wallet/vc_wallet/cr_cat_drivers.py +664 -0
  986. chia/wallet/vc_wallet/cr_cat_wallet.py +877 -0
  987. chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
  988. chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
  989. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
  990. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
  991. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
  992. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
  993. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
  994. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
  995. chia/wallet/vc_wallet/vc_drivers.py +838 -0
  996. chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
  997. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
  998. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
  999. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
  1000. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
  1001. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
  1002. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
  1003. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
  1004. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
  1005. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
  1006. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
  1007. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
  1008. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
  1009. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
  1010. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
  1011. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
  1012. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
  1013. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
  1014. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
  1015. chia/wallet/vc_wallet/vc_store.py +263 -0
  1016. chia/wallet/vc_wallet/vc_wallet.py +638 -0
  1017. chia/wallet/wallet.py +698 -0
  1018. chia/wallet/wallet_action_scope.py +96 -0
  1019. chia/wallet/wallet_blockchain.py +244 -0
  1020. chia/wallet/wallet_coin_record.py +72 -0
  1021. chia/wallet/wallet_coin_store.py +351 -0
  1022. chia/wallet/wallet_info.py +35 -0
  1023. chia/wallet/wallet_interested_store.py +188 -0
  1024. chia/wallet/wallet_nft_store.py +279 -0
  1025. chia/wallet/wallet_node.py +1765 -0
  1026. chia/wallet/wallet_node_api.py +207 -0
  1027. chia/wallet/wallet_pool_store.py +119 -0
  1028. chia/wallet/wallet_protocol.py +90 -0
  1029. chia/wallet/wallet_puzzle_store.py +396 -0
  1030. chia/wallet/wallet_retry_store.py +70 -0
  1031. chia/wallet/wallet_singleton_store.py +259 -0
  1032. chia/wallet/wallet_spend_bundle.py +25 -0
  1033. chia/wallet/wallet_state_manager.py +2819 -0
  1034. chia/wallet/wallet_transaction_store.py +496 -0
  1035. chia/wallet/wallet_user_store.py +110 -0
  1036. chia/wallet/wallet_weight_proof_handler.py +126 -0
  1037. chia_blockchain-2.5.1rc1.dist-info/LICENSE +201 -0
  1038. chia_blockchain-2.5.1rc1.dist-info/METADATA +156 -0
  1039. chia_blockchain-2.5.1rc1.dist-info/RECORD +1042 -0
  1040. chia_blockchain-2.5.1rc1.dist-info/WHEEL +4 -0
  1041. chia_blockchain-2.5.1rc1.dist-info/entry_points.txt +17 -0
  1042. mozilla-ca/cacert.pem +3611 -0
@@ -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)