chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.6.0rc2__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 (531) 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_blockchain_transactions.py +5 -2
  6. chia/_tests/blockchain/test_build_chains.py +2 -4
  7. chia/_tests/blockchain/test_get_block_generator.py +2 -3
  8. chia/_tests/clvm/coin_store.py +4 -7
  9. chia/_tests/clvm/test_clvm_step.py +4 -4
  10. chia/_tests/clvm/test_puzzle_compression.py +2 -1
  11. chia/_tests/clvm/test_puzzle_drivers.py +2 -2
  12. chia/_tests/clvm/test_singletons.py +2 -4
  13. chia/_tests/clvm/test_spend_sim.py +2 -2
  14. chia/_tests/cmds/cmd_test_utils.py +27 -45
  15. chia/_tests/cmds/test_cmd_framework.py +6 -6
  16. chia/_tests/cmds/test_daemon.py +3 -3
  17. chia/_tests/cmds/test_show.py +4 -4
  18. chia/_tests/cmds/test_tx_config_args.py +1 -2
  19. chia/_tests/cmds/testing_classes.py +4 -5
  20. chia/_tests/cmds/wallet/test_did.py +24 -27
  21. chia/_tests/cmds/wallet/test_nft.py +12 -10
  22. chia/_tests/cmds/wallet/test_vcs.py +11 -12
  23. chia/_tests/cmds/wallet/test_wallet.py +134 -89
  24. chia/_tests/conftest.py +66 -31
  25. chia/_tests/connection_utils.py +2 -2
  26. chia/_tests/core/cmds/test_beta.py +4 -4
  27. chia/_tests/core/cmds/test_keys.py +2 -3
  28. chia/_tests/core/cmds/test_wallet.py +15 -15
  29. chia/_tests/core/consensus/test_pot_iterations.py +19 -73
  30. chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
  31. chia/_tests/core/daemon/test_daemon.py +11 -11
  32. chia/_tests/core/data_layer/conftest.py +2 -2
  33. chia/_tests/core/data_layer/test_data_rpc.py +28 -14
  34. chia/_tests/core/data_layer/test_data_store.py +10 -10
  35. chia/_tests/core/data_layer/util.py +11 -11
  36. chia/_tests/core/farmer/test_farmer_api.py +2 -4
  37. chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
  38. chia/_tests/core/full_node/stores/test_block_store.py +5 -4
  39. chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
  40. chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
  41. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  42. chia/_tests/core/full_node/test_block_height_map.py +3 -4
  43. chia/_tests/core/full_node/test_conditions.py +21 -23
  44. chia/_tests/core/full_node/test_full_node.py +273 -70
  45. chia/_tests/core/full_node/test_hard_fork_utils.py +92 -0
  46. chia/_tests/core/full_node/test_hint_management.py +2 -4
  47. chia/_tests/core/full_node/test_performance.py +0 -1
  48. chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
  49. chia/_tests/core/full_node/test_transactions.py +1 -2
  50. chia/_tests/core/full_node/test_tx_processing_queue.py +198 -30
  51. chia/_tests/core/mempool/test_mempool.py +54 -50
  52. chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
  53. chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
  54. chia/_tests/core/mempool/test_mempool_manager.py +988 -854
  55. chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
  56. chia/_tests/core/server/serve.py +7 -7
  57. chia/_tests/core/server/test_dos.py +1 -2
  58. chia/_tests/core/server/test_event_loop.py +12 -4
  59. chia/_tests/core/server/test_loop.py +7 -8
  60. chia/_tests/core/server/test_rate_limits.py +9 -8
  61. chia/_tests/core/server/test_server.py +61 -1
  62. chia/_tests/core/services/test_services.py +2 -2
  63. chia/_tests/core/ssl/test_ssl.py +2 -2
  64. chia/_tests/core/test_cost_calculation.py +2 -6
  65. chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
  66. chia/_tests/core/test_filter.py +0 -1
  67. chia/_tests/core/test_full_node_rpc.py +2 -2
  68. chia/_tests/core/test_merkle_set.py +1 -2
  69. chia/_tests/core/test_seeder.py +4 -4
  70. chia/_tests/core/util/test_config.py +4 -4
  71. chia/_tests/core/util/test_jsonify.py +2 -2
  72. chia/_tests/core/util/test_keychain.py +3 -3
  73. chia/_tests/core/util/test_lockfile.py +2 -1
  74. chia/_tests/core/util/test_log_exceptions.py +1 -2
  75. chia/_tests/core/util/test_streamable.py +17 -17
  76. chia/_tests/db/test_db_wrapper.py +3 -2
  77. chia/_tests/environments/wallet.py +14 -14
  78. chia/_tests/ether.py +4 -3
  79. chia/_tests/farmer_harvester/test_farmer.py +41 -24
  80. chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
  81. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
  82. chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
  83. chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
  84. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
  85. chia/_tests/harvester/test_harvester_api.py +11 -4
  86. chia/_tests/plot_sync/test_plot_sync.py +13 -11
  87. chia/_tests/plot_sync/test_receiver.py +11 -10
  88. chia/_tests/plot_sync/test_sync_simulated.py +2 -2
  89. chia/_tests/plot_sync/util.py +1 -2
  90. chia/_tests/plotting/test_plot_manager.py +7 -6
  91. chia/_tests/plotting/test_prover.py +30 -38
  92. chia/_tests/pools/test_pool_cmdline.py +4 -6
  93. chia/_tests/pools/test_pool_rpc.py +203 -61
  94. chia/_tests/pools/test_pool_wallet.py +3 -3
  95. chia/_tests/pools/test_wallet_pool_store.py +1 -4
  96. chia/_tests/process_junit.py +2 -2
  97. chia/_tests/rpc/test_rpc_client.py +4 -4
  98. chia/_tests/rpc/test_rpc_server.py +3 -3
  99. chia/_tests/simulation/test_simulation.py +12 -25
  100. chia/_tests/solver/test_solver_service.py +13 -4
  101. chia/_tests/testconfig.py +2 -2
  102. chia/_tests/timelord/test_new_peak.py +22 -11
  103. chia/_tests/tools/test_run_block.py +0 -2
  104. chia/_tests/tools/test_virtual_project.py +2 -1
  105. chia/_tests/util/benchmarks.py +1 -0
  106. chia/_tests/util/blockchain.py +38 -36
  107. chia/_tests/util/blockchain_mock.py +11 -11
  108. chia/_tests/util/build_network_protocol_files.py +2 -1
  109. chia/_tests/util/coin_store.py +2 -1
  110. chia/_tests/util/config.py +1 -1
  111. chia/_tests/util/db_connection.py +2 -3
  112. chia/_tests/util/full_sync.py +9 -11
  113. chia/_tests/util/gen_ssl_certs.py +4 -5
  114. chia/_tests/util/get_name_puzzle_conditions.py +2 -0
  115. chia/_tests/util/misc.py +24 -24
  116. chia/_tests/util/network_protocol_data.py +20 -3
  117. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  118. chia/_tests/util/protocol_messages_json.py +292 -3
  119. chia/_tests/util/setup_nodes.py +62 -47
  120. chia/_tests/util/spend_sim.py +57 -57
  121. chia/_tests/util/test_async_pool.py +2 -3
  122. chia/_tests/util/test_chia_version.py +1 -3
  123. chia/_tests/util/test_config.py +3 -3
  124. chia/_tests/util/test_full_block_utils.py +6 -3
  125. chia/_tests/util/test_limited_semaphore.py +1 -2
  126. chia/_tests/util/test_misc.py +2 -2
  127. chia/_tests/util/test_network.py +1 -2
  128. chia/_tests/util/test_priority_mutex.py +3 -3
  129. chia/_tests/util/test_recursive_replace.py +5 -6
  130. chia/_tests/util/test_replace_str_to_bytes.py +9 -10
  131. chia/_tests/util/test_testnet_overrides.py +3 -3
  132. chia/_tests/util/time_out_assert.py +2 -2
  133. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
  134. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
  135. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
  136. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
  137. chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
  138. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
  139. chia/_tests/wallet/conftest.py +6 -6
  140. chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
  141. chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
  142. chia/_tests/wallet/did_wallet/test_did.py +16 -6
  143. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
  144. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
  145. chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
  146. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
  147. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
  148. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
  149. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
  150. chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
  151. chia/_tests/wallet/sync/test_wallet_sync.py +63 -60
  152. chia/_tests/wallet/test_clvm_streamable.py +2 -3
  153. chia/_tests/wallet/test_coin_management.py +2 -2
  154. chia/_tests/wallet/test_conditions.py +45 -51
  155. chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
  156. chia/_tests/wallet/test_new_wallet_protocol.py +17 -17
  157. chia/_tests/wallet/test_notifications.py +14 -14
  158. chia/_tests/wallet/test_signer_protocol.py +5 -5
  159. chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
  160. chia/_tests/wallet/test_transaction_store.py +20 -20
  161. chia/_tests/wallet/test_util.py +2 -2
  162. chia/_tests/wallet/test_wallet.py +380 -228
  163. chia/_tests/wallet/test_wallet_action_scope.py +4 -4
  164. chia/_tests/wallet/test_wallet_blockchain.py +12 -12
  165. chia/_tests/wallet/test_wallet_coin_store.py +3 -4
  166. chia/_tests/wallet/test_wallet_node.py +16 -15
  167. chia/_tests/wallet/test_wallet_test_framework.py +2 -1
  168. chia/_tests/wallet/test_wallet_utils.py +2 -3
  169. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
  170. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
  171. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
  172. chia/_tests/wallet/wallet_block_tools.py +12 -11
  173. chia/_tests/weight_proof/config.py +1 -0
  174. chia/_tests/weight_proof/test_weight_proof.py +5 -4
  175. chia/apis/__init__.py +21 -0
  176. chia/apis/farmer_stub.py +102 -0
  177. chia/apis/full_node_stub.py +374 -0
  178. chia/apis/harvester_stub.py +57 -0
  179. chia/apis/introducer_stub.py +35 -0
  180. chia/apis/solver_stub.py +30 -0
  181. chia/apis/stub_protocol_registry.py +21 -0
  182. chia/apis/timelord_stub.py +39 -0
  183. chia/apis/wallet_stub.py +161 -0
  184. chia/cmds/beta.py +3 -4
  185. chia/cmds/beta_funcs.py +4 -3
  186. chia/cmds/check_wallet_db.py +4 -4
  187. chia/cmds/chia.py +1 -2
  188. chia/cmds/cmd_classes.py +11 -13
  189. chia/cmds/cmd_helpers.py +11 -11
  190. chia/cmds/cmds_util.py +15 -15
  191. chia/cmds/coin_funcs.py +6 -7
  192. chia/cmds/coins.py +2 -3
  193. chia/cmds/configure.py +1 -2
  194. chia/cmds/data.py +42 -42
  195. chia/cmds/data_funcs.py +81 -81
  196. chia/cmds/db.py +4 -5
  197. chia/cmds/db_backup_func.py +2 -2
  198. chia/cmds/db_upgrade_func.py +3 -3
  199. chia/cmds/db_validate_func.py +2 -2
  200. chia/cmds/dev/data.py +4 -4
  201. chia/cmds/dev/gh.py +5 -5
  202. chia/cmds/dev/installers.py +2 -3
  203. chia/cmds/dev/mempool.py +3 -4
  204. chia/cmds/dev/mempool_funcs.py +4 -4
  205. chia/cmds/dev/sim.py +8 -8
  206. chia/cmds/dump_keyring.py +3 -3
  207. chia/cmds/farm.py +6 -8
  208. chia/cmds/farm_funcs.py +25 -24
  209. chia/cmds/init_funcs.py +4 -4
  210. chia/cmds/keys.py +16 -18
  211. chia/cmds/keys_funcs.py +36 -36
  212. chia/cmds/netspace.py +1 -3
  213. chia/cmds/netspace_funcs.py +1 -2
  214. chia/cmds/options.py +3 -2
  215. chia/cmds/param_types.py +17 -16
  216. chia/cmds/passphrase.py +6 -7
  217. chia/cmds/passphrase_funcs.py +11 -13
  218. chia/cmds/peer.py +1 -3
  219. chia/cmds/peer_funcs.py +3 -3
  220. chia/cmds/plotnft.py +6 -7
  221. chia/cmds/plotnft_funcs.py +37 -26
  222. chia/cmds/rpc.py +3 -3
  223. chia/cmds/show.py +3 -5
  224. chia/cmds/show_funcs.py +9 -9
  225. chia/cmds/sim_funcs.py +25 -26
  226. chia/cmds/solver.py +1 -3
  227. chia/cmds/solver_funcs.py +1 -2
  228. chia/cmds/start_funcs.py +2 -2
  229. chia/cmds/wallet.py +76 -81
  230. chia/cmds/wallet_funcs.py +206 -177
  231. chia/consensus/augmented_chain.py +6 -6
  232. chia/consensus/block_body_validation.py +19 -15
  233. chia/consensus/block_creation.py +25 -21
  234. chia/consensus/block_header_validation.py +27 -13
  235. chia/consensus/block_height_map.py +3 -6
  236. chia/consensus/block_height_map_protocol.py +2 -2
  237. chia/consensus/block_record.py +2 -4
  238. chia/consensus/blockchain.py +58 -40
  239. chia/consensus/blockchain_interface.py +7 -7
  240. chia/consensus/coin_store_protocol.py +5 -6
  241. chia/consensus/condition_tools.py +4 -4
  242. chia/consensus/cost_calculator.py +2 -3
  243. chia/consensus/default_constants.py +19 -13
  244. chia/consensus/deficit.py +1 -3
  245. chia/consensus/difficulty_adjustment.py +3 -5
  246. chia/consensus/find_fork_point.py +2 -4
  247. chia/consensus/full_block_to_block_record.py +11 -13
  248. chia/consensus/generator_tools.py +2 -3
  249. chia/consensus/get_block_challenge.py +50 -26
  250. chia/consensus/get_block_generator.py +2 -3
  251. chia/consensus/make_sub_epoch_summary.py +8 -7
  252. chia/consensus/multiprocess_validation.py +31 -20
  253. chia/consensus/pos_quality.py +6 -23
  254. chia/consensus/pot_iterations.py +17 -44
  255. chia/consensus/signage_point.py +4 -5
  256. chia/consensus/vdf_info_computation.py +2 -4
  257. chia/daemon/client.py +8 -8
  258. chia/daemon/keychain_proxy.py +31 -37
  259. chia/daemon/server.py +32 -33
  260. chia/daemon/windows_signal.py +4 -3
  261. chia/data_layer/data_layer.py +86 -77
  262. chia/data_layer/data_layer_rpc_api.py +9 -9
  263. chia/data_layer/data_layer_rpc_client.py +13 -15
  264. chia/data_layer/data_layer_server.py +3 -3
  265. chia/data_layer/data_layer_util.py +14 -14
  266. chia/data_layer/data_layer_wallet.py +94 -101
  267. chia/data_layer/data_store.py +50 -50
  268. chia/data_layer/dl_wallet_store.py +9 -12
  269. chia/data_layer/download_data.py +8 -9
  270. chia/data_layer/s3_plugin_service.py +5 -9
  271. chia/data_layer/start_data_layer.py +5 -5
  272. chia/farmer/farmer.py +31 -31
  273. chia/farmer/farmer_api.py +45 -33
  274. chia/farmer/farmer_rpc_api.py +5 -4
  275. chia/farmer/farmer_rpc_client.py +6 -6
  276. chia/farmer/start_farmer.py +6 -6
  277. chia/full_node/block_store.py +13 -16
  278. chia/full_node/check_fork_next_block.py +1 -2
  279. chia/full_node/coin_store.py +15 -16
  280. chia/full_node/eligible_coin_spends.py +3 -3
  281. chia/full_node/fee_estimate_store.py +2 -3
  282. chia/full_node/fee_tracker.py +1 -2
  283. chia/full_node/full_block_utils.py +4 -4
  284. chia/full_node/full_node.py +239 -223
  285. chia/full_node/full_node_api.py +197 -152
  286. chia/full_node/full_node_rpc_api.py +34 -32
  287. chia/full_node/full_node_rpc_client.py +18 -19
  288. chia/full_node/full_node_store.py +45 -43
  289. chia/full_node/hard_fork_utils.py +44 -0
  290. chia/full_node/hint_management.py +2 -2
  291. chia/full_node/mempool.py +17 -19
  292. chia/full_node/mempool_manager.py +89 -42
  293. chia/full_node/pending_tx_cache.py +2 -3
  294. chia/full_node/start_full_node.py +5 -5
  295. chia/full_node/sync_store.py +3 -4
  296. chia/full_node/tx_processing_queue.py +120 -36
  297. chia/full_node/weight_proof.py +61 -48
  298. chia/harvester/harvester.py +25 -24
  299. chia/harvester/harvester_api.py +61 -38
  300. chia/harvester/harvester_rpc_api.py +10 -10
  301. chia/harvester/start_harvester.py +4 -4
  302. chia/introducer/introducer.py +3 -3
  303. chia/introducer/introducer_api.py +6 -4
  304. chia/introducer/start_introducer.py +4 -4
  305. chia/legacy/keyring.py +3 -3
  306. chia/plot_sync/delta.py +1 -2
  307. chia/plot_sync/receiver.py +20 -17
  308. chia/plot_sync/sender.py +15 -10
  309. chia/plotters/bladebit.py +7 -7
  310. chia/plotters/chiapos.py +2 -2
  311. chia/plotters/madmax.py +4 -4
  312. chia/plotters/plotters.py +4 -4
  313. chia/plotters/plotters_util.py +3 -3
  314. chia/plotting/cache.py +20 -14
  315. chia/plotting/check_plots.py +26 -35
  316. chia/plotting/create_plots.py +22 -23
  317. chia/plotting/manager.py +21 -14
  318. chia/plotting/prover.py +59 -42
  319. chia/plotting/util.py +16 -16
  320. chia/pools/pool_config.py +2 -1
  321. chia/pools/pool_puzzles.py +11 -12
  322. chia/pools/pool_wallet.py +34 -57
  323. chia/pools/pool_wallet_info.py +39 -10
  324. chia/protocols/farmer_protocol.py +8 -9
  325. chia/protocols/fee_estimate.py +3 -4
  326. chia/protocols/full_node_protocol.py +3 -4
  327. chia/protocols/harvester_protocol.py +27 -15
  328. chia/protocols/outbound_message.py +3 -3
  329. chia/protocols/pool_protocol.py +8 -9
  330. chia/protocols/shared_protocol.py +1 -2
  331. chia/protocols/solver_protocol.py +9 -2
  332. chia/protocols/timelord_protocol.py +4 -7
  333. chia/protocols/wallet_protocol.py +11 -12
  334. chia/rpc/rpc_client.py +9 -9
  335. chia/rpc/rpc_server.py +17 -17
  336. chia/rpc/util.py +2 -2
  337. chia/seeder/crawler.py +8 -8
  338. chia/seeder/crawler_api.py +21 -27
  339. chia/seeder/crawler_rpc_api.py +2 -2
  340. chia/seeder/dns_server.py +21 -21
  341. chia/seeder/start_crawler.py +4 -4
  342. chia/server/address_manager.py +15 -16
  343. chia/server/api_protocol.py +11 -11
  344. chia/server/chia_policy.py +46 -26
  345. chia/server/introducer_peers.py +2 -3
  346. chia/server/node_discovery.py +19 -19
  347. chia/server/rate_limit_numbers.py +4 -5
  348. chia/server/rate_limits.py +4 -4
  349. chia/server/resolve_peer_info.py +4 -4
  350. chia/server/server.py +49 -52
  351. chia/server/signal_handlers.py +6 -6
  352. chia/server/start_service.py +17 -17
  353. chia/server/upnp.py +4 -6
  354. chia/server/ws_connection.py +52 -37
  355. chia/simulator/add_blocks_in_batches.py +1 -3
  356. chia/simulator/block_tools.py +312 -200
  357. chia/simulator/full_node_simulator.py +56 -35
  358. chia/simulator/keyring.py +2 -3
  359. chia/simulator/setup_services.py +15 -15
  360. chia/simulator/simulator_full_node_rpc_api.py +1 -2
  361. chia/simulator/simulator_full_node_rpc_client.py +1 -2
  362. chia/simulator/simulator_protocol.py +1 -2
  363. chia/simulator/simulator_test_tools.py +3 -3
  364. chia/simulator/start_simulator.py +7 -7
  365. chia/simulator/wallet_tools.py +10 -10
  366. chia/solver/solver.py +10 -10
  367. chia/solver/solver_api.py +10 -8
  368. chia/solver/solver_rpc_api.py +2 -2
  369. chia/solver/start_solver.py +4 -4
  370. chia/ssl/cacert.pem +148 -90
  371. chia/ssl/chia_ca.crt +14 -10
  372. chia/ssl/chia_ca_old.crt +19 -0
  373. chia/ssl/create_ssl.py +4 -4
  374. chia/ssl/renewedselfsignedca.conf +4 -0
  375. chia/ssl/ssl_check.py +1 -2
  376. chia/timelord/iters_from_block.py +1 -4
  377. chia/timelord/start_timelord.py +4 -4
  378. chia/timelord/timelord.py +44 -40
  379. chia/timelord/timelord_api.py +6 -4
  380. chia/timelord/timelord_launcher.py +2 -2
  381. chia/timelord/timelord_rpc_api.py +2 -2
  382. chia/timelord/timelord_state.py +11 -12
  383. chia/types/block_protocol.py +1 -3
  384. chia/types/blockchain_format/coin.py +1 -3
  385. chia/types/blockchain_format/program.py +11 -8
  386. chia/types/blockchain_format/proof_of_space.py +123 -76
  387. chia/types/blockchain_format/tree_hash.py +3 -3
  388. chia/types/blockchain_format/vdf.py +1 -2
  389. chia/types/coin_spend.py +3 -3
  390. chia/types/mempool_item.py +5 -5
  391. chia/types/mempool_submission_status.py +2 -3
  392. chia/types/peer_info.py +1 -2
  393. chia/types/unfinished_header_block.py +3 -4
  394. chia/types/validation_state.py +1 -2
  395. chia/util/action_scope.py +8 -8
  396. chia/util/async_pool.py +5 -5
  397. chia/util/bech32m.py +1 -2
  398. chia/util/beta_metrics.py +2 -2
  399. chia/util/block_cache.py +4 -4
  400. chia/util/chia_logging.py +2 -2
  401. chia/util/chia_version.py +1 -2
  402. chia/util/config.py +15 -16
  403. chia/util/db_wrapper.py +26 -27
  404. chia/util/default_root.py +1 -2
  405. chia/util/errors.py +3 -3
  406. chia/util/file_keyring.py +14 -14
  407. chia/util/files.py +2 -3
  408. chia/util/hash.py +4 -4
  409. chia/util/initial-config.yaml +4 -5
  410. chia/util/inline_executor.py +2 -1
  411. chia/util/ip_address.py +1 -2
  412. chia/util/keychain.py +25 -27
  413. chia/util/keyring_wrapper.py +18 -19
  414. chia/util/lock.py +3 -4
  415. chia/util/log_exceptions.py +1 -2
  416. chia/util/lru_cache.py +2 -2
  417. chia/util/network.py +6 -6
  418. chia/util/path.py +2 -3
  419. chia/util/priority_mutex.py +2 -2
  420. chia/util/profiler.py +1 -2
  421. chia/util/safe_cancel_task.py +1 -2
  422. chia/util/streamable.py +24 -10
  423. chia/util/task_referencer.py +1 -1
  424. chia/util/timing.py +3 -3
  425. chia/util/virtual_project_analysis.py +6 -5
  426. chia/util/ws_message.py +2 -2
  427. chia/wallet/cat_wallet/cat_info.py +3 -4
  428. chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
  429. chia/wallet/cat_wallet/cat_utils.py +3 -4
  430. chia/wallet/cat_wallet/cat_wallet.py +61 -83
  431. chia/wallet/cat_wallet/lineage_store.py +3 -4
  432. chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
  433. chia/wallet/coin_selection.py +9 -10
  434. chia/wallet/conditions.py +142 -106
  435. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
  436. chia/wallet/derivation_record.py +1 -2
  437. chia/wallet/derive_keys.py +2 -4
  438. chia/wallet/did_wallet/did_info.py +10 -11
  439. chia/wallet/did_wallet/did_wallet.py +36 -82
  440. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
  441. chia/wallet/driver_protocol.py +5 -7
  442. chia/wallet/lineage_proof.py +4 -4
  443. chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
  444. chia/wallet/nft_wallet/nft_info.py +8 -9
  445. chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
  446. chia/wallet/nft_wallet/nft_wallet.py +79 -116
  447. chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
  448. chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
  449. chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
  450. chia/wallet/nft_wallet/uncurry_nft.py +10 -11
  451. chia/wallet/notification_manager.py +3 -3
  452. chia/wallet/notification_store.py +44 -61
  453. chia/wallet/outer_puzzles.py +6 -7
  454. chia/wallet/puzzle_drivers.py +34 -6
  455. chia/wallet/puzzles/clawback/drivers.py +6 -6
  456. chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
  457. chia/wallet/puzzles/load_clvm.py +1 -1
  458. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
  459. chia/wallet/puzzles/singleton_top_layer.py +2 -3
  460. chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
  461. chia/wallet/puzzles/tails.py +3 -3
  462. chia/wallet/singleton.py +5 -7
  463. chia/wallet/singleton_record.py +3 -3
  464. chia/wallet/start_wallet.py +5 -5
  465. chia/wallet/trade_manager.py +37 -58
  466. chia/wallet/trade_record.py +4 -4
  467. chia/wallet/trading/offer.py +59 -46
  468. chia/wallet/trading/trade_store.py +8 -9
  469. chia/wallet/transaction_record.py +8 -8
  470. chia/wallet/uncurried_puzzle.py +1 -2
  471. chia/wallet/util/clvm_streamable.py +12 -12
  472. chia/wallet/util/compute_hints.py +4 -5
  473. chia/wallet/util/curry_and_treehash.py +1 -2
  474. chia/wallet/util/merkle_tree.py +2 -3
  475. chia/wallet/util/peer_request_cache.py +8 -8
  476. chia/wallet/util/signing.py +85 -0
  477. chia/wallet/util/tx_config.py +15 -6
  478. chia/wallet/util/wallet_sync_utils.py +14 -16
  479. chia/wallet/util/wallet_types.py +2 -2
  480. chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
  481. chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
  482. chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
  483. chia/wallet/vc_wallet/vc_drivers.py +27 -27
  484. chia/wallet/vc_wallet/vc_store.py +5 -6
  485. chia/wallet/vc_wallet/vc_wallet.py +33 -61
  486. chia/wallet/wallet.py +50 -78
  487. chia/wallet/wallet_action_scope.py +11 -11
  488. chia/wallet/wallet_blockchain.py +12 -12
  489. chia/wallet/wallet_coin_record.py +12 -6
  490. chia/wallet/wallet_coin_store.py +24 -25
  491. chia/wallet/wallet_interested_store.py +3 -5
  492. chia/wallet/wallet_nft_store.py +10 -11
  493. chia/wallet/wallet_node.py +53 -61
  494. chia/wallet/wallet_node_api.py +5 -3
  495. chia/wallet/wallet_protocol.py +23 -23
  496. chia/wallet/wallet_puzzle_store.py +15 -18
  497. chia/wallet/wallet_request_types.py +778 -114
  498. chia/wallet/wallet_retry_store.py +1 -3
  499. chia/wallet/wallet_rpc_api.py +572 -909
  500. chia/wallet/wallet_rpc_client.py +87 -279
  501. chia/wallet/wallet_singleton_store.py +3 -4
  502. chia/wallet/wallet_state_manager.py +332 -106
  503. chia/wallet/wallet_transaction_store.py +11 -14
  504. chia/wallet/wallet_user_store.py +4 -6
  505. chia/wallet/wallet_weight_proof_handler.py +4 -4
  506. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/METADATA +6 -5
  507. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/RECORD +510 -517
  508. chia/apis.py +0 -21
  509. chia/consensus/check_time_locks.py +0 -57
  510. chia/data_layer/puzzles/__init__.py +0 -0
  511. chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
  512. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
  513. chia/types/coin_record.py +0 -44
  514. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  515. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
  516. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
  517. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
  518. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
  519. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
  520. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
  521. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
  522. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
  523. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
  524. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
  525. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
  526. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
  527. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
  528. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
  529. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/WHEEL +0 -0
  530. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/entry_points.txt +0 -0
  531. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/licenses/LICENSE +0 -0
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass, field
4
- from typing import Any, BinaryIO, Optional, Union
4
+ from typing import BinaryIO
5
5
 
