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
@@ -5,7 +5,7 @@ from dataclasses import dataclass, field
5
5
  from enum import Enum, IntEnum
6
6
  from hashlib import sha256
7
7
  from pathlib import Path
8
- from typing import TYPE_CHECKING, Any, Optional, Union
8
+ from typing import TYPE_CHECKING, Any, Union
9
9
 
10
10
  import aiosqlite
11
11
  from chia_rs.datalayer import ProofOfInclusion, ProofOfInclusionLayer
@@ -250,8 +250,8 @@ class InternalNode:
250
250
  left_hash: bytes32
251
251
  right_hash: bytes32
252
252
 
253
- left: Optional[Node] = None
254
- right: Optional[Node] = None
253
+ left: Node | None = None
254
+ right: Node | None = None
255
255
 
256
256
  @classmethod
257
257
  def from_child_nodes(cls, left: Node, right: Node) -> InternalNode:
@@ -307,7 +307,7 @@ unspecified = Unspecified.instance
307
307
  @dataclass(frozen=True)
308
308
  class Root:
309
309
  store_id: bytes32
310
- node_hash: Optional[bytes32]
310
+ node_hash: bytes32 | None
311
311
  generation: int
312
312
  status: Status
313
313
 
@@ -352,7 +352,7 @@ class Root:
352
352
  }
353
353
 
354
354
 
