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
|
@@ -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,
|
|
6
|
+
from typing import TYPE_CHECKING, Optional, TypeVar, Union
|
|
7
7
|
|
|
8
8
|
from chia_rs import G1Element, G2Element
|
|
9
9
|
from clvm.casts import int_to_bytes
|
|
@@ -63,7 +63,7 @@ class VCWallet:
|
|
|
63
63
|
|
|
64
64
|
@classmethod
|
|
65
65
|
async def create_new_vc_wallet(
|
|
66
|
-
cls:
|
|
66
|
+
cls: type[_T_VCWallet],
|
|
67
67
|
wallet_state_manager: WalletStateManager,
|
|
68
68
|
wallet: Wallet,
|
|
69
69
|
name: Optional[str] = None,
|
|
@@ -80,7 +80,7 @@ class VCWallet:
|
|
|
80
80
|
|
|
81
81
|
@classmethod
|
|
82
82
|
async def create(
|
|
83
|
-
cls:
|
|
83
|
+
cls: type[_T_VCWallet],
|
|
84
84
|
wallet_state_manager: WalletStateManager,
|
|
85
85
|
wallet: Wallet,
|
|
86
86
|
wallet_info: WalletInfo,
|
|
@@ -110,7 +110,7 @@ class VCWallet:
|
|
|
110
110
|
"""
|
|
111
111
|
# TODO Use coin_data instead of calling peer API
|
|
112
112
|
wallet_node = self.wallet_state_manager.wallet_node
|
|
113
|
-
coin_states: Optional[
|
|
113
|
+
coin_states: Optional[list[CoinState]] = await wallet_node.get_coin_state([coin.parent_coin_info], peer=peer)
|
|
114
114
|
if coin_states is None:
|
|
115
115
|
self.log.error(
|
|
116
116
|
f"Cannot find parent coin of the verified credential coin: {coin.name().hex()}"
|
|
@@ -165,7 +165,7 @@ class VCWallet:
|
|
|
165
165
|
action_scope: WalletActionScope,
|
|
166
166
|
inner_puzzle_hash: Optional[bytes32] = None,
|
|
167
167
|
fee: uint64 = uint64(0),
|
|
168
|
-
extra_conditions:
|
|
168
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
169
169
|
) -> VCRecord:
|
|
170
170
|
"""
|
|
171
171
|
Given the DID ID of a proof provider, mint a brand new VC with an empty slot for proofs.
|
|
@@ -204,8 +204,8 @@ class VCWallet:
|
|
|
204
204
|
coin_spends.append(make_spend(coin, puzzle, solution))
|
|
205
205
|
spend_bundle = WalletSpendBundle(coin_spends, G2Element())
|
|
206
206
|
now = uint64(int(time.time()))
|
|
207
|
-
add_list:
|
|
208
|
-
rem_list:
|
|
207
|
+
add_list: list[Coin] = list(spend_bundle.additions())
|
|
208
|
+
rem_list: list[Coin] = list(spend_bundle.removals())
|
|
209
209
|
vc_record: VCRecord = VCRecord(vc, uint32(0))
|
|
210
210
|
async with action_scope.use() as interface:
|
|
211
211
|
interface.side_effects.transactions.append(
|
|
@@ -238,7 +238,7 @@ class VCWallet:
|
|
|
238
238
|
action_scope: WalletActionScope,
|
|
239
239
|
fee: uint64 = uint64(0),
|
|
240
240
|
new_inner_puzhash: Optional[bytes32] = None,
|
|
241
|
-
extra_conditions:
|
|
241
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
242
242
|
**kwargs: Unpack[GSTOptionalArgs],
|
|
243
243
|
) -> None:
|
|
244
244
|
new_proof_hash: Optional[bytes32] = kwargs.get(
|
|
@@ -265,7 +265,7 @@ class VCWallet:
|
|
|
265
265
|
if new_inner_puzhash is None:
|
|
266
266
|
new_inner_puzhash = inner_puzhash
|
|
267
267
|
|
|
268
|
-
primaries:
|
|
268
|
+
primaries: list[Payment] = [Payment(new_inner_puzhash, uint64(vc_record.vc.coin.amount), [new_inner_puzhash])]
|
|
269
269
|
|
|
270
270
|
if fee > 0:
|
|
271
271
|
coin_name = vc_record.vc.coin.name()
|
|
@@ -301,7 +301,7 @@ class VCWallet:
|
|
|
301
301
|
primaries=primaries,
|
|
302
302
|
conditions=extra_conditions,
|
|
303
303
|
)
|
|
304
|
-
did_announcement, coin_spend,
|
|
304
|
+
did_announcement, coin_spend, _vc = vc_record.vc.do_spend(inner_puzzle, innersol, new_proof_hash)
|
|
305
305
|
spend_bundle = WalletSpendBundle([coin_spend], G2Element())
|
|
306
306
|
if did_announcement is not None:
|
|
307
307
|
# Need to spend DID
|
|
@@ -316,8 +316,8 @@ class VCWallet:
|
|
|
316
316
|
raise ValueError(
|
|
317
317
|
f"Cannot find the required DID {vc_record.vc.proof_provider.hex()}."
|
|
318
318
|
) # pragma: no cover
|
|
319
|
-
add_list:
|
|
320
|
-
rem_list:
|
|
319
|
+
add_list: list[Coin] = list(spend_bundle.additions())
|
|
320
|
+
rem_list: list[Coin] = list(spend_bundle.removals())
|
|
321
321
|
now = uint64(int(time.time()))
|
|
322
322
|
|
|
323
323
|
async with action_scope.use() as interface:
|
|
@@ -349,9 +349,9 @@ class VCWallet:
|
|
|
349
349
|
peer: WSChiaConnection,
|
|
350
350
|
action_scope: WalletActionScope,
|
|
351
351
|
fee: uint64 = uint64(0),
|
|
352
|
-
extra_conditions:
|
|
352
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
353
353
|
) -> None:
|
|
354
|
-
vc_coin_states:
|
|
354
|
+
vc_coin_states: list[CoinState] = await self.wallet_state_manager.wallet_node.get_coin_state(
|
|
355
355
|
[parent_id], peer=peer
|
|
356
356
|
)
|
|
357
357
|
if vc_coin_states is None:
|
|
@@ -377,7 +377,7 @@ class VCWallet:
|
|
|
377
377
|
)
|
|
378
378
|
return
|
|
379
379
|
|
|
380
|
-
recovery_info: Optional[
|
|
380
|
+
recovery_info: Optional[tuple[bytes32, bytes32, uint64]] = await did_wallet.get_info_for_recovery()
|
|
381
381
|
if recovery_info is None:
|
|
382
382
|
raise RuntimeError("DID could not currently be accessed while trying to revoke VC") # pragma: no cover
|
|
383
383
|
_, provider_inner_puzhash, _ = recovery_info
|
|
@@ -387,8 +387,8 @@ class VCWallet:
|
|
|
387
387
|
coins.add(vc.coin)
|
|
388
388
|
if fee > 0:
|
|
389
389
|
coins.update(await self.standard_wallet.select_coins(fee, action_scope))
|
|
390
|
-
sorted_coins:
|
|
391
|
-
sorted_coin_list:
|
|
390
|
+
sorted_coins: list[Coin] = sorted(coins, key=Coin.name)
|
|
391
|
+
sorted_coin_list: list[list[Union[bytes32, uint64]]] = [coin_as_list(c) for c in sorted_coins]
|
|
392
392
|
nonce: bytes32 = SerializedProgram.to(sorted_coin_list).get_tree_hash()
|
|
393
393
|
vc_announcement: AssertCoinAnnouncement = AssertCoinAnnouncement(asserted_id=vc.coin.name(), asserted_msg=nonce)
|
|
394
394
|
|
|
@@ -408,7 +408,7 @@ class VCWallet:
|
|
|
408
408
|
|
|
409
409
|
async def add_vc_authorization(
|
|
410
410
|
self, offer: Offer, solver: Solver, action_scope: WalletActionScope
|
|
411
|
-
) ->
|
|
411
|
+
) -> tuple[Offer, Solver]:
|
|
412
412
|
"""
|
|
413
413
|
This method takes an existing offer and adds a VC authorization spend to it where it can/is willing.
|
|
414
414
|
The only coins types that it looks for to approve are CR-CATs at the moment.
|
|
@@ -422,9 +422,9 @@ class VCWallet:
|
|
|
422
422
|
send the change back to it's original puzzle hash or else a taker wallet will not approve it.
|
|
423
423
|
"""
|
|
424
424
|
# Gather all of the CRCATs being spent and the CRCATs that each creates
|
|
425
|
-
crcat_spends:
|
|
426
|
-
other_spends:
|
|
427
|
-
spends_to_fix:
|
|
425
|
+
crcat_spends: list[CRCATSpend] = []
|
|
426
|
+
other_spends: list[CoinSpend] = []
|
|
427
|
+
spends_to_fix: dict[bytes32, CoinSpend] = {}
|
|
428
428
|
for spend in offer.to_valid_spend().coin_spends:
|
|
429
429
|
if CRCAT.is_cr_cat(uncurry_puzzle(spend.puzzle_reveal))[0]:
|
|
430
430
|
crcat_spend: CRCATSpend = CRCATSpend.from_coin_spend(spend)
|
|
@@ -440,13 +440,13 @@ class VCWallet:
|
|
|
440
440
|
other_spends.append(spend)
|
|
441
441
|
|
|
442
442
|
# Figure out what VC announcements are needed
|
|
443
|
-
announcements_to_make:
|
|
444
|
-
announcements_to_assert:
|
|
445
|
-
vcs:
|
|
446
|
-
coin_args:
|
|
443
|
+
announcements_to_make: dict[bytes32, list[CreatePuzzleAnnouncement]] = {}
|
|
444
|
+
announcements_to_assert: dict[bytes32, list[AssertCoinAnnouncement]] = {}
|
|
445
|
+
vcs: dict[bytes32, VerifiedCredential] = {}
|
|
446
|
+
coin_args: dict[str, list[str]] = {}
|
|
447
447
|
for crcat_spend in crcat_spends:
|
|
448
448
|
# Check first whether we can approve...
|
|
449
|
-
available_vcs:
|
|
449
|
+
available_vcs: list[VCRecord] = [
|
|
450
450
|
vc_rec
|
|
451
451
|
for vc_rec in await self.store.get_vc_records_by_providers(crcat_spend.crcat.authorized_providers)
|
|
452
452
|
if vc_rec.confirmed_at_height != 0
|
|
@@ -556,7 +556,7 @@ class VCWallet:
|
|
|
556
556
|
*(
|
|
557
557
|
spend
|
|
558
558
|
for spend in offer.to_spend_bundle().coin_spends
|
|
559
|
-
if spend.coin.parent_coin_info == bytes32
|
|
559
|
+
if spend.coin.parent_coin_info == bytes32.zeros
|
|
560
560
|
),
|
|
561
561
|
*other_spends,
|
|
562
562
|
],
|
|
@@ -572,9 +572,9 @@ class VCWallet:
|
|
|
572
572
|
), Solver({"vc_authorizations": coin_args})
|
|
573
573
|
|
|
574
574
|
async def get_vc_with_provider_in_and_proofs(
|
|
575
|
-
self, authorized_providers:
|
|
575
|
+
self, authorized_providers: list[bytes32], proofs: list[str]
|
|
576
576
|
) -> VerifiedCredential:
|
|
577
|
-
vc_records:
|
|
577
|
+
vc_records: list[VCRecord] = await self.store.get_vc_records_by_providers(authorized_providers)
|
|
578
578
|
if len(vc_records) == 0: # pragma: no cover
|
|
579
579
|
raise ValueError(f"VCWallet has no VCs with providers in the following list: {authorized_providers}")
|
|
580
580
|
else:
|
|
@@ -588,7 +588,7 @@ class VCWallet:
|
|
|
588
588
|
return rec.vc
|
|
589
589
|
raise ValueError(f"No authorized VC has the correct proofs: {proofs}") # pragma: no cover
|
|
590
590
|
|
|
591
|
-
async def proof_of_inclusions_for_root_and_keys(self, root: bytes32, keys:
|
|
591
|
+
async def proof_of_inclusions_for_root_and_keys(self, root: bytes32, keys: list[str]) -> Program:
|
|
592
592
|
vc_proofs: Optional[VCProofs] = await self.store.get_proofs_for_root(root)
|
|
593
593
|
if vc_proofs is None:
|
|
594
594
|
raise RuntimeError(f"No proofs exist for VC root: {root.hex()}") # pragma: no cover
|
|
@@ -599,25 +599,25 @@ class VCWallet:
|
|
|
599
599
|
self,
|
|
600
600
|
amount: uint64,
|
|
601
601
|
action_scope: WalletActionScope,
|
|
602
|
-
) ->
|
|
602
|
+
) -> set[Coin]:
|
|
603
603
|
raise RuntimeError("VCWallet does not support select_coins()") # pragma: no cover
|
|
604
604
|
|
|
605
|
-
async def get_confirmed_balance(self, record_list: Optional[
|
|
605
|
+
async def get_confirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
606
606
|
"""The VC wallet doesn't really have a balance."""
|
|
607
607
|
return uint128(0) # pragma: no cover
|
|
608
608
|
|
|
609
|
-
async def get_unconfirmed_balance(self, record_list: Optional[
|
|
609
|
+
async def get_unconfirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
610
610
|
"""The VC wallet doesn't really have a balance."""
|
|
611
611
|
return uint128(0) # pragma: no cover
|
|
612
612
|
|
|
613
|
-
async def get_spendable_balance(self, unspent_records: Optional[
|
|
613
|
+
async def get_spendable_balance(self, unspent_records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
614
614
|
"""The VC wallet doesn't really have a balance."""
|
|
615
615
|
return uint128(0) # pragma: no cover
|
|
616
616
|
|
|
617
617
|
async def get_pending_change_balance(self) -> uint64:
|
|
618
618
|
return uint64(0) # pragma: no cover
|
|
619
619
|
|
|
620
|
-
async def get_max_send_amount(self, records: Optional[
|
|
620
|
+
async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
621
621
|
"""This is the confirmed balance, which we set to 0 as the VC wallet doesn't have one."""
|
|
622
622
|
return uint128(0) # pragma: no cover
|
|
623
623
|
|
chia/wallet/wallet.py
CHANGED
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import time
|
|
5
|
-
from typing import TYPE_CHECKING, Any, ClassVar,
|
|
5
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
6
6
|
|
|
7
7
|
from chia_rs import AugSchemeMPL, G1Element, G2Element, PrivateKey
|
|
8
8
|
from typing_extensions import Unpack
|
|
@@ -94,14 +94,14 @@ class Wallet:
|
|
|
94
94
|
# avoid full block TXs
|
|
95
95
|
return int(self.wallet_state_manager.constants.MAX_BLOCK_COST_CLVM / 5 / self.cost_of_single_tx)
|
|
96
96
|
|
|
97
|
-
async def get_max_spendable_coins(self, records: Optional[
|
|
98
|
-
spendable:
|
|
97
|
+
async def get_max_spendable_coins(self, records: Optional[set[WalletCoinRecord]] = None) -> set[WalletCoinRecord]:
|
|
98
|
+
spendable: list[WalletCoinRecord] = list(
|
|
99
99
|
await self.wallet_state_manager.get_spendable_coins_for_wallet(self.id(), records)
|
|
100
100
|
)
|
|
101
101
|
spendable.sort(reverse=True, key=lambda record: record.coin.amount)
|
|
102
102
|
return set(spendable[0 : min(len(spendable), self.max_send_quantity)])
|
|
103
103
|
|
|
104
|
-
async def get_max_send_amount(self, records: Optional[
|
|
104
|
+
async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
105
105
|
return uint128(sum(cr.coin.amount for cr in await self.get_max_spendable_coins()))
|
|
106
106
|
|
|
107
107
|
@classmethod
|
|
@@ -111,20 +111,20 @@ class Wallet:
|
|
|
111
111
|
def id(self) -> uint32:
|
|
112
112
|
return self.wallet_id
|
|
113
113
|
|
|
114
|
-
async def get_confirmed_balance(self, record_list: Optional[
|
|
114
|
+
async def get_confirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
115
115
|
return await self.wallet_state_manager.get_confirmed_balance_for_wallet(self.id(), record_list)
|
|
116
116
|
|
|
117
|
-
async def get_unconfirmed_balance(self, unspent_records: Optional[
|
|
117
|
+
async def get_unconfirmed_balance(self, unspent_records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
118
118
|
return await self.wallet_state_manager.get_unconfirmed_balance(self.id(), unspent_records)
|
|
119
119
|
|
|
120
|
-
async def get_spendable_balance(self, unspent_records: Optional[
|
|
120
|
+
async def get_spendable_balance(self, unspent_records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
121
121
|
spendable = await self.wallet_state_manager.get_confirmed_spendable_balance_for_wallet(
|
|
122
122
|
self.id(), unspent_records
|
|
123
123
|
)
|
|
124
124
|
return spendable
|
|
125
125
|
|
|
126
126
|
async def get_pending_change_balance(self) -> uint64:
|
|
127
|
-
unconfirmed_tx:
|
|
127
|
+
unconfirmed_tx: list[TransactionRecord] = await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(
|
|
128
128
|
self.id()
|
|
129
129
|
)
|
|
130
130
|
addition_amount = 0
|
|
@@ -181,9 +181,9 @@ class Wallet:
|
|
|
181
181
|
if new:
|
|
182
182
|
return await self.get_new_puzzle()
|
|
183
183
|
else:
|
|
184
|
-
record: Optional[
|
|
185
|
-
|
|
186
|
-
)
|
|
184
|
+
record: Optional[
|
|
185
|
+
DerivationRecord
|
|
186
|
+
] = await self.wallet_state_manager.get_current_derivation_record_for_wallet(self.id())
|
|
187
187
|
if record is None:
|
|
188
188
|
return await self.get_new_puzzle() # pragma: no cover
|
|
189
189
|
puzzle = puzzle_for_pk(record.pubkey)
|
|
@@ -193,9 +193,9 @@ class Wallet:
|
|
|
193
193
|
if new:
|
|
194
194
|
return await self.get_new_puzzlehash()
|
|
195
195
|
else:
|
|
196
|
-
record: Optional[
|
|
197
|
-
|
|
198
|
-
)
|
|
196
|
+
record: Optional[
|
|
197
|
+
DerivationRecord
|
|
198
|
+
] = await self.wallet_state_manager.get_current_derivation_record_for_wallet(self.id())
|
|
199
199
|
if record is None:
|
|
200
200
|
return await self.get_new_puzzlehash()
|
|
201
201
|
return record.puzzle_hash
|
|
@@ -206,12 +206,12 @@ class Wallet:
|
|
|
206
206
|
|
|
207
207
|
def make_solution(
|
|
208
208
|
self,
|
|
209
|
-
primaries:
|
|
210
|
-
conditions:
|
|
209
|
+
primaries: list[Payment],
|
|
210
|
+
conditions: tuple[Condition, ...] = tuple(),
|
|
211
211
|
fee: uint64 = uint64(0),
|
|
212
212
|
) -> Program:
|
|
213
213
|
assert fee >= 0
|
|
214
|
-
condition_list:
|
|
214
|
+
condition_list: list[Any] = [condition.to_program() for condition in conditions]
|
|
215
215
|
if len(primaries) > 0:
|
|
216
216
|
for primary in primaries:
|
|
217
217
|
condition_list.append(make_create_coin_condition(primary.puzzle_hash, primary.amount, primary.memos))
|
|
@@ -229,17 +229,17 @@ class Wallet:
|
|
|
229
229
|
self,
|
|
230
230
|
amount: uint64,
|
|
231
231
|
action_scope: WalletActionScope,
|
|
232
|
-
) ->
|
|
232
|
+
) -> set[Coin]:
|
|
233
233
|
"""
|
|
234
234
|
Returns a set of coins that can be used for generating a new transaction.
|
|
235
235
|
Note: Must be called under wallet state manager lock
|
|
236
236
|
"""
|
|
237
237
|
spendable_amount: uint128 = await self.get_spendable_balance()
|
|
238
|
-
spendable_coins:
|
|
238
|
+
spendable_coins: list[WalletCoinRecord] = list(await self.get_max_spendable_coins())
|
|
239
239
|
|
|
240
240
|
# Try to use coins from the store, if there isn't enough of "unused"
|
|
241
241
|
# coins use change coins that are not confirmed yet
|
|
242
|
-
unconfirmed_removals:
|
|
242
|
+
unconfirmed_removals: dict[bytes32, Coin] = await self.wallet_state_manager.unconfirmed_removals_for_wallet(
|
|
243
243
|
self.id()
|
|
244
244
|
)
|
|
245
245
|
async with action_scope.use() as interface:
|
|
@@ -262,13 +262,13 @@ class Wallet:
|
|
|
262
262
|
action_scope: WalletActionScope,
|
|
263
263
|
fee: uint64 = uint64(0),
|
|
264
264
|
origin_id: Optional[bytes32] = None,
|
|
265
|
-
coins: Optional[
|
|
266
|
-
primaries_input: Optional[
|
|
267
|
-
memos: Optional[
|
|
265
|
+
coins: Optional[set[Coin]] = None,
|
|
266
|
+
primaries_input: Optional[list[Payment]] = None,
|
|
267
|
+
memos: Optional[list[bytes]] = None,
|
|
268
268
|
negative_change_allowed: bool = False,
|
|
269
|
-
puzzle_decorator_override: Optional[
|
|
270
|
-
extra_conditions:
|
|
271
|
-
) ->
|
|
269
|
+
puzzle_decorator_override: Optional[list[dict[str, Any]]] = None,
|
|
270
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
271
|
+
) -> list[CoinSpend]:
|
|
272
272
|
"""
|
|
273
273
|
Generates a unsigned transaction in form of List(Puzzle, Solutions)
|
|
274
274
|
Note: this must be called under a wallet state manager lock
|
|
@@ -303,7 +303,7 @@ class Wallet:
|
|
|
303
303
|
|
|
304
304
|
assert change >= 0
|
|
305
305
|
|
|
306
|
-
spends:
|
|
306
|
+
spends: list[CoinSpend] = []
|
|
307
307
|
primary_announcement: Optional[AssertCoinAnnouncement] = None
|
|
308
308
|
|
|
309
309
|
# Check for duplicates
|
|
@@ -312,13 +312,13 @@ class Wallet:
|
|
|
312
312
|
raise ValueError("Cannot create two identical coins")
|
|
313
313
|
for coin in coins:
|
|
314
314
|
# Only one coin creates outputs
|
|
315
|
-
if origin_id in
|
|
315
|
+
if origin_id in {None, coin.name()}:
|
|
316
316
|
origin_id = coin.name()
|
|
317
317
|
inner_puzzle = await self.puzzle_for_puzzle_hash(coin.puzzle_hash)
|
|
318
318
|
decorated_target_puzzle_hash = decorator_manager.decorate_target_puzzle_hash(
|
|
319
319
|
inner_puzzle, newpuzzlehash
|
|
320
320
|
)
|
|
321
|
-
target_primary:
|
|
321
|
+
target_primary: list[Payment] = []
|
|
322
322
|
if memos is None:
|
|
323
323
|
memos = []
|
|
324
324
|
memos = decorator_manager.decorate_memos(inner_puzzle, newpuzzlehash, memos)
|
|
@@ -337,7 +337,7 @@ class Wallet:
|
|
|
337
337
|
else:
|
|
338
338
|
change_puzzle_hash = await self.get_new_puzzlehash()
|
|
339
339
|
primaries.append(Payment(change_puzzle_hash, uint64(change)))
|
|
340
|
-
message_list:
|
|
340
|
+
message_list: list[bytes32] = [c.name() for c in coins]
|
|
341
341
|
for primary in primaries:
|
|
342
342
|
message_list.append(Coin(coin.name(), primary.puzzle_hash, primary.amount).name())
|
|
343
343
|
message: bytes32 = std_hash(b"".join(message_list))
|
|
@@ -375,7 +375,7 @@ class Wallet:
|
|
|
375
375
|
self.log.debug(f"Spends is {spends}")
|
|
376
376
|
return spends
|
|
377
377
|
|
|
378
|
-
async def sign_message(self, message: str, puzzle_hash: bytes32, mode: SigningMode) ->
|
|
378
|
+
async def sign_message(self, message: str, puzzle_hash: bytes32, mode: SigningMode) -> tuple[G1Element, G2Element]:
|
|
379
379
|
# CHIP-0002 message signing as documented at:
|
|
380
380
|
# https://github.com/Chia-Network/chips/blob/80e4611fe52b174bf1a0382b9dff73805b18b8c6/CHIPs/chip-0002.md#signmessage
|
|
381
381
|
private = await self.wallet_state_manager.get_private_key(puzzle_hash)
|
|
@@ -397,11 +397,11 @@ class Wallet:
|
|
|
397
397
|
puzzle_hash: bytes32,
|
|
398
398
|
action_scope: WalletActionScope,
|
|
399
399
|
fee: uint64 = uint64(0),
|
|
400
|
-
coins: Optional[
|
|
401
|
-
primaries: Optional[
|
|
402
|
-
memos: Optional[
|
|
403
|
-
puzzle_decorator_override: Optional[
|
|
404
|
-
extra_conditions:
|
|
400
|
+
coins: Optional[set[Coin]] = None,
|
|
401
|
+
primaries: Optional[list[Payment]] = None,
|
|
402
|
+
memos: Optional[list[bytes]] = None,
|
|
403
|
+
puzzle_decorator_override: Optional[list[dict[str, Any]]] = None,
|
|
404
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
405
405
|
**kwargs: Unpack[GSTOptionalArgs],
|
|
406
406
|
) -> None:
|
|
407
407
|
origin_id: Optional[bytes32] = kwargs.get("origin_id", None)
|
|
@@ -434,8 +434,8 @@ class Wallet:
|
|
|
434
434
|
spend_bundle = WalletSpendBundle(transaction, G2Element())
|
|
435
435
|
|
|
436
436
|
now = uint64(int(time.time()))
|
|
437
|
-
add_list:
|
|
438
|
-
rem_list:
|
|
437
|
+
add_list: list[Coin] = list(spend_bundle.additions())
|
|
438
|
+
rem_list: list[Coin] = list(spend_bundle.removals())
|
|
439
439
|
|
|
440
440
|
output_amount = sum(a.amount for a in add_list) + fee
|
|
441
441
|
input_amount = sum(r.amount for r in rem_list)
|
|
@@ -471,7 +471,7 @@ class Wallet:
|
|
|
471
471
|
self,
|
|
472
472
|
fee: uint64,
|
|
473
473
|
action_scope: WalletActionScope,
|
|
474
|
-
extra_conditions:
|
|
474
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
475
475
|
) -> None:
|
|
476
476
|
chia_coins = await self.select_coins(fee, action_scope)
|
|
477
477
|
await self.generate_signed_transaction(
|
|
@@ -488,7 +488,7 @@ class Wallet:
|
|
|
488
488
|
asset_id: Optional[bytes32],
|
|
489
489
|
amount: uint64,
|
|
490
490
|
action_scope: WalletActionScope,
|
|
491
|
-
) ->
|
|
491
|
+
) -> set[Coin]:
|
|
492
492
|
if asset_id is not None:
|
|
493
493
|
raise ValueError(f"The standard wallet cannot offer coins with asset id {asset_id}")
|
|
494
494
|
balance = await self.get_spendable_balance()
|
|
@@ -501,7 +501,7 @@ class Wallet:
|
|
|
501
501
|
# WSChiaConnection is only imported for type checking
|
|
502
502
|
async def coin_added(
|
|
503
503
|
self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: Optional[Streamable]
|
|
504
|
-
) -> None:
|
|
504
|
+
) -> None:
|
|
505
505
|
pass
|
|
506
506
|
|
|
507
507
|
def get_name(self) -> str:
|
|
@@ -509,9 +509,9 @@ class Wallet:
|
|
|
509
509
|
|
|
510
510
|
async def match_hinted_coin(self, coin: Coin, hint: bytes32) -> bool:
|
|
511
511
|
if hint == coin.puzzle_hash:
|
|
512
|
-
wallet_identifier: Optional[
|
|
513
|
-
|
|
514
|
-
)
|
|
512
|
+
wallet_identifier: Optional[
|
|
513
|
+
WalletIdentifier
|
|
514
|
+
] = await self.wallet_state_manager.puzzle_store.get_wallet_identifier_for_puzzle_hash(coin.puzzle_hash)
|
|
515
515
|
if wallet_identifier is not None and wallet_identifier.id == self.id():
|
|
516
516
|
return True
|
|
517
517
|
return False
|
|
@@ -557,18 +557,18 @@ class Wallet:
|
|
|
557
557
|
|
|
558
558
|
async def execute_signing_instructions(
|
|
559
559
|
self, signing_instructions: SigningInstructions, partial_allowed: bool = False
|
|
560
|
-
) ->
|
|
560
|
+
) -> list[SigningResponse]:
|
|
561
561
|
root_pubkey: G1Element = self.wallet_state_manager.root_pubkey
|
|
562
|
-
pk_lookup:
|
|
562
|
+
pk_lookup: dict[int, G1Element] = (
|
|
563
563
|
{root_pubkey.get_fingerprint(): root_pubkey} if self.wallet_state_manager.private_key is not None else {}
|
|
564
564
|
)
|
|
565
|
-
sk_lookup:
|
|
565
|
+
sk_lookup: dict[int, PrivateKey] = (
|
|
566
566
|
{root_pubkey.get_fingerprint(): self.wallet_state_manager.get_master_private_key()}
|
|
567
567
|
if self.wallet_state_manager.private_key is not None
|
|
568
568
|
else {}
|
|
569
569
|
)
|
|
570
570
|
aggregate_responses_at_end: bool = True
|
|
571
|
-
responses:
|
|
571
|
+
responses: list[SigningResponse] = []
|
|
572
572
|
|
|
573
573
|
# TODO: expand path hints and sum hints recursively (a sum hint can give a new key to path hint)
|
|
574
574
|
# Next, expand our pubkey set with path hints
|
|
@@ -593,9 +593,9 @@ class Wallet:
|
|
|
593
593
|
sk_lookup[derive_child_pk_unhardened.get_fingerprint()] = derive_child_sk_unhardened
|
|
594
594
|
|
|
595
595
|
# Next, expand our pubkey set with sum hints
|
|
596
|
-
sum_hint_lookup:
|
|
596
|
+
sum_hint_lookup: dict[int, list[int]] = {}
|
|
597
597
|
for sum_hint in signing_instructions.key_hints.sum_hints:
|
|
598
|
-
fingerprints_we_have:
|
|
598
|
+
fingerprints_we_have: list[int] = []
|
|
599
599
|
for fingerprint in sum_hint.fingerprints:
|
|
600
600
|
fingerprint_as_int = int.from_bytes(fingerprint, "big")
|
|
601
601
|
if fingerprint_as_int not in pk_lookup:
|
|
@@ -635,7 +635,7 @@ class Wallet:
|
|
|
635
635
|
)
|
|
636
636
|
)
|
|
637
637
|
else: # Implicit if pk_fingerprint in sum_hint_lookup
|
|
638
|
-
signatures:
|
|
638
|
+
signatures: list[G2Element] = []
|
|
639
639
|
for partial_fingerprint in sum_hint_lookup[pk_fingerprint]:
|
|
640
640
|
signatures.append(
|
|
641
641
|
AugSchemeMPL.sign(sk_lookup[partial_fingerprint], target.message, pk_lookup[pk_fingerprint])
|
|
@@ -660,8 +660,8 @@ class Wallet:
|
|
|
660
660
|
|
|
661
661
|
# If we have the full set of signing responses for the instructions, aggregate them as much as possible
|
|
662
662
|
if aggregate_responses_at_end:
|
|
663
|
-
new_responses:
|
|
664
|
-
grouped_responses:
|
|
663
|
+
new_responses: list[SigningResponse] = []
|
|
664
|
+
grouped_responses: dict[bytes32, list[SigningResponse]] = {}
|
|
665
665
|
for response in responses:
|
|
666
666
|
grouped_responses.setdefault(response.hook, [])
|
|
667
667
|
grouped_responses[response.hook].append(response)
|
|
@@ -677,7 +677,7 @@ class Wallet:
|
|
|
677
677
|
return responses
|
|
678
678
|
|
|
679
679
|
async def apply_signatures(
|
|
680
|
-
self, spends:
|
|
680
|
+
self, spends: list[Spend], signing_responses: list[SigningResponse]
|
|
681
681
|
) -> SignedTransaction:
|
|
682
682
|
signing_responses_set = set(signing_responses)
|
|
683
683
|
return SignedTransaction(
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import contextlib
|
|
4
|
+
from collections.abc import AsyncIterator
|
|
4
5
|
from dataclasses import dataclass, field, replace
|
|
5
|
-
from typing import TYPE_CHECKING,
|
|
6
|
+
from typing import TYPE_CHECKING, Optional, cast, final
|
|
6
7
|
|
|
7
8
|
from chia.types.blockchain_format.coin import Coin
|
|
8
9
|
from chia.util.action_scope import ActionScope
|
|
@@ -20,18 +21,18 @@ if TYPE_CHECKING:
|
|
|
20
21
|
@streamable
|
|
21
22
|
@dataclass(frozen=True)
|
|
22
23
|
class _StreamableWalletSideEffects(Streamable):
|
|
23
|
-
transactions:
|
|
24
|
-
signing_responses:
|
|
25
|
-
extra_spends:
|
|
26
|
-
selected_coins:
|
|
24
|
+
transactions: list[TransactionRecord]
|
|
25
|
+
signing_responses: list[SigningResponse]
|
|
26
|
+
extra_spends: list[WalletSpendBundle]
|
|
27
|
+
selected_coins: list[Coin]
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
@dataclass
|
|
30
31
|
class WalletSideEffects:
|
|
31
|
-
transactions:
|
|
32
|
-
signing_responses:
|
|
33
|
-
extra_spends:
|
|
34
|
-
selected_coins:
|
|
32
|
+
transactions: list[TransactionRecord] = field(default_factory=list)
|
|
33
|
+
signing_responses: list[SigningResponse] = field(default_factory=list)
|
|
34
|
+
extra_spends: list[WalletSpendBundle] = field(default_factory=list)
|
|
35
|
+
selected_coins: list[Coin] = field(default_factory=list)
|
|
35
36
|
|
|
36
37
|
def __bytes__(self) -> bytes:
|
|
37
38
|
return bytes(_StreamableWalletSideEffects(**self.__dict__))
|
|
@@ -47,8 +48,8 @@ class WalletActionConfig:
|
|
|
47
48
|
push: bool
|
|
48
49
|
merge_spends: bool
|
|
49
50
|
sign: Optional[bool]
|
|
50
|
-
additional_signing_responses:
|
|
51
|
-
extra_spends:
|
|
51
|
+
additional_signing_responses: list[SigningResponse]
|
|
52
|
+
extra_spends: list[WalletSpendBundle]
|
|
52
53
|
tx_config: TXConfig
|
|
53
54
|
|
|
54
55
|
def adjust_for_side_effects(self, side_effects: WalletSideEffects) -> WalletActionConfig:
|
|
@@ -71,8 +72,8 @@ async def new_wallet_action_scope(
|
|
|
71
72
|
push: bool = False,
|
|
72
73
|
merge_spends: bool = True,
|
|
73
74
|
sign: Optional[bool] = None,
|
|
74
|
-
additional_signing_responses:
|
|
75
|
-
extra_spends:
|
|
75
|
+
additional_signing_responses: list[SigningResponse] = [],
|
|
76
|
+
extra_spends: list[WalletSpendBundle] = [],
|
|
76
77
|
) -> AsyncIterator[WalletActionScope]:
|
|
77
78
|
async with ActionScope.new_scope(
|
|
78
79
|
WalletSideEffects,
|
chia/wallet/wallet_blockchain.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import TYPE_CHECKING, ClassVar,
|
|
4
|
+
from typing import TYPE_CHECKING, ClassVar, Optional, cast
|
|
5
5
|
|
|
6
6
|
from chia.consensus.block_header_validation import validate_finished_header_block
|
|
7
7
|
from chia.consensus.block_record import BlockRecord
|
|
@@ -11,6 +11,7 @@ from chia.consensus.find_fork_point import find_fork_point_in_chain
|
|
|
11
11
|
from chia.consensus.full_block_to_block_record import block_to_block_record
|
|
12
12
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
13
13
|
from chia.types.header_block import HeaderBlock
|
|
14
|
+
from chia.types.validation_state import ValidationState
|
|
14
15
|
from chia.types.weight_proof import WeightProof
|
|
15
16
|
from chia.util.errors import Err
|
|
16
17
|
from chia.util.ints import uint32, uint64
|
|
@@ -35,8 +36,8 @@ class WalletBlockchain:
|
|
|
35
36
|
_finished_sync_up_to: uint32
|
|
36
37
|
|
|
37
38
|
_peak: Optional[HeaderBlock]
|
|
38
|
-
_height_to_hash:
|
|
39
|
-
_block_records:
|
|
39
|
+
_height_to_hash: dict[uint32, bytes32]
|
|
40
|
+
_block_records: dict[bytes32, BlockRecord]
|
|
40
41
|
_latest_timestamp: uint64
|
|
41
42
|
_sub_slot_iters: uint64
|
|
42
43
|
_difficulty: uint64
|
|
@@ -69,7 +70,7 @@ class WalletBlockchain:
|
|
|
69
70
|
|
|
70
71
|
return self
|
|
71
72
|
|
|
72
|
-
async def new_valid_weight_proof(self, weight_proof: WeightProof, records:
|
|
73
|
+
async def new_valid_weight_proof(self, weight_proof: WeightProof, records: list[BlockRecord]) -> None:
|
|
73
74
|
peak: Optional[HeaderBlock] = await self.get_peak_block()
|
|
74
75
|
|
|
75
76
|
if peak is not None and weight_proof.recent_chain_data[-1].weight <= peak.weight:
|
|
@@ -93,7 +94,7 @@ class WalletBlockchain:
|
|
|
93
94
|
await self.set_peak_block(weight_proof.recent_chain_data[-1], latest_timestamp)
|
|
94
95
|
await self.clean_block_records()
|
|
95
96
|
|
|
96
|
-
async def add_block(self, block: HeaderBlock) ->
|
|
97
|
+
async def add_block(self, block: HeaderBlock) -> tuple[AddBlockResult, Optional[Err]]:
|
|
97
98
|
if self.contains_block(block.header_hash):
|
|
98
99
|
return AddBlockResult.ALREADY_HAVE_BLOCK, None
|
|
99
100
|
if not self.contains_block(block.prev_header_hash) and block.height > 0:
|
|
@@ -110,9 +111,8 @@ class WalletBlockchain:
|
|
|
110
111
|
difficulty = self._difficulty
|
|
111
112
|
|
|
112
113
|
# Validation requires a block cache (self) that goes back to a subepoch barrier
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
)
|
|
114
|
+
expected_vs = ValidationState(sub_slot_iters, difficulty, None)
|
|
115
|
+
required_iters, error = validate_finished_header_block(self.constants, self, block, False, expected_vs, False)
|
|
116
116
|
if error is not None:
|
|
117
117
|
return AddBlockResult.INVALID_BLOCK, error.code
|
|
118
118
|
if required_iters is None:
|
|
@@ -217,7 +217,7 @@ class WalletBlockchain:
|
|
|
217
217
|
# blockchain_interface
|
|
218
218
|
return self._block_records.get(header_hash)
|
|
219
219
|
|
|
220
|
-
async def prev_block_hash(self, header_hashes:
|
|
220
|
+
async def prev_block_hash(self, header_hashes: list[bytes32]) -> list[bytes32]:
|
|
221
221
|
ret = []
|
|
222
222
|
for h in header_hashes:
|
|
223
223
|
ret.append(self._block_records[h].prev_hash)
|
|
@@ -235,7 +235,7 @@ class WalletBlockchain:
|
|
|
235
235
|
if len(self._block_records) < self.CACHE_SIZE:
|
|
236
236
|
return None
|
|
237
237
|
|
|
238
|
-
to_remove:
|
|
238
|
+
to_remove: list[bytes32] = []
|
|
239
239
|
for header_hash, block_record in self._block_records.items():
|
|
240
240
|
if block_record.height < height_limit:
|
|
241
241
|
to_remove.append(header_hash)
|