chia-blockchain 2.5.7rc3__py3-none-any.whl → 2.5.8rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/__init__.py +8 -4
- chia/_tests/blockchain/blockchain_test_utils.py +6 -8
- chia/_tests/blockchain/test_augmented_chain.py +4 -4
- chia/_tests/blockchain/test_blockchain.py +165 -190
- chia/_tests/blockchain/test_build_chains.py +2 -4
- chia/_tests/blockchain/test_get_block_generator.py +2 -3
- chia/_tests/clvm/coin_store.py +4 -7
- chia/_tests/clvm/test_clvm_step.py +4 -4
- chia/_tests/clvm/test_puzzle_compression.py +2 -1
- chia/_tests/clvm/test_puzzle_drivers.py +2 -2
- chia/_tests/clvm/test_singletons.py +2 -4
- chia/_tests/clvm/test_spend_sim.py +2 -2
- chia/_tests/cmds/cmd_test_utils.py +27 -45
- chia/_tests/cmds/test_cmd_framework.py +6 -6
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_show.py +4 -4
- chia/_tests/cmds/test_tx_config_args.py +1 -2
- chia/_tests/cmds/testing_classes.py +4 -5
- chia/_tests/cmds/wallet/test_did.py +24 -27
- chia/_tests/cmds/wallet/test_nft.py +12 -10
- chia/_tests/cmds/wallet/test_vcs.py +11 -12
- chia/_tests/cmds/wallet/test_wallet.py +134 -89
- chia/_tests/conftest.py +59 -30
- chia/_tests/connection_utils.py +2 -2
- chia/_tests/core/cmds/test_beta.py +4 -4
- chia/_tests/core/cmds/test_keys.py +2 -3
- chia/_tests/core/cmds/test_wallet.py +15 -15
- chia/_tests/core/consensus/test_pot_iterations.py +19 -73
- chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
- chia/_tests/core/daemon/test_daemon.py +11 -11
- chia/_tests/core/data_layer/conftest.py +2 -2
- chia/_tests/core/data_layer/test_data_rpc.py +28 -14
- chia/_tests/core/data_layer/test_data_store.py +10 -10
- chia/_tests/core/data_layer/util.py +11 -11
- chia/_tests/core/farmer/test_farmer_api.py +2 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
- chia/_tests/core/full_node/stores/test_block_store.py +5 -4
- chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
- chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +3 -4
- chia/_tests/core/full_node/test_conditions.py +21 -23
- chia/_tests/core/full_node/test_full_node.py +225 -62
- chia/_tests/core/full_node/test_hint_management.py +2 -4
- chia/_tests/core/full_node/test_performance.py +0 -1
- chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
- chia/_tests/core/full_node/test_transactions.py +1 -2
- chia/_tests/core/full_node/test_tx_processing_queue.py +109 -25
- chia/_tests/core/mempool/test_mempool.py +29 -37
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
- chia/_tests/core/mempool/test_mempool_manager.py +963 -839
- chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
- chia/_tests/core/server/serve.py +7 -7
- chia/_tests/core/server/test_dos.py +1 -2
- chia/_tests/core/server/test_event_loop.py +12 -4
- chia/_tests/core/server/test_loop.py +7 -8
- chia/_tests/core/server/test_rate_limits.py +9 -8
- chia/_tests/core/server/test_server.py +61 -1
- chia/_tests/core/services/test_services.py +2 -2
- chia/_tests/core/ssl/test_ssl.py +2 -2
- chia/_tests/core/test_cost_calculation.py +2 -6
- chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
- chia/_tests/core/test_filter.py +0 -1
- chia/_tests/core/test_full_node_rpc.py +2 -2
- chia/_tests/core/test_merkle_set.py +1 -2
- chia/_tests/core/test_seeder.py +4 -4
- chia/_tests/core/util/test_config.py +4 -4
- chia/_tests/core/util/test_jsonify.py +2 -2
- chia/_tests/core/util/test_keychain.py +3 -3
- chia/_tests/core/util/test_lockfile.py +2 -1
- chia/_tests/core/util/test_log_exceptions.py +1 -2
- chia/_tests/core/util/test_streamable.py +17 -17
- chia/_tests/db/test_db_wrapper.py +3 -2
- chia/_tests/environments/wallet.py +14 -14
- chia/_tests/ether.py +4 -3
- chia/_tests/farmer_harvester/test_farmer.py +41 -24
- chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
- chia/_tests/harvester/test_harvester_api.py +11 -4
- chia/_tests/plot_sync/test_plot_sync.py +13 -11
- chia/_tests/plot_sync/test_receiver.py +11 -10
- chia/_tests/plot_sync/test_sync_simulated.py +2 -2
- chia/_tests/plot_sync/util.py +1 -2
- chia/_tests/plotting/test_plot_manager.py +7 -6
- chia/_tests/plotting/test_prover.py +30 -38
- chia/_tests/pools/test_pool_cmdline.py +4 -6
- chia/_tests/pools/test_pool_rpc.py +203 -61
- chia/_tests/pools/test_pool_wallet.py +3 -3
- chia/_tests/pools/test_wallet_pool_store.py +1 -4
- chia/_tests/process_junit.py +2 -2
- chia/_tests/rpc/test_rpc_client.py +4 -4
- chia/_tests/rpc/test_rpc_server.py +3 -3
- chia/_tests/simulation/test_simulation.py +12 -25
- chia/_tests/solver/test_solver_service.py +13 -4
- chia/_tests/testconfig.py +2 -2
- chia/_tests/timelord/test_new_peak.py +22 -11
- chia/_tests/tools/test_run_block.py +0 -2
- chia/_tests/tools/test_virtual_project.py +2 -1
- chia/_tests/util/benchmarks.py +1 -0
- chia/_tests/util/blockchain.py +38 -36
- chia/_tests/util/blockchain_mock.py +11 -11
- chia/_tests/util/build_network_protocol_files.py +2 -1
- chia/_tests/util/coin_store.py +2 -1
- chia/_tests/util/config.py +1 -1
- chia/_tests/util/db_connection.py +2 -3
- chia/_tests/util/full_sync.py +9 -11
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/get_name_puzzle_conditions.py +2 -0
- chia/_tests/util/misc.py +24 -24
- chia/_tests/util/network_protocol_data.py +20 -3
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +292 -3
- chia/_tests/util/setup_nodes.py +62 -47
- chia/_tests/util/spend_sim.py +57 -57
- chia/_tests/util/test_async_pool.py +2 -3
- chia/_tests/util/test_chia_version.py +1 -3
- chia/_tests/util/test_config.py +3 -3
- chia/_tests/util/test_full_block_utils.py +6 -3
- chia/_tests/util/test_limited_semaphore.py +1 -2
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_network.py +1 -2
- chia/_tests/util/test_priority_mutex.py +3 -3
- chia/_tests/util/test_recursive_replace.py +5 -6
- chia/_tests/util/test_replace_str_to_bytes.py +8 -10
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/time_out_assert.py +2 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
- chia/_tests/wallet/conftest.py +6 -6
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
- chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
- chia/_tests/wallet/did_wallet/test_did.py +16 -6
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
- chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
- chia/_tests/wallet/sync/test_wallet_sync.py +43 -47
- chia/_tests/wallet/test_clvm_streamable.py +2 -3
- chia/_tests/wallet/test_coin_management.py +2 -2
- chia/_tests/wallet/test_conditions.py +45 -51
- chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
- chia/_tests/wallet/test_new_wallet_protocol.py +4 -6
- chia/_tests/wallet/test_notifications.py +14 -14
- chia/_tests/wallet/test_signer_protocol.py +5 -5
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
- chia/_tests/wallet/test_transaction_store.py +20 -20
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +380 -228
- chia/_tests/wallet/test_wallet_action_scope.py +4 -4
- chia/_tests/wallet/test_wallet_blockchain.py +12 -12
- chia/_tests/wallet/test_wallet_coin_store.py +3 -4
- chia/_tests/wallet/test_wallet_node.py +14 -14
- chia/_tests/wallet/test_wallet_test_framework.py +2 -1
- chia/_tests/wallet/test_wallet_utils.py +2 -3
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
- chia/_tests/wallet/wallet_block_tools.py +12 -11
- chia/_tests/weight_proof/config.py +1 -0
- chia/_tests/weight_proof/test_weight_proof.py +5 -4
- chia/apis/__init__.py +21 -0
- chia/apis/farmer_stub.py +102 -0
- chia/apis/full_node_stub.py +372 -0
- chia/apis/harvester_stub.py +57 -0
- chia/apis/introducer_stub.py +35 -0
- chia/apis/solver_stub.py +30 -0
- chia/apis/stub_protocol_registry.py +21 -0
- chia/apis/timelord_stub.py +39 -0
- chia/apis/wallet_stub.py +161 -0
- chia/cmds/beta.py +3 -4
- chia/cmds/beta_funcs.py +4 -3
- chia/cmds/check_wallet_db.py +4 -4
- chia/cmds/chia.py +1 -2
- chia/cmds/cmd_classes.py +11 -13
- chia/cmds/cmd_helpers.py +11 -11
- chia/cmds/cmds_util.py +15 -15
- chia/cmds/coin_funcs.py +6 -7
- chia/cmds/coins.py +2 -3
- chia/cmds/configure.py +1 -2
- chia/cmds/data.py +42 -42
- chia/cmds/data_funcs.py +81 -81
- chia/cmds/db.py +4 -5
- 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/data.py +4 -4
- chia/cmds/dev/gh.py +5 -5
- chia/cmds/dev/installers.py +2 -3
- chia/cmds/dev/mempool.py +3 -4
- chia/cmds/dev/mempool_funcs.py +4 -4
- chia/cmds/dev/sim.py +8 -8
- chia/cmds/dump_keyring.py +3 -3
- chia/cmds/farm.py +6 -8
- chia/cmds/farm_funcs.py +25 -24
- chia/cmds/init_funcs.py +4 -4
- chia/cmds/keys.py +16 -18
- chia/cmds/keys_funcs.py +36 -36
- chia/cmds/netspace.py +1 -3
- chia/cmds/netspace_funcs.py +1 -2
- chia/cmds/options.py +3 -2
- chia/cmds/param_types.py +17 -16
- chia/cmds/passphrase.py +6 -7
- chia/cmds/passphrase_funcs.py +11 -13
- chia/cmds/peer.py +1 -3
- chia/cmds/peer_funcs.py +3 -3
- chia/cmds/plotnft.py +6 -7
- chia/cmds/plotnft_funcs.py +37 -26
- chia/cmds/rpc.py +3 -3
- chia/cmds/show.py +3 -5
- chia/cmds/show_funcs.py +9 -9
- chia/cmds/sim_funcs.py +25 -26
- chia/cmds/solver.py +1 -3
- chia/cmds/solver_funcs.py +1 -2
- chia/cmds/start_funcs.py +2 -2
- chia/cmds/wallet.py +76 -81
- chia/cmds/wallet_funcs.py +206 -177
- chia/consensus/augmented_chain.py +6 -6
- chia/consensus/block_body_validation.py +19 -15
- chia/consensus/block_creation.py +25 -21
- chia/consensus/block_header_validation.py +27 -13
- chia/consensus/block_height_map.py +3 -6
- chia/consensus/block_height_map_protocol.py +2 -2
- chia/consensus/block_record.py +2 -4
- chia/consensus/blockchain.py +58 -40
- chia/consensus/blockchain_interface.py +7 -7
- chia/consensus/coin_store_protocol.py +5 -6
- chia/consensus/condition_tools.py +4 -4
- chia/consensus/cost_calculator.py +2 -3
- chia/consensus/default_constants.py +16 -13
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +3 -5
- chia/consensus/find_fork_point.py +2 -4
- chia/consensus/full_block_to_block_record.py +11 -13
- chia/consensus/generator_tools.py +2 -3
- chia/consensus/get_block_challenge.py +42 -26
- chia/consensus/get_block_generator.py +2 -3
- chia/consensus/make_sub_epoch_summary.py +8 -7
- chia/consensus/multiprocess_validation.py +31 -20
- chia/consensus/pos_quality.py +6 -23
- chia/consensus/pot_iterations.py +17 -44
- chia/consensus/signage_point.py +4 -5
- chia/consensus/vdf_info_computation.py +2 -4
- chia/daemon/client.py +8 -8
- chia/daemon/keychain_proxy.py +31 -37
- chia/daemon/server.py +32 -33
- chia/daemon/windows_signal.py +4 -3
- chia/data_layer/data_layer.py +86 -77
- chia/data_layer/data_layer_rpc_api.py +9 -9
- chia/data_layer/data_layer_rpc_client.py +13 -15
- chia/data_layer/data_layer_server.py +3 -3
- chia/data_layer/data_layer_util.py +14 -14
- chia/data_layer/data_layer_wallet.py +94 -101
- chia/data_layer/data_store.py +50 -50
- chia/data_layer/dl_wallet_store.py +9 -12
- chia/data_layer/download_data.py +8 -9
- chia/data_layer/s3_plugin_service.py +5 -9
- chia/data_layer/start_data_layer.py +5 -5
- chia/farmer/farmer.py +31 -31
- chia/farmer/farmer_api.py +45 -33
- chia/farmer/farmer_rpc_api.py +5 -4
- chia/farmer/farmer_rpc_client.py +6 -6
- chia/farmer/start_farmer.py +12 -7
- chia/full_node/block_store.py +13 -16
- chia/full_node/check_fork_next_block.py +1 -2
- chia/full_node/coin_store.py +15 -16
- chia/full_node/eligible_coin_spends.py +3 -3
- chia/full_node/fee_estimate_store.py +2 -3
- chia/full_node/fee_tracker.py +1 -2
- chia/full_node/full_block_utils.py +4 -4
- chia/full_node/full_node.py +238 -224
- chia/full_node/full_node_api.py +193 -150
- chia/full_node/full_node_rpc_api.py +53 -31
- chia/full_node/full_node_rpc_client.py +18 -19
- chia/full_node/full_node_store.py +45 -43
- chia/full_node/hint_management.py +2 -2
- chia/full_node/mempool.py +17 -19
- chia/full_node/mempool_manager.py +89 -42
- chia/full_node/pending_tx_cache.py +2 -3
- chia/full_node/start_full_node.py +5 -5
- chia/full_node/sync_store.py +3 -4
- chia/full_node/tx_processing_queue.py +34 -13
- chia/full_node/weight_proof.py +61 -48
- chia/harvester/harvester.py +25 -24
- chia/harvester/harvester_api.py +61 -38
- chia/harvester/harvester_rpc_api.py +10 -10
- chia/harvester/start_harvester.py +4 -4
- chia/introducer/introducer.py +3 -3
- chia/introducer/introducer_api.py +6 -4
- chia/introducer/start_introducer.py +4 -4
- chia/legacy/keyring.py +3 -3
- chia/plot_sync/delta.py +1 -2
- chia/plot_sync/receiver.py +20 -17
- chia/plot_sync/sender.py +15 -10
- chia/plotters/bladebit.py +7 -7
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +4 -4
- chia/plotters/plotters.py +4 -4
- chia/plotters/plotters_util.py +3 -3
- chia/plotting/cache.py +20 -14
- chia/plotting/check_plots.py +26 -35
- chia/plotting/create_plots.py +22 -23
- chia/plotting/manager.py +21 -14
- chia/plotting/prover.py +59 -42
- chia/plotting/util.py +16 -16
- chia/pools/pool_config.py +2 -1
- chia/pools/pool_puzzles.py +11 -12
- chia/pools/pool_wallet.py +34 -57
- chia/pools/pool_wallet_info.py +39 -10
- chia/protocols/farmer_protocol.py +8 -9
- chia/protocols/fee_estimate.py +3 -4
- chia/protocols/full_node_protocol.py +3 -4
- chia/protocols/harvester_protocol.py +27 -15
- chia/protocols/outbound_message.py +3 -3
- chia/protocols/pool_protocol.py +8 -9
- chia/protocols/shared_protocol.py +1 -2
- chia/protocols/solver_protocol.py +9 -2
- chia/protocols/timelord_protocol.py +4 -7
- chia/protocols/wallet_protocol.py +11 -12
- chia/rpc/rpc_client.py +9 -9
- chia/rpc/rpc_server.py +17 -17
- chia/rpc/util.py +2 -2
- chia/seeder/crawler.py +8 -8
- chia/seeder/crawler_api.py +21 -27
- chia/seeder/crawler_rpc_api.py +2 -2
- chia/seeder/dns_server.py +21 -21
- chia/seeder/start_crawler.py +4 -4
- chia/server/address_manager.py +15 -16
- chia/server/api_protocol.py +11 -11
- chia/server/chia_policy.py +46 -26
- chia/server/introducer_peers.py +2 -3
- chia/server/node_discovery.py +19 -19
- chia/server/rate_limit_numbers.py +4 -5
- chia/server/rate_limits.py +4 -4
- chia/server/resolve_peer_info.py +4 -4
- chia/server/server.py +49 -52
- chia/server/signal_handlers.py +6 -6
- chia/server/start_service.py +17 -17
- chia/server/upnp.py +4 -6
- chia/server/ws_connection.py +52 -37
- chia/simulator/add_blocks_in_batches.py +1 -3
- chia/simulator/block_tools.py +312 -200
- chia/simulator/full_node_simulator.py +56 -35
- chia/simulator/keyring.py +2 -3
- chia/simulator/setup_services.py +16 -15
- chia/simulator/simulator_full_node_rpc_api.py +1 -2
- chia/simulator/simulator_full_node_rpc_client.py +1 -2
- chia/simulator/simulator_protocol.py +1 -2
- chia/simulator/simulator_test_tools.py +3 -3
- chia/simulator/start_simulator.py +7 -7
- chia/simulator/wallet_tools.py +10 -10
- chia/solver/solver.py +10 -10
- chia/solver/solver_api.py +10 -8
- chia/solver/solver_rpc_api.py +2 -2
- chia/solver/start_solver.py +4 -4
- chia/ssl/cacert.pem +148 -90
- chia/ssl/chia_ca.crt +14 -10
- chia/ssl/chia_ca_old.crt +19 -0
- chia/ssl/create_ssl.py +4 -4
- chia/ssl/renewedselfsignedca.conf +4 -0
- chia/ssl/ssl_check.py +1 -2
- chia/timelord/iters_from_block.py +1 -4
- chia/timelord/start_timelord.py +4 -4
- chia/timelord/timelord.py +44 -40
- chia/timelord/timelord_api.py +6 -4
- chia/timelord/timelord_launcher.py +2 -2
- chia/timelord/timelord_rpc_api.py +2 -2
- chia/timelord/timelord_state.py +11 -12
- chia/types/block_protocol.py +1 -3
- chia/types/blockchain_format/coin.py +1 -3
- chia/types/blockchain_format/program.py +11 -8
- chia/types/blockchain_format/proof_of_space.py +123 -76
- chia/types/blockchain_format/tree_hash.py +3 -3
- chia/types/blockchain_format/vdf.py +1 -2
- chia/types/coin_spend.py +3 -3
- chia/types/mempool_item.py +5 -5
- chia/types/mempool_submission_status.py +2 -3
- chia/types/peer_info.py +1 -2
- chia/types/unfinished_header_block.py +3 -4
- chia/types/validation_state.py +1 -2
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +5 -5
- chia/util/bech32m.py +1 -2
- chia/util/beta_metrics.py +2 -2
- chia/util/block_cache.py +4 -4
- chia/util/chia_logging.py +2 -2
- chia/util/chia_version.py +1 -2
- chia/util/config.py +15 -16
- chia/util/db_wrapper.py +26 -27
- chia/util/default_root.py +1 -2
- chia/util/errors.py +3 -3
- chia/util/file_keyring.py +14 -14
- chia/util/files.py +2 -3
- chia/util/hash.py +4 -4
- chia/util/initial-config.yaml +3 -5
- chia/util/inline_executor.py +2 -1
- chia/util/ip_address.py +1 -2
- chia/util/keychain.py +25 -27
- chia/util/keyring_wrapper.py +18 -19
- chia/util/lock.py +3 -4
- chia/util/log_exceptions.py +1 -2
- chia/util/lru_cache.py +2 -2
- chia/util/network.py +6 -6
- chia/util/path.py +2 -3
- chia/util/priority_mutex.py +2 -2
- chia/util/profiler.py +1 -2
- chia/util/safe_cancel_task.py +1 -2
- chia/util/streamable.py +22 -8
- chia/util/task_referencer.py +1 -1
- chia/util/timing.py +3 -3
- chia/util/virtual_project_analysis.py +6 -5
- chia/util/ws_message.py +2 -2
- chia/wallet/cat_wallet/cat_info.py +3 -4
- chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
- chia/wallet/cat_wallet/cat_utils.py +3 -4
- chia/wallet/cat_wallet/cat_wallet.py +61 -83
- chia/wallet/cat_wallet/lineage_store.py +3 -4
- chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
- chia/wallet/coin_selection.py +9 -10
- chia/wallet/conditions.py +120 -105
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
- chia/wallet/derivation_record.py +1 -2
- chia/wallet/derive_keys.py +2 -4
- chia/wallet/did_wallet/did_info.py +10 -11
- chia/wallet/did_wallet/did_wallet.py +36 -82
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
- chia/wallet/driver_protocol.py +5 -7
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
- chia/wallet/nft_wallet/nft_info.py +8 -9
- chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
- chia/wallet/nft_wallet/nft_wallet.py +79 -116
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
- chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
- chia/wallet/nft_wallet/uncurry_nft.py +10 -11
- chia/wallet/notification_manager.py +3 -3
- chia/wallet/notification_store.py +44 -61
- chia/wallet/outer_puzzles.py +6 -7
- chia/wallet/puzzle_drivers.py +34 -6
- chia/wallet/puzzles/clawback/drivers.py +6 -6
- chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
- chia/wallet/puzzles/load_clvm.py +1 -1
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
- chia/wallet/puzzles/singleton_top_layer.py +2 -3
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
- chia/wallet/puzzles/tails.py +3 -3
- chia/wallet/singleton.py +5 -7
- chia/wallet/singleton_record.py +3 -3
- chia/wallet/start_wallet.py +5 -5
- chia/wallet/trade_manager.py +37 -58
- chia/wallet/trade_record.py +4 -4
- chia/wallet/trading/offer.py +59 -46
- chia/wallet/trading/trade_store.py +8 -9
- chia/wallet/transaction_record.py +8 -8
- chia/wallet/uncurried_puzzle.py +1 -2
- chia/wallet/util/clvm_streamable.py +12 -12
- chia/wallet/util/compute_hints.py +4 -5
- chia/wallet/util/curry_and_treehash.py +1 -2
- chia/wallet/util/merkle_tree.py +2 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/wallet/util/signing.py +85 -0
- chia/wallet/util/tx_config.py +15 -6
- chia/wallet/util/wallet_sync_utils.py +14 -16
- chia/wallet/util/wallet_types.py +2 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
- chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
- chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
- chia/wallet/vc_wallet/vc_drivers.py +27 -27
- chia/wallet/vc_wallet/vc_store.py +5 -6
- chia/wallet/vc_wallet/vc_wallet.py +33 -61
- chia/wallet/wallet.py +50 -78
- chia/wallet/wallet_action_scope.py +11 -11
- chia/wallet/wallet_blockchain.py +12 -12
- chia/wallet/wallet_coin_record.py +12 -6
- chia/wallet/wallet_coin_store.py +24 -25
- chia/wallet/wallet_interested_store.py +3 -5
- chia/wallet/wallet_nft_store.py +10 -11
- chia/wallet/wallet_node.py +53 -61
- chia/wallet/wallet_node_api.py +5 -3
- chia/wallet/wallet_protocol.py +23 -23
- chia/wallet/wallet_puzzle_store.py +15 -18
- chia/wallet/wallet_request_types.py +778 -114
- chia/wallet/wallet_retry_store.py +1 -3
- chia/wallet/wallet_rpc_api.py +572 -909
- chia/wallet/wallet_rpc_client.py +87 -279
- chia/wallet/wallet_singleton_store.py +3 -4
- chia/wallet/wallet_state_manager.py +332 -106
- chia/wallet/wallet_transaction_store.py +11 -14
- chia/wallet/wallet_user_store.py +4 -6
- chia/wallet/wallet_weight_proof_handler.py +4 -4
- {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
- chia/apis.py +0 -21
- chia/consensus/check_time_locks.py +0 -57
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
- chia/types/coin_record.py +0 -44
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
- {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
chia/wallet/wallet_nft_store.py
CHANGED
|
@@ -3,7 +3,6 @@ from __future__ import annotations
|
|
|
3
3
|
import json
|
|
4
4
|
import logging
|
|
5
5
|
from sqlite3 import Row
|
|
6
|
-
from typing import Optional, Union
|
|
7
6
|
|
|
8
7
|
from chia_rs.sized_bytes import bytes32
|
|
9
8
|
from chia_rs.sized_ints import uint32
|
|
@@ -110,7 +109,7 @@ class WalletNftStore:
|
|
|
110
109
|
)
|
|
111
110
|
return c.rowcount > 0
|
|
112
111
|
|
|
113
|
-
async def save_nft(self, wallet_id: uint32, did_id:
|
|
112
|
+
async def save_nft(self, wallet_id: uint32, did_id: bytes32 | None, nft_coin_info: NFTCoinInfo) -> None:
|
|
114
113
|
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
115
114
|
columns = (
|
|
116
115
|
"nft_id, nft_coin_id, wallet_id, did_id, coin, lineage_proof, mint_height, status, full_puzzle, "
|
|
@@ -143,9 +142,9 @@ class WalletNftStore:
|
|
|
143
142
|
(int(nft_coin_info.latest_height) - REMOVE_BUFF_BLOCKS,),
|
|
144
143
|
)
|
|
145
144
|
|
|
146
|
-
async def count(self, wallet_id:
|
|
145
|
+
async def count(self, wallet_id: uint32 | None = None, did_id: bytes32 | None = None) -> int:
|
|
147
146
|
sql = "SELECT COUNT(nft_id) FROM users_nfts WHERE removed_height is NULL"
|
|
148
|
-
params: list[
|
|
147
|
+
params: list[uint32 | bytes32] = []
|
|
149
148
|
if wallet_id is not None:
|
|
150
149
|
sql += " AND wallet_id=?"
|
|
151
150
|
params.append(wallet_id)
|
|
@@ -158,9 +157,9 @@ class WalletNftStore:
|
|
|
158
157
|
return int(count_row[0])
|
|
159
158
|
return -1
|
|
160
159
|
|
|
161
|
-
async def is_empty(self, wallet_id:
|
|
160
|
+
async def is_empty(self, wallet_id: uint32 | None = None) -> bool:
|
|
162
161
|
sql = "SELECT 1 FROM users_nfts WHERE removed_height is NULL"
|
|
163
|
-
params: list[
|
|
162
|
+
params: list[uint32 | bytes32] = []
|
|
164
163
|
if wallet_id is not None:
|
|
165
164
|
sql += " AND wallet_id=?"
|
|
166
165
|
params.append(wallet_id)
|
|
@@ -173,8 +172,8 @@ class WalletNftStore:
|
|
|
173
172
|
|
|
174
173
|
async def get_nft_list(
|
|
175
174
|
self,
|
|
176
|
-
wallet_id:
|
|
177
|
-
did_id:
|
|
175
|
+
wallet_id: uint32 | None = None,
|
|
176
|
+
did_id: bytes32 | None = None,
|
|
178
177
|
start_index: int = 0,
|
|
179
178
|
count: int = 50,
|
|
180
179
|
) -> list[NFTCoinInfo]:
|
|
@@ -224,7 +223,7 @@ class WalletNftStore:
|
|
|
224
223
|
)
|
|
225
224
|
return True if rows and rows[0] == 1 else False
|
|
226
225
|
|
|
227
|
-
async def get_nft_by_coin_id(self, nft_coin_id: bytes32) ->
|
|
226
|
+
async def get_nft_by_coin_id(self, nft_coin_id: bytes32) -> NFTCoinInfo | None:
|
|
228
227
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
229
228
|
rows = await conn.execute_fetchall(
|
|
230
229
|
f"SELECT {NFT_COIN_INFO_COLUMNS} from users_nfts WHERE removed_height is NULL and nft_coin_id = ?",
|
|
@@ -237,10 +236,10 @@ class WalletNftStore:
|
|
|
237
236
|
raise ValueError("Can only return one NFT, but found > 1 from given coin ids")
|
|
238
237
|
return None
|
|
239
238
|
|
|
240
|
-
async def get_nft_by_id(self, nft_id: bytes32, wallet_id:
|
|
239
|
+
async def get_nft_by_id(self, nft_id: bytes32, wallet_id: uint32 | None = None) -> NFTCoinInfo | None:
|
|
241
240
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
242
241
|
sql = f"SELECT {NFT_COIN_INFO_COLUMNS} from users_nfts WHERE removed_height is NULL and nft_id=?"
|
|
243
|
-
params: list[
|
|
242
|
+
params: list[uint32 | str] = [nft_id.hex()]
|
|
244
243
|
if wallet_id:
|
|
245
244
|
sql += " and wallet_id=?"
|
|
246
245
|
params.append(wallet_id)
|
chia/wallet/wallet_node.py
CHANGED
|
@@ -11,7 +11,7 @@ import time
|
|
|
11
11
|
import traceback
|
|
12
12
|
from collections.abc import AsyncIterator
|
|
13
13
|
from pathlib import Path
|
|
14
|
-
from typing import TYPE_CHECKING, Any, ClassVar, Literal,
|
|
14
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Literal, cast, overload
|
|
15
15
|
|
|
16
16
|
import aiosqlite
|
|
17
17
|
from chia_rs import AugSchemeMPL, CoinState, ConsensusConstants, G1Element, G2Element, HeaderBlock, PrivateKey
|
|
@@ -112,37 +112,37 @@ class WalletNode:
|
|
|
112
112
|
config: dict[str, Any]
|
|
113
113
|
root_path: Path
|
|
114
114
|
constants: ConsensusConstants
|
|
115
|
-
local_keychain:
|
|
115
|
+
local_keychain: Keychain | None = None
|
|
116
116
|
|
|
117
117
|
log: logging.Logger = logging.getLogger(__name__)
|
|
118
118
|
|
|
119
119
|
# Sync data
|
|
120
|
-
state_changed_callback:
|
|
121
|
-
_wallet_state_manager:
|
|
122
|
-
_weight_proof_handler:
|
|
123
|
-
_server:
|
|
124
|
-
sync_task:
|
|
125
|
-
logged_in_fingerprint:
|
|
120
|
+
state_changed_callback: StateChangedProtocol | None = None
|
|
121
|
+
_wallet_state_manager: WalletStateManager | None = None
|
|
122
|
+
_weight_proof_handler: WalletWeightProofHandler | None = None
|
|
123
|
+
_server: ChiaServer | None = None
|
|
124
|
+
sync_task: asyncio.Task[None] | None = None
|
|
125
|
+
logged_in_fingerprint: int | None = None
|
|
126
126
|
logged_in: bool = False
|
|
127
|
-
_keychain_proxy:
|
|
127
|
+
_keychain_proxy: KeychainProxy | None = None
|
|
128
128
|
_balance_cache: dict[int, Balance] = dataclasses.field(default_factory=dict)
|
|
129
129
|
# Peers that we have long synced to
|
|
130
130
|
synced_peers: set[bytes32] = dataclasses.field(default_factory=set)
|
|
131
|
-
wallet_peers:
|
|
131
|
+
wallet_peers: WalletPeers | None = None
|
|
132
132
|
peer_caches: dict[bytes32, PeerRequestCache] = dataclasses.field(default_factory=dict)
|
|
133
|
-
validation_semaphore:
|
|
133
|
+
validation_semaphore: asyncio.Semaphore | None = None
|
|
134
134
|
local_node_synced: bool = False
|
|
135
135
|
LONG_SYNC_THRESHOLD: int = 300
|
|
136
136
|
last_wallet_tx_resend_time: int = 0
|
|
137
137
|
# Duration in seconds
|
|
138
138
|
coin_state_retry_seconds: int = 10
|
|
139
139
|
wallet_tx_resend_timeout_secs: int = 1800
|
|
140
|
-
_new_peak_queue:
|
|
140
|
+
_new_peak_queue: NewPeakQueue | None = None
|
|
141
141
|
|
|
142
142
|
_shut_down: bool = False
|
|
143
|
-
_process_new_subscriptions_task:
|
|
144
|
-
_retry_failed_states_task:
|
|
145
|
-
_secondary_peer_sync_task:
|
|
143
|
+
_process_new_subscriptions_task: asyncio.Task[None] | None = None
|
|
144
|
+
_retry_failed_states_task: asyncio.Task[None] | None = None
|
|
145
|
+
_secondary_peer_sync_task: asyncio.Task[None] | None = None
|
|
146
146
|
_tx_messages_in_progress: dict[bytes32, list[bytes32]] = dataclasses.field(default_factory=dict)
|
|
147
147
|
|
|
148
148
|
@contextlib.asynccontextmanager
|
|
@@ -190,7 +190,7 @@ class WalletNode:
|
|
|
190
190
|
|
|
191
191
|
return self._new_peak_queue
|
|
192
192
|
|
|
193
|
-
def get_connections(self, request_node_type:
|
|
193
|
+
def get_connections(self, request_node_type: NodeType | None) -> list[dict[str, Any]]:
|
|
194
194
|
return default_get_connections(server=self.server, request_node_type=request_node_type)
|
|
195
195
|
|
|
196
196
|
async def ensure_keychain_proxy(self) -> KeychainProxy:
|
|
@@ -214,30 +214,26 @@ class WalletNode:
|
|
|
214
214
|
cache.clear_after_height(reorg_height)
|
|
215
215
|
|
|
216
216
|
@overload
|
|
217
|
-
async def get_key_for_fingerprint(self, fingerprint:
|
|
217
|
+
async def get_key_for_fingerprint(self, fingerprint: int | None) -> G1Element | None: ...
|
|
218
218
|
|
|
219
219
|
@overload
|
|
220
|
-
async def get_key_for_fingerprint(
|
|
221
|
-
self, fingerprint: Optional[int], private: Literal[True]
|
|
222
|
-
) -> Optional[PrivateKey]: ...
|
|
220
|
+
async def get_key_for_fingerprint(self, fingerprint: int | None, private: Literal[True]) -> PrivateKey | None: ...
|
|
223
221
|
|
|
224
222
|
@overload
|
|
225
|
-
async def get_key_for_fingerprint(
|
|
226
|
-
self, fingerprint: Optional[int], private: Literal[False]
|
|
227
|
-
) -> Optional[G1Element]: ...
|
|
223
|
+
async def get_key_for_fingerprint(self, fingerprint: int | None, private: Literal[False]) -> G1Element | None: ...
|
|
228
224
|
|
|
229
225
|
@overload
|
|
230
226
|
async def get_key_for_fingerprint(
|
|
231
|
-
self, fingerprint:
|
|
232
|
-
) ->
|
|
227
|
+
self, fingerprint: int | None, private: bool
|
|
228
|
+
) -> PrivateKey | G1Element | None: ...
|
|
233
229
|
|
|
234
230
|
async def get_key_for_fingerprint(
|
|
235
|
-
self, fingerprint:
|
|
236
|
-
) ->
|
|
231
|
+
self, fingerprint: int | None, private: bool = False
|
|
232
|
+
) -> PrivateKey | G1Element | None:
|
|
237
233
|
try:
|
|
238
234
|
keychain_proxy = await self.ensure_keychain_proxy()
|
|
239
235
|
# Returns first key if fingerprint is None
|
|
240
|
-
key:
|
|
236
|
+
key: PrivateKey | G1Element | None = await keychain_proxy.get_key_for_fingerprint(
|
|
241
237
|
fingerprint, private=private
|
|
242
238
|
)
|
|
243
239
|
except KeychainIsEmpty:
|
|
@@ -257,14 +253,14 @@ class WalletNode:
|
|
|
257
253
|
return key
|
|
258
254
|
|
|
259
255
|
async def get_key(
|
|
260
|
-
self, fingerprint:
|
|
261
|
-
) ->
|
|
256
|
+
self, fingerprint: int | None, private: bool = True, find_a_default: bool = True
|
|
257
|
+
) -> PrivateKey | G1Element | None:
|
|
262
258
|
"""
|
|
263
259
|
Attempt to get the private key for the given fingerprint. If the fingerprint is None,
|
|
264
260
|
get_key_for_fingerprint() will return the first private key. Similarly, if a key isn't
|
|
265
261
|
returned for the provided fingerprint, the first key will be returned.
|
|
266
262
|
"""
|
|
267
|
-
key:
|
|
263
|
+
key: PrivateKey | G1Element | None = await self.get_key_for_fingerprint(fingerprint, private=private)
|
|
268
264
|
|
|
269
265
|
if key is None and fingerprint is not None and find_a_default:
|
|
270
266
|
key = await self.get_key_for_fingerprint(None, private=private)
|
|
@@ -304,7 +300,7 @@ class WalletNode:
|
|
|
304
300
|
save_config(self.root_path, "config.yaml", config)
|
|
305
301
|
return auto_claim_config.to_json_dict()
|
|
306
302
|
|
|
307
|
-
async def reset_sync_db(self, db_path:
|
|
303
|
+
async def reset_sync_db(self, db_path: Path | str, fingerprint: int) -> bool:
|
|
308
304
|
conn: aiosqlite.Connection
|
|
309
305
|
# are not part of core wallet tables, but might appear later
|
|
310
306
|
ignore_tables = {"lineage_proofs_", "sqlite_", "MIGRATED_VALID_TIMES_TXS", "MIGRATED_VALID_TIMES_TRADES"}
|
|
@@ -388,7 +384,7 @@ class WalletNode:
|
|
|
388
384
|
|
|
389
385
|
async def _start_with_fingerprint(
|
|
390
386
|
self,
|
|
391
|
-
fingerprint:
|
|
387
|
+
fingerprint: int | None = None,
|
|
392
388
|
) -> bool:
|
|
393
389
|
# Makes sure the coin_state_updates get higher priority than new_peak messages.
|
|
394
390
|
# Delayed instantiation until here to avoid errors.
|
|
@@ -601,8 +597,8 @@ class WalletNode:
|
|
|
601
597
|
while not self._shut_down:
|
|
602
598
|
# Here we process four types of messages in the queue, where the first one has higher priority (lower
|
|
603
599
|
# number in the queue), and priority decreases for each type.
|
|
604
|
-
peer:
|
|
605
|
-
item:
|
|
600
|
+
peer: WSChiaConnection | None = None
|
|
601
|
+
item: NewPeakItem | None = None
|
|
606
602
|
try:
|
|
607
603
|
peer, item = None, None
|
|
608
604
|
item = await self.new_peak_queue.get()
|
|
@@ -676,8 +672,8 @@ class WalletNode:
|
|
|
676
672
|
path.write_text(str(fingerprint))
|
|
677
673
|
self.log.info(f"Updated last used fingerprint: {fingerprint}")
|
|
678
674
|
|
|
679
|
-
def get_last_used_fingerprint(self) ->
|
|
680
|
-
fingerprint:
|
|
675
|
+
def get_last_used_fingerprint(self) -> int | None:
|
|
676
|
+
fingerprint: int | None = None
|
|
681
677
|
try:
|
|
682
678
|
path = self.get_last_used_fingerprint_path()
|
|
683
679
|
if path.exists():
|
|
@@ -760,7 +756,7 @@ class WalletNode:
|
|
|
760
756
|
if self.wallet_peers is not None:
|
|
761
757
|
await self.wallet_peers.on_connect(peer)
|
|
762
758
|
|
|
763
|
-
async def perform_atomic_rollback(self, fork_height: int, cache:
|
|
759
|
+
async def perform_atomic_rollback(self, fork_height: int, cache: PeerRequestCache | None = None) -> None:
|
|
764
760
|
self.log.info(f"perform_atomic_rollback to {fork_height}")
|
|
765
761
|
# this is to start a write transaction
|
|
766
762
|
async with self.wallet_state_manager.db_wrapper.writer():
|
|
@@ -882,8 +878,8 @@ class WalletNode:
|
|
|
882
878
|
self,
|
|
883
879
|
items_input: list[CoinState],
|
|
884
880
|
peer: WSChiaConnection,
|
|
885
|
-
fork_height:
|
|
886
|
-
height:
|
|
881
|
+
fork_height: uint32 | None = None,
|
|
882
|
+
height: uint32 | None = None,
|
|
887
883
|
) -> bool:
|
|
888
884
|
# Adds the state to the wallet state manager. If the peer is trusted, we do not validate. If the peer is
|
|
889
885
|
# untrusted we do, but we might not add the state, since we need to receive the new_peak message as well.
|
|
@@ -1064,7 +1060,7 @@ class WalletNode:
|
|
|
1064
1060
|
neither.append(node)
|
|
1065
1061
|
return synced_and_trusted + synced + trusted + neither
|
|
1066
1062
|
|
|
1067
|
-
async def get_timestamp_for_height_from_peer(self, height: uint32, peer: WSChiaConnection) ->
|
|
1063
|
+
async def get_timestamp_for_height_from_peer(self, height: uint32, peer: WSChiaConnection) -> uint64 | None:
|
|
1068
1064
|
"""
|
|
1069
1065
|
Returns the timestamp for transaction block at h=height, if not transaction block, backtracks until it finds
|
|
1070
1066
|
a transaction block
|
|
@@ -1078,7 +1074,7 @@ class WalletNode:
|
|
|
1078
1074
|
block = cache.get_block(uint32(request_height))
|
|
1079
1075
|
if block is None:
|
|
1080
1076
|
self.log.debug(f"get_timestamp_for_height_from_peer cache miss for height {request_height}")
|
|
1081
|
-
response:
|
|
1077
|
+
response: list[HeaderBlock] | None = await request_header_blocks(
|
|
1082
1078
|
peer, uint32(request_height), uint32(request_height)
|
|
1083
1079
|
)
|
|
1084
1080
|
if response is not None and len(response) > 0:
|
|
@@ -1111,7 +1107,7 @@ class WalletNode:
|
|
|
1111
1107
|
self.log.debug("state manager is None (shutdown)")
|
|
1112
1108
|
return
|
|
1113
1109
|
|
|
1114
|
-
peak_hb:
|
|
1110
|
+
peak_hb: HeaderBlock | None = await self.wallet_state_manager.blockchain.get_peak_block()
|
|
1115
1111
|
if peak_hb is not None and peak_hb.header_hash == new_peak.header_hash:
|
|
1116
1112
|
self.log.debug("skip known peak.")
|
|
1117
1113
|
return
|
|
@@ -1122,7 +1118,7 @@ class WalletNode:
|
|
|
1122
1118
|
return
|
|
1123
1119
|
|
|
1124
1120
|
request = RequestBlockHeader(new_peak.height)
|
|
1125
|
-
response:
|
|
1121
|
+
response: RespondBlockHeader | None = await peer.call_api(FullNodeAPI.request_block_header, request)
|
|
1126
1122
|
if response is None:
|
|
1127
1123
|
self.log.warning(f"Peer {peer.get_peer_info()} did not respond in time.")
|
|
1128
1124
|
await peer.close(120)
|
|
@@ -1291,7 +1287,7 @@ class WalletNode:
|
|
|
1291
1287
|
return True
|
|
1292
1288
|
|
|
1293
1289
|
async def wallet_short_sync_backtrack(self, header_block: HeaderBlock, peer: WSChiaConnection) -> int:
|
|
1294
|
-
peak:
|
|
1290
|
+
peak: HeaderBlock | None = await self.wallet_state_manager.blockchain.get_peak_block()
|
|
1295
1291
|
|
|
1296
1292
|
top = header_block
|
|
1297
1293
|
blocks = [top]
|
|
@@ -1303,7 +1299,7 @@ class WalletNode:
|
|
|
1303
1299
|
|
|
1304
1300
|
while not self.wallet_state_manager.blockchain.contains_block(top.prev_header_hash) and top.height > 0:
|
|
1305
1301
|
request_prev = RequestBlockHeader(uint32(top.height - 1))
|
|
1306
|
-
response_prev:
|
|
1302
|
+
response_prev: RespondBlockHeader | None = await peer.call_api(
|
|
1307
1303
|
FullNodeAPI.request_block_header, request_prev
|
|
1308
1304
|
)
|
|
1309
1305
|
if response_prev is None or not isinstance(response_prev, RespondBlockHeader):
|
|
@@ -1384,7 +1380,7 @@ class WalletNode:
|
|
|
1384
1380
|
coin_state: CoinState,
|
|
1385
1381
|
peer: WSChiaConnection,
|
|
1386
1382
|
peer_request_cache: PeerRequestCache,
|
|
1387
|
-
fork_height:
|
|
1383
|
+
fork_height: uint32 | None,
|
|
1388
1384
|
) -> bool:
|
|
1389
1385
|
"""
|
|
1390
1386
|
Returns True if the coin_state is valid and included in the blockchain proved by the weight proof.
|
|
@@ -1396,8 +1392,8 @@ class WalletNode:
|
|
|
1396
1392
|
if can_use_peer_request_cache(coin_state, peer_request_cache, fork_height):
|
|
1397
1393
|
return True
|
|
1398
1394
|
|
|
1399
|
-
spent_height:
|
|
1400
|
-
confirmed_height:
|
|
1395
|
+
spent_height: uint32 | None = None if coin_state.spent_height is None else uint32(coin_state.spent_height)
|
|
1396
|
+
confirmed_height: uint32 | None = (
|
|
1401
1397
|
None if coin_state.created_height is None else uint32(coin_state.created_height)
|
|
1402
1398
|
)
|
|
1403
1399
|
current = await self.wallet_state_manager.coin_store.get_coin_record(coin_state.coin.name())
|
|
@@ -1429,7 +1425,7 @@ class WalletNode:
|
|
|
1429
1425
|
confirmed_height = current.confirmed_block_height
|
|
1430
1426
|
|
|
1431
1427
|
# request header block for created height
|
|
1432
|
-
state_block:
|
|
1428
|
+
state_block: HeaderBlock | None = peer_request_cache.get_block(confirmed_height)
|
|
1433
1429
|
if state_block is None or reorg_mode:
|
|
1434
1430
|
state_blocks = await request_header_blocks(peer, confirmed_height, confirmed_height)
|
|
1435
1431
|
if state_blocks is None:
|
|
@@ -1467,7 +1463,7 @@ class WalletNode:
|
|
|
1467
1463
|
# Peer is telling us that coin that was previously known to be spent is not spent anymore
|
|
1468
1464
|
# Check old state
|
|
1469
1465
|
|
|
1470
|
-
spent_state_blocks:
|
|
1466
|
+
spent_state_blocks: list[HeaderBlock] | None = await request_header_blocks(
|
|
1471
1467
|
peer, current.spent_block_height, current.spent_block_height
|
|
1472
1468
|
)
|
|
1473
1469
|
if spent_state_blocks is None:
|
|
@@ -1535,7 +1531,7 @@ class WalletNode:
|
|
|
1535
1531
|
if stored_record.header_hash == block.header_hash:
|
|
1536
1532
|
return True
|
|
1537
1533
|
|
|
1538
|
-
weight_proof:
|
|
1534
|
+
weight_proof: WeightProof | None = self.wallet_state_manager.blockchain.synced_weight_proof
|
|
1539
1535
|
if weight_proof is None:
|
|
1540
1536
|
return False
|
|
1541
1537
|
|
|
@@ -1593,9 +1589,7 @@ class WalletNode:
|
|
|
1593
1589
|
return False
|
|
1594
1590
|
all_peers_c = self.server.get_connections(NodeType.FULL_NODE)
|
|
1595
1591
|
all_peers = [(con, self.is_trusted(con)) for con in all_peers_c]
|
|
1596
|
-
blocks:
|
|
1597
|
-
start, end, peer_request_cache, all_peers
|
|
1598
|
-
)
|
|
1592
|
+
blocks: list[HeaderBlock] | None = await fetch_header_blocks_in_range(start, end, peer_request_cache, all_peers)
|
|
1599
1593
|
if blocks is None:
|
|
1600
1594
|
log_level = logging.DEBUG if self._shut_down or peer.closed else logging.ERROR
|
|
1601
1595
|
self.log.log(log_level, f"Error fetching blocks {start} {end}")
|
|
@@ -1675,10 +1669,10 @@ class WalletNode:
|
|
|
1675
1669
|
return True
|
|
1676
1670
|
|
|
1677
1671
|
async def get_coin_state(
|
|
1678
|
-
self, coin_names: list[bytes32], peer: WSChiaConnection, fork_height:
|
|
1672
|
+
self, coin_names: list[bytes32], peer: WSChiaConnection, fork_height: uint32 | None = None
|
|
1679
1673
|
) -> list[CoinState]:
|
|
1680
1674
|
msg = RegisterForCoinUpdates(coin_names, uint32(0))
|
|
1681
|
-
coin_state:
|
|
1675
|
+
coin_state: RespondToCoinUpdates | None = await peer.call_api(FullNodeAPI.register_for_coin_updates, msg)
|
|
1682
1676
|
if coin_state is None or not isinstance(coin_state, RespondToCoinUpdates):
|
|
1683
1677
|
raise PeerRequestException(f"Was not able to get states for {coin_names}")
|
|
1684
1678
|
|
|
@@ -1699,11 +1693,9 @@ class WalletNode:
|
|
|
1699
1693
|
return coin_state.coin_states
|
|
1700
1694
|
|
|
1701
1695
|
async def fetch_children(
|
|
1702
|
-
self, coin_name: bytes32, peer: WSChiaConnection, fork_height:
|
|
1696
|
+
self, coin_name: bytes32, peer: WSChiaConnection, fork_height: uint32 | None = None
|
|
1703
1697
|
) -> list[CoinState]:
|
|
1704
|
-
response:
|
|
1705
|
-
FullNodeAPI.request_children, RequestChildren(coin_name)
|
|
1706
|
-
)
|
|
1698
|
+
response: RespondChildren | None = await peer.call_api(FullNodeAPI.request_children, RequestChildren(coin_name))
|
|
1707
1699
|
if response is None or not isinstance(response, RespondChildren):
|
|
1708
1700
|
raise PeerRequestException(f"Was not able to obtain children {response}")
|
|
1709
1701
|
|
chia/wallet/wallet_node_api.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
|
|
5
5
|
|
|
6
6
|
from chia_rs import RespondToPhUpdates
|
|
7
7
|
|
|
@@ -16,9 +16,11 @@ from chia.wallet.wallet_node import WalletNode
|
|
|
16
16
|
|
|
17
17
|
class WalletNodeAPI:
|
|
18
18
|
if TYPE_CHECKING:
|
|
19
|
-
from chia.
|
|
19
|
+
from chia.apis.wallet_stub import WalletNodeApiStub
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
# Verify this class implements the WalletNodeApiStub protocol
|
|
22
|
+
def _protocol_check(self: WalletNodeAPI) -> WalletNodeApiStub:
|
|
23
|
+
return self
|
|
22
24
|
|
|
23
25
|
log: logging.Logger
|
|
24
26
|
wallet_node: WalletNode
|
chia/wallet/wallet_protocol.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import TYPE_CHECKING, Any,
|
|
3
|
+
from typing import TYPE_CHECKING, Any, TypeVar
|
|
4
4
|
|
|
5
5
|
from chia_rs import G1Element
|
|
6
6
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -31,7 +31,7 @@ class WalletProtocol(Protocol[T_contra]):
|
|
|
31
31
|
def id(self) -> uint32: ...
|
|
32
32
|
|
|
33
33
|
async def coin_added(
|
|
34
|
-
self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data:
|
|
34
|
+
self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: T_contra | None
|
|
35
35
|
) -> None: ...
|
|
36
36
|
|
|
37
37
|
async def select_coins(
|
|
@@ -40,15 +40,15 @@ class WalletProtocol(Protocol[T_contra]):
|
|
|
40
40
|
action_scope: WalletActionScope,
|
|
41
41
|
) -> set[Coin]: ...
|
|
42
42
|
|
|
43
|
-
async def get_confirmed_balance(self, record_list:
|
|
43
|
+
async def get_confirmed_balance(self, record_list: set[WalletCoinRecord] | None = None) -> uint128: ...
|
|
44
44
|
|
|
45
|
-
async def get_unconfirmed_balance(self, unspent_records:
|
|
45
|
+
async def get_unconfirmed_balance(self, unspent_records: set[WalletCoinRecord] | None = None) -> uint128: ...
|
|
46
46
|
|
|
47
|
-
async def get_spendable_balance(self, unspent_records:
|
|
47
|
+
async def get_spendable_balance(self, unspent_records: set[WalletCoinRecord] | None = None) -> uint128: ...
|
|
48
48
|
|
|
49
49
|
async def get_pending_change_balance(self) -> uint64: ...
|
|
50
50
|
|
|
51
|
-
async def get_max_send_amount(self, records:
|
|
51
|
+
async def get_max_send_amount(self, records: set[WalletCoinRecord] | None = None) -> uint128: ...
|
|
52
52
|
|
|
53
53
|
# not all wallet supports this. To signal support, make
|
|
54
54
|
# require_derivation_paths() return true
|
|
@@ -66,8 +66,8 @@ class WalletProtocol(Protocol[T_contra]):
|
|
|
66
66
|
puzzle_hashes: list[bytes32],
|
|
67
67
|
action_scope: WalletActionScope,
|
|
68
68
|
fee: uint64 = uint64(0),
|
|
69
|
-
coins:
|
|
70
|
-
memos:
|
|
69
|
+
coins: set[Coin] | None = None,
|
|
70
|
+
memos: list[list[bytes]] | None = None,
|
|
71
71
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
72
72
|
**kwargs: Unpack[GSTOptionalArgs],
|
|
73
73
|
) -> None: ...
|
|
@@ -78,29 +78,29 @@ class WalletProtocol(Protocol[T_contra]):
|
|
|
78
78
|
|
|
79
79
|
class GSTOptionalArgs(TypedDict):
|
|
80
80
|
# DataLayerWallet
|
|
81
|
-
launcher_id: NotRequired[
|
|
82
|
-
new_root_hash: NotRequired[
|
|
81
|
+
launcher_id: NotRequired[bytes32 | None]
|
|
82
|
+
new_root_hash: NotRequired[bytes32 | None]
|
|
83
83
|
sign: NotRequired[bool]
|
|
84
84
|
announce_new_state: NotRequired[bool]
|
|
85
85
|
# CATWallet
|
|
86
|
-
cat_discrepancy: NotRequired[
|
|
86
|
+
cat_discrepancy: NotRequired[tuple[int, Program, Program] | None]
|
|
87
87
|
# NFTWallet
|
|
88
|
-
nft_coin: NotRequired[
|
|
89
|
-
new_owner: NotRequired[
|
|
90
|
-
new_did_inner_hash: NotRequired[
|
|
91
|
-
trade_prices_list: NotRequired[
|
|
88
|
+
nft_coin: NotRequired[NFTCoinInfo | None]
|
|
89
|
+
new_owner: NotRequired[bytes | None]
|
|
90
|
+
new_did_inner_hash: NotRequired[bytes | None]
|
|
91
|
+
trade_prices_list: NotRequired[Program | None]
|
|
92
92
|
additional_bundles: NotRequired[list[WalletSpendBundle]]
|
|
93
|
-
metadata_update: NotRequired[
|
|
93
|
+
metadata_update: NotRequired[tuple[str, str] | None]
|
|
94
94
|
# CR-CAT Wallet
|
|
95
95
|
add_authorizations_to_cr_cats: NotRequired[bool]
|
|
96
96
|
# VCWallet
|
|
97
|
-
new_proof_hash: NotRequired[
|
|
98
|
-
provider_inner_puzhash: NotRequired[
|
|
97
|
+
new_proof_hash: NotRequired[bytes32 | None]
|
|
98
|
+
provider_inner_puzhash: NotRequired[bytes32 | None]
|
|
99
99
|
self_revoke: NotRequired[bool]
|
|
100
|
-
vc_id: NotRequired[
|
|
100
|
+
vc_id: NotRequired[bytes32 | None]
|
|
101
101
|
# Wallet
|
|
102
|
-
origin_id: NotRequired[
|
|
102
|
+
origin_id: NotRequired[bytes32 | None]
|
|
103
103
|
negative_change_allowed: NotRequired[bool]
|
|
104
|
-
puzzle_decorator_override: NotRequired[
|
|
105
|
-
reserve_fee: NotRequired[
|
|
106
|
-
preferred_change_puzzle_hash: NotRequired[
|
|
104
|
+
puzzle_decorator_override: NotRequired[list[dict[str, Any]] | None]
|
|
105
|
+
reserve_fee: NotRequired[uint64 | None]
|
|
106
|
+
preferred_change_puzzle_hash: NotRequired[bytes32 | None]
|
|
@@ -2,7 +2,6 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import logging
|
|
5
|
-
from typing import Optional
|
|
6
5
|
|
|
7
6
|
from chia_rs import G1Element
|
|
8
7
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -28,7 +27,7 @@ class WalletPuzzleStore:
|
|
|
28
27
|
wallet_identifier_cache: LRUCache
|
|
29
28
|
# maps wallet_id -> last_derivation_index
|
|
30
29
|
last_wallet_derivation_index: dict[uint32, uint32]
|
|
31
|
-
last_derivation_index:
|
|
30
|
+
last_derivation_index: uint32 | None
|
|
32
31
|
|
|
33
32
|
@classmethod
|
|
34
33
|
async def create(cls, db_wrapper: DBWrapper2):
|
|
@@ -110,9 +109,7 @@ class WalletPuzzleStore:
|
|
|
110
109
|
)
|
|
111
110
|
).close()
|
|
112
111
|
|
|
113
|
-
async def get_derivation_record(
|
|
114
|
-
self, index: uint32, wallet_id: uint32, hardened: bool
|
|
115
|
-
) -> Optional[DerivationRecord]:
|
|
112
|
+
async def get_derivation_record(self, index: uint32, wallet_id: uint32, hardened: bool) -> DerivationRecord | None:
|
|
116
113
|
"""
|
|
117
114
|
Returns the derivation record by index and wallet id.
|
|
118
115
|
"""
|
|
@@ -133,7 +130,7 @@ class WalletPuzzleStore:
|
|
|
133
130
|
|
|
134
131
|
return None
|
|
135
132
|
|
|
136
|
-
async def get_derivation_record_for_puzzle_hash(self, puzzle_hash: bytes32) ->
|
|
133
|
+
async def get_derivation_record_for_puzzle_hash(self, puzzle_hash: bytes32) -> DerivationRecord | None:
|
|
137
134
|
"""
|
|
138
135
|
Returns the derivation record by index and wallet id.
|
|
139
136
|
"""
|
|
@@ -183,7 +180,7 @@ class WalletPuzzleStore:
|
|
|
183
180
|
bool(row[5]),
|
|
184
181
|
)
|
|
185
182
|
|
|
186
|
-
async def index_for_pubkey(self, pubkey: G1Element) ->
|
|
183
|
+
async def index_for_pubkey(self, pubkey: G1Element) -> uint32 | None:
|
|
187
184
|
"""
|
|
188
185
|
Returns derivation paths for the given pubkey.
|
|
189
186
|
Returns None if not present.
|
|
@@ -199,7 +196,7 @@ class WalletPuzzleStore:
|
|
|
199
196
|
|
|
200
197
|
return None
|
|
201
198
|
|
|
202
|
-
async def record_for_pubkey(self, pubkey: G1Element) ->
|
|
199
|
+
async def record_for_pubkey(self, pubkey: G1Element) -> DerivationRecord | None:
|
|
203
200
|
"""
|
|
204
201
|
Returns derivation record for the given pubkey.
|
|
205
202
|
Returns None if not present.
|
|
@@ -216,7 +213,7 @@ class WalletPuzzleStore:
|
|
|
216
213
|
|
|
217
214
|
return None if row is None else self.row_to_record(row)
|
|
218
215
|
|
|
219
|
-
async def index_for_puzzle_hash(self, puzzle_hash: bytes32) ->
|
|
216
|
+
async def index_for_puzzle_hash(self, puzzle_hash: bytes32) -> uint32 | None:
|
|
220
217
|
"""
|
|
221
218
|
Returns the derivation path for the puzzle_hash.
|
|
222
219
|
Returns None if not present.
|
|
@@ -227,7 +224,7 @@ class WalletPuzzleStore:
|
|
|
227
224
|
)
|
|
228
225
|
return None if row is None else uint32(row[0])
|
|
229
226
|
|
|
230
|
-
async def record_for_puzzle_hash(self, puzzle_hash: bytes32) ->
|
|
227
|
+
async def record_for_puzzle_hash(self, puzzle_hash: bytes32) -> DerivationRecord | None:
|
|
231
228
|
"""
|
|
232
229
|
Returns the derivation path for the puzzle_hash.
|
|
233
230
|
Returns None if not present.
|
|
@@ -246,7 +243,7 @@ class WalletPuzzleStore:
|
|
|
246
243
|
|
|
247
244
|
return None
|
|
248
245
|
|
|
249
|
-
async def get_wallet_identifier_for_puzzle_hash(self, puzzle_hash: bytes32) ->
|
|
246
|
+
async def get_wallet_identifier_for_puzzle_hash(self, puzzle_hash: bytes32) -> WalletIdentifier | None:
|
|
250
247
|
"""
|
|
251
248
|
Returns the derivation path for the puzzle_hash.
|
|
252
249
|
Returns None if not present.
|
|
@@ -267,7 +264,7 @@ class WalletPuzzleStore:
|
|
|
267
264
|
|
|
268
265
|
return None
|
|
269
266
|
|
|
270
|
-
async def get_all_puzzle_hashes(self, wallet_id:
|
|
267
|
+
async def get_all_puzzle_hashes(self, wallet_id: int | None = None) -> set[bytes32]:
|
|
271
268
|
"""
|
|
272
269
|
Return a set containing all puzzle_hashes we generated.
|
|
273
270
|
"""
|
|
@@ -281,7 +278,7 @@ class WalletPuzzleStore:
|
|
|
281
278
|
)
|
|
282
279
|
return {bytes32.fromhex(row[0]) for row in rows}
|
|
283
280
|
|
|
284
|
-
async def get_last_derivation_path(self) ->
|
|
281
|
+
async def get_last_derivation_path(self) -> uint32 | None:
|
|
285
282
|
"""
|
|
286
283
|
Returns the last derivation path by derivation_index.
|
|
287
284
|
"""
|
|
@@ -294,11 +291,11 @@ class WalletPuzzleStore:
|
|
|
294
291
|
self.last_derivation_index = last_derivation_index
|
|
295
292
|
return self.last_derivation_index
|
|
296
293
|
|
|
297
|
-
async def get_last_derivation_path_for_wallet(self, wallet_id: int) ->
|
|
294
|
+
async def get_last_derivation_path_for_wallet(self, wallet_id: int) -> uint32 | None:
|
|
298
295
|
"""
|
|
299
296
|
Returns the last derivation path by derivation_index.
|
|
300
297
|
"""
|
|
301
|
-
cached_derivation_index:
|
|
298
|
+
cached_derivation_index: uint32 | None = self.last_wallet_derivation_index.get(uint32(wallet_id))
|
|
302
299
|
if cached_derivation_index is not None:
|
|
303
300
|
return cached_derivation_index
|
|
304
301
|
|
|
@@ -311,7 +308,7 @@ class WalletPuzzleStore:
|
|
|
311
308
|
self.last_wallet_derivation_index[uint32(wallet_id)] = derivation_index
|
|
312
309
|
return derivation_index
|
|
313
310
|
|
|
314
|
-
async def get_current_derivation_record_for_wallet(self, wallet_id: uint32) ->
|
|
311
|
+
async def get_current_derivation_record_for_wallet(self, wallet_id: uint32) -> DerivationRecord | None:
|
|
315
312
|
"""
|
|
316
313
|
Returns the current derivation record by derivation_index.
|
|
317
314
|
"""
|
|
@@ -329,7 +326,7 @@ class WalletPuzzleStore:
|
|
|
329
326
|
|
|
330
327
|
return None
|
|
331
328
|
|
|
332
|
-
async def get_unused_derivation_path(self) ->
|
|
329
|
+
async def get_unused_derivation_path(self) -> uint32 | None:
|
|
333
330
|
"""
|
|
334
331
|
Returns the first unused derivation path by derivation_index.
|
|
335
332
|
"""
|
|
@@ -343,7 +340,7 @@ class WalletPuzzleStore:
|
|
|
343
340
|
|
|
344
341
|
return None
|
|
345
342
|
|
|
346
|
-
async def get_unused_derivation_path_for_wallet(self, wallet_id: uint32) ->
|
|
343
|
+
async def get_unused_derivation_path_for_wallet(self, wallet_id: uint32) -> uint32 | None:
|
|
347
344
|
"""
|
|
348
345
|
Returns the first unused derivation path by derivation_index.
|
|
349
346
|
"""
|