chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
@@ -1,11 +1,12 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
- from typing import List
5
4
 
6
5
  import pytest
7
6
 
8
7
  from chia._tests.conftest import node_with_params
8
+ from chia._tests.util.time_out_assert import time_out_assert
9
+ from chia.protocols.full_node_protocol import RejectBlock, RejectBlocks, RespondBlock, RespondBlocks
9
10
  from chia.protocols.protocol_message_types import ProtocolMessageTypes
10
11
  from chia.protocols.shared_protocol import Capability
11
12
  from chia.server.outbound_message import make_msg
@@ -14,12 +15,14 @@ from chia.server.rate_limit_numbers import rate_limits as rl_numbers
14
15
  from chia.server.rate_limits import RateLimiter
15
16
  from chia.server.server import ChiaServer
16
17
  from chia.server.ws_connection import WSChiaConnection
18
+ from chia.simulator.block_tools import BlockTools
17
19
  from chia.types.peer_info import PeerInfo
20
+ from chia.util.ints import uint32
18
21
 
19
22
  rl_v2 = [Capability.BASE, Capability.BLOCK_HEADERS, Capability.RATE_LIMITS_V2]
20
23
  rl_v1 = [Capability.BASE]
21
24
  node_with_params_b = node_with_params
22
- test_different_versions_results: List[int] = []
25
+ test_different_versions_results: list[int] = []
23
26
 
24
27
 
25
28
  class TestRateLimits:
@@ -35,12 +38,12 @@ class TestRateLimits:
35
38
  r = RateLimiter(incoming=True)
36
39
  new_tx_message = make_msg(ProtocolMessageTypes.new_transaction, bytes([1] * 40))
37
40
  for i in range(4999):
38
- assert r.process_msg_and_check(new_tx_message, rl_v2, rl_v2)
41
+ assert r.process_msg_and_check(new_tx_message, rl_v2, rl_v2) is None
39
42
 
40
43
  saw_disconnect = False
41
44
  for i in range(4999):
42
45
  response = r.process_msg_and_check(new_tx_message, rl_v2, rl_v2)
43
- if not response:
46
+ if response is not None:
44
47
  saw_disconnect = True
45
48
  assert saw_disconnect
46
49
 
@@ -48,12 +51,12 @@ class TestRateLimits:
48
51
  r = RateLimiter(incoming=True)
49
52
  new_peak_message = make_msg(ProtocolMessageTypes.new_peak, bytes([1] * 40))
50
53
  for i in range(200):
51
- assert r.process_msg_and_check(new_peak_message, rl_v2, rl_v2)
54
+ assert r.process_msg_and_check(new_peak_message, rl_v2, rl_v2) is None
52
55
 
53
56
  saw_disconnect = False
54
57
  for i in range(200):
55
58
  response = r.process_msg_and_check(new_peak_message, rl_v2, rl_v2)
56
- if not response:
59
+ if response is not None:
57
60
  saw_disconnect = True
58
61
  assert saw_disconnect
59
62
 
@@ -64,15 +67,18 @@ class TestRateLimits:
64
67
  large_tx_message = make_msg(ProtocolMessageTypes.new_transaction, bytes([1] * 3 * 1024 * 1024))
65
68
 
66
69
  r = RateLimiter(incoming=True)
67
- assert r.process_msg_and_check(small_tx_message, rl_v2, rl_v2)
68
- assert not r.process_msg_and_check(large_tx_message, rl_v2, rl_v2)
70
+ assert r.process_msg_and_check(small_tx_message, rl_v2, rl_v2) is None
71
+ assert r.process_msg_and_check(large_tx_message, rl_v2, rl_v2) is not None
69
72
 
70
73
  small_vdf_message = make_msg(ProtocolMessageTypes.respond_signage_point, bytes([1] * 5 * 1024))
71
74
  large_vdf_message = make_msg(ProtocolMessageTypes.respond_signage_point, bytes([1] * 600 * 1024))
75
+ large_blocks_message = make_msg(ProtocolMessageTypes.respond_blocks, bytes([1] * 51 * 1024 * 1024))
72
76
  r = RateLimiter(incoming=True)
