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,780 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ import sys
5
+ import time
6
+ import types
7
+ from pathlib import Path
8
+ from typing import Any, Optional
9
+
10
+ import pytest
11
+ from chia_rs import G1Element, PrivateKey
12
+
13
+ from chia._tests.util.misc import CoinGenerator, patch_request_handler
14
+ from chia._tests.util.setup_nodes import OldSimulatorsAndWallets
15
+ from chia._tests.util.time_out_assert import time_out_assert
16
+ from chia.protocols import wallet_protocol
17
+ from chia.protocols.protocol_message_types import ProtocolMessageTypes
18
+ from chia.protocols.wallet_protocol import CoinState
19
+ from chia.server.api_protocol import Self
20
+ from chia.server.outbound_message import Message, make_msg
21
+ from chia.simulator.add_blocks_in_batches import add_blocks_in_batches
22
+ from chia.simulator.block_tools import test_constants
23
+ from chia.types.blockchain_format.coin import Coin
24
+ from chia.types.blockchain_format.sized_bytes import bytes32
25
+ from chia.types.full_block import FullBlock
26
+ from chia.types.mempool_inclusion_status import MempoolInclusionStatus
27
+ from chia.types.peer_info import PeerInfo
28
+ from chia.util.config import load_config
29
+ from chia.util.errors import Err
30
+ from chia.util.ints import uint8, uint32, uint64, uint128
31
+ from chia.util.keychain import Keychain, KeyData, generate_mnemonic
32
+ from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
33
+ from chia.wallet.util.wallet_sync_utils import PeerRequestException
34
+ from chia.wallet.wallet_node import Balance, WalletNode
35
+
36
+
37
+ @pytest.mark.anyio
38
+ async def test_get_private_key(root_path_populated_with_config: Path, get_temp_keyring: Keychain) -> None:
39
+ root_path = root_path_populated_with_config
40
+ keychain = get_temp_keyring
41
+ config = load_config(root_path, "config.yaml", "wallet")
42
+ node = WalletNode(config, root_path, test_constants, keychain)
43
+ sk = keychain.add_key(generate_mnemonic())
44
+ fingerprint = sk.get_g1().get_fingerprint()
45
+
46
+ key = await node.get_key(fingerprint)
47
+
48
+ assert key is not None
49
+ assert isinstance(key, PrivateKey)
50
+ assert key.get_g1().get_fingerprint() == fingerprint
51
+
52
+
53
+ @pytest.mark.anyio
54
+ async def test_get_private_key_default_key(root_path_populated_with_config: Path, get_temp_keyring: Keychain) -> None:
55
+ root_path = root_path_populated_with_config
56
+ keychain = get_temp_keyring
57
+ config = load_config(root_path, "config.yaml", "wallet")
58
+ node = WalletNode(config, root_path, test_constants, keychain)
59
+ sk = keychain.add_key(generate_mnemonic())
60
+ fingerprint = sk.get_g1().get_fingerprint()
61
+
62
+ # Add a couple more keys
63
+ keychain.add_key(generate_mnemonic())
64
+ keychain.add_key(generate_mnemonic())
65
+
66
+ # When no fingerprint is provided, we should get the default (first) key
67
+ key = await node.get_key(None)
68
+
69
+ assert key is not None
70
+ assert isinstance(key, PrivateKey)
71
+ assert key.get_g1().get_fingerprint() == fingerprint
72
+
73
+
74
+ @pytest.mark.anyio
75
+ @pytest.mark.parametrize("fingerprint", [None, 1234567890])
76
+ async def test_get_private_key_missing_key(
77
+ root_path_populated_with_config: Path, get_temp_keyring: Keychain, fingerprint: Optional[int]
78
+ ) -> None:
79
+ root_path = root_path_populated_with_config
80
+ keychain = get_temp_keyring # empty keyring
81
+ config = load_config(root_path, "config.yaml", "wallet")
82
+ node = WalletNode(config, root_path, test_constants, keychain)
83
+
84
+ # Keyring is empty, so requesting a key by fingerprint or None should return None
85
+ key = await node.get_key(fingerprint)
86
+
87
+ assert key is None
88
+
89
+
90
+ @pytest.mark.anyio
91
+ async def test_get_private_key_missing_key_use_default(
92
+ root_path_populated_with_config: Path, get_temp_keyring: Keychain
93
+ ) -> None:
94
+ root_path = root_path_populated_with_config
95
+ keychain = get_temp_keyring
96
+ config = load_config(root_path, "config.yaml", "wallet")
97
+ node = WalletNode(config, root_path, test_constants, keychain)
98
+ sk = keychain.add_key(generate_mnemonic())
99
+ fingerprint = sk.get_g1().get_fingerprint()
100
+
101
+ # Stupid sanity check that the fingerprint we're going to use isn't actually in the keychain
102
+ assert fingerprint != 1234567890
103
+
104
+ # When fingerprint is provided and the key is missing, we should get the default (first) key
105
+ key = await node.get_key(1234567890)
106
+
107
+ assert key is not None
108
+ assert isinstance(key, PrivateKey)
109
+ assert key.get_g1().get_fingerprint() == fingerprint
110
+
111
+
112
+ @pytest.mark.anyio
113
+ async def test_get_public_key(root_path_populated_with_config: Path, get_temp_keyring: Keychain) -> None:
114
+ root_path: Path = root_path_populated_with_config
115
+ keychain: Keychain = get_temp_keyring
116
+ config: dict[str, Any] = load_config(root_path, "config.yaml", "wallet")
117
+ node: WalletNode = WalletNode(config, root_path, test_constants, keychain)
118
+ pk: G1Element = keychain.add_key(
119
+ "c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
120
+ None,
121
+ private=False,
122
+ )
123
+ fingerprint: int = pk.get_fingerprint()
124
+
125
+ key = await node.get_key(fingerprint, private=False)
126
+
127
+ assert key is not None
128
+ assert isinstance(key, G1Element)
129
+ assert key.get_fingerprint() == fingerprint
130
+
131
+
132
+ @pytest.mark.anyio
133
+ async def test_get_public_key_default_key(root_path_populated_with_config: Path, get_temp_keyring: Keychain) -> None:
134
+ root_path: Path = root_path_populated_with_config
135
+ keychain: Keychain = get_temp_keyring
136
+ config: dict[str, Any] = load_config(root_path, "config.yaml", "wallet")
137
+ node: WalletNode = WalletNode(config, root_path, test_constants, keychain)
138
+ pk: G1Element = keychain.add_key(
139
+ "c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
140
+ None,
141
+ private=False,
142
+ )
143
+ fingerprint: int = pk.get_fingerprint()
144
+
145
+ # Add a couple more keys
146
+ keychain.add_key(
147
+ "83062a1b26d27820600eac4e31c1a890a6ba026b28bb96bb66454e9ce1033f4cba8824259dc17dc3b643ab1003e6b961",
148
+ None,
149
+ private=False,
150
+ )
151
+ keychain.add_key(
152
+ "a272d5aaa6046e64bd7fd69bae288b9f9e5622c13058ec7d1b85e3d4d1acfa5d63d6542336c7b24d2fceab991919e989",
153
+ None,
154
+ private=False,
155
+ )
156
+
157
+ # When no fingerprint is provided, we should get the default (first) key
158
+ key = await node.get_key(None, private=False)
159
+
160
+ assert key is not None
161
+ assert isinstance(key, G1Element)
162
+ assert key.get_fingerprint() == fingerprint
163
+
164
+
165
+ @pytest.mark.anyio
166
+ @pytest.mark.parametrize("fingerprint", [None, 1234567890])
167
+ async def test_get_public_key_missing_key(
168
+ root_path_populated_with_config: Path, get_temp_keyring: Keychain, fingerprint: Optional[int]
169
+ ) -> None:
170
+ root_path: Path = root_path_populated_with_config
171
+ keychain: Keychain = get_temp_keyring # empty keyring
172
+ config: dict[str, Any] = load_config(root_path, "config.yaml", "wallet")
173
+ node: WalletNode = WalletNode(config, root_path, test_constants, keychain)
174
+
175
+ # Keyring is empty, so requesting a key by fingerprint or None should return None
176
+ key = await node.get_key(fingerprint, private=False)
177
+
178
+ assert key is None
179
+
180
+
181
+ @pytest.mark.anyio
182
+ async def test_get_public_key_missing_key_use_default(
183
+ root_path_populated_with_config: Path, get_temp_keyring: Keychain
184
+ ) -> None:
185
+ root_path: Path = root_path_populated_with_config
186
+ keychain: Keychain = get_temp_keyring
187
+ config: dict[str, Any] = load_config(root_path, "config.yaml", "wallet")
188
+ node: WalletNode = WalletNode(config, root_path, test_constants, keychain)
189
+ pk: G1Element = keychain.add_key(
190
+ "c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
191
+ None,
192
+ private=False,
193
+ )
194
+ fingerprint: int = pk.get_fingerprint()
195
+
196
+ # Stupid sanity check that the fingerprint we're going to use isn't actually in the keychain
197
+ assert fingerprint != 1234567890
198
+
199
+ # When fingerprint is provided and the key is missing, we should get the default (first) key
200
+ key = await node.get_key(1234567890, private=False)
201
+
202
+ assert key is not None
203
+ assert isinstance(key, G1Element)
204
+ assert key.get_fingerprint() == fingerprint
205
+
206
+
207
+ def test_log_in(root_path_populated_with_config: Path, get_temp_keyring: Keychain) -> None:
208
+ root_path = root_path_populated_with_config
209
+ keychain = get_temp_keyring
210
+ config = load_config(root_path, "config.yaml", "wallet")
211
+ node = WalletNode(config, root_path, test_constants)
212
+ sk = keychain.add_key(generate_mnemonic())
213
+ fingerprint = sk.get_g1().get_fingerprint()
214
+
215
+ node.log_in(fingerprint)
216
+
217
+ assert node.logged_in is True
218
+ assert node.logged_in_fingerprint == fingerprint
219
+ assert node.get_last_used_fingerprint() == fingerprint
220
+
221
+
222
+ def test_log_in_failure_to_write_last_used_fingerprint(
223
+ root_path_populated_with_config: Path, get_temp_keyring: Keychain, monkeypatch: pytest.MonkeyPatch
224
+ ) -> None:
225
+ called_update_last_used_fingerprint: bool = False
226
+
227
+ def patched_update_last_used_fingerprint(self: Self) -> None:
228
+ nonlocal called_update_last_used_fingerprint
229
+ called_update_last_used_fingerprint = True
230
+ raise Exception("Generic write failure")
231
+
232
+ with monkeypatch.context() as m:
233
+ m.setattr(WalletNode, "update_last_used_fingerprint", patched_update_last_used_fingerprint)
234
+ root_path = root_path_populated_with_config
235
+ keychain = get_temp_keyring
236
+ config = load_config(root_path, "config.yaml", "wallet")
237
+ node = WalletNode(config, root_path, test_constants)
238
+ sk = keychain.add_key(generate_mnemonic())
239
+ fingerprint = sk.get_g1().get_fingerprint()
240
+
241
+ # Expect log_in to succeed, even though we can't write the last used fingerprint
242
+ node.log_in(fingerprint)
243
+
244
+ assert node.logged_in is True
245
+ assert node.logged_in_fingerprint == fingerprint
246
+ assert node.get_last_used_fingerprint() is None
247
+ assert called_update_last_used_fingerprint is True
248
+
249
+
250
+ def test_log_out(root_path_populated_with_config: Path, get_temp_keyring: Keychain) -> None:
251
+ root_path = root_path_populated_with_config
252
+ keychain = get_temp_keyring
253
+ config = load_config(root_path, "config.yaml", "wallet")
254
+ node = WalletNode(config, root_path, test_constants)
255
+ sk = keychain.add_key(generate_mnemonic())
256
+ fingerprint = sk.get_g1().get_fingerprint()
257
+
258
+ node.log_in(fingerprint)
259
+
260
+ assert node.logged_in is True
261
+ assert node.logged_in_fingerprint == fingerprint
262
+ assert node.get_last_used_fingerprint() == fingerprint
263
+
264
+ node.log_out()
265
+
266
+ assert node.logged_in is False
267
+ assert node.logged_in_fingerprint is None
268
+ assert node.get_last_used_fingerprint() == fingerprint
269
+
270
+
271
+ def test_get_last_used_fingerprint_path(root_path_populated_with_config: Path) -> None:
272
+ root_path = root_path_populated_with_config
273
+ config = load_config(root_path, "config.yaml", "wallet")
274
+ node = WalletNode(config, root_path, test_constants)
275
+ path = node.get_last_used_fingerprint_path()
276
+
277
+ assert path == root_path / "wallet" / "db" / "last_used_fingerprint"
278
+
279
+
280
+ def test_get_last_used_fingerprint(root_path_populated_with_config: Path) -> None:
281
+ path = root_path_populated_with_config / "wallet" / "db" / "last_used_fingerprint"
282
+ path.parent.mkdir(parents=True, exist_ok=True)
283
+ path.write_text("1234567890")
284
+
285
+ root_path = root_path_populated_with_config
286
+ config = load_config(root_path, "config.yaml", "wallet")
287
+ node = WalletNode(config, root_path, test_constants)
288
+ last_used_fingerprint = node.get_last_used_fingerprint()
289
+
290
+ assert last_used_fingerprint == 1234567890
291
+
292
+
293
+ def test_get_last_used_fingerprint_file_doesnt_exist(root_path_populated_with_config: Path) -> None:
294
+ root_path = root_path_populated_with_config
295
+ config = load_config(root_path, "config.yaml", "wallet")
296
+ node = WalletNode(config, root_path, test_constants)
297
+ last_used_fingerprint = node.get_last_used_fingerprint()
298
+
299
+ assert last_used_fingerprint is None
300
+
301
+
302
+ def test_get_last_used_fingerprint_file_cant_read_unix(root_path_populated_with_config: Path) -> None:
303
+ if sys.platform in {"win32", "cygwin"}:
304
+ pytest.skip("Setting UNIX file permissions doesn't apply to Windows")
305
+
306
+ root_path = root_path_populated_with_config
307
+ config = load_config(root_path, "config.yaml", "wallet")
308
+ node = WalletNode(config, root_path, test_constants)
309
+ path = node.get_last_used_fingerprint_path()
310
+ path.parent.mkdir(parents=True, exist_ok=True)
311
+ path.write_text("1234567890")
312
+
313
+ assert node.get_last_used_fingerprint() == 1234567890
314
+
315
+ # Make the file unreadable
316
+ path.chmod(0o000)
317
+
318
+ last_used_fingerprint = node.get_last_used_fingerprint()
319
+
320
+ assert last_used_fingerprint is None
321
+
322
+ # Verify that the file is unreadable
323
+ with pytest.raises(PermissionError):
324
+ path.read_text()
325
+
326
+ # Calling get_last_used_fingerprint() should not throw an exception
327
+ assert node.get_last_used_fingerprint() is None
328
+
329
+ path.chmod(0o600)
330
+
331
+
332
+ def test_get_last_used_fingerprint_file_cant_read_win32(
333
+ root_path_populated_with_config: Path, monkeypatch: pytest.MonkeyPatch
334
+ ) -> None:
335
+ if sys.platform not in {"win32", "cygwin"}:
336
+ pytest.skip("Windows-specific test")
337
+
338
+ called_read_text = False
339
+
340
+ def patched_pathlib_path_read_text(self: Self) -> str:
341
+ nonlocal called_read_text
342
+ called_read_text = True
343
+ raise PermissionError("Permission denied")
344
+
345
+ root_path = root_path_populated_with_config
346
+ config = load_config(root_path, "config.yaml", "wallet")
347
+ node = WalletNode(config, root_path, test_constants)
348
+ path = node.get_last_used_fingerprint_path()
349
+ path.parent.mkdir(parents=True, exist_ok=True)
350
+ path.write_text("1234567890")
351
+
352
+ assert node.get_last_used_fingerprint() == 1234567890
353
+
354
+ # Make the file unreadable. Doing this with pywin32 is more trouble than it's worth. All we care about is that
355
+ # get_last_used_fingerprint doesn't throw an exception.
356
+ with monkeypatch.context() as m:
357
+ from pathlib import WindowsPath
358
+
359
+ m.setattr(WindowsPath, "read_text", patched_pathlib_path_read_text)
360
+
361
+ # Calling get_last_used_fingerprint() should not throw an exception
362
+ last_used_fingerprint: Optional[int] = node.get_last_used_fingerprint()
363
+
364
+ # Verify that the file is unreadable
365
+ assert called_read_text is True
366
+ assert last_used_fingerprint is None
367
+
368
+
369
+ def test_get_last_used_fingerprint_file_with_whitespace(root_path_populated_with_config: Path) -> None:
370
+ root_path = root_path_populated_with_config
371
+ config = load_config(root_path, "config.yaml", "wallet")
372
+ node = WalletNode(config, root_path, test_constants)
373
+ path = node.get_last_used_fingerprint_path()
374
+ path.parent.mkdir(parents=True, exist_ok=True)
375
+ path.write_text("\n\r\n \t1234567890\r\n\n")
376
+
377
+ assert node.get_last_used_fingerprint() == 1234567890
378
+
379
+
380
+ def test_update_last_used_fingerprint_missing_fingerprint(root_path_populated_with_config: Path) -> None:
381
+ root_path = root_path_populated_with_config
382
+ config = load_config(root_path, "config.yaml", "wallet")
383
+ node = WalletNode(config, root_path, test_constants)
384
+ node.logged_in_fingerprint = None
385
+
386
+ with pytest.raises(AssertionError):
387
+ node.update_last_used_fingerprint()
388
+
389
+
390
+ def test_update_last_used_fingerprint_create_intermediate_dirs(root_path_populated_with_config: Path) -> None:
391
+ root_path = root_path_populated_with_config
392
+ config = load_config(root_path, "config.yaml", "wallet")
393
+ node = WalletNode(config, root_path, test_constants)
394
+ node.logged_in_fingerprint = 9876543210
395
+ path = node.get_last_used_fingerprint_path()
396
+
397
+ assert path.parent.exists() is False
398
+
399
+ node.update_last_used_fingerprint()
400
+
401
+ assert path.parent.exists() is True
402
+
403
+
404
+ def test_update_last_used_fingerprint(root_path_populated_with_config: Path) -> None:
405
+ root_path = root_path_populated_with_config
406
+ config = load_config(root_path, "config.yaml", "wallet")
407
+ node = WalletNode(config, root_path, test_constants)
408
+ node.logged_in_fingerprint = 9876543210
409
+ path = node.get_last_used_fingerprint_path()
410
+
411
+ node.update_last_used_fingerprint()
412
+
413
+ assert path.exists() is True
414
+ assert path.read_text() == "9876543210"
415
+
416
+
417
+ @pytest.mark.parametrize("testing", [True, False])
418
+ @pytest.mark.parametrize("offset", [0, 550, 650])
419
+ def test_timestamp_in_sync(root_path_populated_with_config: Path, testing: bool, offset: int) -> None:
420
+ root_path = root_path_populated_with_config
421
+ config = load_config(root_path, "config.yaml", "wallet")
422
+ wallet_node = WalletNode(config, root_path, test_constants)
423
+ now = time.time()
424
+ wallet_node.config["testing"] = testing
425
+
426
+ expected = testing or offset < 600
427
+ assert wallet_node.is_timestamp_in_sync(uint64(now - offset)) == expected
428
+
429
+
430
+ @pytest.mark.anyio
431
+ @pytest.mark.standard_block_tools
432
+ async def test_get_timestamp_for_height_from_peer(
433
+ simulator_and_wallet: OldSimulatorsAndWallets, self_hostname: str, caplog: pytest.LogCaptureFixture
434
+ ) -> None:
435
+ [full_node_api], [(wallet_node, wallet_server)], _ = simulator_and_wallet
436
+
437
+ async def get_timestamp(height: int) -> Optional[uint64]:
438
+ return await wallet_node.get_timestamp_for_height_from_peer(uint32(height), full_node_peer)
439
+
440
+ await wallet_server.start_client(PeerInfo(self_hostname, full_node_api.server.get_port()), None)
441
+ wallet = wallet_node.wallet_state_manager.main_wallet
442
+ await full_node_api.farm_blocks_to_wallet(2, wallet)
443
+ full_node_peer = next(iter(wallet_server.all_connections.values()))
444
+ # There should be no timestamp available for height 10
445
+ assert await get_timestamp(10) is None
446
+ # The timestamp at peak height should match the one from the full node block_store.
447
+ peak = await wallet_node.wallet_state_manager.blockchain.get_peak_block()
448
+ assert peak is not None
449
+ timestamp_at_peak = await get_timestamp(peak.height)
450
+ block_at_peak = (await full_node_api.full_node.block_store.get_full_blocks_at([peak.height]))[0]
451
+ assert block_at_peak.foliage_transaction_block is not None
452
+ assert timestamp_at_peak == block_at_peak.foliage_transaction_block.timestamp
453
+ # Clear the cache and add the peak back with a modified timestamp
454
+ cache = wallet_node.get_cache_for_peer(full_node_peer)
455
+ cache.clear_after_height(0)
456
+ modified_foliage_transaction_block = block_at_peak.foliage_transaction_block.replace(
457
+ timestamp=uint64(timestamp_at_peak + 1)
458
+ )
459
+ modified_peak = peak.replace(foliage_transaction_block=modified_foliage_transaction_block)
460
+ cache.add_to_blocks(modified_peak)
461
+ # Now the call should make use of the cached, modified block
462
+ assert await get_timestamp(peak.height) == timestamp_at_peak + 1
463
+ # After the clearing the cache it should fetch the actual timestamp again
464
+ cache.clear_after_height(0)
465
+ assert await get_timestamp(peak.height) == timestamp_at_peak
466
+ # Test block cache usage
467
+ cache.clear_after_height(0)
468
+ with caplog.at_level(logging.DEBUG):
469
+ await get_timestamp(1)
470
+ for i in [0, 1]:
471
+ block = cache.get_block(uint32(i))
472
+ assert block is not None
473
+ if i == 0:
474
+ assert block.is_transaction_block
475
+ else:
476
+ assert not block.is_transaction_block
477
+ assert f"get_timestamp_for_height_from_peer cache miss for height {i}" in caplog.text
478
+ assert f"get_timestamp_for_height_from_peer add to cache for height {i}" in caplog.text
479
+ caplog.clear()
480
+ with caplog.at_level(logging.DEBUG):
481
+ await get_timestamp(1)
482
+ assert f"get_timestamp_for_height_from_peer use cached block for height {0}" not in caplog.text
483
+ assert f"get_timestamp_for_height_from_peer use cached block for height {1}" in caplog.text
484
+
485
+
486
+ @pytest.mark.anyio
487
+ async def test_unique_puzzle_hash_subscriptions(simulator_and_wallet: OldSimulatorsAndWallets) -> None:
488
+ _, [(node, _)], _ = simulator_and_wallet
489
+ puzzle_hashes = await node.get_puzzle_hashes_to_subscribe()
490
+ assert len(puzzle_hashes) > 1
491
+ assert len(set(puzzle_hashes)) == len(puzzle_hashes)
492
+
493
+
494
+ @pytest.mark.anyio
495
+ @pytest.mark.standard_block_tools
496
+ async def test_get_balance(
497
+ simulator_and_wallet: OldSimulatorsAndWallets, self_hostname: str, default_400_blocks: list[FullBlock]
498
+ ) -> None:
499
+ [full_node_api], [(wallet_node, wallet_server)], _bt = simulator_and_wallet
500
+ full_node_server = full_node_api.full_node.server
501
+
502
+ def wallet_synced() -> bool:
503
+ return full_node_server.node_id in wallet_node.synced_peers
504
+
505
+ async def restart_with_fingerprint(fingerprint: Optional[int]) -> None:
506
+ wallet_node._close()
507
+ await wallet_node._await_closed(shutting_down=False)
508
+ await wallet_node._start_with_fingerprint(fingerprint=fingerprint)
509
+
510
+ wallet_id = uint32(1)
511
+ initial_fingerprint = wallet_node.logged_in_fingerprint
512
+
513
+ # TODO, there is a bug in wallet_short_sync_backtrack which leads to a rollback to 0 (-1 which is another a bug) and
514
+ # with that to a KeyError when applying the race cache if there are less than WEIGHT_PROOF_RECENT_BLOCKS
515
+ # blocks but we still have a peak stored in the DB. So we need to add enough blocks for a weight proof here to
516
+ # be able to restart the wallet in this test.
517
+ await add_blocks_in_batches(default_400_blocks, full_node_api.full_node)
518
+ # Initially there should be no sync and no balance
519
+ assert not wallet_synced()
520
+ assert await wallet_node.get_balance(wallet_id) == Balance()
521
+ # Generate some funds, get the balance and make sure it's as expected
522
+ await wallet_server.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
523
+ await time_out_assert(30, wallet_synced)
524
+ generated_funds = await full_node_api.farm_blocks_to_wallet(5, wallet_node.wallet_state_manager.main_wallet)
525
+ expected_generated_balance = Balance(
526
+ confirmed_wallet_balance=uint128(generated_funds),
527
+ unconfirmed_wallet_balance=uint128(generated_funds),
528
+ spendable_balance=uint128(generated_funds),
529
+ max_send_amount=uint128(generated_funds),
530
+ unspent_coin_count=uint32(10),
531
+ )
532
+ generated_balance = await wallet_node.get_balance(wallet_id)
533
+ assert generated_balance == expected_generated_balance
534
+ # Load another key without funds, make sure the balance is empty.
535
+ other_key = KeyData.generate()
536
+ assert wallet_node.local_keychain is not None
537
+ wallet_node.local_keychain.add_key(other_key.mnemonic_str())
538
+ await restart_with_fingerprint(other_key.fingerprint)
539
+ assert await wallet_node.get_balance(wallet_id) == Balance()
540
+ # Load the initial fingerprint again and make sure the balance is still what we generated earlier
541
+ await restart_with_fingerprint(initial_fingerprint)
542
+ assert await wallet_node.get_balance(wallet_id) == generated_balance
543
+ # Connect and sync to the full node, generate more funds and test the balance caching
544
+ # TODO, there is a bug in untrusted sync if we try to sync to the same peak as stored in the DB after restart
545
+ # which leads to a rollback to 0 (-1 which is another a bug) and then to a validation error because the
546
+ # downloaded weight proof will not be added to the blockchain properly because we still have a peak with the
547
+ # same weight stored in the DB but without chain data. The 1 block generation below can be dropped if we just
548
+ # also store the chain data or maybe adjust the weight proof consideration logic in new_valid_weight_proof.
549
+ await full_node_api.farm_blocks_to_puzzlehash(1)
550
+ assert not wallet_synced()
551
+ await wallet_server.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
552
+ await time_out_assert(30, wallet_synced)
553
+ generated_funds += await full_node_api.farm_blocks_to_wallet(5, wallet_node.wallet_state_manager.main_wallet)
554
+ expected_more_balance = Balance(
555
+ confirmed_wallet_balance=uint128(generated_funds),
556
+ unconfirmed_wallet_balance=uint128(generated_funds),
557
+ spendable_balance=uint128(generated_funds),
558
+ max_send_amount=uint128(generated_funds),
559
+ unspent_coin_count=uint32(20),
560
+ )
561
+ async with wallet_node.wallet_state_manager.set_sync_mode(uint32(100)):
562
+ # During sync the balance cache should not become updated, so it still should have the old balance here
563
+ assert await wallet_node.get_balance(wallet_id) == expected_generated_balance
564
+ # Now after the sync context the cache should become updated to the newly genertated balance
565
+ assert await wallet_node.get_balance(wallet_id) == expected_more_balance
566
+ # Restart one more time and make sure the balance is still correct after start
567
+ await restart_with_fingerprint(initial_fingerprint)
568
+ assert await wallet_node.get_balance(wallet_id) == expected_more_balance
569
+
570
+
571
+ @pytest.mark.anyio
572
+ async def test_add_states_from_peer_reorg_failure(
573
+ simulator_and_wallet: OldSimulatorsAndWallets, self_hostname: str, caplog: pytest.LogCaptureFixture
574
+ ) -> None:
575
+ [full_node_api], [(wallet_node, wallet_server)], _ = simulator_and_wallet
576
+ await wallet_server.start_client(PeerInfo(self_hostname, full_node_api.server.get_port()), None)
577
+ wallet = wallet_node.wallet_state_manager.main_wallet
578
+ await full_node_api.farm_rewards_to_wallet(1, wallet)
579
+ coin_generator = CoinGenerator()
580
+ coin_states = [CoinState(coin_generator.get().coin, None, None)]
581
+ with caplog.at_level(logging.DEBUG):
582
+ full_node_peer = next(iter(wallet_server.all_connections.values()))
583
+ # Close the connection to trigger a state processing failure during reorged coin processing.
584
+ await full_node_peer.close()
585
+ assert not await wallet_node.add_states_from_peer(coin_states, full_node_peer)
586
+ assert "Processing reorged states failed" in caplog.text
587
+
588
+
589
+ @pytest.mark.anyio
590
+ async def test_add_states_from_peer_untrusted_shutdown(
591
+ simulator_and_wallet: OldSimulatorsAndWallets, self_hostname: str, caplog: pytest.LogCaptureFixture
592
+ ) -> None:
593
+ [full_node_api], [(wallet_node, wallet_server)], _ = simulator_and_wallet
594
+ await wallet_server.start_client(PeerInfo(self_hostname, full_node_api.server.get_port()), None)
595
+ wallet = wallet_node.wallet_state_manager.main_wallet
596
+ await full_node_api.farm_rewards_to_wallet(1, wallet)
597
+ # Close to trigger the shutdown
598
+ wallet_node._close()
599
+ coin_generator = CoinGenerator()
600
+ # Generate enough coin states to fill up the max number validation/add tasks.
601
+ coin_states = [CoinState(coin_generator.get().coin, uint32(i), uint32(i)) for i in range(3000)]
602
+ with caplog.at_level(logging.INFO):
603
+ assert not await wallet_node.add_states_from_peer(
604
+ coin_states, next(iter(wallet_server.all_connections.values()))
605
+ )
606
+ assert "Terminating receipt and validation due to shut down request" in caplog.text
607
+
608
+
609
+ @pytest.mark.limit_consensus_modes(reason="consensus rules irrelevant")
610
+ @pytest.mark.anyio
611
+ async def test_transaction_send_cache(
612
+ self_hostname: str, simulator_and_wallet: OldSimulatorsAndWallets, monkeypatch: pytest.MonkeyPatch
613
+ ) -> None:
614
+ """
615
+ The purpose of this test is to test that calling _resend_queue on the wallet node does not result in resending a
616
+ spend to a peer that has already recieved that spend and is currently processing it. It also tests that once we
617
+ have heard that the peer is done processing the spend, we _do_ properly resend it.
618
+ """
619
+ [full_node_api], [(wallet_node, wallet_server)], _ = simulator_and_wallet
620
+
621
+ await wallet_server.start_client(PeerInfo(self_hostname, full_node_api.server.get_port()), None)
622
+ wallet = wallet_node.wallet_state_manager.main_wallet
623
+ await full_node_api.farm_rewards_to_wallet(1, wallet)
624
+
625
+ # Replacing the normal logic a full node has for processing transactions with a function that just logs what it gets
626
+ logged_spends = []
627
+
628
+ async def send_transaction(
629
+ self: Self, request: wallet_protocol.SendTransaction, *, test: bool = False
630
+ ) -> Optional[Message]:
631
+ logged_spends.append(request.transaction.name())
632
+ return None
633
+
634
+ assert full_node_api.full_node._server is not None
635
+ with patch_request_handler(api=full_node_api.full_node._server.get_connections()[0].api, handler=send_transaction):
636
+ # Generate the transaction
637
+ async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
638
+ await wallet.generate_signed_transaction(uint64(0), bytes32.zeros, action_scope)
639
+ [tx] = action_scope.side_effects.transactions
640
+
641
+ # Make sure it is sent to the peer
642
+ await wallet_node._resend_queue()
643
+
644
+ def logged_spends_len() -> int:
645
+ return len(logged_spends)
646
+
647
+ await time_out_assert(5, logged_spends_len, 1)
648
+
649
+ # Make sure queue processing again does not result in another spend
650
+ await wallet_node._resend_queue()
651
+ with pytest.raises(AssertionError):
652
+ await time_out_assert(5, logged_spends_len, 2)
653
+
654
+ # Tell the wallet that we recieved the spend (but failed to process it so it should send again)
655
+ msg = make_msg(
656
+ ProtocolMessageTypes.transaction_ack,
657
+ wallet_protocol.TransactionAck(
658
+ tx.name, uint8(MempoolInclusionStatus.FAILED), Err.GENERATOR_RUNTIME_ERROR.name
659
+ ),
660
+ )
661
+ assert simulator_and_wallet[1][0][0]._server is not None
662
+ await simulator_and_wallet[1][0][0]._server.get_connections()[0].incoming_queue.put(msg)
663
+
664
+ # Make sure the cache is emptied
665
+ def check_wallet_cache_empty() -> bool:
666
+ return wallet_node._tx_messages_in_progress == {}
667
+
668
+ await time_out_assert(5, check_wallet_cache_empty, True)
669
+
670
+ # Re-process the queue again and this time it should result in a resend
671
+ await wallet_node._resend_queue()
672
+ await time_out_assert(5, logged_spends_len, 2)
673
+ assert logged_spends == [tx.name, tx.name]
674
+
675
+ await time_out_assert(5, check_wallet_cache_empty, False)
676
+
677
+ # Disconnect from the peer to make sure their entry in the cache is also deleted
678
+ await simulator_and_wallet[1][0][0]._server.get_connections()[0].close(120)
679
+ await time_out_assert(5, check_wallet_cache_empty, True)
680
+
681
+
682
+ @pytest.mark.limit_consensus_modes(reason="consensus rules irrelevant")
683
+ @pytest.mark.anyio
684
+ async def test_wallet_node_bad_coin_state_ignore(
685
+ self_hostname: str, simulator_and_wallet: OldSimulatorsAndWallets, monkeypatch: pytest.MonkeyPatch
686
+ ) -> None:
687
+ [full_node_api], [(wallet_node, wallet_server)], _ = simulator_and_wallet
688
+
689
+ await wallet_server.start_client(PeerInfo(self_hostname, full_node_api.server.get_port()), None)
690
+
691
+ async def register_for_coin_updates(
692
+ self: Self, request: wallet_protocol.RegisterForCoinUpdates, *, test: bool = False
693
+ ) -> Optional[Message]:
694
+ return make_msg(
695
+ ProtocolMessageTypes.respond_to_coin_updates,
696
+ wallet_protocol.RespondToCoinUpdates(
697
+ [], uint32(0), [CoinState(Coin(bytes32.zeros, bytes32.zeros, uint64(0)), uint32(0), uint32(0))]
698
+ ),
699
+ )
700
+
701
+ async def validate_received_state_from_peer(*args: Any) -> bool:
702
+ # It's an interesting case here where we don't hit this unless something is broken
703
+ return True # pragma: no cover
704
+
705
+ assert full_node_api.full_node._server is not None
706
+ with patch_request_handler(
707
+ api=full_node_api.full_node._server.get_connections()[0].api, handler=register_for_coin_updates
708
+ ):
709
+ monkeypatch.setattr(
710
+ wallet_node,
711
+ "validate_received_state_from_peer",
712
+ types.MethodType(validate_received_state_from_peer, wallet_node),
713
+ )
714
+
715
+ with pytest.raises(PeerRequestException):
716
+ await wallet_node.get_coin_state([], wallet_node.get_full_node_peer())
717
+
718
+
719
+ @pytest.mark.anyio
720
+ @pytest.mark.standard_block_tools
721
+ async def test_start_with_multiple_key_types(
722
+ simulator_and_wallet: OldSimulatorsAndWallets, self_hostname: str, default_400_blocks: list[FullBlock]
723
+ ) -> None:
724
+ [_full_node_api], [(wallet_node, _wallet_server)], _bt = simulator_and_wallet
725
+
726
+ async def restart_with_fingerprint(fingerprint: Optional[int]) -> None:
727
+ wallet_node._close()
728
+ await wallet_node._await_closed(shutting_down=False)
729
+ await wallet_node._start_with_fingerprint(fingerprint=fingerprint)
730
+
731
+ initial_sk = wallet_node.wallet_state_manager.private_key
732
+
733
+ pk: G1Element = await wallet_node.keychain_proxy.add_key(
734
+ "c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
735
+ None,
736
+ private=False,
737
+ )
738
+ fingerprint_pk: int = pk.get_fingerprint()
739
+
740
+ await restart_with_fingerprint(fingerprint_pk)
741
+ assert wallet_node.wallet_state_manager.private_key is None
742
+ assert wallet_node.wallet_state_manager.root_pubkey == G1Element()
743
+
744
+ await wallet_node.keychain_proxy.delete_key_by_fingerprint(fingerprint_pk)
745
+
746
+ await restart_with_fingerprint(fingerprint_pk)
747
+ assert wallet_node.wallet_state_manager.private_key == initial_sk
748
+
749
+
750
+ @pytest.mark.anyio
751
+ @pytest.mark.standard_block_tools
752
+ async def test_start_with_multiple_keys(
753
+ simulator_and_wallet: OldSimulatorsAndWallets, self_hostname: str, default_400_blocks: list[FullBlock]
754
+ ) -> None:
755
+ [_full_node_api], [(wallet_node, _wallet_server)], _bt = simulator_and_wallet
756
+
757
+ async def restart_with_fingerprint(fingerprint: Optional[int]) -> None:
758
+ wallet_node._close()
759
+ await wallet_node._await_closed(shutting_down=False)
760
+ await wallet_node._start_with_fingerprint(fingerprint=fingerprint)
761
+
762
+ initial_sk = wallet_node.wallet_state_manager.private_key
763
+
764
+ sk_2: PrivateKey = await wallet_node.keychain_proxy.add_key(
765
+ (
766
+ "cup smoke miss park baby say island tomorrow segment lava bitter easily settle gift "
767
+ "renew arrive kangaroo dilemma organ skin design salt history awesome"
768
+ ),
769
+ None,
770
+ private=True,
771
+ )
772
+ fingerprint_2: int = sk_2.get_g1().get_fingerprint()
773
+
774
+ await restart_with_fingerprint(fingerprint_2)
775
+ assert wallet_node.wallet_state_manager.private_key == sk_2
776
+
777
+ await wallet_node.keychain_proxy.delete_key_by_fingerprint(fingerprint_2)
778
+
779
+ await restart_with_fingerprint(fingerprint_2)
780
+ assert wallet_node.wallet_state_manager.private_key == initial_sk