chia-blockchain 2.5.4rc2__py3-none-any.whl → 2.5.5rc2__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 +495 -265
  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 +274 -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.5rc2.dist-info}/METADATA +7 -7
  424. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.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.5rc2.dist-info}/LICENSE +0 -0
  452. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/WHEEL +0 -0
  453. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/entry_points.txt +0 -0
@@ -1,13 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import pytest
4
+ from chia_rs import FullBlock
4
5
  from chia_rs.sized_ints import uint64, uint128
5
6
 
6
7
  from chia._tests.util.misc import BenchmarkRunner, wallet_height_at_least
7
8
  from chia._tests.util.setup_nodes import OldSimulatorsAndWallets
8
9
  from chia._tests.util.time_out_assert import time_out_assert
9
10
  from chia.simulator.add_blocks_in_batches import add_blocks_in_batches
10
- from chia.types.full_block import FullBlock
11
11
  from chia.types.mempool_inclusion_status import MempoolInclusionStatus
12
12
  from chia.types.peer_info import PeerInfo
13
13
  from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
@@ -43,7 +43,8 @@ async def test_mempool_update_performance(
43
43
  fee_amount = uint64(2213)
44
44
  await time_out_assert(30, wallet_balance_at_least, True, wallet_node, send_amount + fee_amount)
45
45
 
46
- ph = await wallet.get_new_puzzlehash()
46
+ async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
47
+ ph = await action_scope.get_puzzle_hash(wallet.wallet_state_manager)
47
48
  async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False, sign=True) as action_scope:
48
49
  await wallet.generate_signed_transaction([send_amount], [ph], action_scope, fee_amount)
49
50
  [big_transaction] = action_scope.side_effects.transactions
@@ -5,7 +5,7 @@ import dataclasses
5
5
  from typing import Any, Optional
6
6
 
7
7
  import pytest
8
- from chia_rs import AugSchemeMPL, G1Element, G2Element, PrivateKey
8
+ from chia_rs import AugSchemeMPL, CoinSpend, G1Element, G2Element, PrivateKey, SpendBundle
9
9
  from chia_rs.sized_bytes import bytes32
10
10
  from chia_rs.sized_ints import uint64
11
11
  from chiabip158 import PyBIP158