73
- assert r.process_msg_and_check(small_vdf_message, rl_v2, rl_v2)
74
- assert r.process_msg_and_check(small_vdf_message, rl_v2, rl_v2)
75
- assert not r.process_msg_and_check(large_vdf_message, rl_v2, rl_v2)
77
+ assert r.process_msg_and_check(small_vdf_message, rl_v2, rl_v2) is None
78
+ assert r.process_msg_and_check(small_vdf_message, rl_v2, rl_v2) is None
79
+ assert r.process_msg_and_check(large_vdf_message, rl_v2, rl_v2) is not None
80
+ # this limit applies even though this message type is unlimited
81
+ assert r.process_msg_and_check(large_blocks_message, rl_v2, rl_v2) is not None
76
82
 
77
83
  @pytest.mark.anyio
78
84
  async def test_too_much_data(self):
@@ -80,24 +86,24 @@ class TestRateLimits:
80
86
  r = RateLimiter(incoming=True)
81
87
  tx_message = make_msg(ProtocolMessageTypes.respond_transaction, bytes([1] * 500 * 1024))
82
88
  for i in range(40):
83
- assert r.process_msg_and_check(tx_message, rl_v2, rl_v2)
89
+ assert r.process_msg_and_check(tx_message, rl_v2, rl_v2) is None
84
90
 
85
91
  saw_disconnect = False
86
92
  for i in range(300):
87
93
  response = r.process_msg_and_check(tx_message, rl_v2, rl_v2)
88
- if not response:
94
+ if response is not None:
89
95
  saw_disconnect = True
90
96
  assert saw_disconnect
91
97
 
92
98
  r = RateLimiter(incoming=True)
93
- block_message = make_msg(ProtocolMessageTypes.respond_block, bytes([1] * 1024 * 1024))
99
+ block_message = make_msg(ProtocolMessageTypes.respond_unfinished_block, bytes([1] * 1024 * 1024))
94
100
  for i in range(10):
95
- assert r.process_msg_and_check(block_message, rl_v2, rl_v2)
101
+ assert r.process_msg_and_check(block_message, rl_v2, rl_v2) is None
96
102
 
97
103
  saw_disconnect = False
98
104
  for i in range(40):
99
105
  response = r.process_msg_and_check(block_message, rl_v2, rl_v2)
100
- if not response:
106
+ if response is not None:
101
107
  saw_disconnect = True
102
108
  assert saw_disconnect
103
109
 
@@ -110,30 +116,30 @@ class TestRateLimits:
110
116
  message_3 = make_msg(ProtocolMessageTypes.plot_sync_start, bytes([1] * 64))
111
117
 
112
118
  for i in range(500):
113
- assert r.process_msg_and_check(message_1, rl_v2, rl_v2)
119
+ assert r.process_msg_and_check(message_1, rl_v2, rl_v2) is None
114
120
 
115
121
  for i in range(500):
116
- assert r.process_msg_and_check(message_2, rl_v2, rl_v2)
122
+ assert r.process_msg_and_check(message_2, rl_v2, rl_v2) is None
117
123
 
118
124
  saw_disconnect = False
119
125
  for i in range(500):
120
126
  response = r.process_msg_and_check(message_3, rl_v2, rl_v2)
121
- if not response:
127
+ if response is not None:
122
128
  saw_disconnect = True
123
129
  assert saw_disconnect
124
130
 
125
131
  # Size limits
126
132
  r = RateLimiter(incoming=True)
127
133
  message_4 = make_msg(ProtocolMessageTypes.respond_proof_of_weight, bytes([1] * 49 * 1024 * 1024))
128
- message_5 = make_msg(ProtocolMessageTypes.respond_blocks, bytes([1] * 49 * 1024 * 1024))
134
+ message_5 = make_msg(ProtocolMessageTypes.request_blocks, bytes([1] * 49 * 1024 * 1024))
129
135
 
130
136
  for i in range(2):
131
- assert r.process_msg_and_check(message_4, rl_v2, rl_v2)
137
+ assert r.process_msg_and_check(message_4, rl_v2, rl_v2) is None
132
138
 
133
139
  saw_disconnect = False
134
140
  for i in range(2):
135
141
  response = r.process_msg_and_check(message_5, rl_v2, rl_v2)
