chia-blockchain 2.5.1rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/__init__.py +10 -0
- chia/__main__.py +5 -0
- chia/_tests/README.md +53 -0
- chia/_tests/__init__.py +0 -0
- chia/_tests/blockchain/__init__.py +0 -0
- chia/_tests/blockchain/blockchain_test_utils.py +195 -0
- chia/_tests/blockchain/config.py +4 -0
- chia/_tests/blockchain/test_augmented_chain.py +145 -0
- chia/_tests/blockchain/test_blockchain.py +4202 -0
- chia/_tests/blockchain/test_blockchain_transactions.py +1031 -0
- chia/_tests/blockchain/test_build_chains.py +59 -0
- chia/_tests/blockchain/test_get_block_generator.py +72 -0
- chia/_tests/blockchain/test_lookup_fork_chain.py +194 -0
- chia/_tests/build-init-files.py +92 -0
- chia/_tests/build-job-matrix.py +204 -0
- chia/_tests/check_pytest_monitor_output.py +34 -0
- chia/_tests/check_sql_statements.py +72 -0
- chia/_tests/chia-start-sim +42 -0
- chia/_tests/clvm/__init__.py +0 -0
- chia/_tests/clvm/benchmark_costs.py +23 -0
- chia/_tests/clvm/coin_store.py +149 -0
- chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
- chia/_tests/clvm/test_clvm_step.py +37 -0
- chia/_tests/clvm/test_condition_codes.py +13 -0
- chia/_tests/clvm/test_curry_and_treehash.py +55 -0
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_program.py +150 -0
- chia/_tests/clvm/test_puzzle_compression.py +143 -0
- chia/_tests/clvm/test_puzzle_drivers.py +45 -0
- chia/_tests/clvm/test_puzzles.py +242 -0
- chia/_tests/clvm/test_singletons.py +540 -0
- chia/_tests/clvm/test_spend_sim.py +181 -0
- chia/_tests/cmds/__init__.py +0 -0
- chia/_tests/cmds/cmd_test_utils.py +469 -0
- chia/_tests/cmds/config.py +3 -0
- chia/_tests/cmds/conftest.py +23 -0
- chia/_tests/cmds/test_click_types.py +200 -0
- chia/_tests/cmds/test_cmd_framework.py +620 -0
- chia/_tests/cmds/test_cmds_util.py +97 -0
- chia/_tests/cmds/test_daemon.py +92 -0
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +66 -0
- chia/_tests/cmds/test_show.py +116 -0
- chia/_tests/cmds/test_sim.py +207 -0
- chia/_tests/cmds/test_timelock_args.py +75 -0
- chia/_tests/cmds/test_tx_config_args.py +154 -0
- chia/_tests/cmds/testing_classes.py +59 -0
- chia/_tests/cmds/wallet/__init__.py +0 -0
- chia/_tests/cmds/wallet/test_consts.py +47 -0
- chia/_tests/cmds/wallet/test_dao.py +565 -0
- chia/_tests/cmds/wallet/test_did.py +403 -0
- chia/_tests/cmds/wallet/test_nft.py +471 -0
- chia/_tests/cmds/wallet/test_notifications.py +124 -0
- chia/_tests/cmds/wallet/test_offer.toffer +1 -0
- chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
- chia/_tests/cmds/wallet/test_vcs.py +400 -0
- chia/_tests/cmds/wallet/test_wallet.py +1125 -0
- chia/_tests/cmds/wallet/test_wallet_check.py +109 -0
- chia/_tests/conftest.py +1419 -0
- chia/_tests/connection_utils.py +125 -0
- chia/_tests/core/__init__.py +0 -0
- chia/_tests/core/cmds/__init__.py +0 -0
- chia/_tests/core/cmds/test_beta.py +382 -0
- chia/_tests/core/cmds/test_keys.py +1734 -0
- chia/_tests/core/cmds/test_wallet.py +126 -0
- chia/_tests/core/config.py +3 -0
- chia/_tests/core/consensus/__init__.py +0 -0
- chia/_tests/core/consensus/test_block_creation.py +54 -0
- chia/_tests/core/consensus/test_pot_iterations.py +117 -0
- chia/_tests/core/custom_types/__init__.py +0 -0
- chia/_tests/core/custom_types/test_coin.py +107 -0
- chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
- chia/_tests/core/custom_types/test_spend_bundle.py +70 -0
- chia/_tests/core/daemon/__init__.py +0 -0
- chia/_tests/core/daemon/config.py +4 -0
- chia/_tests/core/daemon/test_daemon.py +2128 -0
- chia/_tests/core/daemon/test_daemon_register.py +109 -0
- chia/_tests/core/daemon/test_keychain_proxy.py +101 -0
- chia/_tests/core/data_layer/__init__.py +0 -0
- chia/_tests/core/data_layer/config.py +5 -0
- chia/_tests/core/data_layer/conftest.py +106 -0
- chia/_tests/core/data_layer/test_data_cli.py +56 -0
- chia/_tests/core/data_layer/test_data_layer.py +83 -0
- chia/_tests/core/data_layer/test_data_layer_util.py +218 -0
- chia/_tests/core/data_layer/test_data_rpc.py +3847 -0
- chia/_tests/core/data_layer/test_data_store.py +2424 -0
- chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
- chia/_tests/core/data_layer/test_plugin.py +91 -0
- chia/_tests/core/data_layer/util.py +233 -0
- chia/_tests/core/farmer/__init__.py +0 -0
- chia/_tests/core/farmer/config.py +3 -0
- chia/_tests/core/farmer/test_farmer_api.py +103 -0
- chia/_tests/core/full_node/__init__.py +0 -0
- chia/_tests/core/full_node/config.py +4 -0
- chia/_tests/core/full_node/dos/__init__.py +0 -0
- chia/_tests/core/full_node/dos/config.py +3 -0
- chia/_tests/core/full_node/full_sync/__init__.py +0 -0
- chia/_tests/core/full_node/full_sync/config.py +4 -0
- chia/_tests/core/full_node/full_sync/test_full_sync.py +443 -0
- chia/_tests/core/full_node/ram_db.py +27 -0
- chia/_tests/core/full_node/stores/__init__.py +0 -0
- chia/_tests/core/full_node/stores/config.py +4 -0
- chia/_tests/core/full_node/stores/test_block_store.py +590 -0
- chia/_tests/core/full_node/stores/test_coin_store.py +897 -0
- chia/_tests/core/full_node/stores/test_full_node_store.py +1219 -0
- chia/_tests/core/full_node/stores/test_hint_store.py +229 -0
- chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
- chia/_tests/core/full_node/test_address_manager.py +588 -0
- chia/_tests/core/full_node/test_block_height_map.py +556 -0
- chia/_tests/core/full_node/test_conditions.py +556 -0
- chia/_tests/core/full_node/test_full_node.py +2700 -0
- chia/_tests/core/full_node/test_generator_tools.py +82 -0
- chia/_tests/core/full_node/test_hint_management.py +104 -0
- chia/_tests/core/full_node/test_node_load.py +34 -0
- chia/_tests/core/full_node/test_performance.py +179 -0
- chia/_tests/core/full_node/test_subscriptions.py +492 -0
- chia/_tests/core/full_node/test_transactions.py +203 -0
- chia/_tests/core/full_node/test_tx_processing_queue.py +155 -0
- chia/_tests/core/large_block.py +2388 -0
- chia/_tests/core/make_block_generator.py +70 -0
- chia/_tests/core/mempool/__init__.py +0 -0
- chia/_tests/core/mempool/config.py +4 -0
- chia/_tests/core/mempool/test_mempool.py +3255 -0
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
- chia/_tests/core/mempool/test_mempool_item_queries.py +190 -0
- chia/_tests/core/mempool/test_mempool_manager.py +2084 -0
- chia/_tests/core/mempool/test_mempool_performance.py +64 -0
- chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
- chia/_tests/core/node_height.py +28 -0
- chia/_tests/core/server/__init__.py +0 -0
- chia/_tests/core/server/config.py +3 -0
- chia/_tests/core/server/flood.py +84 -0
- chia/_tests/core/server/serve.py +135 -0
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +66 -0
- chia/_tests/core/server/test_dos.py +319 -0
- chia/_tests/core/server/test_event_loop.py +109 -0
- chia/_tests/core/server/test_loop.py +294 -0
- chia/_tests/core/server/test_node_discovery.py +73 -0
- chia/_tests/core/server/test_rate_limits.py +482 -0
- chia/_tests/core/server/test_server.py +226 -0
- chia/_tests/core/server/test_upnp.py +8 -0
- chia/_tests/core/services/__init__.py +0 -0
- chia/_tests/core/services/config.py +3 -0
- chia/_tests/core/services/test_services.py +188 -0
- chia/_tests/core/ssl/__init__.py +0 -0
- chia/_tests/core/ssl/config.py +3 -0
- chia/_tests/core/ssl/test_ssl.py +202 -0
- chia/_tests/core/test_coins.py +33 -0
- chia/_tests/core/test_cost_calculation.py +313 -0
- chia/_tests/core/test_crawler.py +175 -0
- chia/_tests/core/test_crawler_rpc.py +53 -0
- chia/_tests/core/test_daemon_rpc.py +24 -0
- chia/_tests/core/test_db_conversion.py +130 -0
- chia/_tests/core/test_db_validation.py +162 -0
- chia/_tests/core/test_farmer_harvester_rpc.py +505 -0
- chia/_tests/core/test_filter.py +35 -0
- chia/_tests/core/test_full_node_rpc.py +768 -0
- chia/_tests/core/test_merkle_set.py +343 -0
- chia/_tests/core/test_program.py +47 -0
- chia/_tests/core/test_rpc_util.py +86 -0
- chia/_tests/core/test_seeder.py +420 -0
- chia/_tests/core/test_setproctitle.py +13 -0
- chia/_tests/core/util/__init__.py +0 -0
- chia/_tests/core/util/config.py +4 -0
- chia/_tests/core/util/test_block_cache.py +44 -0
- chia/_tests/core/util/test_cached_bls.py +57 -0
- chia/_tests/core/util/test_config.py +337 -0
- chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
- chia/_tests/core/util/test_files.py +391 -0
- chia/_tests/core/util/test_jsonify.py +146 -0
- chia/_tests/core/util/test_keychain.py +522 -0
- chia/_tests/core/util/test_keyring_wrapper.py +491 -0
- chia/_tests/core/util/test_lockfile.py +380 -0
- chia/_tests/core/util/test_log_exceptions.py +187 -0
- chia/_tests/core/util/test_lru_cache.py +56 -0
- chia/_tests/core/util/test_significant_bits.py +40 -0
- chia/_tests/core/util/test_streamable.py +883 -0
- chia/_tests/db/__init__.py +0 -0
- chia/_tests/db/test_db_wrapper.py +566 -0
- chia/_tests/environments/__init__.py +0 -0
- chia/_tests/environments/common.py +35 -0
- chia/_tests/environments/full_node.py +47 -0
- chia/_tests/environments/wallet.py +429 -0
- chia/_tests/ether.py +19 -0
- chia/_tests/farmer_harvester/__init__.py +0 -0
- chia/_tests/farmer_harvester/config.py +3 -0
- chia/_tests/farmer_harvester/test_farmer.py +1264 -0
- chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +131 -0
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +528 -0
- chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
- chia/_tests/fee_estimation/__init__.py +0 -0
- chia/_tests/fee_estimation/config.py +3 -0
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +144 -0
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
- chia/_tests/generator/__init__.py +0 -0
- chia/_tests/generator/puzzles/__init__.py +0 -0
- chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
- chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
- chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
- chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
- chia/_tests/generator/test_compression.py +201 -0
- chia/_tests/generator/test_generator_types.py +44 -0
- chia/_tests/generator/test_rom.py +180 -0
- chia/_tests/plot_sync/__init__.py +0 -0
- chia/_tests/plot_sync/config.py +3 -0
- chia/_tests/plot_sync/test_delta.py +101 -0
- chia/_tests/plot_sync/test_plot_sync.py +618 -0
- chia/_tests/plot_sync/test_receiver.py +451 -0
- chia/_tests/plot_sync/test_sender.py +116 -0
- chia/_tests/plot_sync/test_sync_simulated.py +451 -0
- chia/_tests/plot_sync/util.py +68 -0
- chia/_tests/plotting/__init__.py +0 -0
- chia/_tests/plotting/config.py +3 -0
- chia/_tests/plotting/test_plot_manager.py +781 -0
- chia/_tests/plotting/util.py +12 -0
- chia/_tests/pools/__init__.py +0 -0
- chia/_tests/pools/config.py +5 -0
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +1001 -0
- chia/_tests/pools/test_pool_config.py +42 -0
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +397 -0
- chia/_tests/pools/test_pool_rpc.py +1123 -0
- chia/_tests/pools/test_pool_wallet.py +205 -0
- chia/_tests/pools/test_wallet_pool_store.py +161 -0
- chia/_tests/process_junit.py +348 -0
- chia/_tests/rpc/__init__.py +0 -0
- chia/_tests/rpc/test_rpc_client.py +138 -0
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/__init__.py +0 -0
- chia/_tests/simulation/config.py +6 -0
- chia/_tests/simulation/test_simulation.py +501 -0
- chia/_tests/simulation/test_simulator.py +232 -0
- chia/_tests/simulation/test_start_simulator.py +107 -0
- chia/_tests/testconfig.py +13 -0
- chia/_tests/timelord/__init__.py +0 -0
- chia/_tests/timelord/config.py +3 -0
- chia/_tests/timelord/test_new_peak.py +437 -0
- chia/_tests/timelord/test_timelord.py +11 -0
- chia/_tests/tools/1315537.json +170 -0
- chia/_tests/tools/1315544.json +160 -0
- chia/_tests/tools/1315630.json +150 -0
- chia/_tests/tools/300000.json +105 -0
- chia/_tests/tools/442734.json +140 -0
- chia/_tests/tools/466212.json +130 -0
- chia/_tests/tools/__init__.py +0 -0
- chia/_tests/tools/config.py +5 -0
- chia/_tests/tools/test-blockchain-db.sqlite +0 -0
- chia/_tests/tools/test_full_sync.py +30 -0
- chia/_tests/tools/test_legacy_keyring.py +82 -0
- chia/_tests/tools/test_run_block.py +128 -0
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/__init__.py +0 -0
- chia/_tests/util/benchmark_cost.py +170 -0
- chia/_tests/util/benchmarks.py +153 -0
- chia/_tests/util/bip39_test_vectors.json +148 -0
- chia/_tests/util/blockchain.py +134 -0
- chia/_tests/util/blockchain_mock.py +132 -0
- chia/_tests/util/build_network_protocol_files.py +302 -0
- chia/_tests/util/clvm_generator.bin +0 -0
- chia/_tests/util/config.py +3 -0
- chia/_tests/util/constants.py +20 -0
- chia/_tests/util/db_connection.py +37 -0
- chia/_tests/util/full_sync.py +253 -0
- chia/_tests/util/gen_ssl_certs.py +114 -0
- chia/_tests/util/generator_tools_testing.py +45 -0
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +36 -0
- chia/_tests/util/misc.py +675 -0
- chia/_tests/util/network_protocol_data.py +1072 -0
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +2701 -0
- chia/_tests/util/rpc.py +26 -0
- chia/_tests/util/run_block.py +163 -0
- chia/_tests/util/setup_nodes.py +481 -0
- chia/_tests/util/spend_sim.py +492 -0
- chia/_tests/util/split_managers.py +102 -0
- chia/_tests/util/temp_file.py +14 -0
- chia/_tests/util/test_action_scope.py +144 -0
- chia/_tests/util/test_async_pool.py +366 -0
- chia/_tests/util/test_build_job_matrix.py +42 -0
- chia/_tests/util/test_build_network_protocol_files.py +7 -0
- chia/_tests/util/test_chia_version.py +50 -0
- chia/_tests/util/test_collection.py +11 -0
- chia/_tests/util/test_condition_tools.py +229 -0
- chia/_tests/util/test_config.py +426 -0
- chia/_tests/util/test_dump_keyring.py +60 -0
- chia/_tests/util/test_errors.py +10 -0
- chia/_tests/util/test_full_block_utils.py +279 -0
- chia/_tests/util/test_installed.py +20 -0
- chia/_tests/util/test_limited_semaphore.py +53 -0
- chia/_tests/util/test_logging_filter.py +42 -0
- chia/_tests/util/test_misc.py +445 -0
- chia/_tests/util/test_network.py +73 -0
- chia/_tests/util/test_network_protocol_files.py +578 -0
- chia/_tests/util/test_network_protocol_json.py +267 -0
- chia/_tests/util/test_network_protocol_test.py +256 -0
- chia/_tests/util/test_paginator.py +71 -0
- chia/_tests/util/test_pprint.py +17 -0
- chia/_tests/util/test_priority_mutex.py +488 -0
- chia/_tests/util/test_recursive_replace.py +116 -0
- chia/_tests/util/test_replace_str_to_bytes.py +137 -0
- chia/_tests/util/test_service_groups.py +15 -0
- chia/_tests/util/test_ssl_check.py +31 -0
- chia/_tests/util/test_testnet_overrides.py +19 -0
- chia/_tests/util/test_tests_misc.py +38 -0
- chia/_tests/util/test_timing.py +37 -0
- chia/_tests/util/test_trusted_peer.py +51 -0
- chia/_tests/util/time_out_assert.py +191 -0
- chia/_tests/wallet/__init__.py +0 -0
- chia/_tests/wallet/cat_wallet/__init__.py +0 -0
- chia/_tests/wallet/cat_wallet/config.py +4 -0
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1826 -0
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
- chia/_tests/wallet/cat_wallet/test_trades.py +2600 -0
- chia/_tests/wallet/clawback/__init__.py +0 -0
- chia/_tests/wallet/clawback/config.py +3 -0
- chia/_tests/wallet/clawback/test_clawback_decorator.py +78 -0
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
- chia/_tests/wallet/clawback/test_clawback_metadata.py +50 -0
- chia/_tests/wallet/config.py +4 -0
- chia/_tests/wallet/conftest.py +278 -0
- chia/_tests/wallet/dao_wallet/__init__.py +0 -0
- chia/_tests/wallet/dao_wallet/config.py +3 -0
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1330 -0
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
- chia/_tests/wallet/db_wallet/__init__.py +0 -0
- chia/_tests/wallet/db_wallet/config.py +3 -0
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +141 -0
- chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
- chia/_tests/wallet/did_wallet/__init__.py +0 -0
- chia/_tests/wallet/did_wallet/config.py +4 -0
- chia/_tests/wallet/did_wallet/test_did.py +2284 -0
- chia/_tests/wallet/nft_wallet/__init__.py +0 -0
- chia/_tests/wallet/nft_wallet/config.py +4 -0
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1493 -0
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1024 -0
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +375 -0
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2584 -0
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
- chia/_tests/wallet/rpc/__init__.py +0 -0
- chia/_tests/wallet/rpc/config.py +4 -0
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +285 -0
- chia/_tests/wallet/rpc/test_wallet_rpc.py +3153 -0
- chia/_tests/wallet/simple_sync/__init__.py +0 -0
- chia/_tests/wallet/simple_sync/config.py +3 -0
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +718 -0
- chia/_tests/wallet/sync/__init__.py +0 -0
- chia/_tests/wallet/sync/config.py +4 -0
- chia/_tests/wallet/sync/test_wallet_sync.py +1692 -0
- chia/_tests/wallet/test_address_type.py +189 -0
- chia/_tests/wallet/test_bech32m.py +45 -0
- chia/_tests/wallet/test_clvm_streamable.py +244 -0
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +588 -0
- chia/_tests/wallet/test_conditions.py +400 -0
- chia/_tests/wallet/test_debug_spend_bundle.py +218 -0
- chia/_tests/wallet/test_new_wallet_protocol.py +1174 -0
- chia/_tests/wallet/test_nft_store.py +192 -0
- chia/_tests/wallet/test_notifications.py +196 -0
- chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
- chia/_tests/wallet/test_puzzle_store.py +132 -0
- chia/_tests/wallet/test_sign_coin_spends.py +159 -0
- chia/_tests/wallet/test_signer_protocol.py +947 -0
- chia/_tests/wallet/test_singleton.py +122 -0
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
- chia/_tests/wallet/test_singleton_store.py +152 -0
- chia/_tests/wallet/test_taproot.py +19 -0
- chia/_tests/wallet/test_transaction_store.py +945 -0
- chia/_tests/wallet/test_util.py +185 -0
- chia/_tests/wallet/test_wallet.py +2139 -0
- chia/_tests/wallet/test_wallet_action_scope.py +85 -0
- chia/_tests/wallet/test_wallet_blockchain.py +111 -0
- chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
- chia/_tests/wallet/test_wallet_interested_store.py +43 -0
- chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
- chia/_tests/wallet/test_wallet_node.py +780 -0
- chia/_tests/wallet/test_wallet_retry.py +95 -0
- chia/_tests/wallet/test_wallet_state_manager.py +259 -0
- chia/_tests/wallet/test_wallet_test_framework.py +275 -0
- chia/_tests/wallet/test_wallet_trade_store.py +218 -0
- chia/_tests/wallet/test_wallet_user_store.py +34 -0
- chia/_tests/wallet/test_wallet_utils.py +156 -0
- chia/_tests/wallet/vc_wallet/__init__.py +0 -0
- chia/_tests/wallet/vc_wallet/config.py +3 -0
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +830 -0
- chia/_tests/wallet/wallet_block_tools.py +327 -0
- chia/_tests/weight_proof/__init__.py +0 -0
- chia/_tests/weight_proof/config.py +3 -0
- chia/_tests/weight_proof/test_weight_proof.py +528 -0
- chia/apis.py +19 -0
- chia/clvm/__init__.py +0 -0
- chia/cmds/__init__.py +0 -0
- chia/cmds/beta.py +184 -0
- chia/cmds/beta_funcs.py +137 -0
- chia/cmds/check_wallet_db.py +420 -0
- chia/cmds/chia.py +151 -0
- chia/cmds/cmd_classes.py +323 -0
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +488 -0
- chia/cmds/coin_funcs.py +275 -0
- chia/cmds/coins.py +182 -0
- chia/cmds/completion.py +49 -0
- chia/cmds/configure.py +332 -0
- chia/cmds/dao.py +1064 -0
- chia/cmds/dao_funcs.py +598 -0
- chia/cmds/data.py +708 -0
- chia/cmds/data_funcs.py +385 -0
- chia/cmds/db.py +87 -0
- chia/cmds/db_backup_func.py +77 -0
- chia/cmds/db_upgrade_func.py +452 -0
- chia/cmds/db_validate_func.py +184 -0
- chia/cmds/dev.py +18 -0
- chia/cmds/farm.py +100 -0
- chia/cmds/farm_funcs.py +200 -0
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +63 -0
- chia/cmds/init_funcs.py +367 -0
- chia/cmds/installers.py +131 -0
- chia/cmds/keys.py +527 -0
- chia/cmds/keys_funcs.py +863 -0
- chia/cmds/netspace.py +50 -0
- chia/cmds/netspace_funcs.py +54 -0
- chia/cmds/options.py +32 -0
- chia/cmds/param_types.py +238 -0
- chia/cmds/passphrase.py +131 -0
- chia/cmds/passphrase_funcs.py +292 -0
- chia/cmds/peer.py +51 -0
- chia/cmds/peer_funcs.py +129 -0
- chia/cmds/plotnft.py +260 -0
- chia/cmds/plotnft_funcs.py +405 -0
- chia/cmds/plots.py +230 -0
- chia/cmds/plotters.py +18 -0
- chia/cmds/rpc.py +208 -0
- chia/cmds/show.py +72 -0
- chia/cmds/show_funcs.py +215 -0
- chia/cmds/signer.py +296 -0
- chia/cmds/sim.py +225 -0
- chia/cmds/sim_funcs.py +509 -0
- chia/cmds/start.py +24 -0
- chia/cmds/start_funcs.py +109 -0
- chia/cmds/stop.py +62 -0
- chia/cmds/units.py +9 -0
- chia/cmds/wallet.py +1901 -0
- chia/cmds/wallet_funcs.py +1874 -0
- chia/consensus/__init__.py +0 -0
- chia/consensus/block_body_validation.py +562 -0
- chia/consensus/block_creation.py +546 -0
- chia/consensus/block_header_validation.py +1059 -0
- chia/consensus/block_record.py +31 -0
- chia/consensus/block_rewards.py +53 -0
- chia/consensus/blockchain.py +1087 -0
- chia/consensus/blockchain_interface.py +56 -0
- chia/consensus/coinbase.py +30 -0
- chia/consensus/condition_costs.py +9 -0
- chia/consensus/constants.py +49 -0
- chia/consensus/cost_calculator.py +15 -0
- chia/consensus/default_constants.py +89 -0
- chia/consensus/deficit.py +55 -0
- chia/consensus/difficulty_adjustment.py +412 -0
- chia/consensus/find_fork_point.py +111 -0
- chia/consensus/full_block_to_block_record.py +167 -0
- chia/consensus/get_block_challenge.py +106 -0
- chia/consensus/get_block_generator.py +27 -0
- chia/consensus/make_sub_epoch_summary.py +210 -0
- chia/consensus/multiprocess_validation.py +268 -0
- chia/consensus/pos_quality.py +19 -0
- chia/consensus/pot_iterations.py +67 -0
- chia/consensus/puzzles/__init__.py +0 -0
- chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
- chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
- chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
- chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
- chia/consensus/vdf_info_computation.py +156 -0
- chia/daemon/__init__.py +0 -0
- chia/daemon/client.py +252 -0
- chia/daemon/keychain_proxy.py +502 -0
- chia/daemon/keychain_server.py +365 -0
- chia/daemon/server.py +1606 -0
- chia/daemon/windows_signal.py +56 -0
- chia/data_layer/__init__.py +0 -0
- chia/data_layer/data_layer.py +1291 -0
- chia/data_layer/data_layer_api.py +33 -0
- chia/data_layer/data_layer_errors.py +50 -0
- chia/data_layer/data_layer_server.py +170 -0
- chia/data_layer/data_layer_util.py +985 -0
- chia/data_layer/data_layer_wallet.py +1311 -0
- chia/data_layer/data_store.py +2267 -0
- chia/data_layer/dl_wallet_store.py +407 -0
- chia/data_layer/download_data.py +389 -0
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
- chia/data_layer/s3_plugin_config.yml +33 -0
- chia/data_layer/s3_plugin_service.py +468 -0
- chia/data_layer/util/__init__.py +0 -0
- chia/data_layer/util/benchmark.py +107 -0
- chia/data_layer/util/plugin.py +40 -0
- chia/farmer/__init__.py +0 -0
- chia/farmer/farmer.py +923 -0
- chia/farmer/farmer_api.py +820 -0
- chia/full_node/__init__.py +0 -0
- chia/full_node/bitcoin_fee_estimator.py +85 -0
- chia/full_node/block_height_map.py +271 -0
- chia/full_node/block_store.py +576 -0
- chia/full_node/bundle_tools.py +19 -0
- chia/full_node/coin_store.py +647 -0
- chia/full_node/fee_estimate.py +54 -0
- chia/full_node/fee_estimate_store.py +24 -0
- chia/full_node/fee_estimation.py +92 -0
- chia/full_node/fee_estimator.py +90 -0
- chia/full_node/fee_estimator_constants.py +38 -0
- chia/full_node/fee_estimator_interface.py +42 -0
- chia/full_node/fee_history.py +25 -0
- chia/full_node/fee_tracker.py +564 -0
- chia/full_node/full_node.py +3327 -0
- chia/full_node/full_node_api.py +2025 -0
- chia/full_node/full_node_store.py +1033 -0
- chia/full_node/hint_management.py +56 -0
- chia/full_node/hint_store.py +93 -0
- chia/full_node/mempool.py +589 -0
- chia/full_node/mempool_check_conditions.py +146 -0
- chia/full_node/mempool_manager.py +853 -0
- chia/full_node/pending_tx_cache.py +112 -0
- chia/full_node/puzzles/__init__.py +0 -0
- chia/full_node/puzzles/block_program_zero.clsp +14 -0
- chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
- chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
- chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
- chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
- chia/full_node/signage_point.py +16 -0
- chia/full_node/subscriptions.py +247 -0
- chia/full_node/sync_store.py +146 -0
- chia/full_node/tx_processing_queue.py +78 -0
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +1720 -0
- chia/harvester/__init__.py +0 -0
- chia/harvester/harvester.py +272 -0
- chia/harvester/harvester_api.py +380 -0
- chia/introducer/__init__.py +0 -0
- chia/introducer/introducer.py +122 -0
- chia/introducer/introducer_api.py +70 -0
- chia/legacy/__init__.py +0 -0
- chia/legacy/keyring.py +155 -0
- chia/plot_sync/__init__.py +0 -0
- chia/plot_sync/delta.py +61 -0
- chia/plot_sync/exceptions.py +56 -0
- chia/plot_sync/receiver.py +386 -0
- chia/plot_sync/sender.py +340 -0
- chia/plot_sync/util.py +43 -0
- chia/plotters/__init__.py +0 -0
- chia/plotters/bladebit.py +388 -0
- chia/plotters/chiapos.py +63 -0
- chia/plotters/madmax.py +224 -0
- chia/plotters/plotters.py +577 -0
- chia/plotters/plotters_util.py +133 -0
- chia/plotting/__init__.py +0 -0
- chia/plotting/cache.py +213 -0
- chia/plotting/check_plots.py +283 -0
- chia/plotting/create_plots.py +278 -0
- chia/plotting/manager.py +436 -0
- chia/plotting/util.py +336 -0
- chia/pools/__init__.py +0 -0
- chia/pools/pool_config.py +110 -0
- chia/pools/pool_puzzles.py +459 -0
- chia/pools/pool_wallet.py +933 -0
- chia/pools/pool_wallet_info.py +118 -0
- chia/pools/puzzles/__init__.py +0 -0
- chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
- chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
- chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
- chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
- chia/protocols/__init__.py +0 -0
- chia/protocols/farmer_protocol.py +102 -0
- chia/protocols/full_node_protocol.py +219 -0
- chia/protocols/harvester_protocol.py +216 -0
- chia/protocols/introducer_protocol.py +25 -0
- chia/protocols/pool_protocol.py +177 -0
- chia/protocols/protocol_message_types.py +139 -0
- chia/protocols/protocol_state_machine.py +87 -0
- chia/protocols/protocol_timing.py +8 -0
- chia/protocols/shared_protocol.py +86 -0
- chia/protocols/timelord_protocol.py +93 -0
- chia/protocols/wallet_protocol.py +401 -0
- chia/py.typed +0 -0
- chia/rpc/__init__.py +0 -0
- chia/rpc/crawler_rpc_api.py +80 -0
- chia/rpc/data_layer_rpc_api.py +644 -0
- chia/rpc/data_layer_rpc_client.py +188 -0
- chia/rpc/data_layer_rpc_util.py +58 -0
- chia/rpc/farmer_rpc_api.py +365 -0
- chia/rpc/farmer_rpc_client.py +86 -0
- chia/rpc/full_node_rpc_api.py +959 -0
- chia/rpc/full_node_rpc_client.py +292 -0
- chia/rpc/harvester_rpc_api.py +141 -0
- chia/rpc/harvester_rpc_client.py +54 -0
- chia/rpc/rpc_client.py +164 -0
- chia/rpc/rpc_server.py +521 -0
- chia/rpc/timelord_rpc_api.py +32 -0
- chia/rpc/util.py +93 -0
- chia/rpc/wallet_request_types.py +904 -0
- chia/rpc/wallet_rpc_api.py +4943 -0
- chia/rpc/wallet_rpc_client.py +1814 -0
- chia/seeder/__init__.py +0 -0
- chia/seeder/crawl_store.py +425 -0
- chia/seeder/crawler.py +410 -0
- chia/seeder/crawler_api.py +135 -0
- chia/seeder/dns_server.py +593 -0
- chia/seeder/peer_record.py +146 -0
- chia/seeder/start_crawler.py +92 -0
- chia/server/__init__.py +0 -0
- chia/server/address_manager.py +658 -0
- chia/server/address_manager_store.py +237 -0
- chia/server/api_protocol.py +116 -0
- chia/server/capabilities.py +24 -0
- chia/server/chia_policy.py +346 -0
- chia/server/introducer_peers.py +76 -0
- chia/server/node_discovery.py +714 -0
- chia/server/outbound_message.py +33 -0
- chia/server/rate_limit_numbers.py +214 -0
- chia/server/rate_limits.py +153 -0
- chia/server/server.py +741 -0
- chia/server/signal_handlers.py +120 -0
- chia/server/ssl_context.py +32 -0
- chia/server/start_data_layer.py +151 -0
- chia/server/start_farmer.py +98 -0
- chia/server/start_full_node.py +112 -0
- chia/server/start_harvester.py +93 -0
- chia/server/start_introducer.py +81 -0
- chia/server/start_service.py +316 -0
- chia/server/start_timelord.py +89 -0
- chia/server/start_wallet.py +113 -0
- chia/server/upnp.py +118 -0
- chia/server/ws_connection.py +766 -0
- chia/simulator/__init__.py +0 -0
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +2054 -0
- chia/simulator/full_node_simulator.py +794 -0
- chia/simulator/keyring.py +128 -0
- chia/simulator/setup_services.py +506 -0
- chia/simulator/simulator_constants.py +13 -0
- chia/simulator/simulator_full_node_rpc_api.py +99 -0
- chia/simulator/simulator_full_node_rpc_client.py +60 -0
- chia/simulator/simulator_protocol.py +29 -0
- chia/simulator/simulator_test_tools.py +164 -0
- chia/simulator/socket.py +24 -0
- chia/simulator/ssl_certs.py +114 -0
- chia/simulator/ssl_certs_1.py +697 -0
- chia/simulator/ssl_certs_10.py +697 -0
- chia/simulator/ssl_certs_2.py +697 -0
- chia/simulator/ssl_certs_3.py +697 -0
- chia/simulator/ssl_certs_4.py +697 -0
- chia/simulator/ssl_certs_5.py +697 -0
- chia/simulator/ssl_certs_6.py +697 -0
- chia/simulator/ssl_certs_7.py +697 -0
- chia/simulator/ssl_certs_8.py +697 -0
- chia/simulator/ssl_certs_9.py +697 -0
- chia/simulator/start_simulator.py +143 -0
- chia/simulator/wallet_tools.py +246 -0
- chia/ssl/__init__.py +0 -0
- chia/ssl/chia_ca.crt +19 -0
- chia/ssl/chia_ca.key +28 -0
- chia/ssl/create_ssl.py +249 -0
- chia/ssl/dst_root_ca.pem +20 -0
- chia/timelord/__init__.py +0 -0
- chia/timelord/iters_from_block.py +50 -0
- chia/timelord/timelord.py +1226 -0
- chia/timelord/timelord_api.py +138 -0
- chia/timelord/timelord_launcher.py +190 -0
- chia/timelord/timelord_state.py +244 -0
- chia/timelord/types.py +22 -0
- chia/types/__init__.py +0 -0
- chia/types/aliases.py +35 -0
- chia/types/block_protocol.py +20 -0
- chia/types/blockchain_format/__init__.py +0 -0
- chia/types/blockchain_format/classgroup.py +5 -0
- chia/types/blockchain_format/coin.py +28 -0
- chia/types/blockchain_format/foliage.py +8 -0
- chia/types/blockchain_format/pool_target.py +5 -0
- chia/types/blockchain_format/program.py +269 -0
- chia/types/blockchain_format/proof_of_space.py +135 -0
- chia/types/blockchain_format/reward_chain_block.py +6 -0
- chia/types/blockchain_format/serialized_program.py +5 -0
- chia/types/blockchain_format/sized_bytes.py +11 -0
- chia/types/blockchain_format/slots.py +9 -0
- chia/types/blockchain_format/sub_epoch_summary.py +5 -0
- chia/types/blockchain_format/tree_hash.py +72 -0
- chia/types/blockchain_format/vdf.py +86 -0
- chia/types/clvm_cost.py +13 -0
- chia/types/coin_record.py +43 -0
- chia/types/coin_spend.py +115 -0
- chia/types/condition_opcodes.py +73 -0
- chia/types/condition_with_args.py +16 -0
- chia/types/eligible_coin_spends.py +365 -0
- chia/types/end_of_slot_bundle.py +5 -0
- chia/types/fee_rate.py +38 -0
- chia/types/full_block.py +5 -0
- chia/types/generator_types.py +13 -0
- chia/types/header_block.py +5 -0
- chia/types/internal_mempool_item.py +18 -0
- chia/types/mempool_inclusion_status.py +9 -0
- chia/types/mempool_item.py +85 -0
- chia/types/mempool_submission_status.py +30 -0
- chia/types/mojos.py +7 -0
- chia/types/peer_info.py +64 -0
- chia/types/signing_mode.py +29 -0
- chia/types/spend_bundle.py +30 -0
- chia/types/spend_bundle_conditions.py +7 -0
- chia/types/transaction_queue_entry.py +55 -0
- chia/types/unfinished_block.py +5 -0
- chia/types/unfinished_header_block.py +37 -0
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +49 -0
- chia/util/__init__.py +0 -0
- chia/util/action_scope.py +168 -0
- chia/util/async_pool.py +226 -0
- chia/util/augmented_chain.py +134 -0
- chia/util/batches.py +42 -0
- chia/util/bech32m.py +126 -0
- chia/util/beta_metrics.py +119 -0
- chia/util/block_cache.py +56 -0
- chia/util/byte_types.py +12 -0
- chia/util/check_fork_next_block.py +33 -0
- chia/util/chia_logging.py +144 -0
- chia/util/chia_version.py +33 -0
- chia/util/collection.py +17 -0
- chia/util/condition_tools.py +201 -0
- chia/util/config.py +367 -0
- chia/util/cpu.py +22 -0
- chia/util/db_synchronous.py +23 -0
- chia/util/db_version.py +32 -0
- chia/util/db_wrapper.py +430 -0
- chia/util/default_root.py +27 -0
- chia/util/dump_keyring.py +93 -0
- chia/util/english.txt +2048 -0
- chia/util/errors.py +353 -0
- chia/util/file_keyring.py +469 -0
- chia/util/files.py +97 -0
- chia/util/full_block_utils.py +345 -0
- chia/util/generator_tools.py +72 -0
- chia/util/hash.py +31 -0
- chia/util/initial-config.yaml +694 -0
- chia/util/inline_executor.py +26 -0
- chia/util/ints.py +19 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +37 -0
- chia/util/keychain.py +676 -0
- chia/util/keyring_wrapper.py +327 -0
- chia/util/limited_semaphore.py +41 -0
- chia/util/lock.py +49 -0
- chia/util/log_exceptions.py +32 -0
- chia/util/logging.py +36 -0
- chia/util/lru_cache.py +31 -0
- chia/util/math.py +20 -0
- chia/util/network.py +182 -0
- chia/util/paginator.py +48 -0
- chia/util/path.py +31 -0
- chia/util/permissions.py +20 -0
- chia/util/prev_transaction_block.py +21 -0
- chia/util/priority_mutex.py +95 -0
- chia/util/profiler.py +197 -0
- chia/util/recursive_replace.py +24 -0
- chia/util/safe_cancel_task.py +16 -0
- chia/util/service_groups.py +47 -0
- chia/util/setproctitle.py +22 -0
- chia/util/significant_bits.py +32 -0
- chia/util/ssl_check.py +213 -0
- chia/util/streamable.py +642 -0
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +382 -0
- chia/util/timing.py +67 -0
- chia/util/vdf_prover.py +30 -0
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +66 -0
- chia/wallet/__init__.py +0 -0
- chia/wallet/cat_wallet/__init__.py +0 -0
- chia/wallet/cat_wallet/cat_constants.py +75 -0
- chia/wallet/cat_wallet/cat_info.py +47 -0
- chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
- chia/wallet/cat_wallet/cat_utils.py +164 -0
- chia/wallet/cat_wallet/cat_wallet.py +855 -0
- chia/wallet/cat_wallet/dao_cat_info.py +28 -0
- chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
- chia/wallet/cat_wallet/lineage_store.py +74 -0
- chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
- chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
- chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
- chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
- chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
- chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
- chia/wallet/coin_selection.py +188 -0
- chia/wallet/conditions.py +1512 -0
- chia/wallet/dao_wallet/__init__.py +0 -0
- chia/wallet/dao_wallet/dao_info.py +61 -0
- chia/wallet/dao_wallet/dao_utils.py +811 -0
- chia/wallet/dao_wallet/dao_wallet.py +2119 -0
- chia/wallet/db_wallet/__init__.py +0 -0
- chia/wallet/db_wallet/db_wallet_puzzles.py +111 -0
- chia/wallet/derivation_record.py +30 -0
- chia/wallet/derive_keys.py +146 -0
- chia/wallet/did_wallet/__init__.py +0 -0
- chia/wallet/did_wallet/did_info.py +39 -0
- chia/wallet/did_wallet/did_wallet.py +1494 -0
- chia/wallet/did_wallet/did_wallet_puzzles.py +221 -0
- chia/wallet/did_wallet/puzzles/__init__.py +0 -0
- chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
- chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
- chia/wallet/driver_protocol.py +26 -0
- chia/wallet/key_val_store.py +55 -0
- chia/wallet/lineage_proof.py +58 -0
- chia/wallet/nft_wallet/__init__.py +0 -0
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
- chia/wallet/nft_wallet/nft_info.py +120 -0
- chia/wallet/nft_wallet/nft_puzzles.py +305 -0
- chia/wallet/nft_wallet/nft_wallet.py +1687 -0
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
- chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
- chia/wallet/nft_wallet/uncurry_nft.py +217 -0
- chia/wallet/notification_manager.py +117 -0
- chia/wallet/notification_store.py +178 -0
- chia/wallet/outer_puzzles.py +84 -0
- chia/wallet/payment.py +33 -0
- chia/wallet/puzzle_drivers.py +118 -0
- chia/wallet/puzzles/__init__.py +0 -0
- chia/wallet/puzzles/augmented_condition.clsp +13 -0
- chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
- chia/wallet/puzzles/clawback/__init__.py +0 -0
- chia/wallet/puzzles/clawback/drivers.py +188 -0
- chia/wallet/puzzles/clawback/metadata.py +38 -0
- chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
- chia/wallet/puzzles/condition_codes.clib +77 -0
- chia/wallet/puzzles/curry-and-treehash.clib +102 -0
- chia/wallet/puzzles/curry.clib +135 -0
- chia/wallet/puzzles/curry_by_index.clib +16 -0
- chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
- chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
- chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
- chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
- chia/wallet/puzzles/dao_finished_state.clsp +35 -0
- chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
- chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_lockup.clsp +288 -0
- chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
- chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal.clsp +377 -0
- chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_treasury.clsp +115 -0
- chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
- chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
- chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
- chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
- chia/wallet/puzzles/json.clib +25 -0
- chia/wallet/puzzles/load_clvm.py +161 -0
- chia/wallet/puzzles/merkle_utils.clib +18 -0
- chia/wallet/puzzles/notification.clsp +7 -0
- chia/wallet/puzzles/notification.clsp.hex +1 -0
- chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
- chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
- chia/wallet/puzzles/p2_conditions.clsp +3 -0
- chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
- chia/wallet/puzzles/p2_conditions.py +26 -0
- chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
- chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_conditions.py +21 -0
- chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
- chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_puzzle.py +34 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +160 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +21 -0
- chia/wallet/puzzles/p2_parent.clsp +19 -0
- chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
- chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
- chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
- chia/wallet/puzzles/p2_puzzle_hash.py +27 -0
- chia/wallet/puzzles/p2_singleton.clsp +30 -0
- chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
- chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
- chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
- chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/puzzle_utils.py +34 -0
- chia/wallet/puzzles/settlement_payments.clsp +49 -0
- chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
- chia/wallet/puzzles/sha256tree.clib +11 -0
- chia/wallet/puzzles/singleton_launcher.clsp +16 -0
- chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
- chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer.py +296 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +345 -0
- chia/wallet/puzzles/singleton_truths.clib +21 -0
- chia/wallet/puzzles/tails.py +348 -0
- chia/wallet/puzzles/utility_macros.clib +48 -0
- chia/wallet/signer_protocol.py +125 -0
- chia/wallet/singleton.py +106 -0
- chia/wallet/singleton_record.py +30 -0
- chia/wallet/trade_manager.py +1102 -0
- chia/wallet/trade_record.py +67 -0
- chia/wallet/trading/__init__.py +0 -0
- chia/wallet/trading/offer.py +702 -0
- chia/wallet/trading/trade_status.py +13 -0
- chia/wallet/trading/trade_store.py +526 -0
- chia/wallet/transaction_record.py +158 -0
- chia/wallet/transaction_sorting.py +14 -0
- chia/wallet/uncurried_puzzle.py +17 -0
- chia/wallet/util/__init__.py +0 -0
- chia/wallet/util/address_type.py +55 -0
- chia/wallet/util/blind_signer_tl.py +164 -0
- chia/wallet/util/clvm_streamable.py +203 -0
- chia/wallet/util/compute_hints.py +66 -0
- chia/wallet/util/compute_memos.py +43 -0
- chia/wallet/util/curry_and_treehash.py +91 -0
- chia/wallet/util/debug_spend_bundle.py +232 -0
- chia/wallet/util/merkle_tree.py +100 -0
- chia/wallet/util/merkle_utils.py +102 -0
- chia/wallet/util/new_peak_queue.py +82 -0
- chia/wallet/util/notifications.py +12 -0
- chia/wallet/util/peer_request_cache.py +174 -0
- chia/wallet/util/pprint.py +39 -0
- chia/wallet/util/puzzle_compression.py +95 -0
- chia/wallet/util/puzzle_decorator.py +100 -0
- chia/wallet/util/puzzle_decorator_type.py +7 -0
- chia/wallet/util/query_filter.py +59 -0
- chia/wallet/util/transaction_type.py +23 -0
- chia/wallet/util/tx_config.py +158 -0
- chia/wallet/util/wallet_sync_utils.py +351 -0
- chia/wallet/util/wallet_types.py +72 -0
- chia/wallet/vc_wallet/__init__.py +0 -0
- chia/wallet/vc_wallet/cr_cat_drivers.py +664 -0
- chia/wallet/vc_wallet/cr_cat_wallet.py +877 -0
- chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
- chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
- chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
- chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
- chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
- chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
- chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
- chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_drivers.py +838 -0
- chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
- chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
- chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
- chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
- chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
- chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
- chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
- chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_store.py +263 -0
- chia/wallet/vc_wallet/vc_wallet.py +638 -0
- chia/wallet/wallet.py +698 -0
- chia/wallet/wallet_action_scope.py +96 -0
- chia/wallet/wallet_blockchain.py +244 -0
- chia/wallet/wallet_coin_record.py +72 -0
- chia/wallet/wallet_coin_store.py +351 -0
- chia/wallet/wallet_info.py +35 -0
- chia/wallet/wallet_interested_store.py +188 -0
- chia/wallet/wallet_nft_store.py +279 -0
- chia/wallet/wallet_node.py +1765 -0
- chia/wallet/wallet_node_api.py +207 -0
- chia/wallet/wallet_pool_store.py +119 -0
- chia/wallet/wallet_protocol.py +90 -0
- chia/wallet/wallet_puzzle_store.py +396 -0
- chia/wallet/wallet_retry_store.py +70 -0
- chia/wallet/wallet_singleton_store.py +259 -0
- chia/wallet/wallet_spend_bundle.py +25 -0
- chia/wallet/wallet_state_manager.py +2819 -0
- chia/wallet/wallet_transaction_store.py +496 -0
- chia/wallet/wallet_user_store.py +110 -0
- chia/wallet/wallet_weight_proof_handler.py +126 -0
- chia_blockchain-2.5.1rc1.dist-info/LICENSE +201 -0
- chia_blockchain-2.5.1rc1.dist-info/METADATA +156 -0
- chia_blockchain-2.5.1rc1.dist-info/RECORD +1042 -0
- chia_blockchain-2.5.1rc1.dist-info/WHEEL +4 -0
- chia_blockchain-2.5.1rc1.dist-info/entry_points.txt +17 -0
- mozilla-ca/cacert.pem +3611 -0
|
@@ -0,0 +1,877 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import time
|
|
5
|
+
import traceback
|
|
6
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
7
|
+
|
|
8
|
+
from chia_rs import G1Element, G2Element
|
|
9
|
+
from typing_extensions import Unpack
|
|
10
|
+
|
|
11
|
+
from chia.server.ws_connection import WSChiaConnection
|
|
12
|
+
from chia.types.blockchain_format.coin import Coin, coin_as_list
|
|
13
|
+
from chia.types.blockchain_format.program import Program
|
|
14
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
15
|
+
from chia.types.coin_spend import CoinSpend
|
|
16
|
+
from chia.util.byte_types import hexstr_to_bytes
|
|
17
|
+
from chia.util.hash import std_hash
|
|
18
|
+
from chia.util.ints import uint8, uint32, uint64, uint128
|
|
19
|
+
from chia.util.streamable import VersionedBlob
|
|
20
|
+
from chia.wallet.cat_wallet.cat_info import CATCoinData, CRCATInfo
|
|
21
|
+
from chia.wallet.cat_wallet.cat_utils import CAT_MOD_HASH, CAT_MOD_HASH_HASH, construct_cat_puzzle
|
|
22
|
+
from chia.wallet.cat_wallet.cat_wallet import CATWallet
|
|
23
|
+
from chia.wallet.coin_selection import select_coins
|
|
24
|
+
from chia.wallet.conditions import (
|
|
25
|
+
Condition,
|
|
26
|
+
ConditionValidTimes,
|
|
27
|
+
CreateCoinAnnouncement,
|
|
28
|
+
CreatePuzzleAnnouncement,
|
|
29
|
+
UnknownCondition,
|
|
30
|
+
parse_timelock_info,
|
|
31
|
+
)
|
|
32
|
+
from chia.wallet.lineage_proof import LineageProof
|
|
33
|
+
from chia.wallet.outer_puzzles import AssetType
|
|
34
|
+
from chia.wallet.payment import Payment
|
|
35
|
+
from chia.wallet.puzzle_drivers import PuzzleInfo
|
|
36
|
+
from chia.wallet.trading.offer import Offer
|
|
37
|
+
from chia.wallet.transaction_record import TransactionRecord
|
|
38
|
+
from chia.wallet.uncurried_puzzle import uncurry_puzzle
|
|
39
|
+
from chia.wallet.util.compute_hints import compute_spend_hints_and_additions
|
|
40
|
+
from chia.wallet.util.compute_memos import compute_memos
|
|
41
|
+
from chia.wallet.util.query_filter import HashFilter
|
|
42
|
+
from chia.wallet.util.transaction_type import TransactionType
|
|
43
|
+
from chia.wallet.util.wallet_sync_utils import fetch_coin_spend_for_coin_state
|
|
44
|
+
from chia.wallet.util.wallet_types import CoinType, WalletType
|
|
45
|
+
from chia.wallet.vc_wallet.cr_cat_drivers import (
|
|
46
|
+
CRCAT,
|
|
47
|
+
CRCATMetadata,
|
|
48
|
+
CRCATVersion,
|
|
49
|
+
ProofsChecker,
|
|
50
|
+
construct_cr_layer_hash,
|
|
51
|
+
construct_pending_approval_state,
|
|
52
|
+
)
|
|
53
|
+
from chia.wallet.vc_wallet.vc_drivers import VerifiedCredential
|
|
54
|
+
from chia.wallet.vc_wallet.vc_wallet import VCWallet
|
|
55
|
+
from chia.wallet.wallet import Wallet
|
|
56
|
+
from chia.wallet.wallet_action_scope import WalletActionScope
|
|
57
|
+
from chia.wallet.wallet_coin_record import MetadataTypes, WalletCoinRecord
|
|
58
|
+
from chia.wallet.wallet_info import WalletInfo
|
|
59
|
+
from chia.wallet.wallet_protocol import GSTOptionalArgs, WalletProtocol
|
|
60
|
+
from chia.wallet.wallet_spend_bundle import WalletSpendBundle
|
|
61
|
+
|
|
62
|
+
if TYPE_CHECKING:
|
|
63
|
+
from chia.wallet.wallet_state_manager import WalletStateManager
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class CRCATWallet(CATWallet):
|
|
67
|
+
wallet_state_manager: WalletStateManager
|
|
68
|
+
log: logging.Logger
|
|
69
|
+
wallet_info: WalletInfo
|
|
70
|
+
info: CRCATInfo
|
|
71
|
+
standard_wallet: Wallet
|
|
72
|
+
|
|
73
|
+
@staticmethod
|
|
74
|
+
def default_wallet_name_for_unknown_cat(limitations_program_hash_hex: str) -> str:
|
|
75
|
+
return f"CAT {limitations_program_hash_hex[:16]}..."
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
def cost_of_single_tx(self) -> int:
|
|
79
|
+
return 78000000 # Estimate measured in testing
|
|
80
|
+
|
|
81
|
+
@staticmethod
|
|
82
|
+
async def create_new_cat_wallet(
|
|
83
|
+
wallet_state_manager: WalletStateManager,
|
|
84
|
+
wallet: Wallet,
|
|
85
|
+
cat_tail_info: dict[str, Any],
|
|
86
|
+
amount: uint64,
|
|
87
|
+
action_scope: WalletActionScope,
|
|
88
|
+
fee: uint64 = uint64(0),
|
|
89
|
+
name: Optional[str] = None,
|
|
90
|
+
push: bool = False,
|
|
91
|
+
) -> CATWallet: # pragma: no cover
|
|
92
|
+
raise NotImplementedError("create_new_cat_wallet is a legacy method and is not available on CR-CAT wallets")
|
|
93
|
+
|
|
94
|
+
@staticmethod
|
|
95
|
+
async def get_or_create_wallet_for_cat(
|
|
96
|
+
wallet_state_manager: WalletStateManager,
|
|
97
|
+
wallet: Wallet,
|
|
98
|
+
limitations_program_hash_hex: str,
|
|
99
|
+
name: Optional[str] = None,
|
|
100
|
+
authorized_providers: Optional[list[bytes32]] = None,
|
|
101
|
+
proofs_checker: Optional[ProofsChecker] = None,
|
|
102
|
+
) -> CRCATWallet:
|
|
103
|
+
if authorized_providers is None or proofs_checker is None: # pragma: no cover
|
|
104
|
+
raise ValueError("get_or_create_wallet_for_cat was call on CRCATWallet without proper arguments")
|
|
105
|
+
self = CRCATWallet()
|
|
106
|
+
self.standard_wallet = wallet
|
|
107
|
+
if name is None:
|
|
108
|
+
name = self.default_wallet_name_for_unknown_cat(limitations_program_hash_hex)
|
|
109
|
+
self.log = logging.getLogger(name)
|
|
110
|
+
|
|
111
|
+
tail_hash = bytes32.from_hexstr(limitations_program_hash_hex)
|
|
112
|
+
|
|
113
|
+
for id, w in wallet_state_manager.wallets.items():
|
|
114
|
+
if w.type() == CRCATWallet.type():
|
|
115
|
+
assert isinstance(w, CRCATWallet)
|
|
116
|
+
if w.get_asset_id() == limitations_program_hash_hex:
|
|
117
|
+
self.log.warning("Not creating wallet for already existing CR-CAT wallet")
|
|
118
|
+
return w
|
|
119
|
+
|
|
120
|
+
self.wallet_state_manager = wallet_state_manager
|
|
121
|
+
|
|
122
|
+
self.info = CRCATInfo(tail_hash, None, authorized_providers, proofs_checker)
|
|
123
|
+
info_as_string = bytes(self.info).hex()
|
|
124
|
+
self.wallet_info = await wallet_state_manager.user_store.create_wallet(name, WalletType.CRCAT, info_as_string)
|
|
125
|
+
|
|
126
|
+
await self.wallet_state_manager.add_new_wallet(self)
|
|
127
|
+
return self
|
|
128
|
+
|
|
129
|
+
@classmethod
|
|
130
|
+
async def create_from_puzzle_info(
|
|
131
|
+
cls,
|
|
132
|
+
wallet_state_manager: WalletStateManager,
|
|
133
|
+
wallet: Wallet,
|
|
134
|
+
puzzle_driver: PuzzleInfo,
|
|
135
|
+
name: Optional[str] = None,
|
|
136
|
+
# We're hinting this as Any for mypy by should explore adding this to the wallet protocol and hinting properly
|
|
137
|
+
potential_subclasses: dict[AssetType, Any] = {},
|
|
138
|
+
) -> Any:
|
|
139
|
+
cr_layer: Optional[PuzzleInfo] = puzzle_driver.also()
|
|
140
|
+
if cr_layer is None: # pragma: no cover
|
|
141
|
+
raise ValueError("create_from_puzzle_info called on CRCATWallet with a non CR-CAT puzzle driver")
|
|
142
|
+
return await cls.get_or_create_wallet_for_cat(
|
|
143
|
+
wallet_state_manager,
|
|
144
|
+
wallet,
|
|
145
|
+
puzzle_driver["tail"].hex(),
|
|
146
|
+
name,
|
|
147
|
+
[bytes32(provider) for provider in cr_layer["authorized_providers"]],
|
|
148
|
+
ProofsChecker.from_program(uncurry_puzzle(cr_layer["proofs_checker"])),
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
@staticmethod
|
|
152
|
+
async def create(
|
|
153
|
+
wallet_state_manager: WalletStateManager,
|
|
154
|
+
wallet: Wallet,
|
|
155
|
+
wallet_info: WalletInfo,
|
|
156
|
+
) -> CRCATWallet:
|
|
157
|
+
self = CRCATWallet()
|
|
158
|
+
|
|
159
|
+
self.log = logging.getLogger(__name__)
|
|
160
|
+
self.wallet_state_manager = wallet_state_manager
|
|
161
|
+
self.wallet_info = wallet_info
|
|
162
|
+
self.standard_wallet = wallet
|
|
163
|
+
self.info = CRCATInfo.from_bytes(hexstr_to_bytes(self.wallet_info.data))
|
|
164
|
+
return self
|
|
165
|
+
|
|
166
|
+
@classmethod
|
|
167
|
+
async def convert_to_cr(
|
|
168
|
+
cls,
|
|
169
|
+
cat_wallet: CATWallet,
|
|
170
|
+
authorized_providers: list[bytes32],
|
|
171
|
+
proofs_checker: ProofsChecker,
|
|
172
|
+
) -> None:
|
|
173
|
+
replace_self = cls()
|
|
174
|
+
replace_self.standard_wallet = cat_wallet.standard_wallet
|
|
175
|
+
replace_self.log = logging.getLogger(cat_wallet.get_name())
|
|
176
|
+
replace_self.log.info(f"Converting CAT wallet {cat_wallet.id()} to CR-CAT wallet")
|
|
177
|
+
replace_self.wallet_state_manager = cat_wallet.wallet_state_manager
|
|
178
|
+
replace_self.info = CRCATInfo(
|
|
179
|
+
cat_wallet.cat_info.limitations_program_hash, None, authorized_providers, proofs_checker
|
|
180
|
+
)
|
|
181
|
+
await cat_wallet.wallet_state_manager.user_store.update_wallet(
|
|
182
|
+
WalletInfo(
|
|
183
|
+
cat_wallet.id(), cat_wallet.get_name(), uint8(WalletType.CRCAT.value), bytes(replace_self.info).hex()
|
|
184
|
+
)
|
|
185
|
+
)
|
|
186
|
+
updated_wallet_info = await cat_wallet.wallet_state_manager.user_store.get_wallet_by_id(cat_wallet.id())
|
|
187
|
+
assert updated_wallet_info is not None
|
|
188
|
+
replace_self.wallet_info = updated_wallet_info
|
|
189
|
+
|
|
190
|
+
cat_wallet.wallet_state_manager.wallets[cat_wallet.id()] = replace_self
|
|
191
|
+
|
|
192
|
+
@classmethod
|
|
193
|
+
def type(cls) -> WalletType:
|
|
194
|
+
return WalletType.CRCAT
|
|
195
|
+
|
|
196
|
+
def id(self) -> uint32:
|
|
197
|
+
return self.wallet_info.id
|
|
198
|
+
|
|
199
|
+
def get_asset_id(self) -> str:
|
|
200
|
+
return self.info.limitations_program_hash.hex()
|
|
201
|
+
|
|
202
|
+
async def set_tail_program(self, tail_program: str) -> None: # pragma: no cover
|
|
203
|
+
raise NotImplementedError("set_tail_program is a legacy method and is not available on CR-CAT wallets")
|
|
204
|
+
|
|
205
|
+
async def coin_added(
|
|
206
|
+
self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: Optional[CATCoinData]
|
|
207
|
+
) -> None:
|
|
208
|
+
"""Notification from wallet state manager that wallet has been received."""
|
|
209
|
+
self.log.info(f"CR-CAT wallet has been notified that {coin.name().hex()} was added")
|
|
210
|
+
try:
|
|
211
|
+
coin_state = await self.wallet_state_manager.wallet_node.get_coin_state([coin.parent_coin_info], peer=peer)
|
|
212
|
+
coin_spend = await fetch_coin_spend_for_coin_state(coin_state[0], peer)
|
|
213
|
+
await self.add_crcat_coin(coin_spend, coin, height)
|
|
214
|
+
except Exception as e:
|
|
215
|
+
self.log.debug(f"Exception: {e}, traceback: {traceback.format_exc()}")
|
|
216
|
+
|
|
217
|
+
async def add_crcat_coin(self, coin_spend: CoinSpend, coin: Coin, height: uint32) -> None:
|
|
218
|
+
try:
|
|
219
|
+
new_cr_cats: list[CRCAT] = CRCAT.get_next_from_coin_spend(coin_spend)
|
|
220
|
+
hint_dict = {
|
|
221
|
+
id: hc.hint
|
|
222
|
+
for id, hc in compute_spend_hints_and_additions(coin_spend)[0].items()
|
|
223
|
+
if hc.hint is not None
|
|
224
|
+
}
|
|
225
|
+
cr_cat: CRCAT = next(filter(lambda c: c.coin.name() == coin.name(), new_cr_cats))
|
|
226
|
+
if (
|
|
227
|
+
await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(
|
|
228
|
+
cr_cat.inner_puzzle_hash
|
|
229
|
+
)
|
|
230
|
+
is not None
|
|
231
|
+
):
|
|
232
|
+
self.log.info(f"Found CRCAT coin {coin.name().hex()}")
|
|
233
|
+
is_pending = False
|
|
234
|
+
elif (
|
|
235
|
+
cr_cat.inner_puzzle_hash
|
|
236
|
+
== construct_pending_approval_state(
|
|
237
|
+
hint_dict[coin.name()],
|
|
238
|
+
uint64(coin.amount),
|
|
239
|
+
).get_tree_hash()
|
|
240
|
+
):
|
|
241
|
+
self.log.info(f"Found pending approval CRCAT coin {coin.name().hex()}")
|
|
242
|
+
is_pending = True
|
|
243
|
+
created_timestamp = await self.wallet_state_manager.wallet_node.get_timestamp_for_height(uint32(height))
|
|
244
|
+
spend_bundle = WalletSpendBundle([coin_spend], G2Element())
|
|
245
|
+
memos = compute_memos(spend_bundle)
|
|
246
|
+
# This will override the tx created in the wallet state manager
|
|
247
|
+
tx_record = TransactionRecord(
|
|
248
|
+
confirmed_at_height=height,
|
|
249
|
+
created_at_time=uint64(created_timestamp),
|
|
250
|
+
to_puzzle_hash=hint_dict[coin.name()],
|
|
251
|
+
amount=uint64(coin.amount),
|
|
252
|
+
fee_amount=uint64(0),
|
|
253
|
+
confirmed=True,
|
|
254
|
+
sent=uint32(0),
|
|
255
|
+
spend_bundle=None,
|
|
256
|
+
additions=[coin],
|
|
257
|
+
removals=[coin_spend.coin],
|
|
258
|
+
wallet_id=self.id(),
|
|
259
|
+
sent_to=[],
|
|
260
|
+
trade_id=None,
|
|
261
|
+
type=uint32(TransactionType.INCOMING_CRCAT_PENDING),
|
|
262
|
+
name=coin.name(),
|
|
263
|
+
memos=list(memos.items()),
|
|
264
|
+
valid_times=ConditionValidTimes(),
|
|
265
|
+
)
|
|
266
|
+
await self.wallet_state_manager.tx_store.add_transaction_record(tx_record)
|
|
267
|
+
else: # pragma: no cover
|
|
268
|
+
self.log.error(f"Unknown CRCAT inner puzzle, coin ID: {coin.name().hex()}")
|
|
269
|
+
return None
|
|
270
|
+
coin_record = WalletCoinRecord(
|
|
271
|
+
coin,
|
|
272
|
+
uint32(height),
|
|
273
|
+
uint32(0),
|
|
274
|
+
False,
|
|
275
|
+
False,
|
|
276
|
+
WalletType.CRCAT,
|
|
277
|
+
self.id(),
|
|
278
|
+
CoinType.CRCAT_PENDING if is_pending else CoinType.CRCAT,
|
|
279
|
+
VersionedBlob(
|
|
280
|
+
CRCATVersion.V1.value,
|
|
281
|
+
bytes(
|
|
282
|
+
CRCATMetadata(
|
|
283
|
+
cr_cat.lineage_proof, hint_dict[coin.name()] if is_pending else cr_cat.inner_puzzle_hash
|
|
284
|
+
)
|
|
285
|
+
),
|
|
286
|
+
),
|
|
287
|
+
)
|
|
288
|
+
await self.wallet_state_manager.coin_store.add_coin_record(coin_record)
|
|
289
|
+
except Exception:
|
|
290
|
+
# The parent is not a CAT which means we need to scrub all of its children from our DB
|
|
291
|
+
self.log.error(f"Cannot add CRCAT coin: {traceback.format_exc()}")
|
|
292
|
+
child_coin_records = await self.wallet_state_manager.coin_store.get_coin_records_by_parent_id(
|
|
293
|
+
coin_spend.coin.name()
|
|
294
|
+
)
|
|
295
|
+
if len(child_coin_records) > 0:
|
|
296
|
+
for record in child_coin_records:
|
|
297
|
+
if record.wallet_id == self.id(): # pragma: no cover
|
|
298
|
+
await self.wallet_state_manager.coin_store.delete_coin_record(record.coin.name())
|
|
299
|
+
# We also need to make sure there's no record of the transaction
|
|
300
|
+
await self.wallet_state_manager.tx_store.delete_transaction_record(record.coin.name())
|
|
301
|
+
|
|
302
|
+
def require_derivation_paths(self) -> bool:
|
|
303
|
+
return False
|
|
304
|
+
|
|
305
|
+
def puzzle_for_pk(self, pubkey: G1Element) -> Program: # pragma: no cover
|
|
306
|
+
raise NotImplementedError("puzzle_for_pk is a legacy method and is not available on CR-CAT wallets")
|
|
307
|
+
|
|
308
|
+
def puzzle_hash_for_pk(self, pubkey: G1Element) -> bytes32: # pragma: no cover
|
|
309
|
+
raise NotImplementedError("puzzle_hash_for_pk is a legacy method and is not available on CR-CAT wallets")
|
|
310
|
+
|
|
311
|
+
async def get_new_cat_puzzle_hash(self) -> bytes32: # pragma: no cover
|
|
312
|
+
raise NotImplementedError("get_new_cat_puzzle_hash is a legacy method and is not available on CR-CAT wallets")
|
|
313
|
+
|
|
314
|
+
async def inner_puzzle_for_cat_puzhash(self, cat_hash: bytes32) -> Program: # pragma: no cover
|
|
315
|
+
raise NotImplementedError(
|
|
316
|
+
"inner_puzzle_for_cat_puzhash is a legacy method and is not available on CR-CAT wallets"
|
|
317
|
+
)
|
|
318
|
+
|
|
319
|
+
async def get_cat_spendable_coins(self, records: Optional[set[WalletCoinRecord]] = None) -> list[WalletCoinRecord]:
|
|
320
|
+
result: list[WalletCoinRecord] = []
|
|
321
|
+
|
|
322
|
+
record_list: set[WalletCoinRecord] = await self.wallet_state_manager.get_spendable_coins_for_wallet(
|
|
323
|
+
self.id(), records
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
for record in record_list:
|
|
327
|
+
crcat: CRCAT = self.coin_record_to_crcat(record)
|
|
328
|
+
if crcat.lineage_proof is not None and not crcat.lineage_proof.is_none():
|
|
329
|
+
result.append(record)
|
|
330
|
+
|
|
331
|
+
return result
|
|
332
|
+
|
|
333
|
+
async def get_confirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
334
|
+
if record_list is None:
|
|
335
|
+
record_list = await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(
|
|
336
|
+
self.id(), CoinType.CRCAT
|
|
337
|
+
)
|
|
338
|
+
amount: uint128 = uint128(0)
|
|
339
|
+
for record in record_list:
|
|
340
|
+
crcat: CRCAT = self.coin_record_to_crcat(record)
|
|
341
|
+
if crcat.lineage_proof is not None and not crcat.lineage_proof.is_none():
|
|
342
|
+
amount = uint128(amount + record.coin.amount)
|
|
343
|
+
|
|
344
|
+
self.log.info(f"Confirmed balance for cat wallet {self.id()} is {amount}")
|
|
345
|
+
return uint128(amount)
|
|
346
|
+
|
|
347
|
+
async def get_pending_approval_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
348
|
+
if record_list is None:
|
|
349
|
+
record_list = await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(
|
|
350
|
+
self.id(), CoinType.CRCAT_PENDING
|
|
351
|
+
)
|
|
352
|
+
amount: uint128 = uint128(0)
|
|
353
|
+
for record in record_list:
|
|
354
|
+
crcat: CRCAT = self.coin_record_to_crcat(record)
|
|
355
|
+
if crcat.lineage_proof is not None and not crcat.lineage_proof.is_none():
|
|
356
|
+
amount = uint128(amount + record.coin.amount)
|
|
357
|
+
|
|
358
|
+
self.log.info(f"Pending approval balance for cat wallet {self.id()} is {amount}")
|
|
359
|
+
return uint128(amount)
|
|
360
|
+
|
|
361
|
+
async def convert_puzzle_hash(self, puzzle_hash: bytes32) -> bytes32:
|
|
362
|
+
return puzzle_hash
|
|
363
|
+
|
|
364
|
+
@staticmethod
|
|
365
|
+
def get_metadata_from_record(coin_record: WalletCoinRecord) -> CRCATMetadata:
|
|
366
|
+
metadata: MetadataTypes = coin_record.parsed_metadata()
|
|
367
|
+
assert isinstance(metadata, CRCATMetadata)
|
|
368
|
+
return metadata
|
|
369
|
+
|
|
370
|
+
def coin_record_to_crcat(self, coin_record: WalletCoinRecord) -> CRCAT:
|
|
371
|
+
if coin_record.coin_type not in {CoinType.CRCAT, CoinType.CRCAT_PENDING}: # pragma: no cover
|
|
372
|
+
raise ValueError(f"Attempting to spend a non-CRCAT coin: {coin_record.coin.name().hex()}")
|
|
373
|
+
if coin_record.metadata is None: # pragma: no cover
|
|
374
|
+
raise ValueError(f"Attempting to spend a CRCAT coin without metadata: {coin_record.coin.name().hex()}")
|
|
375
|
+
try:
|
|
376
|
+
metadata: CRCATMetadata = CRCATWallet.get_metadata_from_record(coin_record)
|
|
377
|
+
crcat: CRCAT = CRCAT(
|
|
378
|
+
coin_record.coin,
|
|
379
|
+
self.info.limitations_program_hash,
|
|
380
|
+
metadata.lineage_proof,
|
|
381
|
+
self.info.authorized_providers,
|
|
382
|
+
self.info.proofs_checker.as_program(),
|
|
383
|
+
(
|
|
384
|
+
construct_pending_approval_state(
|
|
385
|
+
metadata.inner_puzzle_hash, uint64(coin_record.coin.amount)
|
|
386
|
+
).get_tree_hash()
|
|
387
|
+
if coin_record.coin_type == CoinType.CRCAT_PENDING
|
|
388
|
+
else metadata.inner_puzzle_hash
|
|
389
|
+
),
|
|
390
|
+
)
|
|
391
|
+
return crcat
|
|
392
|
+
except Exception as e: # pragma: no cover
|
|
393
|
+
raise ValueError(f"Error parsing CRCAT metadata: {e}")
|
|
394
|
+
|
|
395
|
+
async def get_lineage_proof_for_coin(self, coin: Coin) -> Optional[LineageProof]: # pragma: no cover
|
|
396
|
+
raise RuntimeError("get_lineage_proof_for_coin is a legacy method and is not available on CR-CAT wallets")
|
|
397
|
+
|
|
398
|
+
async def _generate_unsigned_spendbundle(
|
|
399
|
+
self,
|
|
400
|
+
payments: list[Payment],
|
|
401
|
+
action_scope: WalletActionScope,
|
|
402
|
+
fee: uint64 = uint64(0),
|
|
403
|
+
cat_discrepancy: Optional[tuple[int, Program, Program]] = None, # (extra_delta, tail_reveal, tail_solution)
|
|
404
|
+
coins: Optional[set[Coin]] = None,
|
|
405
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
406
|
+
add_authorizations_to_cr_cats: bool = True,
|
|
407
|
+
) -> WalletSpendBundle:
|
|
408
|
+
if cat_discrepancy is not None:
|
|
409
|
+
extra_delta, tail_reveal, tail_solution = cat_discrepancy
|
|
410
|
+
else:
|
|
411
|
+
extra_delta, tail_reveal, tail_solution = 0, Program.to([]), Program.to([])
|
|
412
|
+
payment_amount: int = sum(p.amount for p in payments)
|
|
413
|
+
starting_amount: int = payment_amount - extra_delta
|
|
414
|
+
if coins is None:
|
|
415
|
+
cat_coins = list(
|
|
416
|
+
await self.select_coins(
|
|
417
|
+
uint64(starting_amount),
|
|
418
|
+
action_scope,
|
|
419
|
+
)
|
|
420
|
+
)
|
|
421
|
+
else:
|
|
422
|
+
cat_coins = list(coins)
|
|
423
|
+
|
|
424
|
+
cat_coins = sorted(cat_coins, key=Coin.name) # need determinism because we need definitive origin coin
|
|
425
|
+
|
|
426
|
+
selected_cat_amount = sum(c.amount for c in cat_coins)
|
|
427
|
+
assert selected_cat_amount >= starting_amount
|
|
428
|
+
|
|
429
|
+
# Figure out if we need to absorb/melt some XCH as part of this
|
|
430
|
+
regular_chia_to_claim: int = 0
|
|
431
|
+
if payment_amount > starting_amount:
|
|
432
|
+
# TODO: The no coverage comment is because minting is broken for both this and the standard CAT wallet
|
|
433
|
+
fee = uint64(fee + payment_amount - starting_amount) # pragma: no cover
|
|
434
|
+
elif payment_amount < starting_amount:
|
|
435
|
+
regular_chia_to_claim = payment_amount
|
|
436
|
+
|
|
437
|
+
need_chia_transaction = (fee > 0 or regular_chia_to_claim > 0) and (fee - regular_chia_to_claim != 0)
|
|
438
|
+
|
|
439
|
+
# Calculate standard puzzle solutions
|
|
440
|
+
change = selected_cat_amount - starting_amount
|
|
441
|
+
primaries: list[Payment] = []
|
|
442
|
+
for payment in payments:
|
|
443
|
+
primaries.append(payment)
|
|
444
|
+
|
|
445
|
+
if change > 0:
|
|
446
|
+
origin_crcat_record = await self.wallet_state_manager.coin_store.get_coin_record(
|
|
447
|
+
next(iter(cat_coins)).name()
|
|
448
|
+
)
|
|
449
|
+
if origin_crcat_record is None:
|
|
450
|
+
raise RuntimeError("A CR-CAT coin was selected that we don't have a record for") # pragma: no cover
|
|
451
|
+
origin_crcat = self.coin_record_to_crcat(origin_crcat_record)
|
|
452
|
+
if action_scope.config.tx_config.override(
|
|
453
|
+
reuse_puzhash=(
|
|
454
|
+
True if not add_authorizations_to_cr_cats else action_scope.config.tx_config.reuse_puzhash
|
|
455
|
+
)
|
|
456
|
+
).reuse_puzhash:
|
|
457
|
+
change_puzhash = origin_crcat.inner_puzzle_hash
|
|
458
|
+
for payment in payments:
|
|
459
|
+
if change_puzhash == payment.puzzle_hash and change == payment.amount:
|
|
460
|
+
# We cannot create two coins has same id, create a new puzhash for the change
|
|
461
|
+
change_puzhash = await self.standard_wallet.get_puzzle_hash(new=True)
|
|
462
|
+
break
|
|
463
|
+
else:
|
|
464
|
+
change_puzhash = await self.standard_wallet.get_puzzle_hash(new=True)
|
|
465
|
+
primaries.append(Payment(change_puzhash, uint64(change), [change_puzhash]))
|
|
466
|
+
|
|
467
|
+
# Find the VC Wallet
|
|
468
|
+
vc_wallet: VCWallet
|
|
469
|
+
for wallet in self.wallet_state_manager.wallets.values():
|
|
470
|
+
if WalletType(wallet.type()) == WalletType.VC:
|
|
471
|
+
assert isinstance(wallet, VCWallet)
|
|
472
|
+
vc_wallet = wallet
|
|
473
|
+
break
|
|
474
|
+
else:
|
|
475
|
+
raise RuntimeError("CR-CATs cannot be spent without an appropriate VC") # pragma: no cover
|
|
476
|
+
|
|
477
|
+
# Loop through the coins we've selected and gather the information we need to spend them
|
|
478
|
+
vc: Optional[VerifiedCredential] = None
|
|
479
|
+
vc_announcements_to_make: list[bytes] = []
|
|
480
|
+
inner_spends: list[tuple[CRCAT, int, Program, Program]] = []
|
|
481
|
+
first = True
|
|
482
|
+
announcement: CreateCoinAnnouncement
|
|
483
|
+
coin_ids: list[bytes32] = [coin.name() for coin in cat_coins]
|
|
484
|
+
coin_records: list[WalletCoinRecord] = (
|
|
485
|
+
await self.wallet_state_manager.coin_store.get_coin_records(coin_id_filter=HashFilter.include(coin_ids))
|
|
486
|
+
).records
|
|
487
|
+
assert len(coin_records) == len(cat_coins)
|
|
488
|
+
# sort the coin records to ensure they are in the same order as the CAT coins
|
|
489
|
+
coin_records = [rec for rec in sorted(coin_records, key=lambda rec: coin_ids.index(rec.coin.name()))]
|
|
490
|
+
for coin in coin_records:
|
|
491
|
+
if vc is None:
|
|
492
|
+
vc = await vc_wallet.get_vc_with_provider_in_and_proofs(
|
|
493
|
+
self.info.authorized_providers, self.info.proofs_checker.flags
|
|
494
|
+
)
|
|
495
|
+
|
|
496
|
+
if cat_discrepancy is not None:
|
|
497
|
+
cat_condition = UnknownCondition(
|
|
498
|
+
opcode=Program.to(51),
|
|
499
|
+
args=[
|
|
500
|
+
Program.to(None),
|
|
501
|
+
Program.to(-113),
|
|
502
|
+
tail_reveal,
|
|
503
|
+
tail_solution,
|
|
504
|
+
],
|
|
505
|
+
)
|
|
506
|
+
if first:
|
|
507
|
+
extra_conditions = (*extra_conditions, cat_condition)
|
|
508
|
+
|
|
509
|
+
crcat: CRCAT = self.coin_record_to_crcat(coin)
|
|
510
|
+
vc_announcements_to_make.append(crcat.expected_announcement())
|
|
511
|
+
if first:
|
|
512
|
+
announcement = CreateCoinAnnouncement(std_hash(b"".join([c.name() for c in cat_coins])), coin.name())
|
|
513
|
+
if need_chia_transaction:
|
|
514
|
+
if fee > regular_chia_to_claim:
|
|
515
|
+
await self.create_tandem_xch_tx(
|
|
516
|
+
fee,
|
|
517
|
+
uint64(regular_chia_to_claim),
|
|
518
|
+
action_scope,
|
|
519
|
+
extra_conditions=(announcement.corresponding_assertion(),),
|
|
520
|
+
)
|
|
521
|
+
innersol = self.standard_wallet.make_solution(
|
|
522
|
+
primaries=primaries,
|
|
523
|
+
conditions=(*extra_conditions, announcement),
|
|
524
|
+
)
|
|
525
|
+
elif regular_chia_to_claim > fee:
|
|
526
|
+
xch_announcement = await self.create_tandem_xch_tx(
|
|
527
|
+
fee,
|
|
528
|
+
uint64(regular_chia_to_claim),
|
|
529
|
+
action_scope,
|
|
530
|
+
)
|
|
531
|
+
assert xch_announcement is not None
|
|
532
|
+
innersol = self.standard_wallet.make_solution(
|
|
533
|
+
primaries=primaries,
|
|
534
|
+
conditions=(*extra_conditions, xch_announcement, announcement),
|
|
535
|
+
)
|
|
536
|
+
else:
|
|
537
|
+
# TODO: what about when they are equal?
|
|
538
|
+
raise Exception("Equality not handled")
|
|
539
|
+
else:
|
|
540
|
+
innersol = self.standard_wallet.make_solution(
|
|
541
|
+
primaries=primaries,
|
|
542
|
+
conditions=(*extra_conditions, announcement),
|
|
543
|
+
)
|
|
544
|
+
else:
|
|
545
|
+
innersol = self.standard_wallet.make_solution(
|
|
546
|
+
primaries=[],
|
|
547
|
+
conditions=(announcement.corresponding_assertion(),),
|
|
548
|
+
)
|
|
549
|
+
inner_derivation_record = (
|
|
550
|
+
await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(
|
|
551
|
+
crcat.inner_puzzle_hash
|
|
552
|
+
)
|
|
553
|
+
)
|
|
554
|
+
if inner_derivation_record is None:
|
|
555
|
+
raise RuntimeError( # pragma: no cover
|
|
556
|
+
f"CR-CAT {crcat} has an inner puzzle hash {crcat.inner_puzzle_hash} that we don't have the keys for"
|
|
557
|
+
)
|
|
558
|
+
inner_puzzle: Program = self.standard_wallet.puzzle_for_pk(inner_derivation_record.pubkey)
|
|
559
|
+
inner_spends.append(
|
|
560
|
+
(
|
|
561
|
+
crcat,
|
|
562
|
+
extra_delta if first else 0,
|
|
563
|
+
inner_puzzle,
|
|
564
|
+
innersol,
|
|
565
|
+
)
|
|
566
|
+
)
|
|
567
|
+
first = False
|
|
568
|
+
|
|
569
|
+
if vc is None: # pragma: no cover
|
|
570
|
+
raise RuntimeError("Spending no cat coins is not an appropriate use of _generate_unsigned_spendbundle")
|
|
571
|
+
if vc.proof_hash is None:
|
|
572
|
+
raise RuntimeError("CR-CATs found an appropriate VC but that VC contains no proofs") # pragma: no cover
|
|
573
|
+
|
|
574
|
+
proof_of_inclusions: Program = await vc_wallet.proof_of_inclusions_for_root_and_keys(
|
|
575
|
+
vc.proof_hash, self.info.proofs_checker.flags
|
|
576
|
+
)
|
|
577
|
+
|
|
578
|
+
expected_announcements, coin_spends, _ = CRCAT.spend_many(
|
|
579
|
+
inner_spends,
|
|
580
|
+
proof_of_inclusions,
|
|
581
|
+
Program.to(None), # TODO: With more proofs checkers, this may need to be flexible. For now, it's hardcoded.
|
|
582
|
+
vc.proof_provider,
|
|
583
|
+
vc.launcher_id,
|
|
584
|
+
vc.wrap_inner_with_backdoor().get_tree_hash() if add_authorizations_to_cr_cats else None,
|
|
585
|
+
)
|
|
586
|
+
if add_authorizations_to_cr_cats:
|
|
587
|
+
await vc_wallet.generate_signed_transaction(
|
|
588
|
+
vc.launcher_id,
|
|
589
|
+
action_scope,
|
|
590
|
+
extra_conditions=(
|
|
591
|
+
*expected_announcements,
|
|
592
|
+
announcement,
|
|
593
|
+
*(CreatePuzzleAnnouncement(ann) for ann in vc_announcements_to_make),
|
|
594
|
+
),
|
|
595
|
+
)
|
|
596
|
+
|
|
597
|
+
return WalletSpendBundle(coin_spends, G2Element())
|
|
598
|
+
|
|
599
|
+
async def generate_signed_transaction(
|
|
600
|
+
self,
|
|
601
|
+
amounts: list[uint64],
|
|
602
|
+
puzzle_hashes: list[bytes32],
|
|
603
|
+
action_scope: WalletActionScope,
|
|
604
|
+
fee: uint64 = uint64(0),
|
|
605
|
+
coins: Optional[set[Coin]] = None,
|
|
606
|
+
memos: Optional[list[list[bytes]]] = None,
|
|
607
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
608
|
+
**kwargs: Unpack[GSTOptionalArgs],
|
|
609
|
+
) -> None:
|
|
610
|
+
# (extra_delta, tail_reveal, tail_solution)
|
|
611
|
+
cat_discrepancy: Optional[tuple[int, Program, Program]] = kwargs.get("cat_discrepancy", None)
|
|
612
|
+
add_authorizations_to_cr_cats: bool = kwargs.get("add_authorizations_to_cr_cats", True)
|
|
613
|
+
if memos is None:
|
|
614
|
+
memos = [[] for _ in range(len(puzzle_hashes))]
|
|
615
|
+
|
|
616
|
+
if not (len(memos) == len(puzzle_hashes) == len(amounts)):
|
|
617
|
+
raise ValueError("Memos, puzzle_hashes, and amounts must have the same length") # pragma: no cover
|
|
618
|
+
|
|
619
|
+
payments = []
|
|
620
|
+
for amount, puzhash, memo_list in zip(amounts, puzzle_hashes, memos):
|
|
621
|
+
memos_with_hint: list[bytes] = [puzhash]
|
|
622
|
+
memos_with_hint.extend(memo_list)
|
|
623
|
+
# Force wrap the outgoing coins in the pending state if not going to us
|
|
624
|
+
payments.append(
|
|
625
|
+
Payment(
|
|
626
|
+
(
|
|
627
|
+
construct_pending_approval_state(puzhash, amount).get_tree_hash()
|
|
628
|
+
if puzhash != Offer.ph()
|
|
629
|
+
and not await self.wallet_state_manager.puzzle_store.puzzle_hash_exists(puzhash)
|
|
630
|
+
else puzhash
|
|
631
|
+
),
|
|
632
|
+
amount,
|
|
633
|
+
memos_with_hint,
|
|
634
|
+
)
|
|
635
|
+
)
|
|
636
|
+
|
|
637
|
+
spend_bundle = await self._generate_unsigned_spendbundle(
|
|
638
|
+
payments,
|
|
639
|
+
action_scope,
|
|
640
|
+
fee,
|
|
641
|
+
cat_discrepancy=cat_discrepancy, # (extra_delta, tail_reveal, tail_solution)
|
|
642
|
+
coins=coins,
|
|
643
|
+
extra_conditions=extra_conditions,
|
|
644
|
+
add_authorizations_to_cr_cats=add_authorizations_to_cr_cats,
|
|
645
|
+
)
|
|
646
|
+
|
|
647
|
+
async with action_scope.use() as interface:
|
|
648
|
+
other_tx_removals: set[Coin] = {
|
|
649
|
+
removal for tx in interface.side_effects.transactions for removal in tx.removals
|
|
650
|
+
}
|
|
651
|
+
other_tx_additions: set[Coin] = {
|
|
652
|
+
addition for tx in interface.side_effects.transactions for addition in tx.additions
|
|
653
|
+
}
|
|
654
|
+
tx_list = [
|
|
655
|
+
TransactionRecord(
|
|
656
|
+
confirmed_at_height=uint32(0),
|
|
657
|
+
created_at_time=uint64(int(time.time())),
|
|
658
|
+
to_puzzle_hash=payment.puzzle_hash,
|
|
659
|
+
amount=payment.amount,
|
|
660
|
+
fee_amount=fee,
|
|
661
|
+
confirmed=False,
|
|
662
|
+
sent=uint32(0),
|
|
663
|
+
spend_bundle=spend_bundle if i == 0 else None,
|
|
664
|
+
additions=list(set(spend_bundle.additions()) - other_tx_additions) if i == 0 else [],
|
|
665
|
+
removals=list(set(spend_bundle.removals()) - other_tx_removals) if i == 0 else [],
|
|
666
|
+
wallet_id=self.id(),
|
|
667
|
+
sent_to=[],
|
|
668
|
+
trade_id=None,
|
|
669
|
+
type=uint32(TransactionType.OUTGOING_TX.value),
|
|
670
|
+
name=spend_bundle.name() if i == 0 else payment.as_condition().get_tree_hash(),
|
|
671
|
+
memos=list(compute_memos(spend_bundle).items()),
|
|
672
|
+
valid_times=parse_timelock_info(extra_conditions),
|
|
673
|
+
)
|
|
674
|
+
for i, payment in enumerate(payments)
|
|
675
|
+
]
|
|
676
|
+
|
|
677
|
+
interface.side_effects.transactions.extend(tx_list)
|
|
678
|
+
|
|
679
|
+
async def claim_pending_approval_balance(
|
|
680
|
+
self,
|
|
681
|
+
min_amount_to_claim: uint64,
|
|
682
|
+
action_scope: WalletActionScope,
|
|
683
|
+
fee: uint64 = uint64(0),
|
|
684
|
+
coins: Optional[set[Coin]] = None,
|
|
685
|
+
min_coin_amount: Optional[uint64] = None,
|
|
686
|
+
max_coin_amount: Optional[uint64] = None,
|
|
687
|
+
excluded_coin_amounts: Optional[list[uint64]] = None,
|
|
688
|
+
reuse_puzhash: Optional[bool] = None,
|
|
689
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
690
|
+
) -> None:
|
|
691
|
+
# Select the relevant CR-CAT coins
|
|
692
|
+
crcat_records: set[WalletCoinRecord] = await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(
|
|
693
|
+
self.id(), CoinType.CRCAT_PENDING
|
|
694
|
+
)
|
|
695
|
+
if coins is None:
|
|
696
|
+
if max_coin_amount is None:
|
|
697
|
+
max_coin_amount = uint64(self.wallet_state_manager.constants.MAX_COIN_AMOUNT)
|
|
698
|
+
coins = await select_coins(
|
|
699
|
+
await self.get_pending_approval_balance(),
|
|
700
|
+
action_scope.config.tx_config.coin_selection_config,
|
|
701
|
+
list(crcat_records),
|
|
702
|
+
{},
|
|
703
|
+
self.log,
|
|
704
|
+
uint128(min_amount_to_claim),
|
|
705
|
+
)
|
|
706
|
+
|
|
707
|
+
# Select the relevant XCH coins
|
|
708
|
+
if fee > 0:
|
|
709
|
+
chia_coins = await self.standard_wallet.select_coins(
|
|
710
|
+
fee,
|
|
711
|
+
action_scope,
|
|
712
|
+
)
|
|
713
|
+
else:
|
|
714
|
+
chia_coins = set()
|
|
715
|
+
|
|
716
|
+
# Select the relevant VC coin
|
|
717
|
+
vc_wallet: VCWallet = await self.wallet_state_manager.get_or_create_vc_wallet()
|
|
718
|
+
vc: Optional[VerifiedCredential] = await vc_wallet.get_vc_with_provider_in_and_proofs(
|
|
719
|
+
self.info.authorized_providers, self.info.proofs_checker.flags
|
|
720
|
+
)
|
|
721
|
+
if vc is None: # pragma: no cover
|
|
722
|
+
raise RuntimeError(f"No VC exists that can approve spends for CR-CAT wallet {self.id()}")
|
|
723
|
+
if vc.proof_hash is None:
|
|
724
|
+
raise RuntimeError(f"VC {vc.launcher_id} has no proofs to authorize transaction") # pragma: no cover
|
|
725
|
+
proof_of_inclusions: Program = await vc_wallet.proof_of_inclusions_for_root_and_keys(
|
|
726
|
+
vc.proof_hash, self.info.proofs_checker.flags
|
|
727
|
+
)
|
|
728
|
+
|
|
729
|
+
# Generate the bundle nonce
|
|
730
|
+
nonce: bytes32 = Program.to(
|
|
731
|
+
[coin_as_list(c) for c in sorted(coins.union(chia_coins).union({vc.coin}), key=Coin.name)]
|
|
732
|
+
).get_tree_hash()
|
|
733
|
+
|
|
734
|
+
# Make CR-CAT bundle
|
|
735
|
+
crcats_and_puzhashes: list[tuple[CRCAT, bytes32]] = [
|
|
736
|
+
(crcat, CRCATWallet.get_metadata_from_record(record).inner_puzzle_hash)
|
|
737
|
+
for record in [r for r in crcat_records if r.coin in coins]
|
|
738
|
+
for crcat in [self.coin_record_to_crcat(record)]
|
|
739
|
+
]
|
|
740
|
+
expected_announcements, coin_spends, _ = CRCAT.spend_many(
|
|
741
|
+
[
|
|
742
|
+
(
|
|
743
|
+
crcat,
|
|
744
|
+
0,
|
|
745
|
+
construct_pending_approval_state(inner_puzhash, uint64(crcat.coin.amount)),
|
|
746
|
+
Program.to([nonce]),
|
|
747
|
+
)
|
|
748
|
+
for crcat, inner_puzhash in crcats_and_puzhashes
|
|
749
|
+
],
|
|
750
|
+
proof_of_inclusions,
|
|
751
|
+
Program.to(None), # TODO: With more proofs checkers, this may need to be flexible. For now, it's hardcoded.
|
|
752
|
+
vc.proof_provider,
|
|
753
|
+
vc.launcher_id,
|
|
754
|
+
vc.wrap_inner_with_backdoor().get_tree_hash(),
|
|
755
|
+
)
|
|
756
|
+
claim_bundle = WalletSpendBundle(coin_spends, G2Element())
|
|
757
|
+
|
|
758
|
+
# Make the Fee TX
|
|
759
|
+
if fee > 0:
|
|
760
|
+
await self.create_tandem_xch_tx(
|
|
761
|
+
fee,
|
|
762
|
+
uint64(0),
|
|
763
|
+
action_scope,
|
|
764
|
+
extra_conditions=tuple(expected_announcements),
|
|
765
|
+
)
|
|
766
|
+
|
|
767
|
+
# Make the VC TX
|
|
768
|
+
await vc_wallet.generate_signed_transaction(
|
|
769
|
+
vc.launcher_id,
|
|
770
|
+
action_scope,
|
|
771
|
+
extra_conditions=(
|
|
772
|
+
*extra_conditions,
|
|
773
|
+
*expected_announcements,
|
|
774
|
+
CreateCoinAnnouncement(nonce),
|
|
775
|
+
*(CreatePuzzleAnnouncement(crcat.expected_announcement()) for crcat, _ in crcats_and_puzhashes),
|
|
776
|
+
),
|
|
777
|
+
)
|
|
778
|
+
|
|
779
|
+
async with action_scope.use() as interface:
|
|
780
|
+
other_additions: set[Coin] = {rem for tx in interface.side_effects.transactions for rem in tx.additions}
|
|
781
|
+
other_removals: set[Coin] = {rem for tx in interface.side_effects.transactions for rem in tx.removals}
|
|
782
|
+
interface.side_effects.transactions.append(
|
|
783
|
+
TransactionRecord(
|
|
784
|
+
confirmed_at_height=uint32(0),
|
|
785
|
+
created_at_time=uint64(int(time.time())),
|
|
786
|
+
to_puzzle_hash=await self.wallet_state_manager.main_wallet.get_puzzle_hash(False),
|
|
787
|
+
amount=uint64(sum(c.amount for c in coins)),
|
|
788
|
+
fee_amount=fee,
|
|
789
|
+
confirmed=False,
|
|
790
|
+
sent=uint32(0),
|
|
791
|
+
spend_bundle=claim_bundle,
|
|
792
|
+
additions=list(set(claim_bundle.additions()) - other_additions),
|
|
793
|
+
removals=list(set(claim_bundle.removals()) - other_removals),
|
|
794
|
+
wallet_id=self.id(),
|
|
795
|
+
sent_to=[],
|
|
796
|
+
trade_id=None,
|
|
797
|
+
type=uint32(TransactionType.INCOMING_TX.value),
|
|
798
|
+
name=claim_bundle.name(),
|
|
799
|
+
memos=list(compute_memos(claim_bundle).items()),
|
|
800
|
+
valid_times=parse_timelock_info(extra_conditions),
|
|
801
|
+
)
|
|
802
|
+
)
|
|
803
|
+
|
|
804
|
+
async def match_puzzle_info(self, puzzle_driver: PuzzleInfo) -> bool:
|
|
805
|
+
if (
|
|
806
|
+
AssetType(puzzle_driver.type()) == AssetType.CAT
|
|
807
|
+
and puzzle_driver["tail"] == self.info.limitations_program_hash
|
|
808
|
+
):
|
|
809
|
+
inner_puzzle_driver: Optional[PuzzleInfo] = puzzle_driver.also()
|
|
810
|
+
if inner_puzzle_driver is None:
|
|
811
|
+
raise ValueError("Malformed puzzle driver passed to CRCATWallet.match_puzzle_info") # pragma: no cover
|
|
812
|
+
return (
|
|
813
|
+
AssetType(inner_puzzle_driver.type()) == AssetType.CR
|
|
814
|
+
and [bytes32(provider) for provider in inner_puzzle_driver["authorized_providers"]]
|
|
815
|
+
== self.info.authorized_providers
|
|
816
|
+
and ProofsChecker.from_program(uncurry_puzzle(inner_puzzle_driver["proofs_checker"]))
|
|
817
|
+
== self.info.proofs_checker
|
|
818
|
+
)
|
|
819
|
+
return False
|
|
820
|
+
|
|
821
|
+
async def get_puzzle_info(self, asset_id: bytes32) -> PuzzleInfo:
|
|
822
|
+
return PuzzleInfo(
|
|
823
|
+
{
|
|
824
|
+
"type": AssetType.CAT.value,
|
|
825
|
+
"tail": "0x" + self.info.limitations_program_hash.hex(),
|
|
826
|
+
"also": {
|
|
827
|
+
"type": AssetType.CR.value,
|
|
828
|
+
"authorized_providers": ["0x" + provider.hex() for provider in self.info.authorized_providers],
|
|
829
|
+
"proofs_checker": self.info.proofs_checker.as_program(),
|
|
830
|
+
},
|
|
831
|
+
}
|
|
832
|
+
)
|
|
833
|
+
|
|
834
|
+
async def match_hinted_coin(self, coin: Coin, hint: bytes32) -> bool:
|
|
835
|
+
"""
|
|
836
|
+
This matches coins that are either CRCATs with the hint as the inner puzzle, or CRCATs in the pending approval
|
|
837
|
+
state that will come to us once claimed.
|
|
838
|
+
"""
|
|
839
|
+
authorized_providers_hash: bytes32 = Program.to(self.info.authorized_providers).get_tree_hash()
|
|
840
|
+
proofs_checker_hash: bytes32 = self.info.proofs_checker.as_program().get_tree_hash()
|
|
841
|
+
hint_inner_hash: bytes32 = construct_cr_layer_hash(
|
|
842
|
+
authorized_providers_hash,
|
|
843
|
+
proofs_checker_hash,
|
|
844
|
+
hint,
|
|
845
|
+
)
|
|
846
|
+
if (
|
|
847
|
+
construct_cat_puzzle(
|
|
848
|
+
Program.to(CAT_MOD_HASH),
|
|
849
|
+
self.info.limitations_program_hash,
|
|
850
|
+
hint_inner_hash,
|
|
851
|
+
mod_code_hash=CAT_MOD_HASH_HASH,
|
|
852
|
+
).get_tree_hash_precalc(hint, CAT_MOD_HASH, CAT_MOD_HASH_HASH, hint_inner_hash)
|
|
853
|
+
== coin.puzzle_hash
|
|
854
|
+
):
|
|
855
|
+
return True
|
|
856
|
+
|
|
857
|
+
pending_approval_inner_hash: bytes32 = construct_cr_layer_hash(
|
|
858
|
+
authorized_providers_hash,
|
|
859
|
+
proofs_checker_hash,
|
|
860
|
+
construct_pending_approval_state(hint, uint64(coin.amount)).get_tree_hash(),
|
|
861
|
+
)
|
|
862
|
+
if (
|
|
863
|
+
construct_cat_puzzle(
|
|
864
|
+
Program.to(CAT_MOD_HASH),
|
|
865
|
+
self.info.limitations_program_hash,
|
|
866
|
+
pending_approval_inner_hash,
|
|
867
|
+
mod_code_hash=CAT_MOD_HASH_HASH,
|
|
868
|
+
).get_tree_hash_precalc(CAT_MOD_HASH, CAT_MOD_HASH_HASH, pending_approval_inner_hash)
|
|
869
|
+
== coin.puzzle_hash
|
|
870
|
+
):
|
|
871
|
+
return True
|
|
872
|
+
else:
|
|
873
|
+
return False
|
|
874
|
+
|
|
875
|
+
|
|
876
|
+
if TYPE_CHECKING:
|
|
877
|
+
_dummy: WalletProtocol[CATCoinData] = CRCATWallet()
|