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
chia/cmds/wallet.py ADDED
@@ -0,0 +1,1745 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import pathlib
5
+ from typing import List, Optional, Sequence
6
+
7
+ import click
8
+
9
+ from chia.cmds import options
10
+ from chia.cmds.check_wallet_db import help_text as check_help_text
11
+ from chia.cmds.cmds_util import timelock_args, tx_out_cmd
12
+ from chia.cmds.coins import coins_cmd
13
+ from chia.cmds.param_types import (
14
+ AddressParamType,
15
+ AmountParamType,
16
+ Bytes32ParamType,
17
+ CliAddress,
18
+ CliAmount,
19
+ cli_amount_none,
20
+ )
21
+ from chia.types.blockchain_format.sized_bytes import bytes32
22
+ from chia.util.ints import uint32, uint64
23
+ from chia.wallet.conditions import ConditionValidTimes
24
+ from chia.wallet.transaction_record import TransactionRecord
25
+ from chia.wallet.transaction_sorting import SortKey
26
+ from chia.wallet.util.address_type import AddressType
27
+ from chia.wallet.util.wallet_types import WalletType
28
+
29
+
30
+ @click.group("wallet", help="Manage your wallet")
31
+ @click.pass_context
32
+ def wallet_cmd(ctx: click.Context) -> None:
33
+ pass
34
+
35
+
36
+ @wallet_cmd.command("get_transaction", help="Get a transaction")
37
+ @click.option(
38
+ "-wp",
39
+ "--wallet-rpc-port",
40
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
41
+ type=int,
42
+ default=None,
43
+ )
44
+ @options.create_fingerprint()
45
+ # TODO: Remove unused wallet id option
46
+ @click.option("-i", "--id", help="Id of the wallet to use", type=int, default=1, show_default=True, required=True)
47
+ @click.option("-tx", "--tx_id", help="transaction id to search for", type=str, required=True)
48
+ @click.option("--verbose", "-v", count=True, type=int)
49
+ def get_transaction_cmd(wallet_rpc_port: Optional[int], fingerprint: int, id: int, tx_id: str, verbose: int) -> None:
50
+ from .wallet_funcs import get_transaction
51
+
52
+ asyncio.run(get_transaction(wallet_rpc_port=wallet_rpc_port, fingerprint=fingerprint, tx_id=tx_id, verbose=verbose))
53
+
54
+
55
+ @wallet_cmd.command("get_transactions", help="Get all transactions")
56
+ @click.option(
57
+ "-wp",
58
+ "--wallet-rpc-port",
59
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
60
+ type=int,
61
+ default=None,
62
+ )
63
+ @options.create_fingerprint()
64
+ @click.option("-i", "--id", help="Id of the wallet to use", type=int, default=1, show_default=True, required=True)
65
+ @click.option(
66
+ "-o",
67
+ "--offset",
68
+ help="Skip transactions from the beginning of the list",
69
+ type=int,
70
+ default=0,
71
+ show_default=True,
72
+ required=True,
73
+ )
74
+ @click.option(
75
+ "-l",
76
+ "--limit",
77
+ help="Max number of transactions to return",
78
+ type=int,
79
+ default=(2**32 - 1),
80
+ show_default=True,
81
+ required=False,
82
+ )
83
+ @click.option("--verbose", "-v", count=True, type=int)
84
+ @click.option(
85
+ "--paginate/--no-paginate",
86
+ default=None,
87
+ help="Prompt for each page of data. Defaults to true for interactive consoles, otherwise false.",
88
+ )
89
+ @click.option(
90
+ "--sort-by-height",
91
+ "sort_key",
92
+ flag_value=SortKey.CONFIRMED_AT_HEIGHT,
93
+ type=SortKey,
94
+ help="Sort transactions by height",
95
+ )
96
+ @click.option(
97
+ "--sort-by-relevance",
98
+ "sort_key",
99
+ flag_value=SortKey.RELEVANCE,
100
+ type=SortKey,
101
+ default=True,
102
+ help="Sort transactions by {confirmed, height, time}",
103
+ )
104
+ @click.option(
105
+ "--reverse",
106
+ is_flag=True,
107
+ default=False,
108
+ help="Reverse the transaction ordering",
109
+ )
110
+ @click.option(
111
+ "--clawback",
112
+ is_flag=True,
113
+ default=False,
114
+ help="Only show clawback transactions",
115
+ )
116
+ def get_transactions_cmd(
117
+ wallet_rpc_port: Optional[int],
118
+ fingerprint: int,
119
+ id: int,
120
+ offset: int,
121
+ limit: int,
122
+ verbose: bool,
123
+ paginate: Optional[bool],
124
+ sort_key: SortKey,
125
+ reverse: bool,
126
+ clawback: bool,
127
+ ) -> None: # pragma: no cover
128
+ from .wallet_funcs import get_transactions
129
+
130
+ asyncio.run(
131
+ get_transactions(
132
+ wallet_rpc_port=wallet_rpc_port,
133
+ fp=fingerprint,
134
+ wallet_id=id,
135
+ verbose=verbose,
136
+ paginate=paginate,
137
+ offset=offset,
138
+ limit=limit,
139
+ sort_key=sort_key,
140
+ reverse=reverse,
141
+ clawback=clawback,
142
+ )
143
+ )
144
+
145
+
146
+ @wallet_cmd.command("send", help="Send chia or other assets to another wallet")
147
+ @click.option(
148
+ "-wp",
149
+ "--wallet-rpc-port",
150
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
151
+ type=int,
152
+ default=None,
153
+ )
154
+ @options.create_fingerprint()
155
+ @click.option("-i", "--id", help="Id of the wallet to use", type=int, default=1, show_default=True, required=True)
156
+ @click.option(
157
+ "-a", "--amount", help="How much chia to send, in XCH or CAT units", type=AmountParamType(), required=True
158
+ )
159
+ @click.option("-e", "--memo", help="Additional memo for the transaction", type=str, default=None)
160
+ @options.create_fee()
161
+ # TODO: Fix RPC as this should take a puzzle_hash not an address.
162
+ @click.option("-t", "--address", help="Address to send the XCH", type=AddressParamType(), required=True)
163
+ @click.option(
164
+ "-o", "--override", help="Submits transaction without checking for unusual values", is_flag=True, default=False
165
+ )
166
+ @click.option(
167
+ "-ma",
168
+ "--min-coin-amount",
169
+ help="Ignore coins worth less then this much XCH or CAT units",
170
+ type=AmountParamType(),
171
+ required=False,
172
+ default=cli_amount_none,
173
+ )
174
+ @click.option(
175
+ "-l",
176
+ "--max-coin-amount",
177
+ help="Ignore coins worth more then this much XCH or CAT units",
178
+ type=AmountParamType(),
179
+ required=False,
180
+ default=cli_amount_none,
181
+ )
182
+ @click.option(
183
+ "--exclude-coin",
184
+ "coins_to_exclude",
185
+ multiple=True,
186
+ type=Bytes32ParamType(),
187
+ help="Exclude this coin from being spent.",
188
+ )
189
+ @click.option(
190
+ "--reuse",
191
+ help="Reuse existing address for the change.",
192
+ is_flag=True,
193
+ default=False,
194
+ )
195
+ @click.option(
196
+ "--clawback_time",
197
+ help="The seconds that the recipient needs to wait to claim the fund."
198
+ " A positive number will enable the Clawback features.",
199
+ type=int,
200
+ default=0,
201
+ )
202
+ @tx_out_cmd()
203
+ def send_cmd(
204
+ wallet_rpc_port: Optional[int],
205
+ fingerprint: int,
206
+ id: int,
207
+ amount: CliAmount,
208
+ memo: Optional[str],
209
+ fee: uint64,
210
+ address: CliAddress,
211
+ override: bool,
212
+ min_coin_amount: CliAmount,
213
+ max_coin_amount: CliAmount,
214
+ coins_to_exclude: Sequence[bytes32],
215
+ reuse: bool,
216
+ clawback_time: int,
217
+ push: bool,
218
+ condition_valid_times: ConditionValidTimes,
219
+ ) -> List[TransactionRecord]:
220
+ from .wallet_funcs import send
221
+
222
+ return asyncio.run(
223
+ send(
224
+ wallet_rpc_port=wallet_rpc_port,
225
+ fp=fingerprint,
226
+ wallet_id=id,
227
+ amount=amount,
228
+ memo=memo,
229
+ fee=fee,
230
+ address=address,
231
+ override=override,
232
+ min_coin_amount=min_coin_amount,
233
+ max_coin_amount=max_coin_amount,
234
+ excluded_coin_ids=coins_to_exclude,
235
+ reuse_puzhash=True if reuse else None,
236
+ clawback_time_lock=clawback_time,
237
+ push=push,
238
+ condition_valid_times=condition_valid_times,
239
+ )
240
+ )
241
+
242
+
243
+ @wallet_cmd.command("show", help="Show wallet information")
244
+ @click.option(
245
+ "-wp",
246
+ "--wallet-rpc-port",
247
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
248
+ type=int,
249
+ default=None,
250
+ )
251
+ @options.create_fingerprint()
252
+ @click.option(
253
+ "-w",
254
+ "--wallet_type",
255
+ help="Choose a specific wallet type to return",
256
+ type=click.Choice([x.name.lower() for x in WalletType]),
257
+ default=None,
258
+ )
259
+ def show_cmd(wallet_rpc_port: Optional[int], fingerprint: int, wallet_type: Optional[str]) -> None:
260
+ from .wallet_funcs import print_balances
261
+
262
+ asyncio.run(print_balances(wallet_rpc_port, fingerprint, WalletType[wallet_type.upper()] if wallet_type else None))
263
+
264
+
265
+ @wallet_cmd.command("get_address", help="Get a wallet receive address")
266
+ @click.option(
267
+ "-wp",
268
+ "--wallet-rpc-port",
269
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
270
+ type=int,
271
+ default=None,
272
+ )
273
+ @click.option("-i", "--id", help="Id of the wallet to use", type=int, default=1, show_default=True, required=True)
274
+ @options.create_fingerprint()
275
+ @click.option(
276
+ "-n/-l",
277
+ "--new-address/--latest-address",
278
+ help=(
279
+ "Create a new wallet receive address, or show the most recently created wallet receive address"
280
+ " [default: show most recent address]"
281
+ ),
282
+ is_flag=True,
283
+ default=False,
284
+ )
285
+ def get_address_cmd(wallet_rpc_port: Optional[int], id: int, fingerprint: int, new_address: bool) -> None:
286
+ from .wallet_funcs import get_address
287
+
288
+ asyncio.run(get_address(wallet_rpc_port, fingerprint, id, new_address))
289
+
290
+
291
+ @wallet_cmd.command(
292
+ "clawback",
293
+ help="Claim or revert a Clawback transaction."
294
+ " The wallet will automatically detect if you are able to revert or claim.",
295
+ )
296
+ @click.option(
297
+ "-wp",
298
+ "--wallet-rpc-port",
299
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
300
+ type=int,
301
+ default=None,
302
+ )
303
+ # TODO: Remove unused wallet id option
304
+ @click.option("-i", "--id", help="Id of the wallet to use", type=int, default=1, show_default=True, required=True)
305
+ @options.create_fingerprint()
306
+ @click.option(
307
+ "-ids",
308
+ "--tx_ids",
309
+ help="IDs of the Clawback transactions you want to revert or claim. Separate multiple IDs by comma (,).",
310
+ type=str,
311
+ default="",
312
+ required=True,
313
+ )
314
+ @options.create_fee("A fee to add to the offer when it gets taken, in XCH")
315
+ @click.option(
316
+ "--force",
317
+ help="Force to push the spend bundle even it may be a double spend",
318
+ is_flag=True,
319
+ default=False,
320
+ )
321
+ @tx_out_cmd()
322
+ def clawback(
323
+ wallet_rpc_port: Optional[int],
324
+ id: int,
325
+ fingerprint: int,
326
+ tx_ids: str,
327
+ fee: uint64,
328
+ force: bool,
329
+ push: bool,
330
+ condition_valid_times: ConditionValidTimes,
331
+ ) -> List[TransactionRecord]:
332
+ from .wallet_funcs import spend_clawback
333
+
334
+ return asyncio.run(
335
+ spend_clawback(
336
+ wallet_rpc_port=wallet_rpc_port,
337
+ fp=fingerprint,
338
+ fee=fee,
339
+ tx_ids_str=tx_ids,
340
+ force=force,
341
+ push=push,
342
+ condition_valid_times=condition_valid_times,
343
+ )
344
+ )
345
+
346
+
347
+ @wallet_cmd.command("delete_unconfirmed_transactions", help="Deletes all unconfirmed transactions for this wallet ID")
348
+ @click.option(
349
+ "-wp",
350
+ "--wallet-rpc-port",
351
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
352
+ type=int,
353
+ default=None,
354
+ )
355
+ @click.option("-i", "--id", help="Id of the wallet to use", type=int, default=1, show_default=True, required=True)
356
+ @options.create_fingerprint()
357
+ def delete_unconfirmed_transactions_cmd(wallet_rpc_port: Optional[int], id: int, fingerprint: int) -> None:
358
+ from .wallet_funcs import delete_unconfirmed_transactions
359
+
360
+ asyncio.run(delete_unconfirmed_transactions(wallet_rpc_port, fingerprint, id))
361
+
362
+
363
+ @wallet_cmd.command("get_derivation_index", help="Get the last puzzle hash derivation path index")
364
+ @click.option(
365
+ "-wp",
366
+ "--wallet-rpc-port",
367
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
368
+ type=int,
369
+ default=None,
370
+ )
371
+ @options.create_fingerprint()
372
+ def get_derivation_index_cmd(wallet_rpc_port: Optional[int], fingerprint: int) -> None:
373
+ from .wallet_funcs import get_derivation_index
374
+
375
+ asyncio.run(get_derivation_index(wallet_rpc_port, fingerprint))
376
+
377
+
378
+ @wallet_cmd.command("sign_message", help="Sign a message by a derivation address")
379
+ @click.option(
380
+ "-wp",
381
+ "--wallet-rpc-port",
382
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
383
+ type=int,
384
+ default=None,
385
+ )
386
+ @options.create_fingerprint()
387
+ # TODO: Change RPC's to use the puzzle hash instead of address
388
+ @click.option("-a", "--address", help="The address you want to use for signing", type=AddressParamType(), required=True)
389
+ @click.option("-m", "--hex_message", help="The hex message you want sign", type=str, required=True)
390
+ def address_sign_message(
391
+ wallet_rpc_port: Optional[int], fingerprint: int, address: CliAddress, hex_message: str
392
+ ) -> None:
393
+ from .wallet_funcs import sign_message
394
+
395
+ asyncio.run(
396
+ sign_message(
397
+ wallet_rpc_port=wallet_rpc_port,
398
+ fp=fingerprint,
399
+ addr_type=AddressType.XCH,
400
+ message=hex_message,
401
+ address=address,
402
+ )
403
+ )
404
+
405
+
406
+ @wallet_cmd.command(
407
+ "update_derivation_index", help="Generate additional derived puzzle hashes starting at the provided index"
408
+ )
409
+ @click.option(
410
+ "-wp",
411
+ "--wallet-rpc-port",
412
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
413
+ type=int,
414
+ default=None,
415
+ )
416
+ @options.create_fingerprint()
417
+ @click.option(
418
+ "-i", "--index", help="Index to set. Must be greater than the current derivation index", type=int, required=True
419
+ )
420
+ def update_derivation_index_cmd(wallet_rpc_port: Optional[int], fingerprint: int, index: int) -> None:
421
+ from .wallet_funcs import update_derivation_index
422
+
423
+ asyncio.run(update_derivation_index(wallet_rpc_port, fingerprint, index))
424
+
425
+
426
+ @wallet_cmd.command("add_token", help="Add/Rename a CAT to the wallet by its asset ID")
427
+ @click.option(
428
+ "-wp",
429
+ "--wallet-rpc-port",
430
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
431
+ type=int,
432
+ default=None,
433
+ )
434
+ @click.option(
435
+ "-id",
436
+ "--asset-id",
437
+ help="The Asset ID of the coin you wish to add/rename (the treehash of the TAIL program)",
438
+ type=Bytes32ParamType(),
439
+ required=True,
440
+ )
441
+ @click.option(
442
+ "-n",
443
+ "--token-name",
444
+ help="The name you wish to designate to the token",
445
+ )
446
+ @options.create_fingerprint()
447
+ def add_token_cmd(wallet_rpc_port: Optional[int], asset_id: bytes32, token_name: str, fingerprint: int) -> None:
448
+ from .wallet_funcs import add_token
449
+
450
+ asyncio.run(add_token(wallet_rpc_port, fingerprint, asset_id, token_name))
451
+
452
+
453
+ @wallet_cmd.command("make_offer", help="Create an offer of XCH/CATs/NFTs for XCH/CATs/NFTs")
454
+ @click.option(
455
+ "-wp",
456
+ "--wallet-rpc-port",
457
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
458
+ type=int,
459
+ default=None,
460
+ )
461
+ @options.create_fingerprint()
462
+ @click.option(
463
+ "-o",
464
+ "--offer",
465
+ help="A wallet id to offer and the amount to offer (formatted like wallet_id:amount)",
466
+ required=True,
467
+ multiple=True,
468
+ )
469
+ @click.option(
470
+ "-r",
471
+ "--request",
472
+ help="A wallet id of an asset to receive and the amount you wish to receive (formatted like wallet_id:amount)",
473
+ multiple=True,
474
+ )
475
+ @click.option(
476
+ "-p",
477
+ "--filepath",
478
+ help="The path to write the generated offer file to",
479
+ required=True,
480
+ type=click.Path(dir_okay=False, writable=True, path_type=pathlib.Path),
481
+ )
482
+ @options.create_fee("A fee to add to the offer when it gets taken, in XCH")
483
+ @click.option(
484
+ "--reuse",
485
+ help="Reuse existing address for the offer.",
486
+ is_flag=True,
487
+ default=False,
488
+ )
489
+ @click.option("--override", help="Creates offer without checking for unusual values", is_flag=True, default=False)
490
+ @timelock_args(enable=True)
491
+ # This command looks like a good candidate for @tx_out_cmd however, pushing an incomplete tx is nonsensical and
492
+ # we already have a canonical offer file format which the idea of exporting a different transaction conflicts with
493
+ def make_offer_cmd(
494
+ wallet_rpc_port: Optional[int],
495
+ fingerprint: int,
496
+ offer: Sequence[str],
497
+ request: Sequence[str],
498
+ filepath: pathlib.Path,
499
+ fee: uint64,
500
+ reuse: bool,
501
+ override: bool,
502
+ condition_valid_times: ConditionValidTimes,
503
+ ) -> None:
504
+ from .wallet_funcs import make_offer
505
+
506
+ if len(request) == 0 and not override:
507
+ print("Cannot make an offer without requesting something without --override")
508
+ return
509
+
510
+ asyncio.run(
511
+ make_offer(
512
+ wallet_rpc_port=wallet_rpc_port,
513
+ fp=fingerprint,
514
+ fee=fee,
515
+ offers=offer,
516
+ requests=request,
517
+ filepath=filepath,
518
+ reuse_puzhash=True if reuse else None,
519
+ condition_valid_times=condition_valid_times,
520
+ )
521
+ )
522
+
523
+
524
+ @wallet_cmd.command(
525
+ "get_offers", help="Get the status of existing offers. Displays only active/pending offers by default."
526
+ )
527
+ @click.option(
528
+ "-wp",
529
+ "--wallet-rpc-port",
530
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
531
+ type=int,
532
+ default=None,
533
+ )
534
+ @options.create_fingerprint()
535
+ @click.option("-id", "--id", help="The ID of the offer that you wish to examine", type=Bytes32ParamType())
536
+ @click.option("-p", "--filepath", help="The path to rewrite the offer file to (must be used in conjunction with --id)")
537
+ @click.option("-em", "--exclude-my-offers", help="Exclude your own offers from the output", is_flag=True)
538
+ @click.option("-et", "--exclude-taken-offers", help="Exclude offers that you've accepted from the output", is_flag=True)
539
+ @click.option(
540
+ "-ic", "--include-completed", help="Include offers that have been confirmed/cancelled or failed", is_flag=True
541
+ )
542
+ @click.option("-s", "--summaries", help="Show the assets being offered and requested for each offer", is_flag=True)
543
+ @click.option("-r", "--reverse", help="Reverse the order of the output", is_flag=True)
544
+ def get_offers_cmd(
545
+ wallet_rpc_port: Optional[int],
546
+ fingerprint: int,
547
+ id: Optional[bytes32],
548
+ filepath: Optional[str],
549
+ exclude_my_offers: bool,
550
+ exclude_taken_offers: bool,
551
+ include_completed: bool,
552
+ summaries: bool,
553
+ reverse: bool,
554
+ ) -> None:
555
+ from .wallet_funcs import get_offers
556
+
557
+ asyncio.run(
558
+ get_offers(
559
+ wallet_rpc_port=wallet_rpc_port,
560
+ fp=fingerprint,
561
+ offer_id=id,
562
+ filepath=filepath,
563
+ exclude_my_offers=exclude_my_offers,
564
+ exclude_taken_offers=exclude_taken_offers,
565
+ include_completed=include_completed,
566
+ summaries=summaries,
567
+ reverse=reverse,
568
+ )
569
+ )
570
+
571
+
572
+ @wallet_cmd.command("take_offer", help="Examine or take an offer")
573
+ @click.argument("path_or_hex", type=str, nargs=1, required=True)
574
+ @click.option(
575
+ "-wp",
576
+ "--wallet-rpc-port",
577
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
578
+ type=int,
579
+ default=None,
580
+ )
581
+ @options.create_fingerprint()
582
+ @click.option("-e", "--examine-only", help="Print the summary of the offer file but do not take it", is_flag=True)
583
+ @options.create_fee("The fee to use when pushing the completed offer, in XCH")
584
+ # TODO: Reuse is not used
585
+ @click.option(
586
+ "--reuse",
587
+ help="Reuse existing address for the offer.",
588
+ is_flag=True,
589
+ default=False,
590
+ )
591
+ @tx_out_cmd()
592
+ def take_offer_cmd(
593
+ path_or_hex: str,
594
+ wallet_rpc_port: Optional[int],
595
+ fingerprint: int,
596
+ examine_only: bool,
597
+ fee: uint64,
598
+ reuse: bool,
599
+ push: bool,
600
+ condition_valid_times: ConditionValidTimes,
601
+ ) -> List[TransactionRecord]:
602
+ from .wallet_funcs import take_offer
603
+
604
+ return asyncio.run(
605
+ take_offer(
606
+ wallet_rpc_port,
607
+ fingerprint,
608
+ fee,
609
+ path_or_hex,
610
+ examine_only,
611
+ push,
612
+ condition_valid_times=condition_valid_times,
613
+ )
614
+ )
615
+
616
+
617
+ @wallet_cmd.command("cancel_offer", help="Cancel an existing offer")
618
+ @click.option(
619
+ "-wp",
620
+ "--wallet-rpc-port",
621
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
622
+ type=int,
623
+ default=None,
624
+ )
625
+ @options.create_fingerprint()
626
+ @click.option("-id", "--id", help="The offer ID that you wish to cancel", required=True, type=Bytes32ParamType())
627
+ @click.option("--insecure", help="Don't make an on-chain transaction, simply mark the offer as cancelled", is_flag=True)
628
+ @options.create_fee("The fee to use when cancelling the offer securely, in XCH")
629
+ @tx_out_cmd()
630
+ def cancel_offer_cmd(
631
+ wallet_rpc_port: Optional[int],
632
+ fingerprint: int,
633
+ id: bytes32,
634
+ insecure: bool,
635
+ fee: uint64,
636
+ push: bool,
637
+ condition_valid_times: ConditionValidTimes,
638
+ ) -> List[TransactionRecord]:
639
+ from .wallet_funcs import cancel_offer
640
+
641
+ return asyncio.run(
642
+ cancel_offer(
643
+ wallet_rpc_port,
644
+ fingerprint,
645
+ fee,
646
+ id,
647
+ not insecure,
648
+ push,
649
+ condition_valid_times=condition_valid_times,
650
+ )
651
+ )
652
+
653
+
654
+ @wallet_cmd.command("check", short_help="Check wallet DB integrity", help=check_help_text)
655
+ @click.option("-v", "--verbose", help="Print more information", is_flag=True)
656
+ @click.option("--db-path", help="The path to a wallet DB. Default is to scan all active wallet DBs.")
657
+ @click.pass_context
658
+ # TODO: accept multiple dbs on commandline
659
+ # TODO: Convert to Path earlier
660
+ def check_wallet_cmd(ctx: click.Context, db_path: str, verbose: bool) -> None:
661
+ """check, scan, diagnose, fsck Chia Wallet DBs"""
662
+
663
+ from chia.cmds.check_wallet_db import scan
664
+
665
+ asyncio.run(scan(ctx.obj["root_path"], db_path, verbose=verbose))
666
+
667
+
668
+ @wallet_cmd.group("did", help="DID related actions")
669
+ def did_cmd() -> None:
670
+ pass
671
+
672
+
673
+ @did_cmd.command("create", help="Create DID wallet")
674
+ @click.option(
675
+ "-wp",
676
+ "--wallet-rpc-port",
677
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
678
+ type=int,
679
+ default=None,
680
+ )
681
+ @options.create_fingerprint()
682
+ @click.option("-n", "--name", help="Set the DID wallet name", type=str)
683
+ @click.option(
684
+ "-a",
685
+ "--amount",
686
+ help="Set the DID amount in mojos. Value must be an odd number.",
687
+ type=int,
688
+ default=1,
689
+ show_default=True,
690
+ )
691
+ @options.create_fee()
692
+ @tx_out_cmd()
693
+ def did_create_wallet_cmd(
694
+ wallet_rpc_port: Optional[int],
695
+ fingerprint: int,
696
+ name: Optional[str],
697
+ amount: int,
698
+ fee: uint64,
699
+ push: bool,
700
+ condition_valid_times: ConditionValidTimes,
701
+ ) -> List[TransactionRecord]:
702
+ from .wallet_funcs import create_did_wallet
703
+
704
+ return asyncio.run(
705
+ create_did_wallet(
706
+ wallet_rpc_port,
707
+ fingerprint,
708
+ fee,
709
+ name,
710
+ amount,
711
+ push,
712
+ condition_valid_times=condition_valid_times,
713
+ )
714
+ )
715
+
716
+
717
+ @did_cmd.command("sign_message", help="Sign a message by a DID")
718
+ @click.option(
719
+ "-wp",
720
+ "--wallet-rpc-port",
721
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
722
+ type=int,
723
+ default=None,
724
+ )
725
+ @options.create_fingerprint()
726
+ @click.option("-i", "--did_id", help="DID ID you want to use for signing", type=AddressParamType(), required=True)
727
+ @click.option("-m", "--hex_message", help="The hex message you want to sign", type=str, required=True)
728
+ def did_sign_message(wallet_rpc_port: Optional[int], fingerprint: int, did_id: CliAddress, hex_message: str) -> None:
729
+ from .wallet_funcs import sign_message
730
+
731
+ asyncio.run(
732
+ sign_message(
733
+ wallet_rpc_port=wallet_rpc_port,
734
+ fp=fingerprint,
735
+ addr_type=AddressType.DID,
736
+ message=hex_message,
737
+ did_id=did_id,
738
+ )
739
+ )
740
+
741
+
742
+ @did_cmd.command("set_name", help="Set DID wallet name")
743
+ @click.option(
744
+ "-wp",
745
+ "--wallet-rpc-port",
746
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
747
+ type=int,
748
+ default=None,
749
+ )
750
+ @options.create_fingerprint()
751
+ @click.option("-i", "--id", help="Id of the wallet to use", type=int, required=True)
752
+ @click.option("-n", "--name", help="Set the DID wallet name", type=str, required=True)
753
+ def did_wallet_name_cmd(wallet_rpc_port: Optional[int], fingerprint: int, id: int, name: str) -> None:
754
+ from .wallet_funcs import did_set_wallet_name
755
+
756
+ asyncio.run(did_set_wallet_name(wallet_rpc_port, fingerprint, id, name))
757
+
758
+
759
+ @did_cmd.command("get_did", help="Get DID from wallet")
760
+ @click.option(
761
+ "-wp",
762
+ "--wallet-rpc-port",
763
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
764
+ type=int,
765
+ default=None,
766
+ )
767
+ @options.create_fingerprint()
768
+ @click.option("-i", "--id", help="Id of the wallet to use", type=int, required=True)
769
+ def did_get_did_cmd(wallet_rpc_port: Optional[int], fingerprint: int, id: int) -> None:
770
+ from .wallet_funcs import get_did
771
+
772
+ asyncio.run(get_did(wallet_rpc_port, fingerprint, id))
773
+
774
+
775
+ @did_cmd.command("get_details", help="Get more details of any DID")
776
+ @click.option(
777
+ "-wp",
778
+ "--wallet-rpc-port",
779
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
780
+ type=int,
781
+ default=None,
782
+ )
783
+ @options.create_fingerprint()
784
+ @click.option("-id", "--coin_id", help="Id of the DID or any coin ID of the DID", type=str, required=True)
785
+ @click.option("-l", "--latest", help="Return latest DID information", is_flag=True, default=True)
786
+ def did_get_details_cmd(wallet_rpc_port: Optional[int], fingerprint: int, coin_id: str, latest: bool) -> None:
787
+ from .wallet_funcs import get_did_info
788
+
789
+ asyncio.run(get_did_info(wallet_rpc_port, fingerprint, coin_id, latest))
790
+
791
+
792
+ @did_cmd.command("update_metadata", help="Update the metadata of a DID")
793
+ @click.option(
794
+ "-wp",
795
+ "--wallet-rpc-port",
796
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
797
+ type=int,
798
+ default=None,
799
+ )
800
+ @options.create_fingerprint()
801
+ @click.option("-i", "--id", help="Id of the DID wallet to use", type=int, required=True)
802
+ @click.option("-d", "--metadata", help="The new whole metadata in json format", type=str, required=True)
803
+ @click.option(
804
+ "--reuse",
805
+ help="Reuse existing address for the change.",
806
+ is_flag=True,
807
+ default=False,
808
+ )
809
+ @tx_out_cmd()
810
+ def did_update_metadata_cmd(
811
+ wallet_rpc_port: Optional[int],
812
+ fingerprint: int,
813
+ id: int,
814
+ metadata: str,
815
+ reuse: bool,
816
+ push: bool,
817
+ condition_valid_times: ConditionValidTimes,
818
+ ) -> List[TransactionRecord]:
819
+ from .wallet_funcs import update_did_metadata
820
+
821
+ return asyncio.run(
822
+ update_did_metadata(
823
+ wallet_rpc_port,
824
+ fingerprint,
825
+ id,
826
+ metadata,
827
+ reuse,
828
+ push=push,
829
+ condition_valid_times=condition_valid_times,
830
+ )
831
+ )
832
+
833
+
834
+ @did_cmd.command("find_lost", help="Find the did you should own and recovery the DID wallet")
835
+ @click.option(
836
+ "-wp",
837
+ "--wallet-rpc-port",
838
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
839
+ type=int,
840
+ default=None,
841
+ )
842
+ @options.create_fingerprint()
843
+ @click.option("-id", "--coin_id", help="Id of the DID or any coin ID of the DID", type=str, required=True)
844
+ @click.option("-m", "--metadata", help="The new whole metadata in json format", type=str, required=False)
845
+ @click.option(
846
+ "-r",
847
+ "--recovery_list_hash",
848
+ help="Override the recovery list hash of the DID. Only set this if your last DID spend updated the recovery list",
849
+ type=str,
850
+ required=False,
851
+ )
852
+ @click.option(
853
+ "-n",
854
+ "--num_verification",
855
+ help="Override the required verification number of the DID."
856
+ " Only set this if your last DID spend updated the required verification number",
857
+ type=int,
858
+ required=False,
859
+ )
860
+ def did_find_lost_cmd(
861
+ wallet_rpc_port: Optional[int],
862
+ fingerprint: int,
863
+ coin_id: str,
864
+ metadata: Optional[str],
865
+ recovery_list_hash: Optional[str],
866
+ num_verification: Optional[int],
867
+ ) -> None:
868
+ from .wallet_funcs import find_lost_did
869
+
870
+ asyncio.run(
871
+ find_lost_did(
872
+ wallet_rpc_port=wallet_rpc_port,
873
+ fp=fingerprint,
874
+ coin_id=coin_id,
875
+ metadata=metadata,
876
+ recovery_list_hash=recovery_list_hash,
877
+ num_verification=num_verification,
878
+ )
879
+ )
880
+
881
+
882
+ @did_cmd.command("message_spend", help="Generate a DID spend bundle for announcements")
883
+ @click.option(
884
+ "-wp",
885
+ "--wallet-rpc-port",
886
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
887
+ type=int,
888
+ default=None,
889
+ )
890
+ @options.create_fingerprint()
891
+ @click.option("-i", "--id", help="Id of the DID wallet to use", type=int, required=True)
892
+ @click.option(
893
+ "-pa",
894
+ "--puzzle_announcements",
895
+ help="The list of puzzle announcement hex strings, split by comma (,)",
896
+ type=str,
897
+ required=False,
898
+ )
899
+ @click.option(
900
+ "-ca",
901
+ "--coin_announcements",
902
+ help="The list of coin announcement hex strings, split by comma (,)",
903
+ type=str,
904
+ required=False,
905
+ )
906
+ @tx_out_cmd()
907
+ def did_message_spend_cmd(
908
+ wallet_rpc_port: Optional[int],
909
+ fingerprint: int,
910
+ id: int,
911
+ puzzle_announcements: Optional[str],
912
+ coin_announcements: Optional[str],
913
+ push: bool,
914
+ condition_valid_times: ConditionValidTimes,
915
+ ) -> List[TransactionRecord]:
916
+ from .wallet_funcs import did_message_spend
917
+
918
+ puzzle_list: List[str] = []
919
+ coin_list: List[str] = []
920
+ if puzzle_announcements is not None:
921
+ try:
922
+ puzzle_list = puzzle_announcements.split(",")
923
+ # validate puzzle announcements is list of hex strings
924
+ for announcement in puzzle_list:
925
+ bytes.fromhex(announcement)
926
+ except ValueError:
927
+ print("Invalid puzzle announcement format, should be a list of hex strings.")
928
+ return []
929
+ if coin_announcements is not None:
930
+ try:
931
+ coin_list = coin_announcements.split(",")
932
+ # validate that coin announcements is a list of hex strings
933
+ for announcement in coin_list:
934
+ bytes.fromhex(announcement)
935
+ except ValueError:
936
+ print("Invalid coin announcement format, should be a list of hex strings.")
937
+ return []
938
+
939
+ return asyncio.run(
940
+ did_message_spend(
941
+ wallet_rpc_port,
942
+ fingerprint,
943
+ id,
944
+ puzzle_list,
945
+ coin_list,
946
+ push=push,
947
+ condition_valid_times=condition_valid_times,
948
+ )
949
+ )
950
+
951
+
952
+ @did_cmd.command("transfer", help="Transfer a DID")
953
+ @click.option(
954
+ "-wp",
955
+ "--wallet-rpc-port",
956
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
957
+ type=int,
958
+ default=None,
959
+ )
960
+ @options.create_fingerprint()
961
+ @click.option("-i", "--id", help="Id of the DID wallet to use", type=int, required=True)
962
+ # TODO: Change RPC to use puzzlehash instead of address
963
+ @click.option("-ta", "--target-address", help="Target recipient wallet address", type=AddressParamType(), required=True)
964
+ @click.option(
965
+ "-rr", "--reset_recovery", help="If you want to reset the recovery DID settings.", is_flag=True, default=False
966
+ )
967
+ @options.create_fee()
968
+ @click.option(
969
+ "--reuse",
970
+ help="Reuse existing address for the change.",
971
+ is_flag=True,
972
+ default=False,
973
+ )
974
+ @tx_out_cmd()
975
+ def did_transfer_did(
976
+ wallet_rpc_port: Optional[int],
977
+ fingerprint: int,
978
+ id: int,
979
+ target_address: CliAddress,
980
+ reset_recovery: bool,
981
+ fee: uint64,
982
+ reuse: bool,
983
+ push: bool,
984
+ condition_valid_times: ConditionValidTimes,
985
+ ) -> List[TransactionRecord]:
986
+ from .wallet_funcs import transfer_did
987
+
988
+ return asyncio.run(
989
+ transfer_did(
990
+ wallet_rpc_port,
991
+ fingerprint,
992
+ id,
993
+ fee,
994
+ target_address,
995
+ reset_recovery is False,
996
+ True if reuse else None,
997
+ push=push,
998
+ condition_valid_times=condition_valid_times,
999
+ )
1000
+ )
1001
+
1002
+
1003
+ @wallet_cmd.group("nft", help="NFT related actions")
1004
+ def nft_cmd() -> None:
1005
+ pass
1006
+
1007
+
1008
+ @nft_cmd.command("create", help="Create an NFT wallet")
1009
+ @click.option(
1010
+ "-wp",
1011
+ "--wallet-rpc-port",
1012
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1013
+ type=int,
1014
+ default=None,
1015
+ )
1016
+ @options.create_fingerprint()
1017
+ # TODO: Change RPC to use puzzlehash instead of address
1018
+ @click.option("-di", "--did-id", help="DID Id to use", type=AddressParamType())
1019
+ @click.option("-n", "--name", help="Set the NFT wallet name", type=str)
1020
+ def nft_wallet_create_cmd(
1021
+ wallet_rpc_port: Optional[int], fingerprint: int, did_id: Optional[CliAddress], name: Optional[str]
1022
+ ) -> None:
1023
+ from .wallet_funcs import create_nft_wallet
1024
+
1025
+ asyncio.run(create_nft_wallet(wallet_rpc_port, fingerprint, did_id, name))
1026
+
1027
+
1028
+ @nft_cmd.command("sign_message", help="Sign a message by a NFT")
1029
+ @click.option(
1030
+ "-wp",
1031
+ "--wallet-rpc-port",
1032
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1033
+ type=int,
1034
+ default=None,
1035
+ )
1036
+ @options.create_fingerprint()
1037
+ @click.option("-i", "--nft_id", help="NFT ID you want to use for signing", type=AddressParamType(), required=True)
1038
+ @click.option("-m", "--hex_message", help="The hex message you want to sign", type=str, required=True)
1039
+ def nft_sign_message(wallet_rpc_port: Optional[int], fingerprint: int, nft_id: CliAddress, hex_message: str) -> None:
1040
+ from .wallet_funcs import sign_message
1041
+
1042
+ asyncio.run(
1043
+ sign_message(
1044
+ wallet_rpc_port=wallet_rpc_port,
1045
+ fp=fingerprint,
1046
+ addr_type=AddressType.NFT,
1047
+ message=hex_message,
1048
+ nft_id=nft_id,
1049
+ )
1050
+ )
1051
+
1052
+
1053
+ @nft_cmd.command("mint", help="Mint an NFT")
1054
+ @click.option(
1055
+ "-wp",
1056
+ "--wallet-rpc-port",
1057
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1058
+ type=int,
1059
+ default=None,
1060
+ )
1061
+ @options.create_fingerprint()
1062
+ @click.option("-i", "--id", help="Id of the NFT wallet to use", type=int, required=True)
1063
+ @click.option("-ra", "--royalty-address", help="Royalty address", type=AddressParamType())
1064
+ @click.option("-ta", "--target-address", help="Target address", type=AddressParamType())
1065
+ @click.option("--no-did-ownership", help="Disable DID ownership support", is_flag=True, default=False)
1066
+ @click.option("-nh", "--hash", help="NFT content hash", type=str, required=True)
1067
+ @click.option("-u", "--uris", help="Comma separated list of URIs", type=str, required=True)
1068
+ @click.option("-mh", "--metadata-hash", help="NFT metadata hash", type=str, default="")
1069
+ @click.option("-mu", "--metadata-uris", help="Comma separated list of metadata URIs", type=str)
1070
+ @click.option("-lh", "--license-hash", help="NFT license hash", type=str, default="")
1071
+ @click.option("-lu", "--license-uris", help="Comma separated list of license URIs", type=str)
1072
+ @click.option("-et", "--edition-total", help="NFT edition total", type=int, show_default=True, default=1)
1073
+ @click.option("-en", "--edition-number", help="NFT edition number", show_default=True, default=1, type=int)
1074
+ @options.create_fee()
1075
+ @click.option(
1076
+ "-rp",
1077
+ "--royalty-percentage-fraction",
1078
+ help="NFT royalty percentage fraction in basis points. Example: 175 would represent 1.75%",
1079
+ type=int,
1080
+ default=0,
1081
+ show_default=True,
1082
+ )
1083
+ @click.option(
1084
+ "--reuse",
1085
+ help="Reuse existing address for the change.",
1086
+ is_flag=True,
1087
+ default=False,
1088
+ )
1089
+ @tx_out_cmd()
1090
+ def nft_mint_cmd(
1091
+ wallet_rpc_port: Optional[int],
1092
+ fingerprint: int,
1093
+ id: int,
1094
+ royalty_address: Optional[CliAddress],
1095
+ target_address: Optional[CliAddress],
1096
+ no_did_ownership: bool,
1097
+ hash: str,
1098
+ uris: str,
1099
+ metadata_hash: Optional[str],
1100
+ metadata_uris: Optional[str],
1101
+ license_hash: Optional[str],
1102
+ license_uris: Optional[str],
1103
+ edition_total: Optional[int],
1104
+ edition_number: Optional[int],
1105
+ fee: uint64,
1106
+ royalty_percentage_fraction: int,
1107
+ reuse: bool,
1108
+ push: bool,
1109
+ condition_valid_times: ConditionValidTimes,
1110
+ ) -> List[TransactionRecord]:
1111
+ from .wallet_funcs import mint_nft
1112
+
1113
+ if metadata_uris is None:
1114
+ metadata_uris_list = []
1115
+ else:
1116
+ metadata_uris_list = [mu.strip() for mu in metadata_uris.split(",")]
1117
+
1118
+ if license_uris is None:
1119
+ license_uris_list = []
1120
+ else:
1121
+ license_uris_list = [lu.strip() for lu in license_uris.split(",")]
1122
+
1123
+ return asyncio.run(
1124
+ mint_nft(
1125
+ wallet_rpc_port=wallet_rpc_port,
1126
+ fp=fingerprint,
1127
+ wallet_id=id,
1128
+ royalty_cli_address=royalty_address,
1129
+ target_cli_address=target_address,
1130
+ no_did_ownership=no_did_ownership,
1131
+ hash=hash,
1132
+ uris=[u.strip() for u in uris.split(",")],
1133
+ metadata_hash=metadata_hash,
1134
+ metadata_uris=metadata_uris_list,
1135
+ license_hash=license_hash,
1136
+ license_uris=license_uris_list,
1137
+ edition_total=edition_total,
1138
+ edition_number=edition_number,
1139
+ fee=fee,
1140
+ royalty_percentage=royalty_percentage_fraction,
1141
+ reuse_puzhash=True if reuse else None,
1142
+ push=push,
1143
+ condition_valid_times=condition_valid_times,
1144
+ )
1145
+ )
1146
+
1147
+
1148
+ @nft_cmd.command("add_uri", help="Add an URI to an NFT")
1149
+ @click.option(
1150
+ "-wp",
1151
+ "--wallet-rpc-port",
1152
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1153
+ type=int,
1154
+ default=None,
1155
+ )
1156
+ @options.create_fingerprint()
1157
+ @click.option("-i", "--id", help="Id of the NFT wallet to use", type=int, required=True)
1158
+ # TODO: change rpc to take bytes instead of a hex string
1159
+ @click.option("-ni", "--nft-coin-id", help="Id of the NFT coin to add the URI to", type=str, required=True)
1160
+ @click.option("-u", "--uri", help="URI to add to the NFT", type=str)
1161
+ @click.option("-mu", "--metadata-uri", help="Metadata URI to add to the NFT", type=str)
1162
+ @click.option("-lu", "--license-uri", help="License URI to add to the NFT", type=str)
1163
+ @options.create_fee()
1164
+ @click.option(
1165
+ "--reuse",
1166
+ help="Reuse existing address for the change.",
1167
+ is_flag=True,
1168
+ default=False,
1169
+ )
1170
+ @tx_out_cmd()
1171
+ def nft_add_uri_cmd(
1172
+ wallet_rpc_port: Optional[int],
1173
+ fingerprint: int,
1174
+ id: int,
1175
+ nft_coin_id: str,
1176
+ uri: str,
1177
+ metadata_uri: str,
1178
+ license_uri: str,
1179
+ fee: uint64,
1180
+ reuse: bool,
1181
+ push: bool,
1182
+ condition_valid_times: ConditionValidTimes,
1183
+ ) -> List[TransactionRecord]:
1184
+ from .wallet_funcs import add_uri_to_nft
1185
+
1186
+ return asyncio.run(
1187
+ add_uri_to_nft(
1188
+ wallet_rpc_port=wallet_rpc_port,
1189
+ fp=fingerprint,
1190
+ wallet_id=id,
1191
+ fee=fee,
1192
+ nft_coin_id=nft_coin_id,
1193
+ uri=uri,
1194
+ metadata_uri=metadata_uri,
1195
+ license_uri=license_uri,
1196
+ reuse_puzhash=True if reuse else None,
1197
+ push=push,
1198
+ condition_valid_times=condition_valid_times,
1199
+ )
1200
+ )
1201
+
1202
+
1203
+ @nft_cmd.command("transfer", help="Transfer an NFT")
1204
+ @click.option(
1205
+ "-wp",
1206
+ "--wallet-rpc-port",
1207
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1208
+ type=int,
1209
+ default=None,
1210
+ )
1211
+ @options.create_fingerprint()
1212
+ @click.option("-i", "--id", help="Id of the NFT wallet to use", type=int, required=True)
1213
+ @click.option("-ni", "--nft-coin-id", help="Id of the NFT coin to transfer", type=str, required=True)
1214
+ # TODO: Change RPC to use puzzlehash instead of address
1215
+ @click.option("-ta", "--target-address", help="Target recipient wallet address", type=AddressParamType(), required=True)
1216
+ @options.create_fee()
1217
+ @click.option(
1218
+ "--reuse",
1219
+ help="Reuse existing address for the change.",
1220
+ is_flag=True,
1221
+ default=False,
1222
+ )
1223
+ @tx_out_cmd()
1224
+ def nft_transfer_cmd(
1225
+ wallet_rpc_port: Optional[int],
1226
+ fingerprint: int,
1227
+ id: int,
1228
+ nft_coin_id: str,
1229
+ target_address: CliAddress,
1230
+ fee: uint64,
1231
+ reuse: bool,
1232
+ push: bool,
1233
+ condition_valid_times: ConditionValidTimes,
1234
+ ) -> List[TransactionRecord]:
1235
+ from .wallet_funcs import transfer_nft
1236
+
1237
+ return asyncio.run(
1238
+ transfer_nft(
1239
+ wallet_rpc_port=wallet_rpc_port,
1240
+ fp=fingerprint,
1241
+ wallet_id=id,
1242
+ fee=fee,
1243
+ nft_coin_id=nft_coin_id,
1244
+ target_cli_address=target_address,
1245
+ reuse_puzhash=True if reuse else None,
1246
+ push=push,
1247
+ condition_valid_times=condition_valid_times,
1248
+ )
1249
+ )
1250
+
1251
+
1252
+ @nft_cmd.command("list", help="List the current NFTs")
1253
+ @click.option(
1254
+ "-wp",
1255
+ "--wallet-rpc-port",
1256
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1257
+ type=int,
1258
+ default=None,
1259
+ )
1260
+ @options.create_fingerprint()
1261
+ @click.option("-i", "--id", help="Id of the NFT wallet to use", type=int, required=True)
1262
+ @click.option("--num", help="Number of NFTs to return", type=int, default=50)
1263
+ @click.option("--start-index", help="Which starting index to start listing NFTs from", type=int, default=0)
1264
+ def nft_list_cmd(wallet_rpc_port: Optional[int], fingerprint: int, id: int, num: int, start_index: int) -> None:
1265
+ from .wallet_funcs import list_nfts
1266
+
1267
+ asyncio.run(list_nfts(wallet_rpc_port, fingerprint, id, num, start_index))
1268
+
1269
+
1270
+ @nft_cmd.command("set_did", help="Set a DID on an NFT")
1271
+ @click.option(
1272
+ "-wp",
1273
+ "--wallet-rpc-port",
1274
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1275
+ type=int,
1276
+ default=None,
1277
+ )
1278
+ @options.create_fingerprint()
1279
+ @click.option("-i", "--id", help="Id of the NFT wallet to use", type=int, required=True)
1280
+ # TODO: Change RPC to use bytes instead of hex string
1281
+ @click.option("-di", "--did-id", help="DID Id to set on the NFT", type=str, required=True)
1282
+ @click.option("-ni", "--nft-coin-id", help="Id of the NFT coin to set the DID on", type=str, required=True)
1283
+ @options.create_fee()
1284
+ @click.option(
1285
+ "--reuse",
1286
+ help="Reuse existing address for the change.",
1287
+ is_flag=True,
1288
+ default=False,
1289
+ )
1290
+ @tx_out_cmd()
1291
+ def nft_set_did_cmd(
1292
+ wallet_rpc_port: Optional[int],
1293
+ fingerprint: int,
1294
+ id: int,
1295
+ did_id: str,
1296
+ nft_coin_id: str,
1297
+ fee: uint64,
1298
+ reuse: bool,
1299
+ push: bool,
1300
+ condition_valid_times: ConditionValidTimes,
1301
+ ) -> List[TransactionRecord]:
1302
+ from .wallet_funcs import set_nft_did
1303
+
1304
+ return asyncio.run(
1305
+ set_nft_did(
1306
+ wallet_rpc_port=wallet_rpc_port,
1307
+ fp=fingerprint,
1308
+ wallet_id=id,
1309
+ fee=fee,
1310
+ nft_coin_id=nft_coin_id,
1311
+ did_id=did_id,
1312
+ reuse_puzhash=True if reuse else None,
1313
+ push=push,
1314
+ condition_valid_times=condition_valid_times,
1315
+ )
1316
+ )
1317
+
1318
+
1319
+ @nft_cmd.command("get_info", help="Get NFT information")
1320
+ @click.option(
1321
+ "-wp",
1322
+ "--wallet-rpc-port",
1323
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1324
+ type=int,
1325
+ default=None,
1326
+ )
1327
+ @options.create_fingerprint()
1328
+ # TODO: Change RPC to use bytes instead of hex string
1329
+ @click.option("-ni", "--nft-coin-id", help="Id of the NFT coin to get information on", type=str, required=True)
1330
+ def nft_get_info_cmd(
1331
+ wallet_rpc_port: Optional[int],
1332
+ fingerprint: int,
1333
+ nft_coin_id: str,
1334
+ ) -> None:
1335
+ from .wallet_funcs import get_nft_info
1336
+
1337
+ asyncio.run(get_nft_info(wallet_rpc_port, fingerprint, nft_coin_id))
1338
+
1339
+
1340
+ # Keep at bottom.
1341
+ wallet_cmd.add_command(coins_cmd)
1342
+
1343
+
1344
+ @wallet_cmd.group("notifications", help="Send/Manage notifications")
1345
+ def notification_cmd() -> None:
1346
+ pass
1347
+
1348
+
1349
+ @notification_cmd.command("send", help="Send a notification to the owner of an address")
1350
+ @click.option(
1351
+ "-wp",
1352
+ "--wallet-rpc-port",
1353
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1354
+ type=int,
1355
+ default=None,
1356
+ )
1357
+ @options.create_fingerprint()
1358
+ @click.option(
1359
+ "-t", "--to-address", help="The address to send the notification to", type=AddressParamType(), required=True
1360
+ )
1361
+ @click.option(
1362
+ "-a",
1363
+ "--amount",
1364
+ help="The amount (in XCH) to send to get the notification past the recipient's spam filter",
1365
+ type=AmountParamType(),
1366
+ default=CliAmount(mojos=True, amount=uint64(10000000)),
1367
+ required=True,
1368
+ show_default=True,
1369
+ )
1370
+ @click.option("-n", "--message", help="The message of the notification", type=str)
1371
+ @options.create_fee()
1372
+ @tx_out_cmd()
1373
+ def send_notification_cmd(
1374
+ wallet_rpc_port: Optional[int],
1375
+ fingerprint: int,
1376
+ to_address: CliAddress,
1377
+ amount: CliAmount,
1378
+ message: str,
1379
+ fee: uint64,
1380
+ push: bool,
1381
+ condition_valid_times: ConditionValidTimes,
1382
+ ) -> List[TransactionRecord]:
1383
+ from .wallet_funcs import send_notification
1384
+
1385
+ message_bytes: bytes = bytes(message, "utf8")
1386
+ return asyncio.run(
1387
+ send_notification(
1388
+ wallet_rpc_port,
1389
+ fingerprint,
1390
+ fee,
1391
+ to_address,
1392
+ message_bytes,
1393
+ amount,
1394
+ push,
1395
+ condition_valid_times=condition_valid_times,
1396
+ )
1397
+ )
1398
+
1399
+
1400
+ @notification_cmd.command("get", help="Get notification(s) that are in your wallet")
1401
+ @click.option(
1402
+ "-wp",
1403
+ "--wallet-rpc-port",
1404
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1405
+ type=int,
1406
+ default=None,
1407
+ )
1408
+ @options.create_fingerprint()
1409
+ @click.option("-i", "--id", help="The specific notification ID to show", type=Bytes32ParamType(), multiple=True)
1410
+ @click.option("-s", "--start", help="The number of notifications to skip", type=int, default=None)
1411
+ @click.option("-e", "--end", help="The number of notifications to stop at", type=int, default=None)
1412
+ def get_notifications_cmd(
1413
+ wallet_rpc_port: Optional[int],
1414
+ fingerprint: int,
1415
+ id: Sequence[bytes32],
1416
+ start: Optional[int],
1417
+ end: Optional[int],
1418
+ ) -> None:
1419
+ from .wallet_funcs import get_notifications
1420
+
1421
+ asyncio.run(get_notifications(wallet_rpc_port, fingerprint, id, start, end))
1422
+
1423
+
1424
+ @notification_cmd.command("delete", help="Delete notification(s) that are in your wallet")
1425
+ @click.option(
1426
+ "-wp",
1427
+ "--wallet-rpc-port",
1428
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1429
+ type=int,
1430
+ default=None,
1431
+ )
1432
+ @options.create_fingerprint()
1433
+ @click.option("-i", "--id", help="A specific notification ID to delete", type=Bytes32ParamType(), multiple=True)
1434
+ @click.option("--all", help="All notifications can be deleted (they will be recovered during resync)", is_flag=True)
1435
+ def delete_notifications_cmd(
1436
+ wallet_rpc_port: Optional[int],
1437
+ fingerprint: int,
1438
+ id: Sequence[bytes32],
1439
+ all: bool,
1440
+ ) -> None:
1441
+ from .wallet_funcs import delete_notifications
1442
+
1443
+ asyncio.run(delete_notifications(wallet_rpc_port, fingerprint, id, all))
1444
+
1445
+
1446
+ @wallet_cmd.group("vcs", short_help="Verifiable Credential related actions")
1447
+ def vcs_cmd() -> None: # pragma: no cover
1448
+ pass
1449
+
1450
+
1451
+ @vcs_cmd.command("mint", short_help="Mint a VC")
1452
+ @click.option(
1453
+ "-wp",
1454
+ "--wallet-rpc-port",
1455
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1456
+ type=int,
1457
+ default=None,
1458
+ )
1459
+ @options.create_fingerprint()
1460
+ @click.option("-d", "--did", help="The DID of the VC's proof provider", type=AddressParamType(), required=True)
1461
+ @click.option(
1462
+ "-t",
1463
+ "--target-address",
1464
+ help="The address to send the VC to once it's minted",
1465
+ type=AddressParamType(),
1466
+ required=False,
1467
+ )
1468
+ @options.create_fee("Blockchain fee for mint transaction, in XCH")
1469
+ @tx_out_cmd()
1470
+ def mint_vc_cmd(
1471
+ wallet_rpc_port: Optional[int],
1472
+ fingerprint: int,
1473
+ did: CliAddress,
1474
+ target_address: Optional[CliAddress],
1475
+ fee: uint64,
1476
+ push: bool,
1477
+ condition_valid_times: ConditionValidTimes,
1478
+ ) -> List[TransactionRecord]:
1479
+ from .wallet_funcs import mint_vc
1480
+
1481
+ return asyncio.run(
1482
+ mint_vc(
1483
+ wallet_rpc_port,
1484
+ fingerprint,
1485
+ did,
1486
+ fee,
1487
+ target_address,
1488
+ push,
1489
+ condition_valid_times=condition_valid_times,
1490
+ )
1491
+ )
1492
+
1493
+
1494
+ @vcs_cmd.command("get", short_help="Get a list of existing VCs")
1495
+ @click.option(
1496
+ "-wp",
1497
+ "--wallet-rpc-port",
1498
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1499
+ type=int,
1500
+ default=None,
1501
+ )
1502
+ @options.create_fingerprint()
1503
+ @click.option(
1504
+ "-s", "--start", help="The index to start the list at", type=int, required=False, default=0, show_default=True
1505
+ )
1506
+ @click.option(
1507
+ "-c", "--count", help="How many results to return", type=int, required=False, default=50, show_default=True
1508
+ )
1509
+ def get_vcs_cmd(
1510
+ wallet_rpc_port: Optional[int],
1511
+ fingerprint: int,
1512
+ start: int,
1513
+ count: int,
1514
+ ) -> None: # pragma: no cover
1515
+ from .wallet_funcs import get_vcs
1516
+
1517
+ asyncio.run(get_vcs(wallet_rpc_port, fingerprint, start, count))
1518
+
1519
+
1520
+ @vcs_cmd.command("update_proofs", short_help="Update a VC's proofs if you have the provider DID")
1521
+ @click.option(
1522
+ "-wp",
1523
+ "--wallet-rpc-port",
1524
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1525
+ type=int,
1526
+ default=None,
1527
+ )
1528
+ @options.create_fingerprint()
1529
+ @click.option(
1530
+ "-l",
1531
+ "--vc-id",
1532
+ help="The launcher ID of the VC whose proofs should be updated",
1533
+ type=Bytes32ParamType(),
1534
+ required=True,
1535
+ )
1536
+ @click.option(
1537
+ "-t",
1538
+ "--new-puzhash",
1539
+ help="The address to send the VC after the proofs have been updated",
1540
+ type=Bytes32ParamType(),
1541
+ required=False,
1542
+ )
1543
+ @click.option("-p", "--new-proof-hash", help="The new proof hash to update the VC to", type=str, required=True)
1544
+ @options.create_fee("Blockchain fee for update transaction, in XCH")
1545
+ @click.option(
1546
+ "--reuse-puzhash/--generate-new-puzhash",
1547
+ help="Send the VC back to the same puzzle hash it came from (ignored if --new-puzhash is specified)",
1548
+ default=False,
1549
+ show_default=True,
1550
+ )
1551
+ @tx_out_cmd()
1552
+ def spend_vc_cmd(
1553
+ wallet_rpc_port: Optional[int],
1554
+ fingerprint: int,
1555
+ vc_id: bytes32,
1556
+ new_puzhash: Optional[bytes32],
1557
+ new_proof_hash: str,
1558
+ fee: uint64,
1559
+ reuse_puzhash: bool,
1560
+ push: bool,
1561
+ condition_valid_times: ConditionValidTimes,
1562
+ ) -> List[TransactionRecord]:
1563
+ from .wallet_funcs import spend_vc
1564
+
1565
+ return asyncio.run(
1566
+ spend_vc(
1567
+ wallet_rpc_port=wallet_rpc_port,
1568
+ fp=fingerprint,
1569
+ vc_id=vc_id,
1570
+ fee=fee,
1571
+ new_puzhash=new_puzhash,
1572
+ new_proof_hash=new_proof_hash,
1573
+ reuse_puzhash=reuse_puzhash,
1574
+ push=push,
1575
+ condition_valid_times=condition_valid_times,
1576
+ )
1577
+ )
1578
+
1579
+
1580
+ @vcs_cmd.command("add_proof_reveal", short_help="Add a series of proofs that will combine to a single proof hash")
1581
+ @click.option(
1582
+ "-wp",
1583
+ "--wallet-rpc-port",
1584
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1585
+ type=int,
1586
+ default=None,
1587
+ )
1588
+ @options.create_fingerprint()
1589
+ @click.option("-p", "--proof", help="A flag to add as a proof", type=str, multiple=True)
1590
+ @click.option("-r", "--root-only", help="Do not add the proofs to the DB, just output the root", is_flag=True)
1591
+ def add_proof_reveal_cmd(
1592
+ wallet_rpc_port: Optional[int],
1593
+ fingerprint: int,
1594
+ proof: Sequence[str],
1595
+ root_only: bool,
1596
+ ) -> None: # pragma: no cover
1597
+ from .wallet_funcs import add_proof_reveal
1598
+
1599
+ asyncio.run(add_proof_reveal(wallet_rpc_port, fingerprint, proof, root_only))
1600
+
1601
+
1602
+ @vcs_cmd.command("get_proofs_for_root", short_help="Get the stored proof flags for a given proof hash")
1603
+ @click.option(
1604
+ "-wp",
1605
+ "--wallet-rpc-port",
1606
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1607
+ type=int,
1608
+ default=None,
1609
+ )
1610
+ @options.create_fingerprint()
1611
+ @click.option("-r", "--proof-hash", help="The root to search for", type=str, required=True)
1612
+ def get_proofs_for_root_cmd(
1613
+ wallet_rpc_port: Optional[int],
1614
+ fingerprint: int,
1615
+ proof_hash: str,
1616
+ ) -> None: # pragma: no cover
1617
+ from .wallet_funcs import get_proofs_for_root
1618
+
1619
+ asyncio.run(get_proofs_for_root(wallet_rpc_port, fingerprint, proof_hash))
1620
+
1621
+
1622
+ @vcs_cmd.command("revoke", short_help="Revoke any VC if you have the proper DID and the VCs parent coin")
1623
+ @click.option(
1624
+ "-wp",
1625
+ "--wallet-rpc-port",
1626
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1627
+ type=int,
1628
+ default=None,
1629
+ )
1630
+ @options.create_fingerprint()
1631
+ @click.option(
1632
+ "-p",
1633
+ "--parent-coin-id",
1634
+ help="The ID of the parent coin of the VC (optional if VC ID is used)",
1635
+ type=Bytes32ParamType(),
1636
+ required=False,
1637
+ )
1638
+ @click.option(
1639
+ "-l",
1640
+ "--vc-id",
1641
+ help="The launcher ID of the VC to revoke (must be tracked by wallet) (optional if Parent ID is used)",
1642
+ type=Bytes32ParamType(),
1643
+ required=False,
1644
+ )
1645
+ @options.create_fee("Blockchain fee for revocation transaction, in XCH")
1646
+ @click.option(
1647
+ "--reuse-puzhash/--generate-new-puzhash",
1648
+ help="Send the VC back to the same puzzle hash it came from (ignored if --new-puzhash is specified)",
1649
+ default=False,
1650
+ show_default=True,
1651
+ )
1652
+ @tx_out_cmd()
1653
+ def revoke_vc_cmd(
1654
+ wallet_rpc_port: Optional[int],
1655
+ fingerprint: int,
1656
+ parent_coin_id: Optional[bytes32],
1657
+ vc_id: Optional[bytes32],
1658
+ fee: uint64,
1659
+ reuse_puzhash: bool,
1660
+ push: bool,
1661
+ condition_valid_times: ConditionValidTimes,
1662
+ ) -> List[TransactionRecord]:
1663
+ from .wallet_funcs import revoke_vc
1664
+
1665
+ return asyncio.run(
1666
+ revoke_vc(
1667
+ wallet_rpc_port,
1668
+ fingerprint,
1669
+ parent_coin_id,
1670
+ vc_id,
1671
+ fee,
1672
+ reuse_puzhash,
1673
+ push,
1674
+ condition_valid_times=condition_valid_times,
1675
+ )
1676
+ )
1677
+
1678
+
1679
+ @vcs_cmd.command("approve_r_cats", help="Claim any R-CATs that are currently pending VC approval")
1680
+ @click.option(
1681
+ "-wp",
1682
+ "--wallet-rpc-port",
1683
+ help="Set the port where the Wallet is hosting the RPC interface. See the rpc_port under wallet in config.yaml",
1684
+ type=int,
1685
+ default=None,
1686
+ )
1687
+ @options.create_fingerprint()
1688
+ @click.option("-i", "--id", help="Id of the wallet with the pending approval balance", type=int, required=True)
1689
+ @click.option(
1690
+ "-a",
1691
+ "--min-amount-to-claim",
1692
+ help="The minimum amount (in CAT units) to approve to move into the wallet",
1693
+ type=AmountParamType(),
1694
+ required=True,
1695
+ )
1696
+ @options.create_fee("Blockchain fee for approval transaction, in XCH")
1697
+ @click.option(
1698
+ "-ma",
1699
+ "--min-coin-amount",
1700
+ type=AmountParamType(),
1701
+ default=cli_amount_none,
1702
+ help="The minimum coin amount (in CAT units) to select",
1703
+ )
1704
+ @click.option(
1705
+ "-l",
1706
+ "--max-coin-amount",
1707
+ type=AmountParamType(),
1708
+ default=cli_amount_none,
1709
+ help="The maximum coin amount (in CAT units) to select",
1710
+ )
1711
+ @click.option(
1712
+ "--reuse",
1713
+ help="Reuse existing address for the change.",
1714
+ is_flag=True,
1715
+ default=False,
1716
+ )
1717
+ @tx_out_cmd()
1718
+ def approve_r_cats_cmd(
1719
+ wallet_rpc_port: Optional[int],
1720
+ fingerprint: int,
1721
+ id: int,
1722
+ min_amount_to_claim: CliAmount,
1723
+ fee: uint64,
1724
+ min_coin_amount: CliAmount,
1725
+ max_coin_amount: CliAmount,
1726
+ reuse: bool,
1727
+ push: bool,
1728
+ condition_valid_times: ConditionValidTimes,
1729
+ ) -> List[TransactionRecord]:
1730
+ from .wallet_funcs import approve_r_cats
1731
+
1732
+ return asyncio.run(
1733
+ approve_r_cats(
1734
+ wallet_rpc_port,
1735
+ fingerprint,
1736
+ uint32(id),
1737
+ min_amount_to_claim,
1738
+ fee,
1739
+ min_coin_amount,
1740
+ max_coin_amount,
1741
+ reuse,
1742
+ push,
1743
+ condition_valid_times=condition_valid_times,
1744
+ )
1745
+ )