chia-blockchain 2.5.1rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1042) hide show
  1. chia/__init__.py +10 -0
  2. chia/__main__.py +5 -0
  3. chia/_tests/README.md +53 -0
  4. chia/_tests/__init__.py +0 -0
  5. chia/_tests/blockchain/__init__.py +0 -0
  6. chia/_tests/blockchain/blockchain_test_utils.py +195 -0
  7. chia/_tests/blockchain/config.py +4 -0
  8. chia/_tests/blockchain/test_augmented_chain.py +145 -0
  9. chia/_tests/blockchain/test_blockchain.py +4202 -0
  10. chia/_tests/blockchain/test_blockchain_transactions.py +1031 -0
  11. chia/_tests/blockchain/test_build_chains.py +59 -0
  12. chia/_tests/blockchain/test_get_block_generator.py +72 -0
  13. chia/_tests/blockchain/test_lookup_fork_chain.py +194 -0
  14. chia/_tests/build-init-files.py +92 -0
  15. chia/_tests/build-job-matrix.py +204 -0
  16. chia/_tests/check_pytest_monitor_output.py +34 -0
  17. chia/_tests/check_sql_statements.py +72 -0
  18. chia/_tests/chia-start-sim +42 -0
  19. chia/_tests/clvm/__init__.py +0 -0
  20. chia/_tests/clvm/benchmark_costs.py +23 -0
  21. chia/_tests/clvm/coin_store.py +149 -0
  22. chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
  23. chia/_tests/clvm/test_clvm_step.py +37 -0
  24. chia/_tests/clvm/test_condition_codes.py +13 -0
  25. chia/_tests/clvm/test_curry_and_treehash.py +55 -0
  26. chia/_tests/clvm/test_message_conditions.py +184 -0
  27. chia/_tests/clvm/test_program.py +150 -0
  28. chia/_tests/clvm/test_puzzle_compression.py +143 -0
  29. chia/_tests/clvm/test_puzzle_drivers.py +45 -0
  30. chia/_tests/clvm/test_puzzles.py +242 -0
  31. chia/_tests/clvm/test_singletons.py +540 -0
  32. chia/_tests/clvm/test_spend_sim.py +181 -0
  33. chia/_tests/cmds/__init__.py +0 -0
  34. chia/_tests/cmds/cmd_test_utils.py +469 -0
  35. chia/_tests/cmds/config.py +3 -0
  36. chia/_tests/cmds/conftest.py +23 -0
  37. chia/_tests/cmds/test_click_types.py +200 -0
  38. chia/_tests/cmds/test_cmd_framework.py +620 -0
  39. chia/_tests/cmds/test_cmds_util.py +97 -0
  40. chia/_tests/cmds/test_daemon.py +92 -0
  41. chia/_tests/cmds/test_dev_gh.py +131 -0
  42. chia/_tests/cmds/test_farm_cmd.py +66 -0
  43. chia/_tests/cmds/test_show.py +116 -0
  44. chia/_tests/cmds/test_sim.py +207 -0
  45. chia/_tests/cmds/test_timelock_args.py +75 -0
  46. chia/_tests/cmds/test_tx_config_args.py +154 -0
  47. chia/_tests/cmds/testing_classes.py +59 -0
  48. chia/_tests/cmds/wallet/__init__.py +0 -0
  49. chia/_tests/cmds/wallet/test_consts.py +47 -0
  50. chia/_tests/cmds/wallet/test_dao.py +565 -0
  51. chia/_tests/cmds/wallet/test_did.py +403 -0
  52. chia/_tests/cmds/wallet/test_nft.py +471 -0
  53. chia/_tests/cmds/wallet/test_notifications.py +124 -0
  54. chia/_tests/cmds/wallet/test_offer.toffer +1 -0
  55. chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
  56. chia/_tests/cmds/wallet/test_vcs.py +400 -0
  57. chia/_tests/cmds/wallet/test_wallet.py +1125 -0
  58. chia/_tests/cmds/wallet/test_wallet_check.py +109 -0
  59. chia/_tests/conftest.py +1419 -0
  60. chia/_tests/connection_utils.py +125 -0
  61. chia/_tests/core/__init__.py +0 -0
  62. chia/_tests/core/cmds/__init__.py +0 -0
  63. chia/_tests/core/cmds/test_beta.py +382 -0
  64. chia/_tests/core/cmds/test_keys.py +1734 -0
  65. chia/_tests/core/cmds/test_wallet.py +126 -0
  66. chia/_tests/core/config.py +3 -0
  67. chia/_tests/core/consensus/__init__.py +0 -0
  68. chia/_tests/core/consensus/test_block_creation.py +54 -0
  69. chia/_tests/core/consensus/test_pot_iterations.py +117 -0
  70. chia/_tests/core/custom_types/__init__.py +0 -0
  71. chia/_tests/core/custom_types/test_coin.py +107 -0
  72. chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
  73. chia/_tests/core/custom_types/test_spend_bundle.py +70 -0
  74. chia/_tests/core/daemon/__init__.py +0 -0
  75. chia/_tests/core/daemon/config.py +4 -0
  76. chia/_tests/core/daemon/test_daemon.py +2128 -0
  77. chia/_tests/core/daemon/test_daemon_register.py +109 -0
  78. chia/_tests/core/daemon/test_keychain_proxy.py +101 -0
  79. chia/_tests/core/data_layer/__init__.py +0 -0
  80. chia/_tests/core/data_layer/config.py +5 -0
  81. chia/_tests/core/data_layer/conftest.py +106 -0
  82. chia/_tests/core/data_layer/test_data_cli.py +56 -0
  83. chia/_tests/core/data_layer/test_data_layer.py +83 -0
  84. chia/_tests/core/data_layer/test_data_layer_util.py +218 -0
  85. chia/_tests/core/data_layer/test_data_rpc.py +3847 -0
  86. chia/_tests/core/data_layer/test_data_store.py +2424 -0
  87. chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
  88. chia/_tests/core/data_layer/test_plugin.py +91 -0
  89. chia/_tests/core/data_layer/util.py +233 -0
  90. chia/_tests/core/farmer/__init__.py +0 -0
  91. chia/_tests/core/farmer/config.py +3 -0
  92. chia/_tests/core/farmer/test_farmer_api.py +103 -0
  93. chia/_tests/core/full_node/__init__.py +0 -0
  94. chia/_tests/core/full_node/config.py +4 -0
  95. chia/_tests/core/full_node/dos/__init__.py +0 -0
  96. chia/_tests/core/full_node/dos/config.py +3 -0
  97. chia/_tests/core/full_node/full_sync/__init__.py +0 -0
  98. chia/_tests/core/full_node/full_sync/config.py +4 -0
  99. chia/_tests/core/full_node/full_sync/test_full_sync.py +443 -0
  100. chia/_tests/core/full_node/ram_db.py +27 -0
  101. chia/_tests/core/full_node/stores/__init__.py +0 -0
  102. chia/_tests/core/full_node/stores/config.py +4 -0
  103. chia/_tests/core/full_node/stores/test_block_store.py +590 -0
  104. chia/_tests/core/full_node/stores/test_coin_store.py +897 -0
  105. chia/_tests/core/full_node/stores/test_full_node_store.py +1219 -0
  106. chia/_tests/core/full_node/stores/test_hint_store.py +229 -0
  107. chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
  108. chia/_tests/core/full_node/test_address_manager.py +588 -0
  109. chia/_tests/core/full_node/test_block_height_map.py +556 -0
  110. chia/_tests/core/full_node/test_conditions.py +556 -0
  111. chia/_tests/core/full_node/test_full_node.py +2700 -0
  112. chia/_tests/core/full_node/test_generator_tools.py +82 -0
  113. chia/_tests/core/full_node/test_hint_management.py +104 -0
  114. chia/_tests/core/full_node/test_node_load.py +34 -0
  115. chia/_tests/core/full_node/test_performance.py +179 -0
  116. chia/_tests/core/full_node/test_subscriptions.py +492 -0
  117. chia/_tests/core/full_node/test_transactions.py +203 -0
  118. chia/_tests/core/full_node/test_tx_processing_queue.py +155 -0
  119. chia/_tests/core/large_block.py +2388 -0
  120. chia/_tests/core/make_block_generator.py +70 -0
  121. chia/_tests/core/mempool/__init__.py +0 -0
  122. chia/_tests/core/mempool/config.py +4 -0
  123. chia/_tests/core/mempool/test_mempool.py +3255 -0
  124. chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
  125. chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
  126. chia/_tests/core/mempool/test_mempool_item_queries.py +190 -0
  127. chia/_tests/core/mempool/test_mempool_manager.py +2084 -0
  128. chia/_tests/core/mempool/test_mempool_performance.py +64 -0
  129. chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
  130. chia/_tests/core/node_height.py +28 -0
  131. chia/_tests/core/server/__init__.py +0 -0
  132. chia/_tests/core/server/config.py +3 -0
  133. chia/_tests/core/server/flood.py +84 -0
  134. chia/_tests/core/server/serve.py +135 -0
  135. chia/_tests/core/server/test_api_protocol.py +21 -0
  136. chia/_tests/core/server/test_capabilities.py +66 -0
  137. chia/_tests/core/server/test_dos.py +319 -0
  138. chia/_tests/core/server/test_event_loop.py +109 -0
  139. chia/_tests/core/server/test_loop.py +294 -0
  140. chia/_tests/core/server/test_node_discovery.py +73 -0
  141. chia/_tests/core/server/test_rate_limits.py +482 -0
  142. chia/_tests/core/server/test_server.py +226 -0
  143. chia/_tests/core/server/test_upnp.py +8 -0
  144. chia/_tests/core/services/__init__.py +0 -0
  145. chia/_tests/core/services/config.py +3 -0
  146. chia/_tests/core/services/test_services.py +188 -0
  147. chia/_tests/core/ssl/__init__.py +0 -0
  148. chia/_tests/core/ssl/config.py +3 -0
  149. chia/_tests/core/ssl/test_ssl.py +202 -0
  150. chia/_tests/core/test_coins.py +33 -0
  151. chia/_tests/core/test_cost_calculation.py +313 -0
  152. chia/_tests/core/test_crawler.py +175 -0
  153. chia/_tests/core/test_crawler_rpc.py +53 -0
  154. chia/_tests/core/test_daemon_rpc.py +24 -0
  155. chia/_tests/core/test_db_conversion.py +130 -0
  156. chia/_tests/core/test_db_validation.py +162 -0
  157. chia/_tests/core/test_farmer_harvester_rpc.py +505 -0
  158. chia/_tests/core/test_filter.py +35 -0
  159. chia/_tests/core/test_full_node_rpc.py +768 -0
  160. chia/_tests/core/test_merkle_set.py +343 -0
  161. chia/_tests/core/test_program.py +47 -0
  162. chia/_tests/core/test_rpc_util.py +86 -0
  163. chia/_tests/core/test_seeder.py +420 -0
  164. chia/_tests/core/test_setproctitle.py +13 -0
  165. chia/_tests/core/util/__init__.py +0 -0
  166. chia/_tests/core/util/config.py +4 -0
  167. chia/_tests/core/util/test_block_cache.py +44 -0
  168. chia/_tests/core/util/test_cached_bls.py +57 -0
  169. chia/_tests/core/util/test_config.py +337 -0
  170. chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
  171. chia/_tests/core/util/test_files.py +391 -0
  172. chia/_tests/core/util/test_jsonify.py +146 -0
  173. chia/_tests/core/util/test_keychain.py +522 -0
  174. chia/_tests/core/util/test_keyring_wrapper.py +491 -0
  175. chia/_tests/core/util/test_lockfile.py +380 -0
  176. chia/_tests/core/util/test_log_exceptions.py +187 -0
  177. chia/_tests/core/util/test_lru_cache.py +56 -0
  178. chia/_tests/core/util/test_significant_bits.py +40 -0
  179. chia/_tests/core/util/test_streamable.py +883 -0
  180. chia/_tests/db/__init__.py +0 -0
  181. chia/_tests/db/test_db_wrapper.py +566 -0
  182. chia/_tests/environments/__init__.py +0 -0
  183. chia/_tests/environments/common.py +35 -0
  184. chia/_tests/environments/full_node.py +47 -0
  185. chia/_tests/environments/wallet.py +429 -0
  186. chia/_tests/ether.py +19 -0
  187. chia/_tests/farmer_harvester/__init__.py +0 -0
  188. chia/_tests/farmer_harvester/config.py +3 -0
  189. chia/_tests/farmer_harvester/test_farmer.py +1264 -0
  190. chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
  191. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +131 -0
  192. chia/_tests/farmer_harvester/test_third_party_harvesters.py +528 -0
  193. chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
  194. chia/_tests/fee_estimation/__init__.py +0 -0
  195. chia/_tests/fee_estimation/config.py +3 -0
  196. chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
  197. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
  198. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +144 -0
  199. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
  200. chia/_tests/generator/__init__.py +0 -0
  201. chia/_tests/generator/puzzles/__init__.py +0 -0
  202. chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
  203. chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
  204. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
  205. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
  206. chia/_tests/generator/test_compression.py +201 -0
  207. chia/_tests/generator/test_generator_types.py +44 -0
  208. chia/_tests/generator/test_rom.py +180 -0
  209. chia/_tests/plot_sync/__init__.py +0 -0
  210. chia/_tests/plot_sync/config.py +3 -0
  211. chia/_tests/plot_sync/test_delta.py +101 -0
  212. chia/_tests/plot_sync/test_plot_sync.py +618 -0
  213. chia/_tests/plot_sync/test_receiver.py +451 -0
  214. chia/_tests/plot_sync/test_sender.py +116 -0
  215. chia/_tests/plot_sync/test_sync_simulated.py +451 -0
  216. chia/_tests/plot_sync/util.py +68 -0
  217. chia/_tests/plotting/__init__.py +0 -0
  218. chia/_tests/plotting/config.py +3 -0
  219. chia/_tests/plotting/test_plot_manager.py +781 -0
  220. chia/_tests/plotting/util.py +12 -0
  221. chia/_tests/pools/__init__.py +0 -0
  222. chia/_tests/pools/config.py +5 -0
  223. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  224. chia/_tests/pools/test_pool_cmdline.py +1001 -0
  225. chia/_tests/pools/test_pool_config.py +42 -0
  226. chia/_tests/pools/test_pool_puzzles_lifecycle.py +397 -0
  227. chia/_tests/pools/test_pool_rpc.py +1123 -0
  228. chia/_tests/pools/test_pool_wallet.py +205 -0
  229. chia/_tests/pools/test_wallet_pool_store.py +161 -0
  230. chia/_tests/process_junit.py +348 -0
  231. chia/_tests/rpc/__init__.py +0 -0
  232. chia/_tests/rpc/test_rpc_client.py +138 -0
  233. chia/_tests/rpc/test_rpc_server.py +183 -0
  234. chia/_tests/simulation/__init__.py +0 -0
  235. chia/_tests/simulation/config.py +6 -0
  236. chia/_tests/simulation/test_simulation.py +501 -0
  237. chia/_tests/simulation/test_simulator.py +232 -0
  238. chia/_tests/simulation/test_start_simulator.py +107 -0
  239. chia/_tests/testconfig.py +13 -0
  240. chia/_tests/timelord/__init__.py +0 -0
  241. chia/_tests/timelord/config.py +3 -0
  242. chia/_tests/timelord/test_new_peak.py +437 -0
  243. chia/_tests/timelord/test_timelord.py +11 -0
  244. chia/_tests/tools/1315537.json +170 -0
  245. chia/_tests/tools/1315544.json +160 -0
  246. chia/_tests/tools/1315630.json +150 -0
  247. chia/_tests/tools/300000.json +105 -0
  248. chia/_tests/tools/442734.json +140 -0
  249. chia/_tests/tools/466212.json +130 -0
  250. chia/_tests/tools/__init__.py +0 -0
  251. chia/_tests/tools/config.py +5 -0
  252. chia/_tests/tools/test-blockchain-db.sqlite +0 -0
  253. chia/_tests/tools/test_full_sync.py +30 -0
  254. chia/_tests/tools/test_legacy_keyring.py +82 -0
  255. chia/_tests/tools/test_run_block.py +128 -0
  256. chia/_tests/tools/test_virtual_project.py +591 -0
  257. chia/_tests/util/__init__.py +0 -0
  258. chia/_tests/util/benchmark_cost.py +170 -0
  259. chia/_tests/util/benchmarks.py +153 -0
  260. chia/_tests/util/bip39_test_vectors.json +148 -0
  261. chia/_tests/util/blockchain.py +134 -0
  262. chia/_tests/util/blockchain_mock.py +132 -0
  263. chia/_tests/util/build_network_protocol_files.py +302 -0
  264. chia/_tests/util/clvm_generator.bin +0 -0
  265. chia/_tests/util/config.py +3 -0
  266. chia/_tests/util/constants.py +20 -0
  267. chia/_tests/util/db_connection.py +37 -0
  268. chia/_tests/util/full_sync.py +253 -0
  269. chia/_tests/util/gen_ssl_certs.py +114 -0
  270. chia/_tests/util/generator_tools_testing.py +45 -0
  271. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  272. chia/_tests/util/key_tool.py +36 -0
  273. chia/_tests/util/misc.py +675 -0
  274. chia/_tests/util/network_protocol_data.py +1072 -0
  275. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  276. chia/_tests/util/protocol_messages_json.py +2701 -0
  277. chia/_tests/util/rpc.py +26 -0
  278. chia/_tests/util/run_block.py +163 -0
  279. chia/_tests/util/setup_nodes.py +481 -0
  280. chia/_tests/util/spend_sim.py +492 -0
  281. chia/_tests/util/split_managers.py +102 -0
  282. chia/_tests/util/temp_file.py +14 -0
  283. chia/_tests/util/test_action_scope.py +144 -0
  284. chia/_tests/util/test_async_pool.py +366 -0
  285. chia/_tests/util/test_build_job_matrix.py +42 -0
  286. chia/_tests/util/test_build_network_protocol_files.py +7 -0
  287. chia/_tests/util/test_chia_version.py +50 -0
  288. chia/_tests/util/test_collection.py +11 -0
  289. chia/_tests/util/test_condition_tools.py +229 -0
  290. chia/_tests/util/test_config.py +426 -0
  291. chia/_tests/util/test_dump_keyring.py +60 -0
  292. chia/_tests/util/test_errors.py +10 -0
  293. chia/_tests/util/test_full_block_utils.py +279 -0
  294. chia/_tests/util/test_installed.py +20 -0
  295. chia/_tests/util/test_limited_semaphore.py +53 -0
  296. chia/_tests/util/test_logging_filter.py +42 -0
  297. chia/_tests/util/test_misc.py +445 -0
  298. chia/_tests/util/test_network.py +73 -0
  299. chia/_tests/util/test_network_protocol_files.py +578 -0
  300. chia/_tests/util/test_network_protocol_json.py +267 -0
  301. chia/_tests/util/test_network_protocol_test.py +256 -0
  302. chia/_tests/util/test_paginator.py +71 -0
  303. chia/_tests/util/test_pprint.py +17 -0
  304. chia/_tests/util/test_priority_mutex.py +488 -0
  305. chia/_tests/util/test_recursive_replace.py +116 -0
  306. chia/_tests/util/test_replace_str_to_bytes.py +137 -0
  307. chia/_tests/util/test_service_groups.py +15 -0
  308. chia/_tests/util/test_ssl_check.py +31 -0
  309. chia/_tests/util/test_testnet_overrides.py +19 -0
  310. chia/_tests/util/test_tests_misc.py +38 -0
  311. chia/_tests/util/test_timing.py +37 -0
  312. chia/_tests/util/test_trusted_peer.py +51 -0
  313. chia/_tests/util/time_out_assert.py +191 -0
  314. chia/_tests/wallet/__init__.py +0 -0
  315. chia/_tests/wallet/cat_wallet/__init__.py +0 -0
  316. chia/_tests/wallet/cat_wallet/config.py +4 -0
  317. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
  318. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
  319. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1826 -0
  320. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
  321. chia/_tests/wallet/cat_wallet/test_trades.py +2600 -0
  322. chia/_tests/wallet/clawback/__init__.py +0 -0
  323. chia/_tests/wallet/clawback/config.py +3 -0
  324. chia/_tests/wallet/clawback/test_clawback_decorator.py +78 -0
  325. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
  326. chia/_tests/wallet/clawback/test_clawback_metadata.py +50 -0
  327. chia/_tests/wallet/config.py +4 -0
  328. chia/_tests/wallet/conftest.py +278 -0
  329. chia/_tests/wallet/dao_wallet/__init__.py +0 -0
  330. chia/_tests/wallet/dao_wallet/config.py +3 -0
  331. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1330 -0
  332. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
  333. chia/_tests/wallet/db_wallet/__init__.py +0 -0
  334. chia/_tests/wallet/db_wallet/config.py +3 -0
  335. chia/_tests/wallet/db_wallet/test_db_graftroot.py +141 -0
  336. chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
  337. chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
  338. chia/_tests/wallet/did_wallet/__init__.py +0 -0
  339. chia/_tests/wallet/did_wallet/config.py +4 -0
  340. chia/_tests/wallet/did_wallet/test_did.py +2284 -0
  341. chia/_tests/wallet/nft_wallet/__init__.py +0 -0
  342. chia/_tests/wallet/nft_wallet/config.py +4 -0
  343. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1493 -0
  344. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1024 -0
  345. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +375 -0
  346. chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
  347. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
  348. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2584 -0
  349. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
  350. chia/_tests/wallet/rpc/__init__.py +0 -0
  351. chia/_tests/wallet/rpc/config.py +4 -0
  352. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +285 -0
  353. chia/_tests/wallet/rpc/test_wallet_rpc.py +3153 -0
  354. chia/_tests/wallet/simple_sync/__init__.py +0 -0
  355. chia/_tests/wallet/simple_sync/config.py +3 -0
  356. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +718 -0
  357. chia/_tests/wallet/sync/__init__.py +0 -0
  358. chia/_tests/wallet/sync/config.py +4 -0
  359. chia/_tests/wallet/sync/test_wallet_sync.py +1692 -0
  360. chia/_tests/wallet/test_address_type.py +189 -0
  361. chia/_tests/wallet/test_bech32m.py +45 -0
  362. chia/_tests/wallet/test_clvm_streamable.py +244 -0
  363. chia/_tests/wallet/test_coin_management.py +354 -0
  364. chia/_tests/wallet/test_coin_selection.py +588 -0
  365. chia/_tests/wallet/test_conditions.py +400 -0
  366. chia/_tests/wallet/test_debug_spend_bundle.py +218 -0
  367. chia/_tests/wallet/test_new_wallet_protocol.py +1174 -0
  368. chia/_tests/wallet/test_nft_store.py +192 -0
  369. chia/_tests/wallet/test_notifications.py +196 -0
  370. chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
  371. chia/_tests/wallet/test_puzzle_store.py +132 -0
  372. chia/_tests/wallet/test_sign_coin_spends.py +159 -0
  373. chia/_tests/wallet/test_signer_protocol.py +947 -0
  374. chia/_tests/wallet/test_singleton.py +122 -0
  375. chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
  376. chia/_tests/wallet/test_singleton_store.py +152 -0
  377. chia/_tests/wallet/test_taproot.py +19 -0
  378. chia/_tests/wallet/test_transaction_store.py +945 -0
  379. chia/_tests/wallet/test_util.py +185 -0
  380. chia/_tests/wallet/test_wallet.py +2139 -0
  381. chia/_tests/wallet/test_wallet_action_scope.py +85 -0
  382. chia/_tests/wallet/test_wallet_blockchain.py +111 -0
  383. chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
  384. chia/_tests/wallet/test_wallet_interested_store.py +43 -0
  385. chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
  386. chia/_tests/wallet/test_wallet_node.py +780 -0
  387. chia/_tests/wallet/test_wallet_retry.py +95 -0
  388. chia/_tests/wallet/test_wallet_state_manager.py +259 -0
  389. chia/_tests/wallet/test_wallet_test_framework.py +275 -0
  390. chia/_tests/wallet/test_wallet_trade_store.py +218 -0
  391. chia/_tests/wallet/test_wallet_user_store.py +34 -0
  392. chia/_tests/wallet/test_wallet_utils.py +156 -0
  393. chia/_tests/wallet/vc_wallet/__init__.py +0 -0
  394. chia/_tests/wallet/vc_wallet/config.py +3 -0
  395. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
  396. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
  397. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +830 -0
  398. chia/_tests/wallet/wallet_block_tools.py +327 -0
  399. chia/_tests/weight_proof/__init__.py +0 -0
  400. chia/_tests/weight_proof/config.py +3 -0
  401. chia/_tests/weight_proof/test_weight_proof.py +528 -0
  402. chia/apis.py +19 -0
  403. chia/clvm/__init__.py +0 -0
  404. chia/cmds/__init__.py +0 -0
  405. chia/cmds/beta.py +184 -0
  406. chia/cmds/beta_funcs.py +137 -0
  407. chia/cmds/check_wallet_db.py +420 -0
  408. chia/cmds/chia.py +151 -0
  409. chia/cmds/cmd_classes.py +323 -0
  410. chia/cmds/cmd_helpers.py +242 -0
  411. chia/cmds/cmds_util.py +488 -0
  412. chia/cmds/coin_funcs.py +275 -0
  413. chia/cmds/coins.py +182 -0
  414. chia/cmds/completion.py +49 -0
  415. chia/cmds/configure.py +332 -0
  416. chia/cmds/dao.py +1064 -0
  417. chia/cmds/dao_funcs.py +598 -0
  418. chia/cmds/data.py +708 -0
  419. chia/cmds/data_funcs.py +385 -0
  420. chia/cmds/db.py +87 -0
  421. chia/cmds/db_backup_func.py +77 -0
  422. chia/cmds/db_upgrade_func.py +452 -0
  423. chia/cmds/db_validate_func.py +184 -0
  424. chia/cmds/dev.py +18 -0
  425. chia/cmds/farm.py +100 -0
  426. chia/cmds/farm_funcs.py +200 -0
  427. chia/cmds/gh.py +275 -0
  428. chia/cmds/init.py +63 -0
  429. chia/cmds/init_funcs.py +367 -0
  430. chia/cmds/installers.py +131 -0
  431. chia/cmds/keys.py +527 -0
  432. chia/cmds/keys_funcs.py +863 -0
  433. chia/cmds/netspace.py +50 -0
  434. chia/cmds/netspace_funcs.py +54 -0
  435. chia/cmds/options.py +32 -0
  436. chia/cmds/param_types.py +238 -0
  437. chia/cmds/passphrase.py +131 -0
  438. chia/cmds/passphrase_funcs.py +292 -0
  439. chia/cmds/peer.py +51 -0
  440. chia/cmds/peer_funcs.py +129 -0
  441. chia/cmds/plotnft.py +260 -0
  442. chia/cmds/plotnft_funcs.py +405 -0
  443. chia/cmds/plots.py +230 -0
  444. chia/cmds/plotters.py +18 -0
  445. chia/cmds/rpc.py +208 -0
  446. chia/cmds/show.py +72 -0
  447. chia/cmds/show_funcs.py +215 -0
  448. chia/cmds/signer.py +296 -0
  449. chia/cmds/sim.py +225 -0
  450. chia/cmds/sim_funcs.py +509 -0
  451. chia/cmds/start.py +24 -0
  452. chia/cmds/start_funcs.py +109 -0
  453. chia/cmds/stop.py +62 -0
  454. chia/cmds/units.py +9 -0
  455. chia/cmds/wallet.py +1901 -0
  456. chia/cmds/wallet_funcs.py +1874 -0
  457. chia/consensus/__init__.py +0 -0
  458. chia/consensus/block_body_validation.py +562 -0
  459. chia/consensus/block_creation.py +546 -0
  460. chia/consensus/block_header_validation.py +1059 -0
  461. chia/consensus/block_record.py +31 -0
  462. chia/consensus/block_rewards.py +53 -0
  463. chia/consensus/blockchain.py +1087 -0
  464. chia/consensus/blockchain_interface.py +56 -0
  465. chia/consensus/coinbase.py +30 -0
  466. chia/consensus/condition_costs.py +9 -0
  467. chia/consensus/constants.py +49 -0
  468. chia/consensus/cost_calculator.py +15 -0
  469. chia/consensus/default_constants.py +89 -0
  470. chia/consensus/deficit.py +55 -0
  471. chia/consensus/difficulty_adjustment.py +412 -0
  472. chia/consensus/find_fork_point.py +111 -0
  473. chia/consensus/full_block_to_block_record.py +167 -0
  474. chia/consensus/get_block_challenge.py +106 -0
  475. chia/consensus/get_block_generator.py +27 -0
  476. chia/consensus/make_sub_epoch_summary.py +210 -0
  477. chia/consensus/multiprocess_validation.py +268 -0
  478. chia/consensus/pos_quality.py +19 -0
  479. chia/consensus/pot_iterations.py +67 -0
  480. chia/consensus/puzzles/__init__.py +0 -0
  481. chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
  482. chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
  483. chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
  484. chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
  485. chia/consensus/vdf_info_computation.py +156 -0
  486. chia/daemon/__init__.py +0 -0
  487. chia/daemon/client.py +252 -0
  488. chia/daemon/keychain_proxy.py +502 -0
  489. chia/daemon/keychain_server.py +365 -0
  490. chia/daemon/server.py +1606 -0
  491. chia/daemon/windows_signal.py +56 -0
  492. chia/data_layer/__init__.py +0 -0
  493. chia/data_layer/data_layer.py +1291 -0
  494. chia/data_layer/data_layer_api.py +33 -0
  495. chia/data_layer/data_layer_errors.py +50 -0
  496. chia/data_layer/data_layer_server.py +170 -0
  497. chia/data_layer/data_layer_util.py +985 -0
  498. chia/data_layer/data_layer_wallet.py +1311 -0
  499. chia/data_layer/data_store.py +2267 -0
  500. chia/data_layer/dl_wallet_store.py +407 -0
  501. chia/data_layer/download_data.py +389 -0
  502. chia/data_layer/puzzles/__init__.py +0 -0
  503. chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
  504. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
  505. chia/data_layer/s3_plugin_config.yml +33 -0
  506. chia/data_layer/s3_plugin_service.py +468 -0
  507. chia/data_layer/util/__init__.py +0 -0
  508. chia/data_layer/util/benchmark.py +107 -0
  509. chia/data_layer/util/plugin.py +40 -0
  510. chia/farmer/__init__.py +0 -0
  511. chia/farmer/farmer.py +923 -0
  512. chia/farmer/farmer_api.py +820 -0
  513. chia/full_node/__init__.py +0 -0
  514. chia/full_node/bitcoin_fee_estimator.py +85 -0
  515. chia/full_node/block_height_map.py +271 -0
  516. chia/full_node/block_store.py +576 -0
  517. chia/full_node/bundle_tools.py +19 -0
  518. chia/full_node/coin_store.py +647 -0
  519. chia/full_node/fee_estimate.py +54 -0
  520. chia/full_node/fee_estimate_store.py +24 -0
  521. chia/full_node/fee_estimation.py +92 -0
  522. chia/full_node/fee_estimator.py +90 -0
  523. chia/full_node/fee_estimator_constants.py +38 -0
  524. chia/full_node/fee_estimator_interface.py +42 -0
  525. chia/full_node/fee_history.py +25 -0
  526. chia/full_node/fee_tracker.py +564 -0
  527. chia/full_node/full_node.py +3327 -0
  528. chia/full_node/full_node_api.py +2025 -0
  529. chia/full_node/full_node_store.py +1033 -0
  530. chia/full_node/hint_management.py +56 -0
  531. chia/full_node/hint_store.py +93 -0
  532. chia/full_node/mempool.py +589 -0
  533. chia/full_node/mempool_check_conditions.py +146 -0
  534. chia/full_node/mempool_manager.py +853 -0
  535. chia/full_node/pending_tx_cache.py +112 -0
  536. chia/full_node/puzzles/__init__.py +0 -0
  537. chia/full_node/puzzles/block_program_zero.clsp +14 -0
  538. chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
  539. chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
  540. chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
  541. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
  542. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
  543. chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
  544. chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
  545. chia/full_node/signage_point.py +16 -0
  546. chia/full_node/subscriptions.py +247 -0
  547. chia/full_node/sync_store.py +146 -0
  548. chia/full_node/tx_processing_queue.py +78 -0
  549. chia/full_node/util/__init__.py +0 -0
  550. chia/full_node/weight_proof.py +1720 -0
  551. chia/harvester/__init__.py +0 -0
  552. chia/harvester/harvester.py +272 -0
  553. chia/harvester/harvester_api.py +380 -0
  554. chia/introducer/__init__.py +0 -0
  555. chia/introducer/introducer.py +122 -0
  556. chia/introducer/introducer_api.py +70 -0
  557. chia/legacy/__init__.py +0 -0
  558. chia/legacy/keyring.py +155 -0
  559. chia/plot_sync/__init__.py +0 -0
  560. chia/plot_sync/delta.py +61 -0
  561. chia/plot_sync/exceptions.py +56 -0
  562. chia/plot_sync/receiver.py +386 -0
  563. chia/plot_sync/sender.py +340 -0
  564. chia/plot_sync/util.py +43 -0
  565. chia/plotters/__init__.py +0 -0
  566. chia/plotters/bladebit.py +388 -0
  567. chia/plotters/chiapos.py +63 -0
  568. chia/plotters/madmax.py +224 -0
  569. chia/plotters/plotters.py +577 -0
  570. chia/plotters/plotters_util.py +133 -0
  571. chia/plotting/__init__.py +0 -0
  572. chia/plotting/cache.py +213 -0
  573. chia/plotting/check_plots.py +283 -0
  574. chia/plotting/create_plots.py +278 -0
  575. chia/plotting/manager.py +436 -0
  576. chia/plotting/util.py +336 -0
  577. chia/pools/__init__.py +0 -0
  578. chia/pools/pool_config.py +110 -0
  579. chia/pools/pool_puzzles.py +459 -0
  580. chia/pools/pool_wallet.py +933 -0
  581. chia/pools/pool_wallet_info.py +118 -0
  582. chia/pools/puzzles/__init__.py +0 -0
  583. chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
  584. chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
  585. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
  586. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
  587. chia/protocols/__init__.py +0 -0
  588. chia/protocols/farmer_protocol.py +102 -0
  589. chia/protocols/full_node_protocol.py +219 -0
  590. chia/protocols/harvester_protocol.py +216 -0
  591. chia/protocols/introducer_protocol.py +25 -0
  592. chia/protocols/pool_protocol.py +177 -0
  593. chia/protocols/protocol_message_types.py +139 -0
  594. chia/protocols/protocol_state_machine.py +87 -0
  595. chia/protocols/protocol_timing.py +8 -0
  596. chia/protocols/shared_protocol.py +86 -0
  597. chia/protocols/timelord_protocol.py +93 -0
  598. chia/protocols/wallet_protocol.py +401 -0
  599. chia/py.typed +0 -0
  600. chia/rpc/__init__.py +0 -0
  601. chia/rpc/crawler_rpc_api.py +80 -0
  602. chia/rpc/data_layer_rpc_api.py +644 -0
  603. chia/rpc/data_layer_rpc_client.py +188 -0
  604. chia/rpc/data_layer_rpc_util.py +58 -0
  605. chia/rpc/farmer_rpc_api.py +365 -0
  606. chia/rpc/farmer_rpc_client.py +86 -0
  607. chia/rpc/full_node_rpc_api.py +959 -0
  608. chia/rpc/full_node_rpc_client.py +292 -0
  609. chia/rpc/harvester_rpc_api.py +141 -0
  610. chia/rpc/harvester_rpc_client.py +54 -0
  611. chia/rpc/rpc_client.py +164 -0
  612. chia/rpc/rpc_server.py +521 -0
  613. chia/rpc/timelord_rpc_api.py +32 -0
  614. chia/rpc/util.py +93 -0
  615. chia/rpc/wallet_request_types.py +904 -0
  616. chia/rpc/wallet_rpc_api.py +4943 -0
  617. chia/rpc/wallet_rpc_client.py +1814 -0
  618. chia/seeder/__init__.py +0 -0
  619. chia/seeder/crawl_store.py +425 -0
  620. chia/seeder/crawler.py +410 -0
  621. chia/seeder/crawler_api.py +135 -0
  622. chia/seeder/dns_server.py +593 -0
  623. chia/seeder/peer_record.py +146 -0
  624. chia/seeder/start_crawler.py +92 -0
  625. chia/server/__init__.py +0 -0
  626. chia/server/address_manager.py +658 -0
  627. chia/server/address_manager_store.py +237 -0
  628. chia/server/api_protocol.py +116 -0
  629. chia/server/capabilities.py +24 -0
  630. chia/server/chia_policy.py +346 -0
  631. chia/server/introducer_peers.py +76 -0
  632. chia/server/node_discovery.py +714 -0
  633. chia/server/outbound_message.py +33 -0
  634. chia/server/rate_limit_numbers.py +214 -0
  635. chia/server/rate_limits.py +153 -0
  636. chia/server/server.py +741 -0
  637. chia/server/signal_handlers.py +120 -0
  638. chia/server/ssl_context.py +32 -0
  639. chia/server/start_data_layer.py +151 -0
  640. chia/server/start_farmer.py +98 -0
  641. chia/server/start_full_node.py +112 -0
  642. chia/server/start_harvester.py +93 -0
  643. chia/server/start_introducer.py +81 -0
  644. chia/server/start_service.py +316 -0
  645. chia/server/start_timelord.py +89 -0
  646. chia/server/start_wallet.py +113 -0
  647. chia/server/upnp.py +118 -0
  648. chia/server/ws_connection.py +766 -0
  649. chia/simulator/__init__.py +0 -0
  650. chia/simulator/add_blocks_in_batches.py +54 -0
  651. chia/simulator/block_tools.py +2054 -0
  652. chia/simulator/full_node_simulator.py +794 -0
  653. chia/simulator/keyring.py +128 -0
  654. chia/simulator/setup_services.py +506 -0
  655. chia/simulator/simulator_constants.py +13 -0
  656. chia/simulator/simulator_full_node_rpc_api.py +99 -0
  657. chia/simulator/simulator_full_node_rpc_client.py +60 -0
  658. chia/simulator/simulator_protocol.py +29 -0
  659. chia/simulator/simulator_test_tools.py +164 -0
  660. chia/simulator/socket.py +24 -0
  661. chia/simulator/ssl_certs.py +114 -0
  662. chia/simulator/ssl_certs_1.py +697 -0
  663. chia/simulator/ssl_certs_10.py +697 -0
  664. chia/simulator/ssl_certs_2.py +697 -0
  665. chia/simulator/ssl_certs_3.py +697 -0
  666. chia/simulator/ssl_certs_4.py +697 -0
  667. chia/simulator/ssl_certs_5.py +697 -0
  668. chia/simulator/ssl_certs_6.py +697 -0
  669. chia/simulator/ssl_certs_7.py +697 -0
  670. chia/simulator/ssl_certs_8.py +697 -0
  671. chia/simulator/ssl_certs_9.py +697 -0
  672. chia/simulator/start_simulator.py +143 -0
  673. chia/simulator/wallet_tools.py +246 -0
  674. chia/ssl/__init__.py +0 -0
  675. chia/ssl/chia_ca.crt +19 -0
  676. chia/ssl/chia_ca.key +28 -0
  677. chia/ssl/create_ssl.py +249 -0
  678. chia/ssl/dst_root_ca.pem +20 -0
  679. chia/timelord/__init__.py +0 -0
  680. chia/timelord/iters_from_block.py +50 -0
  681. chia/timelord/timelord.py +1226 -0
  682. chia/timelord/timelord_api.py +138 -0
  683. chia/timelord/timelord_launcher.py +190 -0
  684. chia/timelord/timelord_state.py +244 -0
  685. chia/timelord/types.py +22 -0
  686. chia/types/__init__.py +0 -0
  687. chia/types/aliases.py +35 -0
  688. chia/types/block_protocol.py +20 -0
  689. chia/types/blockchain_format/__init__.py +0 -0
  690. chia/types/blockchain_format/classgroup.py +5 -0
  691. chia/types/blockchain_format/coin.py +28 -0
  692. chia/types/blockchain_format/foliage.py +8 -0
  693. chia/types/blockchain_format/pool_target.py +5 -0
  694. chia/types/blockchain_format/program.py +269 -0
  695. chia/types/blockchain_format/proof_of_space.py +135 -0
  696. chia/types/blockchain_format/reward_chain_block.py +6 -0
  697. chia/types/blockchain_format/serialized_program.py +5 -0
  698. chia/types/blockchain_format/sized_bytes.py +11 -0
  699. chia/types/blockchain_format/slots.py +9 -0
  700. chia/types/blockchain_format/sub_epoch_summary.py +5 -0
  701. chia/types/blockchain_format/tree_hash.py +72 -0
  702. chia/types/blockchain_format/vdf.py +86 -0
  703. chia/types/clvm_cost.py +13 -0
  704. chia/types/coin_record.py +43 -0
  705. chia/types/coin_spend.py +115 -0
  706. chia/types/condition_opcodes.py +73 -0
  707. chia/types/condition_with_args.py +16 -0
  708. chia/types/eligible_coin_spends.py +365 -0
  709. chia/types/end_of_slot_bundle.py +5 -0
  710. chia/types/fee_rate.py +38 -0
  711. chia/types/full_block.py +5 -0
  712. chia/types/generator_types.py +13 -0
  713. chia/types/header_block.py +5 -0
  714. chia/types/internal_mempool_item.py +18 -0
  715. chia/types/mempool_inclusion_status.py +9 -0
  716. chia/types/mempool_item.py +85 -0
  717. chia/types/mempool_submission_status.py +30 -0
  718. chia/types/mojos.py +7 -0
  719. chia/types/peer_info.py +64 -0
  720. chia/types/signing_mode.py +29 -0
  721. chia/types/spend_bundle.py +30 -0
  722. chia/types/spend_bundle_conditions.py +7 -0
  723. chia/types/transaction_queue_entry.py +55 -0
  724. chia/types/unfinished_block.py +5 -0
  725. chia/types/unfinished_header_block.py +37 -0
  726. chia/types/validation_state.py +14 -0
  727. chia/types/weight_proof.py +49 -0
  728. chia/util/__init__.py +0 -0
  729. chia/util/action_scope.py +168 -0
  730. chia/util/async_pool.py +226 -0
  731. chia/util/augmented_chain.py +134 -0
  732. chia/util/batches.py +42 -0
  733. chia/util/bech32m.py +126 -0
  734. chia/util/beta_metrics.py +119 -0
  735. chia/util/block_cache.py +56 -0
  736. chia/util/byte_types.py +12 -0
  737. chia/util/check_fork_next_block.py +33 -0
  738. chia/util/chia_logging.py +144 -0
  739. chia/util/chia_version.py +33 -0
  740. chia/util/collection.py +17 -0
  741. chia/util/condition_tools.py +201 -0
  742. chia/util/config.py +367 -0
  743. chia/util/cpu.py +22 -0
  744. chia/util/db_synchronous.py +23 -0
  745. chia/util/db_version.py +32 -0
  746. chia/util/db_wrapper.py +430 -0
  747. chia/util/default_root.py +27 -0
  748. chia/util/dump_keyring.py +93 -0
  749. chia/util/english.txt +2048 -0
  750. chia/util/errors.py +353 -0
  751. chia/util/file_keyring.py +469 -0
  752. chia/util/files.py +97 -0
  753. chia/util/full_block_utils.py +345 -0
  754. chia/util/generator_tools.py +72 -0
  755. chia/util/hash.py +31 -0
  756. chia/util/initial-config.yaml +694 -0
  757. chia/util/inline_executor.py +26 -0
  758. chia/util/ints.py +19 -0
  759. chia/util/ip_address.py +39 -0
  760. chia/util/json_util.py +37 -0
  761. chia/util/keychain.py +676 -0
  762. chia/util/keyring_wrapper.py +327 -0
  763. chia/util/limited_semaphore.py +41 -0
  764. chia/util/lock.py +49 -0
  765. chia/util/log_exceptions.py +32 -0
  766. chia/util/logging.py +36 -0
  767. chia/util/lru_cache.py +31 -0
  768. chia/util/math.py +20 -0
  769. chia/util/network.py +182 -0
  770. chia/util/paginator.py +48 -0
  771. chia/util/path.py +31 -0
  772. chia/util/permissions.py +20 -0
  773. chia/util/prev_transaction_block.py +21 -0
  774. chia/util/priority_mutex.py +95 -0
  775. chia/util/profiler.py +197 -0
  776. chia/util/recursive_replace.py +24 -0
  777. chia/util/safe_cancel_task.py +16 -0
  778. chia/util/service_groups.py +47 -0
  779. chia/util/setproctitle.py +22 -0
  780. chia/util/significant_bits.py +32 -0
  781. chia/util/ssl_check.py +213 -0
  782. chia/util/streamable.py +642 -0
  783. chia/util/task_referencer.py +59 -0
  784. chia/util/task_timing.py +382 -0
  785. chia/util/timing.py +67 -0
  786. chia/util/vdf_prover.py +30 -0
  787. chia/util/virtual_project_analysis.py +540 -0
  788. chia/util/ws_message.py +66 -0
  789. chia/wallet/__init__.py +0 -0
  790. chia/wallet/cat_wallet/__init__.py +0 -0
  791. chia/wallet/cat_wallet/cat_constants.py +75 -0
  792. chia/wallet/cat_wallet/cat_info.py +47 -0
  793. chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
  794. chia/wallet/cat_wallet/cat_utils.py +164 -0
  795. chia/wallet/cat_wallet/cat_wallet.py +855 -0
  796. chia/wallet/cat_wallet/dao_cat_info.py +28 -0
  797. chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
  798. chia/wallet/cat_wallet/lineage_store.py +74 -0
  799. chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
  800. chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
  801. chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
  802. chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
  803. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
  804. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
  805. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
  806. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
  807. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
  808. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
  809. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
  810. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
  811. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
  812. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
  813. chia/wallet/coin_selection.py +188 -0
  814. chia/wallet/conditions.py +1512 -0
  815. chia/wallet/dao_wallet/__init__.py +0 -0
  816. chia/wallet/dao_wallet/dao_info.py +61 -0
  817. chia/wallet/dao_wallet/dao_utils.py +811 -0
  818. chia/wallet/dao_wallet/dao_wallet.py +2119 -0
  819. chia/wallet/db_wallet/__init__.py +0 -0
  820. chia/wallet/db_wallet/db_wallet_puzzles.py +111 -0
  821. chia/wallet/derivation_record.py +30 -0
  822. chia/wallet/derive_keys.py +146 -0
  823. chia/wallet/did_wallet/__init__.py +0 -0
  824. chia/wallet/did_wallet/did_info.py +39 -0
  825. chia/wallet/did_wallet/did_wallet.py +1494 -0
  826. chia/wallet/did_wallet/did_wallet_puzzles.py +221 -0
  827. chia/wallet/did_wallet/puzzles/__init__.py +0 -0
  828. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
  829. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
  830. chia/wallet/driver_protocol.py +26 -0
  831. chia/wallet/key_val_store.py +55 -0
  832. chia/wallet/lineage_proof.py +58 -0
  833. chia/wallet/nft_wallet/__init__.py +0 -0
  834. chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
  835. chia/wallet/nft_wallet/nft_info.py +120 -0
  836. chia/wallet/nft_wallet/nft_puzzles.py +305 -0
  837. chia/wallet/nft_wallet/nft_wallet.py +1687 -0
  838. chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
  839. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  840. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
  841. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
  842. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
  843. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
  844. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
  845. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
  846. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
  847. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
  848. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
  849. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
  850. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
  851. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
  852. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
  853. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
  854. chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
  855. chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
  856. chia/wallet/nft_wallet/uncurry_nft.py +217 -0
  857. chia/wallet/notification_manager.py +117 -0
  858. chia/wallet/notification_store.py +178 -0
  859. chia/wallet/outer_puzzles.py +84 -0
  860. chia/wallet/payment.py +33 -0
  861. chia/wallet/puzzle_drivers.py +118 -0
  862. chia/wallet/puzzles/__init__.py +0 -0
  863. chia/wallet/puzzles/augmented_condition.clsp +13 -0
  864. chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
  865. chia/wallet/puzzles/clawback/__init__.py +0 -0
  866. chia/wallet/puzzles/clawback/drivers.py +188 -0
  867. chia/wallet/puzzles/clawback/metadata.py +38 -0
  868. chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
  869. chia/wallet/puzzles/condition_codes.clib +77 -0
  870. chia/wallet/puzzles/curry-and-treehash.clib +102 -0
  871. chia/wallet/puzzles/curry.clib +135 -0
  872. chia/wallet/puzzles/curry_by_index.clib +16 -0
  873. chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
  874. chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
  875. chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
  876. chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
  877. chia/wallet/puzzles/dao_finished_state.clsp +35 -0
  878. chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
  879. chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
  880. chia/wallet/puzzles/dao_lockup.clsp +288 -0
  881. chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
  882. chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
  883. chia/wallet/puzzles/dao_proposal.clsp +377 -0
  884. chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
  885. chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
  886. chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
  887. chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
  888. chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
  889. chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
  890. chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
  891. chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
  892. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
  893. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
  894. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
  895. chia/wallet/puzzles/dao_treasury.clsp +115 -0
  896. chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
  897. chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
  898. chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
  899. chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
  900. chia/wallet/puzzles/json.clib +25 -0
  901. chia/wallet/puzzles/load_clvm.py +161 -0
  902. chia/wallet/puzzles/merkle_utils.clib +18 -0
  903. chia/wallet/puzzles/notification.clsp +7 -0
  904. chia/wallet/puzzles/notification.clsp.hex +1 -0
  905. chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
  906. chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
  907. chia/wallet/puzzles/p2_conditions.clsp +3 -0
  908. chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
  909. chia/wallet/puzzles/p2_conditions.py +26 -0
  910. chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
  911. chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
  912. chia/wallet/puzzles/p2_delegated_conditions.py +21 -0
  913. chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
  914. chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
  915. chia/wallet/puzzles/p2_delegated_puzzle.py +34 -0
  916. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
  917. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
  918. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +160 -0
  919. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
  920. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
  921. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +21 -0
  922. chia/wallet/puzzles/p2_parent.clsp +19 -0
  923. chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
  924. chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
  925. chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
  926. chia/wallet/puzzles/p2_puzzle_hash.py +27 -0
  927. chia/wallet/puzzles/p2_singleton.clsp +30 -0
  928. chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
  929. chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
  930. chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
  931. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
  932. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
  933. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
  934. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
  935. chia/wallet/puzzles/puzzle_utils.py +34 -0
  936. chia/wallet/puzzles/settlement_payments.clsp +49 -0
  937. chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
  938. chia/wallet/puzzles/sha256tree.clib +11 -0
  939. chia/wallet/puzzles/singleton_launcher.clsp +16 -0
  940. chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
  941. chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
  942. chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
  943. chia/wallet/puzzles/singleton_top_layer.py +296 -0
  944. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
  945. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
  946. chia/wallet/puzzles/singleton_top_layer_v1_1.py +345 -0
  947. chia/wallet/puzzles/singleton_truths.clib +21 -0
  948. chia/wallet/puzzles/tails.py +348 -0
  949. chia/wallet/puzzles/utility_macros.clib +48 -0
  950. chia/wallet/signer_protocol.py +125 -0
  951. chia/wallet/singleton.py +106 -0
  952. chia/wallet/singleton_record.py +30 -0
  953. chia/wallet/trade_manager.py +1102 -0
  954. chia/wallet/trade_record.py +67 -0
  955. chia/wallet/trading/__init__.py +0 -0
  956. chia/wallet/trading/offer.py +702 -0
  957. chia/wallet/trading/trade_status.py +13 -0
  958. chia/wallet/trading/trade_store.py +526 -0
  959. chia/wallet/transaction_record.py +158 -0
  960. chia/wallet/transaction_sorting.py +14 -0
  961. chia/wallet/uncurried_puzzle.py +17 -0
  962. chia/wallet/util/__init__.py +0 -0
  963. chia/wallet/util/address_type.py +55 -0
  964. chia/wallet/util/blind_signer_tl.py +164 -0
  965. chia/wallet/util/clvm_streamable.py +203 -0
  966. chia/wallet/util/compute_hints.py +66 -0
  967. chia/wallet/util/compute_memos.py +43 -0
  968. chia/wallet/util/curry_and_treehash.py +91 -0
  969. chia/wallet/util/debug_spend_bundle.py +232 -0
  970. chia/wallet/util/merkle_tree.py +100 -0
  971. chia/wallet/util/merkle_utils.py +102 -0
  972. chia/wallet/util/new_peak_queue.py +82 -0
  973. chia/wallet/util/notifications.py +12 -0
  974. chia/wallet/util/peer_request_cache.py +174 -0
  975. chia/wallet/util/pprint.py +39 -0
  976. chia/wallet/util/puzzle_compression.py +95 -0
  977. chia/wallet/util/puzzle_decorator.py +100 -0
  978. chia/wallet/util/puzzle_decorator_type.py +7 -0
  979. chia/wallet/util/query_filter.py +59 -0
  980. chia/wallet/util/transaction_type.py +23 -0
  981. chia/wallet/util/tx_config.py +158 -0
  982. chia/wallet/util/wallet_sync_utils.py +351 -0
  983. chia/wallet/util/wallet_types.py +72 -0
  984. chia/wallet/vc_wallet/__init__.py +0 -0
  985. chia/wallet/vc_wallet/cr_cat_drivers.py +664 -0
  986. chia/wallet/vc_wallet/cr_cat_wallet.py +877 -0
  987. chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
  988. chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
  989. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
  990. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
  991. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
  992. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
  993. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
  994. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
  995. chia/wallet/vc_wallet/vc_drivers.py +838 -0
  996. chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
  997. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
  998. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
  999. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
  1000. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
  1001. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
  1002. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
  1003. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
  1004. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
  1005. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
  1006. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
  1007. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
  1008. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
  1009. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
  1010. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
  1011. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
  1012. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
  1013. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
  1014. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
  1015. chia/wallet/vc_wallet/vc_store.py +263 -0
  1016. chia/wallet/vc_wallet/vc_wallet.py +638 -0
  1017. chia/wallet/wallet.py +698 -0
  1018. chia/wallet/wallet_action_scope.py +96 -0
  1019. chia/wallet/wallet_blockchain.py +244 -0
  1020. chia/wallet/wallet_coin_record.py +72 -0
  1021. chia/wallet/wallet_coin_store.py +351 -0
  1022. chia/wallet/wallet_info.py +35 -0
  1023. chia/wallet/wallet_interested_store.py +188 -0
  1024. chia/wallet/wallet_nft_store.py +279 -0
  1025. chia/wallet/wallet_node.py +1765 -0
  1026. chia/wallet/wallet_node_api.py +207 -0
  1027. chia/wallet/wallet_pool_store.py +119 -0
  1028. chia/wallet/wallet_protocol.py +90 -0
  1029. chia/wallet/wallet_puzzle_store.py +396 -0
  1030. chia/wallet/wallet_retry_store.py +70 -0
  1031. chia/wallet/wallet_singleton_store.py +259 -0
  1032. chia/wallet/wallet_spend_bundle.py +25 -0
  1033. chia/wallet/wallet_state_manager.py +2819 -0
  1034. chia/wallet/wallet_transaction_store.py +496 -0
  1035. chia/wallet/wallet_user_store.py +110 -0
  1036. chia/wallet/wallet_weight_proof_handler.py +126 -0
  1037. chia_blockchain-2.5.1rc1.dist-info/LICENSE +201 -0
  1038. chia_blockchain-2.5.1rc1.dist-info/METADATA +156 -0
  1039. chia_blockchain-2.5.1rc1.dist-info/RECORD +1042 -0
  1040. chia_blockchain-2.5.1rc1.dist-info/WHEEL +4 -0
  1041. chia_blockchain-2.5.1rc1.dist-info/entry_points.txt +17 -0
  1042. mozilla-ca/cacert.pem +3611 -0
