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
@@ -1,7 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from collections.abc import Callable
3
4
  from dataclasses import dataclass
4
- from typing import Any, Callable, Optional
5
+ from typing import Any
5
6
 
6
7
  from chia_rs import CoinSpend
7
8
  from chia_rs.sized_bytes import bytes32
@@ -22,13 +23,13 @@ from chia.wallet.uncurried_puzzle import UncurriedPuzzle, uncurry_puzzle
22
23
 
23
24
  @dataclass(frozen=True)
24
25
  class SingletonOuterPuzzle:
25
- _match: Callable[[UncurriedPuzzle], Optional[PuzzleInfo]]
26
+ _match: Callable[[UncurriedPuzzle], PuzzleInfo | None]
26
27
  _construct: Callable[[PuzzleInfo, Program], Program]
27
28
  _solve: Callable[[PuzzleInfo, Solver, Program, Program], Program]
28
- _get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Optional[Program]], Optional[Program]]
29
- _get_inner_solution: Callable[[PuzzleInfo, Program], Optional[Program]]
29
+ _get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Program | None], Program | None]
30
+ _get_inner_solution: Callable[[PuzzleInfo, Program], Program | None]
30
31
 
31
- def match(self, puzzle: UncurriedPuzzle) -> Optional[PuzzleInfo]:
32
+ def match(self, puzzle: UncurriedPuzzle) -> PuzzleInfo | None:
32
33
  matched, curried_args = match_singleton_puzzle(puzzle)
33
34
  if matched:
34
35
  singleton_struct, inner_puzzle = curried_args
@@ -52,7 +53,7 @@ class SingletonOuterPuzzle:
52
53
  else:
53
54
  return None
54
55
 
55
- def asset_id(self, constructor: PuzzleInfo) -> Optional[bytes32]:
56
+ def asset_id(self, constructor: PuzzleInfo) -> bytes32 | None:
56
57
  return bytes32(constructor["launcher_id"])
57
58
 
58
59
  def construct(self, constructor: PuzzleInfo, inner_puzzle: Program) -> Program:
@@ -63,25 +64,25 @@ class SingletonOuterPuzzle:
63
64
  return puzzle_for_singleton(constructor["launcher_id"], inner_puzzle, launcher_hash)
64
65
 
65
66
  def get_inner_puzzle(
66
- self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Optional[Program] = None
67
- ) -> Optional[Program]:
67
+ self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Program | None = None
68
+ ) -> Program | None:
68
69
  matched, curried_args = match_singleton_puzzle(puzzle_reveal)
69
70
  if matched:
70
71
  _, inner_puzzle = curried_args
71
72
  also = constructor.also()
72
73
  if also is not None:
73
- deep_inner_puzzle: Optional[Program] = self._get_inner_puzzle(also, uncurry_puzzle(inner_puzzle), None)
74
+ deep_inner_puzzle: Program | None = self._get_inner_puzzle(also, uncurry_puzzle(inner_puzzle), None)
74
75
  return deep_inner_puzzle
75
76
  else:
76
77
  return inner_puzzle
77
78
  else:
78
79
  raise ValueError("This driver is not for the specified puzzle reveal")
79
80
 
80
- def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Optional[Program]:
81
+ def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Program | None:
81
82
  my_inner_solution: Program = solution.at("rrf")
82
83
  also = constructor.also()
83
84
  if also:
84
- deep_inner_solution: Optional[Program] = self._get_inner_solution(also, my_inner_solution)
85
+ deep_inner_solution: Program | None = self._get_inner_solution(also, my_inner_solution)
85
86
  return deep_inner_solution
86
87
  else:
87
88
  return my_inner_solution
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from collections.abc import Callable
3
4
  from dataclasses import dataclass
4
- from typing import Callable, Optional
5
5
 
6
6
  from chia_rs.sized_bytes import bytes32
7
7
  from chia_rs.sized_ints import uint16
