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,794 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import itertools
5
+ import time
6
+ from collections.abc import Collection
7
+ from typing import Any, Optional, Union
8
+
9
+ import anyio
10
+
11
+ from chia.consensus.block_body_validation import ForkInfo
12
+ from chia.consensus.block_record import BlockRecord
13
+ from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
14
+ from chia.consensus.blockchain import BlockchainMutexPriority
15
+ from chia.consensus.multiprocess_validation import PreValidationResult, pre_validate_block
16
+ from chia.full_node.full_node import FullNode
17
+ from chia.full_node.full_node_api import FullNodeAPI
18
+ from chia.rpc.rpc_server import default_get_connections
19
+ from chia.server.outbound_message import NodeType
20
+ from chia.simulator.add_blocks_in_batches import add_blocks_in_batches
21
+ from chia.simulator.block_tools import BlockTools
22
+ from chia.simulator.simulator_protocol import FarmNewBlockProtocol, GetAllCoinsProtocol, ReorgProtocol
23
+ from chia.types.blockchain_format.coin import Coin
24
+ from chia.types.blockchain_format.sized_bytes import bytes32
25
+ from chia.types.coin_record import CoinRecord
26
+ from chia.types.full_block import FullBlock
27
+ from chia.types.spend_bundle import SpendBundle
28
+ from chia.types.validation_state import ValidationState
29
+ from chia.util.augmented_chain import AugmentedBlockchain
30
+ from chia.util.config import lock_and_load_config, save_config
31
+ from chia.util.ints import uint8, uint32, uint64, uint128
32
+ from chia.util.timing import adjusted_timeout, backoff_times
33
+ from chia.wallet.payment import Payment
34
+ from chia.wallet.transaction_record import LightTransactionRecord, TransactionRecord
35
+ from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
36
+ from chia.wallet.wallet import Wallet
37
+ from chia.wallet.wallet_node import WalletNode
38
+ from chia.wallet.wallet_state_manager import WalletStateManager
39
+
40
+
41
+ class _Default:
42
+ pass
43
+
44
+
45
+ default = _Default()
46
+
47
+ timeout_per_block = 5
48
+
49
+
50
+ async def wait_for_coins_in_wallet(coins: set[Coin], wallet: Wallet, timeout: Optional[float] = 5):
51
+ """Wait until all of the specified coins are simultaneously reported as spendable
52
+ by the wallet.
53
+
54
+ Arguments:
55
+ coins: The coins expected to be received.
56
+ wallet: The wallet expected to receive the coins.
57
+ """
58
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
59
+ for backoff in backoff_times():
60
+ spendable_wallet_coin_records = await wallet.wallet_state_manager.get_spendable_coins_for_wallet(
61
+ wallet_id=wallet.id()
62
+ )
63
+ spendable_wallet_coins = {record.coin for record in spendable_wallet_coin_records}
64
+
65
+ if coins.issubset(spendable_wallet_coins):
66
+ return
67
+
68
+ await asyncio.sleep(backoff)
69
+
70
+
71
+ class FullNodeSimulator(FullNodeAPI):
72
+ def __init__(self, full_node: FullNode, block_tools: BlockTools, config: dict) -> None:
73
+ super().__init__(full_node)
74
+ self.bt = block_tools
75
+ self.full_node = full_node
76
+ self.config = config
77
+ self.time_per_block: Optional[float] = None
78
+ self.full_node.simulator_transaction_callback = self.autofarm_transaction
79
+ self.use_current_time: bool = self.config.get("simulator", {}).get("use_current_time", False)
80
+ self.auto_farm: bool = self.config.get("simulator", {}).get("auto_farm", False)
81
+
82
+ def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
83
+ return default_get_connections(server=self.server, request_node_type=request_node_type)
84
+
85
+ async def get_all_full_blocks(self) -> list[FullBlock]:
86
+ peak: Optional[BlockRecord] = self.full_node.blockchain.get_peak()
87
+ if peak is None:
88
+ return []
89
+ blocks = []
90
+ peak_block = await self.full_node.blockchain.get_full_block(peak.header_hash)
91
+ if peak_block is None:
92
+ return []
93
+ blocks.append(peak_block)
94
+ current = peak_block
95
+ while True:
96
+ prev = await self.full_node.blockchain.get_full_block(current.prev_header_hash)
97
+ if prev is not None:
98
+ current = prev
99
+ blocks.append(prev)
100
+ else:
101
+ break
102
+
103
+ blocks.reverse()
104
+ return blocks
105
+
106
+ async def autofarm_transaction(self, spend_name: bytes32) -> None:
107
+ if self.auto_farm:
108
+ self.log.info(f"Autofarm triggered by tx-id: {spend_name.hex()}")
109
+ new_block = FarmNewBlockProtocol(self.bt.farmer_ph)
110
+ await self.farm_new_transaction_block(new_block, force_wait_for_timestamp=True)
111
+
112
+ async def update_autofarm_config(self, enable_autofarm: bool) -> bool:
113
+ if enable_autofarm == self.auto_farm:
114
+ return self.auto_farm
115
+ else:
116
+ self.auto_farm = enable_autofarm
117
+ with lock_and_load_config(self.bt.root_path, "config.yaml") as config:
118
+ if "simulator" in config:
119
+ config["simulator"]["auto_farm"] = self.auto_farm
120
+ save_config(self.bt.root_path, "config.yaml", config)
121
+ self.config = config
122
+ if self.auto_farm is True and self.full_node.mempool_manager.mempool.total_mempool_cost() > 0:
123
+ # if mempool is not empty and auto farm was just enabled, farm a block
124
+ await self.farm_new_transaction_block(FarmNewBlockProtocol(self.bt.farmer_ph))
125
+ return self.auto_farm
126
+
127
+ async def get_all_coins(self, request: GetAllCoinsProtocol) -> list[CoinRecord]:
128
+ return await self.full_node.coin_store.get_all_coins(request.include_spent_coins)
129
+
130
+ async def revert_block_height(self, new_height: uint32) -> None:
131
+ """
132
+ This completely deletes blocks from the blockchain.
133
+ While reorgs are preferred, this is also an option
134
+ Note: This does not broadcast the changes, and all wallets will need to be wiped.
135
+ """
136
+ async with self.full_node.blockchain.priority_mutex.acquire(priority=BlockchainMutexPriority.high):
137
+ peak_height: Optional[uint32] = self.full_node.blockchain.get_peak_height()
138
+ if peak_height is None:
139
+ raise ValueError("We can't revert without any blocks.")
140
+ elif peak_height - 1 < new_height:
141
+ raise ValueError("Cannot revert to a height greater than the current peak height.")
142
+ elif new_height < 1:
143
+ raise ValueError("Cannot revert to a height less than 1.")
144
+ block_record: BlockRecord = self.full_node.blockchain.height_to_block_record(new_height)
145
+ # remove enough data to allow a bunch of blocks to be wiped.
146
+ async with self.full_node.block_store.db_wrapper.writer():
147
+ # set coinstore
148
+ await self.full_node.coin_store.rollback_to_block(new_height)
149
+ # set blockstore to new height
150
+ await self.full_node.block_store.rollback(new_height)
151
+ await self.full_node.block_store.set_peak(block_record.header_hash)
152
+ self.full_node.blockchain._peak_height = new_height
153
+ # reload mempool
154
+ await self.full_node.mempool_manager.new_peak(block_record, None)
155
+
156
+ async def get_all_puzzle_hashes(self) -> dict[bytes32, tuple[uint128, int]]:
157
+ # puzzle_hash, (total_amount, num_transactions)
158
+ ph_total_amount: dict[bytes32, tuple[uint128, int]] = {}
159
+ all_non_spent_coins: list[CoinRecord] = await self.get_all_coins(GetAllCoinsProtocol(False))
160
+ for cr in all_non_spent_coins:
161
+ if cr.coin.puzzle_hash not in ph_total_amount:
162
+ ph_total_amount[cr.coin.puzzle_hash] = (uint128(cr.coin.amount), 1)
163
+ else:
164
+ dict_value: tuple[uint128, int] = ph_total_amount[cr.coin.puzzle_hash]
165
+ ph_total_amount[cr.coin.puzzle_hash] = (uint128(cr.coin.amount + dict_value[0]), dict_value[1] + 1)
166
+ return ph_total_amount
167
+
168
+ async def farm_new_transaction_block(
169
+ self, request: FarmNewBlockProtocol, force_wait_for_timestamp: bool = False
170
+ ) -> FullBlock:
171
+ ssi = self.full_node.constants.SUB_SLOT_ITERS_STARTING
172
+ diff = self.full_node.constants.DIFFICULTY_STARTING
173
+ async with self.full_node.blockchain.priority_mutex.acquire(priority=BlockchainMutexPriority.high):
174
+ self.log.info("Farming new block!")
175
+ current_blocks = await self.get_all_full_blocks()
176
+ if len(current_blocks) == 0:
177
+ genesis = self.bt.get_consecutive_blocks(uint8(1))[0]
178
+ future = await pre_validate_block(
179
+ self.full_node.blockchain.constants,
180
+ AugmentedBlockchain(self.full_node.blockchain),
181
+ genesis,
182
+ self.full_node.blockchain.pool,
183
+ None,
184
+ ValidationState(ssi, diff, None),
185
+ )
186
+ pre_validation_result: PreValidationResult = await future
187
+ fork_info = ForkInfo(-1, -1, self.full_node.constants.GENESIS_CHALLENGE)
188
+ await self.full_node.blockchain.add_block(
189
+ genesis,
190
+ pre_validation_result,
191
+ self.full_node.constants.SUB_SLOT_ITERS_STARTING,
192
+ fork_info,
193
+ )
194
+
195
+ peak = self.full_node.blockchain.get_peak()
196
+ assert peak is not None
197
+ curr: BlockRecord = peak
198
+ while not curr.is_transaction_block:
199
+ curr = self.full_node.blockchain.block_record(curr.prev_hash)
200
+ current_time = self.use_current_time
201
+ time_per_block = self.time_per_block
202
+ assert curr.timestamp is not None
203
+ if int(time.time()) <= int(curr.timestamp):
204
+ if force_wait_for_timestamp:
205
+ await asyncio.sleep(1)
206
+ else:
207
+ current_time = False
208
+ mempool_bundle = await self.full_node.mempool_manager.create_bundle_from_mempool(
209
+ curr.header_hash, self.full_node.coin_store.get_unspent_lineage_info_for_puzzle_hash
210
+ )
211
+ if mempool_bundle is None:
212
+ spend_bundle = None
213
+ else:
214
+ spend_bundle = mempool_bundle[0]
215
+
216
+ current_blocks = await self.get_all_full_blocks()
217
+ target = request.puzzle_hash
218
+ more = self.bt.get_consecutive_blocks(
219
+ 1,
220
+ time_per_block=time_per_block,
221
+ transaction_data=spend_bundle,
222
+ farmer_reward_puzzle_hash=target,
223
+ pool_reward_puzzle_hash=target,
224
+ block_list_input=current_blocks,
225
+ guarantee_transaction_block=True,
226
+ current_time=current_time,
227
+ )
228
+ await self.full_node.add_block(more[-1])
229
+ return more[-1]
230
+
231
+ async def farm_new_block(self, request: FarmNewBlockProtocol, force_wait_for_timestamp: bool = False):
232
+ ssi = self.full_node.constants.SUB_SLOT_ITERS_STARTING
233
+ diff = self.full_node.constants.DIFFICULTY_STARTING
234
+ async with self.full_node.blockchain.priority_mutex.acquire(priority=BlockchainMutexPriority.high):
235
+ self.log.info("Farming new block!")
236
+ current_blocks = await self.get_all_full_blocks()
237
+ if len(current_blocks) == 0:
238
+ genesis = self.bt.get_consecutive_blocks(uint8(1))[0]
239
+ future = await pre_validate_block(
240
+ self.full_node.blockchain.constants,
241
+ AugmentedBlockchain(self.full_node.blockchain),
242
+ genesis,
243
+ self.full_node.blockchain.pool,
244
+ None,
245
+ ValidationState(ssi, diff, None),
246
+ )
247
+ pre_validation_result: PreValidationResult = await future
248
+ fork_info = ForkInfo(-1, -1, self.full_node.constants.GENESIS_CHALLENGE)
249
+ await self.full_node.blockchain.add_block(genesis, pre_validation_result, ssi, fork_info)
250
+ peak = self.full_node.blockchain.get_peak()
251
+ assert peak is not None
252
+ curr: BlockRecord = peak
253
+ while not curr.is_transaction_block:
254
+ curr = self.full_node.blockchain.block_record(curr.prev_hash)
255
+ current_time = self.use_current_time
256
+ time_per_block = self.time_per_block
257
+ assert curr.timestamp is not None
258
+ if int(time.time()) <= int(curr.timestamp):
259
+ if force_wait_for_timestamp:
260
+ await asyncio.sleep(1)
261
+ else:
262
+ current_time = False
263
+ mempool_bundle = await self.full_node.mempool_manager.create_bundle_from_mempool(
264
+ curr.header_hash, self.full_node.coin_store.get_unspent_lineage_info_for_puzzle_hash
265
+ )
266
+ if mempool_bundle is None:
267
+ spend_bundle = None
268
+ else:
269
+ spend_bundle = mempool_bundle[0]
270
+ current_blocks = await self.get_all_full_blocks()
271
+ target = request.puzzle_hash
272
+ more = self.bt.get_consecutive_blocks(
273
+ 1,
274
+ transaction_data=spend_bundle,
275
+ farmer_reward_puzzle_hash=target,
276
+ pool_reward_puzzle_hash=target,
277
+ block_list_input=current_blocks,
278
+ current_time=current_time,
279
+ time_per_block=time_per_block,
280
+ )
281
+ await self.full_node.add_block(more[-1])
282
+
283
+ async def reorg_from_index_to_new_index(self, request: ReorgProtocol):
284
+ new_index = request.new_index
285
+ old_index = request.old_index
286
+ coinbase_ph = request.puzzle_hash
287
+ seed = request.seed
288
+ if seed is None:
289
+ seed = bytes32(32 * b"1")
290
+
291
+ current_blocks = await self.get_all_full_blocks()
292
+ block_count = new_index - old_index
293
+
294
+ more_blocks = self.bt.get_consecutive_blocks(
295
+ block_count,
296
+ farmer_reward_puzzle_hash=coinbase_ph,
297
+ pool_reward_puzzle_hash=coinbase_ph,
298
+ block_list_input=current_blocks[: old_index + 1],
299
+ force_overflow=True,
300
+ guarantee_transaction_block=True,
301
+ seed=seed,
302
+ )
303
+ await add_blocks_in_batches(more_blocks[old_index + 1 :], self.full_node)
304
+
305
+ async def farm_blocks_to_puzzlehash(
306
+ self,
307
+ count: int,
308
+ farm_to: bytes32 = bytes32.zeros,
309
+ guarantee_transaction_blocks: bool = False,
310
+ timeout: Union[_Default, float, None] = default,
311
+ _wait_for_synced: bool = True,
312
+ ) -> int:
313
+ """Process the requested number of blocks including farming to the passed puzzle
314
+ hash. Note that the rewards for the last block will not have been processed.
315
+ Consider `.farm_blocks_to_wallet()` or `.farm_rewards_to_wallet()` if the goal
316
+ is to receive XCH at an address.
317
+
318
+ Arguments:
319
+ count: The number of blocks to process.
320
+ farm_to: The puzzle hash to farm the block rewards to.
321
+
322
+ Returns:
323
+ The total number of reward mojos for the processed blocks.
324
+ """
325
+ if isinstance(timeout, _Default):
326
+ timeout = count * timeout_per_block
327
+ timeout += 1
328
+
329
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
330
+ rewards = 0
331
+
332
+ if count == 0:
333
+ return rewards
334
+
335
+ for _ in range(count):
336
+ if guarantee_transaction_blocks:
337
+ await self.farm_new_transaction_block(FarmNewBlockProtocol(farm_to))
338
+ else:
339
+ await self.farm_new_block(FarmNewBlockProtocol(farm_to))
340
+ height = self.full_node.blockchain.get_peak_height()
341
+ assert height is not None
342
+
343
+ rewards += calculate_pool_reward(height) + calculate_base_farmer_reward(height)
344
+
345
+ if _wait_for_synced:
346
+ await self.wait_for_self_synced(timeout=None)
347
+
348
+ return rewards
349
+
350
+ async def farm_blocks_to_wallet(
351
+ self,
352
+ count: int,
353
+ wallet: Wallet,
354
+ timeout: Union[_Default, float, None] = default,
355
+ _wait_for_synced: bool = True,
356
+ ) -> int:
357
+ """Farm the requested number of blocks to the passed wallet. This will
358
+ process additional blocks as needed to process the reward transactions
359
+ and also wait for the rewards to be present in the wallet.
360
+
361
+ Arguments:
362
+ count: The number of blocks to farm.
363
+ wallet: The wallet to farm the block rewards to.
364
+
365
+ Returns:
366
+ The total number of reward mojos farmed to the requested address.
367
+ """
368
+ if isinstance(timeout, _Default):
369
+ timeout = (count + 1) * timeout_per_block
370
+ timeout += 15
371
+
372
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
373
+ if count == 0:
374
+ return 0
375
+
376
+ target_puzzlehash = await wallet.get_new_puzzlehash()
377
+ rewards = 0
378
+
379
+ block_reward_coins = set()
380
+ expected_reward_coin_count = 2 * count
381
+
382
+ original_peak_height = self.full_node.blockchain.get_peak_height()
383
+ expected_peak_height = 0 if original_peak_height is None else original_peak_height
384
+ extra_blocks = [[False, False]] if original_peak_height is None else [] # Farm genesis block first
385
+
386
+ for to_wallet, tx_block in [*extra_blocks, *([[True, False]] * (count - 1)), [True, True], [False, True]]:
387
+ # This complicated application of the last two blocks being transaction
388
+ # blocks is due to the transaction blocks only including rewards from
389
+ # blocks up until, and including, the previous transaction block.
390
+ if to_wallet:
391
+ rewards += await self.farm_blocks_to_puzzlehash(
392
+ count=1,
393
+ farm_to=target_puzzlehash,
394
+ guarantee_transaction_blocks=tx_block,
395
+ timeout=None,
396
+ _wait_for_synced=False,
397
+ )
398
+ else:
399
+ await self.farm_blocks_to_puzzlehash(
400
+ count=1, guarantee_transaction_blocks=tx_block, timeout=None, _wait_for_synced=False
401
+ )
402
+
403
+ expected_peak_height += 1
404
+ peak_height = self.full_node.blockchain.get_peak_height()
405
+ assert peak_height == expected_peak_height
406
+
407
+ coin_records = await self.full_node.coin_store.get_coins_added_at_height(height=peak_height)
408
+ for record in coin_records:
409
+ if record.coin.puzzle_hash == target_puzzlehash and record.coinbase:
410
+ block_reward_coins.add(record.coin)
411
+
412
+ if len(block_reward_coins) != expected_reward_coin_count:
413
+ raise RuntimeError(
414
+ f"Expected {expected_reward_coin_count} reward coins, got: {len(block_reward_coins)}"
415
+ )
416
+
417
+ await wait_for_coins_in_wallet(coins=block_reward_coins, wallet=wallet, timeout=None)
418
+ if _wait_for_synced:
419
+ await self.wait_for_wallet_synced(wallet.wallet_state_manager.wallet_node, timeout=None)
420
+ return rewards
421
+
422
+ async def farm_rewards_to_wallet(
423
+ self,
424
+ amount: int,
425
+ wallet: Wallet,
426
+ timeout: Union[_Default, float, None] = default,
427
+ ) -> int:
428
+ """Farm at least the requested amount of mojos to the passed wallet. Extra
429
+ mojos will be received based on the block rewards at the present block height.
430
+ The rewards will be present in the wall before returning.
431
+
432
+ Arguments:
433
+ amount: The minimum number of mojos to farm.
434
+ wallet: The wallet to farm the block rewards to.
435
+
436
+ Returns:
437
+ The total number of reward mojos farmed to the requested wallet.
438
+ """
439
+ rewards = 0
440
+
441
+ if amount == 0:
442
+ return rewards
443
+
444
+ height_before: Optional[uint32] = self.full_node.blockchain.get_peak_height()
445
+ if height_before is None:
446
+ height_before = uint32(0)
447
+
448
+ for count in itertools.count(1):
449
+ height = uint32(height_before + count)
450
+ rewards += calculate_pool_reward(height) + calculate_base_farmer_reward(height)
451
+
452
+ if rewards >= amount:
453
+ break
454
+ else:
455
+ raise Exception("internal error")
456
+
457
+ if isinstance(timeout, _Default):
458
+ timeout = (count + 1) * timeout_per_block
459
+
460
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
461
+ await self.farm_blocks_to_wallet(count=count, wallet=wallet, timeout=None)
462
+ return rewards
463
+
464
+ async def wait_transaction_records_entered_mempool(
465
+ self,
466
+ records: Collection[Union[TransactionRecord, LightTransactionRecord]],
467
+ timeout: Union[float, None] = 5,
468
+ ) -> None:
469
+ """Wait until the transaction records have entered the mempool. Transaction
470
+ records with no spend bundle are ignored.
471
+
472
+ Arguments:
473
+ records: The transaction records to wait for.
474
+ """
475
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
476
+ ids_to_check: set[bytes32] = set()
477
+ for record in records:
478
+ if record.spend_bundle is None:
479
+ continue
480
+
481
+ ids_to_check.add(record.spend_bundle.name())
482
+
483
+ for backoff in backoff_times():
484
+ found = set()
485
+ for spend_bundle_name in ids_to_check:
486
+ tx = self.full_node.mempool_manager.get_spendbundle(spend_bundle_name)
487
+ if tx is not None:
488
+ found.add(spend_bundle_name)
489
+ ids_to_check = ids_to_check.difference(found)
490
+
491
+ if len(ids_to_check) == 0:
492
+ return
493
+
494
+ await asyncio.sleep(backoff)
495
+
496
+ async def wait_bundle_ids_in_mempool(
497
+ self,
498
+ bundle_ids: Collection[bytes32],
499
+ timeout: Union[float, None] = 5,
500
+ ) -> None:
501
+ """Wait until the ids of specific spend bundles have entered the mempool.
502
+
503
+ Arguments:
504
+ records: The bundle ids to wait for.
505
+ """
506
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
507
+ ids_to_check: set[bytes32] = set(bundle_ids)
508
+
509
+ for backoff in backoff_times():
510
+ found = set()
511
+ for spend_bundle_name in ids_to_check:
512
+ tx = self.full_node.mempool_manager.get_spendbundle(spend_bundle_name)
513
+ if tx is not None:
514
+ found.add(spend_bundle_name)
515
+ ids_to_check = ids_to_check.difference(found)
516
+
517
+ if len(ids_to_check) == 0:
518
+ return
519
+
520
+ await asyncio.sleep(backoff)
521
+
522
+ async def wait_transaction_records_marked_as_in_mempool(
523
+ self,
524
+ record_ids: Collection[bytes32],
525
+ wallet_node: WalletNode,
526
+ timeout: Union[float, None] = 10,
527
+ ) -> None:
528
+ """Wait until the transaction records have been marked that they have made it into the mempool. Transaction
529
+ records with no spend bundle are ignored.
530
+
531
+ Arguments:
532
+ records: The transaction records to wait for.
533
+ """
534
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
535
+ ids_to_check: set[bytes32] = set(record_ids)
536
+
537
+ for backoff in backoff_times():
538
+ found = set()
539
+ for txid in ids_to_check:
540
+ tx = await wallet_node.wallet_state_manager.tx_store.get_transaction_record(txid)
541
+ if tx is not None and (tx.is_in_mempool() or tx.spend_bundle is None):
542
+ found.add(txid)
543
+ ids_to_check = ids_to_check.difference(found)
544
+
545
+ if len(ids_to_check) == 0:
546
+ return
547
+
548
+ await asyncio.sleep(backoff)
549
+
550
+ async def process_transaction_records(
551
+ self,
552
+ records: Collection[TransactionRecord],
553
+ timeout: Union[float, None] = (2 * timeout_per_block) + 5,
554
+ ) -> None:
555
+ """Process the specified transaction records and wait until they have been
556
+ included in a block.
557
+
558
+ Arguments:
559
+ records: The transaction records to process.
560
+ """
561
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
562
+ await self.wait_for_self_synced(timeout=None)
563
+
564
+ coins_to_wait_for: set[Coin] = set()
565
+ for record in records:
566
+ if record.spend_bundle is None:
567
+ continue
568
+
569
+ coins_to_wait_for.update(record.spend_bundle.additions())
570
+
571
+ await self.wait_transaction_records_entered_mempool(records=records, timeout=None)
572
+
573
+ return await self.process_coin_spends(coins=coins_to_wait_for, timeout=None)
574
+
575
+ async def process_spend_bundles(
576
+ self,
577
+ bundles: Collection[SpendBundle],
578
+ timeout: Union[float, None] = (2 * timeout_per_block) + 5,
579
+ ) -> None:
580
+ """Process the specified spend bundles and wait until they have been included
581
+ in a block.
582
+
583
+ Arguments:
584
+ bundles: The spend bundles to process.
585
+ """
586
+
587
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
588
+ coins_to_wait_for: set[Coin] = {addition for bundle in bundles for addition in bundle.additions()}
589
+ return await self.process_coin_spends(coins=coins_to_wait_for, timeout=None)
590
+
591
+ async def process_coin_spends(
592
+ self,
593
+ coins: Collection[Coin],
594
+ timeout: Union[float, None] = (2 * timeout_per_block) + 5,
595
+ ) -> None:
596
+ """Process the specified coin names and wait until they have been created in a
597
+ block.
598
+
599
+ Arguments:
600
+ coin_names: The coin names to process.
601
+ """
602
+
603
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
604
+ coin_set = set(coins)
605
+ coin_store = self.full_node.coin_store
606
+
607
+ while True:
608
+ await self.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True, timeout=None)
609
+
610
+ found: set[Coin] = set()
611
+ for coin in coin_set:
612
+ # TODO: is this the proper check?
613
+ if await coin_store.get_coin_record(coin.name()) is not None:
614
+ found.add(coin)
615
+
616
+ coin_set = coin_set.difference(found)
617
+
618
+ if len(coin_set) == 0:
619
+ return
620
+
621
+ async def process_all_wallet_transactions(self, wallet: Wallet, timeout: Optional[float] = 5) -> None:
622
+ # TODO: Maybe something could be done around waiting for the tx to enter the
623
+ # mempool. Maybe not, might be too many races or such.
624
+ wallet_state_manager: Optional[WalletStateManager] = wallet.wallet_state_manager
625
+ assert wallet_state_manager is not None
626
+
627
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
628
+ for backoff in backoff_times():
629
+ await self.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True, timeout=None)
630
+
631
+ wallet_ids = wallet_state_manager.wallets.keys()
632
+ for wallet_id in wallet_ids:
633
+ unconfirmed = await wallet_state_manager.tx_store.get_unconfirmed_for_wallet(wallet_id=wallet_id)
634
+ if len(unconfirmed) > 0:
635
+ break
636
+ else:
637
+ # all wallets have zero unconfirmed transactions
638
+ break
639
+
640
+ # at least one wallet has unconfirmed transactions
641
+ await asyncio.sleep(backoff)
642
+
643
+ async def check_transactions_confirmed(
644
+ self,
645
+ wallet_state_manager: WalletStateManager,
646
+ transactions: Union[list[TransactionRecord], list[LightTransactionRecord]],
647
+ timeout: Optional[float] = 5,
648
+ ) -> None:
649
+ transactions_left: set[bytes32] = {tx.name for tx in transactions}
650
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
651
+ for backoff in backoff_times():
652
+ transactions_left &= {tx.name for tx in await wallet_state_manager.tx_store.get_all_unconfirmed()}
653
+ if len(transactions_left) == 0:
654
+ break
655
+
656
+ # at least one wallet has unconfirmed transactions
657
+ await asyncio.sleep(backoff) # pragma: no cover
658
+
659
+ async def create_coins_with_amounts(
660
+ self,
661
+ amounts: list[uint64],
662
+ wallet: Wallet,
663
+ per_transaction_record_group: int = 50,
664
+ timeout: Union[float, None] = 15,
665
+ ) -> set[Coin]:
666
+ """Create coins with the requested amount. This is useful when you need a
667
+ bunch of coins for a test and don't need to farm that many.
668
+
669
+ Arguments:
670
+ amounts: A list with entries of mojo amounts corresponding to each
671
+ coin to create.
672
+ wallet: The wallet to send the new coins to.
673
+ per_transaction_record_group: The maximum number of coins to create in each
674
+ transaction record.
675
+
676
+ Returns:
677
+ A set of the generated coins. Note that this does not include any change
678
+ coins that were created.
679
+ """
680
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
681
+ invalid_amounts = [amount for amount in amounts if amount <= 0]
682
+ if len(invalid_amounts) > 0:
683
+ invalid_amounts_string = ", ".join(str(amount) for amount in invalid_amounts)
684
+ raise Exception(f"Coins must have a positive value, request included: {invalid_amounts_string}")
685
+
686
+ if len(amounts) == 0:
687
+ return set()
688
+
689
+ outputs: list[Payment] = []
690
+ amounts_seen: set[uint64] = set()
691
+ for amount in amounts:
692
+ # We need unique puzzle hash amount combos so we'll only generate a new puzzle hash when we've already
693
+ # seen that amount sent to that puzzle hash
694
+ puzzle_hash = await wallet.get_puzzle_hash(new=amount in amounts_seen)
695
+ outputs.append(Payment(puzzle_hash, amount))
696
+ amounts_seen.add(amount)
697
+
698
+ transaction_records: list[TransactionRecord] = []
699
+ outputs_iterator = iter(outputs)
700
+ while True:
701
+ # The outputs iterator must be second in the zip() call otherwise we lose
702
+ # an element when reaching the end of the range object.
703
+ outputs_group = [output for _, output in zip(range(per_transaction_record_group), outputs_iterator)]
704
+
705
+ if len(outputs_group) > 0:
706
+ async with wallet.wallet_state_manager.new_action_scope(
707
+ DEFAULT_TX_CONFIG, push=True
708
+ ) as action_scope:
709
+ await wallet.generate_signed_transaction(
710
+ amount=outputs_group[0].amount,
711
+ puzzle_hash=outputs_group[0].puzzle_hash,
712
+ action_scope=action_scope,
713
+ primaries=outputs_group[1:],
714
+ )
715
+ transaction_records.extend(action_scope.side_effects.transactions)
716
+ else:
717
+ break
718
+
719
+ await self.wait_transaction_records_entered_mempool(transaction_records, timeout=None)
720
+ await self.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
721
+
722
+ output_coins = {coin for transaction_record in transaction_records for coin in transaction_record.additions}
723
+ puzzle_hashes = {output.puzzle_hash for output in outputs}
724
+ change_coins = {coin for coin in output_coins if coin.puzzle_hash not in puzzle_hashes}
725
+ coins_to_receive = output_coins - change_coins
726
+ await wait_for_coins_in_wallet(coins=coins_to_receive, wallet=wallet)
727
+
728
+ return coins_to_receive
729
+
730
+ def tx_id_in_mempool(self, tx_id: bytes32) -> bool:
731
+ spendbundle = self.full_node.mempool_manager.get_spendbundle(bundle_hash=tx_id)
732
+ return spendbundle is not None
733
+
734
+ def txs_in_mempool(self, txs: list[TransactionRecord]) -> bool:
735
+ return all(self.tx_id_in_mempool(tx_id=tx.spend_bundle.name()) for tx in txs if tx.spend_bundle is not None)
736
+
737
+ async def self_is_synced(self) -> bool:
738
+ return await self.full_node.synced()
739
+
740
+ async def wallet_is_synced(self, wallet_node: WalletNode, peak_height: Optional[uint32] = None) -> bool:
741
+ if not await self.self_is_synced():
742
+ # Depending on races, may not be covered every time
743
+ return False # pragma: no cover
744
+ if not await wallet_node.wallet_state_manager.synced():
745
+ return False
746
+ all_states_retried = await wallet_node.wallet_state_manager.retry_store.get_all_states_to_retry() == []
747
+ wallet_height = await wallet_node.wallet_state_manager.blockchain.get_finished_sync_up_to()
748
+ if peak_height is not None:
749
+ return wallet_height >= peak_height and all_states_retried
750
+ full_node_height = self.full_node.blockchain.get_peak_height()
751
+ return wallet_height == full_node_height and all_states_retried
752
+
753
+ async def wait_for_wallet_synced(
754
+ self,
755
+ wallet_node: WalletNode,
756
+ timeout: Optional[float] = 5,
757
+ peak_height: Optional[uint32] = None,
758
+ ) -> None:
759
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
760
+ for backoff_time in backoff_times():
761
+ if await self.wallet_is_synced(wallet_node=wallet_node, peak_height=peak_height):
762
+ break
763
+ await asyncio.sleep(backoff_time)
764
+
765
+ async def wallets_are_synced(self, wallet_nodes: list[WalletNode], peak_height: Optional[uint32] = None) -> bool:
766
+ return all(
767
+ [
768
+ await self.wallet_is_synced(wallet_node=wallet_node, peak_height=peak_height)
769
+ for wallet_node in wallet_nodes
770
+ ]
771
+ )
772
+
773
+ async def wait_for_wallets_synced(
774
+ self,
775
+ wallet_nodes: list[WalletNode],
776
+ timeout: Optional[float] = 5,
777
+ peak_height: Optional[uint32] = None,
778
+ ) -> None:
779
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
780
+ for backoff_time in backoff_times():
781
+ if await self.wallets_are_synced(wallet_nodes=wallet_nodes, peak_height=peak_height):
782
+ break
783
+ await asyncio.sleep(backoff_time)
784
+
785
+ async def wait_for_self_synced(
786
+ self,
787
+ timeout: Optional[float] = 5,
788
+ ) -> None:
789
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
790
+ for backoff_time in backoff_times():
791
+ if await self.self_is_synced():
792
+ break
793
+ # Depending on races, may not be covered every time
794
+ await asyncio.sleep(backoff_time) # pragma: no cover