chia-blockchain 2.5.4rc2__py3-none-any.whl → 2.5.5rc1__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 (453) hide show
  1. chia/_tests/blockchain/blockchain_test_utils.py +2 -3
  2. chia/_tests/blockchain/test_augmented_chain.py +2 -3
  3. chia/_tests/blockchain/test_blockchain.py +261 -44
  4. chia/_tests/blockchain/test_blockchain_transactions.py +4 -3
  5. chia/_tests/blockchain/test_build_chains.py +197 -1
  6. chia/_tests/blockchain/test_get_block_generator.py +1 -1
  7. chia/_tests/blockchain/test_lookup_fork_chain.py +1 -1
  8. chia/_tests/clvm/benchmark_costs.py +1 -1
  9. chia/_tests/clvm/coin_store.py +3 -4
  10. chia/_tests/clvm/test_message_conditions.py +2 -2
  11. chia/_tests/clvm/test_puzzle_compression.py +2 -3
  12. chia/_tests/clvm/test_puzzles.py +1 -2
  13. chia/_tests/clvm/test_singletons.py +2 -3
  14. chia/_tests/clvm/test_spend_sim.py +7 -7
  15. chia/_tests/cmds/cmd_test_utils.py +30 -25
  16. chia/_tests/cmds/test_dev_gh.py +1 -1
  17. chia/_tests/cmds/test_farm_cmd.py +1 -1
  18. chia/_tests/cmds/test_show.py +1 -2
  19. chia/_tests/cmds/wallet/test_did.py +101 -56
  20. chia/_tests/cmds/wallet/test_nft.py +109 -84
  21. chia/_tests/cmds/wallet/test_notifications.py +1 -1
  22. chia/_tests/cmds/wallet/test_offer.toffer +1 -1
  23. chia/_tests/cmds/wallet/test_vcs.py +8 -8
  24. chia/_tests/cmds/wallet/test_wallet.py +100 -46
  25. chia/_tests/conftest.py +31 -20
  26. chia/_tests/connection_utils.py +1 -1
  27. chia/_tests/core/consensus/stores/__init__.py +0 -0
  28. chia/_tests/core/consensus/stores/test_coin_store_protocol.py +40 -0
  29. chia/_tests/core/consensus/test_block_creation.py +2 -31
  30. chia/_tests/core/consensus/test_pot_iterations.py +38 -3
  31. chia/_tests/core/custom_types/test_proof_of_space.py +154 -26
  32. chia/_tests/core/custom_types/test_spend_bundle.py +2 -3
  33. chia/_tests/core/daemon/test_daemon.py +80 -0
  34. chia/_tests/core/data_layer/test_data_layer.py +1 -1
  35. chia/_tests/core/data_layer/test_data_layer_util.py +1 -1
  36. chia/_tests/core/data_layer/test_data_rpc.py +14 -10
  37. chia/_tests/core/data_layer/test_data_store.py +5 -5
  38. chia/_tests/core/farmer/test_farmer_api.py +2 -2
  39. chia/_tests/core/full_node/full_sync/test_full_sync.py +446 -406
  40. chia/_tests/core/full_node/ram_db.py +3 -1
  41. chia/_tests/core/full_node/stores/test_block_store.py +28 -16
  42. chia/_tests/core/full_node/stores/test_coin_store.py +277 -185
  43. chia/_tests/core/full_node/stores/test_full_node_store.py +11 -4
  44. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  45. chia/_tests/core/full_node/test_address_manager.py +200 -27
  46. chia/_tests/core/full_node/test_block_height_map.py +2 -2
  47. chia/_tests/core/full_node/test_conditions.py +7 -6
  48. chia/_tests/core/full_node/test_full_node.py +456 -40
  49. chia/_tests/core/full_node/test_generator_tools.py +32 -2
  50. chia/_tests/core/full_node/test_hint_management.py +1 -1
  51. chia/_tests/core/full_node/test_node_load.py +20 -21
  52. chia/_tests/core/full_node/test_performance.py +3 -4
  53. chia/_tests/core/full_node/test_prev_tx_block.py +43 -0
  54. chia/_tests/core/full_node/test_subscriptions.py +1 -2
  55. chia/_tests/core/full_node/test_transactions.py +9 -5
  56. chia/_tests/core/full_node/test_tx_processing_queue.py +1 -2
  57. chia/_tests/core/large_block.py +1 -2
  58. chia/_tests/core/make_block_generator.py +3 -4
  59. chia/_tests/core/mempool/test_mempool.py +36 -86
  60. chia/_tests/core/mempool/test_mempool_fee_estimator.py +1 -1
  61. chia/_tests/core/mempool/test_mempool_item_queries.py +1 -3
  62. chia/_tests/core/mempool/test_mempool_manager.py +421 -69
  63. chia/_tests/core/mempool/test_mempool_performance.py +3 -2
  64. chia/_tests/core/mempool/test_singleton_fast_forward.py +60 -131
  65. chia/_tests/core/server/flood.py +1 -1
  66. chia/_tests/core/server/test_dos.py +1 -1
  67. chia/_tests/core/server/test_node_discovery.py +41 -27
  68. chia/_tests/core/server/test_rate_limits.py +1 -1
  69. chia/_tests/core/server/test_server.py +1 -1
  70. chia/_tests/core/services/test_services.py +5 -5
  71. chia/_tests/core/ssl/test_ssl.py +1 -1
  72. chia/_tests/core/test_cost_calculation.py +6 -6
  73. chia/_tests/core/test_crawler.py +2 -2
  74. chia/_tests/core/test_crawler_rpc.py +1 -1
  75. chia/_tests/core/test_db_conversion.py +3 -1
  76. chia/_tests/core/test_db_validation.py +5 -3
  77. chia/_tests/core/test_farmer_harvester_rpc.py +15 -15
  78. chia/_tests/core/test_filter.py +4 -1
  79. chia/_tests/core/test_full_node_rpc.py +99 -82
  80. chia/_tests/core/test_program.py +2 -2
  81. chia/_tests/core/util/test_block_cache.py +1 -1
  82. chia/_tests/core/util/test_keychain.py +2 -2
  83. chia/_tests/core/util/test_lockfile.py +1 -1
  84. chia/_tests/core/util/test_log_exceptions.py +5 -5
  85. chia/_tests/core/util/test_streamable.py +81 -22
  86. chia/_tests/db/test_db_wrapper.py +1 -3
  87. chia/_tests/environments/wallet.py +5 -5
  88. chia/_tests/farmer_harvester/test_farmer.py +9 -7
  89. chia/_tests/farmer_harvester/test_farmer_harvester.py +11 -4
  90. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  91. chia/_tests/farmer_harvester/test_third_party_harvesters.py +15 -9
  92. chia/_tests/fee_estimation/test_fee_estimation_integration.py +1 -2
  93. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +7 -5
  94. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +1 -1
  95. chia/_tests/generator/test_compression.py +1 -2
  96. chia/_tests/generator/test_rom.py +8 -4
  97. chia/_tests/plot_sync/test_plot_sync.py +3 -3
  98. chia/_tests/plot_sync/test_receiver.py +3 -3
  99. chia/_tests/plot_sync/test_sender.py +1 -1
  100. chia/_tests/plot_sync/test_sync_simulated.py +3 -3
  101. chia/_tests/plot_sync/util.py +2 -2
  102. chia/_tests/pools/test_pool_cmdline.py +48 -21
  103. chia/_tests/pools/test_pool_puzzles_lifecycle.py +2 -3
  104. chia/_tests/pools/test_pool_rpc.py +237 -105
  105. chia/_tests/pools/test_pool_wallet.py +11 -2
  106. chia/_tests/pools/test_wallet_pool_store.py +5 -4
  107. chia/_tests/rpc/test_rpc_client.py +1 -1
  108. chia/_tests/simulation/test_simulation.py +13 -8
  109. chia/_tests/simulation/test_simulator.py +2 -2
  110. chia/_tests/timelord/test_new_peak.py +191 -47
  111. chia/_tests/timelord/test_timelord.py +1 -1
  112. chia/_tests/tools/test_full_sync.py +0 -2
  113. chia/_tests/tools/test_run_block.py +3 -1
  114. chia/_tests/util/benchmark_cost.py +3 -3
  115. chia/_tests/util/benchmarks.py +2 -2
  116. chia/_tests/util/blockchain.py +11 -5
  117. chia/_tests/util/blockchain_mock.py +1 -4
  118. chia/_tests/util/coin_store.py +29 -0
  119. chia/_tests/util/constants.py +2 -18
  120. chia/_tests/util/full_sync.py +3 -3
  121. chia/_tests/util/generator_tools_testing.py +2 -3
  122. chia/_tests/util/key_tool.py +2 -3
  123. chia/_tests/util/misc.py +33 -31
  124. chia/_tests/util/network_protocol_data.py +19 -17
  125. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  126. chia/_tests/util/protocol_messages_json.py +3 -1
  127. chia/_tests/util/run_block.py +2 -2
  128. chia/_tests/util/setup_nodes.py +7 -7
  129. chia/_tests/util/spend_sim.py +47 -55
  130. chia/_tests/util/test_condition_tools.py +5 -4
  131. chia/_tests/util/test_config.py +2 -2
  132. chia/_tests/util/test_dump_keyring.py +1 -1
  133. chia/_tests/util/test_full_block_utils.py +12 -14
  134. chia/_tests/util/test_misc.py +2 -2
  135. chia/_tests/util/test_paginator.py +4 -4
  136. chia/_tests/util/test_priority_mutex.py +2 -2
  137. chia/_tests/util/test_replace_str_to_bytes.py +15 -5
  138. chia/_tests/util/test_ssl_check.py +1 -1
  139. chia/_tests/util/test_testnet_overrides.py +13 -3
  140. chia/_tests/util/time_out_assert.py +4 -2
  141. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +1 -1
  142. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -2
  143. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +352 -432
  144. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +3 -6
  145. chia/_tests/wallet/cat_wallet/test_trades.py +53 -77
  146. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -1
  147. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +3 -3
  148. chia/_tests/wallet/clawback/test_clawback_metadata.py +4 -2
  149. chia/_tests/wallet/conftest.py +11 -12
  150. chia/_tests/wallet/db_wallet/test_db_graftroot.py +11 -4
  151. chia/_tests/wallet/db_wallet/test_dl_offers.py +433 -130
  152. chia/_tests/wallet/db_wallet/test_dl_wallet.py +3 -3
  153. chia/_tests/wallet/did_wallet/test_did.py +2132 -2000
  154. chia/_tests/wallet/nft_wallet/config.py +1 -1
  155. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1610 -742
  156. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +486 -907
  157. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +4 -4
  158. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +517 -294
  159. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +133 -62
  160. chia/_tests/wallet/rpc/test_wallet_rpc.py +305 -184
  161. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +10 -6
  162. chia/_tests/wallet/sync/test_wallet_sync.py +89 -60
  163. chia/_tests/wallet/test_clvm_casts.py +88 -0
  164. chia/_tests/wallet/test_coin_management.py +1 -1
  165. chia/_tests/wallet/test_coin_selection.py +1 -1
  166. chia/_tests/wallet/test_conditions.py +1 -1
  167. chia/_tests/wallet/test_new_wallet_protocol.py +13 -11
  168. chia/_tests/wallet/test_notifications.py +5 -3
  169. chia/_tests/wallet/test_sign_coin_spends.py +6 -6
  170. chia/_tests/wallet/test_signer_protocol.py +13 -12
  171. chia/_tests/wallet/test_singleton.py +1 -1
  172. chia/_tests/wallet/test_singleton_lifecycle_fast.py +5 -7
  173. chia/_tests/wallet/test_util.py +2 -2
  174. chia/_tests/wallet/test_wallet.py +108 -29
  175. chia/_tests/wallet/test_wallet_action_scope.py +9 -2
  176. chia/_tests/wallet/test_wallet_blockchain.py +2 -3
  177. chia/_tests/wallet/test_wallet_key_val_store.py +1 -2
  178. chia/_tests/wallet/test_wallet_node.py +2 -4
  179. chia/_tests/wallet/test_wallet_retry.py +4 -2
  180. chia/_tests/wallet/test_wallet_state_manager.py +191 -5
  181. chia/_tests/wallet/test_wallet_test_framework.py +1 -1
  182. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +8 -8
  183. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -12
  184. chia/_tests/wallet/wallet_block_tools.py +6 -6
  185. chia/_tests/weight_proof/test_weight_proof.py +10 -48
  186. chia/apis.py +1 -1
  187. chia/cmds/beta.py +1 -1
  188. chia/cmds/chia.py +9 -9
  189. chia/cmds/cmd_classes.py +12 -11
  190. chia/cmds/cmd_helpers.py +1 -1
  191. chia/cmds/cmds_util.py +12 -9
  192. chia/cmds/coin_funcs.py +2 -2
  193. chia/cmds/configure.py +2 -2
  194. chia/cmds/data.py +0 -2
  195. chia/cmds/data_funcs.py +1 -1
  196. chia/cmds/db_validate_func.py +1 -2
  197. chia/cmds/dev/__init__.py +0 -0
  198. chia/cmds/dev/data.py +273 -0
  199. chia/cmds/{gh.py → dev/gh.py} +5 -5
  200. chia/cmds/dev/main.py +22 -0
  201. chia/cmds/dev/mempool.py +78 -0
  202. chia/cmds/dev/mempool_funcs.py +63 -0
  203. chia/cmds/farm_funcs.py +5 -4
  204. chia/cmds/init_funcs.py +11 -11
  205. chia/cmds/keys.py +2 -2
  206. chia/cmds/keys_funcs.py +4 -4
  207. chia/cmds/netspace_funcs.py +1 -1
  208. chia/cmds/peer_funcs.py +2 -2
  209. chia/cmds/plotnft_funcs.py +72 -26
  210. chia/cmds/rpc.py +1 -1
  211. chia/cmds/show_funcs.py +5 -5
  212. chia/cmds/signer.py +8 -7
  213. chia/cmds/sim_funcs.py +8 -9
  214. chia/cmds/wallet.py +2 -2
  215. chia/cmds/wallet_funcs.py +165 -131
  216. chia/{util → consensus}/augmented_chain.py +1 -2
  217. chia/consensus/block_body_validation.py +54 -40
  218. chia/consensus/block_creation.py +42 -76
  219. chia/consensus/block_header_validation.py +32 -26
  220. chia/consensus/block_record.py +0 -3
  221. chia/consensus/blockchain.py +23 -32
  222. chia/consensus/blockchain_interface.py +1 -5
  223. chia/consensus/check_time_locks.py +57 -0
  224. chia/consensus/coin_store_protocol.py +151 -0
  225. chia/consensus/coinbase.py +0 -6
  226. chia/consensus/condition_costs.py +4 -0
  227. chia/{util → consensus}/condition_tools.py +4 -5
  228. chia/consensus/cost_calculator.py +1 -1
  229. chia/consensus/default_constants.py +32 -9
  230. chia/consensus/deficit.py +1 -3
  231. chia/consensus/difficulty_adjustment.py +1 -2
  232. chia/consensus/find_fork_point.py +1 -3
  233. chia/consensus/full_block_to_block_record.py +1 -6
  234. chia/{util → consensus}/generator_tools.py +1 -3
  235. chia/consensus/get_block_challenge.py +30 -7
  236. chia/consensus/make_sub_epoch_summary.py +1 -5
  237. chia/consensus/multiprocess_validation.py +21 -20
  238. chia/consensus/pot_iterations.py +74 -13
  239. chia/{util → consensus}/prev_transaction_block.py +1 -1
  240. chia/consensus/vdf_info_computation.py +1 -3
  241. chia/daemon/keychain_proxy.py +5 -5
  242. chia/daemon/server.py +22 -5
  243. chia/data_layer/data_layer.py +92 -51
  244. chia/{rpc → data_layer}/data_layer_rpc_api.py +1 -1
  245. chia/{rpc → data_layer}/data_layer_rpc_util.py +3 -6
  246. chia/data_layer/data_layer_util.py +4 -6
  247. chia/data_layer/data_layer_wallet.py +42 -69
  248. chia/data_layer/dl_wallet_store.py +12 -6
  249. chia/data_layer/download_data.py +3 -3
  250. chia/data_layer/s3_plugin_service.py +0 -1
  251. chia/farmer/farmer.py +3 -4
  252. chia/farmer/farmer_api.py +11 -7
  253. chia/{rpc → farmer}/farmer_rpc_client.py +1 -1
  254. chia/full_node/block_height_map.py +7 -6
  255. chia/full_node/block_store.py +5 -7
  256. chia/full_node/bundle_tools.py +1 -2
  257. chia/full_node/coin_store.py +143 -124
  258. chia/{types → full_node}/eligible_coin_spends.py +39 -70
  259. chia/full_node/fee_estimator.py +1 -1
  260. chia/full_node/fee_estimator_interface.py +0 -8
  261. chia/full_node/fee_tracker.py +25 -25
  262. chia/full_node/full_node.py +70 -53
  263. chia/full_node/full_node_api.py +57 -40
  264. chia/{rpc → full_node}/full_node_rpc_api.py +87 -8
  265. chia/{rpc → full_node}/full_node_rpc_client.py +7 -6
  266. chia/full_node/full_node_store.py +23 -8
  267. chia/full_node/mempool.py +206 -53
  268. chia/full_node/mempool_check_conditions.py +20 -63
  269. chia/full_node/mempool_manager.py +26 -40
  270. chia/full_node/subscriptions.py +1 -3
  271. chia/full_node/tx_processing_queue.py +50 -3
  272. chia/full_node/weight_proof.py +46 -37
  273. chia/harvester/harvester.py +1 -1
  274. chia/harvester/harvester_api.py +22 -7
  275. chia/introducer/introducer.py +1 -1
  276. chia/introducer/introducer_api.py +1 -1
  277. chia/plot_sync/exceptions.py +1 -1
  278. chia/plot_sync/receiver.py +1 -1
  279. chia/plot_sync/sender.py +2 -2
  280. chia/pools/pool_puzzles.py +13 -18
  281. chia/pools/pool_wallet.py +23 -46
  282. chia/protocols/farmer_protocol.py +11 -3
  283. chia/protocols/full_node_protocol.py +1 -4
  284. chia/protocols/harvester_protocol.py +3 -3
  285. chia/protocols/pool_protocol.py +1 -2
  286. chia/protocols/shared_protocol.py +3 -3
  287. chia/protocols/timelord_protocol.py +1 -3
  288. chia/protocols/wallet_protocol.py +3 -3
  289. chia/rpc/rpc_client.py +7 -8
  290. chia/rpc/rpc_server.py +3 -3
  291. chia/rpc/util.py +3 -1
  292. chia/seeder/crawler.py +1 -1
  293. chia/seeder/crawler_api.py +1 -1
  294. chia/seeder/dns_server.py +2 -0
  295. chia/seeder/start_crawler.py +3 -3
  296. chia/server/address_manager.py +286 -38
  297. chia/server/address_manager_store.py +0 -215
  298. chia/{types → server}/aliases.py +7 -7
  299. chia/server/api_protocol.py +1 -1
  300. chia/server/chia_policy.py +1 -1
  301. chia/server/node_discovery.py +76 -113
  302. chia/server/rate_limits.py +1 -1
  303. chia/server/resolve_peer_info.py +43 -0
  304. chia/server/server.py +5 -5
  305. chia/server/start_data_layer.py +4 -4
  306. chia/server/start_farmer.py +5 -4
  307. chia/server/start_full_node.py +5 -4
  308. chia/server/start_harvester.py +7 -5
  309. chia/server/start_introducer.py +2 -2
  310. chia/server/start_service.py +1 -1
  311. chia/server/start_timelord.py +7 -5
  312. chia/server/start_wallet.py +7 -5
  313. chia/server/ws_connection.py +1 -1
  314. chia/simulator/add_blocks_in_batches.py +2 -2
  315. chia/simulator/block_tools.py +245 -201
  316. chia/simulator/full_node_simulator.py +38 -10
  317. chia/simulator/setup_services.py +12 -12
  318. chia/simulator/simulator_full_node_rpc_api.py +2 -2
  319. chia/simulator/simulator_full_node_rpc_client.py +2 -2
  320. chia/simulator/simulator_test_tools.py +2 -2
  321. chia/simulator/start_simulator.py +1 -1
  322. chia/simulator/wallet_tools.py +10 -18
  323. chia/ssl/create_ssl.py +1 -1
  324. chia/timelord/iters_from_block.py +14 -14
  325. chia/timelord/timelord.py +15 -11
  326. chia/timelord/timelord_api.py +14 -2
  327. chia/timelord/timelord_state.py +20 -14
  328. chia/types/blockchain_format/program.py +53 -10
  329. chia/types/blockchain_format/proof_of_space.py +73 -19
  330. chia/types/coin_spend.py +3 -56
  331. chia/types/generator_types.py +28 -0
  332. chia/types/internal_mempool_item.py +1 -2
  333. chia/types/mempool_item.py +12 -7
  334. chia/types/unfinished_header_block.py +1 -2
  335. chia/types/validation_state.py +1 -2
  336. chia/types/weight_proof.py +1 -3
  337. chia/util/action_scope.py +3 -3
  338. chia/util/block_cache.py +1 -2
  339. chia/util/byte_types.py +1 -1
  340. chia/util/casts.py +21 -0
  341. chia/util/config.py +0 -37
  342. chia/util/db_wrapper.py +8 -1
  343. chia/util/errors.py +3 -2
  344. chia/util/initial-config.yaml +21 -5
  345. chia/util/keychain.py +6 -7
  346. chia/util/keyring_wrapper.py +5 -5
  347. chia/util/limited_semaphore.py +1 -1
  348. chia/util/priority_mutex.py +1 -1
  349. chia/util/streamable.py +63 -5
  350. chia/util/task_timing.py +1 -1
  351. chia/util/virtual_project_analysis.py +1 -1
  352. chia/wallet/cat_wallet/cat_info.py +7 -3
  353. chia/wallet/cat_wallet/cat_outer_puzzle.py +9 -5
  354. chia/wallet/cat_wallet/cat_utils.py +1 -1
  355. chia/wallet/cat_wallet/cat_wallet.py +44 -36
  356. chia/wallet/cat_wallet/lineage_store.py +7 -0
  357. chia/wallet/cat_wallet/r_cat_wallet.py +273 -0
  358. chia/wallet/conditions.py +5 -10
  359. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -4
  360. chia/wallet/derivation_record.py +33 -0
  361. chia/wallet/derive_keys.py +3 -3
  362. chia/wallet/did_wallet/did_info.py +12 -3
  363. chia/wallet/did_wallet/did_wallet.py +132 -101
  364. chia/wallet/did_wallet/did_wallet_puzzles.py +9 -9
  365. chia/wallet/driver_protocol.py +3 -1
  366. chia/{types/spend_bundle.py → wallet/estimate_fees.py} +2 -7
  367. chia/wallet/nft_wallet/metadata_outer_puzzle.py +5 -3
  368. chia/wallet/nft_wallet/nft_puzzle_utils.py +1 -1
  369. chia/wallet/nft_wallet/nft_wallet.py +69 -112
  370. chia/wallet/nft_wallet/ownership_outer_puzzle.py +5 -3
  371. chia/wallet/nft_wallet/singleton_outer_puzzle.py +6 -4
  372. chia/wallet/nft_wallet/transfer_program_puzzle.py +4 -2
  373. chia/wallet/nft_wallet/uncurry_nft.py +4 -6
  374. chia/wallet/notification_manager.py +2 -3
  375. chia/wallet/outer_puzzles.py +7 -2
  376. chia/wallet/puzzle_drivers.py +1 -1
  377. chia/wallet/puzzles/clawback/drivers.py +5 -4
  378. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -1
  379. chia/wallet/puzzles/singleton_top_layer.py +2 -1
  380. chia/wallet/puzzles/singleton_top_layer_v1_1.py +2 -1
  381. chia/wallet/puzzles/tails.py +1 -3
  382. chia/wallet/signer_protocol.py +5 -6
  383. chia/wallet/singleton.py +5 -4
  384. chia/wallet/singleton_record.py +1 -1
  385. chia/wallet/trade_manager.py +18 -20
  386. chia/wallet/trade_record.py +3 -6
  387. chia/wallet/trading/offer.py +12 -13
  388. chia/wallet/uncurried_puzzle.py +2 -2
  389. chia/wallet/util/compute_additions.py +58 -0
  390. chia/wallet/util/compute_hints.py +3 -3
  391. chia/wallet/util/compute_memos.py +4 -4
  392. chia/wallet/util/curry_and_treehash.py +2 -1
  393. chia/wallet/util/debug_spend_bundle.py +1 -1
  394. chia/wallet/util/merkle_tree.py +1 -1
  395. chia/wallet/util/peer_request_cache.py +1 -2
  396. chia/wallet/util/tx_config.py +3 -8
  397. chia/wallet/util/wallet_sync_utils.py +10 -5
  398. chia/wallet/util/wallet_types.py +1 -0
  399. chia/wallet/vc_wallet/cr_cat_drivers.py +17 -18
  400. chia/wallet/vc_wallet/cr_cat_wallet.py +30 -28
  401. chia/wallet/vc_wallet/cr_outer_puzzle.py +5 -3
  402. chia/wallet/vc_wallet/vc_drivers.py +50 -8
  403. chia/wallet/vc_wallet/vc_store.py +3 -5
  404. chia/wallet/vc_wallet/vc_wallet.py +15 -22
  405. chia/wallet/wallet.py +36 -46
  406. chia/wallet/wallet_action_scope.py +73 -4
  407. chia/wallet/wallet_blockchain.py +1 -3
  408. chia/wallet/wallet_interested_store.py +1 -1
  409. chia/wallet/wallet_nft_store.py +3 -3
  410. chia/wallet/wallet_node.py +17 -16
  411. chia/wallet/wallet_node_api.py +4 -5
  412. chia/wallet/wallet_pool_store.py +1 -1
  413. chia/wallet/wallet_protocol.py +2 -0
  414. chia/wallet/wallet_puzzle_store.py +1 -1
  415. chia/{rpc → wallet}/wallet_request_types.py +670 -81
  416. chia/{rpc → wallet}/wallet_rpc_api.py +735 -766
  417. chia/{rpc → wallet}/wallet_rpc_client.py +268 -420
  418. chia/wallet/wallet_singleton_store.py +8 -7
  419. chia/wallet/wallet_spend_bundle.py +4 -3
  420. chia/wallet/wallet_state_manager.py +320 -191
  421. chia/wallet/wallet_weight_proof_handler.py +1 -2
  422. chia/wallet/wsm_apis.py +98 -0
  423. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/METADATA +7 -7
  424. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/RECORD +443 -436
  425. mozilla-ca/cacert.pem +3 -165
  426. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +0 -145
  427. chia/cmds/dev.py +0 -18
  428. chia/types/blockchain_format/slots.py +0 -9
  429. chia/types/blockchain_format/sub_epoch_summary.py +0 -5
  430. chia/types/end_of_slot_bundle.py +0 -5
  431. chia/types/full_block.py +0 -5
  432. chia/types/header_block.py +0 -5
  433. chia/types/spend_bundle_conditions.py +0 -7
  434. chia/types/transaction_queue_entry.py +0 -56
  435. chia/types/unfinished_block.py +0 -5
  436. /chia/cmds/{installers.py → dev/installers.py} +0 -0
  437. /chia/cmds/{sim.py → dev/sim.py} +0 -0
  438. /chia/{util → cmds}/dump_keyring.py +0 -0
  439. /chia/{full_node → consensus}/signage_point.py +0 -0
  440. /chia/{rpc → data_layer}/data_layer_rpc_client.py +0 -0
  441. /chia/{rpc → farmer}/farmer_rpc_api.py +0 -0
  442. /chia/{util → full_node}/full_block_utils.py +0 -0
  443. /chia/{rpc → harvester}/harvester_rpc_api.py +0 -0
  444. /chia/{rpc → harvester}/harvester_rpc_client.py +0 -0
  445. /chia/{full_node → protocols}/fee_estimate.py +0 -0
  446. /chia/{server → protocols}/outbound_message.py +0 -0
  447. /chia/{rpc → seeder}/crawler_rpc_api.py +0 -0
  448. /chia/{util → simulator}/vdf_prover.py +0 -0
  449. /chia/{util → ssl}/ssl_check.py +0 -0
  450. /chia/{rpc → timelord}/timelord_rpc_api.py +0 -0
  451. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/LICENSE +0 -0
  452. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/WHEEL +0 -0
  453. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/entry_points.txt +0 -0