6
6
  from chia_puzzles_py.programs import SETTLEMENT_PAYMENT, SETTLEMENT_PAYMENT_HASH
7
7
  from chia_rs import CoinSpend, G2Element
@@ -15,12 +15,13 @@ from chia.types.blockchain_format.program import INFINITE_COST, Program, run_wit
15
15
  from chia.types.coin_spend import make_spend
16
16
  from chia.util.bech32m import bech32_decode, bech32_encode, convertbits
17
17
  from chia.util.errors import Err, ValidationError
18
- from chia.util.streamable import parse_rust
18
+ from chia.util.streamable import Streamable, parse_rust, streamable
19
19
  from chia.wallet.conditions import (
20
20
  AssertCoinAnnouncement,
21
21
  AssertPuzzleAnnouncement,
22
22
  Condition,
23
23
  ConditionValidTimes,
24
+ ConditionValidTimesAbsolute,
24
25
  CreateCoin,
25
26
  parse_conditions_non_consensus,
26
27
  parse_timelock_info,
@@ -43,7 +44,7 @@ from chia.wallet.util.puzzle_compression import (
43
44
  )
44
45
  from chia.wallet.wallet_spend_bundle import WalletSpendBundle
45
46
 
46
- OfferSummary = dict[Union[int, bytes32], int]
47
+ OfferSpecification = dict[int | bytes32, int]
47
48
 
48
49
  OFFER_MOD = Program.from_bytes(SETTLEMENT_PAYMENT)
49
50
  OFFER_MOD_HASH = bytes32(SETTLEMENT_PAYMENT_HASH)
@@ -51,7 +52,7 @@ OFFER_MOD_HASH = bytes32(SETTLEMENT_PAYMENT_HASH)
51
52
 
52
53
  def detect_dependent_coin(
53
54
  names: list[bytes32], deps: dict[bytes32, list[bytes32]], announcement_dict: dict[bytes32, list[bytes32]]
54
- ) -> Optional[tuple[bytes32, bytes32]]:
55
+ ) -> tuple[bytes32, bytes32] | None:
55
56
  # First, we check for any dependencies on coins in the same bundle
