chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__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 (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import List, Optional, Set, Tuple
3
+ from typing import Optional
4
4
 
5
5
  from chia_rs import AugSchemeMPL, G1Element, PrivateKey
6
6
 
@@ -18,19 +18,19 @@ from chia.util.ints import uint32
18
18
  MAX_POOL_WALLETS = 100
19
19
 
20
20
 
21
- def _derive_path(sk: PrivateKey, path: List[int]) -> PrivateKey:
21
+ def _derive_path(sk: PrivateKey, path: list[int]) -> PrivateKey:
22
22
  for index in path:
23
23
  sk = AugSchemeMPL.derive_child_sk(sk, index)
24
24
  return sk
25
25
 
26
26
 
27
- def _derive_path_unhardened(sk: PrivateKey, path: List[int]) -> PrivateKey:
27
+ def _derive_path_unhardened(sk: PrivateKey, path: list[int]) -> PrivateKey:
28
28
  for index in path:
29
29
  sk = AugSchemeMPL.derive_child_sk_unhardened(sk, index)
30
30
  return sk
31
31
 
32
32
 
33
- def _derive_pk_unhardened(pk: G1Element, path: List[int]) -> G1Element:
33
+ def _derive_pk_unhardened(pk: G1Element, path: list[int]) -> G1Element:
34
34
  for index in path:
35
35
  pk = AugSchemeMPL.derive_child_pk_unhardened(pk, index)
36
36
  return pk
@@ -95,7 +95,7 @@ def master_sk_to_pooling_authentication_sk(master: PrivateKey, pool_wallet_index
95
95
  return _derive_path(master, [12381, 8444, 6, pool_wallet_index * 10000 + index])
96
96
 
97
97
 
98
- def find_owner_sk(all_sks: List[PrivateKey], owner_pk: G1Element) -> Optional[Tuple[PrivateKey, uint32]]:
98
+ def find_owner_sk(all_sks: list[PrivateKey], owner_pk: G1Element) -> Optional[tuple[PrivateKey, uint32]]:
99
99
  for pool_wallet_index in range(MAX_POOL_WALLETS):
100
100
  for sk in all_sks:
101
101
  try_owner_sk = master_sk_to_singleton_owner_sk(sk, uint32(pool_wallet_index))
@@ -104,7 +104,7 @@ def find_owner_sk(all_sks: List[PrivateKey], owner_pk: G1Element) -> Optional[Tu
104
104
  return None
105
105
 
106
106
 
107
- def find_authentication_sk(all_sks: List[PrivateKey], owner_pk: G1Element) -> Optional[PrivateKey]:
107
+ def find_authentication_sk(all_sks: list[PrivateKey], owner_pk: G1Element) -> Optional[PrivateKey]:
108
108
  # NOTE: might need to increase this if using a large number of wallets, or have switched authentication keys
109
109
  # many times.
110
110
  for pool_wallet_index in range(MAX_POOL_WALLETS):
@@ -117,8 +117,8 @@ def find_authentication_sk(all_sks: List[PrivateKey], owner_pk: G1Element) -> Op
117
117
 
118
118
 
119
119
  def match_address_to_sk(
120
- sk: PrivateKey, addresses_to_search: List[bytes32], max_ph_to_search: int = 500
121
- ) -> Set[bytes32]:
120
+ sk: PrivateKey, addresses_to_search: list[bytes32], max_ph_to_search: int = 500
121
+ ) -> set[bytes32]:
122
122
  """
123
123
  Checks the list of given address is a derivation of the given sk within the given number of derivations
124
124
  Returns a Set of the addresses that are derivations of the given sk
@@ -126,8 +126,8 @@ def match_address_to_sk(
126
126
  if sk is None or not addresses_to_search:
127
127
  return set()
128
128
 
129
- found_addresses: Set[bytes32] = set()
130
- search_list: Set[bytes32] = set(addresses_to_search)
129
+ found_addresses: set[bytes32] = set()
130
+ search_list: set[bytes32] = set(addresses_to_search)
131
131
 
132
132
  for i in range(max_ph_to_search):
133
133
  phs = [
@@ -139,7 +139,7 @@ def match_address_to_sk(
139
139
  if address in phs:
140
140
  found_addresses.add(address)
141
141
 
142
- search_list = search_list - found_addresses
142
+ search_list -= found_addresses
143
143
  if not len(search_list):
144
144
  return found_addresses
145
145
 
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import List, Optional, Tuple
4
+ from typing import Optional
5
5
 
6
6
  from chia.protocols.wallet_protocol import CoinState
7
7
  from chia.types.blockchain_format.coin import Coin
@@ -16,9 +16,9 @@ from chia.wallet.lineage_proof import LineageProof
16
16
  @dataclass(frozen=True)
17
17
  class DIDInfo(Streamable):
18
18
  origin_coin: Optional[Coin] # Coin ID of this coin is our DID
19
- backup_ids: List[bytes32]
19
+ backup_ids: list[bytes32]
20
20
  num_of_backup_ids_needed: uint64
21
- parent_info: List[Tuple[bytes32, Optional[LineageProof]]] # {coin.name(): LineageProof}
21
+ parent_info: list[tuple[bytes32, Optional[LineageProof]]] # {coin.name(): LineageProof}
22
22
  current_inner: Optional[Program] # represents a Program as bytes
23
23
  temp_coin: Optional[Coin] # partially recovered wallet uses these to hold info
24
24
  temp_puzhash: Optional[bytes32]
@@ -5,7 +5,7 @@ import json
5
5
  import logging
6
6
  import re
7
7
  import time
8
- from typing import TYPE_CHECKING, Any, ClassVar, Dict, List, Optional, Set, Tuple, cast
8
+ from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
9
9
 
10
10
  from chia_rs import AugSchemeMPL, G1Element, G2Element
11
11
 
@@ -77,12 +77,12 @@ class DIDWallet:
77
77
  wallet: Wallet,
78
78
  amount: uint64,
79
79
  action_scope: WalletActionScope,
80
- backups_ids: List[bytes32] = [],
80
+ backups_ids: list[bytes32] = [],
81
81
  num_of_backup_ids_needed: uint64 = None,
82
- metadata: Dict[str, str] = {},
82
+ metadata: dict[str, str] = {},
83
83
  name: Optional[str] = None,
84
84
  fee: uint64 = uint64(0),
85
- extra_conditions: Tuple[Condition, ...] = tuple(),
85
+ extra_conditions: tuple[Condition, ...] = tuple(),
86
86
  ):
87
87
  """
88
88
  Create a brand new DID wallet
@@ -142,7 +142,7 @@ class DIDWallet:
142
142
  try:
143
143
  await self.generate_new_decentralised_id(amount, action_scope, fee, extra_conditions)
144
144
  except Exception:
145
- await wallet_state_manager.user_store.delete_wallet(self.id())
145
+ await wallet_state_manager.delete_wallet(self.id())
146
146
  raise
147
147
 
148
148
  await self.wallet_state_manager.add_new_wallet(self)
@@ -208,7 +208,6 @@ class DIDWallet:
208
208
  :param name: Wallet name
209
209
  :return: DID wallet
210
210
  """
211
-
212
211
  self = DIDWallet()
213
212
  self.wallet_state_manager = wallet_state_manager
214
213
  if name is None:
@@ -226,7 +225,7 @@ class DIDWallet:
226
225
  _, recovery_list_hash, num_verification, _, metadata = args
227
226
  full_solution: Program = Program.from_bytes(bytes(coin_spend.solution))
228
227
  inner_solution: Program = full_solution.rest().rest().first()
229
- recovery_list: List[bytes32] = []
228
+ recovery_list: list[bytes32] = []
230
229
  backup_required: int = num_verification.as_int()
231
230
  if recovery_list_hash != NIL_TREEHASH:
232
231
  try:
@@ -269,7 +268,7 @@ class DIDWallet:
269
268
  wallet_state_manager: Any,
270
269
  wallet: Wallet,
271
270
  wallet_info: WalletInfo,
272
- name: str = None,
271
+ name: Optional[str] = None,
273
272
  ):
274
273
  """
275
274
  Create a DID wallet based on the local database
@@ -317,6 +316,7 @@ class DIDWallet:
317
316
 
318
317
  for record in unconfirmed_tx:
319
318
  our_spend = False
319
+ # Need to check belonging with hint_dict
320
320
  for coin in record.removals:
321
321
  if await self.wallet_state_manager.does_coin_belong_to_wallet(coin, self.id()):
322
322
  our_spend = True
@@ -326,7 +326,14 @@ class DIDWallet:
326
326
  continue
327
327
 
328
328
  for coin in record.additions:
329
- if await self.wallet_state_manager.does_coin_belong_to_wallet(coin, self.id()):
329
+ hint_dict = {
330
+ coin_id: bytes32(memos[0])
331
+ for coin_id, memos in record.memos
332
+ if len(memos) > 0 and len(memos[0]) == 32
333
+ }
334
+ if (await self.wallet_state_manager.does_coin_belong_to_wallet(coin, self.id(), hint_dict)) and (
335
+ coin not in record.removals
336
+ ):
330
337
  addition_amount += coin.amount
331
338
 
332
339
  return uint64(addition_amount)
@@ -338,7 +345,7 @@ class DIDWallet:
338
345
  self,
339
346
  amount: uint64,
340
347
  action_scope: WalletActionScope,
341
- ) -> Set[Coin]:
348
+ ) -> set[Coin]:
342
349
  try:
