chia-blockchain 2.5.2rc2__py3-none-any.whl → 2.5.3__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 (640) hide show
  1. chia/__init__.py +7 -0
  2. chia/_tests/blockchain/blockchain_test_utils.py +1 -1
  3. chia/_tests/blockchain/test_augmented_chain.py +54 -5
  4. chia/_tests/blockchain/test_blockchain.py +5 -12
  5. chia/_tests/blockchain/test_blockchain_transactions.py +3 -5
  6. chia/_tests/blockchain/test_get_block_generator.py +2 -2
  7. chia/_tests/blockchain/test_lookup_fork_chain.py +2 -2
  8. chia/_tests/clvm/benchmark_costs.py +2 -1
  9. chia/_tests/clvm/coin_store.py +4 -3
  10. chia/_tests/clvm/test_chialisp_deserialization.py +2 -2
  11. chia/_tests/clvm/test_curry_and_treehash.py +1 -1
  12. chia/_tests/clvm/test_puzzle_compression.py +2 -2
  13. chia/_tests/clvm/test_puzzles.py +2 -2
  14. chia/_tests/clvm/test_singletons.py +2 -2
  15. chia/_tests/clvm/test_spend_sim.py +1 -1
  16. chia/_tests/cmds/cmd_test_utils.py +2 -2
  17. chia/_tests/cmds/test_click_types.py +2 -2
  18. chia/_tests/cmds/test_cmd_framework.py +6 -6
  19. chia/_tests/cmds/test_show.py +4 -3
  20. chia/_tests/cmds/test_tx_config_args.py +1 -1
  21. chia/_tests/cmds/testing_classes.py +2 -2
  22. chia/_tests/cmds/wallet/test_consts.py +2 -2
  23. chia/_tests/cmds/wallet/test_did.py +2 -2
  24. chia/_tests/cmds/wallet/test_nft.py +2 -2
  25. chia/_tests/cmds/wallet/test_notifications.py +3 -2
  26. chia/_tests/cmds/wallet/test_vcs.py +2 -2
  27. chia/_tests/cmds/wallet/test_wallet.py +4 -8
  28. chia/_tests/conftest.py +4 -3
  29. chia/_tests/connection_utils.py +2 -2
  30. chia/_tests/core/cmds/test_keys.py +1 -2
  31. chia/_tests/core/cmds/test_wallet.py +2 -2
  32. chia/_tests/core/consensus/test_block_creation.py +2 -2
  33. chia/_tests/core/consensus/test_pot_iterations.py +1 -1
  34. chia/_tests/core/custom_types/test_coin.py +2 -2
  35. chia/_tests/core/custom_types/test_proof_of_space.py +2 -2
  36. chia/_tests/core/custom_types/test_spend_bundle.py +2 -2
  37. chia/_tests/core/data_layer/conftest.py +1 -1
  38. chia/_tests/core/data_layer/test_data_layer.py +1 -1
  39. chia/_tests/core/data_layer/test_data_layer_util.py +1 -1
  40. chia/_tests/core/data_layer/test_data_rpc.py +2 -2
  41. chia/_tests/core/data_layer/test_data_store.py +1 -1
  42. chia/_tests/core/data_layer/test_data_store_schema.py +1 -1
  43. chia/_tests/core/data_layer/util.py +2 -1
  44. chia/_tests/core/farmer/test_farmer_api.py +1 -1
  45. chia/_tests/core/full_node/full_sync/test_full_sync.py +1 -7
  46. chia/_tests/core/full_node/ram_db.py +2 -1
  47. chia/_tests/core/full_node/stores/test_block_store.py +2 -2
  48. chia/_tests/core/full_node/stores/test_coin_store.py +2 -2
  49. chia/_tests/core/full_node/stores/test_full_node_store.py +3 -3
  50. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  51. chia/_tests/core/full_node/stores/test_sync_store.py +1 -1
  52. chia/_tests/core/full_node/test_address_manager.py +1 -1
  53. chia/_tests/core/full_node/test_block_height_map.py +2 -2
  54. chia/_tests/core/full_node/test_conditions.py +1 -1
  55. chia/_tests/core/full_node/test_full_node.py +346 -164
  56. chia/_tests/core/full_node/test_generator_tools.py +3 -2
  57. chia/_tests/core/full_node/test_hint_management.py +2 -2
  58. chia/_tests/core/full_node/test_performance.py +2 -15
  59. chia/_tests/core/full_node/test_subscriptions.py +1 -1
  60. chia/_tests/core/full_node/test_transactions.py +186 -185
  61. chia/_tests/core/full_node/test_tx_processing_queue.py +1 -1
  62. chia/_tests/core/make_block_generator.py +2 -2
  63. chia/_tests/core/mempool/test_mempool.py +165 -22
  64. chia/_tests/core/mempool/test_mempool_fee_estimator.py +1 -1
  65. chia/_tests/core/mempool/test_mempool_fee_protocol.py +1 -1
  66. chia/_tests/core/mempool/test_mempool_manager.py +476 -66
  67. chia/_tests/core/mempool/test_mempool_performance.py +2 -2
  68. chia/_tests/core/mempool/test_singleton_fast_forward.py +19 -25
  69. chia/_tests/core/node_height.py +2 -1
  70. chia/_tests/core/server/test_capabilities.py +1 -1
  71. chia/_tests/core/server/test_dos.py +36 -28
  72. chia/_tests/core/server/test_loop.py +3 -3
  73. chia/_tests/core/server/test_rate_limits.py +1 -1
  74. chia/_tests/core/server/test_server.py +2 -2
  75. chia/_tests/core/services/test_services.py +1 -1
  76. chia/_tests/core/ssl/test_ssl.py +1 -1
  77. chia/_tests/core/test_coins.py +2 -1
  78. chia/_tests/core/test_cost_calculation.py +2 -2
  79. chia/_tests/core/test_crawler.py +2 -2
  80. chia/_tests/core/test_db_conversion.py +2 -2
  81. chia/_tests/core/test_db_validation.py +26 -13
  82. chia/_tests/core/test_farmer_harvester_rpc.py +2 -2
  83. chia/_tests/core/test_full_node_rpc.py +2 -2
  84. chia/_tests/core/test_merkle_set.py +2 -2
  85. chia/_tests/core/test_program.py +2 -2
  86. chia/_tests/core/test_rpc_util.py +1 -1
  87. chia/_tests/core/test_seeder.py +1 -1
  88. chia/_tests/core/util/test_block_cache.py +3 -3
  89. chia/_tests/core/util/test_jsonify.py +3 -2
  90. chia/_tests/core/util/test_keychain.py +3 -3
  91. chia/_tests/core/util/test_streamable.py +3 -4
  92. chia/_tests/environments/wallet.py +3 -2
  93. chia/_tests/farmer_harvester/test_farmer.py +3 -4
  94. chia/_tests/farmer_harvester/test_farmer_harvester.py +2 -2
  95. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +2 -2
  96. chia/_tests/farmer_harvester/test_third_party_harvesters.py +3 -4
  97. chia/_tests/fee_estimation/test_fee_estimation_integration.py +1 -1
  98. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +2 -2
  99. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +1 -1
  100. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +3 -4
  101. chia/_tests/generator/test_compression.py +20 -10
  102. chia/_tests/generator/test_rom.py +7 -9
  103. chia/_tests/plot_sync/test_delta.py +2 -2
  104. chia/_tests/plot_sync/test_plot_sync.py +2 -2
  105. chia/_tests/plot_sync/test_receiver.py +2 -2
  106. chia/_tests/plot_sync/test_sender.py +2 -2
  107. chia/_tests/plot_sync/test_sync_simulated.py +2 -2
  108. chia/_tests/plot_sync/util.py +3 -2
  109. chia/_tests/plotting/test_plot_manager.py +1 -1
  110. chia/_tests/pools/test_pool_cli_parsing.py +3 -2
  111. chia/_tests/pools/test_pool_cmdline.py +2 -2
  112. chia/_tests/pools/test_pool_puzzles_lifecycle.py +3 -3
  113. chia/_tests/pools/test_pool_rpc.py +4 -5
  114. chia/_tests/pools/test_pool_wallet.py +1 -1
  115. chia/_tests/pools/test_wallet_pool_store.py +2 -2
  116. chia/_tests/rpc/test_rpc_client.py +1 -1
  117. chia/_tests/rpc/test_rpc_server.py +1 -1
  118. chia/_tests/simulation/test_simulation.py +36 -8
  119. chia/_tests/simulation/test_simulator.py +5 -5
  120. chia/_tests/simulation/test_start_simulator.py +2 -2
  121. chia/_tests/timelord/test_new_peak.py +2 -2
  122. chia/_tests/tools/test_run_block.py +3 -2
  123. chia/_tests/util/benchmark_cost.py +2 -2
  124. chia/_tests/util/benchmarks.py +17 -6
  125. chia/_tests/util/blockchain.py +2 -1
  126. chia/_tests/util/blockchain_mock.py +9 -5
  127. chia/_tests/util/build_network_protocol_files.py +2 -1
  128. chia/_tests/util/constants.py +2 -1
  129. chia/_tests/util/full_sync.py +6 -3
  130. chia/_tests/util/gen_ssl_certs.py +2 -2
  131. chia/_tests/util/generator_tools_testing.py +4 -3
  132. chia/_tests/util/get_name_puzzle_conditions.py +2 -2
  133. chia/_tests/util/misc.py +16 -2
  134. chia/_tests/util/network_protocol_data.py +17 -7
  135. chia/_tests/util/run_block.py +6 -8
  136. chia/_tests/util/setup_nodes.py +4 -3
  137. chia/_tests/util/spend_sim.py +9 -5
  138. chia/_tests/util/test_condition_tools.py +2 -2
  139. chia/_tests/util/test_config.py +2 -1
  140. chia/_tests/util/test_errors.py +2 -1
  141. chia/_tests/util/test_full_block_utils.py +17 -7
  142. chia/_tests/util/test_misc.py +1 -1
  143. chia/_tests/util/test_network_protocol_test.py +24 -24
  144. chia/_tests/util/test_replace_str_to_bytes.py +2 -2
  145. chia/_tests/util/test_trusted_peer.py +1 -1
  146. chia/_tests/util/time_out_assert.py +20 -7
  147. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +1 -1
  148. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -2
  149. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +5 -6
  150. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +17 -15
  151. chia/_tests/wallet/cat_wallet/test_trades.py +2 -2
  152. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -2
  153. chia/_tests/wallet/clawback/test_clawback_metadata.py +2 -2
  154. chia/_tests/wallet/conftest.py +3 -3
  155. chia/_tests/wallet/db_wallet/test_db_graftroot.py +3 -5
  156. chia/_tests/wallet/db_wallet/test_dl_offers.py +2 -2
  157. chia/_tests/wallet/db_wallet/test_dl_wallet.py +433 -384
  158. chia/_tests/wallet/did_wallet/test_did.py +3 -3
  159. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +2 -2
  160. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +2 -2
  161. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +3 -4
  162. chia/_tests/wallet/nft_wallet/test_nft_offers.py +1293 -703
  163. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +28 -30
  164. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2 -2
  165. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +2 -2
  166. chia/_tests/wallet/rpc/config.py +1 -1
  167. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +2 -2
  168. chia/_tests/wallet/rpc/test_wallet_rpc.py +20 -77
  169. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +9 -7
  170. chia/_tests/wallet/sync/test_wallet_sync.py +79 -31
  171. chia/_tests/wallet/test_clvm_streamable.py +2 -2
  172. chia/_tests/wallet/test_coin_management.py +7 -7
  173. chia/_tests/wallet/test_coin_selection.py +20 -2
  174. chia/_tests/wallet/test_conditions.py +2 -2
  175. chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
  176. chia/_tests/wallet/test_new_wallet_protocol.py +2 -2
  177. chia/_tests/wallet/test_nft_store.py +2 -2
  178. chia/_tests/wallet/test_notifications.py +2 -2
  179. chia/_tests/wallet/test_puzzle_store.py +2 -2
  180. chia/_tests/wallet/test_sign_coin_spends.py +2 -2
  181. chia/_tests/wallet/test_signer_protocol.py +3 -3
  182. chia/_tests/wallet/test_singleton.py +3 -11
  183. chia/_tests/wallet/test_singleton_lifecycle_fast.py +12 -13
  184. chia/_tests/wallet/test_singleton_store.py +2 -4
  185. chia/_tests/wallet/test_transaction_store.py +2 -2
  186. chia/_tests/wallet/test_util.py +2 -2
  187. chia/_tests/wallet/test_wallet.py +53 -49
  188. chia/_tests/wallet/test_wallet_action_scope.py +24 -6
  189. chia/_tests/wallet/test_wallet_blockchain.py +1 -1
  190. chia/_tests/wallet/test_wallet_coin_store.py +2 -2
  191. chia/_tests/wallet/test_wallet_interested_store.py +2 -2
  192. chia/_tests/wallet/test_wallet_node.py +3 -3
  193. chia/_tests/wallet/test_wallet_retry.py +3 -3
  194. chia/_tests/wallet/test_wallet_state_manager.py +8 -8
  195. chia/_tests/wallet/test_wallet_test_framework.py +1 -1
  196. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  197. chia/_tests/wallet/test_wallet_utils.py +2 -2
  198. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -2
  199. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +15 -15
  200. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +5 -3
  201. chia/_tests/wallet/wallet_block_tools.py +15 -7
  202. chia/_tests/weight_proof/test_weight_proof.py +3 -3
  203. chia/cmds/chia.py +0 -2
  204. chia/cmds/cmd_classes.py +3 -3
  205. chia/cmds/cmd_helpers.py +4 -4
  206. chia/cmds/cmds_util.py +2 -2
  207. chia/cmds/coin_funcs.py +3 -2
  208. chia/cmds/coins.py +1 -1
  209. chia/cmds/data.py +2 -2
  210. chia/cmds/data_funcs.py +3 -2
  211. chia/cmds/db_upgrade_func.py +2 -2
  212. chia/cmds/db_validate_func.py +15 -8
  213. chia/cmds/farm.py +2 -4
  214. chia/cmds/keys.py +0 -2
  215. chia/cmds/keys_funcs.py +1 -1
  216. chia/cmds/netspace_funcs.py +2 -1
  217. chia/cmds/param_types.py +2 -2
  218. chia/cmds/plotnft.py +2 -2
  219. chia/cmds/plotnft_funcs.py +2 -2
  220. chia/cmds/rpc.py +1 -1
  221. chia/cmds/show.py +1 -2
  222. chia/cmds/show_funcs.py +6 -3
  223. chia/cmds/signer.py +1 -2
  224. chia/cmds/sim.py +1 -2
  225. chia/cmds/sim_funcs.py +2 -2
  226. chia/cmds/wallet.py +2 -2
  227. chia/cmds/wallet_funcs.py +4 -11
  228. chia/consensus/block_body_validation.py +3 -4
  229. chia/consensus/block_creation.py +10 -6
  230. chia/consensus/block_header_validation.py +3 -4
  231. chia/consensus/block_record.py +2 -3
  232. chia/consensus/block_rewards.py +1 -1
  233. chia/consensus/blockchain.py +20 -17
  234. chia/consensus/blockchain_interface.py +5 -4
  235. chia/consensus/coinbase.py +2 -2
  236. chia/consensus/constants.py +1 -1
  237. chia/consensus/cost_calculator.py +2 -1
  238. chia/consensus/default_constants.py +4 -3
  239. chia/consensus/deficit.py +3 -2
  240. chia/consensus/difficulty_adjustment.py +8 -9
  241. chia/consensus/find_fork_point.py +4 -3
  242. chia/consensus/full_block_to_block_record.py +4 -3
  243. chia/consensus/get_block_challenge.py +4 -3
  244. chia/consensus/get_block_generator.py +3 -2
  245. chia/consensus/make_sub_epoch_summary.py +3 -2
  246. chia/consensus/multiprocess_validation.py +9 -4
  247. chia/consensus/pos_quality.py +1 -1
  248. chia/consensus/pot_iterations.py +4 -3
  249. chia/consensus/vdf_info_computation.py +4 -3
  250. chia/daemon/client.py +1 -1
  251. chia/daemon/keychain_server.py +1 -1
  252. chia/daemon/server.py +1 -1
  253. chia/daemon/windows_signal.py +1 -1
  254. chia/data_layer/data_layer.py +4 -3
  255. chia/data_layer/data_layer_errors.py +1 -1
  256. chia/data_layer/data_layer_util.py +2 -2
  257. chia/data_layer/data_layer_wallet.py +47 -69
  258. chia/data_layer/data_store.py +1 -1
  259. chia/data_layer/dl_wallet_store.py +5 -6
  260. chia/data_layer/download_data.py +1 -1
  261. chia/data_layer/s3_plugin_service.py +4 -4
  262. chia/data_layer/singleton_record.py +23 -0
  263. chia/data_layer/util/benchmark.py +2 -1
  264. chia/farmer/farmer.py +4 -6
  265. chia/farmer/farmer_api.py +4 -6
  266. chia/full_node/bitcoin_fee_estimator.py +2 -1
  267. chia/full_node/block_height_map.py +2 -2
  268. chia/full_node/block_store.py +8 -9
  269. chia/{util → full_node}/check_fork_next_block.py +2 -1
  270. chia/full_node/coin_store.py +10 -10
  271. chia/full_node/fee_estimate.py +2 -1
  272. chia/full_node/fee_estimation.py +2 -1
  273. chia/full_node/fee_estimator.py +2 -1
  274. chia/full_node/fee_estimator_interface.py +1 -1
  275. chia/full_node/fee_history.py +2 -1
  276. chia/full_node/fee_tracker.py +2 -1
  277. chia/full_node/full_node.py +15 -13
  278. chia/full_node/full_node_api.py +12 -32
  279. chia/full_node/full_node_store.py +4 -3
  280. chia/full_node/hint_management.py +2 -1
  281. chia/full_node/hint_store.py +3 -3
  282. chia/full_node/mempool.py +80 -12
  283. chia/full_node/mempool_check_conditions.py +6 -7
  284. chia/full_node/mempool_manager.py +168 -21
  285. chia/full_node/pending_tx_cache.py +2 -2
  286. chia/full_node/subscriptions.py +2 -2
  287. chia/full_node/sync_store.py +2 -3
  288. chia/full_node/tx_processing_queue.py +2 -1
  289. chia/full_node/weight_proof.py +5 -8
  290. chia/harvester/harvester.py +5 -3
  291. chia/harvester/harvester_api.py +2 -2
  292. chia/introducer/introducer.py +30 -2
  293. chia/introducer/introducer_api.py +9 -1
  294. chia/legacy/keyring.py +1 -2
  295. chia/plot_sync/exceptions.py +2 -1
  296. chia/plot_sync/receiver.py +2 -2
  297. chia/plot_sync/sender.py +1 -1
  298. chia/plotting/cache.py +2 -2
  299. chia/plotting/check_plots.py +4 -2
  300. chia/plotting/create_plots.py +1 -1
  301. chia/plotting/manager.py +3 -3
  302. chia/plotting/util.py +2 -2
  303. chia/pools/pool_config.py +1 -1
  304. chia/pools/pool_puzzles.py +23 -17
  305. chia/pools/pool_wallet.py +22 -9
  306. chia/pools/pool_wallet_info.py +2 -2
  307. chia/protocols/farmer_protocol.py +3 -6
  308. chia/protocols/full_node_protocol.py +3 -2
  309. chia/protocols/harvester_protocol.py +3 -4
  310. chia/protocols/pool_protocol.py +2 -2
  311. chia/protocols/shared_protocol.py +2 -1
  312. chia/protocols/timelord_protocol.py +4 -4
  313. chia/protocols/wallet_protocol.py +2 -2
  314. chia/rpc/data_layer_rpc_api.py +3 -4
  315. chia/rpc/data_layer_rpc_client.py +3 -2
  316. chia/rpc/farmer_rpc_api.py +2 -2
  317. chia/rpc/farmer_rpc_client.py +2 -1
  318. chia/rpc/full_node_rpc_api.py +3 -2
  319. chia/rpc/full_node_rpc_client.py +3 -2
  320. chia/rpc/harvester_rpc_api.py +2 -1
  321. chia/rpc/rpc_client.py +2 -2
  322. chia/rpc/rpc_server.py +1 -1
  323. chia/rpc/wallet_request_types.py +2 -62
  324. chia/rpc/wallet_rpc_api.py +98 -628
  325. chia/rpc/wallet_rpc_client.py +5 -253
  326. chia/seeder/crawl_store.py +1 -1
  327. chia/seeder/crawler.py +2 -2
  328. chia/seeder/peer_record.py +2 -1
  329. chia/seeder/start_crawler.py +3 -1
  330. chia/server/address_manager.py +2 -1
  331. chia/server/address_manager_store.py +1 -1
  332. chia/server/capabilities.py +2 -1
  333. chia/server/introducer_peers.py +2 -1
  334. chia/server/node_discovery.py +1 -1
  335. chia/server/outbound_message.py +2 -1
  336. chia/server/server.py +2 -2
  337. chia/server/start_data_layer.py +2 -1
  338. chia/server/start_farmer.py +3 -1
  339. chia/server/start_full_node.py +4 -2
  340. chia/server/start_harvester.py +3 -1
  341. chia/server/start_introducer.py +12 -1
  342. chia/server/start_service.py +2 -1
  343. chia/server/start_timelord.py +3 -1
  344. chia/server/start_wallet.py +3 -1
  345. chia/server/upnp.py +1 -2
  346. chia/server/ws_connection.py +3 -4
  347. chia/simulator/add_blocks_in_batches.py +5 -3
  348. chia/simulator/block_tools.py +16 -12
  349. chia/simulator/full_node_simulator.py +9 -14
  350. chia/simulator/setup_services.py +5 -3
  351. chia/simulator/simulator_full_node_rpc_api.py +3 -2
  352. chia/simulator/simulator_full_node_rpc_client.py +3 -2
  353. chia/simulator/simulator_protocol.py +3 -2
  354. chia/simulator/simulator_test_tools.py +2 -2
  355. chia/simulator/start_simulator.py +3 -2
  356. chia/simulator/wallet_tools.py +3 -4
  357. chia/timelord/iters_from_block.py +4 -4
  358. chia/timelord/timelord.py +7 -12
  359. chia/timelord/timelord_api.py +3 -3
  360. chia/timelord/timelord_state.py +4 -3
  361. chia/types/block_protocol.py +2 -2
  362. chia/types/blockchain_format/coin.py +2 -2
  363. chia/types/blockchain_format/program.py +1 -1
  364. chia/types/blockchain_format/proof_of_space.py +3 -4
  365. chia/types/blockchain_format/tree_hash.py +1 -1
  366. chia/types/blockchain_format/vdf.py +3 -4
  367. chia/types/clvm_cost.py +1 -1
  368. chia/types/coin_record.py +4 -3
  369. chia/types/coin_spend.py +1 -1
  370. chia/types/eligible_coin_spends.py +9 -5
  371. chia/types/fee_rate.py +1 -1
  372. chia/types/generator_types.py +3 -3
  373. chia/types/internal_mempool_item.py +3 -2
  374. chia/types/mempool_item.py +10 -3
  375. chia/types/mempool_submission_status.py +2 -1
  376. chia/types/mojos.py +1 -1
  377. chia/types/peer_info.py +2 -1
  378. chia/types/transaction_queue_entry.py +2 -1
  379. chia/types/unfinished_header_block.py +4 -4
  380. chia/types/validation_state.py +2 -1
  381. chia/types/weight_proof.py +1 -9
  382. chia/util/augmented_chain.py +20 -9
  383. chia/util/block_cache.py +8 -4
  384. chia/util/condition_tools.py +2 -2
  385. chia/util/full_block_utils.py +3 -4
  386. chia/util/generator_tools.py +2 -2
  387. chia/util/initial-config.yaml +2 -11
  388. chia/util/network.py +2 -2
  389. chia/util/prev_transaction_block.py +2 -1
  390. chia/util/task_timing.py +1 -1
  391. chia/util/vdf_prover.py +3 -3
  392. chia/util/ws_message.py +1 -1
  393. chia/wallet/cat_wallet/cat_info.py +3 -2
  394. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -2
  395. chia/wallet/cat_wallet/cat_utils.py +6 -4
  396. chia/wallet/cat_wallet/cat_wallet.py +16 -18
  397. chia/wallet/cat_wallet/lineage_store.py +2 -1
  398. chia/wallet/coin_selection.py +5 -5
  399. chia/wallet/conditions.py +22 -16
  400. chia/wallet/db_wallet/db_wallet_puzzles.py +15 -15
  401. chia/wallet/derivation_record.py +2 -2
  402. chia/wallet/derive_keys.py +2 -2
  403. chia/wallet/did_wallet/did_info.py +3 -2
  404. chia/wallet/did_wallet/did_wallet.py +41 -19
  405. chia/wallet/did_wallet/did_wallet_puzzles.py +18 -12
  406. chia/wallet/driver_protocol.py +1 -1
  407. chia/wallet/lineage_proof.py +3 -2
  408. chia/wallet/nft_wallet/metadata_outer_puzzle.py +6 -7
  409. chia/wallet/nft_wallet/nft_info.py +5 -5
  410. chia/wallet/nft_wallet/nft_puzzle_utils.py +293 -0
  411. chia/wallet/nft_wallet/nft_puzzles.py +21 -298
  412. chia/wallet/nft_wallet/nft_wallet.py +47 -62
  413. chia/wallet/nft_wallet/ownership_outer_puzzle.py +4 -8
  414. chia/wallet/nft_wallet/singleton_outer_puzzle.py +3 -2
  415. chia/wallet/nft_wallet/transfer_program_puzzle.py +6 -10
  416. chia/wallet/nft_wallet/uncurry_nft.py +6 -8
  417. chia/wallet/notification_manager.py +5 -5
  418. chia/wallet/notification_store.py +3 -2
  419. chia/wallet/outer_puzzles.py +2 -1
  420. chia/wallet/puzzles/clawback/drivers.py +21 -8
  421. chia/wallet/puzzles/clawback/metadata.py +3 -2
  422. chia/wallet/puzzles/clawback/puzzle_decorator.py +5 -4
  423. chia/wallet/puzzles/deployed_puzzle_hashes.json +0 -10
  424. chia/wallet/puzzles/p2_conditions.py +3 -2
  425. chia/wallet/puzzles/p2_delegated_conditions.py +3 -2
  426. chia/wallet/puzzles/p2_delegated_puzzle.py +3 -2
  427. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -3
  428. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +3 -2
  429. chia/wallet/puzzles/p2_puzzle_hash.py +4 -3
  430. chia/wallet/puzzles/puzzle_utils.py +3 -2
  431. chia/wallet/puzzles/singleton_top_layer.py +26 -10
  432. chia/wallet/puzzles/singleton_top_layer_v1_1.py +21 -9
  433. chia/wallet/puzzles/tails.py +21 -129
  434. chia/wallet/signer_protocol.py +3 -2
  435. chia/wallet/singleton.py +12 -6
  436. chia/wallet/singleton_record.py +3 -2
  437. chia/wallet/trade_manager.py +31 -55
  438. chia/wallet/trade_record.py +3 -2
  439. chia/wallet/trading/offer.py +14 -13
  440. chia/wallet/trading/trade_store.py +3 -4
  441. chia/wallet/transaction_record.py +2 -2
  442. chia/wallet/util/blind_signer_tl.py +3 -2
  443. chia/wallet/util/compute_hints.py +3 -2
  444. chia/wallet/util/compute_memos.py +2 -2
  445. chia/wallet/util/curry_and_treehash.py +1 -2
  446. chia/wallet/util/merkle_tree.py +1 -1
  447. chia/wallet/util/merkle_utils.py +1 -1
  448. chia/wallet/util/new_peak_queue.py +2 -1
  449. chia/wallet/util/notifications.py +5 -4
  450. chia/wallet/util/peer_request_cache.py +3 -2
  451. chia/wallet/util/puzzle_compression.py +6 -4
  452. chia/wallet/util/puzzle_decorator.py +6 -4
  453. chia/wallet/util/query_filter.py +3 -2
  454. chia/wallet/util/tx_config.py +3 -3
  455. chia/wallet/util/wallet_sync_utils.py +2 -2
  456. chia/wallet/util/wallet_types.py +2 -3
  457. chia/wallet/vc_wallet/cr_cat_drivers.py +18 -22
  458. chia/wallet/vc_wallet/cr_cat_wallet.py +14 -10
  459. chia/wallet/vc_wallet/cr_outer_puzzle.py +2 -2
  460. chia/wallet/vc_wallet/vc_drivers.py +50 -68
  461. chia/wallet/vc_wallet/vc_store.py +2 -2
  462. chia/wallet/vc_wallet/vc_wallet.py +47 -15
  463. chia/wallet/wallet.py +51 -46
  464. chia/wallet/wallet_action_scope.py +4 -0
  465. chia/wallet/wallet_blockchain.py +12 -7
  466. chia/wallet/wallet_coin_record.py +3 -2
  467. chia/wallet/wallet_coin_store.py +3 -2
  468. chia/wallet/wallet_info.py +2 -1
  469. chia/wallet/wallet_interested_store.py +3 -2
  470. chia/wallet/wallet_nft_store.py +4 -4
  471. chia/wallet/wallet_node.py +3 -4
  472. chia/wallet/wallet_pool_store.py +3 -4
  473. chia/wallet/wallet_protocol.py +19 -5
  474. chia/wallet/wallet_puzzle_store.py +2 -2
  475. chia/wallet/wallet_retry_store.py +3 -6
  476. chia/wallet/wallet_singleton_store.py +2 -2
  477. chia/wallet/wallet_state_manager.py +20 -197
  478. chia/wallet/wallet_transaction_store.py +2 -2
  479. chia/wallet/wallet_user_store.py +2 -1
  480. chia/wallet/wallet_weight_proof_handler.py +3 -2
  481. {chia_blockchain-2.5.2rc2.dist-info → chia_blockchain-2.5.3.dist-info}/METADATA +3 -2
  482. chia_blockchain-2.5.3.dist-info/RECORD +891 -0
  483. mozilla-ca/cacert.pem +64 -33
  484. chia/_tests/clvm/test_condition_codes.py +0 -13
  485. chia/_tests/cmds/wallet/test_dao.py +0 -565
  486. chia/_tests/wallet/dao_wallet/__init__.py +0 -0
  487. chia/_tests/wallet/dao_wallet/config.py +0 -3
  488. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +0 -1330
  489. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +0 -3488
  490. chia/cmds/dao.py +0 -1064
  491. chia/cmds/dao_funcs.py +0 -598
  492. chia/consensus/puzzles/__init__.py +0 -0
  493. chia/consensus/puzzles/chialisp_deserialisation.clsp +0 -69
  494. chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +0 -1
  495. chia/consensus/puzzles/rom_bootstrap_generator.clsp +0 -37
  496. chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +0 -1
  497. chia/full_node/puzzles/__init__.py +0 -0
  498. chia/full_node/puzzles/block_program_zero.clsp +0 -14
  499. chia/full_node/puzzles/block_program_zero.clsp.hex +0 -1
  500. chia/full_node/puzzles/decompress_coin_spend_entry.clsp +0 -5
  501. chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +0 -1
  502. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +0 -7
  503. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +0 -1
  504. chia/full_node/puzzles/decompress_puzzle.clsp +0 -6
  505. chia/full_node/puzzles/decompress_puzzle.clsp.hex +0 -1
  506. chia/pools/puzzles/__init__.py +0 -0
  507. chia/pools/puzzles/pool_member_innerpuz.clsp +0 -70
  508. chia/pools/puzzles/pool_member_innerpuz.clsp.hex +0 -1
  509. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +0 -69
  510. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +0 -1
  511. chia/simulator/simulator_constants.py +0 -13
  512. chia/types/blockchain_format/foliage.py +0 -8
  513. chia/types/blockchain_format/pool_target.py +0 -5
  514. chia/types/blockchain_format/reward_chain_block.py +0 -6
  515. chia/types/blockchain_format/sized_bytes.py +0 -11
  516. chia/util/ints.py +0 -19
  517. chia/wallet/cat_wallet/dao_cat_info.py +0 -28
  518. chia/wallet/cat_wallet/dao_cat_wallet.py +0 -669
  519. chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
  520. chia/wallet/cat_wallet/puzzles/cat_truths.clib +0 -31
  521. chia/wallet/cat_wallet/puzzles/cat_v2.clsp +0 -397
  522. chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +0 -1
  523. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +0 -25
  524. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +0 -1
  525. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +0 -15
  526. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +0 -1
  527. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +0 -26
  528. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +0 -1
  529. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +0 -42
  530. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +0 -1
  531. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +0 -24
  532. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +0 -1
  533. chia/wallet/dao_wallet/__init__.py +0 -0
  534. chia/wallet/dao_wallet/dao_info.py +0 -61
  535. chia/wallet/dao_wallet/dao_utils.py +0 -811
  536. chia/wallet/dao_wallet/dao_wallet.py +0 -2119
  537. chia/wallet/did_wallet/puzzles/__init__.py +0 -0
  538. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +0 -135
  539. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +0 -1
  540. chia/wallet/payment.py +0 -33
  541. chia/wallet/puzzles/augmented_condition.clsp +0 -13
  542. chia/wallet/puzzles/augmented_condition.clsp.hex +0 -1
  543. chia/wallet/puzzles/condition_codes.clib +0 -77
  544. chia/wallet/puzzles/curry-and-treehash.clib +0 -102
  545. chia/wallet/puzzles/curry.clib +0 -135
  546. chia/wallet/puzzles/curry_by_index.clib +0 -16
  547. chia/wallet/puzzles/dao_cat_eve.clsp +0 -17
  548. chia/wallet/puzzles/dao_cat_eve.clsp.hex +0 -1
  549. chia/wallet/puzzles/dao_cat_launcher.clsp +0 -36
  550. chia/wallet/puzzles/dao_cat_launcher.clsp.hex +0 -1
  551. chia/wallet/puzzles/dao_finished_state.clsp +0 -35
  552. chia/wallet/puzzles/dao_finished_state.clsp.hex +0 -1
  553. chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +0 -1
  554. chia/wallet/puzzles/dao_lockup.clsp +0 -288
  555. chia/wallet/puzzles/dao_lockup.clsp.hex +0 -1
  556. chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +0 -1
  557. chia/wallet/puzzles/dao_proposal.clsp +0 -377
  558. chia/wallet/puzzles/dao_proposal.clsp.hex +0 -1
  559. chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +0 -1
  560. chia/wallet/puzzles/dao_proposal_timer.clsp +0 -78
  561. chia/wallet/puzzles/dao_proposal_timer.clsp.hex +0 -1
  562. chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +0 -1
  563. chia/wallet/puzzles/dao_proposal_validator.clsp +0 -87
  564. chia/wallet/puzzles/dao_proposal_validator.clsp.hex +0 -1
  565. chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +0 -1
  566. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +0 -240
  567. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +0 -1
  568. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +0 -1
  569. chia/wallet/puzzles/dao_treasury.clsp +0 -115
  570. chia/wallet/puzzles/dao_treasury.clsp.hex +0 -1
  571. chia/wallet/puzzles/dao_update_proposal.clsp +0 -44
  572. chia/wallet/puzzles/dao_update_proposal.clsp.hex +0 -1
  573. chia/wallet/puzzles/json.clib +0 -25
  574. chia/wallet/puzzles/merkle_utils.clib +0 -18
  575. chia/wallet/puzzles/notification.clsp +0 -7
  576. chia/wallet/puzzles/notification.clsp.hex +0 -1
  577. chia/wallet/puzzles/p2_1_of_n.clsp +0 -22
  578. chia/wallet/puzzles/p2_1_of_n.clsp.hex +0 -1
  579. chia/wallet/puzzles/p2_conditions.clsp +0 -3
  580. chia/wallet/puzzles/p2_conditions.clsp.hex +0 -1
  581. chia/wallet/puzzles/p2_delegated_conditions.clsp +0 -18
  582. chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +0 -1
  583. chia/wallet/puzzles/p2_delegated_puzzle.clsp +0 -19
  584. chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +0 -1
  585. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +0 -91
  586. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +0 -1
  587. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +0 -108
  588. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +0 -1
  589. chia/wallet/puzzles/p2_parent.clsp +0 -19
  590. chia/wallet/puzzles/p2_parent.clsp.hex +0 -1
  591. chia/wallet/puzzles/p2_puzzle_hash.clsp +0 -18
  592. chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +0 -1
  593. chia/wallet/puzzles/p2_singleton.clsp +0 -30
  594. chia/wallet/puzzles/p2_singleton.clsp.hex +0 -1
  595. chia/wallet/puzzles/p2_singleton_aggregator.clsp +0 -81
  596. chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +0 -1
  597. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +0 -50
  598. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +0 -1
  599. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +0 -47
  600. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +0 -1
  601. chia/wallet/puzzles/settlement_payments.clsp +0 -49
  602. chia/wallet/puzzles/settlement_payments.clsp.hex +0 -1
  603. chia/wallet/puzzles/sha256tree.clib +0 -11
  604. chia/wallet/puzzles/singleton_launcher.clsp +0 -16
  605. chia/wallet/puzzles/singleton_launcher.clsp.hex +0 -1
  606. chia/wallet/puzzles/singleton_top_layer.clsp +0 -177
  607. chia/wallet/puzzles/singleton_top_layer.clsp.hex +0 -1
  608. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +0 -107
  609. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +0 -1
  610. chia/wallet/puzzles/singleton_truths.clib +0 -21
  611. chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
  612. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +0 -3
  613. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +0 -1
  614. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +0 -304
  615. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +0 -1
  616. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +0 -45
  617. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +0 -1
  618. chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
  619. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +0 -30
  620. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +0 -1
  621. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +0 -75
  622. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +0 -1
  623. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +0 -32
  624. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +0 -1
  625. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +0 -80
  626. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +0 -1
  627. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +0 -163
  628. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +0 -1
  629. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +0 -16
  630. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +0 -1
  631. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +0 -74
  632. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +0 -1
  633. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +0 -23
  634. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +0 -1
  635. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +0 -64
  636. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +0 -1
  637. chia_blockchain-2.5.2rc2.dist-info/RECORD +0 -1042
  638. {chia_blockchain-2.5.2rc2.dist-info → chia_blockchain-2.5.3.dist-info}/LICENSE +0 -0
  639. {chia_blockchain-2.5.2rc2.dist-info → chia_blockchain-2.5.3.dist-info}/WHEEL +0 -0
  640. {chia_blockchain-2.5.2rc2.dist-info → chia_blockchain-2.5.3.dist-info}/entry_points.txt +0 -0