136
- if not response:
142
+ if response is not None:
137
143
  saw_disconnect = True
138
144
  assert saw_disconnect
139
145
 
@@ -142,56 +148,56 @@ class TestRateLimits:
142
148
  r = RateLimiter(True, 5)
143
149
  tx_message = make_msg(ProtocolMessageTypes.respond_transaction, bytes([1] * 500 * 1024))
144
150
  for i in range(10):
145
- assert r.process_msg_and_check(tx_message, rl_v2, rl_v2)
151
+ assert r.process_msg_and_check(tx_message, rl_v2, rl_v2) is None
146
152
 
147
153
  saw_disconnect = False
148
154
  for i in range(300):
149
155
  response = r.process_msg_and_check(tx_message, rl_v2, rl_v2)
150
- if not response:
156
+ if response is not None:
151
157
  saw_disconnect = True
152
158
  assert saw_disconnect
153
- assert not r.process_msg_and_check(tx_message, rl_v2, rl_v2)
159
+ assert r.process_msg_and_check(tx_message, rl_v2, rl_v2) is not None
154
160
  await asyncio.sleep(6)
155
- assert r.process_msg_and_check(tx_message, rl_v2, rl_v2)
161
+ assert r.process_msg_and_check(tx_message, rl_v2, rl_v2) is None
156
162
 
157
163
  # Counts reset also
158
164
  r = RateLimiter(True, 5)
159
165
  new_tx_message = make_msg(ProtocolMessageTypes.new_transaction, bytes([1] * 40))
160
166
  for i in range(4999):
161
- assert r.process_msg_and_check(new_tx_message, rl_v2, rl_v2)
167
+ assert r.process_msg_and_check(new_tx_message, rl_v2, rl_v2) is None
162
168
 
163
169
  saw_disconnect = False
164
170
  for i in range(4999):
165
171
  response = r.process_msg_and_check(new_tx_message, rl_v2, rl_v2)
166
- if not response:
172
+ if response is not None:
167
173
  saw_disconnect = True
168
174
  assert saw_disconnect
169
175
  await asyncio.sleep(6)
170
- assert r.process_msg_and_check(new_tx_message, rl_v2, rl_v2)
176
+ assert r.process_msg_and_check(new_tx_message, rl_v2, rl_v2) is None
171
177
 
172
178
  @pytest.mark.anyio
173
179
  async def test_percentage_limits(self):
174
180
  r = RateLimiter(True, 60, 40)
175
181
  new_peak_message = make_msg(ProtocolMessageTypes.new_peak, bytes([1] * 40))
176
182
  for i in range(50):
177
- assert r.process_msg_and_check(new_peak_message, rl_v2, rl_v2)
183
+ assert r.process_msg_and_check(new_peak_message, rl_v2, rl_v2) is None
178
184
 
179
185
  saw_disconnect = False
180
186
  for i in range(50):
181
187
  response = r.process_msg_and_check(new_peak_message, rl_v2, rl_v2)
182
- if not response:
188
+ if response is not None:
183
189
  saw_disconnect = True
184
190
  assert saw_disconnect
185
191
 
186
192
  r = RateLimiter(True, 60, 40)
187
- block_message = make_msg(ProtocolMessageTypes.respond_block, bytes([1] * 1024 * 1024))
193
+ block_message = make_msg(ProtocolMessageTypes.respond_unfinished_block, bytes([1] * 1024 * 1024))
188
194
  for i in range(5):
189
- assert r.process_msg_and_check(block_message, rl_v2, rl_v2)
195
+ assert r.process_msg_and_check(block_message, rl_v2, rl_v2) is None
190
196
 
191
197
  saw_disconnect = False
192
198
  for i in range(5):
193
199
  response = r.process_msg_and_check(block_message, rl_v2, rl_v2)
194
- if not response:
200
+ if response is not None:
195
201
  saw_disconnect = True
196
202
  assert saw_disconnect
197
203
 
@@ -202,29 +208,29 @@ class TestRateLimits:
202
208
  message_3 = make_msg(ProtocolMessageTypes.plot_sync_start, bytes([1] * 32))
203
209
 
204
210
  for i in range(180):