@@ -30,7 +30,7 @@ def puzzle_for_transfer_program(launcher_id: bytes32, royalty_puzzle_hash: bytes
30
30
 
31
31
  def solution_for_transfer_program(
32
32
  conditions: Program,
33
- current_owner: Optional[bytes32],
33
+ current_owner: bytes32 | None,
34
34
  new_did: bytes32,
35
35
  new_did_inner_hash: bytes32,
36
36
  trade_prices_list: Program,
@@ -40,13 +40,13 @@ def solution_for_transfer_program(
40
40
 
41
41
  @dataclass(frozen=True)
42
42
  class TransferProgramPuzzle:
43
- _match: Callable[[UncurriedPuzzle], Optional[PuzzleInfo]]
43
+ _match: Callable[[UncurriedPuzzle], PuzzleInfo | None]
44
44
  _construct: Callable[[PuzzleInfo, Program], Program]
45
45
  _solve: Callable[[PuzzleInfo, Solver, Program, Program], Program]
46
- _get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Optional[Program]], Optional[Program]]
47
- _get_inner_solution: Callable[[PuzzleInfo, Program], Optional[Program]]
46
+ _get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Program | None], Program | None]
47
+ _get_inner_solution: Callable[[PuzzleInfo, Program], Program | None]
48
48
 
49
- def match(self, puzzle: UncurriedPuzzle) -> Optional[PuzzleInfo]:
49
+ def match(self, puzzle: UncurriedPuzzle) -> PuzzleInfo | None:
50
50
  matched, curried_args = match_transfer_program_puzzle(puzzle)
51
51
  if matched:
52
52
  singleton_struct, royalty_puzzle_hash, percentage = curried_args
@@ -60,7 +60,7 @@ class TransferProgramPuzzle:
60
60
  else:
61
61
  return None
62
62
 
63
- def asset_id(self, constructor: PuzzleInfo) -> Optional[bytes32]:
63
+ def asset_id(self, constructor: PuzzleInfo) -> bytes32 | None:
64
64
  return None
65
65
 
66
66
  def construct(self, constructor: PuzzleInfo, inner_puzzle: Program) -> Program:
@@ -69,12 +69,12 @@ class TransferProgramPuzzle:
69
69
  )
70
70
 
71
71
  def get_inner_puzzle(
72
- self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Optional[Program] = None
73
- ) -> Optional[Program]:
72
+ self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Program | None = None
73
+ ) -> Program | None:
74
74
  return None
75
75
 
76
- def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Optional[Program]:
76
+ def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Program | None:
77
77
  return None
78
78
 
79
79
  def solve(self, constructor: PuzzleInfo, solver: Solver, inner_puzzle: Program, inner_solution: Program) -> Program:
80
- return Program.to(None)
80
+ return Program.NIL
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  from dataclasses import dataclass
5
- from typing import Optional
6
5
 
7
6
  from chia_rs import CoinSpend, CoinState
8
7
  from chia_rs.sized_bytes import bytes32
@@ -66,28 +65,28 @@ class UncurriedNFT(Streamable):
66
65
  """p2 puzzle of the owner, either for ownership layer or standard"""
67
66
 
68
67
  # ownership layer fields
69
- owner_did: Optional[bytes32]
68
+ owner_did: bytes32 | None
70
69
  """Owner's DID"""
71
70
 
72
71
  supports_did: bool
73
72
  """If the inner puzzle support the DID"""
74
73
 
75
- nft_inner_puzzle_hash: Optional[bytes32]
74
+ nft_inner_puzzle_hash: bytes32 | None
76
75
  """Puzzle hash of the ownership layer inner puzzle """
77
76
 
78
- transfer_program: Optional[Program]
77
+ transfer_program: Program | None
79
78
  """Puzzle hash of the transfer program"""
80
79
 
81
- transfer_program_curry_params: Optional[Program]
80
+ transfer_program_curry_params: Program | None
82
81
  """
83
82
  Curried parameters of the transfer program
84
83
  [royalty_address, trade_price_percentage, settlement_mod_hash, cat_mod_hash]
85
84
  """
86
- royalty_address: Optional[bytes32]
87
- trade_price_percentage: Optional[uint16]
85
+ royalty_address: bytes32 | None
86
+ trade_price_percentage: uint16 | None
88
87
 
89
88
  @classmethod
