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