chia-blockchain 2.4.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1028) hide show
  1. chia/__init__.py +10 -0
  2. chia/__main__.py +5 -0
  3. chia/_tests/README.md +53 -0
  4. chia/_tests/__init__.py +0 -0
  5. chia/_tests/blockchain/__init__.py +0 -0
  6. chia/_tests/blockchain/blockchain_test_utils.py +197 -0
  7. chia/_tests/blockchain/config.py +4 -0
  8. chia/_tests/blockchain/test_augmented_chain.py +147 -0
  9. chia/_tests/blockchain/test_blockchain.py +4100 -0
  10. chia/_tests/blockchain/test_blockchain_transactions.py +1050 -0
  11. chia/_tests/blockchain/test_build_chains.py +61 -0
  12. chia/_tests/blockchain/test_get_block_generator.py +72 -0
  13. chia/_tests/blockchain/test_lookup_fork_chain.py +195 -0
  14. chia/_tests/build-init-files.py +93 -0
  15. chia/_tests/build-job-matrix.py +204 -0
  16. chia/_tests/check_pytest_monitor_output.py +34 -0
  17. chia/_tests/check_sql_statements.py +73 -0
  18. chia/_tests/chia-start-sim +42 -0
  19. chia/_tests/clvm/__init__.py +0 -0
  20. chia/_tests/clvm/benchmark_costs.py +23 -0
  21. chia/_tests/clvm/coin_store.py +147 -0
  22. chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
  23. chia/_tests/clvm/test_clvm_step.py +37 -0
  24. chia/_tests/clvm/test_condition_codes.py +13 -0
  25. chia/_tests/clvm/test_curry_and_treehash.py +57 -0
  26. chia/_tests/clvm/test_program.py +150 -0
  27. chia/_tests/clvm/test_puzzle_compression.py +144 -0
  28. chia/_tests/clvm/test_puzzle_drivers.py +45 -0
  29. chia/_tests/clvm/test_puzzles.py +247 -0
  30. chia/_tests/clvm/test_singletons.py +540 -0
  31. chia/_tests/clvm/test_spend_sim.py +181 -0
  32. chia/_tests/cmds/__init__.py +0 -0
  33. chia/_tests/cmds/cmd_test_utils.py +472 -0
  34. chia/_tests/cmds/config.py +3 -0
  35. chia/_tests/cmds/conftest.py +23 -0
  36. chia/_tests/cmds/test_click_types.py +195 -0
  37. chia/_tests/cmds/test_cmd_framework.py +400 -0
  38. chia/_tests/cmds/test_cmds_util.py +97 -0
  39. chia/_tests/cmds/test_daemon.py +92 -0
  40. chia/_tests/cmds/test_farm_cmd.py +67 -0
  41. chia/_tests/cmds/test_show.py +116 -0
  42. chia/_tests/cmds/test_sim.py +207 -0
  43. chia/_tests/cmds/test_timelock_args.py +75 -0
  44. chia/_tests/cmds/test_tx_config_args.py +153 -0
  45. chia/_tests/cmds/testing_classes.py +59 -0
  46. chia/_tests/cmds/wallet/__init__.py +0 -0
  47. chia/_tests/cmds/wallet/test_coins.py +195 -0
  48. chia/_tests/cmds/wallet/test_consts.py +47 -0
  49. chia/_tests/cmds/wallet/test_dao.py +565 -0
  50. chia/_tests/cmds/wallet/test_did.py +403 -0
  51. chia/_tests/cmds/wallet/test_nft.py +470 -0
  52. chia/_tests/cmds/wallet/test_notifications.py +124 -0
  53. chia/_tests/cmds/wallet/test_offer.toffer +1 -0
  54. chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
  55. chia/_tests/cmds/wallet/test_vcs.py +376 -0
  56. chia/_tests/cmds/wallet/test_wallet.py +1126 -0
  57. chia/_tests/cmds/wallet/test_wallet_check.py +111 -0
  58. chia/_tests/conftest.py +1304 -0
  59. chia/_tests/connection_utils.py +124 -0
  60. chia/_tests/core/__init__.py +0 -0
  61. chia/_tests/core/cmds/__init__.py +0 -0
  62. chia/_tests/core/cmds/test_beta.py +382 -0
  63. chia/_tests/core/cmds/test_keys.py +1734 -0
  64. chia/_tests/core/cmds/test_wallet.py +126 -0
  65. chia/_tests/core/config.py +3 -0
  66. chia/_tests/core/consensus/__init__.py +0 -0
  67. chia/_tests/core/consensus/test_block_creation.py +56 -0
  68. chia/_tests/core/consensus/test_pot_iterations.py +117 -0
  69. chia/_tests/core/custom_types/__init__.py +0 -0
  70. chia/_tests/core/custom_types/test_coin.py +109 -0
  71. chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
  72. chia/_tests/core/custom_types/test_spend_bundle.py +71 -0
  73. chia/_tests/core/daemon/__init__.py +0 -0
  74. chia/_tests/core/daemon/config.py +4 -0
  75. chia/_tests/core/daemon/test_daemon.py +2128 -0
  76. chia/_tests/core/daemon/test_daemon_register.py +109 -0
  77. chia/_tests/core/daemon/test_keychain_proxy.py +100 -0
  78. chia/_tests/core/data_layer/__init__.py +0 -0
  79. chia/_tests/core/data_layer/config.py +5 -0
  80. chia/_tests/core/data_layer/conftest.py +105 -0
  81. chia/_tests/core/data_layer/test_data_cli.py +57 -0
  82. chia/_tests/core/data_layer/test_data_layer.py +83 -0
  83. chia/_tests/core/data_layer/test_data_layer_util.py +219 -0
  84. chia/_tests/core/data_layer/test_data_rpc.py +3865 -0
  85. chia/_tests/core/data_layer/test_data_store.py +2423 -0
  86. chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
  87. chia/_tests/core/data_layer/test_plugin.py +91 -0
  88. chia/_tests/core/data_layer/util.py +232 -0
  89. chia/_tests/core/farmer/__init__.py +0 -0
  90. chia/_tests/core/farmer/config.py +3 -0
  91. chia/_tests/core/farmer/test_farmer_api.py +101 -0
  92. chia/_tests/core/full_node/__init__.py +0 -0
  93. chia/_tests/core/full_node/config.py +4 -0
  94. chia/_tests/core/full_node/dos/__init__.py +0 -0
  95. chia/_tests/core/full_node/dos/config.py +3 -0
  96. chia/_tests/core/full_node/full_sync/__init__.py +0 -0
  97. chia/_tests/core/full_node/full_sync/config.py +4 -0
  98. chia/_tests/core/full_node/full_sync/test_full_sync.py +448 -0
  99. chia/_tests/core/full_node/ram_db.py +27 -0
  100. chia/_tests/core/full_node/stores/__init__.py +0 -0
  101. chia/_tests/core/full_node/stores/config.py +4 -0
  102. chia/_tests/core/full_node/stores/test_block_store.py +488 -0
  103. chia/_tests/core/full_node/stores/test_coin_store.py +888 -0
  104. chia/_tests/core/full_node/stores/test_full_node_store.py +1215 -0
  105. chia/_tests/core/full_node/stores/test_hint_store.py +230 -0
  106. chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
  107. chia/_tests/core/full_node/test_address_manager.py +588 -0
  108. chia/_tests/core/full_node/test_block_height_map.py +556 -0
  109. chia/_tests/core/full_node/test_conditions.py +558 -0
  110. chia/_tests/core/full_node/test_full_node.py +2445 -0
  111. chia/_tests/core/full_node/test_generator_tools.py +82 -0
  112. chia/_tests/core/full_node/test_hint_management.py +104 -0
  113. chia/_tests/core/full_node/test_node_load.py +34 -0
  114. chia/_tests/core/full_node/test_performance.py +182 -0
  115. chia/_tests/core/full_node/test_subscriptions.py +492 -0
  116. chia/_tests/core/full_node/test_transactions.py +203 -0
  117. chia/_tests/core/full_node/test_tx_processing_queue.py +154 -0
  118. chia/_tests/core/large_block.py +2388 -0
  119. chia/_tests/core/make_block_generator.py +72 -0
  120. chia/_tests/core/mempool/__init__.py +0 -0
  121. chia/_tests/core/mempool/config.py +4 -0
  122. chia/_tests/core/mempool/test_mempool.py +3180 -0
  123. chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
  124. chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
  125. chia/_tests/core/mempool/test_mempool_item_queries.py +192 -0
  126. chia/_tests/core/mempool/test_mempool_manager.py +2054 -0
  127. chia/_tests/core/mempool/test_mempool_performance.py +65 -0
  128. chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
  129. chia/_tests/core/node_height.py +28 -0
  130. chia/_tests/core/server/__init__.py +0 -0
  131. chia/_tests/core/server/config.py +3 -0
  132. chia/_tests/core/server/flood.py +82 -0
  133. chia/_tests/core/server/serve.py +132 -0
  134. chia/_tests/core/server/test_capabilities.py +68 -0
  135. chia/_tests/core/server/test_dos.py +320 -0
  136. chia/_tests/core/server/test_event_loop.py +109 -0
  137. chia/_tests/core/server/test_loop.py +290 -0
  138. chia/_tests/core/server/test_node_discovery.py +74 -0
  139. chia/_tests/core/server/test_rate_limits.py +370 -0
  140. chia/_tests/core/server/test_server.py +225 -0
  141. chia/_tests/core/server/test_upnp.py +8 -0
  142. chia/_tests/core/services/__init__.py +0 -0
  143. chia/_tests/core/services/config.py +3 -0
  144. chia/_tests/core/services/test_services.py +166 -0
  145. chia/_tests/core/ssl/__init__.py +0 -0
  146. chia/_tests/core/ssl/config.py +3 -0
  147. chia/_tests/core/ssl/test_ssl.py +198 -0
  148. chia/_tests/core/test_coins.py +33 -0
  149. chia/_tests/core/test_cost_calculation.py +314 -0
  150. chia/_tests/core/test_crawler.py +175 -0
  151. chia/_tests/core/test_crawler_rpc.py +53 -0
  152. chia/_tests/core/test_daemon_rpc.py +24 -0
  153. chia/_tests/core/test_db_conversion.py +129 -0
  154. chia/_tests/core/test_db_validation.py +161 -0
  155. chia/_tests/core/test_farmer_harvester_rpc.py +504 -0
  156. chia/_tests/core/test_filter.py +37 -0
  157. chia/_tests/core/test_full_node_rpc.py +794 -0
  158. chia/_tests/core/test_merkle_set.py +343 -0
  159. chia/_tests/core/test_program.py +49 -0
  160. chia/_tests/core/test_rpc_util.py +87 -0
  161. chia/_tests/core/test_seeder.py +308 -0
  162. chia/_tests/core/test_setproctitle.py +13 -0
  163. chia/_tests/core/util/__init__.py +0 -0
  164. chia/_tests/core/util/config.py +4 -0
  165. chia/_tests/core/util/test_block_cache.py +44 -0
  166. chia/_tests/core/util/test_cached_bls.py +57 -0
  167. chia/_tests/core/util/test_config.py +337 -0
  168. chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
  169. chia/_tests/core/util/test_files.py +391 -0
  170. chia/_tests/core/util/test_jsonify.py +146 -0
  171. chia/_tests/core/util/test_keychain.py +514 -0
  172. chia/_tests/core/util/test_keyring_wrapper.py +490 -0
  173. chia/_tests/core/util/test_lockfile.py +380 -0
  174. chia/_tests/core/util/test_log_exceptions.py +187 -0
  175. chia/_tests/core/util/test_lru_cache.py +56 -0
  176. chia/_tests/core/util/test_significant_bits.py +40 -0
  177. chia/_tests/core/util/test_streamable.py +883 -0
  178. chia/_tests/db/__init__.py +0 -0
  179. chia/_tests/db/test_db_wrapper.py +565 -0
  180. chia/_tests/environments/__init__.py +0 -0
  181. chia/_tests/environments/common.py +35 -0
  182. chia/_tests/environments/full_node.py +47 -0
  183. chia/_tests/environments/wallet.py +368 -0
  184. chia/_tests/ether.py +19 -0
  185. chia/_tests/farmer_harvester/__init__.py +0 -0
  186. chia/_tests/farmer_harvester/config.py +3 -0
  187. chia/_tests/farmer_harvester/test_farmer.py +1264 -0
  188. chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
  189. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +130 -0
  190. chia/_tests/farmer_harvester/test_third_party_harvesters.py +501 -0
  191. chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
  192. chia/_tests/fee_estimation/__init__.py +0 -0
  193. chia/_tests/fee_estimation/config.py +3 -0
  194. chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
  195. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
  196. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +145 -0
  197. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
  198. chia/_tests/generator/__init__.py +0 -0
  199. chia/_tests/generator/puzzles/__init__.py +0 -0
  200. chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
  201. chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
  202. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
  203. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
  204. chia/_tests/generator/test_compression.py +218 -0
  205. chia/_tests/generator/test_generator_types.py +44 -0
  206. chia/_tests/generator/test_rom.py +182 -0
  207. chia/_tests/plot_sync/__init__.py +0 -0
  208. chia/_tests/plot_sync/config.py +3 -0
  209. chia/_tests/plot_sync/test_delta.py +102 -0
  210. chia/_tests/plot_sync/test_plot_sync.py +617 -0
  211. chia/_tests/plot_sync/test_receiver.py +451 -0
  212. chia/_tests/plot_sync/test_sender.py +116 -0
  213. chia/_tests/plot_sync/test_sync_simulated.py +450 -0
  214. chia/_tests/plot_sync/util.py +67 -0
  215. chia/_tests/plotting/__init__.py +0 -0
  216. chia/_tests/plotting/config.py +3 -0
  217. chia/_tests/plotting/test_plot_manager.py +738 -0
  218. chia/_tests/plotting/util.py +13 -0
  219. chia/_tests/pools/__init__.py +0 -0
  220. chia/_tests/pools/config.py +5 -0
  221. chia/_tests/pools/test_pool_cmdline.py +23 -0
  222. chia/_tests/pools/test_pool_config.py +44 -0
  223. chia/_tests/pools/test_pool_puzzles_lifecycle.py +398 -0
  224. chia/_tests/pools/test_pool_rpc.py +1010 -0
  225. chia/_tests/pools/test_pool_wallet.py +201 -0
  226. chia/_tests/pools/test_wallet_pool_store.py +161 -0
  227. chia/_tests/process_junit.py +349 -0
  228. chia/_tests/rpc/__init__.py +0 -0
  229. chia/_tests/rpc/test_rpc_client.py +81 -0
  230. chia/_tests/simulation/__init__.py +0 -0
  231. chia/_tests/simulation/config.py +6 -0
  232. chia/_tests/simulation/test_simulation.py +501 -0
  233. chia/_tests/simulation/test_simulator.py +234 -0
  234. chia/_tests/simulation/test_start_simulator.py +106 -0
  235. chia/_tests/testconfig.py +13 -0
  236. chia/_tests/timelord/__init__.py +0 -0
  237. chia/_tests/timelord/config.py +3 -0
  238. chia/_tests/timelord/test_new_peak.py +437 -0
  239. chia/_tests/timelord/test_timelord.py +11 -0
  240. chia/_tests/tools/1315537.json +170 -0
  241. chia/_tests/tools/1315544.json +160 -0
  242. chia/_tests/tools/1315630.json +150 -0
  243. chia/_tests/tools/300000.json +105 -0
  244. chia/_tests/tools/442734.json +140 -0
  245. chia/_tests/tools/466212.json +130 -0
  246. chia/_tests/tools/__init__.py +0 -0
  247. chia/_tests/tools/config.py +5 -0
  248. chia/_tests/tools/test-blockchain-db.sqlite +0 -0
  249. chia/_tests/tools/test_full_sync.py +30 -0
  250. chia/_tests/tools/test_legacy_keyring.py +82 -0
  251. chia/_tests/tools/test_run_block.py +129 -0
  252. chia/_tests/util/__init__.py +0 -0
  253. chia/_tests/util/benchmark_cost.py +170 -0
  254. chia/_tests/util/benchmarks.py +154 -0
  255. chia/_tests/util/bip39_test_vectors.json +148 -0
  256. chia/_tests/util/blockchain.py +133 -0
  257. chia/_tests/util/blockchain_mock.py +132 -0
  258. chia/_tests/util/build_network_protocol_files.py +302 -0
  259. chia/_tests/util/clvm_generator.bin +0 -0
  260. chia/_tests/util/config.py +3 -0
  261. chia/_tests/util/constants.py +20 -0
  262. chia/_tests/util/db_connection.py +36 -0
  263. chia/_tests/util/full_sync.py +245 -0
  264. chia/_tests/util/gen_ssl_certs.py +115 -0
  265. chia/_tests/util/generator_tools_testing.py +47 -0
  266. chia/_tests/util/key_tool.py +37 -0
  267. chia/_tests/util/misc.py +722 -0
  268. chia/_tests/util/network_protocol_data.py +1074 -0
  269. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  270. chia/_tests/util/protocol_messages_json.py +2700 -0
  271. chia/_tests/util/rpc.py +23 -0
  272. chia/_tests/util/run_block.py +163 -0
  273. chia/_tests/util/setup_nodes.py +479 -0
  274. chia/_tests/util/split_managers.py +99 -0
  275. chia/_tests/util/temp_file.py +14 -0
  276. chia/_tests/util/test_action_scope.py +143 -0
  277. chia/_tests/util/test_async_pool.py +366 -0
  278. chia/_tests/util/test_build_job_matrix.py +43 -0
  279. chia/_tests/util/test_build_network_protocol_files.py +7 -0
  280. chia/_tests/util/test_chia_version.py +50 -0
  281. chia/_tests/util/test_collection.py +11 -0
  282. chia/_tests/util/test_condition_tools.py +231 -0
  283. chia/_tests/util/test_config.py +426 -0
  284. chia/_tests/util/test_dump_keyring.py +60 -0
  285. chia/_tests/util/test_errors.py +10 -0
  286. chia/_tests/util/test_full_block_utils.py +271 -0
  287. chia/_tests/util/test_installed.py +20 -0
  288. chia/_tests/util/test_limited_semaphore.py +52 -0
  289. chia/_tests/util/test_logging_filter.py +43 -0
  290. chia/_tests/util/test_misc.py +444 -0
  291. chia/_tests/util/test_network.py +74 -0
  292. chia/_tests/util/test_network_protocol_files.py +579 -0
  293. chia/_tests/util/test_network_protocol_json.py +266 -0
  294. chia/_tests/util/test_network_protocol_test.py +257 -0
  295. chia/_tests/util/test_paginator.py +72 -0
  296. chia/_tests/util/test_pprint.py +17 -0
  297. chia/_tests/util/test_priority_mutex.py +487 -0
  298. chia/_tests/util/test_recursive_replace.py +116 -0
  299. chia/_tests/util/test_replace_str_to_bytes.py +137 -0
  300. chia/_tests/util/test_service_groups.py +15 -0
  301. chia/_tests/util/test_ssl_check.py +31 -0
  302. chia/_tests/util/test_testnet_overrides.py +19 -0
  303. chia/_tests/util/test_tests_misc.py +38 -0
  304. chia/_tests/util/test_timing.py +37 -0
  305. chia/_tests/util/test_trusted_peer.py +51 -0
  306. chia/_tests/util/time_out_assert.py +154 -0
  307. chia/_tests/wallet/__init__.py +0 -0
  308. chia/_tests/wallet/cat_wallet/__init__.py +0 -0
  309. chia/_tests/wallet/cat_wallet/config.py +4 -0
  310. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
  311. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
  312. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1738 -0
  313. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
  314. chia/_tests/wallet/cat_wallet/test_trades.py +2578 -0
  315. chia/_tests/wallet/clawback/__init__.py +0 -0
  316. chia/_tests/wallet/clawback/config.py +3 -0
  317. chia/_tests/wallet/clawback/test_clawback_decorator.py +80 -0
  318. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
  319. chia/_tests/wallet/clawback/test_clawback_metadata.py +51 -0
  320. chia/_tests/wallet/config.py +4 -0
  321. chia/_tests/wallet/conftest.py +217 -0
  322. chia/_tests/wallet/dao_wallet/__init__.py +0 -0
  323. chia/_tests/wallet/dao_wallet/config.py +3 -0
  324. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1322 -0
  325. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
  326. chia/_tests/wallet/db_wallet/__init__.py +0 -0
  327. chia/_tests/wallet/db_wallet/config.py +3 -0
  328. chia/_tests/wallet/db_wallet/test_db_graftroot.py +143 -0
  329. chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
  330. chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
  331. chia/_tests/wallet/did_wallet/__init__.py +0 -0
  332. chia/_tests/wallet/did_wallet/config.py +4 -0
  333. chia/_tests/wallet/did_wallet/test_did.py +1481 -0
  334. chia/_tests/wallet/nft_wallet/__init__.py +0 -0
  335. chia/_tests/wallet/nft_wallet/config.py +4 -0
  336. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1492 -0
  337. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1014 -0
  338. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +376 -0
  339. chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
  340. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
  341. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2558 -0
  342. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
  343. chia/_tests/wallet/rpc/__init__.py +0 -0
  344. chia/_tests/wallet/rpc/config.py +4 -0
  345. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +287 -0
  346. chia/_tests/wallet/rpc/test_wallet_rpc.py +3106 -0
  347. chia/_tests/wallet/simple_sync/__init__.py +0 -0
  348. chia/_tests/wallet/simple_sync/config.py +3 -0
  349. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +719 -0
  350. chia/_tests/wallet/sync/__init__.py +0 -0
  351. chia/_tests/wallet/sync/config.py +4 -0
  352. chia/_tests/wallet/sync/test_wallet_sync.py +1529 -0
  353. chia/_tests/wallet/test_address_type.py +189 -0
  354. chia/_tests/wallet/test_bech32m.py +45 -0
  355. chia/_tests/wallet/test_clvm_streamable.py +244 -0
  356. chia/_tests/wallet/test_coin_selection.py +589 -0
  357. chia/_tests/wallet/test_conditions.py +388 -0
  358. chia/_tests/wallet/test_debug_spend_bundle.py +76 -0
  359. chia/_tests/wallet/test_new_wallet_protocol.py +1176 -0
  360. chia/_tests/wallet/test_nft_store.py +193 -0
  361. chia/_tests/wallet/test_notifications.py +196 -0
  362. chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
  363. chia/_tests/wallet/test_puzzle_store.py +133 -0
  364. chia/_tests/wallet/test_sign_coin_spends.py +159 -0
  365. chia/_tests/wallet/test_signer_protocol.py +948 -0
  366. chia/_tests/wallet/test_singleton.py +122 -0
  367. chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
  368. chia/_tests/wallet/test_singleton_store.py +152 -0
  369. chia/_tests/wallet/test_taproot.py +19 -0
  370. chia/_tests/wallet/test_transaction_store.py +941 -0
  371. chia/_tests/wallet/test_util.py +181 -0
  372. chia/_tests/wallet/test_wallet.py +2139 -0
  373. chia/_tests/wallet/test_wallet_action_scope.py +85 -0
  374. chia/_tests/wallet/test_wallet_blockchain.py +113 -0
  375. chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
  376. chia/_tests/wallet/test_wallet_interested_store.py +43 -0
  377. chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
  378. chia/_tests/wallet/test_wallet_node.py +783 -0
  379. chia/_tests/wallet/test_wallet_retry.py +95 -0
  380. chia/_tests/wallet/test_wallet_state_manager.py +252 -0
  381. chia/_tests/wallet/test_wallet_test_framework.py +275 -0
  382. chia/_tests/wallet/test_wallet_trade_store.py +218 -0
  383. chia/_tests/wallet/test_wallet_user_store.py +34 -0
  384. chia/_tests/wallet/test_wallet_utils.py +155 -0
  385. chia/_tests/wallet/vc_wallet/__init__.py +0 -0
  386. chia/_tests/wallet/vc_wallet/config.py +3 -0
  387. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
  388. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
  389. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +801 -0
  390. chia/_tests/wallet/wallet_block_tools.py +327 -0
  391. chia/_tests/weight_proof/__init__.py +0 -0
  392. chia/_tests/weight_proof/config.py +3 -0
  393. chia/_tests/weight_proof/test_weight_proof.py +528 -0
  394. chia/clvm/__init__.py +0 -0
  395. chia/clvm/spend_sim.py +488 -0
  396. chia/cmds/__init__.py +0 -0
  397. chia/cmds/beta.py +183 -0
  398. chia/cmds/beta_funcs.py +133 -0
  399. chia/cmds/check_wallet_db.py +418 -0
  400. chia/cmds/chia.py +143 -0
  401. chia/cmds/cmd_classes.py +315 -0
  402. chia/cmds/cmds_util.py +498 -0
  403. chia/cmds/coin_funcs.py +260 -0
  404. chia/cmds/coins.py +220 -0
  405. chia/cmds/completion.py +49 -0
  406. chia/cmds/configure.py +331 -0
  407. chia/cmds/dao.py +1008 -0
  408. chia/cmds/dao_funcs.py +576 -0
  409. chia/cmds/data.py +707 -0
  410. chia/cmds/data_funcs.py +380 -0
  411. chia/cmds/db.py +86 -0
  412. chia/cmds/db_backup_func.py +77 -0
  413. chia/cmds/db_upgrade_func.py +452 -0
  414. chia/cmds/db_validate_func.py +184 -0
  415. chia/cmds/dev.py +16 -0
  416. chia/cmds/farm.py +87 -0
  417. chia/cmds/farm_funcs.py +207 -0
  418. chia/cmds/init.py +70 -0
  419. chia/cmds/init_funcs.py +367 -0
  420. chia/cmds/installers.py +129 -0
  421. chia/cmds/keys.py +510 -0
  422. chia/cmds/keys_funcs.py +864 -0
  423. chia/cmds/netspace.py +47 -0
  424. chia/cmds/netspace_funcs.py +53 -0
  425. chia/cmds/options.py +32 -0
  426. chia/cmds/param_types.py +228 -0
  427. chia/cmds/passphrase.py +130 -0
  428. chia/cmds/passphrase_funcs.py +346 -0
  429. chia/cmds/peer.py +50 -0
  430. chia/cmds/peer_funcs.py +129 -0
  431. chia/cmds/plotnft.py +206 -0
  432. chia/cmds/plotnft_funcs.py +374 -0
  433. chia/cmds/plots.py +222 -0
  434. chia/cmds/plotters.py +17 -0
  435. chia/cmds/rpc.py +188 -0
  436. chia/cmds/show.py +71 -0
  437. chia/cmds/show_funcs.py +214 -0
  438. chia/cmds/signer.py +304 -0
  439. chia/cmds/sim.py +217 -0
  440. chia/cmds/sim_funcs.py +509 -0
  441. chia/cmds/start.py +24 -0
  442. chia/cmds/start_funcs.py +112 -0
  443. chia/cmds/stop.py +61 -0
  444. chia/cmds/units.py +11 -0
  445. chia/cmds/wallet.py +1745 -0
  446. chia/cmds/wallet_funcs.py +1800 -0
  447. chia/consensus/__init__.py +0 -0
  448. chia/consensus/block_body_validation.py +515 -0
  449. chia/consensus/block_creation.py +525 -0
  450. chia/consensus/block_header_validation.py +1064 -0
  451. chia/consensus/block_record.py +32 -0
  452. chia/consensus/block_rewards.py +53 -0
  453. chia/consensus/block_root_validation.py +46 -0
  454. chia/consensus/blockchain.py +1100 -0
  455. chia/consensus/blockchain_interface.py +56 -0
  456. chia/consensus/coinbase.py +30 -0
  457. chia/consensus/condition_costs.py +9 -0
  458. chia/consensus/constants.py +49 -0
  459. chia/consensus/cost_calculator.py +15 -0
  460. chia/consensus/default_constants.py +90 -0
  461. chia/consensus/deficit.py +55 -0
  462. chia/consensus/difficulty_adjustment.py +412 -0
  463. chia/consensus/find_fork_point.py +111 -0
  464. chia/consensus/full_block_to_block_record.py +167 -0
  465. chia/consensus/get_block_challenge.py +106 -0
  466. chia/consensus/get_block_generator.py +26 -0
  467. chia/consensus/make_sub_epoch_summary.py +210 -0
  468. chia/consensus/multiprocess_validation.py +365 -0
  469. chia/consensus/pos_quality.py +19 -0
  470. chia/consensus/pot_iterations.py +67 -0
  471. chia/consensus/puzzles/__init__.py +0 -0
  472. chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
  473. chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
  474. chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
  475. chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
  476. chia/consensus/vdf_info_computation.py +156 -0
  477. chia/daemon/__init__.py +0 -0
  478. chia/daemon/client.py +233 -0
  479. chia/daemon/keychain_proxy.py +501 -0
  480. chia/daemon/keychain_server.py +365 -0
  481. chia/daemon/server.py +1616 -0
  482. chia/daemon/windows_signal.py +56 -0
  483. chia/data_layer/__init__.py +0 -0
  484. chia/data_layer/data_layer.py +1303 -0
  485. chia/data_layer/data_layer_api.py +25 -0
  486. chia/data_layer/data_layer_errors.py +50 -0
  487. chia/data_layer/data_layer_server.py +170 -0
  488. chia/data_layer/data_layer_util.py +985 -0
  489. chia/data_layer/data_layer_wallet.py +1315 -0
  490. chia/data_layer/data_store.py +2267 -0
  491. chia/data_layer/dl_wallet_store.py +407 -0
  492. chia/data_layer/download_data.py +389 -0
  493. chia/data_layer/puzzles/__init__.py +0 -0
  494. chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
  495. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
  496. chia/data_layer/s3_plugin_config.yml +33 -0
  497. chia/data_layer/s3_plugin_service.py +468 -0
  498. chia/data_layer/util/__init__.py +0 -0
  499. chia/data_layer/util/benchmark.py +108 -0
  500. chia/data_layer/util/plugin.py +41 -0
  501. chia/farmer/__init__.py +0 -0
  502. chia/farmer/farmer.py +920 -0
  503. chia/farmer/farmer_api.py +814 -0
  504. chia/full_node/__init__.py +0 -0
  505. chia/full_node/bitcoin_fee_estimator.py +85 -0
  506. chia/full_node/block_height_map.py +271 -0
  507. chia/full_node/block_store.py +570 -0
  508. chia/full_node/bundle_tools.py +19 -0
  509. chia/full_node/coin_store.py +646 -0
  510. chia/full_node/fee_estimate.py +54 -0
  511. chia/full_node/fee_estimate_store.py +24 -0
  512. chia/full_node/fee_estimation.py +93 -0
  513. chia/full_node/fee_estimator.py +90 -0
  514. chia/full_node/fee_estimator_constants.py +38 -0
  515. chia/full_node/fee_estimator_interface.py +42 -0
  516. chia/full_node/fee_history.py +26 -0
  517. chia/full_node/fee_tracker.py +564 -0
  518. chia/full_node/full_node.py +3052 -0
  519. chia/full_node/full_node_api.py +1974 -0
  520. chia/full_node/full_node_store.py +1033 -0
  521. chia/full_node/hint_management.py +56 -0
  522. chia/full_node/hint_store.py +94 -0
  523. chia/full_node/mempool.py +583 -0
  524. chia/full_node/mempool_check_conditions.py +177 -0
  525. chia/full_node/mempool_manager.py +858 -0
  526. chia/full_node/pending_tx_cache.py +112 -0
  527. chia/full_node/puzzles/__init__.py +0 -0
  528. chia/full_node/puzzles/block_program_zero.clsp +14 -0
  529. chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
  530. chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
  531. chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
  532. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
  533. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
  534. chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
  535. chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
  536. chia/full_node/signage_point.py +16 -0
  537. chia/full_node/subscriptions.py +248 -0
  538. chia/full_node/sync_store.py +145 -0
  539. chia/full_node/tx_processing_queue.py +78 -0
  540. chia/full_node/weight_proof.py +1719 -0
  541. chia/harvester/__init__.py +0 -0
  542. chia/harvester/harvester.py +271 -0
  543. chia/harvester/harvester_api.py +374 -0
  544. chia/introducer/__init__.py +0 -0
  545. chia/introducer/introducer.py +120 -0
  546. chia/introducer/introducer_api.py +64 -0
  547. chia/legacy/__init__.py +0 -0
  548. chia/legacy/keyring.py +154 -0
  549. chia/plot_sync/__init__.py +0 -0
  550. chia/plot_sync/delta.py +61 -0
  551. chia/plot_sync/exceptions.py +56 -0
  552. chia/plot_sync/receiver.py +385 -0
  553. chia/plot_sync/sender.py +337 -0
  554. chia/plot_sync/util.py +43 -0
  555. chia/plotters/__init__.py +0 -0
  556. chia/plotters/bladebit.py +388 -0
  557. chia/plotters/chiapos.py +63 -0
  558. chia/plotters/madmax.py +224 -0
  559. chia/plotters/plotters.py +577 -0
  560. chia/plotters/plotters_util.py +131 -0
  561. chia/plotting/__init__.py +0 -0
  562. chia/plotting/cache.py +212 -0
  563. chia/plotting/check_plots.py +283 -0
  564. chia/plotting/create_plots.py +278 -0
  565. chia/plotting/manager.py +436 -0
  566. chia/plotting/util.py +324 -0
  567. chia/pools/__init__.py +0 -0
  568. chia/pools/pool_config.py +110 -0
  569. chia/pools/pool_puzzles.py +459 -0
  570. chia/pools/pool_wallet.py +926 -0
  571. chia/pools/pool_wallet_info.py +118 -0
  572. chia/pools/puzzles/__init__.py +0 -0
  573. chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
  574. chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
  575. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
  576. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
  577. chia/protocols/__init__.py +0 -0
  578. chia/protocols/farmer_protocol.py +102 -0
  579. chia/protocols/full_node_protocol.py +219 -0
  580. chia/protocols/harvester_protocol.py +216 -0
  581. chia/protocols/introducer_protocol.py +26 -0
  582. chia/protocols/pool_protocol.py +177 -0
  583. chia/protocols/protocol_message_types.py +139 -0
  584. chia/protocols/protocol_state_machine.py +87 -0
  585. chia/protocols/protocol_timing.py +7 -0
  586. chia/protocols/shared_protocol.py +86 -0
  587. chia/protocols/timelord_protocol.py +93 -0
  588. chia/protocols/wallet_protocol.py +401 -0
  589. chia/py.typed +0 -0
  590. chia/rpc/__init__.py +0 -0
  591. chia/rpc/crawler_rpc_api.py +75 -0
  592. chia/rpc/data_layer_rpc_api.py +639 -0
  593. chia/rpc/data_layer_rpc_client.py +188 -0
  594. chia/rpc/data_layer_rpc_util.py +62 -0
  595. chia/rpc/farmer_rpc_api.py +360 -0
  596. chia/rpc/farmer_rpc_client.py +86 -0
  597. chia/rpc/full_node_rpc_api.py +954 -0
  598. chia/rpc/full_node_rpc_client.py +292 -0
  599. chia/rpc/harvester_rpc_api.py +136 -0
  600. chia/rpc/harvester_rpc_client.py +54 -0
  601. chia/rpc/rpc_client.py +144 -0
  602. chia/rpc/rpc_server.py +447 -0
  603. chia/rpc/timelord_rpc_api.py +27 -0
  604. chia/rpc/util.py +293 -0
  605. chia/rpc/wallet_request_types.py +688 -0
  606. chia/rpc/wallet_rpc_api.py +4779 -0
  607. chia/rpc/wallet_rpc_client.py +1844 -0
  608. chia/seeder/__init__.py +0 -0
  609. chia/seeder/crawl_store.py +427 -0
  610. chia/seeder/crawler.py +423 -0
  611. chia/seeder/crawler_api.py +129 -0
  612. chia/seeder/dns_server.py +544 -0
  613. chia/seeder/peer_record.py +146 -0
  614. chia/seeder/start_crawler.py +88 -0
  615. chia/server/__init__.py +0 -0
  616. chia/server/address_manager.py +658 -0
  617. chia/server/address_manager_store.py +237 -0
  618. chia/server/api_protocol.py +11 -0
  619. chia/server/capabilities.py +24 -0
  620. chia/server/chia_policy.py +345 -0
  621. chia/server/introducer_peers.py +76 -0
  622. chia/server/node_discovery.py +718 -0
  623. chia/server/outbound_message.py +33 -0
  624. chia/server/rate_limit_numbers.py +204 -0
  625. chia/server/rate_limits.py +113 -0
  626. chia/server/server.py +720 -0
  627. chia/server/signal_handlers.py +117 -0
  628. chia/server/ssl_context.py +32 -0
  629. chia/server/start_data_layer.py +137 -0
  630. chia/server/start_farmer.py +86 -0
  631. chia/server/start_full_node.py +106 -0
  632. chia/server/start_harvester.py +80 -0
  633. chia/server/start_introducer.py +69 -0
  634. chia/server/start_service.py +328 -0
  635. chia/server/start_timelord.py +82 -0
  636. chia/server/start_wallet.py +109 -0
  637. chia/server/upnp.py +117 -0
  638. chia/server/ws_connection.py +752 -0
  639. chia/simulator/__init__.py +0 -0
  640. chia/simulator/block_tools.py +2053 -0
  641. chia/simulator/full_node_simulator.py +802 -0
  642. chia/simulator/keyring.py +128 -0
  643. chia/simulator/setup_services.py +505 -0
  644. chia/simulator/simulator_constants.py +13 -0
  645. chia/simulator/simulator_full_node_rpc_api.py +101 -0
  646. chia/simulator/simulator_full_node_rpc_client.py +62 -0
  647. chia/simulator/simulator_protocol.py +29 -0
  648. chia/simulator/simulator_test_tools.py +163 -0
  649. chia/simulator/socket.py +27 -0
  650. chia/simulator/ssl_certs.py +114 -0
  651. chia/simulator/ssl_certs_1.py +699 -0
  652. chia/simulator/ssl_certs_10.py +699 -0
  653. chia/simulator/ssl_certs_2.py +699 -0
  654. chia/simulator/ssl_certs_3.py +699 -0
  655. chia/simulator/ssl_certs_4.py +699 -0
  656. chia/simulator/ssl_certs_5.py +699 -0
  657. chia/simulator/ssl_certs_6.py +699 -0
  658. chia/simulator/ssl_certs_7.py +699 -0
  659. chia/simulator/ssl_certs_8.py +699 -0
  660. chia/simulator/ssl_certs_9.py +699 -0
  661. chia/simulator/start_simulator.py +135 -0
  662. chia/simulator/wallet_tools.py +245 -0
  663. chia/ssl/__init__.py +0 -0
  664. chia/ssl/chia_ca.crt +19 -0
  665. chia/ssl/chia_ca.key +28 -0
  666. chia/ssl/create_ssl.py +249 -0
  667. chia/ssl/dst_root_ca.pem +20 -0
  668. chia/timelord/__init__.py +0 -0
  669. chia/timelord/iters_from_block.py +50 -0
  670. chia/timelord/timelord.py +1202 -0
  671. chia/timelord/timelord_api.py +132 -0
  672. chia/timelord/timelord_launcher.py +188 -0
  673. chia/timelord/timelord_state.py +244 -0
  674. chia/timelord/types.py +22 -0
  675. chia/types/__init__.py +0 -0
  676. chia/types/aliases.py +35 -0
  677. chia/types/block_protocol.py +20 -0
  678. chia/types/blockchain_format/__init__.py +0 -0
  679. chia/types/blockchain_format/classgroup.py +5 -0
  680. chia/types/blockchain_format/coin.py +28 -0
  681. chia/types/blockchain_format/foliage.py +8 -0
  682. chia/types/blockchain_format/pool_target.py +5 -0
  683. chia/types/blockchain_format/program.py +270 -0
  684. chia/types/blockchain_format/proof_of_space.py +135 -0
  685. chia/types/blockchain_format/reward_chain_block.py +6 -0
  686. chia/types/blockchain_format/serialized_program.py +5 -0
  687. chia/types/blockchain_format/sized_bytes.py +11 -0
  688. chia/types/blockchain_format/slots.py +9 -0
  689. chia/types/blockchain_format/sub_epoch_summary.py +5 -0
  690. chia/types/blockchain_format/tree_hash.py +72 -0
  691. chia/types/blockchain_format/vdf.py +86 -0
  692. chia/types/clvm_cost.py +13 -0
  693. chia/types/coin_record.py +43 -0
  694. chia/types/coin_spend.py +115 -0
  695. chia/types/condition_opcodes.py +73 -0
  696. chia/types/condition_with_args.py +17 -0
  697. chia/types/eligible_coin_spends.py +364 -0
  698. chia/types/end_of_slot_bundle.py +5 -0
  699. chia/types/fee_rate.py +38 -0
  700. chia/types/full_block.py +5 -0
  701. chia/types/generator_types.py +14 -0
  702. chia/types/header_block.py +5 -0
  703. chia/types/internal_mempool_item.py +19 -0
  704. chia/types/mempool_inclusion_status.py +9 -0
  705. chia/types/mempool_item.py +85 -0
  706. chia/types/mempool_submission_status.py +30 -0
  707. chia/types/mojos.py +7 -0
  708. chia/types/peer_info.py +64 -0
  709. chia/types/signing_mode.py +29 -0
  710. chia/types/spend_bundle.py +31 -0
  711. chia/types/spend_bundle_conditions.py +7 -0
  712. chia/types/transaction_queue_entry.py +55 -0
  713. chia/types/unfinished_block.py +5 -0
  714. chia/types/unfinished_header_block.py +37 -0
  715. chia/types/weight_proof.py +50 -0
  716. chia/util/__init__.py +0 -0
  717. chia/util/action_scope.py +168 -0
  718. chia/util/api_decorators.py +89 -0
  719. chia/util/async_pool.py +224 -0
  720. chia/util/augmented_chain.py +130 -0
  721. chia/util/batches.py +39 -0
  722. chia/util/bech32m.py +123 -0
  723. chia/util/beta_metrics.py +118 -0
  724. chia/util/block_cache.py +56 -0
  725. chia/util/byte_types.py +10 -0
  726. chia/util/check_fork_next_block.py +32 -0
  727. chia/util/chia_logging.py +124 -0
  728. chia/util/chia_version.py +33 -0
  729. chia/util/collection.py +17 -0
  730. chia/util/condition_tools.py +201 -0
  731. chia/util/config.py +366 -0
  732. chia/util/cpu.py +20 -0
  733. chia/util/db_synchronous.py +21 -0
  734. chia/util/db_version.py +30 -0
  735. chia/util/db_wrapper.py +427 -0
  736. chia/util/default_root.py +10 -0
  737. chia/util/dump_keyring.py +93 -0
  738. chia/util/english.txt +2048 -0
  739. chia/util/errors.py +351 -0
  740. chia/util/file_keyring.py +480 -0
  741. chia/util/files.py +95 -0
  742. chia/util/full_block_utils.py +321 -0
  743. chia/util/generator_tools.py +62 -0
  744. chia/util/hash.py +29 -0
  745. chia/util/initial-config.yaml +675 -0
  746. chia/util/inline_executor.py +24 -0
  747. chia/util/ints.py +19 -0
  748. chia/util/json_util.py +41 -0
  749. chia/util/keychain.py +673 -0
  750. chia/util/keyring_wrapper.py +266 -0
  751. chia/util/limited_semaphore.py +39 -0
  752. chia/util/lock.py +47 -0
  753. chia/util/log_exceptions.py +29 -0
  754. chia/util/logging.py +34 -0
  755. chia/util/lru_cache.py +29 -0
  756. chia/util/math.py +20 -0
  757. chia/util/network.py +240 -0
  758. chia/util/paginator.py +46 -0
  759. chia/util/path.py +29 -0
  760. chia/util/permissions.py +19 -0
  761. chia/util/pprint.py +40 -0
  762. chia/util/prev_transaction_block.py +23 -0
  763. chia/util/priority_mutex.py +92 -0
  764. chia/util/profiler.py +194 -0
  765. chia/util/recursive_replace.py +22 -0
  766. chia/util/safe_cancel_task.py +14 -0
  767. chia/util/service_groups.py +47 -0
  768. chia/util/setproctitle.py +20 -0
  769. chia/util/significant_bits.py +30 -0
  770. chia/util/ssl_check.py +213 -0
  771. chia/util/streamable.py +654 -0
  772. chia/util/task_timing.py +378 -0
  773. chia/util/timing.py +64 -0
  774. chia/util/vdf_prover.py +31 -0
  775. chia/util/ws_message.py +66 -0
  776. chia/wallet/__init__.py +0 -0
  777. chia/wallet/cat_wallet/__init__.py +0 -0
  778. chia/wallet/cat_wallet/cat_constants.py +75 -0
  779. chia/wallet/cat_wallet/cat_info.py +47 -0
  780. chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
  781. chia/wallet/cat_wallet/cat_utils.py +163 -0
  782. chia/wallet/cat_wallet/cat_wallet.py +869 -0
  783. chia/wallet/cat_wallet/dao_cat_info.py +28 -0
  784. chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
  785. chia/wallet/cat_wallet/lineage_store.py +74 -0
  786. chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
  787. chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
  788. chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
  789. chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
  790. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
  791. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
  792. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
  793. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
  794. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
  795. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
  796. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
  797. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
  798. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
  799. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
  800. chia/wallet/coin_selection.py +188 -0
  801. chia/wallet/conditions.py +1326 -0
  802. chia/wallet/dao_wallet/__init__.py +0 -0
  803. chia/wallet/dao_wallet/dao_info.py +61 -0
  804. chia/wallet/dao_wallet/dao_utils.py +810 -0
  805. chia/wallet/dao_wallet/dao_wallet.py +2121 -0
  806. chia/wallet/db_wallet/__init__.py +0 -0
  807. chia/wallet/db_wallet/db_wallet_puzzles.py +107 -0
  808. chia/wallet/derivation_record.py +30 -0
  809. chia/wallet/derive_keys.py +146 -0
  810. chia/wallet/did_wallet/__init__.py +0 -0
  811. chia/wallet/did_wallet/did_info.py +39 -0
  812. chia/wallet/did_wallet/did_wallet.py +1485 -0
  813. chia/wallet/did_wallet/did_wallet_puzzles.py +220 -0
  814. chia/wallet/did_wallet/puzzles/__init__.py +0 -0
  815. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
  816. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
  817. chia/wallet/driver_protocol.py +26 -0
  818. chia/wallet/key_val_store.py +55 -0
  819. chia/wallet/lineage_proof.py +58 -0
  820. chia/wallet/nft_wallet/__init__.py +0 -0
  821. chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
  822. chia/wallet/nft_wallet/nft_info.py +120 -0
  823. chia/wallet/nft_wallet/nft_puzzles.py +305 -0
  824. chia/wallet/nft_wallet/nft_wallet.py +1686 -0
  825. chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
  826. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  827. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
  828. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
  829. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
  830. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
  831. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
  832. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
  833. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
  834. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
  835. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
  836. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
  837. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
  838. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
  839. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
  840. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
  841. chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
  842. chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
  843. chia/wallet/nft_wallet/uncurry_nft.py +217 -0
  844. chia/wallet/notification_manager.py +117 -0
  845. chia/wallet/notification_store.py +178 -0
  846. chia/wallet/outer_puzzles.py +84 -0
  847. chia/wallet/payment.py +34 -0
  848. chia/wallet/puzzle_drivers.py +118 -0
  849. chia/wallet/puzzles/__init__.py +0 -0
  850. chia/wallet/puzzles/augmented_condition.clsp +13 -0
  851. chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
  852. chia/wallet/puzzles/clawback/__init__.py +0 -0
  853. chia/wallet/puzzles/clawback/drivers.py +188 -0
  854. chia/wallet/puzzles/clawback/metadata.py +38 -0
  855. chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
  856. chia/wallet/puzzles/condition_codes.clib +77 -0
  857. chia/wallet/puzzles/curry-and-treehash.clib +102 -0
  858. chia/wallet/puzzles/curry.clib +135 -0
  859. chia/wallet/puzzles/curry_by_index.clib +16 -0
  860. chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
  861. chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
  862. chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
  863. chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
  864. chia/wallet/puzzles/dao_finished_state.clsp +35 -0
  865. chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
  866. chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
  867. chia/wallet/puzzles/dao_lockup.clsp +288 -0
  868. chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
  869. chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
  870. chia/wallet/puzzles/dao_proposal.clsp +377 -0
  871. chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
  872. chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
  873. chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
  874. chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
  875. chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
  876. chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
  877. chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
  878. chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
  879. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
  880. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
  881. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
  882. chia/wallet/puzzles/dao_treasury.clsp +115 -0
  883. chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
  884. chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
  885. chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
  886. chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
  887. chia/wallet/puzzles/json.clib +25 -0
  888. chia/wallet/puzzles/load_clvm.py +162 -0
  889. chia/wallet/puzzles/merkle_utils.clib +18 -0
  890. chia/wallet/puzzles/notification.clsp +7 -0
  891. chia/wallet/puzzles/notification.clsp.hex +1 -0
  892. chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
  893. chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
  894. chia/wallet/puzzles/p2_conditions.clsp +3 -0
  895. chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
  896. chia/wallet/puzzles/p2_conditions.py +27 -0
  897. chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
  898. chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
  899. chia/wallet/puzzles/p2_delegated_conditions.py +22 -0
  900. chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
  901. chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
  902. chia/wallet/puzzles/p2_delegated_puzzle.py +35 -0
  903. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
  904. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
  905. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +161 -0
  906. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
  907. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
  908. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +22 -0
  909. chia/wallet/puzzles/p2_parent.clsp +19 -0
  910. chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
  911. chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
  912. chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
  913. chia/wallet/puzzles/p2_puzzle_hash.py +28 -0
  914. chia/wallet/puzzles/p2_singleton.clsp +30 -0
  915. chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
  916. chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
  917. chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
  918. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
  919. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
  920. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
  921. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
  922. chia/wallet/puzzles/puzzle_utils.py +34 -0
  923. chia/wallet/puzzles/settlement_payments.clsp +49 -0
  924. chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
  925. chia/wallet/puzzles/sha256tree.clib +11 -0
  926. chia/wallet/puzzles/singleton_launcher.clsp +16 -0
  927. chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
  928. chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
  929. chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
  930. chia/wallet/puzzles/singleton_top_layer.py +295 -0
  931. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
  932. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
  933. chia/wallet/puzzles/singleton_top_layer_v1_1.py +344 -0
  934. chia/wallet/puzzles/singleton_truths.clib +21 -0
  935. chia/wallet/puzzles/tails.py +344 -0
  936. chia/wallet/puzzles/utility_macros.clib +48 -0
  937. chia/wallet/signer_protocol.py +126 -0
  938. chia/wallet/singleton.py +106 -0
  939. chia/wallet/singleton_record.py +30 -0
  940. chia/wallet/trade_manager.py +1088 -0
  941. chia/wallet/trade_record.py +67 -0
  942. chia/wallet/trading/__init__.py +0 -0
  943. chia/wallet/trading/offer.py +703 -0
  944. chia/wallet/trading/trade_status.py +13 -0
  945. chia/wallet/trading/trade_store.py +526 -0
  946. chia/wallet/transaction_record.py +143 -0
  947. chia/wallet/transaction_sorting.py +14 -0
  948. chia/wallet/uncurried_puzzle.py +17 -0
  949. chia/wallet/util/__init__.py +0 -0
  950. chia/wallet/util/address_type.py +55 -0
  951. chia/wallet/util/blind_signer_tl.py +168 -0
  952. chia/wallet/util/clvm_streamable.py +203 -0
  953. chia/wallet/util/compute_hints.py +66 -0
  954. chia/wallet/util/compute_memos.py +45 -0
  955. chia/wallet/util/curry_and_treehash.py +90 -0
  956. chia/wallet/util/debug_spend_bundle.py +234 -0
  957. chia/wallet/util/merkle_tree.py +100 -0
  958. chia/wallet/util/merkle_utils.py +102 -0
  959. chia/wallet/util/new_peak_queue.py +82 -0
  960. chia/wallet/util/notifications.py +12 -0
  961. chia/wallet/util/peer_request_cache.py +174 -0
  962. chia/wallet/util/puzzle_compression.py +96 -0
  963. chia/wallet/util/puzzle_decorator.py +100 -0
  964. chia/wallet/util/puzzle_decorator_type.py +7 -0
  965. chia/wallet/util/query_filter.py +60 -0
  966. chia/wallet/util/transaction_type.py +23 -0
  967. chia/wallet/util/tx_config.py +158 -0
  968. chia/wallet/util/wallet_sync_utils.py +348 -0
  969. chia/wallet/util/wallet_types.py +65 -0
  970. chia/wallet/vc_wallet/__init__.py +0 -0
  971. chia/wallet/vc_wallet/cr_cat_drivers.py +663 -0
  972. chia/wallet/vc_wallet/cr_cat_wallet.py +875 -0
  973. chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
  974. chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
  975. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
  976. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
  977. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
  978. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
  979. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
  980. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
  981. chia/wallet/vc_wallet/vc_drivers.py +838 -0
  982. chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
  983. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
  984. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
  985. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
  986. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
  987. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
  988. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
  989. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
  990. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
  991. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
  992. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
  993. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
  994. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
  995. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
  996. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
  997. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
  998. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
  999. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
  1000. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
  1001. chia/wallet/vc_wallet/vc_store.py +263 -0
  1002. chia/wallet/vc_wallet/vc_wallet.py +638 -0
  1003. chia/wallet/wallet.py +698 -0
  1004. chia/wallet/wallet_action_scope.py +95 -0
  1005. chia/wallet/wallet_blockchain.py +244 -0
  1006. chia/wallet/wallet_coin_record.py +72 -0
  1007. chia/wallet/wallet_coin_store.py +351 -0
  1008. chia/wallet/wallet_info.py +36 -0
  1009. chia/wallet/wallet_interested_store.py +188 -0
  1010. chia/wallet/wallet_nft_store.py +279 -0
  1011. chia/wallet/wallet_node.py +1769 -0
  1012. chia/wallet/wallet_node_api.py +201 -0
  1013. chia/wallet/wallet_pool_store.py +120 -0
  1014. chia/wallet/wallet_protocol.py +90 -0
  1015. chia/wallet/wallet_puzzle_store.py +365 -0
  1016. chia/wallet/wallet_retry_store.py +70 -0
  1017. chia/wallet/wallet_singleton_store.py +258 -0
  1018. chia/wallet/wallet_spend_bundle.py +41 -0
  1019. chia/wallet/wallet_state_manager.py +2820 -0
  1020. chia/wallet/wallet_transaction_store.py +470 -0
  1021. chia/wallet/wallet_user_store.py +110 -0
  1022. chia/wallet/wallet_weight_proof_handler.py +126 -0
  1023. chia_blockchain-2.4.4.dist-info/LICENSE +201 -0
  1024. chia_blockchain-2.4.4.dist-info/METADATA +161 -0
  1025. chia_blockchain-2.4.4.dist-info/RECORD +1028 -0
  1026. chia_blockchain-2.4.4.dist-info/WHEEL +4 -0
  1027. chia_blockchain-2.4.4.dist-info/entry_points.txt +17 -0
  1028. mozilla-ca/cacert.pem +3666 -0
