chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__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 (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
chia/wallet/conditions.py CHANGED
@@ -1,10 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from abc import ABC, abstractmethod
4
+ from collections.abc import Iterable
4
5
  from dataclasses import dataclass, fields, replace
5
- from typing import Any, Dict, Iterable, List, Optional, Set, Tuple, Type, TypeVar, Union, final, get_type_hints
6
+ from typing import Any, ClassVar, Optional, TypeVar, Union, final, get_type_hints
6
7
 
7
- from chia_rs import G1Element
8
+ from chia_rs import Coin, G1Element
8
9
  from clvm.casts import int_from_bytes, int_to_bytes
9
10
 
10
11
  from chia.types.blockchain_format.program import Program
@@ -23,7 +24,7 @@ class Condition(Streamable, ABC):
23
24
 
24
25
  @classmethod
25
26
  @abstractmethod
26
- def from_program(cls: Type[_T_Condition], program: Program) -> _T_Condition: ...
27
+ def from_program(cls: type[_T_Condition], program: Program) -> _T_Condition: ...
27
28
 
28
29
 
29
30
  @final
@@ -226,7 +227,7 @@ class AggSigMe(Condition):
226
227
  class CreateCoin(Condition):
227
228
  puzzle_hash: bytes32
228
229
  amount: uint64
229
- memos: Optional[List[bytes]] = None
230
+ memos: Optional[list[bytes]] = None
230
231
 
231
232
  def to_program(self) -> Program:
232
233
  condition_args = [ConditionOpcode.CREATE_COIN, self.puzzle_hash, self.amount]
@@ -407,45 +408,230 @@ class CreatePuzzleAnnouncement(Condition):
407
408
  @final
408
409
  @streamable
409
410
  @dataclass(frozen=True)
410
- class SendMessage(Condition):
411
- mode: uint8
412
- msg: bytes
413
- args: Program
411
+ class MessageParticipant(Streamable):
412
+ mode_integer: Optional[uint8] = None
413
+ parent_id_committed: Optional[bytes32] = None
414
+ puzzle_hash_committed: Optional[bytes32] = None
415
+ amount_committed: Optional[uint64] = None
416
+ coin_id_committed: Optional[bytes32] = None
414
417
 
415
- def to_program(self) -> Program:
416
- condition: Program = Program.to([ConditionOpcode.SEND_MESSAGE, self.mode, self.msg, self.args])
417
- return condition
418
+ def __post_init__(self) -> None:
419
+ if (
420
+ self.parent_id_committed is None
421
+ and self.puzzle_hash_committed is None
422
+ and self.amount_committed is None
423
+ and self.coin_id_committed is None
424
+ and self.mode_integer is None
425
+ ):
426
+ raise ValueError("Must specify at least one committment. Anyone-can-send/recieve is not allowed.")
427
+ if self.coin_id_committed is not None:
428
+ if self.parent_id_committed is None or self.puzzle_hash_committed is None or self.amount_committed is None:
429
+ if not (
430
+ self.parent_id_committed is None
431
+ and self.puzzle_hash_committed is None
432
+ and self.amount_committed is None
433
+ ):
434
+ raise ValueError(
435
+ "Cannot commit to coin_id and only specify some of the other arguments. "
436
+ "You must specify all or none of them."
437
+ )
438
+ else:
439
+ assert (
440
+ Coin(
441
+ parent_coin_info=self.parent_id_committed,
442
+ puzzle_hash=self.puzzle_hash_committed,
443
+ amount=self.amount_committed,
444
+ ).name()
445
+ == self.coin_id_committed
446
+ ), "The value for coin_id_committed must be equal to the implied ID of the other three arguments"
447
+ if self.mode_integer is not None:
448
+ assert (
449
+ self.mode == self.mode_integer
450
+ ), "If mode_integer is manually specified, you must specify committments that match with the mode"
451
+
452
+ @property
453
+ def _nothing_committed(self) -> bool:
454
+ return (
455
+ self.coin_id_committed is None
456
+ and self.parent_id_committed is None
457
+ and self.puzzle_hash_committed is None
458
+ and self.amount_committed is None
459
+ )
460
+
461
+ @property
462
+ def mode(self) -> uint8:
463
+ if self._nothing_committed:
464
+ # The non-None-ness of this is asserted by __post_init__
465
+ return self.mode_integer # type: ignore[return-value]
466
+ if self.coin_id_committed is not None:
467
+ return uint8(0b111)
468
+
469
+ def convert_noneness_to_bit(maybe_none: Optional[Any]) -> int:
470
+ return 1 if maybe_none is not None else 0
471
+
472
+ return uint8(
473
+ (convert_noneness_to_bit(self.parent_id_committed) << 2)
474
+ | (convert_noneness_to_bit(self.puzzle_hash_committed) << 1)
475
+ | convert_noneness_to_bit(self.amount_committed)
476
+ )
477
+
478
+ @property
479
+ def necessary_args(self) -> list[Program]:
480
+ if self._nothing_committed:
481
+ raise ValueError("Cannot generate necessary_args for a participant without committment information")
482
+
483
+ if self.coin_id_committed:
484
+ return [Program.to(self.coin_id_committed)]
485
+
486
+ condition_args = []
487
+ if self.parent_id_committed is not None:
488
+ condition_args.append(Program.to(self.parent_id_committed))
489
+ if self.puzzle_hash_committed is not None:
490
+ condition_args.append(Program.to(self.puzzle_hash_committed))
491
+ if self.amount_committed is not None:
492
+ condition_args.append(Program.to(self.amount_committed))
493
+ return condition_args
418
494
 
419
495
  @classmethod
420
- def from_program(cls, program: Program) -> SendMessage:
496
+ def from_mode_and_maybe_args(
497
+ cls, sender: bool, full_mode: uint8, args: Optional[Iterable[Program]] = None
498
+ ) -> MessageParticipant:
499
+ if sender:
500
+ mode = full_mode >> 3
501
+ else:
502
+ mode = full_mode & 0b000111
503
+
504
+ if args is None:
505
+ return cls(mode_integer=uint8(mode))
506
+
507
+ if mode == 0b111:
508
+ return cls(mode_integer=uint8(mode), coin_id_committed=next(bytes32(arg.as_atom()) for arg in args))
509
+
510
+ parent_id_committed: Optional[bytes32] = None
511
+ puzzle_hash_committed: Optional[bytes32] = None
512
+ amount_committed: Optional[uint64] = None
513
+ # This loop probably looks a little strange
514
+ # It's trying to account for the fact that the arguments may be any 1 or 2 of these arguments in this order
515
+ # Not sure of a more elgant way to do it
516
+ original_mode = mode
517
+ for arg in args:
518
+ if mode & 0b100:
519
+ parent_id_committed = bytes32(arg.as_atom())
520
+ mode &= 0b011
521
+ continue
522
+ if mode & 0b010:
523
+ puzzle_hash_committed = bytes32(arg.as_atom())
524
+ mode &= 0b101
525
+ continue
526
+ if mode & 0b001:
527
+ amount_committed = uint64(arg.as_int())
528
+ break
529
+
421
530
  return cls(
422
- uint8(program.at("rf").as_int()),
423
- program.at("rrf").as_atom(),
424
- program.at("rrrf"),
531
+ mode_integer=uint8(original_mode),
532
+ parent_id_committed=parent_id_committed,
533
+ puzzle_hash_committed=puzzle_hash_committed,
534
+ amount_committed=amount_committed,
425
535
  )
426
536
 
427
537
 
428
- @final
538
+ _T_MessageCondition = TypeVar("_T_MessageCondition", bound="SendMessage")
539
+
540
+
429
541
  @streamable
430
542
  @dataclass(frozen=True)
431
- class ReceiveMessage(Condition):
432
- mode: uint8
543
+ class SendMessage(Condition):
433
544
  msg: bytes
434
- args: Program
545
+ var_args: Optional[list[Program]] = None
546
+ mode_integer: Optional[uint8] = None
547
+ sender: Optional[MessageParticipant] = None
548
+ receiver: Optional[MessageParticipant] = None
549
+ _other_party_is_receiver: ClassVar[bool] = True
550
+
551
+ @property
552
+ def _other_party(self) -> Optional[MessageParticipant]:
553
+ return self.receiver
554
+
555
+ @property
556
+ def _opcode(self) -> ConditionOpcode:
557
+ return ConditionOpcode.SEND_MESSAGE
558
+
559
+ def __post_init__(self) -> None:
560
+ if self.mode_integer is None and (self.sender is None or self.receiver is None):
561
+ raise ValueError("Must specify either mode_integer or both sender and reciever")
562
+
563
+ if self.mode_integer is not None and self.sender is not None:
564
+ assert (
565
+ self.mode_integer >> 3 == self.sender.mode
566
+ ), "The first 3 bits of mode_integer don't match the sender's mode"
567
+
568
+ if self.mode_integer is not None and self.receiver is not None:
569
+ assert (
570
+ self.mode_integer & 0b000111 == self.receiver.mode
571
+ ), "The last 3 bits of mode_integer don't match the receiver's mode"
572
+
573
+ if self.var_args is None and self._other_party is None:
574
+ raise ValueError(
575
+ f"Must specify either var_args or {'receiver' if self._other_party_is_receiver else 'sender'}"
576
+ )
577
+
578
+ if self.var_args is not None and self._other_party is not None and not self._other_party._nothing_committed:
579
+ assert (
580
+ self.var_args == self._other_party.necessary_args
581
+ ), f"The implied arguments for {self._other_party} do not match the specified arguments {self.var_args}"
582
+
583
+ @property
584
+ def args(self) -> list[Program]:
585
+ if self.var_args is not None:
586
+ return self.var_args
587
+
588
+ # The non-None-ness of this is asserted in __post_init__
589
+ return self._other_party.necessary_args # type: ignore[union-attr]
590
+
591
+ @property
592
+ def mode(self) -> uint8:
593
+ if self.mode_integer is not None:
594
+ return self.mode_integer
595
+
596
+ # The non-None-ness of these are asserted in __post_init__
597
+ return uint8((self.sender.mode << 3) | self.receiver.mode) # type: ignore[union-attr]
435
598
 
436
599
  def to_program(self) -> Program:
437
- condition: Program = Program.to([ConditionOpcode.RECEIVE_MESSAGE, self.mode, self.msg, self.args])
600
+ condition: Program = Program.to([self._opcode, self.mode, self.msg, *self.args])
438
601
  return condition
439
602
 
440
603
  @classmethod
441
- def from_program(cls, program: Program) -> ReceiveMessage:
604
+ def from_program(cls: type[_T_MessageCondition], program: Program) -> _T_MessageCondition:
605
+ full_mode = uint8(program.at("rf").as_int())
606
+ var_args = list(program.at("rrr").as_iter())
442
607
  return cls(
443
- uint8(program.at("rf").as_int()),
444
608
  program.at("rrf").as_atom(),
445
- program.at("rrrf"),
609
+ var_args,
610
+ full_mode,
611
+ MessageParticipant.from_mode_and_maybe_args(
612
+ True, full_mode, var_args if not cls._other_party_is_receiver else None
613
+ ),
614
+ MessageParticipant.from_mode_and_maybe_args(
615
+ False, full_mode, var_args if cls._other_party_is_receiver else None
616
+ ),
446
617
  )
447
618
 
448
619
 
620
+ @final
621
+ @streamable
622
+ @dataclass(frozen=True)
623
+ class ReceiveMessage(SendMessage):
624
+ _other_party_is_receiver: ClassVar[bool] = False
625
+
626
+ @property
627
+ def _other_party(self) -> Optional[MessageParticipant]:
628
+ return self.sender
629
+
630
+ @property
631
+ def _opcode(self) -> ConditionOpcode:
632
+ return ConditionOpcode.RECEIVE_MESSAGE
633
+
634
+
449
635
  @final
450
636
  @streamable
451
637
  @dataclass(frozen=True)
@@ -736,7 +922,7 @@ class AssertBeforeHeightAbsolute(Condition):
736
922
  @dataclass(frozen=True)
737
923
  class Softfork(Condition):
738
924
  cost: uint64
739
- conditions: List[Program]
925
+ conditions: list[Program]
740
926
 
741
927
  def to_program(self) -> Program:
742
928
  condition: Program = Program.to([ConditionOpcode.SOFTFORK, self.cost, self.conditions])
@@ -772,7 +958,7 @@ class Remark(Condition):
772
958
  @dataclass(frozen=True)
773
959
  class UnknownCondition(Condition):
774
960
  opcode: Program
775
- args: List[Program]
961
+ args: list[Program]
776
962
 
777
963
  def to_program(self) -> Program:
778
964
  return self.opcode.cons(Program.to(self.args))
@@ -811,7 +997,7 @@ class AggSig(Condition):
811
997
  condition_driver.pubkey, # type: ignore[attr-defined]
812
998
  condition_driver.msg, # type: ignore[attr-defined]
813
999
  opcode,
814
- **{key: value for key, value in condition_driver.__dict__.items() if key not in ["pubkey", "msg"]},
1000
+ **{key: value for key, value in condition_driver.__dict__.items() if key not in {"pubkey", "msg"}},
815
1001
  )