343
350
  async with action_scope.use() as interface:
344
351
  coin = await self.get_coin()
@@ -528,14 +535,14 @@ class DIDWallet:
528
535
  return create_singleton_puzzle(innerpuz, self.did_info.origin_coin.name())
529
536
  else:
530
537
  innerpuz = Program.to((8, 0))
531
- return create_singleton_puzzle(innerpuz, bytes32([0] * 32))
538
+ return create_singleton_puzzle(innerpuz, bytes32.zeros)
532
539
 
533
540
  def puzzle_hash_for_pk(self, pubkey: G1Element) -> bytes32:
534
541
  if self.did_info.origin_coin is None:
535
542
  # TODO: this seem dumb. Why bother with this case? Is it ever used?
536
543
  # inner puzzle: (8 . 0)
537
544
  innerpuz_hash = shatree_pair(shatree_int(8), NIL_TREEHASH)
538
- return create_singleton_puzzle_hash(innerpuz_hash, bytes32([0] * 32))
545
+ return create_singleton_puzzle_hash(innerpuz_hash, bytes32.zeros)
539
546
  origin_coin_name = self.did_info.origin_coin.name()
540
547
  innerpuz_hash = did_wallet_puzzles.get_inner_puzhash_by_p2(
541
548
  p2_puzhash=puzzle_hash_for_pk(pubkey),
@@ -546,11 +553,6 @@ class DIDWallet:
546
553
  )