@@ -0,0 +1,1031 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+
5
+ import pytest
6
+ from clvm.casts import int_to_bytes
7
+
8
+ from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block
9
+ from chia._tests.util.generator_tools_testing import run_and_get_removals_and_additions
10
+ from chia.consensus.blockchain import AddBlockResult
11
+ from chia.full_node.full_node_api import FullNodeAPI
12
+ from chia.protocols import wallet_protocol
13
+ from chia.server.server import ChiaServer
14
+ from chia.simulator.add_blocks_in_batches import add_blocks_in_batches
15
+ from chia.simulator.block_tools import BlockTools, test_constants
16
+ from chia.simulator.wallet_tools import WalletTool
17
+ from chia.types.blockchain_format.sized_bytes import bytes32
18
+ from chia.types.condition_opcodes import ConditionOpcode
19
+ from chia.types.condition_with_args import ConditionWithArgs
20
+ from chia.types.spend_bundle import SpendBundle, estimate_fees
21
+ from chia.util.errors import Err
22
+ from chia.util.ints import uint32, uint64
23
+ from chia.wallet.conditions import AssertCoinAnnouncement, AssertPuzzleAnnouncement
24
+
25
+ BURN_PUZZLE_HASH = bytes32(b"0" * 32)
26
+
27
+ WALLET_A = WalletTool(test_constants)
28
+ WALLET_A_PUZZLE_HASHES = [WALLET_A.get_new_puzzlehash() for _ in range(5)]
29
+
30
+ log = logging.getLogger(__name__)
31
+
32
+
33
+ class TestBlockchainTransactions:
34
+ @pytest.mark.anyio
35
+ async def test_basic_blockchain_tx(
36
+ self, two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]
37
+ ) -> None:
38
+ num_blocks = 10
39
+ wallet_a = WALLET_A
40
+ coinbase_puzzlehash = WALLET_A_PUZZLE_HASHES[0]
41
+ receiver_puzzlehash = BURN_PUZZLE_HASH
42
+ full_node_api_1, _, _, _, bt = two_nodes
43
+ full_node_1 = full_node_api_1.full_node
44
+ blocks = bt.get_consecutive_blocks(
45
+ num_blocks, farmer_reward_puzzle_hash=coinbase_puzzlehash, guarantee_transaction_block=True
46
+ )
47
+
48
+ await add_blocks_in_batches(blocks, full_node_api_1.full_node)
49
+
50
+ spend_block = blocks[2]
51
+ spend_coin = None
52
+ for coin in spend_block.get_included_reward_coins():
53
+ if coin.puzzle_hash == coinbase_puzzlehash:
54
+ spend_coin = coin
55
+
56
+ assert spend_coin is not None
57
+ spend_bundle = wallet_a.generate_signed_transaction(uint64(1000), receiver_puzzlehash, spend_coin)
58
+
59
+ assert spend_bundle is not None
60
+ tx: wallet_protocol.SendTransaction = wallet_protocol.SendTransaction(spend_bundle)
61
+
62
+ await full_node_api_1.send_transaction(tx)
63
+
64
+ sb = full_node_1.mempool_manager.get_spendbundle(spend_bundle.name())
65
+ assert sb == spend_bundle
66
+
67
+ last_block = blocks[-1]
68
+ result = await full_node_1.mempool_manager.create_bundle_from_mempool(
69
+ last_block.header_hash, full_node_1.coin_store.get_unspent_lineage_info_for_puzzle_hash
70
+ )
71
+ assert result is not None
72
+ next_spendbundle, _ = result
73
+
74
+ new_blocks = bt.get_consecutive_blocks(
75
+ 1,
76
+ block_list_input=blocks,
77
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
78
+ transaction_data=next_spendbundle,
79
+ guarantee_transaction_block=True,
80
+ )
81
+
82
+ next_block = new_blocks[-1]
83
+ await full_node_1.add_block(next_block)
84
+
85
+ blockchain_peak = full_node_1.blockchain.get_peak()
86
+ assert blockchain_peak is not None
87
+ assert next_block.header_hash == blockchain_peak.header_hash
88
+
89
+ added_coins = next_spendbundle.additions()
90
+
91
+ # Two coins are added, main spend and change
92
+ assert len(added_coins) == 2
93
+ for coin in added_coins:
94
+ unspent = await full_node_1.coin_store.get_coin_record(coin.name())
95
+ assert unspent is not None
96
+ assert not unspent.spent
97
+ assert not unspent.coinbase
98
+
99
+ @pytest.mark.anyio
100
+ async def test_validate_blockchain_with_double_spend(
101
+ self, two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]
102
+ ) -> None:
103
+ num_blocks = 5
104
+ wallet_a = WALLET_A
105
+ coinbase_puzzlehash = WALLET_A_PUZZLE_HASHES[0]
106
+ receiver_puzzlehash = BURN_PUZZLE_HASH
107
+ full_node_api_1, _, _, _, bt = two_nodes
108
+ full_node_1 = full_node_api_1.full_node
109
+ blocks = bt.get_consecutive_blocks(
110
+ num_blocks, farmer_reward_puzzle_hash=coinbase_puzzlehash, guarantee_transaction_block=True
111
+ )
112
+
113
+ await add_blocks_in_batches(blocks, full_node_api_1.full_node)
114
+
115
+ spend_block = blocks[2]
116
+ spend_coin = None
117
+ for coin in spend_block.get_included_reward_coins():
118
+ if coin.puzzle_hash == coinbase_puzzlehash:
119
+ spend_coin = coin
120
+ assert spend_coin is not None
121
+
122
+ spend_bundle = wallet_a.generate_signed_transaction(uint64(1000), receiver_puzzlehash, spend_coin)
123
+ spend_bundle_double = wallet_a.generate_signed_transaction(uint64(1001), receiver_puzzlehash, spend_coin)
124
+
125
+ block_spendbundle = SpendBundle.aggregate([spend_bundle, spend_bundle_double])
126
+
127
+ new_blocks = bt.get_consecutive_blocks(
128
+ 1,
129
+ block_list_input=blocks,
130
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
131
+ transaction_data=block_spendbundle,
132
+ guarantee_transaction_block=True,
133
+ )
134
+
135
+ next_block = new_blocks[-1]
136
+ await _validate_and_add_block(full_node_1.blockchain, next_block, expected_error=Err.DOUBLE_SPEND)
137
+
138
+ @pytest.mark.anyio
139
+ async def test_validate_blockchain_duplicate_output(
140
+ self, two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]
141
+ ) -> None:
142
+ num_blocks = 3
143
+ wallet_a = WALLET_A
144
+ coinbase_puzzlehash = WALLET_A_PUZZLE_HASHES[0]
145
+ receiver_puzzlehash = BURN_PUZZLE_HASH
146
+ full_node_api_1, _, _, _, bt = two_nodes
147
+ full_node_1 = full_node_api_1.full_node
148
+ blocks = bt.get_consecutive_blocks(
149
+ num_blocks, farmer_reward_puzzle_hash=coinbase_puzzlehash, guarantee_transaction_block=True
150
+ )
151
+
152
+ await add_blocks_in_batches(blocks, full_node_api_1.full_node)
153
+
154
+ spend_block = blocks[2]
155
+
156
+ spend_coin = None
157
+ for coin in spend_block.get_included_reward_coins():
158
+ if coin.puzzle_hash == coinbase_puzzlehash:
159
+ spend_coin = coin
160
+ assert spend_coin is not None
161
+
162
+ spend_bundle = wallet_a.generate_signed_transaction(
163
+ uint64(1000), receiver_puzzlehash, spend_coin, additional_outputs=[(receiver_puzzlehash, 1000)]
164
+ )
165
+
166
+ new_blocks = bt.get_consecutive_blocks(
167
+ 1,
168
+ block_list_input=blocks,
169
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
170
+ transaction_data=spend_bundle,
171
+ guarantee_transaction_block=True,
172
+ )
173
+
174
+ next_block = new_blocks[-1]
175
+ await _validate_and_add_block(full_node_1.blockchain, next_block, expected_error=Err.DUPLICATE_OUTPUT)
176
+
177
+ @pytest.mark.anyio
178
+ async def test_validate_blockchain_with_reorg_double_spend(
179
+ self, two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]
180
+ ) -> None:
181
+ num_blocks = 10
182
+ wallet_a = WALLET_A
183
+ coinbase_puzzlehash = WALLET_A_PUZZLE_HASHES[0]
184
+ receiver_puzzlehash = BURN_PUZZLE_HASH
185
+ full_node_api_1, _, _, _, bt = two_nodes
186
+ blocks = bt.get_consecutive_blocks(
187
+ num_blocks, farmer_reward_puzzle_hash=coinbase_puzzlehash, guarantee_transaction_block=True
188
+ )
189
+
190
+ await add_blocks_in_batches(blocks, full_node_api_1.full_node)
191
+
192
+ spend_block = blocks[2]
193
+
194
+ spend_coin = None
195
+ for coin in spend_block.get_included_reward_coins():
196
+ if coin.puzzle_hash == coinbase_puzzlehash:
197
+ spend_coin = coin
198
+ assert spend_coin is not None
199
+
200
+ spend_bundle = wallet_a.generate_signed_transaction(uint64(1000), receiver_puzzlehash, spend_coin)
201
+
202
+ blocks_spend = bt.get_consecutive_blocks(
203
+ 1,
204
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
205
+ guarantee_transaction_block=True,
206
+ transaction_data=spend_bundle,
207
+ )
208
+ # Move chain to height 10, with a spend at height 10
209
+ await add_blocks_in_batches(blocks_spend, full_node_api_1.full_node)
210
+
211
+ # Reorg at height 5, add up to and including height 12
212
+ new_blocks = bt.get_consecutive_blocks(
213
+ 7,
214
+ blocks[:6],
215
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
216
+ guarantee_transaction_block=True,
217
+ seed=b"another seed",
218
+ )
219
+
220
+ await add_blocks_in_batches(new_blocks[-7:], full_node_api_1.full_node)
221
+
222
+ # Spend the same coin in the new reorg chain at height 13
223
+ new_blocks = bt.get_consecutive_blocks(
224
+ 1,
225
+ new_blocks,
226
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
227
+ guarantee_transaction_block=True,
228
+ transaction_data=spend_bundle,
229
+ )
230
+
231
+ await _validate_and_add_block(full_node_api_1.full_node.blockchain, new_blocks[-1])
232
+
233
+ # But can't spend it twice
234
+ new_blocks_double = bt.get_consecutive_blocks(
235
+ 1,
236
+ new_blocks,
237
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
238
+ guarantee_transaction_block=True,
239
+ transaction_data=spend_bundle,
240
+ )
241
+
242
+ await _validate_and_add_block(
243
+ full_node_api_1.full_node.blockchain, new_blocks_double[-1], expected_error=Err.DOUBLE_SPEND
244
+ )
245
+
246
+ # Now test Reorg at block 5, same spend at block height 12
247
+ new_blocks_reorg = bt.get_consecutive_blocks(
248
+ 1,
249
+ new_blocks[:12],
250
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
251
+ guarantee_transaction_block=True,
252
+ transaction_data=spend_bundle,
253
+ seed=b"spend at 12 is ok",
254
+ )
255
+ await _validate_and_add_block(
256
+ full_node_api_1.full_node.blockchain, new_blocks_reorg[-1], expected_result=AddBlockResult.ADDED_AS_ORPHAN
257
+ )
258
+
259
+ # Spend at height 13 is also OK (same height)
260
+ new_blocks_reorg = bt.get_consecutive_blocks(
261
+ 1,
262
+ new_blocks[:13],
263
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
264
+ guarantee_transaction_block=True,
265
+ transaction_data=spend_bundle,
266
+ seed=b"spend at 13 is ok",
267
+ )
268
+ await _validate_and_add_block(
269
+ full_node_api_1.full_node.blockchain, new_blocks_reorg[-1], expected_result=AddBlockResult.ADDED_AS_ORPHAN
270
+ )
271
+
272
+ # Spend at height 14 is not OK (already spend)
273
+ new_blocks_reorg = bt.get_consecutive_blocks(
274
+ 1,
275
+ new_blocks[:14],
276
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
277
+ guarantee_transaction_block=True,
278
+ transaction_data=spend_bundle,
279
+ seed=b"spend at 14 is double spend",
280
+ )
281
+ await _validate_and_add_block(
282
+ full_node_api_1.full_node.blockchain,
283
+ new_blocks_reorg[-1],
284
+ expected_result=AddBlockResult.INVALID_BLOCK,
285
+ expected_error=Err.DOUBLE_SPEND,
286
+ )
287
+
288
+ @pytest.mark.anyio
289
+ async def test_validate_blockchain_spend_reorg_coin(
290
+ self, two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools], softfork_height: uint32
291
+ ) -> None:
292
+ num_blocks = 10
293
+ wallet_a = WALLET_A
294
+ coinbase_puzzlehash = WALLET_A_PUZZLE_HASHES[0]
295
+ receiver_1_puzzlehash = WALLET_A_PUZZLE_HASHES[1]
296
+ receiver_2_puzzlehash = WALLET_A_PUZZLE_HASHES[2]
297
+ receiver_3_puzzlehash = WALLET_A_PUZZLE_HASHES[3]
298
+ full_node_api_1, _, _, _, bt = two_nodes
299
+ blocks = bt.get_consecutive_blocks(
300
+ num_blocks, farmer_reward_puzzle_hash=coinbase_puzzlehash, guarantee_transaction_block=True
301
+ )
302
+
303
+ await add_blocks_in_batches(blocks, full_node_api_1.full_node)
304
+
305
+ spend_block = blocks[2]
306
+
307
+ spend_coin = None
308
+ for coin in spend_block.get_included_reward_coins():
309
+ if coin.puzzle_hash == coinbase_puzzlehash:
310
+ spend_coin = coin
311
+
312
+ assert spend_coin
313
+ spend_bundle = wallet_a.generate_signed_transaction(uint64(1000), receiver_1_puzzlehash, spend_coin)
314
+
315
+ new_blocks = bt.get_consecutive_blocks(
316
+ 1,
317
+ blocks[:5],
318
+ seed=b"spend_reorg_coin",
319
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
320
+ transaction_data=spend_bundle,
321
+ guarantee_transaction_block=True,
322
+ )
323
+ await add_blocks_in_batches([new_blocks[-1]], full_node_api_1.full_node)
324
+
325
+ coin_2 = None
326
+ for coin in run_and_get_removals_and_additions(
327
+ new_blocks[-1],
328
+ test_constants.MAX_BLOCK_COST_CLVM,
329
+ height=softfork_height,
330
+ constants=bt.constants,
331
+ )[1]:
332
+ if coin.puzzle_hash == receiver_1_puzzlehash:
333
+ coin_2 = coin
334
+ break
335
+ assert coin_2 is not None
336
+
337
+ spend_bundle = wallet_a.generate_signed_transaction(uint64(1000), receiver_2_puzzlehash, coin_2)
338
+
339
+ new_blocks = bt.get_consecutive_blocks(
340
+ 1,
341
+ new_blocks[:6],
342
+ seed=b"spend_reorg_coin",
343
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
344
+ transaction_data=spend_bundle,
345
+ guarantee_transaction_block=True,
346
+ )
347
+ await add_blocks_in_batches(new_blocks, full_node_api_1.full_node)
348
+
349
+ coin_3 = None
350
+ for coin in run_and_get_removals_and_additions(
351
+ new_blocks[-1],
352
+ test_constants.MAX_BLOCK_COST_CLVM,
353
+ height=softfork_height,
354
+ constants=bt.constants,
355
+ )[1]:
356
+ if coin.puzzle_hash == receiver_2_puzzlehash:
357
+ coin_3 = coin
358
+ break
359
+ assert coin_3 is not None
360
+
361
+ spend_bundle = wallet_a.generate_signed_transaction(uint64(1000), receiver_3_puzzlehash, coin_3)
362
+
363
+ new_blocks = bt.get_consecutive_blocks(
364
+ 1,
365
+ new_blocks[:7],
366
+ seed=b"spend_reorg_coin",
367
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
368
+ transaction_data=spend_bundle,
369
+ guarantee_transaction_block=True,
370
+ )
371
+ await add_blocks_in_batches(new_blocks, full_node_api_1.full_node)
372
+
373
+ @pytest.mark.anyio
374
+ async def test_validate_blockchain_spend_reorg_cb_coin(
375
+ self, two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]
376
+ ) -> None:
377
+ num_blocks = 15
378
+ wallet_a = WALLET_A
379
+ coinbase_puzzlehash = WALLET_A_PUZZLE_HASHES[0]
380
+ receiver_1_puzzlehash = WALLET_A_PUZZLE_HASHES[1]
381
+ full_node_api_1, _, _, _, bt = two_nodes
382
+ blocks = bt.get_consecutive_blocks(num_blocks, farmer_reward_puzzle_hash=coinbase_puzzlehash)
383
+ await add_blocks_in_batches(blocks, full_node_api_1.full_node)
384
+
385
+ # Spends a coinbase created in reorg
386
+ new_blocks = bt.get_consecutive_blocks(
387
+ 5,
388
+ blocks[:6],
389
+ seed=b"reorg cb coin",
390
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
391
+ guarantee_transaction_block=True,
392
+ )
393
+
394
+ await add_blocks_in_batches(new_blocks, full_node_api_1.full_node)
395
+
396
+ spend_block = new_blocks[-1]
397
+ spend_coin = None
398
+ for coin in spend_block.get_included_reward_coins():
399
+ if coin.puzzle_hash == coinbase_puzzlehash:
400
+ spend_coin = coin
401
+ assert spend_coin is not None
402
+ spend_bundle = wallet_a.generate_signed_transaction(uint64(1000), receiver_1_puzzlehash, spend_coin)
403
+
404
+ new_blocks = bt.get_consecutive_blocks(
405
+ 1,
406
+ new_blocks,
407
+ seed=b"reorg cb coin",
408
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
409
+ transaction_data=spend_bundle,
410
+ guarantee_transaction_block=True,
411
+ )
412
+ await add_blocks_in_batches(new_blocks, full_node_api_1.full_node)
413
+
414
+ @pytest.mark.anyio
415
+ async def test_validate_blockchain_spend_reorg_since_genesis(
416
+ self, two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]
417
+ ) -> None:
418
+ num_blocks = 10
419
+ wallet_a = WALLET_A
420
+ coinbase_puzzlehash = WALLET_A_PUZZLE_HASHES[0]
421
+ receiver_1_puzzlehash = WALLET_A_PUZZLE_HASHES[1]
422
+ full_node_api_1, _, _, _, bt = two_nodes
423
+ blocks = bt.get_consecutive_blocks(
424
+ num_blocks, farmer_reward_puzzle_hash=coinbase_puzzlehash, guarantee_transaction_block=True
425
+ )
426
+
427
+ await add_blocks_in_batches(blocks, full_node_api_1.full_node)
428
+
429
+ spend_block = blocks[-1]
430
+ spend_coin = None
431
+ for coin in spend_block.get_included_reward_coins():
432
+ if coin.puzzle_hash == coinbase_puzzlehash:
433
+ spend_coin = coin
434
+ assert spend_coin is not None
435
+ spend_bundle = wallet_a.generate_signed_transaction(uint64(1000), receiver_1_puzzlehash, spend_coin)
436
+
437
+ new_blocks = bt.get_consecutive_blocks(
438
+ 1, blocks, seed=b"", farmer_reward_puzzle_hash=coinbase_puzzlehash, transaction_data=spend_bundle
439
+ )
440
+ await _validate_and_add_block(full_node_api_1.full_node.blockchain, new_blocks[-1])
441
+
442
+ # Spends a coin in a genesis reorg, that was already spent
443
+ new_blocks = bt.get_consecutive_blocks(
444
+ 12,
445
+ [],
446
+ seed=b"reorg since genesis",
447
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
448
+ guarantee_transaction_block=True,
449
+ )
450
+
451
+ new_blocks = bt.get_consecutive_blocks(
452
+ 1,
453
+ new_blocks,
454
+ seed=b"reorg since genesis",
455
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
456
+ transaction_data=spend_bundle,
457
+ )
458
+
459
+ await add_blocks_in_batches(new_blocks, full_node_api_1.full_node)
460
+
461
+ @pytest.mark.anyio
462
+ async def test_assert_my_coin_id(
463
+ self, two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]
464
+ ) -> None:
465
+ num_blocks = 10
466
+ wallet_a = WALLET_A
467
+ coinbase_puzzlehash = WALLET_A_PUZZLE_HASHES[0]
468
+ receiver_puzzlehash = BURN_PUZZLE_HASH
469
+ full_node_api_1, _, _, _, bt = two_nodes
470
+ full_node_1 = full_node_api_1.full_node
471
+ # Farm blocks
472
+ blocks = bt.get_consecutive_blocks(
473
+ num_blocks, farmer_reward_puzzle_hash=coinbase_puzzlehash, guarantee_transaction_block=True
474
+ )
475
+
476
+ await add_blocks_in_batches(blocks, full_node_api_1.full_node)
477
+
478
+ # Coinbase that gets spent
479
+
480
+ spend_block = blocks[2]
481
+ bad_block = blocks[3]
482
+ spend_coin = None
483
+ bad_spend_coin = None
484
+ for coin in spend_block.get_included_reward_coins():
485
+ if coin.puzzle_hash == coinbase_puzzlehash:
486
+ spend_coin = coin
487
+ assert spend_coin is not None
488
+ for coin in bad_block.get_included_reward_coins():
489
+ if coin.puzzle_hash == coinbase_puzzlehash:
490
+ bad_spend_coin = coin
491
+ assert bad_spend_coin is not None
492
+ valid_cvp = ConditionWithArgs(ConditionOpcode.ASSERT_MY_COIN_ID, [spend_coin.name()])
493
+ valid_dic = {valid_cvp.opcode: [valid_cvp]}
494
+ bad_cvp = ConditionWithArgs(ConditionOpcode.ASSERT_MY_COIN_ID, [bad_spend_coin.name()])
495
+
496
+ bad_dic = {bad_cvp.opcode: [bad_cvp]}
497
+ bad_spend_bundle = wallet_a.generate_signed_transaction(uint64(1000), receiver_puzzlehash, spend_coin, bad_dic)
498
+
499
+ valid_spend_bundle = wallet_a.generate_signed_transaction(
500
+ uint64(1000), receiver_puzzlehash, spend_coin, valid_dic
501
+ )
502
+
503
+ assert bad_spend_bundle is not None
504
+ assert valid_spend_bundle is not None
505
+
506
+ # Invalid block bundle
507
+ # Create another block that includes our transaction
508
+ invalid_new_blocks = bt.get_consecutive_blocks(
509
+ 1,
510
+ blocks,
511
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
512
+ transaction_data=bad_spend_bundle,
513
+ guarantee_transaction_block=True,
514
+ )
515
+
516
+ # Try to validate that block
517
+ await _validate_and_add_block(
518
+ full_node_1.blockchain, invalid_new_blocks[-1], expected_error=Err.ASSERT_MY_COIN_ID_FAILED
519
+ )
520
+
521
+ # Valid block bundle
522
+ # Create another block that includes our transaction
523
+ new_blocks = bt.get_consecutive_blocks(
524
+ 1,
525
+ blocks,
526
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
527
+ transaction_data=valid_spend_bundle,
528
+ guarantee_transaction_block=True,
529
+ )
530
+ await _validate_and_add_block(full_node_1.blockchain, new_blocks[-1])
531
+
532
+ @pytest.mark.anyio
533
+ async def test_assert_coin_announcement_consumed(
534
+ self, two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]
535
+ ) -> None:
536
+ num_blocks = 10
537
+ wallet_a = WALLET_A
538
+ coinbase_puzzlehash = WALLET_A_PUZZLE_HASHES[0]
539
+ receiver_puzzlehash = BURN_PUZZLE_HASH
540
+ full_node_api_1, _, _, _, bt = two_nodes
541
+ full_node_1 = full_node_api_1.full_node
542
+ # Farm blocks
543
+ blocks = bt.get_consecutive_blocks(
544
+ num_blocks, farmer_reward_puzzle_hash=coinbase_puzzlehash, guarantee_transaction_block=True
545
+ )
546
+
547
+ await add_blocks_in_batches(blocks, full_node_api_1.full_node)
548
+
549
+ # Coinbase that gets spent
550
+ block1 = blocks[2]
551
+ block2 = blocks[3]
552
+
553
+ spend_coin_block_1 = None
554
+ spend_coin_block_2 = None
555
+ for coin in block1.get_included_reward_coins():
556
+ if coin.puzzle_hash == coinbase_puzzlehash:
557
+ spend_coin_block_1 = coin
558
+ assert spend_coin_block_1 is not None
559
+ for coin in block2.get_included_reward_coins():
560
+ if coin.puzzle_hash == coinbase_puzzlehash:
561
+ spend_coin_block_2 = coin
562
+ assert spend_coin_block_2 is not None
563
+
564
+ # This condition requires block2 coinbase to be spent
565
+ block1_cvp = ConditionWithArgs(
566
+ ConditionOpcode.ASSERT_COIN_ANNOUNCEMENT,
567
+ [AssertCoinAnnouncement(asserted_id=spend_coin_block_2.name(), asserted_msg=b"test").msg_calc],
568
+ )
569
+ block1_dic = {block1_cvp.opcode: [block1_cvp]}
570
+ block1_spend_bundle = wallet_a.generate_signed_transaction(
571
+ uint64(1000), receiver_puzzlehash, spend_coin_block_1, block1_dic
572
+ )
573
+
574
+ # This condition requires block1 coinbase to be spent
575
+ block2_cvp = ConditionWithArgs(
576
+ ConditionOpcode.CREATE_COIN_ANNOUNCEMENT,
577
+ [b"test"],
578
+ )
579
+ block2_dic = {block2_cvp.opcode: [block2_cvp]}
580
+ block2_spend_bundle = wallet_a.generate_signed_transaction(
581
+ uint64(1000), receiver_puzzlehash, spend_coin_block_2, block2_dic
582
+ )
583
+
584
+ # Invalid block bundle
585
+ assert block1_spend_bundle is not None
586
+ # Create another block that includes our transaction
587
+ invalid_new_blocks = bt.get_consecutive_blocks(
588
+ 1,
589
+ blocks,
590
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
591
+ transaction_data=block1_spend_bundle,
592
+ guarantee_transaction_block=True,
593
+ )
594
+
595
+ # Try to validate that block
596
+ await _validate_and_add_block(
597
+ full_node_1.blockchain, invalid_new_blocks[-1], expected_error=Err.ASSERT_ANNOUNCE_CONSUMED_FAILED
598
+ )
599
+
600
+ # bundle_together contains both transactions
601
+ bundle_together = SpendBundle.aggregate([block1_spend_bundle, block2_spend_bundle])
602
+
603
+ # Create another block that includes our transaction
604
+ new_blocks = bt.get_consecutive_blocks(
605
+ 1,
606
+ blocks,
607
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
608
+ transaction_data=bundle_together,
609
+ guarantee_transaction_block=True,
610
+ )
611
+
612
+ # Try to validate newly created block
613
+ await _validate_and_add_block(full_node_1.blockchain, new_blocks[-1])
614
+
615
+ @pytest.mark.anyio
616
+ async def test_assert_puzzle_announcement_consumed(
617
+ self, two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]
618
+ ) -> None:
619
+ num_blocks = 10
620
+ wallet_a = WALLET_A
621
+ coinbase_puzzlehash = WALLET_A_PUZZLE_HASHES[0]
622
+ receiver_puzzlehash = BURN_PUZZLE_HASH
623
+ full_node_api_1, _, _, _, bt = two_nodes
624
+ full_node_1 = full_node_api_1.full_node
625
+ # Farm blocks
626
+ blocks = bt.get_consecutive_blocks(
627
+ num_blocks, farmer_reward_puzzle_hash=coinbase_puzzlehash, guarantee_transaction_block=True
628
+ )
629
+
630
+ await add_blocks_in_batches(blocks, full_node_api_1.full_node)
631
+
632
+ # Coinbase that gets spent
633
+ block1 = blocks[2]
634
+ block2 = blocks[3]
635
+
636
+ spend_coin_block_1 = None
637
+ spend_coin_block_2 = None
638
+ for coin in block1.get_included_reward_coins():
639
+ if coin.puzzle_hash == coinbase_puzzlehash:
640
+ spend_coin_block_1 = coin
641
+ assert spend_coin_block_1 is not None
642
+ for coin in block2.get_included_reward_coins():
643
+ if coin.puzzle_hash == coinbase_puzzlehash:
644
+ spend_coin_block_2 = coin
645
+ assert spend_coin_block_2 is not None
646
+
647
+ # This condition requires block2 coinbase to be spent
648
+ block1_cvp = ConditionWithArgs(
649
+ ConditionOpcode.ASSERT_PUZZLE_ANNOUNCEMENT,
650
+ [AssertPuzzleAnnouncement(asserted_ph=spend_coin_block_2.puzzle_hash, asserted_msg=b"test").msg_calc],
651
+ )
652
+ block1_dic = {block1_cvp.opcode: [block1_cvp]}
653
+ block1_spend_bundle = wallet_a.generate_signed_transaction(
654
+ uint64(1000), receiver_puzzlehash, spend_coin_block_1, block1_dic
655
+ )
656
+
657
+ # This condition requires block1 coinbase to be spent
658
+ block2_cvp = ConditionWithArgs(
659
+ ConditionOpcode.CREATE_PUZZLE_ANNOUNCEMENT,
660
+ [b"test"],
661
+ )
662
+ block2_dic = {block2_cvp.opcode: [block2_cvp]}
663
+ block2_spend_bundle = wallet_a.generate_signed_transaction(
664
+ uint64(1000), receiver_puzzlehash, spend_coin_block_2, block2_dic
665
+ )
666
+
667
+ # Invalid block bundle
668
+ assert block1_spend_bundle is not None
669
+ # Create another block that includes our transaction
670
+ invalid_new_blocks = bt.get_consecutive_blocks(
671
+ 1,
672
+ blocks,
673
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
674
+ transaction_data=block1_spend_bundle,
675
+ guarantee_transaction_block=True,
676
+ )
677
+
678
+ # Try to validate that block
679
+ await _validate_and_add_block(
680
+ full_node_1.blockchain, invalid_new_blocks[-1], expected_error=Err.ASSERT_ANNOUNCE_CONSUMED_FAILED
681
+ )
682
+
683
+ # bundle_together contains both transactions
684
+ bundle_together = SpendBundle.aggregate([block1_spend_bundle, block2_spend_bundle])
685
+
686
+ # Create another block that includes our transaction
687
+ new_blocks = bt.get_consecutive_blocks(
688
+ 1,
689
+ blocks,
690
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
691
+ transaction_data=bundle_together,
692
+ guarantee_transaction_block=True,
693
+ )
694
+
695
+ # Try to validate newly created block
696
+ await _validate_and_add_block(full_node_1.blockchain, new_blocks[-1])
697
+
698
+ @pytest.mark.anyio
699
+ async def test_assert_height_absolute(
700
+ self, two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]
701
+ ) -> None:
702
+ num_blocks = 10
703
+ wallet_a = WALLET_A
704
+ coinbase_puzzlehash = WALLET_A_PUZZLE_HASHES[0]
705
+ receiver_puzzlehash = BURN_PUZZLE_HASH
706
+ full_node_api_1, _, _, _, bt = two_nodes
707
+ full_node_1 = full_node_api_1.full_node
708
+ # Farm blocks
709
+ blocks = bt.get_consecutive_blocks(
710
+ num_blocks, farmer_reward_puzzle_hash=coinbase_puzzlehash, guarantee_transaction_block=True
711
+ )
712
+
713
+ await add_blocks_in_batches(blocks, full_node_api_1.full_node)
714
+
715
+ # Coinbase that gets spent
716
+ block1 = blocks[2]
717
+ spend_coin_block_1 = None
718
+ for coin in block1.get_included_reward_coins():
719
+ if coin.puzzle_hash == coinbase_puzzlehash:
720
+ spend_coin_block_1 = coin
721
+ assert spend_coin_block_1 is not None
722
+
723
+ # This condition requires block1 coinbase to be spent after index 10
724
+ block1_cvp = ConditionWithArgs(ConditionOpcode.ASSERT_HEIGHT_ABSOLUTE, [int_to_bytes(10)])
725
+ block1_dic = {block1_cvp.opcode: [block1_cvp]}
726
+ block1_spend_bundle = wallet_a.generate_signed_transaction(
727
+ uint64(1000), receiver_puzzlehash, spend_coin_block_1, block1_dic
728
+ )
729
+
730
+ # program that will be sent too early
731
+ assert block1_spend_bundle is not None
732
+ invalid_new_blocks = bt.get_consecutive_blocks(
733
+ 1,
734
+ blocks,
735
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
736
+ transaction_data=block1_spend_bundle,
737
+ guarantee_transaction_block=True,
738
+ )
739
+
740
+ # Try to validate that block at index 10
741
+ await _validate_and_add_block(
742
+ full_node_1.blockchain, invalid_new_blocks[-1], expected_error=Err.ASSERT_HEIGHT_ABSOLUTE_FAILED
743
+ )
744
+
745
+ new_blocks = bt.get_consecutive_blocks(
746
+ 1,
747
+ blocks,
748
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
749
+ guarantee_transaction_block=True,
750
+ )
751
+ await _validate_and_add_block(full_node_1.blockchain, new_blocks[-1])
752
+
753
+ # At index 11, it can be spent
754
+ new_blocks = bt.get_consecutive_blocks(
755
+ 1,
756
+ new_blocks,
757
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
758
+ transaction_data=block1_spend_bundle,
759
+ guarantee_transaction_block=True,
760
+ )
761
+ await _validate_and_add_block(full_node_1.blockchain, new_blocks[-1])
762
+
763
+ @pytest.mark.anyio
764
+ async def test_assert_height_relative(
765
+ self, two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]
766
+ ) -> None:
767
+ num_blocks = 11
768
+ wallet_a = WALLET_A
769
+ coinbase_puzzlehash = WALLET_A_PUZZLE_HASHES[0]
770
+ receiver_puzzlehash = BURN_PUZZLE_HASH
771
+ full_node_api_1, _, _, _, bt = two_nodes
772
+ full_node_1 = full_node_api_1.full_node
773
+ # Farm blocks
774
+ blocks = bt.get_consecutive_blocks(
775
+ num_blocks, farmer_reward_puzzle_hash=coinbase_puzzlehash, guarantee_transaction_block=True
776
+ )
777
+
778
+ await add_blocks_in_batches(blocks, full_node_api_1.full_node)
779
+
780
+ # Coinbase that gets spent
781
+ block1 = blocks[2]
782
+ spend_coin_block_1 = None
783
+ for coin in block1.get_included_reward_coins():
784
+ if coin.puzzle_hash == coinbase_puzzlehash:
785
+ spend_coin_block_1 = coin
786
+ assert spend_coin_block_1 is not None
787
+
788
+ # This condition requires block1 coinbase to be spent after index 11
789
+ # This condition requires block1 coinbase to be spent more than 10 block after it was farmed
790
+ # block index has to be greater than (2 + 9 = 11)
791
+ block1_cvp = ConditionWithArgs(ConditionOpcode.ASSERT_HEIGHT_RELATIVE, [int_to_bytes(9)])
792
+ block1_dic = {block1_cvp.opcode: [block1_cvp]}
793
+ block1_spend_bundle = wallet_a.generate_signed_transaction(
794
+ uint64(1000), receiver_puzzlehash, spend_coin_block_1, block1_dic
795
+ )
796
+
797
+ # program that will be sent too early
798
+ assert block1_spend_bundle is not None
799
+ invalid_new_blocks = bt.get_consecutive_blocks(
800
+ 1,
801
+ blocks,
802
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
803
+ transaction_data=block1_spend_bundle,
804
+ guarantee_transaction_block=True,
805
+ )
806
+
807
+ # Try to validate that block at index 11
808
+ await _validate_and_add_block(
809
+ full_node_1.blockchain, invalid_new_blocks[-1], expected_error=Err.ASSERT_HEIGHT_RELATIVE_FAILED
810
+ )
811
+
812
+ new_blocks = bt.get_consecutive_blocks(
813
+ 1,
814
+ blocks,
815
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
816
+ guarantee_transaction_block=True,
817
+ )
818
+ await _validate_and_add_block(full_node_1.blockchain, new_blocks[-1])
819
+
820
+ # At index 12, it can be spent
821
+ new_blocks = bt.get_consecutive_blocks(
822
+ 1,
823
+ new_blocks,
824
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
825
+ transaction_data=block1_spend_bundle,
826
+ guarantee_transaction_block=True,
827
+ )
828
+ await _validate_and_add_block(full_node_1.blockchain, new_blocks[-1])
829
+
830
+ @pytest.mark.anyio
831
+ async def test_assert_seconds_relative(
832
+ self, two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]
833
+ ) -> None:
834
+ num_blocks = 10
835
+ wallet_a = WALLET_A
836
+ coinbase_puzzlehash = WALLET_A_PUZZLE_HASHES[0]
837
+ receiver_puzzlehash = BURN_PUZZLE_HASH
838
+ full_node_api_1, _, _, _, bt = two_nodes
839
+ full_node_1 = full_node_api_1.full_node
840
+ # Farm blocks
841
+ blocks = bt.get_consecutive_blocks(
842
+ num_blocks, farmer_reward_puzzle_hash=coinbase_puzzlehash, guarantee_transaction_block=True
843
+ )
844
+
845
+ await add_blocks_in_batches(blocks, full_node_api_1.full_node)
846
+
847
+ # Coinbase that gets spent
848
+ block1 = blocks[2]
849
+ spend_coin_block_1 = None
850
+ for coin in block1.get_included_reward_coins():
851
+ if coin.puzzle_hash == coinbase_puzzlehash:
852
+ spend_coin_block_1 = coin
853
+ assert spend_coin_block_1 is not None
854
+
855
+ # This condition requires block1 coinbase to be spent 300 seconds after coin creation
856
+ block1_cvp = ConditionWithArgs(ConditionOpcode.ASSERT_SECONDS_RELATIVE, [int_to_bytes(300)])
857
+ block1_dic = {block1_cvp.opcode: [block1_cvp]}
858
+ block1_spend_bundle = wallet_a.generate_signed_transaction(
859
+ uint64(1000), receiver_puzzlehash, spend_coin_block_1, block1_dic
860
+ )
861
+
862
+ # program that will be sent to early
863
+ assert block1_spend_bundle is not None
864
+ invalid_new_blocks = bt.get_consecutive_blocks(
865
+ 1,
866
+ blocks,
867
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
868
+ transaction_data=block1_spend_bundle,
869
+ time_per_block=20,
870
+ guarantee_transaction_block=True,
871
+ )
872
+
873
+ # Try to validate that block before 300 sec
874
+ await _validate_and_add_block(
875
+ full_node_1.blockchain, invalid_new_blocks[-1], expected_error=Err.ASSERT_SECONDS_RELATIVE_FAILED
876
+ )
877
+
878
+ # we compare the timestamp against the previous transaction block, so in
879
+ # order to progress the timestamp, we need to farm one more block
880
+ blocks.extend(
881
+ bt.get_consecutive_blocks(
882
+ 1,
883
+ blocks,
884
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
885
+ guarantee_transaction_block=True,
886
+ time_per_block=301,
887
+ )
888
+ )
889
+ await _validate_and_add_block(full_node_1.blockchain, blocks[-1])
890
+
891
+ valid_new_blocks = bt.get_consecutive_blocks(
892
+ 1,
893
+ blocks,
894
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
895
+ transaction_data=block1_spend_bundle,
896
+ guarantee_transaction_block=True,
897
+ time_per_block=301,
898
+ )
899
+ await _validate_and_add_block(full_node_1.blockchain, valid_new_blocks[-1])
900
+
901
+ @pytest.mark.anyio
902
+ async def test_assert_seconds_absolute(
903
+ self, two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]
904
+ ) -> None:
905
+ num_blocks = 10
906
+ wallet_a = WALLET_A
907
+ coinbase_puzzlehash = WALLET_A_PUZZLE_HASHES[0]
908
+ receiver_puzzlehash = BURN_PUZZLE_HASH
909
+ full_node_api_1, _, _, _, bt = two_nodes
910
+ full_node_1 = full_node_api_1.full_node
911
+ # Farm blocks
912
+ blocks = bt.get_consecutive_blocks(
913
+ num_blocks, farmer_reward_puzzle_hash=coinbase_puzzlehash, guarantee_transaction_block=True
914
+ )
915
+
916
+ await add_blocks_in_batches(blocks, full_node_api_1.full_node)
917
+
918
+ # Coinbase that gets spent
919
+ block1 = blocks[2]
920
+ spend_coin_block_1 = None
921
+ for coin in block1.get_included_reward_coins():
922
+ if coin.puzzle_hash == coinbase_puzzlehash:
923
+ spend_coin_block_1 = coin
924
+ assert spend_coin_block_1 is not None
925
+
926
+ # This condition requires block1 coinbase to be spent after 30 seconds from now
927
+ assert blocks[-1].foliage_transaction_block is not None
928
+ current_time_plus3 = uint64(blocks[-1].foliage_transaction_block.timestamp + 30)
929
+ block1_cvp = ConditionWithArgs(ConditionOpcode.ASSERT_SECONDS_ABSOLUTE, [int_to_bytes(current_time_plus3)])
930
+ block1_dic = {block1_cvp.opcode: [block1_cvp]}
931
+ block1_spend_bundle = wallet_a.generate_signed_transaction(
932
+ uint64(1000), receiver_puzzlehash, spend_coin_block_1, block1_dic
933
+ )
934
+
935
+ # program that will be sent to early
936
+ assert block1_spend_bundle is not None
937
+ invalid_new_blocks = bt.get_consecutive_blocks(
938
+ 1,
939
+ blocks,
940
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
941
+ transaction_data=block1_spend_bundle,
942
+ time_per_block=20,
943
+ guarantee_transaction_block=True,
944
+ )
945
+
946
+ # Try to validate that block before 30 sec
947
+ await _validate_and_add_block(
948
+ full_node_1.blockchain, invalid_new_blocks[-1], expected_error=Err.ASSERT_SECONDS_ABSOLUTE_FAILED
949
+ )
950
+
951
+ # we compare the timestamp against the previous transaction block, so in
952
+ # order to progress the timestamp, we need to farm one more block
953
+ blocks.extend(
954
+ bt.get_consecutive_blocks(
955
+ 1,
956
+ blocks,
957
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
958
+ guarantee_transaction_block=True,
959
+ time_per_block=30,
960
+ )
961
+ )
962
+ await _validate_and_add_block(full_node_1.blockchain, blocks[-1])
963
+
964
+ valid_new_blocks = bt.get_consecutive_blocks(
965
+ 1,
966
+ blocks,
967
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
968
+ transaction_data=block1_spend_bundle,
969
+ guarantee_transaction_block=True,
970
+ time_per_block=31,
971
+ )
972
+ await _validate_and_add_block(full_node_1.blockchain, valid_new_blocks[-1])
973
+
974
+ @pytest.mark.anyio
975
+ async def test_assert_fee_condition(
976
+ self, two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]
977
+ ) -> None:
978
+ num_blocks = 10
979
+ wallet_a = WALLET_A
980
+ coinbase_puzzlehash = WALLET_A_PUZZLE_HASHES[0]
981
+ receiver_puzzlehash = BURN_PUZZLE_HASH
982
+ full_node_api_1, _, _, _, bt = two_nodes
983
+ full_node_1 = full_node_api_1.full_node
984
+ # Farm blocks
985
+ blocks = bt.get_consecutive_blocks(
986
+ num_blocks, farmer_reward_puzzle_hash=coinbase_puzzlehash, guarantee_transaction_block=True
987
+ )
988
+
989
+ await add_blocks_in_batches(blocks, full_node_api_1.full_node)
990
+
991
+ # Coinbase that gets spent
992
+ block1 = blocks[2]
993
+ spend_coin_block_1 = None
994
+ for coin in block1.get_included_reward_coins():
995
+ if coin.puzzle_hash == coinbase_puzzlehash:
996
+ spend_coin_block_1 = coin
997
+ assert spend_coin_block_1 is not None
998
+
999
+ # This condition requires fee to be 10 mojo
1000
+ cvp_fee = ConditionWithArgs(ConditionOpcode.RESERVE_FEE, [int_to_bytes(10)])
1001
+ # This spend bundle has 9 mojo as fee
1002
+ block1_dic_bad = {cvp_fee.opcode: [cvp_fee]}
1003
+ block1_dic_good = {cvp_fee.opcode: [cvp_fee]}
1004
+ block1_spend_bundle_bad = wallet_a.generate_signed_transaction(
1005
+ uint64(1000), receiver_puzzlehash, spend_coin_block_1, block1_dic_bad, fee=9
1006
+ )
1007
+ block1_spend_bundle_good = wallet_a.generate_signed_transaction(
1008
+ uint64(1000), receiver_puzzlehash, spend_coin_block_1, block1_dic_good, fee=10
1009
+ )
1010
+ log.warning(block1_spend_bundle_good.additions())
1011
+ log.warning(f"Spend bundle fees: {estimate_fees(block1_spend_bundle_good)}")
1012
+ invalid_new_blocks = bt.get_consecutive_blocks(
1013
+ 1,
1014
+ blocks,
1015
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
1016
+ transaction_data=block1_spend_bundle_bad,
1017
+ guarantee_transaction_block=True,
1018
+ )
1019
+
1020
+ await _validate_and_add_block(
1021
+ full_node_1.blockchain, invalid_new_blocks[-1], expected_error=Err.RESERVE_FEE_CONDITION_FAILED
1022
+ )
1023
+
1024
+ valid_new_blocks = bt.get_consecutive_blocks(
1025
+ 1,
1026
+ blocks,
1027
+ farmer_reward_puzzle_hash=coinbase_puzzlehash,
1028
+ transaction_data=block1_spend_bundle_good,
1029
+ guarantee_transaction_block=True,
1030
+ )
1031
+ await _validate_and_add_block(full_node_1.blockchain, valid_new_blocks[-1])