205
- assert r.process_msg_and_check(message_1, rl_v2, rl_v2)
211
+ assert r.process_msg_and_check(message_1, rl_v2, rl_v2) is None
206
212
  for i in range(180):
207
- assert r.process_msg_and_check(message_2, rl_v2, rl_v2)
213
+ assert r.process_msg_and_check(message_2, rl_v2, rl_v2) is None
208
214
 
209
215
  saw_disconnect = False
210
216
  for i in range(100):
211
217
  response = r.process_msg_and_check(message_3, rl_v2, rl_v2)
212
- if not response:
218
+ if response is not None:
213
219
  saw_disconnect = True
214
220
  assert saw_disconnect
215
221
 
216
222
  # Aggregate percentage limit max total size
217
223
  r = RateLimiter(True, 60, 40)
218
224
  message_4 = make_msg(ProtocolMessageTypes.respond_proof_of_weight, bytes([1] * 18 * 1024 * 1024))
219
- message_5 = make_msg(ProtocolMessageTypes.respond_blocks, bytes([1] * 24 * 1024 * 1024))
225
+ message_5 = make_msg(ProtocolMessageTypes.respond_unfinished_block, bytes([1] * 24 * 1024 * 1024))
220
226
 
221
227
  for i in range(2):
222
- assert r.process_msg_and_check(message_4, rl_v2, rl_v2)
228
+ assert r.process_msg_and_check(message_4, rl_v2, rl_v2) is None
223
229
 
224
230
  saw_disconnect = False
225
231
  for i in range(2):
226
232
  response = r.process_msg_and_check(message_5, rl_v2, rl_v2)
227
- if not response:
233
+ if response is not None:
228
234
  saw_disconnect = True
229
235
  assert saw_disconnect
230
236
 
@@ -238,7 +244,7 @@ class TestRateLimits:
238
244
  passed = 0
239
245
  blocked = 0
240
246
  for i in range(non_tx_freq):
241
- if r.process_msg_and_check(new_peers_message, rl_v2, rl_v2):
247
+ if r.process_msg_and_check(new_peers_message, rl_v2, rl_v2) is None:
242
248
  passed += 1
243
249
  else:
244
250
  blocked += 1
@@ -249,7 +255,7 @@ class TestRateLimits:
249
255
  # ensure that *another* message type is not blocked because of this
250
256
 
251
257
  new_signatures_message = make_msg(ProtocolMessageTypes.respond_signatures, bytes([1]))
252
- assert r.process_msg_and_check(new_signatures_message, rl_v2, rl_v2)
258
+ assert r.process_msg_and_check(new_signatures_message, rl_v2, rl_v2) is None
253
259
 
254
260
  @pytest.mark.anyio
255
261
  async def test_too_many_incoming_messages(self):
@@ -261,7 +267,7 @@ class TestRateLimits:
261
267
  passed = 0
262
268
  blocked = 0
263
269
  for i in range(non_tx_freq):
264
- if r.process_msg_and_check(new_peers_message, rl_v2, rl_v2):
270
+ if r.process_msg_and_check(new_peers_message, rl_v2, rl_v2) is None:
265
271
  passed += 1
266
272
  else:
267
273
  blocked += 1
@@ -272,7 +278,7 @@ class TestRateLimits:
272
278
  # ensure that other message types *are* blocked because of this
273
279
 
274
280
  new_signatures_message = make_msg(ProtocolMessageTypes.respond_signatures, bytes([1]))
275
- assert not r.process_msg_and_check(new_signatures_message, rl_v2, rl_v2)
281
+ assert r.process_msg_and_check(new_signatures_message, rl_v2, rl_v2) is not None
276
282
 