547
554
  return create_singleton_puzzle_hash(innerpuz_hash, origin_coin_name)
548
555
 
549
- async def get_new_puzzle(self) -> Program:
550
- return self.puzzle_for_pk(
551
- (await self.wallet_state_manager.get_unused_derivation_record(self.wallet_info.id)).pubkey
552
- )
553
-
554
556
  def get_my_DID(self) -> str:
555
557
  assert self.did_info.origin_coin is not None
556
558
  core = self.did_info.origin_coin.name()
@@ -569,12 +571,12 @@ class DIDWallet:
569
571
  self,
570
572
  action_scope: WalletActionScope,
571
573
  fee: uint64 = uint64(0),
572
- extra_conditions: Tuple[Condition, ...] = tuple(),
574
+ extra_conditions: tuple[Condition, ...] = tuple(),
573
575
  ) -> None:
574
576
  assert self.did_info.current_inner is not None
575
577
  assert self.did_info.origin_coin is not None
576
578
  coin = await self.get_coin()
577
- new_inner_puzzle = await self.get_new_did_innerpuz()
579
+ new_inner_puzzle = await self.get_did_innerpuz(new=not action_scope.config.tx_config.reuse_puzhash)
578
580
  uncurried = did_wallet_puzzles.uncurry_innerpuz(new_inner_puzzle)
579
581
  assert uncurried is not None
580
582
  p2_puzzle = uncurried[0]
@@ -668,7 +670,7 @@ class DIDWallet:
668
670
  fee: uint64,
669
671
  with_recovery: bool,
670
672
  action_scope: WalletActionScope,
671
- extra_conditions: Tuple[Condition, ...] = tuple(),
673
+ extra_conditions: tuple[Condition, ...] = tuple(),
672
674
  ) -> None:
673
675
  """
674
676
  Transfer the current DID to another owner
@@ -757,7 +759,7 @@ class DIDWallet:
757
759
  async def create_message_spend(
758
760
  self,
759
761
  action_scope: WalletActionScope,
760
- extra_conditions: Tuple[Condition, ...] = tuple(),
762
+ extra_conditions: tuple[Condition, ...] = tuple(),
761
763
  ) -> None:
762
764
  assert self.did_info.current_inner is not None
763
765
  assert self.did_info.origin_coin is not None
@@ -890,8 +892,8 @@ class DIDWallet:
890
892
  newpuz: bytes32,
891
893
  pubkey: G1Element,
892
894
  action_scope: WalletActionScope,
893
- extra_conditions: Tuple[Condition, ...] = tuple(),
894
- ) -> Tuple[WalletSpendBundle, str]:
895
+ extra_conditions: tuple[Condition, ...] = tuple(),
896
+ ) -> tuple[WalletSpendBundle, str]:
895
897
  """
