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,1419 @@
1
+ # ruff: noqa: E402 # See imports after multiprocessing.set_start_method
2
+ from __future__ import annotations
3
+
4
+ import asyncio
5
+ import datetime
6
+ import functools
7
+ import json
8
+ import logging
9
+ import math
10
+ import multiprocessing
11
+ import os
12
+ import random
13
+ import sysconfig
14
+ import tempfile
15
+ from collections.abc import AsyncIterator, Iterator
16
+ from contextlib import AsyncExitStack
17
+ from typing import Any, Callable, Union
18
+
19
+ import aiohttp
20
+ import pytest
21
+
22
+ # TODO: update after resolution in https://github.com/pytest-dev/pytest/issues/7469
23
+ from _pytest.fixtures import SubRequest
24
+ from pytest import MonkeyPatch
25
+
26
+ from chia._tests import ether
27
+ from chia._tests.core.data_layer.util import ChiaRoot
28
+ from chia._tests.core.node_height import node_height_at_least
29
+ from chia._tests.simulation.test_simulation import test_constants_modified
30
+ from chia._tests.util.misc import (
31
+ BenchmarkRunner,
32
+ ComparableEnum,
33
+ GcMode,
34
+ RecordingWebServer,
35
+ TestId,
36
+ _AssertRuntime,
37
+ measure_overhead,
38
+ )
39
+ from chia._tests.util.setup_nodes import (
40
+ OldSimulatorsAndWallets,
41
+ SimulatorsAndWallets,
42
+ setup_full_system,
43
+ setup_n_nodes,
44
+ setup_simulators_and_wallets,
45
+ setup_simulators_and_wallets_service,
46
+ setup_two_nodes,
47
+ )
48
+ from chia._tests.util.spend_sim import CostLogger
49
+ from chia._tests.util.time_out_assert import time_out_assert
50
+ from chia.consensus.constants import ConsensusConstants
51
+ from chia.full_node.full_node_api import FullNodeAPI
52
+ from chia.rpc.farmer_rpc_client import FarmerRpcClient
53
+ from chia.rpc.harvester_rpc_client import HarvesterRpcClient
54
+ from chia.rpc.wallet_rpc_client import WalletRpcClient
55
+ from chia.seeder.dns_server import DNSServer
56
+ from chia.server.server import ChiaServer
57
+ from chia.server.start_service import Service
58
+ from chia.simulator.full_node_simulator import FullNodeSimulator
59
+ from chia.simulator.setup_services import (
60
+ setup_crawler,
61
+ setup_daemon,
62
+ setup_full_node,
63
+ setup_introducer,
64
+ setup_seeder,
65
+ setup_timelord,
66
+ )
67
+ from chia.simulator.start_simulator import SimulatorFullNodeService
68
+ from chia.simulator.wallet_tools import WalletTool
69
+
70
+ # Set spawn after stdlib imports, but before other imports
71
+ from chia.types.aliases import (
72
+ CrawlerService,
73
+ FarmerService,
74
+ FullNodeService,
75
+ HarvesterService,
76
+ TimelordService,
77
+ WalletService,
78
+ )
79
+ from chia.types.peer_info import PeerInfo
80
+ from chia.util.config import create_default_chia_config, lock_and_load_config
81
+ from chia.util.db_wrapper import generate_in_memory_db_uri
82
+ from chia.util.ints import uint8, uint16, uint32, uint64
83
+ from chia.util.keychain import Keychain
84
+ from chia.util.task_timing import main as task_instrumentation_main
85
+ from chia.util.task_timing import start_task_instrumentation, stop_task_instrumentation
86
+ from chia.wallet.wallet_node import WalletNode
87
+
88
+ multiprocessing.set_start_method("spawn")
89
+
90
+ from dataclasses import replace
91
+ from pathlib import Path
92
+
93
+ from chia._tests.environments.wallet import WalletEnvironment, WalletState, WalletTestFramework
94
+ from chia._tests.util.setup_nodes import setup_farmer_multi_harvester
95
+ from chia.rpc.full_node_rpc_client import FullNodeRpcClient
96
+ from chia.simulator.block_tools import BlockTools, create_block_tools_async, test_constants
97
+ from chia.simulator.keyring import TempKeyring
98
+ from chia.util.ints import uint128
99
+ from chia.util.keyring_wrapper import KeyringWrapper
100
+ from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG, TXConfig
101
+ from chia.wallet.wallet_node import Balance
102
+
103
+
104
+ @pytest.fixture(name="ether_setup", autouse=True)
105
+ def ether_setup_fixture(request: SubRequest, record_property: Callable[[str, object], None]) -> Iterator[None]:
106
+ with MonkeyPatch.context() as monkeypatch_context:
107
+ monkeypatch_context.setattr(ether, "record_property", record_property)
108
+ monkeypatch_context.setattr(ether, "test_id", TestId.create(node=request.node))
109
+ yield
110
+
111
+
112
+ @pytest.fixture(autouse=True)
113
+ def ether_test_id_property_fixture(ether_setup: None, record_property: Callable[[str, object], None]) -> None:
114
+ assert ether.test_id is not None, "ether.test_id is None, did you forget to use the ether_setup fixture?"
115
+ record_property("test_id", json.dumps(ether.test_id.marshal(), ensure_ascii=True, sort_keys=True))
116
+
117
+
118
+ def make_old_setup_simulators_and_wallets(new: SimulatorsAndWallets) -> OldSimulatorsAndWallets:
119
+ return (
120
+ [simulator.peer_api for simulator in new.simulators],
121
+ [(wallet.node, wallet.peer_server) for wallet in new.wallets],
122
+ new.bt,
123
+ )
124
+
125
+
126
+ @pytest.fixture(scope="session")
127
+ def anyio_backend():
128
+ return "asyncio"
129
+
130
+
131
+ @pytest.fixture(name="event_loop")
132
+ async def event_loop_fixture() -> asyncio.events.AbstractEventLoop:
133
+ return asyncio.get_running_loop()
134
+
135
+
136
+ @pytest.fixture(name="seeded_random")
137
+ def seeded_random_fixture() -> random.Random:
138
+ seeded_random = random.Random()
139
+ seeded_random.seed(a=0, version=2)
140
+ return seeded_random
141
+
142
+
143
+ @pytest.fixture(name="benchmark_runner_overhead", scope="session")
144
+ def benchmark_runner_overhead_fixture() -> float:
145
+ return measure_overhead(
146
+ manager_maker=functools.partial(
147
+ _AssertRuntime,
148
+ gc_mode=GcMode.nothing,
149
+ seconds=math.inf,
150
+ print=False,
151
+ ),
152
+ cycles=100,
153
+ )
154
+
155
+
156
+ @pytest.fixture(name="benchmark_runner")
157
+ def benchmark_runner_fixture(
158
+ benchmark_runner_overhead: float,
159
+ benchmark_repeat: int,
160
+ ) -> BenchmarkRunner:
161
+ return BenchmarkRunner(
162
+ test_id=ether.test_id,
163
+ overhead=benchmark_runner_overhead,
164
+ )
165
+
166
+
167
+ @pytest.fixture(name="node_name_for_file")
168
+ def node_name_for_file_fixture(request: SubRequest) -> str:
169
+ # TODO: handle other characters banned on windows
170
+ return request.node.name.replace(os.sep, "_")
171
+
172
+
173
+ @pytest.fixture(name="test_time_for_file")
174
+ def test_time_for_file_fixture(request: SubRequest) -> str:
175
+ return datetime.datetime.now().isoformat().replace(":", "_")
176
+
177
+
178
+ @pytest.fixture(name="task_instrumentation")
179
+ def task_instrumentation_fixture(node_name_for_file: str, test_time_for_file: str) -> Iterator[None]:
180
+ target_directory = f"task-profile-{node_name_for_file}-{test_time_for_file}"
181
+
182
+ start_task_instrumentation()
183
+ yield
184
+ stop_task_instrumentation(target_dir=target_directory)
185
+ task_instrumentation_main(args=[target_directory])
186
+
187
+
188
+ @pytest.fixture(scope="session")
189
+ def get_keychain():
190
+ with TempKeyring() as keychain:
191
+ yield keychain
192
+ KeyringWrapper.cleanup_shared_instance()
193
+
194
+
195
+ class ConsensusMode(ComparableEnum):
196
+ PLAIN = 0
197
+ HARD_FORK_2_0 = 1
198
+ SOFT_FORK_6 = 2
199
+
200
+
201
+ @pytest.fixture(
202
+ scope="session",
203
+ params=[ConsensusMode.PLAIN, ConsensusMode.HARD_FORK_2_0, ConsensusMode.SOFT_FORK_6],
204
+ )
205
+ def consensus_mode(request):
206
+ return request.param
207
+
208
+
209
+ @pytest.fixture(scope="session")
210
+ def blockchain_constants(consensus_mode: ConsensusMode) -> ConsensusConstants:
211
+ ret: ConsensusConstants = test_constants
212
+ if consensus_mode >= ConsensusMode.HARD_FORK_2_0:
213
+ ret = ret.replace(
214
+ HARD_FORK_HEIGHT=uint32(2),
215
+ PLOT_FILTER_128_HEIGHT=uint32(10),
216
+ PLOT_FILTER_64_HEIGHT=uint32(15),
217
+ PLOT_FILTER_32_HEIGHT=uint32(20),
218
+ )
219
+ if consensus_mode >= ConsensusMode.SOFT_FORK_6:
220
+ ret = ret.replace(
221
+ SOFT_FORK6_HEIGHT=uint32(2),
222
+ )
223
+ return ret
224
+
225
+
226
+ @pytest.fixture(scope="session", name="bt")
227
+ async def block_tools_fixture(get_keychain, blockchain_constants, anyio_backend) -> BlockTools:
228
+ # Note that this causes a lot of CPU and disk traffic - disk, DB, ports, process creation ...
229
+ _shared_block_tools = await create_block_tools_async(constants=blockchain_constants, keychain=get_keychain)
230
+ return _shared_block_tools
231
+
232
+
233
+ # if you have a system that has an unusual hostname for localhost and you want
234
+ # to run the tests, change the `self_hostname` fixture
235
+ @pytest.fixture(scope="session")
236
+ def self_hostname():
237
+ return "127.0.0.1"
238
+
239
+
240
+ # NOTE:
241
+ # Instantiating the bt fixture results in an attempt to create the chia root directory
242
+ # which the build scripts symlink to a sometimes-not-there directory.
243
+ # When not there, Python complains since, well, the symlink is not a directory nor points to a directory.
244
+ #
245
+ # Now that we have removed the global at tests.setup_nodes.bt, we can move the imports out of
246
+ # the fixtures below. Just be aware of the filesystem modification during bt fixture creation
247
+
248
+
249
+ @pytest.fixture(scope="function")
250
+ async def empty_blockchain(latest_db_version, blockchain_constants):
251
+ """
252
+ Provides a list of 10 valid blocks, as well as a blockchain with 9 blocks added to it.
253
+ """
254
+ from chia._tests.util.blockchain import create_blockchain
255
+
256
+ async with create_blockchain(blockchain_constants, latest_db_version) as (bc1, _):
257
+ yield bc1
258
+
259
+
260
+ @pytest.fixture(scope="function")
261
+ def latest_db_version() -> int:
262
+ return 2
263
+
264
+
265
+ @pytest.fixture(scope="function", params=[2])
266
+ def db_version(request) -> int:
267
+ return request.param
268
+
269
+
270
+ SOFTFORK_HEIGHTS = [1000000, 5496000, 5496100, 5716000, 6800000]
271
+
272
+
273
+ @pytest.fixture(scope="function", params=SOFTFORK_HEIGHTS)
274
+ def softfork_height(request) -> int:
275
+ return request.param
276
+
277
+
278
+ saved_blocks_version = "2.0"
279
+
280
+
281
+ @pytest.fixture(scope="session")
282
+ def default_400_blocks(bt, consensus_mode):
283
+ version = ""
284
+ if consensus_mode >= ConsensusMode.HARD_FORK_2_0:
285
+ version = "_hardfork"
286
+
287
+ from chia._tests.util.blockchain import persistent_blocks
288
+
289
+ return persistent_blocks(400, f"test_blocks_400_{saved_blocks_version}{version}.db", bt, seed=b"400")
290
+
291
+
292
+ @pytest.fixture(scope="session")
293
+ def default_1000_blocks(bt, consensus_mode):
294
+ version = ""
295
+ if consensus_mode >= ConsensusMode.HARD_FORK_2_0:
296
+ version = "_hardfork"
297
+
298
+ from chia._tests.util.blockchain import persistent_blocks
299
+
300
+ return persistent_blocks(1000, f"test_blocks_1000_{saved_blocks_version}{version}.db", bt, seed=b"1000")
301
+
302
+
303
+ @pytest.fixture(scope="session")
304
+ def pre_genesis_empty_slots_1000_blocks(bt, consensus_mode):
305
+ version = ""
306
+ if consensus_mode >= ConsensusMode.HARD_FORK_2_0:
307
+ version = "_hardfork"
308
+
309
+ from chia._tests.util.blockchain import persistent_blocks
310
+
311
+ return persistent_blocks(
312
+ 1000,
313
+ f"pre_genesis_empty_slots_1000_blocks{saved_blocks_version}{version}.db",
314
+ bt,
315
+ seed=b"empty_slots",
316
+ empty_sub_slots=1,
317
+ )
318
+
319
+
320
+ @pytest.fixture(scope="session")
321
+ def default_1500_blocks(bt, consensus_mode):
322
+ version = ""
323
+ if consensus_mode >= ConsensusMode.HARD_FORK_2_0:
324
+ version = "_hardfork"
325
+
326
+ from chia._tests.util.blockchain import persistent_blocks
327
+
328
+ return persistent_blocks(1500, f"test_blocks_1500_{saved_blocks_version}{version}.db", bt, seed=b"1500")
329
+
330
+
331
+ @pytest.fixture(scope="session")
332
+ def default_10000_blocks(bt, consensus_mode):
333
+ from chia._tests.util.blockchain import persistent_blocks
334
+
335
+ version = ""
336
+ if consensus_mode >= ConsensusMode.HARD_FORK_2_0:
337
+ version = "_hardfork"
338
+
339
+ return persistent_blocks(
340
+ 10000,
341
+ f"test_blocks_10000_{saved_blocks_version}{version}.db",
342
+ bt,
343
+ seed=b"10000",
344
+ dummy_block_references=True,
345
+ )
346
+
347
+
348
+ # this long reorg chain shares the first 500 blocks with "default_10000_blocks"
349
+ # and has heavier weight blocks
350
+ @pytest.fixture(scope="session")
351
+ def test_long_reorg_blocks(bt, consensus_mode, default_10000_blocks):
352
+ version = ""
353
+ if consensus_mode >= ConsensusMode.HARD_FORK_2_0:
354
+ version = "_hardfork"
355
+
356
+ from chia._tests.util.blockchain import persistent_blocks
357
+
358
+ return persistent_blocks(
359
+ 4500,
360
+ f"test_blocks_long_reorg_{saved_blocks_version}{version}.db",
361
+ bt,
362
+ block_list_input=default_10000_blocks[:500],
363
+ seed=b"reorg_blocks",
364
+ time_per_block=8,
365
+ dummy_block_references=True,
366
+ include_transactions=True,
367
+ )
368
+
369
+
370
+ @pytest.fixture(scope="session")
371
+ def test_long_reorg_1500_blocks(bt, consensus_mode, default_10000_blocks):
372
+ version = ""
373
+ if consensus_mode >= ConsensusMode.HARD_FORK_2_0:
374
+ version = "_hardfork"
375
+
376
+ from chia._tests.util.blockchain import persistent_blocks
377
+
378
+ return persistent_blocks(
379
+ 4500,
380
+ f"test_blocks_long_reorg_{saved_blocks_version}{version}-2.db",
381
+ bt,
382
+ block_list_input=default_10000_blocks[:1500],
383
+ seed=b"reorg_blocks",
384
+ time_per_block=8,
385
+ dummy_block_references=True,
386
+ include_transactions=True,
387
+ )
388
+
389
+
390
+ # this long reorg chain shares the first 500 blocks with "default_10000_blocks"
391
+ # and has the same weight blocks
392
+ @pytest.fixture(scope="session")
393
+ def test_long_reorg_blocks_light(bt, consensus_mode, default_10000_blocks):
394
+ version = ""
395
+ if consensus_mode >= ConsensusMode.HARD_FORK_2_0:
396
+ version = "_hardfork"
397
+
398
+ from chia._tests.util.blockchain import persistent_blocks
399
+
400
+ return persistent_blocks(
401
+ 4500,
402
+ f"test_blocks_long_reorg_light_{saved_blocks_version}{version}.db",
403
+ bt,
404
+ block_list_input=default_10000_blocks[:500],
405
+ seed=b"reorg_blocks2",
406
+ dummy_block_references=True,
407
+ include_transactions=True,
408
+ )
409
+
410
+
411
+ @pytest.fixture(scope="session")
412
+ def test_long_reorg_1500_blocks_light(bt, consensus_mode, default_10000_blocks):
413
+ version = ""
414
+ if consensus_mode >= ConsensusMode.HARD_FORK_2_0:
415
+ version = "_hardfork"
416
+
417
+ from chia._tests.util.blockchain import persistent_blocks
418
+
419
+ return persistent_blocks(
420
+ 4500,
421
+ f"test_blocks_long_reorg_light_{saved_blocks_version}{version}-2.db",
422
+ bt,
423
+ block_list_input=default_10000_blocks[:1500],
424
+ seed=b"reorg_blocks2",
425
+ dummy_block_references=True,
426
+ include_transactions=True,
427
+ )
428
+
429
+
430
+ @pytest.fixture(scope="session")
431
+ def default_2000_blocks_compact(bt, consensus_mode):
432
+ version = ""
433
+ if consensus_mode >= ConsensusMode.HARD_FORK_2_0:
434
+ version = "_hardfork"
435
+
436
+ from chia._tests.util.blockchain import persistent_blocks
437
+
438
+ return persistent_blocks(
439
+ 2000,
440
+ f"test_blocks_2000_compact_{saved_blocks_version}{version}.db",
441
+ bt,
442
+ normalized_to_identity_cc_eos=True,
443
+ normalized_to_identity_icc_eos=True,
444
+ normalized_to_identity_cc_ip=True,
445
+ normalized_to_identity_cc_sp=True,
446
+ seed=b"2000_compact",
447
+ )
448
+
449
+
450
+ @pytest.fixture(scope="session")
451
+ def default_10000_blocks_compact(bt, consensus_mode):
452
+ from chia._tests.util.blockchain import persistent_blocks
453
+
454
+ version = ""
455
+ if consensus_mode >= ConsensusMode.HARD_FORK_2_0:
456
+ version = "_hardfork"
457
+
458
+ return persistent_blocks(
459
+ 10000,
460
+ f"test_blocks_10000_compact_{saved_blocks_version}{version}.db",
461
+ bt,
462
+ normalized_to_identity_cc_eos=True,
463
+ normalized_to_identity_icc_eos=True,
464
+ normalized_to_identity_cc_ip=True,
465
+ normalized_to_identity_cc_sp=True,
466
+ seed=b"1000_compact",
467
+ )
468
+
469
+
470
+ @pytest.fixture(scope="function")
471
+ def tmp_dir():
472
+ with tempfile.TemporaryDirectory() as folder:
473
+ yield Path(folder)
474
+
475
+
476
+ # For the below see https://stackoverflow.com/a/62563106/15133773
477
+ if os.getenv("_PYTEST_RAISE", "0") != "0":
478
+
479
+ @pytest.hookimpl(tryfirst=True)
480
+ def pytest_exception_interact(call):
481
+ raise call.excinfo.value
482
+
483
+ @pytest.hookimpl(tryfirst=True)
484
+ def pytest_internalerror(excinfo):
485
+ raise excinfo.value
486
+
487
+
488
+ def pytest_addoption(parser: pytest.Parser):
489
+ default_repeats = 1
490
+ group = parser.getgroup("chia")
491
+ group.addoption(
492
+ "--benchmark-repeats",
493
+ action="store",
494
+ default=default_repeats,
495
+ type=int,
496
+ help=f"The number of times to run each benchmark, default {default_repeats}.",
497
+ )
498
+ group.addoption(
499
+ "--time-out-assert-repeats",
500
+ action="store",
501
+ default=default_repeats,
502
+ type=int,
503
+ help=f"The number of times to run each test with time out asserts, default {default_repeats}.",
504
+ )
505
+
506
+
507
+ def pytest_configure(config):
508
+ for logger_name in ["aiosqlite", "filelock", "watchdog"]:
509
+ logger = logging.getLogger(logger_name)
510
+ logger.setLevel(max(logger.getEffectiveLevel(), logging.INFO))
511
+
512
+ config.addinivalue_line("markers", "benchmark: automatically assigned by the benchmark_runner fixture")
513
+
514
+ benchmark_repeats = config.getoption("--benchmark-repeats")
515
+ if benchmark_repeats != 1:
516
+
517
+ @pytest.fixture(
518
+ name="benchmark_repeat",
519
+ params=[pytest.param(repeat, id=f"benchmark_repeat{repeat:03d}") for repeat in range(benchmark_repeats)],
520
+ )
521
+ def benchmark_repeat_fixture(request: SubRequest) -> int:
522
+ return request.param
523
+
524
+ else:
525
+
526
+ @pytest.fixture(
527
+ name="benchmark_repeat",
528
+ )
529
+ def benchmark_repeat_fixture() -> int:
530
+ return 1
531
+
532
+ globals()[benchmark_repeat_fixture.__name__] = benchmark_repeat_fixture
533
+
534
+ time_out_assert_repeats = config.getoption("--time-out-assert-repeats")
535
+ if time_out_assert_repeats != 1:
536
+
537
+ @pytest.fixture(
538
+ name="time_out_assert_repeat",
539
+ autouse=True,
540
+ params=[
541
+ pytest.param(repeat, id=f"time_out_assert_repeat{repeat:03d}")
542
+ for repeat in range(time_out_assert_repeats)
543
+ ],
544
+ )
545
+ def time_out_assert_repeat_fixture(request: SubRequest) -> int:
546
+ return request.param
547
+
548
+ globals()[time_out_assert_repeat_fixture.__name__] = time_out_assert_repeat_fixture
549
+
550
+
551
+ def pytest_collection_modifyitems(session, config: pytest.Config, items: list[pytest.Function]):
552
+ # https://github.com/pytest-dev/pytest/issues/3730#issuecomment-567142496
553
+ removed = []
554
+ kept = []
555
+ all_error_lines: list[str] = []
556
+ limit_consensus_modes_problems: list[str] = []
557
+ for item in items:
558
+ limit_consensus_modes_marker = item.get_closest_marker("limit_consensus_modes")
559
+ if limit_consensus_modes_marker is not None:
560
+ callspec = getattr(item, "callspec", None)
561
+ if callspec is None:
562
+ limit_consensus_modes_problems.append(item.name)
563
+ continue
564
+
565
+ mode = callspec.params.get("consensus_mode")
566
+ if mode is None:
567
+ limit_consensus_modes_problems.append(item.name)
568
+ continue
569
+
570
+ modes = limit_consensus_modes_marker.kwargs.get("allowed", [ConsensusMode.PLAIN])
571
+ if mode not in modes:
572
+ removed.append(item)
573
+ continue
574
+
575
+ kept.append(item)
576
+ if removed:
577
+ config.hook.pytest_deselected(items=removed)
578
+ items[:] = kept
579
+
580
+ if len(limit_consensus_modes_problems) > 0:
581
+ all_error_lines.append("@pytest.mark.limit_consensus_modes used without consensus_mode:")
582
+ all_error_lines.extend(f" {line}" for line in limit_consensus_modes_problems)
583
+
584
+ benchmark_problems: list[str] = []
585
+ for item in items:
586
+ existing_benchmark_mark = item.get_closest_marker("benchmark")
587
+ if existing_benchmark_mark is not None:
588
+ benchmark_problems.append(item.name)
589
+
590
+ if "benchmark_runner" in getattr(item, "fixturenames", ()):
591
+ item.add_marker("benchmark")
592
+
593
+ if len(benchmark_problems) > 0:
594
+ all_error_lines.append("use the benchmark_runner fixture, not @pytest.mark.benchmark:")
595
+ all_error_lines.extend(f" {line}" for line in benchmark_problems)
596
+
597
+ if len(all_error_lines) > 0:
598
+ all_error_lines.insert(0, "custom chia collection rules failed")
599
+ raise Exception("\n".join(all_error_lines))
600
+
601
+
602
+ @pytest.fixture(scope="function")
603
+ async def node_with_params(request, blockchain_constants: ConsensusConstants) -> AsyncIterator[FullNodeSimulator]:
604
+ params = {}
605
+ if request:
606
+ params = request.param
607
+ async with setup_simulators_and_wallets(1, 0, blockchain_constants, **params) as new:
608
+ yield new.simulators[0].peer_api
609
+
610
+
611
+ @pytest.fixture(scope="function")
612
+ async def two_nodes(db_version: int, self_hostname, blockchain_constants: ConsensusConstants):
613
+ async with setup_two_nodes(blockchain_constants, db_version=db_version, self_hostname=self_hostname) as _:
614
+ yield _
615
+
616
+
617
+ @pytest.fixture(scope="function")
618
+ async def setup_two_nodes_fixture(
619
+ db_version: int, blockchain_constants: ConsensusConstants
620
+ ) -> AsyncIterator[tuple[list[FullNodeSimulator], list[tuple[WalletNode, ChiaServer]], BlockTools]]:
621
+ async with setup_simulators_and_wallets(2, 0, blockchain_constants, db_version=db_version) as new:
622
+ yield make_old_setup_simulators_and_wallets(new=new)
623
+
624
+
625
+ @pytest.fixture(scope="function")
626
+ async def three_nodes(db_version: int, self_hostname, blockchain_constants):
627
+ async with setup_n_nodes(blockchain_constants, 3, db_version=db_version, self_hostname=self_hostname) as _:
628
+ yield _
629
+
630
+
631
+ @pytest.fixture(scope="function")
632
+ async def five_nodes(db_version: int, self_hostname, blockchain_constants):
633
+ async with setup_n_nodes(blockchain_constants, 5, db_version=db_version, self_hostname=self_hostname) as _:
634
+ yield _
635
+
636
+
637
+ @pytest.fixture(scope="function")
638
+ async def wallet_nodes(blockchain_constants, consensus_mode):
639
+ async with setup_simulators_and_wallets(
640
+ 2,
641
+ 1,
642
+ blockchain_constants.replace(MEMPOOL_BLOCK_BUFFER=1, MAX_BLOCK_COST_CLVM=400000000),
643
+ ) as new:
644
+ (nodes, _wallets, bt) = make_old_setup_simulators_and_wallets(new=new)
645
+ full_node_1 = nodes[0]
646
+ full_node_2 = nodes[1]
647
+ server_1 = full_node_1.full_node.server
648
+ server_2 = full_node_2.full_node.server
649
+ wallet_a = bt.get_pool_wallet_tool()
650
+ wallet_receiver = WalletTool(full_node_1.full_node.constants)
651
+ yield full_node_1, full_node_2, server_1, server_2, wallet_a, wallet_receiver, bt
652
+
653
+
654
+ @pytest.fixture(scope="function")
655
+ async def setup_four_nodes(db_version, blockchain_constants: ConsensusConstants):
656
+ async with setup_simulators_and_wallets(4, 0, blockchain_constants, db_version=db_version) as new:
657
+ yield make_old_setup_simulators_and_wallets(new=new)
658
+
659
+
660
+ @pytest.fixture(scope="function")
661
+ async def two_nodes_sim_and_wallets_services(blockchain_constants, consensus_mode):
662
+ async with setup_simulators_and_wallets_service(2, 0, blockchain_constants) as _:
663
+ yield _
664
+
665
+
666
+ @pytest.fixture(scope="function")
667
+ async def one_wallet_and_one_simulator_services(blockchain_constants: ConsensusConstants):
668
+ async with setup_simulators_and_wallets_service(1, 1, blockchain_constants) as _:
669
+ yield _
670
+
671
+
672
+ @pytest.fixture(scope="function")
673
+ async def wallet_node_100_pk(blockchain_constants: ConsensusConstants):
674
+ async with setup_simulators_and_wallets(1, 1, blockchain_constants, initial_num_public_keys=100) as new:
675
+ yield make_old_setup_simulators_and_wallets(new=new)
676
+
677
+
678
+ @pytest.fixture(scope="function")
679
+ async def simulator_and_wallet(
680
+ blockchain_constants: ConsensusConstants,
681
+ ) -> AsyncIterator[tuple[list[FullNodeSimulator], list[tuple[WalletNode, ChiaServer]], BlockTools]]:
682
+ async with setup_simulators_and_wallets(1, 1, blockchain_constants) as new:
683
+ yield make_old_setup_simulators_and_wallets(new=new)
684
+
685
+
686
+ @pytest.fixture(scope="function")
687
+ async def two_wallet_nodes(request, blockchain_constants: ConsensusConstants):
688
+ params = {}
689
+ if request and request.param_index > 0:
690
+ params = request.param
691
+ async with setup_simulators_and_wallets(1, 2, blockchain_constants, **params) as new:
692
+ yield make_old_setup_simulators_and_wallets(new=new)
693
+
694
+
695
+ @pytest.fixture(scope="function")
696
+ async def two_wallet_nodes_services(
697
+ blockchain_constants: ConsensusConstants,
698
+ ) -> AsyncIterator[tuple[list[SimulatorFullNodeService], list[WalletService], BlockTools]]:
699
+ async with setup_simulators_and_wallets_service(1, 2, blockchain_constants) as _:
700
+ yield _
701
+
702
+
703
+ @pytest.fixture(scope="function")
704
+ async def two_wallet_nodes_custom_spam_filtering(
705
+ spam_filter_after_n_txs, xch_spam_amount, blockchain_constants: ConsensusConstants
706
+ ):
707
+ async with setup_simulators_and_wallets(
708
+ 1, 2, blockchain_constants, spam_filter_after_n_txs, xch_spam_amount
709
+ ) as new:
710
+ yield make_old_setup_simulators_and_wallets(new=new)
711
+
712
+
713
+ @pytest.fixture(scope="function")
714
+ async def three_sim_two_wallets(blockchain_constants: ConsensusConstants):
715
+ async with setup_simulators_and_wallets(3, 2, blockchain_constants) as new:
716
+ yield make_old_setup_simulators_and_wallets(new=new)
717
+
718
+
719
+ @pytest.fixture(scope="function")
720
+ async def setup_two_nodes_and_wallet(blockchain_constants: ConsensusConstants):
721
+ async with setup_simulators_and_wallets(2, 1, blockchain_constants, db_version=2) as new:
722
+ yield make_old_setup_simulators_and_wallets(new=new)
723
+
724
+
725
+ @pytest.fixture(scope="function")
726
+ async def setup_two_nodes_and_wallet_fast_retry(blockchain_constants: ConsensusConstants):
727
+ async with setup_simulators_and_wallets(
728
+ 1, 1, blockchain_constants, config_overrides={"wallet.tx_resend_timeout_secs": 1}, db_version=2
729
+ ) as new:
730
+ yield make_old_setup_simulators_and_wallets(new=new)
731
+
732
+
733
+ @pytest.fixture(scope="function")
734
+ async def three_wallet_nodes(blockchain_constants: ConsensusConstants):
735
+ async with setup_simulators_and_wallets(1, 3, blockchain_constants) as new:
736
+ yield make_old_setup_simulators_and_wallets(new=new)
737
+
738
+
739
+ @pytest.fixture(scope="function")
740
+ async def wallet_two_node_simulator(blockchain_constants: ConsensusConstants):
741
+ async with setup_simulators_and_wallets(2, 1, blockchain_constants) as new:
742
+ yield make_old_setup_simulators_and_wallets(new=new)
743
+
744
+
745
+ @pytest.fixture(scope="function")
746
+ async def wallet_nodes_mempool_perf(bt):
747
+ key_seed = bt.farmer_master_sk_entropy
748
+ async with setup_simulators_and_wallets(1, 1, bt.constants, key_seed=key_seed) as new:
749
+ yield make_old_setup_simulators_and_wallets(new=new)
750
+
751
+
752
+ @pytest.fixture(scope="function")
753
+ async def two_nodes_two_wallets_with_same_keys(bt) -> AsyncIterator[OldSimulatorsAndWallets]:
754
+ key_seed = bt.farmer_master_sk_entropy
755
+ async with setup_simulators_and_wallets(2, 2, bt.constants, key_seed=key_seed) as new:
756
+ yield make_old_setup_simulators_and_wallets(new=new)
757
+
758
+
759
+ @pytest.fixture
760
+ async def wallet_nodes_perf(blockchain_constants: ConsensusConstants):
761
+ async with setup_simulators_and_wallets(
762
+ 1, 1, blockchain_constants, config_overrides={"MEMPOOL_BLOCK_BUFFER": 1, "MAX_BLOCK_COST_CLVM": 11000000000}
763
+ ) as new:
764
+ (nodes, _wallets, bt) = make_old_setup_simulators_and_wallets(new=new)
765
+ full_node_1 = nodes[0]
766
+ server_1 = full_node_1.full_node.server
767
+ wallet_a = bt.get_pool_wallet_tool()
768
+ wallet_receiver = WalletTool(full_node_1.full_node.constants)
769
+ yield full_node_1, server_1, wallet_a, wallet_receiver, bt
770
+
771
+
772
+ @pytest.fixture(scope="function")
773
+ async def three_nodes_two_wallets(blockchain_constants: ConsensusConstants):
774
+ async with setup_simulators_and_wallets(3, 2, blockchain_constants) as new:
775
+ yield make_old_setup_simulators_and_wallets(new=new)
776
+
777
+
778
+ @pytest.fixture(scope="function")
779
+ async def one_node(
780
+ blockchain_constants: ConsensusConstants,
781
+ ) -> AsyncIterator[tuple[list[Service], list[FullNodeSimulator], BlockTools]]:
782
+ async with setup_simulators_and_wallets_service(1, 0, blockchain_constants) as _:
783
+ yield _
784
+
785
+
786
+ @pytest.fixture(scope="function")
787
+ async def one_node_one_block(
788
+ blockchain_constants: ConsensusConstants,
789
+ ) -> AsyncIterator[tuple[Union[FullNodeAPI, FullNodeSimulator], ChiaServer, BlockTools]]:
790
+ async with setup_simulators_and_wallets(1, 0, blockchain_constants) as new:
791
+ (nodes, _, bt) = make_old_setup_simulators_and_wallets(new=new)
792
+ full_node_1 = nodes[0]
793
+ server_1 = full_node_1.full_node.server
794
+ wallet_a = bt.get_pool_wallet_tool()
795
+
796
+ reward_ph = wallet_a.get_new_puzzlehash()
797
+ blocks = bt.get_consecutive_blocks(
798
+ 1,
799
+ guarantee_transaction_block=True,
800
+ farmer_reward_puzzle_hash=reward_ph,
801
+ pool_reward_puzzle_hash=reward_ph,
802
+ genesis_timestamp=uint64(10000),
803
+ time_per_block=10,
804
+ )
805
+ assert blocks[0].height == 0
806
+
807
+ for block in blocks:
808
+ await full_node_1.full_node.add_block(block)
809
+
810
+ await time_out_assert(60, node_height_at_least, True, full_node_1, blocks[-1].height)
811
+
812
+ yield full_node_1, server_1, bt
813
+
814
+
815
+ @pytest.fixture(scope="function")
816
+ async def two_nodes_one_block(blockchain_constants: ConsensusConstants):
817
+ async with setup_simulators_and_wallets(2, 0, blockchain_constants) as new:
818
+ (nodes, _, bt) = make_old_setup_simulators_and_wallets(new=new)
819
+ full_node_1 = nodes[0]
820
+ full_node_2 = nodes[1]
821
+ server_1 = full_node_1.full_node.server
822
+ server_2 = full_node_2.full_node.server
823
+ wallet_a = bt.get_pool_wallet_tool()
824
+
825
+ reward_ph = wallet_a.get_new_puzzlehash()
826
+ blocks = bt.get_consecutive_blocks(
827
+ 1,
828
+ guarantee_transaction_block=True,
829
+ farmer_reward_puzzle_hash=reward_ph,
830
+ pool_reward_puzzle_hash=reward_ph,
831
+ genesis_timestamp=uint64(10000),
832
+ time_per_block=10,
833
+ )
834
+ assert blocks[0].height == 0
835
+
836
+ for block in blocks:
837
+ await full_node_1.full_node.add_block(block)
838
+
839
+ await time_out_assert(60, node_height_at_least, True, full_node_1, blocks[-1].height)
840
+
841
+ yield full_node_1, full_node_2, server_1, server_2, bt
842
+
843
+
844
+ @pytest.fixture(scope="function")
845
+ async def farmer_one_harvester_simulator_wallet(
846
+ tmp_path: Path,
847
+ blockchain_constants: ConsensusConstants,
848
+ ) -> AsyncIterator[
849
+ tuple[
850
+ HarvesterService,
851
+ FarmerService,
852
+ SimulatorFullNodeService,
853
+ WalletService,
854
+ BlockTools,
855
+ ]
856
+ ]:
857
+ async with setup_simulators_and_wallets_service(1, 1, blockchain_constants) as (nodes, wallets, bt):
858
+ async with setup_farmer_multi_harvester(bt, 1, tmp_path, bt.constants, start_services=True) as (
859
+ harvester_services,
860
+ farmer_service,
861
+ _,
862
+ ):
863
+ yield harvester_services[0], farmer_service, nodes[0], wallets[0], bt
864
+
865
+
866
+ FarmerOneHarvester = tuple[list[HarvesterService], FarmerService, BlockTools]
867
+
868
+
869
+ @pytest.fixture(scope="function")
870
+ async def farmer_one_harvester(tmp_path: Path, get_b_tools: BlockTools) -> AsyncIterator[FarmerOneHarvester]:
871
+ async with setup_farmer_multi_harvester(get_b_tools, 1, tmp_path, get_b_tools.constants, start_services=True) as _:
872
+ yield _
873
+
874
+
875
+ @pytest.fixture(scope="function")
876
+ async def farmer_one_harvester_not_started(
877
+ tmp_path: Path, get_b_tools: BlockTools
878
+ ) -> AsyncIterator[tuple[list[Service], Service]]:
879
+ async with setup_farmer_multi_harvester(get_b_tools, 1, tmp_path, get_b_tools.constants, start_services=False) as _:
880
+ yield _
881
+
882
+
883
+ @pytest.fixture(scope="function")
884
+ async def farmer_two_harvester_not_started(
885
+ tmp_path: Path, get_b_tools: BlockTools
886
+ ) -> AsyncIterator[tuple[list[Service], Service]]:
887
+ async with setup_farmer_multi_harvester(get_b_tools, 2, tmp_path, get_b_tools.constants, start_services=False) as _:
888
+ yield _
889
+
890
+
891
+ @pytest.fixture(scope="function")
892
+ async def farmer_three_harvester_not_started(
893
+ tmp_path: Path, get_b_tools: BlockTools
894
+ ) -> AsyncIterator[tuple[list[Service], Service]]:
895
+ async with setup_farmer_multi_harvester(get_b_tools, 3, tmp_path, get_b_tools.constants, start_services=False) as _:
896
+ yield _
897
+
898
+
899
+ @pytest.fixture(scope="function")
900
+ async def get_daemon(bt):
901
+ async with setup_daemon(btools=bt) as _:
902
+ yield _
903
+
904
+
905
+ @pytest.fixture(scope="function")
906
+ def empty_keyring():
907
+ with TempKeyring(user="user-chia-1.8", service="chia-user-chia-1.8") as keychain:
908
+ yield keychain
909
+ KeyringWrapper.cleanup_shared_instance()
910
+
911
+
912
+ @pytest.fixture(scope="function")
913
+ def get_temp_keyring():
914
+ with TempKeyring() as keychain:
915
+ yield keychain
916
+
917
+
918
+ @pytest.fixture(scope="function")
919
+ async def get_b_tools_1(get_temp_keyring):
920
+ return await create_block_tools_async(constants=test_constants_modified, keychain=get_temp_keyring)
921
+
922
+
923
+ @pytest.fixture(scope="function")
924
+ async def get_b_tools(get_temp_keyring):
925
+ local_b_tools = await create_block_tools_async(constants=test_constants_modified, keychain=get_temp_keyring)
926
+ new_config = local_b_tools._config
927
+ local_b_tools.change_config(new_config)
928
+ return local_b_tools
929
+
930
+
931
+ @pytest.fixture(scope="function")
932
+ async def daemon_connection_and_temp_keychain(
933
+ get_b_tools: BlockTools,
934
+ ) -> AsyncIterator[tuple[aiohttp.ClientWebSocketResponse, Keychain]]:
935
+ async with setup_daemon(btools=get_b_tools) as daemon:
936
+ keychain = daemon.keychain_server._default_keychain
937
+ async with aiohttp.ClientSession() as session:
938
+ async with session.ws_connect(
939
+ f"wss://127.0.0.1:{get_b_tools._config['daemon_port']}",
940
+ autoclose=True,
941
+ autoping=True,
942
+ ssl=get_b_tools.get_daemon_ssl_context(),
943
+ max_msg_size=52428800,
944
+ ) as ws:
945
+ yield ws, keychain
946
+
947
+
948
+ @pytest.fixture(scope="function")
949
+ async def wallets_prefarm_services(two_wallet_nodes_services, self_hostname, trusted, request):
950
+ """
951
+ Sets up the node with 10 blocks, and returns a payer and payee wallet.
952
+ """
953
+ try:
954
+ farm_blocks = request.param
955
+ except AttributeError:
956
+ farm_blocks = 3
957
+ buffer = 1
958
+ full_nodes, wallets, bt = two_wallet_nodes_services
959
+ full_node_api = full_nodes[0]._api
960
+ full_node_server = full_node_api.server
961
+ wallet_service_0 = wallets[0]
962
+ wallet_service_1 = wallets[1]
963
+ wallet_node_0 = wallet_service_0._node
964
+ wallet_node_1 = wallet_service_1._node
965
+ wallet_0 = wallet_node_0.wallet_state_manager.main_wallet
966
+ wallet_1 = wallet_node_1.wallet_state_manager.main_wallet
967
+
968
+ if trusted:
969
+ wallet_node_0.config["trusted_peers"] = {full_node_server.node_id.hex(): full_node_server.node_id.hex()}
970
+ wallet_node_1.config["trusted_peers"] = {full_node_server.node_id.hex(): full_node_server.node_id.hex()}
971
+ else:
972
+ wallet_node_0.config["trusted_peers"] = {}
973
+ wallet_node_1.config["trusted_peers"] = {}
974
+
975
+ wallet_0_rpc_client = await WalletRpcClient.create(
976
+ bt.config["self_hostname"],
977
+ wallet_service_0.rpc_server.listen_port,
978
+ wallet_service_0.root_path,
979
+ wallet_service_0.config,
980
+ )
981
+ wallet_1_rpc_client = await WalletRpcClient.create(
982
+ bt.config["self_hostname"],
983
+ wallet_service_1.rpc_server.listen_port,
984
+ wallet_service_1.root_path,
985
+ wallet_service_1.config,
986
+ )
987
+
988
+ await wallet_node_0.server.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
989
+ await wallet_node_1.server.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
990
+
991
+ wallet_0_rewards = await full_node_api.farm_blocks_to_wallet(count=farm_blocks, wallet=wallet_0)
992
+ wallet_1_rewards = await full_node_api.farm_blocks_to_wallet(count=farm_blocks, wallet=wallet_1)
993
+ await full_node_api.farm_blocks_to_puzzlehash(count=buffer, guarantee_transaction_blocks=True)
994
+
995
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=30)
996
+
997
+ assert await wallet_0.get_confirmed_balance() == wallet_0_rewards
998
+ assert await wallet_0.get_unconfirmed_balance() == wallet_0_rewards
999
+ assert await wallet_1.get_confirmed_balance() == wallet_1_rewards
1000
+ assert await wallet_1.get_unconfirmed_balance() == wallet_1_rewards
1001
+
1002
+ return (
1003
+ (wallet_node_0, wallet_0_rewards),
1004
+ (wallet_node_1, wallet_1_rewards),
1005
+ (wallet_0_rpc_client, wallet_1_rpc_client),
1006
+ (wallet_service_0, wallet_service_1),
1007
+ full_node_api,
1008
+ )
1009
+
1010
+
1011
+ @pytest.fixture(scope="function")
1012
+ async def wallets_prefarm(wallets_prefarm_services):
1013
+ return wallets_prefarm_services[0], wallets_prefarm_services[1], wallets_prefarm_services[4]
1014
+
1015
+
1016
+ @pytest.fixture(scope="function")
1017
+ async def three_wallets_prefarm(three_wallet_nodes, self_hostname, trusted):
1018
+ """
1019
+ Sets up the node with 10 blocks, and returns a payer and payee wallet.
1020
+ """
1021
+ farm_blocks = 3
1022
+ buffer = 1
1023
+ full_nodes, wallets, _ = three_wallet_nodes
1024
+ full_node_api = full_nodes[0]
1025
+ full_node_server = full_node_api.server
1026
+ wallet_node_0, wallet_server_0 = wallets[0]
1027
+ wallet_node_1, wallet_server_1 = wallets[1]
1028
+ wallet_node_2, wallet_server_2 = wallets[2]
1029
+ wallet_0 = wallet_node_0.wallet_state_manager.main_wallet
1030
+ wallet_1 = wallet_node_1.wallet_state_manager.main_wallet
1031
+ wallet_2 = wallet_node_2.wallet_state_manager.main_wallet
1032
+
1033
+ if trusted:
1034
+ wallet_node_0.config["trusted_peers"] = {full_node_server.node_id.hex(): full_node_server.node_id.hex()}
1035
+ wallet_node_1.config["trusted_peers"] = {full_node_server.node_id.hex(): full_node_server.node_id.hex()}
1036
+ wallet_node_2.config["trusted_peers"] = {full_node_server.node_id.hex(): full_node_server.node_id.hex()}
1037
+ else:
1038
+ wallet_node_0.config["trusted_peers"] = {}
1039
+ wallet_node_1.config["trusted_peers"] = {}
1040
+ wallet_node_2.config["trusted_peers"] = {}
1041
+
1042
+ await wallet_server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
1043
+ await wallet_server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
1044
+ await wallet_server_2.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
1045
+
1046
+ wallet_0_rewards = await full_node_api.farm_blocks_to_wallet(count=farm_blocks, wallet=wallet_0)
1047
+ wallet_1_rewards = await full_node_api.farm_blocks_to_wallet(count=farm_blocks, wallet=wallet_1)
1048
+ wallet_2_rewards = await full_node_api.farm_blocks_to_wallet(count=farm_blocks, wallet=wallet_2)
1049
+ await full_node_api.farm_blocks_to_puzzlehash(count=buffer, guarantee_transaction_blocks=True)
1050
+
1051
+ await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=30)
1052
+
1053
+ assert await wallet_0.get_confirmed_balance() == wallet_0_rewards
1054
+ assert await wallet_0.get_unconfirmed_balance() == wallet_0_rewards
1055
+ assert await wallet_1.get_confirmed_balance() == wallet_1_rewards
1056
+ assert await wallet_1.get_unconfirmed_balance() == wallet_1_rewards
1057
+ assert await wallet_2.get_confirmed_balance() == wallet_2_rewards
1058
+ assert await wallet_2.get_unconfirmed_balance() == wallet_2_rewards
1059
+
1060
+ return (
1061
+ (wallet_node_0, wallet_0_rewards),
1062
+ (wallet_node_1, wallet_1_rewards),
1063
+ (wallet_node_2, wallet_2_rewards),
1064
+ full_node_api,
1065
+ )
1066
+
1067
+
1068
+ @pytest.fixture(scope="function")
1069
+ async def introducer_service(bt):
1070
+ async with setup_introducer(bt, 0) as _:
1071
+ yield _
1072
+
1073
+
1074
+ @pytest.fixture(scope="function")
1075
+ async def timelord(bt):
1076
+ async with setup_timelord(uint16(0), False, bt.constants, bt.config, bt.root_path) as service:
1077
+ yield service._api, service._node.server
1078
+
1079
+
1080
+ @pytest.fixture(scope="function")
1081
+ async def timelord_service(bt: BlockTools) -> AsyncIterator[TimelordService]:
1082
+ async with setup_timelord(uint16(0), False, bt.constants, bt.config, bt.root_path) as _:
1083
+ yield _
1084
+
1085
+
1086
+ @pytest.fixture(scope="function")
1087
+ async def crawler_service(root_path_populated_with_config: Path, database_uri: str) -> AsyncIterator[CrawlerService]:
1088
+ async with setup_crawler(root_path_populated_with_config, database_uri) as service:
1089
+ yield service
1090
+
1091
+
1092
+ @pytest.fixture(scope="function")
1093
+ async def crawler_service_no_loop(
1094
+ root_path_populated_with_config: Path, database_uri: str
1095
+ ) -> AsyncIterator[CrawlerService]:
1096
+ async with setup_crawler(root_path_populated_with_config, database_uri, start_crawler_loop=False) as service:
1097
+ yield service
1098
+
1099
+
1100
+ @pytest.fixture(scope="function")
1101
+ async def seeder_service(root_path_populated_with_config: Path, database_uri: str) -> AsyncIterator[DNSServer]:
1102
+ async with setup_seeder(root_path_populated_with_config, database_uri) as seeder:
1103
+ yield seeder
1104
+
1105
+
1106
+ @pytest.fixture(scope="function")
1107
+ def tmp_chia_root(tmp_path):
1108
+ """
1109
+ Create a temp directory and populate it with an empty chia_root directory.
1110
+ """
1111
+ path: Path = tmp_path / "chia_root"
1112
+ path.mkdir(parents=True, exist_ok=True)
1113
+ return path
1114
+
1115
+
1116
+ @pytest.fixture(scope="function")
1117
+ def root_path_populated_with_config(tmp_chia_root) -> Path:
1118
+ """
1119
+ Create a temp chia_root directory and populate it with a default config.yaml.
1120
+ Returns the chia_root path.
1121
+ """
1122
+ root_path: Path = tmp_chia_root
1123
+ create_default_chia_config(root_path)
1124
+ return root_path
1125
+
1126
+
1127
+ @pytest.fixture(scope="function")
1128
+ def config(root_path_populated_with_config: Path) -> dict[str, Any]:
1129
+ with lock_and_load_config(root_path_populated_with_config, "config.yaml") as config:
1130
+ return config
1131
+
1132
+
1133
+ @pytest.fixture(scope="function")
1134
+ def config_with_address_prefix(root_path_populated_with_config: Path, prefix: str) -> dict[str, Any]:
1135
+ with lock_and_load_config(root_path_populated_with_config, "config.yaml") as config:
1136
+ if prefix is not None:
1137
+ config["network_overrides"]["config"][config["selected_network"]]["address_prefix"] = prefix
1138
+ return config
1139
+
1140
+
1141
+ @pytest.fixture(name="scripts_path", scope="session")
1142
+ def scripts_path_fixture() -> Path:
1143
+ scripts_string = sysconfig.get_path("scripts")
1144
+ if scripts_string is None:
1145
+ raise Exception("These tests depend on the scripts path existing")
1146
+
1147
+ return Path(scripts_string)
1148
+
1149
+
1150
+ @pytest.fixture(name="chia_root", scope="function")
1151
+ def chia_root_fixture(tmp_path: Path, scripts_path: Path) -> ChiaRoot:
1152
+ root = ChiaRoot(path=tmp_path.joinpath("chia_root"), scripts_path=scripts_path)
1153
+ root.run(args=["init"])
1154
+ root.run(args=["configure", "--set-log-level", "INFO"])
1155
+
1156
+ return root
1157
+
1158
+
1159
+ @pytest.fixture(name="cost_logger", scope="session")
1160
+ def cost_logger_fixture() -> Iterator[CostLogger]:
1161
+ cost_logger = CostLogger()
1162
+ yield cost_logger
1163
+ print()
1164
+ print()
1165
+ print(cost_logger.log_cost_statistics())
1166
+
1167
+
1168
+ @pytest.fixture(scope="function")
1169
+ async def simulation(bt, get_b_tools):
1170
+ async with setup_full_system(test_constants_modified, bt, get_b_tools, db_version=2) as full_system:
1171
+ yield full_system, get_b_tools
1172
+
1173
+
1174
+ HarvesterFarmerEnvironment = tuple[FarmerService, FarmerRpcClient, HarvesterService, HarvesterRpcClient, BlockTools]
1175
+
1176
+
1177
+ @pytest.fixture(scope="function")
1178
+ async def harvester_farmer_environment(
1179
+ farmer_one_harvester: tuple[list[HarvesterService], FarmerService, BlockTools],
1180
+ self_hostname: str,
1181
+ ) -> AsyncIterator[HarvesterFarmerEnvironment]:
1182
+ harvesters, farmer_service, bt = farmer_one_harvester
1183
+ harvester_service = harvesters[0]
1184
+
1185
+ assert farmer_service.rpc_server is not None
1186
+ farmer_rpc_cl = await FarmerRpcClient.create(
1187
+ self_hostname, farmer_service.rpc_server.listen_port, farmer_service.root_path, farmer_service.config
1188
+ )
1189
+ assert harvester_service.rpc_server is not None
1190
+ harvester_rpc_cl = await HarvesterRpcClient.create(
1191
+ self_hostname, harvester_service.rpc_server.listen_port, harvester_service.root_path, harvester_service.config
1192
+ )
1193
+
1194
+ async def have_connections() -> bool:
1195
+ return len(await farmer_rpc_cl.get_connections()) > 0
1196
+
1197
+ await time_out_assert(15, have_connections, True)
1198
+
1199
+ yield farmer_service, farmer_rpc_cl, harvester_service, harvester_rpc_cl, bt
1200
+
1201
+ farmer_rpc_cl.close()
1202
+ harvester_rpc_cl.close()
1203
+ await farmer_rpc_cl.await_closed()
1204
+ await harvester_rpc_cl.await_closed()
1205
+
1206
+
1207
+ @pytest.fixture(name="database_uri")
1208
+ def database_uri_fixture() -> str:
1209
+ return generate_in_memory_db_uri()
1210
+
1211
+
1212
+ @pytest.fixture(name="empty_temp_file_keyring")
1213
+ def empty_temp_file_keyring_fixture() -> Iterator[TempKeyring]:
1214
+ with TempKeyring(populate=False) as keyring:
1215
+ yield keyring
1216
+
1217
+
1218
+ @pytest.fixture(name="populated_temp_file_keyring")
1219
+ def populated_temp_file_keyring_fixture() -> Iterator[TempKeyring]:
1220
+ """Populated with a payload containing 0 keys using the default passphrase."""
1221
+ with TempKeyring(populate=True) as keyring:
1222
+ yield keyring
1223
+
1224
+
1225
+ @pytest.fixture(scope="function")
1226
+ async def farmer_harvester_2_simulators_zero_bits_plot_filter(
1227
+ tmp_path: Path, get_temp_keyring: Keychain
1228
+ ) -> AsyncIterator[
1229
+ tuple[
1230
+ FarmerService,
1231
+ HarvesterService,
1232
+ Union[FullNodeService, SimulatorFullNodeService],
1233
+ Union[FullNodeService, SimulatorFullNodeService],
1234
+ BlockTools,
1235
+ ]
1236
+ ]:
1237
+ zero_bit_plot_filter_consts = test_constants_modified.replace(
1238
+ NUMBER_ZERO_BITS_PLOT_FILTER=uint8(0),
1239
+ NUM_SPS_SUB_SLOT=uint32(8),
1240
+ )
1241
+
1242
+ async with AsyncExitStack() as async_exit_stack:
1243
+ bt = await create_block_tools_async(
1244
+ zero_bit_plot_filter_consts,
1245
+ keychain=get_temp_keyring,
1246
+ )
1247
+
1248
+ config_overrides: dict[str, int] = {"full_node.max_sync_wait": 0}
1249
+
1250
+ bts = [
1251
+ await create_block_tools_async(
1252
+ zero_bit_plot_filter_consts,
1253
+ keychain=get_temp_keyring,
1254
+ num_og_plots=0,
1255
+ num_pool_plots=0,
1256
+ num_non_keychain_plots=0,
1257
+ config_overrides=config_overrides,
1258
+ )
1259
+ for _ in range(2)
1260
+ ]
1261
+
1262
+ simulators: list[SimulatorFullNodeService] = [
1263
+ await async_exit_stack.enter_async_context(
1264
+ # Passing simulator=True gets us this type guaranteed
1265
+ setup_full_node( # type: ignore[arg-type]
1266
+ consensus_constants=bts[index].constants,
1267
+ db_name=f"blockchain_test_{index}_sim.db",
1268
+ self_hostname=bts[index].config["self_hostname"],
1269
+ local_bt=bts[index],
1270
+ simulator=True,
1271
+ db_version=2,
1272
+ )
1273
+ )
1274
+ for index in range(len(bts))
1275
+ ]
1276
+
1277
+ [harvester_service], farmer_service, _ = await async_exit_stack.enter_async_context(
1278
+ setup_farmer_multi_harvester(bt, 1, tmp_path, bt.constants, start_services=True)
1279
+ )
1280
+
1281
+ yield farmer_service, harvester_service, simulators[0], simulators[1], bt
1282
+
1283
+
1284
+ @pytest.fixture(name="recording_web_server")
1285
+ async def recording_web_server_fixture(self_hostname: str) -> AsyncIterator[RecordingWebServer]:
1286
+ server = await RecordingWebServer.create(
1287
+ hostname=self_hostname,
1288
+ port=uint16(0),
1289
+ )
1290
+ try:
1291
+ yield server
1292
+ finally:
1293
+ await server.await_closed()
1294
+
1295
+
1296
+ @pytest.fixture(
1297
+ scope="session",
1298
+ params=[True, False],
1299
+ )
1300
+ def use_delta_sync(request: SubRequest):
1301
+ return request.param
1302
+
1303
+
1304
+ # originally from _tests/wallet/conftest.py
1305
+ @pytest.fixture(scope="function", params=[True, False])
1306
+ def trusted_full_node(request: Any) -> bool:
1307
+ trusted: bool = request.param
1308
+ return trusted
1309
+
1310
+
1311
+ @pytest.fixture(scope="function", params=[True, False])
1312
+ def tx_config(request: Any) -> TXConfig:
1313
+ return replace(DEFAULT_TX_CONFIG, reuse_puzhash=request.param)
1314
+
1315
+
1316
+ # This fixture automatically creates 4 parametrized tests trusted/untrusted x reuse/new derivations
1317
+ # These parameterizations can be skipped by manually specifying "trusted" or "reuse puzhash" to the fixture
1318
+ @pytest.fixture(scope="function")
1319
+ async def wallet_environments(
1320
+ trusted_full_node: bool,
1321
+ tx_config: TXConfig,
1322
+ blockchain_constants: ConsensusConstants,
1323
+ request: pytest.FixtureRequest,
1324
+ ) -> AsyncIterator[WalletTestFramework]:
1325
+ if "trusted" in request.param:
1326
+ if request.param["trusted"] != trusted_full_node:
1327
+ pytest.skip("Skipping not specified trusted mode")
1328
+ if "reuse_puzhash" in request.param:
1329
+ if request.param["reuse_puzhash"] != tx_config.reuse_puzhash:
1330
+ pytest.skip("Skipping not specified reuse_puzhash mode")
1331
+ assert len(request.param["blocks_needed"]) == request.param["num_environments"]
1332
+ if "config_overrides" in request.param:
1333
+ config_overrides: dict[str, Any] = request.param["config_overrides"]
1334
+ else: # pragma: no cover
1335
+ config_overrides = {}
1336
+ async with setup_simulators_and_wallets_service(
1337
+ 1,
1338
+ request.param["num_environments"],
1339
+ blockchain_constants,
1340
+ initial_num_public_keys=config_overrides.get("initial_num_public_keys", 5),
1341
+ ) as wallet_nodes_services:
1342
+ full_node, wallet_services, bt = wallet_nodes_services
1343
+
1344
+ full_node[0]._api.full_node.config = {**full_node[0]._api.full_node.config, **config_overrides}
1345
+
1346
+ wallet_rpc_clients: list[WalletRpcClient] = []
1347
+ async with AsyncExitStack() as astack:
1348
+ for service in wallet_services:
1349
+ service._node.config = {
1350
+ **service._node.config,
1351
+ "trusted_peers": (
1352
+ {full_node[0]._api.server.node_id.hex(): full_node[0]._api.server.node_id.hex()}
1353
+ if trusted_full_node
1354
+ else {}
1355
+ ),
1356
+ **config_overrides,
1357
+ }
1358
+ service._node.wallet_state_manager.config = service._node.config
1359
+ # Shorten the 10 seconds default value
1360
+ service._node.coin_state_retry_seconds = 2
1361
+ await service._node.server.start_client(
1362
+ PeerInfo(bt.config["self_hostname"], full_node[0]._api.full_node.server.get_port()), None
1363
+ )
1364
+ wallet_rpc_clients.append(
1365
+ await astack.enter_async_context(
1366
+ WalletRpcClient.create_as_context(
1367
+ bt.config["self_hostname"],
1368
+ # Semantics guarantee us a non-None value here
1369
+ service.rpc_server.listen_port, # type: ignore[union-attr]
1370
+ service.root_path,
1371
+ service.config,
1372
+ )
1373
+ )
1374
+ )
1375
+
1376
+ wallet_states: list[WalletState] = []
1377
+ for service, blocks_needed in zip(wallet_services, request.param["blocks_needed"]):
1378
+ if blocks_needed > 0:
1379
+ await full_node[0]._api.farm_blocks_to_wallet(
1380
+ count=blocks_needed, wallet=service._node.wallet_state_manager.main_wallet
1381
+ )
1382
+ await full_node[0]._api.wait_for_wallet_synced(wallet_node=service._node, timeout=20)
1383
+ wallet_states.append(
1384
+ WalletState(
1385
+ Balance(
1386
+ confirmed_wallet_balance=uint128(2_000_000_000_000 * blocks_needed),
1387
+ unconfirmed_wallet_balance=uint128(2_000_000_000_000 * blocks_needed),
1388
+ spendable_balance=uint128(2_000_000_000_000 * blocks_needed),
1389
+ pending_change=uint64(0),
1390
+ max_send_amount=uint128(2_000_000_000_000 * blocks_needed),
1391
+ unspent_coin_count=uint32(2 * blocks_needed),
1392
+ pending_coin_removal_count=uint32(0),
1393
+ ),
1394
+ )
1395
+ )
1396
+
1397
+ assert full_node[0].rpc_server is not None
1398
+ client_node = await astack.enter_async_context(
1399
+ FullNodeRpcClient.create_as_context(
1400
+ bt.config["self_hostname"],
1401
+ full_node[0].rpc_server.listen_port,
1402
+ full_node[0].root_path,
1403
+ full_node[0].config,
1404
+ )
1405
+ )
1406
+ yield WalletTestFramework(
1407
+ full_node[0]._api,
1408
+ client_node,
1409
+ trusted_full_node,
1410
+ [
1411
+ WalletEnvironment(
1412
+ service=service,
1413
+ rpc_client=rpc_client,
1414
+ wallet_states={uint32(1): wallet_state},
1415
+ )
1416
+ for service, rpc_client, wallet_state in zip(wallet_services, wallet_rpc_clients, wallet_states)
1417
+ ],
1418
+ tx_config,
1419
+ )