chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__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/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc1.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import functools
|
|
4
|
+
from collections.abc import Iterable
|
|
4
5
|
from dataclasses import dataclass, replace
|
|
5
6
|
from enum import IntEnum
|
|
6
|
-
from typing import
|
|
7
|
+
from typing import Optional, TypeVar
|
|
7
8
|
|
|
8
9
|
from clvm.casts import int_to_bytes
|
|
9
10
|
|
|
@@ -94,7 +95,7 @@ CREDENTIAL_STRUCT_HASH: bytes32 = CREDENTIAL_STRUCT.get_tree_hash()
|
|
|
94
95
|
|
|
95
96
|
# Basic drivers
|
|
96
97
|
def construct_cr_layer(
|
|
97
|
-
authorized_providers:
|
|
98
|
+
authorized_providers: list[bytes32],
|
|
98
99
|
proofs_checker: Program,
|
|
99
100
|
inner_puzzle: Program,
|
|
100
101
|
) -> Program:
|
|
@@ -128,7 +129,7 @@ def construct_cr_layer_hash(
|
|
|
128
129
|
|
|
129
130
|
def match_cr_layer(
|
|
130
131
|
uncurried_puzzle: UncurriedPuzzle,
|
|
131
|
-
) -> Optional[
|
|
132
|
+
) -> Optional[tuple[list[bytes32], Program, Program]]:
|
|
132
133
|
extra_uncurried_puzzle = uncurry_puzzle(uncurried_puzzle.mod)
|
|
133
134
|
if extra_uncurried_puzzle.mod == CREDENTIAL_RESTRICTION:
|
|
134
135
|
return (
|
|
@@ -176,24 +177,24 @@ class CRCAT:
|
|
|
176
177
|
coin: Coin
|
|
177
178
|
tail_hash: bytes32
|
|
178
179
|
lineage_proof: LineageProof
|
|
179
|
-
authorized_providers:
|
|
180
|
+
authorized_providers: list[bytes32]
|
|
180
181
|
proofs_checker: Program
|
|
181
182
|
inner_puzzle_hash: bytes32
|
|
182
183
|
|
|
183
184
|
@classmethod
|
|
184
185
|
def launch(
|
|
185
|
-
cls:
|
|
186
|
+
cls: type[_T_CRCAT],
|
|
186
187
|
# General CAT launching info
|
|
187
188
|
origin_coin: Coin,
|
|
188
189
|
payment: Payment,
|
|
189
190
|
tail: Program,
|
|
190
191
|
tail_solution: Program,
|
|
191
192
|
# CR Layer params
|
|
192
|
-
authorized_providers:
|
|
193
|
+
authorized_providers: list[bytes32],
|
|
193
194
|
proofs_checker: Program,
|
|
194
195
|
# Probably never need this but some tail might
|
|
195
196
|
optional_lineage_proof: Optional[LineageProof] = None,
|
|
196
|
-
) ->
|
|
197
|
+
) -> tuple[Program, CoinSpend, CRCAT]:
|
|
197
198
|
"""
|
|
198
199
|
Launch a new CR-CAT from XCH.
|
|
199
200
|
|
|
@@ -288,7 +289,7 @@ class CRCAT:
|
|
|
288
289
|
)
|
|
289
290
|
|
|
290
291
|
@staticmethod
|
|
291
|
-
def is_cr_cat(puzzle_reveal: UncurriedPuzzle) ->
|
|
292
|
+
def is_cr_cat(puzzle_reveal: UncurriedPuzzle) -> tuple[bool, str]:
|
|
292
293
|
"""
|
|
293
294
|
This takes an (uncurried) puzzle reveal and returns a boolean for whether the puzzle is a CR-CAT and an error
|
|
294
295
|
message for if the puzzle is a mismatch.
|
|
@@ -310,7 +311,7 @@ class CRCAT:
|
|
|
310
311
|
return solution.at("f").at("rrrrrrf")
|
|
311
312
|
|
|
312
313
|
@classmethod
|
|
313
|
-
def get_current_from_coin_spend(cls:
|
|
314
|
+
def get_current_from_coin_spend(cls: type[_T_CRCAT], spend: CoinSpend) -> CRCAT: # pragma: no cover
|
|
314
315
|
uncurried_puzzle: UncurriedPuzzle = uncurry_puzzle(spend.puzzle_reveal)
|
|
315
316
|
first_uncurried_cr_layer: UncurriedPuzzle = uncurry_puzzle(uncurried_puzzle.args.at("rrf"))
|
|
316
317
|
second_uncurried_cr_layer: UncurriedPuzzle = uncurry_puzzle(first_uncurried_cr_layer.mod)
|
|
@@ -329,10 +330,10 @@ class CRCAT:
|
|
|
329
330
|
|
|
330
331
|
@classmethod
|
|
331
332
|
def get_next_from_coin_spend(
|
|
332
|
-
cls:
|
|
333
|
+
cls: type[_T_CRCAT],
|
|
333
334
|
parent_spend: CoinSpend,
|
|
334
335
|
conditions: Optional[Program] = None, # For optimization purposes, the conditions may already have been run
|
|
335
|
-
) ->
|
|
336
|
+
) -> list[CRCAT]:
|
|
336
337
|
"""
|
|
337
338
|
Given a coin spend, this will return the next CR-CATs that were created as an output of that spend.
|
|
338
339
|
Inner puzzle output conditions may also be supplied as an optimization.
|
|
@@ -388,12 +389,12 @@ class CRCAT:
|
|
|
388
389
|
uint64(parent_spend.coin.amount),
|
|
389
390
|
)
|
|
390
391
|
|
|
391
|
-
all_conditions:
|
|
392
|
+
all_conditions: list[Program] = list(conditions.as_iter())
|
|
392
393
|
if len(all_conditions) > 1000:
|
|
393
394
|
raise RuntimeError("More than 1000 conditions not currently supported by CRCAT drivers") # pragma: no cover
|
|
394
395
|
|
|
395
396
|
# Almost complete except the coin's full puzzle hash which we want to use the class method to calculate
|
|
396
|
-
partially_completed_crcats:
|
|
397
|
+
partially_completed_crcats: list[CRCAT] = [
|
|
397
398
|
CRCAT(
|
|
398
399
|
Coin(coin_name, bytes(32), uint64(condition.at("rrf").as_int())),
|
|
399
400
|
bytes32(tail_hash_as_prog.as_atom()),
|
|
@@ -438,7 +439,7 @@ class CRCAT:
|
|
|
438
439
|
inner_solution: Program,
|
|
439
440
|
# For optimization purposes the conditions may already have been run
|
|
440
441
|
conditions: Optional[Iterable[Program]] = None,
|
|
441
|
-
) ->
|
|
442
|
+
) -> tuple[list[AssertCoinAnnouncement], CoinSpend, list[CRCAT]]:
|
|
442
443
|
"""
|
|
443
444
|
Spend a CR-CAT.
|
|
444
445
|
|
|
@@ -449,8 +450,8 @@ class CRCAT:
|
|
|
449
450
|
Likely, spend_many is more useful.
|
|
450
451
|
"""
|
|
451
452
|
# Gather the output information
|
|
452
|
-
announcements:
|
|
453
|
-
new_inner_puzzle_hashes_and_amounts:
|
|
453
|
+
announcements: list[AssertCoinAnnouncement] = []
|
|
454
|
+
new_inner_puzzle_hashes_and_amounts: list[tuple[bytes32, uint64]] = []
|
|
454
455
|
if conditions is None:
|
|
455
456
|
conditions = inner_puzzle.run(inner_solution).as_iter() # pragma: no cover
|
|
456
457
|
assert conditions is not None
|
|
@@ -518,15 +519,15 @@ class CRCAT:
|
|
|
518
519
|
|
|
519
520
|
@classmethod
|
|
520
521
|
def spend_many(
|
|
521
|
-
cls:
|
|
522
|
-
inner_spends:
|
|
522
|
+
cls: type[_T_CRCAT],
|
|
523
|
+
inner_spends: list[tuple[_T_CRCAT, int, Program, Program]], # CRCAT, extra_delta, inner puzzle, inner solution
|
|
523
524
|
# CR layer solving info
|
|
524
525
|
proof_of_inclusions: Program,
|
|
525
526
|
proof_checker_solution: Program,
|
|
526
527
|
provider_id: bytes32,
|
|
527
528
|
vc_launcher_id: bytes32,
|
|
528
529
|
vc_inner_puzhash: Optional[bytes32], # Optional for incomplete spends
|
|
529
|
-
) ->
|
|
530
|
+
) -> tuple[list[AssertCoinAnnouncement], list[CoinSpend], list[CRCAT]]:
|
|
530
531
|
"""
|
|
531
532
|
Spend a multiple CR-CATs.
|
|
532
533
|
|
|
@@ -541,19 +542,19 @@ class CRCAT:
|
|
|
541
542
|
def prev_index(index: int) -> int:
|
|
542
543
|
return index - 1
|
|
543
544
|
|
|
544
|
-
sorted_inner_spends:
|
|
545
|
+
sorted_inner_spends: list[tuple[_T_CRCAT, int, Program, Program]] = sorted(
|
|
545
546
|
inner_spends,
|
|
546
547
|
key=lambda spend: spend[0].coin.name(),
|
|
547
548
|
)
|
|
548
549
|
|
|
549
|
-
all_expected_announcements:
|
|
550
|
-
all_coin_spends:
|
|
551
|
-
all_new_crcats:
|
|
550
|
+
all_expected_announcements: list[AssertCoinAnnouncement] = []
|
|
551
|
+
all_coin_spends: list[CoinSpend] = []
|
|
552
|
+
all_new_crcats: list[CRCAT] = []
|
|
552
553
|
|
|
553
554
|
subtotal: int = 0
|
|
554
555
|
for i, inner_spend in enumerate(sorted_inner_spends):
|
|
555
556
|
crcat, extra_delta, inner_puzzle, inner_solution = inner_spend
|
|
556
|
-
conditions:
|
|
557
|
+
conditions: list[Program] = list(inner_puzzle.run(inner_solution).as_iter())
|
|
557
558
|
output_amount: int = (
|
|
558
559
|
sum(
|
|
559
560
|
c.at("rrf").as_int()
|
|
@@ -604,9 +605,9 @@ class CRCATSpend:
|
|
|
604
605
|
crcat: CRCAT
|
|
605
606
|
inner_puzzle: Program
|
|
606
607
|
inner_solution: Program
|
|
607
|
-
children:
|
|
608
|
+
children: list[CRCAT]
|
|
608
609
|
incomplete: bool
|
|
609
|
-
inner_conditions:
|
|
610
|
+
inner_conditions: list[Program]
|
|
610
611
|
proof_of_inclusions: Program
|
|
611
612
|
|
|
612
613
|
@classmethod
|
|
@@ -628,7 +629,7 @@ class CRCATSpend:
|
|
|
628
629
|
@streamable
|
|
629
630
|
@dataclass(frozen=True)
|
|
630
631
|
class ProofsChecker(Streamable):
|
|
631
|
-
flags:
|
|
632
|
+
flags: list[str]
|
|
632
633
|
|
|
633
634
|
def as_program(self) -> Program:
|
|
634
635
|
def byte_sort_flags(f1: str, f2: str) -> int:
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import logging
|
|
4
4
|
import time
|
|
5
5
|
import traceback
|
|
6
|
-
from typing import TYPE_CHECKING, Any,
|
|
6
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
7
7
|
|
|
8
8
|
from chia_rs import G1Element, G2Element
|
|
9
9
|
from typing_extensions import Unpack
|
|
@@ -82,7 +82,7 @@ class CRCATWallet(CATWallet):
|
|
|
82
82
|
async def create_new_cat_wallet(
|
|
83
83
|
wallet_state_manager: WalletStateManager,
|
|
84
84
|
wallet: Wallet,
|
|
85
|
-
cat_tail_info:
|
|
85
|
+
cat_tail_info: dict[str, Any],
|
|
86
86
|
amount: uint64,
|
|
87
87
|
action_scope: WalletActionScope,
|
|
88
88
|
fee: uint64 = uint64(0),
|
|
@@ -97,7 +97,7 @@ class CRCATWallet(CATWallet):
|
|
|
97
97
|
wallet: Wallet,
|
|
98
98
|
limitations_program_hash_hex: str,
|
|
99
99
|
name: Optional[str] = None,
|
|
100
|
-
authorized_providers: Optional[
|
|
100
|
+
authorized_providers: Optional[list[bytes32]] = None,
|
|
101
101
|
proofs_checker: Optional[ProofsChecker] = None,
|
|
102
102
|
) -> CRCATWallet:
|
|
103
103
|
if authorized_providers is None or proofs_checker is None: # pragma: no cover
|
|
@@ -134,7 +134,7 @@ class CRCATWallet(CATWallet):
|
|
|
134
134
|
puzzle_driver: PuzzleInfo,
|
|
135
135
|
name: Optional[str] = None,
|
|
136
136
|
# We're hinting this as Any for mypy by should explore adding this to the wallet protocol and hinting properly
|
|
137
|
-
potential_subclasses:
|
|
137
|
+
potential_subclasses: dict[AssetType, Any] = {},
|
|
138
138
|
) -> Any:
|
|
139
139
|
cr_layer: Optional[PuzzleInfo] = puzzle_driver.also()
|
|
140
140
|
if cr_layer is None: # pragma: no cover
|
|
@@ -167,7 +167,7 @@ class CRCATWallet(CATWallet):
|
|
|
167
167
|
async def convert_to_cr(
|
|
168
168
|
cls,
|
|
169
169
|
cat_wallet: CATWallet,
|
|
170
|
-
authorized_providers:
|
|
170
|
+
authorized_providers: list[bytes32],
|
|
171
171
|
proofs_checker: ProofsChecker,
|
|
172
172
|
) -> None:
|
|
173
173
|
replace_self = cls()
|
|
@@ -216,13 +216,13 @@ class CRCATWallet(CATWallet):
|
|
|
216
216
|
|
|
217
217
|
async def add_crcat_coin(self, coin_spend: CoinSpend, coin: Coin, height: uint32) -> None:
|
|
218
218
|
try:
|
|
219
|
-
new_cr_cats:
|
|
219
|
+
new_cr_cats: list[CRCAT] = CRCAT.get_next_from_coin_spend(coin_spend)
|
|
220
220
|
hint_dict = {
|
|
221
221
|
id: hc.hint
|
|
222
222
|
for id, hc in compute_spend_hints_and_additions(coin_spend)[0].items()
|
|
223
223
|
if hc.hint is not None
|
|
224
224
|
}
|
|
225
|
-
cr_cat: CRCAT =
|
|
225
|
+
cr_cat: CRCAT = next(filter(lambda c: c.coin.name() == coin.name(), new_cr_cats))
|
|
226
226
|
if (
|
|
227
227
|
await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(
|
|
228
228
|
cr_cat.inner_puzzle_hash
|
|
@@ -316,10 +316,10 @@ class CRCATWallet(CATWallet):
|
|
|
316
316
|
"inner_puzzle_for_cat_puzhash is a legacy method and is not available on CR-CAT wallets"
|
|
317
317
|
)
|
|
318
318
|
|
|
319
|
-
async def get_cat_spendable_coins(self, records: Optional[
|
|
320
|
-
result:
|
|
319
|
+
async def get_cat_spendable_coins(self, records: Optional[set[WalletCoinRecord]] = None) -> list[WalletCoinRecord]:
|
|
320
|
+
result: list[WalletCoinRecord] = []
|
|
321
321
|
|
|
322
|
-
record_list:
|
|
322
|
+
record_list: set[WalletCoinRecord] = await self.wallet_state_manager.get_spendable_coins_for_wallet(
|
|
323
323
|
self.id(), records
|
|
324
324
|
)
|
|
325
325
|
|
|
@@ -330,7 +330,7 @@ class CRCATWallet(CATWallet):
|
|
|
330
330
|
|
|
331
331
|
return result
|
|
332
332
|
|
|
333
|
-
async def get_confirmed_balance(self, record_list: Optional[
|
|
333
|
+
async def get_confirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
334
334
|
if record_list is None:
|
|
335
335
|
record_list = await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(
|
|
336
336
|
self.id(), CoinType.CRCAT
|
|
@@ -344,7 +344,7 @@ class CRCATWallet(CATWallet):
|
|
|
344
344
|
self.log.info(f"Confirmed balance for cat wallet {self.id()} is {amount}")
|
|
345
345
|
return uint128(amount)
|
|
346
346
|
|
|
347
|
-
async def get_pending_approval_balance(self, record_list: Optional[
|
|
347
|
+
async def get_pending_approval_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
348
348
|
if record_list is None:
|
|
349
349
|
record_list = await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(
|
|
350
350
|
self.id(), CoinType.CRCAT_PENDING
|
|
@@ -397,12 +397,12 @@ class CRCATWallet(CATWallet):
|
|
|
397
397
|
|
|
398
398
|
async def _generate_unsigned_spendbundle(
|
|
399
399
|
self,
|
|
400
|
-
payments:
|
|
400
|
+
payments: list[Payment],
|
|
401
401
|
action_scope: WalletActionScope,
|
|
402
402
|
fee: uint64 = uint64(0),
|
|
403
|
-
cat_discrepancy: Optional[
|
|
404
|
-
coins: Optional[
|
|
405
|
-
extra_conditions:
|
|
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
406
|
add_authorizations_to_cr_cats: bool = True,
|
|
407
407
|
) -> WalletSpendBundle:
|
|
408
408
|
if cat_discrepancy is not None:
|
|
@@ -438,12 +438,14 @@ class CRCATWallet(CATWallet):
|
|
|
438
438
|
|
|
439
439
|
# Calculate standard puzzle solutions
|
|
440
440
|
change = selected_cat_amount - starting_amount
|
|
441
|
-
primaries:
|
|
441
|
+
primaries: list[Payment] = []
|
|
442
442
|
for payment in payments:
|
|
443
443
|
primaries.append(payment)
|
|
444
444
|
|
|
445
445
|
if change > 0:
|
|
446
|
-
origin_crcat_record = await self.wallet_state_manager.coin_store.get_coin_record(
|
|
446
|
+
origin_crcat_record = await self.wallet_state_manager.coin_store.get_coin_record(
|
|
447
|
+
next(iter(cat_coins)).name()
|
|
448
|
+
)
|
|
447
449
|
if origin_crcat_record is None:
|
|
448
450
|
raise RuntimeError("A CR-CAT coin was selected that we don't have a record for") # pragma: no cover
|
|
449
451
|
origin_crcat = self.coin_record_to_crcat(origin_crcat_record)
|
|
@@ -456,10 +458,10 @@ class CRCATWallet(CATWallet):
|
|
|
456
458
|
for payment in payments:
|
|
457
459
|
if change_puzhash == payment.puzzle_hash and change == payment.amount:
|
|
458
460
|
# We cannot create two coins has same id, create a new puzhash for the change
|
|
459
|
-
change_puzhash = await self.
|
|
461
|
+
change_puzhash = await self.standard_wallet.get_puzzle_hash(new=True)
|
|
460
462
|
break
|
|
461
463
|
else:
|
|
462
|
-
change_puzhash = await self.
|
|
464
|
+
change_puzhash = await self.standard_wallet.get_puzzle_hash(new=True)
|
|
463
465
|
primaries.append(Payment(change_puzhash, uint64(change), [change_puzhash]))
|
|
464
466
|
|
|
465
467
|
# Find the VC Wallet
|
|
@@ -474,12 +476,12 @@ class CRCATWallet(CATWallet):
|
|
|
474
476
|
|
|
475
477
|
# Loop through the coins we've selected and gather the information we need to spend them
|
|
476
478
|
vc: Optional[VerifiedCredential] = None
|
|
477
|
-
vc_announcements_to_make:
|
|
478
|
-
inner_spends:
|
|
479
|
+
vc_announcements_to_make: list[bytes] = []
|
|
480
|
+
inner_spends: list[tuple[CRCAT, int, Program, Program]] = []
|
|
479
481
|
first = True
|
|
480
482
|
announcement: CreateCoinAnnouncement
|
|
481
|
-
coin_ids:
|
|
482
|
-
coin_records:
|
|
483
|
+
coin_ids: list[bytes32] = [coin.name() for coin in cat_coins]
|
|
484
|
+
coin_records: list[WalletCoinRecord] = (
|
|
483
485
|
await self.wallet_state_manager.coin_store.get_coin_records(coin_id_filter=HashFilter.include(coin_ids))
|
|
484
486
|
).records
|
|
485
487
|
assert len(coin_records) == len(cat_coins)
|
|
@@ -596,17 +598,17 @@ class CRCATWallet(CATWallet):
|
|
|
596
598
|
|
|
597
599
|
async def generate_signed_transaction(
|
|
598
600
|
self,
|
|
599
|
-
amounts:
|
|
600
|
-
puzzle_hashes:
|
|
601
|
+
amounts: list[uint64],
|
|
602
|
+
puzzle_hashes: list[bytes32],
|
|
601
603
|
action_scope: WalletActionScope,
|
|
602
604
|
fee: uint64 = uint64(0),
|
|
603
|
-
coins: Optional[
|
|
604
|
-
memos: Optional[
|
|
605
|
-
extra_conditions:
|
|
605
|
+
coins: Optional[set[Coin]] = None,
|
|
606
|
+
memos: Optional[list[list[bytes]]] = None,
|
|
607
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
606
608
|
**kwargs: Unpack[GSTOptionalArgs],
|
|
607
609
|
) -> None:
|
|
608
610
|
# (extra_delta, tail_reveal, tail_solution)
|
|
609
|
-
cat_discrepancy: Optional[
|
|
611
|
+
cat_discrepancy: Optional[tuple[int, Program, Program]] = kwargs.get("cat_discrepancy", None)
|
|
610
612
|
add_authorizations_to_cr_cats: bool = kwargs.get("add_authorizations_to_cr_cats", True)
|
|
611
613
|
if memos is None:
|
|
612
614
|
memos = [[] for _ in range(len(puzzle_hashes))]
|
|
@@ -616,7 +618,7 @@ class CRCATWallet(CATWallet):
|
|
|
616
618
|
|
|
617
619
|
payments = []
|
|
618
620
|
for amount, puzhash, memo_list in zip(amounts, puzzle_hashes, memos):
|
|
619
|
-
memos_with_hint:
|
|
621
|
+
memos_with_hint: list[bytes] = [puzhash]
|
|
620
622
|
memos_with_hint.extend(memo_list)
|
|
621
623
|
# Force wrap the outgoing coins in the pending state if not going to us
|
|
622
624
|
payments.append(
|
|
@@ -643,10 +645,10 @@ class CRCATWallet(CATWallet):
|
|
|
643
645
|
)
|
|
644
646
|
|
|
645
647
|
async with action_scope.use() as interface:
|
|
646
|
-
other_tx_removals:
|
|
648
|
+
other_tx_removals: set[Coin] = {
|
|
647
649
|
removal for tx in interface.side_effects.transactions for removal in tx.removals
|
|
648
650
|
}
|
|
649
|
-
other_tx_additions:
|
|
651
|
+
other_tx_additions: set[Coin] = {
|
|
650
652
|
addition for tx in interface.side_effects.transactions for addition in tx.additions
|
|
651
653
|
}
|
|
652
654
|
tx_list = [
|
|
@@ -679,15 +681,15 @@ class CRCATWallet(CATWallet):
|
|
|
679
681
|
min_amount_to_claim: uint64,
|
|
680
682
|
action_scope: WalletActionScope,
|
|
681
683
|
fee: uint64 = uint64(0),
|
|
682
|
-
coins: Optional[
|
|
684
|
+
coins: Optional[set[Coin]] = None,
|
|
683
685
|
min_coin_amount: Optional[uint64] = None,
|
|
684
686
|
max_coin_amount: Optional[uint64] = None,
|
|
685
|
-
excluded_coin_amounts: Optional[
|
|
687
|
+
excluded_coin_amounts: Optional[list[uint64]] = None,
|
|
686
688
|
reuse_puzhash: Optional[bool] = None,
|
|
687
|
-
extra_conditions:
|
|
689
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
688
690
|
) -> None:
|
|
689
691
|
# Select the relevant CR-CAT coins
|
|
690
|
-
crcat_records:
|
|
692
|
+
crcat_records: set[WalletCoinRecord] = await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(
|
|
691
693
|
self.id(), CoinType.CRCAT_PENDING
|
|
692
694
|
)
|
|
693
695
|
if coins is None:
|
|
@@ -730,7 +732,7 @@ class CRCATWallet(CATWallet):
|
|
|
730
732
|
).get_tree_hash()
|
|
731
733
|
|
|
732
734
|
# Make CR-CAT bundle
|
|
733
|
-
crcats_and_puzhashes:
|
|
735
|
+
crcats_and_puzhashes: list[tuple[CRCAT, bytes32]] = [
|
|
734
736
|
(crcat, CRCATWallet.get_metadata_from_record(record).inner_puzzle_hash)
|
|
735
737
|
for record in [r for r in crcat_records if r.coin in coins]
|
|
736
738
|
for crcat in [self.coin_record_to_crcat(record)]
|
|
@@ -775,8 +777,8 @@ class CRCATWallet(CATWallet):
|
|
|
775
777
|
)
|
|
776
778
|
|
|
777
779
|
async with action_scope.use() as interface:
|
|
778
|
-
other_additions:
|
|
779
|
-
other_removals:
|
|
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}
|
|
780
782
|
interface.side_effects.transactions.append(
|
|
781
783
|
TransactionRecord(
|
|
782
784
|
confirmed_at_height=uint32(0),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Any, Callable,
|
|
4
|
+
from typing import Any, Callable, Optional
|
|
5
5
|
|
|
6
6
|
from clvm_tools.binutils import disassemble
|
|
7
7
|
|
|
@@ -23,11 +23,11 @@ class CROuterPuzzle:
|
|
|
23
23
|
_get_inner_solution: Callable[[PuzzleInfo, Program], Optional[Program]]
|
|
24
24
|
|
|
25
25
|
def match(self, puzzle: UncurriedPuzzle) -> Optional[PuzzleInfo]:
|
|
26
|
-
args: Optional[
|
|
26
|
+
args: Optional[tuple[list[bytes32], Program, Program]] = match_cr_layer(puzzle)
|
|
27
27
|
if args is None:
|
|
28
28
|
return None
|
|
29
29
|
authorized_providers, proofs_checker, inner_puzzle = args
|
|
30
|
-
constructor_dict:
|
|
30
|
+
constructor_dict: dict[str, Any] = {
|
|
31
31
|
"type": "credential restricted",
|
|
32
32
|
"authorized_providers": ["0x" + ap.hex() for ap in authorized_providers],
|
|
33
33
|
"proofs_checker": disassemble(proofs_checker),
|
|
@@ -38,7 +38,7 @@ class CROuterPuzzle:
|
|
|
38
38
|
return PuzzleInfo(constructor_dict)
|
|
39
39
|
|
|
40
40
|
def get_inner_puzzle(self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle) -> Optional[Program]:
|
|
41
|
-
args: Optional[
|
|
41
|
+
args: Optional[tuple[list[bytes32], Program, Program]] = match_cr_layer(puzzle_reveal)
|
|
42
42
|
if args is None:
|
|
43
43
|
raise ValueError("This driver is not for the specified puzzle reveal") # pragma: no cover
|
|
44
44
|
_, _, inner_puzzle = args
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass, replace
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Optional, TypeVar
|
|
5
5
|
|
|
6
6
|
from chia.types.blockchain_format.coin import Coin
|
|
7
7
|
from chia.types.blockchain_format.program import Program
|
|
@@ -103,7 +103,7 @@ def create_covenant_layer(initial_puzzle_hash: bytes32, parent_morpher: Program,
|
|
|
103
103
|
)
|
|
104
104
|
|
|
105
105
|
|
|
106
|
-
def match_covenant_layer(uncurried_puzzle: UncurriedPuzzle) -> Optional[
|
|
106
|
+
def match_covenant_layer(uncurried_puzzle: UncurriedPuzzle) -> Optional[tuple[bytes32, Program, Program]]:
|
|
107
107
|
if uncurried_puzzle.mod == COVENANT_LAYER:
|
|
108
108
|
return (
|
|
109
109
|
bytes32(uncurried_puzzle.args.at("f").as_atom()),
|
|
@@ -166,7 +166,7 @@ def create_did_tp(
|
|
|
166
166
|
EML_DID_TP_FULL_HASH = create_did_tp().get_tree_hash()
|
|
167
167
|
|
|
168
168
|
|
|
169
|
-
def match_did_tp(uncurried_puzzle: UncurriedPuzzle) -> Optional[
|
|
169
|
+
def match_did_tp(uncurried_puzzle: UncurriedPuzzle) -> Optional[tuple[()]]:
|
|
170
170
|
if uncurried_puzzle.mod == EML_DID_TP:
|
|
171
171
|
return ()
|
|
172
172
|
else:
|
|
@@ -198,7 +198,7 @@ def create_viral_backdoor(hidden_puzzle_hash: bytes32, inner_puzzle_hash: bytes3
|
|
|
198
198
|
)
|
|
199
199
|
|
|
200
200
|
|
|
201
|
-
def match_viral_backdoor(uncurried_puzzle: UncurriedPuzzle) -> Optional[
|
|
201
|
+
def match_viral_backdoor(uncurried_puzzle: UncurriedPuzzle) -> Optional[tuple[bytes32, bytes32]]:
|
|
202
202
|
if uncurried_puzzle.mod == VIRAL_BACKDOOR:
|
|
203
203
|
return bytes32(uncurried_puzzle.args.at("rf").as_atom()), bytes32(uncurried_puzzle.args.at("rrf").as_atom())
|
|
204
204
|
else:
|
|
@@ -328,14 +328,14 @@ class VerifiedCredential(Streamable):
|
|
|
328
328
|
|
|
329
329
|
@classmethod
|
|
330
330
|
def launch(
|
|
331
|
-
cls:
|
|
332
|
-
origin_coins:
|
|
331
|
+
cls: type[_T_VerifiedCredential],
|
|
332
|
+
origin_coins: list[Coin],
|
|
333
333
|
provider_id: bytes32,
|
|
334
334
|
new_inner_puzzle_hash: bytes32,
|
|
335
|
-
memos:
|
|
335
|
+
memos: list[bytes32],
|
|
336
336
|
fee: uint64 = uint64(0),
|
|
337
|
-
extra_conditions:
|
|
338
|
-
) ->
|
|
337
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
338
|
+
) -> tuple[list[Program], list[CoinSpend], _T_VerifiedCredential]:
|
|
339
339
|
"""
|
|
340
340
|
Launch a VC.
|
|
341
341
|
|
|
@@ -414,7 +414,7 @@ class VerifiedCredential(Streamable):
|
|
|
414
414
|
)
|
|
415
415
|
|
|
416
416
|
primary_dpuz: Program = Program.to((1, create_launcher_conditions))
|
|
417
|
-
additional_dpuzs:
|
|
417
|
+
additional_dpuzs: list[Program] = [Program.to((1, [[61, second_launcher_announcement_hash]]))]
|
|
418
418
|
return (
|
|
419
419
|
[primary_dpuz, *additional_dpuzs],
|
|
420
420
|
[
|
|
@@ -496,7 +496,7 @@ class VerifiedCredential(Streamable):
|
|
|
496
496
|
####################################################################################################################
|
|
497
497
|
|
|
498
498
|
@staticmethod
|
|
499
|
-
def is_vc(puzzle_reveal: UncurriedPuzzle) ->
|
|
499
|
+
def is_vc(puzzle_reveal: UncurriedPuzzle) -> tuple[bool, str]:
|
|
500
500
|
"""
|
|
501
501
|
This takes an (uncurried) puzzle reveal and returns a boolean for whether the puzzle is a VC and an error
|
|
502
502
|
message for if the puzzle is a mismatch. Returns True for VC launcher spends.
|
|
@@ -555,7 +555,7 @@ class VerifiedCredential(Streamable):
|
|
|
555
555
|
return True, ""
|
|
556
556
|
|
|
557
557
|
@classmethod
|
|
558
|
-
def get_next_from_coin_spend(cls:
|
|
558
|
+
def get_next_from_coin_spend(cls: type[_T_VerifiedCredential], parent_spend: CoinSpend) -> _T_VerifiedCredential:
|
|
559
559
|
"""
|
|
560
560
|
Given a coin spend, this will return the next VC that was create as an output of that spend. This is the main
|
|
561
561
|
method to use when syncing. If a spend has been identified as having a VC puzzle reveal, running this method
|
|
@@ -585,7 +585,7 @@ class VerifiedCredential(Streamable):
|
|
|
585
585
|
dpuz: Program = solution.at("rrf").at("f").at("f")
|
|
586
586
|
dsol: Program = solution.at("rrf").at("f").at("rf")
|
|
587
587
|
|
|
588
|
-
conditions:
|
|
588
|
+
conditions: list[Program] = list(dpuz.run(dsol).as_iter())
|
|
589
589
|
remark_condition: Program = next(c for c in conditions if c.at("f").as_int() == 1)
|
|
590
590
|
inner_puzzle_hash = bytes32(remark_condition.at("rf").as_atom())
|
|
591
591
|
magic_condition: Program = next(c for c in conditions if c.at("f").as_int() == -10)
|
|
@@ -707,7 +707,7 @@ class VerifiedCredential(Streamable):
|
|
|
707
707
|
inner_solution: Program,
|
|
708
708
|
new_proof_hash: Optional[bytes32] = None,
|
|
709
709
|
new_proof_provider: Optional[bytes32] = None,
|
|
710
|
-
) ->
|
|
710
|
+
) -> tuple[Optional[CreatePuzzleAnnouncement], CoinSpend, VerifiedCredential]:
|
|
711
711
|
"""
|
|
712
712
|
Given an inner puzzle reveal and solution, spend the VC (potentially updating the proofs in the process).
|
|
713
713
|
Note that the inner puzzle is already expected to output the 'magic' condition (which can be created above).
|
|
@@ -760,7 +760,7 @@ class VerifiedCredential(Streamable):
|
|
|
760
760
|
|
|
761
761
|
def activate_backdoor(
|
|
762
762
|
self, provider_innerpuzhash: bytes32, announcement_nonce: Optional[bytes32] = None
|
|
763
|
-
) ->
|
|
763
|
+
) -> tuple[CreatePuzzleAnnouncement, CoinSpend]:
|
|
764
764
|
"""
|
|
765
765
|
Activates the backdoor in the VC to revoke the credentials and remove the provider's DID.
|
|
766
766
|
|
|
@@ -810,7 +810,7 @@ class VerifiedCredential(Streamable):
|
|
|
810
810
|
Private method that creates the next VC class instance.
|
|
811
811
|
"""
|
|
812
812
|
slightly_incomplete_vc: VerifiedCredential = VerifiedCredential(
|
|
813
|
-
Coin(self.coin.name(), bytes32
|
|
813
|
+
Coin(self.coin.name(), bytes32.zeros, next_amount),
|
|
814
814
|
LineageProof(
|
|
815
815
|
self.coin.parent_coin_info,
|
|
816
816
|
self.construct_exigent_metadata_layer().get_tree_hash(),
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import dataclasses
|
|
4
4
|
from functools import cmp_to_key
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import Optional, TypeVar
|
|
6
6
|
|
|
7
7
|
from aiosqlite import Row
|
|
8
8
|
|
|
@@ -19,10 +19,10 @@ from chia.wallet.vc_wallet.vc_drivers import VCLineageProof, VerifiedCredential
|
|
|
19
19
|
|
|
20
20
|
@dataclasses.dataclass(frozen=True)
|
|
21
21
|
class VCProofs:
|
|
22
|
-
key_value_pairs:
|
|
22
|
+
key_value_pairs: dict[str, str]
|
|
23
23
|
|
|
24
24
|
def as_program(self) -> Program:
|
|
25
|
-
def byte_sort_pairs(f1:
|
|
25
|
+
def byte_sort_pairs(f1: tuple[str, str], f2: tuple[str, str]) -> int:
|
|
26
26
|
return 1 if Program.to([10, (1, f1[0]), (1, f2[0])]).run([]) == Program.to(None) else -1
|
|
27
27
|
|
|
28
28
|
prog: Program = Program.to(
|
|
@@ -45,7 +45,7 @@ class VCProofs:
|
|
|
45
45
|
first: Program = prog.at("f")
|
|
46
46
|
rest: Program = prog.at("r")
|
|
47
47
|
if first.atom is None and rest.atom is None:
|
|
48
|
-
final_dict:
|
|
48
|
+
final_dict: dict[str, str] = {}
|
|
49
49
|
final_dict.update(VCProofs.from_program(first).key_value_pairs)
|
|
50
50
|
final_dict.update(VCProofs.from_program(rest).key_value_pairs)
|
|
51
51
|
return VCProofs(final_dict)
|
|
@@ -54,7 +54,7 @@ class VCProofs:
|
|
|
54
54
|
else:
|
|
55
55
|
raise ValueError("Malformatted VCProofs program") # pragma: no cover
|
|
56
56
|
|
|
57
|
-
def prove_keys(self, keys:
|
|
57
|
+
def prove_keys(self, keys: list[str], tree: Optional[Program] = None) -> Program:
|
|
58
58
|
if tree is None:
|
|
59
59
|
tree = self.as_program()
|
|
60
60
|
|
|
@@ -114,7 +114,7 @@ class VCStore:
|
|
|
114
114
|
db_wrapper: DBWrapper2
|
|
115
115
|
|
|
116
116
|
@classmethod
|
|
117
|
-
async def create(cls:
|
|
117
|
+
async def create(cls: type[_T_VCStore], db_wrapper: DBWrapper2) -> _T_VCStore:
|
|
118
118
|
self = cls()
|
|
119
119
|
|
|
120
120
|
self.db_wrapper = db_wrapper
|
|
@@ -191,7 +191,7 @@ class VCStore:
|
|
|
191
191
|
return _row_to_vc_record(row)
|
|
192
192
|
return None
|
|
193
193
|
|
|
194
|
-
async def get_vc_records_by_providers(self, provider_ids:
|
|
194
|
+
async def get_vc_records_by_providers(self, provider_ids: list[bytes32]) -> list[VCRecord]: # pragma: no cover
|
|
195
195
|
"""
|
|
196
196
|
Checks DB for VCs with a proof_provider in a specified list and returns them.
|
|
197
197
|
"""
|
|
@@ -206,7 +206,7 @@ class VCStore:
|
|
|
206
206
|
|
|
207
207
|
return [_row_to_vc_record(row) for row in rows]
|
|
208
208
|
|
|
209
|
-
async def get_unconfirmed_vcs(self) ->
|
|
209
|
+
async def get_unconfirmed_vcs(self) -> list[VCRecord]:
|
|
210
210
|
"""
|
|
211
211
|
Returns all VCs that have not yet been marked confirmed (confirmed_height == 0)
|
|
212
212
|
"""
|
|
@@ -222,7 +222,7 @@ class VCStore:
|
|
|
222
222
|
self,
|
|
223
223
|
start_index: int = 0,
|
|
224
224
|
count: int = 50,
|
|
225
|
-
) ->
|
|
225
|
+
) -> list[VCRecord]:
|
|
226
226
|
"""
|
|
227
227
|
Return all VCs
|
|
228
228
|
:param start_index: Start index
|