896
898
  Create an attestment
897
899
  TODO:
@@ -969,7 +971,7 @@ class DIDWallet:
969
971
  attest_str += f"{self.did_info.current_inner.get_tree_hash().hex()}:{coin.amount}"
970
972
  return message_spend_bundle, attest_str
971
973
 
972
- async def get_info_for_recovery(self) -> Optional[Tuple[bytes32, bytes32, uint64]]:
974
+ async def get_info_for_recovery(self) -> Optional[tuple[bytes32, bytes32, uint64]]:
973
975
  assert self.did_info.current_inner is not None
974
976
  assert self.did_info.origin_coin is not None
975
977
  try:
@@ -981,7 +983,7 @@ class DIDWallet:
981
983
  amount = uint64(coin.amount)
982
984
  return (parent, innerpuzhash, amount)
983
985
 
984
- async def load_attest_files_for_recovery_spend(self, attest_data: List[str]) -> Tuple[List, WalletSpendBundle]:
986
+ async def load_attest_files_for_recovery_spend(self, attest_data: list[str]) -> tuple[list, WalletSpendBundle]:
985
987
  spend_bundle_list = []
986
988
  info_dict = {}
987
989
  for attest in attest_data:
@@ -994,7 +996,7 @@ class DIDWallet:
994
996
  new_sb = WalletSpendBundle.from_bytes(bytes.fromhex(info[1]))
995
997
  spend_bundle_list.append(new_sb)
996
998
  # info_dict {0xidentity: "(0xparent_info 0xinnerpuz amount)"}
997
- my_recovery_list: List[bytes32] = self.did_info.backup_ids
999
+ my_recovery_list: list[bytes32] = self.did_info.backup_ids
998
1000
 
999
1001
  # convert info dict into recovery list - same order as wallet
1000
1002
  info_list = []
@@ -1016,7 +1018,7 @@ class DIDWallet:
1016
1018
  self,
1017
1019
  coin: Coin,
1018
1020
  puzhash: bytes32,
1019
- parent_innerpuzhash_amounts_for_recovery_ids: List[Tuple[bytes, bytes, int]],
1021
+ parent_innerpuzhash_amounts_for_recovery_ids: list[tuple[bytes, bytes, int]],
1020
1022
  pubkey: G1Element,
1021
1023
  spend_bundle: WalletSpendBundle,
1022
1024
  action_scope: WalletActionScope,
@@ -1095,14 +1097,13 @@ class DIDWallet:
1095
1097
  )
1096
1098
  await self.save_info(new_did_info)
1097
1099
 
1098
- async def get_new_p2_inner_hash(self) -> bytes32:
1099
- puzzle = await self.get_new_p2_inner_puzzle()
1100
- return puzzle.get_tree_hash()
1100
+ async def get_p2_inner_hash(self, new: bool) -> bytes32:
1101
+ return await self.standard_wallet.get_puzzle_hash(new=new)
1101
1102
 
1102
- async def get_new_p2_inner_puzzle(self) -> Program:
1103
- return await self.standard_wallet.get_new_puzzle()
1103
+ async def get_p2_inner_puzzle(self, new: bool) -> Program:
1104
+ return await self.standard_wallet.get_puzzle(new=new)
1104
1105
 
1105
- async def get_new_did_innerpuz(self, origin_id: Optional[bytes32] = None) -> Program:
1106
+ async def get_did_innerpuz(self, new: bool, origin_id: Optional[bytes32] = None) -> Program:
1106
1107
  if self.did_info.origin_coin is not None:
1107
1108
  launcher_id = self.did_info.origin_coin.name()
1108
1109
  elif origin_id is not None:
@@ -1110,15 +1111,15 @@ class DIDWallet:
1110
1111
  else:
1111
1112
  raise ValueError("must have origin coin")
1112
1113
  return did_wallet_puzzles.create_innerpuz(
1113
- p2_puzzle_or_hash=await self.get_new_p2_inner_puzzle(),
1114
+ p2_puzzle_or_hash=await self.get_p2_inner_puzzle(new=new),
1114
1115
  recovery_list=self.did_info.backup_ids,
1115
1116
  num_of_backup_ids_needed=self.did_info.num_of_backup_ids_needed,
1116
1117
  launcher_id=launcher_id,
1117
1118
  metadata=did_wallet_puzzles.metadata_to_program(json.loads(self.did_info.metadata)),
1118
1119
  )
1119
1120
 