355
- node_type_to_class: dict[NodeType, type[Union[InternalNode, TerminalNode]]] = {
355
+ node_type_to_class: dict[NodeType, type[InternalNode | TerminalNode]] = {
356
356
  NodeType.INTERNAL: InternalNode,
357
357
  NodeType.TERMINAL: TerminalNode,
358
358
  }
@@ -454,7 +454,7 @@ class Layer:
454
454
  class MakeOfferRequest:
455
455
  maker: tuple[OfferStore, ...]
456
456
  taker: tuple[OfferStore, ...]
457
- fee: Optional[uint64]
457
+ fee: uint64 | None
458
458
 
459
459
  @classmethod
460
460
  def unmarshal(cls, marshalled: dict[str, Any]) -> MakeOfferRequest:
@@ -569,7 +569,7 @@ class MakeOfferResponse:
569
569
  @dataclasses.dataclass(frozen=True)
570
570
  class TakeOfferRequest:
571
571
  offer: Offer
572
- fee: Optional[uint64]
572
+ fee: uint64 | None
573
573
 
574
574
  @classmethod
575
575
  def unmarshal(cls, marshalled: dict[str, Any]) -> TakeOfferRequest:
@@ -609,8 +609,8 @@ class TakeOfferResponse:
609
609
  class VerifyOfferResponse:
610
610
  success: bool
611
611
  valid: bool
612
- error: Optional[str] = None
613
- fee: Optional[uint64] = None
612
+ error: str | None = None
613
+ fee: uint64 | None = None
614
614
 
615
615
  @classmethod
616
616
  def unmarshal(cls, marshalled: dict[str, Any]) -> VerifyOfferResponse:
@@ -635,7 +635,7 @@ class CancelOfferRequest:
635
635
  trade_id: bytes32
636
636
  # cancel on chain (secure) vs. just locally
637
637
  secure: bool
638
- fee: Optional[uint64]
638
+ fee: uint64 | None
639
639
 
640
640
  @classmethod
641
641
  def unmarshal(cls, marshalled: dict[str, Any]) -> CancelOfferRequest:
@@ -691,7 +691,7 @@ class ClearPendingRootsRequest:
691
691
  class ClearPendingRootsResponse:
692
692
  success: bool
693
693
 
694
- root: Optional[Root]
694
+ root: Root | None
695
695
  # store_id: bytes32
696
696
  # node_hash: Optional[bytes32]
697
697
  # generation: int
@@ -765,7 +765,7 @@ class KeysValuesCompressed:
765
765
  keys_values_hashed: dict[bytes32, bytes32]
766
766
  key_hash_to_length: dict[bytes32, int]
767
767
  leaf_hash_to_length: dict[bytes32, int]
768
- root_hash: Optional[bytes32]
768
+ root_hash: bytes32 | None
769
769
 
770
770
 
771
771
  @dataclasses.dataclass(frozen=True)
@@ -773,7 +773,7 @@ class KeysPaginationData:
773
773
  total_pages: int
774
774
  total_bytes: int
775
775
  keys: list[bytes]
776
- root_hash: Optional[bytes32]
776
+ root_hash: bytes32 | None
777
777
 
778
778
 
779
779
  @dataclasses.dataclass(frozen=True)
@@ -781,7 +781,7 @@ class KeysValuesPaginationData:
781
781
  total_pages: int
782
782
  total_bytes: int
783
783
  keys_values: list[TerminalNode]
784
- root_hash: Optional[bytes32]
784
+ root_hash: bytes32 | None
785
785
 
786
786
 
787
787
  @dataclasses.dataclass(frozen=True)
@@ -2,8 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import dataclasses
4
4
  import logging
5
- import time
6
- from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
5
+ from typing import TYPE_CHECKING, Any, ClassVar, cast
7
6
 
8
7
  from chia_rs import BlockRecord, CoinSpend, CoinState, G1Element, G2Element
9
8
  from chia_rs.datalayer import ProofOfInclusion, ProofOfInclusionLayer
@@ -29,7 +28,6 @@ from chia.wallet.conditions import (
29
28
  CreateCoin,
30
29
  CreateCoinAnnouncement,
31
30
  UnknownCondition,
32
- parse_timelock_info,
33
31
  )
34
32
  from chia.wallet.db_wallet.db_wallet_puzzles import (
35
33
  ACS_MU,
@@ -52,9 +50,7 @@ from chia.wallet.singleton import SINGLETON_LAUNCHER_PUZZLE, SINGLETON_LAUNCHER_
52
50
  from chia.wallet.trading.offer import NotarizedPayment, Offer
53
51
  from chia.wallet.transaction_record import TransactionRecord
54
52
  from chia.wallet.util.compute_additions import compute_additions
55
- from chia.wallet.util.compute_memos import compute_memos
56
53
  from chia.wallet.util.merkle_utils import _simplify_merkle_proof
57
- from chia.wallet.util.transaction_type import TransactionType
58
54
  from chia.wallet.util.wallet_sync_utils import fetch_coin_spend, fetch_coin_spend_for_coin_state
59
55
  from chia.wallet.util.wallet_types import WalletType
60
56
  from chia.wallet.wallet import Wallet
@@ -76,7 +72,7 @@ class Mirror(Streamable):
76
72
  amount: uint64
77
73
  urls: list[str]
78
74
  ours: bool
79
- confirmed_at_height: Optional[uint32]
75
+ confirmed_at_height: uint32 | None
80
76
 
81
77
  @staticmethod
82
78
  def encode_urls(urls: list[str]) -> list[bytes]:
@@ -87,6 +83,27 @@ class Mirror(Streamable):
87
83
  return [url.decode("utf8") for url in urls]
88
84
 
89
85
 
86
+ @streamable
87
+ @dataclasses.dataclass(frozen=True)
88
+ class SingletonDependencies(Streamable):
89
+ launcher_id: bytes32
90
+ values_to_prove: list[bytes]
91
+
92
+
93
+ @streamable
94
+ @dataclasses.dataclass(frozen=True)
95
+ class SingletonSummary(Streamable):
96
+ launcher_id: bytes32
97
+ new_root: bytes32
98
+ dependencies: list[SingletonDependencies]
99
+
100
+
101
+ @streamable
102
+ @dataclasses.dataclass(frozen=True)
103
+ class DataLayerSummary(Streamable):
104
+ offered: list[SingletonSummary]
105
+
106
+
90
107
  @final
91
108
  class DataLayerWallet:
92
109
  if TYPE_CHECKING:
@@ -153,7 +170,7 @@ class DataLayerWallet:
153
170
  #############
154
171
 
155
172
  @staticmethod
156
- async def match_dl_launcher(launcher_spend: CoinSpend) -> tuple[bool, Optional[bytes32]]:
173
+ async def match_dl_launcher(launcher_spend: CoinSpend) -> tuple[bool, bytes32 | None]:
157
174
  # Sanity check it's a launcher
158
175
  if launcher_spend.puzzle_reveal != SINGLETON_LAUNCHER_PUZZLE.to_serialized():
159
176
  return False, None
@@ -197,8 +214,8 @@ class DataLayerWallet:
197
214
  self,
198
215
  launcher_id: bytes32,
199
216
  peer: WSChiaConnection,
200
- spend: Optional[CoinSpend] = None,
201
- height: Optional[uint32] = None,
217
+ spend: CoinSpend | None = None,
218
+ height: uint32 | None = None,
202
219
  ) -> None:
203
220
  if await self.wallet_state_manager.dl_store.get_launcher(launcher_id) is not None:
204
221
  self.log.info(f"Spend of launcher {launcher_id} has already been processed")
@@ -216,7 +233,7 @@ class DataLayerWallet:
216
233
  )
