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,933 @@
1
+ from __future__ import annotations
2
+
3
+ import dataclasses
4
+ import logging
5
+ import time
6
+ from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
7
+
8
+ from chia_rs import G1Element, G2Element, PrivateKey
9
+ from typing_extensions import final
10
+
11
+ from chia.pools.pool_config import PoolWalletConfig, load_pool_config, update_pool_config
12
+ from chia.pools.pool_puzzles import (
13
+ SINGLETON_LAUNCHER,
14
+ create_absorb_spend,
15
+ create_full_puzzle,
16
+ create_pooling_inner_puzzle,
17
+ create_travel_spend,
18
+ create_waiting_room_inner_puzzle,
19
+ get_delayed_puz_info_from_launcher_spend,
20
+ get_most_recent_singleton_coin_from_coin_spend,
21
+ is_pool_member_inner_puzzle,
22
+ is_pool_waitingroom_inner_puzzle,
23
+ launcher_id_to_p2_puzzle_hash,
24
+ pool_state_to_inner_puzzle,
25
+ solution_to_pool_state,
26
+ uncurry_pool_member_inner_puzzle,
27
+ uncurry_pool_waitingroom_inner_puzzle,
28
+ )
29
+ from chia.pools.pool_wallet_info import (
30
+ FARMING_TO_POOL,
31
+ LEAVING_POOL,
32
+ SELF_POOLING,
33
+ PoolSingletonState,
34
+ PoolState,
35
+ PoolWalletInfo,
36
+ create_pool_state,
37
+ )
38
+ from chia.protocols.pool_protocol import POOL_PROTOCOL_VERSION
39
+ from chia.server.ws_connection import WSChiaConnection
40
+ from chia.types.blockchain_format.coin import Coin
41
+ from chia.types.blockchain_format.program import Program
42
+ from chia.types.blockchain_format.serialized_program import SerializedProgram
43
+ from chia.types.blockchain_format.sized_bytes import bytes32
44
+ from chia.types.coin_spend import CoinSpend, compute_additions
45
+ from chia.util.ints import uint32, uint64, uint128
46
+ from chia.wallet.conditions import AssertCoinAnnouncement, Condition, ConditionValidTimes
47
+ from chia.wallet.derive_keys import find_owner_sk
48
+ from chia.wallet.transaction_record import TransactionRecord
49
+ from chia.wallet.util.transaction_type import TransactionType
50
+ from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG, TXConfig
51
+ from chia.wallet.util.wallet_types import WalletType
52
+ from chia.wallet.wallet import Wallet
53
+ from chia.wallet.wallet_action_scope import WalletActionScope
54
+ from chia.wallet.wallet_coin_record import WalletCoinRecord
55
+ from chia.wallet.wallet_info import WalletInfo
56
+ from chia.wallet.wallet_spend_bundle import WalletSpendBundle
57
+
58
+ if TYPE_CHECKING:
59
+ from chia.wallet.wallet_state_manager import WalletStateManager
60
+
61
+
62
+ @final
63
+ @dataclasses.dataclass
64
+ class PoolWallet:
65
+ if TYPE_CHECKING:
66
+ from chia.wallet.wallet_protocol import WalletProtocol
67
+
68
+ _protocol_check: ClassVar[WalletProtocol[object]] = cast("PoolWallet", None)
69
+
70
+ MINIMUM_INITIAL_BALANCE = 1
71
+ MINIMUM_RELATIVE_LOCK_HEIGHT = 5
72
+ MAXIMUM_RELATIVE_LOCK_HEIGHT = 1000
73
+ DEFAULT_MAX_CLAIM_SPENDS = 100
74
+
75
+ wallet_state_manager: WalletStateManager
76
+ log: logging.Logger
77
+ wallet_info: WalletInfo
78
+ standard_wallet: Wallet
79
+ wallet_id: int
80
+ next_transaction_fee: uint64 = uint64(0)
81
+ next_tx_config: TXConfig = DEFAULT_TX_CONFIG
82
+ target_state: Optional[PoolState] = None
83
+ _owner_sk_and_index: Optional[tuple[PrivateKey, uint32]] = None
84
+
85
+ """
86
+ From the user's perspective, this is not a wallet at all, but a way to control
87
+ whether their pooling-enabled plots are being self-farmed, or farmed by a pool,
88
+ and by which pool. Self-pooling and joint pooling rewards are swept into the
89
+ users' regular wallet.
90
+
91
+ If this wallet is in SELF_POOLING state, the coin ID associated with the current
92
+ pool wallet contains the rewards gained while self-farming, so care must be taken
93
+ to disallow joining a new pool while we still have money on the pooling singleton UTXO.
94
+
95
+ Pools can be joined anonymously, without an account or prior signup.
96
+
97
+ The ability to change the farm-to target prevents abuse from pools
98
+ by giving the user the ability to quickly change pools, or self-farm.
99
+
100
+ The pool is also protected, by not allowing members to cheat by quickly leaving a pool,
101
+ and claiming a block that was pledged to the pool.
102
+
103
+ The pooling protocol and smart coin prevents a user from quickly leaving a pool
104
+ by enforcing a wait time when leaving the pool. A minimum number of blocks must pass
105
+ after the user declares that they are leaving the pool, and before they can start to
106
+ self-claim rewards again.
107
+
108
+ Control of switching states is granted to the owner public key.
109
+
110
+ We reveal the inner_puzzle to the pool during setup of the pooling protocol.
111
+ The pool can prove to itself that the inner puzzle pays to the pooling address,
112
+ and it can follow state changes in the pooling puzzle by tracing destruction and
113
+ creation of coins associate with this pooling singleton (the singleton controlling
114
+ this pool group).
115
+
116
+ The user trusts the pool to send mining rewards to the <XXX address XXX>
117
+ TODO: We should mark which address is receiving funds for our current state.
118
+
119
+ If the pool misbehaves, it is the user's responsibility to leave the pool
120
+
121
+ It is the Pool's responsibility to claim the rewards sent to the pool_puzzlehash.
122
+
123
+ The timeout for leaving the pool is expressed in number of blocks from the time
124
+ the user expresses their intent to leave.
125
+
126
+
127
+
128
+ """
129
+
130
+ @classmethod
131
+ def type(cls) -> WalletType:
132
+ return WalletType.POOLING_WALLET
133
+
134
+ def id(self) -> uint32:
135
+ return self.wallet_info.id
136
+
137
+ @classmethod
138
+ def _verify_self_pooled(cls, state: PoolState) -> Optional[str]:
139
+ err = ""
140
+ if state.pool_url not in {None, ""}:
141
+ err += " Unneeded pool_url for self-pooling"
142
+
143
+ if state.relative_lock_height != 0:
144
+ err += " Incorrect relative_lock_height for self-pooling"
145
+
146
+ return None if err == "" else err
147
+
148
+ @classmethod
149
+ def _verify_pooling_state(cls, state: PoolState) -> Optional[str]:
150
+ err = ""
151
+ if state.relative_lock_height < cls.MINIMUM_RELATIVE_LOCK_HEIGHT:
152
+ err += (
153
+ f" Pool relative_lock_height ({state.relative_lock_height})"
154
+ f"is less than recommended minimum ({cls.MINIMUM_RELATIVE_LOCK_HEIGHT})"
155
+ )
156
+ elif state.relative_lock_height > cls.MAXIMUM_RELATIVE_LOCK_HEIGHT:
157
+ err += (
158
+ f" Pool relative_lock_height ({state.relative_lock_height})"
159
+ f"is greater than recommended maximum ({cls.MAXIMUM_RELATIVE_LOCK_HEIGHT})"
160
+ )
161
+
162
+ if state.pool_url in {None, ""}:
163
+ err += " Empty pool url in pooling state"
164
+ return err
165
+
166
+ @classmethod
167
+ def _verify_pool_state(cls, state: PoolState) -> Optional[str]:
168
+ if state.target_puzzle_hash is None:
169
+ return "Invalid puzzle_hash"
170
+
171
+ if state.version > POOL_PROTOCOL_VERSION:
172
+ return (
173
+ f"Detected pool protocol version {state.version}, which is "
174
+ f"newer than this wallet's version ({POOL_PROTOCOL_VERSION}). Please upgrade "
175
+ f"to use this pooling wallet"
176
+ )
177
+
178
+ if state.state == PoolSingletonState.SELF_POOLING.value:
179
+ return cls._verify_self_pooled(state)
180
+ elif state.state in {PoolSingletonState.FARMING_TO_POOL.value, PoolSingletonState.LEAVING_POOL.value}:
181
+ return cls._verify_pooling_state(state)
182
+ else:
183
+ return "Internal Error"
184
+
185
+ @classmethod
186
+ def _verify_initial_target_state(cls, initial_target_state: PoolState) -> None:
187
+ err = cls._verify_pool_state(initial_target_state)
188
+ if err:
189
+ raise ValueError(f"Invalid internal Pool State: {err}: {initial_target_state}")
190
+
191
+ async def get_spend_history(self) -> list[tuple[uint32, CoinSpend]]:
192
+ return await self.wallet_state_manager.pool_store.get_spends_for_wallet(self.wallet_id)
193
+
194
+ async def get_current_state(self) -> PoolWalletInfo:
195
+ history: list[tuple[uint32, CoinSpend]] = await self.get_spend_history()
196
+ all_spends: list[CoinSpend] = [cs for _, cs in history]
197
+
198
+ # We must have at least the launcher spend
199
+ assert len(all_spends) >= 1
200
+
201
+ launcher_coin: Coin = all_spends[0].coin
202
+ delayed_seconds, delayed_puzhash = get_delayed_puz_info_from_launcher_spend(all_spends[0])
203
+ tip_singleton_coin: Optional[Coin] = get_most_recent_singleton_coin_from_coin_spend(all_spends[-1])
204
+ launcher_id: bytes32 = launcher_coin.name()
205
+ p2_singleton_puzzle_hash = launcher_id_to_p2_puzzle_hash(launcher_id, delayed_seconds, delayed_puzhash)
206
+ assert tip_singleton_coin is not None
207
+
208
+ curr_spend_i = len(all_spends) - 1
209
+ pool_state: Optional[PoolState] = None
210
+ last_singleton_spend_height = uint32(0)
211
+ while pool_state is None:
212
+ full_spend: CoinSpend = all_spends[curr_spend_i]
213
+ pool_state = solution_to_pool_state(full_spend)
214
+ last_singleton_spend_height = uint32(history[curr_spend_i][0])
215
+ curr_spend_i -= 1
216
+
217
+ assert pool_state is not None
218
+ return PoolWalletInfo(
219
+ pool_state,
220
+ self.target_state,
221
+ launcher_coin,
222
+ launcher_id,
223
+ p2_singleton_puzzle_hash,
224
+ tip_singleton_coin.name(),
225
+ last_singleton_spend_height,
226
+ )
227
+
228
+ async def get_unconfirmed_transactions(self) -> list[TransactionRecord]:
229
+ return await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(self.wallet_id)
230
+
231
+ async def get_tip(self) -> tuple[uint32, CoinSpend]:
232
+ return (await self.wallet_state_manager.pool_store.get_spends_for_wallet(self.wallet_id))[-1]
233
+
234
+ async def update_pool_config(self) -> None:
235
+ current_state: PoolWalletInfo = await self.get_current_state()
236
+ pool_config_list: list[PoolWalletConfig] = load_pool_config(self.wallet_state_manager.root_path)
237
+ pool_config_dict: dict[bytes32, PoolWalletConfig] = {c.launcher_id: c for c in pool_config_list}
238
+ existing_config: Optional[PoolWalletConfig] = pool_config_dict.get(current_state.launcher_id, None)
239
+ payout_instructions: str = existing_config.payout_instructions if existing_config is not None else ""
240
+
241
+ if len(payout_instructions) == 0:
242
+ reuse_puzhash_config = self.wallet_state_manager.config.get("reuse_public_key_for_change", None)
243
+ if reuse_puzhash_config is None:
244
+ reuse_puzhash = False
245
+ else:
246
+ reuse_puzhash = reuse_puzhash_config.get(
247
+ str(self.wallet_state_manager.root_pubkey.get_fingerprint()), False
248
+ )
249
+
250
+ payout_instructions = (await self.standard_wallet.get_puzzle_hash(new=not reuse_puzhash)).hex()
251
+ self.log.info(f"New config entry. Generated payout_instructions puzzle hash: {payout_instructions}")
252
+
253
+ new_config: PoolWalletConfig = PoolWalletConfig(
254
+ current_state.launcher_id,
255
+ current_state.current.pool_url if current_state.current.pool_url else "",
256
+ payout_instructions,
257
+ current_state.current.target_puzzle_hash,
258
+ current_state.p2_singleton_puzzle_hash,
259
+ current_state.current.owner_pubkey,
260
+ )
261
+ pool_config_dict[new_config.launcher_id] = new_config
262
+ await update_pool_config(self.wallet_state_manager.root_path, list(pool_config_dict.values()))
263
+
264
+ async def apply_state_transition(self, new_state: CoinSpend, block_height: uint32) -> bool:
265
+ """
266
+ Updates the Pool state (including DB) with new singleton spends.
267
+ The DB must be committed after calling this method. All validation should be done here. Returns True iff
268
+ the spend is a valid transition spend for the singleton, False otherwise.
269
+ """
270
+ tip: tuple[uint32, CoinSpend] = await self.get_tip()
271
+ tip_spend = tip[1]
272
+
273
+ tip_coin: Optional[Coin] = get_most_recent_singleton_coin_from_coin_spend(tip_spend)
274
+ assert tip_coin is not None
275
+ spent_coin_name: bytes32 = tip_coin.name()
276
+
277
+ if spent_coin_name != new_state.coin.name():
278
+ history: list[tuple[uint32, CoinSpend]] = await self.get_spend_history()
279
+ if new_state.coin.name() in [sp.coin.name() for _, sp in history]:
280
+ self.log.info(f"Already have state transition: {new_state.coin.name().hex()}")
281
+ else:
282
+ self.log.warning(
283
+ f"Failed to apply state transition. tip: {tip_coin} new_state: {new_state} height {block_height}"
284
+ )
285
+ return False
286
+
287
+ await self.wallet_state_manager.pool_store.add_spend(self.wallet_id, new_state, block_height)
288
+ tip_spend = (await self.get_tip())[1]
289
+ self.log.info(f"New PoolWallet singleton tip_coin: {tip_spend} farmed at height {block_height}")
290
+
291
+ # If we have reached the target state, resets it to None. Loops back to get current state
292
+ for _, added_spend in reversed(
293
+ await self.wallet_state_manager.pool_store.get_spends_for_wallet(self.wallet_id)
294
+ ):
295
+ latest_state: Optional[PoolState] = solution_to_pool_state(added_spend)
296
+ if latest_state is not None:
297
+ if self.target_state == latest_state:
298
+ self.target_state = None
299
+ self.next_transaction_fee = uint64(0)
300
+ self.next_tx_config = DEFAULT_TX_CONFIG
301
+ break
302
+
303
+ await self.update_pool_config()
304
+ return True
305
+
306
+ async def rewind(self, block_height: int) -> bool:
307
+ """
308
+ Rolls back all transactions after block_height, and if creation was after block_height, deletes the wallet.
309
+ Returns True if the wallet should be removed.
310
+ """
311
+ try:
312
+ history: list[tuple[uint32, CoinSpend]] = await self.wallet_state_manager.pool_store.get_spends_for_wallet(
313
+ self.wallet_id
314
+ )
315
+ prev_state: PoolWalletInfo = await self.get_current_state()
316
+ await self.wallet_state_manager.pool_store.rollback(block_height, self.wallet_id)
317
+
318
+ if len(history) > 0 and history[0][0] > block_height:
319
+ return True
320
+ else:
321
+ if await self.get_current_state() != prev_state:
322
+ await self.update_pool_config()
323
+ return False
324
+ except Exception as e:
325
+ self.log.error(f"Exception rewinding: {e}")
326
+ return False
327
+
328
+ @classmethod
329
+ async def create(
330
+ cls,
331
+ wallet_state_manager: Any,
332
+ wallet: Wallet,
333
+ launcher_coin_id: bytes32,
334
+ block_spends: list[CoinSpend],
335
+ block_height: uint32,
336
+ *,
337
+ name: Optional[str] = None,
338
+ ) -> PoolWallet:
339
+ """
340
+ This creates a new PoolWallet with only one spend: the launcher spend. The DB MUST be committed after calling
341
+ this method.
342
+ """
343
+ wallet_info = await wallet_state_manager.user_store.create_wallet(
344
+ "Pool wallet", WalletType.POOLING_WALLET.value, ""
345
+ )
346
+
347
+ pool_wallet = cls(
348
+ wallet_state_manager=wallet_state_manager,
349
+ log=logging.getLogger(name if name else __name__),
350
+ wallet_info=wallet_info,
351
+ wallet_id=wallet_info.id,
352
+ standard_wallet=wallet,
353
+ )
354
+
355
+ launcher_spend: Optional[CoinSpend] = None
356
+ for spend in block_spends:
357
+ if spend.coin.name() == launcher_coin_id:
358
+ launcher_spend = spend
359
+ assert launcher_spend is not None
360
+ await wallet_state_manager.pool_store.add_spend(pool_wallet.wallet_id, launcher_spend, block_height)
361
+ await pool_wallet.update_pool_config()
362
+
363
+ p2_puzzle_hash: bytes32 = (await pool_wallet.get_current_state()).p2_singleton_puzzle_hash
364
+ await wallet_state_manager.add_new_wallet(pool_wallet)
365
+ await wallet_state_manager.add_interested_puzzle_hashes([p2_puzzle_hash], [pool_wallet.wallet_id])
366
+
367
+ return pool_wallet
368
+
369
+ @classmethod
370
+ async def create_from_db(
371
+ cls,
372
+ wallet_state_manager: Any,
373
+ wallet: Wallet,
374
+ wallet_info: WalletInfo,
375
+ name: Optional[str] = None,
376
+ ) -> PoolWallet:
377
+ """
378
+ This creates a PoolWallet from DB. However, all data is already handled by WalletPoolStore, so we don't need
379
+ to do anything here.
380
+ """
381
+ pool_wallet = cls(
382
+ wallet_state_manager=wallet_state_manager,
383
+ log=logging.getLogger(name if name else __name__),
384
+ wallet_info=wallet_info,
385
+ wallet_id=wallet_info.id,
386
+ standard_wallet=wallet,
387
+ )
388
+ return pool_wallet
389
+
390
+ @staticmethod
391
+ async def create_new_pool_wallet_transaction(
392
+ wallet_state_manager: Any,
393
+ main_wallet: Wallet,
394
+ initial_target_state: PoolState,
395
+ action_scope: WalletActionScope,
396
+ fee: uint64 = uint64(0),
397
+ p2_singleton_delay_time: Optional[uint64] = None,
398
+ p2_singleton_delayed_ph: Optional[bytes32] = None,
399
+ extra_conditions: tuple[Condition, ...] = tuple(),
400
+ ) -> tuple[bytes32, bytes32]:
401
+ """
402
+ A "plot NFT", or pool wallet, represents the idea of a set of plots that all pay to
403
+ the same pooling puzzle. This puzzle is a `chia singleton` that is
404
+ parameterized with a public key controlled by the user's wallet
405
+ (a `smart coin`). It contains an inner puzzle that can switch between
406
+ paying block rewards to a pool, or to a user's own wallet.
407
+
408
+ Call under the wallet state manager lock
409
+ """
410
+ standard_wallet = main_wallet
411
+
412
+ if p2_singleton_delayed_ph is None:
413
+ p2_singleton_delayed_ph = await main_wallet.get_puzzle_hash(
414
+ new=not action_scope.config.tx_config.reuse_puzhash
415
+ )
416
+ if p2_singleton_delay_time is None:
417
+ p2_singleton_delay_time = uint64(604800)
418
+
419
+ unspent_records = await wallet_state_manager.coin_store.get_unspent_coins_for_wallet(standard_wallet.wallet_id)
420
+ balance = await standard_wallet.get_confirmed_balance(unspent_records)
421
+ if balance < PoolWallet.MINIMUM_INITIAL_BALANCE:
422
+ raise ValueError("Not enough balance in main wallet to create a managed plotting pool.")
423
+ if balance < PoolWallet.MINIMUM_INITIAL_BALANCE + fee:
424
+ raise ValueError(f"Not enough balance in main wallet to create a managed plotting pool with fee {fee}.")
425
+
426
+ # Verify Parameters - raise if invalid
427
+ PoolWallet._verify_initial_target_state(initial_target_state)
428
+
429
+ _singleton_puzzle_hash, launcher_coin_id = await PoolWallet.generate_launcher_spend(
430
+ standard_wallet,
431
+ uint64(1),
432
+ fee,
433
+ initial_target_state,
434
+ wallet_state_manager.constants.GENESIS_CHALLENGE,
435
+ p2_singleton_delay_time,
436
+ p2_singleton_delayed_ph,
437
+ action_scope,
438
+ extra_conditions=extra_conditions,
439
+ )
440
+
441
+ p2_singleton_puzzle_hash: bytes32 = launcher_id_to_p2_puzzle_hash(
442
+ launcher_coin_id, p2_singleton_delay_time, p2_singleton_delayed_ph
443
+ )
444
+
445
+ return p2_singleton_puzzle_hash, launcher_coin_id
446
+
447
+ async def _get_owner_key_cache(self) -> tuple[PrivateKey, uint32]:
448
+ if self._owner_sk_and_index is None:
449
+ self._owner_sk_and_index = find_owner_sk(
450
+ [self.wallet_state_manager.get_master_private_key()],
451
+ (await self.get_current_state()).current.owner_pubkey,
452
+ )
453
+ assert self._owner_sk_and_index is not None
454
+ return self._owner_sk_and_index
455
+
456
+ async def get_pool_wallet_index(self) -> uint32:
457
+ return (await self._get_owner_key_cache())[1]
458
+
459
+ async def generate_fee_transaction(
460
+ self,
461
+ fee: uint64,
462
+ action_scope: WalletActionScope,
463
+ extra_conditions: tuple[Condition, ...] = tuple(),
464
+ ) -> None:
465
+ await self.standard_wallet.generate_signed_transaction(
466
+ uint64(0),
467
+ (await self.standard_wallet.get_new_puzzlehash()),
468
+ action_scope,
469
+ fee=fee,
470
+ origin_id=None,
471
+ coins=None,
472
+ primaries=None,
473
+ extra_conditions=extra_conditions,
474
+ )
475
+
476
+ async def generate_travel_transactions(self, fee: uint64, action_scope: WalletActionScope) -> None:
477
+ # target_state is contained within pool_wallet_state
478
+ pool_wallet_info: PoolWalletInfo = await self.get_current_state()
479
+
480
+ spend_history = await self.get_spend_history()
481
+ last_coin_spend: CoinSpend = spend_history[-1][1]
482
+ delayed_seconds, delayed_puzhash = get_delayed_puz_info_from_launcher_spend(spend_history[0][1])
483
+ assert pool_wallet_info.target is not None
484
+ next_state = pool_wallet_info.target
485
+ if pool_wallet_info.current.state == FARMING_TO_POOL.value:
486
+ next_state = create_pool_state(
487
+ LEAVING_POOL,
488
+ pool_wallet_info.current.target_puzzle_hash,
489
+ pool_wallet_info.current.owner_pubkey,
490
+ pool_wallet_info.current.pool_url,
491
+ pool_wallet_info.current.relative_lock_height,
492
+ )
493
+
494
+ new_inner_puzzle = pool_state_to_inner_puzzle(
495
+ next_state,
496
+ pool_wallet_info.launcher_coin.name(),
497
+ self.wallet_state_manager.constants.GENESIS_CHALLENGE,
498
+ delayed_seconds,
499
+ delayed_puzhash,
500
+ )
501
+ new_full_puzzle: SerializedProgram = SerializedProgram.from_program(
502
+ create_full_puzzle(new_inner_puzzle, pool_wallet_info.launcher_coin.name())
503
+ )
504
+
505
+ outgoing_coin_spend, inner_puzzle = create_travel_spend(
506
+ last_coin_spend,
507
+ pool_wallet_info.launcher_coin,
508
+ pool_wallet_info.current,
509
+ next_state,
510
+ self.wallet_state_manager.constants.GENESIS_CHALLENGE,
511
+ delayed_seconds,
512
+ delayed_puzhash,
513
+ )
514
+
515
+ tip = (await self.get_tip())[1]
516
+ tip_coin = tip.coin
517
+ singleton = compute_additions(tip)[0]
518
+ singleton_id = singleton.name()
519
+ assert outgoing_coin_spend.coin.parent_coin_info == tip_coin.name()
520
+ assert outgoing_coin_spend.coin.name() == singleton_id
521
+ assert new_inner_puzzle != inner_puzzle
522
+ if is_pool_member_inner_puzzle(inner_puzzle):
523
+ (
524
+ _inner_f,
525
+ _target_puzzle_hash,
526
+ _p2_singleton_hash,
527
+ _pubkey_as_program,
528
+ _pool_reward_prefix,
529
+ _escape_puzzle_hash,
530
+ ) = uncurry_pool_member_inner_puzzle(inner_puzzle)
531
+ elif is_pool_waitingroom_inner_puzzle(inner_puzzle):
532
+ (
533
+ _target_puzzle_hash, # payout_puzzle_hash
534
+ _relative_lock_height,
535
+ _pubkey_as_program,
536
+ _p2_singleton_hash,
537
+ ) = uncurry_pool_waitingroom_inner_puzzle(inner_puzzle)
538
+ else:
539
+ raise RuntimeError("Invalid state")
540
+
541
+ unsigned_spend_bundle = WalletSpendBundle([outgoing_coin_spend], G2Element())
542
+ assert unsigned_spend_bundle.removals()[0].puzzle_hash == singleton.puzzle_hash
543
+ assert unsigned_spend_bundle.removals()[0].name() == singleton.name()
544
+ if fee > 0:
545
+ await self.generate_fee_transaction(fee, action_scope)
546
+
547
+ async with action_scope.use() as interface:
548
+ interface.side_effects.transactions.append(
549
+ TransactionRecord(
550
+ confirmed_at_height=uint32(0),
551
+ created_at_time=uint64(int(time.time())),
552
+ to_puzzle_hash=new_full_puzzle.get_tree_hash(),
553
+ amount=uint64(1),
554
+ fee_amount=fee,
555
+ confirmed=False,
556
+ sent=uint32(0),
557
+ spend_bundle=unsigned_spend_bundle,
558
+ additions=unsigned_spend_bundle.additions(),
559
+ removals=unsigned_spend_bundle.removals(),
560
+ wallet_id=self.id(),
561
+ sent_to=[],
562
+ trade_id=None,
563
+ memos=[],
564
+ type=uint32(TransactionType.OUTGOING_TX.value),
565
+ name=unsigned_spend_bundle.name(),
566
+ valid_times=ConditionValidTimes(),
567
+ )
568
+ )
569
+
570
+ @staticmethod
571
+ async def generate_launcher_spend(
572
+ standard_wallet: Wallet,
573
+ amount: uint64,
574
+ fee: uint64,
575
+ initial_target_state: PoolState,
576
+ genesis_challenge: bytes32,
577
+ delay_time: uint64,
578
+ delay_ph: bytes32,
579
+ action_scope: WalletActionScope,
580
+ extra_conditions: tuple[Condition, ...] = tuple(),
581
+ ) -> tuple[bytes32, bytes32]:
582
+ """
583
+ Creates the initial singleton, which includes spending an origin coin, the launcher, and creating a singleton
584
+ with the "pooling" inner state, which can be either self pooling or using a pool
585
+ """
586
+ coins: set[Coin] = await standard_wallet.select_coins(uint64(amount + fee), action_scope)
587
+ if coins is None:
588
+ raise ValueError("Not enough coins to create pool wallet")
589
+
590
+ launcher_parent: Coin = coins.copy().pop()
591
+ genesis_launcher_puz: Program = SINGLETON_LAUNCHER
592
+ launcher_coin: Coin = Coin(launcher_parent.name(), genesis_launcher_puz.get_tree_hash(), amount)
593
+
594
+ escaping_inner_puzzle: Program = create_waiting_room_inner_puzzle(
595
+ initial_target_state.target_puzzle_hash,
596
+ initial_target_state.relative_lock_height,
597
+ initial_target_state.owner_pubkey,
598
+ launcher_coin.name(),
599
+ genesis_challenge,
600
+ delay_time,
601
+ delay_ph,
602
+ )
603
+ escaping_inner_puzzle_hash = escaping_inner_puzzle.get_tree_hash()
604
+
605
+ self_pooling_inner_puzzle: Program = create_pooling_inner_puzzle(
606
+ initial_target_state.target_puzzle_hash,
607
+ escaping_inner_puzzle_hash,
608
+ initial_target_state.owner_pubkey,
609
+ launcher_coin.name(),
610
+ genesis_challenge,
611
+ delay_time,
612
+ delay_ph,
613
+ )
614
+
615
+ if initial_target_state.state == SELF_POOLING.value:
616
+ puzzle = escaping_inner_puzzle
617
+ elif initial_target_state.state == FARMING_TO_POOL.value:
618
+ puzzle = self_pooling_inner_puzzle
619
+ else:
620
+ raise ValueError("Invalid initial state")
621
+ full_pooling_puzzle: Program = create_full_puzzle(puzzle, launcher_id=launcher_coin.name())
622
+
623
+ puzzle_hash: bytes32 = full_pooling_puzzle.get_tree_hash()
624
+ pool_state_bytes = Program.to([("p", bytes(initial_target_state)), ("t", delay_time), ("h", delay_ph)])
625
+ announcement_message = Program.to([puzzle_hash, amount, pool_state_bytes]).get_tree_hash()
626
+
627
+ genesis_launcher_solution: Program = Program.to([puzzle_hash, amount, pool_state_bytes])
628
+
629
+ launcher_cs: CoinSpend = CoinSpend(
630
+ launcher_coin,
631
+ SerializedProgram.from_program(genesis_launcher_puz),
632
+ SerializedProgram.from_program(genesis_launcher_solution),
633
+ )
634
+ launcher_sb = WalletSpendBundle([launcher_cs], G2Element())
635
+
636
+ await standard_wallet.generate_signed_transaction(
637
+ amount,
638
+ genesis_launcher_puz.get_tree_hash(),
639
+ action_scope,
640
+ fee,
641
+ coins,
642
+ None,
643
+ origin_id=launcher_parent.name(),
644
+ extra_conditions=(
645
+ *extra_conditions,
646
+ AssertCoinAnnouncement(asserted_id=launcher_coin.name(), asserted_msg=announcement_message),
647
+ ),
648
+ )
649
+
650
+ async with action_scope.use() as interface:
651
+ interface.side_effects.extra_spends.append(launcher_sb)
652
+
653
+ return puzzle_hash, launcher_coin.name()
654
+
655
+ async def join_pool(self, target_state: PoolState, fee: uint64, action_scope: WalletActionScope) -> uint64:
656
+ if target_state.state != FARMING_TO_POOL.value:
657
+ raise ValueError(f"join_pool must be called with target_state={FARMING_TO_POOL} (FARMING_TO_POOL)")
658
+ if self.target_state is not None:
659
+ raise ValueError(f"Cannot join a pool while waiting for target state: {self.target_state}")
660
+ if await self.have_unconfirmed_transaction():
661
+ raise ValueError(
662
+ "Cannot join pool due to unconfirmed transaction. If this is stuck, delete the unconfirmed transaction."
663
+ )
664
+
665
+ current_state: PoolWalletInfo = await self.get_current_state()
666
+
667
+ total_fee = fee
668
+ if current_state.current == target_state:
669
+ self.target_state = None
670
+ msg = f"Asked to change to current state. Target = {target_state}"
671
+ self.log.info(msg)
672
+ raise ValueError(msg)
673
+ elif current_state.current.state in {SELF_POOLING.value, LEAVING_POOL.value}:
674
+ total_fee = fee
675
+ elif current_state.current.state == FARMING_TO_POOL.value:
676
+ total_fee = uint64(fee * 2)
677
+
678
+ if self.target_state is not None:
679
+ raise ValueError(
680
+ f"Cannot change to state {target_state} when already having target state: {self.target_state}"
681
+ )
682
+ PoolWallet._verify_initial_target_state(target_state)
683
+ if current_state.current.state == LEAVING_POOL.value:
684
+ history: list[tuple[uint32, CoinSpend]] = await self.get_spend_history()
685
+ last_height: uint32 = history[-1][0]
686
+ if (
687
+ await self.wallet_state_manager.blockchain.get_finished_sync_up_to()
688
+ <= last_height + current_state.current.relative_lock_height
689
+ ):
690
+ raise ValueError(
691
+ f"Cannot join a pool until height {last_height + current_state.current.relative_lock_height}"
692
+ )
693
+
694
+ self.target_state = target_state
695
+ self.next_transaction_fee = fee
696
+ self.next_tx_config = action_scope.config.tx_config
697
+ await self.generate_travel_transactions(fee, action_scope)
698
+ return total_fee
699
+
700
+ async def self_pool(self, fee: uint64, action_scope: WalletActionScope) -> uint64:
701
+ if await self.have_unconfirmed_transaction():
702
+ raise ValueError(
703
+ "Cannot self pool due to unconfirmed transaction. If this is stuck, delete the unconfirmed transaction."
704
+ )
705
+ pool_wallet_info: PoolWalletInfo = await self.get_current_state()
706
+ if pool_wallet_info.current.state == SELF_POOLING.value:
707
+ raise ValueError("Attempted to self pool when already self pooling")
708
+
709
+ if self.target_state is not None:
710
+ raise ValueError(f"Cannot self pool when already having target state: {self.target_state}")
711
+
712
+ # Note the implications of getting owner_puzzlehash from our local wallet right now
713
+ # vs. having pre-arranged the target self-pooling address
714
+ owner_puzzlehash = await self.standard_wallet.get_new_puzzlehash()
715
+ owner_pubkey = pool_wallet_info.current.owner_pubkey
716
+ current_state: PoolWalletInfo = await self.get_current_state()
717
+ total_fee = uint64(fee * 2)
718
+
719
+ if current_state.current.state == LEAVING_POOL.value:
720
+ total_fee = fee
721
+ history: list[tuple[uint32, CoinSpend]] = await self.get_spend_history()
722
+ last_height: uint32 = history[-1][0]
723
+ if (
724
+ await self.wallet_state_manager.blockchain.get_finished_sync_up_to()
725
+ <= last_height + current_state.current.relative_lock_height
726
+ ):
727
+ raise ValueError(
728
+ f"Cannot self pool until height {last_height + current_state.current.relative_lock_height}"
729
+ )
730
+ self.target_state = create_pool_state(
731
+ SELF_POOLING, owner_puzzlehash, owner_pubkey, pool_url=None, relative_lock_height=uint32(0)
732
+ )
733
+ self.next_transaction_fee = fee
734
+ self.next_tx_config = action_scope.config.tx_config
735
+ await self.generate_travel_transactions(fee, action_scope)
736
+ return total_fee
737
+
738
+ async def claim_pool_rewards(
739
+ self, fee: uint64, max_spends_in_tx: Optional[int], action_scope: WalletActionScope
740
+ ) -> None:
741
+ # Search for p2_puzzle_hash coins, and spend them with the singleton
742
+ if await self.have_unconfirmed_transaction():
743
+ raise ValueError(
744
+ "Cannot claim due to unconfirmed transaction. If this is stuck, delete the unconfirmed transaction."
745
+ )
746
+
747
+ if max_spends_in_tx is None:
748
+ max_spends_in_tx = self.DEFAULT_MAX_CLAIM_SPENDS
749
+ elif max_spends_in_tx <= 0:
750
+ self.log.info(f"Bad max_spends_in_tx value of {max_spends_in_tx}. Set to {self.DEFAULT_MAX_CLAIM_SPENDS}.")
751
+ max_spends_in_tx = self.DEFAULT_MAX_CLAIM_SPENDS
752
+
753
+ unspent_coin_records = await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(self.wallet_id)
754
+ if len(unspent_coin_records) == 0:
755
+ raise ValueError("Nothing to claim, no transactions to p2_singleton_puzzle_hash")
756
+ farming_rewards: list[TransactionRecord] = await self.wallet_state_manager.tx_store.get_farming_rewards()
757
+ coin_to_height_farmed: dict[Coin, uint32] = {}
758
+ for tx_record in farming_rewards:
759
+ height_farmed: Optional[uint32] = tx_record.height_farmed(
760
+ self.wallet_state_manager.constants.GENESIS_CHALLENGE
761
+ )
762
+ assert height_farmed is not None
763
+ coin_to_height_farmed[tx_record.additions[0]] = height_farmed
764
+ history: list[tuple[uint32, CoinSpend]] = await self.get_spend_history()
765
+ assert len(history) > 0
766
+ delayed_seconds, delayed_puzhash = get_delayed_puz_info_from_launcher_spend(history[0][1])
767
+ current_state: PoolWalletInfo = await self.get_current_state()
768
+ last_solution: CoinSpend = history[-1][1]
769
+
770
+ all_spends: list[CoinSpend] = []
771
+ total_amount = 0
772
+
773
+ # The coins being claimed are gathered into the `SpendBundle`, :absorb_spend:
774
+ # We use an announcement in the fee spend to ensure that the claim spend is spent in the same block as the fee
775
+ # We only need to do this for one of the coins, because each `SpendBundle` can only be spent as a unit
776
+
777
+ first_coin_record = None
778
+ for coin_record in unspent_coin_records:
779
+ if coin_record.coin not in coin_to_height_farmed:
780
+ continue
781
+ if first_coin_record is None:
782
+ first_coin_record = coin_record
783
+ if len(all_spends) >= max_spends_in_tx:
784
+ # Limit the total number of spends, so the SpendBundle fits into the block
785
+ self.log.info(f"pool wallet truncating absorb to {max_spends_in_tx} spends to fit into block")
786
+ print(f"pool wallet truncating absorb to {max_spends_in_tx} spends to fit into block")
787
+ break
788
+ absorb_spend: list[CoinSpend] = create_absorb_spend(
789
+ last_solution,
790
+ current_state.current,
791
+ current_state.launcher_coin,
792
+ coin_to_height_farmed[coin_record.coin],
793
+ self.wallet_state_manager.constants.GENESIS_CHALLENGE,
794
+ delayed_seconds,
795
+ delayed_puzhash,
796
+ )
797
+ last_solution = absorb_spend[0]
798
+ all_spends += absorb_spend
799
+ total_amount += coin_record.coin.amount
800
+ self.log.info(
801
+ f"Farmer coin: {coin_record.coin} {coin_record.coin.name()} {coin_to_height_farmed[coin_record.coin]}"
802
+ )
803
+ if len(all_spends) == 0 or first_coin_record is None:
804
+ raise ValueError("Nothing to claim, no unspent coinbase rewards")
805
+
806
+ claim_spend = WalletSpendBundle(all_spends, G2Element())
807
+
808
+ # If fee is 0, no signatures are required to absorb
809
+ if fee > 0:
810
+ await self.generate_fee_transaction(
811
+ fee,
812
+ action_scope,
813
+ extra_conditions=(
814
+ AssertCoinAnnouncement(asserted_id=first_coin_record.coin.name(), asserted_msg=b"$"),
815
+ ),
816
+ )
817
+
818
+ current_time = uint64(int(time.time()))
819
+ # The claim spend, minus the fee amount from the main wallet
820
+ async with action_scope.use() as interface:
821
+ interface.side_effects.transactions.append(
822
+ TransactionRecord(
823
+ confirmed_at_height=uint32(0),
824
+ created_at_time=current_time,
825
+ to_puzzle_hash=current_state.current.target_puzzle_hash,
826
+ amount=uint64(total_amount),
827
+ fee_amount=fee, # This will not be double counted in self.standard_wallet
828
+ confirmed=False,
829
+ sent=uint32(0),
830
+ spend_bundle=claim_spend,
831
+ additions=[add for add in claim_spend.additions() if add.amount == last_solution.coin.amount],
832
+ removals=claim_spend.removals(),
833
+ wallet_id=uint32(self.wallet_id),
834
+ sent_to=[],
835
+ memos=[],
836
+ trade_id=None,
837
+ type=uint32(TransactionType.OUTGOING_TX.value),
838
+ name=claim_spend.name(),
839
+ valid_times=ConditionValidTimes(),
840
+ )
841
+ )
842
+
843
+ async def new_peak(self, peak_height: uint32) -> None:
844
+ # This gets called from the WalletStateManager whenever there is a new peak
845
+
846
+ pool_wallet_info: PoolWalletInfo = await self.get_current_state()
847
+ tip_height, tip_spend = await self.get_tip()
848
+
849
+ if self.target_state is None:
850
+ return
851
+ if self.target_state == pool_wallet_info.current:
852
+ self.target_state = None
853
+ raise ValueError(f"Internal error. Pool wallet {self.wallet_id} state: {pool_wallet_info.current}")
854
+
855
+ if (
856
+ self.target_state.state in {FARMING_TO_POOL.value, SELF_POOLING.value}
857
+ and pool_wallet_info.current.state == LEAVING_POOL.value
858
+ ):
859
+ leave_height = tip_height + pool_wallet_info.current.relative_lock_height
860
+
861
+ # Add some buffer (+2) to reduce chances of a reorg
862
+ if peak_height > leave_height + 2:
863
+ unconfirmed: list[
864
+ TransactionRecord
865
+ ] = await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(self.wallet_id)
866
+ next_tip: Optional[Coin] = get_most_recent_singleton_coin_from_coin_spend(tip_spend)
867
+ assert next_tip is not None
868
+
869
+ if any([rem.name() == next_tip.name() for tx_rec in unconfirmed for rem in tx_rec.removals]):
870
+ self.log.info("Already submitted second transaction, will not resubmit.")
871
+ return
872
+
873
+ self.log.info(f"Attempting to leave from\n{pool_wallet_info.current}\nto\n{self.target_state}")
874
+ assert self.target_state.version == POOL_PROTOCOL_VERSION
875
+ assert pool_wallet_info.current.state == LEAVING_POOL.value
876
+ assert self.target_state.target_puzzle_hash is not None
877
+
878
+ if self.target_state.state == SELF_POOLING.value:
879
+ assert self.target_state.relative_lock_height == 0
880
+ assert self.target_state.pool_url is None
881
+ elif self.target_state.state == FARMING_TO_POOL.value:
882
+ assert self.target_state.relative_lock_height >= self.MINIMUM_RELATIVE_LOCK_HEIGHT
883
+ assert self.target_state.pool_url is not None
884
+
885
+ async with self.wallet_state_manager.new_action_scope(self.next_tx_config, push=True) as action_scope:
886
+ await self.generate_travel_transactions(self.next_transaction_fee, action_scope)
887
+
888
+ async def have_unconfirmed_transaction(self) -> bool:
889
+ unconfirmed: list[TransactionRecord] = await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(
890
+ self.wallet_id
891
+ )
892
+ return len(unconfirmed) > 0
893
+
894
+ async def get_confirmed_balance(self, _: Optional[object] = None) -> uint128:
895
+ amount: uint128 = uint128(0)
896
+ if (await self.get_current_state()).current.state == SELF_POOLING.value:
897
+ unspent_coin_records: list[WalletCoinRecord] = list(
898
+ await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(self.wallet_id)
899
+ )
900
+ for record in unspent_coin_records:
901
+ if record.coinbase:
902
+ amount = uint128(amount + record.coin.amount)
903
+ return amount
904
+
905
+ async def get_unconfirmed_balance(self, record_list: Optional[object] = None) -> uint128:
906
+ return await self.get_confirmed_balance(record_list)
907
+
908
+ async def get_spendable_balance(self, record_list: Optional[object] = None) -> uint128:
909
+ return await self.get_confirmed_balance(record_list)
910
+
911
+ async def get_pending_change_balance(self) -> uint64:
912
+ return uint64(0)
913
+
914
+ async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
915
+ return uint128(0)
916
+
917
+ async def coin_added(self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: Optional[object]) -> None:
918
+ pass
919
+
920
+ async def select_coins(self, amount: uint64, action_scope: WalletActionScope) -> set[Coin]:
921
+ raise RuntimeError("PoolWallet does not support select_coins()")
922
+
923
+ def require_derivation_paths(self) -> bool:
924
+ return False
925
+
926
+ def puzzle_hash_for_pk(self, pubkey: G1Element) -> bytes32:
927
+ raise RuntimeError("PoolWallet does not support puzzle_hash_for_pk")
928
+
929
+ def get_name(self) -> str:
930
+ return self.wallet_info.name
931
+
932
+ async def match_hinted_coin(self, coin: Coin, hint: bytes32) -> bool: # pragma: no cover
933
+ return False # PoolWallet pre-dates hints