chia-blockchain 2.4.4__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 (1028) 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 +197 -0
  7. chia/_tests/blockchain/config.py +4 -0
  8. chia/_tests/blockchain/test_augmented_chain.py +147 -0
  9. chia/_tests/blockchain/test_blockchain.py +4100 -0
  10. chia/_tests/blockchain/test_blockchain_transactions.py +1050 -0
  11. chia/_tests/blockchain/test_build_chains.py +61 -0
  12. chia/_tests/blockchain/test_get_block_generator.py +72 -0
  13. chia/_tests/blockchain/test_lookup_fork_chain.py +195 -0
  14. chia/_tests/build-init-files.py +93 -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 +73 -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 +147 -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 +57 -0
  26. chia/_tests/clvm/test_program.py +150 -0
  27. chia/_tests/clvm/test_puzzle_compression.py +144 -0
  28. chia/_tests/clvm/test_puzzle_drivers.py +45 -0
  29. chia/_tests/clvm/test_puzzles.py +247 -0
  30. chia/_tests/clvm/test_singletons.py +540 -0
  31. chia/_tests/clvm/test_spend_sim.py +181 -0
  32. chia/_tests/cmds/__init__.py +0 -0
  33. chia/_tests/cmds/cmd_test_utils.py +472 -0
  34. chia/_tests/cmds/config.py +3 -0
  35. chia/_tests/cmds/conftest.py +23 -0
  36. chia/_tests/cmds/test_click_types.py +195 -0
  37. chia/_tests/cmds/test_cmd_framework.py +400 -0
  38. chia/_tests/cmds/test_cmds_util.py +97 -0
  39. chia/_tests/cmds/test_daemon.py +92 -0
  40. chia/_tests/cmds/test_farm_cmd.py +67 -0
  41. chia/_tests/cmds/test_show.py +116 -0
  42. chia/_tests/cmds/test_sim.py +207 -0
  43. chia/_tests/cmds/test_timelock_args.py +75 -0
  44. chia/_tests/cmds/test_tx_config_args.py +153 -0
  45. chia/_tests/cmds/testing_classes.py +59 -0
  46. chia/_tests/cmds/wallet/__init__.py +0 -0
  47. chia/_tests/cmds/wallet/test_coins.py +195 -0
  48. chia/_tests/cmds/wallet/test_consts.py +47 -0
  49. chia/_tests/cmds/wallet/test_dao.py +565 -0
  50. chia/_tests/cmds/wallet/test_did.py +403 -0
  51. chia/_tests/cmds/wallet/test_nft.py +470 -0
  52. chia/_tests/cmds/wallet/test_notifications.py +124 -0
  53. chia/_tests/cmds/wallet/test_offer.toffer +1 -0
  54. chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
  55. chia/_tests/cmds/wallet/test_vcs.py +376 -0
  56. chia/_tests/cmds/wallet/test_wallet.py +1126 -0
  57. chia/_tests/cmds/wallet/test_wallet_check.py +111 -0
  58. chia/_tests/conftest.py +1304 -0
  59. chia/_tests/connection_utils.py +124 -0
  60. chia/_tests/core/__init__.py +0 -0
  61. chia/_tests/core/cmds/__init__.py +0 -0
  62. chia/_tests/core/cmds/test_beta.py +382 -0
  63. chia/_tests/core/cmds/test_keys.py +1734 -0
  64. chia/_tests/core/cmds/test_wallet.py +126 -0
  65. chia/_tests/core/config.py +3 -0
  66. chia/_tests/core/consensus/__init__.py +0 -0
  67. chia/_tests/core/consensus/test_block_creation.py +56 -0
  68. chia/_tests/core/consensus/test_pot_iterations.py +117 -0
  69. chia/_tests/core/custom_types/__init__.py +0 -0
  70. chia/_tests/core/custom_types/test_coin.py +109 -0
  71. chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
  72. chia/_tests/core/custom_types/test_spend_bundle.py +71 -0
  73. chia/_tests/core/daemon/__init__.py +0 -0
  74. chia/_tests/core/daemon/config.py +4 -0
  75. chia/_tests/core/daemon/test_daemon.py +2128 -0
  76. chia/_tests/core/daemon/test_daemon_register.py +109 -0
  77. chia/_tests/core/daemon/test_keychain_proxy.py +100 -0
  78. chia/_tests/core/data_layer/__init__.py +0 -0
  79. chia/_tests/core/data_layer/config.py +5 -0
  80. chia/_tests/core/data_layer/conftest.py +105 -0
  81. chia/_tests/core/data_layer/test_data_cli.py +57 -0
  82. chia/_tests/core/data_layer/test_data_layer.py +83 -0
  83. chia/_tests/core/data_layer/test_data_layer_util.py +219 -0
  84. chia/_tests/core/data_layer/test_data_rpc.py +3865 -0
  85. chia/_tests/core/data_layer/test_data_store.py +2423 -0
  86. chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
  87. chia/_tests/core/data_layer/test_plugin.py +91 -0
  88. chia/_tests/core/data_layer/util.py +232 -0
  89. chia/_tests/core/farmer/__init__.py +0 -0
  90. chia/_tests/core/farmer/config.py +3 -0
  91. chia/_tests/core/farmer/test_farmer_api.py +101 -0
  92. chia/_tests/core/full_node/__init__.py +0 -0
  93. chia/_tests/core/full_node/config.py +4 -0
  94. chia/_tests/core/full_node/dos/__init__.py +0 -0
  95. chia/_tests/core/full_node/dos/config.py +3 -0
  96. chia/_tests/core/full_node/full_sync/__init__.py +0 -0
  97. chia/_tests/core/full_node/full_sync/config.py +4 -0
  98. chia/_tests/core/full_node/full_sync/test_full_sync.py +448 -0
  99. chia/_tests/core/full_node/ram_db.py +27 -0
  100. chia/_tests/core/full_node/stores/__init__.py +0 -0
  101. chia/_tests/core/full_node/stores/config.py +4 -0
  102. chia/_tests/core/full_node/stores/test_block_store.py +488 -0
  103. chia/_tests/core/full_node/stores/test_coin_store.py +888 -0
  104. chia/_tests/core/full_node/stores/test_full_node_store.py +1215 -0
  105. chia/_tests/core/full_node/stores/test_hint_store.py +230 -0
  106. chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
  107. chia/_tests/core/full_node/test_address_manager.py +588 -0
  108. chia/_tests/core/full_node/test_block_height_map.py +556 -0
  109. chia/_tests/core/full_node/test_conditions.py +558 -0
  110. chia/_tests/core/full_node/test_full_node.py +2445 -0
  111. chia/_tests/core/full_node/test_generator_tools.py +82 -0
  112. chia/_tests/core/full_node/test_hint_management.py +104 -0
  113. chia/_tests/core/full_node/test_node_load.py +34 -0
  114. chia/_tests/core/full_node/test_performance.py +182 -0
  115. chia/_tests/core/full_node/test_subscriptions.py +492 -0
  116. chia/_tests/core/full_node/test_transactions.py +203 -0
  117. chia/_tests/core/full_node/test_tx_processing_queue.py +154 -0
  118. chia/_tests/core/large_block.py +2388 -0
  119. chia/_tests/core/make_block_generator.py +72 -0
  120. chia/_tests/core/mempool/__init__.py +0 -0
  121. chia/_tests/core/mempool/config.py +4 -0
  122. chia/_tests/core/mempool/test_mempool.py +3180 -0
  123. chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
  124. chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
  125. chia/_tests/core/mempool/test_mempool_item_queries.py +192 -0
  126. chia/_tests/core/mempool/test_mempool_manager.py +2054 -0
  127. chia/_tests/core/mempool/test_mempool_performance.py +65 -0
  128. chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
  129. chia/_tests/core/node_height.py +28 -0
  130. chia/_tests/core/server/__init__.py +0 -0
  131. chia/_tests/core/server/config.py +3 -0
  132. chia/_tests/core/server/flood.py +82 -0
  133. chia/_tests/core/server/serve.py +132 -0
  134. chia/_tests/core/server/test_capabilities.py +68 -0
  135. chia/_tests/core/server/test_dos.py +320 -0
  136. chia/_tests/core/server/test_event_loop.py +109 -0
  137. chia/_tests/core/server/test_loop.py +290 -0
  138. chia/_tests/core/server/test_node_discovery.py +74 -0
  139. chia/_tests/core/server/test_rate_limits.py +370 -0
  140. chia/_tests/core/server/test_server.py +225 -0
  141. chia/_tests/core/server/test_upnp.py +8 -0
  142. chia/_tests/core/services/__init__.py +0 -0
  143. chia/_tests/core/services/config.py +3 -0
  144. chia/_tests/core/services/test_services.py +166 -0
  145. chia/_tests/core/ssl/__init__.py +0 -0
  146. chia/_tests/core/ssl/config.py +3 -0
  147. chia/_tests/core/ssl/test_ssl.py +198 -0
  148. chia/_tests/core/test_coins.py +33 -0
  149. chia/_tests/core/test_cost_calculation.py +314 -0
  150. chia/_tests/core/test_crawler.py +175 -0
  151. chia/_tests/core/test_crawler_rpc.py +53 -0
  152. chia/_tests/core/test_daemon_rpc.py +24 -0
  153. chia/_tests/core/test_db_conversion.py +129 -0
  154. chia/_tests/core/test_db_validation.py +161 -0
  155. chia/_tests/core/test_farmer_harvester_rpc.py +504 -0
  156. chia/_tests/core/test_filter.py +37 -0
  157. chia/_tests/core/test_full_node_rpc.py +794 -0
  158. chia/_tests/core/test_merkle_set.py +343 -0
  159. chia/_tests/core/test_program.py +49 -0
  160. chia/_tests/core/test_rpc_util.py +87 -0
  161. chia/_tests/core/test_seeder.py +308 -0
  162. chia/_tests/core/test_setproctitle.py +13 -0
  163. chia/_tests/core/util/__init__.py +0 -0
  164. chia/_tests/core/util/config.py +4 -0
  165. chia/_tests/core/util/test_block_cache.py +44 -0
  166. chia/_tests/core/util/test_cached_bls.py +57 -0
  167. chia/_tests/core/util/test_config.py +337 -0
  168. chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
  169. chia/_tests/core/util/test_files.py +391 -0
  170. chia/_tests/core/util/test_jsonify.py +146 -0
  171. chia/_tests/core/util/test_keychain.py +514 -0
  172. chia/_tests/core/util/test_keyring_wrapper.py +490 -0
  173. chia/_tests/core/util/test_lockfile.py +380 -0
  174. chia/_tests/core/util/test_log_exceptions.py +187 -0
  175. chia/_tests/core/util/test_lru_cache.py +56 -0
  176. chia/_tests/core/util/test_significant_bits.py +40 -0
  177. chia/_tests/core/util/test_streamable.py +883 -0
  178. chia/_tests/db/__init__.py +0 -0
  179. chia/_tests/db/test_db_wrapper.py +565 -0
  180. chia/_tests/environments/__init__.py +0 -0
  181. chia/_tests/environments/common.py +35 -0
  182. chia/_tests/environments/full_node.py +47 -0
  183. chia/_tests/environments/wallet.py +368 -0
  184. chia/_tests/ether.py +19 -0
  185. chia/_tests/farmer_harvester/__init__.py +0 -0
  186. chia/_tests/farmer_harvester/config.py +3 -0
  187. chia/_tests/farmer_harvester/test_farmer.py +1264 -0
  188. chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
  189. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +130 -0
  190. chia/_tests/farmer_harvester/test_third_party_harvesters.py +501 -0
  191. chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
  192. chia/_tests/fee_estimation/__init__.py +0 -0
  193. chia/_tests/fee_estimation/config.py +3 -0
  194. chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
  195. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
  196. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +145 -0
  197. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
  198. chia/_tests/generator/__init__.py +0 -0
  199. chia/_tests/generator/puzzles/__init__.py +0 -0
  200. chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
  201. chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
  202. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
  203. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
  204. chia/_tests/generator/test_compression.py +218 -0
  205. chia/_tests/generator/test_generator_types.py +44 -0
  206. chia/_tests/generator/test_rom.py +182 -0
  207. chia/_tests/plot_sync/__init__.py +0 -0
  208. chia/_tests/plot_sync/config.py +3 -0
  209. chia/_tests/plot_sync/test_delta.py +102 -0
  210. chia/_tests/plot_sync/test_plot_sync.py +617 -0
  211. chia/_tests/plot_sync/test_receiver.py +451 -0
  212. chia/_tests/plot_sync/test_sender.py +116 -0
  213. chia/_tests/plot_sync/test_sync_simulated.py +450 -0
  214. chia/_tests/plot_sync/util.py +67 -0
  215. chia/_tests/plotting/__init__.py +0 -0
  216. chia/_tests/plotting/config.py +3 -0
  217. chia/_tests/plotting/test_plot_manager.py +738 -0
  218. chia/_tests/plotting/util.py +13 -0
  219. chia/_tests/pools/__init__.py +0 -0
  220. chia/_tests/pools/config.py +5 -0
  221. chia/_tests/pools/test_pool_cmdline.py +23 -0
  222. chia/_tests/pools/test_pool_config.py +44 -0
  223. chia/_tests/pools/test_pool_puzzles_lifecycle.py +398 -0
  224. chia/_tests/pools/test_pool_rpc.py +1010 -0
  225. chia/_tests/pools/test_pool_wallet.py +201 -0
  226. chia/_tests/pools/test_wallet_pool_store.py +161 -0
  227. chia/_tests/process_junit.py +349 -0
  228. chia/_tests/rpc/__init__.py +0 -0
  229. chia/_tests/rpc/test_rpc_client.py +81 -0
  230. chia/_tests/simulation/__init__.py +0 -0
  231. chia/_tests/simulation/config.py +6 -0
  232. chia/_tests/simulation/test_simulation.py +501 -0
  233. chia/_tests/simulation/test_simulator.py +234 -0
  234. chia/_tests/simulation/test_start_simulator.py +106 -0
  235. chia/_tests/testconfig.py +13 -0
  236. chia/_tests/timelord/__init__.py +0 -0
  237. chia/_tests/timelord/config.py +3 -0
  238. chia/_tests/timelord/test_new_peak.py +437 -0
  239. chia/_tests/timelord/test_timelord.py +11 -0
  240. chia/_tests/tools/1315537.json +170 -0
  241. chia/_tests/tools/1315544.json +160 -0
  242. chia/_tests/tools/1315630.json +150 -0
  243. chia/_tests/tools/300000.json +105 -0
  244. chia/_tests/tools/442734.json +140 -0
  245. chia/_tests/tools/466212.json +130 -0
  246. chia/_tests/tools/__init__.py +0 -0
  247. chia/_tests/tools/config.py +5 -0
  248. chia/_tests/tools/test-blockchain-db.sqlite +0 -0
  249. chia/_tests/tools/test_full_sync.py +30 -0
  250. chia/_tests/tools/test_legacy_keyring.py +82 -0
  251. chia/_tests/tools/test_run_block.py +129 -0
  252. chia/_tests/util/__init__.py +0 -0
  253. chia/_tests/util/benchmark_cost.py +170 -0
  254. chia/_tests/util/benchmarks.py +154 -0
  255. chia/_tests/util/bip39_test_vectors.json +148 -0
  256. chia/_tests/util/blockchain.py +133 -0
  257. chia/_tests/util/blockchain_mock.py +132 -0
  258. chia/_tests/util/build_network_protocol_files.py +302 -0
  259. chia/_tests/util/clvm_generator.bin +0 -0
  260. chia/_tests/util/config.py +3 -0
  261. chia/_tests/util/constants.py +20 -0
  262. chia/_tests/util/db_connection.py +36 -0
  263. chia/_tests/util/full_sync.py +245 -0
  264. chia/_tests/util/gen_ssl_certs.py +115 -0
  265. chia/_tests/util/generator_tools_testing.py +47 -0
  266. chia/_tests/util/key_tool.py +37 -0
  267. chia/_tests/util/misc.py +722 -0
  268. chia/_tests/util/network_protocol_data.py +1074 -0
  269. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  270. chia/_tests/util/protocol_messages_json.py +2700 -0
  271. chia/_tests/util/rpc.py +23 -0
  272. chia/_tests/util/run_block.py +163 -0
  273. chia/_tests/util/setup_nodes.py +479 -0
  274. chia/_tests/util/split_managers.py +99 -0
  275. chia/_tests/util/temp_file.py +14 -0
  276. chia/_tests/util/test_action_scope.py +143 -0
  277. chia/_tests/util/test_async_pool.py +366 -0
  278. chia/_tests/util/test_build_job_matrix.py +43 -0
  279. chia/_tests/util/test_build_network_protocol_files.py +7 -0
  280. chia/_tests/util/test_chia_version.py +50 -0
  281. chia/_tests/util/test_collection.py +11 -0
  282. chia/_tests/util/test_condition_tools.py +231 -0
  283. chia/_tests/util/test_config.py +426 -0
  284. chia/_tests/util/test_dump_keyring.py +60 -0
  285. chia/_tests/util/test_errors.py +10 -0
  286. chia/_tests/util/test_full_block_utils.py +271 -0
  287. chia/_tests/util/test_installed.py +20 -0
  288. chia/_tests/util/test_limited_semaphore.py +52 -0
  289. chia/_tests/util/test_logging_filter.py +43 -0
  290. chia/_tests/util/test_misc.py +444 -0
  291. chia/_tests/util/test_network.py +74 -0
  292. chia/_tests/util/test_network_protocol_files.py +579 -0
  293. chia/_tests/util/test_network_protocol_json.py +266 -0
  294. chia/_tests/util/test_network_protocol_test.py +257 -0
  295. chia/_tests/util/test_paginator.py +72 -0
  296. chia/_tests/util/test_pprint.py +17 -0
  297. chia/_tests/util/test_priority_mutex.py +487 -0
  298. chia/_tests/util/test_recursive_replace.py +116 -0
  299. chia/_tests/util/test_replace_str_to_bytes.py +137 -0
  300. chia/_tests/util/test_service_groups.py +15 -0
  301. chia/_tests/util/test_ssl_check.py +31 -0
  302. chia/_tests/util/test_testnet_overrides.py +19 -0
  303. chia/_tests/util/test_tests_misc.py +38 -0
  304. chia/_tests/util/test_timing.py +37 -0
  305. chia/_tests/util/test_trusted_peer.py +51 -0
  306. chia/_tests/util/time_out_assert.py +154 -0
  307. chia/_tests/wallet/__init__.py +0 -0
  308. chia/_tests/wallet/cat_wallet/__init__.py +0 -0
  309. chia/_tests/wallet/cat_wallet/config.py +4 -0
  310. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
  311. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
  312. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1738 -0
  313. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
  314. chia/_tests/wallet/cat_wallet/test_trades.py +2578 -0
  315. chia/_tests/wallet/clawback/__init__.py +0 -0
  316. chia/_tests/wallet/clawback/config.py +3 -0
  317. chia/_tests/wallet/clawback/test_clawback_decorator.py +80 -0
  318. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
  319. chia/_tests/wallet/clawback/test_clawback_metadata.py +51 -0
  320. chia/_tests/wallet/config.py +4 -0
  321. chia/_tests/wallet/conftest.py +217 -0
  322. chia/_tests/wallet/dao_wallet/__init__.py +0 -0
  323. chia/_tests/wallet/dao_wallet/config.py +3 -0
  324. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1322 -0
  325. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
  326. chia/_tests/wallet/db_wallet/__init__.py +0 -0
  327. chia/_tests/wallet/db_wallet/config.py +3 -0
  328. chia/_tests/wallet/db_wallet/test_db_graftroot.py +143 -0
  329. chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
  330. chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
  331. chia/_tests/wallet/did_wallet/__init__.py +0 -0
  332. chia/_tests/wallet/did_wallet/config.py +4 -0
  333. chia/_tests/wallet/did_wallet/test_did.py +1481 -0
  334. chia/_tests/wallet/nft_wallet/__init__.py +0 -0
  335. chia/_tests/wallet/nft_wallet/config.py +4 -0
  336. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1492 -0
  337. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1014 -0
  338. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +376 -0
  339. chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
  340. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
  341. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2558 -0
  342. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
  343. chia/_tests/wallet/rpc/__init__.py +0 -0
  344. chia/_tests/wallet/rpc/config.py +4 -0
  345. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +287 -0
  346. chia/_tests/wallet/rpc/test_wallet_rpc.py +3106 -0
  347. chia/_tests/wallet/simple_sync/__init__.py +0 -0
  348. chia/_tests/wallet/simple_sync/config.py +3 -0
  349. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +719 -0
  350. chia/_tests/wallet/sync/__init__.py +0 -0
  351. chia/_tests/wallet/sync/config.py +4 -0
  352. chia/_tests/wallet/sync/test_wallet_sync.py +1529 -0
  353. chia/_tests/wallet/test_address_type.py +189 -0
  354. chia/_tests/wallet/test_bech32m.py +45 -0
  355. chia/_tests/wallet/test_clvm_streamable.py +244 -0
  356. chia/_tests/wallet/test_coin_selection.py +589 -0
  357. chia/_tests/wallet/test_conditions.py +388 -0
  358. chia/_tests/wallet/test_debug_spend_bundle.py +76 -0
  359. chia/_tests/wallet/test_new_wallet_protocol.py +1176 -0
  360. chia/_tests/wallet/test_nft_store.py +193 -0
  361. chia/_tests/wallet/test_notifications.py +196 -0
  362. chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
  363. chia/_tests/wallet/test_puzzle_store.py +133 -0
  364. chia/_tests/wallet/test_sign_coin_spends.py +159 -0
  365. chia/_tests/wallet/test_signer_protocol.py +948 -0
  366. chia/_tests/wallet/test_singleton.py +122 -0
  367. chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
  368. chia/_tests/wallet/test_singleton_store.py +152 -0
  369. chia/_tests/wallet/test_taproot.py +19 -0
  370. chia/_tests/wallet/test_transaction_store.py +941 -0
  371. chia/_tests/wallet/test_util.py +181 -0
  372. chia/_tests/wallet/test_wallet.py +2139 -0
  373. chia/_tests/wallet/test_wallet_action_scope.py +85 -0
  374. chia/_tests/wallet/test_wallet_blockchain.py +113 -0
  375. chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
  376. chia/_tests/wallet/test_wallet_interested_store.py +43 -0
  377. chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
  378. chia/_tests/wallet/test_wallet_node.py +783 -0
  379. chia/_tests/wallet/test_wallet_retry.py +95 -0
  380. chia/_tests/wallet/test_wallet_state_manager.py +252 -0
  381. chia/_tests/wallet/test_wallet_test_framework.py +275 -0
  382. chia/_tests/wallet/test_wallet_trade_store.py +218 -0
  383. chia/_tests/wallet/test_wallet_user_store.py +34 -0
  384. chia/_tests/wallet/test_wallet_utils.py +155 -0
  385. chia/_tests/wallet/vc_wallet/__init__.py +0 -0
  386. chia/_tests/wallet/vc_wallet/config.py +3 -0
  387. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
  388. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
  389. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +801 -0
  390. chia/_tests/wallet/wallet_block_tools.py +327 -0
  391. chia/_tests/weight_proof/__init__.py +0 -0
  392. chia/_tests/weight_proof/config.py +3 -0
  393. chia/_tests/weight_proof/test_weight_proof.py +528 -0
  394. chia/clvm/__init__.py +0 -0
  395. chia/clvm/spend_sim.py +488 -0
  396. chia/cmds/__init__.py +0 -0
  397. chia/cmds/beta.py +183 -0
  398. chia/cmds/beta_funcs.py +133 -0
  399. chia/cmds/check_wallet_db.py +418 -0
  400. chia/cmds/chia.py +143 -0
  401. chia/cmds/cmd_classes.py +315 -0
  402. chia/cmds/cmds_util.py +498 -0
  403. chia/cmds/coin_funcs.py +260 -0
  404. chia/cmds/coins.py +220 -0
  405. chia/cmds/completion.py +49 -0
  406. chia/cmds/configure.py +331 -0
  407. chia/cmds/dao.py +1008 -0
  408. chia/cmds/dao_funcs.py +576 -0
  409. chia/cmds/data.py +707 -0
  410. chia/cmds/data_funcs.py +380 -0
  411. chia/cmds/db.py +86 -0
  412. chia/cmds/db_backup_func.py +77 -0
  413. chia/cmds/db_upgrade_func.py +452 -0
  414. chia/cmds/db_validate_func.py +184 -0
  415. chia/cmds/dev.py +16 -0
  416. chia/cmds/farm.py +87 -0
  417. chia/cmds/farm_funcs.py +207 -0
  418. chia/cmds/init.py +70 -0
  419. chia/cmds/init_funcs.py +367 -0
  420. chia/cmds/installers.py +129 -0
  421. chia/cmds/keys.py +510 -0
  422. chia/cmds/keys_funcs.py +864 -0
  423. chia/cmds/netspace.py +47 -0
  424. chia/cmds/netspace_funcs.py +53 -0
  425. chia/cmds/options.py +32 -0
  426. chia/cmds/param_types.py +228 -0
  427. chia/cmds/passphrase.py +130 -0
  428. chia/cmds/passphrase_funcs.py +346 -0
  429. chia/cmds/peer.py +50 -0
  430. chia/cmds/peer_funcs.py +129 -0
  431. chia/cmds/plotnft.py +206 -0
  432. chia/cmds/plotnft_funcs.py +374 -0
  433. chia/cmds/plots.py +222 -0
  434. chia/cmds/plotters.py +17 -0
  435. chia/cmds/rpc.py +188 -0
  436. chia/cmds/show.py +71 -0
  437. chia/cmds/show_funcs.py +214 -0
  438. chia/cmds/signer.py +304 -0
  439. chia/cmds/sim.py +217 -0
  440. chia/cmds/sim_funcs.py +509 -0
  441. chia/cmds/start.py +24 -0
  442. chia/cmds/start_funcs.py +112 -0
  443. chia/cmds/stop.py +61 -0
  444. chia/cmds/units.py +11 -0
  445. chia/cmds/wallet.py +1745 -0
  446. chia/cmds/wallet_funcs.py +1800 -0
  447. chia/consensus/__init__.py +0 -0
  448. chia/consensus/block_body_validation.py +515 -0
  449. chia/consensus/block_creation.py +525 -0
  450. chia/consensus/block_header_validation.py +1064 -0
  451. chia/consensus/block_record.py +32 -0
  452. chia/consensus/block_rewards.py +53 -0
  453. chia/consensus/block_root_validation.py +46 -0
  454. chia/consensus/blockchain.py +1100 -0
  455. chia/consensus/blockchain_interface.py +56 -0
  456. chia/consensus/coinbase.py +30 -0
  457. chia/consensus/condition_costs.py +9 -0
  458. chia/consensus/constants.py +49 -0
  459. chia/consensus/cost_calculator.py +15 -0
  460. chia/consensus/default_constants.py +90 -0
  461. chia/consensus/deficit.py +55 -0
  462. chia/consensus/difficulty_adjustment.py +412 -0
  463. chia/consensus/find_fork_point.py +111 -0
  464. chia/consensus/full_block_to_block_record.py +167 -0
  465. chia/consensus/get_block_challenge.py +106 -0
  466. chia/consensus/get_block_generator.py +26 -0
  467. chia/consensus/make_sub_epoch_summary.py +210 -0
  468. chia/consensus/multiprocess_validation.py +365 -0
  469. chia/consensus/pos_quality.py +19 -0
  470. chia/consensus/pot_iterations.py +67 -0
  471. chia/consensus/puzzles/__init__.py +0 -0
  472. chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
  473. chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
  474. chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
  475. chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
  476. chia/consensus/vdf_info_computation.py +156 -0
  477. chia/daemon/__init__.py +0 -0
  478. chia/daemon/client.py +233 -0
  479. chia/daemon/keychain_proxy.py +501 -0
  480. chia/daemon/keychain_server.py +365 -0
  481. chia/daemon/server.py +1616 -0
  482. chia/daemon/windows_signal.py +56 -0
  483. chia/data_layer/__init__.py +0 -0
  484. chia/data_layer/data_layer.py +1303 -0
  485. chia/data_layer/data_layer_api.py +25 -0
  486. chia/data_layer/data_layer_errors.py +50 -0
  487. chia/data_layer/data_layer_server.py +170 -0
  488. chia/data_layer/data_layer_util.py +985 -0
  489. chia/data_layer/data_layer_wallet.py +1315 -0
  490. chia/data_layer/data_store.py +2267 -0
  491. chia/data_layer/dl_wallet_store.py +407 -0
  492. chia/data_layer/download_data.py +389 -0
  493. chia/data_layer/puzzles/__init__.py +0 -0
  494. chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
  495. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
  496. chia/data_layer/s3_plugin_config.yml +33 -0
  497. chia/data_layer/s3_plugin_service.py +468 -0
  498. chia/data_layer/util/__init__.py +0 -0
  499. chia/data_layer/util/benchmark.py +108 -0
  500. chia/data_layer/util/plugin.py +41 -0
  501. chia/farmer/__init__.py +0 -0
  502. chia/farmer/farmer.py +920 -0
  503. chia/farmer/farmer_api.py +814 -0
  504. chia/full_node/__init__.py +0 -0
  505. chia/full_node/bitcoin_fee_estimator.py +85 -0
  506. chia/full_node/block_height_map.py +271 -0
  507. chia/full_node/block_store.py +570 -0
  508. chia/full_node/bundle_tools.py +19 -0
  509. chia/full_node/coin_store.py +646 -0
  510. chia/full_node/fee_estimate.py +54 -0
  511. chia/full_node/fee_estimate_store.py +24 -0
  512. chia/full_node/fee_estimation.py +93 -0
  513. chia/full_node/fee_estimator.py +90 -0
  514. chia/full_node/fee_estimator_constants.py +38 -0
  515. chia/full_node/fee_estimator_interface.py +42 -0
  516. chia/full_node/fee_history.py +26 -0
  517. chia/full_node/fee_tracker.py +564 -0
  518. chia/full_node/full_node.py +3052 -0
  519. chia/full_node/full_node_api.py +1974 -0
  520. chia/full_node/full_node_store.py +1033 -0
  521. chia/full_node/hint_management.py +56 -0
  522. chia/full_node/hint_store.py +94 -0
  523. chia/full_node/mempool.py +583 -0
  524. chia/full_node/mempool_check_conditions.py +177 -0
  525. chia/full_node/mempool_manager.py +858 -0
  526. chia/full_node/pending_tx_cache.py +112 -0
  527. chia/full_node/puzzles/__init__.py +0 -0
  528. chia/full_node/puzzles/block_program_zero.clsp +14 -0
  529. chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
  530. chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
  531. chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
  532. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
  533. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
  534. chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
  535. chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
  536. chia/full_node/signage_point.py +16 -0
  537. chia/full_node/subscriptions.py +248 -0
  538. chia/full_node/sync_store.py +145 -0
  539. chia/full_node/tx_processing_queue.py +78 -0
  540. chia/full_node/weight_proof.py +1719 -0
  541. chia/harvester/__init__.py +0 -0
  542. chia/harvester/harvester.py +271 -0
  543. chia/harvester/harvester_api.py +374 -0
  544. chia/introducer/__init__.py +0 -0
  545. chia/introducer/introducer.py +120 -0
  546. chia/introducer/introducer_api.py +64 -0
  547. chia/legacy/__init__.py +0 -0
  548. chia/legacy/keyring.py +154 -0
  549. chia/plot_sync/__init__.py +0 -0
  550. chia/plot_sync/delta.py +61 -0
  551. chia/plot_sync/exceptions.py +56 -0
  552. chia/plot_sync/receiver.py +385 -0
  553. chia/plot_sync/sender.py +337 -0
  554. chia/plot_sync/util.py +43 -0
  555. chia/plotters/__init__.py +0 -0
  556. chia/plotters/bladebit.py +388 -0
  557. chia/plotters/chiapos.py +63 -0
  558. chia/plotters/madmax.py +224 -0
  559. chia/plotters/plotters.py +577 -0
  560. chia/plotters/plotters_util.py +131 -0
  561. chia/plotting/__init__.py +0 -0
  562. chia/plotting/cache.py +212 -0
  563. chia/plotting/check_plots.py +283 -0
  564. chia/plotting/create_plots.py +278 -0
  565. chia/plotting/manager.py +436 -0
  566. chia/plotting/util.py +324 -0
  567. chia/pools/__init__.py +0 -0
  568. chia/pools/pool_config.py +110 -0
  569. chia/pools/pool_puzzles.py +459 -0
  570. chia/pools/pool_wallet.py +926 -0
  571. chia/pools/pool_wallet_info.py +118 -0
  572. chia/pools/puzzles/__init__.py +0 -0
  573. chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
  574. chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
  575. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
  576. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
  577. chia/protocols/__init__.py +0 -0
  578. chia/protocols/farmer_protocol.py +102 -0
  579. chia/protocols/full_node_protocol.py +219 -0
  580. chia/protocols/harvester_protocol.py +216 -0
  581. chia/protocols/introducer_protocol.py +26 -0
  582. chia/protocols/pool_protocol.py +177 -0
  583. chia/protocols/protocol_message_types.py +139 -0
  584. chia/protocols/protocol_state_machine.py +87 -0
  585. chia/protocols/protocol_timing.py +7 -0
  586. chia/protocols/shared_protocol.py +86 -0
  587. chia/protocols/timelord_protocol.py +93 -0
  588. chia/protocols/wallet_protocol.py +401 -0
  589. chia/py.typed +0 -0
  590. chia/rpc/__init__.py +0 -0
  591. chia/rpc/crawler_rpc_api.py +75 -0
  592. chia/rpc/data_layer_rpc_api.py +639 -0
  593. chia/rpc/data_layer_rpc_client.py +188 -0
  594. chia/rpc/data_layer_rpc_util.py +62 -0
  595. chia/rpc/farmer_rpc_api.py +360 -0
  596. chia/rpc/farmer_rpc_client.py +86 -0
  597. chia/rpc/full_node_rpc_api.py +954 -0
  598. chia/rpc/full_node_rpc_client.py +292 -0
  599. chia/rpc/harvester_rpc_api.py +136 -0
  600. chia/rpc/harvester_rpc_client.py +54 -0
  601. chia/rpc/rpc_client.py +144 -0
  602. chia/rpc/rpc_server.py +447 -0
  603. chia/rpc/timelord_rpc_api.py +27 -0
  604. chia/rpc/util.py +293 -0
  605. chia/rpc/wallet_request_types.py +688 -0
  606. chia/rpc/wallet_rpc_api.py +4779 -0
  607. chia/rpc/wallet_rpc_client.py +1844 -0
  608. chia/seeder/__init__.py +0 -0
  609. chia/seeder/crawl_store.py +427 -0
  610. chia/seeder/crawler.py +423 -0
  611. chia/seeder/crawler_api.py +129 -0
  612. chia/seeder/dns_server.py +544 -0
  613. chia/seeder/peer_record.py +146 -0
  614. chia/seeder/start_crawler.py +88 -0
  615. chia/server/__init__.py +0 -0
  616. chia/server/address_manager.py +658 -0
  617. chia/server/address_manager_store.py +237 -0
  618. chia/server/api_protocol.py +11 -0
  619. chia/server/capabilities.py +24 -0
  620. chia/server/chia_policy.py +345 -0
  621. chia/server/introducer_peers.py +76 -0
  622. chia/server/node_discovery.py +718 -0
  623. chia/server/outbound_message.py +33 -0
  624. chia/server/rate_limit_numbers.py +204 -0
  625. chia/server/rate_limits.py +113 -0
  626. chia/server/server.py +720 -0
  627. chia/server/signal_handlers.py +117 -0
  628. chia/server/ssl_context.py +32 -0
  629. chia/server/start_data_layer.py +137 -0
  630. chia/server/start_farmer.py +86 -0
  631. chia/server/start_full_node.py +106 -0
  632. chia/server/start_harvester.py +80 -0
  633. chia/server/start_introducer.py +69 -0
  634. chia/server/start_service.py +328 -0
  635. chia/server/start_timelord.py +82 -0
  636. chia/server/start_wallet.py +109 -0
  637. chia/server/upnp.py +117 -0
  638. chia/server/ws_connection.py +752 -0
  639. chia/simulator/__init__.py +0 -0
  640. chia/simulator/block_tools.py +2053 -0
  641. chia/simulator/full_node_simulator.py +802 -0
  642. chia/simulator/keyring.py +128 -0
  643. chia/simulator/setup_services.py +505 -0
  644. chia/simulator/simulator_constants.py +13 -0
  645. chia/simulator/simulator_full_node_rpc_api.py +101 -0
  646. chia/simulator/simulator_full_node_rpc_client.py +62 -0
  647. chia/simulator/simulator_protocol.py +29 -0
  648. chia/simulator/simulator_test_tools.py +163 -0
  649. chia/simulator/socket.py +27 -0
  650. chia/simulator/ssl_certs.py +114 -0
  651. chia/simulator/ssl_certs_1.py +699 -0
  652. chia/simulator/ssl_certs_10.py +699 -0
  653. chia/simulator/ssl_certs_2.py +699 -0
  654. chia/simulator/ssl_certs_3.py +699 -0
  655. chia/simulator/ssl_certs_4.py +699 -0
  656. chia/simulator/ssl_certs_5.py +699 -0
  657. chia/simulator/ssl_certs_6.py +699 -0
  658. chia/simulator/ssl_certs_7.py +699 -0
  659. chia/simulator/ssl_certs_8.py +699 -0
  660. chia/simulator/ssl_certs_9.py +699 -0
  661. chia/simulator/start_simulator.py +135 -0
  662. chia/simulator/wallet_tools.py +245 -0
  663. chia/ssl/__init__.py +0 -0
  664. chia/ssl/chia_ca.crt +19 -0
  665. chia/ssl/chia_ca.key +28 -0
  666. chia/ssl/create_ssl.py +249 -0
  667. chia/ssl/dst_root_ca.pem +20 -0
  668. chia/timelord/__init__.py +0 -0
  669. chia/timelord/iters_from_block.py +50 -0
  670. chia/timelord/timelord.py +1202 -0
  671. chia/timelord/timelord_api.py +132 -0
  672. chia/timelord/timelord_launcher.py +188 -0
  673. chia/timelord/timelord_state.py +244 -0
  674. chia/timelord/types.py +22 -0
  675. chia/types/__init__.py +0 -0
  676. chia/types/aliases.py +35 -0
  677. chia/types/block_protocol.py +20 -0
  678. chia/types/blockchain_format/__init__.py +0 -0
  679. chia/types/blockchain_format/classgroup.py +5 -0
  680. chia/types/blockchain_format/coin.py +28 -0
  681. chia/types/blockchain_format/foliage.py +8 -0
  682. chia/types/blockchain_format/pool_target.py +5 -0
  683. chia/types/blockchain_format/program.py +270 -0
  684. chia/types/blockchain_format/proof_of_space.py +135 -0
  685. chia/types/blockchain_format/reward_chain_block.py +6 -0
  686. chia/types/blockchain_format/serialized_program.py +5 -0
  687. chia/types/blockchain_format/sized_bytes.py +11 -0
  688. chia/types/blockchain_format/slots.py +9 -0
  689. chia/types/blockchain_format/sub_epoch_summary.py +5 -0
  690. chia/types/blockchain_format/tree_hash.py +72 -0
  691. chia/types/blockchain_format/vdf.py +86 -0
  692. chia/types/clvm_cost.py +13 -0
  693. chia/types/coin_record.py +43 -0
  694. chia/types/coin_spend.py +115 -0
  695. chia/types/condition_opcodes.py +73 -0
  696. chia/types/condition_with_args.py +17 -0
  697. chia/types/eligible_coin_spends.py +364 -0
  698. chia/types/end_of_slot_bundle.py +5 -0
  699. chia/types/fee_rate.py +38 -0
  700. chia/types/full_block.py +5 -0
  701. chia/types/generator_types.py +14 -0
  702. chia/types/header_block.py +5 -0
  703. chia/types/internal_mempool_item.py +19 -0
  704. chia/types/mempool_inclusion_status.py +9 -0
  705. chia/types/mempool_item.py +85 -0
  706. chia/types/mempool_submission_status.py +30 -0
  707. chia/types/mojos.py +7 -0
  708. chia/types/peer_info.py +64 -0
  709. chia/types/signing_mode.py +29 -0
  710. chia/types/spend_bundle.py +31 -0
  711. chia/types/spend_bundle_conditions.py +7 -0
  712. chia/types/transaction_queue_entry.py +55 -0
  713. chia/types/unfinished_block.py +5 -0
  714. chia/types/unfinished_header_block.py +37 -0
  715. chia/types/weight_proof.py +50 -0
  716. chia/util/__init__.py +0 -0
  717. chia/util/action_scope.py +168 -0
  718. chia/util/api_decorators.py +89 -0
  719. chia/util/async_pool.py +224 -0
  720. chia/util/augmented_chain.py +130 -0
  721. chia/util/batches.py +39 -0
  722. chia/util/bech32m.py +123 -0
  723. chia/util/beta_metrics.py +118 -0
  724. chia/util/block_cache.py +56 -0
  725. chia/util/byte_types.py +10 -0
  726. chia/util/check_fork_next_block.py +32 -0
  727. chia/util/chia_logging.py +124 -0
  728. chia/util/chia_version.py +33 -0
  729. chia/util/collection.py +17 -0
  730. chia/util/condition_tools.py +201 -0
  731. chia/util/config.py +366 -0
  732. chia/util/cpu.py +20 -0
  733. chia/util/db_synchronous.py +21 -0
  734. chia/util/db_version.py +30 -0
  735. chia/util/db_wrapper.py +427 -0
  736. chia/util/default_root.py +10 -0
  737. chia/util/dump_keyring.py +93 -0
  738. chia/util/english.txt +2048 -0
  739. chia/util/errors.py +351 -0
  740. chia/util/file_keyring.py +480 -0
  741. chia/util/files.py +95 -0
  742. chia/util/full_block_utils.py +321 -0
  743. chia/util/generator_tools.py +62 -0
  744. chia/util/hash.py +29 -0
  745. chia/util/initial-config.yaml +675 -0
  746. chia/util/inline_executor.py +24 -0
  747. chia/util/ints.py +19 -0
  748. chia/util/json_util.py +41 -0
  749. chia/util/keychain.py +673 -0
  750. chia/util/keyring_wrapper.py +266 -0
  751. chia/util/limited_semaphore.py +39 -0
  752. chia/util/lock.py +47 -0
  753. chia/util/log_exceptions.py +29 -0
  754. chia/util/logging.py +34 -0
  755. chia/util/lru_cache.py +29 -0
  756. chia/util/math.py +20 -0
  757. chia/util/network.py +240 -0
  758. chia/util/paginator.py +46 -0
  759. chia/util/path.py +29 -0
  760. chia/util/permissions.py +19 -0
  761. chia/util/pprint.py +40 -0
  762. chia/util/prev_transaction_block.py +23 -0
  763. chia/util/priority_mutex.py +92 -0
  764. chia/util/profiler.py +194 -0
  765. chia/util/recursive_replace.py +22 -0
  766. chia/util/safe_cancel_task.py +14 -0
  767. chia/util/service_groups.py +47 -0
  768. chia/util/setproctitle.py +20 -0
  769. chia/util/significant_bits.py +30 -0
  770. chia/util/ssl_check.py +213 -0
  771. chia/util/streamable.py +654 -0
  772. chia/util/task_timing.py +378 -0
  773. chia/util/timing.py +64 -0
  774. chia/util/vdf_prover.py +31 -0
  775. chia/util/ws_message.py +66 -0
  776. chia/wallet/__init__.py +0 -0
  777. chia/wallet/cat_wallet/__init__.py +0 -0
  778. chia/wallet/cat_wallet/cat_constants.py +75 -0
  779. chia/wallet/cat_wallet/cat_info.py +47 -0
  780. chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
  781. chia/wallet/cat_wallet/cat_utils.py +163 -0
  782. chia/wallet/cat_wallet/cat_wallet.py +869 -0
  783. chia/wallet/cat_wallet/dao_cat_info.py +28 -0
  784. chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
  785. chia/wallet/cat_wallet/lineage_store.py +74 -0
  786. chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
  787. chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
  788. chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
  789. chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
  790. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
  791. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
  792. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
  793. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
  794. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
  795. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
  796. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
  797. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
  798. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
  799. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
  800. chia/wallet/coin_selection.py +188 -0
  801. chia/wallet/conditions.py +1326 -0
  802. chia/wallet/dao_wallet/__init__.py +0 -0
  803. chia/wallet/dao_wallet/dao_info.py +61 -0
  804. chia/wallet/dao_wallet/dao_utils.py +810 -0
  805. chia/wallet/dao_wallet/dao_wallet.py +2121 -0
  806. chia/wallet/db_wallet/__init__.py +0 -0
  807. chia/wallet/db_wallet/db_wallet_puzzles.py +107 -0
  808. chia/wallet/derivation_record.py +30 -0
  809. chia/wallet/derive_keys.py +146 -0
  810. chia/wallet/did_wallet/__init__.py +0 -0
  811. chia/wallet/did_wallet/did_info.py +39 -0
  812. chia/wallet/did_wallet/did_wallet.py +1485 -0
  813. chia/wallet/did_wallet/did_wallet_puzzles.py +220 -0
  814. chia/wallet/did_wallet/puzzles/__init__.py +0 -0
  815. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
  816. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
  817. chia/wallet/driver_protocol.py +26 -0
  818. chia/wallet/key_val_store.py +55 -0
  819. chia/wallet/lineage_proof.py +58 -0
  820. chia/wallet/nft_wallet/__init__.py +0 -0
  821. chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
  822. chia/wallet/nft_wallet/nft_info.py +120 -0
  823. chia/wallet/nft_wallet/nft_puzzles.py +305 -0
  824. chia/wallet/nft_wallet/nft_wallet.py +1686 -0
  825. chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
  826. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  827. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
  828. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
  829. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
  830. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
  831. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
  832. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
  833. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
  834. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
  835. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
  836. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
  837. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
  838. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
  839. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
  840. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
  841. chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
  842. chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
  843. chia/wallet/nft_wallet/uncurry_nft.py +217 -0
  844. chia/wallet/notification_manager.py +117 -0
  845. chia/wallet/notification_store.py +178 -0
  846. chia/wallet/outer_puzzles.py +84 -0
  847. chia/wallet/payment.py +34 -0
  848. chia/wallet/puzzle_drivers.py +118 -0
  849. chia/wallet/puzzles/__init__.py +0 -0
  850. chia/wallet/puzzles/augmented_condition.clsp +13 -0
  851. chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
  852. chia/wallet/puzzles/clawback/__init__.py +0 -0
  853. chia/wallet/puzzles/clawback/drivers.py +188 -0
  854. chia/wallet/puzzles/clawback/metadata.py +38 -0
  855. chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
  856. chia/wallet/puzzles/condition_codes.clib +77 -0
  857. chia/wallet/puzzles/curry-and-treehash.clib +102 -0
  858. chia/wallet/puzzles/curry.clib +135 -0
  859. chia/wallet/puzzles/curry_by_index.clib +16 -0
  860. chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
  861. chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
  862. chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
  863. chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
  864. chia/wallet/puzzles/dao_finished_state.clsp +35 -0
  865. chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
  866. chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
  867. chia/wallet/puzzles/dao_lockup.clsp +288 -0
  868. chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
  869. chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
  870. chia/wallet/puzzles/dao_proposal.clsp +377 -0
  871. chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
  872. chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
  873. chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
  874. chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
  875. chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
  876. chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
  877. chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
  878. chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
  879. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
  880. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
  881. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
  882. chia/wallet/puzzles/dao_treasury.clsp +115 -0
  883. chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
  884. chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
  885. chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
  886. chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
  887. chia/wallet/puzzles/json.clib +25 -0
  888. chia/wallet/puzzles/load_clvm.py +162 -0
  889. chia/wallet/puzzles/merkle_utils.clib +18 -0
  890. chia/wallet/puzzles/notification.clsp +7 -0
  891. chia/wallet/puzzles/notification.clsp.hex +1 -0
  892. chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
  893. chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
  894. chia/wallet/puzzles/p2_conditions.clsp +3 -0
  895. chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
  896. chia/wallet/puzzles/p2_conditions.py +27 -0
  897. chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
  898. chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
  899. chia/wallet/puzzles/p2_delegated_conditions.py +22 -0
  900. chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
  901. chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
  902. chia/wallet/puzzles/p2_delegated_puzzle.py +35 -0
  903. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
  904. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
  905. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +161 -0
  906. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
  907. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
  908. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +22 -0
  909. chia/wallet/puzzles/p2_parent.clsp +19 -0
  910. chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
  911. chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
  912. chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
  913. chia/wallet/puzzles/p2_puzzle_hash.py +28 -0
  914. chia/wallet/puzzles/p2_singleton.clsp +30 -0
  915. chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
  916. chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
  917. chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
  918. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
  919. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
  920. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
  921. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
  922. chia/wallet/puzzles/puzzle_utils.py +34 -0
  923. chia/wallet/puzzles/settlement_payments.clsp +49 -0
  924. chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
  925. chia/wallet/puzzles/sha256tree.clib +11 -0
  926. chia/wallet/puzzles/singleton_launcher.clsp +16 -0
  927. chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
  928. chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
  929. chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
  930. chia/wallet/puzzles/singleton_top_layer.py +295 -0
  931. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
  932. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
  933. chia/wallet/puzzles/singleton_top_layer_v1_1.py +344 -0
  934. chia/wallet/puzzles/singleton_truths.clib +21 -0
  935. chia/wallet/puzzles/tails.py +344 -0
  936. chia/wallet/puzzles/utility_macros.clib +48 -0
  937. chia/wallet/signer_protocol.py +126 -0
  938. chia/wallet/singleton.py +106 -0
  939. chia/wallet/singleton_record.py +30 -0
  940. chia/wallet/trade_manager.py +1088 -0
  941. chia/wallet/trade_record.py +67 -0
  942. chia/wallet/trading/__init__.py +0 -0
  943. chia/wallet/trading/offer.py +703 -0
  944. chia/wallet/trading/trade_status.py +13 -0
  945. chia/wallet/trading/trade_store.py +526 -0
  946. chia/wallet/transaction_record.py +143 -0
  947. chia/wallet/transaction_sorting.py +14 -0
  948. chia/wallet/uncurried_puzzle.py +17 -0
  949. chia/wallet/util/__init__.py +0 -0
  950. chia/wallet/util/address_type.py +55 -0
  951. chia/wallet/util/blind_signer_tl.py +168 -0
  952. chia/wallet/util/clvm_streamable.py +203 -0
  953. chia/wallet/util/compute_hints.py +66 -0
  954. chia/wallet/util/compute_memos.py +45 -0
  955. chia/wallet/util/curry_and_treehash.py +90 -0
  956. chia/wallet/util/debug_spend_bundle.py +234 -0
  957. chia/wallet/util/merkle_tree.py +100 -0
  958. chia/wallet/util/merkle_utils.py +102 -0
  959. chia/wallet/util/new_peak_queue.py +82 -0
  960. chia/wallet/util/notifications.py +12 -0
  961. chia/wallet/util/peer_request_cache.py +174 -0
  962. chia/wallet/util/puzzle_compression.py +96 -0
  963. chia/wallet/util/puzzle_decorator.py +100 -0
  964. chia/wallet/util/puzzle_decorator_type.py +7 -0
  965. chia/wallet/util/query_filter.py +60 -0
  966. chia/wallet/util/transaction_type.py +23 -0
  967. chia/wallet/util/tx_config.py +158 -0
  968. chia/wallet/util/wallet_sync_utils.py +348 -0
  969. chia/wallet/util/wallet_types.py +65 -0
  970. chia/wallet/vc_wallet/__init__.py +0 -0
  971. chia/wallet/vc_wallet/cr_cat_drivers.py +663 -0
  972. chia/wallet/vc_wallet/cr_cat_wallet.py +875 -0
  973. chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
  974. chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
  975. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
  976. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
  977. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
  978. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
  979. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
  980. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
  981. chia/wallet/vc_wallet/vc_drivers.py +838 -0
  982. chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
  983. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
  984. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
  985. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
  986. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
  987. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
  988. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
  989. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
  990. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
  991. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
  992. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
  993. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
  994. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
  995. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
  996. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
  997. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
  998. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
  999. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
  1000. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
  1001. chia/wallet/vc_wallet/vc_store.py +263 -0
  1002. chia/wallet/vc_wallet/vc_wallet.py +638 -0
  1003. chia/wallet/wallet.py +698 -0
  1004. chia/wallet/wallet_action_scope.py +95 -0
  1005. chia/wallet/wallet_blockchain.py +244 -0
  1006. chia/wallet/wallet_coin_record.py +72 -0
  1007. chia/wallet/wallet_coin_store.py +351 -0
  1008. chia/wallet/wallet_info.py +36 -0
  1009. chia/wallet/wallet_interested_store.py +188 -0
  1010. chia/wallet/wallet_nft_store.py +279 -0
  1011. chia/wallet/wallet_node.py +1769 -0
  1012. chia/wallet/wallet_node_api.py +201 -0
  1013. chia/wallet/wallet_pool_store.py +120 -0
  1014. chia/wallet/wallet_protocol.py +90 -0
  1015. chia/wallet/wallet_puzzle_store.py +365 -0
  1016. chia/wallet/wallet_retry_store.py +70 -0
  1017. chia/wallet/wallet_singleton_store.py +258 -0
  1018. chia/wallet/wallet_spend_bundle.py +41 -0
  1019. chia/wallet/wallet_state_manager.py +2820 -0
  1020. chia/wallet/wallet_transaction_store.py +470 -0
  1021. chia/wallet/wallet_user_store.py +110 -0
  1022. chia/wallet/wallet_weight_proof_handler.py +126 -0
  1023. chia_blockchain-2.4.4.dist-info/LICENSE +201 -0
  1024. chia_blockchain-2.4.4.dist-info/METADATA +161 -0
  1025. chia_blockchain-2.4.4.dist-info/RECORD +1028 -0
  1026. chia_blockchain-2.4.4.dist-info/WHEEL +4 -0
  1027. chia_blockchain-2.4.4.dist-info/entry_points.txt +17 -0
  1028. mozilla-ca/cacert.pem +3666 -0