56
57
  for name in names:
57
58
  for dependency in deps[name]:
@@ -76,10 +77,22 @@ class NotarizedPayment(CreateCoin):
76
77
  return self.to_program().get_tree_hash()
77
78
 
78
79
 
80
+ @streamable
81
+ @dataclass(frozen=True)
82
+ class OfferSummary(Streamable):
83
+ offered: dict[str, str] # str for negative int support
84
+ requested: dict[str, str] # str for negative int support
85
+ fees: uint64
86
+ infos: dict[str, PuzzleInfo]
87
+ additions: list[bytes32]
88
+ removals: list[bytes32]
89
+ valid_times: ConditionValidTimesAbsolute
90
+
91
+
79
92
  @dataclass(frozen=True, eq=False)
80
93
  class Offer:
81
94
  requested_payments: dict[
82
- Optional[bytes32], list[NotarizedPayment]
95
+ bytes32 | None, list[NotarizedPayment]
83
96
  ] # The key is the asset id of the asset being requested
84
97
  _bundle: WalletSpendBundle
85
98
  driver_dict: dict[bytes32, PuzzleInfo] # asset_id -> asset driver
@@ -88,9 +101,9 @@ class Offer:
88
101
  # ordered by the coin being spent
89
102
  _additions: dict[Coin, list[Coin]] = field(init=False, repr=False)