816
1002
 
817
1003
 
@@ -923,15 +1109,15 @@ TIMELOCK_TYPES = Union[
923
1109
  ]
924
1110
 
925
1111
 
926
- TIMELOCK_DRIVERS: Tuple[
927
- Type[TIMELOCK_TYPES],
928
- Type[TIMELOCK_TYPES],
929
- Type[TIMELOCK_TYPES],
930
- Type[TIMELOCK_TYPES],
931
- Type[TIMELOCK_TYPES],
932
- Type[TIMELOCK_TYPES],
933
- Type[TIMELOCK_TYPES],
934
- Type[TIMELOCK_TYPES],
1112
+ TIMELOCK_DRIVERS: tuple[
1113
+ type[TIMELOCK_TYPES],
1114
+ type[TIMELOCK_TYPES],
1115
+ type[TIMELOCK_TYPES],
1116
+ type[TIMELOCK_TYPES],
1117
+ type[TIMELOCK_TYPES],
1118
+ type[TIMELOCK_TYPES],
1119
+ type[TIMELOCK_TYPES],
1120
+ type[TIMELOCK_TYPES],
935
1121
  ] = (
936
1122
  AssertSecondsRelative,
937
1123
  AssertHeightRelative,
@@ -942,46 +1128,46 @@ TIMELOCK_DRIVERS: Tuple[
942
1128
  AssertBeforeSecondsAbsolute,
943
1129
  AssertBeforeHeightAbsolute,
944
1130
  )
945
- SECONDS_TIMELOCK_DRIVERS: Set[Type[TIMELOCK_TYPES]] = {
1131
+ SECONDS_TIMELOCK_DRIVERS: set[type[TIMELOCK_TYPES]] = {
946
1132
  AssertSecondsRelative,
947
1133
  AssertSecondsAbsolute,
948
1134
  AssertBeforeSecondsRelative,
949
1135
  AssertBeforeSecondsAbsolute,
950
1136
  }
951
- HEIGHT_TIMELOCK_DRIVERS: Set[Type[TIMELOCK_TYPES]] = {
1137
+ HEIGHT_TIMELOCK_DRIVERS: set[type[TIMELOCK_TYPES]] = {
952
1138
  AssertHeightRelative,
953
1139
  AssertHeightAbsolute,
954
1140
  AssertBeforeHeightRelative,
955
1141
  AssertBeforeHeightAbsolute,
956
1142
  }
957
- AFTER_TIMELOCK_DRIVERS: Set[Type[TIMELOCK_TYPES]] = {
1143
+ AFTER_TIMELOCK_DRIVERS: set[type[TIMELOCK_TYPES]] = {
958
1144
  AssertSecondsRelative,
959
1145
  AssertHeightRelative,
960
1146
  AssertSecondsAbsolute,
961
1147
  AssertHeightAbsolute,
962
1148
  }
963
- BEFORE_TIMELOCK_DRIVERS: Set[Type[TIMELOCK_TYPES]] = {
1149
+ BEFORE_TIMELOCK_DRIVERS: set[type[TIMELOCK_TYPES]] = {
964
1150
  AssertBeforeSecondsRelative,
965
1151
  AssertBeforeHeightRelative,
966
1152
  AssertBeforeSecondsAbsolute,
967
1153
  AssertBeforeHeightAbsolute,
968
1154
  }
969
- RELATIVE_TIMELOCK_DRIVERS: Set[Type[TIMELOCK_TYPES]] = {
1155
+ RELATIVE_TIMELOCK_DRIVERS: set[type[TIMELOCK_TYPES]] = {
970
1156
  AssertSecondsRelative,
971
1157
  AssertHeightRelative,
972
1158
  AssertBeforeSecondsRelative,
973
1159
  AssertBeforeHeightRelative,
974
1160
  }
975
- ABSOLUTE_TIMELOCK_DRIVERS: Set[Type[TIMELOCK_TYPES]] = {
1161
+ ABSOLUTE_TIMELOCK_DRIVERS: set[type[TIMELOCK_TYPES]] = {
976
1162
  AssertSecondsAbsolute,
977
1163
  AssertHeightAbsolute,
978
1164
  AssertBeforeSecondsAbsolute,
979
1165
  AssertBeforeHeightAbsolute,
980
1166
  }
981
- TIMELOCK_DRIVERS_SET: Set[Type[TIMELOCK_TYPES]] = set(TIMELOCK_DRIVERS)
1167
+ TIMELOCK_DRIVERS_SET: set[type[TIMELOCK_TYPES]] = set(TIMELOCK_DRIVERS)
982
1168
 
983
1169
 
984
- TIMELOCK_OPCODES: Set[bytes] = {
1170
+ TIMELOCK_OPCODES: set[bytes] = {
985
1171
  ConditionOpcode.ASSERT_SECONDS_RELATIVE.value,
986
1172
  ConditionOpcode.ASSERT_HEIGHT_RELATIVE.value,
987
1173
  ConditionOpcode.ASSERT_SECONDS_ABSOLUTE.value,
@@ -991,37 +1177,37 @@ TIMELOCK_OPCODES: Set[bytes] = {
991
1177
  ConditionOpcode.ASSERT_BEFORE_SECONDS_ABSOLUTE.value,
992
1178
  ConditionOpcode.ASSERT_BEFORE_HEIGHT_ABSOLUTE.value,
993
1179
  }
994
- SECONDS_TIMELOCK_OPCODES: Set[bytes] = {
1180
+ SECONDS_TIMELOCK_OPCODES: set[bytes] = {
995
1181
  ConditionOpcode.ASSERT_SECONDS_RELATIVE.value,
996
1182
  ConditionOpcode.ASSERT_SECONDS_ABSOLUTE.value,
997
1183
  ConditionOpcode.ASSERT_BEFORE_SECONDS_RELATIVE.value,
998
1184
  ConditionOpcode.ASSERT_BEFORE_SECONDS_ABSOLUTE.value,
999
1185
  }
1000
- HEIGHT_TIMELOCK_OPCODES: Set[bytes] = {
1186
+ HEIGHT_TIMELOCK_OPCODES: set[bytes] = {
1001
1187
  ConditionOpcode.ASSERT_HEIGHT_RELATIVE.value,
1002
1188
  ConditionOpcode.ASSERT_HEIGHT_ABSOLUTE.value,
1003
1189
  ConditionOpcode.ASSERT_BEFORE_HEIGHT_RELATIVE.value,
1004
1190
  ConditionOpcode.ASSERT_BEFORE_HEIGHT_ABSOLUTE.value,
1005
1191
  }
1006
- AFTER_TIMELOCK_OPCODES: Set[bytes] = {
1192
+ AFTER_TIMELOCK_OPCODES: set[bytes] = {
1007
1193
  ConditionOpcode.ASSERT_SECONDS_RELATIVE.value,
1008
1194
  ConditionOpcode.ASSERT_HEIGHT_RELATIVE.value,
1009
1195
  ConditionOpcode.ASSERT_SECONDS_ABSOLUTE.value,
1010
1196
  ConditionOpcode.ASSERT_HEIGHT_ABSOLUTE.value,
1011
1197
  }
1012
- BEFORE_TIMELOCK_OPCODES: Set[bytes] = {
1198
+ BEFORE_TIMELOCK_OPCODES: set[bytes] = {
1013
1199
  ConditionOpcode.ASSERT_BEFORE_SECONDS_RELATIVE.value,
1014
1200
  ConditionOpcode.ASSERT_BEFORE_HEIGHT_RELATIVE.value,
1015
1201
  ConditionOpcode.ASSERT_BEFORE_SECONDS_ABSOLUTE.value,
1016
1202
  ConditionOpcode.ASSERT_BEFORE_HEIGHT_ABSOLUTE.value,
1017
1203
  }
1018
- RELATIVE_TIMELOCK_OPCODES: Set[bytes] = {
1204
+ RELATIVE_TIMELOCK_OPCODES: set[bytes] = {
1019
1205
  ConditionOpcode.ASSERT_SECONDS_RELATIVE.value,
1020
1206
  ConditionOpcode.ASSERT_HEIGHT_RELATIVE.value,
1021
1207
  ConditionOpcode.ASSERT_BEFORE_SECONDS_RELATIVE.value,
1022
1208
  ConditionOpcode.ASSERT_BEFORE_HEIGHT_RELATIVE.value,
1023
1209
  }
1024
- ABSOLUTE_TIMELOCK_OPCODES: Set[bytes] = {
1210
+ ABSOLUTE_TIMELOCK_OPCODES: set[bytes] = {
1025
1211
  ConditionOpcode.ASSERT_SECONDS_ABSOLUTE.value,
1026
1212
  ConditionOpcode.ASSERT_HEIGHT_ABSOLUTE.value,
1027
1213
  ConditionOpcode.ASSERT_BEFORE_SECONDS_ABSOLUTE.value,
@@ -1054,7 +1240,7 @@ class Timelock(Condition):
1054
1240
  else:
1055
1241
  potential_drivers -= SECONDS_TIMELOCK_DRIVERS
1056
1242
 
1057
- driver: Type[TIMELOCK_TYPES] = next(iter(potential_drivers))
1243
+ driver: type[TIMELOCK_TYPES] = next(iter(potential_drivers))
1058
1244
 
1059
1245
  if self.seconds_not_height:
1060
1246
  # Semantics here mean that we're assuredly passing a uint64 to a class that expects it
@@ -1089,7 +1275,7 @@ class Timelock(Condition):
1089
1275
  )
1090
1276
 
1091
1277
 
1092
- CONDITION_DRIVERS: Dict[bytes, Type[Condition]] = {
1278
+ CONDITION_DRIVERS: dict[bytes, type[Condition]] = {
1093
1279
  ConditionOpcode.AGG_SIG_PARENT.value: AggSigParent,
1094
1280
  ConditionOpcode.AGG_SIG_PUZZLE.value: AggSigPuzzle,
1095
1281
  ConditionOpcode.AGG_SIG_AMOUNT.value: AggSigAmount,
@@ -1126,10 +1312,10 @@ CONDITION_DRIVERS: Dict[bytes, Type[Condition]] = {
1126
1312
  ConditionOpcode.SOFTFORK.value: Softfork,
1127
1313
  ConditionOpcode.REMARK.value: Remark,
1128
1314
  }
1129
- DRIVERS_TO_OPCODES: Dict[Type[Condition], bytes] = {v: k for k, v in CONDITION_DRIVERS.items()}
1315
+ DRIVERS_TO_OPCODES: dict[type[Condition], bytes] = {v: k for k, v in CONDITION_DRIVERS.items()}
1130
1316
 
1131
1317
 
1132
- CONDITION_DRIVERS_W_ABSTRACTIONS: Dict[bytes, Type[Condition]] = {
1318
+ CONDITION_DRIVERS_W_ABSTRACTIONS: dict[bytes, type[Condition]] = {
1133
1319
  ConditionOpcode.AGG_SIG_PARENT.value: AggSig,
1134
1320
  ConditionOpcode.AGG_SIG_PUZZLE.value: AggSig,
1135
1321
  ConditionOpcode.AGG_SIG_AMOUNT.value: AggSig,
@@ -1171,11 +1357,11 @@ CONDITION_DRIVERS_W_ABSTRACTIONS: Dict[bytes, Type[Condition]] = {
1171
1357
  def parse_conditions_non_consensus(
1172
1358
  conditions: Iterable[Program],
1173
1359
  abstractions: bool = True, # Use abstractions like *Announcement or Timelock instead of specific condition class
1174
- ) -> List[Condition]:
1175
- driver_dictionary: Dict[bytes, Type[Condition]] = (
1360
+ ) -> list[Condition]:
1361
+ driver_dictionary: dict[bytes, type[Condition]] = (
1176
1362
  CONDITION_DRIVERS_W_ABSTRACTIONS if abstractions else CONDITION_DRIVERS
1177
1363
  )
1178
- final_condition_list: List[Condition] = []
1364
+ final_condition_list: list[Condition] = []
1179
1365
  for condition in conditions:
1180
1366
  try:
1181
1367
  final_condition_list.append(driver_dictionary[condition.at("f").as_atom()].from_program(condition))
@@ -1185,8 +1371,8 @@ def parse_conditions_non_consensus(
1185
1371
  return final_condition_list
1186
1372
 
1187
1373
 
1188
- def conditions_from_json_dicts(conditions: Iterable[Dict[str, Any]]) -> List[Condition]:
1189
- final_condition_list: List[Condition] = []
1374
+ def conditions_from_json_dicts(conditions: Iterable[dict[str, Any]]) -> list[Condition]:
1375
+ final_condition_list: list[Condition] = []
1190
1376
  for condition in conditions:
1191
1377
  opcode_specified: Union[str, int] = condition["opcode"]
1192
1378
  if isinstance(opcode_specified, str):
@@ -1209,7 +1395,7 @@ def conditions_from_json_dicts(conditions: Iterable[Dict[str, Any]]) -> List[Con
1209
1395
  return final_condition_list
1210
1396
 
1211
1397
 
1212
- def conditions_to_json_dicts(conditions: Iterable[Condition]) -> List[Dict[str, Any]]:
1398
+ def conditions_to_json_dicts(conditions: Iterable[Condition]) -> list[dict[str, Any]]:
1213
1399
  return [
1214
1400
  {
1215
1401
  "opcode": int_from_bytes(DRIVERS_TO_OPCODES[condition.__class__]),
@@ -1231,8 +1417,8 @@ class ConditionValidTimes(Streamable):
1231
1417
  max_blocks_after_created: Optional[uint32] = None # ASSERT_BEFORE_HEIGHT_RELATIVE
1232
1418
  max_height: Optional[uint32] = None # ASSERT_BEFORE_HEIGHT_ABSOLUTE
1233
1419
 
1234
- def to_conditions(self) -> List[Condition]:
1235
- final_condition_list: List[Condition] = []
1420
+ def to_conditions(self) -> list[Condition]:
1421
+ final_condition_list: list[Condition] = []
1236
1422
  if self.min_secs_since_created is not None:
1237
1423
  final_condition_list.append(AssertSecondsRelative(self.min_secs_since_created))
1238
1424
  if self.min_time is not None:
@@ -1254,7 +1440,7 @@ class ConditionValidTimes(Streamable):
1254
1440
 
1255
1441
 
1256
1442
  condition_valid_times_hints = get_type_hints(ConditionValidTimes)
1257
- condition_valid_times_types: Dict[str, Type[int]] = {}
1443
+ condition_valid_times_types: dict[str, type[int]] = {}
1258
1444
  for field in fields(ConditionValidTimes):
1259
1445
  hint = condition_valid_times_hints[field.name]
1260
1446
  [type_] = [type_ for type_ in hint.__args__ if type_ is not type(None)]
@@ -1262,23 +1448,23 @@ for field in fields(ConditionValidTimes):
1262
1448
 
1263
1449
 
1264
1450
  # Properties of the dataclass above, grouped by their property
1265
- SECONDS_PROPERTIES: Set[str] = {"min_secs_since_created", "min_time", "max_secs_after_created", "max_time"}
1266
- HEIGHT_PROPERTIES: Set[str] = {"min_blocks_since_created", "min_height", "max_blocks_after_created", "max_height"}
1267
- AFTER_PROPERTIES: Set[str] = {"min_blocks_since_created", "min_height", "min_secs_since_created", "min_time"}
1268
- BEFORE_PROPERTIES: Set[str] = {"max_blocks_after_created", "max_height", "max_secs_after_created", "max_time"}
1269
- RELATIVE_PROPERTIES: Set[str] = {
1451
+ SECONDS_PROPERTIES: set[str] = {"min_secs_since_created", "min_time", "max_secs_after_created", "max_time"}
1452
+ HEIGHT_PROPERTIES: set[str] = {"min_blocks_since_created", "min_height", "max_blocks_after_created", "max_height"}
1453
+ AFTER_PROPERTIES: set[str] = {"min_blocks_since_created", "min_height", "min_secs_since_created", "min_time"}
1454
+ BEFORE_PROPERTIES: set[str] = {"max_blocks_after_created", "max_height", "max_secs_after_created", "max_time"}
1455
+ RELATIVE_PROPERTIES: set[str] = {
1270
1456
  "min_blocks_since_created",
1271
1457
  "min_secs_since_created",
1272
1458
  "max_secs_after_created",
1273
1459
  "max_blocks_after_created",
1274
1460
  }
1275
- ABSOLUTE_PROPERTIES: Set[str] = {"min_time", "max_time", "min_height", "max_height"}
1276
- ALL_PROPERTIES: Set[str] = SECONDS_PROPERTIES | HEIGHT_PROPERTIES
1461
+ ABSOLUTE_PROPERTIES: set[str] = {"min_time", "max_time", "min_height", "max_height"}
1462
+ ALL_PROPERTIES: set[str] = SECONDS_PROPERTIES | HEIGHT_PROPERTIES
1277
1463
 
1278
1464
 
1279
1465
  def parse_timelock_info(conditions: Iterable[Condition]) -> ConditionValidTimes:
1280
1466
  valid_times: ConditionValidTimes = ConditionValidTimes()
1281
- properties: Set[str] = ALL_PROPERTIES.copy()
1467
+ properties: set[str] = ALL_PROPERTIES.copy()
1282
1468
  for condition in conditions:
1283
1469
  if isinstance(condition, TIMELOCK_DRIVERS):
1284
1470
  timelock: Timelock = Timelock.from_program(condition.to_program())
@@ -1319,7 +1505,7 @@ def parse_timelock_info(conditions: Iterable[Condition]) -> ConditionValidTimes:
1319
1505
  new_value = timelock.timestamp
1320
1506
 
1321
1507
  final_type = condition_valid_times_types[final_property]
1322
- replacement: Dict[str, int] = {final_property: final_type(new_value)}
1508
+ replacement: dict[str, int] = {final_property: final_type(new_value)}
1323
1509
  # the type is enforced above
1324
1510
  valid_times = replace(valid_times, **replacement) # type: ignore[arg-type]
1325
1511
 
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
4
  from enum import Enum
5
- from typing import List, Optional, Tuple
5
+ from typing import Optional
6
6
 
7
7
  from chia.types.blockchain_format.coin import Coin
8
8
  from chia.types.blockchain_format.program import Program
@@ -33,13 +33,13 @@ class DAOInfo(Streamable):
33
33
  treasury_id: bytes32
34
34
  cat_wallet_id: uint32
35
35
  dao_cat_wallet_id: uint32
36
- proposals_list: List[ProposalInfo]
37
- parent_info: List[Tuple[bytes32, Optional[LineageProof]]] # {coin.name(): LineageProof}
36
+ proposals_list: list[ProposalInfo]
37
+ parent_info: list[tuple[bytes32, Optional[LineageProof]]] # {coin.name(): LineageProof}
38
38
  current_treasury_coin: Optional[Coin]
39
39
  current_treasury_innerpuz: Optional[Program]
40
40
  singleton_block_height: uint32 # the block height that the current treasury singleton was created in
41
41
  filter_below_vote_amount: uint64 # we ignore proposals with fewer votes than this - defaults to 1
42
- assets: List[Optional[bytes32]]
42
+ assets: list[Optional[bytes32]]
43
43
  current_height: uint64
44
44
 
45
45