90
- def uncurry(cls, mod: Program, curried_args: Program) -> Optional[Self]:
89
+ def uncurry(cls, mod: Program, curried_args: Program) -> Self | None:
91
90
  """
92
91
  Try to uncurry a NFT puzzle
93
92
  :param cls UncurriedNFT class
@@ -140,11 +139,11 @@ class UncurriedNFT(Streamable):
140
139
  edition_number = kv_pair.rest()
141
140
  if kv_pair.first().as_atom() == b"st":
142
141
  edition_total = kv_pair.rest()
143
- current_did: Optional[bytes32] = None
142
+ current_did: bytes32 | None = None
144
143
  transfer_program = None
145
144
  transfer_program_args = None
146
- royalty_address: Optional[bytes32] = None
147
- royalty_percentage: Optional[uint16] = None
145
+ royalty_address: bytes32 | None = None
146
+ royalty_percentage: uint16 | None = None
148
147
  nft_inner_puzzle_mod = None
149
148
  mod, ol_args = inner_puzzle.uncurry()
150
149
  supports_did = False
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import Any, Optional
4
+ from typing import Any
5
5
 
6
6
  from chia_rs import CoinSpend, CoinState, G2Element
7
7
  from chia_rs.sized_bytes import bytes32
@@ -29,7 +29,7 @@ class NotificationManager:
29
29
  async def create(
30
30
  wallet_state_manager: Any,
31
31
  db_wrapper: DBWrapper2,
32
- name: Optional[str] = None,
32
+ name: str | None = None,
33
33
  ) -> NotificationManager:
34
34
  self = NotificationManager()
35
35
  if name:
@@ -96,7 +96,7 @@ class NotificationManager:
96
96
  notification_spend = make_spend(
97
97
  notification_coin,
98
98
  notification_puzzle,
99
- Program.to(None),
99
+ Program.NIL,
100
100
  )
101
101
  extra_spend_bundle = WalletSpendBundle([notification_spend], G2Element())
102
102
  await self.wallet_state_manager.main_wallet.generate_signed_transaction(
@@ -3,7 +3,6 @@ from __future__ import annotations
3
3
  import dataclasses
4
4
  import logging
5
5
  import sqlite3
6
- from typing import Optional
7
6
 
8
7
  from chia_rs.sized_bytes import bytes32
9
8
  from chia_rs.sized_ints import uint32, uint64
@@ -32,7 +31,7 @@ class NotificationStore:
32
31
 
33
32
  @classmethod
34
33
  async def create(
35
- cls, db_wrapper: DBWrapper2, cache_size: uint32 = uint32(600000), name: Optional[str] = None
34
+ cls, db_wrapper: DBWrapper2, cache_size: uint32 = uint32(600000), name: str | None = None
36
35
  ) -> NotificationStore:
37
36
  self = cls()
38
37
 
@@ -85,58 +84,42 @@ class NotificationStore:
85
84
  )
86
85
  await cursor.close()
87
86
 
88
- async def get_notifications(self, coin_ids: list[bytes32]) -> list[Notification]:
89
- """
90
- Checks DB for Notification with id: id and returns it.
91
- """
92
- coin_ids_str_list = "("
93
- for _ in coin_ids:
94
- coin_ids_str_list += "?"
95
- coin_ids_str_list += ","
96
- coin_ids_str_list = coin_ids_str_list[:-1] if len(coin_ids_str_list) > 1 else "("
97
- coin_ids_str_list += ")"
98
-
99
- async with self.db_wrapper.reader_no_transaction() as conn:
100
- rows = await conn.execute_fetchall(
101
- f"SELECT * from notifications WHERE coin_id IN {coin_ids_str_list} ORDER BY amount DESC", coin_ids
102
- )
103
-
104
- return [
105
- Notification(
106
- bytes32(row[0]),
107
- bytes(row[1]),
108
- uint64.from_bytes(row[2]),
109
- uint32(row[3]),
110
- )
111
- for row in rows
112
- ]
113
-
114
- async def get_all_notifications(
115
- self, pagination: Optional[tuple[Optional[int], Optional[int]]] = None
87
+ async def get_notifications(
88
+ self,
89
+ *,
90
+ coin_ids: list[bytes32] | None = None,
91
+ pagination: tuple[int | None, int | None] = (None, None),
116
92
  ) -> list[Notification]:
117
- """
118
- Checks DB for Notification with id: id and returns it.
119
- """
120
- if pagination is not None:
121
- if pagination[1] is not None and pagination[0] is not None:
122
- pagination_str = " LIMIT ?, ?"
123
- pagination_params: tuple[int, ...] = (pagination[0], pagination[1] - pagination[0])
124
- elif pagination[1] is None and pagination[0] is not None:
125
- pagination_str = " LIMIT ?, (SELECT COUNT(*) from notifications)"
126
- pagination_params = (pagination[0],)
127
- elif pagination[1] is not None and pagination[0] is None:
128
- pagination_str = " LIMIT ?"
129
- pagination_params = (pagination[1],)
130
- else:
131
- pagination_str = ""
132
- pagination_params = tuple()
93
+ if coin_ids is not None:
94
+ coin_ids_str_list = "("
95
+ for _ in coin_ids:
96
+ coin_ids_str_list += "?"
97
+ coin_ids_str_list += ","
98
+ coin_ids_str_list = coin_ids_str_list[:-1] if len(coin_ids_str_list) > 1 else "("
99
+ coin_ids_str_list += ")"
100
+ coin_id_filter = f"WHERE coin_id IN {coin_ids_str_list} "
101
+ coin_id_params = coin_ids
102
+ else:
103
+ coin_id_filter = ""
104
+ coin_id_params = list()
105
+
106
+ if pagination[1] is not None and pagination[0] is not None:
107
+ pagination_str = " LIMIT ?, ?"
108
+ pagination_params: tuple[int, ...] = (pagination[0], pagination[1] - pagination[0])
109
+ elif pagination[1] is None and pagination[0] is not None:
110
+ pagination_str = " LIMIT ?, (SELECT COUNT(*) from notifications)"
111
+ pagination_params = (pagination[0],)
112
+ elif pagination[1] is not None and pagination[0] is None:
113
+ pagination_str = " LIMIT ?"
114
+ pagination_params = (pagination[1],)
133
115
  else:
134
116
  pagination_str = ""
135
117
  pagination_params = tuple()
136
118
 
137
119
  async with self.db_wrapper.reader_no_transaction() as conn:
138
120
  rows = await conn.execute_fetchall(
139
- f"SELECT * from notifications ORDER BY amount DESC{pagination_str}", pagination_params
121
+ f"SELECT * from notifications {coin_id_filter}ORDER BY amount DESC{pagination_str}",
122
+ (*coin_id_params, *pagination_params),
140
123
  )
141
124
 
142
125
  return [
@@ -149,23 +132,23 @@ class NotificationStore:
149
132
  for row in rows
150
133
  ]
151
134
 
152
- async def delete_notifications(self, coin_ids: list[bytes32]) -> None:
153
- coin_ids_str_list = "("
154
- for _ in coin_ids:
155
- coin_ids_str_list += "?"
156
- coin_ids_str_list += ","
157
- coin_ids_str_list = coin_ids_str_list[:-1] if len(coin_ids_str_list) > 1 else "("
158
- coin_ids_str_list += ")"
159
-
160
- async with self.db_wrapper.writer_maybe_transaction() as conn:
161
- # Delete from storage
162
- cursor = await conn.execute(f"DELETE FROM notifications WHERE coin_id IN {coin_ids_str_list}", coin_ids)
163
- await cursor.close()
135
+ async def delete_notifications(self, *, coin_ids: list[bytes32] | None = None) -> None:
136
+ if coin_ids is not None:
137
+ coin_ids_str_list = "("
138
+ for _ in coin_ids:
139
+ coin_ids_str_list += "?"
140
+ coin_ids_str_list += ","
141
+ coin_ids_str_list = coin_ids_str_list[:-1] if len(coin_ids_str_list) > 1 else "("
142
+ coin_ids_str_list += ")"
143
+ coin_id_filter = f"WHERE coin_id IN {coin_ids_str_list} "
144
+ coin_id_params = coin_ids
145
+ else:
146
+ coin_id_filter = ""
147
+ coin_id_params = list()
164
148
 
165
- async def delete_all_notifications(self) -> None:
166
149
  async with self.db_wrapper.writer_maybe_transaction() as conn:
167
150
  # Delete from storage
168
- cursor = await conn.execute("DELETE FROM notifications")
151
+ cursor = await conn.execute(f"DELETE FROM notifications {coin_id_filter}", coin_id_params)
169
152
  await cursor.close()
170
153
 
171
154
  async def notification_exists(self, id: bytes32) -> bool:
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from enum import Enum
4
- from typing import Optional
5
4
 
6
5
  from chia_rs.sized_bytes import bytes32
7
6
 
@@ -47,9 +46,9 @@ class AssetType(Enum):
47
46
  REVOCATION_LAYER = "revocation layer"
48
47
 
49
48
 
50
- def match_puzzle(puzzle: UncurriedPuzzle) -> Optional[PuzzleInfo]:
49
+ def match_puzzle(puzzle: UncurriedPuzzle) -> PuzzleInfo | None:
51
50
  for driver in driver_lookup.values():
52
- potential_info: Optional[PuzzleInfo] = driver.match(puzzle)
51
+ potential_info: PuzzleInfo | None = driver.match(puzzle)
53
52
  if potential_info is not None:
54
53
  return potential_info
55
54
  return None
@@ -64,16 +63,16 @@ def solve_puzzle(constructor: PuzzleInfo, solver: Solver, inner_puzzle: Program,
64
63
 
65
64
 
66
65
  def get_inner_puzzle(
67
- constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Optional[Program] = None
68
- ) -> Optional[Program]:
66
+ constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Program | None = None
67
+ ) -> Program | None:
69
68
  return driver_lookup[AssetType(constructor.type())].get_inner_puzzle(constructor, puzzle_reveal, solution)
70
69
 
71
70
 
72
- def get_inner_solution(constructor: PuzzleInfo, solution: Program) -> Optional[Program]:
71
+ def get_inner_solution(constructor: PuzzleInfo, solution: Program) -> Program | None:
73
72
  return driver_lookup[AssetType(constructor.type())].get_inner_solution(constructor, solution)
74
73
 
75
74
 
76
- def create_asset_id(constructor: PuzzleInfo) -> Optional[bytes32]:
75
+ def create_asset_id(constructor: PuzzleInfo) -> bytes32 | None:
77
76
  return driver_lookup[AssetType(constructor.type())].asset_id(constructor)
78
77
 
79
78
 
@@ -1,11 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
- from dataclasses import dataclass
4
- from typing import Any, Optional
3
+ from typing import Any
5
4
 
6
5
  from clvm.SExp import SExp
7
6
  from clvm_tools.binutils import assemble, type_for_atom
8
7
  from ir.Type import Type
8
+ from typing_extensions import Self
9
9
 
10
10
  from chia.types.blockchain_format.program import Program
11
11
  from chia.util.casts import int_from_bytes
@@ -17,7 +17,6 @@ When you access a value in the dictionary, it will be deserialized to a str, int
17
17
  """