90
103
  _hints: dict[bytes32, bytes32] = field(init=False)
91
- _offered_coins: dict[Optional[bytes32], list[Coin]] = field(init=False, repr=False)
92
- _final_spend_bundle: Optional[WalletSpendBundle] = field(init=False, repr=False)
93
- _conditions: Optional[dict[Coin, list[Condition]]] = field(init=False)
104
+ _offered_coins: dict[bytes32 | None, list[Coin]] = field(init=False, repr=False)
105
+ _final_spend_bundle: WalletSpendBundle | None = field(init=False, repr=False)
106
+ _conditions: dict[Coin, list[Condition]] | None = field(init=False)
94
107
 
95
108
  @staticmethod
96
109
  def ph() -> bytes32:
@@ -98,15 +111,15 @@ class Offer:
98
111
 
99
112
  @staticmethod
100
113
  def notarize_payments(
101
- requested_payments: dict[Optional[bytes32], list[CreateCoin]], # `None` means you are requesting XCH
114
+ requested_payments: dict[bytes32 | None, list[CreateCoin]], # `None` means you are requesting XCH
102
115
  coins: list[Coin],
103
- ) -> dict[Optional[bytes32], list[NotarizedPayment]]:
116
+ ) -> dict[bytes32 | None, list[NotarizedPayment]]:
104
117
  # This sort should be reproducible in CLVM with `>s`