277
283
  @pytest.mark.parametrize(
278
284
  "node_with_params",
@@ -368,3 +374,109 @@ class TestRateLimits:
368
374
  # Otherwise, fall back to v1
369
375
  assert ProtocolMessageTypes.request_block in rl_1["rate_limits_other"]
370
376
  assert ProtocolMessageTypes.request_block not in rl_1["rate_limits_tx"]
377
+
378
+
379
+ @pytest.mark.anyio
380
+ @pytest.mark.parametrize(
381
+ "msg_type, size",
382
+ [
383
+ (ProtocolMessageTypes.respond_blocks, 10 * 1024 * 1024),
384
+ (ProtocolMessageTypes.reject_blocks, 90),
385
+ (ProtocolMessageTypes.respond_block, 1024 * 1024),
386
+ (ProtocolMessageTypes.reject_block, 90),
387
+ ],
388
+ )
389
+ async def test_unlimited(msg_type: ProtocolMessageTypes, size: int):
390
+ r = RateLimiter(incoming=False)
391
+
392
+ message = make_msg(msg_type, bytes([1] * size))
393
+
394
+ for i in range(1000):
395
+ # since this is a backwards compatible change, it also affects V1
396
+ assert r.process_msg_and_check(message, rl_v1, rl_v1) is None
397
+
398
+
399
+ @pytest.mark.anyio
400
+ @pytest.mark.parametrize(
401
+ "msg_type",
402
+ [
403
+ ProtocolMessageTypes.respond_blocks,
404
+ ProtocolMessageTypes.reject_blocks,
405
+ ProtocolMessageTypes.respond_block,
406
+ ProtocolMessageTypes.reject_block,
407
+ ],
408
+ )
409
+ @pytest.mark.parametrize(
410
+ "node_with_params",
411
+ [
412
+ pytest.param(
413
+ dict(
414
+ disable_capabilities=[Capability.BLOCK_HEADERS, Capability.RATE_LIMITS_V2],
415
+ ),
416
+ id="V1",
417
+ ),
418
+ pytest.param(
419
+ dict(
420
+ disable_capabilities=[],
421
+ ),
422
+ id="V2",
423
+ ),
424
+ ],
425
+ indirect=True,
426
+ )
427
+ @pytest.mark.parametrize(
428
+ "node_with_params_b",
429
+ [
430
+ pytest.param(
431
+ dict(
432
+ disable_capabilities=[Capability.BLOCK_HEADERS, Capability.RATE_LIMITS_V2],
433
+ ),
434
+ id="V1",
435
+ ),
436
+ pytest.param(
437
+ dict(
438
+ disable_capabilities=[],
439
+ ),
440
+ id="V2",
441
+ ),
442
+ ],
443
+ indirect=True,
444
+ )
445
+ async def test_unsolicited_responses(
446
+ node_with_params, node_with_params_b, self_hostname: str, msg_type: ProtocolMessageTypes, bt: BlockTools
447
+ ):
448
+ node_a = node_with_params
449
+ node_b = node_with_params_b
450
+
451
+ msg = {
452
+ ProtocolMessageTypes.respond_blocks: make_msg(
453
+ ProtocolMessageTypes.respond_blocks, bytes(RespondBlocks(uint32(1), uint32(2), []))
454
+ ),
455
+ ProtocolMessageTypes.reject_blocks: make_msg(
456
+ ProtocolMessageTypes.reject_blocks, bytes(RejectBlocks(uint32(1), uint32(2)))
457
+ ),
458
+ ProtocolMessageTypes.respond_block: make_msg(
459
+ ProtocolMessageTypes.respond_block, bytes(RespondBlock(bt.get_consecutive_blocks(1)[0]))
460
+ ),
461
+ ProtocolMessageTypes.reject_block: make_msg(ProtocolMessageTypes.reject_block, bytes(RejectBlock(uint32(0)))),
462
+ }[msg_type]
463
+
464
+ full_node_server_a: ChiaServer = node_a.full_node.server
465
+ full_node_server_b: ChiaServer = node_b.full_node.server
466
+
467
+ await full_node_server_b.start_client(PeerInfo(self_hostname, full_node_server_a.get_port()), None)
468
+
469
+ assert len(full_node_server_b.get_connections()) == 1
470
+ assert len(full_node_server_a.get_connections()) == 1
471
+
472
+ a_con: WSChiaConnection = full_node_server_a.get_connections()[0]
473
+ b_con: WSChiaConnection = full_node_server_b.get_connections()[0]
474
+
475
+ assert not a_con.closed
476
+ assert not b_con.closed
477
+
478
+ await a_con.send_message(msg)
479
+
480
+ # make sure the connection is closed because of the unsolicited response
481
+ # message
482
+ await time_out_assert(5, lambda: a_con.closed)
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  from dataclasses import dataclass
5
- from typing import Callable, Tuple, cast
5
+ from typing import Callable, ClassVar, cast
6
6
 
7
7
  import pytest
8
8
  from packaging.version import Version
@@ -16,6 +16,7 @@ from chia.protocols.full_node_protocol import RejectBlock, RequestBlock, Request
16
16
  from chia.protocols.protocol_message_types import ProtocolMessageTypes
17
17
  from chia.protocols.shared_protocol import Error, protocol_version
18
18
  from chia.protocols.wallet_protocol import RejectHeaderRequest
19
+ from chia.server.api_protocol import ApiMetadata
19
20
  from chia.server.outbound_message import NodeType, make_msg
20
21
  from chia.server.server import ChiaServer
21
22
  from chia.server.start_full_node import create_full_node_service
@@ -24,7 +25,6 @@ from chia.server.ws_connection import WSChiaConnection, error_response_version
24
25
  from chia.simulator.block_tools import BlockTools
25
26
  from chia.types.blockchain_format.sized_bytes import bytes32
26
27
  from chia.types.peer_info import PeerInfo
27
- from chia.util.api_decorators import api_request
28
28
  from chia.util.errors import ApiError, Err
29
29
  from chia.util.ints import int16, uint32
30
30
 
@@ -32,19 +32,20 @@ from chia.util.ints import int16, uint32
32
32
  @dataclass
33
33
  class TestAPI:
34
34
  log: logging.Logger = logging.getLogger(__name__)
35
+ metadata: ClassVar[ApiMetadata] = ApiMetadata()
35
36
 
36
37
  def ready(self) -> bool:
37
38
  return True
38
39
 
39
40
  # API call from FullNodeAPI
40
- @api_request()
41
+ @metadata.request()
41
42
  async def request_transaction(self, request: RequestTransaction) -> None:
42
43
  raise ApiError(Err.NO_TRANSACTIONS_WHILE_SYNCING, f"Some error message: {request.transaction_id}", b"ab")
43
44
 
44
45
 
45
46
  @pytest.mark.anyio
46
47
  async def test_duplicate_client_connection(
47
- two_nodes: Tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools], self_hostname: str
48
+ two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools], self_hostname: str
48
49
  ) -> None:
