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,877 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ import time
5
+ import traceback
6
+ from typing import TYPE_CHECKING, Any, Optional
7
+
8
+ from chia_rs import G1Element, G2Element
9
+ from typing_extensions import Unpack
10
+
11
+ from chia.server.ws_connection import WSChiaConnection
12
+ from chia.types.blockchain_format.coin import Coin, coin_as_list
13
+ from chia.types.blockchain_format.program import Program
14
+ from chia.types.blockchain_format.sized_bytes import bytes32
15
+ from chia.types.coin_spend import CoinSpend
16
+ from chia.util.byte_types import hexstr_to_bytes
17
+ from chia.util.hash import std_hash
18
+ from chia.util.ints import uint8, uint32, uint64, uint128
19
+ from chia.util.streamable import VersionedBlob
20
+ from chia.wallet.cat_wallet.cat_info import CATCoinData, CRCATInfo
21
+ from chia.wallet.cat_wallet.cat_utils import CAT_MOD_HASH, CAT_MOD_HASH_HASH, construct_cat_puzzle
22
+ from chia.wallet.cat_wallet.cat_wallet import CATWallet
23
+ from chia.wallet.coin_selection import select_coins
24
+ from chia.wallet.conditions import (
25
+ Condition,
26
+ ConditionValidTimes,
27
+ CreateCoinAnnouncement,
28
+ CreatePuzzleAnnouncement,
29
+ UnknownCondition,
30
+ parse_timelock_info,
31
+ )
32
+ from chia.wallet.lineage_proof import LineageProof
33
+ from chia.wallet.outer_puzzles import AssetType
34
+ from chia.wallet.payment import Payment
35
+ from chia.wallet.puzzle_drivers import PuzzleInfo
36
+ from chia.wallet.trading.offer import Offer
37
+ from chia.wallet.transaction_record import TransactionRecord
38
+ from chia.wallet.uncurried_puzzle import uncurry_puzzle
39
+ from chia.wallet.util.compute_hints import compute_spend_hints_and_additions
40
+ from chia.wallet.util.compute_memos import compute_memos
41
+ from chia.wallet.util.query_filter import HashFilter
42
+ from chia.wallet.util.transaction_type import TransactionType
43
+ from chia.wallet.util.wallet_sync_utils import fetch_coin_spend_for_coin_state
44
+ from chia.wallet.util.wallet_types import CoinType, WalletType
45
+ from chia.wallet.vc_wallet.cr_cat_drivers import (
46
+ CRCAT,
47
+ CRCATMetadata,
48
+ CRCATVersion,
49
+ ProofsChecker,
50
+ construct_cr_layer_hash,
51
+ construct_pending_approval_state,
52
+ )
53
+ from chia.wallet.vc_wallet.vc_drivers import VerifiedCredential
54
+ from chia.wallet.vc_wallet.vc_wallet import VCWallet
55
+ from chia.wallet.wallet import Wallet
56
+ from chia.wallet.wallet_action_scope import WalletActionScope
57
+ from chia.wallet.wallet_coin_record import MetadataTypes, WalletCoinRecord
58
+ from chia.wallet.wallet_info import WalletInfo
59
+ from chia.wallet.wallet_protocol import GSTOptionalArgs, WalletProtocol
60
+ from chia.wallet.wallet_spend_bundle import WalletSpendBundle
61
+
62
+ if TYPE_CHECKING:
63
+ from chia.wallet.wallet_state_manager import WalletStateManager
64
+
65
+
66
+ class CRCATWallet(CATWallet):
67
+ wallet_state_manager: WalletStateManager
68
+ log: logging.Logger
69
+ wallet_info: WalletInfo
70
+ info: CRCATInfo
71
+ standard_wallet: Wallet
72
+
73
+ @staticmethod
74
+ def default_wallet_name_for_unknown_cat(limitations_program_hash_hex: str) -> str:
75
+ return f"CAT {limitations_program_hash_hex[:16]}..."
76
+
77
+ @property
78
+ def cost_of_single_tx(self) -> int:
79
+ return 78000000 # Estimate measured in testing
80
+
81
+ @staticmethod
82
+ async def create_new_cat_wallet(
83
+ wallet_state_manager: WalletStateManager,
84
+ wallet: Wallet,
85
+ cat_tail_info: dict[str, Any],
86
+ amount: uint64,
87
+ action_scope: WalletActionScope,
88
+ fee: uint64 = uint64(0),
89
+ name: Optional[str] = None,
90
+ push: bool = False,
91
+ ) -> CATWallet: # pragma: no cover
92
+ raise NotImplementedError("create_new_cat_wallet is a legacy method and is not available on CR-CAT wallets")
93
+
94
+ @staticmethod
95
+ async def get_or_create_wallet_for_cat(
96
+ wallet_state_manager: WalletStateManager,
97
+ wallet: Wallet,
98
+ limitations_program_hash_hex: str,
99
+ name: Optional[str] = None,
100
+ authorized_providers: Optional[list[bytes32]] = None,
101
+ proofs_checker: Optional[ProofsChecker] = None,
102
+ ) -> CRCATWallet:
103
+ if authorized_providers is None or proofs_checker is None: # pragma: no cover
104
+ raise ValueError("get_or_create_wallet_for_cat was call on CRCATWallet without proper arguments")
105
+ self = CRCATWallet()
106
+ self.standard_wallet = wallet
107
+ if name is None:
108
+ name = self.default_wallet_name_for_unknown_cat(limitations_program_hash_hex)
109
+ self.log = logging.getLogger(name)
110
+
111
+ tail_hash = bytes32.from_hexstr(limitations_program_hash_hex)
112
+
113
+ for id, w in wallet_state_manager.wallets.items():
114
+ if w.type() == CRCATWallet.type():
115
+ assert isinstance(w, CRCATWallet)
116
+ if w.get_asset_id() == limitations_program_hash_hex:
117
+ self.log.warning("Not creating wallet for already existing CR-CAT wallet")
118
+ return w
119
+
120
+ self.wallet_state_manager = wallet_state_manager
121
+
122
+ self.info = CRCATInfo(tail_hash, None, authorized_providers, proofs_checker)
123
+ info_as_string = bytes(self.info).hex()
124
+ self.wallet_info = await wallet_state_manager.user_store.create_wallet(name, WalletType.CRCAT, info_as_string)
125
+
126
+ await self.wallet_state_manager.add_new_wallet(self)
127
+ return self
128
+
129
+ @classmethod
130
+ async def create_from_puzzle_info(
131
+ cls,
132
+ wallet_state_manager: WalletStateManager,
133
+ wallet: Wallet,
134
+ puzzle_driver: PuzzleInfo,
135
+ name: Optional[str] = None,
136
+ # We're hinting this as Any for mypy by should explore adding this to the wallet protocol and hinting properly
137
+ potential_subclasses: dict[AssetType, Any] = {},
138
+ ) -> Any:
139
+ cr_layer: Optional[PuzzleInfo] = puzzle_driver.also()
140
+ if cr_layer is None: # pragma: no cover
141
+ raise ValueError("create_from_puzzle_info called on CRCATWallet with a non CR-CAT puzzle driver")
142
+ return await cls.get_or_create_wallet_for_cat(
143
+ wallet_state_manager,
144
+ wallet,
145
+ puzzle_driver["tail"].hex(),
146
+ name,
147
+ [bytes32(provider) for provider in cr_layer["authorized_providers"]],
148
+ ProofsChecker.from_program(uncurry_puzzle(cr_layer["proofs_checker"])),
149
+ )
150
+
151
+ @staticmethod
152
+ async def create(
153
+ wallet_state_manager: WalletStateManager,
154
+ wallet: Wallet,
155
+ wallet_info: WalletInfo,
156
+ ) -> CRCATWallet:
157
+ self = CRCATWallet()
158
+
159
+ self.log = logging.getLogger(__name__)
160
+ self.wallet_state_manager = wallet_state_manager
161
+ self.wallet_info = wallet_info
162
+ self.standard_wallet = wallet
163
+ self.info = CRCATInfo.from_bytes(hexstr_to_bytes(self.wallet_info.data))
164
+ return self
165
+
166
+ @classmethod
167
+ async def convert_to_cr(
168
+ cls,
169
+ cat_wallet: CATWallet,
170
+ authorized_providers: list[bytes32],
171
+ proofs_checker: ProofsChecker,
172
+ ) -> None:
173
+ replace_self = cls()
174
+ replace_self.standard_wallet = cat_wallet.standard_wallet
175
+ replace_self.log = logging.getLogger(cat_wallet.get_name())
176
+ replace_self.log.info(f"Converting CAT wallet {cat_wallet.id()} to CR-CAT wallet")
177
+ replace_self.wallet_state_manager = cat_wallet.wallet_state_manager
178
+ replace_self.info = CRCATInfo(
179
+ cat_wallet.cat_info.limitations_program_hash, None, authorized_providers, proofs_checker
180
+ )
181
+ await cat_wallet.wallet_state_manager.user_store.update_wallet(
182
+ WalletInfo(
183
+ cat_wallet.id(), cat_wallet.get_name(), uint8(WalletType.CRCAT.value), bytes(replace_self.info).hex()
184
+ )
185
+ )
186
+ updated_wallet_info = await cat_wallet.wallet_state_manager.user_store.get_wallet_by_id(cat_wallet.id())
187
+ assert updated_wallet_info is not None
188
+ replace_self.wallet_info = updated_wallet_info
189
+
190
+ cat_wallet.wallet_state_manager.wallets[cat_wallet.id()] = replace_self
191
+
192
+ @classmethod
193
+ def type(cls) -> WalletType:
194
+ return WalletType.CRCAT
195
+
196
+ def id(self) -> uint32:
197
+ return self.wallet_info.id
198
+
199
+ def get_asset_id(self) -> str:
200
+ return self.info.limitations_program_hash.hex()
201
+
202
+ async def set_tail_program(self, tail_program: str) -> None: # pragma: no cover
203
+ raise NotImplementedError("set_tail_program is a legacy method and is not available on CR-CAT wallets")
204
+
205
+ async def coin_added(
206
+ self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: Optional[CATCoinData]
207
+ ) -> None:
208
+ """Notification from wallet state manager that wallet has been received."""
209
+ self.log.info(f"CR-CAT wallet has been notified that {coin.name().hex()} was added")
210
+ try:
211
+ coin_state = await self.wallet_state_manager.wallet_node.get_coin_state([coin.parent_coin_info], peer=peer)
212
+ coin_spend = await fetch_coin_spend_for_coin_state(coin_state[0], peer)
213
+ await self.add_crcat_coin(coin_spend, coin, height)
214
+ except Exception as e:
215
+ self.log.debug(f"Exception: {e}, traceback: {traceback.format_exc()}")
216
+
217
+ async def add_crcat_coin(self, coin_spend: CoinSpend, coin: Coin, height: uint32) -> None:
218
+ try:
219
+ new_cr_cats: list[CRCAT] = CRCAT.get_next_from_coin_spend(coin_spend)
220
+ hint_dict = {
221
+ id: hc.hint
222
+ for id, hc in compute_spend_hints_and_additions(coin_spend)[0].items()
223
+ if hc.hint is not None
224
+ }
225
+ cr_cat: CRCAT = next(filter(lambda c: c.coin.name() == coin.name(), new_cr_cats))
226
+ if (
227
+ await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(
228
+ cr_cat.inner_puzzle_hash
229
+ )
230
+ is not None
231
+ ):
232
+ self.log.info(f"Found CRCAT coin {coin.name().hex()}")
233
+ is_pending = False
234
+ elif (
235
+ cr_cat.inner_puzzle_hash
236
+ == construct_pending_approval_state(
237
+ hint_dict[coin.name()],
238
+ uint64(coin.amount),
239
+ ).get_tree_hash()
240
+ ):
241
+ self.log.info(f"Found pending approval CRCAT coin {coin.name().hex()}")
242
+ is_pending = True
243
+ created_timestamp = await self.wallet_state_manager.wallet_node.get_timestamp_for_height(uint32(height))
244
+ spend_bundle = WalletSpendBundle([coin_spend], G2Element())
245
+ memos = compute_memos(spend_bundle)
246
+ # This will override the tx created in the wallet state manager
247
+ tx_record = TransactionRecord(
248
+ confirmed_at_height=height,
249
+ created_at_time=uint64(created_timestamp),
250
+ to_puzzle_hash=hint_dict[coin.name()],
251
+ amount=uint64(coin.amount),
252
+ fee_amount=uint64(0),
253
+ confirmed=True,
254
+ sent=uint32(0),
255
+ spend_bundle=None,
256
+ additions=[coin],
257
+ removals=[coin_spend.coin],
258
+ wallet_id=self.id(),
259
+ sent_to=[],
260
+ trade_id=None,
261
+ type=uint32(TransactionType.INCOMING_CRCAT_PENDING),
262
+ name=coin.name(),
263
+ memos=list(memos.items()),
264
+ valid_times=ConditionValidTimes(),
265
+ )
266
+ await self.wallet_state_manager.tx_store.add_transaction_record(tx_record)
267
+ else: # pragma: no cover
268
+ self.log.error(f"Unknown CRCAT inner puzzle, coin ID: {coin.name().hex()}")
269
+ return None
270
+ coin_record = WalletCoinRecord(
271
+ coin,
272
+ uint32(height),
273
+ uint32(0),
274
+ False,
275
+ False,
276
+ WalletType.CRCAT,
277
+ self.id(),
278
+ CoinType.CRCAT_PENDING if is_pending else CoinType.CRCAT,
279
+ VersionedBlob(
280
+ CRCATVersion.V1.value,
281
+ bytes(
282
+ CRCATMetadata(
283
+ cr_cat.lineage_proof, hint_dict[coin.name()] if is_pending else cr_cat.inner_puzzle_hash
284
+ )
285
+ ),
286
+ ),
287
+ )
288
+ await self.wallet_state_manager.coin_store.add_coin_record(coin_record)
289
+ except Exception:
290
+ # The parent is not a CAT which means we need to scrub all of its children from our DB
291
+ self.log.error(f"Cannot add CRCAT coin: {traceback.format_exc()}")
292
+ child_coin_records = await self.wallet_state_manager.coin_store.get_coin_records_by_parent_id(
293
+ coin_spend.coin.name()
294
+ )
295
+ if len(child_coin_records) > 0:
296
+ for record in child_coin_records:
297
+ if record.wallet_id == self.id(): # pragma: no cover
298
+ await self.wallet_state_manager.coin_store.delete_coin_record(record.coin.name())
299
+ # We also need to make sure there's no record of the transaction
300
+ await self.wallet_state_manager.tx_store.delete_transaction_record(record.coin.name())
301
+
302
+ def require_derivation_paths(self) -> bool:
303
+ return False
304
+
305
+ def puzzle_for_pk(self, pubkey: G1Element) -> Program: # pragma: no cover
306
+ raise NotImplementedError("puzzle_for_pk is a legacy method and is not available on CR-CAT wallets")
307
+
308
+ def puzzle_hash_for_pk(self, pubkey: G1Element) -> bytes32: # pragma: no cover
309
+ raise NotImplementedError("puzzle_hash_for_pk is a legacy method and is not available on CR-CAT wallets")
310
+
311
+ async def get_new_cat_puzzle_hash(self) -> bytes32: # pragma: no cover
312
+ raise NotImplementedError("get_new_cat_puzzle_hash is a legacy method and is not available on CR-CAT wallets")
313
+
314
+ async def inner_puzzle_for_cat_puzhash(self, cat_hash: bytes32) -> Program: # pragma: no cover
315
+ raise NotImplementedError(
316
+ "inner_puzzle_for_cat_puzhash is a legacy method and is not available on CR-CAT wallets"
317
+ )
318
+
319
+ async def get_cat_spendable_coins(self, records: Optional[set[WalletCoinRecord]] = None) -> list[WalletCoinRecord]:
320
+ result: list[WalletCoinRecord] = []
321
+
322
+ record_list: set[WalletCoinRecord] = await self.wallet_state_manager.get_spendable_coins_for_wallet(
323
+ self.id(), records
324
+ )
325
+
326
+ for record in record_list:
327
+ crcat: CRCAT = self.coin_record_to_crcat(record)
328
+ if crcat.lineage_proof is not None and not crcat.lineage_proof.is_none():
329
+ result.append(record)
330
+
331
+ return result
332
+
333
+ async def get_confirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
334
+ if record_list is None:
335
+ record_list = await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(
336
+ self.id(), CoinType.CRCAT
337
+ )
338
+ amount: uint128 = uint128(0)
339
+ for record in record_list:
340
+ crcat: CRCAT = self.coin_record_to_crcat(record)
341
+ if crcat.lineage_proof is not None and not crcat.lineage_proof.is_none():
342
+ amount = uint128(amount + record.coin.amount)
343
+
344
+ self.log.info(f"Confirmed balance for cat wallet {self.id()} is {amount}")
345
+ return uint128(amount)
346
+
347
+ async def get_pending_approval_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
348
+ if record_list is None:
349
+ record_list = await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(
350
+ self.id(), CoinType.CRCAT_PENDING
351
+ )
352
+ amount: uint128 = uint128(0)
353
+ for record in record_list:
354
+ crcat: CRCAT = self.coin_record_to_crcat(record)
355
+ if crcat.lineage_proof is not None and not crcat.lineage_proof.is_none():
356
+ amount = uint128(amount + record.coin.amount)
357
+
358
+ self.log.info(f"Pending approval balance for cat wallet {self.id()} is {amount}")
359
+ return uint128(amount)
360
+
361
+ async def convert_puzzle_hash(self, puzzle_hash: bytes32) -> bytes32:
362
+ return puzzle_hash
363
+
364
+ @staticmethod
365
+ def get_metadata_from_record(coin_record: WalletCoinRecord) -> CRCATMetadata:
366
+ metadata: MetadataTypes = coin_record.parsed_metadata()
367
+ assert isinstance(metadata, CRCATMetadata)
368
+ return metadata
369
+
370
+ def coin_record_to_crcat(self, coin_record: WalletCoinRecord) -> CRCAT:
371
+ if coin_record.coin_type not in {CoinType.CRCAT, CoinType.CRCAT_PENDING}: # pragma: no cover
372
+ raise ValueError(f"Attempting to spend a non-CRCAT coin: {coin_record.coin.name().hex()}")
373
+ if coin_record.metadata is None: # pragma: no cover
374
+ raise ValueError(f"Attempting to spend a CRCAT coin without metadata: {coin_record.coin.name().hex()}")
375
+ try:
376
+ metadata: CRCATMetadata = CRCATWallet.get_metadata_from_record(coin_record)
377
+ crcat: CRCAT = CRCAT(
378
+ coin_record.coin,
379
+ self.info.limitations_program_hash,
380
+ metadata.lineage_proof,
381
+ self.info.authorized_providers,
382
+ self.info.proofs_checker.as_program(),
383
+ (
384
+ construct_pending_approval_state(
385
+ metadata.inner_puzzle_hash, uint64(coin_record.coin.amount)
386
+ ).get_tree_hash()
387
+ if coin_record.coin_type == CoinType.CRCAT_PENDING
388
+ else metadata.inner_puzzle_hash
389
+ ),
390
+ )
391
+ return crcat
392
+ except Exception as e: # pragma: no cover
393
+ raise ValueError(f"Error parsing CRCAT metadata: {e}")
394
+
395
+ async def get_lineage_proof_for_coin(self, coin: Coin) -> Optional[LineageProof]: # pragma: no cover
396
+ raise RuntimeError("get_lineage_proof_for_coin is a legacy method and is not available on CR-CAT wallets")
397
+
398
+ async def _generate_unsigned_spendbundle(
399
+ self,
400
+ payments: list[Payment],
401
+ action_scope: WalletActionScope,
402
+ fee: uint64 = uint64(0),
403
+ cat_discrepancy: Optional[tuple[int, Program, Program]] = None, # (extra_delta, tail_reveal, tail_solution)
404
+ coins: Optional[set[Coin]] = None,
405
+ extra_conditions: tuple[Condition, ...] = tuple(),
406
+ add_authorizations_to_cr_cats: bool = True,
407
+ ) -> WalletSpendBundle:
408
+ if cat_discrepancy is not None:
409
+ extra_delta, tail_reveal, tail_solution = cat_discrepancy
410
+ else:
411
+ extra_delta, tail_reveal, tail_solution = 0, Program.to([]), Program.to([])
412
+ payment_amount: int = sum(p.amount for p in payments)
413
+ starting_amount: int = payment_amount - extra_delta
414
+ if coins is None:
415
+ cat_coins = list(
416
+ await self.select_coins(
417
+ uint64(starting_amount),
418
+ action_scope,
419
+ )
420
+ )
421
+ else:
422
+ cat_coins = list(coins)
423
+
424
+ cat_coins = sorted(cat_coins, key=Coin.name) # need determinism because we need definitive origin coin
425
+
426
+ selected_cat_amount = sum(c.amount for c in cat_coins)
427
+ assert selected_cat_amount >= starting_amount
428
+
429
+ # Figure out if we need to absorb/melt some XCH as part of this
430
+ regular_chia_to_claim: int = 0
431
+ if payment_amount > starting_amount:
432
+ # TODO: The no coverage comment is because minting is broken for both this and the standard CAT wallet
433
+ fee = uint64(fee + payment_amount - starting_amount) # pragma: no cover
434
+ elif payment_amount < starting_amount:
435
+ regular_chia_to_claim = payment_amount
436
+
437
+ need_chia_transaction = (fee > 0 or regular_chia_to_claim > 0) and (fee - regular_chia_to_claim != 0)
438
+
439
+ # Calculate standard puzzle solutions
440
+ change = selected_cat_amount - starting_amount
441
+ primaries: list[Payment] = []
442
+ for payment in payments:
443
+ primaries.append(payment)
444
+
445
+ if change > 0:
446
+ origin_crcat_record = await self.wallet_state_manager.coin_store.get_coin_record(
447
+ next(iter(cat_coins)).name()
448
+ )
449
+ if origin_crcat_record is None:
450
+ raise RuntimeError("A CR-CAT coin was selected that we don't have a record for") # pragma: no cover
451
+ origin_crcat = self.coin_record_to_crcat(origin_crcat_record)
452
+ if action_scope.config.tx_config.override(
453
+ reuse_puzhash=(
454
+ True if not add_authorizations_to_cr_cats else action_scope.config.tx_config.reuse_puzhash
455
+ )
456
+ ).reuse_puzhash:
457
+ change_puzhash = origin_crcat.inner_puzzle_hash
458
+ for payment in payments:
459
+ if change_puzhash == payment.puzzle_hash and change == payment.amount:
460
+ # We cannot create two coins has same id, create a new puzhash for the change
461
+ change_puzhash = await self.standard_wallet.get_puzzle_hash(new=True)
462
+ break
463
+ else:
464
+ change_puzhash = await self.standard_wallet.get_puzzle_hash(new=True)
465
+ primaries.append(Payment(change_puzhash, uint64(change), [change_puzhash]))
466
+
467
+ # Find the VC Wallet
468
+ vc_wallet: VCWallet
469
+ for wallet in self.wallet_state_manager.wallets.values():
470
+ if WalletType(wallet.type()) == WalletType.VC:
471
+ assert isinstance(wallet, VCWallet)
472
+ vc_wallet = wallet
473
+ break
474
+ else:
475
+ raise RuntimeError("CR-CATs cannot be spent without an appropriate VC") # pragma: no cover
476
+
477
+ # Loop through the coins we've selected and gather the information we need to spend them
478
+ vc: Optional[VerifiedCredential] = None
479
+ vc_announcements_to_make: list[bytes] = []
480
+ inner_spends: list[tuple[CRCAT, int, Program, Program]] = []
481
+ first = True
482
+ announcement: CreateCoinAnnouncement
483
+ coin_ids: list[bytes32] = [coin.name() for coin in cat_coins]
484
+ coin_records: list[WalletCoinRecord] = (
485
+ await self.wallet_state_manager.coin_store.get_coin_records(coin_id_filter=HashFilter.include(coin_ids))
486
+ ).records
487
+ assert len(coin_records) == len(cat_coins)
488
+ # sort the coin records to ensure they are in the same order as the CAT coins
489
+ coin_records = [rec for rec in sorted(coin_records, key=lambda rec: coin_ids.index(rec.coin.name()))]
490
+ for coin in coin_records:
491
+ if vc is None:
492
+ vc = await vc_wallet.get_vc_with_provider_in_and_proofs(
493
+ self.info.authorized_providers, self.info.proofs_checker.flags
494
+ )
495
+
496
+ if cat_discrepancy is not None:
497
+ cat_condition = UnknownCondition(
498
+ opcode=Program.to(51),
499
+ args=[
500
+ Program.to(None),
501
+ Program.to(-113),
502
+ tail_reveal,
503
+ tail_solution,
504
+ ],
505
+ )
506
+ if first:
507
+ extra_conditions = (*extra_conditions, cat_condition)
508
+
509
+ crcat: CRCAT = self.coin_record_to_crcat(coin)
510
+ vc_announcements_to_make.append(crcat.expected_announcement())
511
+ if first:
512
+ announcement = CreateCoinAnnouncement(std_hash(b"".join([c.name() for c in cat_coins])), coin.name())
513
+ if need_chia_transaction:
514
+ if fee > regular_chia_to_claim:
515
+ await self.create_tandem_xch_tx(
516
+ fee,
517
+ uint64(regular_chia_to_claim),
518
+ action_scope,
519
+ extra_conditions=(announcement.corresponding_assertion(),),
520
+ )
521
+ innersol = self.standard_wallet.make_solution(
522
+ primaries=primaries,
523
+ conditions=(*extra_conditions, announcement),
524
+ )
525
+ elif regular_chia_to_claim > fee:
526
+ xch_announcement = await self.create_tandem_xch_tx(
527
+ fee,
528
+ uint64(regular_chia_to_claim),
529
+ action_scope,
530
+ )
531
+ assert xch_announcement is not None
532
+ innersol = self.standard_wallet.make_solution(
533
+ primaries=primaries,
534
+ conditions=(*extra_conditions, xch_announcement, announcement),
535
+ )
536
+ else:
537
+ # TODO: what about when they are equal?
538
+ raise Exception("Equality not handled")
539
+ else:
540
+ innersol = self.standard_wallet.make_solution(
541
+ primaries=primaries,
542
+ conditions=(*extra_conditions, announcement),
543
+ )
544
+ else:
545
+ innersol = self.standard_wallet.make_solution(
546
+ primaries=[],
547
+ conditions=(announcement.corresponding_assertion(),),
548
+ )
549
+ inner_derivation_record = (
550
+ await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(
551
+ crcat.inner_puzzle_hash
552
+ )
553
+ )
554
+ if inner_derivation_record is None:
555
+ raise RuntimeError( # pragma: no cover
556
+ f"CR-CAT {crcat} has an inner puzzle hash {crcat.inner_puzzle_hash} that we don't have the keys for"
557
+ )
558
+ inner_puzzle: Program = self.standard_wallet.puzzle_for_pk(inner_derivation_record.pubkey)
559
+ inner_spends.append(
560
+ (
561
+ crcat,
562
+ extra_delta if first else 0,
563
+ inner_puzzle,
564
+ innersol,
565
+ )
566
+ )
567
+ first = False
568
+
569
+ if vc is None: # pragma: no cover
570
+ raise RuntimeError("Spending no cat coins is not an appropriate use of _generate_unsigned_spendbundle")
571
+ if vc.proof_hash is None:
572
+ raise RuntimeError("CR-CATs found an appropriate VC but that VC contains no proofs") # pragma: no cover
573
+
574
+ proof_of_inclusions: Program = await vc_wallet.proof_of_inclusions_for_root_and_keys(
575
+ vc.proof_hash, self.info.proofs_checker.flags
576
+ )
577
+
578
+ expected_announcements, coin_spends, _ = CRCAT.spend_many(
579
+ inner_spends,
580
+ proof_of_inclusions,
581
+ Program.to(None), # TODO: With more proofs checkers, this may need to be flexible. For now, it's hardcoded.
582
+ vc.proof_provider,
583
+ vc.launcher_id,
584
+ vc.wrap_inner_with_backdoor().get_tree_hash() if add_authorizations_to_cr_cats else None,
585
+ )
586
+ if add_authorizations_to_cr_cats:
587
+ await vc_wallet.generate_signed_transaction(
588
+ vc.launcher_id,
589
+ action_scope,
590
+ extra_conditions=(
591
+ *expected_announcements,
592
+ announcement,
593
+ *(CreatePuzzleAnnouncement(ann) for ann in vc_announcements_to_make),
594
+ ),
595
+ )
596
+
597
+ return WalletSpendBundle(coin_spends, G2Element())
598
+
599
+ async def generate_signed_transaction(
600
+ self,
601
+ amounts: list[uint64],
602
+ puzzle_hashes: list[bytes32],
603
+ action_scope: WalletActionScope,
604
+ fee: uint64 = uint64(0),
605
+ coins: Optional[set[Coin]] = None,
606
+ memos: Optional[list[list[bytes]]] = None,
607
+ extra_conditions: tuple[Condition, ...] = tuple(),
608
+ **kwargs: Unpack[GSTOptionalArgs],
609
+ ) -> None:
610
+ # (extra_delta, tail_reveal, tail_solution)
611
+ cat_discrepancy: Optional[tuple[int, Program, Program]] = kwargs.get("cat_discrepancy", None)
612
+ add_authorizations_to_cr_cats: bool = kwargs.get("add_authorizations_to_cr_cats", True)
613
+ if memos is None:
614
+ memos = [[] for _ in range(len(puzzle_hashes))]
615
+
616
+ if not (len(memos) == len(puzzle_hashes) == len(amounts)):
617
+ raise ValueError("Memos, puzzle_hashes, and amounts must have the same length") # pragma: no cover
618
+
619
+ payments = []
620
+ for amount, puzhash, memo_list in zip(amounts, puzzle_hashes, memos):
621
+ memos_with_hint: list[bytes] = [puzhash]
622
+ memos_with_hint.extend(memo_list)
623
+ # Force wrap the outgoing coins in the pending state if not going to us
624
+ payments.append(
625
+ Payment(
626
+ (
627
+ construct_pending_approval_state(puzhash, amount).get_tree_hash()
628
+ if puzhash != Offer.ph()
629
+ and not await self.wallet_state_manager.puzzle_store.puzzle_hash_exists(puzhash)
630
+ else puzhash
631
+ ),
632
+ amount,
633
+ memos_with_hint,
634
+ )
635
+ )
636
+
637
+ spend_bundle = await self._generate_unsigned_spendbundle(
638
+ payments,
639
+ action_scope,
640
+ fee,
641
+ cat_discrepancy=cat_discrepancy, # (extra_delta, tail_reveal, tail_solution)
642
+ coins=coins,
643
+ extra_conditions=extra_conditions,
644
+ add_authorizations_to_cr_cats=add_authorizations_to_cr_cats,
645
+ )
646
+
647
+ async with action_scope.use() as interface:
648
+ other_tx_removals: set[Coin] = {
649
+ removal for tx in interface.side_effects.transactions for removal in tx.removals
650
+ }
651
+ other_tx_additions: set[Coin] = {
652
+ addition for tx in interface.side_effects.transactions for addition in tx.additions
653
+ }
654
+ tx_list = [
655
+ TransactionRecord(
656
+ confirmed_at_height=uint32(0),
657
+ created_at_time=uint64(int(time.time())),
658
+ to_puzzle_hash=payment.puzzle_hash,
659
+ amount=payment.amount,
660
+ fee_amount=fee,
661
+ confirmed=False,
662
+ sent=uint32(0),
663
+ spend_bundle=spend_bundle if i == 0 else None,
664
+ additions=list(set(spend_bundle.additions()) - other_tx_additions) if i == 0 else [],
665
+ removals=list(set(spend_bundle.removals()) - other_tx_removals) if i == 0 else [],
666
+ wallet_id=self.id(),
667
+ sent_to=[],
668
+ trade_id=None,
669
+ type=uint32(TransactionType.OUTGOING_TX.value),
670
+ name=spend_bundle.name() if i == 0 else payment.as_condition().get_tree_hash(),
671
+ memos=list(compute_memos(spend_bundle).items()),
672
+ valid_times=parse_timelock_info(extra_conditions),
673
+ )
674
+ for i, payment in enumerate(payments)
675
+ ]
676
+
677
+ interface.side_effects.transactions.extend(tx_list)
678
+
679
+ async def claim_pending_approval_balance(
680
+ self,
681
+ min_amount_to_claim: uint64,
682
+ action_scope: WalletActionScope,
683
+ fee: uint64 = uint64(0),
684
+ coins: Optional[set[Coin]] = None,
685
+ min_coin_amount: Optional[uint64] = None,
686
+ max_coin_amount: Optional[uint64] = None,
687
+ excluded_coin_amounts: Optional[list[uint64]] = None,
688
+ reuse_puzhash: Optional[bool] = None,
689
+ extra_conditions: tuple[Condition, ...] = tuple(),
690
+ ) -> None:
691
+ # Select the relevant CR-CAT coins
692
+ crcat_records: set[WalletCoinRecord] = await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(
693
+ self.id(), CoinType.CRCAT_PENDING
694
+ )
695
+ if coins is None:
696
+ if max_coin_amount is None:
697
+ max_coin_amount = uint64(self.wallet_state_manager.constants.MAX_COIN_AMOUNT)
698
+ coins = await select_coins(
699
+ await self.get_pending_approval_balance(),
700
+ action_scope.config.tx_config.coin_selection_config,
701
+ list(crcat_records),
702
+ {},
703
+ self.log,
704
+ uint128(min_amount_to_claim),
705
+ )
706
+
707
+ # Select the relevant XCH coins
708
+ if fee > 0:
709
+ chia_coins = await self.standard_wallet.select_coins(
710
+ fee,
711
+ action_scope,
712
+ )
713
+ else:
714
+ chia_coins = set()
715
+
716
+ # Select the relevant VC coin
717
+ vc_wallet: VCWallet = await self.wallet_state_manager.get_or_create_vc_wallet()
718
+ vc: Optional[VerifiedCredential] = await vc_wallet.get_vc_with_provider_in_and_proofs(
719
+ self.info.authorized_providers, self.info.proofs_checker.flags
720
+ )
721
+ if vc is None: # pragma: no cover
722
+ raise RuntimeError(f"No VC exists that can approve spends for CR-CAT wallet {self.id()}")
723
+ if vc.proof_hash is None:
724
+ raise RuntimeError(f"VC {vc.launcher_id} has no proofs to authorize transaction") # pragma: no cover
725
+ proof_of_inclusions: Program = await vc_wallet.proof_of_inclusions_for_root_and_keys(
726
+ vc.proof_hash, self.info.proofs_checker.flags
727
+ )
728
+
729
+ # Generate the bundle nonce
730
+ nonce: bytes32 = Program.to(
731
+ [coin_as_list(c) for c in sorted(coins.union(chia_coins).union({vc.coin}), key=Coin.name)]
732
+ ).get_tree_hash()
733
+
734
+ # Make CR-CAT bundle
735
+ crcats_and_puzhashes: list[tuple[CRCAT, bytes32]] = [
736
+ (crcat, CRCATWallet.get_metadata_from_record(record).inner_puzzle_hash)
737
+ for record in [r for r in crcat_records if r.coin in coins]
738
+ for crcat in [self.coin_record_to_crcat(record)]
739
+ ]
740
+ expected_announcements, coin_spends, _ = CRCAT.spend_many(
741
+ [
742
+ (
743
+ crcat,
744
+ 0,
745
+ construct_pending_approval_state(inner_puzhash, uint64(crcat.coin.amount)),
746
+ Program.to([nonce]),
747
+ )
748
+ for crcat, inner_puzhash in crcats_and_puzhashes
749
+ ],
750
+ proof_of_inclusions,
751
+ Program.to(None), # TODO: With more proofs checkers, this may need to be flexible. For now, it's hardcoded.
752
+ vc.proof_provider,
753
+ vc.launcher_id,
754
+ vc.wrap_inner_with_backdoor().get_tree_hash(),
755
+ )
756
+ claim_bundle = WalletSpendBundle(coin_spends, G2Element())
757
+
758
+ # Make the Fee TX
759
+ if fee > 0:
760
+ await self.create_tandem_xch_tx(
761
+ fee,
762
+ uint64(0),
763
+ action_scope,
764
+ extra_conditions=tuple(expected_announcements),
765
+ )
766
+
767
+ # Make the VC TX
768
+ await vc_wallet.generate_signed_transaction(
769
+ vc.launcher_id,
770
+ action_scope,
771
+ extra_conditions=(
772
+ *extra_conditions,
773
+ *expected_announcements,
774
+ CreateCoinAnnouncement(nonce),
775
+ *(CreatePuzzleAnnouncement(crcat.expected_announcement()) for crcat, _ in crcats_and_puzhashes),
776
+ ),
777
+ )
778
+
779
+ async with action_scope.use() as interface:
780
+ other_additions: set[Coin] = {rem for tx in interface.side_effects.transactions for rem in tx.additions}
781
+ other_removals: set[Coin] = {rem for tx in interface.side_effects.transactions for rem in tx.removals}
782
+ interface.side_effects.transactions.append(
783
+ TransactionRecord(
784
+ confirmed_at_height=uint32(0),
785
+ created_at_time=uint64(int(time.time())),
786
+ to_puzzle_hash=await self.wallet_state_manager.main_wallet.get_puzzle_hash(False),
787
+ amount=uint64(sum(c.amount for c in coins)),
788
+ fee_amount=fee,
789
+ confirmed=False,
790
+ sent=uint32(0),
791
+ spend_bundle=claim_bundle,
792
+ additions=list(set(claim_bundle.additions()) - other_additions),
793
+ removals=list(set(claim_bundle.removals()) - other_removals),
794
+ wallet_id=self.id(),
795
+ sent_to=[],
796
+ trade_id=None,
797
+ type=uint32(TransactionType.INCOMING_TX.value),
798
+ name=claim_bundle.name(),
799
+ memos=list(compute_memos(claim_bundle).items()),
800
+ valid_times=parse_timelock_info(extra_conditions),
801
+ )
802
+ )
803
+
804
+ async def match_puzzle_info(self, puzzle_driver: PuzzleInfo) -> bool:
805
+ if (
806
+ AssetType(puzzle_driver.type()) == AssetType.CAT
807
+ and puzzle_driver["tail"] == self.info.limitations_program_hash
808
+ ):
809
+ inner_puzzle_driver: Optional[PuzzleInfo] = puzzle_driver.also()
810
+ if inner_puzzle_driver is None:
811
+ raise ValueError("Malformed puzzle driver passed to CRCATWallet.match_puzzle_info") # pragma: no cover
812
+ return (
813
+ AssetType(inner_puzzle_driver.type()) == AssetType.CR
814
+ and [bytes32(provider) for provider in inner_puzzle_driver["authorized_providers"]]
815
+ == self.info.authorized_providers
816
+ and ProofsChecker.from_program(uncurry_puzzle(inner_puzzle_driver["proofs_checker"]))
817
+ == self.info.proofs_checker
818
+ )
819
+ return False
820
+
821
+ async def get_puzzle_info(self, asset_id: bytes32) -> PuzzleInfo:
822
+ return PuzzleInfo(
823
+ {
824
+ "type": AssetType.CAT.value,
825
+ "tail": "0x" + self.info.limitations_program_hash.hex(),
826
+ "also": {
827
+ "type": AssetType.CR.value,
828
+ "authorized_providers": ["0x" + provider.hex() for provider in self.info.authorized_providers],
829
+ "proofs_checker": self.info.proofs_checker.as_program(),
830
+ },
831
+ }
832
+ )
833
+
834
+ async def match_hinted_coin(self, coin: Coin, hint: bytes32) -> bool:
835
+ """
836
+ This matches coins that are either CRCATs with the hint as the inner puzzle, or CRCATs in the pending approval
837
+ state that will come to us once claimed.
838
+ """
839
+ authorized_providers_hash: bytes32 = Program.to(self.info.authorized_providers).get_tree_hash()
840
+ proofs_checker_hash: bytes32 = self.info.proofs_checker.as_program().get_tree_hash()
841
+ hint_inner_hash: bytes32 = construct_cr_layer_hash(
842
+ authorized_providers_hash,
843
+ proofs_checker_hash,
844
+ hint,
845
+ )
846
+ if (
847
+ construct_cat_puzzle(
848
+ Program.to(CAT_MOD_HASH),
849
+ self.info.limitations_program_hash,
850
+ hint_inner_hash,
851
+ mod_code_hash=CAT_MOD_HASH_HASH,
852
+ ).get_tree_hash_precalc(hint, CAT_MOD_HASH, CAT_MOD_HASH_HASH, hint_inner_hash)
853
+ == coin.puzzle_hash
854
+ ):
855
+ return True
856
+
857
+ pending_approval_inner_hash: bytes32 = construct_cr_layer_hash(
858
+ authorized_providers_hash,
859
+ proofs_checker_hash,
860
+ construct_pending_approval_state(hint, uint64(coin.amount)).get_tree_hash(),
861
+ )
862
+ if (
863
+ construct_cat_puzzle(
864
+ Program.to(CAT_MOD_HASH),
865
+ self.info.limitations_program_hash,
866
+ pending_approval_inner_hash,
867
+ mod_code_hash=CAT_MOD_HASH_HASH,
868
+ ).get_tree_hash_precalc(CAT_MOD_HASH, CAT_MOD_HASH_HASH, pending_approval_inner_hash)
869
+ == coin.puzzle_hash
870
+ ):
871
+ return True
872
+ else:
873
+ return False
874
+
875
+
876
+ if TYPE_CHECKING:
877
+ _dummy: WalletProtocol[CATCoinData] = CRCATWallet()