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,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import Any, Literal, Optional, Union
4
+ from typing import Any, Literal
5
5
 
6
6
  from chia_rs.sized_bytes import bytes32
7
7
  from chia_rs.sized_ints import uint16, uint64
@@ -82,7 +82,7 @@ async def get_nft_info_from_puzzle(nft_coin_info: NFTCoinInfo, config: dict[str,
82
82
  :param ignore_size_limit Ignore the off-chain metadata loading size limit
83
83
  :return: NFTInfo
84
84
  """
85
- uncurried_nft: Optional[UncurriedNFT] = UncurriedNFT.uncurry(*nft_coin_info.full_puzzle.uncurry())
85
+ uncurried_nft: UncurriedNFT | None = UncurriedNFT.uncurry(*nft_coin_info.full_puzzle.uncurry())
86
86
  assert uncurried_nft is not None
87
87
  data_uris: list[str] = []
88
88
 
@@ -94,7 +94,7 @@ async def get_nft_info_from_puzzle(nft_coin_info: NFTCoinInfo, config: dict[str,
94
94
  license_uris: list[str] = []
95
95
  for uri in uncurried_nft.license_uris.as_python():
96
96
  license_uris.append(str(uri, "utf-8"))
97
- off_chain_metadata: Optional[str] = None
97
+ off_chain_metadata: str | None = None
98
98
  nft_info = NFTInfo(
99
99
  encode_puzzle_hash(uncurried_nft.singleton_launcher_id, prefix=AddressType.NFT.hrp(config=config)),
100
100
  uncurried_nft.singleton_launcher_id,
@@ -177,7 +177,7 @@ def update_metadata(metadata: Program, update_condition: Program) -> Program:
177
177
 
178
178
 
179
179
  def construct_ownership_layer(
180
- current_owner: Optional[bytes32],
180
+ current_owner: bytes32 | None,
181
181
  transfer_program: Program,
182
182
  inner_puzzle: Program,
183
183
  ) -> Program:
@@ -189,7 +189,7 @@ def create_ownership_layer_puzzle(
189
189
  did_id: bytes,
190
190
  p2_puzzle: Program,
191
191
  percentage: uint16,
192
- royalty_puzzle_hash: Optional[bytes32] = None,
192
+ royalty_puzzle_hash: bytes32 | None = None,
193
193
  ) -> Program:
194
194
  log.debug(
195
195
  "Creating ownership layer puzzle with NFT_ID: %s DID_ID: %s Royalty_Percentage: %d P2_puzzle: %s",
@@ -230,7 +230,7 @@ def create_ownership_layer_transfer_solution(
230
230
  def get_metadata_and_phs(unft: UncurriedNFT, solution: SerializedProgram) -> tuple[Program, bytes32]:
231
231
  conditions = unft.p2_puzzle.run(unft.get_innermost_solution(Program.from_serialized(solution)))
232
232
  metadata = unft.metadata
233
- puzhash_for_derivation: Optional[bytes32] = None
233
+ puzhash_for_derivation: bytes32 | None = None
234
234
  for condition in conditions.as_iter():
235
235
  if condition.list_len() < 2:
236
236
  # invalid condition
@@ -279,9 +279,9 @@ def recurry_nft_puzzle(unft: UncurriedNFT, solution: Program, new_inner_puzzle:
279
279
  return new_ownership_puzzle
280
280
 
281
281
 
282
- def get_new_owner_did(unft: UncurriedNFT, solution: Program) -> Union[Literal[b""], bytes32, None]:
282
+ def get_new_owner_did(unft: UncurriedNFT, solution: Program) -> Literal[b""] | bytes32 | None:
283
283
  conditions = unft.p2_puzzle.run(unft.get_innermost_solution(solution))
284
- new_did_id: Union[Literal[b""], bytes32, None] = None
284
+ new_did_id: Literal[b""] | bytes32 | None = None
285
285
  for condition in conditions.as_iter():
286
286
  if condition.first().as_int() == -10:
287
287
  # this is the change owner magic condition
@@ -3,8 +3,7 @@ from __future__ import annotations
3
3
  import json
4
4
  import logging
5
5
  import math
6
- import time
7
- from typing import TYPE_CHECKING, Any, ClassVar, Optional, TypeVar, cast
6
+ from typing import TYPE_CHECKING, Any, ClassVar, TypeVar, cast
8
7
 
9
8
  from chia_rs import AugSchemeMPL, CoinSpend, CoinState, G1Element, G2Element
10
9
  from chia_rs.sized_bytes import bytes32
@@ -15,7 +14,6 @@ from chia.server.ws_connection import WSChiaConnection
15
14
  from chia.types.blockchain_format.coin import Coin
16
15
  from chia.types.blockchain_format.program import Program
17
16
  from chia.types.coin_spend import make_spend
18
- from chia.types.signing_mode import CHIP_0002_SIGN_MESSAGE_PREFIX, SigningMode
19
17
  from chia.util.casts import int_from_bytes, int_to_bytes
20
18
  from chia.util.hash import std_hash
21
19
  from chia.wallet.conditions import (
@@ -26,7 +24,6 @@ from chia.wallet.conditions import (
26
24
  CreateCoinAnnouncement,
27
25
  CreatePuzzleAnnouncement,
28
26
  UnknownCondition,
29
- parse_timelock_info,
30
27
  )
31
28
  from chia.wallet.derivation_record import DerivationRecord
32
29
  from chia.wallet.did_wallet import did_wallet_puzzles
@@ -40,8 +37,6 @@ from chia.wallet.nft_wallet.uncurry_nft import NFTCoinData, UncurriedNFT
40
37
  from chia.wallet.outer_puzzles import AssetType, construct_puzzle, match_puzzle, solve_puzzle
41
38
  from chia.wallet.puzzle_drivers import PuzzleInfo, Solver
42
39
  from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import (
43
- DEFAULT_HIDDEN_PUZZLE_HASH,
44
- calculate_synthetic_secret_key,
45
40
  puzzle_for_pk,
46
41
  )
47
42
  from chia.wallet.singleton import SINGLETON_LAUNCHER_PUZZLE, SINGLETON_LAUNCHER_PUZZLE_HASH, create_singleton_puzzle
@@ -49,8 +44,6 @@ from chia.wallet.trading.offer import OFFER_MOD, OFFER_MOD_HASH, NotarizedPaymen
49
44
  from chia.wallet.transaction_record import TransactionRecord
50
45
  from chia.wallet.uncurried_puzzle import uncurry_puzzle
51
46
  from chia.wallet.util.compute_additions import compute_additions
52
- from chia.wallet.util.compute_memos import compute_memos
53
- from chia.wallet.util.transaction_type import TransactionType
54
47
  from chia.wallet.util.wallet_types import WalletType
55
48
  from chia.wallet.wallet import Wallet
56
49
  from chia.wallet.wallet_action_scope import WalletActionScope
@@ -76,7 +69,7 @@ class NFTWallet:
76
69
  nft_store: WalletNftStore
77
70
 
78
71
  @property
79
- def did_id(self) -> Optional[bytes32]:
72
+ def did_id(self) -> bytes32 | None:
80
73
  return self.nft_wallet_info.did_id
81
74
 
82
75
  @classmethod
@@ -84,8 +77,8 @@ class NFTWallet:
84
77
  cls: type[_T_NFTWallet],
85
78
  wallet_state_manager: Any,
86
79
  wallet: Wallet,
87
- did_id: Optional[bytes32] = None,
88
- name: Optional[str] = None,
80
+ did_id: bytes32 | None = None,
81
+ name: str | None = None,
89
82
  ) -> _T_NFTWallet:
90
83
  """
91
84
  This must be called under the wallet state manager lock
@@ -115,7 +108,7 @@ class NFTWallet:
115
108
  wallet_state_manager: Any,
116
109
  wallet: Wallet,
117
110
  wallet_info: WalletInfo,
118
- name: Optional[str] = None,
111
+ name: str | None = None,
119
112
  ) -> _T_NFTWallet:
120
113
  self = cls()
121
114
  self.log = logging.getLogger(name if name else __name__)
@@ -135,25 +128,25 @@ class NFTWallet:
135
128
  def id(self) -> uint32:
136
129
  return self.wallet_info.id
137
130
 
138
- def get_did(self) -> Optional[bytes32]:
131
+ def get_did(self) -> bytes32 | None:
139
132
  return self.did_id
140
133
 
141
- async def get_confirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
134
+ async def get_confirmed_balance(self, record_list: set[WalletCoinRecord] | None = None) -> uint128:
142
135
  """The NFT wallet doesn't really have a balance."""
143
136
  return uint128(0)
144
137
 
145
- async def get_unconfirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
138
+ async def get_unconfirmed_balance(self, record_list: set[WalletCoinRecord] | None = None) -> uint128:
146
139
  """The NFT wallet doesn't really have a balance."""
147
140
  return uint128(0)
148
141
 
149
- async def get_spendable_balance(self, unspent_records: Optional[set[WalletCoinRecord]] = None) -> uint128:
142
+ async def get_spendable_balance(self, unspent_records: set[WalletCoinRecord] | None = None) -> uint128:
150
143
  """The NFT wallet doesn't really have a balance."""
151
144
  return uint128(0)
152
145
 
153
146
  async def get_pending_change_balance(self) -> uint64:
154
147
  return uint64(0)
155
148
 
156
- async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
149
+ async def get_max_send_amount(self, records: set[WalletCoinRecord] | None = None) -> uint128:
157
150
  """This is the confirmed balance, which we set to 0 as the NFT wallet doesn't have one."""
158
151
  return uint128(0)
159
152
 
@@ -164,7 +157,7 @@ class NFTWallet:
164
157
  return nft_coin
165
158
 
166
159
  async def coin_added(
167
- self, coin: Coin, height: uint32, peer: WSChiaConnection, parent_coin_data: Optional[NFTCoinData]
160
+ self, coin: Coin, height: uint32, peer: WSChiaConnection, parent_coin_data: NFTCoinData | None
168
161
  ) -> None:
169
162
  """Notification from wallet state manager that wallet has been received."""
170
163
  self.log.info(f"NFT wallet %s has been notified that {coin} was added", self.get_name())
@@ -191,9 +184,9 @@ class NFTWallet:
191
184
  metadata, p2_puzzle_hash = get_metadata_and_phs(uncurried_nft, data.parent_coin_spend.solution)
192
185
  self.log.debug("Got back puzhash from solution: %s", p2_puzzle_hash)
193
186
  self.log.debug("Got back updated metadata: %s", metadata)
194
- derivation_record: Optional[
195
- DerivationRecord
196
- ] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(p2_puzzle_hash)
187
+ derivation_record: (
188
+ DerivationRecord | None
189
+ ) = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(p2_puzzle_hash)
197
190
  self.log.debug("Record for %s is: %s", p2_puzzle_hash, derivation_record)
198
191
  if derivation_record is None:
199
192
  self.log.debug("Not our NFT, pointing to %s, skipping", p2_puzzle_hash)
@@ -267,7 +260,7 @@ class NFTWallet:
267
260
  puzzle: Program,
268
261
  lineage_proof: LineageProof,
269
262
  mint_height: uint32,
270
- minter_did: Optional[bytes32],
263
+ minter_did: bytes32 | None,
271
264
  confirmed_height: uint32,
272
265
  ) -> None:
273
266
  new_nft = NFTCoinInfo(nft_id, coin, lineage_proof, puzzle, mint_height, minter_did, confirmed_height)
@@ -300,7 +293,7 @@ class NFTWallet:
300
293
  self,
301
294
  nft_ids: list[bytes32],
302
295
  action_scope: WalletActionScope,
303
- did_id: Optional[bytes32] = None,
296
+ did_id: bytes32 | None = None,
304
297
  ) -> bytes32:
305
298
  """Get DID spend with announcement created we need to transfer NFT with did with current inner hash of DID
306
299
 
@@ -329,10 +322,10 @@ class NFTWallet:
329
322
  self,
330
323
  metadata: Program,
331
324
  action_scope: WalletActionScope,
332
- target_puzzle_hash: Optional[bytes32] = None,
333
- royalty_puzzle_hash: Optional[bytes32] = None,
325
+ target_puzzle_hash: bytes32 | None = None,
326
+ royalty_puzzle_hash: bytes32 | None = None,
334
327
  percentage: uint16 = uint16(0),
335
- did_id: Optional[bytes] = None,
328
+ did_id: bytes | None = None,
336
329
  fee: uint64 = uint64(0),
337
330
  extra_conditions: tuple[Condition, ...] = tuple(),
338
331
  ) -> bytes32:
@@ -488,36 +481,24 @@ class NFTWallet:
488
481
  async def convert_puzzle_hash(self, puzhash: bytes32) -> bytes32:
489
482
  return puzhash
490
483
 
491
- async def get_nft(self, launcher_id: bytes32) -> Optional[NFTCoinInfo]:
484
+ async def get_nft(self, launcher_id: bytes32) -> NFTCoinInfo | None:
492
485
  return await self.nft_store.get_nft_by_id(launcher_id)
493
486
 
494
487
  async def get_puzzle_info(self, nft_id: bytes32) -> PuzzleInfo:
495
- nft_coin: Optional[NFTCoinInfo] = await self.get_nft(nft_id)
488
+ nft_coin: NFTCoinInfo | None = await self.get_nft(nft_id)
496
489
  if nft_coin is None:
497
490
  raise ValueError("An asset ID was specified that this wallet doesn't track")
498
- puzzle_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_coin.full_puzzle))
491
+ puzzle_info: PuzzleInfo | None = match_puzzle(uncurry_puzzle(nft_coin.full_puzzle))
499
492
  if puzzle_info is None:
500
493
  raise ValueError("Internal Error: NFT wallet is tracking a non NFT coin")
501
494
  else:
502
495
  return puzzle_info
503
496
 
504
- async def sign_message(self, message: str, nft: NFTCoinInfo, mode: SigningMode) -> tuple[G1Element, G2Element]:
497
+ async def current_p2_puzzle_hash(self, nft: NFTCoinInfo) -> bytes32:
505
498
  uncurried_nft = UncurriedNFT.uncurry(*nft.full_puzzle.uncurry())
506
499
  if uncurried_nft is not None:
507
500
  p2_puzzle = uncurried_nft.p2_puzzle
508
- puzzle_hash = p2_puzzle.get_tree_hash()
509
- private = await self.wallet_state_manager.get_private_key(puzzle_hash)
510
- synthetic_secret_key = calculate_synthetic_secret_key(private, DEFAULT_HIDDEN_PUZZLE_HASH)
511
- synthetic_pk = synthetic_secret_key.get_g1()
512
- if mode == SigningMode.CHIP_0002_HEX_INPUT:
513
- hex_message: bytes = Program.to((CHIP_0002_SIGN_MESSAGE_PREFIX, bytes.fromhex(message))).get_tree_hash()
514
- elif mode == SigningMode.BLS_MESSAGE_AUGMENTATION_UTF8_INPUT:
515
- hex_message = bytes(message, "utf-8")
516
- elif mode == SigningMode.BLS_MESSAGE_AUGMENTATION_HEX_INPUT:
517
- hex_message = bytes.fromhex(message)
518
- else:
519
- hex_message = Program.to((CHIP_0002_SIGN_MESSAGE_PREFIX, message)).get_tree_hash()
520
- return synthetic_pk, AugSchemeMPL.sign(synthetic_secret_key, hex_message)
501
+ return p2_puzzle.get_tree_hash()
521
502
  else:
522
503
  raise ValueError("Invalid NFT puzzle.")
523
504
 
@@ -527,7 +508,7 @@ class NFTWallet:
527
508
  *args: Any,
528
509
  **kwargs: Any,
529
510
  ) -> set[Coin]:
530
- nft_coin: Optional[NFTCoinInfo] = await self.get_nft(nft_id)
511
+ nft_coin: NFTCoinInfo | None = await self.get_nft(nft_id)
531
512
  if nft_coin is None:
532
513
  raise ValueError("An asset ID was specified that this wallet doesn't track")
533
514
  return {nft_coin.coin}
@@ -547,7 +528,7 @@ class NFTWallet:
547
528
  wallet_state_manager: Any,
548
529
  wallet: Wallet,
549
530
  puzzle_driver: PuzzleInfo,
550
- name: Optional[str] = None,
531
+ name: str | None = None,
551
532
  ) -> Any:
552
533
  # Off the bat we don't support multiple profile but when we do this will have to change
553
534
  for wsm_wallet in wallet_state_manager.wallets.values():
@@ -568,17 +549,17 @@ class NFTWallet:
568
549
  puzzle_hashes: list[bytes32],
569
550
  action_scope: WalletActionScope,
570
551
  fee: uint64 = uint64(0),
571
- coins: Optional[set[Coin]] = None,
572
- memos: Optional[list[list[bytes]]] = None,
552
+ coins: set[Coin] | None = None,
553
+ memos: list[list[bytes]] | None = None,
573
554
  extra_conditions: tuple[Condition, ...] = tuple(),
574
555
  **kwargs: Unpack[GSTOptionalArgs],
575
556
  ) -> None:
576
- nft_coin: Optional[NFTCoinInfo] = kwargs.get("nft_coin", None)
577
- new_owner: Optional[bytes] = kwargs.get("new_owner", None)
578
- new_did_inner_hash: Optional[bytes] = kwargs.get("new_did_inner_hash", None)
579
- trade_prices_list: Optional[Program] = kwargs.get("trade_prices_list", None)
557
+ nft_coin: NFTCoinInfo | None = kwargs.get("nft_coin", None)
558
+ new_owner: bytes | None = kwargs.get("new_owner", None)
559
+ new_did_inner_hash: bytes | None = kwargs.get("new_did_inner_hash", None)
560
+ trade_prices_list: Program | None = kwargs.get("trade_prices_list", None)
580
561
  additional_bundles: list[WalletSpendBundle] = kwargs.get("additional_bundles", [])
581
- metadata_update: Optional[tuple[str, str]] = kwargs.get("metadata_update", None)
562
+ metadata_update: tuple[str, str] | None = kwargs.get("metadata_update", None)
582
563
  if memos is None:
583
564
  memos = [[] for _ in range(len(puzzle_hashes))]
584
565
 
@@ -613,25 +594,16 @@ class NFTWallet:
613
594
  other_tx_additions: set[Coin] = {
614
595
  addition for tx in interface.side_effects.transactions for addition in tx.additions
615
596
  }
616
- tx = TransactionRecord(
617
- confirmed_at_height=uint32(0),
618
- created_at_time=uint64(time.time()),
619
- to_puzzle_hash=puzzle_hashes[0],
620
- to_address=self.wallet_state_manager.encode_puzzle_hash(puzzle_hashes[0]),
597
+ tx = self.wallet_state_manager.new_outgoing_transaction(
598
+ wallet_id=self.id(),
599
+ puzzle_hash=puzzle_hashes[0],
621
600
  amount=uint64(payment_sum),
622
- fee_amount=fee,
623
- confirmed=False,
624
- sent=uint32(0),
601
+ fee=fee,
625
602
  spend_bundle=spend_bundle,
626
603
  additions=list(set(spend_bundle.additions()) - other_tx_additions),
627
604
  removals=list(set(spend_bundle.removals()) - other_tx_removals),
628
- wallet_id=self.id(),
629
- sent_to=[],
630
- trade_id=None,
631
- type=uint32(TransactionType.OUTGOING_TX.value),
632
605
  name=spend_bundle.name(),
633
- memos=compute_memos(spend_bundle),
634
- valid_times=parse_timelock_info(extra_conditions),
606
+ extra_conditions=extra_conditions,
635
607
  )
636
608
 
637
609
  interface.side_effects.transactions.append(tx)
@@ -641,12 +613,12 @@ class NFTWallet:
641
613
  payments: list[CreateCoin],
642
614
  action_scope: WalletActionScope,
643
615
  fee: uint64 = uint64(0),
644
- coins: Optional[set[Coin]] = None,
645
- new_owner: Optional[bytes] = None,
646
- new_did_inner_hash: Optional[bytes] = None,
647
- trade_prices_list: Optional[Program] = None,
648
- metadata_update: Optional[tuple[str, str]] = None,
649
- nft_coin: Optional[NFTCoinInfo] = None,
616
+ coins: set[Coin] | None = None,
617
+ new_owner: bytes | None = None,
618
+ new_did_inner_hash: bytes | None = None,
619
+ trade_prices_list: Program | None = None,
620
+ metadata_update: tuple[str, str] | None = None,
621
+ nft_coin: NFTCoinInfo | None = None,
650
622
  extra_conditions: tuple[Condition, ...] = tuple(),
651
623
  ) -> WalletSpendBundle:
652
624
  if nft_coin is None:
@@ -671,9 +643,9 @@ class NFTWallet:
671
643
  if unft.supports_did:
672
644
  if new_owner is None:
673
645
  # If no new owner was specified and we're sending this to ourselves, let's not reset the DID
674
- derivation_record: Optional[
675
- DerivationRecord
676
- ] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(
646
+ derivation_record: (
647
+ DerivationRecord | None
648
+ ) = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(
677
649
  payments[0].puzzle_hash
678
650
  )
679
651
  if derivation_record is not None:
@@ -741,7 +713,7 @@ class NFTWallet:
741
713
  @staticmethod
742
714
  async def make_nft1_offer(
743
715
  wallet_state_manager: Any,
744
- offer_dict: dict[Optional[bytes32], int],
716
+ offer_dict: dict[bytes32 | None, int],
745
717
  driver_dict: dict[bytes32, PuzzleInfo],
746
718
  action_scope: WalletActionScope,
747
719
  fee: uint64,
@@ -761,7 +733,7 @@ class NFTWallet:
761
733
  royalty_nft_asset_dict[asset] = amount
762
734
 
763
735
  # Then, all of the things that trigger royalties
764
- fungible_asset_dict: dict[Optional[bytes32], int] = {}
736
+ fungible_asset_dict: dict[bytes32 | None, int] = {}
765
737
  for asset, amount in offer_dict.items():
766
738
  if asset is None or driver_dict[asset].type() != AssetType.SINGLETON.value:
767
739
  fungible_asset_dict[asset] = amount
@@ -806,7 +778,7 @@ class NFTWallet:
806
778
  else:
807
779
  offered_royalty_percentages[asset] = uint16(royalty_percentage)
808
780
 
809
- royalty_payments: dict[Optional[bytes32], list[tuple[bytes32, CreateCoin]]] = {}
781
+ royalty_payments: dict[bytes32 | None, list[tuple[bytes32, CreateCoin]]] = {}
810
782
  for asset, amount in fungible_asset_dict.items(): # offered fungible items
811
783
  if amount < 0 and request_side_royalty_split > 0:
812
784
  payment_list: list[tuple[bytes32, CreateCoin]] = []
@@ -821,20 +793,20 @@ class NFTWallet:
821
793
 
822
794
  # Generate the requested_payments to be notarized
823
795
  p2_ph = await action_scope.get_puzzle_hash(wallet_state_manager)
824
- requested_payments: dict[Optional[bytes32], list[CreateCoin]] = {}
796
+ requested_payments: dict[bytes32 | None, list[CreateCoin]] = {}
825
797
  for asset, amount in offer_dict.items():
826
798
  if amount > 0:
827
799
  requested_payments[asset] = [CreateCoin(p2_ph, uint64(amount), [p2_ph] if asset is not None else [])]
828
800
 
829
801
  # Find all the coins we're offering
830
- offered_coins_by_asset: dict[Optional[bytes32], set[Coin]] = {}
802
+ offered_coins_by_asset: dict[bytes32 | None, set[Coin]] = {}
831
803
  all_offered_coins: set[Coin] = set()
832
804
  for asset, amount in offer_dict.items():
833
805
  if amount < 0:
834
806
  if asset is None:
835
807
  wallet = wallet_state_manager.main_wallet
836
808
  else:
837
- wallet = await wallet_state_manager.get_wallet_for_asset_id(asset.hex())
809
+ wallet = await wallet_state_manager.get_wallet_for_asset_id(asset)
838
810
  if asset in royalty_payments:
839
811
  royalty_amount: int = sum(p.amount for _, p in royalty_payments[asset])
840
812
  else:
@@ -850,7 +822,7 @@ class NFTWallet:
850
822
  all_offered_coins.update(offered_coins)
851
823
 
852
824
  # Notarize the payments and get the announcements for the bundle
853
- notarized_payments: dict[Optional[bytes32], list[NotarizedPayment]] = Offer.notarize_payments(
825
+ notarized_payments: dict[bytes32 | None, list[NotarizedPayment]] = Offer.notarize_payments(
854
826
  requested_payments, list(all_offered_coins)
855
827
  )
856
828
  announcements_to_assert: list[AssertPuzzleAnnouncement] = Offer.calculate_announcements(
@@ -885,7 +857,7 @@ class NFTWallet:
885
857
  if asset is None:
886
858
  wallet = wallet_state_manager.main_wallet
887
859
  else:
888
- wallet = await wallet_state_manager.get_wallet_for_asset_id(asset.hex())
860
+ wallet = await wallet_state_manager.get_wallet_for_asset_id(asset)
889
861
 
890
862
  # First, sending all the coins to the OFFER_MOD
891
863
  async with wallet_state_manager.new_action_scope(
@@ -934,8 +906,8 @@ class NFTWallet:
934
906
  # We cannot create coins with the same puzzle hash and amount
935
907
  # So if there's multiple NFTs with the same royalty puzhash/percentage, we must create multiple
936
908
  # generations of offer coins
937
- royalty_coin: Optional[Coin] = None
938
- parent_spend: Optional[CoinSpend] = None
909
+ royalty_coin: Coin | None = None
910
+ parent_spend: CoinSpend | None = None
939
911
  while True:
940
912
  duplicate_payments: list[tuple[bytes32, CreateCoin]] = []
941
913
  deduped_payment_list: list[tuple[bytes32, CreateCoin]] = []
@@ -1142,15 +1114,15 @@ class NFTWallet:
1142
1114
  self,
1143
1115
  metadata_list: list[dict[str, Any]],
1144
1116
  action_scope: WalletActionScope,
1145
- target_list: Optional[list[bytes32]] = [],
1146
- mint_number_start: Optional[int] = 1,
1147
- mint_total: Optional[int] = None,
1148
- xch_coins: Optional[set[Coin]] = None,
1149
- xch_change_ph: Optional[bytes32] = None,
1150
- new_innerpuzhash: Optional[bytes32] = None,
1151
- new_p2_puzhash: Optional[bytes32] = None,
1152
- did_coin: Optional[Coin] = None,
1153
- did_lineage_parent: Optional[bytes32] = None,
1117
+ target_list: list[bytes32] | None = [],
1118
+ mint_number_start: int | None = 1,
1119
+ mint_total: int | None = None,
1120
+ xch_coins: set[Coin] | None = None,
1121
+ xch_change_ph: bytes32 | None = None,
1122
+ new_innerpuzhash: bytes32 | None = None,
1123
+ new_p2_puzhash: bytes32 | None = None,
1124
+ did_coin: Coin | None = None,
1125
+ did_lineage_parent: bytes32 | None = None,
1154
1126
  fee: uint64 = uint64(0),
1155
1127
  extra_conditions: tuple[Condition, ...] = tuple(),
1156
1128
  ) -> None:
@@ -1375,7 +1347,7 @@ class NFTWallet:
1375
1347
  )
1376
1348
  # The DID lineage parent won't not exist if we're bulk minting from a future DID coin
1377
1349
  if did_lineage_parent:
1378
- did_parent_info: Optional[LineageProof] = LineageProof(
1350
+ did_parent_info: LineageProof | None = LineageProof(
1379
1351
  parent_name=did_lineage_parent,
1380
1352
  inner_puzzle_hash=innerpuz.get_tree_hash(),
1381
1353
  amount=uint64(did_coin.amount),
@@ -1403,25 +1375,16 @@ class NFTWallet:
1403
1375
 
1404
1376
  async with action_scope.use() as interface:
1405
1377
  interface.side_effects.transactions.append(
1406
- TransactionRecord(
1407
- confirmed_at_height=uint32(0),
1408
- created_at_time=uint64(time.time()),
1409
- to_puzzle_hash=innerpuz.get_tree_hash(),
1410
- to_address=self.wallet_state_manager.encode_puzzle_hash(innerpuz.get_tree_hash()),
1378
+ self.wallet_state_manager.new_outgoing_transaction(
1379
+ wallet_id=did_wallet.id(),
1380
+ puzzle_hash=innerpuz.get_tree_hash(),
1411
1381
  amount=uint64(1),
1412
- fee_amount=fee,
1413
- confirmed=False,
1414
- sent=uint32(0),
1382
+ fee=fee,
1415
1383
  spend_bundle=unsigned_spend_bundle,
1416
- additions=list(unsigned_spend_bundle.additions()),
1417
- removals=list(unsigned_spend_bundle.removals()),
1418
- wallet_id=did_wallet.id(),
1419
- sent_to=[],
1420
- trade_id=None,
1421
- type=uint32(TransactionType.OUTGOING_TX.value),
1384
+ additions=unsigned_spend_bundle.additions(),
1385
+ removals=unsigned_spend_bundle.removals(),
1422
1386
  name=unsigned_spend_bundle.name(),
1423
- memos=compute_memos(unsigned_spend_bundle),
1424
- valid_times=parse_timelock_info(extra_conditions),
1387
+ extra_conditions=extra_conditions,
1425
1388
  )
1426
1389
  )
1427
1390
 
@@ -1429,11 +1392,11 @@ class NFTWallet:
1429
1392
  self,
1430
1393
  metadata_list: list[dict[str, Any]],
1431
1394
  action_scope: WalletActionScope,
1432
- target_list: Optional[list[bytes32]] = [],
1433
- mint_number_start: Optional[int] = 1,
1434
- mint_total: Optional[int] = None,
1435
- xch_coins: Optional[set[Coin]] = None,
1436
- xch_change_ph: Optional[bytes32] = None,
1395
+ target_list: list[bytes32] | None = [],
1396
+ mint_number_start: int | None = 1,
1397
+ mint_total: int | None = None,
1398
+ xch_coins: set[Coin] | None = None,
1399
+ xch_change_ph: bytes32 | None = None,
1437
1400
  fee: uint64 = uint64(0),
1438
1401
  extra_conditions: tuple[Condition, ...] = tuple(),
1439
1402
  ) -> None:
@@ -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, Union
5
5
 
6
6
  from chia_rs.sized_bytes import bytes32
7
7
  from clvm_tools.binutils import disassemble
@@ -19,7 +19,7 @@ def match_ownership_layer_puzzle(puzzle: UncurriedPuzzle) -> tuple[bool, list[Pr
19
19
 
20
20
 
21
21
  def puzzle_for_ownership_layer(
22
- current_owner: Union[Program, bytes], transfer_program: Program, inner_puzzle: Program
22
+ current_owner: Program | bytes, transfer_program: Program, inner_puzzle: Program
23
23
  ) -> Program:
24
24
  return NFT_OWNERSHIP_LAYER.curry(NFT_OWNERSHIP_LAYER.get_tree_hash(), current_owner, transfer_program, inner_puzzle)
25
25
 
@@ -30,18 +30,18 @@ def solution_for_ownership_layer(inner_solution: Program) -> Program:
30
30
 
31
31
  @dataclass(frozen=True)
32
32
  class OwnershipOuterPuzzle:
33
- _match: Callable[[UncurriedPuzzle], Optional[PuzzleInfo]]
33
+ _match: Callable[[UncurriedPuzzle], PuzzleInfo | None]
34
34
  _construct: Callable[[PuzzleInfo, Program], Program]
35
35
  _solve: Callable[[PuzzleInfo, Solver, Program, Program], Program]
36
- _get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Optional[Program]], Optional[Program]]
37
- _get_inner_solution: Callable[[PuzzleInfo, Program], Optional[Program]]
36
+ _get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Program | None], Program | None]
37
+ _get_inner_solution: Callable[[PuzzleInfo, Program], Program | None]
38
38
 
39
- def match(self, puzzle: UncurriedPuzzle) -> Optional[PuzzleInfo]:
39
+ def match(self, puzzle: UncurriedPuzzle) -> PuzzleInfo | None:
40
40
  matched, curried_args = match_ownership_layer_puzzle(puzzle)
41
41
  if matched:
42
42
  _, current_owner, transfer_program, inner_puzzle = curried_args
43
43
  owner_bytes: bytes = current_owner.as_python()
44
- tp_match: Optional[PuzzleInfo] = self._match(uncurry_puzzle(transfer_program))
44
+ tp_match: PuzzleInfo | None = self._match(uncurry_puzzle(transfer_program))
45
45
  constructor_dict = {
46
46
  "type": "ownership",
47
47
  "owner": "()" if owner_bytes == b"" else "0x" + owner_bytes.hex(),
@@ -54,14 +54,14 @@ class OwnershipOuterPuzzle:
54
54
  else:
55
55
  return None
56
56
 
57
- def asset_id(self, constructor: PuzzleInfo) -> Optional[bytes32]:
57
+ def asset_id(self, constructor: PuzzleInfo) -> bytes32 | None:
58
58
  return None
59
59
 
60
60
  def construct(self, constructor: PuzzleInfo, inner_puzzle: Program) -> Program:
61
61
  also = constructor.also()
62
62
  if also is not None:
63
63
  inner_puzzle = self._construct(also, inner_puzzle)
64
- transfer_program_info: Union[PuzzleInfo, Program] = constructor["transfer_program"]
64
+ transfer_program_info: PuzzleInfo | Program = constructor["transfer_program"]
65
65
  if isinstance(transfer_program_info, Program):
66
66
  transfer_program: Program = transfer_program_info
67
67
  else:
@@ -69,25 +69,25 @@ class OwnershipOuterPuzzle:
69
69
  return puzzle_for_ownership_layer(constructor["owner"], transfer_program, inner_puzzle)
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
  matched, curried_args = match_ownership_layer_puzzle(puzzle_reveal)
75
75
  if matched:
76
76
  _, _, _, inner_puzzle = curried_args
77
77
  also = constructor.also()
78
78
  if also is not None:
79
- deep_inner_puzzle: Optional[Program] = self._get_inner_puzzle(also, uncurry_puzzle(inner_puzzle), None)
79
+ deep_inner_puzzle: Program | None = self._get_inner_puzzle(also, uncurry_puzzle(inner_puzzle), None)
80
80
  return deep_inner_puzzle
81
81
  else:
82
82
  return inner_puzzle
83
83
  else:
84
84
  raise ValueError("This driver is not for the specified puzzle reveal")
85
85
 
86
- def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Optional[Program]:
86
+ def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Program | None:
87
87
  my_inner_solution: Program = solution.first()
88
88
  also = constructor.also()
89
89
  if also:
90
- deep_inner_solution: Optional[Program] = self._get_inner_solution(also, my_inner_solution)
90
+ deep_inner_solution: Program | None = self._get_inner_solution(also, my_inner_solution)
91
91
  return deep_inner_solution
92
92
  else:
93
93
  return my_inner_solution