chia/cmds/cmd_classes.py CHANGED
@@ -25,7 +25,7 @@ from chia_rs.sized_bytes import bytes32
25
25
  from typing_extensions import dataclass_transform
26
26
 
27
27
  from chia.util.byte_types import hexstr_to_bytes
28
- from chia.util.default_root import DEFAULT_ROOT_PATH
28
+ from chia.util.default_root import DEFAULT_KEYS_ROOT_PATH, DEFAULT_ROOT_PATH
29
29
  from chia.util.streamable import is_type_SpecificOptional
30
30
 
31
31
  SyncCmd = Callable[..., None]
@@ -45,11 +45,11 @@ ChiaCommand = Union[SyncChiaCommand, AsyncChiaCommand]
45
45
 
46
46
 
47
47
  def option(*param_decls: str, **kwargs: Any) -> Any:
48
- if sys.version_info < (3, 10): # versions < 3.10 don't know about kw_only and they complain about lacks of defaults
48
+ if sys.version_info >= (3, 10):
49
+ default_default = MISSING
50
+ else: # versions < 3.10 don't know about kw_only and they complain about lacks of defaults
49
51
  # Can't get coverage on this because we only test on one version
50
52
  default_default = None # pragma: no cover
51
- else:
52
- default_default = MISSING
53
53
 