1120
- async def get_new_did_inner_hash(self) -> bytes32:
1121
- innerpuz = await self.get_new_did_innerpuz()
1121
+ async def get_did_inner_hash(self, new: bool) -> bytes32:
1122
+ innerpuz = await self.get_did_innerpuz(new=new)
1122
1123
  return innerpuz.get_tree_hash()
1123
1124
 
1124
1125
  async def get_innerpuz_for_new_innerhash(self, pubkey: G1Element):
@@ -1174,7 +1175,7 @@ class DIDWallet:
1174
1175
 
1175
1176
  return parent_info
1176
1177
 
1177
- async def sign_message(self, message: str, mode: SigningMode) -> Tuple[G1Element, G2Element]:
1178
+ async def sign_message(self, message: str, mode: SigningMode) -> tuple[G1Element, G2Element]:
1178
1179
  if self.did_info.current_inner is None:
1179
1180
  raise ValueError("Missing DID inner puzzle.")
1180
1181
  puzzle_args = did_wallet_puzzles.uncurry_innerpuz(self.did_info.current_inner)
@@ -1201,7 +1202,7 @@ class DIDWallet:
1201
1202
  amount: uint64,
1202
1203
  action_scope: WalletActionScope,
1203
1204
  fee: uint64 = uint64(0),
1204
- extra_conditions: Tuple[Condition, ...] = tuple(),
1205
+ extra_conditions: tuple[Condition, ...] = tuple(),
1205
1206
  ) -> None:
1206
1207
  """
1207
1208
  This must be called under the wallet state manager lock
@@ -1213,7 +1214,9 @@ class DIDWallet:
1213
1214
  genesis_launcher_puz = SINGLETON_LAUNCHER_PUZZLE
1214
1215
  launcher_coin = Coin(origin.name(), genesis_launcher_puz.get_tree_hash(), amount)
1215
1216
 
1216
- did_inner: Program = await self.get_new_did_innerpuz(launcher_coin.name())
1217
+ did_inner: Program = await self.get_did_innerpuz(
1218
+ new=not action_scope.config.tx_config.reuse_puzhash, origin_id=launcher_coin.name()
1219
+ )
1217
1220
  did_inner_hash = did_inner.get_tree_hash()
1218
1221
  did_full_puz = create_singleton_puzzle(did_inner, launcher_coin.name())
1219
1222
  did_puzzle_hash = did_full_puz.get_tree_hash()
@@ -1298,7 +1301,7 @@ class DIDWallet:
1298
1301
  coin: Coin,
1299
1302
  full_puzzle: Program,
1300
1303
  innerpuz: Program,
1301
- extra_conditions: Tuple[Condition, ...] = tuple(),
1304
+ extra_conditions: tuple[Condition, ...] = tuple(),
1302
1305
  ):
1303
1306
  assert self.did_info.origin_coin is not None
1304
1307
  uncurried = did_wallet_puzzles.uncurry_innerpuz(innerpuz)
@@ -1328,9 +1331,11 @@ class DIDWallet:
1328
1331
  )
1329
1332
  return spendable_am
1330
1333
 
1331
- async def get_max_send_amount(self, records: Optional[Set[WalletCoinRecord]] = None):
1332
- max_send_amount = await self.get_confirmed_balance()
1333
-
1334
+ async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None):
1335
+ spendable: list[WalletCoinRecord] = list(
1336
+ await self.wallet_state_manager.get_spendable_coins_for_wallet(self.id(), records)
1337
+ )
1338
+ max_send_amount = sum(cr.coin.amount for cr in spendable)
1334
1339
  return max_send_amount
1335
1340
 
1336
1341
  async def add_parent(self, name: bytes32, parent: Optional[LineageProof]):
@@ -1351,7 +1356,7 @@ class DIDWallet:
1351
1356
  )
1352
1357
  await self.save_info(did_info)
1353
1358
 
1354
- async def update_recovery_list(self, recover_list: List[bytes32], num_of_backup_ids_needed: uint64) -> bool:
1359
+ async def update_recovery_list(self, recover_list: list[bytes32], num_of_backup_ids_needed: uint64) -> bool:
1355
1360
  if num_of_backup_ids_needed > len(recover_list):
1356
1361
  return False
1357
1362
  did_info = DIDInfo(
@@ -1370,7 +1375,7 @@ class DIDWallet:
1370
1375
  await self.wallet_state_manager.update_wallet_puzzle_hashes(self.wallet_info.id)
1371
1376
  return True
1372
1377
 
1373
- async def update_metadata(self, metadata: Dict[str, str]) -> bool:
1378
+ async def update_metadata(self, metadata: dict[str, str]) -> bool:
1374
1379
  # validate metadata
1375
1380
  if not all(isinstance(k, str) and isinstance(v, str) for k, v in metadata.items()):
1376
1381
  raise ValueError("Metadata key value pairs must be strings.")
@@ -1441,7 +1446,11 @@ class DIDWallet:
1441
1446
  if num_of_backup_ids_needed > len(backup_ids):
1442
1447
  raise Exception
1443
1448
  innerpuz: Program = Program.from_bytes(bytes.fromhex(details[4]))
1444
- metadata: str = details[6]
1449
+ metadata: str = ""
1450
+ for d in details[6:]:
1451
+ metadata = metadata + d + ":"
1452
+ if len(metadata) > 0:
1453
+ metadata = metadata[:-1]
1445
1454
  did_info = DIDInfo(
1446
1455
  origin_coin=origin,
1447
1456
  backup_ids=backup_ids,
@@ -1460,7 +1469,7 @@ class DIDWallet:
1460
1469
  return True
1461
1470
 
1462
1471
  async def get_coin(self) -> Coin:
1463
- spendable_coins: Set[WalletCoinRecord] = await self.wallet_state_manager.get_spendable_coins_for_wallet(
1472
+ spendable_coins: set[WalletCoinRecord] = await self.wallet_state_manager.get_spendable_coins_for_wallet(
1464
1473
  self.wallet_info.id
1465
1474
  )
1466
1475
  if len(spendable_coins) == 0:
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Dict, Iterator, List, Optional, Tuple, Union
3
+ from collections.abc import Iterator
4
+ from typing import Optional, Union
4
5
 
5
6
  from chia_rs import G1Element
6
7
 
@@ -40,7 +41,7 @@ INTERMEDIATE_LAUNCHER_MOD = load_clvm_maybe_recompile(
40
41
 
41
42
  def create_innerpuz(
42
43
  p2_puzzle_or_hash: Union[Program, bytes32],
43
- recovery_list: List[bytes32],
44
+ recovery_list: list[bytes32],
44
45
  num_of_backup_ids_needed: uint64,
45
46
  launcher_id: bytes32,
46
47
  metadata: Program = Program.to([]),
@@ -69,7 +70,7 @@ def create_innerpuz(
69
70
 
70
71
  def get_inner_puzhash_by_p2(
71
72
  p2_puzhash: bytes32,
72
- recovery_list: List[bytes32],
73
+ recovery_list: list[bytes32],
73
74
  num_of_backup_ids_needed: uint64,
74
75
  launcher_id: bytes32,
75
76
  metadata: Program = Program.to([]),
@@ -111,7 +112,7 @@ def is_did_innerpuz(inner_f: Program) -> bool:
111
112
  return inner_f == DID_INNERPUZ_MOD
112
113
 
113
114
 
114
- def uncurry_innerpuz(puzzle: Program) -> Optional[Tuple[Program, Program, Program, Program, Program]]:
115
+ def uncurry_innerpuz(puzzle: Program) -> Optional[tuple[Program, Program, Program, Program, Program]]:
115
116
  """