49
50
  _, _, server_1, server_2, _ = two_nodes
50
51
  assert await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), None)
@@ -54,7 +55,7 @@ async def test_duplicate_client_connection(
54
55
  @pytest.mark.anyio
55
56
  @pytest.mark.parametrize("method", [repr, str])
56
57
  async def test_connection_string_conversion(
57
- two_nodes_one_block: Tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools],
58
+ two_nodes_one_block: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools],
58
59
  self_hostname: str,
59
60
  method: Callable[[object], str],
60
61
  ) -> None:
@@ -178,7 +179,7 @@ async def test_error_receive(
178
179
 
179
180
  @pytest.mark.anyio
180
181
  async def test_call_api_of_specific(
181
- two_nodes: Tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools], self_hostname: str
182
+ two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools], self_hostname: str
182
183
  ) -> None:
183
184
  _, _, server_1, server_2, _ = two_nodes
184
185
  assert await server_1.start_client(PeerInfo(self_hostname, server_2.get_port()), None)
@@ -193,7 +194,7 @@ async def test_call_api_of_specific(
193
194
 
194
195
  @pytest.mark.anyio
195
196
  async def test_call_api_of_specific_for_missing_peer(
196
- two_nodes: Tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]
197
+ two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools],
197
198
  ) -> None:
198
199
  _, _, server_1, server_2, _ = two_nodes
199
200
 
@@ -1,11 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import contextlib
4
5
  import signal
5
6
  import sys
6
7
  import time
8
+ from collections.abc import AsyncIterator
7
9
  from pathlib import Path
8
- from typing import Any, Dict
10
+ from typing import Any, Optional, cast
9
11
 
10
12
  import aiohttp.client_exceptions
11
13
  import pytest
@@ -34,16 +36,18 @@ else:
34
36
 
35
37
 
36
38
  class CreateServiceProtocol(Protocol):