@@ -0,0 +1,941 @@
1
+ from __future__ import annotations
2
+
3
+ import dataclasses
4
+ import random
5
+ from typing import Any, List, Optional, Tuple
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 WalletTransactionStore, filter_ok_mempool_status
20
+
21
+ module_seeded_random = random.Random()
22
+ module_seeded_random.seed(a=0, version=2)
23
+
24
+ coin_1 = Coin(bytes32.random(module_seeded_random), bytes32.random(module_seeded_random), uint64(12312))
25
+ coin_2 = Coin(bytes32.random(module_seeded_random), bytes32.random(module_seeded_random), uint64(1234))
26
+ coin_3 = Coin(bytes32.random(module_seeded_random), bytes32.random(module_seeded_random), uint64(12312 - 1234))
27
+
28
+ tr1 = TransactionRecord(
29
+ uint32(0), # confirmed height
30
+ uint64(1000), # created_at_time
31
+ bytes32(bytes32.random(module_seeded_random)), # to_puzzle_hash
32
+ uint64(1234), # amount
33
+ uint64(12), # fee_amount
34
+ False, # confirmed
35
+ uint32(0), # sent
36
+ None, # Optional[SpendBundle] spend_bundle
37
+ [coin_2, coin_3], # additions
38
+ [coin_1], # removals
39
+ uint32(1), # wallet_id
40
+ [], # List[Tuple[str, uint8, Optional[str]]] sent_to
41
+ bytes32(bytes32.random(module_seeded_random)), # trade_id
42
+ uint32(TransactionType.OUTGOING_TX), # type
43
+ bytes32(bytes32.random(module_seeded_random)), # name
44
+ [], # List[Tuple[bytes32, List[bytes]]] memos
45
+ ConditionValidTimes(),
46
+ )
47
+
48
+
49
+ @pytest.mark.anyio
50
+ async def test_add() -> None:
51
+ async with DBConnection(1) as db_wrapper:
52
+ store = await WalletTransactionStore.create(db_wrapper)
53
+
54
+ assert await store.get_transaction_record(tr1.name) is None
55
+ await store.add_transaction_record(tr1)
56
+ assert await store.get_transaction_record(tr1.name) == tr1
57
+
58
+
59
+ @pytest.mark.anyio
60
+ async def test_delete() -> None:
61
+ async with DBConnection(1) as db_wrapper:
62
+ store = await WalletTransactionStore.create(db_wrapper)
63
+
64
+ await store.add_transaction_record(tr1)
65
+ assert await store.get_transaction_record(tr1.name) == tr1
66
+ await store.delete_transaction_record(tr1.name)
67
+ assert await store.get_transaction_record(tr1.name) is None
68
+
69
+
70
+ @pytest.mark.anyio
71
+ async def test_set_confirmed() -> None:
72
+ async with DBConnection(1) as db_wrapper:
73
+ store = await WalletTransactionStore.create(db_wrapper)
74
+
75
+ await store.add_transaction_record(tr1)
76
+ await store.set_confirmed(tr1.name, uint32(100))
77
+
78
+ assert await store.get_transaction_record(tr1.name) == dataclasses.replace(
79
+ tr1, confirmed=True, confirmed_at_height=uint32(100)
80
+ )
81
+
82
+
83
+ @pytest.mark.anyio
84
+ async def test_increment_sent_noop(seeded_random: random.Random) -> None:
85
+ async with DBConnection(1) as db_wrapper:
86
+ store = await WalletTransactionStore.create(db_wrapper)
87
+
88
+ assert (
89
+ await store.increment_sent(
90
+ bytes32(bytes32.random(seeded_random)), "peer1", MempoolInclusionStatus.PENDING, None
91
+ )
92
+ is False
93
+ )
94
+
95
+
96
+ @pytest.mark.anyio
97
+ async def test_increment_sent() -> None:
98
+ async with DBConnection(1) as db_wrapper:
99
+ store = await WalletTransactionStore.create(db_wrapper)
100
+
101
+ await store.add_transaction_record(tr1)
102
+ tr = await store.get_transaction_record(tr1.name)
103
+ assert tr.sent == 0
104
+ assert tr.sent_to == []
105
+
106
+ assert await store.increment_sent(tr1.name, "peer1", MempoolInclusionStatus.PENDING, None) is True
107
+ tr = await store.get_transaction_record(tr1.name)
108
+ assert tr.sent == 1
109
+ assert tr.sent_to == [("peer1", uint8(2), None)]
110
+
111
+ assert await store.increment_sent(tr1.name, "peer1", MempoolInclusionStatus.SUCCESS, None) is True
112
+ tr = await store.get_transaction_record(tr1.name)
113
+ assert tr.sent == 1
114
+ assert tr.sent_to == [("peer1", uint8(2), None), ("peer1", uint8(1), None)]
115
+
116
+ assert await store.increment_sent(tr1.name, "peer2", MempoolInclusionStatus.SUCCESS, None) is True
117
+ tr = await store.get_transaction_record(tr1.name)
118
+ assert tr.sent == 2
119
+ assert tr.sent_to == [("peer1", uint8(2), None), ("peer1", uint8(1), None), ("peer2", uint8(1), None)]
120
+
121
+
122
+ @pytest.mark.anyio
123
+ async def test_increment_sent_error() -> None:
124
+ async with DBConnection(1) as db_wrapper:
125
+ store = await WalletTransactionStore.create(db_wrapper)
126
+
127
+ await store.add_transaction_record(tr1)
128
+ tr = await store.get_transaction_record(tr1.name)
129
+ assert tr.sent == 0
130
+ assert tr.sent_to == []
131
+
132
+ await store.increment_sent(tr1.name, "peer1", MempoolInclusionStatus.FAILED, Err.MEMPOOL_NOT_INITIALIZED)
133
+ tr = await store.get_transaction_record(tr1.name)
134
+ assert tr.sent == 1
135
+ assert tr.sent_to == [("peer1", uint8(3), "MEMPOOL_NOT_INITIALIZED")]
136
+
137
+
138
+ def test_filter_ok_mempool_status() -> None:
139
+ assert filter_ok_mempool_status([("peer1", uint8(1), None)]) == []
140
+ assert filter_ok_mempool_status([("peer1", uint8(2), None)]) == []
141
+ assert filter_ok_mempool_status([("peer1", uint8(3), None)]) == [("peer1", uint8(3), None)]
142
+ assert filter_ok_mempool_status(
143
+ [("peer1", uint8(2), None), ("peer1", uint8(1), None), ("peer1", uint8(3), None)]
144
+ ) == [("peer1", uint8(3), None)]
145
+
146
+ assert filter_ok_mempool_status([("peer1", uint8(3), "message does not matter")]) == [
147
+ ("peer1", uint8(3), "message does not matter")
148
+ ]
149
+ assert filter_ok_mempool_status([("peer1", uint8(2), "message does not matter")]) == []
150
+
151
+
152
+ @pytest.mark.anyio
153
+ async def test_tx_reorged_update() -> None:
154
+ async with DBConnection(1) as db_wrapper:
155
+ store = await WalletTransactionStore.create(db_wrapper)
156
+
157
+ tr = dataclasses.replace(tr1, sent=uint32(2), sent_to=[("peer1", uint8(1), None), ("peer2", uint8(1), None)])
158
+ await store.add_transaction_record(tr)
159
+ tr = await store.get_transaction_record(tr.name)
160
+ assert tr.sent == 2
161
+ assert tr.sent_to == [("peer1", uint8(1), None), ("peer2", uint8(1), None)]
162
+
163
+ await store.tx_reorged(tr)
164
+ tr = await store.get_transaction_record(tr1.name)
165
+ assert tr.sent == 0
166
+ assert tr.sent_to == []
167
+
168
+
169
+ @pytest.mark.anyio
170
+ async def test_tx_reorged_add() -> None:
171
+ async with DBConnection(1) as db_wrapper:
172
+ store = await WalletTransactionStore.create(db_wrapper)
173
+
174
+ tr = dataclasses.replace(tr1, sent=uint32(2), sent_to=[("peer1", uint8(1), None), ("peer2", uint8(1), None)])
175
+
176
+ await store.get_transaction_record(tr.name) is None
177
+ await store.tx_reorged(tr)
178
+ tr = await store.get_transaction_record(tr.name)
179
+ assert tr.sent == 0
180
+ assert tr.sent_to == []
181
+
182
+
183
+ @pytest.mark.anyio
184
+ async def test_get_tx_record(seeded_random: random.Random) -> None:
185
+ async with DBConnection(1) as db_wrapper:
186
+ store = await WalletTransactionStore.create(db_wrapper)
187
+
188
+ tr2 = dataclasses.replace(tr1, name=bytes32.random(seeded_random))
189
+ tr3 = dataclasses.replace(tr1, name=bytes32.random(seeded_random))
190
+
191
+ assert await store.get_transaction_record(tr1.name) is None
192
+ await store.add_transaction_record(tr1)
193
+ assert await store.get_transaction_record(tr1.name) == tr1
194
+
195
+ assert await store.get_transaction_record(tr2.name) is None
196
+ await store.add_transaction_record(tr2)
197
+ assert await store.get_transaction_record(tr2.name) == tr2
198
+
199
+ assert await store.get_transaction_record(tr3.name) is None
200
+ await store.add_transaction_record(tr3)
201
+ assert await store.get_transaction_record(tr3.name) == tr3
202
+
203
+ assert await store.get_transaction_record(tr1.name) == tr1
204
+ assert await store.get_transaction_record(tr2.name) == tr2
205
+ assert await store.get_transaction_record(tr3.name) == tr3
206
+
207
+
208
+ @pytest.mark.anyio
209
+ async def test_get_farming_rewards(seeded_random: random.Random) -> None:
210
+ async with DBConnection(1) as db_wrapper:
211
+ store = await WalletTransactionStore.create(db_wrapper)
212
+
213
+ test_trs: List[TransactionRecord] = []
214
+ # tr1 is type OUTGOING_TX
215
+
216
+ for conf in [True, False]:
217
+ for type in [
218
+ TransactionType.INCOMING_TX,
219
+ TransactionType.OUTGOING_TX,
220
+ TransactionType.COINBASE_REWARD,
221
+ TransactionType.FEE_REWARD,
222
+ TransactionType.INCOMING_TRADE,
223
+ TransactionType.OUTGOING_TRADE,
224
+ ]:
225
+ test_trs.append(
226
+ dataclasses.replace(
227
+ tr1,
228
+ name=bytes32.random(seeded_random),
229
+ confirmed=conf,
230
+ confirmed_at_height=uint32(100 if conf else 0),
231
+ type=uint32(type.value),
232
+ )
233
+ )
234
+
235
+ for tr in test_trs:
236
+ await store.add_transaction_record(tr)
237
+ assert await store.get_transaction_record(tr.name) == tr
238
+
239
+ rewards = await store.get_farming_rewards()
240
+ assert len(rewards) == 2
241
+ assert test_trs[2] in rewards
242
+ assert test_trs[3] in rewards
243
+
244
+
245
+ @pytest.mark.anyio
246
+ async def test_get_all_unconfirmed(seeded_random: random.Random) -> None:
247
+ async with DBConnection(1) as db_wrapper:
248
+ store = await WalletTransactionStore.create(db_wrapper)
249
+
250
+ tr2 = dataclasses.replace(
251
+ tr1, name=bytes32.random(seeded_random), confirmed=True, confirmed_at_height=uint32(100)
252
+ )
253
+ await store.add_transaction_record(tr1)
254
+ await store.add_transaction_record(tr2)
255
+
256
+ assert await store.get_all_unconfirmed() == [tr1]
257
+
258
+
259
+ @pytest.mark.anyio
260
+ async def test_get_unconfirmed_for_wallet(seeded_random: random.Random) -> None:
261
+ async with DBConnection(1) as db_wrapper:
262
+ store = await WalletTransactionStore.create(db_wrapper)
263
+
264
+ tr2 = dataclasses.replace(
265
+ tr1, name=bytes32.random(seeded_random), confirmed=True, confirmed_at_height=uint32(100)
266
+ )
267
+ tr3 = dataclasses.replace(tr1, name=bytes32.random(seeded_random), wallet_id=uint32(2))
268
+ tr4 = dataclasses.replace(tr2, name=bytes32.random(seeded_random), wallet_id=uint32(2))
269
+ await store.add_transaction_record(tr1)
270
+ await store.add_transaction_record(tr2)
271
+ await store.add_transaction_record(tr3)
272
+ await store.add_transaction_record(tr4)
273
+
274
+ assert await store.get_unconfirmed_for_wallet(1) == [tr1]
275
+ assert await store.get_unconfirmed_for_wallet(2) == [tr3]
276
+
277
+
278
+ @pytest.mark.anyio
279
+ async def test_transaction_count_for_wallet(seeded_random: random.Random) -> None:
280
+ async with DBConnection(1) as db_wrapper:
281
+ store = await WalletTransactionStore.create(db_wrapper)
282
+
283
+ tr2 = dataclasses.replace(tr1, name=bytes32.random(seeded_random), wallet_id=uint32(2))
284
+
285
+ # 5 transactions in wallet_id 1
286
+ await store.add_transaction_record(tr1)
287
+ await store.add_transaction_record(dataclasses.replace(tr1, name=bytes32.random(seeded_random)))
288
+ await store.add_transaction_record(dataclasses.replace(tr1, name=bytes32.random(seeded_random)))
289
+ await store.add_transaction_record(dataclasses.replace(tr1, name=bytes32.random(seeded_random)))
290
+ await store.add_transaction_record(dataclasses.replace(tr1, name=bytes32.random(seeded_random)))
291
+
292
+ # 2 transactions in wallet_id 2
293
+ await store.add_transaction_record(tr2)
294
+ await store.add_transaction_record(dataclasses.replace(tr2, name=bytes32.random(seeded_random)))
295
+
296
+ assert await store.get_transaction_count_for_wallet(1) == 5
297
+ assert await store.get_transaction_count_for_wallet(2) == 2
298
+ assert (
299
+ await store.get_transaction_count_for_wallet(
300
+ 1, True, type_filter=TransactionTypeFilter.include([TransactionType.OUTGOING_TX])
301
+ )
302
+ == 0
303
+ )
304
+ assert (
305
+ await store.get_transaction_count_for_wallet(
306
+ 1, False, type_filter=TransactionTypeFilter.include([TransactionType.OUTGOING_CLAWBACK])
307
+ )
308
+ == 0
309
+ )
310
+ assert (
311
+ await store.get_transaction_count_for_wallet(
312
+ 1, False, type_filter=TransactionTypeFilter.include([TransactionType.OUTGOING_TX])
313
+ )
314
+ == 5
315
+ )
316
+
317
+
318
+ @pytest.mark.anyio
319
+ async def test_all_transactions_for_wallet(seeded_random: random.Random) -> None:
320
+ async with DBConnection(1) as db_wrapper:
321
+ store = await WalletTransactionStore.create(db_wrapper)
322
+
323
+ test_trs: List[TransactionRecord] = []
324
+ for wallet_id in [1, 2]:
325
+ for type in [
326
+ TransactionType.INCOMING_TX,
327
+ TransactionType.OUTGOING_TX,
328
+ TransactionType.COINBASE_REWARD,
329
+ TransactionType.FEE_REWARD,
330
+ TransactionType.INCOMING_TRADE,
331
+ TransactionType.OUTGOING_TRADE,
332
+ ]:
333
+ test_trs.append(
334
+ dataclasses.replace(
335
+ tr1,
336
+ name=bytes32.random(seeded_random),
337
+ wallet_id=uint32(wallet_id),
338
+ type=uint32(type.value),
339
+ )
340
+ )
341
+
342
+ for tr in test_trs:
343
+ await store.add_transaction_record(tr)
344
+
345
+ assert await store.get_all_transactions_for_wallet(1) == test_trs[:6]
346
+ assert await store.get_all_transactions_for_wallet(2) == test_trs[6:]
347
+
348
+ assert await store.get_all_transactions_for_wallet(1, TransactionType.INCOMING_TX) == [test_trs[0]]
349
+ assert await store.get_all_transactions_for_wallet(1, TransactionType.OUTGOING_TX) == [test_trs[1]]
350
+ assert await store.get_all_transactions_for_wallet(1, TransactionType.INCOMING_TRADE) == [test_trs[4]]
351
+ assert await store.get_all_transactions_for_wallet(1, TransactionType.OUTGOING_TRADE) == [test_trs[5]]
352
+
353
+ assert await store.get_all_transactions_for_wallet(2, TransactionType.INCOMING_TX) == [test_trs[6]]
354
+ assert await store.get_all_transactions_for_wallet(2, TransactionType.OUTGOING_TX) == [test_trs[7]]
355
+ assert await store.get_all_transactions_for_wallet(2, TransactionType.INCOMING_TRADE) == [test_trs[10]]
356
+ assert await store.get_all_transactions_for_wallet(2, TransactionType.OUTGOING_TRADE) == [test_trs[11]]
357
+
358
+
359
+ def cmp(lhs: List[Any], rhs: List[Any]) -> bool:
360
+ if len(rhs) != len(lhs):
361
+ return False
362
+
363
+ for e in lhs:
364
+ if e not in rhs:
365
+ return False
366
+ return True
367
+
368
+
369
+ @pytest.mark.anyio
370
+ async def test_get_all_transactions(seeded_random: random.Random) -> None:
371
+ async with DBConnection(1) as db_wrapper:
372
+ store = await WalletTransactionStore.create(db_wrapper)
373
+
374
+ test_trs: List[TransactionRecord] = []
375
+ assert await store.get_all_transactions() == []
376
+ for wallet_id in [1, 2, 3, 4]:
377
+ test_trs.append(dataclasses.replace(tr1, name=bytes32.random(seeded_random), wallet_id=uint32(wallet_id)))
378
+
379
+ for tr in test_trs:
380
+ await store.add_transaction_record(tr)
381
+
382
+ all_trs = await store.get_all_transactions()
383
+ assert cmp(all_trs, test_trs)
384
+
385
+
386
+ @pytest.mark.anyio
387
+ async def test_get_transaction_above(seeded_random: random.Random) -> None:
388
+ async with DBConnection(1) as db_wrapper:
389
+ store = await WalletTransactionStore.create(db_wrapper)
390
+
391
+ test_trs: List[TransactionRecord] = []
392
+ assert await store.get_transaction_above(uint32(0)) == []
393
+ for height in range(10):
394
+ test_trs.append(
395
+ dataclasses.replace(tr1, name=bytes32.random(seeded_random), confirmed_at_height=uint32(height))
396
+ )
397
+
398
+ for tr in test_trs:
399
+ await store.add_transaction_record(tr)
400
+
401
+ for height in range(10):
402
+ trs = await store.get_transaction_above(uint32(height))
403
+ assert cmp(trs, test_trs[height + 1 :])
404
+
405
+
406
+ @pytest.mark.anyio
407
+ async def test_get_tx_by_trade_id(seeded_random: random.Random) -> None:
408
+ async with DBConnection(1) as db_wrapper:
409
+ store = await WalletTransactionStore.create(db_wrapper)
410
+
411
+ tr2 = dataclasses.replace(tr1, name=bytes32.random(seeded_random), trade_id=bytes32.random(seeded_random))
412
+ tr3 = dataclasses.replace(tr1, name=bytes32.random(seeded_random), trade_id=bytes32.random(seeded_random))
413
+ tr4 = dataclasses.replace(tr1, name=bytes32.random(seeded_random))
414
+
415
+ assert await store.get_transactions_by_trade_id(tr1.trade_id) == []
416
+ await store.add_transaction_record(tr1)
417
+ assert await store.get_transactions_by_trade_id(tr1.trade_id) == [tr1]
418
+
419
+ assert await store.get_transactions_by_trade_id(tr2.trade_id) == []
420
+ await store.add_transaction_record(tr2)
421
+ assert await store.get_transactions_by_trade_id(tr2.trade_id) == [tr2]
422
+
423
+ assert await store.get_transactions_by_trade_id(tr3.trade_id) == []
424
+ await store.add_transaction_record(tr3)
425
+ assert await store.get_transactions_by_trade_id(tr3.trade_id) == [tr3]
426
+
427
+ # tr1 and tr4 have the same trade_id
428
+ assert await store.get_transactions_by_trade_id(tr4.trade_id) == [tr1]
429
+ await store.add_transaction_record(tr4)
430
+ assert cmp(await store.get_transactions_by_trade_id(tr4.trade_id), [tr1, tr4])
431
+
432
+ assert cmp(await store.get_transactions_by_trade_id(tr1.trade_id), [tr1, tr4])
433
+ assert await store.get_transactions_by_trade_id(tr2.trade_id) == [tr2]
434
+ assert await store.get_transactions_by_trade_id(tr3.trade_id) == [tr3]
435
+ assert cmp(await store.get_transactions_by_trade_id(tr4.trade_id), [tr1, tr4])
436
+
437
+
438
+ @pytest.mark.anyio
439
+ async def test_rollback_to_block(seeded_random: random.Random) -> None:
440
+ async with DBConnection(1) as db_wrapper:
441
+ store = await WalletTransactionStore.create(db_wrapper)
442
+
443
+ test_trs: List[TransactionRecord] = []
444
+ for height in range(10):
445
+ test_trs.append(
446
+ dataclasses.replace(tr1, name=bytes32.random(seeded_random), confirmed_at_height=uint32(height))
447
+ )
448
+
449
+ for tr in test_trs:
450
+ await store.add_transaction_record(tr)
451
+
452
+ await store.rollback_to_block(uint32(6))
453
+ all_trs = await store.get_all_transactions()
454
+ assert cmp(all_trs, test_trs[:7])
455
+
456
+ await store.rollback_to_block(uint32(5))
457
+ all_trs = await store.get_all_transactions()
458
+ assert cmp(all_trs, test_trs[:6])
459
+
460
+
461
+ @pytest.mark.anyio
462
+ async def test_delete_unconfirmed(seeded_random: random.Random) -> None:
463
+ async with DBConnection(1) as db_wrapper:
464
+ store = await WalletTransactionStore.create(db_wrapper)
465
+
466
+ tr2 = dataclasses.replace(tr1, name=bytes32.random(seeded_random), confirmed=True)
467
+ tr3 = dataclasses.replace(tr1, name=bytes32.random(seeded_random), confirmed=True, wallet_id=uint32(2))
468
+ tr4 = dataclasses.replace(tr1, name=bytes32.random(seeded_random), wallet_id=uint32(2))
469
+ tr5 = dataclasses.replace(
470
+ tr1,
471
+ name=bytes32.random(seeded_random),
472
+ wallet_id=uint32(2),
473
+ type=uint32(TransactionType.INCOMING_CLAWBACK_RECEIVE.value),
474
+ )
475
+
476
+ await store.add_transaction_record(tr1)
477
+ await store.add_transaction_record(tr2)
478
+ await store.add_transaction_record(tr3)
479
+ await store.add_transaction_record(tr4)
480
+ await store.add_transaction_record(tr5)
481
+
482
+ assert cmp(await store.get_all_transactions(), [tr1, tr2, tr3, tr4, tr5])
483
+ await store.delete_unconfirmed_transactions(1)
484
+ assert cmp(await store.get_all_transactions(), [tr2, tr3, tr4, tr5])
485
+ await store.delete_unconfirmed_transactions(2)
486
+ assert cmp(await store.get_all_transactions(), [tr2, tr3, tr5])
487
+
488
+
489
+ @pytest.mark.anyio
490
+ async def test_get_transactions_between_confirmed(seeded_random: random.Random) -> None:
491
+ async with DBConnection(1) as db_wrapper:
492
+ store = await WalletTransactionStore.create(db_wrapper)
493
+
494
+ tr2 = dataclasses.replace(
495
+ tr1, name=bytes32.random(seeded_random), confirmed=True, confirmed_at_height=uint32(1)
496
+ )
497
+ tr3 = dataclasses.replace(
498
+ tr1, name=bytes32.random(seeded_random), confirmed=True, confirmed_at_height=uint32(2)
499
+ )
500
+ tr4 = dataclasses.replace(
501
+ tr1, name=bytes32.random(seeded_random), confirmed=True, confirmed_at_height=uint32(3)
502
+ )
503
+ tr5 = dataclasses.replace(
504
+ tr1, name=bytes32.random(seeded_random), confirmed=True, confirmed_at_height=uint32(4)
505
+ )
506
+ tr6 = dataclasses.replace(
507
+ tr1,
508
+ name=bytes32.random(seeded_random),
509
+ confirmed_at_height=uint32(5),
510
+ type=uint32(TransactionType.COINBASE_REWARD.value),
511
+ )
512
+
513
+ await store.add_transaction_record(tr1)
514
+ await store.add_transaction_record(tr2)
515
+ await store.add_transaction_record(tr3)
516
+ await store.add_transaction_record(tr4)
517
+ await store.add_transaction_record(tr5)
518
+
519
+ # Test confirmed filter
520
+ assert await store.get_transactions_between(1, 0, 100, confirmed=True) == [tr2, tr3, tr4, tr5]
521
+ assert await store.get_transactions_between(1, 0, 100, confirmed=False) == [tr1]
522
+
523
+ # test different limits
524
+ assert await store.get_transactions_between(1, 0, 1) == [tr1]
525
+ assert await store.get_transactions_between(1, 0, 2) == [tr1, tr2]
526
+ assert await store.get_transactions_between(1, 0, 3) == [tr1, tr2, tr3]
527
+ assert await store.get_transactions_between(1, 0, 100) == [tr1, tr2, tr3, tr4, tr5]
528
+
529
+ # test different start offsets
530
+ assert await store.get_transactions_between(1, 1, 100) == [tr2, tr3, tr4, tr5]
531
+ assert await store.get_transactions_between(1, 2, 100) == [tr3, tr4, tr5]
532
+ assert await store.get_transactions_between(1, 3, 100) == [tr4, tr5]
533
+
534
+ # wallet 2 is empty
535
+ assert await store.get_transactions_between(2, 0, 100) == []
536
+
537
+ # reverse
538
+
539
+ # test different limits
540
+ assert await store.get_transactions_between(1, 0, 1, reverse=True) == [tr5]
541
+ assert await store.get_transactions_between(1, 0, 2, reverse=True) == [tr5, tr4]
542
+ assert await store.get_transactions_between(1, 0, 3, reverse=True) == [tr5, tr4, tr3]
543
+ assert await store.get_transactions_between(1, 0, 100, reverse=True) == [tr5, tr4, tr3, tr2, tr1]
544
+
545
+ # test different start offsets
546
+ assert await store.get_transactions_between(1, 1, 100, reverse=True) == [tr4, tr3, tr2, tr1]
547
+ assert await store.get_transactions_between(1, 2, 100, reverse=True) == [tr3, tr2, tr1]
548
+ assert await store.get_transactions_between(1, 3, 100, reverse=True) == [tr2, tr1]
549
+
550
+ # test type filter (coinbase reward)
551
+ await store.add_transaction_record(tr6)
552
+ assert await store.get_transactions_between(
553
+ 1, 0, 1, reverse=True, type_filter=TransactionTypeFilter.include([TransactionType.COINBASE_REWARD])
554
+ ) == [tr6]
555
+ assert await store.get_transactions_between(
556
+ 1, 0, 1, reverse=True, type_filter=TransactionTypeFilter.exclude([TransactionType.COINBASE_REWARD])
557
+ ) == [tr5]
558
+ assert (
559
+ await store.get_transactions_between(1, 0, 100, reverse=True, type_filter=TransactionTypeFilter.include([]))
560
+ == []
561
+ )
562
+ assert await store.get_transactions_between(
563
+ 1, 0, 100, reverse=True, type_filter=TransactionTypeFilter.exclude([])
564
+ ) == [
565
+ tr6,
566
+ tr5,
567
+ tr4,
568
+ tr3,
569
+ tr2,
570
+ tr1,
571
+ ]
572
+ assert await store.get_transactions_between(
573
+ 1,
574
+ 0,
575
+ 100,
576
+ reverse=True,
577
+ type_filter=TransactionTypeFilter.include([TransactionType.COINBASE_REWARD, TransactionType.OUTGOING_TX]),
578
+ ) == [tr6, tr5, tr4, tr3, tr2, tr1]
579
+
580
+
581
+ @pytest.mark.anyio
582
+ async def test_get_transactions_between_relevance(seeded_random: random.Random) -> None:
583
+ async with DBConnection(1) as db_wrapper:
584
+ store = await WalletTransactionStore.create(db_wrapper)
585
+
586
+ t1 = dataclasses.replace(
587
+ tr1,
588
+ name=bytes32.random(seeded_random),
589
+ confirmed=False,
590
+ confirmed_at_height=uint32(2),
591
+ created_at_time=uint64(1000),
592
+ )
593
+ t2 = dataclasses.replace(
594
+ tr1,
595
+ name=bytes32.random(seeded_random),
596
+ confirmed=False,
597
+ confirmed_at_height=uint32(2),
598
+ created_at_time=uint64(999),
599
+ )
600
+ t3 = dataclasses.replace(
601
+ tr1,
602
+ name=bytes32.random(seeded_random),
603
+ confirmed=False,
604
+ confirmed_at_height=uint32(1),
605
+ created_at_time=uint64(1000),
606
+ )
607
+ t4 = dataclasses.replace(
608
+ tr1,
609
+ name=bytes32.random(seeded_random),
610
+ confirmed=False,
611
+ confirmed_at_height=uint32(1),
612
+ created_at_time=uint64(999),
613
+ )
614
+
615
+ t5 = dataclasses.replace(
616
+ tr1,
617
+ name=bytes32.random(seeded_random),
618
+ confirmed=True,
619
+ confirmed_at_height=uint32(2),
620
+ created_at_time=uint64(1000),
621
+ )
622
+ t6 = dataclasses.replace(
623
+ tr1,
624
+ name=bytes32.random(seeded_random),
625
+ confirmed=True,
626
+ confirmed_at_height=uint32(2),
627
+ created_at_time=uint64(999),
628
+ )
629
+ t7 = dataclasses.replace(
630
+ tr1,
631
+ name=bytes32.random(seeded_random),
632
+ confirmed=True,
633
+ confirmed_at_height=uint32(1),
634
+ created_at_time=uint64(1000),
635
+ )
636
+ t8 = dataclasses.replace(
637
+ tr1,
638
+ name=bytes32.random(seeded_random),
639
+ confirmed=True,
640
+ confirmed_at_height=uint32(1),
641
+ created_at_time=uint64(999),
642
+ )
643
+
644
+ await store.add_transaction_record(t1)
645
+ await store.add_transaction_record(t2)
646
+ await store.add_transaction_record(t3)
647
+ await store.add_transaction_record(t4)
648
+ await store.add_transaction_record(t5)
649
+ await store.add_transaction_record(t6)
650
+ await store.add_transaction_record(t7)
651
+ await store.add_transaction_record(t8)
652
+
653
+ # test different limits
654
+ assert await store.get_transactions_between(1, 0, 1, sort_key="RELEVANCE") == [t1]
655
+ assert await store.get_transactions_between(1, 0, 2, sort_key="RELEVANCE") == [t1, t2]
656
+ assert await store.get_transactions_between(1, 0, 3, sort_key="RELEVANCE") == [t1, t2, t3]
657
+ assert await store.get_transactions_between(1, 0, 100, sort_key="RELEVANCE") == [t1, t2, t3, t4, t5, t6, t7, t8]
658
+
659
+ # test different start offsets
660
+ assert await store.get_transactions_between(1, 1, 100, sort_key="RELEVANCE") == [t2, t3, t4, t5, t6, t7, t8]
661
+ assert await store.get_transactions_between(1, 2, 100, sort_key="RELEVANCE") == [t3, t4, t5, t6, t7, t8]
662
+ assert await store.get_transactions_between(1, 3, 100, sort_key="RELEVANCE") == [t4, t5, t6, t7, t8]
663
+ assert await store.get_transactions_between(1, 4, 100, sort_key="RELEVANCE") == [t5, t6, t7, t8]
664
+
665
+ # wallet 2 is empty
666
+ assert await store.get_transactions_between(2, 0, 100, sort_key="RELEVANCE") == []
667
+
668
+ # reverse
669
+
670
+ # test different limits
671
+ assert await store.get_transactions_between(1, 0, 1, sort_key="RELEVANCE", reverse=True) == [t8]
672
+ assert await store.get_transactions_between(1, 0, 2, sort_key="RELEVANCE", reverse=True) == [t8, t7]
673
+ assert await store.get_transactions_between(1, 0, 3, sort_key="RELEVANCE", reverse=True) == [t8, t7, t6]
674
+ assert await store.get_transactions_between(1, 0, 100, sort_key="RELEVANCE", reverse=True) == [
675
+ t8,
676
+ t7,
677
+ t6,
678
+ t5,
679
+ t4,
680
+ t3,
681
+ t2,
682
+ t1,
683
+ ]
684
+
685
+ # test different start offsets
686
+ assert await store.get_transactions_between(1, 1, 100, sort_key="RELEVANCE", reverse=True) == [
687
+ t7,
688
+ t6,
689
+ t5,
690
+ t4,
691
+ t3,
692
+ t2,
693
+ t1,
694
+ ]
695
+ assert await store.get_transactions_between(1, 2, 100, sort_key="RELEVANCE", reverse=True) == [
696
+ t6,
697
+ t5,
698
+ t4,
699
+ t3,
700
+ t2,
701
+ t1,
702
+ ]
703
+ assert await store.get_transactions_between(1, 3, 100, sort_key="RELEVANCE", reverse=True) == [
704
+ t5,
705
+ t4,
706
+ t3,
707
+ t2,
708
+ t1,
709
+ ]
710
+
711
+
712
+ @pytest.mark.anyio
713
+ async def test_get_transactions_between_to_puzzle_hash(seeded_random: random.Random) -> None:
714
+ async with DBConnection(1) as db_wrapper:
715
+ store = await WalletTransactionStore.create(db_wrapper)
716
+
717
+ ph1 = bytes32.random(seeded_random)
718
+ ph2 = bytes32.random(seeded_random)
719
+
720
+ tr2 = dataclasses.replace(
721
+ tr1, name=bytes32.random(seeded_random), confirmed_at_height=uint32(1), to_puzzle_hash=ph1
722
+ )
723
+ tr3 = dataclasses.replace(
724
+ tr1, name=bytes32.random(seeded_random), confirmed_at_height=uint32(2), to_puzzle_hash=ph1
725
+ )
726
+ tr4 = dataclasses.replace(
727
+ tr1, name=bytes32.random(seeded_random), confirmed_at_height=uint32(3), to_puzzle_hash=ph2
728
+ )
729
+ tr5 = dataclasses.replace(
730
+ tr1, name=bytes32.random(seeded_random), confirmed_at_height=uint32(4), to_puzzle_hash=ph2
731
+ )
732
+
733
+ await store.add_transaction_record(tr1)
734
+ await store.add_transaction_record(tr2)
735
+ await store.add_transaction_record(tr3)
736
+ await store.add_transaction_record(tr4)
737
+ await store.add_transaction_record(tr5)
738
+
739
+ # test different limits
740
+ assert await store.get_transactions_between(1, 0, 100, to_puzzle_hash=ph1) == [tr2, tr3]
741
+ assert await store.get_transactions_between(1, 0, 100, to_puzzle_hash=ph2) == [tr4, tr5]
742
+
743
+ # test different start offsets
744
+ assert await store.get_transactions_between(1, 1, 100, to_puzzle_hash=ph1) == [tr3]
745
+ assert await store.get_transactions_between(1, 1, 100, to_puzzle_hash=ph2) == [tr5]
746
+
747
+ # reverse
748
+
749
+ # test different limits
750
+ assert await store.get_transactions_between(1, 0, 100, to_puzzle_hash=ph1, reverse=True) == [tr3, tr2]
751
+ assert await store.get_transactions_between(1, 0, 100, to_puzzle_hash=ph2, reverse=True) == [tr5, tr4]
752
+
753
+ # test different start offsets
754
+ assert await store.get_transactions_between(1, 1, 100, to_puzzle_hash=ph1, reverse=True) == [tr2]
755
+ assert await store.get_transactions_between(1, 1, 100, to_puzzle_hash=ph2, reverse=True) == [tr4]
756
+
757
+
758
+ @pytest.mark.anyio
759
+ async def test_get_not_sent(seeded_random: random.Random) -> None:
760
+ async with DBConnection(1) as db_wrapper:
761
+ store = await WalletTransactionStore.create(db_wrapper)
762
+
763
+ tr2 = dataclasses.replace(
764
+ tr1, name=bytes32.random(seeded_random), confirmed=True, confirmed_at_height=uint32(1)
765
+ )
766
+ tr3 = dataclasses.replace(tr1, name=bytes32.random(seeded_random))
767
+ tr4 = dataclasses.replace(tr1, name=bytes32.random(seeded_random))
768
+
769
+ await store.add_transaction_record(tr1)
770
+ await store.add_transaction_record(tr2)
771
+ await store.add_transaction_record(tr3)
772
+ await store.add_transaction_record(tr4)
773
+
774
+ not_sent = await store.get_not_sent()
775
+ assert cmp(not_sent, [tr1, tr3, tr4])
776
+
777
+ not_sent = await store.get_not_sent()
778
+ assert cmp(not_sent, [tr1, tr3, tr4])
779
+
780
+ not_sent = await store.get_not_sent()
781
+ assert cmp(not_sent, [tr1, tr3, tr4])
782
+
783
+ not_sent = await store.get_not_sent()
784
+ assert cmp(not_sent, [tr1, tr3, tr4])
785
+
786
+ not_sent = await store.get_not_sent()
787
+ assert cmp(not_sent, [tr1, tr3, tr4])
788
+
789
+ not_sent = await store.get_not_sent()
790
+ assert cmp(not_sent, [tr1, tr3, tr4])
791
+
792
+ # the 7th time we call this function, we don't get any unsent txs
793
+ not_sent = await store.get_not_sent()
794
+ assert cmp(not_sent, [])
795
+
796
+ # TODO: also cover include_accepted_txs=True
797
+
798
+
799
+ @pytest.mark.anyio
800
+ async def test_transaction_record_is_valid() -> None:
801
+ invalid_attempts: List[Tuple[str, uint8, Optional[str]]] = []
802
+ # The tx should be valid as long as we don't have minimum_send_attempts failed attempts
803
+ while len(invalid_attempts) < minimum_send_attempts:
804
+ assert dataclasses.replace(tr1, sent_to=invalid_attempts).is_valid()
805
+ invalid_attempts.append(("peer", uint8(MempoolInclusionStatus.FAILED), None))
806
+ # The tx should be invalid now with more than minimum failed attempts
807
+ assert len(invalid_attempts) == minimum_send_attempts
808
+ assert not dataclasses.replace(tr1, sent_to=invalid_attempts).is_valid()
809
+ mempool_success = ("success", uint8(MempoolInclusionStatus.SUCCESS), None)
810
+ low_fee = ("low_fee", uint8(MempoolInclusionStatus.FAILED), Err.INVALID_FEE_LOW_FEE.name)
811
+ close_to_zero = (
812
+ "close_to_zero",
813
+ uint8(MempoolInclusionStatus.FAILED),
814
+ Err.INVALID_FEE_TOO_CLOSE_TO_ZERO.name,
815
+ )
816
+ # But it should become valid with one of the above attempts
817
+ assert dataclasses.replace(tr1, sent_to=invalid_attempts + [mempool_success]).is_valid()
818
+ assert dataclasses.replace(tr1, sent_to=invalid_attempts + [low_fee]).is_valid()
819
+ assert dataclasses.replace(tr1, sent_to=invalid_attempts + [close_to_zero]).is_valid()
820
+
821
+
822
+ @pytest.mark.anyio
823
+ async def test_valid_times_migration() -> None:
824
+ async with DBConnection(1) as db_wrapper:
825
+ async with db_wrapper.writer_maybe_transaction() as conn:
826
+ await conn.execute(
827
+ "CREATE TABLE IF NOT EXISTS transaction_record("
828
+ " transaction_record blob,"
829
+ " bundle_id text PRIMARY KEY,"
830
+ " confirmed_at_height bigint,"
831
+ " created_at_time bigint,"
832
+ " to_puzzle_hash text,"
833
+ " amount blob,"
834
+ " fee_amount blob,"
835
+ " confirmed int,"
836
+ " sent int,"
837
+ " wallet_id bigint,"
838
+ " trade_id text,"
839
+ " type int)"
840
+ )
841
+
842
+ old_record = TransactionRecordOld(
843
+ confirmed_at_height=uint32(0),
844
+ created_at_time=uint64(1000000000),
845
+ to_puzzle_hash=bytes32([0] * 32),
846
+ amount=uint64(0),
847
+ fee_amount=uint64(0),
848
+ confirmed=False,
849
+ sent=uint32(10),
850
+ spend_bundle=None,
851
+ additions=[],
852
+ removals=[],
853
+ wallet_id=uint32(1),
854
+ sent_to=[],
855
+ trade_id=None,
856
+ type=uint32(TransactionType.INCOMING_TX.value),
857
+ name=bytes32([0] * 32),
858
+ memos=[],
859
+ )
860
+
861
+ async with db_wrapper.writer_maybe_transaction() as conn:
862
+ await conn.execute_insert(
863
+ "INSERT OR REPLACE INTO transaction_record VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
864
+ (
865
+ bytes(old_record),
866
+ old_record.name,
867
+ old_record.confirmed_at_height,
868
+ old_record.created_at_time,
869
+ old_record.to_puzzle_hash.hex(),
870
+ old_record.amount.stream_to_bytes(),
871
+ old_record.fee_amount.stream_to_bytes(),
872
+ int(old_record.confirmed),
873
+ old_record.sent,
874
+ old_record.wallet_id,
875
+ old_record.trade_id,
876
+ old_record.type,
877
+ ),
878
+ )
879
+
880
+ store = await WalletTransactionStore.create(db_wrapper)
881
+ rec = await store.get_transaction_record(old_record.name)
882
+ assert rec is not None
883
+ assert rec.valid_times == ConditionValidTimes()
884
+
885
+
886
+ @pytest.mark.anyio
887
+ async def test_large_tx_record_query() -> None:
888
+ async with DBConnection(1) as db_wrapper:
889
+ store = await WalletTransactionStore.create(db_wrapper)
890
+ tx_records_to_insert = []
891
+ for _ in range(db_wrapper.host_parameter_limit + 1):
892
+ name = bytes32.random()
893
+ record = TransactionRecordOld(
894
+ confirmed_at_height=uint32(0),
895
+ created_at_time=uint64(1000000000),
896
+ to_puzzle_hash=bytes32([0] * 32),
897
+ amount=uint64(0),
898
+ fee_amount=uint64(0),
899
+ confirmed=False,
900
+ sent=uint32(10),
901
+ spend_bundle=None,
902
+ additions=[],
903
+ removals=[],
904
+ wallet_id=uint32(1),
905
+ sent_to=[],
906
+ trade_id=None,
907
+ type=uint32(TransactionType.INCOMING_TX.value),
908
+ name=name,
909
+ memos=[],
910
+ )
911
+ tx_records_to_insert.append(
912
+ (
913
+ bytes(record),
914
+ record.name,
915
+ record.confirmed_at_height,
916
+ record.created_at_time,
917
+ record.to_puzzle_hash.hex(),
918
+ record.amount.stream_to_bytes(),
919
+ record.fee_amount.stream_to_bytes(),
920
+ int(record.confirmed),
921
+ record.sent,
922
+ record.wallet_id,
923
+ record.trade_id,
924
+ record.type,
925
+ )
926
+ )
927
+ async with db_wrapper.writer_maybe_transaction() as conn:
928
+ await conn.executemany(
929
+ "INSERT INTO transaction_record VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", tx_records_to_insert
930
+ )
931
+ # Insert a specific tx_times item for the last transaction_record item
932
+ await conn.execute(
933
+ "INSERT INTO tx_times VALUES (?, ?)", (name, bytes(ConditionValidTimes(min_height=uint32(42))))
934
+ )
935
+
936
+ all_transactions = await store.get_all_transactions_for_wallet(1)
937
+ assert len(all_transactions) == db_wrapper.host_parameter_limit + 1
938
+ # Check that all transaction record items have correct valid times
939
+ empty_valid_times = ConditionValidTimes()
940
+ assert all(tx.valid_times == empty_valid_times for tx in all_transactions[:-1])
941
+ assert all_transactions[-1].valid_times.min_height == uint32(42)