54
54
  return field(
55
55
  metadata=dict(
@@ -68,6 +68,7 @@ class ChiaCliContext:
68
68
  context_dict_key: ClassVar[str] = "_chia_cli_context"
69
69
 
70
70
  root_path: pathlib.Path = DEFAULT_ROOT_PATH
71
+ keys_root_path: pathlib.Path = DEFAULT_KEYS_ROOT_PATH
71
72
  expected_prefix: Optional[str] = None
72
73
  rpc_port: Optional[int] = None
73
74
  keys_fingerprint: Optional[int] = None
@@ -269,15 +270,15 @@ def chia_command(
269
270
  def _chia_command(cls: type[ChiaCommand]) -> type[ChiaCommand]:
270
271
  # The type ignores here are largely due to the fact that the class information is not preserved after being
271
272
  # passed through the dataclass wrapper. Not sure what to do about this right now.
272
- if sys.version_info < (3, 10): # pragma: no cover
273
- # stuff below 3.10 doesn't know about kw_only
273
+ if sys.version_info >= (3, 10):
274
274
  wrapped_cls: type[ChiaCommand] = dataclass(
275
275
  frozen=True,
276
+ kw_only=True,
276
277
  )(cls)
277
- else:
278
+ else: # pragma: no cover
279
+ # stuff below 3.10 doesn't know about kw_only
278
280
  wrapped_cls: type[ChiaCommand] = dataclass(
279
281
  frozen=True,
280
- kw_only=True,
281
282
  )(cls)
282
283
 
283
284
  metadata = Metadata(
@@ -315,9 +316,9 @@ def get_chia_command_metadata(cls: type[ChiaCommand]) -> Metadata:
315
316
 
316
317
  @dataclass_transform(frozen_default=True)
317
318
  def command_helper(cls: type[Any]) -> type[Any]:
318
- if sys.version_info < (3, 10): # stuff below 3.10 doesn't support kw_only
319
- new_cls = dataclass(frozen=True)(cls) # pragma: no cover
320
- else:
319
+ if sys.version_info >= (3, 10):
321
320
  new_cls = dataclass(frozen=True, kw_only=True)(cls)
321
+ else: # stuff below 3.10 doesn't support kw_only
322
+ new_cls = dataclass(frozen=True)(cls) # pragma: no cover
322
323
  setattr(new_cls, COMMAND_HELPER_ATTRIBUTE_NAME, True)
323
324
  return new_cls
chia/cmds/cmd_helpers.py CHANGED
@@ -13,10 +13,10 @@ from chia_rs.sized_ints import uint64
13
13
  from chia.cmds.cmd_classes import ChiaCliContext, command_helper, option
14
14
  from chia.cmds.cmds_util import CMDCoinSelectionConfigLoader, CMDTXConfigLoader, TransactionBundle, get_wallet_client
15
15
  from chia.cmds.param_types import AmountParamType, Bytes32ParamType, CliAmount, TransactionFeeParamType, cli_amount_none
16
- from chia.rpc.wallet_rpc_client import WalletRpcClient
17
16
  from chia.wallet.conditions import ConditionValidTimes
18
17
  from chia.wallet.transaction_record import TransactionRecord
19
18
  from chia.wallet.util.tx_config import CoinSelectionConfig, TXConfig
19
+ from chia.wallet.wallet_rpc_client import WalletRpcClient
20
20
 
21
21
 
22
22
  @dataclass(frozen=True)
chia/cmds/cmds_util.py CHANGED
@@ -17,13 +17,11 @@ from chia_rs.sized_ints import uint16, uint32, uint64
17
17
  from chia.cmds.param_types import AmountParamType, Bytes32ParamType, CliAmount, cli_amount_none
18
18
  from chia.consensus.default_constants import DEFAULT_CONSTANTS
19
19
  from chia.daemon.keychain_proxy import KeychainProxy, connect_to_keychain_and_validate
20
- from chia.rpc.data_layer_rpc_client import DataLayerRpcClient
21
- from chia.rpc.farmer_rpc_client import FarmerRpcClient
22
- from chia.rpc.full_node_rpc_client import FullNodeRpcClient
23
- from chia.rpc.harvester_rpc_client import HarvesterRpcClient
20
+ from chia.data_layer.data_layer_rpc_client import DataLayerRpcClient
21
+ from chia.farmer.farmer_rpc_client import FarmerRpcClient
22
+ from chia.full_node.full_node_rpc_client import FullNodeRpcClient
23
+ from chia.harvester.harvester_rpc_client import HarvesterRpcClient
24
24
  from chia.rpc.rpc_client import ResponseFailureError, RpcClient
25
- from chia.rpc.wallet_request_types import LogIn
26
- from chia.rpc.wallet_rpc_client import WalletRpcClient
27
25
  from chia.simulator.simulator_full_node_rpc_client import SimulatorFullNodeRpcClient
28
26
  from chia.types.mempool_submission_status import MempoolSubmissionStatus
29
27
  from chia.util.config import load_config
@@ -33,6 +31,8 @@ from chia.util.streamable import Streamable, streamable
33
31
  from chia.wallet.conditions import ConditionValidTimes
34
32
  from chia.wallet.transaction_record import TransactionRecord
35
33
  from chia.wallet.util.tx_config import CoinSelectionConfig, CoinSelectionConfigLoader, TXConfig, TXConfigLoader
34
+ from chia.wallet.wallet_request_types import LogIn
35
+ from chia.wallet.wallet_rpc_client import WalletRpcClient
36
36
 
37
37
  NODE_TYPES: dict[str, type[RpcClient]] = {
38
38
  "base": RpcClient,
@@ -141,9 +141,12 @@ async def get_any_service_client(
141
141
 
142
142
  if tb is not None:
143
143
  print(f"Traceback:\n{tb}")
144
+ except (click.ClickException, click.Abort):
145
+ # this includes CliRpcConnectionError which is a subclass of click.ClickException
146
+ # raising here allows click to do it's normal click error handling
147
+ raise
144
148
  except Exception as e: # this is only here to make the errors more user-friendly.
145
- if not consume_errors or isinstance(e, (CliRpcConnectionError, click.Abort)):
146
- # CliRpcConnectionError will be handled by click.
149
+ if not consume_errors:
147
150
  raise
148
151
  print(f"Exception from '{node_type}' {e}:\n{traceback.format_exc()}")
149
152
 
@@ -264,7 +267,7 @@ def cli_confirm(input_message: str, abort_message: str = "Did not confirm. Abort
264
267
  response = input(input_message).lower()
265
268
  if response not in {"y", "yes"}:
266
269
  print(abort_message)
267
- raise click.Abort()
270
+ raise click.Abort
268
271
 
269
272
 
270
273
  def coin_selection_args(func: Callable[..., None]) -> Callable[..., None]:
chia/cmds/coin_funcs.py CHANGED
@@ -12,13 +12,13 @@ from chia.cmds.cmd_helpers import WalletClientInfo
12
12
  from chia.cmds.cmds_util import CMDCoinSelectionConfigLoader, CMDTXConfigLoader, cli_confirm
13
13
  from chia.cmds.param_types import CliAmount
14
14
  from chia.cmds.wallet_funcs import get_mojo_per_unit, get_wallet_type, print_balance
15
- from chia.rpc.wallet_request_types import CombineCoins, SplitCoins
16
15
  from chia.types.blockchain_format.coin import Coin
17
16
  from chia.util.bech32m import encode_puzzle_hash
18
17
  from chia.util.config import selected_network_address_prefix
19
18
  from chia.wallet.conditions import ConditionValidTimes
20
19
  from chia.wallet.transaction_record import TransactionRecord
21
20
  from chia.wallet.util.wallet_types import WalletType
21
+ from chia.wallet.wallet_request_types import CombineCoins, SplitCoins
22
22
 
23
23
 
24
24
  async def async_list(
@@ -92,7 +92,7 @@ def print_coins(
92
92
  return
93
93
  num_per_screen = 5 if paginate else len(coins)
94
94
  for i in range(0, len(coins), num_per_screen):
95
- for j in range(0, num_per_screen):
95
+ for j in range(num_per_screen):
96
96
  if i + j >= len(coins):
97
97
  break
98
98
  coin, conf_height = coins[i + j]
chia/cmds/configure.py CHANGED
@@ -7,13 +7,13 @@ import click
7
7
  import yaml
8
8
 
9
9
  from chia.cmds.cmd_classes import ChiaCliContext
10
- from chia.server.outbound_message import NodeType
10
+ from chia.protocols.outbound_message import NodeType
11
+ from chia.server.resolve_peer_info import set_peer_info
11
12
  from chia.util.config import (
12
13
  initial_config_file,
13
14
  load_defaults_for_missing_services,
14
15
  lock_and_load_config,
15
16
  save_config,
16
- set_peer_info,
17
17
  str2bool,
18
18
  )
19
19
 
chia/cmds/data.py CHANGED
@@ -13,8 +13,6 @@ from chia_rs.sized_ints import uint64
13
13
  from chia.cmds import options
14
14
  from chia.cmds.param_types import Bytes32ParamType
15
15
 
16
- _T = TypeVar("_T")
17
-
18
16
  FC = TypeVar("FC", bound=Union[Callable[..., Any], click.Command])
19
17
 
20
18
  logger = logging.getLogger(__name__)
chia/cmds/data_funcs.py CHANGED
@@ -10,7 +10,7 @@ from chia_rs.sized_bytes import bytes32
10
10
  from chia_rs.sized_ints import uint64
11
11
 
12
12
  from chia.cmds.cmds_util import get_any_service_client
13
- from chia.rpc.data_layer_rpc_client import DataLayerRpcClient
13
+ from chia.data_layer.data_layer_rpc_client import DataLayerRpcClient
14
14
  from chia.util.byte_types import hexstr_to_bytes
15
15
  from chia.util.default_root import resolve_root_path
16
16
 
@@ -3,12 +3,11 @@ from __future__ import annotations
3
3
  from pathlib import Path
4
4
  from typing import Any, Optional
5
5
 
6
+ from chia_rs import BlockRecord, FullBlock
6
7
  from chia_rs.sized_bytes import bytes32
7
8
 
8
- from chia.consensus.block_record import BlockRecord
9
9
  from chia.consensus.constants import replace_str_to_bytes
10
10
  from chia.consensus.default_constants import DEFAULT_CONSTANTS
11
- from chia.types.full_block import FullBlock
12
11
  from chia.util.config import load_config
13
12
  from chia.util.path import path_from_root
14
13
 
File without changes
chia/cmds/dev/data.py ADDED
@@ -0,0 +1,273 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import contextlib
5
+ import dataclasses
6
+ import datetime
7
+ import logging
8
+ import os
9
+ import sysconfig
10
+ import tempfile
11
+ import time
12
+ from dataclasses import field
13
+ from pathlib import Path
14
+ from typing import Any, Optional
15
+
16
+ import aiohttp
17
+ import anyio
18
+ import click
19
+ from chia_rs.sized_bytes import bytes32
20
+ from chia_rs.sized_ints import uint32
21
+
22
+ from chia.cmds.cmd_classes import ChiaCliContext, chia_command, option
23
+ from chia.cmds.cmd_helpers import NeedsWalletRPC
24
+ from chia.data_layer.data_layer import server_files_path_from_config
25
+ from chia.data_layer.data_layer_util import ServerInfo, Status, Subscription
26
+ from chia.data_layer.data_store import DataStore
27
+ from chia.data_layer.download_data import insert_from_delta_file
28
+ from chia.util.chia_logging import initialize_logging
29
+ from chia.util.config import load_config
30
+ from chia.util.task_referencer import create_referenced_task
31
+ from chia.wallet.wallet_request_types import DLHistory, DLTrackNew
32
+
33
+
34
+ class NonZeroReturnCodeError(Exception):
35
+ def __init__(self, returncode: int):
36
+ super().__init__(f"Process returned non-zero exit code: {returncode}")
37
+ self.returncode = returncode
38
+
39
+
40
+ @dataclasses.dataclass
41
+ class RunResult:
42
+ process: asyncio.subprocess.Process
43
+ stdout: Optional[str]
44
+ stderr: Optional[str]
45
+
46
+
47
+ @click.group("data", help="For working with DataLayer")
48
+ def data_group() -> None:
49
+ pass
50
+
51
+
52
+ def print_date(*args: Any, **kwargs: Any) -> None:
53
+ kwargs.setdefault("flush", True)
54
+ s = datetime.datetime.now(datetime.timezone.utc).isoformat(timespec="seconds")
55
+ print(f"{s}:", *args, **kwargs)
56
+
57
+
58
+ def humanize_bytes(size: int) -> str:
59
+ return f"{size / 2**20:.1f} MB"
60
+
61
+
62
+ @chia_command(
63
+ group=data_group,
64
+ name="sync-time",
65
+ short_help="test time to sync a provided store id",
66
+ help="""
67
+ An empty temporary database is created and then the specified store is synced to it.
68
+ If local delta files are available in the specified directory then they will be used.
69
+ This allows both testing of total time including downloading as well as just the insert time.
70
+ The DataLayer work is done within the test process.
71
+ Separate daemon and wallet service processes are started and stopped.""",
72
+ )
73
+ class SyncTimeCommand:
74
+ wallet_rpc_info: NeedsWalletRPC
75
+ context: ChiaCliContext = field(default_factory=ChiaCliContext)
76
+ generation_limit: int = option("--generation-limit", required=True)
77
+ store_id: bytes32 = option("--store-id", required=True)
78
+ profile_tasks: bool = option("--profile-tasks/--no-profile-tasks")
79
+ restart_all: bool = option("--restart-all/--no-restart-all")
80
+ working_path: Optional[Path] = option("--working-path", default=None)
81
+
82
+ async def run(self) -> None:
83
+ config = load_config(self.context.root_path, "config.yaml", "data_layer", fill_missing_services=True)
84
+ initialize_logging(
85
+ service_name="data_layer_testing",
86
+ logging_config=config["logging"],
87
+ root_path=self.context.root_path,
88
+ )
89
+
90
+ if self.restart_all:
91
+ await self.run_chia("stop", "-d", "all", check=False)
92
+
93
+ await self.run_chia("start", "wallet")
94
+ await self.run_chia("keys", "generate", "--label", "for_testing")
95
+ await self.wait_for_wallet_synced()
96
+ await self.run_chia("wallet", "show")
97
+
98
+ try:
99
+ async with contextlib.AsyncExitStack() as exit_stack:
100
+ working_path: Path
101
+ if self.working_path is None:
102
+ working_path = Path(exit_stack.enter_context(tempfile.TemporaryDirectory()))
103
+ else:
104
+ working_path = self.working_path
105
+ working_path.mkdir(parents=True, exist_ok=True)
106
+
107
+ database_path = working_path.joinpath("datalayer.sqlite")
108
+ print_date(f"working with database at: {database_path}")
109
+
110
+ wallet_client_info = await exit_stack.enter_async_context(self.wallet_rpc_info.wallet_rpc())
111
+ wallet_rpc = wallet_client_info.client
112
+ await wallet_rpc.dl_track_new(DLTrackNew(launcher_id=self.store_id))
113
+
114
+ data_store = await exit_stack.enter_async_context(DataStore.managed(database=database_path))
115
+
116
+ await data_store.subscribe(subscription=Subscription(store_id=self.store_id, servers_info=[]))
117
+
118
+ await self.wait_for_wallet_synced()
119
+ await self.run_chia("wallet", "show")
120
+
121
+ print_date("subscribed")
122
+
123
+ to_download = (
124
+ await wallet_rpc.dl_history(
125
+ DLHistory(
126
+ launcher_id=self.store_id,
127
+ min_generation=uint32(1),
128
+ max_generation=uint32(self.generation_limit + 1),
129
+ )
130
+ )
131
+ ).history
132
+
133
+ print_date(
134
+ f"found generations to download: {to_download[-1].generation} -> {to_download[0].generation}"
135
+ )
136
+
137
+ root_hashes = [record.root for record in reversed(to_download)]
138
+
139
+ files_path = server_files_path_from_config(config=config, root_path=self.context.root_path)
140
+
141
+ clock = time.monotonic
142
+ start = clock()
143
+
144
+ last_generation = -1
145
+ clock = time.monotonic
146
+ last_time = clock()
147
+ all_times: dict[int, float] = {}
148
+
149
+ print_date(f"using local files at: {files_path}")
150
+
151
+ await data_store.create_tree(store_id=self.store_id, status=Status.COMMITTED)
152
+
153
+ task = create_referenced_task(
154
+ insert_from_delta_file(
155
+ data_store=data_store,
156
+ store_id=self.store_id,
157
+ existing_generation=0,
158
+ target_generation=self.generation_limit,
159
+ root_hashes=root_hashes,
160
+ server_info=ServerInfo(url="", num_consecutive_failures=0, ignore_till=0),
161
+ client_foldername=files_path,
162
+ timeout=aiohttp.ClientTimeout(),
163
+ log=logging.getLogger(__name__),
164
+ proxy_url=None,
165
+ downloader=None,
166
+ maximum_full_file_count=0,
167
+ )
168
+ )
169
+ try:
170
+ while not task.done():
171
+ try:
172
+ generation = await data_store.get_tree_generation(store_id=self.store_id)
173
+ except Exception as e:
174
+ if "No generations found" not in str(e):
175
+ raise
176
+ else:
177
+ if generation != last_generation:
178
+ delta_generation = generation - last_generation
179
+ now = clock()
180
+ delta_time = now - last_time
181
+ per_generation = delta_time / delta_generation
182
+
183
+ duration_so_far = round((now - start) / 60)
184
+
185
+ print_date(
186
+ f"synced: {last_generation} -> {generation} at {per_generation:.1f}s / gen"
187
+ + f" ({humanize_bytes(database_path.stat().st_size)}, {duration_so_far}m)",
188
+ flush=True,
189
+ )
190
+
191
+ for i in range(generation, last_generation, -1):
192
+ all_times[i] = per_generation
193
+
194
+ last_generation = generation
195
+ last_time = now
196
+ await asyncio.sleep(1)
197
+ finally:
198
+ try:
199
+ with anyio.CancelScope(shield=True):
200
+ if task.done():
201
+ await task
202
+ else:
203
+ task.cancel()
204
+ with contextlib.suppress(asyncio.CancelledError):
205
+ await task
206
+ finally:
207
+ end = clock()
208
+ total = round(end - start)
209
+ remainder, seconds = divmod(total, 60)
210
+ remainder, minutes = divmod(remainder, 60)
211
+ days, hours = divmod(remainder, 24)
212
+ # TODO: report better on failure
213
+ print_date("DataLayer sync timing test results:")
214
+ print(f" store id: {self.store_id}")
215
+ print(f" reached: {generation}")
216
+ print(f" db size: {humanize_bytes(database_path.stat().st_size)}")
217
+ print(f" duration: {days}d {hours}h {minutes}m {seconds}s")
218
+ print(f" {total}s")
219
+ if len(all_times) > 0:
220
+ generation, duration = max(all_times.items(), key=lambda item: item[1])
221
+ print(f" max: {generation} @ {duration:.1f}s")
222
+ finally:
223
+ with anyio.CancelScope(shield=True):
224
+ print_date("stopping services")
225
+ await self.run_chia("stop", "-d", "all", check=False)
226
+
227
+ async def wait_for_wallet_synced(self) -> None:
228
+ print_date("waiting for wallet to sync")
229
+ while True:
230
+ run_result = await self.run_chia(
231
+ "wallet",
232
+ "show",
233
+ stdout=asyncio.subprocess.PIPE,
234
+ )
235
+ assert run_result.stdout is not None, "must not be none due to piping it in the exec call"
236
+ if "Sync status: Synced" not in run_result.stdout:
237
+ await asyncio.sleep(1)
238
+ continue
239
+
240
+ print_date("wallet synced")
241
+ break
242
+
243
+ async def run_chia(self, *args: str, check: bool = True, **kwargs: Any) -> RunResult:
244
+ env = os.environ.copy()
245
+ venv_path = Path(sysconfig.get_path("scripts"))
246
+ env["PATH"] = os.pathsep.join([os.fspath(venv_path), env["PATH"]])
247
+ env["CHIA_DATA_LAYER_STOP_AFTER_GENERATION"] = str(self.generation_limit)
248
+ env["CHIA_ROOT"] = os.fspath(self.context.root_path)
249
+ env["CHIA_KEYS_ROOT"] = os.fspath(self.context.keys_root_path)
250
+
251
+ process = await asyncio.create_subprocess_exec(
252
+ # sys.executable,
253
+ # "-m",
254
+ "chia",
255
+ *args,
256
+ **kwargs,
257
+ env=env,
258
+ )
259
+ stdout_bytes, stderr_bytes = await process.communicate()
260
+ if stdout_bytes is None:
261
+ stdout = None
262
+ else:
263
+ stdout = stdout_bytes.decode("utf-8")
264
+ if stderr_bytes is None:
265
+ stderr = None
266
+ else:
267
+ stderr = stderr_bytes.decode("utf-8")
268
+ if check:
269
+ assert process.returncode is not None, "must not be none due to .communicate() called above"
270
+ if process.returncode != 0:
271
+ raise NonZeroReturnCodeError(process.returncode)
272
+
273
+ return RunResult(process=process, stdout=stdout, stderr=stderr)
@@ -8,7 +8,7 @@ import uuid
8
8
  import webbrowser
9
9
  from collections.abc import Sequence
10
10
  from pathlib import Path
11
- from typing import Callable, ClassVar, Literal, Optional, Union, overload
11
+ from typing import Callable, ClassVar, Literal, Optional, overload
12
12
 
13
13
  import anyio
14
14
  import click
@@ -21,9 +21,9 @@ class UnexpectedFormError(Exception):
21
21
  pass
22
22
 
23
23
 
24
- Oses = Union[Literal["linux"], Literal["macos-arm"], Literal["macos-intel"], Literal["windows"]]
25
- Method = Union[Literal["GET"], Literal["POST"]]
26
- Per = Union[Literal["directory"], Literal["file"]]
24
+ Oses = Literal["linux", "macos-arm", "macos-intel", "windows"]
25
+ Method = Literal["GET", "POST"]
26
+ Per = Literal["directory", "file"]
27
27
 
28
28
  all_oses: Sequence[Oses] = ("linux", "macos-arm", "macos-intel", "windows")
29
29
 
@@ -110,7 +110,7 @@ def gh_group() -> None:
110
110
  )
111
111
  class TestCMD:
112
112
  workflow_id: ClassVar[str] = "test.yml"
113
- owner: str = option("-o", "--owner", help="Owner of the repo", type=str, default="Chia-Network")
113
+ owner: str = option("-w", "--owner", help="Owner of the repo", type=str, default="Chia-Network")
114
114
  repository: str = option("-r", "--repository", help="Repository name", type=str, default="chia-blockchain")
115
115
  ref: Optional[str] = option(
116
116
  "-f",
chia/cmds/dev/main.py ADDED
@@ -0,0 +1,22 @@
1
+ from __future__ import annotations
2
+
3
+ import click
4
+
5
+ from chia.cmds.dev.data import data_group
6
+ from chia.cmds.dev.gh import gh_group
7
+ from chia.cmds.dev.installers import installers_group
8
+ from chia.cmds.dev.mempool import mempool_cmd
9
+ from chia.cmds.dev.sim import sim_cmd
10
+
11
+
12
+ @click.group("dev", help="Developer commands and tools")
13
+ @click.pass_context
14
+ def dev_cmd(ctx: click.Context) -> None:
15
+ pass
16
+
17
+
18
+ dev_cmd.add_command(sim_cmd)
19
+ dev_cmd.add_command(installers_group)
20
+ dev_cmd.add_command(gh_group)
21
+ dev_cmd.add_command(mempool_cmd)
22
+ dev_cmd.add_command(data_group)
@@ -0,0 +1,78 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ from typing import Optional
5
+
6
+ import click
7
+
8
+ from chia.cmds.cmd_classes import ChiaCliContext
9
+ from chia.cmds.dev.mempool_funcs import create_block_async, export_mempool_async, import_mempool_async
10
+
11
+
12
+ @click.group("mempool", help="Debug the mempool")
13
+ @click.pass_context
14
+ def mempool_cmd(ctx: click.Context) -> None:
15
+ pass
16
+
17
+
18
+ @click.command("import", help="Import mempool items from a JSON file", no_args_is_help=True)
19
+ @click.option(
20
+ "-p",
21
+ "--rpc-port",
22
+ help=(
23
+ "Set the port where the Full Node is hosting the RPC interface. See the rpc_port under full_node in config.yaml"
24
+ ),
25
+ type=int,
26
+ default=None,
27
+ )
28
+ @click.argument("path", type=str)
29
+ @click.pass_context
30
+ def import_mempool_cmd(ctx: click.Context, rpc_port: Optional[int], path: str) -> None:
31
+ import asyncio
32
+
33
+ with open(path) as file:
34
+ source = file.read()
35
+
36
+ content = json.loads(source)
37
+
38
+ asyncio.run(import_mempool_async(rpc_port, ChiaCliContext.set_default(ctx).root_path, content))
39
+
40
+
41
+ @click.command("export", help="Export mempool items to a JSON file", no_args_is_help=True)
42
+ @click.option(
43
+ "-p",
44
+ "--rpc-port",
45
+ help=(
46
+ "Set the port where the Full Node is hosting the RPC interface. See the rpc_port under full_node in config.yaml"
47
+ ),
48
+ type=int,
49
+ default=None,
50
+ )
51
+ @click.argument("path", type=str)
52
+ @click.pass_context
53
+ def export_mempool_cmd(ctx: click.Context, rpc_port: Optional[int], path: str) -> None:
54
+ import asyncio
55
+
56
+ asyncio.run(export_mempool_async(rpc_port, ChiaCliContext.set_default(ctx).root_path, path))
57
+
58
+
59
+ @click.command("create_block", help="Create a block bundle from the mempool, as if you farmed it")
60
+ @click.option(
61
+ "-p",
62
+ "--rpc-port",
63
+ help=(
64
+ "Set the port where the Full Node is hosting the RPC interface. See the rpc_port under full_node in config.yaml"
65
+ ),
66
+ type=int,
67
+ default=None,
68
+ )
69
+ @click.pass_context
70
+ def create_block_cmd(ctx: click.Context, rpc_port: Optional[int]) -> None:
71
+ import asyncio
72
+
73
+ asyncio.run(create_block_async(rpc_port, ChiaCliContext.set_default(ctx).root_path))
74
+
75
+
76
+ mempool_cmd.add_command(import_mempool_cmd)
77
+ mempool_cmd.add_command(export_mempool_cmd)
78
+ mempool_cmd.add_command(create_block_cmd)
@@ -0,0 +1,63 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import time
5
+ from pathlib import Path
6
+ from typing import Any, Optional
7
+
8
+ from chia_rs import SpendBundle
9
+
10
+ from chia.full_node.full_node_rpc_client import FullNodeRpcClient
11
+
12
+
13
+ async def import_mempool_async(
14
+ rpc_port: Optional[int],
15
+ root_path: Path,
16
+ content: dict[str, Any],
17
+ ) -> None:
18
+ from chia.cmds.cmds_util import get_any_service_client
19
+
20
+ async with get_any_service_client(FullNodeRpcClient, root_path, rpc_port) as (node_client, _):
21
+ success = 0
22
+ failed = 0
23
+
24
+ for item in content["mempool_items"].values():
25
+ try:
26
+ await node_client.push_tx(SpendBundle.from_json_dict(item["spend_bundle"]))
27
+ success += 1
28
+ except Exception:
29
+ failed += 1
30
+
31
+ print(f"Successfully imported {success} mempool items, but failed to import {failed}")
32
+
33
+
34
+ async def export_mempool_async(
35
+ rpc_port: Optional[int],
36
+ root_path: Path,
37
+ path: str,
38
+ ) -> None:
39
+ from chia.cmds.cmds_util import get_any_service_client
40
+
41
+ async with get_any_service_client(FullNodeRpcClient, root_path, rpc_port) as (node_client, _):
42
+ items = await node_client.get_all_mempool_items()
43
+ content = {"mempool_items": {tx_id.hex(): item for tx_id, item in items.items()}}
44
+
45
+ with open(path, "w") as f:
46
+ json.dump(content, f)
47
+
48
+ print(f"Successfully exported {len(content['mempool_items'])} mempool items to {path}")
49
+
50
+
51
+ async def create_block_async(
52
+ rpc_port: Optional[int],
53
+ root_path: Path,
54
+ ) -> None:
55
+ from chia.cmds.cmds_util import get_any_service_client
56
+
57
+ async with get_any_service_client(FullNodeRpcClient, root_path, rpc_port) as (node_client, _):
58
+ start = time.monotonic()
59
+ block = await node_client.create_block_generator()
60
+ end = time.monotonic()
61
+ assert block is not None
62
+ gen = block["generator"]
63
+ print(f"Successfully created block generator in {end - start} seconds of {len(gen)} bytes")