@@ -0,0 +1,864 @@
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, Dict, List, Optional, Tuple, Union
9
+
10
+ from chia_rs import AugSchemeMPL, G1Element, G2Element, PrivateKey
11
+
12
+ from chia.cmds.passphrase_funcs import obtain_current_passphrase
13
+ from chia.consensus.coinbase import create_puzzlehash_for_pk
14
+ from chia.types.signing_mode import SigningMode
15
+ from chia.util.bech32m import bech32_encode, convertbits, encode_puzzle_hash
16
+ from chia.util.config import load_config
17
+ from chia.util.errors import KeychainException
18
+ from chia.util.file_keyring import MAX_LABEL_LENGTH
19
+ from chia.util.ints import uint32
20
+ from chia.util.keychain import (
21
+ Keychain,
22
+ KeyData,
23
+ bytes_to_mnemonic,
24
+ check_mnemonic_validity,
25
+ generate_mnemonic,
26
+ mnemonic_to_seed,
27
+ )
28
+ from chia.util.keyring_wrapper import KeyringWrapper
29
+ from chia.wallet.derive_keys import (
30
+ master_pk_to_wallet_pk_unhardened,
31
+ master_sk_to_farmer_sk,
32
+ master_sk_to_pool_sk,
33
+ master_sk_to_wallet_sk,
34
+ )
35
+
36
+
37
+ def unlock_keyring() -> None:
38
+ """
39
+ Used to unlock the keyring interactively, if necessary
40
+ """
41
+
42
+ try:
43
+ if KeyringWrapper.get_shared_instance().has_master_passphrase():
44
+ obtain_current_passphrase(use_passphrase_cache=True)
45
+ except Exception as e:
46
+ print(f"Unable to unlock the keyring: {e}")
47
+ sys.exit(1)
48
+
49
+
50
+ def generate_and_print() -> str:
51
+ """
52
+ Generates a seed for a private key, and prints the mnemonic to the terminal.
53
+ """
54
+
55
+ mnemonic = generate_mnemonic()
56
+ print("Generating private key. Mnemonic (24 secret words):")
57
+ print(mnemonic)
58
+ print("Note that this key has not been added to the keychain. Run chia keys add")
59
+ return mnemonic
60
+
61
+
62
+ def generate_and_add(label: Optional[str]) -> None:
63
+ """
64
+ Generates a seed for a private key, prints the mnemonic to the terminal, and adds the key to the keyring.
65
+ """
66
+ unlock_keyring()
67
+ print("Generating private key")
68
+ query_and_add_key_info(mnemonic_or_pk=generate_mnemonic(), label=label)
69
+
70
+
71
+ def query_and_add_key_info(mnemonic_or_pk: Optional[str], label: Optional[str] = None) -> None:
72
+ unlock_keyring()
73
+ if mnemonic_or_pk is None:
74
+ mnemonic_or_pk = input("Enter the mnemonic/observer key you want to use: ")
75
+ if label is None:
76
+ label = input("Enter the label you want to assign to this key (Press Enter to skip): ")
77
+ if len(label) == 0:
78
+ label = None
79
+ add_key_info(mnemonic_or_pk, label)
80
+
81
+
82
+ def add_key_info(mnemonic_or_pk: str, label: Optional[str]) -> None:
83
+ """
84
+ Add a private key seed or public key to the keyring, with the given mnemonic and an optional label.
85
+ """
86
+ unlock_keyring()
87
+ try:
88
+ if check_mnemonic_validity(mnemonic_or_pk):
89
+ sk = Keychain().add_key(mnemonic_or_pk, label, private=True)
90
+ fingerprint = sk.get_g1().get_fingerprint()
91
+ print(f"Added private key with public key fingerprint {fingerprint}")
92
+ else:
93
+ pk = Keychain().add_key(mnemonic_or_pk, label, private=False)
94
+ fingerprint = pk.get_fingerprint()
95
+ print(f"Added public key with fingerprint {fingerprint}")
96
+
97
+ except (ValueError, KeychainException) as e:
98
+ print(e)
99
+
100
+
101
+ def show_all_key_labels() -> None:
102
+ unlock_keyring()
103
+ fingerprint_width = 11
104
+
105
+ def print_line(fingerprint: str, label: str) -> None:
106
+ fingerprint_text = ("{0:<" + str(fingerprint_width) + "}").format(fingerprint)
107
+ label_text = ("{0:<" + str(MAX_LABEL_LENGTH) + "}").format(label)
108
+ print("| " + fingerprint_text + " | " + label_text + " |")
109
+
110
+ keys = Keychain().get_keys()
111
+
112
+ if len(keys) == 0:
113
+ sys.exit("No keys are present in the keychain. Generate them with 'chia keys generate'")
114
+
115
+ print_line("fingerprint", "label")
116
+ print_line("-" * fingerprint_width, "-" * MAX_LABEL_LENGTH)
117
+
118
+ for key_data in keys:
119
+ print_line(str(key_data.fingerprint), key_data.label or "No label assigned")
120
+
121
+
122
+ def set_key_label(fingerprint: int, label: str) -> None:
123
+ unlock_keyring()
124
+ try:
125
+ Keychain().set_label(fingerprint, label)
126
+ print(f"label {label!r} assigned to {fingerprint!r}")
127
+ except Exception as e:
128
+ sys.exit(f"Error: {e}")
129
+
130
+
131
+ def delete_key_label(fingerprint: int) -> None:
132
+ unlock_keyring()
133
+ try:
134
+ Keychain().delete_label(fingerprint)
135
+ print(f"label removed for {fingerprint!r}")
136
+ except Exception as e:
137
+ sys.exit(f"Error: {e}")
138
+
139
+
140
+ def format_pk_bech32_maybe(prefix: Optional[str], pubkey: str) -> str:
141
+ return pubkey if prefix is None else bech32_encode(prefix, convertbits(list(bytes.fromhex(pubkey)), 8, 5))
142
+
143
+
144
+ def show_keys(
145
+ root_path: Path,
146
+ show_mnemonic: bool,
147
+ non_observer_derivation: bool,
148
+ json_output: bool,
149
+ fingerprint: Optional[int],
150
+ bech32m_prefix: Optional[str],
151
+ ) -> None:
152
+ """
153
+ Prints all keys and mnemonics (if available).
154
+ """
155
+ unlock_keyring()
156
+ config = load_config(root_path, "config.yaml")
157
+ if fingerprint is None:
158
+ all_keys = Keychain().get_keys(True)
159
+ else:
160
+ all_keys = [Keychain().get_key(fingerprint, True)]
161
+ selected = config["selected_network"]
162
+ prefix = config["network_overrides"]["config"][selected]["address_prefix"]
163
+
164
+ if len(all_keys) == 0:
165
+ if json_output:
166
+ print(json.dumps({"keys": []}))
167
+ else:
168
+ print("There are no saved private keys")
169
+ return None
170
+
171
+ if not json_output:
172
+ msg = "Showing all public keys derived from your master key:"
173
+ if show_mnemonic:
174
+ msg = "Showing all public and private keys"
175
+ print(msg)
176
+
177
+ def process_key_data(key_data: KeyData) -> Dict[str, Any]:
178
+ key: Dict[str, Any] = {}
179
+ sk = key_data.private_key if key_data.secrets is not None else None
180
+ if key_data.label is not None:
181
+ key["label"] = key_data.label
182
+
183
+ key["fingerprint"] = key_data.fingerprint
184
+ key["master_pk"] = bytes(key_data.public_key).hex()
185
+ if sk is not None:
186
+ key["farmer_pk"] = bytes(master_sk_to_farmer_sk(sk).get_g1()).hex()
187
+ key["pool_pk"] = bytes(master_sk_to_pool_sk(sk).get_g1()).hex()
188
+ else:
189
+ key["farmer_pk"] = None
190
+ key["pool_pk"] = None
191
+
192
+ if non_observer_derivation:
193
+ if sk is None:
194
+ first_wallet_pk: Optional[G1Element] = None
195
+ else:
196
+ first_wallet_pk = master_sk_to_wallet_sk(sk, uint32(0)).get_g1()
197
+ else:
198
+ first_wallet_pk = master_pk_to_wallet_pk_unhardened(key_data.public_key, uint32(0))
199
+
200
+ if first_wallet_pk is not None:
201
+ wallet_address: str = encode_puzzle_hash(create_puzzlehash_for_pk(first_wallet_pk), prefix)
202
+ key["wallet_address"] = wallet_address
203
+ else:
204
+ key["wallet_address"] = None
205
+
206
+ key["non_observer"] = non_observer_derivation
207
+
208
+ if show_mnemonic and sk is not None:
209
+ key["master_sk"] = bytes(sk).hex()
210
+ key["farmer_sk"] = bytes(master_sk_to_farmer_sk(sk)).hex()
211
+ key["wallet_sk"] = bytes(master_sk_to_wallet_sk(sk, uint32(0))).hex()
212
+ key["mnemonic"] = bytes_to_mnemonic(key_data.entropy)
213
+ else:
214
+ key["master_sk"] = None
215
+ key["farmer_sk"] = None
216
+ key["wallet_sk"] = None
217
+ key["mnemonic"] = None
218
+
219
+ return key
220
+
221
+ keys = [process_key_data(key) for key in all_keys]
222
+
223
+ if json_output:
224
+ print(json.dumps({"keys": list(keys)}))
225
+ else:
226
+ for _key in keys:
227
+ key = {k: "N/A" if v is None else v for k, v in _key.items()}
228
+ print("")
229
+ if "label" in key:
230
+ print("Label:", key["label"])
231
+ print("Fingerprint:", key["fingerprint"])
232
+ print("Master public key (m):", format_pk_bech32_maybe(bech32m_prefix, key["master_pk"]))
233
+ print("Farmer public key (m/12381/8444/0/0):", format_pk_bech32_maybe(bech32m_prefix, key["farmer_pk"]))
234
+ print("Pool public key (m/12381/8444/1/0):", format_pk_bech32_maybe(bech32m_prefix, key["pool_pk"]))
235
+ print(f"First wallet address{' (non-observer)' if key['non_observer'] else ''}: {key['wallet_address']}")
236
+ if show_mnemonic:
237
+ print("Master private key (m):", key["master_sk"])
238
+ print("Farmer private key (m/12381/8444/0/0):", key["farmer_sk"])
239
+ print("First wallet secret key (m/12381/8444/2/0):", key["wallet_sk"])
240
+ print(" Mnemonic seed (24 secret words):")
241
+ print(key["mnemonic"])
242
+
243
+
244
+ def delete(fingerprint: int) -> None:
245
+ """
246
+ Delete a key by its public key fingerprint (which is an integer).
247
+ """
248
+ unlock_keyring()
249
+ print(f"Deleting private_key with fingerprint {fingerprint}")
250
+ Keychain().delete_key_by_fingerprint(fingerprint)
251
+
252
+
253
+ def derive_pk_and_sk_from_hd_path(
254
+ master_pk: G1Element, hd_path_root: str, master_sk: Optional[PrivateKey] = None
255
+ ) -> Tuple[G1Element, Optional[PrivateKey], str]:
256
+ """
257
+ Derive a private key from the provided HD path. Takes a master key and HD path as input,
258
+ and returns the derived key and the HD path that was used to derive it.
259
+ """
260
+
261
+ from chia.wallet.derive_keys import _derive_path, _derive_path_unhardened, _derive_pk_unhardened
262
+
263
+ class DerivationType(Enum):
264
+ NONOBSERVER = 0
265
+ OBSERVER = 1
266
+
267
+ path: List[str] = hd_path_root.split("/")
268
+ if len(path) == 0 or path[0] != "m":
269
+ raise ValueError("Invalid HD path. Must start with 'm'")
270
+
271
+ path = path[1:] # Skip "m"
272
+
273
+ if len(path) > 0 and path[-1] == "": # remove trailing slash
274
+ path = path[:-1]
275
+
276
+ index_and_derivation_types: List[Tuple[int, DerivationType]] = []
277
+
278
+ # Validate path
279
+ for current_index_str in path:
280
+ if len(current_index_str) == 0:
281
+ raise ValueError("Invalid HD path. Empty index")
282
+
283
+ non_observer: bool = current_index_str[-1] == "n"
284
+ if non_observer and master_sk is None:
285
+ raise ValueError("Hardened path specified for observer key")
286
+ current_index: int = int(current_index_str[:-1]) if non_observer else int(current_index_str)
287
+
288
+ index_and_derivation_types.append(
289
+ (current_index, DerivationType.NONOBSERVER if non_observer else DerivationType.OBSERVER)
290
+ )
291
+
292
+ # Derive keys along the path
293
+ if master_sk is not None:
294
+ current_sk: Optional[PrivateKey] = master_sk
295
+ assert current_sk is not None
296
+ for current_index, derivation_type in index_and_derivation_types:
297
+ if derivation_type == DerivationType.NONOBSERVER:
298
+ current_sk = _derive_path(current_sk, [current_index])
299
+ elif derivation_type == DerivationType.OBSERVER:
300
+ current_sk = _derive_path_unhardened(current_sk, [current_index])
301
+ else:
302
+ raise ValueError(f"Unhandled derivation type: {derivation_type}") # pragma: no cover
303
+ current_pk: G1Element = current_sk.get_g1()
304
+ else:
305
+ current_sk = None
306
+ current_pk = master_pk
307
+ for current_index, _ in index_and_derivation_types:
308
+ current_pk = _derive_pk_unhardened(current_pk, [current_index])
309
+
310
+ return (current_pk, current_sk, "m/" + "/".join(path) + "/")
311
+
312
+
313
+ def sign(message: str, private_key: PrivateKey, hd_path: str, as_bytes: bool, json_output: bool) -> None:
314
+ sk = derive_pk_and_sk_from_hd_path(private_key.get_g1(), hd_path, master_sk=private_key)[1]
315
+ assert sk is not None
316
+ data = bytes.fromhex(message) if as_bytes else bytes(message, "utf-8")
317
+ signing_mode: SigningMode = (
318
+ SigningMode.BLS_MESSAGE_AUGMENTATION_HEX_INPUT if as_bytes else SigningMode.BLS_MESSAGE_AUGMENTATION_UTF8_INPUT
319
+ )
320
+ pubkey_hex: str = bytes(sk.get_g1()).hex()
321
+ signature_hex: str = bytes(AugSchemeMPL.sign(sk, data)).hex()
322
+ if json_output:
323
+ print(
324
+ json.dumps(
325
+ {
326
+ "message": message,
327
+ "pubkey": pubkey_hex,
328
+ "signature": signature_hex,
329
+ "signing_mode": signing_mode.value,
330
+ }
331
+ )
332
+ )
333
+ else:
334
+ print(f"Message: {message}")
335
+ print(f"Public Key: {pubkey_hex}")
336
+ print(f"Signature: {signature_hex}")
337
+ print(f"Signing Mode: {signing_mode.value}")
338
+
339
+
340
+ def verify(message: str, public_key: str, signature: str, as_bytes: bool) -> None:
341
+ data = bytes.fromhex(message) if as_bytes else bytes(message, "utf-8")
342
+ pk = G1Element.from_bytes(bytes.fromhex(public_key))
343
+ sig = G2Element.from_bytes(bytes.fromhex(signature))
344
+ print(AugSchemeMPL.verify(pk, data, sig))
345
+
346
+
347
+ def as_bytes_from_signing_mode(signing_mode_str: str) -> bool:
348
+ if signing_mode_str == SigningMode.BLS_MESSAGE_AUGMENTATION_HEX_INPUT.value:
349
+ return True
350
+ else:
351
+ return False
352
+
353
+
354
+ def _clear_line_part(n: int) -> None:
355
+ # Move backward, overwrite with spaces, then move backward again
356
+ sys.stdout.write("\b" * n)
357
+ sys.stdout.write(" " * n)
358
+ sys.stdout.write("\b" * n)
359
+
360
+
361
+ def _search_derived(
362
+ current_pk: G1Element,
363
+ current_sk: Optional[PrivateKey],
364
+ search_terms: Tuple[str, ...],
365
+ path: str,
366
+ path_indices: Optional[List[int]],
367
+ limit: int,
368
+ non_observer_derivation: bool,
369
+ show_progress: bool,
370
+ search_public_key: bool,
371
+ search_private_key: bool,
372
+ search_address: bool,
373
+ prefix: str,
374
+ ) -> List[str]: # Return a subset of search_terms that were found
375
+ """
376
+ Performs a shallow search of keys derived from the current pk/sk for items matching
377
+ the provided search terms.
378
+ """
379
+
380
+ from chia.wallet.derive_keys import _derive_path, _derive_path_unhardened, _derive_pk_unhardened
381
+
382
+ class DerivedSearchResultType(Enum):
383
+ PUBLIC_KEY = "public key"
384
+ PRIVATE_KEY = "private key"
385
+ WALLET_ADDRESS = "wallet address"
386
+
387
+ remaining_search_terms: Dict[str, None] = dict.fromkeys(search_terms)
388
+ current_path: str = path
389
+ current_path_indices: List[int] = path_indices if path_indices is not None else []
390
+ found_search_terms: List[str] = []
391
+
392
+ assert not (non_observer_derivation and current_sk is None)
393
+
394
+ for index in range(limit):
395
+ found_items: List[Tuple[str, str, DerivedSearchResultType]] = []
396
+ printed_match: bool = False
397
+ current_index_str = str(index) + ("n" if non_observer_derivation else "")
398
+ current_path += f"{current_index_str}"
399
+ current_path_indices.append(index)
400
+ if show_progress:
401
+ # Output just the current index e.g. "25" or "25n"
402
+ sys.stdout.write(f"{current_index_str}")
403
+ sys.stdout.flush()
404
+
405
+ # Derive the private key
406
+ if non_observer_derivation:
407
+ assert current_sk is not None # semantics above guarantee this
408
+ child_sk = _derive_path(current_sk, current_path_indices)
409
+ if search_public_key or search_address:
410
+ child_pk = child_sk.get_g1()
411
+ else:
412
+ if search_public_key or search_address:
413
+ child_pk = _derive_pk_unhardened(current_pk, current_path_indices)
414
+ else:
415
+ child_pk = None
416
+ if search_private_key and current_sk is not None:
417
+ child_sk = _derive_path_unhardened(current_sk, current_path_indices)
418
+ else:
419
+ child_sk = None
420
+
421
+ address: Optional[str] = None
422
+
423
+ if search_address:
424
+ # Generate a wallet address using the standard p2_delegated_puzzle_or_hidden_puzzle puzzle
425
+ assert child_pk is not None
426
+ # TODO: consider generating addresses using other puzzles
427
+ address = encode_puzzle_hash(create_puzzlehash_for_pk(child_pk), prefix)
428
+
429
+ for term in remaining_search_terms:
430
+ found_item: Any = None
431
+ found_item_type: Optional[DerivedSearchResultType] = None
432
+
433
+ if search_private_key and term in str(child_sk):
434
+ assert child_sk is not None # semantics above guarantee this
435
+ found_item = private_key_string_repr(child_sk)
436
+ found_item_type = DerivedSearchResultType.PRIVATE_KEY
437
+ elif search_public_key and child_pk is not None and term in str(child_pk):
438
+ found_item = child_pk
439
+ found_item_type = DerivedSearchResultType.PUBLIC_KEY
440
+ elif search_address and address is not None and term in address:
441
+ found_item = address
442
+ found_item_type = DerivedSearchResultType.WALLET_ADDRESS
443
+
444
+ if found_item is not None and found_item_type is not None:
445
+ found_items.append((term, found_item, found_item_type))
446
+
447
+ if len(found_items) > 0 and show_progress:
448
+ print()
449
+
450
+ for term, found_item, found_item_type in found_items:
451
+ # Update remaining_search_terms and found_search_terms
452
+ del remaining_search_terms[term]
453
+ found_search_terms.append(term)
454
+
455
+ print(
456
+ f"Found {found_item_type.value}: {found_item} (HD path: {current_path})"
457
+ ) # lgtm [py/clear-text-logging-sensitive-data]
458
+
459
+ printed_match = True
460
+
461
+ if len(remaining_search_terms) == 0:
462
+ break
463
+
464
+ # Remove the last index from the path
465
+ current_path = current_path[: -len(str(current_index_str))]
466
+ current_path_indices = current_path_indices[:-1]
467
+
468
+ if show_progress:
469
+ if printed_match:
470
+ # Write the path (without current_index_str) since we printed out a match
471
+ # e.g. m/12381/8444/2/
472
+ sys.stdout.write(f"{current_path}") # lgtm [py/clear-text-logging-sensitive-data]
473
+ # Remove the last index from the output
474
+ else:
475
+ _clear_line_part(len(current_index_str))
476
+
477
+ return found_search_terms
478
+
479
+
480
+ def search_derive(
481
+ root_path: Path,
482
+ fingerprint: Optional[int],
483
+ search_terms: Tuple[str, ...],
484
+ limit: int,
485
+ non_observer_derivation: bool,
486
+ show_progress: bool,
487
+ search_types: Tuple[str, ...],
488
+ derive_from_hd_path: Optional[str],
489
+ prefix: Optional[str],
490
+ private_key: Optional[PrivateKey],
491
+ ) -> bool:
492
+ """
493
+ Searches for items derived from the provided private key, or if not specified,
494
+ search each private key in the keyring.
495
+ """
496
+
497
+ from time import perf_counter
498
+
499
+ start_time = perf_counter()
500
+ remaining_search_terms: Dict[str, None] = dict.fromkeys(search_terms) # poor man's ordered set
501
+ search_address = "address" in search_types
502
+ search_public_key = "public_key" in search_types
503
+ search_private_key = "private_key" in search_types
504
+
505
+ if prefix is None:
506
+ config: Dict[str, Any] = load_config(root_path, "config.yaml")
507
+ selected: str = config["selected_network"]
508
+ prefix = config["network_overrides"]["config"][selected]["address_prefix"]
509
+
510
+ if "all" in search_types:
511
+ search_address = True
512
+ search_public_key = True
513
+ search_private_key = True
514
+
515
+ if fingerprint is None and private_key is None:
516
+ public_keys: List[G1Element] = Keychain().get_all_public_keys()
517
+ private_keys: List[Optional[PrivateKey]] = [
518
+ data.private_key if data.secrets is not None else None for data in Keychain().get_keys(include_secrets=True)
519
+ ]
520
+ elif fingerprint is None:
521
+ assert private_key is not None
522
+ public_keys = [private_key.get_g1()]
523
+ private_keys = [private_key]
524
+ else:
525
+ master_key_data = Keychain().get_key(fingerprint, include_secrets=True)
526
+ public_keys = [master_key_data.public_key]
527
+ private_keys = [master_key_data.private_key if master_key_data.secrets is not None else None]
528
+
529
+ for pk, sk in zip(public_keys, private_keys):
530
+ if sk is None and non_observer_derivation:
531
+ continue
532
+ current_path: str = ""
533
+ found_terms: List[str] = []
534
+
535
+ if show_progress:
536
+ print(f"Searching keys derived from: {pk.get_fingerprint()}")
537
+
538
+ # Derive from the provided HD path
539
+ if derive_from_hd_path is not None:
540
+ derivation_root_pk, derivation_root_sk, hd_path_root = derive_pk_and_sk_from_hd_path(
541
+ pk, derive_from_hd_path, master_sk=sk
542
+ )
543
+
544
+ if show_progress:
545
+ sys.stdout.write(hd_path_root)
546
+
547
+ # Shallow search under hd_path_root
548
+ found_terms = _search_derived(
549
+ derivation_root_pk,
550
+ derivation_root_sk,
551
+ tuple(remaining_search_terms.keys()),
552
+ hd_path_root,
553
+ None,
554
+ limit,
555
+ non_observer_derivation,
556
+ show_progress,
557
+ search_public_key,
558
+ search_private_key,
559
+ search_address,
560
+ prefix,
561
+ )
562
+
563
+ # Update remaining_search_terms
564
+ for term in found_terms:
565
+ del remaining_search_terms[term]
566
+
567
+ if len(remaining_search_terms) == 0:
568
+ # Found everything we were looking for
569
+ break
570
+
571
+ current_path = hd_path_root
572
+ # Otherwise derive from well-known derivation paths
573
+ else:
574
+ current_path_indices: List[int] = [12381, 8444]
575
+ path_root: str = "m/"
576
+ for i in [12381, 8444]:
577
+ path_root += f"{i}{'n' if non_observer_derivation else ''}/"
578
+
579
+ if show_progress:
580
+ # Print the path root (without last index)
581
+ # e.g. m/12381/8444/
582
+ sys.stdout.write(path_root)
583
+
584
+ # 7 account levels for derived keys (0-6):
585
+ # 0 = farmer, 1 = pool, 2 = wallet, 3 = local, 4 = backup key, 5 = singleton, 6 = pooling authentication
586
+ for account in range(7):
587
+ account_str = str(account) + ("n" if non_observer_derivation else "")
588
+ current_path = path_root + f"{account_str}/"
589
+ current_path_indices.append(account)
590
+ if show_progress:
591
+ # Print the current path index
592
+ # e.g. 2/ (example full output: m/12381/8444/2/)
593
+ sys.stdout.write(f"{account_str}/") # lgtm [py/clear-text-logging-sensitive-data]
594
+
595
+ found_terms = _search_derived(
596
+ pk,
597
+ sk,
598
+ tuple(remaining_search_terms.keys()),
599
+ current_path,
600
+ list(current_path_indices), # copy
601
+ limit,
602
+ non_observer_derivation,
603
+ show_progress,
604
+ search_public_key,
605
+ search_private_key,
606
+ search_address,
607
+ prefix,
608
+ )
609
+
610
+ # Update remaining_search_terms
611
+ for found_term in found_terms:
612
+ del remaining_search_terms[found_term]
613
+
614
+ if len(remaining_search_terms) == 0:
615
+ # Found everything we were looking for
616
+ break
617
+
618
+ if show_progress:
619
+ # +1 to remove the trailing slash
620
+ _clear_line_part(1 + len(str(account_str)))
621
+
622
+ current_path_indices = current_path_indices[:-1]
623
+
624
+ if len(remaining_search_terms) == 0:
625
+ # Found everything we were looking for
626
+ break
627
+
628
+ if show_progress:
629
+ # +1 to remove the trailing slash
630
+ _clear_line_part(1 + len(current_path))
631
+ sys.stdout.flush()
632
+
633
+ end_time = perf_counter()
634
+ if len(remaining_search_terms) > 0:
635
+ for term in remaining_search_terms:
636
+ print(f"Could not find '{term}'")
637
+
638
+ if show_progress:
639
+ print()
640
+ print(f"Search completed in {end_time - start_time} seconds")
641
+
642
+ return len(remaining_search_terms) == 0
643
+
644
+
645
+ def derive_wallet_address(
646
+ root_path: Path,
647
+ fingerprint: Optional[int],
648
+ index: int,
649
+ count: int,
650
+ prefix: Optional[str],
651
+ non_observer_derivation: bool,
652
+ show_hd_path: bool,
653
+ private_key: Optional[PrivateKey],
654
+ ) -> None:
655
+ """
656
+ Generate wallet addresses using keys derived from the provided private key.
657
+ """
658
+ if fingerprint is not None:
659
+ key_data: KeyData = Keychain().get_key(fingerprint, include_secrets=non_observer_derivation)
660
+ if non_observer_derivation:
661
+ sk = key_data.private_key
662
+ else:
663
+ sk = None
664
+ pk = key_data.public_key
665
+ else:
666
+ assert private_key is not None
667
+ sk = private_key
668
+ pk = sk.get_g1()
669
+
670
+ if prefix is None:
671
+ config: Dict[str, Any] = load_config(root_path, "config.yaml")
672
+ selected: str = config["selected_network"]
673
+ prefix = config["network_overrides"]["config"][selected]["address_prefix"]
674
+ path_indices: List[int] = [12381, 8444, 2]
675
+ wallet_hd_path_root: str = "m/"
676
+ for i in path_indices:
677
+ wallet_hd_path_root += f"{i}{'n' if non_observer_derivation else ''}/"
678
+ for i in range(index, index + count):
679
+ if non_observer_derivation:
680
+ assert sk is not None
681
+ pubkey = master_sk_to_wallet_sk(sk, uint32(i)).get_g1()
682
+ else:
683
+ pubkey = master_pk_to_wallet_pk_unhardened(pk, uint32(i))
684
+ # Generate a wallet address using the standard p2_delegated_puzzle_or_hidden_puzzle puzzle
685
+ # TODO: consider generating addresses using other puzzles
686
+ address = encode_puzzle_hash(create_puzzlehash_for_pk(pubkey), prefix)
687
+ if show_hd_path:
688
+ print(
689
+ f"Wallet address {i} "
690
+ f"({wallet_hd_path_root + str(i) + ('n' if non_observer_derivation else '')}): {address}"
691
+ )
692
+ else:
693
+ print(f"Wallet address {i}: {address}")
694
+
695
+
696
+ def private_key_string_repr(private_key: PrivateKey) -> str:
697
+ """Print a PrivateKey in a human-readable formats"""
698
+
699
+ s = str(private_key)
700
+ return s[len("<PrivateKey ") : s.rfind(">")] if s.startswith("<PrivateKey ") else s
701
+
702
+
703
+ def derive_child_key(
704
+ fingerprint: Optional[int],
705
+ key_type: Optional[str],
706
+ derive_from_hd_path: Optional[str],
707
+ index: int,
708
+ count: int,
709
+ non_observer_derivation: bool,
710
+ show_private_keys: bool,
711
+ show_hd_path: bool,
712
+ private_key: Optional[PrivateKey],
713
+ bech32m_prefix: Optional[str],
714
+ ) -> None:
715
+ """
716
+ Derive child keys from the provided master key.
717
+ """
718
+ from chia.wallet.derive_keys import _derive_path, _derive_path_unhardened, _derive_pk_unhardened
719
+
720
+ if fingerprint is not None:
721
+ key_data: KeyData = Keychain().get_key(fingerprint, include_secrets=True)
722
+ current_pk: G1Element = key_data.public_key
723
+ current_sk: Optional[PrivateKey] = key_data.private_key if key_data.secrets is not None else None
724
+ else:
725
+ assert private_key is not None
726
+ current_pk = private_key.get_g1()
727
+ current_sk = private_key
728
+
729
+ # Key type was specified
730
+ if key_type is not None:
731
+ path_indices: List[int] = [12381, 8444]
732
+ path_indices.append(
733
+ {
734
+ "farmer": 0,
735
+ "pool": 1,
736
+ "wallet": 2,
737
+ "local": 3,
738
+ "backup": 4,
739
+ "singleton": 5,
740
+ "pool_auth": 6,
741
+ }[key_type]
742
+ )
743
+
744
+ if non_observer_derivation:
745
+ assert current_sk is not None # semantics above guarantee this
746
+ current_sk = _derive_path(current_sk, path_indices)
747
+ else:
748
+ if current_sk is not None:
749
+ current_sk = _derive_path_unhardened(current_sk, path_indices)
750
+ else:
751
+ current_pk = _derive_pk_unhardened(current_pk, path_indices)
752
+
753
+ derivation_root_sk = current_sk
754
+ derivation_root_pk = current_pk
755
+ hd_path_root = "m/"
756
+ for i in path_indices:
757
+ hd_path_root += f"{i}{'n' if non_observer_derivation else ''}/"
758
+ # Arbitrary HD path was specified
759
+ elif derive_from_hd_path is not None:
760
+ derivation_root_pk, derivation_root_sk, hd_path_root = derive_pk_and_sk_from_hd_path(
761
+ current_pk, derive_from_hd_path, master_sk=current_sk
762
+ )
763
+ else:
764
+ raise Exception("Neither key type nor HD path was specified")
765
+
766
+ # Derive child keys from derivation_root_sk
767
+ for i in range(index, index + count):
768
+ if non_observer_derivation:
769
+ assert derivation_root_sk is not None # semantics above guarantee this
770
+ sk = _derive_path(derivation_root_sk, [i])
771
+ pk = sk.get_g1()
772
+ else:
773
+ if derivation_root_sk is not None:
774
+ sk = _derive_path_unhardened(derivation_root_sk, [i])
775
+ pk = sk.get_g1()
776
+ else:
777
+ sk = None
778
+ pk = _derive_pk_unhardened(derivation_root_pk, [i])
779
+ hd_path: str = (
780
+ " (" + hd_path_root + str(i) + ("n" if non_observer_derivation else "") + ")" if show_hd_path else ""
781
+ )
782
+ key_type_str: Optional[str]
783
+
784
+ if key_type is not None:
785
+ key_type_str = key_type.capitalize()
786
+ else:
787
+ key_type_str = "Non-Observer" if non_observer_derivation else "Observer"
788
+
789
+ print(f"{key_type_str} public key {i}{hd_path}: {format_pk_bech32_maybe(bech32m_prefix, bytes(pk).hex())}")
790
+ if show_private_keys and sk is not None:
791
+ print(f"{key_type_str} private key {i}{hd_path}: {private_key_string_repr(sk)}")
792
+
793
+
794
+ def private_key_for_fingerprint(fingerprint: int) -> Optional[PrivateKey]:
795
+ unlock_keyring()
796
+ private_keys = Keychain().get_all_private_keys()
797
+
798
+ for sk, _ in private_keys:
799
+ if sk.get_g1().get_fingerprint() == fingerprint:
800
+ return sk
801
+ return None
802
+
803
+
804
+ def prompt_for_fingerprint() -> Optional[int]:
805
+ fingerprints: List[int] = [pk.get_fingerprint() for pk in Keychain().get_all_public_keys()]
806
+ while True:
807
+ print("Choose key:")
808
+ for i, fp in enumerate(fingerprints):
809
+ print(f"{i+1}) {fp}")
810
+ val = None
811
+ while val is None:
812
+ val = input("Enter a number to pick or q to quit: ")
813
+ if val == "q":
814
+ return None
815
+ if not val.isdigit():
816
+ val = None
817
+ else:
818
+ index = int(val) - 1
819
+ if index >= len(fingerprints):
820
+ print("Invalid value")
821
+ val = None
822
+ continue
823
+ else:
824
+ return fingerprints[index]
825
+
826
+
827
+ def get_private_key_with_fingerprint_or_prompt(
828
+ fingerprint: Optional[int],
829
+ ) -> Tuple[Optional[int], Optional[PrivateKey]]:
830
+ """
831
+ Get a private key with the specified fingerprint. If fingerprint is not
832
+ specified, prompt the user to select a key.
833
+ """
834
+
835
+ # Return the private key matching the specified fingerprint
836
+ if fingerprint is not None:
837
+ return fingerprint, private_key_for_fingerprint(fingerprint)
838
+
839
+ fingerprint_prompt = prompt_for_fingerprint()
840
+ return fingerprint_prompt, None if fingerprint_prompt is None else private_key_for_fingerprint(fingerprint_prompt)
841
+
842
+
843
+ def private_key_from_mnemonic_seed_file(filename: Path) -> PrivateKey:
844
+ """
845
+ Create a private key from a mnemonic seed file.
846
+ """
847
+
848
+ mnemonic = filename.read_text().rstrip()
849
+ seed = mnemonic_to_seed(mnemonic)
850
+ return AugSchemeMPL.key_gen(seed)
851
+
852
+
853
+ def resolve_derivation_master_key(
854
+ fingerprint_or_filename: Optional[Union[int, str, Path]]
855
+ ) -> Tuple[Optional[int], Optional[PrivateKey]]:
856
+ """
857
+ Given a key fingerprint of file containing a mnemonic seed, return the private key.
858
+ """
859
+
860
+ if fingerprint_or_filename is not None and (isinstance(fingerprint_or_filename, (str, Path))):
861
+ sk = private_key_from_mnemonic_seed_file(Path(os.fspath(fingerprint_or_filename)))
862
+ return sk.get_g1().get_fingerprint(), sk
863
+ else:
864
+ return get_private_key_with_fingerprint_or_prompt(fingerprint_or_filename)