105
118
  sorted_coins: list[Coin] = sorted(coins, key=Coin.name)
106
- sorted_coin_list: list[list[Union[bytes32, uint64]]] = [coin_as_list(c) for c in sorted_coins]
119
+ sorted_coin_list: list[list[bytes32 | uint64]] = [coin_as_list(c) for c in sorted_coins]
107
120
  nonce: bytes32 = Program.to(sorted_coin_list).get_tree_hash()
108
121
 
109
- notarized_payments: dict[Optional[bytes32], list[NotarizedPayment]] = {}
122
+ notarized_payments: dict[bytes32 | None, list[NotarizedPayment]] = {}
110
123
  for asset_id, payments in requested_payments.items():
111
124
  notarized_payments[asset_id] = []
112
125
  for p in payments:
@@ -117,7 +130,7 @@ class Offer:
117
130
  # The announcements returned from this function must be asserted in whatever spend bundle is created by the wallet
118
131
  @staticmethod
119
132
  def calculate_announcements(
120
- notarized_payments: dict[Optional[bytes32], list[NotarizedPayment]],
133
+ notarized_payments: dict[bytes32 | None, list[NotarizedPayment]],
121
134
  driver_dict: dict[bytes32, PuzzleInfo],
122
135
  ) -> list[AssertPuzzleAnnouncement]:
123
136
  announcements: list[AssertPuzzleAnnouncement] = []
@@ -222,8 +235,8 @@ class Offer:
222
235
 
223
236
  # This method does not get every coin that is being offered, only the `settlement_payment` children
224
237
  # It's also a little heuristic, but it should get most things
225
- def _get_offered_coins(self) -> dict[Optional[bytes32], list[Coin]]:
226
- offered_coins: dict[Optional[bytes32], list[Coin]] = {}
238
+ def _get_offered_coins(self) -> dict[bytes32 | None, list[Coin]]:
239
+ offered_coins: dict[bytes32 | None, list[Coin]] = {}
227
240
 
228
241
  for parent_spend in self._bundle.coin_spends:
229
242
  coins_for_this_spend: list[Coin] = []
@@ -235,8 +248,8 @@ class Offer:
235
248
  puzzle_driver = match_puzzle(parent_puzzle)
236
249
  if puzzle_driver is not None:
237
250
  asset_id = create_asset_id(puzzle_driver)
238
- inner_puzzle: Optional[Program] = get_inner_puzzle(puzzle_driver, parent_puzzle, parent_solution)
239
- inner_solution: Optional[Program] = get_inner_solution(puzzle_driver, parent_solution)
251
+ inner_puzzle: Program | None = get_inner_puzzle(puzzle_driver, parent_puzzle, parent_solution)
252
+ inner_solution: Program | None = get_inner_solution(puzzle_driver, parent_solution)
240
253
  assert inner_puzzle is not None and inner_solution is not None
241
254
 
242
255
  # We're going to look at the conditions created by the inner puzzle
@@ -280,7 +293,7 @@ class Offer:
280
293
  offered_coins[asset_id].extend(coins_for_this_spend)
281
294
  return offered_coins
282
295
 
283
- def get_offered_coins(self) -> dict[Optional[bytes32], list[Coin]]:
296
+ def get_offered_coins(self) -> dict[bytes32 | None, list[Coin]]:
284
297
  try:
285
298
  if self._offered_coins is not None:
286
299
  return self._offered_coins
@@ -288,58 +301,58 @@ class Offer:
288
301
  object.__setattr__(self, "_offered_coins", self._get_offered_coins())
289
302
  return self._offered_coins
290
303
 
291
- def get_offered_amounts(self) -> dict[Optional[bytes32], int]:
292
- offered_coins: dict[Optional[bytes32], list[Coin]] = self.get_offered_coins()
293
- offered_amounts: dict[Optional[bytes32], int] = {}
304
+ def get_offered_amounts(self) -> dict[bytes32 | None, int]:
305
+ offered_coins: dict[bytes32 | None, list[Coin]] = self.get_offered_coins()
306
+ offered_amounts: dict[bytes32 | None, int] = {}
294
307
  for asset_id, coins in offered_coins.items():
295
308
  offered_amounts[asset_id] = uint64(sum(c.amount for c in coins))
296
309
  return offered_amounts
297
310
 
298
- def get_requested_payments(self) -> dict[Optional[bytes32], list[NotarizedPayment]]:
311
+ def get_requested_payments(self) -> dict[bytes32 | None, list[NotarizedPayment]]:
299
312
  return self.requested_payments
300
313
 
301
- def get_requested_amounts(self) -> dict[Optional[bytes32], int]:
302
- requested_amounts: dict[Optional[bytes32], int] = {}
314
+ def get_requested_amounts(self) -> dict[bytes32 | None, int]:
315
+ requested_amounts: dict[bytes32 | None, int] = {}
303
316
  for asset_id, coins in self.get_requested_payments().items():
304
317
  requested_amounts[asset_id] = uint64(sum(c.amount for c in coins))
305
318
  return requested_amounts
306
319
 
307
- def arbitrage(self) -> dict[Optional[bytes32], int]:
320
+ def arbitrage(self) -> dict[bytes32 | None, int]:
308
321
  """
309
322
  Returns a dictionary of the type of each asset and amount that is involved in the trade
310
323
  With the amount being how much their offered amount within the offer
311
324
  exceeds/falls short of their requested amount.
312
325
  """
313
- offered_amounts: dict[Optional[bytes32], int] = self.get_offered_amounts()
314
- requested_amounts: dict[Optional[bytes32], int] = self.get_requested_amounts()
326
+ offered_amounts: dict[bytes32 | None, int] = self.get_offered_amounts()
327
+ requested_amounts: dict[bytes32 | None, int] = self.get_requested_amounts()
315
328
 
316
- arbitrage_dict: dict[Optional[bytes32], int] = {}
329
+ arbitrage_dict: dict[bytes32 | None, int] = {}
317
330
  for asset_id in [*requested_amounts.keys(), *offered_amounts.keys()]:
