chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__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.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.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.0rc2.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass, field
|
|
4
|
-
from typing import Any,
|
|
4
|
+
from typing import Any, Optional, Union
|
|
5
5
|
|
|
6
6
|
from chia.types.blockchain_format.coin import Coin
|
|
7
7
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
@@ -56,7 +56,7 @@ class WalletCoinRecord:
|
|
|
56
56
|
def to_coin_record(self, timestamp: uint64) -> CoinRecord:
|
|
57
57
|
return CoinRecord(self.coin, self.confirmed_block_height, self.spent_block_height, self.coinbase, timestamp)
|
|
58
58
|
|
|
59
|
-
def to_json_dict_parsed_metadata(self) ->
|
|
59
|
+
def to_json_dict_parsed_metadata(self) -> dict[str, Any]:
|
|
60
60
|
# TODO: Merge wallet_type and wallet_id into `wallet_identifier`, make `spent` an attribute based
|
|
61
61
|
# on `spent_height` make `WalletCoinRecord` streamable and use Streamable.to_json_dict as base here if we have
|
|
62
62
|
# streamable enums.
|
chia/wallet/wallet_coin_store.py
CHANGED
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import sqlite3
|
|
4
4
|
from dataclasses import dataclass
|
|
5
5
|
from enum import IntEnum
|
|
6
|
-
from typing import
|
|
6
|
+
from typing import Optional
|
|
7
7
|
|
|
8
8
|
from chia.types.blockchain_format.coin import Coin
|
|
9
9
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
@@ -47,8 +47,8 @@ class GetCoinRecords(Streamable):
|
|
|
47
47
|
|
|
48
48
|
@dataclass(frozen=True)
|
|
49
49
|
class GetCoinRecordsResult:
|
|
50
|
-
records:
|
|
51
|
-
coin_id_to_record:
|
|
50
|
+
records: list[WalletCoinRecord]
|
|
51
|
+
coin_id_to_record: dict[bytes32, WalletCoinRecord]
|
|
52
52
|
total_count: Optional[uint32]
|
|
53
53
|
|
|
54
54
|
|
|
@@ -252,8 +252,8 @@ class WalletCoinStore:
|
|
|
252
252
|
total_count = uint32(row[0])
|
|
253
253
|
self.total_count_cache.put(cache_hash, total_count)
|
|
254
254
|
|
|
255
|
-
records:
|
|
256
|
-
coin_id_to_record:
|
|
255
|
+
records: list[WalletCoinRecord] = []
|
|
256
|
+
coin_id_to_record: dict[bytes32, WalletCoinRecord] = {}
|
|
257
257
|
for row in rows:
|
|
258
258
|
records.append(self.coin_record_from_row(row))
|
|
259
259
|
coin_id_to_record[bytes32.fromhex(row[0])] = records[-1]
|
|
@@ -266,7 +266,7 @@ class WalletCoinStore:
|
|
|
266
266
|
|
|
267
267
|
async def get_coin_records_between(
|
|
268
268
|
self, wallet_id: int, start: int, end: int, reverse: bool = False, coin_type: CoinType = CoinType.NORMAL
|
|
269
|
-
) ->
|
|
269
|
+
) -> list[WalletCoinRecord]:
|
|
270
270
|
"""Return a list of coins between start and end index. List is in reverse chronological order.
|
|
271
271
|
start = 0 is most recent transaction
|
|
272
272
|
"""
|
|
@@ -293,7 +293,7 @@ class WalletCoinStore:
|
|
|
293
293
|
|
|
294
294
|
async def get_unspent_coins_for_wallet(
|
|
295
295
|
self, wallet_id: int, coin_type: CoinType = CoinType.NORMAL
|
|
296
|
-
) ->
|
|
296
|
+
) -> set[WalletCoinRecord]:
|
|
297
297
|
"""Returns set of CoinRecords that have not been spent yet for a wallet."""
|
|
298
298
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
299
299
|
rows = await conn.execute_fetchall(
|
|
@@ -302,7 +302,7 @@ class WalletCoinStore:
|
|
|
302
302
|
)
|
|
303
303
|
return {self.coin_record_from_row(row) for row in rows}
|
|
304
304
|
|
|
305
|
-
async def get_all_unspent_coins(self, coin_type: CoinType = CoinType.NORMAL) ->
|
|
305
|
+
async def get_all_unspent_coins(self, coin_type: CoinType = CoinType.NORMAL) -> set[WalletCoinRecord]:
|
|
306
306
|
"""Returns set of CoinRecords that have not been spent yet for a wallet."""
|
|
307
307
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
308
308
|
rows = await conn.execute_fetchall(
|
|
@@ -311,7 +311,7 @@ class WalletCoinStore:
|
|
|
311
311
|
return {self.coin_record_from_row(row) for row in rows}
|
|
312
312
|
|
|
313
313
|
# Checks DB and DiffStores for CoinRecords with puzzle_hash and returns them
|
|
314
|
-
async def get_coin_records_by_puzzle_hash(self, puzzle_hash: bytes32) ->
|
|
314
|
+
async def get_coin_records_by_puzzle_hash(self, puzzle_hash: bytes32) -> list[WalletCoinRecord]:
|
|
315
315
|
"""Returns a list of all coin records with the given puzzle hash"""
|
|
316
316
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
317
317
|
rows = await conn.execute_fetchall("SELECT * from coin_record WHERE puzzle_hash=?", (puzzle_hash.hex(),))
|
|
@@ -319,7 +319,7 @@ class WalletCoinStore:
|
|
|
319
319
|
return [self.coin_record_from_row(row) for row in rows]
|
|
320
320
|
|
|
321
321
|
# Checks DB and DiffStores for CoinRecords with parent_coin_info and returns them
|
|
322
|
-
async def get_coin_records_by_parent_id(self, parent_coin_info: bytes32) ->
|
|
322
|
+
async def get_coin_records_by_parent_id(self, parent_coin_info: bytes32) -> list[WalletCoinRecord]:
|
|
323
323
|
"""Returns a list of all coin records with the given parent id"""
|
|
324
324
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
325
325
|
rows = await conn.execute_fetchall(
|
chia/wallet/wallet_info.py
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import List
|
|
5
4
|
|
|
6
5
|
from chia.util.ints import uint8, uint32
|
|
7
6
|
from chia.util.streamable import Streamable, streamable
|
|
@@ -33,4 +32,4 @@ class WalletInfoBackup(Streamable):
|
|
|
33
32
|
Used for transforming list of WalletInfo objects into bytes.
|
|
34
33
|
"""
|
|
35
34
|
|
|
36
|
-
wallet_list:
|
|
35
|
+
wallet_list: list[WalletInfo]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import Optional
|
|
4
4
|
|
|
5
5
|
from chia.protocols.wallet_protocol import CoinState
|
|
6
6
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
@@ -38,7 +38,7 @@ class WalletInterestedStore:
|
|
|
38
38
|
|
|
39
39
|
return self
|
|
40
40
|
|
|
41
|
-
async def get_interested_coin_ids(self) ->
|
|
41
|
+
async def get_interested_coin_ids(self) -> list[bytes32]:
|
|
42
42
|
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
43
43
|
cursor = await conn.execute("SELECT coin_name FROM interested_coins")
|
|
44
44
|
rows_hex = await cursor.fetchall()
|
|
@@ -54,7 +54,7 @@ class WalletInterestedStore:
|
|
|
54
54
|
cursor = await conn.execute("DELETE FROM interested_coins WHERE coin_name=?", (coin_id.hex(),))
|
|
55
55
|
await cursor.close()
|
|
56
56
|
|
|
57
|
-
async def get_interested_puzzle_hashes(self) ->
|
|
57
|
+
async def get_interested_puzzle_hashes(self) -> list[tuple[bytes32, int]]:
|
|
58
58
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
59
59
|
cursor = await conn.execute("SELECT puzzle_hash, wallet_id FROM interested_puzzle_hashes")
|
|
60
60
|
rows_hex = await cursor.fetchall()
|
|
@@ -111,7 +111,7 @@ class WalletInterestedStore:
|
|
|
111
111
|
)
|
|
112
112
|
await cursor.close()
|
|
113
113
|
|
|
114
|
-
async def get_unacknowledged_tokens(self) ->
|
|
114
|
+
async def get_unacknowledged_tokens(self) -> list:
|
|
115
115
|
"""
|
|
116
116
|
Get a list of all unacknowledged CATs
|
|
117
117
|
:return: A json style list of unacknowledged CATs
|
|
@@ -147,7 +147,7 @@ class WalletInterestedStore:
|
|
|
147
147
|
)
|
|
148
148
|
await cursor.close()
|
|
149
149
|
|
|
150
|
-
async def get_unacknowledged_states_for_asset_id(self, asset_id: bytes32) ->
|
|
150
|
+
async def get_unacknowledged_states_for_asset_id(self, asset_id: bytes32) -> list[tuple[CoinState, uint32]]:
|
|
151
151
|
"""
|
|
152
152
|
Return all states for a particular asset ID that were ignored
|
|
153
153
|
:param asset_id: CAT asset ID
|
chia/wallet/wallet_nft_store.py
CHANGED
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import json
|
|
4
4
|
import logging
|
|
5
5
|
from sqlite3 import Row
|
|
6
|
-
from typing import
|
|
6
|
+
from typing import Optional, TypeVar, Union
|
|
7
7
|
|
|
8
8
|
from chia.types.blockchain_format.coin import Coin
|
|
9
9
|
from chia.types.blockchain_format.program import Program
|
|
@@ -41,7 +41,7 @@ class WalletNftStore:
|
|
|
41
41
|
db_wrapper: DBWrapper2
|
|
42
42
|
|
|
43
43
|
@classmethod
|
|
44
|
-
async def create(cls:
|
|
44
|
+
async def create(cls: type[_T_WalletNftStore], db_wrapper: DBWrapper2) -> _T_WalletNftStore:
|
|
45
45
|
self = cls()
|
|
46
46
|
self.db_wrapper = db_wrapper
|
|
47
47
|
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
@@ -144,7 +144,7 @@ class WalletNftStore:
|
|
|
144
144
|
|
|
145
145
|
async def count(self, wallet_id: Optional[uint32] = None, did_id: Optional[bytes32] = None) -> int:
|
|
146
146
|
sql = "SELECT COUNT(nft_id) FROM users_nfts WHERE removed_height is NULL"
|
|
147
|
-
params:
|
|
147
|
+
params: list[Union[uint32, bytes32]] = []
|
|
148
148
|
if wallet_id is not None:
|
|
149
149
|
sql += " AND wallet_id=?"
|
|
150
150
|
params.append(wallet_id)
|
|
@@ -159,7 +159,7 @@ class WalletNftStore:
|
|
|
159
159
|
|
|
160
160
|
async def is_empty(self, wallet_id: Optional[uint32] = None) -> bool:
|
|
161
161
|
sql = "SELECT 1 FROM users_nfts WHERE removed_height is NULL"
|
|
162
|
-
params:
|
|
162
|
+
params: list[Union[uint32, bytes32]] = []
|
|
163
163
|
if wallet_id is not None:
|
|
164
164
|
sql += " AND wallet_id=?"
|
|
165
165
|
params.append(wallet_id)
|
|
@@ -176,7 +176,7 @@ class WalletNftStore:
|
|
|
176
176
|
did_id: Optional[bytes32] = None,
|
|
177
177
|
start_index: int = 0,
|
|
178
178
|
count: int = 50,
|
|
179
|
-
) ->
|
|
179
|
+
) -> list[NFTCoinInfo]:
|
|
180
180
|
try:
|
|
181
181
|
start_index = int(start_index)
|
|
182
182
|
except ValueError:
|
|
@@ -240,7 +240,7 @@ class WalletNftStore:
|
|
|
240
240
|
async def get_nft_by_id(self, nft_id: bytes32, wallet_id: Optional[uint32] = None) -> Optional[NFTCoinInfo]:
|
|
241
241
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
242
242
|
sql = f"SELECT {NFT_COIN_INFO_COLUMNS} from users_nfts WHERE removed_height is NULL and nft_id=?"
|
|
243
|
-
params:
|
|
243
|
+
params: list[Union[uint32, str]] = [nft_id.hex()]
|
|
244
244
|
if wallet_id:
|
|
245
245
|
sql += " and wallet_id=?"
|
|
246
246
|
params.append(wallet_id)
|
chia/wallet/wallet_node.py
CHANGED
|
@@ -9,22 +9,9 @@ import random
|
|
|
9
9
|
import sys
|
|
10
10
|
import time
|
|
11
11
|
import traceback
|
|
12
|
+
from collections.abc import AsyncIterator
|
|
12
13
|
from pathlib import Path
|
|
13
|
-
from typing import
|
|
14
|
-
TYPE_CHECKING,
|
|
15
|
-
Any,
|
|
16
|
-
AsyncIterator,
|
|
17
|
-
ClassVar,
|
|
18
|
-
Dict,
|
|
19
|
-
List,
|
|
20
|
-
Literal,
|
|
21
|
-
Optional,
|
|
22
|
-
Set,
|
|
23
|
-
Tuple,
|
|
24
|
-
Union,
|
|
25
|
-
cast,
|
|
26
|
-
overload,
|
|
27
|
-
)
|
|
14
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Literal, Optional, Union, cast, overload
|
|
28
15
|
|
|
29
16
|
import aiosqlite
|
|
30
17
|
from chia_rs import AugSchemeMPL, G1Element, G2Element, PrivateKey
|
|
@@ -68,6 +55,7 @@ from chia.util.keychain import Keychain
|
|
|
68
55
|
from chia.util.path import path_from_root
|
|
69
56
|
from chia.util.profiler import mem_profile_task, profile_task
|
|
70
57
|
from chia.util.streamable import Streamable, streamable
|
|
58
|
+
from chia.util.task_referencer import create_referenced_task
|
|
71
59
|
from chia.wallet.puzzles.clawback.metadata import AutoClaimSettings
|
|
72
60
|
from chia.wallet.transaction_record import TransactionRecord
|
|
73
61
|
from chia.wallet.util.new_peak_queue import NewPeakItem, NewPeakQueue, NewPeakQueueTypes
|
|
@@ -88,7 +76,7 @@ from chia.wallet.wallet_state_manager import WalletStateManager
|
|
|
88
76
|
from chia.wallet.wallet_weight_proof_handler import WalletWeightProofHandler, get_wp_fork_point
|
|
89
77
|
|
|
90
78
|
|
|
91
|
-
def get_wallet_db_path(root_path: Path, config:
|
|
79
|
+
def get_wallet_db_path(root_path: Path, config: dict[str, Any], key_fingerprint: str) -> Path:
|
|
92
80
|
"""
|
|
93
81
|
Construct a path to the wallet db. Uses config values and the wallet key's fingerprint to
|
|
94
82
|
determine the wallet db filename.
|
|
@@ -124,7 +112,7 @@ class WalletNode:
|
|
|
124
112
|
|
|
125
113
|
_protocol_check: ClassVar[RpcServiceProtocol] = cast("WalletNode", None)
|
|
126
114
|
|
|
127
|
-
config:
|
|
115
|
+
config: dict[str, Any]
|
|
128
116
|
root_path: Path
|
|
129
117
|
constants: ConsensusConstants
|
|
130
118
|
local_keychain: Optional[Keychain] = None
|
|
@@ -140,11 +128,11 @@ class WalletNode:
|
|
|
140
128
|
logged_in_fingerprint: Optional[int] = None
|
|
141
129
|
logged_in: bool = False
|
|
142
130
|
_keychain_proxy: Optional[KeychainProxy] = None
|
|
143
|
-
_balance_cache:
|
|
131
|
+
_balance_cache: dict[int, Balance] = dataclasses.field(default_factory=dict)
|
|
144
132
|
# Peers that we have long synced to
|
|
145
|
-
synced_peers:
|
|
133
|
+
synced_peers: set[bytes32] = dataclasses.field(default_factory=set)
|
|
146
134
|
wallet_peers: Optional[WalletPeers] = None
|
|
147
|
-
peer_caches:
|
|
135
|
+
peer_caches: dict[bytes32, PeerRequestCache] = dataclasses.field(default_factory=dict)
|
|
148
136
|
validation_semaphore: Optional[asyncio.Semaphore] = None
|
|
149
137
|
local_node_synced: bool = False
|
|
150
138
|
LONG_SYNC_THRESHOLD: int = 300
|
|
@@ -158,7 +146,7 @@ class WalletNode:
|
|
|
158
146
|
_process_new_subscriptions_task: Optional[asyncio.Task[None]] = None
|
|
159
147
|
_retry_failed_states_task: Optional[asyncio.Task[None]] = None
|
|
160
148
|
_secondary_peer_sync_task: Optional[asyncio.Task[None]] = None
|
|
161
|
-
_tx_messages_in_progress:
|
|
149
|
+
_tx_messages_in_progress: dict[bytes32, list[bytes32]] = dataclasses.field(default_factory=dict)
|
|
162
150
|
|
|
163
151
|
@contextlib.asynccontextmanager
|
|
164
152
|
async def manage(self) -> AsyncIterator[None]:
|
|
@@ -205,7 +193,7 @@ class WalletNode:
|
|
|
205
193
|
|
|
206
194
|
return self._new_peak_queue
|
|
207
195
|
|
|
208
|
-
def get_connections(self, request_node_type: Optional[NodeType]) ->
|
|
196
|
+
def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
|
|
209
197
|
return default_get_connections(server=self.server, request_node_type=request_node_type)
|
|
210
198
|
|
|
211
199
|
async def ensure_keychain_proxy(self) -> KeychainProxy:
|
|
@@ -306,7 +294,7 @@ class WalletNode:
|
|
|
306
294
|
self.log.info("Disabled resync for wallet fingerprint: %s", fingerprint)
|
|
307
295
|
save_config(self.root_path, "config.yaml", config)
|
|
308
296
|
|
|
309
|
-
def set_auto_claim(self, auto_claim_config: AutoClaimSettings) ->
|
|
297
|
+
def set_auto_claim(self, auto_claim_config: AutoClaimSettings) -> dict[str, Any]:
|
|
310
298
|
if auto_claim_config.batch_size < 1:
|
|
311
299
|
auto_claim_config = dataclasses.replace(auto_claim_config, batch_size=uint16(50))
|
|
312
300
|
auto_claim_config_json = auto_claim_config.to_json_dict()
|
|
@@ -356,7 +344,7 @@ class WalletNode:
|
|
|
356
344
|
self.log.info("Resetting wallet sync data...")
|
|
357
345
|
rows = list(await conn.execute_fetchall("SELECT name FROM sqlite_master WHERE type='table'"))
|
|
358
346
|
names = {x[0] for x in rows}
|
|
359
|
-
names
|
|
347
|
+
names -= set(known_tables)
|
|
360
348
|
tables_to_drop = []
|
|
361
349
|
for name in names:
|
|
362
350
|
for ignore_name in ignore_tables:
|
|
@@ -439,10 +427,10 @@ class WalletNode:
|
|
|
439
427
|
if sys.getprofile() is not None:
|
|
440
428
|
self.log.warning("not enabling profiler, getprofile() is already set")
|
|
441
429
|
else:
|
|
442
|
-
|
|
430
|
+
create_referenced_task(profile_task(self.root_path, "wallet", self.log), known_unreferenced=True)
|
|
443
431
|
|
|
444
432
|
if self.config.get("enable_memory_profiler", False):
|
|
445
|
-
|
|
433
|
+
create_referenced_task(mem_profile_task(self.root_path, "wallet", self.log), known_unreferenced=True)
|
|
446
434
|
|
|
447
435
|
path: Path = get_wallet_db_path(self.root_path, self.config, str(fingerprint))
|
|
448
436
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
@@ -468,8 +456,8 @@ class WalletNode:
|
|
|
468
456
|
self.wallet_tx_resend_timeout_secs = self.config.get("tx_resend_timeout_secs", 60 * 60)
|
|
469
457
|
self.wallet_state_manager.set_pending_callback(self._pending_tx_handler)
|
|
470
458
|
self._shut_down = False
|
|
471
|
-
self._process_new_subscriptions_task =
|
|
472
|
-
self._retry_failed_states_task =
|
|
459
|
+
self._process_new_subscriptions_task = create_referenced_task(self._process_new_subscriptions())
|
|
460
|
+
self._retry_failed_states_task = create_referenced_task(self._retry_failed_states())
|
|
473
461
|
|
|
474
462
|
self.sync_event = asyncio.Event()
|
|
475
463
|
self.log_in(fingerprint)
|
|
@@ -530,7 +518,7 @@ class WalletNode:
|
|
|
530
518
|
def _pending_tx_handler(self) -> None:
|
|
531
519
|
if self._wallet_state_manager is None:
|
|
532
520
|
return None
|
|
533
|
-
|
|
521
|
+
create_referenced_task(self._resend_queue(), known_unreferenced=True)
|
|
534
522
|
|
|
535
523
|
async def _resend_queue(self) -> None:
|
|
536
524
|
if self._shut_down or self._server is None or self._wallet_state_manager is None:
|
|
@@ -554,17 +542,17 @@ class WalletNode:
|
|
|
554
542
|
self._tx_messages_in_progress.setdefault(peer.peer_node_id, [])
|
|
555
543
|
self._tx_messages_in_progress[peer.peer_node_id].append(msg_name)
|
|
556
544
|
|
|
557
|
-
async def _messages_to_resend(self) ->
|
|
545
|
+
async def _messages_to_resend(self) -> list[tuple[Message, set[bytes32]]]:
|
|
558
546
|
if self._wallet_state_manager is None or self._shut_down:
|
|
559
547
|
return []
|
|
560
|
-
messages:
|
|
548
|
+
messages: list[tuple[Message, set[bytes32]]] = []
|
|
561
549
|
|
|
562
550
|
current_time = int(time.time())
|
|
563
551
|
retry_accepted_txs = False
|
|
564
552
|
if self.last_wallet_tx_resend_time < current_time - self.wallet_tx_resend_timeout_secs:
|
|
565
553
|
self.last_wallet_tx_resend_time = current_time
|
|
566
554
|
retry_accepted_txs = True
|
|
567
|
-
records:
|
|
555
|
+
records: list[TransactionRecord] = await self.wallet_state_manager.tx_store.get_not_sent(
|
|
568
556
|
include_accepted_txs=retry_accepted_txs
|
|
569
557
|
)
|
|
570
558
|
|
|
@@ -626,15 +614,15 @@ class WalletNode:
|
|
|
626
614
|
# Subscriptions are the highest priority, because we don't want to process any more peaks or
|
|
627
615
|
# state updates until we are sure that we subscribed to everything that we need to. Otherwise,
|
|
628
616
|
# we might not be able to process some state.
|
|
629
|
-
coin_ids:
|
|
617
|
+
coin_ids: list[bytes32] = item.data
|
|
630
618
|
for peer in self.server.get_connections(NodeType.FULL_NODE):
|
|
631
|
-
coin_states:
|
|
619
|
+
coin_states: list[CoinState] = await subscribe_to_coin_updates(coin_ids, peer, 0)
|
|
632
620
|
if len(coin_states) > 0:
|
|
633
621
|
async with self.wallet_state_manager.lock:
|
|
634
622
|
await self.add_states_from_peer(coin_states, peer)
|
|
635
623
|
elif item.item_type == NewPeakQueueTypes.PUZZLE_HASH_SUBSCRIPTION:
|
|
636
624
|
self.log.debug("Pulled from queue: %s %s", item.item_type.name, item.data)
|
|
637
|
-
puzzle_hashes:
|
|
625
|
+
puzzle_hashes: list[bytes32] = item.data
|
|
638
626
|
for peer in self.server.get_connections(NodeType.FULL_NODE):
|
|
639
627
|
# Puzzle hash subscription
|
|
640
628
|
coin_states = await subscribe_to_phs(puzzle_hashes, peer, 0)
|
|
@@ -731,7 +719,7 @@ class WalletNode:
|
|
|
731
719
|
default_port,
|
|
732
720
|
self.log,
|
|
733
721
|
)
|
|
734
|
-
|
|
722
|
+
create_referenced_task(self.wallet_peers.start())
|
|
735
723
|
|
|
736
724
|
async def on_disconnect(self, peer: WSChiaConnection) -> None:
|
|
737
725
|
if self.is_trusted(peer):
|
|
@@ -839,7 +827,7 @@ class WalletNode:
|
|
|
839
827
|
# Things, so we don't have to reprocess these later. There can be many things in ph_update_res.
|
|
840
828
|
use_delta_sync = self.config.get("use_delta_sync", False)
|
|
841
829
|
min_height_for_subscriptions = fork_height if use_delta_sync else 0
|
|
842
|
-
already_checked_ph:
|
|
830
|
+
already_checked_ph: set[bytes32] = set()
|
|
843
831
|
while not self._shut_down:
|
|
844
832
|
await self.wallet_state_manager.create_more_puzzle_hashes()
|
|
845
833
|
all_puzzle_hashes = await self.get_puzzle_hashes_to_subscribe()
|
|
@@ -847,7 +835,7 @@ class WalletNode:
|
|
|
847
835
|
if not_checked_puzzle_hashes == set():
|
|
848
836
|
break
|
|
849
837
|
for batch in to_batches(not_checked_puzzle_hashes, 1000):
|
|
850
|
-
ph_update_res:
|
|
838
|
+
ph_update_res: list[CoinState] = await subscribe_to_phs(
|
|
851
839
|
batch.entries, full_node, min_height_for_subscriptions
|
|
852
840
|
)
|
|
853
841
|
ph_update_res = list(filter(is_new_state_update, ph_update_res))
|
|
@@ -860,14 +848,14 @@ class WalletNode:
|
|
|
860
848
|
|
|
861
849
|
# The number of coin id updates are usually going to be significantly less than ph updates, so we can
|
|
862
850
|
# sync from 0 every time.
|
|
863
|
-
already_checked_coin_ids:
|
|
851
|
+
already_checked_coin_ids: set[bytes32] = set()
|
|
864
852
|
while not self._shut_down:
|
|
865
853
|
all_coin_ids = await self.get_coin_ids_to_subscribe()
|
|
866
854
|
not_checked_coin_ids = set(all_coin_ids) - already_checked_coin_ids
|
|
867
855
|
if not_checked_coin_ids == set():
|
|
868
856
|
break
|
|
869
857
|
for batch in to_batches(not_checked_coin_ids, 1000):
|
|
870
|
-
c_update_res:
|
|
858
|
+
c_update_res: list[CoinState] = await subscribe_to_coin_updates(
|
|
871
859
|
batch.entries, full_node, min_height_for_subscriptions
|
|
872
860
|
)
|
|
873
861
|
|
|
@@ -892,7 +880,7 @@ class WalletNode:
|
|
|
892
880
|
|
|
893
881
|
async def add_states_from_peer(
|
|
894
882
|
self,
|
|
895
|
-
items_input:
|
|
883
|
+
items_input: list[CoinState],
|
|
896
884
|
peer: WSChiaConnection,
|
|
897
885
|
fork_height: Optional[uint32] = None,
|
|
898
886
|
height: Optional[uint32] = None,
|
|
@@ -932,7 +920,7 @@ class WalletNode:
|
|
|
932
920
|
# Rollback race_cache not in clear_after_height to avoid applying rollbacks from new peak processing
|
|
933
921
|
cache.rollback_race_cache(fork_height=fork_height)
|
|
934
922
|
|
|
935
|
-
all_tasks:
|
|
923
|
+
all_tasks: list[asyncio.Task[None]] = []
|
|
936
924
|
target_concurrent_tasks: int = 30
|
|
937
925
|
|
|
938
926
|
# Ensure the list is sorted
|
|
@@ -943,7 +931,7 @@ class WalletNode:
|
|
|
943
931
|
if num_filtered > 0:
|
|
944
932
|
self.log.info(f"Filtered {num_filtered} spam transactions")
|
|
945
933
|
|
|
946
|
-
async def validate_and_add(inner_states:
|
|
934
|
+
async def validate_and_add(inner_states: list[CoinState], inner_idx_start: int) -> None:
|
|
947
935
|
try:
|
|
948
936
|
assert self.validation_semaphore is not None
|
|
949
937
|
async with self.validation_semaphore:
|
|
@@ -1012,7 +1000,7 @@ class WalletNode:
|
|
|
1012
1000
|
self.log.info("Terminating receipt and validation due to shut down request")
|
|
1013
1001
|
await asyncio.gather(*all_tasks)
|
|
1014
1002
|
return False
|
|
1015
|
-
all_tasks.append(
|
|
1003
|
+
all_tasks.append(create_referenced_task(validate_and_add(batch.entries, idx)))
|
|
1016
1004
|
idx += len(batch.entries)
|
|
1017
1005
|
|
|
1018
1006
|
still_connected = self._server is not None and peer.peer_node_id in self.server.all_connections
|
|
@@ -1046,12 +1034,12 @@ class WalletNode:
|
|
|
1046
1034
|
"""
|
|
1047
1035
|
Get a full node, preferring synced & trusted > synced & untrusted > unsynced & trusted > unsynced & untrusted
|
|
1048
1036
|
"""
|
|
1049
|
-
full_nodes:
|
|
1037
|
+
full_nodes: list[WSChiaConnection] = self.get_full_node_peers_in_order()
|
|
1050
1038
|
if len(full_nodes) == 0:
|
|
1051
1039
|
raise ValueError("No peer connected")
|
|
1052
1040
|
return full_nodes[0]
|
|
1053
1041
|
|
|
1054
|
-
def get_full_node_peers_in_order(self) ->
|
|
1042
|
+
def get_full_node_peers_in_order(self) -> list[WSChiaConnection]:
|
|
1055
1043
|
"""
|
|
1056
1044
|
Get all full nodes sorted:
|
|
1057
1045
|
preferring synced & trusted > synced & untrusted > unsynced & trusted > unsynced & untrusted
|
|
@@ -1059,11 +1047,11 @@ class WalletNode:
|
|
|
1059
1047
|
if self._server is None:
|
|
1060
1048
|
return []
|
|
1061
1049
|
|
|
1062
|
-
synced_and_trusted:
|
|
1063
|
-
synced:
|
|
1064
|
-
trusted:
|
|
1065
|
-
neither:
|
|
1066
|
-
all_nodes:
|
|
1050
|
+
synced_and_trusted: list[WSChiaConnection] = []
|
|
1051
|
+
synced: list[WSChiaConnection] = []
|
|
1052
|
+
trusted: list[WSChiaConnection] = []
|
|
1053
|
+
neither: list[WSChiaConnection] = []
|
|
1054
|
+
all_nodes: list[WSChiaConnection] = self.server.get_connections(NodeType.FULL_NODE)
|
|
1067
1055
|
random.shuffle(all_nodes)
|
|
1068
1056
|
for node in all_nodes:
|
|
1069
1057
|
we_synced_to_it = node.peer_node_id in self.synced_peers
|
|
@@ -1092,7 +1080,7 @@ class WalletNode:
|
|
|
1092
1080
|
block = cache.get_block(uint32(request_height))
|
|
1093
1081
|
if block is None:
|
|
1094
1082
|
self.log.debug(f"get_timestamp_for_height_from_peer cache miss for height {request_height}")
|
|
1095
|
-
response: Optional[
|
|
1083
|
+
response: Optional[list[HeaderBlock]] = await request_header_blocks(
|
|
1096
1084
|
peer, uint32(request_height), uint32(request_height)
|
|
1097
1085
|
)
|
|
1098
1086
|
if response is not None and len(response) > 0:
|
|
@@ -1124,10 +1112,14 @@ class WalletNode:
|
|
|
1124
1112
|
# When logging out of wallet
|
|
1125
1113
|
self.log.debug("state manager is None (shutdown)")
|
|
1126
1114
|
return
|
|
1127
|
-
|
|
1115
|
+
|
|
1128
1116
|
peak_hb: Optional[HeaderBlock] = await self.wallet_state_manager.blockchain.get_peak_block()
|
|
1117
|
+
if peak_hb is not None and peak_hb.header_hash == new_peak.header_hash:
|
|
1118
|
+
self.log.debug("skip known peak.")
|
|
1119
|
+
return
|
|
1120
|
+
|
|
1129
1121
|
if peak_hb is not None and new_peak.weight < peak_hb.weight:
|
|
1130
|
-
# Discards old blocks,
|
|
1122
|
+
# Discards old blocks, accept only heavier peaks blocks that are equal in weight to peak
|
|
1131
1123
|
self.log.debug("skip block with lower weight.")
|
|
1132
1124
|
return
|
|
1133
1125
|
|
|
@@ -1152,6 +1144,7 @@ class WalletNode:
|
|
|
1152
1144
|
# dont disconnect from peer, this might be a reorg
|
|
1153
1145
|
return
|
|
1154
1146
|
|
|
1147
|
+
trusted: bool = self.is_trusted(peer)
|
|
1155
1148
|
latest_timestamp = await self.get_timestamp_for_height_from_peer(new_peak_hb.height, peer)
|
|
1156
1149
|
if latest_timestamp is None or not self.is_timestamp_in_sync(latest_timestamp):
|
|
1157
1150
|
if trusted:
|
|
@@ -1162,7 +1155,9 @@ class WalletNode:
|
|
|
1162
1155
|
return
|
|
1163
1156
|
|
|
1164
1157
|
if self.is_trusted(peer):
|
|
1165
|
-
await self.new_peak_from_trusted(
|
|
1158
|
+
await self.new_peak_from_trusted(
|
|
1159
|
+
new_peak_hb, latest_timestamp, peer, new_peak.fork_point_with_previous_peak
|
|
1160
|
+
)
|
|
1166
1161
|
else:
|
|
1167
1162
|
if not await self.new_peak_from_untrusted(new_peak_hb, peer):
|
|
1168
1163
|
return
|
|
@@ -1179,15 +1174,16 @@ class WalletNode:
|
|
|
1179
1174
|
await self.wallet_state_manager.blockchain.set_finished_sync_up_to(new_peak.height)
|
|
1180
1175
|
|
|
1181
1176
|
async def new_peak_from_trusted(
|
|
1182
|
-
self, new_peak_hb: HeaderBlock, latest_timestamp: uint64, peer: WSChiaConnection
|
|
1177
|
+
self, new_peak_hb: HeaderBlock, latest_timestamp: uint64, peer: WSChiaConnection, fork_point: uint32
|
|
1183
1178
|
) -> None:
|
|
1184
1179
|
async with self.wallet_state_manager.set_sync_mode(new_peak_hb.height) as current_height:
|
|
1185
1180
|
await self.wallet_state_manager.blockchain.set_peak_block(new_peak_hb, latest_timestamp)
|
|
1186
|
-
# Sync to trusted node if we haven't done so yet. As long as we have synced once (and not
|
|
1187
|
-
# disconnected), we assume that the full node will continue to give us state updates, so we do
|
|
1188
|
-
# not need to resync.
|
|
1189
1181
|
if peer.peer_node_id not in self.synced_peers:
|
|
1190
1182
|
await self.long_sync(new_peak_hb.height, peer, uint32(max(0, current_height - 256)), rollback=True)
|
|
1183
|
+
elif fork_point < current_height - 1:
|
|
1184
|
+
await self.long_sync(
|
|
1185
|
+
new_peak_hb.height, peer, uint32(min(fork_point, current_height - 256)), rollback=True
|
|
1186
|
+
)
|
|
1191
1187
|
|
|
1192
1188
|
async def new_peak_from_untrusted(self, new_peak_hb: HeaderBlock, peer: WSChiaConnection) -> bool:
|
|
1193
1189
|
far_behind: bool = (
|
|
@@ -1243,7 +1239,7 @@ class WalletNode:
|
|
|
1243
1239
|
self.log.info("Secondary peer syncing")
|
|
1244
1240
|
# In this case we will not rollback so it's OK to check some older updates as well, to ensure
|
|
1245
1241
|
# that no recent transactions are being hidden.
|
|
1246
|
-
self._secondary_peer_sync_task =
|
|
1242
|
+
self._secondary_peer_sync_task = create_referenced_task(
|
|
1247
1243
|
self.long_sync(new_peak_hb.height, peer, 0, rollback=False)
|
|
1248
1244
|
)
|
|
1249
1245
|
|
|
@@ -1263,10 +1259,10 @@ class WalletNode:
|
|
|
1263
1259
|
# Edge case, this happens when the peak < WEIGHT_PROOF_RECENT_BLOCKS
|
|
1264
1260
|
# we still want to subscribe for all phs and coins.
|
|
1265
1261
|
# (Hints are not in filter)
|
|
1266
|
-
all_coin_ids:
|
|
1267
|
-
phs:
|
|
1268
|
-
ph_updates:
|
|
1269
|
-
coin_updates:
|
|
1262
|
+
all_coin_ids: list[bytes32] = await self.get_coin_ids_to_subscribe()
|
|
1263
|
+
phs: list[bytes32] = await self.get_puzzle_hashes_to_subscribe()
|
|
1264
|
+
ph_updates: list[CoinState] = await subscribe_to_phs(phs, peer, min_height_for_subscriptions)
|
|
1265
|
+
coin_updates: list[CoinState] = await subscribe_to_coin_updates(
|
|
1270
1266
|
all_coin_ids, peer, min_height_for_subscriptions
|
|
1271
1267
|
)
|
|
1272
1268
|
success = await self.add_states_from_peer(
|
|
@@ -1373,7 +1369,7 @@ class WalletNode:
|
|
|
1373
1369
|
|
|
1374
1370
|
return get_wp_fork_point(self.constants, old_proof, weight_proof)
|
|
1375
1371
|
|
|
1376
|
-
async def get_puzzle_hashes_to_subscribe(self) ->
|
|
1372
|
+
async def get_puzzle_hashes_to_subscribe(self) -> list[bytes32]:
|
|
1377
1373
|
all_puzzle_hashes = await self.wallet_state_manager.puzzle_store.get_all_puzzle_hashes(1)
|
|
1378
1374
|
# Get all phs from interested store
|
|
1379
1375
|
interested_puzzle_hashes = [
|
|
@@ -1382,7 +1378,7 @@ class WalletNode:
|
|
|
1382
1378
|
all_puzzle_hashes.update(interested_puzzle_hashes)
|
|
1383
1379
|
return list(all_puzzle_hashes)
|
|
1384
1380
|
|
|
1385
|
-
async def get_coin_ids_to_subscribe(self) ->
|
|
1381
|
+
async def get_coin_ids_to_subscribe(self) -> list[bytes32]:
|
|
1386
1382
|
coin_ids = await self.wallet_state_manager.trade_manager.get_coins_of_interest()
|
|
1387
1383
|
coin_ids.update(await self.wallet_state_manager.interested_store.get_interested_coin_ids())
|
|
1388
1384
|
return list(coin_ids)
|
|
@@ -1475,7 +1471,7 @@ class WalletNode:
|
|
|
1475
1471
|
# Peer is telling us that coin that was previously known to be spent is not spent anymore
|
|
1476
1472
|
# Check old state
|
|
1477
1473
|
|
|
1478
|
-
spent_state_blocks: Optional[
|
|
1474
|
+
spent_state_blocks: Optional[list[HeaderBlock]] = await request_header_blocks(
|
|
1479
1475
|
peer, current.spent_block_height, current.spent_block_height
|
|
1480
1476
|
)
|
|
1481
1477
|
if spent_state_blocks is None:
|
|
@@ -1601,7 +1597,7 @@ class WalletNode:
|
|
|
1601
1597
|
return False
|
|
1602
1598
|
all_peers_c = self.server.get_connections(NodeType.FULL_NODE)
|
|
1603
1599
|
all_peers = [(con, self.is_trusted(con)) for con in all_peers_c]
|
|
1604
|
-
blocks: Optional[
|
|
1600
|
+
blocks: Optional[list[HeaderBlock]] = await fetch_header_blocks_in_range(
|
|
1605
1601
|
start, end, peer_request_cache, all_peers
|
|
1606
1602
|
)
|
|
1607
1603
|
if blocks is None:
|
|
@@ -1618,9 +1614,9 @@ class WalletNode:
|
|
|
1618
1614
|
if last != weight_proof.sub_epochs[inserted].reward_chain_hash:
|
|
1619
1615
|
self.log.error("Failed validation 4")
|
|
1620
1616
|
return False
|
|
1621
|
-
pk_m_sig:
|
|
1622
|
-
sigs_to_cache:
|
|
1623
|
-
blocks_to_cache:
|
|
1617
|
+
pk_m_sig: list[tuple[G1Element, bytes32, G2Element]] = []
|
|
1618
|
+
sigs_to_cache: list[HeaderBlock] = []
|
|
1619
|
+
blocks_to_cache: list[tuple[bytes32, uint32]] = []
|
|
1624
1620
|
|
|
1625
1621
|
signatures_to_validate: int = 30
|
|
1626
1622
|
for idx in range(len(blocks)):
|
|
@@ -1684,10 +1680,10 @@ class WalletNode:
|
|
|
1684
1680
|
return True
|
|
1685
1681
|
|
|
1686
1682
|
async def get_coin_state(
|
|
1687
|
-
self, coin_names:
|
|
1688
|
-
) ->
|
|
1683
|
+
self, coin_names: list[bytes32], peer: WSChiaConnection, fork_height: Optional[uint32] = None
|
|
1684
|
+
) -> list[CoinState]:
|
|
1689
1685
|
msg = RegisterForCoinUpdates(coin_names, uint32(0))
|
|
1690
|
-
coin_state: Optional[RespondToCoinUpdates] = await peer.call_api(FullNodeAPI.
|
|
1686
|
+
coin_state: Optional[RespondToCoinUpdates] = await peer.call_api(FullNodeAPI.register_for_coin_updates, msg)
|
|
1691
1687
|
if coin_state is None or not isinstance(coin_state, RespondToCoinUpdates):
|
|
1692
1688
|
raise PeerRequestException(f"Was not able to get states for {coin_names}")
|
|
1693
1689
|
|
|
@@ -1709,7 +1705,7 @@ class WalletNode:
|
|
|
1709
1705
|
|
|
1710
1706
|
async def fetch_children(
|
|
1711
1707
|
self, coin_name: bytes32, peer: WSChiaConnection, fork_height: Optional[uint32] = None
|
|
1712
|
-
) ->
|
|
1708
|
+
) -> list[CoinState]:
|
|
1713
1709
|
response: Optional[RespondChildren] = await peer.call_api(
|
|
1714
1710
|
FullNodeAPI.request_children, RequestChildren(coin_name)
|
|
1715
1711
|
)
|
|
@@ -1747,7 +1743,7 @@ class WalletNode:
|
|
|
1747
1743
|
pending_change = await wallet.get_pending_change_balance()
|
|
1748
1744
|
max_send_amount = await wallet.get_max_send_amount(unspent_records)
|
|
1749
1745
|
|
|
1750
|
-
unconfirmed_removals:
|
|
1746
|
+
unconfirmed_removals: dict[bytes32, Coin] = await wallet.wallet_state_manager.unconfirmed_removals_for_wallet(
|
|
1751
1747
|
wallet_id
|
|
1752
1748
|
)
|
|
1753
1749
|
self._balance_cache[wallet_id] = Balance(
|