@@ -1,811 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import logging
4
- from collections.abc import Iterator
5
- from itertools import chain
6
- from typing import Any, Optional, Union
7
-
8
- from clvm.EvalError import EvalError
9
-
10
- from chia.types.blockchain_format.coin import Coin
11
- from chia.types.blockchain_format.program import Program
12
- from chia.types.blockchain_format.sized_bytes import bytes32
13
- from chia.util.ints import uint64
14
- from chia.wallet.cat_wallet.cat_utils import CAT_MOD, CAT_MOD_HASH, construct_cat_puzzle
15
- from chia.wallet.dao_wallet.dao_info import DAORules, ProposalType
16
- from chia.wallet.puzzles.load_clvm import load_clvm
17
- from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import MOD
18
- from chia.wallet.singleton import get_singleton_struct_for_id
19
- from chia.wallet.uncurried_puzzle import UncurriedPuzzle
20
-
21
- SINGLETON_MOD: Program = load_clvm("singleton_top_layer_v1_1.clsp")
22
- SINGLETON_MOD_HASH: bytes32 = SINGLETON_MOD.get_tree_hash()
23
- SINGLETON_LAUNCHER: Program = load_clvm("singleton_launcher.clsp")
24
- SINGLETON_LAUNCHER_HASH: bytes32 = SINGLETON_LAUNCHER.get_tree_hash()
25
- DAO_LOCKUP_MOD: Program = load_clvm("dao_lockup.clsp")
26
- DAO_LOCKUP_MOD_HASH: bytes32 = DAO_LOCKUP_MOD.get_tree_hash()
27
- DAO_PROPOSAL_TIMER_MOD: Program = load_clvm("dao_proposal_timer.clsp")
28
- DAO_PROPOSAL_TIMER_MOD_HASH: bytes32 = DAO_PROPOSAL_TIMER_MOD.get_tree_hash()
29
- DAO_PROPOSAL_MOD: Program = load_clvm("dao_proposal.clsp")
30
- DAO_PROPOSAL_MOD_HASH: bytes32 = DAO_PROPOSAL_MOD.get_tree_hash()
31
- DAO_PROPOSAL_VALIDATOR_MOD: Program = load_clvm("dao_proposal_validator.clsp")
32
- DAO_PROPOSAL_VALIDATOR_MOD_HASH: bytes32 = DAO_PROPOSAL_VALIDATOR_MOD.get_tree_hash()
33
- DAO_TREASURY_MOD: Program = load_clvm("dao_treasury.clsp")
34
- DAO_TREASURY_MOD_HASH: bytes32 = DAO_TREASURY_MOD.get_tree_hash()
35
- SPEND_P2_SINGLETON_MOD: Program = load_clvm("dao_spend_p2_singleton_v2.clsp")
36
- SPEND_P2_SINGLETON_MOD_HASH: bytes32 = SPEND_P2_SINGLETON_MOD.get_tree_hash()
37
- DAO_FINISHED_STATE: Program = load_clvm("dao_finished_state.clsp")
38
- DAO_FINISHED_STATE_HASH: bytes32 = DAO_FINISHED_STATE.get_tree_hash()
39
- DAO_CAT_TAIL: Program = load_clvm(
40
- "genesis_by_coin_id_or_singleton.clsp", package_or_requirement="chia.wallet.cat_wallet.puzzles"
41
- )
42
- DAO_CAT_TAIL_HASH: bytes32 = DAO_CAT_TAIL.get_tree_hash()
43
- DAO_CAT_LAUNCHER: Program = load_clvm("dao_cat_launcher.clsp")
44
- P2_SINGLETON_MOD: Program = load_clvm("p2_singleton_via_delegated_puzzle.clsp")
45
- P2_SINGLETON_MOD_HASH: bytes32 = P2_SINGLETON_MOD.get_tree_hash()
46
- DAO_UPDATE_PROPOSAL_MOD: Program = load_clvm("dao_update_proposal.clsp")
47
- DAO_UPDATE_PROPOSAL_MOD_HASH: bytes32 = DAO_UPDATE_PROPOSAL_MOD.get_tree_hash()
48
- DAO_CAT_EVE: Program = load_clvm("dao_cat_eve.clsp")
49
- P2_SINGLETON_AGGREGATOR_MOD: Program = load_clvm("p2_singleton_aggregator.clsp")
50
-
51
- log = logging.Logger(__name__)
52
-
53
-
54
- def create_cat_launcher_for_singleton_id(id: bytes32) -> Program:
55
- singleton_struct = get_singleton_struct_for_id(id)
56
- return DAO_CAT_LAUNCHER.curry(singleton_struct)
57
-
58
-
59
- def curry_cat_eve(next_puzzle_hash: bytes32) -> Program:
60
- return DAO_CAT_EVE.curry(next_puzzle_hash)
61
-
62
-
63
- def get_treasury_puzzle(dao_rules: DAORules, treasury_id: bytes32, cat_tail_hash: bytes32) -> Program:
64
- singleton_struct: Program = Program.to((SINGLETON_MOD_HASH, (treasury_id, SINGLETON_LAUNCHER_HASH)))
65
- lockup_puzzle: Program = DAO_LOCKUP_MOD.curry(
66
- SINGLETON_MOD_HASH,
67
- SINGLETON_LAUNCHER_HASH,
68
- DAO_FINISHED_STATE_HASH,
69
- CAT_MOD_HASH,
70
- cat_tail_hash,
71
- )
72
- proposal_self_hash = DAO_PROPOSAL_MOD.curry(
73
- DAO_PROPOSAL_TIMER_MOD_HASH,
74
- SINGLETON_MOD_HASH,
75
- SINGLETON_LAUNCHER_HASH,
76
- CAT_MOD_HASH,
77
- DAO_FINISHED_STATE_HASH,
78
- DAO_TREASURY_MOD_HASH,
79
- lockup_puzzle.get_tree_hash(),
80
- cat_tail_hash,
81
- treasury_id,
82
- ).get_tree_hash()
83
-
84
- proposal_validator = DAO_PROPOSAL_VALIDATOR_MOD.curry(
85
- singleton_struct,
86
- proposal_self_hash,
87
- dao_rules.proposal_minimum_amount,
88
- get_p2_singleton_puzzle(
89
- treasury_id
90
- ).get_tree_hash(), # TODO: let people set this later - for now a hidden feature
91
- )
92
- puzzle = DAO_TREASURY_MOD.curry(
93
- DAO_TREASURY_MOD_HASH,
94
- proposal_validator,
95
- dao_rules.proposal_timelock,
96
- dao_rules.soft_close_length,
97
- dao_rules.attendance_required,
98
- dao_rules.pass_percentage,
99
- dao_rules.self_destruct_length,
100
- dao_rules.oracle_spend_delay,
101
- )
102
- return puzzle
103
-
104
-
105
- def get_proposal_validator(treasury_puz: Program, proposal_minimum_amount: uint64) -> Program:
106
- _, uncurried_args = treasury_puz.uncurry()
107
- validator: Program = uncurried_args.rest().first()
108
- validator_args = validator.uncurry()[1]
109
- (
110
- singleton_struct,
111
- proposal_self_hash,
112
- _,
113
- p2_puzhash,
114
- ) = validator_args.as_iter()
115
- proposal_validator = DAO_PROPOSAL_VALIDATOR_MOD.curry(
116
- singleton_struct,
117
- proposal_self_hash,
118
- proposal_minimum_amount,
119
- p2_puzhash,
120
- )
121
- return proposal_validator
122
-
123
-
124
- def get_update_proposal_puzzle(dao_rules: DAORules, proposal_validator: Program) -> Program:
125
- validator_args = uncurry_proposal_validator(proposal_validator)
126
- (
127
- singleton_struct,
128
- proposal_self_hash,
129
- _,
130
- proposal_excess_puzhash,
131
- ) = validator_args.as_iter()
132
- update_proposal = DAO_UPDATE_PROPOSAL_MOD.curry(
133
- DAO_TREASURY_MOD_HASH,
134
- DAO_PROPOSAL_VALIDATOR_MOD_HASH,
135
- singleton_struct,
136
- proposal_self_hash,
137
- dao_rules.proposal_minimum_amount,
138
- proposal_excess_puzhash,
139
- dao_rules.proposal_timelock,
140
- dao_rules.soft_close_length,
141
- dao_rules.attendance_required,
142
- dao_rules.pass_percentage,
143
- dao_rules.self_destruct_length,
144
- dao_rules.oracle_spend_delay,
145
- )
146
- return update_proposal
147
-
148
-
149
- def get_dao_rules_from_update_proposal(puzzle: Program) -> DAORules:
150
- mod, curried_args = puzzle.uncurry()
151
- if mod != DAO_UPDATE_PROPOSAL_MOD: # pragma: no cover
152
- raise ValueError("Not an update proposal.")
153
- (
154
- _,
155
- _,
156
- _,
157
- _,
158
- proposal_minimum_amount,
159
- _,
160
- proposal_timelock,
161
- soft_close_length,
162
- attendance_required,
163
- pass_percentage,
164
- self_destruct_length,
165
- oracle_spend_delay,
166
- ) = curried_args.as_iter()
167
- dao_rules = DAORules(
168
- uint64(proposal_timelock.as_int()),
169
- uint64(soft_close_length.as_int()),
170
- uint64(attendance_required.as_int()),
171
- uint64(pass_percentage.as_int()),
172
- uint64(self_destruct_length.as_int()),
173
- uint64(oracle_spend_delay.as_int()),
174
- uint64(proposal_minimum_amount.as_int()),
175
- )
176
- return dao_rules
177
-
178
-
179
- def get_spend_p2_singleton_puzzle(treasury_id: bytes32, xch_conditions: Program, asset_conditions: Program) -> Program:
180
- # TODO: typecheck get_spend_p2_singleton_puzzle arguments
181
- # TODO: add tests for get_spend_p2_singleton_puzzle: pass xch_conditions as Puzzle, List and ConditionWithArgs
182
- #
183
-
184
- # CAT_MOD_HASH
185
- # CONDITIONS ; XCH conditions, to be generated by the treasury
186
- # LIST_OF_TAILHASH_CONDITIONS ; the delegated puzzlehash must be curried in to the proposal.
187
- # ; Puzzlehash is only run in the last coin for that asset
188
- # ; ((TAIL_HASH CONDITIONS) (TAIL_HASH CONDITIONS)... )
189
- # P2_SINGLETON_VIA_DELEGATED_PUZZLE_PUZHASH
190
- treasury_struct = Program.to((SINGLETON_MOD_HASH, (treasury_id, SINGLETON_LAUNCHER_HASH)))
191
- puzzle: Program = SPEND_P2_SINGLETON_MOD.curry(
192
- treasury_struct,
193
- CAT_MOD_HASH,
194
- xch_conditions,
195
- asset_conditions,
196
- P2_SINGLETON_MOD.curry(treasury_struct, P2_SINGLETON_AGGREGATOR_MOD).get_tree_hash(),
197
- )
198
- return puzzle
199
-
200
-
201
- def get_p2_singleton_puzzle(treasury_id: bytes32, asset_id: Optional[bytes32] = None) -> Program:
202
- singleton_struct: Program = Program.to((SINGLETON_MOD_HASH, (treasury_id, SINGLETON_LAUNCHER_HASH)))
203
- inner_puzzle = P2_SINGLETON_MOD.curry(singleton_struct, P2_SINGLETON_AGGREGATOR_MOD)
204
- if asset_id:
205
- # CAT
206
- puzzle = CAT_MOD.curry(CAT_MOD_HASH, asset_id, inner_puzzle)
207
- return Program(puzzle)
208
- else:
209
- # XCH
210
- return inner_puzzle
211
-
212
-
213
- def get_p2_singleton_puzhash(treasury_id: bytes32, asset_id: Optional[bytes32] = None) -> bytes32:
214
- puz = get_p2_singleton_puzzle(treasury_id, asset_id)
215
- assert puz is not None
216
- return puz.get_tree_hash()
217
-
218
-
219
- def get_lockup_puzzle(
220
- cat_tail_hash: Union[bytes32, Program],
221
- previous_votes_list: Union[list[Optional[bytes32]], Program],
222
- innerpuz: Optional[Program],
223
- ) -> Program:
224
- self_hash: Program = DAO_LOCKUP_MOD.curry(
225
- SINGLETON_MOD_HASH,
226
- SINGLETON_LAUNCHER_HASH,
227
- DAO_FINISHED_STATE_HASH,
228
- CAT_MOD_HASH,
229
- cat_tail_hash,
230
- )
231
- puzzle = self_hash.curry(
232
- self_hash.get_tree_hash(),
233
- previous_votes_list, # TODO: maybe format check this in this function
234
- innerpuz,
235
- )
236
- return puzzle
237
-
238
-
239
- def add_proposal_to_active_list(
240
- lockup_puzzle: Program, proposal_id: bytes32, inner_puzzle: Optional[Program] = None
241
- ) -> Program:
242
- curried_args, c_a = uncurry_lockup(lockup_puzzle)
243
- (
244
- _SINGLETON_MOD_HASH,
245
- _SINGLETON_LAUNCHER_PUZHASH,
246
- _DAO_FINISHED_STATE_HASH,
247
- _CAT_MOD_HASH,
248
- CAT_TAIL_HASH,
249
- ) = c_a.as_iter()
250
- (_SELF_HASH, ACTIVE_VOTES, INNERPUZ) = curried_args.as_iter()
251
- new_active_votes = Program.to(proposal_id).cons(ACTIVE_VOTES) # (c proposal_id ACTIVE_VOTES)
252
- if inner_puzzle is None:
253
- inner_puzzle = INNERPUZ
254
- return get_lockup_puzzle(CAT_TAIL_HASH, new_active_votes, inner_puzzle)
255
-
256
-
257
- def get_active_votes_from_lockup_puzzle(lockup_puzzle: Program) -> Program:
258
- curried_args, c_a = uncurry_lockup(lockup_puzzle)
259
- (
260
- _SINGLETON_MOD_HASH,
261
- _SINGLETON_LAUNCHER_HASH,
262
- _DAO_FINISHED_STATE_HASH,
263
- _CAT_MOD_HASH,
264
- _CAT_TAIL_HASH,
265
- ) = list(c_a.as_iter())
266
- (
267
- _self_hash,
268
- ACTIVE_VOTES,
269
- _INNERPUZ,
270
- ) = curried_args.as_iter()
271
- return Program(ACTIVE_VOTES)
272
-
273
-
274
- def get_innerpuz_from_lockup_puzzle(lockup_puzzle: Program) -> Optional[Program]:
275
- try:
276
- curried_args, c_a = uncurry_lockup(lockup_puzzle)
277
- except Exception as e: # pragma: no cover
278
- log.debug("Could not uncurry inner puzzle from lockup: %s", e)
279
- return None
280
- (
281
- _SINGLETON_MOD_HASH,
282
- _SINGLETON_LAUNCHER_HASH,
283
- _DAO_FINISHED_STATE_HASH,
284
- _CAT_MOD_HASH,
285
- _CAT_TAIL_HASH,
286
- ) = list(c_a.as_iter())
287
- (
288
- _self_hash,
289
- _ACTIVE_VOTES,
290
- INNERPUZ,
291
- ) = list(curried_args.as_iter())
292
- return Program(INNERPUZ)
293
-
294
-
295
- def get_proposal_puzzle(
296
- *,
297
- proposal_id: bytes32,
298
- cat_tail_hash: bytes32,
299
- treasury_id: bytes32,
300
- votes_sum: uint64,
301
- total_votes: uint64,
302
- proposed_puzzle_hash: bytes32,
303
- ) -> Program:
304
- """
305
- spend_or_update_flag can take on the following values, ranked from safest to most dangerous:
306
- s for spend only
307
- u for update only
308
- d for dangerous (can do anything)
309
- """
310
- lockup_puzzle: Program = DAO_LOCKUP_MOD.curry(
311
- SINGLETON_MOD_HASH,
312
- SINGLETON_LAUNCHER_HASH,
313
- DAO_FINISHED_STATE_HASH,
314
- CAT_MOD_HASH,
315
- cat_tail_hash,
316
- )
317
- # SINGLETON_STRUCT ; (SINGLETON_MOD_HASH (SINGLETON_ID . LAUNCHER_PUZZLE_HASH))
318
- # PROPOSAL_TIMER_MOD_HASH ; proposal timer needs to know which proposal created it, AND
319
- # CAT_MOD_HASH
320
- # DAO_FINISHED_STATE_MOD_HASH
321
- # TREASURY_MOD_HASH
322
- # LOCKUP_SELF_HASH
323
- # CAT_TAIL_HASH
324
- # TREASURY_ID
325
- # ; second hash
326
- # SELF_HASH
327
- # PROPOSED_PUZ_HASH ; this is what runs if this proposal is successful - the inner puzzle of this proposal
328
- # YES_VOTES ; yes votes are +1, no votes don't tally - we compare yes_votes/total_votes at the end
329
- # TOTAL_VOTES ; how many people responded
330
- curry_one = DAO_PROPOSAL_MOD.curry(
331
- DAO_PROPOSAL_TIMER_MOD_HASH,
332
- SINGLETON_MOD_HASH,
333
- SINGLETON_LAUNCHER_HASH,
334
- CAT_MOD_HASH,
335
- DAO_FINISHED_STATE_HASH,
336
- DAO_TREASURY_MOD_HASH,
337
- lockup_puzzle.get_tree_hash(),
338
- cat_tail_hash,
339
- treasury_id,
340
- )
341
- puzzle = curry_one.curry(
342
- curry_one.get_tree_hash(),
343
- proposal_id,
344
- proposed_puzzle_hash,
345
- votes_sum,
346
- total_votes,
347
- )
348
- return puzzle
349
-
350
-
351
- def get_proposal_timer_puzzle(
352
- cat_tail_hash: bytes32,
353
- proposal_id: bytes32,
354
- treasury_id: bytes32,
355
- ) -> Program:
356
- parent_singleton_struct: Program = Program.to((SINGLETON_MOD_HASH, (proposal_id, SINGLETON_LAUNCHER_HASH)))
357
- lockup_puzzle: Program = DAO_LOCKUP_MOD.curry(
358
- SINGLETON_MOD_HASH,
359
- SINGLETON_LAUNCHER_HASH,
360
- DAO_FINISHED_STATE_HASH,
361
- CAT_MOD_HASH,
362
- cat_tail_hash,
363
- )
364
- PROPOSAL_SELF_HASH = DAO_PROPOSAL_MOD.curry(
365
- DAO_PROPOSAL_TIMER_MOD_HASH,
366
- SINGLETON_MOD_HASH,
367
- SINGLETON_LAUNCHER_HASH,
368
- CAT_MOD_HASH,
369
- DAO_FINISHED_STATE_HASH,
370
- DAO_TREASURY_MOD_HASH,
371
- lockup_puzzle.get_tree_hash(),
372
- cat_tail_hash,
373
- treasury_id,
374
- ).get_tree_hash()
375
-
376
- puzzle: Program = DAO_PROPOSAL_TIMER_MOD.curry(
377
- PROPOSAL_SELF_HASH,
378
- parent_singleton_struct,
379
- )
380
- return puzzle
381
-
382
-
383
- def get_treasury_rules_from_puzzle(puzzle_reveal: Optional[Program]) -> DAORules:
384
- assert isinstance(puzzle_reveal, Program)
385
- curried_args = uncurry_treasury(puzzle_reveal)
386
- (
387
- _DAO_TREASURY_MOD_HASH,
388
- proposal_validator,
389
- proposal_timelock,
390
- soft_close_length,
391
- attendance_required,
392
- pass_percentage,
393
- self_destruct_length,
394
- oracle_spend_delay,
395
- ) = curried_args
396
- curried_args_prg = uncurry_proposal_validator(proposal_validator)
397
- (
398
- _SINGLETON_STRUCT,
399
- _PROPOSAL_SELF_HASH,
400
- PROPOSAL_MINIMUM_AMOUNT,
401
- _PAYOUT_PUZHASH,
402
- ) = curried_args_prg.as_iter()
403
- return DAORules(
404
- uint64(proposal_timelock.as_int()),
405
- uint64(soft_close_length.as_int()),
406
- uint64(attendance_required.as_int()),
407
- uint64(pass_percentage.as_int()),
408
- uint64(self_destruct_length.as_int()),
409
- uint64(oracle_spend_delay.as_int()),
410
- uint64(PROPOSAL_MINIMUM_AMOUNT.as_int()),
411
- )
412
-
413
-
414
- # This takes the treasury puzzle and treasury solution, not the full puzzle and full solution
415
- # This also returns the treasury puzzle and not the full puzzle
416
- def get_new_puzzle_from_treasury_solution(puzzle_reveal: Program, solution: Program) -> Optional[Program]:
417
- if solution.rest().rest().first() != Program.to(0):
418
- # Proposal Spend
419
- mod, curried_args = solution.at("rrf").uncurry()
420
- if mod == DAO_UPDATE_PROPOSAL_MOD:
421
- (
422
- DAO_TREASURY_MOD_HASH,
423
- _DAO_VALIDATOR_MOD_HASH,
424
- TREASURY_SINGLETON_STRUCT,
425
- PROPOSAL_SELF_HASH,
426
- proposal_minimum_amount,
427
- PROPOSAL_EXCESS_PAYOUT_PUZ_HASH,
428
- proposal_timelock,
429
- soft_close_length,
430
- attendance_required,
431
- pass_percentage,
432
- self_destruct_length,
433
- oracle_spend_delay,
434
- ) = curried_args.as_iter()
435
- new_validator = DAO_PROPOSAL_VALIDATOR_MOD.curry(
436
- TREASURY_SINGLETON_STRUCT, PROPOSAL_SELF_HASH, proposal_minimum_amount, PROPOSAL_EXCESS_PAYOUT_PUZ_HASH
437
- )
438
- return DAO_TREASURY_MOD.curry(
439
- DAO_TREASURY_MOD_HASH,
440
- new_validator,
441
- proposal_timelock,
442
- soft_close_length,
443
- attendance_required,
444
- pass_percentage,
445
- self_destruct_length,
446
- oracle_spend_delay,
447
- )
448
- else:
449
- return puzzle_reveal
450
- else:
451
- # Oracle Spend - treasury is unchanged
452
- return puzzle_reveal
453
-
454
-
455
- # This takes the proposal puzzle and proposal solution, not the full puzzle and full solution
456
- # This also returns the proposal puzzle and not the full puzzle
457
- def get_new_puzzle_from_proposal_solution(puzzle_reveal: Program, solution: Program) -> Optional[Program]:
458
- # Check if soft_close_length is in solution. If not, then add votes, otherwise close proposal
459
- if len(solution.as_python()) == 1:
460
- return puzzle_reveal # we're finished, shortcut this function
461
-
462
- if solution.at("rrrrrrf") == Program.to(0):
463
- c_a, curried_args = uncurry_proposal(puzzle_reveal)
464
- assert isinstance(curried_args, Program)
465
- (
466
- _DAO_PROPOSAL_TIMER_MOD_HASH,
467
- _SINGLETON_MOD_HASH,
468
- _SINGLETON_LAUNCHER_PUZHASH,
469
- _CAT_MOD_HASH,
470
- _DAO_FINISHED_STATE_HASH,
471
- _DAO_TREASURY_MOD_HASH,
472
- _lockup_self_hash,
473
- cat_tail_hash,
474
- treasury_id,
475
- ) = curried_args.as_iter()
476
- assert isinstance(c_a, Program)
477
- (
478
- _curry_one,
479
- proposal_id,
480
- proposed_puzzle_hash,
481
- yes_votes,
482
- total_votes,
483
- ) = c_a.as_iter()
484
-
485
- added_votes = 0
486
- for vote_amount in solution.first().as_iter():
487
- added_votes += vote_amount.as_int()
488
-
489
- new_total_votes = total_votes.as_int() + added_votes
490
-
491
- if solution.at("rf") == Program.to(0):
492
- # Vote Type: NO
493
- new_yes_votes = yes_votes.as_int()
494
- else:
495
- # Vote Type: YES
496
- new_yes_votes = yes_votes.as_int() + added_votes
497
- return get_proposal_puzzle(
498
- proposal_id=bytes32(proposal_id.as_atom()),
499
- cat_tail_hash=bytes32(cat_tail_hash.as_atom()),
500
- treasury_id=bytes32(treasury_id.as_atom()),
501
- votes_sum=uint64(new_yes_votes),
502
- total_votes=uint64(new_total_votes),
503
- proposed_puzzle_hash=bytes32(proposed_puzzle_hash.as_atom()),
504
- )
505
- else:
506
- # we are in the finished state, puzzle is the same as ever
507
- mod, currieds = puzzle_reveal.uncurry() # uncurry to self_hash
508
- # check if our parent was the last non-finished state
509
- if mod.uncurry()[0] == DAO_PROPOSAL_MOD:
510
- c_a, curried_args = uncurry_proposal(puzzle_reveal)
511
- (
512
- _DAO_PROPOSAL_TIMER_MOD_HASH,
513
- _SINGLETON_MOD_HASH,
514
- _SINGLETON_LAUNCHER_PUZHASH,
515
- _CAT_MOD_HASH,
516
- _DAO_FINISHED_STATE_HASH,
517
- _DAO_TREASURY_MOD_HASH,
518
- _lockup_self_hash,
519
- cat_tail_hash,
520
- treasury_id,
521
- ) = curried_args.as_iter()
522
- (
523
- _curry_one,
524
- proposal_id,
525
- proposed_puzzle_hash,
526
- yes_votes,
527
- total_votes,
528
- ) = c_a.as_iter()
529
- else: # pragma: no cover
530
- SINGLETON_STRUCT, _dao_finished_hash = currieds.as_iter()
531
- proposal_id = SINGLETON_STRUCT.rest().first()
532
- return get_finished_state_inner_puzzle(bytes32(proposal_id.as_atom()))
533
-
534
-
535
- def get_finished_state_inner_puzzle(proposal_id: bytes32) -> Program:
536
- singleton_struct: Program = Program.to((SINGLETON_MOD_HASH, (proposal_id, SINGLETON_LAUNCHER_HASH)))
537
- finished_inner_puz: Program = DAO_FINISHED_STATE.curry(singleton_struct, DAO_FINISHED_STATE_HASH)
538
- return finished_inner_puz
539
-
540
-
541
- def get_finished_state_puzzle(proposal_id: bytes32) -> Program:
542
- return curry_singleton(proposal_id, get_finished_state_inner_puzzle(proposal_id))
543
-
544
-
545
- def get_proposed_puzzle_reveal_from_solution(solution: Program) -> Program:
546
- prog = Program.from_bytes(bytes(solution))
547
- return prog.at("rrfrrrrrf")
548
-
549
-
550
- def get_asset_id_from_puzzle(puzzle: Program) -> Optional[bytes32]:
551
- mod, curried_args = puzzle.uncurry()
552
- if mod == MOD: # pragma: no cover
553
- return None
554
- elif mod == CAT_MOD:
555
- return bytes32(curried_args.at("rf").as_atom())
556
- elif mod == SINGLETON_MOD: # pragma: no cover
557
- return bytes32(curried_args.at("frf").as_atom())
558
- else:
559
- raise ValueError("DAO received coin with unknown puzzle") # pragma: no cover
560
-
561
-
562
- def uncurry_proposal_validator(proposal_validator_program: Program) -> Program:
563
- try:
564
- mod, curried_args = proposal_validator_program.uncurry()
565
- except ValueError as e: # pragma: no cover
566
- log.debug("Cannot uncurry treasury puzzle: error: %s", e)
567
- raise e
568
-
569
- if mod != DAO_PROPOSAL_VALIDATOR_MOD: # pragma: no cover
570
- raise ValueError("Not a Treasury mod.")
571
- return curried_args
572
-
573
-
574
- def uncurry_treasury(treasury_puzzle: Program) -> list[Program]:
575
- try:
576
- mod, curried_args = treasury_puzzle.uncurry()
577
- except ValueError as e: # pragma: no cover
578
- log.debug("Cannot uncurry treasury puzzle: error: %s", e)
579
- raise e
580
-
581
- if mod != DAO_TREASURY_MOD: # pragma: no cover
582
- raise ValueError("Not a Treasury mod.")
583
- return list(curried_args.as_iter())
584
-
585
-
586
- def uncurry_proposal(proposal_puzzle: Program) -> tuple[Program, Program]:
587
- try:
588
- mod, curried_args = proposal_puzzle.uncurry()
589
- except ValueError as e: # pragma: no cover
590
- log.debug("Cannot uncurry proposal puzzle: error: %s", e)
591
- raise e
592
- try:
593
- mod, c_a = mod.uncurry()
594
- except ValueError as e: # pragma: no cover
595
- log.debug("Cannot uncurry lockup puzzle: error: %s", e)
596
- raise e
597
- if mod != DAO_PROPOSAL_MOD:
598
- raise ValueError("Not a dao proposal mod.")
599
- return curried_args, c_a
600
-
601
-
602
- def uncurry_lockup(lockup_puzzle: Program) -> tuple[Program, Program]:
603
- try:
604
- mod, curried_args = lockup_puzzle.uncurry()
605
- except ValueError as e: # pragma: no cover
606
- log.debug("Cannot uncurry lockup puzzle: error: %s", e)
607
- raise e
608
- try:
609
- mod, c_a = mod.uncurry()
610
- except ValueError as e: # pragma: no cover
611
- log.debug("Cannot uncurry lockup puzzle: error: %s", e)
612
- raise e
613
- if mod != DAO_LOCKUP_MOD:
614
- log.debug("Puzzle is not a dao cat lockup mod")
615
- return curried_args, c_a
616
-
617
-
618
- # This is the proposed puzzle
619
- def get_proposal_args(puzzle: Program) -> tuple[ProposalType, Program]:
620
- try:
621
- mod, curried_args = puzzle.uncurry()
622
- except ValueError as e: # pragma: no cover
623
- log.debug("Cannot uncurry spend puzzle: error: %s", e)
624
- raise e
625
- if mod == SPEND_P2_SINGLETON_MOD:
626
- return ProposalType.SPEND, curried_args
627
- elif mod == DAO_UPDATE_PROPOSAL_MOD:
628
- return ProposalType.UPDATE, curried_args
629
- else:
630
- raise ValueError("Unrecognised proposal type")
631
-
632
-
633
- def generate_cat_tail(genesis_coin_id: bytes32, treasury_id: bytes32) -> Program:
634
- dao_cat_launcher = create_cat_launcher_for_singleton_id(treasury_id).get_tree_hash()
635
- puzzle = DAO_CAT_TAIL.curry(genesis_coin_id, dao_cat_launcher)
636
- return puzzle
637
-
638
-
639
- def curry_singleton(singleton_id: bytes32, innerpuz: Program) -> Program:
640
- singleton_struct = Program.to((SINGLETON_MOD_HASH, (singleton_id, SINGLETON_LAUNCHER_HASH)))
641
- return SINGLETON_MOD.curry(singleton_struct, innerpuz)
642
-
643
-
644
- # This is for use in the WalletStateManager to determine the type of coin received
645
- def match_treasury_puzzle(mod: Program, curried_args: Program) -> Optional[Iterator[Program]]:
646
- """
647
- Given a puzzle test if it's a Treasury, if it is, return the curried arguments
648
- :param mod: Puzzle
649
- :param curried_args: Puzzle
650
- :return: Curried parameters
651
- """
652
- try:
653
- if mod == SINGLETON_MOD:
654
- mod, curried_args = curried_args.rest().first().uncurry()
655
- if mod == DAO_TREASURY_MOD:
656
- return curried_args.first().as_iter()
657
- except ValueError: # pragma: no cover
658
- # We just pass here to prevent spamming logs with error messages when WSM checks incoming coins
659
- pass
660
- return None
661
-
662
-
663
- # This is for use in the WalletStateManager to determine the type of coin received
664
- def match_proposal_puzzle(mod: Program, curried_args: Program) -> Optional[Iterator[Program]]:
665
- """
666
- Given a puzzle test if it's a Proposal, if it is, return the curried arguments
667
- :param curried_args: Puzzle
668
- :return: Curried parameters
669
- """
670
- try:
671
- if mod == SINGLETON_MOD:
672
- c_a, curried_args = uncurry_proposal(curried_args.rest().first())
673
- assert c_a is not None and curried_args is not None
674
- ret = chain(c_a.as_iter(), curried_args.as_iter())
675
- return ret
676
- except ValueError:
677
- # We just pass here to prevent spamming logs with error messages when WSM checks incoming coins
678
- pass
679
- return None
680
-
681
-
682
- def match_finished_puzzle(mod: Program, curried_args: Program) -> Optional[Iterator[Program]]:
683
- """
684
- Given a puzzle test if it's a Proposal, if it is, return the curried arguments
685
- :param curried_args: Puzzle
686
- :return: Curried parameters
687
- """
688
- try:
689
- if mod == SINGLETON_MOD:
690
- mod, curried_args = curried_args.rest().first().uncurry()
691
- if mod == DAO_FINISHED_STATE:
692
- return curried_args.as_iter()
693
- except ValueError: # pragma: no cover
694
- # We just pass here to prevent spamming logs with error messages when WSM checks incoming coins
695
- pass
696
- return None
697
-
698
-
699
- # This is used in WSM to determine whether we have a dao funding spend
700
- def match_funding_puzzle(
701
- uncurried: UncurriedPuzzle, solution: Program, coin: Coin, dao_ids: list[bytes32] = []
702
- ) -> Optional[bool]:
703
- if not dao_ids:
704
- return None
705
- try:
706
- if uncurried.mod == CAT_MOD:
707
- conditions = solution.at("frfr").as_iter()
708
- elif uncurried.mod == MOD:
709
- conditions = solution.at("rfr").as_iter()
710
- elif uncurried.mod == SINGLETON_MOD:
711
- inner_puz, _ = uncurried.args.at("rf").uncurry()
712
- if inner_puz == DAO_TREASURY_MOD:
713
- delegated_puz = solution.at("rrfrrf")
714
- _delegated_mod, delegated_args = delegated_puz.uncurry()
715
- if delegated_puz.uncurry()[0] == SPEND_P2_SINGLETON_MOD:
716
- if coin.puzzle_hash == delegated_args.at("rrrrf").as_atom(): # pragma: no cover
717
- return True
718
- return None # pragma: no cover
719
- else:
720
- return None
721
- fund_puzhashes = [get_p2_singleton_puzhash(dao_id) for dao_id in dao_ids]
722
- for cond in conditions:
723
- if (cond.list_len() == 4) and (cond.first().as_int() == 51):
724
- if cond.at("rrrff") in fund_puzhashes:
725
- return True
726
- except (ValueError, EvalError):
727
- # We just pass here to prevent spamming logs with error messages when WSM checks incoming coins
728
- pass
729
- return None
730
-
731
-
732
- def match_dao_cat_puzzle(uncurried: UncurriedPuzzle) -> Optional[Iterator[Program]]:
733
- try:
734
- if uncurried.mod == CAT_MOD:
735
- arg_list = list(uncurried.args.as_iter())
736
- inner_puz = get_innerpuz_from_lockup_puzzle(uncurried.args.at("rrf"))
737
- if inner_puz is not None:
738
- dao_cat_args: Iterator[Program] = Program.to(arg_list).as_iter()
739
- return dao_cat_args
740
- except ValueError:
741
- # We just pass here to prevent spamming logs with error messages when WSM checks incoming coins
742
- pass
743
- return None
744
-
745
-
746
- def generate_simple_proposal_innerpuz(
747
- treasury_id: bytes32,
748
- recipient_puzhashes: list[bytes32],
749
- amounts: list[uint64],
750
- asset_types: list[Optional[bytes32]] = [None],
751
- ) -> Program:
752
- if len(recipient_puzhashes) != len(amounts) != len(asset_types): # pragma: no cover
753
- raise ValueError("Mismatch in the number of recipients, amounts, or asset types")
754
- xch_conds: list[Any] = []
755
- cat_conds: list[Any] = []
756
- seen_assets = set()
757
- for recipient_puzhash, amount, asset_type in zip(recipient_puzhashes, amounts, asset_types):
758
- if asset_type:
759
- if asset_type in seen_assets:
760
- asset_conds = next(x for x in cat_conds if x[0] == asset_type)
761
- asset_conds[1].append([51, recipient_puzhash, amount, [recipient_puzhash]])
762
- else:
763
- cat_conds.append([asset_type, [[51, recipient_puzhash, amount, [recipient_puzhash]]]])
764
- seen_assets.add(asset_type)
765
- else:
766
- xch_conds.append([51, recipient_puzhash, amount])
767
- puzzle = get_spend_p2_singleton_puzzle(treasury_id, Program.to(xch_conds), Program.to(cat_conds))
768
- return puzzle
769
-
770
-
771
- async def generate_update_proposal_innerpuz(
772
- current_treasury_innerpuz: Program,
773
- new_dao_rules: DAORules,
774
- new_proposal_validator: Optional[Program] = None,
775
- ) -> Program:
776
- if not new_proposal_validator:
777
- assert isinstance(current_treasury_innerpuz, Program)
778
- new_proposal_validator = get_proposal_validator(
779
- current_treasury_innerpuz, new_dao_rules.proposal_minimum_amount
780
- )
781
- return get_update_proposal_puzzle(new_dao_rules, new_proposal_validator)
782
-
783
-
784
- async def generate_mint_proposal_innerpuz(
785
- treasury_id: bytes32,
786
- cat_tail_hash: bytes32,
787
- amount_of_cats_to_create: uint64,
788
- cats_new_innerpuzhash: bytes32,
789
- ) -> Program:
790
- if amount_of_cats_to_create % 2 == 1: # pragma: no cover
791
- raise ValueError("Minting proposals must mint an even number of CATs")
792
- cat_launcher = create_cat_launcher_for_singleton_id(treasury_id)
793
-
794
- # cat_wallet: CATWallet = self.wallet_state_manager.wallets[self.dao_info.cat_wallet_id]
795
- # cat_tail_hash = cat_wallet.cat_info.limitations_program_hash
796
- eve_puz_hash = curry_cat_eve(cats_new_innerpuzhash)
797
- full_puz = construct_cat_puzzle(CAT_MOD, cat_tail_hash, eve_puz_hash)
798
- xch_conditions = [
799
- [
800
- 51,
801
- cat_launcher.get_tree_hash(),
802
- uint64(amount_of_cats_to_create),
803
- [cats_new_innerpuzhash],
804
- ], # create cat_launcher coin
805
- [
806
- 60,
807
- Program.to([ProposalType.MINT.value, full_puz.get_tree_hash()]).get_tree_hash(),
808
- ], # make an announcement for the launcher to assert
809
- ]
810
- puzzle = get_spend_p2_singleton_puzzle(treasury_id, Program.to(xch_conditions), Program.to([]))
811
- return puzzle