318
331
  arbitrage_dict[asset_id] = offered_amounts.get(asset_id, 0) - requested_amounts.get(asset_id, 0)
319
332
 
320
333
  return arbitrage_dict
321
334
 
322
335
  # This is a method mostly for the UI that creates a JSON summary of the offer
323
- def summary(self) -> tuple[dict[str, int], dict[str, int], dict[str, dict[str, Any]], ConditionValidTimes]:
324
- offered_amounts: dict[Optional[bytes32], int] = self.get_offered_amounts()
325
- requested_amounts: dict[Optional[bytes32], int] = self.get_requested_amounts()
336
+ def summary(self) -> tuple[dict[str, str], dict[str, str], dict[str, PuzzleInfo], ConditionValidTimes]:
337
+ offered_amounts: dict[bytes32 | None, int] = self.get_offered_amounts()
338
+ requested_amounts: dict[bytes32 | None, int] = self.get_requested_amounts()
326
339
 
327
- def keys_to_strings(dic: dict[Optional[bytes32], Any]) -> dict[str, Any]:
328
- new_dic: dict[str, Any] = {}
340
+ def keys_and_amounts_to_strings(dic: dict[bytes32 | None, int]) -> dict[str, str]:
341
+ new_dic: dict[str, str] = {}
329
342
  for key, val in dic.items():
330
343
  if key is None:
331
- new_dic["xch"] = val
344
+ new_dic["xch"] = str(val)
332
345
  else:
333
- new_dic[key.hex()] = val
346
+ new_dic[key.hex()] = str(val)
334
347
  return new_dic
335
348
 
336
- driver_dict: dict[str, Any] = {}
349
+ driver_dict: dict[str, PuzzleInfo] = {}
337
350
  for key, value in self.driver_dict.items():
338
- driver_dict[key.hex()] = value.info
351
+ driver_dict[key.hex()] = value
339
352
 
340
353
  return (
341
- keys_to_strings(offered_amounts),
342
- keys_to_strings(requested_amounts),
354
+ keys_and_amounts_to_strings(offered_amounts),
355
+ keys_and_amounts_to_strings(requested_amounts),
343
356
  driver_dict,
344
357
  self.absolute_valid_times_ban_relatives(),
345
358
  )
@@ -449,7 +462,7 @@ class Offer:
449
462
 
450
463
  @classmethod
451
464
  def aggregate(cls, offers: list[Offer]) -> Offer:
452
- total_requested_payments: dict[Optional[bytes32], list[NotarizedPayment]] = {}
465
+ total_requested_payments: dict[bytes32 | None, list[NotarizedPayment]] = {}
453
466
  total_bundle = WalletSpendBundle([], G2Element())
454
467
  total_driver_dict: dict[bytes32, PuzzleInfo] = {}
455
468
  for offer in offers:
@@ -481,13 +494,13 @@ class Offer:
481
494
 
482
495
  # A "valid" spend means that this bundle can be pushed to the network and will succeed
483
496
  # This differs from the `to_spend_bundle` method which deliberately creates an invalid SpendBundle
484
- def to_valid_spend(self, arbitrage_ph: Optional[bytes32] = None, solver: Solver = Solver({})) -> WalletSpendBundle:
497
+ def to_valid_spend(self, arbitrage_ph: bytes32 | None = None, solver: Solver = Solver({})) -> WalletSpendBundle:
485
498
  if not self.is_valid():
486
499
  raise ValueError("Offer is currently incomplete")
487
500
 
488
501
  completion_spends: list[CoinSpend] = []
489
- all_offered_coins: dict[Optional[bytes32], list[Coin]] = self.get_offered_coins()
490
- total_arbitrage_amount: dict[Optional[bytes32], int] = self.arbitrage()
502
+ all_offered_coins: dict[bytes32 | None, list[Coin]] = self.get_offered_coins()
503
+ total_arbitrage_amount: dict[bytes32 | None, int] = self.arbitrage()
491
504
  for asset_id, payments in self.requested_payments.items():
492
505
  offered_coins: list[Coin] = all_offered_coins[asset_id]
493
506
 
@@ -612,7 +625,7 @@ class Offer:
612
625
  @classmethod
613
626
  def from_spend_bundle(cls, bundle: WalletSpendBundle) -> Offer:
614
627
  # Because of the `to_spend_bundle` method, we need to parse the dummy CoinSpends as `requested_payments`
615
- requested_payments: dict[Optional[bytes32], list[NotarizedPayment]] = {}
628
+ requested_payments: dict[bytes32 | None, list[NotarizedPayment]] = {}
616
629
  driver_dict: dict[bytes32, PuzzleInfo] = {}
617
630
  leftover_coin_spends: list[CoinSpend] = []
618
631
  for coin_spend in bundle.coin_spends:
@@ -648,7 +661,7 @@ class Offer:
648
661
  return False # don't attempt to compare against unrelated types
649
662
  return self.name() == other.name()
650
663
 
651
- def compress(self, version: Optional[int] = None) -> bytes:
664
+ def compress(self, version: int | None = None) -> bytes:
652
665
  as_spend_bundle = self.to_spend_bundle()
653
666
  if version is None:
654
667
  mods: list[bytes] = [bytes(uncurry(s.puzzle_reveal)[0]) for s in as_spend_bundle.coin_spends]
@@ -667,7 +680,7 @@ class Offer:
667
680
  pass
668
681
  return cls.from_bytes(offer_bytes)
669
682
 
670
- def to_bech32(self, prefix: str = "offer", compression_version: Optional[int] = None) -> str:
683
+ def to_bech32(self, prefix: str = "offer", compression_version: int | None = None) -> str:
671
684
  offer_bytes = self.compress(version=compression_version)
672
685
  encoded = bech32_encode(prefix, convertbits(list(offer_bytes), 8, 5))
673
686
  return encoded
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  from time import perf_counter
5
- from typing import Optional
6
5
 
7
6
  import aiosqlite
8
7
  from chia_rs.sized_bytes import bytes32
@@ -84,7 +83,7 @@ class TradeStore:
84
83
 
85
84
  @classmethod
86
85
  async def create(
87
- cls, db_wrapper: DBWrapper2, cache_size: uint32 = uint32(600000), name: Optional[str] = None
86
+ cls, db_wrapper: DBWrapper2, cache_size: uint32 = uint32(600000), name: str | None = None
88
87
  ) -> TradeStore:
89
88
  self = cls()
90
89
 
@@ -227,7 +226,7 @@ class TradeStore:
227
226
  """
228
227
  Updates the status of the trade
229
228
  """
230
- current: Optional[TradeRecord] = await self.get_trade_record(trade_id)
229
+ current: TradeRecord | None = await self.get_trade_record(trade_id)
231
230
  if current is None:
232
231
  return
233
232
  confirmed_at_index = current.confirmed_at_index
@@ -255,13 +254,13 @@ class TradeStore:
255
254
  await self.add_trade_record(tx, offer_name, replace=True)
256
255
 
257
256
  async def increment_sent(
258
- self, id: bytes32, name: str, send_status: MempoolInclusionStatus, err: Optional[Err]
257
+ self, id: bytes32, name: str, send_status: MempoolInclusionStatus, err: Err | None
259
258
  ) -> bool:
260
259
  """
261
260
  Updates trade sent count (Full Node has received spend_bundle and sent ack).
262
261
  """
263
262
 
264
- current: Optional[TradeRecord] = await self.get_trade_record(id)
263
+ current: TradeRecord | None = await self.get_trade_record(id)
265
264
  if current is None:
266
265
  return False
267
266
 
@@ -322,7 +321,7 @@ class TradeStore:
322
321
 
323
322
  return total, my_offers_count, taken_offers_count
324
323
 
325
- async def get_trade_record(self, trade_id: bytes32) -> Optional[TradeRecord]:
324
+ async def get_trade_record(self, trade_id: bytes32) -> TradeRecord | None:
326
325
  """
327
326
  Checks DB for TradeRecord with id: id and returns it.
328
327
  """
@@ -377,7 +376,7 @@ class TradeStore:
377
376
  start: int,