217
234
  new_singleton = Coin(launcher_id, full_puzhash, amount)
218
235
 
219
- singleton_record: Optional[SingletonRecord] = await self.wallet_state_manager.dl_store.get_latest_singleton(
236
+ singleton_record: SingletonRecord | None = await self.wallet_state_manager.dl_store.get_latest_singleton(
220
237
  launcher_id
221
238
  )
222
239
  if singleton_record is not None:
@@ -252,9 +269,9 @@ class DataLayerWallet:
252
269
  await self.wallet_state_manager.add_interested_puzzle_hashes([launcher_id], [self.id()])
253
270
  await self.wallet_state_manager.add_interested_coin_ids([new_singleton.name()])
254
271
 
255
- new_singleton_coin_record: Optional[
256
- WalletCoinRecord
257
- ] = await self.wallet_state_manager.coin_store.get_coin_record(new_singleton.name())
272
+ new_singleton_coin_record: WalletCoinRecord | None = await self.wallet_state_manager.coin_store.get_coin_record(
273
+ new_singleton.name()
274
+ )
258
275
  while new_singleton_coin_record is not None and new_singleton_coin_record.spent_block_height > 0:
259
276
  # We've already synced this before, so we need to sort of force a resync
260
277
  parent_spend = await fetch_coin_spend(new_singleton_coin_record.spent_block_height, new_singleton, peer)
@@ -359,10 +376,10 @@ class DataLayerWallet:
359
376
  async def create_update_state_spend(
360
377
  self,
361
378
  launcher_id: bytes32,
362
- root_hash: Optional[bytes32],
379
+ root_hash: bytes32 | None,
363
380
  action_scope: WalletActionScope,
364
- new_puz_hash: Optional[bytes32] = None,
365
- new_amount: Optional[uint64] = None,
381
+ new_puz_hash: bytes32 | None = None,
382
+ new_amount: uint64 | None = None,
366
383
  fee: uint64 = uint64(0),
367
384
  announce_new_state: bool = False,
368
385
  extra_conditions: tuple[Condition, ...] = tuple(),
@@ -372,9 +389,9 @@ class DataLayerWallet:
372
389
  if root_hash is None:
373
390
  root_hash = singleton_record.root
374
391
 
375
- inner_puzzle_derivation: Optional[
376
- DerivationRecord
377
- ] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(
392
+ inner_puzzle_derivation: (
393
+ DerivationRecord | None
394
+ ) = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(
378
395
  singleton_record.inner_puzzle_hash
379
396
  )
380
397
  if inner_puzzle_derivation is None:
@@ -535,25 +552,16 @@ class DataLayerWallet:
535
552
  if announce_new_state:
536
553
  spend_bundle = WalletSpendBundle([coin_spend, second_coin_spend], spend_bundle.aggregated_signature)
537
554
 
538
- dl_tx = TransactionRecord(
539
- confirmed_at_height=uint32(0),
540
- created_at_time=uint64(time.time()),
541
- to_puzzle_hash=new_puz_hash,
542
- to_address=self.wallet_state_manager.encode_puzzle_hash(new_puz_hash),
555
+ dl_tx = self.wallet_state_manager.new_outgoing_transaction(
556
+ wallet_id=self.id(),
557
+ puzzle_hash=new_puz_hash,
543
558
  amount=uint64(singleton_record.lineage_proof.amount),
544
- fee_amount=fee,
545
- confirmed=False,
546
- sent=uint32(10),
559
+ fee=fee,
547
560
  spend_bundle=spend_bundle,
548
561
  additions=spend_bundle.additions(),
549
562
  removals=spend_bundle.removals(),
550
- memos=compute_memos(spend_bundle),
551
- wallet_id=self.id(),
552
- sent_to=[],
553
- trade_id=None,
554
- type=uint32(TransactionType.OUTGOING_TX.value),
555
563
  name=singleton_record.coin_id,
556
- valid_times=parse_timelock_info(extra_conditions),
564
+ extra_conditions=extra_conditions,
557
565
  )
558
566
  assert dl_tx.spend_bundle is not None
559
567
  if fee > 0:
@@ -579,13 +587,13 @@ class DataLayerWallet:
579
587
  puzzle_hashes: list[bytes32],
580
588
  action_scope: WalletActionScope,
581
589
  fee: uint64 = uint64(0),
582
- coins: Optional[set[Coin]] = None,
583
- memos: Optional[list[list[bytes]]] = None, # ignored
590
+ coins: set[Coin] | None = None,
591
+ memos: list[list[bytes]] | None = None, # ignored
584
592
  extra_conditions: tuple[Condition, ...] = tuple(),
585
593
  **kwargs: Unpack[GSTOptionalArgs],
586
594
  ) -> None:
587
- launcher_id: Optional[bytes32] = kwargs.get("launcher_id", None)
588
- new_root_hash: Optional[bytes32] = kwargs.get("new_root_hash", None)
595
+ launcher_id: bytes32 | None = kwargs.get("launcher_id", None)
596
+ new_root_hash: bytes32 | None = kwargs.get("new_root_hash", None)
589
597
  announce_new_state: bool = kwargs.get("announce_new_state", False)
590
598
  # Figure out the launcher ID
591
599
  if coins is None or len(coins) == 0:
@@ -616,7 +624,7 @@ class DataLayerWallet:
616
624
 
617
625
  async def get_spendable_singleton_info(self, launcher_id: bytes32) -> tuple[SingletonRecord, LineageProof]:
618
626
  # First, let's make sure this is a singleton that we track and that we can spend
619
- singleton_record: Optional[SingletonRecord] = await self.get_latest_singleton(launcher_id)
627
+ singleton_record: SingletonRecord | None = await self.get_latest_singleton(launcher_id)
620
628
  if singleton_record is None:
621
629
  raise ValueError(f"Singleton with launcher ID {launcher_id} is not tracked by DL Wallet")
622
630
 
@@ -629,7 +637,7 @@ class DataLayerWallet:
629
637
  raise ValueError(f"Singleton with launcher ID {launcher_id} has insufficient information to spend")
630
638
 
631
639
  # Finally, let's get the parent record for its lineage proof
632
- parent_singleton: Optional[SingletonRecord] = await self.wallet_state_manager.dl_store.get_singleton_record(
640
+ parent_singleton: SingletonRecord | None = await self.wallet_state_manager.dl_store.get_singleton_record(
633
641
  singleton_record.lineage_proof.parent_name
634
642
  )
635
643
  parent_lineage: LineageProof
@@ -637,7 +645,7 @@ class DataLayerWallet:
637
645
  if singleton_record.lineage_proof.parent_name != launcher_id:
638
646
  raise ValueError(f"Have not found the parent of singleton with launcher ID {launcher_id}")
639
647
  else:
640
- launcher_coin: Optional[Coin] = await self.wallet_state_manager.dl_store.get_launcher(launcher_id)
648
+ launcher_coin: Coin | None = await self.wallet_state_manager.dl_store.get_launcher(launcher_id)
641
649
  if launcher_coin is None:
642
650
  raise ValueError(f"DL Wallet does not have launcher info for id {launcher_id}")
643
651
  else:
@@ -658,9 +666,9 @@ class DataLayerWallet:
658
666
  # this is likely due to a race between getting the list and acquiring the extra data
659
667
  continue
660
668
 
661
- inner_puzzle_derivation: Optional[
662
- DerivationRecord
663
- ] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(
669
+ inner_puzzle_derivation: (
670
+ DerivationRecord | None
671
+ ) = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(
664
672
  singleton_record.inner_puzzle_hash
665
673
  )
666
674
  if inner_puzzle_derivation is not None:
@@ -701,9 +709,9 @@ class DataLayerWallet:
701
709
  parent_coin: Coin = (
702
710
  await self.wallet_state_manager.wallet_node.get_coin_state([mirror_coin.parent_coin_info], peer=peer)
703
711
  )[0].coin
704
- inner_puzzle_derivation: Optional[
705
- DerivationRecord
706
- ] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(parent_coin.puzzle_hash)
712
+ inner_puzzle_derivation: (
713
+ DerivationRecord | None
714
+ ) = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(parent_coin.puzzle_hash)
707
715
  if inner_puzzle_derivation is None:
708
716
  raise ValueError(f"DL Wallet does not have permission to delete mirror with ID {mirror_id}")
709
717
 
@@ -730,25 +738,16 @@ class DataLayerWallet:
730
738
 
731
739
  async with action_scope.use() as interface:
732
740
  interface.side_effects.transactions.append(
733
- TransactionRecord(
734
- confirmed_at_height=uint32(0),
735
- created_at_time=uint64(time.time()),
736
- to_puzzle_hash=new_puzhash,
737
- to_address=self.wallet_state_manager.encode_puzzle_hash(new_puzhash),
741
+ self.wallet_state_manager.new_outgoing_transaction(
742
+ wallet_id=self.id(),
743
+ puzzle_hash=new_puzhash,
738
744
  amount=uint64(mirror_coin.amount),
739
- fee_amount=fee,
740
- confirmed=False,
741
- sent=uint32(10),
745
+ fee=fee,
742
746
  spend_bundle=mirror_bundle,
743
747
  additions=mirror_bundle.additions(),
744
748
  removals=mirror_bundle.removals(),
745
- memos=compute_memos(mirror_bundle),
746
- wallet_id=self.id(), # This is being called before the wallet is created so we're using a ID of 0
747
- sent_to=[],
748
- trade_id=None,
749
- type=uint32(TransactionType.OUTGOING_TX.value),
750
749
  name=mirror_bundle.name(),
751
- valid_times=parse_timelock_info(extra_conditions),
750
+ extra_conditions=extra_conditions,
752
751
  )
753
752
  )
754
753
 
@@ -765,7 +764,7 @@ class DataLayerWallet:
765
764
  # SYNCING #
766
765
  ###########
767
766
 
768
- async def coin_added(self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: Optional[object]) -> None:
767
+ async def coin_added(self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: object | None) -> None:
769
768
  if coin.puzzle_hash == create_mirror_puzzle().get_tree_hash():
770
769
  parent_state: CoinState = (
771
770
  await self.wallet_state_manager.wallet_node.get_coin_state([coin.parent_coin_info], peer=peer)
@@ -798,7 +797,7 @@ class DataLayerWallet:
798
797
  matched, _ = match_dl_singleton(puzzle)
799
798
  if matched:
800
799
  self.log.info(f"DL singleton removed: {parent_spend.coin}")
801
- singleton_record: Optional[SingletonRecord] = await self.wallet_state_manager.dl_store.get_singleton_record(
800
+ singleton_record: SingletonRecord | None = await self.wallet_state_manager.dl_store.get_singleton_record(
802
801
  parent_name
803
802
  )
804
803
  if singleton_record is None:
@@ -868,10 +867,8 @@ class DataLayerWallet:
868
867
  # UTILITY #
869
868
  ###########
870
869
 
871
- async def get_latest_singleton(
872
- self, launcher_id: bytes32, only_confirmed: bool = False
873
- ) -> Optional[SingletonRecord]:
874
- singleton: Optional[SingletonRecord] = await self.wallet_state_manager.dl_store.get_latest_singleton(
870
+ async def get_latest_singleton(self, launcher_id: bytes32, only_confirmed: bool = False) -> SingletonRecord | None:
871
+ singleton: SingletonRecord | None = await self.wallet_state_manager.dl_store.get_latest_singleton(
875
872
  launcher_id, only_confirmed
876
873
  )
877
874
  return singleton
@@ -879,9 +876,9 @@ class DataLayerWallet:
879
876
  async def get_history(
880
877
  self,
881
878
  launcher_id: bytes32,
882
- min_generation: Optional[uint32] = None,
883
- max_generation: Optional[uint32] = None,
884
- num_results: Optional[uint32] = None,
879
+ min_generation: uint32 | None = None,
880
+ max_generation: uint32 | None = None,
881
+ num_results: uint32 | None = None,
885
882
  ) -> list[SingletonRecord]:
886
883
  history: list[SingletonRecord] = await self.wallet_state_manager.dl_store.get_all_singletons_for_launcher(
887
884
  launcher_id,
@@ -891,8 +888,8 @@ class DataLayerWallet:
891
888
  )
892
889
  return history
893
890
 
894
- async def get_singleton_record(self, coin_id: bytes32) -> Optional[SingletonRecord]:
895
- singleton: Optional[SingletonRecord] = await self.wallet_state_manager.dl_store.get_singleton_record(coin_id)
891
+ async def get_singleton_record(self, coin_id: bytes32) -> SingletonRecord | None:
892
+ singleton: SingletonRecord | None = await self.wallet_state_manager.dl_store.get_singleton_record(coin_id)
896
893
  return singleton
897
894
 
898
895
  async def get_singletons_by_root(self, launcher_id: bytes32, root: bytes32) -> list[SingletonRecord]:
@@ -924,19 +921,19 @@ class DataLayerWallet:
924
921
  async def new_peak(self, peak: BlockRecord) -> None:
925
922
  pass
926
923
 
927
- async def get_confirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
924
+ async def get_confirmed_balance(self, record_list: set[WalletCoinRecord] | None = None) -> uint128:
928
925
  return uint128(0)
929
926
 
930
- async def get_unconfirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
927
+ async def get_unconfirmed_balance(self, record_list: set[WalletCoinRecord] | None = None) -> uint128:
931
928
  return uint128(0)
932
929
 
933
- async def get_spendable_balance(self, unspent_records: Optional[set[WalletCoinRecord]] = None) -> uint128:
930
+ async def get_spendable_balance(self, unspent_records: set[WalletCoinRecord] | None = None) -> uint128:
934
931
  return uint128(0)
935
932
 
936
933
  async def get_pending_change_balance(self) -> uint64:
937
934
  return uint64(0)
938
935
 
939
- async def get_max_send_amount(self, unspent_records: Optional[set[WalletCoinRecord]] = None) -> uint128:
936
+ async def get_max_send_amount(self, unspent_records: set[WalletCoinRecord] | None = None) -> uint128:
940
937
  return uint128(0)
941
938
 
942
939
  def get_name(self) -> str:
@@ -977,7 +974,7 @@ class DataLayerWallet:
977
974
  @staticmethod
978
975
  async def make_update_offer(
979
976
  wallet_state_manager: Any,
980
- offer_dict: dict[Optional[bytes32], int],
977
+ offer_dict: dict[bytes32 | None, int],
981
978
  driver_dict: dict[bytes32, PuzzleInfo],
982
979
  solver: Solver,
983
980
  action_scope: WalletActionScope,
@@ -1104,7 +1101,7 @@ class DataLayerWallet:
1104
1101
  all_proofs = []
1105
1102
  roots = []
1106
1103
  for singleton, values in zip(singleton_structs.as_iter(), values_to_prove.as_python()):
1107
- asserted_root: Optional[str] = None
1104
+ asserted_root: str | None = None
1108
1105
  proofs_of_inclusion = []
1109
1106
  for value in values:
1110
1107
  for proof_of_inclusion in solver["proofs_of_inclusion"]:
@@ -1146,8 +1143,8 @@ class DataLayerWallet:
1146
1143
  return Offer({}, WalletSpendBundle(new_spends, offer.aggregated_signature()), offer.driver_dict)
1147
1144
 
1148
1145
  @staticmethod
1149
- async def get_offer_summary(offer: Offer) -> dict[str, Any]:
1150
- summary: dict[str, Any] = {"offered": []}
1146
+ async def get_offer_summary(offer: Offer) -> DataLayerSummary:
1147
+ singleton_summaries = []
1151
1148
  for spend in offer.coin_spends():
1152
1149
  solution = Program.from_serialized(spend.solution)
1153
1150
  matched, curried_args = match_dl_singleton(spend.puzzle_reveal)
@@ -1162,21 +1159,22 @@ class DataLayerWallet:
1162
1159
  cs for cs in offer.coin_spends() if cs.coin.parent_coin_info == spend.coin.name()
1163
1160
  )
1164
1161
  _, child_curried_args = match_dl_singleton(child_spend.puzzle_reveal)
1165
- singleton_summary = {
1166
- "launcher_id": list(curried_args)[2].as_python().hex(),
1167
- "new_root": list(child_curried_args)[1].as_python().hex(),
1168
- "dependencies": [],
1169
- }
1170
1162
  _, singleton_structs, _, values_to_prove = graftroot_curried_args.as_iter()
1163
+ dependencies = []
1171
1164
  for struct, values in zip(singleton_structs.as_iter(), values_to_prove.as_iter()):
1172
- singleton_summary["dependencies"].append(
1173
- {
1174
- "launcher_id": struct.at("rf").as_python().hex(),
1175
- "values_to_prove": [value.as_python().hex() for value in values.as_iter()],
1176
- }
1165
+ dependencies.append(
1166
+ SingletonDependencies(
1167
+ launcher_id=bytes32(struct.at("rf").as_atom()),
1168
+ values_to_prove=[value.as_atom() for value in values.as_iter()],
1169
+ )
1177
1170
  )
1178
- summary["offered"].append(singleton_summary)
1179
- return summary
1171
+ singleton_summary = SingletonSummary(
1172
+ launcher_id=bytes32(list(curried_args)[2].as_atom()),
1173
+ new_root=bytes32(list(child_curried_args)[1].as_atom()),
1174
+ dependencies=dependencies,
1175
+ )
1176
+ singleton_summaries.append(singleton_summary)
1177
+ return DataLayerSummary(offered=singleton_summaries)
1180
1178
 
1181
1179
  async def select_coins(
1182
1180
  self,
@@ -1192,7 +1190,7 @@ class DataLayerWallet:
1192
1190
  def verify_offer(
1193
1191
  maker: tuple[StoreProofs, ...],
1194
1192
  taker: tuple[OfferStore, ...],
1195
- summary: dict[str, Any],
1193
+ summary: DataLayerSummary,
1196
1194
  ) -> None:
1197
1195
  # TODO: consistency in error messages
1198
1196
  # TODO: custom exceptions
@@ -1234,10 +1232,7 @@ def verify_offer(
1234
1232
  raise OfferIntegrityError("maker: no roots referenced for store id")
1235
1233
 
1236
1234
  # TODO: what about validating duplicate entries are consistent?
1237
- maker_from_offer = {
1238
- bytes32.from_hexstr(offered["launcher_id"]): bytes32.from_hexstr(offered["new_root"])
1239
- for offered in summary["offered"]
1240
- }
1235
+ maker_from_offer = {offered.launcher_id: offered.new_root for offered in summary.offered}
1241
1236
 
1242
1237
  maker_from_reference = {
1243
1238
  # verified above that there is at least one proof and all combined hashes match
@@ -1249,11 +1244,9 @@ def verify_offer(
1249
1244
  raise OfferIntegrityError("maker: offered stores and their roots do not match the reference data")
1250
1245
 
1251
1246
  taker_from_offer = {
1252
- bytes32.from_hexstr(dependency["launcher_id"]): [
1253
- bytes32.from_hexstr(value) for value in dependency["values_to_prove"]
1254
- ]
1255
- for offered in summary["offered"]
1256
- for dependency in offered["dependencies"]
1247
+ dependency.launcher_id: [bytes32(value) for value in dependency.values_to_prove]
1248
+ for offered in summary.offered
1249
+ for dependency in offered.dependencies
1257
1250
  }
1258
1251
 
1259
1252
  taker_from_reference = {