116
117
  Uncurry a DID inner puzzle
117
118
  :param puzzle: DID puzzle
@@ -196,7 +197,7 @@ def check_is_did_puzzle(puzzle: Program) -> bool:
196
197
  return is_singleton(inner_f)
197
198
 
198
199
 
199
- def metadata_to_program(metadata: Dict[str, str]) -> Program:
200
+ def metadata_to_program(metadata: dict[str, str]) -> Program:
200
201
  """
201
202
  Convert the metadata dict to a Chialisp program
202
203
  :param metadata: User defined metadata
@@ -208,7 +209,7 @@ def metadata_to_program(metadata: Dict[str, str]) -> Program:
208
209
  return Program.to(kv_list)
209
210
 
210
211
 
211
- def did_program_to_metadata(program: Program) -> Dict[str, str]:
212
+ def did_program_to_metadata(program: Program) -> dict[str, str]:
212
213
  """
213
214
  Convert a program to a metadata dict
214
215
  :param program: Chialisp program contains the metadata
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
4
  from enum import Enum
5
- from typing import Any, Dict, List, Optional
5
+ from typing import Any, Optional
6
6
 
7
7
  from chia.types.blockchain_format.program import Program
8
8
  from chia.types.blockchain_format.sized_bytes import bytes32
@@ -24,8 +24,8 @@ class LineageProof(Streamable):
24
24
  amount: Optional[uint64] = None
25
25
 
26
26
  @classmethod
