chia-blockchain 2.4.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1028) hide show
  1. chia/__init__.py +10 -0
  2. chia/__main__.py +5 -0
  3. chia/_tests/README.md +53 -0
  4. chia/_tests/__init__.py +0 -0
  5. chia/_tests/blockchain/__init__.py +0 -0
  6. chia/_tests/blockchain/blockchain_test_utils.py +197 -0
  7. chia/_tests/blockchain/config.py +4 -0
  8. chia/_tests/blockchain/test_augmented_chain.py +147 -0
  9. chia/_tests/blockchain/test_blockchain.py +4100 -0
  10. chia/_tests/blockchain/test_blockchain_transactions.py +1050 -0
  11. chia/_tests/blockchain/test_build_chains.py +61 -0
  12. chia/_tests/blockchain/test_get_block_generator.py +72 -0
  13. chia/_tests/blockchain/test_lookup_fork_chain.py +195 -0
  14. chia/_tests/build-init-files.py +93 -0
  15. chia/_tests/build-job-matrix.py +204 -0
  16. chia/_tests/check_pytest_monitor_output.py +34 -0
  17. chia/_tests/check_sql_statements.py +73 -0
  18. chia/_tests/chia-start-sim +42 -0
  19. chia/_tests/clvm/__init__.py +0 -0
  20. chia/_tests/clvm/benchmark_costs.py +23 -0
  21. chia/_tests/clvm/coin_store.py +147 -0
  22. chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
  23. chia/_tests/clvm/test_clvm_step.py +37 -0
  24. chia/_tests/clvm/test_condition_codes.py +13 -0
  25. chia/_tests/clvm/test_curry_and_treehash.py +57 -0
  26. chia/_tests/clvm/test_program.py +150 -0
  27. chia/_tests/clvm/test_puzzle_compression.py +144 -0
  28. chia/_tests/clvm/test_puzzle_drivers.py +45 -0
  29. chia/_tests/clvm/test_puzzles.py +247 -0
  30. chia/_tests/clvm/test_singletons.py +540 -0
  31. chia/_tests/clvm/test_spend_sim.py +181 -0
  32. chia/_tests/cmds/__init__.py +0 -0
  33. chia/_tests/cmds/cmd_test_utils.py +472 -0
  34. chia/_tests/cmds/config.py +3 -0
  35. chia/_tests/cmds/conftest.py +23 -0
  36. chia/_tests/cmds/test_click_types.py +195 -0
  37. chia/_tests/cmds/test_cmd_framework.py +400 -0
  38. chia/_tests/cmds/test_cmds_util.py +97 -0
  39. chia/_tests/cmds/test_daemon.py +92 -0
  40. chia/_tests/cmds/test_farm_cmd.py +67 -0
  41. chia/_tests/cmds/test_show.py +116 -0
  42. chia/_tests/cmds/test_sim.py +207 -0
  43. chia/_tests/cmds/test_timelock_args.py +75 -0
  44. chia/_tests/cmds/test_tx_config_args.py +153 -0
  45. chia/_tests/cmds/testing_classes.py +59 -0
  46. chia/_tests/cmds/wallet/__init__.py +0 -0
  47. chia/_tests/cmds/wallet/test_coins.py +195 -0
  48. chia/_tests/cmds/wallet/test_consts.py +47 -0
  49. chia/_tests/cmds/wallet/test_dao.py +565 -0
  50. chia/_tests/cmds/wallet/test_did.py +403 -0
  51. chia/_tests/cmds/wallet/test_nft.py +470 -0
  52. chia/_tests/cmds/wallet/test_notifications.py +124 -0
  53. chia/_tests/cmds/wallet/test_offer.toffer +1 -0
  54. chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
  55. chia/_tests/cmds/wallet/test_vcs.py +376 -0
  56. chia/_tests/cmds/wallet/test_wallet.py +1126 -0
  57. chia/_tests/cmds/wallet/test_wallet_check.py +111 -0
  58. chia/_tests/conftest.py +1304 -0
  59. chia/_tests/connection_utils.py +124 -0
  60. chia/_tests/core/__init__.py +0 -0
  61. chia/_tests/core/cmds/__init__.py +0 -0
  62. chia/_tests/core/cmds/test_beta.py +382 -0
  63. chia/_tests/core/cmds/test_keys.py +1734 -0
  64. chia/_tests/core/cmds/test_wallet.py +126 -0
  65. chia/_tests/core/config.py +3 -0
  66. chia/_tests/core/consensus/__init__.py +0 -0
  67. chia/_tests/core/consensus/test_block_creation.py +56 -0
  68. chia/_tests/core/consensus/test_pot_iterations.py +117 -0
  69. chia/_tests/core/custom_types/__init__.py +0 -0
  70. chia/_tests/core/custom_types/test_coin.py +109 -0
  71. chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
  72. chia/_tests/core/custom_types/test_spend_bundle.py +71 -0
  73. chia/_tests/core/daemon/__init__.py +0 -0
  74. chia/_tests/core/daemon/config.py +4 -0
  75. chia/_tests/core/daemon/test_daemon.py +2128 -0
  76. chia/_tests/core/daemon/test_daemon_register.py +109 -0
  77. chia/_tests/core/daemon/test_keychain_proxy.py +100 -0
  78. chia/_tests/core/data_layer/__init__.py +0 -0
  79. chia/_tests/core/data_layer/config.py +5 -0
  80. chia/_tests/core/data_layer/conftest.py +105 -0
  81. chia/_tests/core/data_layer/test_data_cli.py +57 -0
  82. chia/_tests/core/data_layer/test_data_layer.py +83 -0
  83. chia/_tests/core/data_layer/test_data_layer_util.py +219 -0
  84. chia/_tests/core/data_layer/test_data_rpc.py +3865 -0
  85. chia/_tests/core/data_layer/test_data_store.py +2423 -0
  86. chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
  87. chia/_tests/core/data_layer/test_plugin.py +91 -0
  88. chia/_tests/core/data_layer/util.py +232 -0
  89. chia/_tests/core/farmer/__init__.py +0 -0
  90. chia/_tests/core/farmer/config.py +3 -0
  91. chia/_tests/core/farmer/test_farmer_api.py +101 -0
  92. chia/_tests/core/full_node/__init__.py +0 -0
  93. chia/_tests/core/full_node/config.py +4 -0
  94. chia/_tests/core/full_node/dos/__init__.py +0 -0
  95. chia/_tests/core/full_node/dos/config.py +3 -0
  96. chia/_tests/core/full_node/full_sync/__init__.py +0 -0
  97. chia/_tests/core/full_node/full_sync/config.py +4 -0
  98. chia/_tests/core/full_node/full_sync/test_full_sync.py +448 -0
  99. chia/_tests/core/full_node/ram_db.py +27 -0
  100. chia/_tests/core/full_node/stores/__init__.py +0 -0
  101. chia/_tests/core/full_node/stores/config.py +4 -0
  102. chia/_tests/core/full_node/stores/test_block_store.py +488 -0
  103. chia/_tests/core/full_node/stores/test_coin_store.py +888 -0
  104. chia/_tests/core/full_node/stores/test_full_node_store.py +1215 -0
  105. chia/_tests/core/full_node/stores/test_hint_store.py +230 -0
  106. chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
  107. chia/_tests/core/full_node/test_address_manager.py +588 -0
  108. chia/_tests/core/full_node/test_block_height_map.py +556 -0
  109. chia/_tests/core/full_node/test_conditions.py +558 -0
  110. chia/_tests/core/full_node/test_full_node.py +2445 -0
  111. chia/_tests/core/full_node/test_generator_tools.py +82 -0
  112. chia/_tests/core/full_node/test_hint_management.py +104 -0
  113. chia/_tests/core/full_node/test_node_load.py +34 -0
  114. chia/_tests/core/full_node/test_performance.py +182 -0
  115. chia/_tests/core/full_node/test_subscriptions.py +492 -0
  116. chia/_tests/core/full_node/test_transactions.py +203 -0
  117. chia/_tests/core/full_node/test_tx_processing_queue.py +154 -0
  118. chia/_tests/core/large_block.py +2388 -0
  119. chia/_tests/core/make_block_generator.py +72 -0
  120. chia/_tests/core/mempool/__init__.py +0 -0
  121. chia/_tests/core/mempool/config.py +4 -0
  122. chia/_tests/core/mempool/test_mempool.py +3180 -0
  123. chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
  124. chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
  125. chia/_tests/core/mempool/test_mempool_item_queries.py +192 -0
  126. chia/_tests/core/mempool/test_mempool_manager.py +2054 -0
  127. chia/_tests/core/mempool/test_mempool_performance.py +65 -0
  128. chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
  129. chia/_tests/core/node_height.py +28 -0
  130. chia/_tests/core/server/__init__.py +0 -0
  131. chia/_tests/core/server/config.py +3 -0
  132. chia/_tests/core/server/flood.py +82 -0
  133. chia/_tests/core/server/serve.py +132 -0
  134. chia/_tests/core/server/test_capabilities.py +68 -0
  135. chia/_tests/core/server/test_dos.py +320 -0
  136. chia/_tests/core/server/test_event_loop.py +109 -0
  137. chia/_tests/core/server/test_loop.py +290 -0
  138. chia/_tests/core/server/test_node_discovery.py +74 -0
  139. chia/_tests/core/server/test_rate_limits.py +370 -0
  140. chia/_tests/core/server/test_server.py +225 -0
  141. chia/_tests/core/server/test_upnp.py +8 -0
  142. chia/_tests/core/services/__init__.py +0 -0
  143. chia/_tests/core/services/config.py +3 -0
  144. chia/_tests/core/services/test_services.py +166 -0
  145. chia/_tests/core/ssl/__init__.py +0 -0
  146. chia/_tests/core/ssl/config.py +3 -0
  147. chia/_tests/core/ssl/test_ssl.py +198 -0
  148. chia/_tests/core/test_coins.py +33 -0
  149. chia/_tests/core/test_cost_calculation.py +314 -0
  150. chia/_tests/core/test_crawler.py +175 -0
  151. chia/_tests/core/test_crawler_rpc.py +53 -0
  152. chia/_tests/core/test_daemon_rpc.py +24 -0
  153. chia/_tests/core/test_db_conversion.py +129 -0
  154. chia/_tests/core/test_db_validation.py +161 -0
  155. chia/_tests/core/test_farmer_harvester_rpc.py +504 -0
  156. chia/_tests/core/test_filter.py +37 -0
  157. chia/_tests/core/test_full_node_rpc.py +794 -0
  158. chia/_tests/core/test_merkle_set.py +343 -0
  159. chia/_tests/core/test_program.py +49 -0
  160. chia/_tests/core/test_rpc_util.py +87 -0
  161. chia/_tests/core/test_seeder.py +308 -0
  162. chia/_tests/core/test_setproctitle.py +13 -0
  163. chia/_tests/core/util/__init__.py +0 -0
  164. chia/_tests/core/util/config.py +4 -0
  165. chia/_tests/core/util/test_block_cache.py +44 -0
  166. chia/_tests/core/util/test_cached_bls.py +57 -0
  167. chia/_tests/core/util/test_config.py +337 -0
  168. chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
  169. chia/_tests/core/util/test_files.py +391 -0
  170. chia/_tests/core/util/test_jsonify.py +146 -0
  171. chia/_tests/core/util/test_keychain.py +514 -0
  172. chia/_tests/core/util/test_keyring_wrapper.py +490 -0
  173. chia/_tests/core/util/test_lockfile.py +380 -0
  174. chia/_tests/core/util/test_log_exceptions.py +187 -0
  175. chia/_tests/core/util/test_lru_cache.py +56 -0
  176. chia/_tests/core/util/test_significant_bits.py +40 -0
  177. chia/_tests/core/util/test_streamable.py +883 -0
  178. chia/_tests/db/__init__.py +0 -0
  179. chia/_tests/db/test_db_wrapper.py +565 -0
  180. chia/_tests/environments/__init__.py +0 -0
  181. chia/_tests/environments/common.py +35 -0
  182. chia/_tests/environments/full_node.py +47 -0
  183. chia/_tests/environments/wallet.py +368 -0
  184. chia/_tests/ether.py +19 -0
  185. chia/_tests/farmer_harvester/__init__.py +0 -0
  186. chia/_tests/farmer_harvester/config.py +3 -0
  187. chia/_tests/farmer_harvester/test_farmer.py +1264 -0
  188. chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
  189. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +130 -0
  190. chia/_tests/farmer_harvester/test_third_party_harvesters.py +501 -0
  191. chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
  192. chia/_tests/fee_estimation/__init__.py +0 -0
  193. chia/_tests/fee_estimation/config.py +3 -0
  194. chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
  195. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
  196. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +145 -0
  197. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
  198. chia/_tests/generator/__init__.py +0 -0
  199. chia/_tests/generator/puzzles/__init__.py +0 -0
  200. chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
  201. chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
  202. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
  203. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
  204. chia/_tests/generator/test_compression.py +218 -0
  205. chia/_tests/generator/test_generator_types.py +44 -0
  206. chia/_tests/generator/test_rom.py +182 -0
  207. chia/_tests/plot_sync/__init__.py +0 -0
  208. chia/_tests/plot_sync/config.py +3 -0
  209. chia/_tests/plot_sync/test_delta.py +102 -0
  210. chia/_tests/plot_sync/test_plot_sync.py +617 -0
  211. chia/_tests/plot_sync/test_receiver.py +451 -0
  212. chia/_tests/plot_sync/test_sender.py +116 -0
  213. chia/_tests/plot_sync/test_sync_simulated.py +450 -0
  214. chia/_tests/plot_sync/util.py +67 -0
  215. chia/_tests/plotting/__init__.py +0 -0
  216. chia/_tests/plotting/config.py +3 -0
  217. chia/_tests/plotting/test_plot_manager.py +738 -0
  218. chia/_tests/plotting/util.py +13 -0
  219. chia/_tests/pools/__init__.py +0 -0
  220. chia/_tests/pools/config.py +5 -0
  221. chia/_tests/pools/test_pool_cmdline.py +23 -0
  222. chia/_tests/pools/test_pool_config.py +44 -0
  223. chia/_tests/pools/test_pool_puzzles_lifecycle.py +398 -0
  224. chia/_tests/pools/test_pool_rpc.py +1010 -0
  225. chia/_tests/pools/test_pool_wallet.py +201 -0
  226. chia/_tests/pools/test_wallet_pool_store.py +161 -0
  227. chia/_tests/process_junit.py +349 -0
  228. chia/_tests/rpc/__init__.py +0 -0
  229. chia/_tests/rpc/test_rpc_client.py +81 -0
  230. chia/_tests/simulation/__init__.py +0 -0
  231. chia/_tests/simulation/config.py +6 -0
  232. chia/_tests/simulation/test_simulation.py +501 -0
  233. chia/_tests/simulation/test_simulator.py +234 -0
  234. chia/_tests/simulation/test_start_simulator.py +106 -0
  235. chia/_tests/testconfig.py +13 -0
  236. chia/_tests/timelord/__init__.py +0 -0
  237. chia/_tests/timelord/config.py +3 -0
  238. chia/_tests/timelord/test_new_peak.py +437 -0
  239. chia/_tests/timelord/test_timelord.py +11 -0
  240. chia/_tests/tools/1315537.json +170 -0
  241. chia/_tests/tools/1315544.json +160 -0
  242. chia/_tests/tools/1315630.json +150 -0
  243. chia/_tests/tools/300000.json +105 -0
  244. chia/_tests/tools/442734.json +140 -0
  245. chia/_tests/tools/466212.json +130 -0
  246. chia/_tests/tools/__init__.py +0 -0
  247. chia/_tests/tools/config.py +5 -0
  248. chia/_tests/tools/test-blockchain-db.sqlite +0 -0
  249. chia/_tests/tools/test_full_sync.py +30 -0
  250. chia/_tests/tools/test_legacy_keyring.py +82 -0
  251. chia/_tests/tools/test_run_block.py +129 -0
  252. chia/_tests/util/__init__.py +0 -0
  253. chia/_tests/util/benchmark_cost.py +170 -0
  254. chia/_tests/util/benchmarks.py +154 -0
  255. chia/_tests/util/bip39_test_vectors.json +148 -0
  256. chia/_tests/util/blockchain.py +133 -0
  257. chia/_tests/util/blockchain_mock.py +132 -0
  258. chia/_tests/util/build_network_protocol_files.py +302 -0
  259. chia/_tests/util/clvm_generator.bin +0 -0
  260. chia/_tests/util/config.py +3 -0
  261. chia/_tests/util/constants.py +20 -0
  262. chia/_tests/util/db_connection.py +36 -0
  263. chia/_tests/util/full_sync.py +245 -0
  264. chia/_tests/util/gen_ssl_certs.py +115 -0
  265. chia/_tests/util/generator_tools_testing.py +47 -0
  266. chia/_tests/util/key_tool.py +37 -0
  267. chia/_tests/util/misc.py +722 -0
  268. chia/_tests/util/network_protocol_data.py +1074 -0
  269. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  270. chia/_tests/util/protocol_messages_json.py +2700 -0
  271. chia/_tests/util/rpc.py +23 -0
  272. chia/_tests/util/run_block.py +163 -0
  273. chia/_tests/util/setup_nodes.py +479 -0
  274. chia/_tests/util/split_managers.py +99 -0
  275. chia/_tests/util/temp_file.py +14 -0
  276. chia/_tests/util/test_action_scope.py +143 -0
  277. chia/_tests/util/test_async_pool.py +366 -0
  278. chia/_tests/util/test_build_job_matrix.py +43 -0
  279. chia/_tests/util/test_build_network_protocol_files.py +7 -0
  280. chia/_tests/util/test_chia_version.py +50 -0
  281. chia/_tests/util/test_collection.py +11 -0
  282. chia/_tests/util/test_condition_tools.py +231 -0
  283. chia/_tests/util/test_config.py +426 -0
  284. chia/_tests/util/test_dump_keyring.py +60 -0
  285. chia/_tests/util/test_errors.py +10 -0
  286. chia/_tests/util/test_full_block_utils.py +271 -0
  287. chia/_tests/util/test_installed.py +20 -0
  288. chia/_tests/util/test_limited_semaphore.py +52 -0
  289. chia/_tests/util/test_logging_filter.py +43 -0
  290. chia/_tests/util/test_misc.py +444 -0
  291. chia/_tests/util/test_network.py +74 -0
  292. chia/_tests/util/test_network_protocol_files.py +579 -0
  293. chia/_tests/util/test_network_protocol_json.py +266 -0
  294. chia/_tests/util/test_network_protocol_test.py +257 -0
  295. chia/_tests/util/test_paginator.py +72 -0
  296. chia/_tests/util/test_pprint.py +17 -0
  297. chia/_tests/util/test_priority_mutex.py +487 -0
  298. chia/_tests/util/test_recursive_replace.py +116 -0
  299. chia/_tests/util/test_replace_str_to_bytes.py +137 -0
  300. chia/_tests/util/test_service_groups.py +15 -0
  301. chia/_tests/util/test_ssl_check.py +31 -0
  302. chia/_tests/util/test_testnet_overrides.py +19 -0
  303. chia/_tests/util/test_tests_misc.py +38 -0
  304. chia/_tests/util/test_timing.py +37 -0
  305. chia/_tests/util/test_trusted_peer.py +51 -0
  306. chia/_tests/util/time_out_assert.py +154 -0
  307. chia/_tests/wallet/__init__.py +0 -0
  308. chia/_tests/wallet/cat_wallet/__init__.py +0 -0
  309. chia/_tests/wallet/cat_wallet/config.py +4 -0
  310. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
  311. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
  312. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1738 -0
  313. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
  314. chia/_tests/wallet/cat_wallet/test_trades.py +2578 -0
  315. chia/_tests/wallet/clawback/__init__.py +0 -0
  316. chia/_tests/wallet/clawback/config.py +3 -0
  317. chia/_tests/wallet/clawback/test_clawback_decorator.py +80 -0
  318. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
  319. chia/_tests/wallet/clawback/test_clawback_metadata.py +51 -0
  320. chia/_tests/wallet/config.py +4 -0
  321. chia/_tests/wallet/conftest.py +217 -0
  322. chia/_tests/wallet/dao_wallet/__init__.py +0 -0
  323. chia/_tests/wallet/dao_wallet/config.py +3 -0
  324. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1322 -0
  325. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
  326. chia/_tests/wallet/db_wallet/__init__.py +0 -0
  327. chia/_tests/wallet/db_wallet/config.py +3 -0
  328. chia/_tests/wallet/db_wallet/test_db_graftroot.py +143 -0
  329. chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
  330. chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
  331. chia/_tests/wallet/did_wallet/__init__.py +0 -0
  332. chia/_tests/wallet/did_wallet/config.py +4 -0
  333. chia/_tests/wallet/did_wallet/test_did.py +1481 -0
  334. chia/_tests/wallet/nft_wallet/__init__.py +0 -0
  335. chia/_tests/wallet/nft_wallet/config.py +4 -0
  336. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1492 -0
  337. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1014 -0
  338. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +376 -0
  339. chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
  340. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
  341. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2558 -0
  342. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
  343. chia/_tests/wallet/rpc/__init__.py +0 -0
  344. chia/_tests/wallet/rpc/config.py +4 -0
  345. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +287 -0
  346. chia/_tests/wallet/rpc/test_wallet_rpc.py +3106 -0
  347. chia/_tests/wallet/simple_sync/__init__.py +0 -0
  348. chia/_tests/wallet/simple_sync/config.py +3 -0
  349. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +719 -0
  350. chia/_tests/wallet/sync/__init__.py +0 -0
  351. chia/_tests/wallet/sync/config.py +4 -0
  352. chia/_tests/wallet/sync/test_wallet_sync.py +1529 -0
  353. chia/_tests/wallet/test_address_type.py +189 -0
  354. chia/_tests/wallet/test_bech32m.py +45 -0
  355. chia/_tests/wallet/test_clvm_streamable.py +244 -0
  356. chia/_tests/wallet/test_coin_selection.py +589 -0
  357. chia/_tests/wallet/test_conditions.py +388 -0
  358. chia/_tests/wallet/test_debug_spend_bundle.py +76 -0
  359. chia/_tests/wallet/test_new_wallet_protocol.py +1176 -0
  360. chia/_tests/wallet/test_nft_store.py +193 -0
  361. chia/_tests/wallet/test_notifications.py +196 -0
  362. chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
  363. chia/_tests/wallet/test_puzzle_store.py +133 -0
  364. chia/_tests/wallet/test_sign_coin_spends.py +159 -0
  365. chia/_tests/wallet/test_signer_protocol.py +948 -0
  366. chia/_tests/wallet/test_singleton.py +122 -0
  367. chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
  368. chia/_tests/wallet/test_singleton_store.py +152 -0
  369. chia/_tests/wallet/test_taproot.py +19 -0
  370. chia/_tests/wallet/test_transaction_store.py +941 -0
  371. chia/_tests/wallet/test_util.py +181 -0
  372. chia/_tests/wallet/test_wallet.py +2139 -0
  373. chia/_tests/wallet/test_wallet_action_scope.py +85 -0
  374. chia/_tests/wallet/test_wallet_blockchain.py +113 -0
  375. chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
  376. chia/_tests/wallet/test_wallet_interested_store.py +43 -0
  377. chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
  378. chia/_tests/wallet/test_wallet_node.py +783 -0
  379. chia/_tests/wallet/test_wallet_retry.py +95 -0
  380. chia/_tests/wallet/test_wallet_state_manager.py +252 -0
  381. chia/_tests/wallet/test_wallet_test_framework.py +275 -0
  382. chia/_tests/wallet/test_wallet_trade_store.py +218 -0
  383. chia/_tests/wallet/test_wallet_user_store.py +34 -0
  384. chia/_tests/wallet/test_wallet_utils.py +155 -0
  385. chia/_tests/wallet/vc_wallet/__init__.py +0 -0
  386. chia/_tests/wallet/vc_wallet/config.py +3 -0
  387. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
  388. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
  389. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +801 -0
  390. chia/_tests/wallet/wallet_block_tools.py +327 -0
  391. chia/_tests/weight_proof/__init__.py +0 -0
  392. chia/_tests/weight_proof/config.py +3 -0
  393. chia/_tests/weight_proof/test_weight_proof.py +528 -0
  394. chia/clvm/__init__.py +0 -0
  395. chia/clvm/spend_sim.py +488 -0
  396. chia/cmds/__init__.py +0 -0
  397. chia/cmds/beta.py +183 -0
  398. chia/cmds/beta_funcs.py +133 -0
  399. chia/cmds/check_wallet_db.py +418 -0
  400. chia/cmds/chia.py +143 -0
  401. chia/cmds/cmd_classes.py +315 -0
  402. chia/cmds/cmds_util.py +498 -0
  403. chia/cmds/coin_funcs.py +260 -0
  404. chia/cmds/coins.py +220 -0
  405. chia/cmds/completion.py +49 -0
  406. chia/cmds/configure.py +331 -0
  407. chia/cmds/dao.py +1008 -0
  408. chia/cmds/dao_funcs.py +576 -0
  409. chia/cmds/data.py +707 -0
  410. chia/cmds/data_funcs.py +380 -0
  411. chia/cmds/db.py +86 -0
  412. chia/cmds/db_backup_func.py +77 -0
  413. chia/cmds/db_upgrade_func.py +452 -0
  414. chia/cmds/db_validate_func.py +184 -0
  415. chia/cmds/dev.py +16 -0
  416. chia/cmds/farm.py +87 -0
  417. chia/cmds/farm_funcs.py +207 -0
  418. chia/cmds/init.py +70 -0
  419. chia/cmds/init_funcs.py +367 -0
  420. chia/cmds/installers.py +129 -0
  421. chia/cmds/keys.py +510 -0
  422. chia/cmds/keys_funcs.py +864 -0
  423. chia/cmds/netspace.py +47 -0
  424. chia/cmds/netspace_funcs.py +53 -0
  425. chia/cmds/options.py +32 -0
  426. chia/cmds/param_types.py +228 -0
  427. chia/cmds/passphrase.py +130 -0
  428. chia/cmds/passphrase_funcs.py +346 -0
  429. chia/cmds/peer.py +50 -0
  430. chia/cmds/peer_funcs.py +129 -0
  431. chia/cmds/plotnft.py +206 -0
  432. chia/cmds/plotnft_funcs.py +374 -0
  433. chia/cmds/plots.py +222 -0
  434. chia/cmds/plotters.py +17 -0
  435. chia/cmds/rpc.py +188 -0
  436. chia/cmds/show.py +71 -0
  437. chia/cmds/show_funcs.py +214 -0
  438. chia/cmds/signer.py +304 -0
  439. chia/cmds/sim.py +217 -0
  440. chia/cmds/sim_funcs.py +509 -0
  441. chia/cmds/start.py +24 -0
  442. chia/cmds/start_funcs.py +112 -0
  443. chia/cmds/stop.py +61 -0
  444. chia/cmds/units.py +11 -0
  445. chia/cmds/wallet.py +1745 -0
  446. chia/cmds/wallet_funcs.py +1800 -0
  447. chia/consensus/__init__.py +0 -0
  448. chia/consensus/block_body_validation.py +515 -0
  449. chia/consensus/block_creation.py +525 -0
  450. chia/consensus/block_header_validation.py +1064 -0
  451. chia/consensus/block_record.py +32 -0
  452. chia/consensus/block_rewards.py +53 -0
  453. chia/consensus/block_root_validation.py +46 -0
  454. chia/consensus/blockchain.py +1100 -0
  455. chia/consensus/blockchain_interface.py +56 -0
  456. chia/consensus/coinbase.py +30 -0
  457. chia/consensus/condition_costs.py +9 -0
  458. chia/consensus/constants.py +49 -0
  459. chia/consensus/cost_calculator.py +15 -0
  460. chia/consensus/default_constants.py +90 -0
  461. chia/consensus/deficit.py +55 -0
  462. chia/consensus/difficulty_adjustment.py +412 -0
  463. chia/consensus/find_fork_point.py +111 -0
  464. chia/consensus/full_block_to_block_record.py +167 -0
  465. chia/consensus/get_block_challenge.py +106 -0
  466. chia/consensus/get_block_generator.py +26 -0
  467. chia/consensus/make_sub_epoch_summary.py +210 -0
  468. chia/consensus/multiprocess_validation.py +365 -0
  469. chia/consensus/pos_quality.py +19 -0
  470. chia/consensus/pot_iterations.py +67 -0
  471. chia/consensus/puzzles/__init__.py +0 -0
  472. chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
  473. chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
  474. chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
  475. chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
  476. chia/consensus/vdf_info_computation.py +156 -0
  477. chia/daemon/__init__.py +0 -0
  478. chia/daemon/client.py +233 -0
  479. chia/daemon/keychain_proxy.py +501 -0
  480. chia/daemon/keychain_server.py +365 -0
  481. chia/daemon/server.py +1616 -0
  482. chia/daemon/windows_signal.py +56 -0
  483. chia/data_layer/__init__.py +0 -0
  484. chia/data_layer/data_layer.py +1303 -0
  485. chia/data_layer/data_layer_api.py +25 -0
  486. chia/data_layer/data_layer_errors.py +50 -0
  487. chia/data_layer/data_layer_server.py +170 -0
  488. chia/data_layer/data_layer_util.py +985 -0
  489. chia/data_layer/data_layer_wallet.py +1315 -0
  490. chia/data_layer/data_store.py +2267 -0
  491. chia/data_layer/dl_wallet_store.py +407 -0
  492. chia/data_layer/download_data.py +389 -0
  493. chia/data_layer/puzzles/__init__.py +0 -0
  494. chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
  495. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
  496. chia/data_layer/s3_plugin_config.yml +33 -0
  497. chia/data_layer/s3_plugin_service.py +468 -0
  498. chia/data_layer/util/__init__.py +0 -0
  499. chia/data_layer/util/benchmark.py +108 -0
  500. chia/data_layer/util/plugin.py +41 -0
  501. chia/farmer/__init__.py +0 -0
  502. chia/farmer/farmer.py +920 -0
  503. chia/farmer/farmer_api.py +814 -0
  504. chia/full_node/__init__.py +0 -0
  505. chia/full_node/bitcoin_fee_estimator.py +85 -0
  506. chia/full_node/block_height_map.py +271 -0
  507. chia/full_node/block_store.py +570 -0
  508. chia/full_node/bundle_tools.py +19 -0
  509. chia/full_node/coin_store.py +646 -0
  510. chia/full_node/fee_estimate.py +54 -0
  511. chia/full_node/fee_estimate_store.py +24 -0
  512. chia/full_node/fee_estimation.py +93 -0
  513. chia/full_node/fee_estimator.py +90 -0
  514. chia/full_node/fee_estimator_constants.py +38 -0
  515. chia/full_node/fee_estimator_interface.py +42 -0
  516. chia/full_node/fee_history.py +26 -0
  517. chia/full_node/fee_tracker.py +564 -0
  518. chia/full_node/full_node.py +3052 -0
  519. chia/full_node/full_node_api.py +1974 -0
  520. chia/full_node/full_node_store.py +1033 -0
  521. chia/full_node/hint_management.py +56 -0
  522. chia/full_node/hint_store.py +94 -0
  523. chia/full_node/mempool.py +583 -0
  524. chia/full_node/mempool_check_conditions.py +177 -0
  525. chia/full_node/mempool_manager.py +858 -0
  526. chia/full_node/pending_tx_cache.py +112 -0
  527. chia/full_node/puzzles/__init__.py +0 -0
  528. chia/full_node/puzzles/block_program_zero.clsp +14 -0
  529. chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
  530. chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
  531. chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
  532. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
  533. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
  534. chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
  535. chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
  536. chia/full_node/signage_point.py +16 -0
  537. chia/full_node/subscriptions.py +248 -0
  538. chia/full_node/sync_store.py +145 -0
  539. chia/full_node/tx_processing_queue.py +78 -0
  540. chia/full_node/weight_proof.py +1719 -0
  541. chia/harvester/__init__.py +0 -0
  542. chia/harvester/harvester.py +271 -0
  543. chia/harvester/harvester_api.py +374 -0
  544. chia/introducer/__init__.py +0 -0
  545. chia/introducer/introducer.py +120 -0
  546. chia/introducer/introducer_api.py +64 -0
  547. chia/legacy/__init__.py +0 -0
  548. chia/legacy/keyring.py +154 -0
  549. chia/plot_sync/__init__.py +0 -0
  550. chia/plot_sync/delta.py +61 -0
  551. chia/plot_sync/exceptions.py +56 -0
  552. chia/plot_sync/receiver.py +385 -0
  553. chia/plot_sync/sender.py +337 -0
  554. chia/plot_sync/util.py +43 -0
  555. chia/plotters/__init__.py +0 -0
  556. chia/plotters/bladebit.py +388 -0
  557. chia/plotters/chiapos.py +63 -0
  558. chia/plotters/madmax.py +224 -0
  559. chia/plotters/plotters.py +577 -0
  560. chia/plotters/plotters_util.py +131 -0
  561. chia/plotting/__init__.py +0 -0
  562. chia/plotting/cache.py +212 -0
  563. chia/plotting/check_plots.py +283 -0
  564. chia/plotting/create_plots.py +278 -0
  565. chia/plotting/manager.py +436 -0
  566. chia/plotting/util.py +324 -0
  567. chia/pools/__init__.py +0 -0
  568. chia/pools/pool_config.py +110 -0
  569. chia/pools/pool_puzzles.py +459 -0
  570. chia/pools/pool_wallet.py +926 -0
  571. chia/pools/pool_wallet_info.py +118 -0
  572. chia/pools/puzzles/__init__.py +0 -0
  573. chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
  574. chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
  575. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
  576. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
  577. chia/protocols/__init__.py +0 -0
  578. chia/protocols/farmer_protocol.py +102 -0
  579. chia/protocols/full_node_protocol.py +219 -0
  580. chia/protocols/harvester_protocol.py +216 -0
  581. chia/protocols/introducer_protocol.py +26 -0
  582. chia/protocols/pool_protocol.py +177 -0
  583. chia/protocols/protocol_message_types.py +139 -0
  584. chia/protocols/protocol_state_machine.py +87 -0
  585. chia/protocols/protocol_timing.py +7 -0
  586. chia/protocols/shared_protocol.py +86 -0
  587. chia/protocols/timelord_protocol.py +93 -0
  588. chia/protocols/wallet_protocol.py +401 -0
  589. chia/py.typed +0 -0
  590. chia/rpc/__init__.py +0 -0
  591. chia/rpc/crawler_rpc_api.py +75 -0
  592. chia/rpc/data_layer_rpc_api.py +639 -0
  593. chia/rpc/data_layer_rpc_client.py +188 -0
  594. chia/rpc/data_layer_rpc_util.py +62 -0
  595. chia/rpc/farmer_rpc_api.py +360 -0
  596. chia/rpc/farmer_rpc_client.py +86 -0
  597. chia/rpc/full_node_rpc_api.py +954 -0
  598. chia/rpc/full_node_rpc_client.py +292 -0
  599. chia/rpc/harvester_rpc_api.py +136 -0
  600. chia/rpc/harvester_rpc_client.py +54 -0
  601. chia/rpc/rpc_client.py +144 -0
  602. chia/rpc/rpc_server.py +447 -0
  603. chia/rpc/timelord_rpc_api.py +27 -0
  604. chia/rpc/util.py +293 -0
  605. chia/rpc/wallet_request_types.py +688 -0
  606. chia/rpc/wallet_rpc_api.py +4779 -0
  607. chia/rpc/wallet_rpc_client.py +1844 -0
  608. chia/seeder/__init__.py +0 -0
  609. chia/seeder/crawl_store.py +427 -0
  610. chia/seeder/crawler.py +423 -0
  611. chia/seeder/crawler_api.py +129 -0
  612. chia/seeder/dns_server.py +544 -0
  613. chia/seeder/peer_record.py +146 -0
  614. chia/seeder/start_crawler.py +88 -0
  615. chia/server/__init__.py +0 -0
  616. chia/server/address_manager.py +658 -0
  617. chia/server/address_manager_store.py +237 -0
  618. chia/server/api_protocol.py +11 -0
  619. chia/server/capabilities.py +24 -0
  620. chia/server/chia_policy.py +345 -0
  621. chia/server/introducer_peers.py +76 -0
  622. chia/server/node_discovery.py +718 -0
  623. chia/server/outbound_message.py +33 -0
  624. chia/server/rate_limit_numbers.py +204 -0
  625. chia/server/rate_limits.py +113 -0
  626. chia/server/server.py +720 -0
  627. chia/server/signal_handlers.py +117 -0
  628. chia/server/ssl_context.py +32 -0
  629. chia/server/start_data_layer.py +137 -0
  630. chia/server/start_farmer.py +86 -0
  631. chia/server/start_full_node.py +106 -0
  632. chia/server/start_harvester.py +80 -0
  633. chia/server/start_introducer.py +69 -0
  634. chia/server/start_service.py +328 -0
  635. chia/server/start_timelord.py +82 -0
  636. chia/server/start_wallet.py +109 -0
  637. chia/server/upnp.py +117 -0
  638. chia/server/ws_connection.py +752 -0
  639. chia/simulator/__init__.py +0 -0
  640. chia/simulator/block_tools.py +2053 -0
  641. chia/simulator/full_node_simulator.py +802 -0
  642. chia/simulator/keyring.py +128 -0
  643. chia/simulator/setup_services.py +505 -0
  644. chia/simulator/simulator_constants.py +13 -0
  645. chia/simulator/simulator_full_node_rpc_api.py +101 -0
  646. chia/simulator/simulator_full_node_rpc_client.py +62 -0
  647. chia/simulator/simulator_protocol.py +29 -0
  648. chia/simulator/simulator_test_tools.py +163 -0
  649. chia/simulator/socket.py +27 -0
  650. chia/simulator/ssl_certs.py +114 -0
  651. chia/simulator/ssl_certs_1.py +699 -0
  652. chia/simulator/ssl_certs_10.py +699 -0
  653. chia/simulator/ssl_certs_2.py +699 -0
  654. chia/simulator/ssl_certs_3.py +699 -0
  655. chia/simulator/ssl_certs_4.py +699 -0
  656. chia/simulator/ssl_certs_5.py +699 -0
  657. chia/simulator/ssl_certs_6.py +699 -0
  658. chia/simulator/ssl_certs_7.py +699 -0
  659. chia/simulator/ssl_certs_8.py +699 -0
  660. chia/simulator/ssl_certs_9.py +699 -0
  661. chia/simulator/start_simulator.py +135 -0
  662. chia/simulator/wallet_tools.py +245 -0
  663. chia/ssl/__init__.py +0 -0
  664. chia/ssl/chia_ca.crt +19 -0
  665. chia/ssl/chia_ca.key +28 -0
  666. chia/ssl/create_ssl.py +249 -0
  667. chia/ssl/dst_root_ca.pem +20 -0
  668. chia/timelord/__init__.py +0 -0
  669. chia/timelord/iters_from_block.py +50 -0
  670. chia/timelord/timelord.py +1202 -0
  671. chia/timelord/timelord_api.py +132 -0
  672. chia/timelord/timelord_launcher.py +188 -0
  673. chia/timelord/timelord_state.py +244 -0
  674. chia/timelord/types.py +22 -0
  675. chia/types/__init__.py +0 -0
  676. chia/types/aliases.py +35 -0
  677. chia/types/block_protocol.py +20 -0
  678. chia/types/blockchain_format/__init__.py +0 -0
  679. chia/types/blockchain_format/classgroup.py +5 -0
  680. chia/types/blockchain_format/coin.py +28 -0
  681. chia/types/blockchain_format/foliage.py +8 -0
  682. chia/types/blockchain_format/pool_target.py +5 -0
  683. chia/types/blockchain_format/program.py +270 -0
  684. chia/types/blockchain_format/proof_of_space.py +135 -0
  685. chia/types/blockchain_format/reward_chain_block.py +6 -0
  686. chia/types/blockchain_format/serialized_program.py +5 -0
  687. chia/types/blockchain_format/sized_bytes.py +11 -0
  688. chia/types/blockchain_format/slots.py +9 -0
  689. chia/types/blockchain_format/sub_epoch_summary.py +5 -0
  690. chia/types/blockchain_format/tree_hash.py +72 -0
  691. chia/types/blockchain_format/vdf.py +86 -0
  692. chia/types/clvm_cost.py +13 -0
  693. chia/types/coin_record.py +43 -0
  694. chia/types/coin_spend.py +115 -0
  695. chia/types/condition_opcodes.py +73 -0
  696. chia/types/condition_with_args.py +17 -0
  697. chia/types/eligible_coin_spends.py +364 -0
  698. chia/types/end_of_slot_bundle.py +5 -0
  699. chia/types/fee_rate.py +38 -0
  700. chia/types/full_block.py +5 -0
  701. chia/types/generator_types.py +14 -0
  702. chia/types/header_block.py +5 -0
  703. chia/types/internal_mempool_item.py +19 -0
  704. chia/types/mempool_inclusion_status.py +9 -0
  705. chia/types/mempool_item.py +85 -0
  706. chia/types/mempool_submission_status.py +30 -0
  707. chia/types/mojos.py +7 -0
  708. chia/types/peer_info.py +64 -0
  709. chia/types/signing_mode.py +29 -0
  710. chia/types/spend_bundle.py +31 -0
  711. chia/types/spend_bundle_conditions.py +7 -0
  712. chia/types/transaction_queue_entry.py +55 -0
  713. chia/types/unfinished_block.py +5 -0
  714. chia/types/unfinished_header_block.py +37 -0
  715. chia/types/weight_proof.py +50 -0
  716. chia/util/__init__.py +0 -0
  717. chia/util/action_scope.py +168 -0
  718. chia/util/api_decorators.py +89 -0
  719. chia/util/async_pool.py +224 -0
  720. chia/util/augmented_chain.py +130 -0
  721. chia/util/batches.py +39 -0
  722. chia/util/bech32m.py +123 -0
  723. chia/util/beta_metrics.py +118 -0
  724. chia/util/block_cache.py +56 -0
  725. chia/util/byte_types.py +10 -0
  726. chia/util/check_fork_next_block.py +32 -0
  727. chia/util/chia_logging.py +124 -0
  728. chia/util/chia_version.py +33 -0
  729. chia/util/collection.py +17 -0
  730. chia/util/condition_tools.py +201 -0
  731. chia/util/config.py +366 -0
  732. chia/util/cpu.py +20 -0
  733. chia/util/db_synchronous.py +21 -0
  734. chia/util/db_version.py +30 -0
  735. chia/util/db_wrapper.py +427 -0
  736. chia/util/default_root.py +10 -0
  737. chia/util/dump_keyring.py +93 -0
  738. chia/util/english.txt +2048 -0
  739. chia/util/errors.py +351 -0
  740. chia/util/file_keyring.py +480 -0
  741. chia/util/files.py +95 -0
  742. chia/util/full_block_utils.py +321 -0
  743. chia/util/generator_tools.py +62 -0
  744. chia/util/hash.py +29 -0
  745. chia/util/initial-config.yaml +675 -0
  746. chia/util/inline_executor.py +24 -0
  747. chia/util/ints.py +19 -0
  748. chia/util/json_util.py +41 -0
  749. chia/util/keychain.py +673 -0
  750. chia/util/keyring_wrapper.py +266 -0
  751. chia/util/limited_semaphore.py +39 -0
  752. chia/util/lock.py +47 -0
  753. chia/util/log_exceptions.py +29 -0
  754. chia/util/logging.py +34 -0
  755. chia/util/lru_cache.py +29 -0
  756. chia/util/math.py +20 -0
  757. chia/util/network.py +240 -0
  758. chia/util/paginator.py +46 -0
  759. chia/util/path.py +29 -0
  760. chia/util/permissions.py +19 -0
  761. chia/util/pprint.py +40 -0
  762. chia/util/prev_transaction_block.py +23 -0
  763. chia/util/priority_mutex.py +92 -0
  764. chia/util/profiler.py +194 -0
  765. chia/util/recursive_replace.py +22 -0
  766. chia/util/safe_cancel_task.py +14 -0
  767. chia/util/service_groups.py +47 -0
  768. chia/util/setproctitle.py +20 -0
  769. chia/util/significant_bits.py +30 -0
  770. chia/util/ssl_check.py +213 -0
  771. chia/util/streamable.py +654 -0
  772. chia/util/task_timing.py +378 -0
  773. chia/util/timing.py +64 -0
  774. chia/util/vdf_prover.py +31 -0
  775. chia/util/ws_message.py +66 -0
  776. chia/wallet/__init__.py +0 -0
  777. chia/wallet/cat_wallet/__init__.py +0 -0
  778. chia/wallet/cat_wallet/cat_constants.py +75 -0
  779. chia/wallet/cat_wallet/cat_info.py +47 -0
  780. chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
  781. chia/wallet/cat_wallet/cat_utils.py +163 -0
  782. chia/wallet/cat_wallet/cat_wallet.py +869 -0
  783. chia/wallet/cat_wallet/dao_cat_info.py +28 -0
  784. chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
  785. chia/wallet/cat_wallet/lineage_store.py +74 -0
  786. chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
  787. chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
  788. chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
  789. chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
  790. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
  791. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
  792. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
  793. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
  794. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
  795. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
  796. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
  797. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
  798. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
  799. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
  800. chia/wallet/coin_selection.py +188 -0
  801. chia/wallet/conditions.py +1326 -0
  802. chia/wallet/dao_wallet/__init__.py +0 -0
  803. chia/wallet/dao_wallet/dao_info.py +61 -0
  804. chia/wallet/dao_wallet/dao_utils.py +810 -0
  805. chia/wallet/dao_wallet/dao_wallet.py +2121 -0
  806. chia/wallet/db_wallet/__init__.py +0 -0
  807. chia/wallet/db_wallet/db_wallet_puzzles.py +107 -0
  808. chia/wallet/derivation_record.py +30 -0
  809. chia/wallet/derive_keys.py +146 -0
  810. chia/wallet/did_wallet/__init__.py +0 -0
  811. chia/wallet/did_wallet/did_info.py +39 -0
  812. chia/wallet/did_wallet/did_wallet.py +1485 -0
  813. chia/wallet/did_wallet/did_wallet_puzzles.py +220 -0
  814. chia/wallet/did_wallet/puzzles/__init__.py +0 -0
  815. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
  816. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
  817. chia/wallet/driver_protocol.py +26 -0
  818. chia/wallet/key_val_store.py +55 -0
  819. chia/wallet/lineage_proof.py +58 -0
  820. chia/wallet/nft_wallet/__init__.py +0 -0
  821. chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
  822. chia/wallet/nft_wallet/nft_info.py +120 -0
  823. chia/wallet/nft_wallet/nft_puzzles.py +305 -0
  824. chia/wallet/nft_wallet/nft_wallet.py +1686 -0
  825. chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
  826. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  827. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
  828. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
  829. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
  830. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
  831. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
  832. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
  833. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
  834. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
  835. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
  836. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
  837. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
  838. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
  839. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
  840. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
  841. chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
  842. chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
  843. chia/wallet/nft_wallet/uncurry_nft.py +217 -0
  844. chia/wallet/notification_manager.py +117 -0
  845. chia/wallet/notification_store.py +178 -0
  846. chia/wallet/outer_puzzles.py +84 -0
  847. chia/wallet/payment.py +34 -0
  848. chia/wallet/puzzle_drivers.py +118 -0
  849. chia/wallet/puzzles/__init__.py +0 -0
  850. chia/wallet/puzzles/augmented_condition.clsp +13 -0
  851. chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
  852. chia/wallet/puzzles/clawback/__init__.py +0 -0
  853. chia/wallet/puzzles/clawback/drivers.py +188 -0
  854. chia/wallet/puzzles/clawback/metadata.py +38 -0
  855. chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
  856. chia/wallet/puzzles/condition_codes.clib +77 -0
  857. chia/wallet/puzzles/curry-and-treehash.clib +102 -0
  858. chia/wallet/puzzles/curry.clib +135 -0
  859. chia/wallet/puzzles/curry_by_index.clib +16 -0
  860. chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
  861. chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
  862. chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
  863. chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
  864. chia/wallet/puzzles/dao_finished_state.clsp +35 -0
  865. chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
  866. chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
  867. chia/wallet/puzzles/dao_lockup.clsp +288 -0
  868. chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
  869. chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
  870. chia/wallet/puzzles/dao_proposal.clsp +377 -0
  871. chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
  872. chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
  873. chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
  874. chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
  875. chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
  876. chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
  877. chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
  878. chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
  879. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
  880. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
  881. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
  882. chia/wallet/puzzles/dao_treasury.clsp +115 -0
  883. chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
  884. chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
  885. chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
  886. chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
  887. chia/wallet/puzzles/json.clib +25 -0
  888. chia/wallet/puzzles/load_clvm.py +162 -0
  889. chia/wallet/puzzles/merkle_utils.clib +18 -0
  890. chia/wallet/puzzles/notification.clsp +7 -0
  891. chia/wallet/puzzles/notification.clsp.hex +1 -0
  892. chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
  893. chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
  894. chia/wallet/puzzles/p2_conditions.clsp +3 -0
  895. chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
  896. chia/wallet/puzzles/p2_conditions.py +27 -0
  897. chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
  898. chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
  899. chia/wallet/puzzles/p2_delegated_conditions.py +22 -0
  900. chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
  901. chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
  902. chia/wallet/puzzles/p2_delegated_puzzle.py +35 -0
  903. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
  904. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
  905. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +161 -0
  906. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
  907. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
  908. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +22 -0
  909. chia/wallet/puzzles/p2_parent.clsp +19 -0
  910. chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
  911. chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
  912. chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
  913. chia/wallet/puzzles/p2_puzzle_hash.py +28 -0
  914. chia/wallet/puzzles/p2_singleton.clsp +30 -0
  915. chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
  916. chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
  917. chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
  918. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
  919. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
  920. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
  921. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
  922. chia/wallet/puzzles/puzzle_utils.py +34 -0
  923. chia/wallet/puzzles/settlement_payments.clsp +49 -0
  924. chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
  925. chia/wallet/puzzles/sha256tree.clib +11 -0
  926. chia/wallet/puzzles/singleton_launcher.clsp +16 -0
  927. chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
  928. chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
  929. chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
  930. chia/wallet/puzzles/singleton_top_layer.py +295 -0
  931. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
  932. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
  933. chia/wallet/puzzles/singleton_top_layer_v1_1.py +344 -0
  934. chia/wallet/puzzles/singleton_truths.clib +21 -0
  935. chia/wallet/puzzles/tails.py +344 -0
  936. chia/wallet/puzzles/utility_macros.clib +48 -0
  937. chia/wallet/signer_protocol.py +126 -0
  938. chia/wallet/singleton.py +106 -0
  939. chia/wallet/singleton_record.py +30 -0
  940. chia/wallet/trade_manager.py +1088 -0
  941. chia/wallet/trade_record.py +67 -0
  942. chia/wallet/trading/__init__.py +0 -0
  943. chia/wallet/trading/offer.py +703 -0
  944. chia/wallet/trading/trade_status.py +13 -0
  945. chia/wallet/trading/trade_store.py +526 -0
  946. chia/wallet/transaction_record.py +143 -0
  947. chia/wallet/transaction_sorting.py +14 -0
  948. chia/wallet/uncurried_puzzle.py +17 -0
  949. chia/wallet/util/__init__.py +0 -0
  950. chia/wallet/util/address_type.py +55 -0
  951. chia/wallet/util/blind_signer_tl.py +168 -0
  952. chia/wallet/util/clvm_streamable.py +203 -0
  953. chia/wallet/util/compute_hints.py +66 -0
  954. chia/wallet/util/compute_memos.py +45 -0
  955. chia/wallet/util/curry_and_treehash.py +90 -0
  956. chia/wallet/util/debug_spend_bundle.py +234 -0
  957. chia/wallet/util/merkle_tree.py +100 -0
  958. chia/wallet/util/merkle_utils.py +102 -0
  959. chia/wallet/util/new_peak_queue.py +82 -0
  960. chia/wallet/util/notifications.py +12 -0
  961. chia/wallet/util/peer_request_cache.py +174 -0
  962. chia/wallet/util/puzzle_compression.py +96 -0
  963. chia/wallet/util/puzzle_decorator.py +100 -0
  964. chia/wallet/util/puzzle_decorator_type.py +7 -0
  965. chia/wallet/util/query_filter.py +60 -0
  966. chia/wallet/util/transaction_type.py +23 -0
  967. chia/wallet/util/tx_config.py +158 -0
  968. chia/wallet/util/wallet_sync_utils.py +348 -0
  969. chia/wallet/util/wallet_types.py +65 -0
  970. chia/wallet/vc_wallet/__init__.py +0 -0
  971. chia/wallet/vc_wallet/cr_cat_drivers.py +663 -0
  972. chia/wallet/vc_wallet/cr_cat_wallet.py +875 -0
  973. chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
  974. chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
  975. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
  976. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
  977. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
  978. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
  979. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
  980. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
  981. chia/wallet/vc_wallet/vc_drivers.py +838 -0
  982. chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
  983. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
  984. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
  985. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
  986. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
  987. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
  988. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
  989. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
  990. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
  991. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
  992. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
  993. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
  994. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
  995. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
  996. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
  997. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
  998. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
  999. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
  1000. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
  1001. chia/wallet/vc_wallet/vc_store.py +263 -0
  1002. chia/wallet/vc_wallet/vc_wallet.py +638 -0
  1003. chia/wallet/wallet.py +698 -0
  1004. chia/wallet/wallet_action_scope.py +95 -0
  1005. chia/wallet/wallet_blockchain.py +244 -0
  1006. chia/wallet/wallet_coin_record.py +72 -0
  1007. chia/wallet/wallet_coin_store.py +351 -0
  1008. chia/wallet/wallet_info.py +36 -0
  1009. chia/wallet/wallet_interested_store.py +188 -0
  1010. chia/wallet/wallet_nft_store.py +279 -0
  1011. chia/wallet/wallet_node.py +1769 -0
  1012. chia/wallet/wallet_node_api.py +201 -0
  1013. chia/wallet/wallet_pool_store.py +120 -0
  1014. chia/wallet/wallet_protocol.py +90 -0
  1015. chia/wallet/wallet_puzzle_store.py +365 -0
  1016. chia/wallet/wallet_retry_store.py +70 -0
  1017. chia/wallet/wallet_singleton_store.py +258 -0
  1018. chia/wallet/wallet_spend_bundle.py +41 -0
  1019. chia/wallet/wallet_state_manager.py +2820 -0
  1020. chia/wallet/wallet_transaction_store.py +470 -0
  1021. chia/wallet/wallet_user_store.py +110 -0
  1022. chia/wallet/wallet_weight_proof_handler.py +126 -0
  1023. chia_blockchain-2.4.4.dist-info/LICENSE +201 -0
  1024. chia_blockchain-2.4.4.dist-info/METADATA +161 -0
  1025. chia_blockchain-2.4.4.dist-info/RECORD +1028 -0
  1026. chia_blockchain-2.4.4.dist-info/WHEEL +4 -0
  1027. chia_blockchain-2.4.4.dist-info/entry_points.txt +17 -0
  1028. mozilla-ca/cacert.pem +3666 -0