@@ -23,31 +23,28 @@ from chia._tests.core.mempool.test_mempool_manager import (
23
23
  from chia._tests.util.key_tool import KeyTool
24
24
  from chia._tests.util.spend_sim import SimClient, SpendSim, sim_and_client
25
25
  from chia.consensus.default_constants import DEFAULT_CONSTANTS
26
+ from chia.full_node.eligible_coin_spends import (
27
+ SingletonFastForward,
28
+ perform_the_fast_forward,
29
+ )
26
30
  from chia.types.blockchain_format.coin import Coin
27
31
  from chia.types.blockchain_format.program import Program
28
32
  from chia.types.blockchain_format.serialized_program import SerializedProgram
29
- from chia.types.coin_spend import CoinSpend, make_spend
33
+ from chia.types.coin_spend import make_spend
30
34
  from chia.types.condition_opcodes import ConditionOpcode
31
- from chia.types.eligible_coin_spends import EligibleCoinSpends, UnspentLineageInfo, perform_the_fast_forward
32
35
  from chia.types.internal_mempool_item import InternalMempoolItem
33
36
  from chia.types.mempool_inclusion_status import MempoolInclusionStatus
34
- from chia.types.mempool_item import BundleCoinSpend
35
- from chia.types.spend_bundle import SpendBundle
37
+ from chia.types.mempool_item import BundleCoinSpend, UnspentLineageInfo
36
38
  from chia.util.errors import Err
37
39
  from chia.wallet.puzzles import p2_conditions, p2_delegated_puzzle_or_hidden_puzzle
38
40
  from chia.wallet.puzzles import singleton_top_layer_v1_1 as singleton_top_layer
39
41
 
40
42
 
41
- @pytest.mark.anyio
42
- async def test_process_fast_forward_spends_nothing_to_do() -> None:
43
+ def test_process_fast_forward_spends_nothing_to_do() -> None:
43
44
  """
44
45
  This tests the case when we don't have an eligible coin, so there is
45
46
  nothing to fast forward and the item remains unchanged
46
47
  """
47
-
48
- async def get_unspent_lineage_info_for_puzzle_hash(_: bytes32) -> Optional[UnspentLineageInfo]:
49
- assert False # pragma: no cover
50
-
51
48
  sk = AugSchemeMPL.key_gen(b"b" * 32)
52
49
  g1 = sk.get_g1()
53
50
  sig = AugSchemeMPL.sign(sk, b"foobar", g1)
@@ -58,50 +55,37 @@ async def test_process_fast_forward_spends_nothing_to_do() -> None:
58
55
  assert item.bundle_coin_spends[TEST_COIN_ID].eligible_for_fast_forward is False
59
56
  internal_mempool_item = InternalMempoolItem(sb, item.conds, item.height_added_to_mempool, item.bundle_coin_spends)
60
57
  original_version = dataclasses.replace(internal_mempool_item)
61
- eligible_coin_spends = EligibleCoinSpends()
62
- bundle_coin_spends = await eligible_coin_spends.process_fast_forward_spends(
63
- mempool_item=internal_mempool_item,
64
- get_unspent_lineage_info_for_puzzle_hash=get_unspent_lineage_info_for_puzzle_hash,
65
- height=TEST_HEIGHT,
66
- constants=DEFAULT_CONSTANTS,
58
+ singleton_ff = SingletonFastForward()
59
+ bundle_coin_spends = singleton_ff.process_fast_forward_spends(
60
+ mempool_item=internal_mempool_item, height=TEST_HEIGHT, constants=DEFAULT_CONSTANTS
67
61
  )
68
- assert eligible_coin_spends == EligibleCoinSpends()
62
+ assert singleton_ff == SingletonFastForward()
69
63
  assert bundle_coin_spends == original_version.bundle_coin_spends
70
64
 
71
65
 
72
- @pytest.mark.anyio
73
- async def test_process_fast_forward_spends_unknown_ff() -> None:
66
+ def test_process_fast_forward_spends_unknown_ff() -> None:
74
67
  """
75
68
  This tests the case when we process for the first time but we are unable
76
- to lookup the latest version from the DB
69
+ to lookup the latest version from the item's latest singleton lineage
77
70
  """
78
-
79
- async def get_unspent_lineage_info_for_puzzle_hash(puzzle_hash: bytes32) -> Optional[UnspentLineageInfo]:
80
- if puzzle_hash == IDENTITY_PUZZLE_HASH:
81
- return None
82
- assert False # pragma: no cover
83
-
84
71
  test_coin = Coin(TEST_COIN_ID, IDENTITY_PUZZLE_HASH, uint64(1))
85
72
  conditions = [[ConditionOpcode.CREATE_COIN, IDENTITY_PUZZLE_HASH, 1]]
86
73
  sb = spend_bundle_from_conditions(conditions, test_coin)
87
74
  item = mempool_item_from_spendbundle(sb)
88
75
  # The coin is eligible for fast forward
89
76
  assert item.bundle_coin_spends[test_coin.name()].eligible_for_fast_forward is True
77
+ item.bundle_coin_spends[test_coin.name()].latest_singleton_lineage = None
90
78
  internal_mempool_item = InternalMempoolItem(sb, item.conds, item.height_added_to_mempool, item.bundle_coin_spends)
91
- eligible_coin_spends = EligibleCoinSpends()
79
+ singleton_ff = SingletonFastForward()
92
80
  # We have no fast forward records yet, so we'll process this coin for the
93
- # first time here, but the DB lookup will return None
81
+ # first time here, but the item's latest singleton lineage returns None
94
82
  with pytest.raises(ValueError, match="Cannot proceed with singleton spend fast forward."):
95
- await eligible_coin_spends.process_fast_forward_spends(
96
- mempool_item=internal_mempool_item,
97
- get_unspent_lineage_info_for_puzzle_hash=get_unspent_lineage_info_for_puzzle_hash,
98
- height=TEST_HEIGHT,
99
- constants=DEFAULT_CONSTANTS,
83
+ singleton_ff.process_fast_forward_spends(
84
+ mempool_item=internal_mempool_item, height=TEST_HEIGHT, constants=DEFAULT_CONSTANTS
100
85
  )
101
86
 
102
87
 
103
- @pytest.mark.anyio
104
- async def test_process_fast_forward_spends_latest_unspent() -> None:
88
+ def test_process_fast_forward_spends_latest_unspent() -> None:
105
89
  """
106
90
  This tests the case when we are the latest singleton version already, so
107
91
  we don't need to fast forward, we just need to set the next version from
@@ -110,18 +94,9 @@ async def test_process_fast_forward_spends_latest_unspent() -> None:
110
94
  test_amount = uint64(3)
111
95
  test_coin = Coin(TEST_COIN_ID, IDENTITY_PUZZLE_HASH, test_amount)
112
96
  test_unspent_lineage_info = UnspentLineageInfo(
113
- coin_id=test_coin.name(),
114
- coin_amount=test_coin.amount,
115
- parent_id=test_coin.parent_coin_info,
116
- parent_amount=test_coin.amount,
117
- parent_parent_id=TEST_COIN_ID,
97
+ coin_id=test_coin.name(), parent_id=test_coin.parent_coin_info, parent_parent_id=TEST_COIN_ID
118
98
  )
119
99
 
120
- async def get_unspent_lineage_info_for_puzzle_hash(puzzle_hash: bytes32) -> Optional[UnspentLineageInfo]:
121
- if puzzle_hash == IDENTITY_PUZZLE_HASH:
122
- return test_unspent_lineage_info
123
- assert False # pragma: no cover
124
-
125
100
  # At this point, spends are considered *potentially* eligible for singleton
126
101
  # fast forward mainly when their amount is odd and they don't have conditions
127
102
  # that disqualify them
@@ -129,27 +104,21 @@ async def test_process_fast_forward_spends_latest_unspent() -> None:
129
104
  sb = spend_bundle_from_conditions(conditions, test_coin)
130
105
  item = mempool_item_from_spendbundle(sb)
131
106
  assert item.bundle_coin_spends[test_coin.name()].eligible_for_fast_forward is True
107
+ item.bundle_coin_spends[test_coin.name()].latest_singleton_lineage = test_unspent_lineage_info
132
108
  internal_mempool_item = InternalMempoolItem(sb, item.conds, item.height_added_to_mempool, item.bundle_coin_spends)
133
109
  original_version = dataclasses.replace(internal_mempool_item)
134
- eligible_coin_spends = EligibleCoinSpends()
135
- bundle_coin_spends = await eligible_coin_spends.process_fast_forward_spends(
136
- mempool_item=internal_mempool_item,
137
- get_unspent_lineage_info_for_puzzle_hash=get_unspent_lineage_info_for_puzzle_hash,
138
- height=TEST_HEIGHT,
139
- constants=DEFAULT_CONSTANTS,
110
+ singleton_ff = SingletonFastForward()
111
+ bundle_coin_spends = singleton_ff.process_fast_forward_spends(
112
+ mempool_item=internal_mempool_item, height=TEST_HEIGHT, constants=DEFAULT_CONSTANTS
140
113
  )
141
114
  child_coin = item.bundle_coin_spends[test_coin.name()].additions[0]
142
115
  expected_fast_forward_spends = {
143
116
  IDENTITY_PUZZLE_HASH: UnspentLineageInfo(
144
- coin_id=child_coin.name(),
145
- coin_amount=child_coin.amount,
146
- parent_id=test_coin.name(),
147
- parent_amount=test_coin.amount,
148
- parent_parent_id=test_coin.parent_coin_info,
117
+ coin_id=child_coin.name(), parent_id=test_coin.name(), parent_parent_id=test_coin.parent_coin_info
149
118
  )
150
119
  }
151
120
  # We have set the next version from our additions to chain ff spends
152
- assert eligible_coin_spends.fast_forward_spends == expected_fast_forward_spends
121
+ assert singleton_ff.fast_forward_spends == expected_fast_forward_spends
153
122
  # We didn't need to fast forward the item so it stays as is
154
123
  assert bundle_coin_spends == original_version.bundle_coin_spends
155
124
 
@@ -202,9 +171,7 @@ def test_perform_the_fast_forward() -> None:
202
171
  test_spend_data = BundleCoinSpend(test_coin_spend, False, True, [test_child_coin])
203
172
  test_unspent_lineage_info = UnspentLineageInfo(
204
173
  coin_id=latest_unspent_coin.name(),
205
- coin_amount=latest_unspent_coin.amount,
206
174
  parent_id=latest_unspent_coin.parent_coin_info,
207
- parent_amount=test_child_coin.amount,
208
175
  parent_parent_id=test_child_coin.parent_coin_info,
209
176
  )
210
177
  # Start from a fresh state of fast forward spends
@@ -227,9 +194,7 @@ def test_perform_the_fast_forward() -> None:
227
194
  # (previously latest unspent)
228
195
  expected_unspent_lineage_info = UnspentLineageInfo(
229
196
  coin_id=expected_child_coin.name(),
230
- coin_amount=expected_child_coin.amount,
231
197
  parent_id=latest_unspent_coin.name(),
232
- parent_amount=latest_unspent_coin.amount,
233
198
  parent_parent_id=latest_unspent_coin.parent_coin_info,
234
199
  )
235
200
  assert fast_forward_spends == {test_ph: expected_unspent_lineage_info}
@@ -292,16 +257,16 @@ def make_singleton_coin_spend(
292
257
  solution = singleton_top_layer.solution_for_singleton(lineage_proof, uint64(coin_to_spend.amount), inner_solution)
293
258
  if is_eve_spend:
294
259
  # Parent here is the launcher coin
295
- puzzle_reveal = SerializedProgram.from_program(
296
- singleton_top_layer.puzzle_for_singleton(parent_coin_spend.coin.name(), inner_puzzle)
297
- )
260
+ puzzle_reveal = singleton_top_layer.puzzle_for_singleton(
261
+ parent_coin_spend.coin.name(), inner_puzzle
262
+ ).to_serialized()
298
263
  else:
299
264
  puzzle_reveal = parent_coin_spend.puzzle_reveal
300
265
  return make_spend(coin_to_spend, puzzle_reveal, solution), delegated_puzzle
301
266
 
302
267
 
303
268
  async def prepare_singleton_eve(
304
- sim: SpendSim, sim_client: SimClient, is_eligible_for_ff: bool, start_amount: uint64, singleton_amount: uint64
269
+ sim: SpendSim, sim_client: SimClient, is_eligible_for_ff: bool, singleton_amount: uint64
305
270
  ) -> tuple[Program, CoinSpend, Program]:
306
271
  # Generate starting info
307
272
  key_lookup = KeyTool()
@@ -319,11 +284,11 @@ async def prepare_singleton_eve(
319
284
  starting_coin = records[0].coin
320
285
  # Launching
321
286
  conditions, launcher_coin_spend = singleton_top_layer.launch_conditions_and_coinsol(
322
- coin=starting_coin, inner_puzzle=inner_puzzle, comment=[], amount=start_amount
287
+ coin=starting_coin, inner_puzzle=inner_puzzle, comment=[], amount=singleton_amount
323
288
  )
324
289
  # Keep a remaining coin with an even amount
325
290
  conditions.append(
326
- Program.to([ConditionOpcode.CREATE_COIN, IDENTITY_PUZZLE_HASH, starting_coin.amount - start_amount - 1])
291
+ Program.to([ConditionOpcode.CREATE_COIN, IDENTITY_PUZZLE_HASH, starting_coin.amount - singleton_amount - 1])
327
292
  )
328
293
  # Create a solution for standard transaction
329
294
  delegated_puzzle = p2_conditions.puzzle_for_conditions(conditions)
@@ -351,10 +316,10 @@ async def prepare_singleton_eve(
351
316
 
352
317
 
353
318
  async def prepare_and_test_singleton(
354
- sim: SpendSim, sim_client: SimClient, is_eligible_for_ff: bool, start_amount: uint64, singleton_amount: uint64
319
+ sim: SpendSim, sim_client: SimClient, is_eligible_for_ff: bool, singleton_amount: uint64
355
320
  ) -> tuple[Coin, CoinSpend, Program, Coin]:
356
321
  inner_puzzle, eve_coin_spend, eve_signing_puzzle = await prepare_singleton_eve(
357
- sim, sim_client, is_eligible_for_ff, start_amount, singleton_amount
322
+ sim, sim_client, is_eligible_for_ff, singleton_amount
358
323
  )
359
324
  # At this point we don't have any unspent singleton
360
325
  singleton_puzzle_hash = eve_coin_spend.coin.puzzle_hash
@@ -374,11 +339,7 @@ async def prepare_and_test_singleton(
374
339
  singleton_puzzle_hash
375
340
  )
376
341
  assert unspent_lineage_info == UnspentLineageInfo(
377
- coin_id=singleton.name(),
378
- coin_amount=singleton.amount,
379
- parent_id=eve_coin.name(),
380
- parent_amount=eve_coin.amount,
381
- parent_parent_id=eve_coin.parent_coin_info,
342
+ coin_id=singleton.name(), parent_id=eve_coin.name(), parent_parent_id=eve_coin.parent_coin_info
382
343
  )
383
344
  return singleton, eve_coin_spend, inner_puzzle, remaining_coin
384
345
 
@@ -393,7 +354,7 @@ async def test_singleton_fast_forward_solo() -> None:
393
354
  SINGLETON_AMOUNT = uint64(1337)
394
355
  async with sim_and_client() as (sim, sim_client):
395
356
  singleton, eve_coin_spend, inner_puzzle, _ = await prepare_and_test_singleton(
396
- sim, sim_client, True, SINGLETON_AMOUNT, SINGLETON_AMOUNT
357
+ sim, sim_client, True, SINGLETON_AMOUNT
397
358
  )
398
359
  singleton_puzzle_hash = eve_coin_spend.coin.puzzle_hash
399
360
  inner_puzzle_hash = inner_puzzle.get_tree_hash()
@@ -410,9 +371,7 @@ async def test_singleton_fast_forward_solo() -> None:
410
371
  assert singleton_child.amount == SINGLETON_AMOUNT
411
372
  assert unspent_lineage_info == UnspentLineageInfo(
412
373
  coin_id=singleton_child.name(),
413
- coin_amount=singleton_child.amount,
414
374
  parent_id=eve_coin_spend.coin.name(),
415
- parent_amount=singleton.amount,
416
375
  parent_parent_id=eve_coin_spend.coin.parent_coin_info,
417
376
  )
418
377
 
@@ -434,12 +393,10 @@ async def test_singleton_fast_forward_different_block(is_eligible_for_ff: bool)
434
393
  get properly fast forwarded to the latest unspent (when it's eligible) or
435
394
  get correctly rejected as a double spend (when it's not eligible)
436
395
  """
437
- START_AMOUNT = uint64(1337)
438
- # We're decrementing the next iteration's amount for testing purposes
439
- SINGLETON_AMOUNT = uint64(1335)
396
+ SINGLETON_AMOUNT = uint64(1337)
440
397
  async with sim_and_client() as (sim, sim_client):
441
398
  singleton, eve_coin_spend, inner_puzzle, remaining_coin = await prepare_and_test_singleton(
442
- sim, sim_client, is_eligible_for_ff, START_AMOUNT, SINGLETON_AMOUNT
399
+ sim, sim_client, is_eligible_for_ff, SINGLETON_AMOUNT
443
400
  )
444
401
  # Let's spend this first version, to create a bigger singleton child
445
402
  singleton_puzzle_hash = eve_coin_spend.coin.puzzle_hash
@@ -456,8 +413,8 @@ async def test_singleton_fast_forward_different_block(is_eligible_for_ff: bool)
456
413
  eve_coin_spend, singleton, inner_puzzle, inner_conditions
457
414
  )
458
415
  # Spend also a remaining coin
459
- remaining_spend_solution = SerializedProgram.from_program(
460
- Program.to([[ConditionOpcode.CREATE_COIN, IDENTITY_PUZZLE_HASH, remaining_coin.amount]])
416
+ remaining_spend_solution = SerializedProgram.to(
417
+ [[ConditionOpcode.CREATE_COIN, IDENTITY_PUZZLE_HASH, remaining_coin.amount]]
461
418
  )
462
419
  remaining_coin_spend = CoinSpend(remaining_coin, IDENTITY_PUZZLE, remaining_spend_solution)
463
420
  await make_and_send_spend_bundle(
@@ -475,15 +432,11 @@ async def test_singleton_fast_forward_different_block(is_eligible_for_ff: bool)
475
432
  singleton_child, [remaining_coin] = await get_singleton_and_remaining_coins(sim)
476
433
  assert singleton_child.amount == SINGLETON_AMOUNT
477
434
  assert unspent_lineage_info == UnspentLineageInfo(
478
- coin_id=singleton_child.name(),
479
- coin_amount=singleton_child.amount,
480
- parent_id=singleton.name(),
481
- parent_amount=singleton.amount,
482
- parent_parent_id=eve_coin_spend.coin.name(),
435
+ coin_id=singleton_child.name(), parent_id=singleton.name(), parent_parent_id=eve_coin_spend.coin.name()
483
436
  )
484
437
  # Now let's spend the first version again (despite being already spent by now)
485
- remaining_spend_solution = SerializedProgram.from_program(
486
- Program.to([[ConditionOpcode.CREATE_COIN, IDENTITY_PUZZLE_HASH, remaining_coin.amount]])
438
+ remaining_spend_solution = SerializedProgram.to(
439
+ [[ConditionOpcode.CREATE_COIN, IDENTITY_PUZZLE_HASH, remaining_coin.amount]]
487
440
  )
488
441
  remaining_coin_spend = CoinSpend(remaining_coin, IDENTITY_PUZZLE, remaining_spend_solution)
489
442
  status, error = await make_and_send_spend_bundle(
@@ -506,11 +459,7 @@ async def test_singleton_fast_forward_different_block(is_eligible_for_ff: bool)
506
459
  )
507
460
  singleton_grandchild, [remaining_coin] = await get_singleton_and_remaining_coins(sim)
508
461
  assert unspent_lineage_info == UnspentLineageInfo(
509
- coin_id=singleton_grandchild.name(),
510
- coin_amount=singleton_grandchild.amount,
511
- parent_id=singleton_child.name(),
512
- parent_amount=singleton_child.amount,
513
- parent_parent_id=singleton.name(),
462
+ coin_id=singleton_grandchild.name(), parent_id=singleton_child.name(), parent_parent_id=singleton.name()
514
463
  )
515
464
  else:
516
465
  # As this singleton is not eligible for fast forward, attempting to
@@ -526,12 +475,10 @@ async def test_singleton_fast_forward_same_block() -> None:
526
475
  singleton version, all in the same block, to make sure they get properly
527
476
  fast forwarded and chained down to a latest unspent version
528
477
  """
529
- START_AMOUNT = uint64(1337)
530
- # We're decrementing the next iteration's amount for testing purposes
531
- SINGLETON_AMOUNT = uint64(1335)
478
+ SINGLETON_AMOUNT = uint64(1337)
532
479
  async with sim_and_client() as (sim, sim_client):
533
480
  singleton, eve_coin_spend, inner_puzzle, remaining_coin = await prepare_and_test_singleton(
534
- sim, sim_client, True, START_AMOUNT, SINGLETON_AMOUNT
481
+ sim, sim_client, True, SINGLETON_AMOUNT
535
482
  )
536
483
  # Let's spend this first version, to create a bigger singleton child
537
484
  singleton_puzzle_hash = eve_coin_spend.coin.puzzle_hash
@@ -547,8 +494,8 @@ async def test_singleton_fast_forward_same_block() -> None:
547
494
  # Spend also a remaining coin. Change amount to create a new coin ID.
548
495
  # The test assumes any odd amount is a singleton, so we must keep it
549
496
  # even
550
- remaining_spend_solution = SerializedProgram.from_program(
551
- Program.to([[ConditionOpcode.CREATE_COIN, IDENTITY_PUZZLE_HASH, remaining_coin.amount - 2]])
497
+ remaining_spend_solution = SerializedProgram.to(
498
+ [[ConditionOpcode.CREATE_COIN, IDENTITY_PUZZLE_HASH, remaining_coin.amount - 2]]
552
499
  )
553
500
  remaining_coin_spend = CoinSpend(remaining_coin, IDENTITY_PUZZLE, remaining_spend_solution)
554
501
  await make_and_send_spend_bundle(sim, sim_client, [remaining_coin_spend, singleton_coin_spend], aggsig=sig)
@@ -558,11 +505,7 @@ async def test_singleton_fast_forward_same_block() -> None:
558
505
  singleton_child, [remaining_coin] = await get_singleton_and_remaining_coins(sim)
559
506
  assert singleton_child.amount == SINGLETON_AMOUNT
560
507
  assert unspent_lineage_info == UnspentLineageInfo(
561
- coin_id=singleton_child.name(),
562
- coin_amount=singleton_child.amount,
563
- parent_id=singleton.name(),
564
- parent_amount=singleton.amount,
565
- parent_parent_id=eve_coin_spend.coin.name(),
508
+ coin_id=singleton_child.name(), parent_id=singleton.name(), parent_parent_id=eve_coin_spend.coin.name()
566
509
  )
567
510
  # Now let's send 3 arbitrary spends of the already spent singleton in
568
511
  # one block. They should all properly fast forward
@@ -596,14 +539,8 @@ async def test_singleton_fast_forward_same_block() -> None:
596
539
  assert unspent_lineage_info is not None
597
540
  # The unspent coin ID should reflect the latest version
598
541
  assert unspent_lineage_info.coin_id == latest_singleton.name()
599
- # The latest version should have the last random amount
600
- assert latest_singleton.amount == SINGLETON_AMOUNT
601
- # The unspent coin amount should reflect the latest version
602
- assert unspent_lineage_info.coin_amount == latest_singleton.amount
603
542
  # The unspent parent ID should reflect the latest version's parent
604
543
  assert unspent_lineage_info.parent_id == latest_singleton.parent_coin_info
605
- # The one before it should have the second last random amount
606
- assert unspent_lineage_info.parent_amount == SINGLETON_AMOUNT
607
544
 
608
545
 
609
546
  @pytest.mark.anyio
@@ -615,7 +552,7 @@ async def test_mempool_items_immutability_on_ff() -> None:
615
552
  SINGLETON_AMOUNT = uint64(1337)
616
553
  async with sim_and_client() as (sim, sim_client):
617
554
  singleton, eve_coin_spend, inner_puzzle, remaining_coin = await prepare_and_test_singleton(
618
- sim, sim_client, True, SINGLETON_AMOUNT, SINGLETON_AMOUNT
555
+ sim, sim_client, True, SINGLETON_AMOUNT
619
556
  )
620
557
  singleton_name = singleton.name()
621
558
  singleton_puzzle_hash = eve_coin_spend.coin.puzzle_hash
@@ -630,8 +567,8 @@ async def test_mempool_items_immutability_on_ff() -> None:
630
567
  singleton_coin_spend, singleton_signing_puzzle = make_singleton_coin_spend(
631
568
  eve_coin_spend, singleton, inner_puzzle, inner_conditions
632
569
  )
633
- remaining_spend_solution = SerializedProgram.from_program(
634
- Program.to([[ConditionOpcode.CREATE_COIN, IDENTITY_PUZZLE_HASH, remaining_coin.amount]])
570
+ remaining_spend_solution = SerializedProgram.to(
571
+ [[ConditionOpcode.CREATE_COIN, IDENTITY_PUZZLE_HASH, remaining_coin.amount]]
635
572
  )
636
573
  remaining_coin_spend = CoinSpend(remaining_coin, IDENTITY_PUZZLE, remaining_spend_solution)
637
574
  await make_and_send_spend_bundle(
@@ -649,16 +586,12 @@ async def test_mempool_items_immutability_on_ff() -> None:
649
586
  singleton_child_name = singleton_child.name()
650
587
  assert singleton_child.amount == SINGLETON_AMOUNT
651
588
  assert unspent_lineage_info == UnspentLineageInfo(
652
- coin_id=singleton_child_name,
653
- coin_amount=singleton_child.amount,
654
- parent_id=singleton_name,
655
- parent_amount=singleton.amount,
656
- parent_parent_id=eve_coin_spend.coin.name(),
589
+ coin_id=singleton_child_name, parent_id=singleton_name, parent_parent_id=eve_coin_spend.coin.name()
657
590
  )
658
591
  # Now let's spend the first version again (despite being already spent
659
592
  # by now) to exercise its fast forward.
660
- remaining_spend_solution = SerializedProgram.from_program(
661
- Program.to([[ConditionOpcode.CREATE_COIN, IDENTITY_PUZZLE_HASH, remaining_coin.amount]])
593
+ remaining_spend_solution = SerializedProgram.to(
594
+ [[ConditionOpcode.CREATE_COIN, IDENTITY_PUZZLE_HASH, remaining_coin.amount]]
662
595
  )
663
596
  remaining_coin_spend = CoinSpend(remaining_coin, IDENTITY_PUZZLE, remaining_spend_solution)
664
597
  sb = SpendBundle([remaining_coin_spend, singleton_coin_spend], sig)
@@ -669,9 +602,7 @@ async def test_mempool_items_immutability_on_ff() -> None:
669
602
  original_item = copy.copy(sim_client.service.mempool_manager.get_mempool_item(sb_name))
670
603
  original_filter = sim_client.service.mempool_manager.get_filter()
671
604
  # Let's trigger the fast forward by creating a mempool bundle
672
- result = await sim.mempool_manager.create_bundle_from_mempool(
673
- sim_client.service.block_records[-1].header_hash,
674
- )
605
+ result = sim.mempool_manager.create_bundle_from_mempool(sim_client.service.block_records[-1].header_hash)
675
606
  assert result is not None
676
607
  bundle, _ = result
677
608
  # Make sure the mempool bundle we created contains the result of our
@@ -694,11 +625,11 @@ async def test_double_spend_ff_spend_no_latest_unspent() -> None:
694
625
  This test covers the scenario where we receive a spend bundle with a
695
626
  singleton fast forward spend that has currently no unspent coin.
696
627
  """
697
- test_amount = uint64(1337)
628
+ singleton_amount = uint64(1337)
698
629
  async with sim_and_client() as (sim, sim_client):
699
630
  # Prepare a singleton spend
700
631
  singleton, eve_coin_spend, inner_puzzle, _ = await prepare_and_test_singleton(
701
- sim, sim_client, True, start_amount=test_amount, singleton_amount=test_amount
632
+ sim, sim_client, True, singleton_amount=singleton_amount
702
633
  )
703
634
  singleton_name = singleton.name()
704
635
  singleton_puzzle_hash = eve_coin_spend.coin.puzzle_hash
@@ -708,7 +639,7 @@ async def test_double_spend_ff_spend_no_latest_unspent() -> None:
708
639
  sig = AugSchemeMPL.sign(sk, b"foobar", g1)
709
640
  inner_conditions: list[list[Any]] = [
710
641
  [ConditionOpcode.AGG_SIG_UNSAFE, bytes(g1), b"foobar"],
711
- [ConditionOpcode.CREATE_COIN, inner_puzzle_hash, test_amount],
642
+ [ConditionOpcode.CREATE_COIN, inner_puzzle_hash, singleton_amount],
712
643
  ]
713
644
  singleton_coin_spend, _ = make_singleton_coin_spend(eve_coin_spend, singleton, inner_puzzle, inner_conditions)
714
645
  # Get its current latest unspent info
@@ -717,9 +648,7 @@ async def test_double_spend_ff_spend_no_latest_unspent() -> None:
717
648
  )
718
649
  assert unspent_lineage_info == UnspentLineageInfo(
719
650
  coin_id=singleton_name,
720
- coin_amount=test_amount,
721
651
  parent_id=eve_coin_spend.coin.name(),
722
- parent_amount=eve_coin_spend.coin.amount,
723
652
  parent_parent_id=eve_coin_spend.coin.parent_coin_info,
724
653
  )
725
654
  # Let's remove this latest unspent coin from the coin store
@@ -69,7 +69,7 @@ async def main() -> None:
69
69
  logger = create_logger(file=file)
70
70
 
71
71
  async def f() -> None:
72
- await asyncio.gather(*[tcp_echo_client(task_counter=f"{i}", logger=logger) for i in range(0, NUM_CLIENTS)])
72
+ await asyncio.gather(*[tcp_echo_client(task_counter=f"{i}", logger=logger) for i in range(NUM_CLIENTS)])
73
73
 
74
74
  task = create_referenced_task(f())
75
75
  try:
@@ -13,9 +13,9 @@ from chia_rs.sized_ints import uint8, uint16, uint64
13
13
  import chia.server.server
14
14
  from chia._tests.util.time_out_assert import time_out_assert
15
15
  from chia.protocols import full_node_protocol
16
+ from chia.protocols.outbound_message import Message, make_msg
16
17
  from chia.protocols.protocol_message_types import ProtocolMessageTypes
17
18
  from chia.protocols.shared_protocol import Capability, Handshake
18
- from chia.server.outbound_message import Message, make_msg
19
19
  from chia.server.rate_limits import RateLimiter
20
20
  from chia.server.server import ChiaServer
21
21
  from chia.server.ws_connection import WSChiaConnection
@@ -20,15 +20,15 @@ async def test_enable_private_networks(
20
20
 
21
21
  # Missing `enable_private_networks` config entry in introducer_peer should default to False for back compat
22
22
  discovery0 = FullNodeDiscovery(
23
- chia_server,
24
- 0,
25
- SIMULATOR_ROOT_PATH / Path(chia_server.config["peers_file_path"]),
26
- {"host": "introducer.chia.net", "port": 8444},
27
- [],
28
- 0,
29
- chia_server.config["selected_network"],
30
- None,
31
- Logger("node_discovery_tests"),
23
+ server=chia_server,
24
+ target_outbound_count=0,
25
+ peers_file_path=SIMULATOR_ROOT_PATH / Path(chia_server.config["peers_file_path"]),
26
+ introducer_info={"host": "introducer.chia.net", "port": 8444},
27
+ dns_servers=[],
28
+ peer_connect_interval=0,
29
+ selected_network=chia_server.config["selected_network"],
30
+ default_port=None,
31
+ log=Logger("node_discovery_tests"),
32
32
  )
33
33
  assert discovery0 is not None
34
34
  assert discovery0.enable_private_networks is False
@@ -36,17 +36,31 @@ async def test_enable_private_networks(
36
36
  assert discovery0.address_manager is not None
37
37
  assert discovery0.address_manager.allow_private_subnets is False
38
38
 
39
+ # Missing `default_port` but known selected_network should automatically pick a port
40
+ discovery0 = FullNodeDiscovery(
41
+ server=chia_server,
42
+ target_outbound_count=0,
43
+ peers_file_path=SIMULATOR_ROOT_PATH / Path(chia_server.config["peers_file_path"]),
44
+ introducer_info={"host": "introducer.chia.net", "port": 8444},
45
+ dns_servers=[],
46
+ peer_connect_interval=0,
47
+ selected_network="testnet7",
48
+ default_port=None,
49
+ log=Logger("node_discovery_tests"),
50
+ )
51
+ assert discovery0.default_port == 58444
52
+
39
53
  # Test with enable_private_networks set to False in Config
40
54
  discovery1 = FullNodeDiscovery(
41
- chia_server,
42
- 0,
43
- SIMULATOR_ROOT_PATH / Path(chia_server.config["peers_file_path"]),
44
- {"host": "introducer.chia.net", "port": 8444, "enable_private_networks": False},
45
- [],
46
- 0,
47
- chia_server.config["selected_network"],
48
- None,
49
- Logger("node_discovery_tests"),
55
+ server=chia_server,
56
+ target_outbound_count=0,
57
+ peers_file_path=SIMULATOR_ROOT_PATH / Path(chia_server.config["peers_file_path"]),
58
+ introducer_info={"host": "introducer.chia.net", "port": 8444, "enable_private_networks": False},
59
+ dns_servers=[],
60
+ peer_connect_interval=0,
61
+ selected_network=chia_server.config["selected_network"],
62
+ default_port=None,
63
+ log=Logger("node_discovery_tests"),
50
64
  )
51
65
  assert discovery1 is not None
52
66
  assert discovery1.enable_private_networks is False
@@ -56,15 +70,15 @@ async def test_enable_private_networks(
56
70
 
57
71
  # Test with enable_private_networks set to True in Config
58
72
  discovery2 = FullNodeDiscovery(
59
- chia_server,
60
- 0,
61
- SIMULATOR_ROOT_PATH / Path(chia_server.config["peers_file_path"]),
62
- {"host": "introducer.chia.net", "port": 8444, "enable_private_networks": True},
63
- [],
64
- 0,
65
- chia_server.config["selected_network"],
66
- None,
67
- Logger("node_discovery_tests"),
73
+ server=chia_server,
74
+ target_outbound_count=0,
75
+ peers_file_path=SIMULATOR_ROOT_PATH / Path(chia_server.config["peers_file_path"]),
76
+ introducer_info={"host": "introducer.chia.net", "port": 8444, "enable_private_networks": True},
77
+ dns_servers=[],
78
+ peer_connect_interval=0,
79
+ selected_network=chia_server.config["selected_network"],
80
+ default_port=None,
81
+ log=Logger("node_discovery_tests"),
68
82
  )
69
83
  assert discovery2 is not None
70
84
  assert discovery2.enable_private_networks is True
@@ -8,9 +8,9 @@ from chia_rs.sized_ints import uint32
8
8
  from chia._tests.conftest import node_with_params
9
9
  from chia._tests.util.time_out_assert import time_out_assert
10
10
  from chia.protocols.full_node_protocol import RejectBlock, RejectBlocks, RespondBlock, RespondBlocks
11
+ from chia.protocols.outbound_message import make_msg
11
12
  from chia.protocols.protocol_message_types import ProtocolMessageTypes
12
13
  from chia.protocols.shared_protocol import Capability
13
- from chia.server.outbound_message import make_msg
14
14
  from chia.server.rate_limit_numbers import compose_rate_limits, get_rate_limits_to_use
15
15
  from chia.server.rate_limit_numbers import rate_limits as rl_numbers
16
16
  from chia.server.rate_limits import RateLimiter
@@ -15,11 +15,11 @@ from chia._tests.util.setup_nodes import SimulatorsAndWalletsServices
15
15
  from chia._tests.util.time_out_assert import time_out_assert
16
16
  from chia.full_node.full_node_api import FullNodeAPI
17
17
  from chia.protocols.full_node_protocol import RejectBlock, RequestBlock, RequestTransaction
18
+ from chia.protocols.outbound_message import NodeType, make_msg
18
19
  from chia.protocols.protocol_message_types import ProtocolMessageTypes
19
20
  from chia.protocols.shared_protocol import Error, protocol_version
20
21
  from chia.protocols.wallet_protocol import RejectHeaderRequest
21
22
  from chia.server.api_protocol import ApiMetadata
22
- from chia.server.outbound_message import NodeType, make_msg
23
23
  from chia.server.server import ChiaServer
24
24
  from chia.server.start_full_node import create_full_node_service
25
25
  from chia.server.start_wallet import create_wallet_service
@@ -17,15 +17,15 @@ from typing_extensions import Protocol
17
17
  from chia._tests.core.data_layer.util import ChiaRoot
18
18
  from chia._tests.util.misc import closing_chia_root_popen
19
19
  from chia.daemon.client import DaemonProxy, connect_to_daemon_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 RpcClient
25
- from chia.rpc.wallet_rpc_client import WalletRpcClient
26
25
  from chia.simulator.socket import find_available_listen_port
27
26
  from chia.util.config import lock_and_load_config, save_config
28
27
  from chia.util.timing import adjusted_timeout
28
+ from chia.wallet.wallet_rpc_client import WalletRpcClient
29
29
 
30
30
  if sys.platform == "win32" or sys.platform == "cygwin":
31
31
  termination_signals = [signal.SIGBREAK, signal.SIGINT, signal.SIGTERM]
@@ -10,8 +10,8 @@ import pytest
10
10
  from chia_rs.sized_bytes import bytes32
11
11
 
12
12
  from chia.apis import ApiProtocolRegistry
13
+ from chia.protocols.outbound_message import NodeType
13
14
  from chia.protocols.shared_protocol import default_capabilities
14
- from chia.server.outbound_message import NodeType
15
15
  from chia.server.server import ChiaServer, ssl_context_for_client
16
16
  from chia.server.ssl_context import chia_ssl_ca_paths, private_ssl_ca_paths
17
17
  from chia.server.ws_connection import WSChiaConnection