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,945 @@
1
+ from __future__ import annotations
2
+
3
+ import dataclasses
4
+ import random
5
+ from typing import Any, Optional
6
+
7
+ import pytest
8
+
9
+ from chia._tests.util.db_connection import DBConnection
10
+ from chia.types.blockchain_format.coin import Coin
11
+ from chia.types.blockchain_format.sized_bytes import bytes32
12
+ from chia.types.mempool_inclusion_status import MempoolInclusionStatus
13
+ from chia.util.errors import Err
14
+ from chia.util.ints import uint8, uint32, uint64
15
+ from chia.wallet.conditions import ConditionValidTimes
16
+ from chia.wallet.transaction_record import TransactionRecord, TransactionRecordOld, minimum_send_attempts
17
+ from chia.wallet.util.query_filter import TransactionTypeFilter
18
+ from chia.wallet.util.transaction_type import TransactionType
19
+ from chia.wallet.wallet_transaction_store import (
20
+ WalletTransactionStore,
21
+ filter_ok_mempool_status,
22
+ get_light_transaction_record,
23
+ )
24
+
25
+ module_seeded_random = random.Random()
26
+ module_seeded_random.seed(a=0, version=2)
27
+
28
+ coin_1 = Coin(bytes32.random(module_seeded_random), bytes32.random(module_seeded_random), uint64(12312))
29
+ coin_2 = Coin(bytes32.random(module_seeded_random), bytes32.random(module_seeded_random), uint64(1234))
30
+ coin_3 = Coin(bytes32.random(module_seeded_random), bytes32.random(module_seeded_random), uint64(12312 - 1234))
31
+
32
+ tr1 = TransactionRecord(
33
+ uint32(0), # confirmed height
34
+ uint64(1000), # created_at_time
35
+ bytes32(bytes32.random(module_seeded_random)), # to_puzzle_hash
36
+ uint64(1234), # amount
37
+ uint64(12), # fee_amount
38
+ False, # confirmed
39
+ uint32(0), # sent
40
+ None, # Optional[SpendBundle] spend_bundle
41
+ [coin_2, coin_3], # additions
42
+ [coin_1], # removals
43
+ uint32(1), # wallet_id
44
+ [], # list[tuple[str, uint8, Optional[str]]] sent_to
45
+ bytes32(bytes32.random(module_seeded_random)), # trade_id
46
+ uint32(TransactionType.OUTGOING_TX), # type
47
+ bytes32(bytes32.random(module_seeded_random)), # name
48
+ [], # list[tuple[bytes32, list[bytes]]] memos
49
+ ConditionValidTimes(),
50
+ )
51
+
52
+
53
+ @pytest.mark.anyio
54
+ async def test_add() -> None:
55
+ async with DBConnection(1) as db_wrapper:
56
+ store = await WalletTransactionStore.create(db_wrapper)
57
+
58
+ assert await store.get_transaction_record(tr1.name) is None
59
+ await store.add_transaction_record(tr1)
60
+ assert await store.get_transaction_record(tr1.name) == tr1
61
+
62
+
63
+ @pytest.mark.anyio
64
+ async def test_delete() -> None:
65
+ async with DBConnection(1) as db_wrapper:
66
+ store = await WalletTransactionStore.create(db_wrapper)
67
+
68
+ await store.add_transaction_record(tr1)
69
+ assert await store.get_transaction_record(tr1.name) == tr1
70
+ await store.delete_transaction_record(tr1.name)
71
+ assert await store.get_transaction_record(tr1.name) is None
72
+
73
+
74
+ @pytest.mark.anyio
75
+ async def test_set_confirmed() -> None:
76
+ async with DBConnection(1) as db_wrapper:
77
+ store = await WalletTransactionStore.create(db_wrapper)
78
+
79
+ await store.add_transaction_record(tr1)
80
+ await store.set_confirmed(tr1.name, uint32(100))
81
+
82
+ assert await store.get_transaction_record(tr1.name) == dataclasses.replace(
83
+ tr1, confirmed=True, confirmed_at_height=uint32(100)
84
+ )
85
+
86
+
87
+ @pytest.mark.anyio
88
+ async def test_increment_sent_noop(seeded_random: random.Random) -> None:
89
+ async with DBConnection(1) as db_wrapper:
90
+ store = await WalletTransactionStore.create(db_wrapper)
91
+
92
+ assert (
93
+ await store.increment_sent(
94
+ bytes32(bytes32.random(seeded_random)), "peer1", MempoolInclusionStatus.PENDING, None
95
+ )
96
+ is False
97
+ )
98
+
99
+
100
+ @pytest.mark.anyio
101
+ async def test_increment_sent() -> None:
102
+ async with DBConnection(1) as db_wrapper:
103
+ store = await WalletTransactionStore.create(db_wrapper)
104
+
105
+ await store.add_transaction_record(tr1)
106
+ tr = await store.get_transaction_record(tr1.name)
107
+ assert tr.sent == 0
108
+ assert tr.sent_to == []
109
+
110
+ assert await store.increment_sent(tr1.name, "peer1", MempoolInclusionStatus.PENDING, None) is True
111
+ tr = await store.get_transaction_record(tr1.name)
112
+ assert tr.sent == 1
113
+ assert tr.sent_to == [("peer1", uint8(2), None)]
114
+
115
+ assert await store.increment_sent(tr1.name, "peer1", MempoolInclusionStatus.SUCCESS, None) is True
116
+ tr = await store.get_transaction_record(tr1.name)
117
+ assert tr.sent == 1
118
+ assert tr.sent_to == [("peer1", uint8(2), None), ("peer1", uint8(1), None)]
119
+
120
+ assert await store.increment_sent(tr1.name, "peer2", MempoolInclusionStatus.SUCCESS, None) is True
121
+ tr = await store.get_transaction_record(tr1.name)
122
+ assert tr.sent == 2
123
+ assert tr.sent_to == [("peer1", uint8(2), None), ("peer1", uint8(1), None), ("peer2", uint8(1), None)]
124
+
125
+
126
+ @pytest.mark.anyio
127
+ async def test_increment_sent_error() -> None:
128
+ async with DBConnection(1) as db_wrapper:
129
+ store = await WalletTransactionStore.create(db_wrapper)
130
+
131
+ await store.add_transaction_record(tr1)
132
+ tr = await store.get_transaction_record(tr1.name)
133
+ assert tr.sent == 0
134
+ assert tr.sent_to == []
135
+
136
+ await store.increment_sent(tr1.name, "peer1", MempoolInclusionStatus.FAILED, Err.MEMPOOL_NOT_INITIALIZED)
137
+ tr = await store.get_transaction_record(tr1.name)
138
+ assert tr.sent == 1
139
+ assert tr.sent_to == [("peer1", uint8(3), "MEMPOOL_NOT_INITIALIZED")]
140
+
141
+
142
+ def test_filter_ok_mempool_status() -> None:
143
+ assert filter_ok_mempool_status([("peer1", uint8(1), None)]) == []
144
+ assert filter_ok_mempool_status([("peer1", uint8(2), None)]) == []
145
+ assert filter_ok_mempool_status([("peer1", uint8(3), None)]) == [("peer1", uint8(3), None)]
146
+ assert filter_ok_mempool_status(
147
+ [("peer1", uint8(2), None), ("peer1", uint8(1), None), ("peer1", uint8(3), None)]
148
+ ) == [("peer1", uint8(3), None)]
149
+
150
+ assert filter_ok_mempool_status([("peer1", uint8(3), "message does not matter")]) == [
151
+ ("peer1", uint8(3), "message does not matter")
152
+ ]
153
+ assert filter_ok_mempool_status([("peer1", uint8(2), "message does not matter")]) == []
154
+
155
+
156
+ @pytest.mark.anyio
157
+ async def test_tx_reorged_update() -> None:
158
+ async with DBConnection(1) as db_wrapper:
159
+ store = await WalletTransactionStore.create(db_wrapper)
160
+
161
+ tr = dataclasses.replace(tr1, sent=uint32(2), sent_to=[("peer1", uint8(1), None), ("peer2", uint8(1), None)])
162
+ await store.add_transaction_record(tr)
163
+ tr = await store.get_transaction_record(tr.name)
164
+ assert tr.sent == 2
165
+ assert tr.sent_to == [("peer1", uint8(1), None), ("peer2", uint8(1), None)]
166
+
167
+ await store.tx_reorged(tr)
168
+ tr = await store.get_transaction_record(tr1.name)
169
+ assert tr.sent == 0
170
+ assert tr.sent_to == []
171
+
172
+
173
+ @pytest.mark.anyio
174
+ async def test_tx_reorged_add() -> None:
175
+ async with DBConnection(1) as db_wrapper:
176
+ store = await WalletTransactionStore.create(db_wrapper)
177
+
178
+ tr = dataclasses.replace(tr1, sent=uint32(2), sent_to=[("peer1", uint8(1), None), ("peer2", uint8(1), None)])
179
+
180
+ await store.get_transaction_record(tr.name) is None
181
+ await store.tx_reorged(tr)
182
+ tr = await store.get_transaction_record(tr.name)
183
+ assert tr.sent == 0
184
+ assert tr.sent_to == []
185
+
186
+
187
+ @pytest.mark.anyio
188
+ async def test_get_tx_record(seeded_random: random.Random) -> None:
189
+ async with DBConnection(1) as db_wrapper:
190
+ store = await WalletTransactionStore.create(db_wrapper)
191
+
192
+ tr2 = dataclasses.replace(tr1, name=bytes32.random(seeded_random))
193
+ tr3 = dataclasses.replace(tr1, name=bytes32.random(seeded_random))
194
+
195
+ assert await store.get_transaction_record(tr1.name) is None
196
+ await store.add_transaction_record(tr1)
197
+ assert await store.get_transaction_record(tr1.name) == tr1
198
+
199
+ assert await store.get_transaction_record(tr2.name) is None
200
+ await store.add_transaction_record(tr2)
201
+ assert await store.get_transaction_record(tr2.name) == tr2
202
+
203
+ assert await store.get_transaction_record(tr3.name) is None
204
+ await store.add_transaction_record(tr3)
205
+ assert await store.get_transaction_record(tr3.name) == tr3
206
+
207
+ assert await store.get_transaction_record(tr1.name) == tr1
208
+ assert await store.get_transaction_record(tr2.name) == tr2
209
+ assert await store.get_transaction_record(tr3.name) == tr3
210
+
211
+
212
+ @pytest.mark.anyio
213
+ async def test_get_farming_rewards(seeded_random: random.Random) -> None:
214
+ async with DBConnection(1) as db_wrapper:
215
+ store = await WalletTransactionStore.create(db_wrapper)
216
+
217
+ test_trs: list[TransactionRecord] = []
218
+ # tr1 is type OUTGOING_TX
219
+
220
+ for conf in [True, False]:
221
+ for type in [
222
+ TransactionType.INCOMING_TX,
223
+ TransactionType.OUTGOING_TX,
224
+ TransactionType.COINBASE_REWARD,
225
+ TransactionType.FEE_REWARD,
226
+ TransactionType.INCOMING_TRADE,
227
+ TransactionType.OUTGOING_TRADE,
228
+ ]:
229
+ test_trs.append(
230
+ dataclasses.replace(
231
+ tr1,
232
+ name=bytes32.random(seeded_random),
233
+ confirmed=conf,
234
+ confirmed_at_height=uint32(100 if conf else 0),
235
+ type=uint32(type.value),
236
+ )
237
+ )
238
+
239
+ for tr in test_trs:
240
+ await store.add_transaction_record(tr)
241
+ assert await store.get_transaction_record(tr.name) == tr
242
+
243
+ rewards = await store.get_farming_rewards()
244
+ assert len(rewards) == 2
245
+ assert test_trs[2] in rewards
246
+ assert test_trs[3] in rewards
247
+
248
+
249
+ @pytest.mark.anyio
250
+ async def test_get_all_unconfirmed(seeded_random: random.Random) -> None:
251
+ async with DBConnection(1) as db_wrapper:
252
+ store = await WalletTransactionStore.create(db_wrapper)
253
+
254
+ tr2 = dataclasses.replace(
255
+ tr1, name=bytes32.random(seeded_random), confirmed=True, confirmed_at_height=uint32(100)
256
+ )
257
+ await store.add_transaction_record(tr1)
258
+ await store.add_transaction_record(tr2)
259
+ all_unconfirmed = await store.get_all_unconfirmed()
260
+ assert all_unconfirmed == [get_light_transaction_record(tr1)]
261
+
262
+
263
+ @pytest.mark.anyio
264
+ async def test_get_unconfirmed_for_wallet(seeded_random: random.Random) -> None:
265
+ async with DBConnection(1) as db_wrapper:
266
+ store = await WalletTransactionStore.create(db_wrapper)
267
+
268
+ tr2 = dataclasses.replace(
269
+ tr1, name=bytes32.random(seeded_random), confirmed=True, confirmed_at_height=uint32(100)
270
+ )
271
+ tr3 = dataclasses.replace(tr1, name=bytes32.random(seeded_random), wallet_id=uint32(2))
272
+ tr4 = dataclasses.replace(tr2, name=bytes32.random(seeded_random), wallet_id=uint32(2))
273
+ await store.add_transaction_record(tr1)
274
+ await store.add_transaction_record(tr2)
275
+ await store.add_transaction_record(tr3)
276
+ await store.add_transaction_record(tr4)
277
+
278
+ assert await store.get_unconfirmed_for_wallet(1) == [tr1]
279
+ assert await store.get_unconfirmed_for_wallet(2) == [tr3]
280
+
281
+
282
+ @pytest.mark.anyio
283
+ async def test_transaction_count_for_wallet(seeded_random: random.Random) -> None:
284
+ async with DBConnection(1) as db_wrapper:
285
+ store = await WalletTransactionStore.create(db_wrapper)
286
+
287
+ tr2 = dataclasses.replace(tr1, name=bytes32.random(seeded_random), wallet_id=uint32(2))
288
+
289
+ # 5 transactions in wallet_id 1
290
+ await store.add_transaction_record(tr1)
291
+ await store.add_transaction_record(dataclasses.replace(tr1, name=bytes32.random(seeded_random)))
292
+ await store.add_transaction_record(dataclasses.replace(tr1, name=bytes32.random(seeded_random)))
293
+ await store.add_transaction_record(dataclasses.replace(tr1, name=bytes32.random(seeded_random)))
294
+ await store.add_transaction_record(dataclasses.replace(tr1, name=bytes32.random(seeded_random)))
295
+
296
+ # 2 transactions in wallet_id 2
297
+ await store.add_transaction_record(tr2)
298
+ await store.add_transaction_record(dataclasses.replace(tr2, name=bytes32.random(seeded_random)))
299
+
300
+ assert await store.get_transaction_count_for_wallet(1) == 5
301
+ assert await store.get_transaction_count_for_wallet(2) == 2
302
+ assert (
303
+ await store.get_transaction_count_for_wallet(
304
+ 1, True, type_filter=TransactionTypeFilter.include([TransactionType.OUTGOING_TX])
305
+ )
306
+ == 0
307
+ )
308
+ assert (
309
+ await store.get_transaction_count_for_wallet(
310
+ 1, False, type_filter=TransactionTypeFilter.include([TransactionType.OUTGOING_CLAWBACK])
311
+ )
312
+ == 0
313
+ )
314
+ assert (
315
+ await store.get_transaction_count_for_wallet(
316
+ 1, False, type_filter=TransactionTypeFilter.include([TransactionType.OUTGOING_TX])
317
+ )
318
+ == 5
319
+ )
320
+
321
+
322
+ @pytest.mark.anyio
323
+ async def test_all_transactions_for_wallet(seeded_random: random.Random) -> None:
324
+ async with DBConnection(1) as db_wrapper:
325
+ store = await WalletTransactionStore.create(db_wrapper)
326
+
327
+ test_trs: list[TransactionRecord] = []
328
+ for wallet_id in [1, 2]:
329
+ for type in [
330
+ TransactionType.INCOMING_TX,
331
+ TransactionType.OUTGOING_TX,
332
+ TransactionType.COINBASE_REWARD,
333
+ TransactionType.FEE_REWARD,
334
+ TransactionType.INCOMING_TRADE,
335
+ TransactionType.OUTGOING_TRADE,
336
+ ]:
337
+ test_trs.append(
338
+ dataclasses.replace(
339
+ tr1,
340
+ name=bytes32.random(seeded_random),
341
+ wallet_id=uint32(wallet_id),
342
+ type=uint32(type.value),
343
+ )
344
+ )
345
+
346
+ for tr in test_trs:
347
+ await store.add_transaction_record(tr)
348
+
349
+ assert await store.get_all_transactions_for_wallet(1) == test_trs[:6]
350
+ assert await store.get_all_transactions_for_wallet(2) == test_trs[6:]
351
+
352
+ assert await store.get_all_transactions_for_wallet(1, TransactionType.INCOMING_TX) == [test_trs[0]]
353
+ assert await store.get_all_transactions_for_wallet(1, TransactionType.OUTGOING_TX) == [test_trs[1]]
354
+ assert await store.get_all_transactions_for_wallet(1, TransactionType.INCOMING_TRADE) == [test_trs[4]]
355
+ assert await store.get_all_transactions_for_wallet(1, TransactionType.OUTGOING_TRADE) == [test_trs[5]]
356
+
357
+ assert await store.get_all_transactions_for_wallet(2, TransactionType.INCOMING_TX) == [test_trs[6]]
358
+ assert await store.get_all_transactions_for_wallet(2, TransactionType.OUTGOING_TX) == [test_trs[7]]
359
+ assert await store.get_all_transactions_for_wallet(2, TransactionType.INCOMING_TRADE) == [test_trs[10]]
360
+ assert await store.get_all_transactions_for_wallet(2, TransactionType.OUTGOING_TRADE) == [test_trs[11]]
361
+
362
+
363
+ def cmp(lhs: list[Any], rhs: list[Any]) -> bool:
364
+ if len(rhs) != len(lhs):
365
+ return False
366
+
367
+ for e in lhs:
368
+ if e not in rhs:
369
+ return False
370
+ return True
371
+
372
+
373
+ @pytest.mark.anyio
374
+ async def test_get_all_transactions(seeded_random: random.Random) -> None:
375
+ async with DBConnection(1) as db_wrapper:
376
+ store = await WalletTransactionStore.create(db_wrapper)
377
+
378
+ test_trs: list[TransactionRecord] = []
379
+ assert await store.get_all_transactions() == []
380
+ for wallet_id in [1, 2, 3, 4]:
381
+ test_trs.append(dataclasses.replace(tr1, name=bytes32.random(seeded_random), wallet_id=uint32(wallet_id)))
382
+
383
+ for tr in test_trs:
384
+ await store.add_transaction_record(tr)
385
+
386
+ all_trs = await store.get_all_transactions()
387
+ assert cmp(all_trs, test_trs)
388
+
389
+
390
+ @pytest.mark.anyio
391
+ async def test_get_transaction_above(seeded_random: random.Random) -> None:
392
+ async with DBConnection(1) as db_wrapper:
393
+ store = await WalletTransactionStore.create(db_wrapper)
394
+
395
+ test_trs: list[TransactionRecord] = []
396
+ assert await store.get_transaction_above(uint32(0)) == []
397
+ for height in range(10):
398
+ test_trs.append(
399
+ dataclasses.replace(tr1, name=bytes32.random(seeded_random), confirmed_at_height=uint32(height))
400
+ )
401
+
402
+ for tr in test_trs:
403
+ await store.add_transaction_record(tr)
404
+
405
+ for height in range(10):
406
+ trs = await store.get_transaction_above(uint32(height))
407
+ assert cmp(trs, test_trs[height + 1 :])
408
+
409
+
410
+ @pytest.mark.anyio
411
+ async def test_get_tx_by_trade_id(seeded_random: random.Random) -> None:
412
+ async with DBConnection(1) as db_wrapper:
413
+ store = await WalletTransactionStore.create(db_wrapper)
414
+
415
+ tr2 = dataclasses.replace(tr1, name=bytes32.random(seeded_random), trade_id=bytes32.random(seeded_random))
416
+ tr3 = dataclasses.replace(tr1, name=bytes32.random(seeded_random), trade_id=bytes32.random(seeded_random))
417
+ tr4 = dataclasses.replace(tr1, name=bytes32.random(seeded_random))
418
+
419
+ assert await store.get_transactions_by_trade_id(tr1.trade_id) == []
420
+ await store.add_transaction_record(tr1)
421
+ assert await store.get_transactions_by_trade_id(tr1.trade_id) == [tr1]
422
+
423
+ assert await store.get_transactions_by_trade_id(tr2.trade_id) == []
424
+ await store.add_transaction_record(tr2)
425
+ assert await store.get_transactions_by_trade_id(tr2.trade_id) == [tr2]
426
+
427
+ assert await store.get_transactions_by_trade_id(tr3.trade_id) == []
428
+ await store.add_transaction_record(tr3)
429
+ assert await store.get_transactions_by_trade_id(tr3.trade_id) == [tr3]
430
+
431
+ # tr1 and tr4 have the same trade_id
432
+ assert await store.get_transactions_by_trade_id(tr4.trade_id) == [tr1]
433
+ await store.add_transaction_record(tr4)
434
+ assert cmp(await store.get_transactions_by_trade_id(tr4.trade_id), [tr1, tr4])
435
+
436
+ assert cmp(await store.get_transactions_by_trade_id(tr1.trade_id), [tr1, tr4])
437
+ assert await store.get_transactions_by_trade_id(tr2.trade_id) == [tr2]
438
+ assert await store.get_transactions_by_trade_id(tr3.trade_id) == [tr3]
439
+ assert cmp(await store.get_transactions_by_trade_id(tr4.trade_id), [tr1, tr4])
440
+
441
+
442
+ @pytest.mark.anyio
443
+ async def test_rollback_to_block(seeded_random: random.Random) -> None:
444
+ async with DBConnection(1) as db_wrapper:
445
+ store = await WalletTransactionStore.create(db_wrapper)
446
+
447
+ test_trs: list[TransactionRecord] = []
448
+ for height in range(10):
449
+ test_trs.append(
450
+ dataclasses.replace(tr1, name=bytes32.random(seeded_random), confirmed_at_height=uint32(height))
451
+ )
452
+
453
+ for tr in test_trs:
454
+ await store.add_transaction_record(tr)
455
+
456
+ await store.rollback_to_block(uint32(6))
457
+ all_trs = await store.get_all_transactions()
458
+ assert cmp(all_trs, test_trs[:7])
459
+
460
+ await store.rollback_to_block(uint32(5))
461
+ all_trs = await store.get_all_transactions()
462
+ assert cmp(all_trs, test_trs[:6])
463
+
464
+
465
+ @pytest.mark.anyio
466
+ async def test_delete_unconfirmed(seeded_random: random.Random) -> None:
467
+ async with DBConnection(1) as db_wrapper:
468
+ store = await WalletTransactionStore.create(db_wrapper)
469
+
470
+ tr2 = dataclasses.replace(tr1, name=bytes32.random(seeded_random), confirmed=True)
471
+ tr3 = dataclasses.replace(tr1, name=bytes32.random(seeded_random), confirmed=True, wallet_id=uint32(2))
472
+ tr4 = dataclasses.replace(tr1, name=bytes32.random(seeded_random), wallet_id=uint32(2))
473
+ tr5 = dataclasses.replace(
474
+ tr1,
475
+ name=bytes32.random(seeded_random),
476
+ wallet_id=uint32(2),
477
+ type=uint32(TransactionType.INCOMING_CLAWBACK_RECEIVE.value),
478
+ )
479
+
480
+ await store.add_transaction_record(tr1)
481
+ await store.add_transaction_record(tr2)
482
+ await store.add_transaction_record(tr3)
483
+ await store.add_transaction_record(tr4)
484
+ await store.add_transaction_record(tr5)
485
+
486
+ assert cmp(await store.get_all_transactions(), [tr1, tr2, tr3, tr4, tr5])
487
+ await store.delete_unconfirmed_transactions(1)
488
+ assert cmp(await store.get_all_transactions(), [tr2, tr3, tr4, tr5])
489
+ await store.delete_unconfirmed_transactions(2)
490
+ assert cmp(await store.get_all_transactions(), [tr2, tr3, tr5])
491
+
492
+
493
+ @pytest.mark.anyio
494
+ async def test_get_transactions_between_confirmed(seeded_random: random.Random) -> None:
495
+ async with DBConnection(1) as db_wrapper:
496
+ store = await WalletTransactionStore.create(db_wrapper)
497
+
498
+ tr2 = dataclasses.replace(
499
+ tr1, name=bytes32.random(seeded_random), confirmed=True, confirmed_at_height=uint32(1)
500
+ )
501
+ tr3 = dataclasses.replace(
502
+ tr1, name=bytes32.random(seeded_random), confirmed=True, confirmed_at_height=uint32(2)
503
+ )
504
+ tr4 = dataclasses.replace(
505
+ tr1, name=bytes32.random(seeded_random), confirmed=True, confirmed_at_height=uint32(3)
506
+ )
507
+ tr5 = dataclasses.replace(
508
+ tr1, name=bytes32.random(seeded_random), confirmed=True, confirmed_at_height=uint32(4)
509
+ )
510
+ tr6 = dataclasses.replace(
511
+ tr1,
512
+ name=bytes32.random(seeded_random),
513
+ confirmed_at_height=uint32(5),
514
+ type=uint32(TransactionType.COINBASE_REWARD.value),
515
+ )
516
+
517
+ await store.add_transaction_record(tr1)
518
+ await store.add_transaction_record(tr2)
519
+ await store.add_transaction_record(tr3)
520
+ await store.add_transaction_record(tr4)
521
+ await store.add_transaction_record(tr5)
522
+
523
+ # Test confirmed filter
524
+ assert await store.get_transactions_between(1, 0, 100, confirmed=True) == [tr2, tr3, tr4, tr5]
525
+ assert await store.get_transactions_between(1, 0, 100, confirmed=False) == [tr1]
526
+
527
+ # test different limits
528
+ assert await store.get_transactions_between(1, 0, 1) == [tr1]
529
+ assert await store.get_transactions_between(1, 0, 2) == [tr1, tr2]
530
+ assert await store.get_transactions_between(1, 0, 3) == [tr1, tr2, tr3]
531
+ assert await store.get_transactions_between(1, 0, 100) == [tr1, tr2, tr3, tr4, tr5]
532
+
533
+ # test different start offsets
534
+ assert await store.get_transactions_between(1, 1, 100) == [tr2, tr3, tr4, tr5]
535
+ assert await store.get_transactions_between(1, 2, 100) == [tr3, tr4, tr5]
536
+ assert await store.get_transactions_between(1, 3, 100) == [tr4, tr5]
537
+
538
+ # wallet 2 is empty
539
+ assert await store.get_transactions_between(2, 0, 100) == []
540
+
541
+ # reverse
542
+
543
+ # test different limits
544
+ assert await store.get_transactions_between(1, 0, 1, reverse=True) == [tr5]
545
+ assert await store.get_transactions_between(1, 0, 2, reverse=True) == [tr5, tr4]
546
+ assert await store.get_transactions_between(1, 0, 3, reverse=True) == [tr5, tr4, tr3]
547
+ assert await store.get_transactions_between(1, 0, 100, reverse=True) == [tr5, tr4, tr3, tr2, tr1]
548
+
549
+ # test different start offsets
550
+ assert await store.get_transactions_between(1, 1, 100, reverse=True) == [tr4, tr3, tr2, tr1]
551
+ assert await store.get_transactions_between(1, 2, 100, reverse=True) == [tr3, tr2, tr1]
552
+ assert await store.get_transactions_between(1, 3, 100, reverse=True) == [tr2, tr1]
553
+
554
+ # test type filter (coinbase reward)
555
+ await store.add_transaction_record(tr6)
556
+ assert await store.get_transactions_between(
557
+ 1, 0, 1, reverse=True, type_filter=TransactionTypeFilter.include([TransactionType.COINBASE_REWARD])
558
+ ) == [tr6]
559
+ assert await store.get_transactions_between(
560
+ 1, 0, 1, reverse=True, type_filter=TransactionTypeFilter.exclude([TransactionType.COINBASE_REWARD])
561
+ ) == [tr5]
562
+ assert (
563
+ await store.get_transactions_between(1, 0, 100, reverse=True, type_filter=TransactionTypeFilter.include([]))
564
+ == []
565
+ )
566
+ assert await store.get_transactions_between(
567
+ 1, 0, 100, reverse=True, type_filter=TransactionTypeFilter.exclude([])
568
+ ) == [
569
+ tr6,
570
+ tr5,
571
+ tr4,
572
+ tr3,
573
+ tr2,
574
+ tr1,
575
+ ]
576
+ assert await store.get_transactions_between(
577
+ 1,
578
+ 0,
579
+ 100,
580
+ reverse=True,
581
+ type_filter=TransactionTypeFilter.include([TransactionType.COINBASE_REWARD, TransactionType.OUTGOING_TX]),
582
+ ) == [tr6, tr5, tr4, tr3, tr2, tr1]
583
+
584
+
585
+ @pytest.mark.anyio
586
+ async def test_get_transactions_between_relevance(seeded_random: random.Random) -> None:
587
+ async with DBConnection(1) as db_wrapper:
588
+ store = await WalletTransactionStore.create(db_wrapper)
589
+
590
+ t1 = dataclasses.replace(
591
+ tr1,
592
+ name=bytes32.random(seeded_random),
593
+ confirmed=False,
594
+ confirmed_at_height=uint32(2),
595
+ created_at_time=uint64(1000),
596
+ )
597
+ t2 = dataclasses.replace(
598
+ tr1,
599
+ name=bytes32.random(seeded_random),
600
+ confirmed=False,
601
+ confirmed_at_height=uint32(2),
602
+ created_at_time=uint64(999),
603
+ )
604
+ t3 = dataclasses.replace(
605
+ tr1,
606
+ name=bytes32.random(seeded_random),
607
+ confirmed=False,
608
+ confirmed_at_height=uint32(1),
609
+ created_at_time=uint64(1000),
610
+ )
611
+ t4 = dataclasses.replace(
612
+ tr1,
613
+ name=bytes32.random(seeded_random),
614
+ confirmed=False,
615
+ confirmed_at_height=uint32(1),
616
+ created_at_time=uint64(999),
617
+ )
618
+
619
+ t5 = dataclasses.replace(
620
+ tr1,
621
+ name=bytes32.random(seeded_random),
622
+ confirmed=True,
623
+ confirmed_at_height=uint32(2),
624
+ created_at_time=uint64(1000),
625
+ )
626
+ t6 = dataclasses.replace(
627
+ tr1,
628
+ name=bytes32.random(seeded_random),
629
+ confirmed=True,
630
+ confirmed_at_height=uint32(2),
631
+ created_at_time=uint64(999),
632
+ )
633
+ t7 = dataclasses.replace(
634
+ tr1,
635
+ name=bytes32.random(seeded_random),
636
+ confirmed=True,
637
+ confirmed_at_height=uint32(1),
638
+ created_at_time=uint64(1000),
639
+ )
640
+ t8 = dataclasses.replace(
641
+ tr1,
642
+ name=bytes32.random(seeded_random),
643
+ confirmed=True,
644
+ confirmed_at_height=uint32(1),
645
+ created_at_time=uint64(999),
646
+ )
647
+
648
+ await store.add_transaction_record(t1)
649
+ await store.add_transaction_record(t2)
650
+ await store.add_transaction_record(t3)
651
+ await store.add_transaction_record(t4)
652
+ await store.add_transaction_record(t5)
653
+ await store.add_transaction_record(t6)
654
+ await store.add_transaction_record(t7)
655
+ await store.add_transaction_record(t8)
656
+
657
+ # test different limits
658
+ assert await store.get_transactions_between(1, 0, 1, sort_key="RELEVANCE") == [t1]
659
+ assert await store.get_transactions_between(1, 0, 2, sort_key="RELEVANCE") == [t1, t2]
660
+ assert await store.get_transactions_between(1, 0, 3, sort_key="RELEVANCE") == [t1, t2, t3]
661
+ assert await store.get_transactions_between(1, 0, 100, sort_key="RELEVANCE") == [t1, t2, t3, t4, t5, t6, t7, t8]
662
+
663
+ # test different start offsets
664
+ assert await store.get_transactions_between(1, 1, 100, sort_key="RELEVANCE") == [t2, t3, t4, t5, t6, t7, t8]
665
+ assert await store.get_transactions_between(1, 2, 100, sort_key="RELEVANCE") == [t3, t4, t5, t6, t7, t8]
666
+ assert await store.get_transactions_between(1, 3, 100, sort_key="RELEVANCE") == [t4, t5, t6, t7, t8]
667
+ assert await store.get_transactions_between(1, 4, 100, sort_key="RELEVANCE") == [t5, t6, t7, t8]
668
+
669
+ # wallet 2 is empty
670
+ assert await store.get_transactions_between(2, 0, 100, sort_key="RELEVANCE") == []
671
+
672
+ # reverse
673
+
674
+ # test different limits
675
+ assert await store.get_transactions_between(1, 0, 1, sort_key="RELEVANCE", reverse=True) == [t8]
676
+ assert await store.get_transactions_between(1, 0, 2, sort_key="RELEVANCE", reverse=True) == [t8, t7]
677
+ assert await store.get_transactions_between(1, 0, 3, sort_key="RELEVANCE", reverse=True) == [t8, t7, t6]
678
+ assert await store.get_transactions_between(1, 0, 100, sort_key="RELEVANCE", reverse=True) == [
679
+ t8,
680
+ t7,
681
+ t6,
682
+ t5,
683
+ t4,
684
+ t3,
685
+ t2,
686
+ t1,
687
+ ]
688
+
689
+ # test different start offsets
690
+ assert await store.get_transactions_between(1, 1, 100, sort_key="RELEVANCE", reverse=True) == [
691
+ t7,
692
+ t6,
693
+ t5,
694
+ t4,
695
+ t3,
696
+ t2,
697
+ t1,
698
+ ]
699
+ assert await store.get_transactions_between(1, 2, 100, sort_key="RELEVANCE", reverse=True) == [
700
+ t6,
701
+ t5,
702
+ t4,
703
+ t3,
704
+ t2,
705
+ t1,
706
+ ]
707
+ assert await store.get_transactions_between(1, 3, 100, sort_key="RELEVANCE", reverse=True) == [
708
+ t5,
709
+ t4,
710
+ t3,
711
+ t2,
712
+ t1,
713
+ ]
714
+
715
+
716
+ @pytest.mark.anyio
717
+ async def test_get_transactions_between_to_puzzle_hash(seeded_random: random.Random) -> None:
718
+ async with DBConnection(1) as db_wrapper:
719
+ store = await WalletTransactionStore.create(db_wrapper)
720
+
721
+ ph1 = bytes32.random(seeded_random)
722
+ ph2 = bytes32.random(seeded_random)
723
+
724
+ tr2 = dataclasses.replace(
725
+ tr1, name=bytes32.random(seeded_random), confirmed_at_height=uint32(1), to_puzzle_hash=ph1
726
+ )
727
+ tr3 = dataclasses.replace(
728
+ tr1, name=bytes32.random(seeded_random), confirmed_at_height=uint32(2), to_puzzle_hash=ph1
729
+ )
730
+ tr4 = dataclasses.replace(
731
+ tr1, name=bytes32.random(seeded_random), confirmed_at_height=uint32(3), to_puzzle_hash=ph2
732
+ )
733
+ tr5 = dataclasses.replace(
734
+ tr1, name=bytes32.random(seeded_random), confirmed_at_height=uint32(4), to_puzzle_hash=ph2
735
+ )
736
+
737
+ await store.add_transaction_record(tr1)
738
+ await store.add_transaction_record(tr2)
739
+ await store.add_transaction_record(tr3)
740
+ await store.add_transaction_record(tr4)
741
+ await store.add_transaction_record(tr5)
742
+
743
+ # test different limits
744
+ assert await store.get_transactions_between(1, 0, 100, to_puzzle_hash=ph1) == [tr2, tr3]
745
+ assert await store.get_transactions_between(1, 0, 100, to_puzzle_hash=ph2) == [tr4, tr5]
746
+
747
+ # test different start offsets
748
+ assert await store.get_transactions_between(1, 1, 100, to_puzzle_hash=ph1) == [tr3]
749
+ assert await store.get_transactions_between(1, 1, 100, to_puzzle_hash=ph2) == [tr5]
750
+
751
+ # reverse
752
+
753
+ # test different limits
754
+ assert await store.get_transactions_between(1, 0, 100, to_puzzle_hash=ph1, reverse=True) == [tr3, tr2]
755
+ assert await store.get_transactions_between(1, 0, 100, to_puzzle_hash=ph2, reverse=True) == [tr5, tr4]
756
+
757
+ # test different start offsets
758
+ assert await store.get_transactions_between(1, 1, 100, to_puzzle_hash=ph1, reverse=True) == [tr2]
759
+ assert await store.get_transactions_between(1, 1, 100, to_puzzle_hash=ph2, reverse=True) == [tr4]
760
+
761
+
762
+ @pytest.mark.anyio
763
+ async def test_get_not_sent(seeded_random: random.Random) -> None:
764
+ async with DBConnection(1) as db_wrapper:
765
+ store = await WalletTransactionStore.create(db_wrapper)
766
+
767
+ tr2 = dataclasses.replace(
768
+ tr1, name=bytes32.random(seeded_random), confirmed=True, confirmed_at_height=uint32(1)
769
+ )
770
+ tr3 = dataclasses.replace(tr1, name=bytes32.random(seeded_random))
771
+ tr4 = dataclasses.replace(tr1, name=bytes32.random(seeded_random))
772
+
773
+ await store.add_transaction_record(tr1)
774
+ await store.add_transaction_record(tr2)
775
+ await store.add_transaction_record(tr3)
776
+ await store.add_transaction_record(tr4)
777
+
778
+ not_sent = await store.get_not_sent()
779
+ assert cmp(not_sent, [tr1, tr3, tr4])
780
+
781
+ not_sent = await store.get_not_sent()
782
+ assert cmp(not_sent, [tr1, tr3, tr4])
783
+
784
+ not_sent = await store.get_not_sent()
785
+ assert cmp(not_sent, [tr1, tr3, tr4])
786
+
787
+ not_sent = await store.get_not_sent()
788
+ assert cmp(not_sent, [tr1, tr3, tr4])
789
+
790
+ not_sent = await store.get_not_sent()
791
+ assert cmp(not_sent, [tr1, tr3, tr4])
792
+
793
+ not_sent = await store.get_not_sent()
794
+ assert cmp(not_sent, [tr1, tr3, tr4])
795
+
796
+ # the 7th time we call this function, we don't get any unsent txs
797
+ not_sent = await store.get_not_sent()
798
+ assert cmp(not_sent, [])
799
+
800
+ # TODO: also cover include_accepted_txs=True
801
+
802
+
803
+ @pytest.mark.anyio
804
+ async def test_transaction_record_is_valid() -> None:
805
+ invalid_attempts: list[tuple[str, uint8, Optional[str]]] = []
806
+ # The tx should be valid as long as we don't have minimum_send_attempts failed attempts
807
+ while len(invalid_attempts) < minimum_send_attempts:
808
+ assert dataclasses.replace(tr1, sent_to=invalid_attempts).is_valid()
809
+ invalid_attempts.append(("peer", uint8(MempoolInclusionStatus.FAILED), None))
810
+ # The tx should be invalid now with more than minimum failed attempts
811
+ assert len(invalid_attempts) == minimum_send_attempts
812
+ assert not dataclasses.replace(tr1, sent_to=invalid_attempts).is_valid()
813
+ mempool_success = ("success", uint8(MempoolInclusionStatus.SUCCESS), None)
814
+ low_fee = ("low_fee", uint8(MempoolInclusionStatus.FAILED), Err.INVALID_FEE_LOW_FEE.name)
815
+ close_to_zero = (
816
+ "close_to_zero",
817
+ uint8(MempoolInclusionStatus.FAILED),
818
+ Err.INVALID_FEE_TOO_CLOSE_TO_ZERO.name,
819
+ )
820
+ # But it should become valid with one of the above attempts
821
+ assert dataclasses.replace(tr1, sent_to=[*invalid_attempts, mempool_success]).is_valid()
822
+ assert dataclasses.replace(tr1, sent_to=[*invalid_attempts, low_fee]).is_valid()
823
+ assert dataclasses.replace(tr1, sent_to=[*invalid_attempts, close_to_zero]).is_valid()
824
+
825
+
826
+ @pytest.mark.anyio
827
+ async def test_valid_times_migration() -> None:
828
+ async with DBConnection(1) as db_wrapper:
829
+ async with db_wrapper.writer_maybe_transaction() as conn:
830
+ await conn.execute(
831
+ "CREATE TABLE IF NOT EXISTS transaction_record("
832
+ " transaction_record blob,"
833
+ " bundle_id text PRIMARY KEY,"
834
+ " confirmed_at_height bigint,"
835
+ " created_at_time bigint,"
836
+ " to_puzzle_hash text,"
837
+ " amount blob,"
838
+ " fee_amount blob,"
839
+ " confirmed int,"
840
+ " sent int,"
841
+ " wallet_id bigint,"
842
+ " trade_id text,"
843
+ " type int)"
844
+ )
845
+
846
+ old_record = TransactionRecordOld(
847
+ confirmed_at_height=uint32(0),
848
+ created_at_time=uint64(1000000000),
849
+ to_puzzle_hash=bytes32.zeros,
850
+ amount=uint64(0),
851
+ fee_amount=uint64(0),
852
+ confirmed=False,
853
+ sent=uint32(10),
854
+ spend_bundle=None,
855
+ additions=[],
856
+ removals=[],
857
+ wallet_id=uint32(1),
858
+ sent_to=[],
859
+ trade_id=None,
860
+ type=uint32(TransactionType.INCOMING_TX.value),
861
+ name=bytes32.zeros,
862
+ memos=[],
863
+ )
864
+
865
+ async with db_wrapper.writer_maybe_transaction() as conn:
866
+ await conn.execute_insert(
867
+ "INSERT OR REPLACE INTO transaction_record VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
868
+ (
869
+ bytes(old_record),
870
+ old_record.name,
871
+ old_record.confirmed_at_height,
872
+ old_record.created_at_time,
873
+ old_record.to_puzzle_hash.hex(),
874
+ old_record.amount.stream_to_bytes(),
875
+ old_record.fee_amount.stream_to_bytes(),
876
+ int(old_record.confirmed),
877
+ old_record.sent,
878
+ old_record.wallet_id,
879
+ old_record.trade_id,
880
+ old_record.type,
881
+ ),
882
+ )
883
+
884
+ store = await WalletTransactionStore.create(db_wrapper)
885
+ rec = await store.get_transaction_record(old_record.name)
886
+ assert rec is not None
887
+ assert rec.valid_times == ConditionValidTimes()
888
+
889
+
890
+ @pytest.mark.anyio
891
+ async def test_large_tx_record_query() -> None:
892
+ async with DBConnection(1) as db_wrapper:
893
+ store = await WalletTransactionStore.create(db_wrapper)
894
+ tx_records_to_insert = []
895
+ for _ in range(db_wrapper.host_parameter_limit + 1):
896
+ name = bytes32.random()
897
+ record = TransactionRecordOld(
898
+ confirmed_at_height=uint32(0),
899
+ created_at_time=uint64(1000000000),
900
+ to_puzzle_hash=bytes32.zeros,
901
+ amount=uint64(0),
902
+ fee_amount=uint64(0),
903
+ confirmed=False,
904
+ sent=uint32(10),
905
+ spend_bundle=None,
906
+ additions=[],
907
+ removals=[],
908
+ wallet_id=uint32(1),
909
+ sent_to=[],
910
+ trade_id=None,
911
+ type=uint32(TransactionType.INCOMING_TX.value),
912
+ name=name,
913
+ memos=[],
914
+ )
915
+ tx_records_to_insert.append(
916
+ (
917
+ bytes(record),
918
+ record.name,
919
+ record.confirmed_at_height,
920
+ record.created_at_time,
921
+ record.to_puzzle_hash.hex(),
922
+ record.amount.stream_to_bytes(),
923
+ record.fee_amount.stream_to_bytes(),
924
+ int(record.confirmed),
925
+ record.sent,
926
+ record.wallet_id,
927
+ record.trade_id,
928
+ record.type,
929
+ )
930
+ )
931
+ async with db_wrapper.writer_maybe_transaction() as conn:
932
+ await conn.executemany(
933
+ "INSERT INTO transaction_record VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", tx_records_to_insert
934
+ )
935
+ # Insert a specific tx_times item for the last transaction_record item
936
+ await conn.execute(
937
+ "INSERT INTO tx_times VALUES (?, ?)", (name, bytes(ConditionValidTimes(min_height=uint32(42))))
938
+ )
939
+
940
+ all_transactions = await store.get_all_transactions_for_wallet(1)
941
+ assert len(all_transactions) == db_wrapper.host_parameter_limit + 1
942
+ # Check that all transaction record items have correct valid times
943
+ empty_valid_times = ConditionValidTimes()
944
+ assert all(tx.valid_times == empty_valid_times for tx in all_transactions[:-1])
945
+ assert all_transactions[-1].valid_times.min_height == uint32(42)