chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__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.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.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.0rc1.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
chia/types/coin_spend.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import Any, Dict, List, Tuple, Union
4
+ from typing import Any, Union
5
5
 
6
6
  import chia_rs
7
7
 
@@ -46,7 +46,7 @@ def compute_additions_with_cost(
46
46
  cs: CoinSpend,
47
47
  *,
48
48
  max_cost: int = DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM,
49
- ) -> Tuple[List[Coin], int]:
49
+ ) -> tuple[list[Coin], int]:
50
50
  """
51
51
  Run the puzzle in the specified CoinSpend and return the cost and list of
52
52
  coins created by the puzzle, i.e. additions. If the cost (CLVM- and
@@ -56,14 +56,14 @@ def compute_additions_with_cost(
56
56
  measured at the block generator level.
57
57
  """
58
58
  parent_id = cs.coin.name()
59
- ret: List[Coin] = []
59
+ ret: list[Coin] = []
60
60
  cost, r = cs.puzzle_reveal.run_with_cost(max_cost, cs.solution)
61
61
  for cond in Program.to(r).as_iter():
62
62
  if cost > max_cost:
63
63
  raise ValidationError(Err.BLOCK_COST_EXCEEDS_MAX, "compute_additions() for CoinSpend")
64
64
  atoms = cond.as_iter()
65
65
  op = next(atoms).atom
