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