@@ -0,0 +1,1326 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+ from dataclasses import dataclass, fields, replace
5
+ from typing import Any, Dict, Iterable, List, Optional, Set, Tuple, Type, TypeVar, Union, final, get_type_hints
6
+
7
+ from chia_rs import G1Element
8
+ from clvm.casts import int_from_bytes, int_to_bytes
9
+
10
+ from chia.types.blockchain_format.program import Program
11
+ from chia.types.blockchain_format.sized_bytes import bytes32
12
+ from chia.types.condition_opcodes import ConditionOpcode
13
+ from chia.util.hash import std_hash
14
+ from chia.util.ints import uint8, uint32, uint64
15
+ from chia.util.streamable import Streamable, streamable
16
+
17
+ _T_Condition = TypeVar("_T_Condition", bound="Condition")
18
+
19
+
20
+ class Condition(Streamable, ABC):
21
+ @abstractmethod
22
+ def to_program(self) -> Program: ...
23
+
24
+ @classmethod
25
+ @abstractmethod
26
+ def from_program(cls: Type[_T_Condition], program: Program) -> _T_Condition: ...
27
+
28
+
29
+ @final
30
+ @streamable
31
+ @dataclass(frozen=True)
32
+ class AggSigParent(Condition):
33
+ pubkey: G1Element
34
+ msg: bytes
35
+ parent_id: Optional[bytes32] = None
36
+
37
+ def to_program(self) -> Program:
38
+ condition: Program = Program.to([ConditionOpcode.AGG_SIG_PARENT, self.pubkey.to_bytes(), self.msg])
39
+ return condition
40
+
41
+ @classmethod
42
+ def from_program(cls, program: Program, parent_id: Optional[bytes32] = None) -> AggSigParent:
43
+ return cls(
44
+ G1Element.from_bytes(program.at("rf").as_atom()),
45
+ program.at("rrf").as_atom(),
46
+ parent_id,
47
+ )
48
+
49
+
50
+ @final
51
+ @streamable
52
+ @dataclass(frozen=True)
53
+ class AggSigPuzzle(Condition):
54
+ pubkey: G1Element
55
+ msg: bytes
56
+ puzzle_hash: Optional[bytes32] = None
57
+
58
+ def to_program(self) -> Program:
59
+ condition: Program = Program.to([ConditionOpcode.AGG_SIG_PUZZLE, self.pubkey.to_bytes(), self.msg])
60
+ return condition
61
+
62
+ @classmethod
63
+ def from_program(cls, program: Program, puzzle_hash: Optional[bytes32] = None) -> AggSigPuzzle:
64
+ return cls(
65
+ G1Element.from_bytes(program.at("rf").as_atom()),
66
+ program.at("rrf").as_atom(),
67
+ puzzle_hash,
68
+ )
69
+
70
+
71
+ @final
72
+ @streamable
73
+ @dataclass(frozen=True)
74
+ class AggSigAmount(Condition):
75
+ pubkey: G1Element
76
+ msg: bytes
77
+ amount: Optional[uint64] = None
78
+
79
+ def to_program(self) -> Program:
80
+ condition: Program = Program.to([ConditionOpcode.AGG_SIG_AMOUNT, self.pubkey.to_bytes(), self.msg])
81
+ return condition
82
+
83
+ @classmethod
84
+ def from_program(cls, program: Program, amount: Optional[uint64] = None) -> AggSigAmount:
85
+ return cls(
86
+ G1Element.from_bytes(program.at("rf").as_atom()),
87
+ program.at("rrf").as_atom(),
88
+ amount,
89
+ )
90
+
91
+
92
+ @final
93
+ @streamable
94
+ @dataclass(frozen=True)
95
+ class AggSigPuzzleAmount(Condition):
96
+ pubkey: G1Element
97
+ msg: bytes
98
+ puzzle_hash: Optional[bytes32] = None
99
+ amount: Optional[uint64] = None
100
+
101
+ def to_program(self) -> Program:
102
+ condition: Program = Program.to([ConditionOpcode.AGG_SIG_PUZZLE_AMOUNT, self.pubkey.to_bytes(), self.msg])
103
+ return condition
104
+
105
+ @classmethod
106
+ def from_program(
107
+ cls,
108
+ program: Program,
109
+ puzzle_hash: Optional[bytes32] = None,
110
+ amount: Optional[uint64] = None,
111
+ ) -> AggSigPuzzleAmount:
112
+ return cls(
113
+ G1Element.from_bytes(program.at("rf").as_atom()),
114
+ program.at("rrf").as_atom(),
115
+ puzzle_hash,
116
+ amount,
117
+ )
118
+
119
+
120
+ @final
121
+ @streamable
122
+ @dataclass(frozen=True)
123
+ class AggSigParentAmount(Condition):
124
+ pubkey: G1Element
125
+ msg: bytes
126
+ parent_id: Optional[bytes32] = None
127
+ amount: Optional[uint64] = None
128
+
129
+ def to_program(self) -> Program:
130
+ condition: Program = Program.to([ConditionOpcode.AGG_SIG_PARENT_AMOUNT, self.pubkey.to_bytes(), self.msg])
131
+ return condition
132
+
133
+ @classmethod
134
+ def from_program(
135
+ cls,
136
+ program: Program,
137
+ parent_id: Optional[bytes32] = None,
138
+ amount: Optional[uint64] = None,
139
+ ) -> AggSigParentAmount:
140
+ return cls(
141
+ G1Element.from_bytes(program.at("rf").as_atom()),
142
+ program.at("rrf").as_atom(),
143
+ parent_id,
144
+ amount,
145
+ )
146
+
147
+
148
+ @final
149
+ @streamable
150
+ @dataclass(frozen=True)
151
+ class AggSigParentPuzzle(Condition):
152
+ pubkey: G1Element
153
+ msg: bytes
154
+ parent_id: Optional[bytes32] = None
155
+ puzzle_hash: Optional[bytes32] = None
156
+
157
+ def to_program(self) -> Program:
158
+ condition: Program = Program.to([ConditionOpcode.AGG_SIG_PARENT_PUZZLE, self.pubkey.to_bytes(), self.msg])
159
+ return condition
160
+
161
+ @classmethod
162
+ def from_program(
163
+ cls,
164
+ program: Program,
165
+ parent_id: Optional[bytes32] = None,
166
+ puzzle_hash: Optional[bytes32] = None,
167
+ ) -> AggSigParentPuzzle:
168
+ return cls(
169
+ G1Element.from_bytes(program.at("rf").as_atom()),
170
+ program.at("rrf").as_atom(),
171
+ parent_id,
172
+ puzzle_hash,
173
+ )
174
+
175
+
176
+ @final
177
+ @streamable
178
+ @dataclass(frozen=True)
179
+ class AggSigUnsafe(Condition):
180
+ pubkey: G1Element
181
+ msg: bytes
182
+
183
+ def to_program(self) -> Program:
184
+ condition: Program = Program.to([ConditionOpcode.AGG_SIG_UNSAFE, self.pubkey.to_bytes(), self.msg])
185
+ return condition
186
+
187
+ @classmethod
188
+ def from_program(cls, program: Program) -> AggSigUnsafe:
189
+ return cls(
190
+ G1Element.from_bytes(program.at("rf").as_atom()),
191
+ program.at("rrf").as_atom(),
192
+ )
193
+
194
+
195
+ @final
196
+ @streamable
197
+ @dataclass(frozen=True)
198
+ class AggSigMe(Condition):
199
+ pubkey: G1Element
200
+ msg: bytes
201
+ coin_id: Optional[bytes32] = None
202
+ additional_data: Optional[bytes32] = None
203
+
204
+ def to_program(self) -> Program:
205
+ condition: Program = Program.to([ConditionOpcode.AGG_SIG_ME, self.pubkey.to_bytes(), self.msg])
206
+ return condition
207
+
208
+ @classmethod
209
+ def from_program(
210
+ cls,
211
+ program: Program,
212
+ coin_id: Optional[bytes32] = None,
213
+ additional_data: Optional[bytes32] = None,
214
+ ) -> AggSigMe:
215
+ return cls(
216
+ G1Element.from_bytes(program.at("rf").as_atom()),
217
+ program.at("rrf").as_atom(),
218
+ coin_id,
219
+ additional_data,
220
+ )
221
+
222
+
223
+ @final
224
+ @streamable
225
+ @dataclass(frozen=True)
226
+ class CreateCoin(Condition):
227
+ puzzle_hash: bytes32
228
+ amount: uint64
229
+ memos: Optional[List[bytes]] = None
230
+
231
+ def to_program(self) -> Program:
232
+ condition_args = [ConditionOpcode.CREATE_COIN, self.puzzle_hash, self.amount]
233
+ if self.memos is not None:
234
+ condition_args.append(self.memos)
235
+ condition: Program = Program.to(condition_args)
236
+ return condition
237
+
238
+ @classmethod
239
+ def from_program(cls, program: Program) -> CreateCoin:
240
+ potential_memos: Program = program.at("rrr")
241
+ return cls(
242
+ bytes32(program.at("rf").as_atom()),
243
+ uint64(program.at("rrf").as_int()),
244
+ (
245
+ None
246
+ if potential_memos == Program.to(None)
247
+ else [memo.as_atom() for memo in potential_memos.at("f").as_iter()]
248
+ ),
249
+ )
250
+
251
+
252
+ @final
253
+ @streamable
254
+ @dataclass(frozen=True)
255
+ class ReserveFee(Condition):
256
+ amount: uint64
257
+
258
+ def to_program(self) -> Program:
259
+ condition: Program = Program.to([ConditionOpcode.RESERVE_FEE, self.amount])
260
+ return condition
261
+
262
+ @classmethod
263
+ def from_program(cls, program: Program) -> ReserveFee:
264
+ return cls(
265
+ uint64(program.at("rf").as_int()),
266
+ )
267
+
268
+
269
+ @final
270
+ @streamable
271
+ @dataclass(frozen=True)
272
+ class AssertCoinAnnouncement(Condition):
273
+ msg: Optional[bytes32] = None
274
+ asserted_id: Optional[bytes32] = None
275
+ asserted_msg: Optional[bytes] = None
276
+
277
+ def __post_init__(self) -> None:
278
+ if self.msg is None and (self.asserted_id is None or self.asserted_msg is None):
279
+ raise ValueError("Must specify either the complete announcement message or both of its components")
280
+
281
+ @property
282
+ def msg_calc(self) -> bytes32:
283
+ if self.msg is None:
284
+ # Our __post_init__ assures us these are not None
285
+ return std_hash(self.asserted_id + self.asserted_msg) # type: ignore[operator]
286
+ else:
287
+ return self.msg
288
+
289
+ def corresponding_creation(self) -> CreateCoinAnnouncement:
290
+ if self.asserted_msg is None:
291
+ raise ValueError("Cannot create coin announcement creation without asserted_msg")
292
+ else:
293
+ return CreateCoinAnnouncement(self.asserted_msg, self.asserted_id)
294
+
295
+ def to_program(self) -> Program:
296
+ condition: Program = Program.to([ConditionOpcode.ASSERT_COIN_ANNOUNCEMENT, self.msg_calc])
297
+ return condition
298
+
299
+ @classmethod
300
+ def from_program(
301
+ cls,
302
+ program: Program,
303
+ asserted_id: Optional[bytes32] = None,
304
+ asserted_msg: Optional[bytes] = None,
305
+ ) -> AssertCoinAnnouncement:
306
+ return cls(
307
+ bytes32(program.at("rf").as_atom()),
308
+ asserted_id,
309
+ asserted_msg,
310
+ )
311
+
312
+
313
+ @final
314
+ @streamable
315
+ @dataclass(frozen=True)
316
+ class CreateCoinAnnouncement(Condition):
317
+ msg: bytes
318
+ coin_id: Optional[bytes32] = None
319
+
320
+ def corresponding_assertion(self) -> AssertCoinAnnouncement:
321
+ if self.coin_id is None:
322
+ raise ValueError("Cannot create coin announcement assertion without coin_id")
323
+ else:
324
+ return AssertCoinAnnouncement(asserted_id=self.coin_id, asserted_msg=self.msg)
325
+
326
+ def to_program(self) -> Program:
327
+ condition: Program = Program.to([ConditionOpcode.CREATE_COIN_ANNOUNCEMENT, self.msg])
328
+ return condition
329
+
330
+ @classmethod
331
+ def from_program(cls, program: Program, coin_id: Optional[bytes32] = None) -> CreateCoinAnnouncement:
332
+ return cls(
333
+ program.at("rf").as_atom(),
334
+ coin_id,
335
+ )
336
+
337
+
338
+ @final
339
+ @streamable
340
+ @dataclass(frozen=True)
341
+ class AssertPuzzleAnnouncement(Condition):
342
+ msg: Optional[bytes32] = None
343
+ asserted_ph: Optional[bytes32] = None
344
+ asserted_msg: Optional[bytes] = None
345
+
346
+ def __post_init__(self) -> None:
347
+ if self.msg is None and (self.asserted_ph is None or self.asserted_msg is None):
348
+ raise ValueError("Must specify either the complete announcement message or both of its components")
349
+
350
+ @property
351
+ def msg_calc(self) -> bytes32:
352
+ if self.msg is None:
353
+ # Our __post_init__ assures us these are not None
354
+ return std_hash(self.asserted_ph + self.asserted_msg) # type: ignore[operator]
355
+ else:
356
+ return self.msg
357
+
358
+ def corresponding_creation(self) -> CreatePuzzleAnnouncement:
359
+ if self.asserted_msg is None:
360
+ raise ValueError("Cannot create puzzle announcement creation without asserted_msg")
361
+ else:
362
+ return CreatePuzzleAnnouncement(self.asserted_msg, self.asserted_ph)
363
+
364
+ def to_program(self) -> Program:
365
+ condition: Program = Program.to([ConditionOpcode.ASSERT_PUZZLE_ANNOUNCEMENT, self.msg_calc])
366
+ return condition
367
+
368
+ @classmethod
369
+ def from_program(
370
+ cls,
371
+ program: Program,
372
+ asserted_ph: Optional[bytes32] = None,
373
+ asserted_msg: Optional[bytes] = None,
374
+ ) -> AssertPuzzleAnnouncement:
375
+ return cls(
376
+ bytes32(program.at("rf").as_atom()),
377
+ asserted_ph,
378
+ asserted_msg,
379
+ )
380
+
381
+
382
+ @final
383
+ @streamable
384
+ @dataclass(frozen=True)
385
+ class CreatePuzzleAnnouncement(Condition):
386
+ msg: bytes
387
+ puzzle_hash: Optional[bytes32] = None
388
+
389
+ def corresponding_assertion(self) -> AssertPuzzleAnnouncement:
390
+ if self.puzzle_hash is None:
391
+ raise ValueError("Cannot create puzzle announcement assertion without puzzle_hash")
392
+ else:
393
+ return AssertPuzzleAnnouncement(asserted_ph=self.puzzle_hash, asserted_msg=self.msg)
394
+
395
+ def to_program(self) -> Program:
396
+ condition: Program = Program.to([ConditionOpcode.CREATE_PUZZLE_ANNOUNCEMENT, self.msg])
397
+ return condition
398
+
399
+ @classmethod
400
+ def from_program(cls, program: Program, puzzle_hash: Optional[bytes32] = None) -> CreatePuzzleAnnouncement:
401
+ return cls(
402
+ program.at("rf").as_atom(),
403
+ puzzle_hash,
404
+ )
405
+
406
+
407
+ @final
408
+ @streamable
409
+ @dataclass(frozen=True)
410
+ class SendMessage(Condition):
411
+ mode: uint8
412
+ msg: bytes
413
+ args: Program
414
+
415
+ def to_program(self) -> Program:
416
+ condition: Program = Program.to([ConditionOpcode.SEND_MESSAGE, self.mode, self.msg, self.args])
417
+ return condition
418
+
419
+ @classmethod
420
+ def from_program(cls, program: Program) -> SendMessage:
421
+ return cls(
422
+ uint8(program.at("rf").as_int()),
423
+ program.at("rrf").as_atom(),
424
+ program.at("rrrf"),
425
+ )
426
+
427
+
428
+ @final
429
+ @streamable
430
+ @dataclass(frozen=True)
431
+ class ReceiveMessage(Condition):
432
+ mode: uint8
433
+ msg: bytes
434
+ args: Program
435
+
436
+ def to_program(self) -> Program:
437
+ condition: Program = Program.to([ConditionOpcode.RECEIVE_MESSAGE, self.mode, self.msg, self.args])
438
+ return condition
439
+
440
+ @classmethod
441
+ def from_program(cls, program: Program) -> ReceiveMessage:
442
+ return cls(
443
+ uint8(program.at("rf").as_int()),
444
+ program.at("rrf").as_atom(),
445
+ program.at("rrrf"),
446
+ )
447
+
448
+
449
+ @final
450
+ @streamable
451
+ @dataclass(frozen=True)
452
+ class AssertConcurrentSpend(Condition):
453
+ coin_id: bytes32
454
+
455
+ def to_program(self) -> Program:
456
+ condition: Program = Program.to([ConditionOpcode.ASSERT_CONCURRENT_SPEND, self.coin_id])
457
+ return condition
458
+
459
+ @classmethod
460
+ def from_program(cls, program: Program) -> AssertConcurrentSpend:
461
+ return cls(
462
+ bytes32(program.at("rf").as_atom()),
463
+ )
464
+
465
+
466
+ @final
467
+ @streamable
468
+ @dataclass(frozen=True)
469
+ class AssertConcurrentPuzzle(Condition):
470
+ puzzle_hash: bytes32
471
+
472
+ def to_program(self) -> Program:
473
+ condition: Program = Program.to([ConditionOpcode.ASSERT_CONCURRENT_PUZZLE, self.puzzle_hash])
474
+ return condition
475
+
476
+ @classmethod
477
+ def from_program(cls, program: Program) -> AssertConcurrentPuzzle:
478
+ return cls(
479
+ bytes32(program.at("rf").as_atom()),
480
+ )
481
+
482
+
483
+ @final
484
+ @streamable
485
+ @dataclass(frozen=True)
486
+ class AssertMyCoinID(Condition):
487
+ coin_id: bytes32
488
+
489
+ def to_program(self) -> Program:
490
+ condition: Program = Program.to([ConditionOpcode.ASSERT_MY_COIN_ID, self.coin_id])
491
+ return condition
492
+
493
+ @classmethod
494
+ def from_program(cls, program: Program) -> AssertMyCoinID:
495
+ return cls(
496
+ bytes32(program.at("rf").as_atom()),
497
+ )
498
+
499
+
500
+ @final
501
+ @streamable
502
+ @dataclass(frozen=True)
503
+ class AssertMyParentID(Condition):
504
+ coin_id: bytes32
505
+
506
+ def to_program(self) -> Program:
507
+ condition: Program = Program.to([ConditionOpcode.ASSERT_MY_PARENT_ID, self.coin_id])
508
+ return condition
509
+
510
+ @classmethod
511
+ def from_program(cls, program: Program) -> AssertMyParentID:
512
+ return cls(
513
+ bytes32(program.at("rf").as_atom()),
514
+ )
515
+
516
+
517
+ @final
518
+ @streamable
519
+ @dataclass(frozen=True)
520
+ class AssertMyPuzzleHash(Condition):
521
+ puzzle_hash: bytes32
522
+
523
+ def to_program(self) -> Program:
524
+ condition: Program = Program.to([ConditionOpcode.ASSERT_MY_PUZZLEHASH, self.puzzle_hash])
525
+ return condition
526
+
527
+ @classmethod
528
+ def from_program(cls, program: Program) -> AssertMyPuzzleHash:
529
+ return cls(
530
+ bytes32(program.at("rf").as_atom()),
531
+ )
532
+
533
+
534
+ @final
535
+ @streamable
536
+ @dataclass(frozen=True)
537
+ class AssertMyAmount(Condition):
538
+ amount: uint64
539
+
540
+ def to_program(self) -> Program:
541
+ condition: Program = Program.to([ConditionOpcode.ASSERT_MY_AMOUNT, self.amount])
542
+ return condition
543
+
544
+ @classmethod
545
+ def from_program(cls, program: Program) -> AssertMyAmount:
546
+ return cls(
547
+ uint64(program.at("rf").as_int()),
548
+ )
549
+
550
+
551
+ @final
552
+ @streamable
553
+ @dataclass(frozen=True)
554
+ class AssertMyBirthSeconds(Condition):
555
+ seconds: uint64
556
+
557
+ def to_program(self) -> Program:
558
+ condition: Program = Program.to([ConditionOpcode.ASSERT_MY_BIRTH_SECONDS, self.seconds])
559
+ return condition
560
+
561
+ @classmethod
562
+ def from_program(cls, program: Program) -> AssertMyBirthSeconds:
563
+ return cls(
564
+ uint64(program.at("rf").as_int()),
565
+ )
566
+
567
+
568
+ @final
569
+ @streamable
570
+ @dataclass(frozen=True)
571
+ class AssertMyBirthHeight(Condition):
572
+ height: uint32
573
+
574
+ def to_program(self) -> Program:
575
+ condition: Program = Program.to([ConditionOpcode.ASSERT_MY_BIRTH_HEIGHT, self.height])
576
+ return condition
577
+
578
+ @classmethod
579
+ def from_program(cls, program: Program) -> AssertMyBirthHeight:
580
+ return cls(
581
+ uint32(program.at("rf").as_int()),
582
+ )
583
+
584
+
585
+ @final
586
+ @streamable
587
+ @dataclass(frozen=True)
588
+ class AssertEphemeral(Condition):
589
+ def to_program(self) -> Program:
590
+ condition: Program = Program.to([ConditionOpcode.ASSERT_EPHEMERAL])
591
+ return condition
592
+
593
+ @classmethod
594
+ def from_program(cls, program: Program) -> AssertEphemeral:
595
+ return cls()
596
+
597
+
598
+ @final
599
+ @streamable
600
+ @dataclass(frozen=True)
601
+ class AssertSecondsRelative(Condition):
602
+ seconds: uint64
603
+
604
+ def to_program(self) -> Program:
605
+ condition: Program = Program.to([ConditionOpcode.ASSERT_SECONDS_RELATIVE, self.seconds])
606
+ return condition
607
+
608
+ @classmethod
609
+ def from_program(cls, program: Program) -> AssertSecondsRelative:
610
+ return cls(
611
+ uint64(program.at("rf").as_int()),
612
+ )
613
+
614
+
615
+ @final
616
+ @streamable
617
+ @dataclass(frozen=True)
618
+ class AssertSecondsAbsolute(Condition):
619
+ seconds: uint64
620
+
621
+ def to_program(self) -> Program:
622
+ condition: Program = Program.to([ConditionOpcode.ASSERT_SECONDS_ABSOLUTE, self.seconds])
623
+ return condition
624
+
625
+ @classmethod
626
+ def from_program(cls, program: Program) -> AssertSecondsAbsolute:
627
+ return cls(
628
+ uint64(program.at("rf").as_int()),
629
+ )
630
+
631
+
632
+ @final
633
+ @streamable
634
+ @dataclass(frozen=True)
635
+ class AssertHeightRelative(Condition):
636
+ height: uint32
637
+
638
+ def to_program(self) -> Program:
639
+ condition: Program = Program.to([ConditionOpcode.ASSERT_HEIGHT_RELATIVE, self.height])
640
+ return condition
641
+
642
+ @classmethod
643
+ def from_program(cls, program: Program) -> AssertHeightRelative:
644
+ return cls(
645
+ uint32(program.at("rf").as_int()),
646
+ )
647
+
648
+
649
+ @final
650
+ @streamable
651
+ @dataclass(frozen=True)
652
+ class AssertHeightAbsolute(Condition):
653
+ height: uint32
654
+
655
+ def to_program(self) -> Program:
656
+ condition: Program = Program.to([ConditionOpcode.ASSERT_HEIGHT_ABSOLUTE, self.height])
657
+ return condition
658
+
659
+ @classmethod
660
+ def from_program(cls, program: Program) -> AssertHeightAbsolute:
661
+ return cls(
662
+ uint32(program.at("rf").as_int()),
663
+ )
664
+
665
+
666
+ @final
667
+ @streamable
668
+ @dataclass(frozen=True)
669
+ class AssertBeforeSecondsRelative(Condition):
670
+ seconds: uint64
671
+
672
+ def to_program(self) -> Program:
673
+ condition: Program = Program.to([ConditionOpcode.ASSERT_BEFORE_SECONDS_RELATIVE, self.seconds])
674
+ return condition
675
+
676
+ @classmethod
677
+ def from_program(cls, program: Program) -> AssertBeforeSecondsRelative:
678
+ return cls(
679
+ uint64(program.at("rf").as_int()),
680
+ )
681
+
682
+
683
+ @final
684
+ @streamable
685
+ @dataclass(frozen=True)
686
+ class AssertBeforeSecondsAbsolute(Condition):
687
+ seconds: uint64
688
+
689
+ def to_program(self) -> Program:
690
+ condition: Program = Program.to([ConditionOpcode.ASSERT_BEFORE_SECONDS_ABSOLUTE, self.seconds])
691
+ return condition
692
+
693
+ @classmethod
694
+ def from_program(cls, program: Program) -> AssertBeforeSecondsAbsolute:
695
+ return cls(
696
+ uint64(program.at("rf").as_int()),
697
+ )
698
+
699
+
700
+ @final
701
+ @streamable
702
+ @dataclass(frozen=True)
703
+ class AssertBeforeHeightRelative(Condition):
704
+ height: uint32
705
+
706
+ def to_program(self) -> Program:
707
+ condition: Program = Program.to([ConditionOpcode.ASSERT_BEFORE_HEIGHT_RELATIVE, self.height])
708
+ return condition
709
+
710
+ @classmethod
711
+ def from_program(cls, program: Program) -> AssertBeforeHeightRelative:
712
+ return cls(
713
+ uint32(program.at("rf").as_int()),
714
+ )
715
+
716
+
717
+ @final
718
+ @streamable
719
+ @dataclass(frozen=True)
720
+ class AssertBeforeHeightAbsolute(Condition):
721
+ height: uint32
722
+
723
+ def to_program(self) -> Program:
724
+ condition: Program = Program.to([ConditionOpcode.ASSERT_BEFORE_HEIGHT_ABSOLUTE, self.height])
725
+ return condition
726
+
727
+ @classmethod
728
+ def from_program(cls, program: Program) -> AssertBeforeHeightAbsolute:
729
+ return cls(
730
+ uint32(program.at("rf").as_int()),
731
+ )
732
+
733
+
734
+ @final
735
+ @streamable
736
+ @dataclass(frozen=True)
737
+ class Softfork(Condition):
738
+ cost: uint64
739
+ conditions: List[Program]
740
+
741
+ def to_program(self) -> Program:
742
+ condition: Program = Program.to([ConditionOpcode.SOFTFORK, self.cost, self.conditions])
743
+ return condition
744
+
745
+ @classmethod
746
+ def from_program(cls, program: Program) -> Softfork:
747
+ return cls(
748
+ uint64(program.at("rf").as_int()),
749
+ list(program.at("rrf").as_iter()),
750
+ )
751
+
752
+
753
+ @final
754
+ @streamable
755
+ @dataclass(frozen=True)
756
+ class Remark(Condition):
757
+ rest: Program
758
+
759
+ def to_program(self) -> Program:
760
+ condition: Program = Program.to((ConditionOpcode.REMARK, self.rest))
761
+ return condition
762
+
763
+ @classmethod
764
+ def from_program(cls, program: Program) -> Remark:
765
+ return cls(
766
+ program.at("r"),
767
+ )
768
+
769
+
770
+ @final
771
+ @streamable
772
+ @dataclass(frozen=True)
773
+ class UnknownCondition(Condition):
774
+ opcode: Program
775
+ args: List[Program]
776
+
777
+ def to_program(self) -> Program:
778
+ return self.opcode.cons(Program.to(self.args))
779
+
780
+ @classmethod
781
+ def from_program(cls, program: Program) -> UnknownCondition:
782
+ return cls(
783
+ program.at("f"), [] if program.at("r") == Program.to(None) else [p for p in program.at("r").as_iter()]
784
+ )
785
+
786
+
787
+ # Abstractions
788
+ @final
789
+ @streamable
790
+ @dataclass(frozen=True)
791
+ class AggSig(Condition):
792
+ pubkey: G1Element
793
+ msg: bytes
794
+ opcode: bytes = ConditionOpcode.AGG_SIG_ME.value
795
+ coin_id: Optional[bytes32] = None
796
+ parent_id: Optional[bytes32] = None
797
+ puzzle_hash: Optional[bytes32] = None
798
+ amount: Optional[uint64] = None
799
+ additional_data: Optional[bytes32] = None
800
+
801
+ def to_program(self) -> Program:
802
+ # We know we are an agg sig or we want to error
803
+ return CONDITION_DRIVERS[self.opcode](self.pubkey.to_bytes(), self.msg).to_program() # type: ignore[call-arg]
804
+
805
+ @classmethod
806
+ def from_program(cls, program: Program, **kwargs: Optional[Union[uint64, bytes32]]) -> AggSig:
807
+ opcode: bytes = program.at("f").as_atom()
808
+ condition_driver: Condition = CONDITION_DRIVERS[opcode].from_program(program, **kwargs)
809
+ return cls(
810
+ # We are either parsing an agg sig condition, all of which have these, or we want to error
811
+ condition_driver.pubkey, # type: ignore[attr-defined]
812
+ condition_driver.msg, # type: ignore[attr-defined]
813
+ opcode,
814
+ **{key: value for key, value in condition_driver.__dict__.items() if key not in ["pubkey", "msg"]},
815
+ )
816
+
817
+
818
+ @final
819
+ @streamable
820
+ @dataclass(frozen=True)
821
+ class CreateAnnouncement(Condition):
822
+ msg: bytes
823
+ coin_not_puzzle: bool
824
+ origin_id: Optional[bytes32] = None
825
+
826
+ def corresponding_assertion(self) -> AssertAnnouncement:
827
+ if self.origin_id is None:
828
+ raise ValueError("Cannot create coin announcement assertion without origin_id")
829
+ else:
830
+ return AssertAnnouncement(self.coin_not_puzzle, asserted_origin_id=self.origin_id, asserted_msg=self.msg)
831
+
832
+ def to_program(self) -> Program:
833
+ if self.coin_not_puzzle:
834
+ return CreateCoinAnnouncement(self.msg, self.origin_id).to_program()
835
+ else:
836
+ return CreatePuzzleAnnouncement(self.msg, self.origin_id).to_program()
837
+
838
+ @classmethod
839
+ def from_program(cls, program: Program, **kwargs: Optional[bytes32]) -> CreateAnnouncement:
840
+ if program.at("f").as_atom() == ConditionOpcode.CREATE_COIN_ANNOUNCEMENT:
841
+ coin_not_puzzle: bool = True
842
+ condition: Union[CreateCoinAnnouncement, CreatePuzzleAnnouncement] = CreateCoinAnnouncement.from_program(
843
+ program, **kwargs
844
+ )
845
+ assert isinstance(condition, CreateCoinAnnouncement)
846
+ origin_id: Optional[bytes32] = condition.coin_id
847
+ else:
848
+ coin_not_puzzle = False
849
+ condition = CreatePuzzleAnnouncement.from_program(program, **kwargs)
850
+ assert isinstance(condition, CreatePuzzleAnnouncement)
851
+ origin_id = condition.puzzle_hash
852
+ return cls(
853
+ condition.msg,
854
+ coin_not_puzzle,
855
+ origin_id,
856
+ )
857
+
858
+
859
+ @final
860
+ @streamable
861
+ @dataclass(frozen=True)
862
+ class AssertAnnouncement(Condition):
863
+ coin_not_puzzle: bool
864
+ msg: Optional[bytes32] = None
865
+ asserted_origin_id: Optional[bytes32] = None
866
+ asserted_msg: Optional[bytes] = None
867
+
868
+ def __post_init__(self) -> None:
869
+ if self.msg is None and (self.asserted_origin_id is None or self.asserted_msg is None):
870
+ raise ValueError("Must specify either the complete announcement message or both of its components")
871
+
872
+ @property
873
+ def msg_calc(self) -> bytes32:
874
+ if self.msg is None:
875
+ # Our __post_init__ assures us these are not None
876
+ return std_hash(self.asserted_origin_id + self.asserted_msg) # type: ignore[operator]
877
+ else:
878
+ return self.msg
879
+
880
+ def to_program(self) -> Program:
881
+ if self.coin_not_puzzle:
882
+ return AssertCoinAnnouncement(self.msg_calc, self.asserted_origin_id, self.asserted_msg).to_program()
883
+ else:
884
+ return AssertPuzzleAnnouncement(self.msg_calc, self.asserted_origin_id, self.asserted_msg).to_program()
885
+
886
+ def corresponding_creation(self) -> CreateAnnouncement:
887
+ if self.asserted_msg is None:
888
+ raise ValueError("Cannot create coin announcement creation without asserted_msg")
889
+ else:
890
+ return CreateAnnouncement(self.asserted_msg, self.coin_not_puzzle, self.asserted_origin_id)
891
+
892
+ @classmethod
893
+ def from_program(cls, program: Program, **kwargs: Optional[bytes32]) -> AssertAnnouncement:
894
+ if program.at("f").as_atom() == ConditionOpcode.ASSERT_COIN_ANNOUNCEMENT:
895
+ coin_not_puzzle: bool = True
896
+ condition: Union[AssertCoinAnnouncement, AssertPuzzleAnnouncement] = AssertCoinAnnouncement.from_program(
897
+ program, **kwargs
898
+ )
899
+ assert isinstance(condition, AssertCoinAnnouncement)
900
+ asserted_origin_id: Optional[bytes32] = condition.asserted_id
901
+ else:
902
+ coin_not_puzzle = False
903
+ condition = AssertPuzzleAnnouncement.from_program(program, **kwargs)
904
+ assert isinstance(condition, AssertPuzzleAnnouncement)
905
+ asserted_origin_id = condition.asserted_ph
906
+ return cls(
907
+ coin_not_puzzle,
908
+ condition.msg_calc,
909
+ asserted_origin_id,
910
+ condition.asserted_msg,
911
+ )
912
+
913
+
914
+ TIMELOCK_TYPES = Union[
915
+ AssertSecondsRelative,
916
+ AssertHeightRelative,
917
+ AssertSecondsAbsolute,
918
+ AssertHeightAbsolute,
919
+ AssertBeforeSecondsRelative,
920
+ AssertBeforeHeightRelative,
921
+ AssertBeforeSecondsAbsolute,
922
+ AssertBeforeHeightAbsolute,
923
+ ]
924
+
925
+
926
+ TIMELOCK_DRIVERS: Tuple[
927
+ Type[TIMELOCK_TYPES],
928
+ Type[TIMELOCK_TYPES],
929
+ Type[TIMELOCK_TYPES],
930
+ Type[TIMELOCK_TYPES],
931
+ Type[TIMELOCK_TYPES],
932
+ Type[TIMELOCK_TYPES],
933
+ Type[TIMELOCK_TYPES],
934
+ Type[TIMELOCK_TYPES],
935
+ ] = (
936
+ AssertSecondsRelative,
937
+ AssertHeightRelative,
938
+ AssertSecondsAbsolute,
939
+ AssertHeightAbsolute,
940
+ AssertBeforeSecondsRelative,
941
+ AssertBeforeHeightRelative,
942
+ AssertBeforeSecondsAbsolute,
943
+ AssertBeforeHeightAbsolute,
944
+ )
945
+ SECONDS_TIMELOCK_DRIVERS: Set[Type[TIMELOCK_TYPES]] = {
946
+ AssertSecondsRelative,
947
+ AssertSecondsAbsolute,
948
+ AssertBeforeSecondsRelative,
949
+ AssertBeforeSecondsAbsolute,
950
+ }
951
+ HEIGHT_TIMELOCK_DRIVERS: Set[Type[TIMELOCK_TYPES]] = {
952
+ AssertHeightRelative,
953
+ AssertHeightAbsolute,
954
+ AssertBeforeHeightRelative,
955
+ AssertBeforeHeightAbsolute,
956
+ }
957
+ AFTER_TIMELOCK_DRIVERS: Set[Type[TIMELOCK_TYPES]] = {
958
+ AssertSecondsRelative,
959
+ AssertHeightRelative,
960
+ AssertSecondsAbsolute,
961
+ AssertHeightAbsolute,
962
+ }
963
+ BEFORE_TIMELOCK_DRIVERS: Set[Type[TIMELOCK_TYPES]] = {
964
+ AssertBeforeSecondsRelative,
965
+ AssertBeforeHeightRelative,
966
+ AssertBeforeSecondsAbsolute,
967
+ AssertBeforeHeightAbsolute,
968
+ }
969
+ RELATIVE_TIMELOCK_DRIVERS: Set[Type[TIMELOCK_TYPES]] = {
970
+ AssertSecondsRelative,
971
+ AssertHeightRelative,
972
+ AssertBeforeSecondsRelative,
973
+ AssertBeforeHeightRelative,
974
+ }
975
+ ABSOLUTE_TIMELOCK_DRIVERS: Set[Type[TIMELOCK_TYPES]] = {
976
+ AssertSecondsAbsolute,
977
+ AssertHeightAbsolute,
978
+ AssertBeforeSecondsAbsolute,
979
+ AssertBeforeHeightAbsolute,
980
+ }
981
+ TIMELOCK_DRIVERS_SET: Set[Type[TIMELOCK_TYPES]] = set(TIMELOCK_DRIVERS)
982
+
983
+
984
+ TIMELOCK_OPCODES: Set[bytes] = {
985
+ ConditionOpcode.ASSERT_SECONDS_RELATIVE.value,
986
+ ConditionOpcode.ASSERT_HEIGHT_RELATIVE.value,
987
+ ConditionOpcode.ASSERT_SECONDS_ABSOLUTE.value,
988
+ ConditionOpcode.ASSERT_HEIGHT_ABSOLUTE.value,
989
+ ConditionOpcode.ASSERT_BEFORE_SECONDS_RELATIVE.value,
990
+ ConditionOpcode.ASSERT_BEFORE_HEIGHT_RELATIVE.value,
991
+ ConditionOpcode.ASSERT_BEFORE_SECONDS_ABSOLUTE.value,
992
+ ConditionOpcode.ASSERT_BEFORE_HEIGHT_ABSOLUTE.value,
993
+ }
994
+ SECONDS_TIMELOCK_OPCODES: Set[bytes] = {
995
+ ConditionOpcode.ASSERT_SECONDS_RELATIVE.value,
996
+ ConditionOpcode.ASSERT_SECONDS_ABSOLUTE.value,
997
+ ConditionOpcode.ASSERT_BEFORE_SECONDS_RELATIVE.value,
998
+ ConditionOpcode.ASSERT_BEFORE_SECONDS_ABSOLUTE.value,
999
+ }
1000
+ HEIGHT_TIMELOCK_OPCODES: Set[bytes] = {
1001
+ ConditionOpcode.ASSERT_HEIGHT_RELATIVE.value,
1002
+ ConditionOpcode.ASSERT_HEIGHT_ABSOLUTE.value,
1003
+ ConditionOpcode.ASSERT_BEFORE_HEIGHT_RELATIVE.value,
1004
+ ConditionOpcode.ASSERT_BEFORE_HEIGHT_ABSOLUTE.value,
1005
+ }
1006
+ AFTER_TIMELOCK_OPCODES: Set[bytes] = {
1007
+ ConditionOpcode.ASSERT_SECONDS_RELATIVE.value,
1008
+ ConditionOpcode.ASSERT_HEIGHT_RELATIVE.value,
1009
+ ConditionOpcode.ASSERT_SECONDS_ABSOLUTE.value,
1010
+ ConditionOpcode.ASSERT_HEIGHT_ABSOLUTE.value,
1011
+ }
1012
+ BEFORE_TIMELOCK_OPCODES: Set[bytes] = {
1013
+ ConditionOpcode.ASSERT_BEFORE_SECONDS_RELATIVE.value,
1014
+ ConditionOpcode.ASSERT_BEFORE_HEIGHT_RELATIVE.value,
1015
+ ConditionOpcode.ASSERT_BEFORE_SECONDS_ABSOLUTE.value,
1016
+ ConditionOpcode.ASSERT_BEFORE_HEIGHT_ABSOLUTE.value,
1017
+ }
1018
+ RELATIVE_TIMELOCK_OPCODES: Set[bytes] = {
1019
+ ConditionOpcode.ASSERT_SECONDS_RELATIVE.value,
1020
+ ConditionOpcode.ASSERT_HEIGHT_RELATIVE.value,
1021
+ ConditionOpcode.ASSERT_BEFORE_SECONDS_RELATIVE.value,
1022
+ ConditionOpcode.ASSERT_BEFORE_HEIGHT_RELATIVE.value,
1023
+ }
1024
+ ABSOLUTE_TIMELOCK_OPCODES: Set[bytes] = {
1025
+ ConditionOpcode.ASSERT_SECONDS_ABSOLUTE.value,
1026
+ ConditionOpcode.ASSERT_HEIGHT_ABSOLUTE.value,
1027
+ ConditionOpcode.ASSERT_BEFORE_SECONDS_ABSOLUTE.value,
1028
+ ConditionOpcode.ASSERT_BEFORE_HEIGHT_ABSOLUTE.value,
1029
+ }
1030
+
1031
+
1032
+ @final
1033
+ @streamable
1034
+ @dataclass(frozen=True)
1035
+ class Timelock(Condition):
1036
+ after_not_before: bool
1037
+ relative_not_absolute: bool
1038
+ seconds_not_height: bool
1039
+ timestamp: uint64
1040
+
1041
+ def to_program(self) -> Program:
1042
+ if self.after_not_before:
1043
+ potential_drivers = TIMELOCK_DRIVERS_SET - BEFORE_TIMELOCK_DRIVERS
1044
+ else:
1045
+ potential_drivers = TIMELOCK_DRIVERS_SET - AFTER_TIMELOCK_DRIVERS
1046
+
1047
+ if self.relative_not_absolute:
1048
+ potential_drivers -= ABSOLUTE_TIMELOCK_DRIVERS
1049
+ else:
1050
+ potential_drivers -= RELATIVE_TIMELOCK_DRIVERS
1051
+
1052
+ if self.seconds_not_height:
1053
+ potential_drivers -= HEIGHT_TIMELOCK_DRIVERS
1054
+ else:
1055
+ potential_drivers -= SECONDS_TIMELOCK_DRIVERS
1056
+
1057
+ driver: Type[TIMELOCK_TYPES] = next(iter(potential_drivers))
1058
+
1059
+ if self.seconds_not_height:
1060
+ # Semantics here mean that we're assuredly passing a uint64 to a class that expects it
1061
+ return driver(self.timestamp).to_program() # type: ignore[arg-type]
1062
+ else:
1063
+ # Semantics here mean that we're assuredly passing a uint32 to a class that expects it
1064
+ return driver(uint32(self.timestamp)).to_program() # type: ignore[arg-type]
1065
+
1066
+ @classmethod
1067
+ def from_program(cls, program: Program) -> Timelock:
1068
+ opcode: bytes = program.at("f").as_atom()
1069
+ if opcode in AFTER_TIMELOCK_OPCODES:
1070
+ after_not_before = True
1071
+ else:
1072
+ after_not_before = False
1073
+
1074
+ if opcode in RELATIVE_TIMELOCK_OPCODES:
1075
+ relative_not_absolute = True
1076
+ else:
1077
+ relative_not_absolute = False
1078
+
1079
+ if opcode in SECONDS_TIMELOCK_OPCODES:
1080
+ seconds_not_height = True
1081
+ else:
1082
+ seconds_not_height = False
1083
+
1084
+ return cls(
1085
+ after_not_before,
1086
+ relative_not_absolute,
1087
+ seconds_not_height,
1088
+ uint64(program.at("rf").as_int()),
1089
+ )
1090
+
1091
+
1092
+ CONDITION_DRIVERS: Dict[bytes, Type[Condition]] = {
1093
+ ConditionOpcode.AGG_SIG_PARENT.value: AggSigParent,
1094
+ ConditionOpcode.AGG_SIG_PUZZLE.value: AggSigPuzzle,
1095
+ ConditionOpcode.AGG_SIG_AMOUNT.value: AggSigAmount,
1096
+ ConditionOpcode.AGG_SIG_PUZZLE_AMOUNT.value: AggSigPuzzleAmount,
1097
+ ConditionOpcode.AGG_SIG_PARENT_AMOUNT.value: AggSigParentAmount,
1098
+ ConditionOpcode.AGG_SIG_PARENT_PUZZLE.value: AggSigParentPuzzle,
1099
+ ConditionOpcode.AGG_SIG_UNSAFE.value: AggSigUnsafe,
1100
+ ConditionOpcode.AGG_SIG_ME.value: AggSigMe,
1101
+ ConditionOpcode.CREATE_COIN.value: CreateCoin,
1102
+ ConditionOpcode.RESERVE_FEE.value: ReserveFee,
1103
+ ConditionOpcode.CREATE_COIN_ANNOUNCEMENT.value: CreateCoinAnnouncement,
1104
+ ConditionOpcode.ASSERT_COIN_ANNOUNCEMENT.value: AssertCoinAnnouncement,
1105
+ ConditionOpcode.CREATE_PUZZLE_ANNOUNCEMENT.value: CreatePuzzleAnnouncement,
1106
+ ConditionOpcode.ASSERT_PUZZLE_ANNOUNCEMENT.value: AssertPuzzleAnnouncement,
1107
+ ConditionOpcode.SEND_MESSAGE.value: SendMessage,
1108
+ ConditionOpcode.RECEIVE_MESSAGE.value: ReceiveMessage,
1109
+ ConditionOpcode.ASSERT_CONCURRENT_SPEND.value: AssertConcurrentSpend,
1110
+ ConditionOpcode.ASSERT_CONCURRENT_PUZZLE.value: AssertConcurrentPuzzle,
1111
+ ConditionOpcode.ASSERT_MY_COIN_ID.value: AssertMyCoinID,
1112
+ ConditionOpcode.ASSERT_MY_PARENT_ID.value: AssertMyParentID,
1113
+ ConditionOpcode.ASSERT_MY_PUZZLEHASH.value: AssertMyPuzzleHash,
1114
+ ConditionOpcode.ASSERT_MY_AMOUNT.value: AssertMyAmount,
1115
+ ConditionOpcode.ASSERT_MY_BIRTH_SECONDS.value: AssertMyBirthSeconds,
1116
+ ConditionOpcode.ASSERT_MY_BIRTH_HEIGHT.value: AssertMyBirthHeight,
1117
+ ConditionOpcode.ASSERT_EPHEMERAL.value: AssertEphemeral,
1118
+ ConditionOpcode.ASSERT_SECONDS_RELATIVE.value: AssertSecondsRelative,
1119
+ ConditionOpcode.ASSERT_SECONDS_ABSOLUTE.value: AssertSecondsAbsolute,
1120
+ ConditionOpcode.ASSERT_HEIGHT_RELATIVE.value: AssertHeightRelative,
1121
+ ConditionOpcode.ASSERT_HEIGHT_ABSOLUTE.value: AssertHeightAbsolute,
1122
+ ConditionOpcode.ASSERT_BEFORE_SECONDS_RELATIVE.value: AssertBeforeSecondsRelative,
1123
+ ConditionOpcode.ASSERT_BEFORE_SECONDS_ABSOLUTE.value: AssertBeforeSecondsAbsolute,
1124
+ ConditionOpcode.ASSERT_BEFORE_HEIGHT_RELATIVE.value: AssertBeforeHeightRelative,
1125
+ ConditionOpcode.ASSERT_BEFORE_HEIGHT_ABSOLUTE.value: AssertBeforeHeightAbsolute,
1126
+ ConditionOpcode.SOFTFORK.value: Softfork,
1127
+ ConditionOpcode.REMARK.value: Remark,
1128
+ }
1129
+ DRIVERS_TO_OPCODES: Dict[Type[Condition], bytes] = {v: k for k, v in CONDITION_DRIVERS.items()}
1130
+
1131
+
1132
+ CONDITION_DRIVERS_W_ABSTRACTIONS: Dict[bytes, Type[Condition]] = {
1133
+ ConditionOpcode.AGG_SIG_PARENT.value: AggSig,
1134
+ ConditionOpcode.AGG_SIG_PUZZLE.value: AggSig,
1135
+ ConditionOpcode.AGG_SIG_AMOUNT.value: AggSig,
1136
+ ConditionOpcode.AGG_SIG_PUZZLE_AMOUNT.value: AggSig,
1137
+ ConditionOpcode.AGG_SIG_PARENT_AMOUNT.value: AggSig,
1138
+ ConditionOpcode.AGG_SIG_PARENT_PUZZLE.value: AggSig,
1139
+ ConditionOpcode.AGG_SIG_UNSAFE.value: AggSig,
1140
+ ConditionOpcode.AGG_SIG_ME.value: AggSig,
1141
+ ConditionOpcode.CREATE_COIN.value: CreateCoin,
1142
+ ConditionOpcode.RESERVE_FEE.value: ReserveFee,
1143
+ ConditionOpcode.CREATE_COIN_ANNOUNCEMENT.value: CreateAnnouncement,
1144
+ ConditionOpcode.ASSERT_COIN_ANNOUNCEMENT.value: AssertAnnouncement,
1145
+ ConditionOpcode.CREATE_PUZZLE_ANNOUNCEMENT.value: CreateAnnouncement,
1146
+ ConditionOpcode.ASSERT_PUZZLE_ANNOUNCEMENT.value: AssertAnnouncement,
1147
+ ConditionOpcode.SEND_MESSAGE.value: SendMessage,
1148
+ ConditionOpcode.RECEIVE_MESSAGE.value: ReceiveMessage,
1149
+ ConditionOpcode.ASSERT_CONCURRENT_SPEND.value: AssertConcurrentSpend,
1150
+ ConditionOpcode.ASSERT_CONCURRENT_PUZZLE.value: AssertConcurrentPuzzle,
1151
+ ConditionOpcode.ASSERT_MY_COIN_ID.value: AssertMyCoinID,
1152
+ ConditionOpcode.ASSERT_MY_PARENT_ID.value: AssertMyParentID,
1153
+ ConditionOpcode.ASSERT_MY_PUZZLEHASH.value: AssertMyPuzzleHash,
1154
+ ConditionOpcode.ASSERT_MY_AMOUNT.value: AssertMyAmount,
1155
+ ConditionOpcode.ASSERT_MY_BIRTH_SECONDS.value: AssertMyBirthSeconds,
1156
+ ConditionOpcode.ASSERT_MY_BIRTH_HEIGHT.value: AssertMyBirthHeight,
1157
+ ConditionOpcode.ASSERT_EPHEMERAL.value: AssertEphemeral,
1158
+ ConditionOpcode.ASSERT_SECONDS_RELATIVE.value: Timelock,
1159
+ ConditionOpcode.ASSERT_SECONDS_ABSOLUTE.value: Timelock,
1160
+ ConditionOpcode.ASSERT_HEIGHT_RELATIVE.value: Timelock,
1161
+ ConditionOpcode.ASSERT_HEIGHT_ABSOLUTE.value: Timelock,
1162
+ ConditionOpcode.ASSERT_BEFORE_SECONDS_RELATIVE.value: Timelock,
1163
+ ConditionOpcode.ASSERT_BEFORE_SECONDS_ABSOLUTE.value: Timelock,
1164
+ ConditionOpcode.ASSERT_BEFORE_HEIGHT_RELATIVE.value: Timelock,
1165
+ ConditionOpcode.ASSERT_BEFORE_HEIGHT_ABSOLUTE.value: Timelock,
1166
+ ConditionOpcode.SOFTFORK.value: Softfork,
1167
+ ConditionOpcode.REMARK.value: Remark,
1168
+ }
1169
+
1170
+
1171
+ def parse_conditions_non_consensus(
1172
+ conditions: Iterable[Program],
1173
+ abstractions: bool = True, # Use abstractions like *Announcement or Timelock instead of specific condition class
1174
+ ) -> List[Condition]:
1175
+ driver_dictionary: Dict[bytes, Type[Condition]] = (
1176
+ CONDITION_DRIVERS_W_ABSTRACTIONS if abstractions else CONDITION_DRIVERS
1177
+ )
1178
+ final_condition_list: List[Condition] = []
1179
+ for condition in conditions:
1180
+ try:
1181
+ final_condition_list.append(driver_dictionary[condition.at("f").as_atom()].from_program(condition))
1182
+ except Exception:
1183
+ final_condition_list.append(UnknownCondition.from_program(condition))
1184
+
1185
+ return final_condition_list
1186
+
1187
+
1188
+ def conditions_from_json_dicts(conditions: Iterable[Dict[str, Any]]) -> List[Condition]:
1189
+ final_condition_list: List[Condition] = []
1190
+ for condition in conditions:
1191
+ opcode_specified: Union[str, int] = condition["opcode"]
1192
+ if isinstance(opcode_specified, str):
1193
+ try:
1194
+ opcode: bytes = ConditionOpcode[opcode_specified]
1195
+ except KeyError:
1196
+ final_condition_list.append(UnknownCondition.from_json_dict(condition))
1197
+ continue
1198
+ elif isinstance(opcode_specified, int):
1199
+ opcode = int_to_bytes(opcode_specified)
1200
+ else:
1201
+ raise ValueError(f"Invalid condition opcode {opcode_specified}")
1202
+
1203
+ try:
1204
+ final_condition_list.append(CONDITION_DRIVERS[opcode].from_json_dict(condition["args"]))
1205
+ except Exception:
1206
+ condition["opcode"] = Program.to(opcode)
1207
+ final_condition_list.append(UnknownCondition.from_json_dict(condition))
1208
+
1209
+ return final_condition_list
1210
+
1211
+
1212
+ def conditions_to_json_dicts(conditions: Iterable[Condition]) -> List[Dict[str, Any]]:
1213
+ return [
1214
+ {
1215
+ "opcode": int_from_bytes(DRIVERS_TO_OPCODES[condition.__class__]),
1216
+ "args": condition.to_json_dict(),
1217
+ }
1218
+ for condition in conditions
1219
+ ]
1220
+
1221
+
1222
+ @streamable
1223
+ @dataclass(frozen=True)
1224
+ class ConditionValidTimes(Streamable):
1225
+ min_secs_since_created: Optional[uint64] = None # ASSERT_SECONDS_RELATIVE
1226
+ min_time: Optional[uint64] = None # ASSERT_SECONDS_ABSOLUTE
1227
+ min_blocks_since_created: Optional[uint32] = None # ASSERT_HEIGHT_RELATIVE
1228
+ min_height: Optional[uint32] = None # ASSERT_HEIGHT_ABSOLUTE
1229
+ max_secs_after_created: Optional[uint64] = None # ASSERT_BEFORE_SECONDS_RELATIVE
1230
+ max_time: Optional[uint64] = None # ASSERT_BEFORE_SECONDS_ABSOLUTE
1231
+ max_blocks_after_created: Optional[uint32] = None # ASSERT_BEFORE_HEIGHT_RELATIVE
1232
+ max_height: Optional[uint32] = None # ASSERT_BEFORE_HEIGHT_ABSOLUTE
1233
+
1234
+ def to_conditions(self) -> List[Condition]:
1235
+ final_condition_list: List[Condition] = []
1236
+ if self.min_secs_since_created is not None:
1237
+ final_condition_list.append(AssertSecondsRelative(self.min_secs_since_created))
1238
+ if self.min_time is not None:
1239
+ final_condition_list.append(AssertSecondsAbsolute(self.min_time))
1240
+ if self.min_blocks_since_created is not None:
1241
+ final_condition_list.append(AssertHeightRelative(self.min_blocks_since_created))
1242
+ if self.min_height is not None:
1243
+ final_condition_list.append(AssertHeightAbsolute(self.min_height))
1244
+ if self.max_secs_after_created is not None:
1245
+ final_condition_list.append(AssertBeforeSecondsRelative(self.max_secs_after_created))
1246
+ if self.max_time is not None:
1247
+ final_condition_list.append(AssertBeforeSecondsAbsolute(self.max_time))
1248
+ if self.max_blocks_after_created is not None:
1249
+ final_condition_list.append(AssertBeforeHeightRelative(self.max_blocks_after_created))
1250
+ if self.max_height is not None:
1251
+ final_condition_list.append(AssertBeforeHeightAbsolute(self.max_height))
1252
+
1253
+ return final_condition_list
1254
+
1255
+
1256
+ condition_valid_times_hints = get_type_hints(ConditionValidTimes)
1257
+ condition_valid_times_types: Dict[str, Type[int]] = {}
1258
+ for field in fields(ConditionValidTimes):
1259
+ hint = condition_valid_times_hints[field.name]
1260
+ [type_] = [type_ for type_ in hint.__args__ if type_ is not type(None)]
1261
+ condition_valid_times_types[field.name] = type_
1262
+
1263
+
1264
+ # Properties of the dataclass above, grouped by their property
1265
+ SECONDS_PROPERTIES: Set[str] = {"min_secs_since_created", "min_time", "max_secs_after_created", "max_time"}
1266
+ HEIGHT_PROPERTIES: Set[str] = {"min_blocks_since_created", "min_height", "max_blocks_after_created", "max_height"}
1267
+ AFTER_PROPERTIES: Set[str] = {"min_blocks_since_created", "min_height", "min_secs_since_created", "min_time"}
1268
+ BEFORE_PROPERTIES: Set[str] = {"max_blocks_after_created", "max_height", "max_secs_after_created", "max_time"}
1269
+ RELATIVE_PROPERTIES: Set[str] = {
1270
+ "min_blocks_since_created",
1271
+ "min_secs_since_created",
1272
+ "max_secs_after_created",
1273
+ "max_blocks_after_created",
1274
+ }
1275
+ ABSOLUTE_PROPERTIES: Set[str] = {"min_time", "max_time", "min_height", "max_height"}
1276
+ ALL_PROPERTIES: Set[str] = SECONDS_PROPERTIES | HEIGHT_PROPERTIES
1277
+
1278
+
1279
+ def parse_timelock_info(conditions: Iterable[Condition]) -> ConditionValidTimes:
1280
+ valid_times: ConditionValidTimes = ConditionValidTimes()
1281
+ properties: Set[str] = ALL_PROPERTIES.copy()
1282
+ for condition in conditions:
1283
+ if isinstance(condition, TIMELOCK_DRIVERS):
1284
+ timelock: Timelock = Timelock.from_program(condition.to_program())
1285
+ elif isinstance(condition, Timelock):
1286
+ timelock = condition
1287
+ else:
1288
+ # Something about python 3.9 makes this be not covered but on 3.10+ it is covered
1289
+ # https://github.com/nedbat/coveragepy/issues/1530
1290
+ continue # pragma: no cover
1291
+
1292
+ properties_left = properties.copy()
1293
+ min_not_max: bool = True
1294
+ if timelock.after_not_before:
1295
+ min_not_max = False
1296
+ properties_left -= BEFORE_PROPERTIES
1297
+ else:
1298
+ properties_left -= AFTER_PROPERTIES
1299
+
1300
+ if timelock.seconds_not_height:
1301
+ properties_left -= HEIGHT_PROPERTIES
1302
+ else:
1303
+ properties_left -= SECONDS_PROPERTIES
1304
+
1305
+ if timelock.relative_not_absolute:
1306
+ properties_left -= ABSOLUTE_PROPERTIES
1307
+ else:
1308
+ properties_left -= RELATIVE_PROPERTIES
1309
+
1310
+ assert len(properties_left) == 1
1311
+ final_property: str = next(iter(properties_left))
1312
+ current_value: Optional[int] = getattr(valid_times, final_property)
1313
+ if current_value is not None:
1314
+ if min_not_max:
1315
+ new_value: int = min(current_value, timelock.timestamp)
1316
+ else:
1317
+ new_value = max(current_value, timelock.timestamp)
1318
+ else:
1319
+ new_value = timelock.timestamp
1320
+
1321
+ final_type = condition_valid_times_types[final_property]
1322
+ replacement: Dict[str, int] = {final_property: final_type(new_value)}
1323
+ # the type is enforced above
1324
+ valid_times = replace(valid_times, **replacement) # type: ignore[arg-type]
1325
+
1326
+ return valid_times