18
18
 
19
19
 
20
- @dataclass(frozen=True)
21
20
  class PuzzleInfo:
22
21
  """
23
22
  There are two 'magic' keys in a PuzzleInfo object:
@@ -27,6 +26,10 @@ class PuzzleInfo:
27
26
 
28
27
  info: dict[str, Any]
29
28
 
29
+ def __init__(self, info: dict[str, Any]) -> None:
30
+ self.info = info
31
+ self.__post_init__()
32
+
30
33
  def __post_init__(self) -> None:
31
34
  if "type" not in self.info:
32
35
  raise ValueError("A type is required to initialize a puzzle driver")
@@ -53,7 +56,7 @@ class PuzzleInfo:
53
56
  def type(self) -> str:
54
57
  return str(self.info["type"])
55
58
 
56
- def also(self) -> Optional[PuzzleInfo]:
59
+ def also(self) -> PuzzleInfo | None:
57
60
  if "also" in self.info:
58
61
  return PuzzleInfo(self.info["also"])
59
62
  else:
@@ -74,11 +77,25 @@ class PuzzleInfo:
74
77
  else:
75
78
  return False
76
79
 
80
+ # Methods to make this a valid Streamable member
81
+ # Should not be being serialized as bytes
82
+ stream = None
83
+ parse = None
84
+
85
+ def to_json_dict(self) -> dict[str, Any]:
86
+ return self.info
87
+
88
+ @classmethod
89
+ def from_json_dict(cls, json_dict: dict[str, Any]) -> Self:
90
+ return cls(json_dict)
91
+
77
92
 
78
- @dataclass(frozen=True)
79
93
  class Solver:
80
94
  info: dict[str, Any]
81
95
 
96
+ def __init__(self, info: dict[str, Any]) -> None:
97
+ self.info = info
98
+
82
99
  def __getitem__(self, item: str) -> Any:
83
100
  value = self.info[item]
84
101
  return decode_info_value(Solver, value)
@@ -92,6 +109,17 @@ class Solver:
92
109
  return False
93
110
  return True
94
111
 
112
+ # Methods to make this a valid Streamable member
113
+ stream = None
114
+ parse = None
115
+
116
+ def to_json_dict(self) -> dict[str, Any]:
117
+ return self.info
118
+
119
+ @classmethod
120
+ def from_json_dict(cls, json_dict: dict[str, Any]) -> Self:
121
+ return cls(json_dict)
122
+
95
123
 
96
124
  def decode_info_value(cls: Any, value: Any) -> Any:
97
125
  if isinstance(value, dict):
@@ -101,7 +129,7 @@ def decode_info_value(cls: Any, value: Any) -> Any:
101
129
  elif isinstance(value, Program) and value.atom is None:
102
130
  return value
103
131
  else:
104
- if value == "()": # special case
132
+ if value in {"()", ""}: # special case
105
133
  return Program.to([])
106
134
  expression: SExp = assemble(value)
107
135
  if expression.atom is None:
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import Any, Optional, Union
4
+ from typing import Any
5
5
 
6
6
  from chia_puzzles_py.programs import (
7
7
  AUGMENTED_CONDITION as AUGMENTED_CONDITION_BYTES,
@@ -43,7 +43,7 @@ AUGMENTED_CONDITION_HASH = bytes32(AUGMENTED_CONDITION_HASH_BYTES)
43
43
  log = logging.getLogger(__name__)
44
44
 
45
45
 
46
- def create_augmented_cond_puzzle(condition: list[Union[int, uint64]], puzzle: Program) -> Program:
46
+ def create_augmented_cond_puzzle(condition: list[int | uint64], puzzle: Program) -> Program:
47
47
  return AUGMENTED_CONDITION.curry(condition, puzzle)
48
48
 
49
49
 
@@ -137,9 +137,9 @@ def create_merkle_solution(
137
137
 
138
138
  def match_clawback_puzzle(
139
139
  uncurried: UncurriedPuzzle,
140
- inner_puzzle: Union[Program, SerializedProgram],
141
- inner_solution: Union[Program, SerializedProgram],
142
- ) -> Optional[ClawbackMetadata]:
140
+ inner_puzzle: Program | SerializedProgram,
141
+ inner_solution: Program | SerializedProgram,
142
+ ) -> ClawbackMetadata | None:
143
143
  # Check if the inner puzzle is a P2 puzzle
144
144
  if MOD != uncurried.mod:
145
145
  return None
@@ -153,7 +153,7 @@ def match_clawback_puzzle(
153
153
  inner_solution,
154
154
  DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM // 8,
155
155
  )
156
- metadata: Optional[ClawbackMetadata] = None
156
+ metadata: ClawbackMetadata | None = None
157
157
  new_puzhash: set[bytes32] = set()
158
158
  if conditions is not None:
159
159
  for condition in conditions:
@@ -1,57 +1,4 @@
1
1
  {
2
- "augmented_condition": "d303eafa617bedf0bc05850dd014e10fbddf622187dc07891a2aacba9d8a93f6",
3
- "block_program_zero": "f0a38c8efe58895ae527c65c37f700a4238504691b83990e5dd91bd8b3c30eae",
4
- "cat_v2": "37bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7a",
5
- "chialisp_deserialisation": "94ec19077f9a34e0b11ad2456af0170f4cc03f11230ca42e3f82e6e644ac4f5d",
6
- "conditions_w_fee_announce": "1a169582dc619f2542f8eb79f02823e1595ba0aca53820f503eda5ff20b47856",
7
- "covenant_layer": "b982796850336aabf9ab17c3f21e299f0c633444117ab5e9ebeafadf1860d9fc",
8
- "create_nft_launcher_from_did": "7a32d2d9571d3436791c0ad3d7fcfdb9c43ace2b0f0ff13f98d29f0cc093f445",
9
- "credential_restriction": "2fdfc1f058cfd65e7ec4e253bfeb394da163ecd0036f508df8629b0a2b8fde96",
10
- "decompress_coin_spend_entry": "9d98ed08770d31be4bd1bde4705dab388db5e7e9c349f5a76fc3c347aa3a0b79",
11
- "decompress_coin_spend_entry_with_prefix": "92aa4bc8060a8836355a1884075141b4791ce1b67ae6092bb166b2845954bc89",
12
- "decompress_puzzle": "fe94c58f1117afe315e0450daca1c62460ec1a1c439cd4018d79967a5d7d1370",
13
- "delegated_tail": "999c3696e167f8a79d938adc11feba3a3dcb39ccff69a426d570706e7b8ec399",
14
- "did_innerpuz": "33143d2bef64f14036742673afd158126b94284b4530a28c354fac202b0c910e",
15
- "eml_covenant_morpher": "6a87946257f555ae82aca6a11b5205058b844f634ecb6c7dc6b0c54eb2996308",
16
- "eml_transfer_program_covenant_adapter": "4218fbebbb6f3c0907ebe8a672fa5d1e4bc655645a3a0073601e6c9b50b07c47",
17
- "eml_update_metadata_with_DID": "d3a9a1fc20f247d009b4b0e941707d50b91885c99d0b27ef882e1294e771139d",
18
- "everything_with_signature": "1720d13250a7c16988eaf530331cefa9dd57a76b2c82236bec8bbbff91499b89",
19
- "exigent_metadata_layer": "d5fd32e069fda83e230ccd8f6a7c4f652231aed5c755514b3d996cbeff4182b8",
20
- "flag_proofs_checker": "fe2e3c631562fbb9be095297f762bf573705a0197164e9361ad5d50e045ba241",
21
- "genesis_by_coin_id": "493afb89eed93ab86741b2aa61b8f5de495d33ff9b781dfc8919e602b2afa150",
22
- "genesis_by_coin_id_or_singleton": "40170305e3a71c3e7523f37fbcfc3188f9f949da0818a6331f28251e76e8c56f",
23
- "genesis_by_puzzle_hash": "de5a6e06d41518be97ff6365694f4f89475dda773dede267caa33da63b434e36",
24
- "graftroot_dl_offers": "0893e36a88c064fddfa6f8abdb42c044584a98cb4273b80cccc83b4867b701a1",
25
- "nft_intermediate_launcher": "7a32d2d9571d3436791c0ad3d7fcfdb9c43ace2b0f0ff13f98d29f0cc093f445",
26
- "nft_metadata_updater_default": "fe8a4b4e27a2e29a4d3fc7ce9d527adbcaccbab6ada3903ccf3ba9a769d2d78b",
27
- "nft_metadata_updater_updateable": "0b1ffba1601777c06b78ab38636e9624f2f8da73be9b36e0ce17c8d8ef3bad9f",
28
- "nft_ownership_layer": "c5abea79afaa001b5427dfa0c8cf42ca6f38f5841b78f9b3c252733eb2de2726",
29
- "nft_ownership_transfer_program_one_way_claim_with_royalties": "025dee0fb1e9fa110302a7e9bfb6e381ca09618e2778b0184fa5c6b275cfce1f",
30
- "nft_state_layer": "a04d9f57764f54a43e4030befb4d80026e870519aaa66334aef8304f5d0393c2",
31
- "notification": "b8b9d8ffca6d5cba5422ead7f477ecfc8f6aaaa1c024b8c3aeb1956b24a0ab1e",
32
- "p2_1_of_n": "46b29fd87fbeb6737600c4543931222a6c1ed3db6fa5601a3ca284a9f4efe780",
33
- "p2_announced_delegated_puzzle": "c4d24c3c5349376f3e8f3aba202972091713b4ec4915f0f26192ae4ace0bd04d",
34
- "p2_conditions": "1c77d7d5efde60a7a1d2d27db6d746bc8e568aea1ef8586ca967a0d60b83cc36",
35
- "p2_delegated_conditions": "0ff94726f1a8dea5c3f70d3121945190778d3b2b3fcda3735a1f290977e98341",
36
- "p2_delegated_puzzle": "542cde70d1102cd1b763220990873efc8ab15625ded7eae22cc11e21ef2e2f7c",
37
- "p2_delegated_puzzle_or_hidden_puzzle": "e9aaa49f45bad5c889b86ee3341550c155cfdd10c3a6757de618d20612fffd52",
38
- "p2_m_of_n_delegate_direct": "0f199d5263ac1a62b077c159404a71abd3f9691cc57520bf1d4c5cb501504457",
39
- "p2_parent": "b10ce2d0b18dcf8c21ddfaf55d9b9f0adcbf1e0beb55b1a8b9cad9bbff4e5f22",
40
- "p2_puzzle_hash": "13e29a62b42cd2ef72a79e4bacdc59733ca6310d65af83d349360d36ec622363",
41
- "p2_singleton": "40f828d8dd55603f4ff9fbf6b73271e904e69406982f4fbefae2c8dcceaf9834",
42
- "p2_singleton_aggregator": "f79a31fcfe3736cc75720617b4cdcb4376b4b8f8f71108617710612b909a4924",
43
- "p2_singleton_or_delayed_puzhash": "adb656e0211e2ab4f42069a4c5efc80dc907e7062be08bf1628c8e5b6d94d25b",
44
- "p2_singleton_via_delegated_puzzle": "9590eaa169e45b655a31d3c06bbd355a3e2b2e3e410d3829748ce08ab249c39e",
45
- "pool_member_innerpuz": "a8490702e333ddd831a3ac9c22d0fa26d2bfeaf2d33608deb22f0e0123eb0494",
46
- "pool_waitingroom_innerpuz": "a317541a765bf8375e1c6e7c13503d0d2cbf56cacad5182befe947e78e2c0307",
47
- "rom_bootstrap_generator": "161bade1f822dcd62ab712ebaf30f3922a301e48a639e4295c5685f8bece7bd9",
48
- "settlement_payments": "cfbfdeed5c4ca2de3d0bf520b9cb4bb7743a359bd2e6a188d19ce7dffc21d3e7",
49
- "singleton_launcher": "eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9",
50
- "singleton_top_layer": "24e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fd",
51
- "singleton_top_layer_v1_1": "7faa3253bfddd1e0decb0906b2dc6247bbc4cf608f58345d173adb63e8b47c9f",
52
- "standard_vc_backdoor_puzzle": "fbce76408ebaf9b3d0b8cd90cc68607755eeca67cd7432d5eea85f3f498cc002",
53
- "std_parent_morpher": "8c3f1dc2e46c0d7ec4c2cbd007e23c0368ff8f80c5bc0101647a5c27626ebce6",
54
2
  "test_generator_deserialize": "52add794fc76e89512e4a063c383418bda084c8a78c74055abe80179e4a7832c",
55
- "test_multiple_generator_input_arguments": "156dafbddc3e1d3bfe1f2a84e48e5e46b287b8358bf65c3c091c93e855fbfc5b",
56
- "viral_backdoor": "00848115554ea674131f89f311707a959ad3f4647482648f3fe91ba289131f51"
3
+ "test_multiple_generator_input_arguments": "156dafbddc3e1d3bfe1f2a84e48e5e46b287b8358bf65c3c091c93e855fbfc5b"
57
4
  }
@@ -8,7 +8,7 @@ import sys
8
8
  import tempfile
9
9
 
10
10
  import importlib_resources
11
- from clvm_tools_rs import compile_clvm as compile_clvm_rust
11
+ from chialisp import compile_clvm as compile_clvm_rust
12
12
 
13
13
  from chia.types.blockchain_format.program import Program
14
14
  from chia.types.blockchain_format.serialized_program import SerializedProgram
@@ -60,7 +60,6 @@ from __future__ import annotations
60
60
 
61
61
  import hashlib
62
62
  from functools import lru_cache
63
- from typing import Union
64
63
 
65
64
  from chia_puzzles_py.programs import P2_DELEGATED_PUZZLE_OR_HIDDEN_PUZZLE
66
65
  from chia_rs import G1Element, PrivateKey
@@ -79,7 +78,7 @@ MOD = Program.from_bytes(P2_DELEGATED_PUZZLE_OR_HIDDEN_PUZZLE)
79
78
 
80
79
  QUOTED_MOD_HASH = calculate_hash_of_quoted_mod_hash(MOD.get_tree_hash())
81
80
 
82
- PublicKeyProgram = Union[bytes, Program]
81
+ PublicKeyProgram = bytes | Program
83
82
 
84
83
  GROUP_ORDER = 0x73EDA753299D7D483339D80809A1D80553BDA402FFFE5BFEFFFFFFFF00000001
85
84
 
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from collections.abc import Iterator
4
- from typing import Optional
5
4
 
6
5
  from chia_puzzles_py.programs import (
7
6
  P2_SINGLETON,
@@ -287,8 +286,8 @@ def claim_p2_singleton(
287
286
  p2_singleton_coin: Coin,
288
287
  singleton_inner_puzhash: bytes32,
289
288
  launcher_id: bytes32,
290
- delay_time: Optional[uint64] = None,
291
- delay_ph: Optional[bytes32] = None,
289
+ delay_time: uint64 | None = None,
290
+ delay_ph: bytes32 | None = None,
292
291
  ) -> tuple[Program, Program, CoinSpend]:
293
292
  assertion = Program.to([ConditionOpcode.ASSERT_COIN_ANNOUNCEMENT, std_hash(p2_singleton_coin.name() + b"$")])
294
293
  announcement = Program.to([ConditionOpcode.CREATE_PUZZLE_ANNOUNCEMENT, p2_singleton_coin.name()])