chia-blockchain 2.4.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1028) hide show
  1. chia/__init__.py +10 -0
  2. chia/__main__.py +5 -0
  3. chia/_tests/README.md +53 -0
  4. chia/_tests/__init__.py +0 -0
  5. chia/_tests/blockchain/__init__.py +0 -0
  6. chia/_tests/blockchain/blockchain_test_utils.py +197 -0
  7. chia/_tests/blockchain/config.py +4 -0
  8. chia/_tests/blockchain/test_augmented_chain.py +147 -0
  9. chia/_tests/blockchain/test_blockchain.py +4100 -0
  10. chia/_tests/blockchain/test_blockchain_transactions.py +1050 -0
  11. chia/_tests/blockchain/test_build_chains.py +61 -0
  12. chia/_tests/blockchain/test_get_block_generator.py +72 -0
  13. chia/_tests/blockchain/test_lookup_fork_chain.py +195 -0
  14. chia/_tests/build-init-files.py +93 -0
  15. chia/_tests/build-job-matrix.py +204 -0
  16. chia/_tests/check_pytest_monitor_output.py +34 -0
  17. chia/_tests/check_sql_statements.py +73 -0
  18. chia/_tests/chia-start-sim +42 -0
  19. chia/_tests/clvm/__init__.py +0 -0
  20. chia/_tests/clvm/benchmark_costs.py +23 -0
  21. chia/_tests/clvm/coin_store.py +147 -0
  22. chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
  23. chia/_tests/clvm/test_clvm_step.py +37 -0
  24. chia/_tests/clvm/test_condition_codes.py +13 -0
  25. chia/_tests/clvm/test_curry_and_treehash.py +57 -0
  26. chia/_tests/clvm/test_program.py +150 -0
  27. chia/_tests/clvm/test_puzzle_compression.py +144 -0
  28. chia/_tests/clvm/test_puzzle_drivers.py +45 -0
  29. chia/_tests/clvm/test_puzzles.py +247 -0
  30. chia/_tests/clvm/test_singletons.py +540 -0
  31. chia/_tests/clvm/test_spend_sim.py +181 -0
  32. chia/_tests/cmds/__init__.py +0 -0
  33. chia/_tests/cmds/cmd_test_utils.py +472 -0
  34. chia/_tests/cmds/config.py +3 -0
  35. chia/_tests/cmds/conftest.py +23 -0
  36. chia/_tests/cmds/test_click_types.py +195 -0
  37. chia/_tests/cmds/test_cmd_framework.py +400 -0
  38. chia/_tests/cmds/test_cmds_util.py +97 -0
  39. chia/_tests/cmds/test_daemon.py +92 -0
  40. chia/_tests/cmds/test_farm_cmd.py +67 -0
  41. chia/_tests/cmds/test_show.py +116 -0
  42. chia/_tests/cmds/test_sim.py +207 -0
  43. chia/_tests/cmds/test_timelock_args.py +75 -0
  44. chia/_tests/cmds/test_tx_config_args.py +153 -0
  45. chia/_tests/cmds/testing_classes.py +59 -0
  46. chia/_tests/cmds/wallet/__init__.py +0 -0
  47. chia/_tests/cmds/wallet/test_coins.py +195 -0
  48. chia/_tests/cmds/wallet/test_consts.py +47 -0
  49. chia/_tests/cmds/wallet/test_dao.py +565 -0
  50. chia/_tests/cmds/wallet/test_did.py +403 -0
  51. chia/_tests/cmds/wallet/test_nft.py +470 -0
  52. chia/_tests/cmds/wallet/test_notifications.py +124 -0
  53. chia/_tests/cmds/wallet/test_offer.toffer +1 -0
  54. chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
  55. chia/_tests/cmds/wallet/test_vcs.py +376 -0
  56. chia/_tests/cmds/wallet/test_wallet.py +1126 -0
  57. chia/_tests/cmds/wallet/test_wallet_check.py +111 -0
  58. chia/_tests/conftest.py +1304 -0
  59. chia/_tests/connection_utils.py +124 -0
  60. chia/_tests/core/__init__.py +0 -0
  61. chia/_tests/core/cmds/__init__.py +0 -0
  62. chia/_tests/core/cmds/test_beta.py +382 -0
  63. chia/_tests/core/cmds/test_keys.py +1734 -0
  64. chia/_tests/core/cmds/test_wallet.py +126 -0
  65. chia/_tests/core/config.py +3 -0
  66. chia/_tests/core/consensus/__init__.py +0 -0
  67. chia/_tests/core/consensus/test_block_creation.py +56 -0
  68. chia/_tests/core/consensus/test_pot_iterations.py +117 -0
  69. chia/_tests/core/custom_types/__init__.py +0 -0
  70. chia/_tests/core/custom_types/test_coin.py +109 -0
  71. chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
  72. chia/_tests/core/custom_types/test_spend_bundle.py +71 -0
  73. chia/_tests/core/daemon/__init__.py +0 -0
  74. chia/_tests/core/daemon/config.py +4 -0
  75. chia/_tests/core/daemon/test_daemon.py +2128 -0
  76. chia/_tests/core/daemon/test_daemon_register.py +109 -0
  77. chia/_tests/core/daemon/test_keychain_proxy.py +100 -0
  78. chia/_tests/core/data_layer/__init__.py +0 -0
  79. chia/_tests/core/data_layer/config.py +5 -0
  80. chia/_tests/core/data_layer/conftest.py +105 -0
  81. chia/_tests/core/data_layer/test_data_cli.py +57 -0
  82. chia/_tests/core/data_layer/test_data_layer.py +83 -0
  83. chia/_tests/core/data_layer/test_data_layer_util.py +219 -0
  84. chia/_tests/core/data_layer/test_data_rpc.py +3865 -0
  85. chia/_tests/core/data_layer/test_data_store.py +2423 -0
  86. chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
  87. chia/_tests/core/data_layer/test_plugin.py +91 -0
  88. chia/_tests/core/data_layer/util.py +232 -0
  89. chia/_tests/core/farmer/__init__.py +0 -0
  90. chia/_tests/core/farmer/config.py +3 -0
  91. chia/_tests/core/farmer/test_farmer_api.py +101 -0
  92. chia/_tests/core/full_node/__init__.py +0 -0
  93. chia/_tests/core/full_node/config.py +4 -0
  94. chia/_tests/core/full_node/dos/__init__.py +0 -0
  95. chia/_tests/core/full_node/dos/config.py +3 -0
  96. chia/_tests/core/full_node/full_sync/__init__.py +0 -0
  97. chia/_tests/core/full_node/full_sync/config.py +4 -0
  98. chia/_tests/core/full_node/full_sync/test_full_sync.py +448 -0
  99. chia/_tests/core/full_node/ram_db.py +27 -0
  100. chia/_tests/core/full_node/stores/__init__.py +0 -0
  101. chia/_tests/core/full_node/stores/config.py +4 -0
  102. chia/_tests/core/full_node/stores/test_block_store.py +488 -0
  103. chia/_tests/core/full_node/stores/test_coin_store.py +888 -0
  104. chia/_tests/core/full_node/stores/test_full_node_store.py +1215 -0
  105. chia/_tests/core/full_node/stores/test_hint_store.py +230 -0
  106. chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
  107. chia/_tests/core/full_node/test_address_manager.py +588 -0
  108. chia/_tests/core/full_node/test_block_height_map.py +556 -0
  109. chia/_tests/core/full_node/test_conditions.py +558 -0
  110. chia/_tests/core/full_node/test_full_node.py +2445 -0
  111. chia/_tests/core/full_node/test_generator_tools.py +82 -0
  112. chia/_tests/core/full_node/test_hint_management.py +104 -0
  113. chia/_tests/core/full_node/test_node_load.py +34 -0
  114. chia/_tests/core/full_node/test_performance.py +182 -0
  115. chia/_tests/core/full_node/test_subscriptions.py +492 -0
  116. chia/_tests/core/full_node/test_transactions.py +203 -0
  117. chia/_tests/core/full_node/test_tx_processing_queue.py +154 -0
  118. chia/_tests/core/large_block.py +2388 -0
  119. chia/_tests/core/make_block_generator.py +72 -0
  120. chia/_tests/core/mempool/__init__.py +0 -0
  121. chia/_tests/core/mempool/config.py +4 -0
  122. chia/_tests/core/mempool/test_mempool.py +3180 -0
  123. chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
  124. chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
  125. chia/_tests/core/mempool/test_mempool_item_queries.py +192 -0
  126. chia/_tests/core/mempool/test_mempool_manager.py +2054 -0
  127. chia/_tests/core/mempool/test_mempool_performance.py +65 -0
  128. chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
  129. chia/_tests/core/node_height.py +28 -0
  130. chia/_tests/core/server/__init__.py +0 -0
  131. chia/_tests/core/server/config.py +3 -0
  132. chia/_tests/core/server/flood.py +82 -0
  133. chia/_tests/core/server/serve.py +132 -0
  134. chia/_tests/core/server/test_capabilities.py +68 -0
  135. chia/_tests/core/server/test_dos.py +320 -0
  136. chia/_tests/core/server/test_event_loop.py +109 -0
  137. chia/_tests/core/server/test_loop.py +290 -0
  138. chia/_tests/core/server/test_node_discovery.py +74 -0
  139. chia/_tests/core/server/test_rate_limits.py +370 -0
  140. chia/_tests/core/server/test_server.py +225 -0
  141. chia/_tests/core/server/test_upnp.py +8 -0
  142. chia/_tests/core/services/__init__.py +0 -0
  143. chia/_tests/core/services/config.py +3 -0
  144. chia/_tests/core/services/test_services.py +166 -0
  145. chia/_tests/core/ssl/__init__.py +0 -0
  146. chia/_tests/core/ssl/config.py +3 -0
  147. chia/_tests/core/ssl/test_ssl.py +198 -0
  148. chia/_tests/core/test_coins.py +33 -0
  149. chia/_tests/core/test_cost_calculation.py +314 -0
  150. chia/_tests/core/test_crawler.py +175 -0
  151. chia/_tests/core/test_crawler_rpc.py +53 -0
  152. chia/_tests/core/test_daemon_rpc.py +24 -0
  153. chia/_tests/core/test_db_conversion.py +129 -0
  154. chia/_tests/core/test_db_validation.py +161 -0
  155. chia/_tests/core/test_farmer_harvester_rpc.py +504 -0
  156. chia/_tests/core/test_filter.py +37 -0
  157. chia/_tests/core/test_full_node_rpc.py +794 -0
  158. chia/_tests/core/test_merkle_set.py +343 -0
  159. chia/_tests/core/test_program.py +49 -0
  160. chia/_tests/core/test_rpc_util.py +87 -0
  161. chia/_tests/core/test_seeder.py +308 -0
  162. chia/_tests/core/test_setproctitle.py +13 -0
  163. chia/_tests/core/util/__init__.py +0 -0
  164. chia/_tests/core/util/config.py +4 -0
  165. chia/_tests/core/util/test_block_cache.py +44 -0
  166. chia/_tests/core/util/test_cached_bls.py +57 -0
  167. chia/_tests/core/util/test_config.py +337 -0
  168. chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
  169. chia/_tests/core/util/test_files.py +391 -0
  170. chia/_tests/core/util/test_jsonify.py +146 -0
  171. chia/_tests/core/util/test_keychain.py +514 -0
  172. chia/_tests/core/util/test_keyring_wrapper.py +490 -0
  173. chia/_tests/core/util/test_lockfile.py +380 -0
  174. chia/_tests/core/util/test_log_exceptions.py +187 -0
  175. chia/_tests/core/util/test_lru_cache.py +56 -0
  176. chia/_tests/core/util/test_significant_bits.py +40 -0
  177. chia/_tests/core/util/test_streamable.py +883 -0
  178. chia/_tests/db/__init__.py +0 -0
  179. chia/_tests/db/test_db_wrapper.py +565 -0
  180. chia/_tests/environments/__init__.py +0 -0
  181. chia/_tests/environments/common.py +35 -0
  182. chia/_tests/environments/full_node.py +47 -0
  183. chia/_tests/environments/wallet.py +368 -0
  184. chia/_tests/ether.py +19 -0
  185. chia/_tests/farmer_harvester/__init__.py +0 -0
  186. chia/_tests/farmer_harvester/config.py +3 -0
  187. chia/_tests/farmer_harvester/test_farmer.py +1264 -0
  188. chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
  189. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +130 -0
  190. chia/_tests/farmer_harvester/test_third_party_harvesters.py +501 -0
  191. chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
  192. chia/_tests/fee_estimation/__init__.py +0 -0
  193. chia/_tests/fee_estimation/config.py +3 -0
  194. chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
  195. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
  196. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +145 -0
  197. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
  198. chia/_tests/generator/__init__.py +0 -0
  199. chia/_tests/generator/puzzles/__init__.py +0 -0
  200. chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
  201. chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
  202. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
  203. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
  204. chia/_tests/generator/test_compression.py +218 -0
  205. chia/_tests/generator/test_generator_types.py +44 -0
  206. chia/_tests/generator/test_rom.py +182 -0
  207. chia/_tests/plot_sync/__init__.py +0 -0
  208. chia/_tests/plot_sync/config.py +3 -0
  209. chia/_tests/plot_sync/test_delta.py +102 -0
  210. chia/_tests/plot_sync/test_plot_sync.py +617 -0
  211. chia/_tests/plot_sync/test_receiver.py +451 -0
  212. chia/_tests/plot_sync/test_sender.py +116 -0
  213. chia/_tests/plot_sync/test_sync_simulated.py +450 -0
  214. chia/_tests/plot_sync/util.py +67 -0
  215. chia/_tests/plotting/__init__.py +0 -0
  216. chia/_tests/plotting/config.py +3 -0
  217. chia/_tests/plotting/test_plot_manager.py +738 -0
  218. chia/_tests/plotting/util.py +13 -0
  219. chia/_tests/pools/__init__.py +0 -0
  220. chia/_tests/pools/config.py +5 -0
  221. chia/_tests/pools/test_pool_cmdline.py +23 -0
  222. chia/_tests/pools/test_pool_config.py +44 -0
  223. chia/_tests/pools/test_pool_puzzles_lifecycle.py +398 -0
  224. chia/_tests/pools/test_pool_rpc.py +1010 -0
  225. chia/_tests/pools/test_pool_wallet.py +201 -0
  226. chia/_tests/pools/test_wallet_pool_store.py +161 -0
  227. chia/_tests/process_junit.py +349 -0
  228. chia/_tests/rpc/__init__.py +0 -0
  229. chia/_tests/rpc/test_rpc_client.py +81 -0
  230. chia/_tests/simulation/__init__.py +0 -0
  231. chia/_tests/simulation/config.py +6 -0
  232. chia/_tests/simulation/test_simulation.py +501 -0
  233. chia/_tests/simulation/test_simulator.py +234 -0
  234. chia/_tests/simulation/test_start_simulator.py +106 -0
  235. chia/_tests/testconfig.py +13 -0
  236. chia/_tests/timelord/__init__.py +0 -0
  237. chia/_tests/timelord/config.py +3 -0
  238. chia/_tests/timelord/test_new_peak.py +437 -0
  239. chia/_tests/timelord/test_timelord.py +11 -0
  240. chia/_tests/tools/1315537.json +170 -0
  241. chia/_tests/tools/1315544.json +160 -0
  242. chia/_tests/tools/1315630.json +150 -0
  243. chia/_tests/tools/300000.json +105 -0
  244. chia/_tests/tools/442734.json +140 -0
  245. chia/_tests/tools/466212.json +130 -0
  246. chia/_tests/tools/__init__.py +0 -0
  247. chia/_tests/tools/config.py +5 -0
  248. chia/_tests/tools/test-blockchain-db.sqlite +0 -0
  249. chia/_tests/tools/test_full_sync.py +30 -0
  250. chia/_tests/tools/test_legacy_keyring.py +82 -0
  251. chia/_tests/tools/test_run_block.py +129 -0
  252. chia/_tests/util/__init__.py +0 -0
  253. chia/_tests/util/benchmark_cost.py +170 -0
  254. chia/_tests/util/benchmarks.py +154 -0
  255. chia/_tests/util/bip39_test_vectors.json +148 -0
  256. chia/_tests/util/blockchain.py +133 -0
  257. chia/_tests/util/blockchain_mock.py +132 -0
  258. chia/_tests/util/build_network_protocol_files.py +302 -0
  259. chia/_tests/util/clvm_generator.bin +0 -0
  260. chia/_tests/util/config.py +3 -0
  261. chia/_tests/util/constants.py +20 -0
  262. chia/_tests/util/db_connection.py +36 -0
  263. chia/_tests/util/full_sync.py +245 -0
  264. chia/_tests/util/gen_ssl_certs.py +115 -0
  265. chia/_tests/util/generator_tools_testing.py +47 -0
  266. chia/_tests/util/key_tool.py +37 -0
  267. chia/_tests/util/misc.py +722 -0
  268. chia/_tests/util/network_protocol_data.py +1074 -0
  269. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  270. chia/_tests/util/protocol_messages_json.py +2700 -0
  271. chia/_tests/util/rpc.py +23 -0
  272. chia/_tests/util/run_block.py +163 -0
  273. chia/_tests/util/setup_nodes.py +479 -0
  274. chia/_tests/util/split_managers.py +99 -0
  275. chia/_tests/util/temp_file.py +14 -0
  276. chia/_tests/util/test_action_scope.py +143 -0
  277. chia/_tests/util/test_async_pool.py +366 -0
  278. chia/_tests/util/test_build_job_matrix.py +43 -0
  279. chia/_tests/util/test_build_network_protocol_files.py +7 -0
  280. chia/_tests/util/test_chia_version.py +50 -0
  281. chia/_tests/util/test_collection.py +11 -0
  282. chia/_tests/util/test_condition_tools.py +231 -0
  283. chia/_tests/util/test_config.py +426 -0
  284. chia/_tests/util/test_dump_keyring.py +60 -0
  285. chia/_tests/util/test_errors.py +10 -0
  286. chia/_tests/util/test_full_block_utils.py +271 -0
  287. chia/_tests/util/test_installed.py +20 -0
  288. chia/_tests/util/test_limited_semaphore.py +52 -0
  289. chia/_tests/util/test_logging_filter.py +43 -0
  290. chia/_tests/util/test_misc.py +444 -0
  291. chia/_tests/util/test_network.py +74 -0
  292. chia/_tests/util/test_network_protocol_files.py +579 -0
  293. chia/_tests/util/test_network_protocol_json.py +266 -0
  294. chia/_tests/util/test_network_protocol_test.py +257 -0
  295. chia/_tests/util/test_paginator.py +72 -0
  296. chia/_tests/util/test_pprint.py +17 -0
  297. chia/_tests/util/test_priority_mutex.py +487 -0
  298. chia/_tests/util/test_recursive_replace.py +116 -0
  299. chia/_tests/util/test_replace_str_to_bytes.py +137 -0
  300. chia/_tests/util/test_service_groups.py +15 -0
  301. chia/_tests/util/test_ssl_check.py +31 -0
  302. chia/_tests/util/test_testnet_overrides.py +19 -0
  303. chia/_tests/util/test_tests_misc.py +38 -0
  304. chia/_tests/util/test_timing.py +37 -0
  305. chia/_tests/util/test_trusted_peer.py +51 -0
  306. chia/_tests/util/time_out_assert.py +154 -0
  307. chia/_tests/wallet/__init__.py +0 -0
  308. chia/_tests/wallet/cat_wallet/__init__.py +0 -0
  309. chia/_tests/wallet/cat_wallet/config.py +4 -0
  310. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
  311. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
  312. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1738 -0
  313. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
  314. chia/_tests/wallet/cat_wallet/test_trades.py +2578 -0
  315. chia/_tests/wallet/clawback/__init__.py +0 -0
  316. chia/_tests/wallet/clawback/config.py +3 -0
  317. chia/_tests/wallet/clawback/test_clawback_decorator.py +80 -0
  318. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
  319. chia/_tests/wallet/clawback/test_clawback_metadata.py +51 -0
  320. chia/_tests/wallet/config.py +4 -0
  321. chia/_tests/wallet/conftest.py +217 -0
  322. chia/_tests/wallet/dao_wallet/__init__.py +0 -0
  323. chia/_tests/wallet/dao_wallet/config.py +3 -0
  324. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1322 -0
  325. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
  326. chia/_tests/wallet/db_wallet/__init__.py +0 -0
  327. chia/_tests/wallet/db_wallet/config.py +3 -0
  328. chia/_tests/wallet/db_wallet/test_db_graftroot.py +143 -0
  329. chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
  330. chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
  331. chia/_tests/wallet/did_wallet/__init__.py +0 -0
  332. chia/_tests/wallet/did_wallet/config.py +4 -0
  333. chia/_tests/wallet/did_wallet/test_did.py +1481 -0
  334. chia/_tests/wallet/nft_wallet/__init__.py +0 -0
  335. chia/_tests/wallet/nft_wallet/config.py +4 -0
  336. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1492 -0
  337. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1014 -0
  338. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +376 -0
  339. chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
  340. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
  341. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2558 -0
  342. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
  343. chia/_tests/wallet/rpc/__init__.py +0 -0
  344. chia/_tests/wallet/rpc/config.py +4 -0
  345. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +287 -0
  346. chia/_tests/wallet/rpc/test_wallet_rpc.py +3106 -0
  347. chia/_tests/wallet/simple_sync/__init__.py +0 -0
  348. chia/_tests/wallet/simple_sync/config.py +3 -0
  349. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +719 -0
  350. chia/_tests/wallet/sync/__init__.py +0 -0
  351. chia/_tests/wallet/sync/config.py +4 -0
  352. chia/_tests/wallet/sync/test_wallet_sync.py +1529 -0
  353. chia/_tests/wallet/test_address_type.py +189 -0
  354. chia/_tests/wallet/test_bech32m.py +45 -0
  355. chia/_tests/wallet/test_clvm_streamable.py +244 -0
  356. chia/_tests/wallet/test_coin_selection.py +589 -0
  357. chia/_tests/wallet/test_conditions.py +388 -0
  358. chia/_tests/wallet/test_debug_spend_bundle.py +76 -0
  359. chia/_tests/wallet/test_new_wallet_protocol.py +1176 -0
  360. chia/_tests/wallet/test_nft_store.py +193 -0
  361. chia/_tests/wallet/test_notifications.py +196 -0
  362. chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
  363. chia/_tests/wallet/test_puzzle_store.py +133 -0
  364. chia/_tests/wallet/test_sign_coin_spends.py +159 -0
  365. chia/_tests/wallet/test_signer_protocol.py +948 -0
  366. chia/_tests/wallet/test_singleton.py +122 -0
  367. chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
  368. chia/_tests/wallet/test_singleton_store.py +152 -0
  369. chia/_tests/wallet/test_taproot.py +19 -0
  370. chia/_tests/wallet/test_transaction_store.py +941 -0
  371. chia/_tests/wallet/test_util.py +181 -0
  372. chia/_tests/wallet/test_wallet.py +2139 -0
  373. chia/_tests/wallet/test_wallet_action_scope.py +85 -0
  374. chia/_tests/wallet/test_wallet_blockchain.py +113 -0
  375. chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
  376. chia/_tests/wallet/test_wallet_interested_store.py +43 -0
  377. chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
  378. chia/_tests/wallet/test_wallet_node.py +783 -0
  379. chia/_tests/wallet/test_wallet_retry.py +95 -0
  380. chia/_tests/wallet/test_wallet_state_manager.py +252 -0
  381. chia/_tests/wallet/test_wallet_test_framework.py +275 -0
  382. chia/_tests/wallet/test_wallet_trade_store.py +218 -0
  383. chia/_tests/wallet/test_wallet_user_store.py +34 -0
  384. chia/_tests/wallet/test_wallet_utils.py +155 -0
  385. chia/_tests/wallet/vc_wallet/__init__.py +0 -0
  386. chia/_tests/wallet/vc_wallet/config.py +3 -0
  387. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
  388. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
  389. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +801 -0
  390. chia/_tests/wallet/wallet_block_tools.py +327 -0
  391. chia/_tests/weight_proof/__init__.py +0 -0
  392. chia/_tests/weight_proof/config.py +3 -0
  393. chia/_tests/weight_proof/test_weight_proof.py +528 -0
  394. chia/clvm/__init__.py +0 -0
  395. chia/clvm/spend_sim.py +488 -0
  396. chia/cmds/__init__.py +0 -0
  397. chia/cmds/beta.py +183 -0
  398. chia/cmds/beta_funcs.py +133 -0
  399. chia/cmds/check_wallet_db.py +418 -0
  400. chia/cmds/chia.py +143 -0
  401. chia/cmds/cmd_classes.py +315 -0
  402. chia/cmds/cmds_util.py +498 -0
  403. chia/cmds/coin_funcs.py +260 -0
  404. chia/cmds/coins.py +220 -0
  405. chia/cmds/completion.py +49 -0
  406. chia/cmds/configure.py +331 -0
  407. chia/cmds/dao.py +1008 -0
  408. chia/cmds/dao_funcs.py +576 -0
  409. chia/cmds/data.py +707 -0
  410. chia/cmds/data_funcs.py +380 -0
  411. chia/cmds/db.py +86 -0
  412. chia/cmds/db_backup_func.py +77 -0
  413. chia/cmds/db_upgrade_func.py +452 -0
  414. chia/cmds/db_validate_func.py +184 -0
  415. chia/cmds/dev.py +16 -0
  416. chia/cmds/farm.py +87 -0
  417. chia/cmds/farm_funcs.py +207 -0
  418. chia/cmds/init.py +70 -0
  419. chia/cmds/init_funcs.py +367 -0
  420. chia/cmds/installers.py +129 -0
  421. chia/cmds/keys.py +510 -0
  422. chia/cmds/keys_funcs.py +864 -0
  423. chia/cmds/netspace.py +47 -0
  424. chia/cmds/netspace_funcs.py +53 -0
  425. chia/cmds/options.py +32 -0
  426. chia/cmds/param_types.py +228 -0
  427. chia/cmds/passphrase.py +130 -0
  428. chia/cmds/passphrase_funcs.py +346 -0
  429. chia/cmds/peer.py +50 -0
  430. chia/cmds/peer_funcs.py +129 -0
  431. chia/cmds/plotnft.py +206 -0
  432. chia/cmds/plotnft_funcs.py +374 -0
  433. chia/cmds/plots.py +222 -0
  434. chia/cmds/plotters.py +17 -0
  435. chia/cmds/rpc.py +188 -0
  436. chia/cmds/show.py +71 -0
  437. chia/cmds/show_funcs.py +214 -0
  438. chia/cmds/signer.py +304 -0
  439. chia/cmds/sim.py +217 -0
  440. chia/cmds/sim_funcs.py +509 -0
  441. chia/cmds/start.py +24 -0
  442. chia/cmds/start_funcs.py +112 -0
  443. chia/cmds/stop.py +61 -0
  444. chia/cmds/units.py +11 -0
  445. chia/cmds/wallet.py +1745 -0
  446. chia/cmds/wallet_funcs.py +1800 -0
  447. chia/consensus/__init__.py +0 -0
  448. chia/consensus/block_body_validation.py +515 -0
  449. chia/consensus/block_creation.py +525 -0
  450. chia/consensus/block_header_validation.py +1064 -0
  451. chia/consensus/block_record.py +32 -0
  452. chia/consensus/block_rewards.py +53 -0
  453. chia/consensus/block_root_validation.py +46 -0
  454. chia/consensus/blockchain.py +1100 -0
  455. chia/consensus/blockchain_interface.py +56 -0
  456. chia/consensus/coinbase.py +30 -0
  457. chia/consensus/condition_costs.py +9 -0
  458. chia/consensus/constants.py +49 -0
  459. chia/consensus/cost_calculator.py +15 -0
  460. chia/consensus/default_constants.py +90 -0
  461. chia/consensus/deficit.py +55 -0
  462. chia/consensus/difficulty_adjustment.py +412 -0
  463. chia/consensus/find_fork_point.py +111 -0
  464. chia/consensus/full_block_to_block_record.py +167 -0
  465. chia/consensus/get_block_challenge.py +106 -0
  466. chia/consensus/get_block_generator.py +26 -0
  467. chia/consensus/make_sub_epoch_summary.py +210 -0
  468. chia/consensus/multiprocess_validation.py +365 -0
  469. chia/consensus/pos_quality.py +19 -0
  470. chia/consensus/pot_iterations.py +67 -0
  471. chia/consensus/puzzles/__init__.py +0 -0
  472. chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
  473. chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
  474. chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
  475. chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
  476. chia/consensus/vdf_info_computation.py +156 -0
  477. chia/daemon/__init__.py +0 -0
  478. chia/daemon/client.py +233 -0
  479. chia/daemon/keychain_proxy.py +501 -0
  480. chia/daemon/keychain_server.py +365 -0
  481. chia/daemon/server.py +1616 -0
  482. chia/daemon/windows_signal.py +56 -0
  483. chia/data_layer/__init__.py +0 -0
  484. chia/data_layer/data_layer.py +1303 -0
  485. chia/data_layer/data_layer_api.py +25 -0
  486. chia/data_layer/data_layer_errors.py +50 -0
  487. chia/data_layer/data_layer_server.py +170 -0
  488. chia/data_layer/data_layer_util.py +985 -0
  489. chia/data_layer/data_layer_wallet.py +1315 -0
  490. chia/data_layer/data_store.py +2267 -0
  491. chia/data_layer/dl_wallet_store.py +407 -0
  492. chia/data_layer/download_data.py +389 -0
  493. chia/data_layer/puzzles/__init__.py +0 -0
  494. chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
  495. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
  496. chia/data_layer/s3_plugin_config.yml +33 -0
  497. chia/data_layer/s3_plugin_service.py +468 -0
  498. chia/data_layer/util/__init__.py +0 -0
  499. chia/data_layer/util/benchmark.py +108 -0
  500. chia/data_layer/util/plugin.py +41 -0
  501. chia/farmer/__init__.py +0 -0
  502. chia/farmer/farmer.py +920 -0
  503. chia/farmer/farmer_api.py +814 -0
  504. chia/full_node/__init__.py +0 -0
  505. chia/full_node/bitcoin_fee_estimator.py +85 -0
  506. chia/full_node/block_height_map.py +271 -0
  507. chia/full_node/block_store.py +570 -0
  508. chia/full_node/bundle_tools.py +19 -0
  509. chia/full_node/coin_store.py +646 -0
  510. chia/full_node/fee_estimate.py +54 -0
  511. chia/full_node/fee_estimate_store.py +24 -0
  512. chia/full_node/fee_estimation.py +93 -0
  513. chia/full_node/fee_estimator.py +90 -0
  514. chia/full_node/fee_estimator_constants.py +38 -0
  515. chia/full_node/fee_estimator_interface.py +42 -0
  516. chia/full_node/fee_history.py +26 -0
  517. chia/full_node/fee_tracker.py +564 -0
  518. chia/full_node/full_node.py +3052 -0
  519. chia/full_node/full_node_api.py +1974 -0
  520. chia/full_node/full_node_store.py +1033 -0
  521. chia/full_node/hint_management.py +56 -0
  522. chia/full_node/hint_store.py +94 -0
  523. chia/full_node/mempool.py +583 -0
  524. chia/full_node/mempool_check_conditions.py +177 -0
  525. chia/full_node/mempool_manager.py +858 -0
  526. chia/full_node/pending_tx_cache.py +112 -0
  527. chia/full_node/puzzles/__init__.py +0 -0
  528. chia/full_node/puzzles/block_program_zero.clsp +14 -0
  529. chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
  530. chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
  531. chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
  532. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
  533. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
  534. chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
  535. chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
  536. chia/full_node/signage_point.py +16 -0
  537. chia/full_node/subscriptions.py +248 -0
  538. chia/full_node/sync_store.py +145 -0
  539. chia/full_node/tx_processing_queue.py +78 -0
  540. chia/full_node/weight_proof.py +1719 -0
  541. chia/harvester/__init__.py +0 -0
  542. chia/harvester/harvester.py +271 -0
  543. chia/harvester/harvester_api.py +374 -0
  544. chia/introducer/__init__.py +0 -0
  545. chia/introducer/introducer.py +120 -0
  546. chia/introducer/introducer_api.py +64 -0
  547. chia/legacy/__init__.py +0 -0
  548. chia/legacy/keyring.py +154 -0
  549. chia/plot_sync/__init__.py +0 -0
  550. chia/plot_sync/delta.py +61 -0
  551. chia/plot_sync/exceptions.py +56 -0
  552. chia/plot_sync/receiver.py +385 -0
  553. chia/plot_sync/sender.py +337 -0
  554. chia/plot_sync/util.py +43 -0
  555. chia/plotters/__init__.py +0 -0
  556. chia/plotters/bladebit.py +388 -0
  557. chia/plotters/chiapos.py +63 -0
  558. chia/plotters/madmax.py +224 -0
  559. chia/plotters/plotters.py +577 -0
  560. chia/plotters/plotters_util.py +131 -0
  561. chia/plotting/__init__.py +0 -0
  562. chia/plotting/cache.py +212 -0
  563. chia/plotting/check_plots.py +283 -0
  564. chia/plotting/create_plots.py +278 -0
  565. chia/plotting/manager.py +436 -0
  566. chia/plotting/util.py +324 -0
  567. chia/pools/__init__.py +0 -0
  568. chia/pools/pool_config.py +110 -0
  569. chia/pools/pool_puzzles.py +459 -0
  570. chia/pools/pool_wallet.py +926 -0
  571. chia/pools/pool_wallet_info.py +118 -0
  572. chia/pools/puzzles/__init__.py +0 -0
  573. chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
  574. chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
  575. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
  576. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
  577. chia/protocols/__init__.py +0 -0
  578. chia/protocols/farmer_protocol.py +102 -0
  579. chia/protocols/full_node_protocol.py +219 -0
  580. chia/protocols/harvester_protocol.py +216 -0
  581. chia/protocols/introducer_protocol.py +26 -0
  582. chia/protocols/pool_protocol.py +177 -0
  583. chia/protocols/protocol_message_types.py +139 -0
  584. chia/protocols/protocol_state_machine.py +87 -0
  585. chia/protocols/protocol_timing.py +7 -0
  586. chia/protocols/shared_protocol.py +86 -0
  587. chia/protocols/timelord_protocol.py +93 -0
  588. chia/protocols/wallet_protocol.py +401 -0
  589. chia/py.typed +0 -0
  590. chia/rpc/__init__.py +0 -0
  591. chia/rpc/crawler_rpc_api.py +75 -0
  592. chia/rpc/data_layer_rpc_api.py +639 -0
  593. chia/rpc/data_layer_rpc_client.py +188 -0
  594. chia/rpc/data_layer_rpc_util.py +62 -0
  595. chia/rpc/farmer_rpc_api.py +360 -0
  596. chia/rpc/farmer_rpc_client.py +86 -0
  597. chia/rpc/full_node_rpc_api.py +954 -0
  598. chia/rpc/full_node_rpc_client.py +292 -0
  599. chia/rpc/harvester_rpc_api.py +136 -0
  600. chia/rpc/harvester_rpc_client.py +54 -0
  601. chia/rpc/rpc_client.py +144 -0
  602. chia/rpc/rpc_server.py +447 -0
  603. chia/rpc/timelord_rpc_api.py +27 -0
  604. chia/rpc/util.py +293 -0
  605. chia/rpc/wallet_request_types.py +688 -0
  606. chia/rpc/wallet_rpc_api.py +4779 -0
  607. chia/rpc/wallet_rpc_client.py +1844 -0
  608. chia/seeder/__init__.py +0 -0
  609. chia/seeder/crawl_store.py +427 -0
  610. chia/seeder/crawler.py +423 -0
  611. chia/seeder/crawler_api.py +129 -0
  612. chia/seeder/dns_server.py +544 -0
  613. chia/seeder/peer_record.py +146 -0
  614. chia/seeder/start_crawler.py +88 -0
  615. chia/server/__init__.py +0 -0
  616. chia/server/address_manager.py +658 -0
  617. chia/server/address_manager_store.py +237 -0
  618. chia/server/api_protocol.py +11 -0
  619. chia/server/capabilities.py +24 -0
  620. chia/server/chia_policy.py +345 -0
  621. chia/server/introducer_peers.py +76 -0
  622. chia/server/node_discovery.py +718 -0
  623. chia/server/outbound_message.py +33 -0
  624. chia/server/rate_limit_numbers.py +204 -0
  625. chia/server/rate_limits.py +113 -0
  626. chia/server/server.py +720 -0
  627. chia/server/signal_handlers.py +117 -0
  628. chia/server/ssl_context.py +32 -0
  629. chia/server/start_data_layer.py +137 -0
  630. chia/server/start_farmer.py +86 -0
  631. chia/server/start_full_node.py +106 -0
  632. chia/server/start_harvester.py +80 -0
  633. chia/server/start_introducer.py +69 -0
  634. chia/server/start_service.py +328 -0
  635. chia/server/start_timelord.py +82 -0
  636. chia/server/start_wallet.py +109 -0
  637. chia/server/upnp.py +117 -0
  638. chia/server/ws_connection.py +752 -0
  639. chia/simulator/__init__.py +0 -0
  640. chia/simulator/block_tools.py +2053 -0
  641. chia/simulator/full_node_simulator.py +802 -0
  642. chia/simulator/keyring.py +128 -0
  643. chia/simulator/setup_services.py +505 -0
  644. chia/simulator/simulator_constants.py +13 -0
  645. chia/simulator/simulator_full_node_rpc_api.py +101 -0
  646. chia/simulator/simulator_full_node_rpc_client.py +62 -0
  647. chia/simulator/simulator_protocol.py +29 -0
  648. chia/simulator/simulator_test_tools.py +163 -0
  649. chia/simulator/socket.py +27 -0
  650. chia/simulator/ssl_certs.py +114 -0
  651. chia/simulator/ssl_certs_1.py +699 -0
  652. chia/simulator/ssl_certs_10.py +699 -0
  653. chia/simulator/ssl_certs_2.py +699 -0
  654. chia/simulator/ssl_certs_3.py +699 -0
  655. chia/simulator/ssl_certs_4.py +699 -0
  656. chia/simulator/ssl_certs_5.py +699 -0
  657. chia/simulator/ssl_certs_6.py +699 -0
  658. chia/simulator/ssl_certs_7.py +699 -0
  659. chia/simulator/ssl_certs_8.py +699 -0
  660. chia/simulator/ssl_certs_9.py +699 -0
  661. chia/simulator/start_simulator.py +135 -0
  662. chia/simulator/wallet_tools.py +245 -0
  663. chia/ssl/__init__.py +0 -0
  664. chia/ssl/chia_ca.crt +19 -0
  665. chia/ssl/chia_ca.key +28 -0
  666. chia/ssl/create_ssl.py +249 -0
  667. chia/ssl/dst_root_ca.pem +20 -0
  668. chia/timelord/__init__.py +0 -0
  669. chia/timelord/iters_from_block.py +50 -0
  670. chia/timelord/timelord.py +1202 -0
  671. chia/timelord/timelord_api.py +132 -0
  672. chia/timelord/timelord_launcher.py +188 -0
  673. chia/timelord/timelord_state.py +244 -0
  674. chia/timelord/types.py +22 -0
  675. chia/types/__init__.py +0 -0
  676. chia/types/aliases.py +35 -0
  677. chia/types/block_protocol.py +20 -0
  678. chia/types/blockchain_format/__init__.py +0 -0
  679. chia/types/blockchain_format/classgroup.py +5 -0
  680. chia/types/blockchain_format/coin.py +28 -0
  681. chia/types/blockchain_format/foliage.py +8 -0
  682. chia/types/blockchain_format/pool_target.py +5 -0
  683. chia/types/blockchain_format/program.py +270 -0
  684. chia/types/blockchain_format/proof_of_space.py +135 -0
  685. chia/types/blockchain_format/reward_chain_block.py +6 -0
  686. chia/types/blockchain_format/serialized_program.py +5 -0
  687. chia/types/blockchain_format/sized_bytes.py +11 -0
  688. chia/types/blockchain_format/slots.py +9 -0
  689. chia/types/blockchain_format/sub_epoch_summary.py +5 -0
  690. chia/types/blockchain_format/tree_hash.py +72 -0
  691. chia/types/blockchain_format/vdf.py +86 -0
  692. chia/types/clvm_cost.py +13 -0
  693. chia/types/coin_record.py +43 -0
  694. chia/types/coin_spend.py +115 -0
  695. chia/types/condition_opcodes.py +73 -0
  696. chia/types/condition_with_args.py +17 -0
  697. chia/types/eligible_coin_spends.py +364 -0
  698. chia/types/end_of_slot_bundle.py +5 -0
  699. chia/types/fee_rate.py +38 -0
  700. chia/types/full_block.py +5 -0
  701. chia/types/generator_types.py +14 -0
  702. chia/types/header_block.py +5 -0
  703. chia/types/internal_mempool_item.py +19 -0
  704. chia/types/mempool_inclusion_status.py +9 -0
  705. chia/types/mempool_item.py +85 -0
  706. chia/types/mempool_submission_status.py +30 -0
  707. chia/types/mojos.py +7 -0
  708. chia/types/peer_info.py +64 -0
  709. chia/types/signing_mode.py +29 -0
  710. chia/types/spend_bundle.py +31 -0
  711. chia/types/spend_bundle_conditions.py +7 -0
  712. chia/types/transaction_queue_entry.py +55 -0
  713. chia/types/unfinished_block.py +5 -0
  714. chia/types/unfinished_header_block.py +37 -0
  715. chia/types/weight_proof.py +50 -0
  716. chia/util/__init__.py +0 -0
  717. chia/util/action_scope.py +168 -0
  718. chia/util/api_decorators.py +89 -0
  719. chia/util/async_pool.py +224 -0
  720. chia/util/augmented_chain.py +130 -0
  721. chia/util/batches.py +39 -0
  722. chia/util/bech32m.py +123 -0
  723. chia/util/beta_metrics.py +118 -0
  724. chia/util/block_cache.py +56 -0
  725. chia/util/byte_types.py +10 -0
  726. chia/util/check_fork_next_block.py +32 -0
  727. chia/util/chia_logging.py +124 -0
  728. chia/util/chia_version.py +33 -0
  729. chia/util/collection.py +17 -0
  730. chia/util/condition_tools.py +201 -0
  731. chia/util/config.py +366 -0
  732. chia/util/cpu.py +20 -0
  733. chia/util/db_synchronous.py +21 -0
  734. chia/util/db_version.py +30 -0
  735. chia/util/db_wrapper.py +427 -0
  736. chia/util/default_root.py +10 -0
  737. chia/util/dump_keyring.py +93 -0
  738. chia/util/english.txt +2048 -0
  739. chia/util/errors.py +351 -0
  740. chia/util/file_keyring.py +480 -0
  741. chia/util/files.py +95 -0
  742. chia/util/full_block_utils.py +321 -0
  743. chia/util/generator_tools.py +62 -0
  744. chia/util/hash.py +29 -0
  745. chia/util/initial-config.yaml +675 -0
  746. chia/util/inline_executor.py +24 -0
  747. chia/util/ints.py +19 -0
  748. chia/util/json_util.py +41 -0
  749. chia/util/keychain.py +673 -0
  750. chia/util/keyring_wrapper.py +266 -0
  751. chia/util/limited_semaphore.py +39 -0
  752. chia/util/lock.py +47 -0
  753. chia/util/log_exceptions.py +29 -0
  754. chia/util/logging.py +34 -0
  755. chia/util/lru_cache.py +29 -0
  756. chia/util/math.py +20 -0
  757. chia/util/network.py +240 -0
  758. chia/util/paginator.py +46 -0
  759. chia/util/path.py +29 -0
  760. chia/util/permissions.py +19 -0
  761. chia/util/pprint.py +40 -0
  762. chia/util/prev_transaction_block.py +23 -0
  763. chia/util/priority_mutex.py +92 -0
  764. chia/util/profiler.py +194 -0
  765. chia/util/recursive_replace.py +22 -0
  766. chia/util/safe_cancel_task.py +14 -0
  767. chia/util/service_groups.py +47 -0
  768. chia/util/setproctitle.py +20 -0
  769. chia/util/significant_bits.py +30 -0
  770. chia/util/ssl_check.py +213 -0
  771. chia/util/streamable.py +654 -0
  772. chia/util/task_timing.py +378 -0
  773. chia/util/timing.py +64 -0
  774. chia/util/vdf_prover.py +31 -0
  775. chia/util/ws_message.py +66 -0
  776. chia/wallet/__init__.py +0 -0
  777. chia/wallet/cat_wallet/__init__.py +0 -0
  778. chia/wallet/cat_wallet/cat_constants.py +75 -0
  779. chia/wallet/cat_wallet/cat_info.py +47 -0
  780. chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
  781. chia/wallet/cat_wallet/cat_utils.py +163 -0
  782. chia/wallet/cat_wallet/cat_wallet.py +869 -0
  783. chia/wallet/cat_wallet/dao_cat_info.py +28 -0
  784. chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
  785. chia/wallet/cat_wallet/lineage_store.py +74 -0
  786. chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
  787. chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
  788. chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
  789. chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
  790. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
  791. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
  792. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
  793. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
  794. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
  795. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
  796. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
  797. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
  798. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
  799. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
  800. chia/wallet/coin_selection.py +188 -0
  801. chia/wallet/conditions.py +1326 -0
  802. chia/wallet/dao_wallet/__init__.py +0 -0
  803. chia/wallet/dao_wallet/dao_info.py +61 -0
  804. chia/wallet/dao_wallet/dao_utils.py +810 -0
  805. chia/wallet/dao_wallet/dao_wallet.py +2121 -0
  806. chia/wallet/db_wallet/__init__.py +0 -0
  807. chia/wallet/db_wallet/db_wallet_puzzles.py +107 -0
  808. chia/wallet/derivation_record.py +30 -0
  809. chia/wallet/derive_keys.py +146 -0
  810. chia/wallet/did_wallet/__init__.py +0 -0
  811. chia/wallet/did_wallet/did_info.py +39 -0
  812. chia/wallet/did_wallet/did_wallet.py +1485 -0
  813. chia/wallet/did_wallet/did_wallet_puzzles.py +220 -0
  814. chia/wallet/did_wallet/puzzles/__init__.py +0 -0
  815. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
  816. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
  817. chia/wallet/driver_protocol.py +26 -0
  818. chia/wallet/key_val_store.py +55 -0
  819. chia/wallet/lineage_proof.py +58 -0
  820. chia/wallet/nft_wallet/__init__.py +0 -0
  821. chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
  822. chia/wallet/nft_wallet/nft_info.py +120 -0
  823. chia/wallet/nft_wallet/nft_puzzles.py +305 -0
  824. chia/wallet/nft_wallet/nft_wallet.py +1686 -0
  825. chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
  826. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  827. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
  828. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
  829. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
  830. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
  831. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
  832. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
  833. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
  834. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
  835. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
  836. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
  837. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
  838. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
  839. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
  840. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
  841. chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
  842. chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
  843. chia/wallet/nft_wallet/uncurry_nft.py +217 -0
  844. chia/wallet/notification_manager.py +117 -0
  845. chia/wallet/notification_store.py +178 -0
  846. chia/wallet/outer_puzzles.py +84 -0
  847. chia/wallet/payment.py +34 -0
  848. chia/wallet/puzzle_drivers.py +118 -0
  849. chia/wallet/puzzles/__init__.py +0 -0
  850. chia/wallet/puzzles/augmented_condition.clsp +13 -0
  851. chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
  852. chia/wallet/puzzles/clawback/__init__.py +0 -0
  853. chia/wallet/puzzles/clawback/drivers.py +188 -0
  854. chia/wallet/puzzles/clawback/metadata.py +38 -0
  855. chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
  856. chia/wallet/puzzles/condition_codes.clib +77 -0
  857. chia/wallet/puzzles/curry-and-treehash.clib +102 -0
  858. chia/wallet/puzzles/curry.clib +135 -0
  859. chia/wallet/puzzles/curry_by_index.clib +16 -0
  860. chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
  861. chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
  862. chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
  863. chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
  864. chia/wallet/puzzles/dao_finished_state.clsp +35 -0
  865. chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
  866. chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
  867. chia/wallet/puzzles/dao_lockup.clsp +288 -0
  868. chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
  869. chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
  870. chia/wallet/puzzles/dao_proposal.clsp +377 -0
  871. chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
  872. chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
  873. chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
  874. chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
  875. chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
  876. chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
  877. chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
  878. chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
  879. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
  880. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
  881. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
  882. chia/wallet/puzzles/dao_treasury.clsp +115 -0
  883. chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
  884. chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
  885. chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
  886. chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
  887. chia/wallet/puzzles/json.clib +25 -0
  888. chia/wallet/puzzles/load_clvm.py +162 -0
  889. chia/wallet/puzzles/merkle_utils.clib +18 -0
  890. chia/wallet/puzzles/notification.clsp +7 -0
  891. chia/wallet/puzzles/notification.clsp.hex +1 -0
  892. chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
  893. chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
  894. chia/wallet/puzzles/p2_conditions.clsp +3 -0
  895. chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
  896. chia/wallet/puzzles/p2_conditions.py +27 -0
  897. chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
  898. chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
  899. chia/wallet/puzzles/p2_delegated_conditions.py +22 -0
  900. chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
  901. chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
  902. chia/wallet/puzzles/p2_delegated_puzzle.py +35 -0
  903. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
  904. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
  905. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +161 -0
  906. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
  907. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
  908. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +22 -0
  909. chia/wallet/puzzles/p2_parent.clsp +19 -0
  910. chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
  911. chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
  912. chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
  913. chia/wallet/puzzles/p2_puzzle_hash.py +28 -0
  914. chia/wallet/puzzles/p2_singleton.clsp +30 -0
  915. chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
  916. chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
  917. chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
  918. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
  919. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
  920. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
  921. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
  922. chia/wallet/puzzles/puzzle_utils.py +34 -0
  923. chia/wallet/puzzles/settlement_payments.clsp +49 -0
  924. chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
  925. chia/wallet/puzzles/sha256tree.clib +11 -0
  926. chia/wallet/puzzles/singleton_launcher.clsp +16 -0
  927. chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
  928. chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
  929. chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
  930. chia/wallet/puzzles/singleton_top_layer.py +295 -0
  931. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
  932. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
  933. chia/wallet/puzzles/singleton_top_layer_v1_1.py +344 -0
  934. chia/wallet/puzzles/singleton_truths.clib +21 -0
  935. chia/wallet/puzzles/tails.py +344 -0
  936. chia/wallet/puzzles/utility_macros.clib +48 -0
  937. chia/wallet/signer_protocol.py +126 -0
  938. chia/wallet/singleton.py +106 -0
  939. chia/wallet/singleton_record.py +30 -0
  940. chia/wallet/trade_manager.py +1088 -0
  941. chia/wallet/trade_record.py +67 -0
  942. chia/wallet/trading/__init__.py +0 -0
  943. chia/wallet/trading/offer.py +703 -0
  944. chia/wallet/trading/trade_status.py +13 -0
  945. chia/wallet/trading/trade_store.py +526 -0
  946. chia/wallet/transaction_record.py +143 -0
  947. chia/wallet/transaction_sorting.py +14 -0
  948. chia/wallet/uncurried_puzzle.py +17 -0
  949. chia/wallet/util/__init__.py +0 -0
  950. chia/wallet/util/address_type.py +55 -0
  951. chia/wallet/util/blind_signer_tl.py +168 -0
  952. chia/wallet/util/clvm_streamable.py +203 -0
  953. chia/wallet/util/compute_hints.py +66 -0
  954. chia/wallet/util/compute_memos.py +45 -0
  955. chia/wallet/util/curry_and_treehash.py +90 -0
  956. chia/wallet/util/debug_spend_bundle.py +234 -0
  957. chia/wallet/util/merkle_tree.py +100 -0
  958. chia/wallet/util/merkle_utils.py +102 -0
  959. chia/wallet/util/new_peak_queue.py +82 -0
  960. chia/wallet/util/notifications.py +12 -0
  961. chia/wallet/util/peer_request_cache.py +174 -0
  962. chia/wallet/util/puzzle_compression.py +96 -0
  963. chia/wallet/util/puzzle_decorator.py +100 -0
  964. chia/wallet/util/puzzle_decorator_type.py +7 -0
  965. chia/wallet/util/query_filter.py +60 -0
  966. chia/wallet/util/transaction_type.py +23 -0
  967. chia/wallet/util/tx_config.py +158 -0
  968. chia/wallet/util/wallet_sync_utils.py +348 -0
  969. chia/wallet/util/wallet_types.py +65 -0
  970. chia/wallet/vc_wallet/__init__.py +0 -0
  971. chia/wallet/vc_wallet/cr_cat_drivers.py +663 -0
  972. chia/wallet/vc_wallet/cr_cat_wallet.py +875 -0
  973. chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
  974. chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
  975. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
  976. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
  977. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
  978. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
  979. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
  980. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
  981. chia/wallet/vc_wallet/vc_drivers.py +838 -0
  982. chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
  983. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
  984. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
  985. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
  986. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
  987. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
  988. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
  989. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
  990. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
  991. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
  992. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
  993. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
  994. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
  995. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
  996. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
  997. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
  998. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
  999. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
  1000. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
  1001. chia/wallet/vc_wallet/vc_store.py +263 -0
  1002. chia/wallet/vc_wallet/vc_wallet.py +638 -0
  1003. chia/wallet/wallet.py +698 -0
  1004. chia/wallet/wallet_action_scope.py +95 -0
  1005. chia/wallet/wallet_blockchain.py +244 -0
  1006. chia/wallet/wallet_coin_record.py +72 -0
  1007. chia/wallet/wallet_coin_store.py +351 -0
  1008. chia/wallet/wallet_info.py +36 -0
  1009. chia/wallet/wallet_interested_store.py +188 -0
  1010. chia/wallet/wallet_nft_store.py +279 -0
  1011. chia/wallet/wallet_node.py +1769 -0
  1012. chia/wallet/wallet_node_api.py +201 -0
  1013. chia/wallet/wallet_pool_store.py +120 -0
  1014. chia/wallet/wallet_protocol.py +90 -0
  1015. chia/wallet/wallet_puzzle_store.py +365 -0
  1016. chia/wallet/wallet_retry_store.py +70 -0
  1017. chia/wallet/wallet_singleton_store.py +258 -0
  1018. chia/wallet/wallet_spend_bundle.py +41 -0
  1019. chia/wallet/wallet_state_manager.py +2820 -0
  1020. chia/wallet/wallet_transaction_store.py +470 -0
  1021. chia/wallet/wallet_user_store.py +110 -0
  1022. chia/wallet/wallet_weight_proof_handler.py +126 -0
  1023. chia_blockchain-2.4.4.dist-info/LICENSE +201 -0
  1024. chia_blockchain-2.4.4.dist-info/METADATA +161 -0
  1025. chia_blockchain-2.4.4.dist-info/RECORD +1028 -0
  1026. chia_blockchain-2.4.4.dist-info/WHEEL +4 -0
  1027. chia_blockchain-2.4.4.dist-info/entry_points.txt +17 -0
  1028. mozilla-ca/cacert.pem +3666 -0