378
377
  end: int,
379
378
  *,
380
- sort_key: Optional[str] = None,
379
+ sort_key: str | None = None,
381
380
  reverse: bool = False,
382
381
  exclude_my_offers: bool = False,
383
382
  exclude_taken_offers: bool = False,
@@ -398,8 +397,8 @@ class TradeStore:
398
397
 
399
398
  offset = start
400
399
  limit = end - start
401
- where_status_clause: Optional[str] = None
402
- order_by_clause: Optional[str] = None
400
+ where_status_clause: str | None = None
401
+ order_by_clause: str | None = None
403
402
 
404
403
  if not include_completed:
405
404
  # Construct a WHERE clause that only looks at active/pending statuses
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import Generic, Optional, TypeVar
4
+ from typing import Generic, TypeVar
5
5
 
6
6
  from chia_rs import SpendBundle
7
7
  from chia_rs.sized_bytes import bytes32
@@ -29,7 +29,7 @@ class ItemAndTransactionRecords(Generic[T]):
29
29
 
30
30
 
31
31
  @streamable
32
- @dataclass(frozen=True)
32
+ @dataclass(frozen=True, kw_only=True)
33
33
  class TransactionRecordOld(Streamable):
34
34
  """
35
35
  Used for storing transaction data and status in wallets.
@@ -42,15 +42,15 @@ class TransactionRecordOld(Streamable):
42
42
  fee_amount: uint64
43
43
  confirmed: bool
44
44
  sent: uint32
45
- spend_bundle: Optional[WalletSpendBundle]
45
+ spend_bundle: WalletSpendBundle | None
46
46
  additions: list[Coin]
47
47
  removals: list[Coin]
48
48
  wallet_id: uint32
49
49
 
50
50
  # Represents the list of peers that we sent the transaction to, whether each one
51
51
  # included it in the mempool, and what the error message (if any) was
52
- sent_to: list[tuple[str, uint8, Optional[str]]]
53
- trade_id: Optional[bytes32]
52
+ sent_to: list[tuple[str, uint8, str | None]]
53
+ trade_id: bytes32 | None
54
54
  type: uint32 # TransactionType
55
55
 
56
56
  # name is also called bundle_id and tx_id
@@ -64,7 +64,7 @@ class TransactionRecordOld(Streamable):
64
64
  return True
65
65
  return False
66
66
 
67
- def height_farmed(self, genesis_challenge: bytes32) -> Optional[uint32]:
67
+ def height_farmed(self, genesis_challenge: bytes32) -> uint32 | None:
68
68
  if not self.confirmed:
69
69
  return None
70
70
  if self.type in {TransactionType.FEE_REWARD, TransactionType.COINBASE_REWARD}:
@@ -100,7 +100,7 @@ class TransactionRecordOld(Streamable):
100
100
 
101
101
 
102
102
  @streamable
103
- @dataclass(frozen=True)
103
+ @dataclass(frozen=True, kw_only=True)
104
104
  class TransactionRecord(TransactionRecordOld):
105
105
  valid_times: ConditionValidTimes
106
106
  to_address: str
@@ -118,4 +118,4 @@ class LightTransactionRecord(Streamable):
118
118
  type: uint32
119
119
  additions: list[Coin]
120
120
  removals: list[Coin]
121
- spend_bundle: Optional[SpendBundle]
121
+ spend_bundle: SpendBundle | None
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import Union
5
4
 
6
5
  from chia.types.blockchain_format.program import Program, uncurry
7
6
  from chia.types.blockchain_format.serialized_program import SerializedProgram
@@ -13,5 +12,5 @@ class UncurriedPuzzle:
13
12
  args: Program
14
13
 
15
14
 
16
- def uncurry_puzzle(puzzle: Union[Program, SerializedProgram]) -> UncurriedPuzzle:
15
+ def uncurry_puzzle(puzzle: Program | SerializedProgram) -> UncurriedPuzzle:
17
16
  return UncurriedPuzzle(*uncurry(puzzle))
@@ -2,11 +2,11 @@ from __future__ import annotations
2
2
 
3
3
  import dataclasses
4
4
  import functools
5
+ from collections.abc import Callable
5
6
  from types import MappingProxyType
6
- from typing import Any, Callable, Generic, Optional, TypeVar, Union, get_type_hints
7
+ from typing import Any, Generic, TypeGuard, TypeVar, get_type_hints
7
8
 
8
9
  from hsms.clvm_serde import from_program_for_type, to_program_for_type
9
- from typing_extensions import TypeGuard
10
10
 
11
11
  from chia.types.blockchain_format.program import Program
12
12
  from chia.util.byte_types import hexstr_to_bytes
@@ -36,7 +36,7 @@ def clvm_streamable(cls: type[Streamable]) -> type[Streamable]:
36
36
 
37
37
 
38
38
  def program_serialize_clvm_streamable(
39
- clvm_streamable: Streamable, translation_layer: Optional[TranslationLayer] = None
39
+ clvm_streamable: Streamable, translation_layer: TranslationLayer | None = None
40
40
  ) -> Program:
41
41
  if translation_layer is not None:
42
42
  mapping = translation_layer.get_mapping(clvm_streamable.__class__)
@@ -47,17 +47,17 @@ def program_serialize_clvm_streamable(
47
47
 
48
48
 
49
49
  def byte_serialize_clvm_streamable(
50
- clvm_streamable: Streamable, translation_layer: Optional[TranslationLayer] = None
50
+ clvm_streamable: Streamable, translation_layer: TranslationLayer | None = None
51
51
  ) -> bytes:
52
52
  return bytes(program_serialize_clvm_streamable(clvm_streamable, translation_layer=translation_layer))
53
53
 
54
54
 
55
55
  def json_serialize_with_clvm_streamable(
56
56
  streamable: object,
57
- next_recursion_step: Optional[Callable[..., dict[str, Any]]] = None,
58
- translation_layer: Optional[TranslationLayer] = None,
57
+ next_recursion_step: Callable[..., dict[str, Any]] | None = None,
58
+ translation_layer: TranslationLayer | None = None,
59
59
  **next_recursion_env: Any,
60
- ) -> Union[str, dict[str, Any]]:
60
+ ) -> str | dict[str, Any]:
61
61
  if next_recursion_step is None:
62
62
  next_recursion_step = recurse_jsonify
63
63
  if is_clvm_streamable(streamable):
@@ -70,7 +70,7 @@ def json_serialize_with_clvm_streamable(
70
70
 
71
71
 
72
72
  def program_deserialize_clvm_streamable(
73
- program: Program, clvm_streamable_type: type[_T_Streamable], translation_layer: Optional[TranslationLayer] = None
73
+ program: Program, clvm_streamable_type: type[_T_Streamable], translation_layer: TranslationLayer | None = None
74
74
  ) -> _T_Streamable:
75
75
  type_to_deserialize_from: type[Streamable] = clvm_streamable_type
76
76
  if translation_layer is not None:
@@ -86,7 +86,7 @@ def program_deserialize_clvm_streamable(
86
86
 
87
87
 
88
88
  def byte_deserialize_clvm_streamable(
89
- blob: bytes, clvm_streamable_type: type[_T_Streamable], translation_layer: Optional[TranslationLayer] = None
89
+ blob: bytes, clvm_streamable_type: type[_T_Streamable], translation_layer: TranslationLayer | None = None
90
90
  ) -> _T_Streamable:
91
91
  return program_deserialize_clvm_streamable(
92
92
  Program.from_bytes(blob), clvm_streamable_type, translation_layer=translation_layer
@@ -106,9 +106,9 @@ def is_clvm_streamable(v: object) -> TypeGuard[Streamable]:
106
106
 
107
107
 
108
108
  def json_deserialize_with_clvm_streamable(
109
- json_dict: Union[str, dict[str, Any]],
109
+ json_dict: str | dict[str, Any],
110
110
  streamable_type: type[_T_Streamable],
111
- translation_layer: Optional[TranslationLayer] = None,
111
+ translation_layer: TranslationLayer | None = None,
112
112
  ) -> _T_Streamable:
113
113
  # This function is flawed for compound types because it's highjacking the function_to_convert_one_item func
114
114
  # which does not call back to it. More examination is needed.
@@ -164,7 +164,7 @@ class TranslationLayer:
164
164
 
165
165
  def get_mapping(
166
166
  self, _type: type[_T_ClvmStreamable]
167
- ) -> Optional[TranslationLayerMapping[_T_ClvmStreamable, Streamable]]:
167
+ ) -> TranslationLayerMapping[_T_ClvmStreamable, Streamable] | None:
168
168
  mappings = [m for m in self.type_mappings if m.from_type == _type]
169
169
  if len(mappings) == 1:
170
170
  return mappings[0]
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import Optional
5
4
 
6
5
  from chia_rs import CoinSpend
7
6
  from chia_rs.sized_bytes import bytes32
@@ -18,7 +17,7 @@ from chia.util.errors import Err, ValidationError
18
17
  @dataclass(frozen=True)
19
18
  class HintedCoin:
20
19
  coin: Coin
21
- hint: Optional[bytes32]
20
+ hint: bytes32 | None
22
21
 
23
22
 
24
23
  def compute_spend_hints_and_additions(
@@ -54,12 +53,12 @@ def compute_spend_hints_and_additions(
54
53
  assert rf is not None
55
54
 
56
55
  coin: Coin = Coin(cs.coin.name(), bytes32(rf), uint64(condition.at("rrf").as_int()))
57
- hint: Optional[bytes32] = None
56
+ hint: bytes32 | None = None
58
57
  if (
59
- condition.at("rrr") != Program.to(None) # There's more than two arguments
58
+ condition.at("rrr") != Program.NIL # There's more than two arguments
60
59
  and condition.at("rrrf").atom is None # The 3rd argument is a cons
61
60
  ):
62
- potential_hint: Optional[bytes] = condition.at("rrrff").atom
61
+ potential_hint: bytes | None = condition.at("rrrff").atom
63
62
  if potential_hint is not None and len(potential_hint) == 32:
64
63
  hint = bytes32(potential_hint)
65
64
  hinted_coins[bytes32(coin.name())] = HintedCoin(coin, hint)
@@ -1,8 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
- from collections.abc import Sequence
3
+ from collections.abc import Callable, Sequence
4
4
  from hashlib import sha256
5
- from typing import Callable
6
5
 
7
6
  from chia_rs.sized_bytes import bytes32
8
7
 
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import math
4
4
  from enum import Enum
5
- from typing import Optional
6
5
 
7
6
  from chia_rs.sized_bytes import bytes32
8
7
 
@@ -57,7 +56,7 @@ class MerkleTree:
57
56
 
58
57
  def _proof(
59
58
  self, puzzle_hashes: list[bytes32], searching_for: bytes32
60
- ) -> tuple[Optional[int], Optional[list[bytes32]], bytes32, Optional[int]]:
59
+ ) -> tuple[int | None, list[bytes32] | None, bytes32, int | None]:
61
60
  if len(puzzle_hashes) == 1:
62
61
  atom_hash = hash_an_atom(puzzle_hashes[0])
63
62
  if puzzle_hashes[0] == searching_for:
@@ -95,6 +94,6 @@ class MerkleTree:
95
94
 
96
95
  return (final_path, final_list, pair_hash, bit_num + 1 if bit_num is not None else None)
97
96
 
98
- def generate_proof(self, leaf_reveal: bytes32) -> tuple[Optional[int], list[Optional[list[bytes32]]]]:
97
+ def generate_proof(self, leaf_reveal: bytes32) -> tuple[int | None, list[list[bytes32] | None]]:
99
98
  proof = self._proof(self.nodes, leaf_reveal)
100
99
  return (proof[0], [proof[1]])
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
- from typing import Any, Optional
4
+ from typing import Any
5
5
 
6
6
  from chia_rs import CoinState, HeaderBlock
7
7
  from chia_rs.sized_bytes import bytes32
@@ -14,7 +14,7 @@ from chia.util.lru_cache import LRUCache
14
14
  class PeerRequestCache:
15
15
  _blocks: LRUCache[uint32, HeaderBlock] # height -> HeaderBlock
16
16
  _block_requests: LRUCache[tuple[uint32, uint32], asyncio.Task[Any]] # (start, end) -> Task
17
- _states_validated: LRUCache[bytes32, Optional[uint32]] # coin state hash -> last change height, or None for reorg
17
+ _states_validated: LRUCache[bytes32, uint32 | None] # coin state hash -> last change height, or None for reorg
18
18
  _timestamps: LRUCache[uint32, uint64] # block height -> timestamp
19
19
  _blocks_validated: LRUCache[bytes32, uint32] # header_hash -> height
20
20
  _block_signatures_validated: LRUCache[bytes32, uint32] # sig_hash -> height
@@ -33,7 +33,7 @@ class PeerRequestCache:
33
33
  self._additions_in_block = LRUCache(200)
34
34
  self._race_cache = {}
35
35
 
36
- def get_block(self, height: uint32) -> Optional[HeaderBlock]:
36
+ def get_block(self, height: uint32) -> HeaderBlock | None:
37
37
  return self._blocks.get(height)
38
38
 
39
39
  def add_to_blocks(self, header_block: HeaderBlock) -> None:
@@ -43,7 +43,7 @@ class PeerRequestCache:
43
43
  if self._timestamps.get(header_block.height) is None:
44
44
  self._timestamps.put(header_block.height, header_block.foliage_transaction_block.timestamp)
45
45
 
46
- def get_block_request(self, start: uint32, end: uint32) -> Optional[asyncio.Task[Any]]:
46
+ def get_block_request(self, start: uint32, end: uint32) -> asyncio.Task[Any] | None:
47
47
  return self._block_requests.get((start, end))
48
48
 
49
49
  def add_to_block_requests(self, start: uint32, end: uint32, request: asyncio.Task[Any]) -> None:
@@ -53,14 +53,14 @@ class PeerRequestCache:
53
53
  return self._states_validated.get(coin_state_hash) is not None
54
54
 
55
55
  def add_to_states_validated(self, coin_state: CoinState) -> None:
56
- cs_height: Optional[uint32] = None
56
+ cs_height: uint32 | None = None
57
57
  if coin_state.spent_height is not None:
58
58
  cs_height = uint32(coin_state.spent_height)
59
59
  elif coin_state.created_height is not None:
60
60
  cs_height = uint32(coin_state.created_height)
61
61
  self._states_validated.put(coin_state.get_hash(), cs_height)
62
62
 
63
- def get_height_timestamp(self, height: uint32) -> Optional[uint64]:
63
+ def get_height_timestamp(self, height: uint32) -> uint64 | None:
64
64
  return self._timestamps.get(height)
65
65
 
66
66
  def add_to_blocks_validated(self, reward_chain_hash: bytes32, height: uint32) -> None:
@@ -126,7 +126,7 @@ class PeerRequestCache:
126
126
  new_block_requests.put((start_h, end_h), fetch_task)
127
127
  self._block_requests = new_block_requests
128
128
 
129
- new_states_validated: LRUCache[bytes32, Optional[uint32]] = LRUCache(self._states_validated.capacity)
129
+ new_states_validated: LRUCache[bytes32, uint32 | None] = LRUCache(self._states_validated.capacity)
130
130
  for cs_hash, cs_height in self._states_validated.cache.items():
131
131
  if cs_height is not None and cs_height <= height:
132
132
  new_states_validated.put(cs_hash, cs_height)
@@ -158,7 +158,7 @@ class PeerRequestCache:
158
158
 
159
159
 
160
160
  def can_use_peer_request_cache(
161
- coin_state: CoinState, peer_request_cache: PeerRequestCache, fork_height: Optional[uint32]
161
+ coin_state: CoinState, peer_request_cache: PeerRequestCache, fork_height: uint32 | None
162
162
  ) -> bool:
163
163
  if not peer_request_cache.in_states_validated(coin_state.get_hash()):
164
164
  return False