chia-blockchain 2.5.1rc1__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 (1042) hide show
  1. chia/__init__.py +10 -0
  2. chia/__main__.py +5 -0
  3. chia/_tests/README.md +53 -0
  4. chia/_tests/__init__.py +0 -0
  5. chia/_tests/blockchain/__init__.py +0 -0
  6. chia/_tests/blockchain/blockchain_test_utils.py +195 -0
  7. chia/_tests/blockchain/config.py +4 -0
  8. chia/_tests/blockchain/test_augmented_chain.py +145 -0
  9. chia/_tests/blockchain/test_blockchain.py +4202 -0
  10. chia/_tests/blockchain/test_blockchain_transactions.py +1031 -0
  11. chia/_tests/blockchain/test_build_chains.py +59 -0
  12. chia/_tests/blockchain/test_get_block_generator.py +72 -0
  13. chia/_tests/blockchain/test_lookup_fork_chain.py +194 -0
  14. chia/_tests/build-init-files.py +92 -0
  15. chia/_tests/build-job-matrix.py +204 -0
  16. chia/_tests/check_pytest_monitor_output.py +34 -0
  17. chia/_tests/check_sql_statements.py +72 -0
  18. chia/_tests/chia-start-sim +42 -0
  19. chia/_tests/clvm/__init__.py +0 -0
  20. chia/_tests/clvm/benchmark_costs.py +23 -0
  21. chia/_tests/clvm/coin_store.py +149 -0
  22. chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
  23. chia/_tests/clvm/test_clvm_step.py +37 -0
  24. chia/_tests/clvm/test_condition_codes.py +13 -0
  25. chia/_tests/clvm/test_curry_and_treehash.py +55 -0
  26. chia/_tests/clvm/test_message_conditions.py +184 -0
  27. chia/_tests/clvm/test_program.py +150 -0
  28. chia/_tests/clvm/test_puzzle_compression.py +143 -0
  29. chia/_tests/clvm/test_puzzle_drivers.py +45 -0
  30. chia/_tests/clvm/test_puzzles.py +242 -0
  31. chia/_tests/clvm/test_singletons.py +540 -0
  32. chia/_tests/clvm/test_spend_sim.py +181 -0
  33. chia/_tests/cmds/__init__.py +0 -0
  34. chia/_tests/cmds/cmd_test_utils.py +469 -0
  35. chia/_tests/cmds/config.py +3 -0
  36. chia/_tests/cmds/conftest.py +23 -0
  37. chia/_tests/cmds/test_click_types.py +200 -0
  38. chia/_tests/cmds/test_cmd_framework.py +620 -0
  39. chia/_tests/cmds/test_cmds_util.py +97 -0
  40. chia/_tests/cmds/test_daemon.py +92 -0
  41. chia/_tests/cmds/test_dev_gh.py +131 -0
  42. chia/_tests/cmds/test_farm_cmd.py +66 -0
  43. chia/_tests/cmds/test_show.py +116 -0
  44. chia/_tests/cmds/test_sim.py +207 -0
  45. chia/_tests/cmds/test_timelock_args.py +75 -0
  46. chia/_tests/cmds/test_tx_config_args.py +154 -0
  47. chia/_tests/cmds/testing_classes.py +59 -0
  48. chia/_tests/cmds/wallet/__init__.py +0 -0
  49. chia/_tests/cmds/wallet/test_consts.py +47 -0
  50. chia/_tests/cmds/wallet/test_dao.py +565 -0
  51. chia/_tests/cmds/wallet/test_did.py +403 -0
  52. chia/_tests/cmds/wallet/test_nft.py +471 -0
  53. chia/_tests/cmds/wallet/test_notifications.py +124 -0
  54. chia/_tests/cmds/wallet/test_offer.toffer +1 -0
  55. chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
  56. chia/_tests/cmds/wallet/test_vcs.py +400 -0
  57. chia/_tests/cmds/wallet/test_wallet.py +1125 -0
  58. chia/_tests/cmds/wallet/test_wallet_check.py +109 -0
  59. chia/_tests/conftest.py +1419 -0
  60. chia/_tests/connection_utils.py +125 -0
  61. chia/_tests/core/__init__.py +0 -0
  62. chia/_tests/core/cmds/__init__.py +0 -0
  63. chia/_tests/core/cmds/test_beta.py +382 -0
  64. chia/_tests/core/cmds/test_keys.py +1734 -0
  65. chia/_tests/core/cmds/test_wallet.py +126 -0
  66. chia/_tests/core/config.py +3 -0
  67. chia/_tests/core/consensus/__init__.py +0 -0
  68. chia/_tests/core/consensus/test_block_creation.py +54 -0
  69. chia/_tests/core/consensus/test_pot_iterations.py +117 -0
  70. chia/_tests/core/custom_types/__init__.py +0 -0
  71. chia/_tests/core/custom_types/test_coin.py +107 -0
  72. chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
  73. chia/_tests/core/custom_types/test_spend_bundle.py +70 -0
  74. chia/_tests/core/daemon/__init__.py +0 -0
  75. chia/_tests/core/daemon/config.py +4 -0
  76. chia/_tests/core/daemon/test_daemon.py +2128 -0
  77. chia/_tests/core/daemon/test_daemon_register.py +109 -0
  78. chia/_tests/core/daemon/test_keychain_proxy.py +101 -0
  79. chia/_tests/core/data_layer/__init__.py +0 -0
  80. chia/_tests/core/data_layer/config.py +5 -0
  81. chia/_tests/core/data_layer/conftest.py +106 -0
  82. chia/_tests/core/data_layer/test_data_cli.py +56 -0
  83. chia/_tests/core/data_layer/test_data_layer.py +83 -0
  84. chia/_tests/core/data_layer/test_data_layer_util.py +218 -0
  85. chia/_tests/core/data_layer/test_data_rpc.py +3847 -0
  86. chia/_tests/core/data_layer/test_data_store.py +2424 -0
  87. chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
  88. chia/_tests/core/data_layer/test_plugin.py +91 -0
  89. chia/_tests/core/data_layer/util.py +233 -0
  90. chia/_tests/core/farmer/__init__.py +0 -0
  91. chia/_tests/core/farmer/config.py +3 -0
  92. chia/_tests/core/farmer/test_farmer_api.py +103 -0
  93. chia/_tests/core/full_node/__init__.py +0 -0
  94. chia/_tests/core/full_node/config.py +4 -0
  95. chia/_tests/core/full_node/dos/__init__.py +0 -0
  96. chia/_tests/core/full_node/dos/config.py +3 -0
  97. chia/_tests/core/full_node/full_sync/__init__.py +0 -0
  98. chia/_tests/core/full_node/full_sync/config.py +4 -0
  99. chia/_tests/core/full_node/full_sync/test_full_sync.py +443 -0
  100. chia/_tests/core/full_node/ram_db.py +27 -0
  101. chia/_tests/core/full_node/stores/__init__.py +0 -0
  102. chia/_tests/core/full_node/stores/config.py +4 -0
  103. chia/_tests/core/full_node/stores/test_block_store.py +590 -0
  104. chia/_tests/core/full_node/stores/test_coin_store.py +897 -0
  105. chia/_tests/core/full_node/stores/test_full_node_store.py +1219 -0
  106. chia/_tests/core/full_node/stores/test_hint_store.py +229 -0
  107. chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
  108. chia/_tests/core/full_node/test_address_manager.py +588 -0
  109. chia/_tests/core/full_node/test_block_height_map.py +556 -0
  110. chia/_tests/core/full_node/test_conditions.py +556 -0
  111. chia/_tests/core/full_node/test_full_node.py +2700 -0
  112. chia/_tests/core/full_node/test_generator_tools.py +82 -0
  113. chia/_tests/core/full_node/test_hint_management.py +104 -0
  114. chia/_tests/core/full_node/test_node_load.py +34 -0
  115. chia/_tests/core/full_node/test_performance.py +179 -0
  116. chia/_tests/core/full_node/test_subscriptions.py +492 -0
  117. chia/_tests/core/full_node/test_transactions.py +203 -0
  118. chia/_tests/core/full_node/test_tx_processing_queue.py +155 -0
  119. chia/_tests/core/large_block.py +2388 -0
  120. chia/_tests/core/make_block_generator.py +70 -0
  121. chia/_tests/core/mempool/__init__.py +0 -0
  122. chia/_tests/core/mempool/config.py +4 -0
  123. chia/_tests/core/mempool/test_mempool.py +3255 -0
  124. chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
  125. chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
  126. chia/_tests/core/mempool/test_mempool_item_queries.py +190 -0
  127. chia/_tests/core/mempool/test_mempool_manager.py +2084 -0
  128. chia/_tests/core/mempool/test_mempool_performance.py +64 -0
  129. chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
  130. chia/_tests/core/node_height.py +28 -0
  131. chia/_tests/core/server/__init__.py +0 -0
  132. chia/_tests/core/server/config.py +3 -0
  133. chia/_tests/core/server/flood.py +84 -0
  134. chia/_tests/core/server/serve.py +135 -0
  135. chia/_tests/core/server/test_api_protocol.py +21 -0
  136. chia/_tests/core/server/test_capabilities.py +66 -0
  137. chia/_tests/core/server/test_dos.py +319 -0
  138. chia/_tests/core/server/test_event_loop.py +109 -0
  139. chia/_tests/core/server/test_loop.py +294 -0
  140. chia/_tests/core/server/test_node_discovery.py +73 -0
  141. chia/_tests/core/server/test_rate_limits.py +482 -0
  142. chia/_tests/core/server/test_server.py +226 -0
  143. chia/_tests/core/server/test_upnp.py +8 -0
  144. chia/_tests/core/services/__init__.py +0 -0
  145. chia/_tests/core/services/config.py +3 -0
  146. chia/_tests/core/services/test_services.py +188 -0
  147. chia/_tests/core/ssl/__init__.py +0 -0
  148. chia/_tests/core/ssl/config.py +3 -0
  149. chia/_tests/core/ssl/test_ssl.py +202 -0
  150. chia/_tests/core/test_coins.py +33 -0
  151. chia/_tests/core/test_cost_calculation.py +313 -0
  152. chia/_tests/core/test_crawler.py +175 -0
  153. chia/_tests/core/test_crawler_rpc.py +53 -0
  154. chia/_tests/core/test_daemon_rpc.py +24 -0
  155. chia/_tests/core/test_db_conversion.py +130 -0
  156. chia/_tests/core/test_db_validation.py +162 -0
  157. chia/_tests/core/test_farmer_harvester_rpc.py +505 -0
  158. chia/_tests/core/test_filter.py +35 -0
  159. chia/_tests/core/test_full_node_rpc.py +768 -0
  160. chia/_tests/core/test_merkle_set.py +343 -0
  161. chia/_tests/core/test_program.py +47 -0
  162. chia/_tests/core/test_rpc_util.py +86 -0
  163. chia/_tests/core/test_seeder.py +420 -0
  164. chia/_tests/core/test_setproctitle.py +13 -0
  165. chia/_tests/core/util/__init__.py +0 -0
  166. chia/_tests/core/util/config.py +4 -0
  167. chia/_tests/core/util/test_block_cache.py +44 -0
  168. chia/_tests/core/util/test_cached_bls.py +57 -0
  169. chia/_tests/core/util/test_config.py +337 -0
  170. chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
  171. chia/_tests/core/util/test_files.py +391 -0
  172. chia/_tests/core/util/test_jsonify.py +146 -0
  173. chia/_tests/core/util/test_keychain.py +522 -0
  174. chia/_tests/core/util/test_keyring_wrapper.py +491 -0
  175. chia/_tests/core/util/test_lockfile.py +380 -0
  176. chia/_tests/core/util/test_log_exceptions.py +187 -0
  177. chia/_tests/core/util/test_lru_cache.py +56 -0
  178. chia/_tests/core/util/test_significant_bits.py +40 -0
  179. chia/_tests/core/util/test_streamable.py +883 -0
  180. chia/_tests/db/__init__.py +0 -0
  181. chia/_tests/db/test_db_wrapper.py +566 -0
  182. chia/_tests/environments/__init__.py +0 -0
  183. chia/_tests/environments/common.py +35 -0
  184. chia/_tests/environments/full_node.py +47 -0
  185. chia/_tests/environments/wallet.py +429 -0
  186. chia/_tests/ether.py +19 -0
  187. chia/_tests/farmer_harvester/__init__.py +0 -0
  188. chia/_tests/farmer_harvester/config.py +3 -0
  189. chia/_tests/farmer_harvester/test_farmer.py +1264 -0
  190. chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
  191. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +131 -0
  192. chia/_tests/farmer_harvester/test_third_party_harvesters.py +528 -0
  193. chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
  194. chia/_tests/fee_estimation/__init__.py +0 -0
  195. chia/_tests/fee_estimation/config.py +3 -0
  196. chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
  197. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
  198. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +144 -0
  199. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
  200. chia/_tests/generator/__init__.py +0 -0
  201. chia/_tests/generator/puzzles/__init__.py +0 -0
  202. chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
  203. chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
  204. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
  205. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
  206. chia/_tests/generator/test_compression.py +201 -0
  207. chia/_tests/generator/test_generator_types.py +44 -0
  208. chia/_tests/generator/test_rom.py +180 -0
  209. chia/_tests/plot_sync/__init__.py +0 -0
  210. chia/_tests/plot_sync/config.py +3 -0
  211. chia/_tests/plot_sync/test_delta.py +101 -0
  212. chia/_tests/plot_sync/test_plot_sync.py +618 -0
  213. chia/_tests/plot_sync/test_receiver.py +451 -0
  214. chia/_tests/plot_sync/test_sender.py +116 -0
  215. chia/_tests/plot_sync/test_sync_simulated.py +451 -0
  216. chia/_tests/plot_sync/util.py +68 -0
  217. chia/_tests/plotting/__init__.py +0 -0
  218. chia/_tests/plotting/config.py +3 -0
  219. chia/_tests/plotting/test_plot_manager.py +781 -0
  220. chia/_tests/plotting/util.py +12 -0
  221. chia/_tests/pools/__init__.py +0 -0
  222. chia/_tests/pools/config.py +5 -0
  223. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  224. chia/_tests/pools/test_pool_cmdline.py +1001 -0
  225. chia/_tests/pools/test_pool_config.py +42 -0
  226. chia/_tests/pools/test_pool_puzzles_lifecycle.py +397 -0
  227. chia/_tests/pools/test_pool_rpc.py +1123 -0
  228. chia/_tests/pools/test_pool_wallet.py +205 -0
  229. chia/_tests/pools/test_wallet_pool_store.py +161 -0
  230. chia/_tests/process_junit.py +348 -0
  231. chia/_tests/rpc/__init__.py +0 -0
  232. chia/_tests/rpc/test_rpc_client.py +138 -0
  233. chia/_tests/rpc/test_rpc_server.py +183 -0
  234. chia/_tests/simulation/__init__.py +0 -0
  235. chia/_tests/simulation/config.py +6 -0
  236. chia/_tests/simulation/test_simulation.py +501 -0
  237. chia/_tests/simulation/test_simulator.py +232 -0
  238. chia/_tests/simulation/test_start_simulator.py +107 -0
  239. chia/_tests/testconfig.py +13 -0
  240. chia/_tests/timelord/__init__.py +0 -0
  241. chia/_tests/timelord/config.py +3 -0
  242. chia/_tests/timelord/test_new_peak.py +437 -0
  243. chia/_tests/timelord/test_timelord.py +11 -0
  244. chia/_tests/tools/1315537.json +170 -0
  245. chia/_tests/tools/1315544.json +160 -0
  246. chia/_tests/tools/1315630.json +150 -0
  247. chia/_tests/tools/300000.json +105 -0
  248. chia/_tests/tools/442734.json +140 -0
  249. chia/_tests/tools/466212.json +130 -0
  250. chia/_tests/tools/__init__.py +0 -0
  251. chia/_tests/tools/config.py +5 -0
  252. chia/_tests/tools/test-blockchain-db.sqlite +0 -0
  253. chia/_tests/tools/test_full_sync.py +30 -0
  254. chia/_tests/tools/test_legacy_keyring.py +82 -0
  255. chia/_tests/tools/test_run_block.py +128 -0
  256. chia/_tests/tools/test_virtual_project.py +591 -0
  257. chia/_tests/util/__init__.py +0 -0
  258. chia/_tests/util/benchmark_cost.py +170 -0
  259. chia/_tests/util/benchmarks.py +153 -0
  260. chia/_tests/util/bip39_test_vectors.json +148 -0
  261. chia/_tests/util/blockchain.py +134 -0
  262. chia/_tests/util/blockchain_mock.py +132 -0
  263. chia/_tests/util/build_network_protocol_files.py +302 -0
  264. chia/_tests/util/clvm_generator.bin +0 -0
  265. chia/_tests/util/config.py +3 -0
  266. chia/_tests/util/constants.py +20 -0
  267. chia/_tests/util/db_connection.py +37 -0
  268. chia/_tests/util/full_sync.py +253 -0
  269. chia/_tests/util/gen_ssl_certs.py +114 -0
  270. chia/_tests/util/generator_tools_testing.py +45 -0
  271. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  272. chia/_tests/util/key_tool.py +36 -0
  273. chia/_tests/util/misc.py +675 -0
  274. chia/_tests/util/network_protocol_data.py +1072 -0
  275. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  276. chia/_tests/util/protocol_messages_json.py +2701 -0
  277. chia/_tests/util/rpc.py +26 -0
  278. chia/_tests/util/run_block.py +163 -0
  279. chia/_tests/util/setup_nodes.py +481 -0
  280. chia/_tests/util/spend_sim.py +492 -0
  281. chia/_tests/util/split_managers.py +102 -0
  282. chia/_tests/util/temp_file.py +14 -0
  283. chia/_tests/util/test_action_scope.py +144 -0
  284. chia/_tests/util/test_async_pool.py +366 -0
  285. chia/_tests/util/test_build_job_matrix.py +42 -0
  286. chia/_tests/util/test_build_network_protocol_files.py +7 -0
  287. chia/_tests/util/test_chia_version.py +50 -0
  288. chia/_tests/util/test_collection.py +11 -0
  289. chia/_tests/util/test_condition_tools.py +229 -0
  290. chia/_tests/util/test_config.py +426 -0
  291. chia/_tests/util/test_dump_keyring.py +60 -0
  292. chia/_tests/util/test_errors.py +10 -0
  293. chia/_tests/util/test_full_block_utils.py +279 -0
  294. chia/_tests/util/test_installed.py +20 -0
  295. chia/_tests/util/test_limited_semaphore.py +53 -0
  296. chia/_tests/util/test_logging_filter.py +42 -0
  297. chia/_tests/util/test_misc.py +445 -0
  298. chia/_tests/util/test_network.py +73 -0
  299. chia/_tests/util/test_network_protocol_files.py +578 -0
  300. chia/_tests/util/test_network_protocol_json.py +267 -0
  301. chia/_tests/util/test_network_protocol_test.py +256 -0
  302. chia/_tests/util/test_paginator.py +71 -0
  303. chia/_tests/util/test_pprint.py +17 -0
  304. chia/_tests/util/test_priority_mutex.py +488 -0
  305. chia/_tests/util/test_recursive_replace.py +116 -0
  306. chia/_tests/util/test_replace_str_to_bytes.py +137 -0
  307. chia/_tests/util/test_service_groups.py +15 -0
  308. chia/_tests/util/test_ssl_check.py +31 -0
  309. chia/_tests/util/test_testnet_overrides.py +19 -0
  310. chia/_tests/util/test_tests_misc.py +38 -0
  311. chia/_tests/util/test_timing.py +37 -0
  312. chia/_tests/util/test_trusted_peer.py +51 -0
  313. chia/_tests/util/time_out_assert.py +191 -0
  314. chia/_tests/wallet/__init__.py +0 -0
  315. chia/_tests/wallet/cat_wallet/__init__.py +0 -0
  316. chia/_tests/wallet/cat_wallet/config.py +4 -0
  317. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
  318. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
  319. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1826 -0
  320. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
  321. chia/_tests/wallet/cat_wallet/test_trades.py +2600 -0
  322. chia/_tests/wallet/clawback/__init__.py +0 -0
  323. chia/_tests/wallet/clawback/config.py +3 -0
  324. chia/_tests/wallet/clawback/test_clawback_decorator.py +78 -0
  325. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
  326. chia/_tests/wallet/clawback/test_clawback_metadata.py +50 -0
  327. chia/_tests/wallet/config.py +4 -0
  328. chia/_tests/wallet/conftest.py +278 -0
  329. chia/_tests/wallet/dao_wallet/__init__.py +0 -0
  330. chia/_tests/wallet/dao_wallet/config.py +3 -0
  331. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1330 -0
  332. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
  333. chia/_tests/wallet/db_wallet/__init__.py +0 -0
  334. chia/_tests/wallet/db_wallet/config.py +3 -0
  335. chia/_tests/wallet/db_wallet/test_db_graftroot.py +141 -0
  336. chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
  337. chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
  338. chia/_tests/wallet/did_wallet/__init__.py +0 -0
  339. chia/_tests/wallet/did_wallet/config.py +4 -0
  340. chia/_tests/wallet/did_wallet/test_did.py +2284 -0
  341. chia/_tests/wallet/nft_wallet/__init__.py +0 -0
  342. chia/_tests/wallet/nft_wallet/config.py +4 -0
  343. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1493 -0
  344. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1024 -0
  345. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +375 -0
  346. chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
  347. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
  348. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2584 -0
  349. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
  350. chia/_tests/wallet/rpc/__init__.py +0 -0
  351. chia/_tests/wallet/rpc/config.py +4 -0
  352. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +285 -0
  353. chia/_tests/wallet/rpc/test_wallet_rpc.py +3153 -0
  354. chia/_tests/wallet/simple_sync/__init__.py +0 -0
  355. chia/_tests/wallet/simple_sync/config.py +3 -0
  356. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +718 -0
  357. chia/_tests/wallet/sync/__init__.py +0 -0
  358. chia/_tests/wallet/sync/config.py +4 -0
  359. chia/_tests/wallet/sync/test_wallet_sync.py +1692 -0
  360. chia/_tests/wallet/test_address_type.py +189 -0
  361. chia/_tests/wallet/test_bech32m.py +45 -0
  362. chia/_tests/wallet/test_clvm_streamable.py +244 -0
  363. chia/_tests/wallet/test_coin_management.py +354 -0
  364. chia/_tests/wallet/test_coin_selection.py +588 -0
  365. chia/_tests/wallet/test_conditions.py +400 -0
  366. chia/_tests/wallet/test_debug_spend_bundle.py +218 -0
  367. chia/_tests/wallet/test_new_wallet_protocol.py +1174 -0
  368. chia/_tests/wallet/test_nft_store.py +192 -0
  369. chia/_tests/wallet/test_notifications.py +196 -0
  370. chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
  371. chia/_tests/wallet/test_puzzle_store.py +132 -0
  372. chia/_tests/wallet/test_sign_coin_spends.py +159 -0
  373. chia/_tests/wallet/test_signer_protocol.py +947 -0
  374. chia/_tests/wallet/test_singleton.py +122 -0
  375. chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
  376. chia/_tests/wallet/test_singleton_store.py +152 -0
  377. chia/_tests/wallet/test_taproot.py +19 -0
  378. chia/_tests/wallet/test_transaction_store.py +945 -0
  379. chia/_tests/wallet/test_util.py +185 -0
  380. chia/_tests/wallet/test_wallet.py +2139 -0
  381. chia/_tests/wallet/test_wallet_action_scope.py +85 -0
  382. chia/_tests/wallet/test_wallet_blockchain.py +111 -0
  383. chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
  384. chia/_tests/wallet/test_wallet_interested_store.py +43 -0
  385. chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
  386. chia/_tests/wallet/test_wallet_node.py +780 -0
  387. chia/_tests/wallet/test_wallet_retry.py +95 -0
  388. chia/_tests/wallet/test_wallet_state_manager.py +259 -0
  389. chia/_tests/wallet/test_wallet_test_framework.py +275 -0
  390. chia/_tests/wallet/test_wallet_trade_store.py +218 -0
  391. chia/_tests/wallet/test_wallet_user_store.py +34 -0
  392. chia/_tests/wallet/test_wallet_utils.py +156 -0
  393. chia/_tests/wallet/vc_wallet/__init__.py +0 -0
  394. chia/_tests/wallet/vc_wallet/config.py +3 -0
  395. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
  396. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
  397. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +830 -0
  398. chia/_tests/wallet/wallet_block_tools.py +327 -0
  399. chia/_tests/weight_proof/__init__.py +0 -0
  400. chia/_tests/weight_proof/config.py +3 -0
  401. chia/_tests/weight_proof/test_weight_proof.py +528 -0
  402. chia/apis.py +19 -0
  403. chia/clvm/__init__.py +0 -0
  404. chia/cmds/__init__.py +0 -0
  405. chia/cmds/beta.py +184 -0
  406. chia/cmds/beta_funcs.py +137 -0
  407. chia/cmds/check_wallet_db.py +420 -0
  408. chia/cmds/chia.py +151 -0
  409. chia/cmds/cmd_classes.py +323 -0
  410. chia/cmds/cmd_helpers.py +242 -0
  411. chia/cmds/cmds_util.py +488 -0
  412. chia/cmds/coin_funcs.py +275 -0
  413. chia/cmds/coins.py +182 -0
  414. chia/cmds/completion.py +49 -0
  415. chia/cmds/configure.py +332 -0
  416. chia/cmds/dao.py +1064 -0
  417. chia/cmds/dao_funcs.py +598 -0
  418. chia/cmds/data.py +708 -0
  419. chia/cmds/data_funcs.py +385 -0
  420. chia/cmds/db.py +87 -0
  421. chia/cmds/db_backup_func.py +77 -0
  422. chia/cmds/db_upgrade_func.py +452 -0
  423. chia/cmds/db_validate_func.py +184 -0
  424. chia/cmds/dev.py +18 -0
  425. chia/cmds/farm.py +100 -0
  426. chia/cmds/farm_funcs.py +200 -0
  427. chia/cmds/gh.py +275 -0
  428. chia/cmds/init.py +63 -0
  429. chia/cmds/init_funcs.py +367 -0
  430. chia/cmds/installers.py +131 -0
  431. chia/cmds/keys.py +527 -0
  432. chia/cmds/keys_funcs.py +863 -0
  433. chia/cmds/netspace.py +50 -0
  434. chia/cmds/netspace_funcs.py +54 -0
  435. chia/cmds/options.py +32 -0
  436. chia/cmds/param_types.py +238 -0
  437. chia/cmds/passphrase.py +131 -0
  438. chia/cmds/passphrase_funcs.py +292 -0
  439. chia/cmds/peer.py +51 -0
  440. chia/cmds/peer_funcs.py +129 -0
  441. chia/cmds/plotnft.py +260 -0
  442. chia/cmds/plotnft_funcs.py +405 -0
  443. chia/cmds/plots.py +230 -0
  444. chia/cmds/plotters.py +18 -0
  445. chia/cmds/rpc.py +208 -0
  446. chia/cmds/show.py +72 -0
  447. chia/cmds/show_funcs.py +215 -0
  448. chia/cmds/signer.py +296 -0
  449. chia/cmds/sim.py +225 -0
  450. chia/cmds/sim_funcs.py +509 -0
  451. chia/cmds/start.py +24 -0
  452. chia/cmds/start_funcs.py +109 -0
  453. chia/cmds/stop.py +62 -0
  454. chia/cmds/units.py +9 -0
  455. chia/cmds/wallet.py +1901 -0
  456. chia/cmds/wallet_funcs.py +1874 -0
  457. chia/consensus/__init__.py +0 -0
  458. chia/consensus/block_body_validation.py +562 -0
  459. chia/consensus/block_creation.py +546 -0
  460. chia/consensus/block_header_validation.py +1059 -0
  461. chia/consensus/block_record.py +31 -0
  462. chia/consensus/block_rewards.py +53 -0
  463. chia/consensus/blockchain.py +1087 -0
  464. chia/consensus/blockchain_interface.py +56 -0
  465. chia/consensus/coinbase.py +30 -0
  466. chia/consensus/condition_costs.py +9 -0
  467. chia/consensus/constants.py +49 -0
  468. chia/consensus/cost_calculator.py +15 -0
  469. chia/consensus/default_constants.py +89 -0
  470. chia/consensus/deficit.py +55 -0
  471. chia/consensus/difficulty_adjustment.py +412 -0
  472. chia/consensus/find_fork_point.py +111 -0
  473. chia/consensus/full_block_to_block_record.py +167 -0
  474. chia/consensus/get_block_challenge.py +106 -0
  475. chia/consensus/get_block_generator.py +27 -0
  476. chia/consensus/make_sub_epoch_summary.py +210 -0
  477. chia/consensus/multiprocess_validation.py +268 -0
  478. chia/consensus/pos_quality.py +19 -0
  479. chia/consensus/pot_iterations.py +67 -0
  480. chia/consensus/puzzles/__init__.py +0 -0
  481. chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
  482. chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
  483. chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
  484. chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
  485. chia/consensus/vdf_info_computation.py +156 -0
  486. chia/daemon/__init__.py +0 -0
  487. chia/daemon/client.py +252 -0
  488. chia/daemon/keychain_proxy.py +502 -0
  489. chia/daemon/keychain_server.py +365 -0
  490. chia/daemon/server.py +1606 -0
  491. chia/daemon/windows_signal.py +56 -0
  492. chia/data_layer/__init__.py +0 -0
  493. chia/data_layer/data_layer.py +1291 -0
  494. chia/data_layer/data_layer_api.py +33 -0
  495. chia/data_layer/data_layer_errors.py +50 -0
  496. chia/data_layer/data_layer_server.py +170 -0
  497. chia/data_layer/data_layer_util.py +985 -0
  498. chia/data_layer/data_layer_wallet.py +1311 -0
  499. chia/data_layer/data_store.py +2267 -0
  500. chia/data_layer/dl_wallet_store.py +407 -0
  501. chia/data_layer/download_data.py +389 -0
  502. chia/data_layer/puzzles/__init__.py +0 -0
  503. chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
  504. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
  505. chia/data_layer/s3_plugin_config.yml +33 -0
  506. chia/data_layer/s3_plugin_service.py +468 -0
  507. chia/data_layer/util/__init__.py +0 -0
  508. chia/data_layer/util/benchmark.py +107 -0
  509. chia/data_layer/util/plugin.py +40 -0
  510. chia/farmer/__init__.py +0 -0
  511. chia/farmer/farmer.py +923 -0
  512. chia/farmer/farmer_api.py +820 -0
  513. chia/full_node/__init__.py +0 -0
  514. chia/full_node/bitcoin_fee_estimator.py +85 -0
  515. chia/full_node/block_height_map.py +271 -0
  516. chia/full_node/block_store.py +576 -0
  517. chia/full_node/bundle_tools.py +19 -0
  518. chia/full_node/coin_store.py +647 -0
  519. chia/full_node/fee_estimate.py +54 -0
  520. chia/full_node/fee_estimate_store.py +24 -0
  521. chia/full_node/fee_estimation.py +92 -0
  522. chia/full_node/fee_estimator.py +90 -0
  523. chia/full_node/fee_estimator_constants.py +38 -0
  524. chia/full_node/fee_estimator_interface.py +42 -0
  525. chia/full_node/fee_history.py +25 -0
  526. chia/full_node/fee_tracker.py +564 -0
  527. chia/full_node/full_node.py +3327 -0
  528. chia/full_node/full_node_api.py +2025 -0
  529. chia/full_node/full_node_store.py +1033 -0
  530. chia/full_node/hint_management.py +56 -0
  531. chia/full_node/hint_store.py +93 -0
  532. chia/full_node/mempool.py +589 -0
  533. chia/full_node/mempool_check_conditions.py +146 -0
  534. chia/full_node/mempool_manager.py +853 -0
  535. chia/full_node/pending_tx_cache.py +112 -0
  536. chia/full_node/puzzles/__init__.py +0 -0
  537. chia/full_node/puzzles/block_program_zero.clsp +14 -0
  538. chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
  539. chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
  540. chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
  541. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
  542. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
  543. chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
  544. chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
  545. chia/full_node/signage_point.py +16 -0
  546. chia/full_node/subscriptions.py +247 -0
  547. chia/full_node/sync_store.py +146 -0
  548. chia/full_node/tx_processing_queue.py +78 -0
  549. chia/full_node/util/__init__.py +0 -0
  550. chia/full_node/weight_proof.py +1720 -0
  551. chia/harvester/__init__.py +0 -0
  552. chia/harvester/harvester.py +272 -0
  553. chia/harvester/harvester_api.py +380 -0
  554. chia/introducer/__init__.py +0 -0
  555. chia/introducer/introducer.py +122 -0
  556. chia/introducer/introducer_api.py +70 -0
  557. chia/legacy/__init__.py +0 -0
  558. chia/legacy/keyring.py +155 -0
  559. chia/plot_sync/__init__.py +0 -0
  560. chia/plot_sync/delta.py +61 -0
  561. chia/plot_sync/exceptions.py +56 -0
  562. chia/plot_sync/receiver.py +386 -0
  563. chia/plot_sync/sender.py +340 -0
  564. chia/plot_sync/util.py +43 -0
  565. chia/plotters/__init__.py +0 -0
  566. chia/plotters/bladebit.py +388 -0
  567. chia/plotters/chiapos.py +63 -0
  568. chia/plotters/madmax.py +224 -0
  569. chia/plotters/plotters.py +577 -0
  570. chia/plotters/plotters_util.py +133 -0
  571. chia/plotting/__init__.py +0 -0
  572. chia/plotting/cache.py +213 -0
  573. chia/plotting/check_plots.py +283 -0
  574. chia/plotting/create_plots.py +278 -0
  575. chia/plotting/manager.py +436 -0
  576. chia/plotting/util.py +336 -0
  577. chia/pools/__init__.py +0 -0
  578. chia/pools/pool_config.py +110 -0
  579. chia/pools/pool_puzzles.py +459 -0
  580. chia/pools/pool_wallet.py +933 -0
  581. chia/pools/pool_wallet_info.py +118 -0
  582. chia/pools/puzzles/__init__.py +0 -0
  583. chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
  584. chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
  585. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
  586. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
  587. chia/protocols/__init__.py +0 -0
  588. chia/protocols/farmer_protocol.py +102 -0
  589. chia/protocols/full_node_protocol.py +219 -0
  590. chia/protocols/harvester_protocol.py +216 -0
  591. chia/protocols/introducer_protocol.py +25 -0
  592. chia/protocols/pool_protocol.py +177 -0
  593. chia/protocols/protocol_message_types.py +139 -0
  594. chia/protocols/protocol_state_machine.py +87 -0
  595. chia/protocols/protocol_timing.py +8 -0
  596. chia/protocols/shared_protocol.py +86 -0
  597. chia/protocols/timelord_protocol.py +93 -0
  598. chia/protocols/wallet_protocol.py +401 -0
  599. chia/py.typed +0 -0
  600. chia/rpc/__init__.py +0 -0
  601. chia/rpc/crawler_rpc_api.py +80 -0
  602. chia/rpc/data_layer_rpc_api.py +644 -0
  603. chia/rpc/data_layer_rpc_client.py +188 -0
  604. chia/rpc/data_layer_rpc_util.py +58 -0
  605. chia/rpc/farmer_rpc_api.py +365 -0
  606. chia/rpc/farmer_rpc_client.py +86 -0
  607. chia/rpc/full_node_rpc_api.py +959 -0
  608. chia/rpc/full_node_rpc_client.py +292 -0
  609. chia/rpc/harvester_rpc_api.py +141 -0
  610. chia/rpc/harvester_rpc_client.py +54 -0
  611. chia/rpc/rpc_client.py +164 -0
  612. chia/rpc/rpc_server.py +521 -0
  613. chia/rpc/timelord_rpc_api.py +32 -0
  614. chia/rpc/util.py +93 -0
  615. chia/rpc/wallet_request_types.py +904 -0
  616. chia/rpc/wallet_rpc_api.py +4943 -0
  617. chia/rpc/wallet_rpc_client.py +1814 -0
  618. chia/seeder/__init__.py +0 -0
  619. chia/seeder/crawl_store.py +425 -0
  620. chia/seeder/crawler.py +410 -0
  621. chia/seeder/crawler_api.py +135 -0
  622. chia/seeder/dns_server.py +593 -0
  623. chia/seeder/peer_record.py +146 -0
  624. chia/seeder/start_crawler.py +92 -0
  625. chia/server/__init__.py +0 -0
  626. chia/server/address_manager.py +658 -0
  627. chia/server/address_manager_store.py +237 -0
  628. chia/server/api_protocol.py +116 -0
  629. chia/server/capabilities.py +24 -0
  630. chia/server/chia_policy.py +346 -0
  631. chia/server/introducer_peers.py +76 -0
  632. chia/server/node_discovery.py +714 -0
  633. chia/server/outbound_message.py +33 -0
  634. chia/server/rate_limit_numbers.py +214 -0
  635. chia/server/rate_limits.py +153 -0
  636. chia/server/server.py +741 -0
  637. chia/server/signal_handlers.py +120 -0
  638. chia/server/ssl_context.py +32 -0
  639. chia/server/start_data_layer.py +151 -0
  640. chia/server/start_farmer.py +98 -0
  641. chia/server/start_full_node.py +112 -0
  642. chia/server/start_harvester.py +93 -0
  643. chia/server/start_introducer.py +81 -0
  644. chia/server/start_service.py +316 -0
  645. chia/server/start_timelord.py +89 -0
  646. chia/server/start_wallet.py +113 -0
  647. chia/server/upnp.py +118 -0
  648. chia/server/ws_connection.py +766 -0
  649. chia/simulator/__init__.py +0 -0
  650. chia/simulator/add_blocks_in_batches.py +54 -0
  651. chia/simulator/block_tools.py +2054 -0
  652. chia/simulator/full_node_simulator.py +794 -0
  653. chia/simulator/keyring.py +128 -0
  654. chia/simulator/setup_services.py +506 -0
  655. chia/simulator/simulator_constants.py +13 -0
  656. chia/simulator/simulator_full_node_rpc_api.py +99 -0
  657. chia/simulator/simulator_full_node_rpc_client.py +60 -0
  658. chia/simulator/simulator_protocol.py +29 -0
  659. chia/simulator/simulator_test_tools.py +164 -0
  660. chia/simulator/socket.py +24 -0
  661. chia/simulator/ssl_certs.py +114 -0
  662. chia/simulator/ssl_certs_1.py +697 -0
  663. chia/simulator/ssl_certs_10.py +697 -0
  664. chia/simulator/ssl_certs_2.py +697 -0
  665. chia/simulator/ssl_certs_3.py +697 -0
  666. chia/simulator/ssl_certs_4.py +697 -0
  667. chia/simulator/ssl_certs_5.py +697 -0
  668. chia/simulator/ssl_certs_6.py +697 -0
  669. chia/simulator/ssl_certs_7.py +697 -0
  670. chia/simulator/ssl_certs_8.py +697 -0
  671. chia/simulator/ssl_certs_9.py +697 -0
  672. chia/simulator/start_simulator.py +143 -0
  673. chia/simulator/wallet_tools.py +246 -0
  674. chia/ssl/__init__.py +0 -0
  675. chia/ssl/chia_ca.crt +19 -0
  676. chia/ssl/chia_ca.key +28 -0
  677. chia/ssl/create_ssl.py +249 -0
  678. chia/ssl/dst_root_ca.pem +20 -0
  679. chia/timelord/__init__.py +0 -0
  680. chia/timelord/iters_from_block.py +50 -0
  681. chia/timelord/timelord.py +1226 -0
  682. chia/timelord/timelord_api.py +138 -0
  683. chia/timelord/timelord_launcher.py +190 -0
  684. chia/timelord/timelord_state.py +244 -0
  685. chia/timelord/types.py +22 -0
  686. chia/types/__init__.py +0 -0
  687. chia/types/aliases.py +35 -0
  688. chia/types/block_protocol.py +20 -0
  689. chia/types/blockchain_format/__init__.py +0 -0
  690. chia/types/blockchain_format/classgroup.py +5 -0
  691. chia/types/blockchain_format/coin.py +28 -0
  692. chia/types/blockchain_format/foliage.py +8 -0
  693. chia/types/blockchain_format/pool_target.py +5 -0
  694. chia/types/blockchain_format/program.py +269 -0
  695. chia/types/blockchain_format/proof_of_space.py +135 -0
  696. chia/types/blockchain_format/reward_chain_block.py +6 -0
  697. chia/types/blockchain_format/serialized_program.py +5 -0
  698. chia/types/blockchain_format/sized_bytes.py +11 -0
  699. chia/types/blockchain_format/slots.py +9 -0
  700. chia/types/blockchain_format/sub_epoch_summary.py +5 -0
  701. chia/types/blockchain_format/tree_hash.py +72 -0
  702. chia/types/blockchain_format/vdf.py +86 -0
  703. chia/types/clvm_cost.py +13 -0
  704. chia/types/coin_record.py +43 -0
  705. chia/types/coin_spend.py +115 -0
  706. chia/types/condition_opcodes.py +73 -0
  707. chia/types/condition_with_args.py +16 -0
  708. chia/types/eligible_coin_spends.py +365 -0
  709. chia/types/end_of_slot_bundle.py +5 -0
  710. chia/types/fee_rate.py +38 -0
  711. chia/types/full_block.py +5 -0
  712. chia/types/generator_types.py +13 -0
  713. chia/types/header_block.py +5 -0
  714. chia/types/internal_mempool_item.py +18 -0
  715. chia/types/mempool_inclusion_status.py +9 -0
  716. chia/types/mempool_item.py +85 -0
  717. chia/types/mempool_submission_status.py +30 -0
  718. chia/types/mojos.py +7 -0
  719. chia/types/peer_info.py +64 -0
  720. chia/types/signing_mode.py +29 -0
  721. chia/types/spend_bundle.py +30 -0
  722. chia/types/spend_bundle_conditions.py +7 -0
  723. chia/types/transaction_queue_entry.py +55 -0
  724. chia/types/unfinished_block.py +5 -0
  725. chia/types/unfinished_header_block.py +37 -0
  726. chia/types/validation_state.py +14 -0
  727. chia/types/weight_proof.py +49 -0
  728. chia/util/__init__.py +0 -0
  729. chia/util/action_scope.py +168 -0
  730. chia/util/async_pool.py +226 -0
  731. chia/util/augmented_chain.py +134 -0
  732. chia/util/batches.py +42 -0
  733. chia/util/bech32m.py +126 -0
  734. chia/util/beta_metrics.py +119 -0
  735. chia/util/block_cache.py +56 -0
  736. chia/util/byte_types.py +12 -0
  737. chia/util/check_fork_next_block.py +33 -0
  738. chia/util/chia_logging.py +144 -0
  739. chia/util/chia_version.py +33 -0
  740. chia/util/collection.py +17 -0
  741. chia/util/condition_tools.py +201 -0
  742. chia/util/config.py +367 -0
  743. chia/util/cpu.py +22 -0
  744. chia/util/db_synchronous.py +23 -0
  745. chia/util/db_version.py +32 -0
  746. chia/util/db_wrapper.py +430 -0
  747. chia/util/default_root.py +27 -0
  748. chia/util/dump_keyring.py +93 -0
  749. chia/util/english.txt +2048 -0
  750. chia/util/errors.py +353 -0
  751. chia/util/file_keyring.py +469 -0
  752. chia/util/files.py +97 -0
  753. chia/util/full_block_utils.py +345 -0
  754. chia/util/generator_tools.py +72 -0
  755. chia/util/hash.py +31 -0
  756. chia/util/initial-config.yaml +694 -0
  757. chia/util/inline_executor.py +26 -0
  758. chia/util/ints.py +19 -0
  759. chia/util/ip_address.py +39 -0
  760. chia/util/json_util.py +37 -0
  761. chia/util/keychain.py +676 -0
  762. chia/util/keyring_wrapper.py +327 -0
  763. chia/util/limited_semaphore.py +41 -0
  764. chia/util/lock.py +49 -0
  765. chia/util/log_exceptions.py +32 -0
  766. chia/util/logging.py +36 -0
  767. chia/util/lru_cache.py +31 -0
  768. chia/util/math.py +20 -0
  769. chia/util/network.py +182 -0
  770. chia/util/paginator.py +48 -0
  771. chia/util/path.py +31 -0
  772. chia/util/permissions.py +20 -0
  773. chia/util/prev_transaction_block.py +21 -0
  774. chia/util/priority_mutex.py +95 -0
  775. chia/util/profiler.py +197 -0
  776. chia/util/recursive_replace.py +24 -0
  777. chia/util/safe_cancel_task.py +16 -0
  778. chia/util/service_groups.py +47 -0
  779. chia/util/setproctitle.py +22 -0
  780. chia/util/significant_bits.py +32 -0
  781. chia/util/ssl_check.py +213 -0
  782. chia/util/streamable.py +642 -0
  783. chia/util/task_referencer.py +59 -0
  784. chia/util/task_timing.py +382 -0
  785. chia/util/timing.py +67 -0
  786. chia/util/vdf_prover.py +30 -0
  787. chia/util/virtual_project_analysis.py +540 -0
  788. chia/util/ws_message.py +66 -0
  789. chia/wallet/__init__.py +0 -0
  790. chia/wallet/cat_wallet/__init__.py +0 -0
  791. chia/wallet/cat_wallet/cat_constants.py +75 -0
  792. chia/wallet/cat_wallet/cat_info.py +47 -0
  793. chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
  794. chia/wallet/cat_wallet/cat_utils.py +164 -0
  795. chia/wallet/cat_wallet/cat_wallet.py +855 -0
  796. chia/wallet/cat_wallet/dao_cat_info.py +28 -0
  797. chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
  798. chia/wallet/cat_wallet/lineage_store.py +74 -0
  799. chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
  800. chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
  801. chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
  802. chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
  803. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
  804. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
  805. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
  806. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
  807. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
  808. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
  809. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
  810. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
  811. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
  812. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
  813. chia/wallet/coin_selection.py +188 -0
  814. chia/wallet/conditions.py +1512 -0
  815. chia/wallet/dao_wallet/__init__.py +0 -0
  816. chia/wallet/dao_wallet/dao_info.py +61 -0
  817. chia/wallet/dao_wallet/dao_utils.py +811 -0
  818. chia/wallet/dao_wallet/dao_wallet.py +2119 -0
  819. chia/wallet/db_wallet/__init__.py +0 -0
  820. chia/wallet/db_wallet/db_wallet_puzzles.py +111 -0
  821. chia/wallet/derivation_record.py +30 -0
  822. chia/wallet/derive_keys.py +146 -0
  823. chia/wallet/did_wallet/__init__.py +0 -0
  824. chia/wallet/did_wallet/did_info.py +39 -0
  825. chia/wallet/did_wallet/did_wallet.py +1494 -0
  826. chia/wallet/did_wallet/did_wallet_puzzles.py +221 -0
  827. chia/wallet/did_wallet/puzzles/__init__.py +0 -0
  828. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
  829. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
  830. chia/wallet/driver_protocol.py +26 -0
  831. chia/wallet/key_val_store.py +55 -0
  832. chia/wallet/lineage_proof.py +58 -0
  833. chia/wallet/nft_wallet/__init__.py +0 -0
  834. chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
  835. chia/wallet/nft_wallet/nft_info.py +120 -0
  836. chia/wallet/nft_wallet/nft_puzzles.py +305 -0
  837. chia/wallet/nft_wallet/nft_wallet.py +1687 -0
  838. chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
  839. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  840. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
  841. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
  842. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
  843. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
  844. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
  845. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
  846. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
  847. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
  848. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
  849. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
  850. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
  851. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
  852. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
  853. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
  854. chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
  855. chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
  856. chia/wallet/nft_wallet/uncurry_nft.py +217 -0
  857. chia/wallet/notification_manager.py +117 -0
  858. chia/wallet/notification_store.py +178 -0
  859. chia/wallet/outer_puzzles.py +84 -0
  860. chia/wallet/payment.py +33 -0
  861. chia/wallet/puzzle_drivers.py +118 -0
  862. chia/wallet/puzzles/__init__.py +0 -0
  863. chia/wallet/puzzles/augmented_condition.clsp +13 -0
  864. chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
  865. chia/wallet/puzzles/clawback/__init__.py +0 -0
  866. chia/wallet/puzzles/clawback/drivers.py +188 -0
  867. chia/wallet/puzzles/clawback/metadata.py +38 -0
  868. chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
  869. chia/wallet/puzzles/condition_codes.clib +77 -0
  870. chia/wallet/puzzles/curry-and-treehash.clib +102 -0
  871. chia/wallet/puzzles/curry.clib +135 -0
  872. chia/wallet/puzzles/curry_by_index.clib +16 -0
  873. chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
  874. chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
  875. chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
  876. chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
  877. chia/wallet/puzzles/dao_finished_state.clsp +35 -0
  878. chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
  879. chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
  880. chia/wallet/puzzles/dao_lockup.clsp +288 -0
  881. chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
  882. chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
  883. chia/wallet/puzzles/dao_proposal.clsp +377 -0
  884. chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
  885. chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
  886. chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
  887. chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
  888. chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
  889. chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
  890. chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
  891. chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
  892. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
  893. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
  894. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
  895. chia/wallet/puzzles/dao_treasury.clsp +115 -0
  896. chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
  897. chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
  898. chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
  899. chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
  900. chia/wallet/puzzles/json.clib +25 -0
  901. chia/wallet/puzzles/load_clvm.py +161 -0
  902. chia/wallet/puzzles/merkle_utils.clib +18 -0
  903. chia/wallet/puzzles/notification.clsp +7 -0
  904. chia/wallet/puzzles/notification.clsp.hex +1 -0
  905. chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
  906. chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
  907. chia/wallet/puzzles/p2_conditions.clsp +3 -0
  908. chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
  909. chia/wallet/puzzles/p2_conditions.py +26 -0
  910. chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
  911. chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
  912. chia/wallet/puzzles/p2_delegated_conditions.py +21 -0
  913. chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
  914. chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
  915. chia/wallet/puzzles/p2_delegated_puzzle.py +34 -0
  916. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
  917. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
  918. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +160 -0
  919. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
  920. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
  921. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +21 -0
  922. chia/wallet/puzzles/p2_parent.clsp +19 -0
  923. chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
  924. chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
  925. chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
  926. chia/wallet/puzzles/p2_puzzle_hash.py +27 -0
  927. chia/wallet/puzzles/p2_singleton.clsp +30 -0
  928. chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
  929. chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
  930. chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
  931. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
  932. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
  933. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
  934. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
  935. chia/wallet/puzzles/puzzle_utils.py +34 -0
  936. chia/wallet/puzzles/settlement_payments.clsp +49 -0
  937. chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
  938. chia/wallet/puzzles/sha256tree.clib +11 -0
  939. chia/wallet/puzzles/singleton_launcher.clsp +16 -0
  940. chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
  941. chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
  942. chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
  943. chia/wallet/puzzles/singleton_top_layer.py +296 -0
  944. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
  945. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
  946. chia/wallet/puzzles/singleton_top_layer_v1_1.py +345 -0
  947. chia/wallet/puzzles/singleton_truths.clib +21 -0
  948. chia/wallet/puzzles/tails.py +348 -0
  949. chia/wallet/puzzles/utility_macros.clib +48 -0
  950. chia/wallet/signer_protocol.py +125 -0
  951. chia/wallet/singleton.py +106 -0
  952. chia/wallet/singleton_record.py +30 -0
  953. chia/wallet/trade_manager.py +1102 -0
  954. chia/wallet/trade_record.py +67 -0
  955. chia/wallet/trading/__init__.py +0 -0
  956. chia/wallet/trading/offer.py +702 -0
  957. chia/wallet/trading/trade_status.py +13 -0
  958. chia/wallet/trading/trade_store.py +526 -0
  959. chia/wallet/transaction_record.py +158 -0
  960. chia/wallet/transaction_sorting.py +14 -0
  961. chia/wallet/uncurried_puzzle.py +17 -0
  962. chia/wallet/util/__init__.py +0 -0
  963. chia/wallet/util/address_type.py +55 -0
  964. chia/wallet/util/blind_signer_tl.py +164 -0
  965. chia/wallet/util/clvm_streamable.py +203 -0
  966. chia/wallet/util/compute_hints.py +66 -0
  967. chia/wallet/util/compute_memos.py +43 -0
  968. chia/wallet/util/curry_and_treehash.py +91 -0
  969. chia/wallet/util/debug_spend_bundle.py +232 -0
  970. chia/wallet/util/merkle_tree.py +100 -0
  971. chia/wallet/util/merkle_utils.py +102 -0
  972. chia/wallet/util/new_peak_queue.py +82 -0
  973. chia/wallet/util/notifications.py +12 -0
  974. chia/wallet/util/peer_request_cache.py +174 -0
  975. chia/wallet/util/pprint.py +39 -0
  976. chia/wallet/util/puzzle_compression.py +95 -0
  977. chia/wallet/util/puzzle_decorator.py +100 -0
  978. chia/wallet/util/puzzle_decorator_type.py +7 -0
  979. chia/wallet/util/query_filter.py +59 -0
  980. chia/wallet/util/transaction_type.py +23 -0
  981. chia/wallet/util/tx_config.py +158 -0
  982. chia/wallet/util/wallet_sync_utils.py +351 -0
  983. chia/wallet/util/wallet_types.py +72 -0
  984. chia/wallet/vc_wallet/__init__.py +0 -0
  985. chia/wallet/vc_wallet/cr_cat_drivers.py +664 -0
  986. chia/wallet/vc_wallet/cr_cat_wallet.py +877 -0
  987. chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
  988. chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
  989. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
  990. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
  991. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
  992. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
  993. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
  994. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
  995. chia/wallet/vc_wallet/vc_drivers.py +838 -0
  996. chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
  997. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
  998. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
  999. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
  1000. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
  1001. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
  1002. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
  1003. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
  1004. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
  1005. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
  1006. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
  1007. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
  1008. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
  1009. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
  1010. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
  1011. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
  1012. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
  1013. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
  1014. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
  1015. chia/wallet/vc_wallet/vc_store.py +263 -0
  1016. chia/wallet/vc_wallet/vc_wallet.py +638 -0
  1017. chia/wallet/wallet.py +698 -0
  1018. chia/wallet/wallet_action_scope.py +96 -0
  1019. chia/wallet/wallet_blockchain.py +244 -0
  1020. chia/wallet/wallet_coin_record.py +72 -0
  1021. chia/wallet/wallet_coin_store.py +351 -0
  1022. chia/wallet/wallet_info.py +35 -0
  1023. chia/wallet/wallet_interested_store.py +188 -0
  1024. chia/wallet/wallet_nft_store.py +279 -0
  1025. chia/wallet/wallet_node.py +1765 -0
  1026. chia/wallet/wallet_node_api.py +207 -0
  1027. chia/wallet/wallet_pool_store.py +119 -0
  1028. chia/wallet/wallet_protocol.py +90 -0
  1029. chia/wallet/wallet_puzzle_store.py +396 -0
  1030. chia/wallet/wallet_retry_store.py +70 -0
  1031. chia/wallet/wallet_singleton_store.py +259 -0
  1032. chia/wallet/wallet_spend_bundle.py +25 -0
  1033. chia/wallet/wallet_state_manager.py +2819 -0
  1034. chia/wallet/wallet_transaction_store.py +496 -0
  1035. chia/wallet/wallet_user_store.py +110 -0
  1036. chia/wallet/wallet_weight_proof_handler.py +126 -0
  1037. chia_blockchain-2.5.1rc1.dist-info/LICENSE +201 -0
  1038. chia_blockchain-2.5.1rc1.dist-info/METADATA +156 -0
  1039. chia_blockchain-2.5.1rc1.dist-info/RECORD +1042 -0
  1040. chia_blockchain-2.5.1rc1.dist-info/WHEEL +4 -0
  1041. chia_blockchain-2.5.1rc1.dist-info/entry_points.txt +17 -0
  1042. mozilla-ca/cacert.pem +3611 -0