27
- def from_program(cls, program: Program, fields: List[LineageProofField]) -> LineageProof:
28
- lineage_proof_info: Dict[str, Any] = {}
27
+ def from_program(cls, program: Program, fields: list[LineageProofField]) -> LineageProof:
28
+ lineage_proof_info: dict[str, Any] = {}
29
29
  field_iter = iter(fields)
30
30
  program_iter = program.as_iter()
31
31
  for program_value in program_iter:
@@ -45,7 +45,7 @@ class LineageProof(Streamable):
45
45
  return LineageProof(**lineage_proof_info)
46
46
 
47
47
  def to_program(self) -> Program:
48
- final_list: List[Any] = []
48
+ final_list: list[Any] = []
49
49
  if self.parent_name is not None:
50
50
  final_list.append(self.parent_name)
51
51
  if self.inner_puzzle_hash is not None:
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import Callable, List, Optional, Tuple
4
+ from typing import Callable, Optional
5
5
 
6
6
  from chia.types.blockchain_format.program import Program
7
7
  from chia.types.blockchain_format.sized_bytes import bytes32
@@ -15,7 +15,7 @@ NFT_STATE_LAYER_MOD = load_clvm_maybe_recompile(
15
15
  NFT_STATE_LAYER_MOD_HASH = NFT_STATE_LAYER_MOD.get_tree_hash()
16
16
 
17
17
 
18
- def match_metadata_layer_puzzle(puzzle: UncurriedPuzzle) -> Tuple[bool, List[Program]]:
18
+ def match_metadata_layer_puzzle(puzzle: UncurriedPuzzle) -> tuple[bool, list[Program]]:
19
19
  if puzzle.mod == NFT_STATE_LAYER_MOD:
20
20
  return True, list(puzzle.args.as_iter())
21
21
  return False, []
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import List, Optional
4
+ from typing import Optional
5
5
 
6
6
  from chia.types.blockchain_format.coin import Coin
7
7
  from chia.types.blockchain_format.program import Program
@@ -40,19 +40,19 @@ class NFTInfo(Streamable):
40
40
 
41
41
  royalty_puzzle_hash: Optional[bytes32]
42
42
  """Puzzle hash where royalty will be sent to"""
43
- data_uris: List[str]
43
+ data_uris: list[str]
44
44
  """ A list of content URIs"""
45
45
 
46
46
  data_hash: bytes
47
47
  """Hash of the content"""
48
48
 
49
- metadata_uris: List[str]
49
+ metadata_uris: list[str]
50
50
  """A list of metadata URIs"""
51
51
 
52
52
  metadata_hash: bytes
53
53
  """Hash of the metadata"""
54
54
 
55
- license_uris: List[str]
55
+ license_uris: list[str]
56
56
  """A list of license URIs"""
57
57
 
58
58
  license_hash: bytes
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import Any, Dict, List, Literal, Optional, Tuple, Union
4
+ from typing import Any, Literal, Optional, Union
5
5
 
6
6
  from clvm_tools.binutils import disassemble
7
7
 
@@ -86,7 +86,7 @@ def create_full_puzzle(
86
86
  return full_puzzle
87
87
 
88
88
 
89
- async def get_nft_info_from_puzzle(nft_coin_info: NFTCoinInfo, config: Dict[str, Any]) -> NFTInfo:
89
+ async def get_nft_info_from_puzzle(nft_coin_info: NFTCoinInfo, config: dict[str, Any]) -> NFTInfo:
90
90
  """
91
91
  Extract NFT info from a full puzzle
92
92
  :param nft_coin_info NFTCoinInfo in local database
@@ -96,15 +96,15 @@ async def get_nft_info_from_puzzle(nft_coin_info: NFTCoinInfo, config: Dict[str,
96
96
  """
97
97
  uncurried_nft: Optional[UncurriedNFT] = UncurriedNFT.uncurry(*nft_coin_info.full_puzzle.uncurry())
98
98
  assert uncurried_nft is not None
99
- data_uris: List[str] = []
99
+ data_uris: list[str] = []
100
100
 
101
- for uri in uncurried_nft.data_uris.as_python(): # pylint: disable=E1133
101
+ for uri in uncurried_nft.data_uris.as_python():
102
102
  data_uris.append(str(uri, "utf-8"))
103
- meta_uris: List[str] = []
104
- for uri in uncurried_nft.meta_uris.as_python(): # pylint: disable=E1133
103
+ meta_uris: list[str] = []
104
+ for uri in uncurried_nft.meta_uris.as_python():
105
105
  meta_uris.append(str(uri, "utf-8"))
106
- license_uris: List[str] = []
107
- for uri in uncurried_nft.license_uris.as_python(): # pylint: disable=E1133
106
+ license_uris: list[str] = []
107
+ for uri in uncurried_nft.license_uris.as_python():
108
108
  license_uris.append(str(uri, "utf-8"))
109
109
  off_chain_metadata: Optional[str] = None
110
110
  nft_info = NFTInfo(
@@ -135,7 +135,7 @@ async def get_nft_info_from_puzzle(nft_coin_info: NFTCoinInfo, config: Dict[str,
135
135
  return nft_info
136
136
 
137
137
 
138
- def metadata_to_program(metadata: Dict[bytes, Any]) -> Program:
138
+ def metadata_to_program(metadata: dict[bytes, Any]) -> Program:
139
139
  """
140
140
  Convert the metadata dict to a Chialisp program
141
141
  :param metadata: User defined metadata
@@ -148,7 +148,7 @@ def metadata_to_program(metadata: Dict[bytes, Any]) -> Program:
148
148
  return program
149
149
 
150
150
 
151
- def nft_program_to_metadata(program: Program) -> Dict[bytes, Any]:
151
+ def nft_program_to_metadata(program: Program) -> dict[bytes, Any]:
152
152
  """
153
153
  Convert a program to a metadata dict
154
154
  :param program: Chialisp program contains the metadata
@@ -160,7 +160,7 @@ def nft_program_to_metadata(program: Program) -> Dict[bytes, Any]:
160
160
  return metadata
161
161
 
162
162
 
163
- def prepend_value(key: bytes, value: Program, metadata: Dict[bytes, Any]) -> None:
163
+ def prepend_value(key: bytes, value: Program, metadata: dict[bytes, Any]) -> None:
164
164
  """
165
165
  Prepend a value to a list in the metadata
166
166
  :param key: Key of the field
@@ -182,7 +182,7 @@ def update_metadata(metadata: Program, update_condition: Program) -> Program:
182
182
  :param update_condition: Update metadata conditions
183
183
  :return: Updated metadata
184
184
  """
185
- new_metadata: Dict[bytes, Any] = nft_program_to_metadata(metadata)
185
+ new_metadata: dict[bytes, Any] = nft_program_to_metadata(metadata)
186
186
  uri: Program = update_condition.rest().rest().first()
187
187
  prepend_value(uri.first().as_python(), uri.rest(), new_metadata)
188
188
  return metadata_to_program(new_metadata)
@@ -223,7 +223,7 @@ def create_ownership_layer_puzzle(
223
223
 
224
224
 
225
225
  def create_ownership_layer_transfer_solution(
226
- new_did: bytes, new_did_inner_hash: bytes, trade_prices_list: List[List[int]], new_puzhash: bytes32
226
+ new_did: bytes, new_did_inner_hash: bytes, trade_prices_list: list[list[int]], new_puzhash: bytes32
227
227
  ) -> Program:
228
228
  log.debug(
229
229
  "Creating a transfer solution with: DID:%s Inner_puzhash:%s trade_price:%s puzhash:%s",
@@ -239,7 +239,7 @@ def create_ownership_layer_transfer_solution(
239
239
  return solution
240
240
 
241
241
 
242
- def get_metadata_and_phs(unft: UncurriedNFT, solution: SerializedProgram) -> Tuple[Program, bytes32]:
242
+ def get_metadata_and_phs(unft: UncurriedNFT, solution: SerializedProgram) -> tuple[Program, bytes32]:
243
243
  conditions = unft.p2_puzzle.run(unft.get_innermost_solution(solution.to_program()))
244
244
  metadata = unft.metadata
245
245
  puzhash_for_derivation: Optional[bytes32] = None
@@ -291,9 +291,9 @@ def recurry_nft_puzzle(unft: UncurriedNFT, solution: Program, new_inner_puzzle:
291
291
  return new_ownership_puzzle
292
292
 
293
293
 
294
- def get_new_owner_did(unft: UncurriedNFT, solution: Program) -> Union[None, Literal[b""], bytes32]:
294
+ def get_new_owner_did(unft: UncurriedNFT, solution: Program) -> Union[Literal[b""], bytes32, None]:
295
295
  conditions = unft.p2_puzzle.run(unft.get_innermost_solution(solution))
296
- new_did_id: Union[None, Literal[b""], bytes32] = None
296
+ new_did_id: Union[Literal[b""], bytes32, None] = None
297
297
  for condition in conditions.as_iter():
298
298
  if condition.first().as_int() == -10:
299
299
  # this is the change owner magic condition