chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.5.8rc1__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 (528) hide show
  1. chia/__init__.py +8 -4
  2. chia/_tests/blockchain/blockchain_test_utils.py +6 -8
  3. chia/_tests/blockchain/test_augmented_chain.py +4 -4
  4. chia/_tests/blockchain/test_blockchain.py +165 -190
  5. chia/_tests/blockchain/test_build_chains.py +2 -4
  6. chia/_tests/blockchain/test_get_block_generator.py +2 -3
  7. chia/_tests/clvm/coin_store.py +4 -7
  8. chia/_tests/clvm/test_clvm_step.py +4 -4
  9. chia/_tests/clvm/test_puzzle_compression.py +2 -1
  10. chia/_tests/clvm/test_puzzle_drivers.py +2 -2
  11. chia/_tests/clvm/test_singletons.py +2 -4
  12. chia/_tests/clvm/test_spend_sim.py +2 -2
  13. chia/_tests/cmds/cmd_test_utils.py +27 -45
  14. chia/_tests/cmds/test_cmd_framework.py +6 -6
  15. chia/_tests/cmds/test_daemon.py +3 -3
  16. chia/_tests/cmds/test_show.py +4 -4
  17. chia/_tests/cmds/test_tx_config_args.py +1 -2
  18. chia/_tests/cmds/testing_classes.py +4 -5
  19. chia/_tests/cmds/wallet/test_did.py +24 -27
  20. chia/_tests/cmds/wallet/test_nft.py +12 -10
  21. chia/_tests/cmds/wallet/test_vcs.py +11 -12
  22. chia/_tests/cmds/wallet/test_wallet.py +134 -89
  23. chia/_tests/conftest.py +59 -30
  24. chia/_tests/connection_utils.py +2 -2
  25. chia/_tests/core/cmds/test_beta.py +4 -4
  26. chia/_tests/core/cmds/test_keys.py +2 -3
  27. chia/_tests/core/cmds/test_wallet.py +15 -15
  28. chia/_tests/core/consensus/test_pot_iterations.py +19 -73
  29. chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
  30. chia/_tests/core/daemon/test_daemon.py +11 -11
  31. chia/_tests/core/data_layer/conftest.py +2 -2
  32. chia/_tests/core/data_layer/test_data_rpc.py +28 -14
  33. chia/_tests/core/data_layer/test_data_store.py +10 -10
  34. chia/_tests/core/data_layer/util.py +11 -11
  35. chia/_tests/core/farmer/test_farmer_api.py +2 -4
  36. chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
  37. chia/_tests/core/full_node/stores/test_block_store.py +5 -4
  38. chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
  39. chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
  40. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  41. chia/_tests/core/full_node/test_block_height_map.py +3 -4
  42. chia/_tests/core/full_node/test_conditions.py +21 -23
  43. chia/_tests/core/full_node/test_full_node.py +225 -62
  44. chia/_tests/core/full_node/test_hint_management.py +2 -4
  45. chia/_tests/core/full_node/test_performance.py +0 -1
  46. chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
  47. chia/_tests/core/full_node/test_transactions.py +1 -2
  48. chia/_tests/core/full_node/test_tx_processing_queue.py +109 -25
  49. chia/_tests/core/mempool/test_mempool.py +29 -37
  50. chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
  51. chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
  52. chia/_tests/core/mempool/test_mempool_manager.py +963 -839
  53. chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
  54. chia/_tests/core/server/serve.py +7 -7
  55. chia/_tests/core/server/test_dos.py +1 -2
  56. chia/_tests/core/server/test_event_loop.py +12 -4
  57. chia/_tests/core/server/test_loop.py +7 -8
  58. chia/_tests/core/server/test_rate_limits.py +9 -8
  59. chia/_tests/core/server/test_server.py +61 -1
  60. chia/_tests/core/services/test_services.py +2 -2
  61. chia/_tests/core/ssl/test_ssl.py +2 -2
  62. chia/_tests/core/test_cost_calculation.py +2 -6
  63. chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
  64. chia/_tests/core/test_filter.py +0 -1
  65. chia/_tests/core/test_full_node_rpc.py +2 -2
  66. chia/_tests/core/test_merkle_set.py +1 -2
  67. chia/_tests/core/test_seeder.py +4 -4
  68. chia/_tests/core/util/test_config.py +4 -4
  69. chia/_tests/core/util/test_jsonify.py +2 -2
  70. chia/_tests/core/util/test_keychain.py +3 -3
  71. chia/_tests/core/util/test_lockfile.py +2 -1
  72. chia/_tests/core/util/test_log_exceptions.py +1 -2
  73. chia/_tests/core/util/test_streamable.py +17 -17
  74. chia/_tests/db/test_db_wrapper.py +3 -2
  75. chia/_tests/environments/wallet.py +14 -14
  76. chia/_tests/ether.py +4 -3
  77. chia/_tests/farmer_harvester/test_farmer.py +41 -24
  78. chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
  79. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
  80. chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
  81. chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
  82. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
  83. chia/_tests/harvester/test_harvester_api.py +11 -4
  84. chia/_tests/plot_sync/test_plot_sync.py +13 -11
  85. chia/_tests/plot_sync/test_receiver.py +11 -10
  86. chia/_tests/plot_sync/test_sync_simulated.py +2 -2
  87. chia/_tests/plot_sync/util.py +1 -2
  88. chia/_tests/plotting/test_plot_manager.py +7 -6
  89. chia/_tests/plotting/test_prover.py +30 -38
  90. chia/_tests/pools/test_pool_cmdline.py +4 -6
  91. chia/_tests/pools/test_pool_rpc.py +203 -61
  92. chia/_tests/pools/test_pool_wallet.py +3 -3
  93. chia/_tests/pools/test_wallet_pool_store.py +1 -4
  94. chia/_tests/process_junit.py +2 -2
  95. chia/_tests/rpc/test_rpc_client.py +4 -4
  96. chia/_tests/rpc/test_rpc_server.py +3 -3
  97. chia/_tests/simulation/test_simulation.py +12 -25
  98. chia/_tests/solver/test_solver_service.py +13 -4
  99. chia/_tests/testconfig.py +2 -2
  100. chia/_tests/timelord/test_new_peak.py +22 -11
  101. chia/_tests/tools/test_run_block.py +0 -2
  102. chia/_tests/tools/test_virtual_project.py +2 -1
  103. chia/_tests/util/benchmarks.py +1 -0
  104. chia/_tests/util/blockchain.py +38 -36
  105. chia/_tests/util/blockchain_mock.py +11 -11
  106. chia/_tests/util/build_network_protocol_files.py +2 -1
  107. chia/_tests/util/coin_store.py +2 -1
  108. chia/_tests/util/config.py +1 -1
  109. chia/_tests/util/db_connection.py +2 -3
  110. chia/_tests/util/full_sync.py +9 -11
  111. chia/_tests/util/gen_ssl_certs.py +4 -5
  112. chia/_tests/util/get_name_puzzle_conditions.py +2 -0
  113. chia/_tests/util/misc.py +24 -24
  114. chia/_tests/util/network_protocol_data.py +20 -3
  115. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  116. chia/_tests/util/protocol_messages_json.py +292 -3
  117. chia/_tests/util/setup_nodes.py +62 -47
  118. chia/_tests/util/spend_sim.py +57 -57
  119. chia/_tests/util/test_async_pool.py +2 -3
  120. chia/_tests/util/test_chia_version.py +1 -3
  121. chia/_tests/util/test_config.py +3 -3
  122. chia/_tests/util/test_full_block_utils.py +6 -3
  123. chia/_tests/util/test_limited_semaphore.py +1 -2
  124. chia/_tests/util/test_misc.py +2 -2
  125. chia/_tests/util/test_network.py +1 -2
  126. chia/_tests/util/test_priority_mutex.py +3 -3
  127. chia/_tests/util/test_recursive_replace.py +5 -6
  128. chia/_tests/util/test_replace_str_to_bytes.py +8 -10
  129. chia/_tests/util/test_testnet_overrides.py +3 -3
  130. chia/_tests/util/time_out_assert.py +2 -2
  131. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
  132. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
  133. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
  134. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
  135. chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
  136. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
  137. chia/_tests/wallet/conftest.py +6 -6
  138. chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
  139. chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
  140. chia/_tests/wallet/did_wallet/test_did.py +16 -6
  141. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
  142. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
  143. chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
  144. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
  145. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
  146. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
  147. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
  148. chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
  149. chia/_tests/wallet/sync/test_wallet_sync.py +43 -47
  150. chia/_tests/wallet/test_clvm_streamable.py +2 -3
  151. chia/_tests/wallet/test_coin_management.py +2 -2
  152. chia/_tests/wallet/test_conditions.py +45 -51
  153. chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
  154. chia/_tests/wallet/test_new_wallet_protocol.py +4 -6
  155. chia/_tests/wallet/test_notifications.py +14 -14
  156. chia/_tests/wallet/test_signer_protocol.py +5 -5
  157. chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
  158. chia/_tests/wallet/test_transaction_store.py +20 -20
  159. chia/_tests/wallet/test_util.py +2 -2
  160. chia/_tests/wallet/test_wallet.py +380 -228
  161. chia/_tests/wallet/test_wallet_action_scope.py +4 -4
  162. chia/_tests/wallet/test_wallet_blockchain.py +12 -12
  163. chia/_tests/wallet/test_wallet_coin_store.py +3 -4
  164. chia/_tests/wallet/test_wallet_node.py +14 -14
  165. chia/_tests/wallet/test_wallet_test_framework.py +2 -1
  166. chia/_tests/wallet/test_wallet_utils.py +2 -3
  167. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
  168. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
  169. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
  170. chia/_tests/wallet/wallet_block_tools.py +12 -11
  171. chia/_tests/weight_proof/config.py +1 -0
  172. chia/_tests/weight_proof/test_weight_proof.py +5 -4
  173. chia/apis/__init__.py +21 -0
  174. chia/apis/farmer_stub.py +102 -0
  175. chia/apis/full_node_stub.py +372 -0
  176. chia/apis/harvester_stub.py +57 -0
  177. chia/apis/introducer_stub.py +35 -0
  178. chia/apis/solver_stub.py +30 -0
  179. chia/apis/stub_protocol_registry.py +21 -0
  180. chia/apis/timelord_stub.py +39 -0
  181. chia/apis/wallet_stub.py +161 -0
  182. chia/cmds/beta.py +3 -4
  183. chia/cmds/beta_funcs.py +4 -3
  184. chia/cmds/check_wallet_db.py +4 -4
  185. chia/cmds/chia.py +1 -2
  186. chia/cmds/cmd_classes.py +11 -13
  187. chia/cmds/cmd_helpers.py +11 -11
  188. chia/cmds/cmds_util.py +15 -15
  189. chia/cmds/coin_funcs.py +6 -7
  190. chia/cmds/coins.py +2 -3
  191. chia/cmds/configure.py +1 -2
  192. chia/cmds/data.py +42 -42
  193. chia/cmds/data_funcs.py +81 -81
  194. chia/cmds/db.py +4 -5
  195. chia/cmds/db_backup_func.py +2 -2
  196. chia/cmds/db_upgrade_func.py +3 -3
  197. chia/cmds/db_validate_func.py +2 -2
  198. chia/cmds/dev/data.py +4 -4
  199. chia/cmds/dev/gh.py +5 -5
  200. chia/cmds/dev/installers.py +2 -3
  201. chia/cmds/dev/mempool.py +3 -4
  202. chia/cmds/dev/mempool_funcs.py +4 -4
  203. chia/cmds/dev/sim.py +8 -8
  204. chia/cmds/dump_keyring.py +3 -3
  205. chia/cmds/farm.py +6 -8
  206. chia/cmds/farm_funcs.py +25 -24
  207. chia/cmds/init_funcs.py +4 -4
  208. chia/cmds/keys.py +16 -18
  209. chia/cmds/keys_funcs.py +36 -36
  210. chia/cmds/netspace.py +1 -3
  211. chia/cmds/netspace_funcs.py +1 -2
  212. chia/cmds/options.py +3 -2
  213. chia/cmds/param_types.py +17 -16
  214. chia/cmds/passphrase.py +6 -7
  215. chia/cmds/passphrase_funcs.py +11 -13
  216. chia/cmds/peer.py +1 -3
  217. chia/cmds/peer_funcs.py +3 -3
  218. chia/cmds/plotnft.py +6 -7
  219. chia/cmds/plotnft_funcs.py +37 -26
  220. chia/cmds/rpc.py +3 -3
  221. chia/cmds/show.py +3 -5
  222. chia/cmds/show_funcs.py +9 -9
  223. chia/cmds/sim_funcs.py +25 -26
  224. chia/cmds/solver.py +1 -3
  225. chia/cmds/solver_funcs.py +1 -2
  226. chia/cmds/start_funcs.py +2 -2
  227. chia/cmds/wallet.py +76 -81
  228. chia/cmds/wallet_funcs.py +206 -177
  229. chia/consensus/augmented_chain.py +6 -6
  230. chia/consensus/block_body_validation.py +19 -15
  231. chia/consensus/block_creation.py +25 -21
  232. chia/consensus/block_header_validation.py +27 -13
  233. chia/consensus/block_height_map.py +3 -6
  234. chia/consensus/block_height_map_protocol.py +2 -2
  235. chia/consensus/block_record.py +2 -4
  236. chia/consensus/blockchain.py +58 -40
  237. chia/consensus/blockchain_interface.py +7 -7
  238. chia/consensus/coin_store_protocol.py +5 -6
  239. chia/consensus/condition_tools.py +4 -4
  240. chia/consensus/cost_calculator.py +2 -3
  241. chia/consensus/default_constants.py +16 -13
  242. chia/consensus/deficit.py +1 -3
  243. chia/consensus/difficulty_adjustment.py +3 -5
  244. chia/consensus/find_fork_point.py +2 -4
  245. chia/consensus/full_block_to_block_record.py +11 -13
  246. chia/consensus/generator_tools.py +2 -3
  247. chia/consensus/get_block_challenge.py +42 -26
  248. chia/consensus/get_block_generator.py +2 -3
  249. chia/consensus/make_sub_epoch_summary.py +8 -7
  250. chia/consensus/multiprocess_validation.py +31 -20
  251. chia/consensus/pos_quality.py +6 -23
  252. chia/consensus/pot_iterations.py +17 -44
  253. chia/consensus/signage_point.py +4 -5
  254. chia/consensus/vdf_info_computation.py +2 -4
  255. chia/daemon/client.py +8 -8
  256. chia/daemon/keychain_proxy.py +31 -37
  257. chia/daemon/server.py +32 -33
  258. chia/daemon/windows_signal.py +4 -3
  259. chia/data_layer/data_layer.py +86 -77
  260. chia/data_layer/data_layer_rpc_api.py +9 -9
  261. chia/data_layer/data_layer_rpc_client.py +13 -15
  262. chia/data_layer/data_layer_server.py +3 -3
  263. chia/data_layer/data_layer_util.py +14 -14
  264. chia/data_layer/data_layer_wallet.py +94 -101
  265. chia/data_layer/data_store.py +50 -50
  266. chia/data_layer/dl_wallet_store.py +9 -12
  267. chia/data_layer/download_data.py +8 -9
  268. chia/data_layer/s3_plugin_service.py +5 -9
  269. chia/data_layer/start_data_layer.py +5 -5
  270. chia/farmer/farmer.py +31 -31
  271. chia/farmer/farmer_api.py +45 -33
  272. chia/farmer/farmer_rpc_api.py +5 -4
  273. chia/farmer/farmer_rpc_client.py +6 -6
  274. chia/farmer/start_farmer.py +6 -6
  275. chia/full_node/block_store.py +13 -16
  276. chia/full_node/check_fork_next_block.py +1 -2
  277. chia/full_node/coin_store.py +15 -16
  278. chia/full_node/eligible_coin_spends.py +3 -3
  279. chia/full_node/fee_estimate_store.py +2 -3
  280. chia/full_node/fee_tracker.py +1 -2
  281. chia/full_node/full_block_utils.py +4 -4
  282. chia/full_node/full_node.py +238 -224
  283. chia/full_node/full_node_api.py +193 -150
  284. chia/full_node/full_node_rpc_api.py +53 -31
  285. chia/full_node/full_node_rpc_client.py +18 -19
  286. chia/full_node/full_node_store.py +45 -43
  287. chia/full_node/hint_management.py +2 -2
  288. chia/full_node/mempool.py +17 -19
  289. chia/full_node/mempool_manager.py +89 -42
  290. chia/full_node/pending_tx_cache.py +2 -3
  291. chia/full_node/start_full_node.py +5 -5
  292. chia/full_node/sync_store.py +3 -4
  293. chia/full_node/tx_processing_queue.py +34 -13
  294. chia/full_node/weight_proof.py +61 -48
  295. chia/harvester/harvester.py +25 -24
  296. chia/harvester/harvester_api.py +61 -38
  297. chia/harvester/harvester_rpc_api.py +10 -10
  298. chia/harvester/start_harvester.py +4 -4
  299. chia/introducer/introducer.py +3 -3
  300. chia/introducer/introducer_api.py +6 -4
  301. chia/introducer/start_introducer.py +4 -4
  302. chia/legacy/keyring.py +3 -3
  303. chia/plot_sync/delta.py +1 -2
  304. chia/plot_sync/receiver.py +20 -17
  305. chia/plot_sync/sender.py +15 -10
  306. chia/plotters/bladebit.py +7 -7
  307. chia/plotters/chiapos.py +2 -2
  308. chia/plotters/madmax.py +4 -4
  309. chia/plotters/plotters.py +4 -4
  310. chia/plotters/plotters_util.py +3 -3
  311. chia/plotting/cache.py +20 -14
  312. chia/plotting/check_plots.py +26 -35
  313. chia/plotting/create_plots.py +22 -23
  314. chia/plotting/manager.py +21 -14
  315. chia/plotting/prover.py +59 -42
  316. chia/plotting/util.py +16 -16
  317. chia/pools/pool_config.py +2 -1
  318. chia/pools/pool_puzzles.py +11 -12
  319. chia/pools/pool_wallet.py +34 -57
  320. chia/pools/pool_wallet_info.py +39 -10
  321. chia/protocols/farmer_protocol.py +8 -9
  322. chia/protocols/fee_estimate.py +3 -4
  323. chia/protocols/full_node_protocol.py +3 -4
  324. chia/protocols/harvester_protocol.py +27 -15
  325. chia/protocols/outbound_message.py +3 -3
  326. chia/protocols/pool_protocol.py +8 -9
  327. chia/protocols/shared_protocol.py +1 -2
  328. chia/protocols/solver_protocol.py +9 -2
  329. chia/protocols/timelord_protocol.py +4 -7
  330. chia/protocols/wallet_protocol.py +11 -12
  331. chia/rpc/rpc_client.py +9 -9
  332. chia/rpc/rpc_server.py +17 -17
  333. chia/rpc/util.py +2 -2
  334. chia/seeder/crawler.py +8 -8
  335. chia/seeder/crawler_api.py +21 -27
  336. chia/seeder/crawler_rpc_api.py +2 -2
  337. chia/seeder/dns_server.py +21 -21
  338. chia/seeder/start_crawler.py +4 -4
  339. chia/server/address_manager.py +15 -16
  340. chia/server/api_protocol.py +11 -11
  341. chia/server/chia_policy.py +46 -26
  342. chia/server/introducer_peers.py +2 -3
  343. chia/server/node_discovery.py +19 -19
  344. chia/server/rate_limit_numbers.py +4 -5
  345. chia/server/rate_limits.py +4 -4
  346. chia/server/resolve_peer_info.py +4 -4
  347. chia/server/server.py +49 -52
  348. chia/server/signal_handlers.py +6 -6
  349. chia/server/start_service.py +17 -17
  350. chia/server/upnp.py +4 -6
  351. chia/server/ws_connection.py +52 -37
  352. chia/simulator/add_blocks_in_batches.py +1 -3
  353. chia/simulator/block_tools.py +312 -200
  354. chia/simulator/full_node_simulator.py +56 -35
  355. chia/simulator/keyring.py +2 -3
  356. chia/simulator/setup_services.py +15 -15
  357. chia/simulator/simulator_full_node_rpc_api.py +1 -2
  358. chia/simulator/simulator_full_node_rpc_client.py +1 -2
  359. chia/simulator/simulator_protocol.py +1 -2
  360. chia/simulator/simulator_test_tools.py +3 -3
  361. chia/simulator/start_simulator.py +7 -7
  362. chia/simulator/wallet_tools.py +10 -10
  363. chia/solver/solver.py +10 -10
  364. chia/solver/solver_api.py +10 -8
  365. chia/solver/solver_rpc_api.py +2 -2
  366. chia/solver/start_solver.py +4 -4
  367. chia/ssl/cacert.pem +148 -90
  368. chia/ssl/chia_ca.crt +14 -10
  369. chia/ssl/chia_ca_old.crt +19 -0
  370. chia/ssl/create_ssl.py +4 -4
  371. chia/ssl/renewedselfsignedca.conf +4 -0
  372. chia/ssl/ssl_check.py +1 -2
  373. chia/timelord/iters_from_block.py +1 -4
  374. chia/timelord/start_timelord.py +4 -4
  375. chia/timelord/timelord.py +44 -40
  376. chia/timelord/timelord_api.py +6 -4
  377. chia/timelord/timelord_launcher.py +2 -2
  378. chia/timelord/timelord_rpc_api.py +2 -2
  379. chia/timelord/timelord_state.py +11 -12
  380. chia/types/block_protocol.py +1 -3
  381. chia/types/blockchain_format/coin.py +1 -3
  382. chia/types/blockchain_format/program.py +11 -8
  383. chia/types/blockchain_format/proof_of_space.py +123 -76
  384. chia/types/blockchain_format/tree_hash.py +3 -3
  385. chia/types/blockchain_format/vdf.py +1 -2
  386. chia/types/coin_spend.py +3 -3
  387. chia/types/mempool_item.py +5 -5
  388. chia/types/mempool_submission_status.py +2 -3
  389. chia/types/peer_info.py +1 -2
  390. chia/types/unfinished_header_block.py +3 -4
  391. chia/types/validation_state.py +1 -2
  392. chia/util/action_scope.py +8 -8
  393. chia/util/async_pool.py +5 -5
  394. chia/util/bech32m.py +1 -2
  395. chia/util/beta_metrics.py +2 -2
  396. chia/util/block_cache.py +4 -4
  397. chia/util/chia_logging.py +2 -2
  398. chia/util/chia_version.py +1 -2
  399. chia/util/config.py +15 -16
  400. chia/util/db_wrapper.py +26 -27
  401. chia/util/default_root.py +1 -2
  402. chia/util/errors.py +3 -3
  403. chia/util/file_keyring.py +14 -14
  404. chia/util/files.py +2 -3
  405. chia/util/hash.py +4 -4
  406. chia/util/initial-config.yaml +3 -5
  407. chia/util/inline_executor.py +2 -1
  408. chia/util/ip_address.py +1 -2
  409. chia/util/keychain.py +25 -27
  410. chia/util/keyring_wrapper.py +18 -19
  411. chia/util/lock.py +3 -4
  412. chia/util/log_exceptions.py +1 -2
  413. chia/util/lru_cache.py +2 -2
  414. chia/util/network.py +6 -6
  415. chia/util/path.py +2 -3
  416. chia/util/priority_mutex.py +2 -2
  417. chia/util/profiler.py +1 -2
  418. chia/util/safe_cancel_task.py +1 -2
  419. chia/util/streamable.py +22 -8
  420. chia/util/task_referencer.py +1 -1
  421. chia/util/timing.py +3 -3
  422. chia/util/virtual_project_analysis.py +6 -5
  423. chia/util/ws_message.py +2 -2
  424. chia/wallet/cat_wallet/cat_info.py +3 -4
  425. chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
  426. chia/wallet/cat_wallet/cat_utils.py +3 -4
  427. chia/wallet/cat_wallet/cat_wallet.py +61 -83
  428. chia/wallet/cat_wallet/lineage_store.py +3 -4
  429. chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
  430. chia/wallet/coin_selection.py +9 -10
  431. chia/wallet/conditions.py +120 -105
  432. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
  433. chia/wallet/derivation_record.py +1 -2
  434. chia/wallet/derive_keys.py +2 -4
  435. chia/wallet/did_wallet/did_info.py +10 -11
  436. chia/wallet/did_wallet/did_wallet.py +36 -82
  437. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
  438. chia/wallet/driver_protocol.py +5 -7
  439. chia/wallet/lineage_proof.py +4 -4
  440. chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
  441. chia/wallet/nft_wallet/nft_info.py +8 -9
  442. chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
  443. chia/wallet/nft_wallet/nft_wallet.py +79 -116
  444. chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
  445. chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
  446. chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
  447. chia/wallet/nft_wallet/uncurry_nft.py +10 -11
  448. chia/wallet/notification_manager.py +3 -3
  449. chia/wallet/notification_store.py +44 -61
  450. chia/wallet/outer_puzzles.py +6 -7
  451. chia/wallet/puzzle_drivers.py +34 -6
  452. chia/wallet/puzzles/clawback/drivers.py +6 -6
  453. chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
  454. chia/wallet/puzzles/load_clvm.py +1 -1
  455. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
  456. chia/wallet/puzzles/singleton_top_layer.py +2 -3
  457. chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
  458. chia/wallet/puzzles/tails.py +3 -3
  459. chia/wallet/singleton.py +5 -7
  460. chia/wallet/singleton_record.py +3 -3
  461. chia/wallet/start_wallet.py +5 -5
  462. chia/wallet/trade_manager.py +37 -58
  463. chia/wallet/trade_record.py +4 -4
  464. chia/wallet/trading/offer.py +59 -46
  465. chia/wallet/trading/trade_store.py +8 -9
  466. chia/wallet/transaction_record.py +8 -8
  467. chia/wallet/uncurried_puzzle.py +1 -2
  468. chia/wallet/util/clvm_streamable.py +12 -12
  469. chia/wallet/util/compute_hints.py +4 -5
  470. chia/wallet/util/curry_and_treehash.py +1 -2
  471. chia/wallet/util/merkle_tree.py +2 -3
  472. chia/wallet/util/peer_request_cache.py +8 -8
  473. chia/wallet/util/signing.py +85 -0
  474. chia/wallet/util/tx_config.py +15 -6
  475. chia/wallet/util/wallet_sync_utils.py +14 -16
  476. chia/wallet/util/wallet_types.py +2 -2
  477. chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
  478. chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
  479. chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
  480. chia/wallet/vc_wallet/vc_drivers.py +27 -27
  481. chia/wallet/vc_wallet/vc_store.py +5 -6
  482. chia/wallet/vc_wallet/vc_wallet.py +33 -61
  483. chia/wallet/wallet.py +50 -78
  484. chia/wallet/wallet_action_scope.py +11 -11
  485. chia/wallet/wallet_blockchain.py +12 -12
  486. chia/wallet/wallet_coin_record.py +12 -6
  487. chia/wallet/wallet_coin_store.py +24 -25
  488. chia/wallet/wallet_interested_store.py +3 -5
  489. chia/wallet/wallet_nft_store.py +10 -11
  490. chia/wallet/wallet_node.py +53 -61
  491. chia/wallet/wallet_node_api.py +5 -3
  492. chia/wallet/wallet_protocol.py +23 -23
  493. chia/wallet/wallet_puzzle_store.py +15 -18
  494. chia/wallet/wallet_request_types.py +778 -114
  495. chia/wallet/wallet_retry_store.py +1 -3
  496. chia/wallet/wallet_rpc_api.py +572 -909
  497. chia/wallet/wallet_rpc_client.py +87 -279
  498. chia/wallet/wallet_singleton_store.py +3 -4
  499. chia/wallet/wallet_state_manager.py +332 -106
  500. chia/wallet/wallet_transaction_store.py +11 -14
  501. chia/wallet/wallet_user_store.py +4 -6
  502. chia/wallet/wallet_weight_proof_handler.py +4 -4
  503. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
  504. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
  505. chia/apis.py +0 -21
  506. chia/consensus/check_time_locks.py +0 -57
  507. chia/data_layer/puzzles/__init__.py +0 -0
  508. chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
  509. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
  510. chia/types/coin_record.py +0 -44
  511. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  512. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
  513. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
  514. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
  515. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
  516. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
  517. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
  518. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
  519. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
  520. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
  521. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
  522. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
  523. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
  524. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
  525. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
  526. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
  527. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
  528. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  import random