66
- if op in [
66
+ if op in {
67
67
  ConditionOpcode.AGG_SIG_PARENT,
68
68
  ConditionOpcode.AGG_SIG_PUZZLE,
69
69
  ConditionOpcode.AGG_SIG_AMOUNT,
@@ -72,7 +72,7 @@ def compute_additions_with_cost(
72
72
  ConditionOpcode.AGG_SIG_PARENT_PUZZLE,
73
73
  ConditionOpcode.AGG_SIG_UNSAFE,
74
74
  ConditionOpcode.AGG_SIG_ME,
75
- ]:
75
+ }:
76
76
  cost += ConditionCost.AGG_SIG.value
77
77
  continue
78
78
  if op != ConditionOpcode.CREATE_COIN.value:
@@ -85,7 +85,7 @@ def compute_additions_with_cost(
85
85
  return ret, cost
86
86
 
87
87
 
88
- def compute_additions(cs: CoinSpend, *, max_cost: int = DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM) -> List[Coin]:
88
+ def compute_additions(cs: CoinSpend, *, max_cost: int = DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM) -> list[Coin]:
89
89
  return compute_additions_with_cost(cs, max_cost=max_cost)[0]
90
90
 
91
91
 
@@ -99,10 +99,10 @@ class SpendInfo(Streamable):
99
99
  @dataclass(frozen=True)
100
100
  class CoinSpendWithConditions:
101
101
  coin_spend: CoinSpend
102
- conditions: List[ConditionWithArgs]
102
+ conditions: list[ConditionWithArgs]
103
103
 
104
104
  @staticmethod
105
- def from_json_dict(dict: Dict[str, Any]) -> CoinSpendWithConditions:
105
+ def from_json_dict(dict: dict[str, Any]) -> CoinSpendWithConditions:
106
106
  return CoinSpendWithConditions(
107
107
  CoinSpend.from_json_dict(dict["coin_spend"]),
108
108
  [
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import List
5
4
 
6
5
  from chia.types.condition_opcodes import ConditionOpcode
7
6
 
@@ -14,4 +13,4 @@ class ConditionWithArgs:
14
13
  """
15
14
 
16
15
  opcode: ConditionOpcode
17
- vars: List[bytes]
16
+ vars: list[bytes]
@@ -1,7 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import dataclasses
4
- from typing import Awaitable, Callable, Dict, List, Optional, Tuple
4
+ from collections.abc import Awaitable
5
+ from typing import Callable, Optional
5
6
 
6
7
  from chia_rs import fast_forward_singleton, get_conditions_from_spendbundle
7
8
 
@@ -21,7 +22,7 @@ from chia.util.ints import uint32, uint64
21
22
  @dataclasses.dataclass(frozen=True)
22
23
  class EligibilityAndAdditions:
23
24
  is_eligible_for_dedup: bool
24
- spend_additions: List[Coin]
25
+ spend_additions: list[Coin]
25
26
  is_eligible_for_ff: bool
26
27
 
27
28
 
@@ -50,7 +51,7 @@ class UnspentLineageInfo:
50
51
 
51
52
 
52
53
  def set_next_singleton_version(
53
- current_singleton: Coin, singleton_additions: List[Coin], fast_forward_spends: Dict[bytes32, UnspentLineageInfo]
54
+ current_singleton: Coin, singleton_additions: list[Coin], fast_forward_spends: dict[bytes32, UnspentLineageInfo]
54
55
  ) -> None:
55
56
  """
56
57
  Finds the next version of the singleton among its additions and updates the
@@ -83,8 +84,8 @@ def set_next_singleton_version(
83
84
  def perform_the_fast_forward(
84
85
  unspent_lineage_info: UnspentLineageInfo,
85
86
  spend_data: BundleCoinSpend,
86
- fast_forward_spends: Dict[bytes32, UnspentLineageInfo],
87
- ) -> Tuple[CoinSpend, List[Coin]]:
87
+ fast_forward_spends: dict[bytes32, UnspentLineageInfo],
88
+ ) -> tuple[CoinSpend, list[Coin]]:
88
89
  """
89
90
  Performs a singleton fast forward, including the updating of all previous
90
91
  additions to point to the most recent version, and updates the fast forward
@@ -97,7 +98,7 @@ def perform_the_fast_forward(
97
98
 
98
99
  Returns:
99
100
  CoinSpend: the new coin spend after performing the fast forward
100
- List[Coin]: the updated additions that point to the new coin to spend
101
+ list[Coin]: the updated additions that point to the new coin to spend
101
102
 
102
103
  Raises:
103
104
  ValueError if none of the additions are considered to be the singleton's
@@ -141,12 +142,12 @@ def perform_the_fast_forward(
141
142
 
142
143
  @dataclasses.dataclass(frozen=True)
143
144
  class EligibleCoinSpends:
144
- deduplication_spends: Dict[bytes32, DedupCoinSpend] = dataclasses.field(default_factory=dict)
145
- fast_forward_spends: Dict[bytes32, UnspentLineageInfo] = dataclasses.field(default_factory=dict)
145
+ deduplication_spends: dict[bytes32, DedupCoinSpend] = dataclasses.field(default_factory=dict)
146
+ fast_forward_spends: dict[bytes32, UnspentLineageInfo] = dataclasses.field(default_factory=dict)
146
147
 
147
148
  def get_deduplication_info(
148
- self, *, bundle_coin_spends: Dict[bytes32, BundleCoinSpend], max_cost: int
149
- ) -> Tuple[List[CoinSpend], uint64, List[Coin]]:
149
+ self, *, bundle_coin_spends: dict[bytes32, BundleCoinSpend], max_cost: int
150
+ ) -> tuple[list[CoinSpend], uint64, list[Coin]]:
150
151
  """
151
152
  Checks all coin spends of a mempool item for deduplication eligibility and
152
153
  provides the caller with the necessary information that allows it to perform
@@ -157,9 +158,9 @@ class EligibleCoinSpends:
157
158
  max_cost: the maximum limit when running for cost
158
159
 
159
160
  Returns:
160
- List[CoinSpend]: list of unique coin spends in this mempool item
161
+ list[CoinSpend]: list of unique coin spends in this mempool item
161
162
  uint64: the cost we're saving by deduplicating eligible coins
162
- List[Coin]: list of unique additions in this mempool item
163
+ list[Coin]: list of unique additions in this mempool item
163
164
 
164
165
  Raises:
165
166
  ValueError to skip the mempool item we're currently in, if it's
@@ -167,10 +168,10 @@ class EligibleCoinSpends:
167
168
  one we're already deduplicating on.
168
169
  """
169
170
  cost_saving = 0
170
- unique_coin_spends: List[CoinSpend] = []
171
- unique_additions: List[Coin] = []
171
+ unique_coin_spends: list[CoinSpend] = []
172
+ unique_additions: list[Coin] = []
172
173
  # Map of coin ID to deduplication information
173
- new_dedup_spends: Dict[bytes32, DedupCoinSpend] = {}
174
+ new_dedup_spends: dict[bytes32, DedupCoinSpend] = {}
174
175
  # See if this item has coin spends that are eligible for deduplication
175
176
  for coin_id, spend_data in bundle_coin_spends.items():
176
177
  if not spend_data.eligible_for_dedup:
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import List
5
4
 
6
5
  from chia.types.blockchain_format.serialized_program import SerializedProgram
7
6
  from chia.util.streamable import Streamable, streamable
@@ -11,4 +10,4 @@ from chia.util.streamable import Streamable, streamable
11
10
  @dataclass(frozen=True)
12
11
  class BlockGenerator(Streamable):
13
12
  program: SerializedProgram
14
- generator_refs: List[bytes]
13
+ generator_refs: list[bytes]
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import Dict
5
4
 
6
5
  from chia.types.blockchain_format.sized_bytes import bytes32
7
6
  from chia.types.mempool_item import BundleCoinSpend
@@ -16,4 +15,4 @@ class InternalMempoolItem:
16
15
  conds: SpendBundleConditions
17
16
  height_added_to_mempool: uint32
18
17
  # Map of coin ID to coin spend data between the bundle and its NPCResult
19
- bundle_coin_spends: Dict[bytes32, BundleCoinSpend]
18
+ bundle_coin_spends: dict[bytes32, BundleCoinSpend]
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass, field
4
- from typing import Any, Dict, List, Optional
4
+ from typing import Any, Optional
5
5
 
6
6
  from chia.types.blockchain_format.coin import Coin
7
7
  from chia.types.blockchain_format.sized_bytes import bytes32
@@ -17,7 +17,7 @@ class BundleCoinSpend:
17
17
  coin_spend: CoinSpend
18
18
  eligible_for_dedup: bool
19
19
  eligible_for_fast_forward: bool
20
- additions: List[Coin]
20
+ additions: list[Coin]
21
21
  # cost on the specific solution in this item
22
22
  cost: Optional[uint64] = None
23
23
 
@@ -40,7 +40,7 @@ class MempoolItem:
40
40
 
41
41
  # Map of coin ID to coin spend data between the bundle and its
42
42
  # SpendBundleConditions
43
- bundle_coin_spends: Dict[bytes32, BundleCoinSpend] = field(default_factory=dict)
43
+ bundle_coin_spends: dict[bytes32, BundleCoinSpend] = field(default_factory=dict)
44
44
 
45
45
  def __lt__(self, other: MempoolItem) -> bool:
46
46
  return self.fee_per_cost < other.fee_per_cost
@@ -61,8 +61,8 @@ class MempoolItem:
61
61
  return uint64(0 if self.conds is None else self.conds.cost)
62
62
 
63
63
  @property
64
- def additions(self) -> List[Coin]:
65
- additions: List[Coin] = []
64
+ def additions(self) -> list[Coin]:
65
+ additions: list[Coin] = []
66
66
  for spend in self.conds.spends:
67
67
  for puzzle_hash, amount, _ in spend.create_coin:
68
68
  coin = Coin(spend.coin_id, puzzle_hash, uint64(amount))
@@ -70,10 +70,10 @@ class MempoolItem:
70
70
  return additions
71
71
 
72
72
  @property
73
- def removals(self) -> List[Coin]:
73
+ def removals(self) -> list[Coin]:
74
74
  return self.spend_bundle.removals()
75
75
 
76
- def to_json_dict(self) -> Dict[str, Any]:
76
+ def to_json_dict(self) -> dict[str, Any]:
77
77
  return {
78
78
  "spend_bundle": recurse_jsonify(self.spend_bundle),
79
79
  "fee": recurse_jsonify(self.fee),
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import Dict, Optional, Union
4
+ from typing import Optional, Union
5
5
 
6
6
  from chia.types.mempool_inclusion_status import MempoolInclusionStatus
7
7
  from chia.util.ints import uint8
@@ -21,7 +21,7 @@ class MempoolSubmissionStatus(Streamable):
21
21
  inclusion_status: uint8 # MempoolInclusionStatus
22
22
  error_msg: Optional[str]
23
23
 
24
- def to_json_dict_convenience(self) -> Dict[str, Union[str, MempoolInclusionStatus, Optional[str]]]:
24
+ def to_json_dict_convenience(self) -> dict[str, Union[str, MempoolInclusionStatus, Optional[str]]]:
25
25
  formatted = self.to_json_dict()
26
26
  formatted["inclusion_status"] = MempoolInclusionStatus(self.inclusion_status).name
27
27
  return formatted
chia/types/peer_info.py CHANGED
@@ -5,7 +5,7 @@ from dataclasses import dataclass
5
5
  from typing import Union
6
6
 
7
7
  from chia.util.ints import uint16, uint64
8
- from chia.util.network import IPAddress
8
+ from chia.util.ip_address import IPAddress
9
9
  from chia.util.streamable import Streamable, streamable
10
10
 
11
11
 
@@ -5,10 +5,9 @@ from typing import TypeVar
5
5
  import chia_rs
6
6
 
7
7
  from chia.consensus.default_constants import DEFAULT_CONSTANTS
8
+ from chia.types.coin_spend import compute_additions_with_cost
8
9
  from chia.util.errors import Err, ValidationError
9
10
 
10
- from .coin_spend import compute_additions_with_cost
11
-
12
11
  SpendBundle = chia_rs.SpendBundle
13
12
  T_SpendBundle = TypeVar("T_SpendBundle", bound="SpendBundle")
14
13
 
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import asyncio
4
4
  import dataclasses
5
5
  from dataclasses import dataclass, field
6
- from typing import ClassVar, Generic, Optional, Tuple, TypeVar, Union
6
+ from typing import ClassVar, Generic, Optional, TypeVar, Union
7
7
 
8
8
  from chia.server.ws_connection import WSChiaConnection
9
9
  from chia.types.blockchain_format.sized_bytes import bytes32
@@ -49,7 +49,7 @@ class TransactionQueueEntry:
49
49
  spend_name: bytes32
50
50
  peer: Optional[WSChiaConnection] = field(compare=False)
51
51
  test: bool = field(compare=False)
52
- done: ValuedEvent[Tuple[MempoolInclusionStatus, Optional[Err]]] = field(
52
+ done: ValuedEvent[tuple[MempoolInclusionStatus, Optional[Err]]] = field(
53
53
  default_factory=ValuedEvent,
54
54
  compare=False,
55
55
  )
@@ -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.foliage import Foliage, FoliageTransactionBlock
7
7
  from chia.types.blockchain_format.reward_chain_block import RewardChainBlockUnfinished
@@ -16,7 +16,7 @@ from chia.util.streamable import Streamable, streamable
16
16
  @dataclass(frozen=True)
17
17
  class UnfinishedHeaderBlock(Streamable):
18
18
  # Same as a FullBlock but without TransactionInfo and Generator, used by light clients
19
- finished_sub_slots: List[EndOfSubSlotBundle] # If first sb
19
+ finished_sub_slots: list[EndOfSubSlotBundle] # If first sb
20
20
  reward_chain_block: RewardChainBlockUnfinished # Reward chain trunk data
21
21
  challenge_chain_sp_proof: Optional[VDFProof] # If not first sp in sub-slot
22
22
  reward_chain_sp_proof: Optional[VDFProof] # If not first sp in sub-slot
@@ -0,0 +1,14 @@
1
+ from __future__ import annotations
2
+
3
+ import dataclasses
4
+ from typing import Optional
5
+
6
+ from chia.consensus.block_record import BlockRecord
7
+ from chia.util.ints import uint64
8
+
9
+
10
+ @dataclasses.dataclass
11
+ class ValidationState:
12
+ ssi: uint64
13
+ difficulty: uint64
14
+ prev_ses_block: Optional[BlockRecord] = None
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import List
5
4
 
6
5
  import chia_rs
7
6
 
@@ -32,19 +31,19 @@ SubSlotData = chia_rs.SubSlotData
32
31
  @dataclass(frozen=True)
33
32
  # this is used only for serialization to database
34
33
  class RecentChainData(Streamable):
35
- recent_chain_data: List[HeaderBlock]
34
+ recent_chain_data: list[HeaderBlock]
36
35
 
37
36
 
38
37
  @streamable
39
38
  @dataclass(frozen=True)
40
39
  class ProofBlockHeader(Streamable):
41
- finished_sub_slots: List[EndOfSubSlotBundle]
40
+ finished_sub_slots: list[EndOfSubSlotBundle]
42
41
  reward_chain_block: RewardChainBlock
43
42
 
44
43
 
45
44
  @streamable
46
45
  @dataclass(frozen=True)
47
46
  class WeightProof(Streamable):
48
- sub_epochs: List[SubEpochData]
49
- sub_epoch_segments: List[SubEpochChallengeSegment] # sampled sub epoch
50
- recent_chain_data: List[HeaderBlock]
47
+ sub_epochs: list[SubEpochData]
48
+ sub_epoch_segments: list[SubEpochChallengeSegment] # sampled sub epoch
49
+ recent_chain_data: list[HeaderBlock]
chia/util/action_scope.py CHANGED
@@ -1,8 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import contextlib
4
+ from collections.abc import AsyncIterator, Awaitable
4
5
  from dataclasses import dataclass, field
5
- from typing import AsyncIterator, Awaitable, Callable, Generic, Optional, Protocol, Type, TypeVar, final
6
+ from typing import Callable, Generic, Optional, Protocol, TypeVar, final
6
7
 
7
8
  import aiosqlite
8
9
 
@@ -21,14 +22,13 @@ class ResourceManager(Protocol):
21
22
  # yield included to make this a generator as expected by @contextlib.asynccontextmanager
22
23
  yield
23
24
 
24
- async def get_resource(self, resource_type: Type[_T_SideEffects]) -> _T_SideEffects: ...
25
+ async def get_resource(self, resource_type: type[_T_SideEffects]) -> _T_SideEffects: ...
25
26
 
26
27
  async def save_resource(self, resource: SideEffects) -> None: ...
27
28
 
28
29
 
29
30
  @dataclass
30
31
  class SQLiteResourceManager:
31
-
32
32
  _db: DBWrapper2
33
33
  _active_writer: Optional[aiosqlite.Connection] = field(init=False, default=None)
34
34
 
@@ -62,7 +62,7 @@ class SQLiteResourceManager:
62
62
  finally:
63
63
  self._active_writer = None
64
64
 
65
- async def get_resource(self, resource_type: Type[_T_SideEffects]) -> _T_SideEffects:
65
+ async def get_resource(self, resource_type: type[_T_SideEffects]) -> _T_SideEffects:
66
66
  row = await execute_fetchone(self.get_active_writer(), "SELECT total FROM side_effects")
67
67
  assert row is not None
68
68
  side_effects = resource_type.from_bytes(row[0])
@@ -80,7 +80,7 @@ class SideEffects(Protocol):
80
80
  def __bytes__(self) -> bytes: ...
81
81
 
82
82
  @classmethod
83
- def from_bytes(cls: Type[_T_SideEffects], blob: bytes) -> _T_SideEffects: ...
83
+ def from_bytes(cls: type[_T_SideEffects], blob: bytes) -> _T_SideEffects: ...
84
84
 
85
85
 
86
86
  _T_SideEffects = TypeVar("_T_SideEffects", bound=SideEffects)
@@ -100,7 +100,7 @@ class ActionScope(Generic[_T_SideEffects, _T_Config]):
100
100
  """
101
101
 
102
102
  _resource_manager: ResourceManager
103
- _side_effects_format: Type[_T_SideEffects]
103
+ _side_effects_format: type[_T_SideEffects]
104
104
  _config: _T_Config # An object not intended to be mutated during the lifetime of the scope
105
105
  _callback: Optional[Callable[[StateInterface[_T_SideEffects]], Awaitable[None]]] = None
106
106
  _final_side_effects: Optional[_T_SideEffects] = field(init=False, default=None)
@@ -123,11 +123,11 @@ class ActionScope(Generic[_T_SideEffects, _T_Config]):
123
123
  @contextlib.asynccontextmanager
124
124
  async def new_scope(
125
125
  cls,
126
- side_effects_format: Type[_T_SideEffects],
126
+ side_effects_format: type[_T_SideEffects],
127
127
  # I want a default here in case a use case doesn't want to take advantage of the config but no default seems to
128
128
  # satisfy the type hint _T_Config so we'll just ignore this.
129
129
  config: _T_Config = object(), # type: ignore[assignment]
130
- resource_manager_backend: Type[ResourceManager] = SQLiteResourceManager,
130
+ resource_manager_backend: type[ResourceManager] = SQLiteResourceManager,
131
131
  ) -> AsyncIterator[ActionScope[_T_SideEffects, _T_Config]]:
132
132
  async with resource_manager_backend.managed(side_effects_format()) as resource_manager:
133
133
  self = cls(_resource_manager=resource_manager, _side_effects_format=side_effects_format, _config=config)
chia/util/async_pool.py CHANGED
@@ -6,11 +6,13 @@ import dataclasses
6
6
  import itertools
7
7
  import logging
8
8
  import traceback
9
- from typing import AsyncIterator, Dict, Generic, Iterator, Optional, Protocol, TypeVar, final
9
+ from collections.abc import AsyncIterator, Iterator
10
+ from typing import Generic, Optional, Protocol, TypeVar, final
10
11
 
11
12
  import anyio
12
13
 
13
14
  from chia.util.log_exceptions import log_exceptions
15
+ from chia.util.task_referencer import create_referenced_task
14
16
 
15
17
 
16
18
  class InvalidTargetWorkerCountError(Exception):
@@ -128,7 +130,7 @@ class AsyncPool:
128
130
  log: logging.Logger
129
131
  worker_async_callable: WorkerCallable
130
132
  _target_worker_count: int
131
- _workers: Dict[asyncio.Task[object], int] = dataclasses.field(init=False, default_factory=dict)
133
+ _workers: dict[asyncio.Task[object], int] = dataclasses.field(init=False, default_factory=dict)
132
134
  _worker_id_counter: Iterator[int] = dataclasses.field(init=False, default_factory=itertools.count)
133
135
  _started: asyncio.Event = dataclasses.field(default_factory=asyncio.Event)
134
136
  _single_use_used: bool = False
@@ -152,7 +154,7 @@ class AsyncPool:
152
154
  if self._target_worker_count < 1:
153
155
  raise InvalidTargetWorkerCountError(self._target_worker_count)
154
156
 
155
- task = asyncio.create_task(self._run(_check_single_use=False))
157
+ task = create_referenced_task(self._run(_check_single_use=False))
156
158
  try:
157
159
  # TODO: should this terminate if the run task ends?
158
160
  await self._started.wait()
@@ -186,7 +188,7 @@ class AsyncPool:
186
188
  async def _run_single(self) -> None:
187
189
  while len(self._workers) < self._target_worker_count:
188
190
  new_worker_id = next(self._worker_id_counter)
189
- new_worker = asyncio.create_task(self.worker_async_callable(new_worker_id))
191
+ new_worker = create_referenced_task(self.worker_async_callable(new_worker_id))
190
192
  self.log.debug(f"{self.name}: adding worker {new_worker_id}")
191
193
  self._workers[new_worker] = new_worker_id
192
194
 
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, ClassVar, Dict, List, Optional, Set, Tuple, cast
3
+ from typing import TYPE_CHECKING, ClassVar, Optional, cast
4
4
 
5
5
  from chia.consensus.block_record import BlockRecord
6
6
  from chia.consensus.blockchain_interface import BlocksProtocol
@@ -26,8 +26,8 @@ class AugmentedBlockchain:
26
26
  _protocol_check: ClassVar[BlocksProtocol] = cast("AugmentedBlockchain", None)
27
27
 
28
28
  _underlying: BlocksProtocol
29
- _extra_blocks: Dict[bytes32, Tuple[FullBlock, BlockRecord]]
30
- _height_to_hash: Dict[uint32, bytes32]
29
+ _extra_blocks: dict[bytes32, tuple[FullBlock, BlockRecord]]
30
+ _height_to_hash: dict[uint32, bytes32]
31
31
 
32
32
  def __init__(self, underlying: BlocksProtocol) -> None:
33
33
  self._underlying = underlying
@@ -45,15 +45,19 @@ class AugmentedBlockchain:
45
45
  self._extra_blocks[block_record.header_hash] = (block, block_record)
46
46
  self._height_to_hash[block_record.height] = block_record.header_hash
47
47
 
48
- # BlocksProtocol
49
- async def lookup_block_generators(self, header_hash: bytes32, generator_refs: Set[uint32]) -> Dict[uint32, bytes]:
48
+ def remove_extra_block(self, hh: bytes32) -> None:
49
+ if hh in self._extra_blocks:
50
+ block_record = self._extra_blocks.pop(hh)[1]
51
+ del self._height_to_hash[block_record.height]
50
52
 
51
- generators: Dict[uint32, bytes] = {}
53
+ # BlocksProtocol
54
+ async def lookup_block_generators(self, header_hash: bytes32, generator_refs: set[uint32]) -> dict[uint32, bytes]:
55
+ generators: dict[uint32, bytes] = {}
52
56
 
53
57
  # traverse the additional blocks (if any) and resolve heights into
54
58
  # generators
55
59
  to_remove = []
56
- curr: Optional[Tuple[FullBlock, BlockRecord]] = self._extra_blocks.get(header_hash)
60
+ curr: Optional[tuple[FullBlock, BlockRecord]] = self._extra_blocks.get(header_hash)
57
61
  while curr is not None:
58
62
  b = curr[0]
59
63
  if b.height in generator_refs:
@@ -119,8 +123,8 @@ class AugmentedBlockchain:
119
123
  def contains_height(self, height: uint32) -> bool:
120
124
  return (height in self._height_to_hash) or self._underlying.contains_height(height)
121
125
 
122
- async def prev_block_hash(self, header_hashes: List[bytes32]) -> List[bytes32]:
123
- ret: List[bytes32] = []
126
+ async def prev_block_hash(self, header_hashes: list[bytes32]) -> list[bytes32]:
127
+ ret: list[bytes32] = []
124
128
  for hh in header_hashes:
125
129
  b = self._extra_blocks.get(hh)
126
130
  if b is not None:
chia/util/batches.py CHANGED
@@ -1,7 +1,10 @@
1
+ # Package: utils
2
+
1
3
  from __future__ import annotations
2
4
 
5
+ from collections.abc import Collection, Iterator
3
6
  from dataclasses import dataclass
4
- from typing import Collection, Generic, Iterator, List, TypeVar
7
+ from typing import Generic, TypeVar
5
8
 
6
9
  T = TypeVar("T")
7
10
 
@@ -9,7 +12,7 @@ T = TypeVar("T")
9
12
  @dataclass(frozen=True)
10
13
  class Batch(Generic[T]):
11
14
  remaining: int
12
- entries: List[T]
15
+ entries: list[T]
13
16
 
14
17
 
15
18
  def to_batches(to_split: Collection[T], batch_size: int) -> Iterator[Batch[T]]:
chia/util/bech32m.py CHANGED
@@ -1,3 +1,5 @@
1
+ # Package: utils
2
+
1
3
  # Copyright (c) 2017 Pieter Wuille
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -20,9 +22,10 @@
20
22
 
21
23
  from __future__ import annotations
22
24
 
23
- from typing import Iterable, List, Optional, Tuple
25
+ from collections.abc import Iterable
26
+ from typing import Optional
24
27
 
25
- from chia.types.blockchain_format.sized_bytes import bytes32
28
+ from chia_rs.sized_bytes import bytes32
26
29
 
27
30
  # Based on this specification from Pieter Wuille:
28
31
  # https://github.com/sipa/bips/blob/bip-bech32m/bip-bech32m.mediawiki
@@ -32,7 +35,7 @@ from chia.types.blockchain_format.sized_bytes import bytes32
32
35
  CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"
33
36
 
34
37
 
35
- def bech32_polymod(values: List[int]) -> int:
38
+ def bech32_polymod(values: list[int]) -> int:
36
39
  """Internal function that computes the Bech32 checksum."""
37
40
  generator = [0x3B6A57B2, 0x26508E6D, 0x1EA119FA, 0x3D4233DD, 0x2A1462B3]
38
41
  chk = 1
@@ -44,7 +47,7 @@ def bech32_polymod(values: List[int]) -> int:
44
47
  return chk
45
48
 
46
49
 
47
- def bech32_hrp_expand(hrp: str) -> List[int]:
50
+ def bech32_hrp_expand(hrp: str) -> list[int]:
48
51
  """Expand the HRP into values for checksum computation."""
49
52
  return [ord(x) >> 5 for x in hrp] + [0] + [ord(x) & 31 for x in hrp]
50
53
 
@@ -52,23 +55,23 @@ def bech32_hrp_expand(hrp: str) -> List[int]:
52
55
  M = 0x2BC830A3
53
56
 
54
57
 
55
- def bech32_verify_checksum(hrp: str, data: List[int]) -> bool:
58
+ def bech32_verify_checksum(hrp: str, data: list[int]) -> bool:
56
59
  return bech32_polymod(bech32_hrp_expand(hrp) + data) == M
57
60
 
58
61
 
59
- def bech32_create_checksum(hrp: str, data: List[int]) -> List[int]:
62
+ def bech32_create_checksum(hrp: str, data: list[int]) -> list[int]:
60
63
  values = bech32_hrp_expand(hrp) + data
61
- polymod = bech32_polymod(values + [0, 0, 0, 0, 0, 0]) ^ M
64
+ polymod = bech32_polymod([*values, 0, 0, 0, 0, 0, 0]) ^ M
62
65
  return [(polymod >> 5 * (5 - i)) & 31 for i in range(6)]
63
66
 
64
67
 
65
- def bech32_encode(hrp: str, data: List[int]) -> str:
68
+ def bech32_encode(hrp: str, data: list[int]) -> str:
66
69
  """Compute a Bech32 string given HRP and data values."""
67
70
  combined = data + bech32_create_checksum(hrp, data)
68
71
  return hrp + "1" + "".join([CHARSET[d] for d in combined])
69
72
 
70
73
 
71
- def bech32_decode(bech: str, max_length: int = 90) -> Tuple[Optional[str], Optional[List[int]]]:
74
+ def bech32_decode(bech: str, max_length: int = 90) -> tuple[Optional[str], Optional[list[int]]]:
72
75
  """Validate a Bech32 string, and determine HRP and data."""
73
76
  bech = bech.strip()
74
77
  if (any(ord(x) < 33 or ord(x) > 126 for x in bech)) or (bech.lower() != bech and bech.upper() != bech):
@@ -86,7 +89,7 @@ def bech32_decode(bech: str, max_length: int = 90) -> Tuple[Optional[str], Optio
86
89
  return hrp, data[:-6]
87
90
 
88
91
 
89
- def convertbits(data: Iterable[int], frombits: int, tobits: int, pad: bool = True) -> List[int]:
92
+ def convertbits(data: Iterable[int], frombits: int, tobits: int, pad: bool = True) -> list[int]:
90
93
  """General power-of-2 base conversion."""
91
94
  acc = 0
92
95
  bits = 0
@@ -115,7 +118,7 @@ def encode_puzzle_hash(puzzle_hash: bytes32, prefix: str) -> str:
115
118
 
116
119
 
117
120
  def decode_puzzle_hash(address: str) -> bytes32:
118
- hrpgot, data = bech32_decode(address)
121
+ _hrpgot, data = bech32_decode(address)
119
122
  if data is None:
120
123
  raise ValueError("Invalid Address")
121
124
  decoded = convertbits(data, 5, 8, False)