@@ -0,0 +1,959 @@
1
+ from __future__ import annotations
2
+
3
+ from datetime import datetime, timezone
4
+ from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
5
+
6
+ from chia.consensus.block_record import BlockRecord
7
+ from chia.consensus.blockchain import Blockchain, BlockchainMutexPriority
8
+ from chia.consensus.get_block_generator import get_block_generator
9
+ from chia.consensus.pos_quality import UI_ACTUAL_SPACE_CONSTANT_FACTOR
10
+ from chia.full_node.fee_estimator_interface import FeeEstimatorInterface
11
+ from chia.full_node.full_node import FullNode
12
+ from chia.full_node.mempool_check_conditions import (
13
+ get_puzzle_and_solution_for_coin,
14
+ get_spends_for_block,
15
+ get_spends_for_block_with_conditions,
16
+ )
17
+ from chia.rpc.rpc_server import Endpoint, EndpointResult
18
+ from chia.server.outbound_message import NodeType
19
+ from chia.types.blockchain_format.proof_of_space import calculate_prefix_bits
20
+ from chia.types.blockchain_format.sized_bytes import bytes32
21
+ from chia.types.coin_record import CoinRecord
22
+ from chia.types.coin_spend import CoinSpend
23
+ from chia.types.full_block import FullBlock
24
+ from chia.types.generator_types import BlockGenerator
25
+ from chia.types.mempool_inclusion_status import MempoolInclusionStatus
26
+ from chia.types.spend_bundle import SpendBundle
27
+ from chia.types.spend_bundle_conditions import SpendBundleConditions
28
+ from chia.types.unfinished_header_block import UnfinishedHeaderBlock
29
+ from chia.util.byte_types import hexstr_to_bytes
30
+ from chia.util.ints import uint32, uint64, uint128
31
+ from chia.util.log_exceptions import log_exceptions
32
+ from chia.util.math import make_monotonically_decreasing
33
+ from chia.util.ws_message import WsRpcMessage, create_payload_dict
34
+
35
+
36
+ def coin_record_dict_backwards_compat(coin_record: dict[str, Any]) -> dict[str, bool]:
37
+ coin_record["spent"] = coin_record["spent_block_index"] > 0
38
+ return coin_record
39
+
40
+
41
+ async def get_nearest_transaction_block(blockchain: Blockchain, block: BlockRecord) -> BlockRecord:
42
+ if block.is_transaction_block:
43
+ return block
44
+
45
+ prev_hash = blockchain.height_to_hash(block.prev_transaction_block_height)
46
+ # Genesis block is a transaction block, so theoretically `prev_hash` of all blocks
47
+ # other than genesis block cannot be `None`.
48
+ assert prev_hash
49
+
50
+ tb = await blockchain.get_block_record_from_db(prev_hash)
51
+ assert tb
52
+
53
+ return tb
54
+
55
+
56
+ async def get_average_block_time(
57
+ blockchain: Blockchain,
58
+ base_block: BlockRecord,
59
+ height_distance: int,
60
+ ) -> Optional[uint32]:
61
+ newer_block = await get_nearest_transaction_block(blockchain, base_block)
62
+ if newer_block.height < 1:
63
+ return None
64
+
65
+ prev_height = uint32(max(1, newer_block.height - height_distance))
66
+ prev_hash = blockchain.height_to_hash(prev_height)
67
+ assert prev_hash
68
+ prev_block = await blockchain.get_block_record_from_db(prev_hash)
69
+ assert prev_block
70
+
71
+ older_block = await get_nearest_transaction_block(blockchain, prev_block)
72
+
73
+ assert newer_block.timestamp is not None and older_block.timestamp is not None
74
+
75
+ if newer_block.height == older_block.height: # small chain not long enough to have a block in between
76
+ return None
77
+
78
+ average_block_time = uint32(
79
+ (newer_block.timestamp - older_block.timestamp) / (newer_block.height - older_block.height)
80
+ )
81
+ return average_block_time
82
+
83
+
84
+ class FullNodeRpcApi:
85
+ if TYPE_CHECKING:
86
+ from chia.rpc.rpc_server import RpcApiProtocol
87
+
88
+ _protocol_check: ClassVar[RpcApiProtocol] = cast("FullNodeRpcApi", None)
89
+
90
+ def __init__(self, service: FullNode) -> None:
91
+ self.service = service
92
+ self.service_name = "chia_full_node"
93
+ self.cached_blockchain_state: Optional[dict[str, Any]] = None
94
+
95
+ def get_routes(self) -> dict[str, Endpoint]:
96
+ return {
97
+ # Blockchain
98
+ "/get_blockchain_state": self.get_blockchain_state,
99
+ "/get_block": self.get_block,
100
+ "/get_blocks": self.get_blocks,
101
+ "/get_block_count_metrics": self.get_block_count_metrics,
102
+ "/get_block_record_by_height": self.get_block_record_by_height,
103
+ "/get_block_record": self.get_block_record,
104
+ "/get_block_records": self.get_block_records,
105
+ "/get_block_spends": self.get_block_spends,
106
+ "/get_block_spends_with_conditions": self.get_block_spends_with_conditions,
107
+ "/get_unfinished_block_headers": self.get_unfinished_block_headers,
108
+ "/get_network_space": self.get_network_space,
109
+ "/get_additions_and_removals": self.get_additions_and_removals,
110
+ "/get_aggsig_additional_data": self.get_aggsig_additional_data,
111
+ "/get_recent_signage_point_or_eos": self.get_recent_signage_point_or_eos,
112
+ # Coins
113
+ "/get_coin_records_by_puzzle_hash": self.get_coin_records_by_puzzle_hash,
114
+ "/get_coin_records_by_puzzle_hashes": self.get_coin_records_by_puzzle_hashes,
115
+ "/get_coin_record_by_name": self.get_coin_record_by_name,
116
+ "/get_coin_records_by_names": self.get_coin_records_by_names,
117
+ "/get_coin_records_by_parent_ids": self.get_coin_records_by_parent_ids,
118
+ "/get_coin_records_by_hint": self.get_coin_records_by_hint,
119
+ "/push_tx": self.push_tx,
120
+ "/get_puzzle_and_solution": self.get_puzzle_and_solution,
121
+ # Mempool
122
+ "/get_all_mempool_tx_ids": self.get_all_mempool_tx_ids,
123
+ "/get_all_mempool_items": self.get_all_mempool_items,
124
+ "/get_mempool_item_by_tx_id": self.get_mempool_item_by_tx_id,
125
+ "/get_mempool_items_by_coin_name": self.get_mempool_items_by_coin_name,
126
+ # Fee estimation
127
+ "/get_fee_estimate": self.get_fee_estimate,
128
+ }
129
+
130
+ async def _state_changed(self, change: str, change_data: Optional[dict[str, Any]] = None) -> list[WsRpcMessage]:
131
+ if change_data is None:
132
+ change_data = {}
133
+
134
+ payloads = []
135
+ if change in {"new_peak", "sync_mode"}:
136
+ data = await self.get_blockchain_state({})
137
+ assert data is not None
138
+ payloads.append(
139
+ create_payload_dict(
140
+ "get_blockchain_state",
141
+ data,
142
+ self.service_name,
143
+ "wallet_ui",
144
+ )
145
+ )
146
+ payloads.append(
147
+ create_payload_dict(
148
+ "get_blockchain_state",
149
+ data,
150
+ self.service_name,
151
+ "metrics",
152
+ )
153
+ )
154
+
155
+ if change in {"block", "signage_point"}:
156
+ payloads.append(create_payload_dict(change, change_data, self.service_name, "metrics"))
157
+
158
+ if change == "unfinished_block":
159
+ payloads.append(create_payload_dict(change, change_data, self.service_name, "unfinished_block_info"))
160
+
161
+ return payloads
162
+
163
+ async def get_blockchain_state(self, _: dict[str, Any]) -> EndpointResult:
164
+ """
165
+ Returns a summary of the node's view of the blockchain.
166
+ """
167
+ node_id = self.service.server.node_id.hex()
168
+ if self.service.initialized is False:
169
+ res = {
170
+ "blockchain_state": {
171
+ "peak": None,
172
+ "genesis_challenge_initialized": self.service.initialized,
173
+ "sync": {
174
+ "sync_mode": False,
175
+ "synced": False,
176
+ "sync_tip_height": 0,
177
+ "sync_progress_height": 0,
178
+ },
179
+ "difficulty": 0,
180
+ "sub_slot_iters": 0,
181
+ "space": 0,
182
+ "average_block_time": None,
183
+ "mempool_size": 0,
184
+ "mempool_cost": 0,
185
+ "mempool_min_fees": {
186
+ "cost_5000000": 0,
187
+ },
188
+ "mempool_max_total_cost": 0,
189
+ "block_max_cost": 0,
190
+ "node_id": node_id,
191
+ },
192
+ }
193
+ return res
194
+ peak: Optional[BlockRecord] = self.service.blockchain.get_peak()
195
+
196
+ if peak is not None and peak.height > 0:
197
+ difficulty = uint64(peak.weight - self.service.blockchain.block_record(peak.prev_hash).weight)
198
+ sub_slot_iters = peak.sub_slot_iters
199
+ else:
200
+ difficulty = self.service.constants.DIFFICULTY_STARTING
201
+ sub_slot_iters = self.service.constants.SUB_SLOT_ITERS_STARTING
202
+
203
+ sync_mode: bool = self.service.sync_store.get_sync_mode() or self.service.sync_store.get_long_sync()
204
+
205
+ sync_tip_height: Optional[uint32] = uint32(0)
206
+ if sync_mode:
207
+ target_peak = self.service.sync_store.target_peak
208
+ if target_peak is not None:
209
+ sync_tip_height = target_peak.height
210
+ if peak is not None:
211
+ sync_progress_height: uint32 = peak.height
212
+ # Don't display we're syncing towards 0, instead show 'Syncing height/height'
213
+ # until sync_store retrieves the correct number.
214
+ if sync_tip_height == uint32(0):
215
+ sync_tip_height = peak.height
216
+ else:
217
+ sync_progress_height = uint32(0)
218
+ else:
219
+ sync_progress_height = uint32(0)
220
+
221
+ average_block_time: Optional[uint32] = None
222
+ if peak is not None and peak.height > 1:
223
+ newer_block_hex = peak.header_hash.hex()
224
+ # Average over the last day
225
+ header_hash = self.service.blockchain.height_to_hash(uint32(max(1, peak.height - 4608)))
226
+ assert header_hash is not None
227
+ older_block_hex = header_hash.hex()
228
+ space = await self.get_network_space(
229
+ {"newer_block_header_hash": newer_block_hex, "older_block_header_hash": older_block_hex}
230
+ )
231
+ average_block_time = await get_average_block_time(self.service.blockchain, peak, 4608)
232
+ else:
233
+ space = {"space": uint128(0)}
234
+
235
+ if self.service.mempool_manager is not None:
236
+ mempool_size = self.service.mempool_manager.mempool.size()
237
+ mempool_cost = self.service.mempool_manager.mempool.total_mempool_cost()
238
+ mempool_fees = self.service.mempool_manager.mempool.total_mempool_fees()
239
+ mempool_min_fee_5m = self.service.mempool_manager.mempool.get_min_fee_rate(5000000)
240
+ mempool_max_total_cost = self.service.mempool_manager.mempool_max_total_cost
241
+ else:
242
+ mempool_size = 0
243
+ mempool_cost = 0
244
+ mempool_fees = 0
245
+ mempool_min_fee_5m = 0
246
+ mempool_max_total_cost = 0
247
+ if self.service.server is not None:
248
+ is_connected = len(self.service.server.get_connections(NodeType.FULL_NODE)) > 0 or "simulator" in str(
249
+ self.service.config.get("selected_network")
250
+ )
251
+ else:
252
+ is_connected = False
253
+ synced = await self.service.synced() and is_connected
254
+
255
+ assert space is not None
256
+ response = {
257
+ "blockchain_state": {
258
+ "peak": peak,
259
+ "genesis_challenge_initialized": self.service.initialized,
260
+ "sync": {
261
+ "sync_mode": sync_mode,
262
+ "synced": synced,
263
+ "sync_tip_height": sync_tip_height,
264
+ "sync_progress_height": sync_progress_height,
265
+ },
266
+ "difficulty": difficulty,
267
+ "sub_slot_iters": sub_slot_iters,
268
+ "space": space["space"],
269
+ "average_block_time": average_block_time,
270
+ "mempool_size": mempool_size,
271
+ "mempool_cost": mempool_cost,
272
+ "mempool_fees": mempool_fees,
273
+ "mempool_min_fees": {
274
+ # We may give estimates for varying costs in the future
275
+ # This Dict sets us up for that in the future
276
+ "cost_5000000": mempool_min_fee_5m,
277
+ },
278
+ "mempool_max_total_cost": mempool_max_total_cost,
279
+ "block_max_cost": self.service.constants.MAX_BLOCK_COST_CLVM,
280
+ "node_id": node_id,
281
+ },
282
+ }
283
+ self.cached_blockchain_state = dict(response["blockchain_state"])
284
+ return response
285
+
286
+ async def get_recent_signage_point_or_eos(self, request: dict[str, Any]) -> EndpointResult:
287
+ if "sp_hash" not in request:
288
+ challenge_hash: bytes32 = bytes32.from_hexstr(request["challenge_hash"])
289
+ # This is the case of getting an end of slot
290
+ eos_tuple = self.service.full_node_store.recent_eos.get(challenge_hash)
291
+ if not eos_tuple:
292
+ raise ValueError(f"Did not find eos {challenge_hash.hex()} in cache")
293
+ eos, time_received = eos_tuple
294
+
295
+ # If it's still in the full node store, it's not reverted
296
+ if self.service.full_node_store.get_sub_slot(eos.challenge_chain.get_hash()):
297
+ return {"eos": eos, "time_received": time_received, "reverted": False}
298
+
299
+ # Otherwise we can backtrack from peak to find it in the blockchain
300
+ curr: Optional[BlockRecord] = self.service.blockchain.get_peak()
301
+ if curr is None:
302
+ raise ValueError("No blocks in the chain")
303
+
304
+ number_of_slots_searched = 0
305
+ while number_of_slots_searched < 10:
306
+ if curr.first_in_sub_slot:
307
+ assert curr.finished_challenge_slot_hashes is not None
308
+ if curr.finished_challenge_slot_hashes[-1] == eos.challenge_chain.get_hash():
309
+ # Found this slot in the blockchain
310
+ return {"eos": eos, "time_received": time_received, "reverted": False}
311
+ number_of_slots_searched += len(curr.finished_challenge_slot_hashes)
312
+ curr = self.service.blockchain.try_block_record(curr.prev_hash)
313
+ if curr is None:
314
+ # Got to the beginning of the blockchain without finding the slot
315
+ return {"eos": eos, "time_received": time_received, "reverted": True}
316
+
317
+ # Backtracked through 10 slots but still did not find it
318
+ return {"eos": eos, "time_received": time_received, "reverted": True}
319
+
320
+ # Now we handle the case of getting a signage point
321
+ sp_hash: bytes32 = bytes32.from_hexstr(request["sp_hash"])
322
+ sp_tuple = self.service.full_node_store.recent_signage_points.get(sp_hash)
323
+ if sp_tuple is None:
324
+ raise ValueError(f"Did not find sp {sp_hash.hex()} in cache")
325
+
326
+ sp, time_received = sp_tuple
327
+ assert sp.rc_vdf is not None, "Not an EOS, the signage point rewards chain VDF must not be None"
328
+ assert sp.cc_vdf is not None, "Not an EOS, the signage point challenge chain VDF must not be None"
329
+
330
+ # If it's still in the full node store, it's not reverted
331
+ if self.service.full_node_store.get_signage_point(sp_hash):
332
+ return {"signage_point": sp, "time_received": time_received, "reverted": False}
333
+
334
+ # Otherwise we can backtrack from peak to find it in the blockchain
335
+ rc_challenge: bytes32 = sp.rc_vdf.challenge
336
+ next_b: Optional[BlockRecord] = None
337
+ curr_b_optional: Optional[BlockRecord] = self.service.blockchain.get_peak()
338
+ assert curr_b_optional is not None
339
+ curr_b: BlockRecord = curr_b_optional
340
+
341
+ for _ in range(200):
342
+ sp_total_iters = sp.cc_vdf.number_of_iterations + curr_b.ip_sub_slot_total_iters(self.service.constants)
343
+ if curr_b.reward_infusion_new_challenge == rc_challenge:
344
+ if next_b is None:
345
+ return {"signage_point": sp, "time_received": time_received, "reverted": False}
346
+ next_b_total_iters = next_b.ip_sub_slot_total_iters(self.service.constants) + next_b.ip_iters(
347
+ self.service.constants
348
+ )
349
+
350
+ return {
351
+ "signage_point": sp,
352
+ "time_received": time_received,
353
+ "reverted": sp_total_iters > next_b_total_iters,
354
+ }
355
+ if curr_b.finished_reward_slot_hashes is not None:
356
+ assert curr_b.finished_challenge_slot_hashes is not None
357
+ for eos_rc in curr_b.finished_challenge_slot_hashes:
358
+ if eos_rc == rc_challenge:
359
+ if next_b is None:
360
+ return {"signage_point": sp, "time_received": time_received, "reverted": False}
361
+ next_b_total_iters = next_b.ip_sub_slot_total_iters(self.service.constants) + next_b.ip_iters(
362
+ self.service.constants
363
+ )
364
+ return {
365
+ "signage_point": sp,
366
+ "time_received": time_received,
367
+ "reverted": sp_total_iters > next_b_total_iters,
368
+ }
369
+ next_b = curr_b
370
+ curr_b_optional = self.service.blockchain.try_block_record(curr_b.prev_hash)
371
+ if curr_b_optional is None:
372
+ break
373
+ curr_b = curr_b_optional
374
+
375
+ return {"signage_point": sp, "time_received": time_received, "reverted": True}
376
+
377
+ async def get_block(self, request: dict[str, Any]) -> EndpointResult:
378
+ if "header_hash" not in request:
379
+ raise ValueError("No header_hash in request")
380
+ header_hash = bytes32.from_hexstr(request["header_hash"])
381
+
382
+ block: Optional[FullBlock] = await self.service.block_store.get_full_block(header_hash)
383
+ if block is None:
384
+ raise ValueError(f"Block {header_hash.hex()} not found")
385
+
386
+ return {"block": block}
387
+
388
+ async def get_blocks(self, request: dict[str, Any]) -> EndpointResult:
389
+ if "start" not in request:
390
+ raise ValueError("No start in request")
391
+ if "end" not in request:
392
+ raise ValueError("No end in request")
393
+ exclude_hh = False
394
+ if "exclude_header_hash" in request:
395
+ exclude_hh = request["exclude_header_hash"]
396
+ exclude_reorged = False
397
+ if "exclude_reorged" in request:
398
+ exclude_reorged = request["exclude_reorged"]
399
+
400
+ start = int(request["start"])
401
+ end = int(request["end"])
402
+ block_range = []
403
+ for a in range(start, end):
404
+ block_range.append(uint32(a))
405
+ blocks: list[FullBlock] = await self.service.block_store.get_full_blocks_at(block_range)
406
+ json_blocks = []
407
+ for block in blocks:
408
+ hh: bytes32 = block.header_hash
409
+ if exclude_reorged and self.service.blockchain.height_to_hash(block.height) != hh:
410
+ # Don't include forked (reorged) blocks
411
+ continue
412
+ json = block.to_json_dict()
413
+ if not exclude_hh:
414
+ json["header_hash"] = hh.hex()
415
+ json_blocks.append(json)
416
+ return {"blocks": json_blocks}
417
+
418
+ async def get_block_count_metrics(self, _: dict[str, Any]) -> EndpointResult:
419
+ compact_blocks = 0
420
+ uncompact_blocks = 0
421
+ with log_exceptions(self.service.log, consume=True):
422
+ compact_blocks = await self.service.block_store.count_compactified_blocks()
423
+ uncompact_blocks = await self.service.block_store.count_uncompactified_blocks()
424
+
425
+ hint_count = 0
426
+ if self.service.hint_store is not None:
427
+ with log_exceptions(self.service.log, consume=True):
428
+ hint_count = await self.service.hint_store.count_hints()
429
+
430
+ return {
431
+ "metrics": {
432
+ "compact_blocks": compact_blocks,
433
+ "uncompact_blocks": uncompact_blocks,
434
+ "hint_count": hint_count,
435
+ }
436
+ }
437
+
438
+ async def get_block_records(self, request: dict[str, Any]) -> EndpointResult:
439
+ if "start" not in request:
440
+ raise ValueError("No start in request")
441
+ if "end" not in request:
442
+ raise ValueError("No end in request")
443
+
444
+ start = int(request["start"])
445
+ end = int(request["end"])
446
+ records = []
447
+ peak_height = self.service.blockchain.get_peak_height()
448
+ if peak_height is None:
449
+ raise ValueError("Peak is None")
450
+
451
+ for a in range(start, end):
452
+ if peak_height < uint32(a):
453
+ self.service.log.warning("requested block is higher than known peak ")
454
+ break
455
+ header_hash: Optional[bytes32] = self.service.blockchain.height_to_hash(uint32(a))
456
+ if header_hash is None:
457
+ raise ValueError(f"Height not in blockchain: {a}")
458
+ record: Optional[BlockRecord] = self.service.blockchain.try_block_record(header_hash)
459
+ if record is None:
460
+ # Fetch from DB
461
+ record = await self.service.blockchain.block_store.get_block_record(header_hash)
462
+ if record is None:
463
+ raise ValueError(f"Block {header_hash.hex()} does not exist")
464
+
465
+ records.append(record)
466
+ return {"block_records": records}
467
+
468
+ async def get_block_spends(self, request: dict[str, Any]) -> EndpointResult:
469
+ if "header_hash" not in request:
470
+ raise ValueError("No header_hash in request")
471
+ header_hash = bytes32.from_hexstr(request["header_hash"])
472
+ full_block: Optional[FullBlock] = await self.service.block_store.get_full_block(header_hash)
473
+ if full_block is None:
474
+ raise ValueError(f"Block {header_hash.hex()} not found")
475
+
476
+ spends: list[CoinSpend] = []
477
+ block_generator = await get_block_generator(self.service.blockchain.lookup_block_generators, full_block)
478
+ if block_generator is None: # if block is not a transaction block.
479
+ return {"block_spends": spends}
480
+
481
+ spends = get_spends_for_block(block_generator, full_block.height, self.service.constants)
482
+
483
+ return {"block_spends": spends}
484
+
485
+ async def get_block_spends_with_conditions(self, request: dict[str, Any]) -> EndpointResult:
486
+ if "header_hash" not in request:
487
+ raise ValueError("No header_hash in request")
488
+ header_hash = bytes32.from_hexstr(request["header_hash"])
489
+ full_block: Optional[FullBlock] = await self.service.block_store.get_full_block(header_hash)
490
+ if full_block is None:
491
+ raise ValueError(f"Block {header_hash.hex()} not found")
492
+
493
+ block_generator = await get_block_generator(self.service.blockchain.lookup_block_generators, full_block)
494
+ if block_generator is None: # if block is not a transaction block.
495
+ return {"block_spends_with_conditions": []}
496
+
497
+ spends_with_conditions = get_spends_for_block_with_conditions(
498
+ block_generator, full_block.height, self.service.constants
499
+ )
500
+
501
+ return {
502
+ "block_spends_with_conditions": [
503
+ {
504
+ "coin_spend": spend_with_conditions.coin_spend,
505
+ "conditions": [
506
+ {"opcode": condition.opcode, "vars": [var.hex() for var in condition.vars]}
507
+ for condition in spend_with_conditions.conditions
508
+ ],
509
+ }
510
+ for spend_with_conditions in spends_with_conditions
511
+ ]
512
+ }
513
+
514
+ async def get_block_record_by_height(self, request: dict[str, Any]) -> EndpointResult:
515
+ if "height" not in request:
516
+ raise ValueError("No height in request")
517
+ height = request["height"]
518
+ header_height = uint32(int(height))
519
+ peak_height = self.service.blockchain.get_peak_height()
520
+ if peak_height is None or header_height > peak_height:
521
+ raise ValueError(f"Block height {height} not found in chain")
522
+ header_hash: Optional[bytes32] = self.service.blockchain.height_to_hash(header_height)
523
+ if header_hash is None:
524
+ raise ValueError(f"Block hash {height} not found in chain")
525
+ record: Optional[BlockRecord] = self.service.blockchain.try_block_record(header_hash)
526
+ if record is None:
527
+ # Fetch from DB
528
+ record = await self.service.blockchain.block_store.get_block_record(header_hash)
529
+ if record is None:
530
+ raise ValueError(f"Block {header_hash} does not exist")
531
+ return {"block_record": record}
532
+
533
+ async def get_block_record(self, request: dict[str, Any]) -> EndpointResult:
534
+ if "header_hash" not in request:
535
+ raise ValueError("header_hash not in request")
536
+ header_hash_str = request["header_hash"]
537
+ header_hash = bytes32.from_hexstr(header_hash_str)
538
+ record: Optional[BlockRecord] = self.service.blockchain.try_block_record(header_hash)
539
+ if record is None:
540
+ # Fetch from DB
541
+ record = await self.service.blockchain.block_store.get_block_record(header_hash)
542
+ if record is None:
543
+ raise ValueError(f"Block {header_hash.hex()} does not exist")
544
+
545
+ return {"block_record": record}
546
+
547
+ async def get_unfinished_block_headers(self, _request: dict[str, Any]) -> EndpointResult:
548
+ peak: Optional[BlockRecord] = self.service.blockchain.get_peak()
549
+ if peak is None:
550
+ return {"headers": []}
551
+
552
+ response_headers: list[UnfinishedHeaderBlock] = []
553
+ for block in self.service.full_node_store.get_unfinished_blocks(peak.height):
554
+ unfinished_header_block = UnfinishedHeaderBlock(
555
+ block.finished_sub_slots,
556
+ block.reward_chain_block,
557
+ block.challenge_chain_sp_proof,
558
+ block.reward_chain_sp_proof,
559
+ block.foliage,
560
+ block.foliage_transaction_block,
561
+ b"",
562
+ )
563
+ response_headers.append(unfinished_header_block)
564
+ return {"headers": response_headers}
565
+
566
+ async def get_network_space(self, request: dict[str, Any]) -> EndpointResult:
567
+ """
568
+ Retrieves an estimate of total space validating the chain
569
+ between two block header hashes.
570
+ """
571
+ if "newer_block_header_hash" not in request or "older_block_header_hash" not in request:
572
+ raise ValueError("Invalid request. newer_block_header_hash and older_block_header_hash required")
573
+ newer_block_hex = request["newer_block_header_hash"]
574
+ older_block_hex = request["older_block_header_hash"]
575
+
576
+ if newer_block_hex == older_block_hex:
577
+ raise ValueError("New and old must not be the same")
578
+
579
+ newer_block_bytes = bytes32.from_hexstr(newer_block_hex)
580
+ older_block_bytes = bytes32.from_hexstr(older_block_hex)
581
+
582
+ newer_block = await self.service.block_store.get_block_record(newer_block_bytes)
583
+ if newer_block is None:
584
+ # It's possible that the peak block has not yet been committed to the DB, so as a fallback, check memory
585
+ try:
586
+ newer_block = self.service.blockchain.block_record(newer_block_bytes)
587
+ except KeyError:
588
+ raise ValueError(f"Newer block {newer_block_hex} not found")
589
+ older_block = await self.service.block_store.get_block_record(older_block_bytes)
590
+ if older_block is None:
591
+ raise ValueError(f"Older block {older_block_hex} not found")
592
+ delta_weight = newer_block.weight - older_block.weight
593
+
594
+ plot_filter_size = calculate_prefix_bits(self.service.constants, newer_block.height)
595
+ delta_iters = newer_block.total_iters - older_block.total_iters
596
+ weight_div_iters = delta_weight / delta_iters
597
+ additional_difficulty_constant = self.service.constants.DIFFICULTY_CONSTANT_FACTOR
598
+ eligible_plots_filter_multiplier = 2**plot_filter_size
599
+ network_space_bytes_estimate = (
600
+ UI_ACTUAL_SPACE_CONSTANT_FACTOR
601
+ * weight_div_iters
602
+ * additional_difficulty_constant
603
+ * eligible_plots_filter_multiplier
604
+ )
605
+ return {"space": uint128(int(network_space_bytes_estimate))}
606
+
607
+ async def get_coin_records_by_puzzle_hash(self, request: dict[str, Any]) -> EndpointResult:
608
+ """
609
+ Retrieves the coins for a given puzzlehash, by default returns unspent coins.
610
+ """
611
+ if "puzzle_hash" not in request:
612
+ raise ValueError("Puzzle hash not in request")
613
+ kwargs: dict[str, Any] = {"include_spent_coins": False, "puzzle_hash": hexstr_to_bytes(request["puzzle_hash"])}
614
+ if "start_height" in request:
615
+ kwargs["start_height"] = uint32(request["start_height"])
616
+ if "end_height" in request:
617
+ kwargs["end_height"] = uint32(request["end_height"])
618
+
619
+ if "include_spent_coins" in request:
620
+ kwargs["include_spent_coins"] = request["include_spent_coins"]
621
+
622
+ coin_records = await self.service.blockchain.coin_store.get_coin_records_by_puzzle_hash(**kwargs)
623
+
624
+ return {"coin_records": [coin_record_dict_backwards_compat(cr.to_json_dict()) for cr in coin_records]}
625
+
626
+ async def get_coin_records_by_puzzle_hashes(self, request: dict[str, Any]) -> EndpointResult:
627
+ """
628
+ Retrieves the coins for a given puzzlehash, by default returns unspent coins.
629
+ """
630
+ if "puzzle_hashes" not in request:
631
+ raise ValueError("Puzzle hashes not in request")
632
+ kwargs: dict[str, Any] = {
633
+ "include_spent_coins": False,
634
+ "puzzle_hashes": [hexstr_to_bytes(ph) for ph in request["puzzle_hashes"]],
635
+ }
636
+ if "start_height" in request:
637
+ kwargs["start_height"] = uint32(request["start_height"])
638
+ if "end_height" in request:
639
+ kwargs["end_height"] = uint32(request["end_height"])
640
+
641
+ if "include_spent_coins" in request:
642
+ kwargs["include_spent_coins"] = request["include_spent_coins"]
643
+
644
+ coin_records = await self.service.blockchain.coin_store.get_coin_records_by_puzzle_hashes(**kwargs)
645
+
646
+ return {"coin_records": [coin_record_dict_backwards_compat(cr.to_json_dict()) for cr in coin_records]}
647
+
648
+ async def get_coin_record_by_name(self, request: dict[str, Any]) -> EndpointResult:
649
+ """
650
+ Retrieves a coin record by its name.
651
+ """
652
+ if "name" not in request:
653
+ raise ValueError("Name not in request")
654
+ name = bytes32.from_hexstr(request["name"])
655
+
656
+ coin_record: Optional[CoinRecord] = await self.service.blockchain.coin_store.get_coin_record(name)
657
+ if coin_record is None:
658
+ raise ValueError(f"Coin record 0x{name.hex()} not found")
659
+
660
+ return {"coin_record": coin_record_dict_backwards_compat(coin_record.to_json_dict())}
661
+
662
+ async def get_coin_records_by_names(self, request: dict[str, Any]) -> EndpointResult:
663
+ """
664
+ Retrieves the coins for given coin IDs, by default returns unspent coins.
665
+ """
666
+ if "names" not in request:
667
+ raise ValueError("Names not in request")
668
+ kwargs: dict[str, Any] = {
669
+ "include_spent_coins": False,
670
+ "names": [hexstr_to_bytes(name) for name in request["names"]],
671
+ }
672
+ if "start_height" in request:
673
+ kwargs["start_height"] = uint32(request["start_height"])
674
+ if "end_height" in request:
675
+ kwargs["end_height"] = uint32(request["end_height"])
676
+
677
+ if "include_spent_coins" in request:
678
+ kwargs["include_spent_coins"] = request["include_spent_coins"]
679
+
680
+ coin_records = await self.service.blockchain.coin_store.get_coin_records_by_names(**kwargs)
681
+
682
+ return {"coin_records": [coin_record_dict_backwards_compat(cr.to_json_dict()) for cr in coin_records]}
683
+
684
+ async def get_coin_records_by_parent_ids(self, request: dict[str, Any]) -> EndpointResult:
685
+ """
686
+ Retrieves the coins for given parent coin IDs, by default returns unspent coins.
687
+ """
688
+ if "parent_ids" not in request:
689
+ raise ValueError("Parent IDs not in request")
690
+ kwargs: dict[str, Any] = {
691
+ "include_spent_coins": False,
692
+ "parent_ids": [hexstr_to_bytes(ph) for ph in request["parent_ids"]],
693
+ }
694
+ if "start_height" in request:
695
+ kwargs["start_height"] = uint32(request["start_height"])
696
+ if "end_height" in request:
697
+ kwargs["end_height"] = uint32(request["end_height"])
698
+
699
+ if "include_spent_coins" in request:
700
+ kwargs["include_spent_coins"] = request["include_spent_coins"]
701
+
702
+ coin_records = await self.service.blockchain.coin_store.get_coin_records_by_parent_ids(**kwargs)
703
+
704
+ return {"coin_records": [coin_record_dict_backwards_compat(cr.to_json_dict()) for cr in coin_records]}
705
+
706
+ async def get_coin_records_by_hint(self, request: dict[str, Any]) -> EndpointResult:
707
+ """
708
+ Retrieves coins by hint, by default returns unspent coins.
709
+ """
710
+ if "hint" not in request:
711
+ raise ValueError("Hint not in request")
712
+
713
+ if self.service.hint_store is None:
714
+ return {"coin_records": []}
715
+
716
+ names: list[bytes32] = await self.service.hint_store.get_coin_ids(bytes32.from_hexstr(request["hint"]))
717
+
718
+ kwargs: dict[str, Any] = {
719
+ "include_spent_coins": False,
720
+ "names": names,
721
+ }
722
+
723
+ if "start_height" in request:
724
+ kwargs["start_height"] = uint32(request["start_height"])
725
+ if "end_height" in request:
726
+ kwargs["end_height"] = uint32(request["end_height"])
727
+
728
+ if "include_spent_coins" in request:
729
+ kwargs["include_spent_coins"] = request["include_spent_coins"]
730
+
731
+ coin_records = await self.service.blockchain.coin_store.get_coin_records_by_names(**kwargs)
732
+
733
+ return {"coin_records": [coin_record_dict_backwards_compat(cr.to_json_dict()) for cr in coin_records]}
734
+
735
+ async def push_tx(self, request: dict[str, Any]) -> EndpointResult:
736
+ if "spend_bundle" not in request:
737
+ raise ValueError("Spend bundle not in request")
738
+
739
+ spend_bundle: SpendBundle = SpendBundle.from_json_dict(request["spend_bundle"])
740
+ spend_name = spend_bundle.name()
741
+
742
+ if self.service.mempool_manager.get_spendbundle(spend_name) is not None:
743
+ status = MempoolInclusionStatus.SUCCESS
744
+ error = None
745
+ else:
746
+ status, error = await self.service.add_transaction(spend_bundle, spend_name)
747
+ if status != MempoolInclusionStatus.SUCCESS:
748
+ if self.service.mempool_manager.get_spendbundle(spend_name) is not None:
749
+ # Already in mempool
750
+ status = MempoolInclusionStatus.SUCCESS
751
+ error = None
752
+
753
+ if status == MempoolInclusionStatus.FAILED:
754
+ assert error is not None
755
+ raise ValueError(f"Failed to include transaction {spend_name}, error {error.name}")
756
+ return {
757
+ "status": status.name,
758
+ }
759
+
760
+ async def get_puzzle_and_solution(self, request: dict[str, Any]) -> EndpointResult:
761
+ coin_name: bytes32 = bytes32.from_hexstr(request["coin_id"])
762
+ height = request["height"]
763
+ coin_record = await self.service.coin_store.get_coin_record(coin_name)
764
+ if coin_record is None or not coin_record.spent or coin_record.spent_block_index != height:
765
+ raise ValueError(f"Invalid height {height}. coin record {coin_record}")
766
+
767
+ header_hash = self.service.blockchain.height_to_hash(height)
768
+ assert header_hash is not None
769
+ block: Optional[FullBlock] = await self.service.block_store.get_full_block(header_hash)
770
+
771
+ if block is None or block.transactions_generator is None:
772
+ raise ValueError("Invalid block or block generator")
773
+
774
+ block_generator: Optional[BlockGenerator] = await get_block_generator(
775
+ self.service.blockchain.lookup_block_generators, block
776
+ )
777
+ assert block_generator is not None
778
+
779
+ spend_info = get_puzzle_and_solution_for_coin(
780
+ block_generator, coin_record.coin, block.height, self.service.constants
781
+ )
782
+ return {"coin_solution": CoinSpend(coin_record.coin, spend_info.puzzle, spend_info.solution)}
783
+
784
+ async def get_additions_and_removals(self, request: dict[str, Any]) -> EndpointResult:
785
+ if "header_hash" not in request:
786
+ raise ValueError("No header_hash in request")
787
+ header_hash = bytes32.from_hexstr(request["header_hash"])
788
+
789
+ block: Optional[FullBlock] = await self.service.block_store.get_full_block(header_hash)
790
+ if block is None:
791
+ raise ValueError(f"Block {header_hash.hex()} not found")
792
+
793
+ async with self.service.blockchain.priority_mutex.acquire(priority=BlockchainMutexPriority.low):
794
+ if self.service.blockchain.height_to_hash(block.height) != header_hash:
795
+ raise ValueError(f"Block at {header_hash.hex()} is no longer in the blockchain (it's in a fork)")
796
+ additions: list[CoinRecord] = await self.service.coin_store.get_coins_added_at_height(block.height)
797
+ removals: list[CoinRecord] = await self.service.coin_store.get_coins_removed_at_height(block.height)
798
+
799
+ return {
800
+ "additions": [coin_record_dict_backwards_compat(cr.to_json_dict()) for cr in additions],
801
+ "removals": [coin_record_dict_backwards_compat(cr.to_json_dict()) for cr in removals],
802
+ }
803
+
804
+ async def get_aggsig_additional_data(self, _: dict[str, Any]) -> EndpointResult:
805
+ return {"additional_data": self.service.constants.AGG_SIG_ME_ADDITIONAL_DATA.hex()}
806
+
807
+ async def get_all_mempool_tx_ids(self, _: dict[str, Any]) -> EndpointResult:
808
+ ids = list(self.service.mempool_manager.mempool.all_item_ids())
809
+ return {"tx_ids": ids}
810
+
811
+ async def get_all_mempool_items(self, _: dict[str, Any]) -> EndpointResult:
812
+ spends = {}
813
+ for item in self.service.mempool_manager.mempool.all_items():
814
+ spends[item.name.hex()] = item.to_json_dict()
815
+ return {"mempool_items": spends}
816
+
817
+ async def get_mempool_item_by_tx_id(self, request: dict[str, Any]) -> EndpointResult:
818
+ if "tx_id" not in request:
819
+ raise ValueError("No tx_id in request")
820
+ include_pending: bool = request.get("include_pending", False)
821
+ tx_id: bytes32 = bytes32.from_hexstr(request["tx_id"])
822
+
823
+ item = self.service.mempool_manager.get_mempool_item(tx_id, include_pending)
824
+ if item is None:
825
+ raise ValueError(f"Tx id 0x{tx_id.hex()} not in the mempool")
826
+
827
+ return {"mempool_item": item.to_json_dict()}
828
+
829
+ async def get_mempool_items_by_coin_name(self, request: dict[str, Any]) -> EndpointResult:
830
+ if "coin_name" not in request:
831
+ raise ValueError("No coin_name in request")
832
+
833
+ coin_name: bytes32 = bytes32.from_hexstr(request["coin_name"])
834
+ items = self.service.mempool_manager.mempool.get_items_by_coin_id(coin_name)
835
+
836
+ return {"mempool_items": [item.to_json_dict() for item in items]}
837
+
838
+ def _get_spendbundle_type_cost(self, name: str) -> uint64:
839
+ """
840
+ This is a stopgap until we modify the wallet RPCs to get exact costs for created SpendBundles
841
+ before we send them to the Mempool.
842
+ """
843
+
844
+ tx_cost_estimates = {
845
+ "send_xch_transaction": 9_401_710,
846
+ "cat_spend": 36_382_111,
847
+ "take_offer": 721_393_265,
848
+ "cancel_offer": 212_443_993,
849
+ "nft_set_nft_did": 115_540_006,
850
+ "nft_transfer_nft": 74_385_541, # burn or transfer
851
+ "create_new_pool_wallet": 18_055_407,
852
+ "pw_absorb_rewards": 82_668_466,
853
+ "create_new_did_wallet": 57_360_396,
854
+ }
855
+ return uint64(tx_cost_estimates[name])
856
+
857
+ async def _validate_fee_estimate_cost(self, request: dict[str, Any]) -> uint64:
858
+ c = 0
859
+ ns = ["spend_bundle", "cost", "spend_type"]
860
+ for n in ns:
861
+ if n in request:
862
+ c += 1
863
+ if c != 1:
864
+ raise ValueError(f"Request must contain exactly one of {ns}")
865
+
866
+ if "spend_bundle" in request:
867
+ spend_bundle = SpendBundle.from_json_dict(request["spend_bundle"])
868
+ conds: SpendBundleConditions = await self.service.mempool_manager.pre_validate_spendbundle(spend_bundle)
869
+ cost = conds.cost
870
+ elif "cost" in request:
871
+ cost = request["cost"]
872
+ else:
873
+ cost = self._get_spendbundle_type_cost(request["spend_type"])
874
+ cost *= request.get("spend_count", 1)
875
+ return uint64(cost)
876
+
877
+ def _validate_target_times(self, request: dict[str, Any]) -> None:
878
+ if "target_times" not in request:
879
+ raise ValueError("Request must contain 'target_times' array")
880
+ if any(t < 0 for t in request["target_times"]):
881
+ raise ValueError("'target_times' array members must be non-negative")
882
+
883
+ async def get_fee_estimate(self, request: dict[str, Any]) -> dict[str, Any]:
884
+ self._validate_target_times(request)
885
+ spend_cost = await self._validate_fee_estimate_cost(request)
886
+
887
+ target_times: list[int] = request["target_times"]
888
+ estimator: FeeEstimatorInterface = self.service.mempool_manager.mempool.fee_estimator
889
+ target_times.sort()
890
+ estimates = [
891
+ estimator.estimate_fee_rate(time_offset_seconds=time).mojos_per_clvm_cost * spend_cost
892
+ for time in target_times
893
+ ]
894
+ # The Bitcoin Fee Estimator works by observing the most common fee rates that appear
895
+ # at set times into the future. This can lead to situations that users do not expect,
896
+ # such as estimating a higher fee for a longer transaction time.
897
+ estimates = make_monotonically_decreasing(estimates)
898
+ estimates = [uint64(e) for e in estimates]
899
+ current_fee_rate = estimator.estimate_fee_rate(time_offset_seconds=1)
900
+ mempool_size = self.service.mempool_manager.mempool.total_mempool_cost()
901
+ mempool_fees = self.service.mempool_manager.mempool.total_mempool_fees()
902
+ num_mempool_spends = self.service.mempool_manager.mempool.size()
903
+ mempool_max_size = estimator.mempool_max_size()
904
+ blockchain_state = await self.get_blockchain_state({})
905
+ synced = blockchain_state["blockchain_state"]["sync"]["synced"]
906
+ peak = blockchain_state["blockchain_state"]["peak"]
907
+
908
+ if peak is None:
909
+ peak_height = uint32(0)
910
+ last_peak_timestamp = uint64(0)
911
+ last_block_cost = 0
912
+ fee_rate_last_block = 0.0
913
+ last_tx_block_fees = uint64(0)
914
+ last_tx_block_height = 0
915
+ else:
916
+ peak_height = peak.height
917
+ last_peak_timestamp = peak.timestamp
918
+ peak_with_timestamp = peak_height # Last transaction block height
919
+ last_tx_block = self.service.blockchain.height_to_block_record(peak_with_timestamp)
920
+ while last_tx_block is None or last_peak_timestamp is None:
921
+ peak_with_timestamp -= 1
922
+ last_tx_block = self.service.blockchain.height_to_block_record(peak_with_timestamp)
923
+ last_peak_timestamp = last_tx_block.timestamp
924
+
925
+ assert last_tx_block is not None # mypy
926
+ assert last_peak_timestamp is not None # mypy
927
+ assert last_tx_block.fees is not None # mypy
928
+
929
+ record = await self.service.blockchain.block_store.get_full_block(last_tx_block.header_hash)
930
+
931
+ last_block_cost = 0
932
+ fee_rate_last_block = 0.0
933
+ if record and record.transactions_info and record.transactions_info.cost > 0:
934
+ last_block_cost = record.transactions_info.cost
935
+ fee_rate_last_block = record.transactions_info.fees / record.transactions_info.cost
936
+ last_tx_block_fees = last_tx_block.fees
937
+ last_tx_block_height = last_tx_block.height
938
+
939
+ dt = datetime.now(timezone.utc)
940
+ utc_time = dt.replace(tzinfo=timezone.utc)
941
+ utc_timestamp = utc_time.timestamp()
942
+
943
+ return {
944
+ "estimates": estimates,
945
+ "target_times": target_times,
946
+ "current_fee_rate": current_fee_rate.mojos_per_clvm_cost,
947
+ "mempool_size": mempool_size,
948
+ "mempool_fees": mempool_fees,
949
+ "num_spends": num_mempool_spends,
950
+ "mempool_max_size": mempool_max_size,
951
+ "full_node_synced": synced,
952
+ "peak_height": peak_height,
953
+ "last_peak_timestamp": last_peak_timestamp,
954
+ "node_time_utc": int(utc_timestamp),
955
+ "last_block_cost": last_block_cost,
956
+ "fees_last_block": last_tx_block_fees,
957
+ "fee_rate_last_block": fee_rate_last_block,
958
+ "last_tx_block_height": last_tx_block_height,
959
+ }