5
- from typing import Optional
6
5
 
7
6
  from chia_rs.sized_bytes import bytes32
8
7
  from chia_rs.sized_ints import uint64, uint128
@@ -68,7 +67,7 @@ async def select_coins(
68
67
  valid_spendable_coins.sort(reverse=True, key=lambda r: r.amount)
69
68
 
70
69
  # check for exact 1 to 1 coin match.
71
- exact_match_coin: Optional[Coin] = check_for_exact_match(valid_spendable_coins, uint64(amount))
70
+ exact_match_coin: Coin | None = check_for_exact_match(valid_spendable_coins, uint64(amount))
72
71
  if exact_match_coin:
73
72
  log.debug(f"selected coin with an exact match: {exact_match_coin}")
74
73
  return {exact_match_coin}
@@ -85,12 +84,12 @@ async def select_coins(
85
84
  log.debug(f"Selected all smaller coins because they equate to an exact match of the target.: {smaller_coins}")
86
85
  return set(smaller_coins)
87
86
  elif smaller_coin_sum < amount:
88
- smallest_coin: Optional[Coin] = select_smallest_coin_over_target(amount, valid_spendable_coins)
87
+ smallest_coin: Coin | None = select_smallest_coin_over_target(amount, valid_spendable_coins)
89
88
  assert smallest_coin is not None # Since we know we have enough, there must be a larger coin
90
89
  log.debug(f"Selected closest greater coin: {smallest_coin.name()}")
91
90
  return {smallest_coin}
92
91
  elif smaller_coin_sum > amount:
93
- coin_set: Optional[set[Coin]] = knapsack_coin_algorithm(
92
+ coin_set: set[Coin] | None = knapsack_coin_algorithm(
94
93
  smaller_coins, amount, coin_selection_config.max_coin_amount, max_num_coins
95
94
  )
96
95
  log.debug(f"Selected coins from knapsack algorithm: {coin_set}")
@@ -107,7 +106,7 @@ async def select_coins(
107
106
  return coin_set
108
107
  else:
109
108
  # if smaller_coin_sum == amount and (len(smaller_coins) >= max_num_coins or amount == 0)
110
- potential_large_coin: Optional[Coin] = select_smallest_coin_over_target(amount, valid_spendable_coins)
109
+ potential_large_coin: Coin | None = select_smallest_coin_over_target(amount, valid_spendable_coins)
111
110
  if potential_large_coin is None:
112
111
  raise ValueError("Too many coins are required to make this transaction")
113
112
  log.debug(f"Resorted to selecting smallest coin over target due to dust.: {potential_large_coin}")
@@ -119,7 +118,7 @@ async def select_coins(
119
118
 
120
119
 
121
120
  # we use this to check if one of the coins exactly matches the target.
122
- def check_for_exact_match(coin_list: list[Coin], target: uint64) -> Optional[Coin]:
121
+ def check_for_exact_match(coin_list: list[Coin], target: uint64) -> Coin | None:
123
122
  for coin in coin_list:
124
123
  if coin.amount == target:
125
124
  return coin
@@ -128,7 +127,7 @@ def check_for_exact_match(coin_list: list[Coin], target: uint64) -> Optional[Coi
128
127
 
129
128
  # amount of coins smaller than target, followed by a list of all valid spendable coins.
130
129
  # Coins must be sorted in descending amount order.
131
- def select_smallest_coin_over_target(target: uint128, sorted_coin_list: list[Coin]) -> Optional[Coin]:
130
+ def select_smallest_coin_over_target(target: uint128, sorted_coin_list: list[Coin]) -> Coin | None:
132
131
  if sorted_coin_list[0].amount < target:
133
132
  return None
134
133
  for coin in reversed(sorted_coin_list):
@@ -141,9 +140,9 @@ def select_smallest_coin_over_target(target: uint128, sorted_coin_list: list[Coi
141
140
  # IMPORTANT: The coins have to be sorted in descending order or else this function will not work.
142
141
  def knapsack_coin_algorithm(
143
142
  smaller_coins: list[Coin], target: uint128, max_coin_amount: int, max_num_coins: int, seed: bytes = b"knapsack seed"
144
- ) -> Optional[set[Coin]]:
143
+ ) -> set[Coin] | None:
145
144
  best_set_sum = max_coin_amount
146
- best_set_of_coins: Optional[set[Coin]] = None
145
+ best_set_of_coins: set[Coin] | None = None
147
146
  ran: random.Random = random.Random()
148
147
  ran.seed(seed)
149
148
  for i in range(1000):
@@ -177,7 +176,7 @@ def knapsack_coin_algorithm(
177
176
 
178
177
  # Adds up the largest coins in the list, resulting in the minimum number of selected coins. A solution
179
178
  # is guaranteed if and only if the sum(coins) >= target. Coins must be sorted in descending amount order.
180
- def sum_largest_coins(target: uint128, sorted_coins: list[Coin]) -> Optional[set[Coin]]:
179
+ def sum_largest_coins(target: uint128, sorted_coins: list[Coin]) -> set[Coin] | None:
181
180
  total_value = 0
182
181
  selected_coins: set[Coin] = set()
183
182
  for coin in sorted_coins:
chia/wallet/conditions.py CHANGED
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  from abc import ABC, abstractmethod
4
4
  from collections.abc import Iterable
5
5
  from dataclasses import dataclass, fields, replace
6
- from typing import Any, ClassVar, Optional, TypeVar, Union, final, get_type_hints
6
+ from typing import Any, ClassVar, TypeVar, final, get_type_hints
7
7
 
8
8
  from chia_rs import Coin, G1Element
9
9
  from chia_rs.sized_bytes import bytes32
@@ -34,14 +34,14 @@ class Condition(Streamable, ABC):
34
34
  class AggSigParent(Condition):
35
35
  pubkey: G1Element
36
36
  msg: bytes
37
- parent_id: Optional[bytes32] = None
37
+ parent_id: bytes32 | None = None
38
38
 
39
39
  def to_program(self) -> Program:
40
40
  condition: Program = Program.to([ConditionOpcode.AGG_SIG_PARENT, self.pubkey.to_bytes(), self.msg])
41
41
  return condition
42
42
 
43
43
  @classmethod
44
- def from_program(cls, program: Program, parent_id: Optional[bytes32] = None) -> AggSigParent:
44
+ def from_program(cls, program: Program, parent_id: bytes32 | None = None) -> AggSigParent:
45
45
  return cls(
46
46
  G1Element.from_bytes(program.at("rf").as_atom()),
47
47
  program.at("rrf").as_atom(),
@@ -55,14 +55,14 @@ class AggSigParent(Condition):
55
55
  class AggSigPuzzle(Condition):
56
56
  pubkey: G1Element
57
57
  msg: bytes
58
- puzzle_hash: Optional[bytes32] = None
58
+ puzzle_hash: bytes32 | None = None
59
59
 
60
60
  def to_program(self) -> Program:
61
61
  condition: Program = Program.to([ConditionOpcode.AGG_SIG_PUZZLE, self.pubkey.to_bytes(), self.msg])
62
62
  return condition
63
63
 
64
64
  @classmethod
65
- def from_program(cls, program: Program, puzzle_hash: Optional[bytes32] = None) -> AggSigPuzzle:
65
+ def from_program(cls, program: Program, puzzle_hash: bytes32 | None = None) -> AggSigPuzzle:
66
66
  return cls(
67
67
  G1Element.from_bytes(program.at("rf").as_atom()),
68
68
  program.at("rrf").as_atom(),
@@ -76,14 +76,14 @@ class AggSigPuzzle(Condition):
76
76
  class AggSigAmount(Condition):
77
77
  pubkey: G1Element
78
78
  msg: bytes
79
- amount: Optional[uint64] = None
79
+ amount: uint64 | None = None
80
80
 
81
81
  def to_program(self) -> Program:
82
82
  condition: Program = Program.to([ConditionOpcode.AGG_SIG_AMOUNT, self.pubkey.to_bytes(), self.msg])
83
83
  return condition
84
84
 
85
85
  @classmethod
86
- def from_program(cls, program: Program, amount: Optional[uint64] = None) -> AggSigAmount:
86
+ def from_program(cls, program: Program, amount: uint64 | None = None) -> AggSigAmount:
87
87
  return cls(
88
88
  G1Element.from_bytes(program.at("rf").as_atom()),
89
89
  program.at("rrf").as_atom(),
@@ -97,8 +97,8 @@ class AggSigAmount(Condition):
97
97
  class AggSigPuzzleAmount(Condition):
98
98
  pubkey: G1Element
99
99
  msg: bytes
100
- puzzle_hash: Optional[bytes32] = None
101
- amount: Optional[uint64] = None
100
+ puzzle_hash: bytes32 | None = None
101
+ amount: uint64 | None = None
102
102
 
103
103
  def to_program(self) -> Program:
104
104
  condition: Program = Program.to([ConditionOpcode.AGG_SIG_PUZZLE_AMOUNT, self.pubkey.to_bytes(), self.msg])
@@ -108,8 +108,8 @@ class AggSigPuzzleAmount(Condition):
108
108
  def from_program(
109
109
  cls,
110
110
  program: Program,
111
- puzzle_hash: Optional[bytes32] = None,
112
- amount: Optional[uint64] = None,
111
+ puzzle_hash: bytes32 | None = None,
112
+ amount: uint64 | None = None,
113
113
  ) -> AggSigPuzzleAmount:
114
114
  return cls(
115
115
  G1Element.from_bytes(program.at("rf").as_atom()),
@@ -125,8 +125,8 @@ class AggSigPuzzleAmount(Condition):
125
125
  class AggSigParentAmount(Condition):
126
126
  pubkey: G1Element
127
127
  msg: bytes
128
- parent_id: Optional[bytes32] = None
129
- amount: Optional[uint64] = None
128
+ parent_id: bytes32 | None = None
129
+ amount: uint64 | None = None
130
130
 
131
131
  def to_program(self) -> Program:
132
132
  condition: Program = Program.to([ConditionOpcode.AGG_SIG_PARENT_AMOUNT, self.pubkey.to_bytes(), self.msg])
@@ -136,8 +136,8 @@ class AggSigParentAmount(Condition):
136
136
  def from_program(
137
137
  cls,
138
138
  program: Program,
139
- parent_id: Optional[bytes32] = None,
140
- amount: Optional[uint64] = None,
139
+ parent_id: bytes32 | None = None,
140
+ amount: uint64 | None = None,
141
141
  ) -> AggSigParentAmount:
142
142
  return cls(
143
143
  G1Element.from_bytes(program.at("rf").as_atom()),
@@ -153,8 +153,8 @@ class AggSigParentAmount(Condition):
153
153
  class AggSigParentPuzzle(Condition):
154
154
  pubkey: G1Element
155
155
  msg: bytes
156
- parent_id: Optional[bytes32] = None
157
- puzzle_hash: Optional[bytes32] = None
156
+ parent_id: bytes32 | None = None
157
+ puzzle_hash: bytes32 | None = None
158
158
 
159
159
  def to_program(self) -> Program:
160
160
  condition: Program = Program.to([ConditionOpcode.AGG_SIG_PARENT_PUZZLE, self.pubkey.to_bytes(), self.msg])
@@ -164,8 +164,8 @@ class AggSigParentPuzzle(Condition):
164
164
  def from_program(
165
165
  cls,
166
166
  program: Program,
167
- parent_id: Optional[bytes32] = None,
168
- puzzle_hash: Optional[bytes32] = None,
167
+ parent_id: bytes32 | None = None,
168
+ puzzle_hash: bytes32 | None = None,
169
169
  ) -> AggSigParentPuzzle:
170
170
  return cls(
171
171
  G1Element.from_bytes(program.at("rf").as_atom()),
@@ -200,8 +200,8 @@ class AggSigUnsafe(Condition):
200
200
  class AggSigMe(Condition):
201
201
  pubkey: G1Element
202
202
  msg: bytes
203
- coin_id: Optional[bytes32] = None
204
- additional_data: Optional[bytes32] = None
203
+ coin_id: bytes32 | None = None
204
+ additional_data: bytes32 | None = None
205
205
 
206
206
  def to_program(self) -> Program:
207
207
  condition: Program = Program.to([ConditionOpcode.AGG_SIG_ME, self.pubkey.to_bytes(), self.msg])
@@ -211,8 +211,8 @@ class AggSigMe(Condition):
211
211
  def from_program(
212
212
  cls,
213
213
  program: Program,
214
- coin_id: Optional[bytes32] = None,
215
- additional_data: Optional[bytes32] = None,
214
+ coin_id: bytes32 | None = None,
215
+ additional_data: bytes32 | None = None,
216
216
  ) -> AggSigMe:
217
217
  return cls(
218
218
  G1Element.from_bytes(program.at("rf").as_atom()),
@@ -228,7 +228,7 @@ class AggSigMe(Condition):
228
228
  class CreateCoin(Condition):
229
229
  puzzle_hash: bytes32
230
230
  amount: uint64
231
- memos: Optional[list[bytes]] = None
231
+ memos: list[bytes] | None = None
232
232
 
233
233
  def to_program(self) -> Program:
234
234
  condition_args = [ConditionOpcode.CREATE_COIN, self.puzzle_hash, self.amount]
@@ -245,12 +245,12 @@ class CreateCoin(Condition):
245
245
  uint64(program.at("rrf").as_int()),
246
246
  (
247
247
  None
248
- if potential_memos == Program.to(None)
248
+ if potential_memos == Program.NIL
249
249
  else [memo.as_atom() for memo in potential_memos.at("f").as_iter()]
250
250
  ),
251
251
  )
252
252
 
253
- def as_condition_args(self) -> list[Union[bytes32, uint64, Optional[list[bytes]]]]:
253
+ def as_condition_args(self) -> list[bytes32 | uint64 | list[bytes] | None]:
254
254
  return [self.puzzle_hash, self.amount, self.memos]
255
255
 
256
256
 
@@ -275,9 +275,9 @@ class ReserveFee(Condition):
275
275
  @streamable
276
276
  @dataclass(frozen=True)
277
277
  class AssertCoinAnnouncement(Condition):
278
- msg: Optional[bytes32] = None
279
- asserted_id: Optional[bytes32] = None
280
- asserted_msg: Optional[bytes] = None
278
+ msg: bytes32 | None = None
279
+ asserted_id: bytes32 | None = None
280
+ asserted_msg: bytes | None = None
281
281
 
282
282
  def __post_init__(self) -> None:
283
283
  if self.msg is None and (self.asserted_id is None or self.asserted_msg is None):
@@ -305,8 +305,8 @@ class AssertCoinAnnouncement(Condition):
305
305
  def from_program(
306
306
  cls,
307
307
  program: Program,
308
- asserted_id: Optional[bytes32] = None,
309
- asserted_msg: Optional[bytes] = None,
308
+ asserted_id: bytes32 | None = None,
309
+ asserted_msg: bytes | None = None,
310
310
  ) -> AssertCoinAnnouncement:
311
311
  return cls(
312
312
  bytes32(program.at("rf").as_atom()),
@@ -320,7 +320,7 @@ class AssertCoinAnnouncement(Condition):
320
320
  @dataclass(frozen=True)
321
321
  class CreateCoinAnnouncement(Condition):
322
322
  msg: bytes
323
- coin_id: Optional[bytes32] = None
323
+ coin_id: bytes32 | None = None
324
324
 
325
325
  def corresponding_assertion(self) -> AssertCoinAnnouncement:
326
326
  if self.coin_id is None:
@@ -333,7 +333,7 @@ class CreateCoinAnnouncement(Condition):
333
333
  return condition
334
334
 
335
335
  @classmethod
336
- def from_program(cls, program: Program, coin_id: Optional[bytes32] = None) -> CreateCoinAnnouncement:
336
+ def from_program(cls, program: Program, coin_id: bytes32 | None = None) -> CreateCoinAnnouncement:
337
337
  return cls(
338
338
  program.at("rf").as_atom(),
339
339
  coin_id,
@@ -344,9 +344,9 @@ class CreateCoinAnnouncement(Condition):
344
344
  @streamable
345
345
  @dataclass(frozen=True)
346
346
  class AssertPuzzleAnnouncement(Condition):
347
- msg: Optional[bytes32] = None
348
- asserted_ph: Optional[bytes32] = None
349
- asserted_msg: Optional[bytes] = None
347
+ msg: bytes32 | None = None
348
+ asserted_ph: bytes32 | None = None
349
+ asserted_msg: bytes | None = None
350
350
 
351
351
  def __post_init__(self) -> None:
352
352
  if self.msg is None and (self.asserted_ph is None or self.asserted_msg is None):
@@ -374,8 +374,8 @@ class AssertPuzzleAnnouncement(Condition):
374
374
  def from_program(
375
375
  cls,
376
376
  program: Program,
377
- asserted_ph: Optional[bytes32] = None,
378
- asserted_msg: Optional[bytes] = None,
377
+ asserted_ph: bytes32 | None = None,
378
+ asserted_msg: bytes | None = None,
379
379
  ) -> AssertPuzzleAnnouncement:
380
380
  return cls(
381
381
  bytes32(program.at("rf").as_atom()),
@@ -389,7 +389,7 @@ class AssertPuzzleAnnouncement(Condition):
389
389
  @dataclass(frozen=True)
390
390
  class CreatePuzzleAnnouncement(Condition):
391
391
  msg: bytes
392
- puzzle_hash: Optional[bytes32] = None
392
+ puzzle_hash: bytes32 | None = None
393
393
 
394
394
  def corresponding_assertion(self) -> AssertPuzzleAnnouncement:
395
395
  if self.puzzle_hash is None:
@@ -402,7 +402,7 @@ class CreatePuzzleAnnouncement(Condition):
402
402
  return condition
403
403
 
404
404
  @classmethod
405
- def from_program(cls, program: Program, puzzle_hash: Optional[bytes32] = None) -> CreatePuzzleAnnouncement:
405
+ def from_program(cls, program: Program, puzzle_hash: bytes32 | None = None) -> CreatePuzzleAnnouncement:
406
406
  return cls(
407
407
  program.at("rf").as_atom(),
408
408
  puzzle_hash,
@@ -413,11 +413,11 @@ class CreatePuzzleAnnouncement(Condition):
413
413
  @streamable
414
414
  @dataclass(frozen=True)
415
415
  class MessageParticipant(Streamable):
416
- mode_integer: Optional[uint8] = None
417
- parent_id_committed: Optional[bytes32] = None
418
- puzzle_hash_committed: Optional[bytes32] = None
419
- amount_committed: Optional[uint64] = None
420
- coin_id_committed: Optional[bytes32] = None
416
+ mode_integer: uint8 | None = None
417
+ parent_id_committed: bytes32 | None = None
418
+ puzzle_hash_committed: bytes32 | None = None
419
+ amount_committed: uint64 | None = None
420
+ coin_id_committed: bytes32 | None = None
421
421
 
422
422
  def __post_init__(self) -> None:
423
423
  if (
@@ -470,7 +470,7 @@ class MessageParticipant(Streamable):
470
470
  if self.coin_id_committed is not None:
471
471
  return uint8(0b111)
472
472
 
473
- def convert_noneness_to_bit(maybe_none: Optional[Any]) -> int:
473
+ def convert_noneness_to_bit(maybe_none: Any | None) -> int:
474
474
  return 1 if maybe_none is not None else 0
475
475
 
476
476
  return uint8(
@@ -498,7 +498,7 @@ class MessageParticipant(Streamable):
498
498
 
499
499
  @classmethod
500
500
  def from_mode_and_maybe_args(
501
- cls, sender: bool, full_mode: uint8, args: Optional[Iterable[Program]] = None
501
+ cls, sender: bool, full_mode: uint8, args: Iterable[Program] | None = None
502
502
  ) -> MessageParticipant:
503
503
  if sender:
504
504
  mode = full_mode >> 3
@@ -511,12 +511,12 @@ class MessageParticipant(Streamable):
511
511
  if mode == 0b111:
512
512
  return cls(mode_integer=uint8(mode), coin_id_committed=next(bytes32(arg.as_atom()) for arg in args))
513
513
 
514
- parent_id_committed: Optional[bytes32] = None
515
- puzzle_hash_committed: Optional[bytes32] = None
516
- amount_committed: Optional[uint64] = None
514
+ parent_id_committed: bytes32 | None = None
515
+ puzzle_hash_committed: bytes32 | None = None
516
+ amount_committed: uint64 | None = None
517
517
  # This loop probably looks a little strange
518
518
  # It's trying to account for the fact that the arguments may be any 1 or 2 of these arguments in this order
519
- # Not sure of a more elgant way to do it
519
+ # Not sure of a more elegant way to do it
520
520
  original_mode = mode
521
521
  for arg in args:
522
522
  if mode & 0b100:
@@ -543,14 +543,14 @@ class MessageParticipant(Streamable):
543
543
  @dataclass(frozen=True)
544
544
  class SendMessage(Condition):
545
545
  msg: bytes
546
- var_args: Optional[list[Program]] = None
547
- mode_integer: Optional[uint8] = None
548
- sender: Optional[MessageParticipant] = None
549
- receiver: Optional[MessageParticipant] = None
546
+ var_args: list[Program] | None = None
547
+ mode_integer: uint8 | None = None
548
+ sender: MessageParticipant | None = None
549
+ receiver: MessageParticipant | None = None
550
550
  _other_party_is_receiver: ClassVar[bool] = True
551
551
 
552
552
  @property
553
- def _other_party(self) -> Optional[MessageParticipant]:
553
+ def _other_party(self) -> MessageParticipant | None:
554
554
  return self.receiver
555
555
 
556
556
  @property
@@ -625,7 +625,7 @@ class ReceiveMessage(SendMessage):
625
625
  _other_party_is_receiver: ClassVar[bool] = False
626
626
 
627
627
  @property
628
- def _other_party(self) -> Optional[MessageParticipant]:
628
+ def _other_party(self) -> MessageParticipant | None:
629
629
  return self.sender
630
630
 
631
631
  @property
@@ -966,9 +966,7 @@ class UnknownCondition(Condition):
966
966
 
967
967
  @classmethod
968
968
  def from_program(cls, program: Program) -> UnknownCondition:
969
- return cls(
970
- program.at("f"), [] if program.at("r") == Program.to(None) else [p for p in program.at("r").as_iter()]
971
- )
969
+ return cls(program.at("f"), [] if program.at("r") == Program.NIL else [p for p in program.at("r").as_iter()])
972
970
 
973
971
 
974
972
  # Abstractions
@@ -979,18 +977,18 @@ class AggSig(Condition):
979
977
  pubkey: G1Element
980
978
  msg: bytes
981
979
  opcode: bytes = ConditionOpcode.AGG_SIG_ME.value
982
- coin_id: Optional[bytes32] = None
983
- parent_id: Optional[bytes32] = None
984
- puzzle_hash: Optional[bytes32] = None
985
- amount: Optional[uint64] = None
986
- additional_data: Optional[bytes32] = None
980
+ coin_id: bytes32 | None = None
981
+ parent_id: bytes32 | None = None
982
+ puzzle_hash: bytes32 | None = None
983
+ amount: uint64 | None = None
984
+ additional_data: bytes32 | None = None
987
985
 
988
986
  def to_program(self) -> Program:
989
987
  # We know we are an agg sig or we want to error
990
988
  return CONDITION_DRIVERS[self.opcode](self.pubkey.to_bytes(), self.msg).to_program() # type: ignore[call-arg]
991
989
 
992
990
  @classmethod
993
- def from_program(cls, program: Program, **kwargs: Optional[Union[uint64, bytes32]]) -> AggSig:
991
+ def from_program(cls, program: Program, **kwargs: uint64 | bytes32 | None) -> AggSig:
994
992
  opcode: bytes = program.at("f").as_atom()
995
993
  condition_driver: Condition = CONDITION_DRIVERS[opcode].from_program(program, **kwargs)
996
994
  return cls(
@@ -1008,7 +1006,7 @@ class AggSig(Condition):
1008
1006
  class CreateAnnouncement(Condition):
1009
1007
  msg: bytes
1010
1008
  coin_not_puzzle: bool
1011
- origin_id: Optional[bytes32] = None
1009
+ origin_id: bytes32 | None = None
1012
1010
 
1013
1011
  def corresponding_assertion(self) -> AssertAnnouncement:
1014
1012
  if self.origin_id is None:
@@ -1023,14 +1021,14 @@ class CreateAnnouncement(Condition):
1023
1021
  return CreatePuzzleAnnouncement(self.msg, self.origin_id).to_program()
1024
1022
 
1025
1023
  @classmethod
1026
- def from_program(cls, program: Program, **kwargs: Optional[bytes32]) -> CreateAnnouncement:
1024
+ def from_program(cls, program: Program, **kwargs: bytes32 | None) -> CreateAnnouncement:
1027
1025
  if program.at("f").as_atom() == ConditionOpcode.CREATE_COIN_ANNOUNCEMENT:
1028
1026
  coin_not_puzzle: bool = True
1029
- condition: Union[CreateCoinAnnouncement, CreatePuzzleAnnouncement] = CreateCoinAnnouncement.from_program(
1027
+ condition: CreateCoinAnnouncement | CreatePuzzleAnnouncement = CreateCoinAnnouncement.from_program(
1030
1028
  program, **kwargs
1031
1029
  )
1032
1030
  assert isinstance(condition, CreateCoinAnnouncement)
1033
- origin_id: Optional[bytes32] = condition.coin_id
1031
+ origin_id: bytes32 | None = condition.coin_id
1034
1032
  else:
1035
1033
  coin_not_puzzle = False
1036
1034
  condition = CreatePuzzleAnnouncement.from_program(program, **kwargs)
@@ -1048,9 +1046,9 @@ class CreateAnnouncement(Condition):
1048
1046
  @dataclass(frozen=True)
1049
1047
  class AssertAnnouncement(Condition):
1050
1048
  coin_not_puzzle: bool
1051
- msg: Optional[bytes32] = None
1052
- asserted_origin_id: Optional[bytes32] = None
1053
- asserted_msg: Optional[bytes] = None
1049
+ msg: bytes32 | None = None
1050
+ asserted_origin_id: bytes32 | None = None
1051
+ asserted_msg: bytes | None = None
1054
1052
 
1055
1053
  def __post_init__(self) -> None:
1056
1054
  if self.msg is None and (self.asserted_origin_id is None or self.asserted_msg is None):
@@ -1077,14 +1075,14 @@ class AssertAnnouncement(Condition):
1077
1075
  return CreateAnnouncement(self.asserted_msg, self.coin_not_puzzle, self.asserted_origin_id)
1078
1076
 
1079
1077
  @classmethod
1080
- def from_program(cls, program: Program, **kwargs: Optional[bytes32]) -> AssertAnnouncement:
1078
+ def from_program(cls, program: Program, **kwargs: bytes32 | None) -> AssertAnnouncement:
1081
1079
  if program.at("f").as_atom() == ConditionOpcode.ASSERT_COIN_ANNOUNCEMENT:
1082
1080
  coin_not_puzzle: bool = True
1083
- condition: Union[AssertCoinAnnouncement, AssertPuzzleAnnouncement] = AssertCoinAnnouncement.from_program(
1081
+ condition: AssertCoinAnnouncement | AssertPuzzleAnnouncement = AssertCoinAnnouncement.from_program(
1084
1082
  program, **kwargs
1085
1083
  )
1086
1084
  assert isinstance(condition, AssertCoinAnnouncement)
1087
- asserted_origin_id: Optional[bytes32] = condition.asserted_id
1085
+ asserted_origin_id: bytes32 | None = condition.asserted_id
1088
1086
  else:
1089
1087
  coin_not_puzzle = False
1090
1088
  condition = AssertPuzzleAnnouncement.from_program(program, **kwargs)
@@ -1098,16 +1096,16 @@ class AssertAnnouncement(Condition):
1098
1096
  )
1099
1097
 
1100
1098
 
1101
- TIMELOCK_TYPES = Union[
1102
- AssertSecondsRelative,
1103
- AssertHeightRelative,
1104
- AssertSecondsAbsolute,
1105
- AssertHeightAbsolute,
1106
- AssertBeforeSecondsRelative,
1107
- AssertBeforeHeightRelative,
1108
- AssertBeforeSecondsAbsolute,
1109
- AssertBeforeHeightAbsolute,
1110
- ]
1099
+ TIMELOCK_TYPES = (
1100
+ AssertSecondsRelative
1101
+ | AssertHeightRelative
1102
+ | AssertSecondsAbsolute
1103
+ | AssertHeightAbsolute
1104
+ | AssertBeforeSecondsRelative
1105
+ | AssertBeforeHeightRelative
1106
+ | AssertBeforeSecondsAbsolute
1107
+ | AssertBeforeHeightAbsolute
1108
+ )
1111
1109
 
1112
1110
 
1113
1111
  TIMELOCK_DRIVERS: tuple[
@@ -1375,7 +1373,7 @@ def parse_conditions_non_consensus(
1375
1373
  def conditions_from_json_dicts(conditions: Iterable[dict[str, Any]]) -> list[Condition]:
1376
1374
  final_condition_list: list[Condition] = []
1377
1375
  for condition in conditions:
1378
- opcode_specified: Union[str, int] = condition["opcode"]
1376
+ opcode_specified: str | int = condition["opcode"]
1379
1377
  if isinstance(opcode_specified, str):
1380
1378
  try:
1381
1379
  opcode: bytes = ConditionOpcode[opcode_specified]
@@ -1408,37 +1406,54 @@ def conditions_to_json_dicts(conditions: Iterable[Condition]) -> list[dict[str,
1408
1406
 
1409
1407
  @streamable
1410
1408
  @dataclass(frozen=True)
1411
- class ConditionValidTimes(Streamable):
1412
- min_secs_since_created: Optional[uint64] = None # ASSERT_SECONDS_RELATIVE
1413
- min_time: Optional[uint64] = None # ASSERT_SECONDS_ABSOLUTE
1414
- min_blocks_since_created: Optional[uint32] = None # ASSERT_HEIGHT_RELATIVE
1415
- min_height: Optional[uint32] = None # ASSERT_HEIGHT_ABSOLUTE
1416
- max_secs_after_created: Optional[uint64] = None # ASSERT_BEFORE_SECONDS_RELATIVE
1417
- max_time: Optional[uint64] = None # ASSERT_BEFORE_SECONDS_ABSOLUTE
1418
- max_blocks_after_created: Optional[uint32] = None # ASSERT_BEFORE_HEIGHT_RELATIVE
1419
- max_height: Optional[uint32] = None # ASSERT_BEFORE_HEIGHT_ABSOLUTE
1409
+ class ConditionValidTimesAbsolute(Streamable):
1410
+ min_time: uint64 | None = None # ASSERT_SECONDS_ABSOLUTE
1411
+ min_height: uint32 | None = None # ASSERT_HEIGHT_ABSOLUTE
1412
+ max_time: uint64 | None = None # ASSERT_BEFORE_SECONDS_ABSOLUTE
1413
+ max_height: uint32 | None = None # ASSERT_BEFORE_HEIGHT_ABSOLUTE
1420
1414
 
1421
1415
  def to_conditions(self) -> list[Condition]:
1422
1416
  final_condition_list: list[Condition] = []
1423
- if self.min_secs_since_created is not None:
1424
- final_condition_list.append(AssertSecondsRelative(self.min_secs_since_created))
1425
1417
  if self.min_time is not None:
1426
1418
  final_condition_list.append(AssertSecondsAbsolute(self.min_time))
1427
- if self.min_blocks_since_created is not None:
1428
- final_condition_list.append(AssertHeightRelative(self.min_blocks_since_created))
1429
1419
  if self.min_height is not None:
1430
1420
  final_condition_list.append(AssertHeightAbsolute(self.min_height))
1431
- if self.max_secs_after_created is not None:
1432
- final_condition_list.append(AssertBeforeSecondsRelative(self.max_secs_after_created))
1433
1421
  if self.max_time is not None:
1434
1422
  final_condition_list.append(AssertBeforeSecondsAbsolute(self.max_time))
1435
- if self.max_blocks_after_created is not None:
1436
- final_condition_list.append(AssertBeforeHeightRelative(self.max_blocks_after_created))
1437
1423
  if self.max_height is not None:
1438
1424
  final_condition_list.append(AssertBeforeHeightAbsolute(self.max_height))
1425
+ return final_condition_list
1426
+
1427
+
1428
+ @streamable
1429
+ @dataclass(frozen=True)
1430
+ class ConditionValidTimes(ConditionValidTimesAbsolute):
1431
+ min_secs_since_created: uint64 | None = None # ASSERT_SECONDS_RELATIVE
1432
+ min_blocks_since_created: uint32 | None = None # ASSERT_HEIGHT_RELATIVE
1433
+ max_secs_after_created: uint64 | None = None # ASSERT_BEFORE_SECONDS_RELATIVE
1434
+ max_blocks_after_created: uint32 | None = None # ASSERT_BEFORE_HEIGHT_RELATIVE
1435
+
1436
+ def to_conditions(self) -> list[Condition]:
1437
+ final_condition_list = super().to_conditions()
1438
+ if self.min_secs_since_created is not None:
1439
+ final_condition_list.append(AssertSecondsRelative(self.min_secs_since_created))
1440
+ if self.min_blocks_since_created is not None:
1441
+ final_condition_list.append(AssertHeightRelative(self.min_blocks_since_created))
1442
+ if self.max_secs_after_created is not None:
1443
+ final_condition_list.append(AssertBeforeSecondsRelative(self.max_secs_after_created))
1444
+ if self.max_blocks_after_created is not None:
1445
+ final_condition_list.append(AssertBeforeHeightRelative(self.max_blocks_after_created))
1439
1446
 
1440
1447
  return final_condition_list
1441
1448
 
1449
+ def only_absolutes(self) -> ConditionValidTimesAbsolute:
1450
+ return ConditionValidTimesAbsolute(
1451
+ min_time=self.min_time,
1452
+ min_height=self.min_height,
1453
+ max_time=self.max_time,
1454
+ max_height=self.max_height,
1455
+ )
1456
+
1442
1457
 
1443
1458
  condition_valid_times_hints = get_type_hints(ConditionValidTimes)
1444
1459
  condition_valid_times_types: dict[str, type[int]] = {}
@@ -1494,7 +1509,7 @@ def parse_timelock_info(conditions: Iterable[Condition]) -> ConditionValidTimes:
1494
1509
 
1495
1510
  assert len(properties_left) == 1
1496
1511
  final_property: str = next(iter(properties_left))
1497
- current_value: Optional[int] = getattr(valid_times, final_property)
1512
+ current_value: int | None = getattr(valid_times, final_property)
1498
1513
  if current_value is not None:
1499
1514
  if min_not_max:
1500
1515
  new_value: int = min(current_value, timelock.timestamp)
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from collections.abc import Iterator
4
- from typing import Union
5
4
 
6
5
  from chia_puzzles_py.programs import GRAFTROOT_DL_OFFERS as GRAFTROOT_DL_OFFERS_BYTES
7
6
  from chia_puzzles_py.programs import P2_PARENT as P2_PARENT_BYTES
@@ -24,14 +23,14 @@ GRAFTROOT_DL_OFFERS = Program.from_bytes(GRAFTROOT_DL_OFFERS_BYTES)
24
23
  P2_PARENT = Program.from_bytes(P2_PARENT_BYTES)
25
24
 
26
25
 
27
- def create_host_fullpuz(innerpuz: Union[Program, bytes32], current_root: bytes32, genesis_id: bytes32) -> Program:
26
+ def create_host_fullpuz(innerpuz: Program | bytes32, current_root: bytes32, genesis_id: bytes32) -> Program:
28
27
  db_layer = create_host_layer_puzzle(innerpuz, current_root)
29
28
  mod_hash = SINGLETON_TOP_LAYER_MOD.get_tree_hash()
30
29
  singleton_struct = Program.to((mod_hash, (genesis_id, SINGLETON_LAUNCHER_PUZZLE_HASH)))
31
30
  return SINGLETON_TOP_LAYER_MOD.curry(singleton_struct, db_layer)
32
31
 
33
32
 
34
- def create_host_layer_puzzle(innerpuz: Union[Program, bytes32], current_root: bytes32) -> Program:
33
+ def create_host_layer_puzzle(innerpuz: Program | bytes32, current_root: bytes32) -> Program:
35
34
  # some hard coded metadata formatting and metadata updater for now
36
35
  return create_nft_layer_puzzle_with_curry_params(
37
36
  Program.to((current_root, None)),
@@ -41,7 +40,7 @@ def create_host_layer_puzzle(innerpuz: Union[Program, bytes32], current_root: by
41
40
  )
42
41
 
43
42
 
44
- def match_dl_singleton(puzzle: Union[Program, SerializedProgram]) -> tuple[bool, Iterator[Program]]:
43
+ def match_dl_singleton(puzzle: Program | SerializedProgram) -> tuple[bool, Iterator[Program]]:
45
44
  """
46
45
  Given a puzzle test if it's a CAT and, if it is, return the curried arguments
47
46
  """
@@ -96,7 +95,7 @@ MIRROR_PUZZLE_HASH = create_mirror_puzzle().get_tree_hash()
96
95
 
97
96
 
98
97
  def get_mirror_info(
99
- parent_puzzle: Union[Program, SerializedProgram], parent_solution: Union[Program, SerializedProgram]
98
+ parent_puzzle: Program | SerializedProgram, parent_solution: Program | SerializedProgram
100
99
  ) -> tuple[bytes32, list[bytes]]:
101
100
  assert type(parent_puzzle) is type(parent_solution)
102
101
  _, conditions = run_with_cost(parent_puzzle, INFINITE_COST, parent_solution)