@@ -0,0 +1,802 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import itertools
5
+ import time
6
+ from typing import Any, Collection, Dict, List, Optional, Set, Tuple, Union
7
+
8
+ import anyio
9
+
10
+ from chia.consensus.block_record import BlockRecord
11
+ from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
12
+ from chia.consensus.blockchain import BlockchainMutexPriority
13
+ from chia.consensus.multiprocess_validation import PreValidationResult, pre_validate_blocks_multiprocessing
14
+ from chia.full_node.full_node import FullNode
15
+ from chia.full_node.full_node_api import FullNodeAPI
16
+ from chia.rpc.rpc_server import default_get_connections
17
+ from chia.server.outbound_message import NodeType
18
+ from chia.simulator.block_tools import BlockTools
19
+ from chia.simulator.simulator_protocol import FarmNewBlockProtocol, GetAllCoinsProtocol, ReorgProtocol
20
+ from chia.types.blockchain_format.coin import Coin
21
+ from chia.types.blockchain_format.sized_bytes import bytes32
22
+ from chia.types.coin_record import CoinRecord
23
+ from chia.types.full_block import FullBlock
24
+ from chia.types.spend_bundle import SpendBundle
25
+ from chia.util.config import lock_and_load_config, save_config
26
+ from chia.util.ints import uint8, uint32, uint64, uint128
27
+ from chia.util.timing import adjusted_timeout, backoff_times
28
+ from chia.wallet.payment import Payment
29
+ from chia.wallet.transaction_record import TransactionRecord
30
+ from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
31
+ from chia.wallet.wallet import Wallet
32
+ from chia.wallet.wallet_node import WalletNode
33
+ from chia.wallet.wallet_state_manager import WalletStateManager
34
+
35
+
36
+ class _Default:
37
+ pass
38
+
39
+
40
+ default = _Default()
41
+
42
+ timeout_per_block = 5
43
+
44
+
45
+ async def wait_for_coins_in_wallet(coins: Set[Coin], wallet: Wallet, timeout: Optional[float] = 5):
46
+ """Wait until all of the specified coins are simultaneously reported as spendable
47
+ by the wallet.
48
+
49
+ Arguments:
50
+ coins: The coins expected to be received.
51
+ wallet: The wallet expected to receive the coins.
52
+ """
53
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
54
+ for backoff in backoff_times():
55
+ spendable_wallet_coin_records = await wallet.wallet_state_manager.get_spendable_coins_for_wallet(
56
+ wallet_id=wallet.id()
57
+ )
58
+ spendable_wallet_coins = {record.coin for record in spendable_wallet_coin_records}
59
+
60
+ if coins.issubset(spendable_wallet_coins):
61
+ return
62
+
63
+ await asyncio.sleep(backoff)
64
+
65
+
66
+ class FullNodeSimulator(FullNodeAPI):
67
+ def __init__(self, full_node: FullNode, block_tools: BlockTools, config: Dict) -> None:
68
+ super().__init__(full_node)
69
+ self.bt = block_tools
70
+ self.full_node = full_node
71
+ self.config = config
72
+ self.time_per_block: Optional[float] = None
73
+ self.full_node.simulator_transaction_callback = self.autofarm_transaction
74
+ self.use_current_time: bool = self.config.get("simulator", {}).get("use_current_time", False)
75
+ self.auto_farm: bool = self.config.get("simulator", {}).get("auto_farm", False)
76
+
77
+ def get_connections(self, request_node_type: Optional[NodeType]) -> List[Dict[str, Any]]:
78
+ return default_get_connections(server=self.server, request_node_type=request_node_type)
79
+
80
+ async def get_all_full_blocks(self) -> List[FullBlock]:
81
+ peak: Optional[BlockRecord] = self.full_node.blockchain.get_peak()
82
+ if peak is None:
83
+ return []
84
+ blocks = []
85
+ peak_block = await self.full_node.blockchain.get_full_block(peak.header_hash)
86
+ if peak_block is None:
87
+ return []
88
+ blocks.append(peak_block)
89
+ current = peak_block
90
+ while True:
91
+ prev = await self.full_node.blockchain.get_full_block(current.prev_header_hash)
92
+ if prev is not None:
93
+ current = prev
94
+ blocks.append(prev)
95
+ else:
96
+ break
97
+
98
+ blocks.reverse()
99
+ return blocks
100
+
101
+ async def autofarm_transaction(self, spend_name: bytes32) -> None:
102
+ if self.auto_farm:
103
+ self.log.info(f"Autofarm triggered by tx-id: {spend_name.hex()}")
104
+ new_block = FarmNewBlockProtocol(self.bt.farmer_ph)
105
+ await self.farm_new_transaction_block(new_block, force_wait_for_timestamp=True)
106
+
107
+ async def update_autofarm_config(self, enable_autofarm: bool) -> bool:
108
+ if enable_autofarm == self.auto_farm:
109
+ return self.auto_farm
110
+ else:
111
+ self.auto_farm = enable_autofarm
112
+ with lock_and_load_config(self.bt.root_path, "config.yaml") as config:
113
+ if "simulator" in config:
114
+ config["simulator"]["auto_farm"] = self.auto_farm
115
+ save_config(self.bt.root_path, "config.yaml", config)
116
+ self.config = config
117
+ if self.auto_farm is True and self.full_node.mempool_manager.mempool.total_mempool_cost() > 0:
118
+ # if mempool is not empty and auto farm was just enabled, farm a block
119
+ await self.farm_new_transaction_block(FarmNewBlockProtocol(self.bt.farmer_ph))
120
+ return self.auto_farm
121
+
122
+ async def get_all_coins(self, request: GetAllCoinsProtocol) -> List[CoinRecord]:
123
+ return await self.full_node.coin_store.get_all_coins(request.include_spent_coins)
124
+
125
+ async def revert_block_height(self, new_height: uint32) -> None:
126
+ """
127
+ This completely deletes blocks from the blockchain.
128
+ While reorgs are preferred, this is also an option
129
+ Note: This does not broadcast the changes, and all wallets will need to be wiped.
130
+ """
131
+ async with self.full_node.blockchain.priority_mutex.acquire(priority=BlockchainMutexPriority.high):
132
+ peak_height: Optional[uint32] = self.full_node.blockchain.get_peak_height()
133
+ if peak_height is None:
134
+ raise ValueError("We can't revert without any blocks.")
135
+ elif peak_height - 1 < new_height:
136
+ raise ValueError("Cannot revert to a height greater than the current peak height.")
137
+ elif new_height < 1:
138
+ raise ValueError("Cannot revert to a height less than 1.")
139
+ block_record: BlockRecord = self.full_node.blockchain.height_to_block_record(new_height)
140
+ # remove enough data to allow a bunch of blocks to be wiped.
141
+ async with self.full_node.block_store.db_wrapper.writer():
142
+ # set coinstore
143
+ await self.full_node.coin_store.rollback_to_block(new_height)
144
+ # set blockstore to new height
145
+ await self.full_node.block_store.rollback(new_height)
146
+ await self.full_node.block_store.set_peak(block_record.header_hash)
147
+ self.full_node.blockchain._peak_height = new_height
148
+ # reload mempool
149
+ await self.full_node.mempool_manager.new_peak(block_record, None)
150
+
151
+ async def get_all_puzzle_hashes(self) -> Dict[bytes32, Tuple[uint128, int]]:
152
+ # puzzle_hash, (total_amount, num_transactions)
153
+ ph_total_amount: Dict[bytes32, Tuple[uint128, int]] = {}
154
+ all_non_spent_coins: List[CoinRecord] = await self.get_all_coins(GetAllCoinsProtocol(False))
155
+ for cr in all_non_spent_coins:
156
+ if cr.coin.puzzle_hash not in ph_total_amount:
157
+ ph_total_amount[cr.coin.puzzle_hash] = (uint128(cr.coin.amount), 1)
158
+ else:
159
+ dict_value: Tuple[uint128, int] = ph_total_amount[cr.coin.puzzle_hash]
160
+ ph_total_amount[cr.coin.puzzle_hash] = (uint128(cr.coin.amount + dict_value[0]), dict_value[1] + 1)
161
+ return ph_total_amount
162
+
163
+ async def farm_new_transaction_block(
164
+ self, request: FarmNewBlockProtocol, force_wait_for_timestamp: bool = False
165
+ ) -> FullBlock:
166
+ ssi = self.full_node.constants.SUB_SLOT_ITERS_STARTING
167
+ diff = self.full_node.constants.DIFFICULTY_STARTING
168
+ async with self.full_node.blockchain.priority_mutex.acquire(priority=BlockchainMutexPriority.high):
169
+ self.log.info("Farming new block!")
170
+ current_blocks = await self.get_all_full_blocks()
171
+ if len(current_blocks) == 0:
172
+ genesis = self.bt.get_consecutive_blocks(uint8(1))[0]
173
+ pre_validation_results: List[PreValidationResult] = await pre_validate_blocks_multiprocessing(
174
+ self.full_node.blockchain.constants,
175
+ self.full_node.blockchain,
176
+ [genesis],
177
+ self.full_node.blockchain.pool,
178
+ {},
179
+ sub_slot_iters=ssi,
180
+ difficulty=diff,
181
+ prev_ses_block=None,
182
+ validate_signatures=True,
183
+ )
184
+ assert pre_validation_results is not None
185
+ await self.full_node.blockchain.add_block(
186
+ genesis,
187
+ pre_validation_results[0],
188
+ self.full_node._bls_cache,
189
+ self.full_node.constants.SUB_SLOT_ITERS_STARTING,
190
+ )
191
+
192
+ peak = self.full_node.blockchain.get_peak()
193
+ assert peak is not None
194
+ curr: BlockRecord = peak
195
+ while not curr.is_transaction_block:
196
+ curr = self.full_node.blockchain.block_record(curr.prev_hash)
197
+ current_time = self.use_current_time
198
+ time_per_block = self.time_per_block
199
+ assert curr.timestamp is not None
200
+ if int(time.time()) <= int(curr.timestamp):
201
+ if force_wait_for_timestamp:
202
+ await asyncio.sleep(1)
203
+ else:
204
+ current_time = False
205
+ mempool_bundle = await self.full_node.mempool_manager.create_bundle_from_mempool(
206
+ curr.header_hash, self.full_node.coin_store.get_unspent_lineage_info_for_puzzle_hash
207
+ )
208
+ if mempool_bundle is None:
209
+ spend_bundle = None
210
+ else:
211
+ spend_bundle = mempool_bundle[0]
212
+
213
+ current_blocks = await self.get_all_full_blocks()
214
+ target = request.puzzle_hash
215
+ more = self.bt.get_consecutive_blocks(
216
+ 1,
217
+ time_per_block=time_per_block,
218
+ transaction_data=spend_bundle,
219
+ farmer_reward_puzzle_hash=target,
220
+ pool_reward_puzzle_hash=target,
221
+ block_list_input=current_blocks,
222
+ guarantee_transaction_block=True,
223
+ current_time=current_time,
224
+ )
225
+ await self.full_node.add_block(more[-1])
226
+ return more[-1]
227
+
228
+ async def farm_new_block(self, request: FarmNewBlockProtocol, force_wait_for_timestamp: bool = False):
229
+ ssi = self.full_node.constants.SUB_SLOT_ITERS_STARTING
230
+ diffculty = self.full_node.constants.DIFFICULTY_STARTING
231
+ async with self.full_node.blockchain.priority_mutex.acquire(priority=BlockchainMutexPriority.high):
232
+ self.log.info("Farming new block!")
233
+ current_blocks = await self.get_all_full_blocks()
234
+ if len(current_blocks) == 0:
235
+ genesis = self.bt.get_consecutive_blocks(uint8(1))[0]
236
+ pre_validation_results: List[PreValidationResult] = await pre_validate_blocks_multiprocessing(
237
+ self.full_node.blockchain.constants,
238
+ self.full_node.blockchain,
239
+ [genesis],
240
+ self.full_node.blockchain.pool,
241
+ {},
242
+ sub_slot_iters=ssi,
243
+ difficulty=diffculty,
244
+ prev_ses_block=None,
245
+ validate_signatures=True,
246
+ )
247
+ assert pre_validation_results is not None
248
+ await self.full_node.blockchain.add_block(
249
+ genesis,
250
+ pre_validation_results[0],
251
+ self.full_node._bls_cache,
252
+ ssi,
253
+ )
254
+ peak = self.full_node.blockchain.get_peak()
255
+ assert peak is not None
256
+ curr: BlockRecord = peak
257
+ while not curr.is_transaction_block:
258
+ curr = self.full_node.blockchain.block_record(curr.prev_hash)
259
+ current_time = self.use_current_time
260
+ time_per_block = self.time_per_block
261
+ assert curr.timestamp is not None
262
+ if int(time.time()) <= int(curr.timestamp):
263
+ if force_wait_for_timestamp:
264
+ await asyncio.sleep(1)
265
+ else:
266
+ current_time = False
267
+ mempool_bundle = await self.full_node.mempool_manager.create_bundle_from_mempool(
268
+ curr.header_hash, self.full_node.coin_store.get_unspent_lineage_info_for_puzzle_hash
269
+ )
270
+ if mempool_bundle is None:
271
+ spend_bundle = None
272
+ else:
273
+ spend_bundle = mempool_bundle[0]
274
+ current_blocks = await self.get_all_full_blocks()
275
+ target = request.puzzle_hash
276
+ more = self.bt.get_consecutive_blocks(
277
+ 1,
278
+ transaction_data=spend_bundle,
279
+ farmer_reward_puzzle_hash=target,
280
+ pool_reward_puzzle_hash=target,
281
+ block_list_input=current_blocks,
282
+ current_time=current_time,
283
+ time_per_block=time_per_block,
284
+ )
285
+ await self.full_node.add_block(more[-1])
286
+
287
+ async def reorg_from_index_to_new_index(self, request: ReorgProtocol):
288
+ new_index = request.new_index
289
+ old_index = request.old_index
290
+ coinbase_ph = request.puzzle_hash
291
+ seed = request.seed
292
+ if seed is None:
293
+ seed = bytes32(32 * b"1")
294
+
295
+ current_blocks = await self.get_all_full_blocks()
296
+ block_count = new_index - old_index
297
+
298
+ more_blocks = self.bt.get_consecutive_blocks(
299
+ block_count,
300
+ farmer_reward_puzzle_hash=coinbase_ph,
301
+ pool_reward_puzzle_hash=coinbase_ph,
302
+ block_list_input=current_blocks[: old_index + 1],
303
+ force_overflow=True,
304
+ guarantee_transaction_block=True,
305
+ seed=seed,
306
+ )
307
+
308
+ for block in more_blocks:
309
+ await self.full_node.add_block(block)
310
+
311
+ async def farm_blocks_to_puzzlehash(
312
+ self,
313
+ count: int,
314
+ farm_to: bytes32 = bytes32([0] * 32),
315
+ guarantee_transaction_blocks: bool = False,
316
+ timeout: Union[None, _Default, float] = default,
317
+ _wait_for_synced: bool = True,
318
+ ) -> int:
319
+ """Process the requested number of blocks including farming to the passed puzzle
320
+ hash. Note that the rewards for the last block will not have been processed.
321
+ Consider `.farm_blocks_to_wallet()` or `.farm_rewards_to_wallet()` if the goal
322
+ is to receive XCH at an address.
323
+
324
+ Arguments:
325
+ count: The number of blocks to process.
326
+ farm_to: The puzzle hash to farm the block rewards to.
327
+
328
+ Returns:
329
+ The total number of reward mojos for the processed blocks.
330
+ """
331
+ if isinstance(timeout, _Default):
332
+ timeout = count * timeout_per_block
333
+ timeout += 1
334
+
335
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
336
+ rewards = 0
337
+
338
+ if count == 0:
339
+ return rewards
340
+
341
+ for _ in range(count):
342
+ if guarantee_transaction_blocks:
343
+ await self.farm_new_transaction_block(FarmNewBlockProtocol(farm_to))
344
+ else:
345
+ await self.farm_new_block(FarmNewBlockProtocol(farm_to))
346
+ height = self.full_node.blockchain.get_peak_height()
347
+ assert height is not None
348
+
349
+ rewards += calculate_pool_reward(height) + calculate_base_farmer_reward(height)
350
+
351
+ if _wait_for_synced:
352
+ await self.wait_for_self_synced(timeout=None)
353
+
354
+ return rewards
355
+
356
+ async def farm_blocks_to_wallet(
357
+ self,
358
+ count: int,
359
+ wallet: Wallet,
360
+ timeout: Union[None, _Default, float] = default,
361
+ _wait_for_synced: bool = True,
362
+ ) -> int:
363
+ """Farm the requested number of blocks to the passed wallet. This will
364
+ process additional blocks as needed to process the reward transactions
365
+ and also wait for the rewards to be present in the wallet.
366
+
367
+ Arguments:
368
+ count: The number of blocks to farm.
369
+ wallet: The wallet to farm the block rewards to.
370
+
371
+ Returns:
372
+ The total number of reward mojos farmed to the requested address.
373
+ """
374
+ if isinstance(timeout, _Default):
375
+ timeout = (count + 1) * timeout_per_block
376
+ timeout += 15
377
+
378
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
379
+ if count == 0:
380
+ return 0
381
+
382
+ target_puzzlehash = await wallet.get_new_puzzlehash()
383
+ rewards = 0
384
+
385
+ block_reward_coins = set()
386
+ expected_reward_coin_count = 2 * count
387
+
388
+ original_peak_height = self.full_node.blockchain.get_peak_height()
389
+ expected_peak_height = 0 if original_peak_height is None else original_peak_height
390
+ extra_blocks = [[False, False]] if original_peak_height is None else [] # Farm genesis block first
391
+
392
+ for to_wallet, tx_block in [*extra_blocks, *([[True, False]] * (count - 1)), [True, True], [False, True]]:
393
+ # This complicated application of the last two blocks being transaction
394
+ # blocks is due to the transaction blocks only including rewards from
395
+ # blocks up until, and including, the previous transaction block.
396
+ if to_wallet:
397
+ rewards += await self.farm_blocks_to_puzzlehash(
398
+ count=1,
399
+ farm_to=target_puzzlehash,
400
+ guarantee_transaction_blocks=tx_block,
401
+ timeout=None,
402
+ _wait_for_synced=False,
403
+ )
404
+ else:
405
+ await self.farm_blocks_to_puzzlehash(
406
+ count=1, guarantee_transaction_blocks=tx_block, timeout=None, _wait_for_synced=False
407
+ )
408
+
409
+ expected_peak_height += 1
410
+ peak_height = self.full_node.blockchain.get_peak_height()
411
+ assert peak_height == expected_peak_height
412
+
413
+ coin_records = await self.full_node.coin_store.get_coins_added_at_height(height=peak_height)
414
+ for record in coin_records:
415
+ if record.coin.puzzle_hash == target_puzzlehash and record.coinbase:
416
+ block_reward_coins.add(record.coin)
417
+
418
+ if len(block_reward_coins) != expected_reward_coin_count:
419
+ raise RuntimeError(
420
+ f"Expected {expected_reward_coin_count} reward coins, got: {len(block_reward_coins)}"
421
+ )
422
+
423
+ await wait_for_coins_in_wallet(coins=block_reward_coins, wallet=wallet, timeout=None)
424
+ if _wait_for_synced:
425
+ await self.wait_for_wallet_synced(wallet.wallet_state_manager.wallet_node, timeout=None)
426
+ return rewards
427
+
428
+ async def farm_rewards_to_wallet(
429
+ self,
430
+ amount: int,
431
+ wallet: Wallet,
432
+ timeout: Union[None, _Default, float] = default,
433
+ ) -> int:
434
+ """Farm at least the requested amount of mojos to the passed wallet. Extra
435
+ mojos will be received based on the block rewards at the present block height.
436
+ The rewards will be present in the wall before returning.
437
+
438
+ Arguments:
439
+ amount: The minimum number of mojos to farm.
440
+ wallet: The wallet to farm the block rewards to.
441
+
442
+ Returns:
443
+ The total number of reward mojos farmed to the requested wallet.
444
+ """
445
+ rewards = 0
446
+
447
+ if amount == 0:
448
+ return rewards
449
+
450
+ height_before: Optional[uint32] = self.full_node.blockchain.get_peak_height()
451
+ if height_before is None:
452
+ height_before = uint32(0)
453
+
454
+ for count in itertools.count(1):
455
+ height = uint32(height_before + count)
456
+ rewards += calculate_pool_reward(height) + calculate_base_farmer_reward(height)
457
+
458
+ if rewards >= amount:
459
+ break
460
+ else:
461
+ raise Exception("internal error")
462
+
463
+ if isinstance(timeout, _Default):
464
+ timeout = (count + 1) * timeout_per_block
465
+
466
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
467
+ await self.farm_blocks_to_wallet(count=count, wallet=wallet, timeout=None)
468
+ return rewards
469
+
470
+ async def wait_transaction_records_entered_mempool(
471
+ self,
472
+ records: Collection[TransactionRecord],
473
+ timeout: Union[None, float] = 5,
474
+ ) -> None:
475
+ """Wait until the transaction records have entered the mempool. Transaction
476
+ records with no spend bundle are ignored.
477
+
478
+ Arguments:
479
+ records: The transaction records to wait for.
480
+ """
481
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
482
+ ids_to_check: Set[bytes32] = set()
483
+ for record in records:
484
+ if record.spend_bundle is None:
485
+ continue
486
+
487
+ ids_to_check.add(record.spend_bundle.name())
488
+
489
+ for backoff in backoff_times():
490
+ found = set()
491
+ for spend_bundle_name in ids_to_check:
492
+ tx = self.full_node.mempool_manager.get_spendbundle(spend_bundle_name)
493
+ if tx is not None:
494
+ found.add(spend_bundle_name)
495
+ ids_to_check = ids_to_check.difference(found)
496
+
497
+ if len(ids_to_check) == 0:
498
+ return
499
+
500
+ await asyncio.sleep(backoff)
501
+
502
+ async def wait_bundle_ids_in_mempool(
503
+ self,
504
+ bundle_ids: Collection[bytes32],
505
+ timeout: Union[None, float] = 5,
506
+ ) -> None:
507
+ """Wait until the ids of specific spend bundles have entered the mempool.
508
+
509
+ Arguments:
510
+ records: The bundle ids to wait for.
511
+ """
512
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
513
+ ids_to_check: Set[bytes32] = set(bundle_ids)
514
+
515
+ for backoff in backoff_times():
516
+ found = set()
517
+ for spend_bundle_name in ids_to_check:
518
+ tx = self.full_node.mempool_manager.get_spendbundle(spend_bundle_name)
519
+ if tx is not None:
520
+ found.add(spend_bundle_name)
521
+ ids_to_check = ids_to_check.difference(found)
522
+
523
+ if len(ids_to_check) == 0:
524
+ return
525
+
526
+ await asyncio.sleep(backoff)
527
+
528
+ async def wait_transaction_records_marked_as_in_mempool(
529
+ self,
530
+ record_ids: Collection[bytes32],
531
+ wallet_node: WalletNode,
532
+ timeout: Union[None, float] = 10,
533
+ ) -> None:
534
+ """Wait until the transaction records have been marked that they have made it into the mempool. Transaction
535
+ records with no spend bundle are ignored.
536
+
537
+ Arguments:
538
+ records: The transaction records to wait for.
539
+ """
540
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
541
+ ids_to_check: Set[bytes32] = set(record_ids)
542
+
543
+ for backoff in backoff_times():
544
+ found = set()
545
+ for txid in ids_to_check:
546
+ tx = await wallet_node.wallet_state_manager.tx_store.get_transaction_record(txid)
547
+ if tx is not None and (tx.is_in_mempool() or tx.spend_bundle is None):
548
+ found.add(txid)
549
+ ids_to_check = ids_to_check.difference(found)
550
+
551
+ if len(ids_to_check) == 0:
552
+ return
553
+
554
+ await asyncio.sleep(backoff)
555
+
556
+ async def process_transaction_records(
557
+ self,
558
+ records: Collection[TransactionRecord],
559
+ timeout: Union[None, float] = (2 * timeout_per_block) + 5,
560
+ ) -> None:
561
+ """Process the specified transaction records and wait until they have been
562
+ included in a block.
563
+
564
+ Arguments:
565
+ records: The transaction records to process.
566
+ """
567
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
568
+ await self.wait_for_self_synced(timeout=None)
569
+
570
+ coins_to_wait_for: Set[Coin] = set()
571
+ for record in records:
572
+ if record.spend_bundle is None:
573
+ continue
574
+
575
+ coins_to_wait_for.update(record.spend_bundle.additions())
576
+
577
+ await self.wait_transaction_records_entered_mempool(records=records, timeout=None)
578
+
579
+ return await self.process_coin_spends(coins=coins_to_wait_for, timeout=None)
580
+
581
+ async def process_spend_bundles(
582
+ self,
583
+ bundles: Collection[SpendBundle],
584
+ timeout: Union[None, float] = (2 * timeout_per_block) + 5,
585
+ ) -> None:
586
+ """Process the specified spend bundles and wait until they have been included
587
+ in a block.
588
+
589
+ Arguments:
590
+ bundles: The spend bundles to process.
591
+ """
592
+
593
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
594
+ coins_to_wait_for: Set[Coin] = {addition for bundle in bundles for addition in bundle.additions()}
595
+ return await self.process_coin_spends(coins=coins_to_wait_for, timeout=None)
596
+
597
+ async def process_coin_spends(
598
+ self,
599
+ coins: Collection[Coin],
600
+ timeout: Union[None, float] = (2 * timeout_per_block) + 5,
601
+ ) -> None:
602
+ """Process the specified coin names and wait until they have been created in a
603
+ block.
604
+
605
+ Arguments:
606
+ coin_names: The coin names to process.
607
+ """
608
+
609
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
610
+ coin_set = set(coins)
611
+ coin_store = self.full_node.coin_store
612
+
613
+ while True:
614
+ await self.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True, timeout=None)
615
+
616
+ found: Set[Coin] = set()
617
+ for coin in coin_set:
618
+ # TODO: is this the proper check?
619
+ if await coin_store.get_coin_record(coin.name()) is not None:
620
+ found.add(coin)
621
+
622
+ coin_set = coin_set.difference(found)
623
+
624
+ if len(coin_set) == 0:
625
+ return
626
+
627
+ async def process_all_wallet_transactions(self, wallet: Wallet, timeout: Optional[float] = 5) -> None:
628
+ # TODO: Maybe something could be done around waiting for the tx to enter the
629
+ # mempool. Maybe not, might be too many races or such.
630
+ wallet_state_manager: Optional[WalletStateManager] = wallet.wallet_state_manager
631
+ assert wallet_state_manager is not None
632
+
633
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
634
+ for backoff in backoff_times():
635
+ await self.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True, timeout=None)
636
+
637
+ wallet_ids = wallet_state_manager.wallets.keys()
638
+ for wallet_id in wallet_ids:
639
+ unconfirmed = await wallet_state_manager.tx_store.get_unconfirmed_for_wallet(wallet_id=wallet_id)
640
+ if len(unconfirmed) > 0:
641
+ break
642
+ else:
643
+ # all wallets have zero unconfirmed transactions
644
+ break
645
+
646
+ # at least one wallet has unconfirmed transactions
647
+ await asyncio.sleep(backoff)
648
+
649
+ async def check_transactions_confirmed(
650
+ self,
651
+ wallet_state_manager: WalletStateManager,
652
+ transactions: List[TransactionRecord],
653
+ timeout: Optional[float] = 5,
654
+ ) -> None:
655
+ transactions_left: Set[bytes32] = {tx.name for tx in transactions}
656
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
657
+ for backoff in backoff_times():
658
+ transactions_left = transactions_left & {
659
+ tx.name for tx in await wallet_state_manager.tx_store.get_all_unconfirmed()
660
+ }
661
+ if len(transactions_left) == 0:
662
+ break
663
+
664
+ # at least one wallet has unconfirmed transactions
665
+ await asyncio.sleep(backoff) # pragma: no cover
666
+
667
+ async def create_coins_with_amounts(
668
+ self,
669
+ amounts: List[uint64],
670
+ wallet: Wallet,
671
+ per_transaction_record_group: int = 50,
672
+ timeout: Union[None, float] = 15,
673
+ ) -> Set[Coin]:
674
+ """Create coins with the requested amount. This is useful when you need a
675
+ bunch of coins for a test and don't need to farm that many.
676
+
677
+ Arguments:
678
+ amounts: A list with entries of mojo amounts corresponding to each
679
+ coin to create.
680
+ wallet: The wallet to send the new coins to.
681
+ per_transaction_record_group: The maximum number of coins to create in each
682
+ transaction record.
683
+
684
+ Returns:
685
+ A set of the generated coins. Note that this does not include any change
686
+ coins that were created.
687
+ """
688
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
689
+ invalid_amounts = [amount for amount in amounts if amount <= 0]
690
+ if len(invalid_amounts) > 0:
691
+ invalid_amounts_string = ", ".join(str(amount) for amount in invalid_amounts)
692
+ raise Exception(f"Coins must have a positive value, request included: {invalid_amounts_string}")
693
+
694
+ if len(amounts) == 0:
695
+ return set()
696
+
697
+ outputs: List[Payment] = []
698
+ amounts_seen: Set[uint64] = set()
699
+ for amount in amounts:
700
+ # We need unique puzzle hash amount combos so we'll only generate a new puzzle hash when we've already
701
+ # seen that amount sent to that puzzle hash
702
+ puzzle_hash = await wallet.get_puzzle_hash(new=amount in amounts_seen)
703
+ outputs.append(Payment(puzzle_hash, amount))
704
+ amounts_seen.add(amount)
705
+
706
+ transaction_records: List[TransactionRecord] = []
707
+ outputs_iterator = iter(outputs)
708
+ while True:
709
+ # The outputs iterator must be second in the zip() call otherwise we lose
710
+ # an element when reaching the end of the range object.
711
+ outputs_group = [output for _, output in zip(range(per_transaction_record_group), outputs_iterator)]
712
+
713
+ if len(outputs_group) > 0:
714
+ async with wallet.wallet_state_manager.new_action_scope(
715
+ DEFAULT_TX_CONFIG, push=True
716
+ ) as action_scope:
717
+ await wallet.generate_signed_transaction(
718
+ amount=outputs_group[0].amount,
719
+ puzzle_hash=outputs_group[0].puzzle_hash,
720
+ action_scope=action_scope,
721
+ primaries=outputs_group[1:],
722
+ )
723
+ transaction_records.extend(action_scope.side_effects.transactions)
724
+ else:
725
+ break
726
+
727
+ await self.wait_transaction_records_entered_mempool(transaction_records, timeout=None)
728
+ await self.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
729
+
730
+ output_coins = {coin for transaction_record in transaction_records for coin in transaction_record.additions}
731
+ puzzle_hashes = {output.puzzle_hash for output in outputs}
732
+ change_coins = {coin for coin in output_coins if coin.puzzle_hash not in puzzle_hashes}
733
+ coins_to_receive = output_coins - change_coins
734
+ await wait_for_coins_in_wallet(coins=coins_to_receive, wallet=wallet)
735
+
736
+ return coins_to_receive
737
+
738
+ def tx_id_in_mempool(self, tx_id: bytes32) -> bool:
739
+ spendbundle = self.full_node.mempool_manager.get_spendbundle(bundle_hash=tx_id)
740
+ return spendbundle is not None
741
+
742
+ def txs_in_mempool(self, txs: List[TransactionRecord]) -> bool:
743
+ return all(self.tx_id_in_mempool(tx_id=tx.spend_bundle.name()) for tx in txs if tx.spend_bundle is not None)
744
+
745
+ async def self_is_synced(self) -> bool:
746
+ return await self.full_node.synced()
747
+
748
+ async def wallet_is_synced(self, wallet_node: WalletNode, peak_height: Optional[uint32] = None) -> bool:
749
+ if not self.self_is_synced():
750
+ # Depending on races, may not be covered every time
751
+ return False # pragma: no cover
752
+ if not await wallet_node.wallet_state_manager.synced():
753
+ return False
754
+ all_states_retried = await wallet_node.wallet_state_manager.retry_store.get_all_states_to_retry() == []
755
+ wallet_height = await wallet_node.wallet_state_manager.blockchain.get_finished_sync_up_to()
756
+ if peak_height is not None:
757
+ return wallet_height >= peak_height and all_states_retried
758
+ full_node_height = self.full_node.blockchain.get_peak_height()
759
+ return wallet_height == full_node_height and all_states_retried
760
+
761
+ async def wait_for_wallet_synced(
762
+ self,
763
+ wallet_node: WalletNode,
764
+ timeout: Optional[float] = 5,
765
+ peak_height: Optional[uint32] = None,
766
+ ) -> None:
767
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
768
+ for backoff_time in backoff_times():
769
+ if await self.wallet_is_synced(wallet_node=wallet_node, peak_height=peak_height):
770
+ break
771
+ await asyncio.sleep(backoff_time)
772
+
773
+ async def wallets_are_synced(self, wallet_nodes: List[WalletNode], peak_height: Optional[uint32] = None) -> bool:
774
+ return all(
775
+ [
776
+ await self.wallet_is_synced(wallet_node=wallet_node, peak_height=peak_height)
777
+ for wallet_node in wallet_nodes
778
+ ]
779
+ )
780
+
781
+ async def wait_for_wallets_synced(
782
+ self,
783
+ wallet_nodes: List[WalletNode],
784
+ timeout: Optional[float] = 5,
785
+ peak_height: Optional[uint32] = None,
786
+ ) -> None:
787
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
788
+ for backoff_time in backoff_times():
789
+ if await self.wallets_are_synced(wallet_nodes=wallet_nodes, peak_height=peak_height):
790
+ break
791
+ await asyncio.sleep(backoff_time)
792
+
793
+ async def wait_for_self_synced(
794
+ self,
795
+ timeout: Optional[float] = 5,
796
+ ) -> None:
797
+ with anyio.fail_after(delay=adjusted_timeout(timeout)):
798
+ for backoff_time in backoff_times():
799
+ if await self.self_is_synced():
800
+ break
801
+ # Depending on races, may not be covered every time
802
+ await asyncio.sleep(backoff_time) # pragma: no cover