39
+ @contextlib.asynccontextmanager
37
40
  async def __call__(
38
41
  self,
39
42
  self_hostname: str,
40
43
  port: uint16,
41
44
  root_path: Path,
42
- net_config: Dict[str, Any],
43
- ) -> RpcClient: ...
45
+ net_config: dict[str, Any],
46
+ ) -> AsyncIterator[RpcClient]:
47
+ yield cast(RpcClient, None) # pragma: no cover
44
48
 
45
49
 
46
- async def wait_for_daemon_connection(root_path: Path, config: Dict[str, Any], timeout: float = 15) -> DaemonProxy:
50
+ async def wait_for_daemon_connection(root_path: Path, config: dict[str, Any], timeout: float = 15) -> DaemonProxy:
47
51
  timeout = adjusted_timeout(timeout=timeout)
48
52
 
49
53
  start = time.monotonic()
@@ -82,34 +86,46 @@ async def test_daemon_terminates(signal_number: signal.Signals, chia_root: ChiaR
82
86
  @pytest.mark.parametrize(
83
87
  argnames=["create_service", "module_path", "service_config_name"],
84
88
  argvalues=[
85
- [DataLayerRpcClient.create, "chia.server.start_data_layer", "data_layer"],
86
- [FarmerRpcClient.create, "chia.server.start_farmer", "farmer"],
87
- [FullNodeRpcClient.create, "chia.server.start_full_node", "full_node"],
88
- [HarvesterRpcClient.create, "chia.server.start_harvester", "harvester"],
89
- [WalletRpcClient.create, "chia.server.start_wallet", "wallet"],
90
- # TODO: review and somehow test the other services too
91
- # [, "chia.server.start_introducer", "introducer"],
92
- # [, "chia.seeder.start_crawler", ""],
93
- # [, "chia.server.start_timelord", "timelord"],
94
- # [, "chia.timelord.timelord_launcher", ],
95
- # [, "chia.simulator.start_simulator", ],
96
- # [, "chia.data_layer.data_layer_server", "data_layer"],
89
+ [DataLayerRpcClient.create_as_context, "chia.server.start_data_layer", "data_layer"],
90
+ [FarmerRpcClient.create_as_context, "chia.server.start_farmer", "farmer"],
91
+ [FullNodeRpcClient.create_as_context, "chia.server.start_full_node", "full_node"],
92
+ [HarvesterRpcClient.create_as_context, "chia.server.start_harvester", "harvester"],
93
+ [WalletRpcClient.create_as_context, "chia.server.start_wallet", "wallet"],
94
+ [None, "chia.server.start_introducer", "introducer"],
95
+ # TODO: fails... make it not do that
96
+ # [None, "chia.seeder.start_crawler", "crawler"],
97
+ [None, "chia.server.start_timelord", "timelord"],
98
+ pytest.param(
99
+ None,
100
+ "chia.timelord.timelord_launcher",
101
+ "timelord_launcher",
102
+ marks=pytest.mark.skipif(
103
+ sys.platform in {"win32", "cygwin"},
104
+ reason="windows is not supported by the timelord launcher",
105
+ ),
106
+ ),
107
+ # TODO: fails... starts creating plots etc
108
+ # [None, "chia.simulator.start_simulator", "simulator"],
109
+ # TODO: fails... make it not do that
110
+ # [None, "chia.data_layer.data_layer_server", "data_layer"],
97
111
  ],
98
112
  )
99
113
  @pytest.mark.anyio
100
114
  async def test_services_terminate(
101
115
  signal_number: signal.Signals,
102
116
  chia_root: ChiaRoot,
103
- create_service: CreateServiceProtocol,
117
+ create_service: Optional[CreateServiceProtocol],
104
118
  module_path: str,
105
119
  service_config_name: str,
106
120
  ) -> None:
107
121
  with lock_and_load_config(root_path=chia_root.path, filename="config.yaml") as config:
108
122
  config["daemon_port"] = find_available_listen_port(name="daemon")
109
123
  service_config = config[service_config_name]
110
- if "port" in service_config:
111
- port = find_available_listen_port(name="service")
112
- service_config["port"] = port
124
+ api_port_group = service_config
125
+ if service_config_name == "timelord":
126
+ api_port_group = api_port_group["vdf_server"]
127
+ if "port" in api_port_group:
128
+ api_port_group["port"] = 0
113
129
  rpc_port = find_available_listen_port(name="rpc")
114
130
  service_config["rpc_port"] = rpc_port
115
131
  save_config(root_path=chia_root.path, filename="config.yaml", config_data=config)
@@ -125,17 +141,26 @@ async def test_services_terminate(
125
141
  daemon_client = await wait_for_daemon_connection(root_path=chia_root.path, config=config)
126
142
  await daemon_client.close()
127
143
 
128
- with closing_chia_root_popen(
129
- chia_root=chia_root,
130
- args=[sys.executable, "-m", module_path],
131
- ) as process:
132
- client = await create_service(
133
- self_hostname=config["self_hostname"],
134
- port=uint16(rpc_port),
135
- root_path=chia_root.path,
136
- net_config=config,
144
+ async with contextlib.AsyncExitStack() as exit_stack:
145
+ process = exit_stack.enter_context(
146
+ closing_chia_root_popen(
147
+ chia_root=chia_root,
148
+ args=[sys.executable, "-m", module_path],
149
+ )
137
150
  )
138
- try:
151
+
152
+ if create_service is None:
153
+ await asyncio.sleep(5)
154
+ else:
155
+ client = await exit_stack.enter_async_context(
156
+ create_service(
157
+ self_hostname=config["self_hostname"],
158
+ port=uint16(rpc_port),
159
+ root_path=chia_root.path,
160
+ net_config=config,
161
+ )
162
+ )
163
+
139
164
  start = time.monotonic()
140
165
  while time.monotonic() - start < 50:
141
166
  return_code = process.poll()
@@ -156,11 +181,8 @@ async def test_services_terminate(
156
181
  else:
157
182
  raise Exception("unable to connect")
158
183
 
159
- return_code = process.poll()
160
- assert return_code is None
184
+ return_code = process.poll()
185
+ assert return_code is None
161
186
 
162
- process.send_signal(signal_number)
163
- process.communicate(timeout=adjusted_timeout(timeout=30))
164
- finally:
165
- client.close()
166
- await client.await_closed()
187
+ process.send_signal(signal_number)
188
+ process.communicate(timeout=adjusted_timeout(timeout=30))
@@ -8,6 +8,7 @@ import ssl
8
8
  import aiohttp
9
9
  import pytest
10
10
 
11
+ from chia.apis import ApiProtocolRegistry
11
12
  from chia.protocols.shared_protocol import default_capabilities
12
13
  from chia.server.outbound_message import NodeType
13
14
  from chia.server.server import ChiaServer, ssl_context_for_client
@@ -33,10 +34,11 @@ async def establish_connection(server: ChiaServer, self_hostname: str, ssl_conte
33
34
  True,
34
35
  server.received_message_callback,
35
36
  None,
36
- bytes32(b"\x00" * 32),
37
+ bytes32.zeros,
37
38
  100,
38
39
  30,
39
40
  local_capabilities_for_handshake=default_capabilities[NodeType.FULL_NODE],
41
+ class_for_type=ApiProtocolRegistry,
40
42
  )
41
43
  await wsc.perform_handshake(server._network_id, dummy_port, NodeType.FULL_NODE)
42
44
  await wsc.close()
@@ -84,7 +86,7 @@ class TestSSL:
84
86
  full_nodes, wallets, _ = simulator_and_wallet
85
87
  full_node_api = full_nodes[0]
86
88
  server_1: ChiaServer = full_node_api.full_node.server
87
- wallet_node, server_2 = wallets[0]
89
+ _wallet_node, server_2 = wallets[0]
88
90
 
89
91
  success = await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), None)
90
92
  assert success is True
@@ -165,7 +167,7 @@ class TestSSL:
165
167
 
166
168
  @pytest.mark.anyio
167
169
  async def test_full_node(self, simulator_and_wallet, self_hostname):
168
- full_nodes, wallets, bt = simulator_and_wallet
170
+ full_nodes, _wallets, bt = simulator_and_wallet
169
171
  full_node_api = full_nodes[0]
170
172
  full_node_server = full_node_api.full_node.server
171
173
  chia_ca_crt_path, chia_ca_key_path = chia_ssl_ca_paths(bt.root_path, bt.config)