chia-blockchain 2.5.4rc1__py3-none-any.whl → 2.5.5__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/blockchain/blockchain_test_utils.py +2 -3
- chia/_tests/blockchain/test_augmented_chain.py +2 -3
- chia/_tests/blockchain/test_blockchain.py +261 -44
- chia/_tests/blockchain/test_blockchain_transactions.py +4 -3
- chia/_tests/blockchain/test_build_chains.py +197 -1
- chia/_tests/blockchain/test_get_block_generator.py +1 -1
- chia/_tests/blockchain/test_lookup_fork_chain.py +1 -1
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +3 -4
- chia/_tests/clvm/test_message_conditions.py +2 -2
- chia/_tests/clvm/test_puzzle_compression.py +2 -3
- chia/_tests/clvm/test_puzzles.py +1 -2
- chia/_tests/clvm/test_singletons.py +2 -3
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +30 -25
- chia/_tests/cmds/test_dev_gh.py +1 -1
- chia/_tests/cmds/test_farm_cmd.py +1 -1
- chia/_tests/cmds/test_show.py +1 -2
- chia/_tests/cmds/wallet/test_did.py +101 -56
- chia/_tests/cmds/wallet/test_nft.py +109 -84
- chia/_tests/cmds/wallet/test_notifications.py +1 -1
- chia/_tests/cmds/wallet/test_offer.toffer +1 -1
- chia/_tests/cmds/wallet/test_vcs.py +8 -8
- chia/_tests/cmds/wallet/test_wallet.py +100 -46
- chia/_tests/conftest.py +31 -20
- chia/_tests/connection_utils.py +1 -1
- chia/_tests/core/consensus/stores/__init__.py +0 -0
- chia/_tests/core/consensus/stores/test_coin_store_protocol.py +40 -0
- chia/_tests/core/consensus/test_block_creation.py +2 -31
- chia/_tests/core/consensus/test_pot_iterations.py +38 -3
- chia/_tests/core/custom_types/test_proof_of_space.py +154 -26
- chia/_tests/core/custom_types/test_spend_bundle.py +2 -3
- chia/_tests/core/daemon/test_daemon.py +80 -0
- chia/_tests/core/data_layer/test_data_layer.py +1 -1
- chia/_tests/core/data_layer/test_data_layer_util.py +1 -1
- chia/_tests/core/data_layer/test_data_rpc.py +14 -10
- chia/_tests/core/data_layer/test_data_store.py +5 -5
- chia/_tests/core/farmer/test_farmer_api.py +2 -2
- chia/_tests/core/full_node/full_sync/test_full_sync.py +446 -406
- chia/_tests/core/full_node/ram_db.py +3 -1
- chia/_tests/core/full_node/stores/test_block_store.py +28 -16
- chia/_tests/core/full_node/stores/test_coin_store.py +277 -185
- chia/_tests/core/full_node/stores/test_full_node_store.py +11 -4
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_address_manager.py +200 -27
- chia/_tests/core/full_node/test_block_height_map.py +2 -2
- chia/_tests/core/full_node/test_conditions.py +7 -6
- chia/_tests/core/full_node/test_full_node.py +456 -40
- chia/_tests/core/full_node/test_generator_tools.py +32 -2
- chia/_tests/core/full_node/test_hint_management.py +1 -1
- chia/_tests/core/full_node/test_node_load.py +20 -21
- chia/_tests/core/full_node/test_performance.py +3 -4
- chia/_tests/core/full_node/test_prev_tx_block.py +43 -0
- chia/_tests/core/full_node/test_subscriptions.py +1 -2
- chia/_tests/core/full_node/test_transactions.py +9 -5
- chia/_tests/core/full_node/test_tx_processing_queue.py +1 -2
- chia/_tests/core/large_block.py +1 -2
- chia/_tests/core/make_block_generator.py +3 -4
- chia/_tests/core/mempool/test_mempool.py +36 -86
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +1 -1
- chia/_tests/core/mempool/test_mempool_item_queries.py +1 -3
- chia/_tests/core/mempool/test_mempool_manager.py +529 -69
- chia/_tests/core/mempool/test_mempool_performance.py +3 -2
- chia/_tests/core/mempool/test_singleton_fast_forward.py +61 -132
- chia/_tests/core/server/flood.py +1 -1
- chia/_tests/core/server/test_dos.py +1 -1
- chia/_tests/core/server/test_node_discovery.py +41 -27
- chia/_tests/core/server/test_rate_limits.py +1 -1
- chia/_tests/core/server/test_server.py +1 -1
- chia/_tests/core/services/test_services.py +5 -5
- chia/_tests/core/ssl/test_ssl.py +1 -1
- chia/_tests/core/test_cost_calculation.py +6 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_crawler_rpc.py +1 -1
- chia/_tests/core/test_db_conversion.py +3 -1
- chia/_tests/core/test_db_validation.py +5 -3
- chia/_tests/core/test_farmer_harvester_rpc.py +15 -15
- chia/_tests/core/test_filter.py +4 -1
- chia/_tests/core/test_full_node_rpc.py +99 -82
- chia/_tests/core/test_program.py +2 -2
- chia/_tests/core/util/test_block_cache.py +1 -1
- chia/_tests/core/util/test_keychain.py +2 -2
- chia/_tests/core/util/test_lockfile.py +1 -1
- chia/_tests/core/util/test_log_exceptions.py +5 -5
- chia/_tests/core/util/test_streamable.py +81 -22
- chia/_tests/db/test_db_wrapper.py +1 -3
- chia/_tests/environments/wallet.py +5 -5
- chia/_tests/farmer_harvester/test_farmer.py +9 -7
- chia/_tests/farmer_harvester/test_farmer_harvester.py +11 -4
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +15 -9
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +1 -2
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +7 -5
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +1 -1
- chia/_tests/generator/test_compression.py +1 -2
- chia/_tests/generator/test_rom.py +8 -4
- chia/_tests/plot_sync/test_plot_sync.py +3 -3
- chia/_tests/plot_sync/test_receiver.py +3 -3
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +3 -3
- chia/_tests/plot_sync/util.py +2 -2
- chia/_tests/pools/test_pool_cmdline.py +48 -21
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +2 -3
- chia/_tests/pools/test_pool_rpc.py +237 -105
- chia/_tests/pools/test_pool_wallet.py +11 -2
- chia/_tests/pools/test_wallet_pool_store.py +5 -4
- chia/_tests/rpc/test_rpc_client.py +1 -1
- chia/_tests/simulation/test_simulation.py +13 -8
- chia/_tests/simulation/test_simulator.py +2 -2
- chia/_tests/timelord/test_new_peak.py +191 -47
- chia/_tests/timelord/test_timelord.py +1 -1
- chia/_tests/tools/test_full_sync.py +0 -2
- chia/_tests/tools/test_run_block.py +3 -1
- chia/_tests/util/benchmark_cost.py +3 -3
- chia/_tests/util/benchmarks.py +2 -2
- chia/_tests/util/blockchain.py +11 -5
- chia/_tests/util/blockchain_mock.py +1 -4
- chia/_tests/util/coin_store.py +29 -0
- chia/_tests/util/constants.py +2 -18
- chia/_tests/util/full_sync.py +3 -3
- chia/_tests/util/generator_tools_testing.py +2 -3
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +33 -31
- chia/_tests/util/network_protocol_data.py +19 -17
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +3 -1
- chia/_tests/util/run_block.py +2 -2
- chia/_tests/util/setup_nodes.py +7 -7
- chia/_tests/util/spend_sim.py +47 -55
- chia/_tests/util/test_condition_tools.py +5 -4
- chia/_tests/util/test_config.py +2 -2
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +12 -14
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_paginator.py +4 -4
- chia/_tests/util/test_priority_mutex.py +2 -2
- chia/_tests/util/test_replace_str_to_bytes.py +15 -5
- chia/_tests/util/test_ssl_check.py +1 -1
- chia/_tests/util/test_testnet_overrides.py +13 -3
- chia/_tests/util/time_out_assert.py +4 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -2
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +352 -432
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +3 -6
- chia/_tests/wallet/cat_wallet/test_trades.py +53 -77
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -1
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +3 -3
- chia/_tests/wallet/clawback/test_clawback_metadata.py +4 -2
- chia/_tests/wallet/conftest.py +11 -12
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +11 -4
- chia/_tests/wallet/db_wallet/test_dl_offers.py +433 -130
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +3 -3
- chia/_tests/wallet/did_wallet/test_did.py +2132 -2000
- chia/_tests/wallet/nft_wallet/config.py +1 -1
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1610 -742
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +486 -907
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +4 -4
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +517 -294
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +133 -62
- chia/_tests/wallet/rpc/test_wallet_rpc.py +495 -265
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +10 -6
- chia/_tests/wallet/sync/test_wallet_sync.py +89 -60
- chia/_tests/wallet/test_clvm_casts.py +88 -0
- chia/_tests/wallet/test_coin_management.py +1 -1
- chia/_tests/wallet/test_coin_selection.py +1 -1
- chia/_tests/wallet/test_conditions.py +1 -1
- chia/_tests/wallet/test_new_wallet_protocol.py +13 -11
- chia/_tests/wallet/test_notifications.py +5 -3
- chia/_tests/wallet/test_sign_coin_spends.py +6 -6
- chia/_tests/wallet/test_signer_protocol.py +13 -12
- chia/_tests/wallet/test_singleton.py +1 -1
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +5 -7
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +108 -29
- chia/_tests/wallet/test_wallet_action_scope.py +9 -2
- chia/_tests/wallet/test_wallet_blockchain.py +2 -3
- chia/_tests/wallet/test_wallet_key_val_store.py +1 -2
- chia/_tests/wallet/test_wallet_node.py +2 -4
- chia/_tests/wallet/test_wallet_retry.py +4 -2
- chia/_tests/wallet/test_wallet_state_manager.py +191 -5
- chia/_tests/wallet/test_wallet_test_framework.py +1 -1
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +8 -8
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -12
- chia/_tests/wallet/wallet_block_tools.py +6 -6
- chia/_tests/weight_proof/test_weight_proof.py +10 -48
- chia/apis.py +1 -1
- chia/cmds/beta.py +1 -1
- chia/cmds/chia.py +9 -9
- chia/cmds/cmd_classes.py +12 -11
- chia/cmds/cmd_helpers.py +1 -1
- chia/cmds/cmds_util.py +12 -9
- chia/cmds/coin_funcs.py +2 -2
- chia/cmds/configure.py +2 -2
- chia/cmds/data.py +0 -2
- chia/cmds/data_funcs.py +1 -1
- chia/cmds/db_validate_func.py +1 -2
- chia/cmds/dev/__init__.py +0 -0
- chia/cmds/dev/data.py +273 -0
- chia/cmds/{gh.py → dev/gh.py} +5 -5
- chia/cmds/dev/main.py +22 -0
- chia/cmds/dev/mempool.py +78 -0
- chia/cmds/dev/mempool_funcs.py +63 -0
- chia/cmds/farm_funcs.py +5 -4
- chia/cmds/init_funcs.py +11 -11
- chia/cmds/keys.py +2 -2
- chia/cmds/keys_funcs.py +4 -4
- chia/cmds/netspace_funcs.py +1 -1
- chia/cmds/peer_funcs.py +2 -2
- chia/cmds/plotnft_funcs.py +72 -26
- chia/cmds/rpc.py +1 -1
- chia/cmds/show_funcs.py +5 -5
- chia/cmds/signer.py +8 -7
- chia/cmds/sim_funcs.py +8 -9
- chia/cmds/wallet.py +2 -2
- chia/cmds/wallet_funcs.py +165 -131
- chia/{util → consensus}/augmented_chain.py +1 -2
- chia/consensus/block_body_validation.py +54 -40
- chia/consensus/block_creation.py +42 -76
- chia/consensus/block_header_validation.py +32 -26
- chia/consensus/block_record.py +0 -3
- chia/consensus/blockchain.py +23 -32
- chia/consensus/blockchain_interface.py +1 -5
- chia/consensus/check_time_locks.py +57 -0
- chia/consensus/coin_store_protocol.py +151 -0
- chia/consensus/coinbase.py +0 -6
- chia/consensus/condition_costs.py +4 -0
- chia/{util → consensus}/condition_tools.py +4 -5
- chia/consensus/cost_calculator.py +1 -1
- chia/consensus/default_constants.py +32 -9
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +1 -2
- chia/consensus/find_fork_point.py +1 -3
- chia/consensus/full_block_to_block_record.py +1 -6
- chia/{util → consensus}/generator_tools.py +1 -3
- chia/consensus/get_block_challenge.py +30 -7
- chia/consensus/make_sub_epoch_summary.py +1 -5
- chia/consensus/multiprocess_validation.py +21 -20
- chia/consensus/pot_iterations.py +74 -13
- chia/{util → consensus}/prev_transaction_block.py +1 -1
- chia/consensus/vdf_info_computation.py +1 -3
- chia/daemon/keychain_proxy.py +5 -5
- chia/daemon/server.py +22 -5
- chia/data_layer/data_layer.py +92 -51
- chia/{rpc → data_layer}/data_layer_rpc_api.py +1 -1
- chia/{rpc → data_layer}/data_layer_rpc_util.py +3 -6
- chia/data_layer/data_layer_util.py +4 -6
- chia/data_layer/data_layer_wallet.py +42 -69
- chia/data_layer/dl_wallet_store.py +12 -6
- chia/data_layer/download_data.py +3 -3
- chia/data_layer/s3_plugin_service.py +0 -1
- chia/farmer/farmer.py +3 -4
- chia/farmer/farmer_api.py +11 -7
- chia/{rpc → farmer}/farmer_rpc_client.py +1 -1
- chia/full_node/block_height_map.py +7 -6
- chia/full_node/block_store.py +5 -7
- chia/full_node/bundle_tools.py +1 -2
- chia/full_node/coin_store.py +153 -124
- chia/{types → full_node}/eligible_coin_spends.py +39 -70
- chia/full_node/fee_estimator.py +1 -1
- chia/full_node/fee_estimator_interface.py +0 -8
- chia/full_node/fee_tracker.py +25 -25
- chia/full_node/full_node.py +70 -53
- chia/full_node/full_node_api.py +57 -40
- chia/{rpc → full_node}/full_node_rpc_api.py +87 -8
- chia/{rpc → full_node}/full_node_rpc_client.py +7 -6
- chia/full_node/full_node_store.py +23 -8
- chia/full_node/mempool.py +206 -53
- chia/full_node/mempool_check_conditions.py +20 -63
- chia/full_node/mempool_manager.py +53 -47
- chia/full_node/subscriptions.py +1 -3
- chia/full_node/tx_processing_queue.py +50 -3
- chia/full_node/weight_proof.py +46 -37
- chia/harvester/harvester.py +1 -1
- chia/harvester/harvester_api.py +22 -7
- chia/introducer/introducer.py +1 -1
- chia/introducer/introducer_api.py +1 -1
- chia/plot_sync/exceptions.py +1 -1
- chia/plot_sync/receiver.py +1 -1
- chia/plot_sync/sender.py +2 -2
- chia/pools/pool_puzzles.py +13 -18
- chia/pools/pool_wallet.py +23 -46
- chia/protocols/farmer_protocol.py +11 -3
- chia/protocols/full_node_protocol.py +1 -4
- chia/protocols/harvester_protocol.py +3 -3
- chia/protocols/pool_protocol.py +1 -2
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +1 -3
- chia/protocols/wallet_protocol.py +3 -3
- chia/rpc/rpc_client.py +7 -8
- chia/rpc/rpc_server.py +3 -3
- chia/rpc/util.py +3 -1
- chia/seeder/crawler.py +1 -1
- chia/seeder/crawler_api.py +1 -1
- chia/seeder/dns_server.py +2 -0
- chia/seeder/start_crawler.py +3 -3
- chia/server/address_manager.py +286 -38
- chia/server/address_manager_store.py +0 -215
- chia/{types → server}/aliases.py +7 -7
- chia/server/api_protocol.py +1 -1
- chia/server/chia_policy.py +1 -1
- chia/server/node_discovery.py +76 -113
- chia/server/rate_limits.py +1 -1
- chia/server/resolve_peer_info.py +43 -0
- chia/server/server.py +5 -5
- chia/server/start_data_layer.py +4 -4
- chia/server/start_farmer.py +5 -4
- chia/server/start_full_node.py +5 -4
- chia/server/start_harvester.py +7 -5
- chia/server/start_introducer.py +2 -2
- chia/server/start_service.py +1 -1
- chia/server/start_timelord.py +7 -5
- chia/server/start_wallet.py +7 -5
- chia/server/ws_connection.py +1 -1
- chia/simulator/add_blocks_in_batches.py +2 -2
- chia/simulator/block_tools.py +245 -201
- chia/simulator/full_node_simulator.py +38 -10
- chia/simulator/setup_services.py +12 -12
- chia/simulator/simulator_full_node_rpc_api.py +2 -2
- chia/simulator/simulator_full_node_rpc_client.py +2 -2
- chia/simulator/simulator_test_tools.py +2 -2
- chia/simulator/start_simulator.py +1 -1
- chia/simulator/wallet_tools.py +10 -18
- chia/ssl/create_ssl.py +1 -1
- chia/timelord/iters_from_block.py +14 -14
- chia/timelord/timelord.py +15 -11
- chia/timelord/timelord_api.py +14 -2
- chia/timelord/timelord_state.py +20 -14
- chia/types/blockchain_format/program.py +53 -10
- chia/types/blockchain_format/proof_of_space.py +73 -19
- chia/types/coin_spend.py +3 -56
- chia/types/generator_types.py +28 -0
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +12 -7
- chia/types/unfinished_header_block.py +1 -2
- chia/types/validation_state.py +1 -2
- chia/types/weight_proof.py +1 -3
- chia/util/action_scope.py +3 -3
- chia/util/block_cache.py +1 -2
- chia/util/byte_types.py +1 -1
- chia/util/casts.py +21 -0
- chia/util/config.py +0 -37
- chia/util/db_wrapper.py +8 -1
- chia/util/errors.py +3 -2
- chia/util/initial-config.yaml +21 -5
- chia/util/keychain.py +6 -7
- chia/util/keyring_wrapper.py +5 -5
- chia/util/limited_semaphore.py +1 -1
- chia/util/priority_mutex.py +1 -1
- chia/util/streamable.py +63 -5
- chia/util/task_timing.py +1 -1
- chia/util/virtual_project_analysis.py +1 -1
- chia/wallet/cat_wallet/cat_info.py +7 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +9 -5
- chia/wallet/cat_wallet/cat_utils.py +1 -1
- chia/wallet/cat_wallet/cat_wallet.py +44 -36
- chia/wallet/cat_wallet/lineage_store.py +7 -0
- chia/wallet/cat_wallet/r_cat_wallet.py +274 -0
- chia/wallet/conditions.py +5 -10
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -4
- chia/wallet/derivation_record.py +33 -0
- chia/wallet/derive_keys.py +3 -3
- chia/wallet/did_wallet/did_info.py +12 -3
- chia/wallet/did_wallet/did_wallet.py +132 -101
- chia/wallet/did_wallet/did_wallet_puzzles.py +9 -9
- chia/wallet/driver_protocol.py +3 -1
- chia/{types/spend_bundle.py → wallet/estimate_fees.py} +2 -7
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +5 -3
- chia/wallet/nft_wallet/nft_puzzle_utils.py +1 -1
- chia/wallet/nft_wallet/nft_wallet.py +69 -112
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +5 -3
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +6 -4
- chia/wallet/nft_wallet/transfer_program_puzzle.py +4 -2
- chia/wallet/nft_wallet/uncurry_nft.py +4 -6
- chia/wallet/notification_manager.py +2 -3
- chia/wallet/outer_puzzles.py +7 -2
- chia/wallet/puzzle_drivers.py +1 -1
- chia/wallet/puzzles/clawback/drivers.py +5 -4
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -1
- chia/wallet/puzzles/singleton_top_layer.py +2 -1
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +2 -1
- chia/wallet/puzzles/tails.py +1 -3
- chia/wallet/signer_protocol.py +5 -6
- chia/wallet/singleton.py +5 -4
- chia/wallet/singleton_record.py +1 -1
- chia/wallet/trade_manager.py +18 -20
- chia/wallet/trade_record.py +3 -6
- chia/wallet/trading/offer.py +12 -13
- chia/wallet/uncurried_puzzle.py +2 -2
- chia/wallet/util/compute_additions.py +58 -0
- chia/wallet/util/compute_hints.py +3 -3
- chia/wallet/util/compute_memos.py +4 -4
- chia/wallet/util/curry_and_treehash.py +2 -1
- chia/wallet/util/debug_spend_bundle.py +1 -1
- chia/wallet/util/merkle_tree.py +1 -1
- chia/wallet/util/peer_request_cache.py +1 -2
- chia/wallet/util/tx_config.py +3 -8
- chia/wallet/util/wallet_sync_utils.py +10 -5
- chia/wallet/util/wallet_types.py +1 -0
- chia/wallet/vc_wallet/cr_cat_drivers.py +17 -18
- chia/wallet/vc_wallet/cr_cat_wallet.py +30 -28
- chia/wallet/vc_wallet/cr_outer_puzzle.py +5 -3
- chia/wallet/vc_wallet/vc_drivers.py +50 -8
- chia/wallet/vc_wallet/vc_store.py +3 -5
- chia/wallet/vc_wallet/vc_wallet.py +15 -22
- chia/wallet/wallet.py +36 -46
- chia/wallet/wallet_action_scope.py +73 -4
- chia/wallet/wallet_blockchain.py +1 -3
- chia/wallet/wallet_interested_store.py +1 -1
- chia/wallet/wallet_nft_store.py +3 -3
- chia/wallet/wallet_node.py +17 -16
- chia/wallet/wallet_node_api.py +4 -5
- chia/wallet/wallet_pool_store.py +1 -1
- chia/wallet/wallet_protocol.py +2 -0
- chia/wallet/wallet_puzzle_store.py +1 -1
- chia/{rpc → wallet}/wallet_request_types.py +670 -81
- chia/{rpc → wallet}/wallet_rpc_api.py +735 -766
- chia/{rpc → wallet}/wallet_rpc_client.py +268 -420
- chia/wallet/wallet_singleton_store.py +8 -7
- chia/wallet/wallet_spend_bundle.py +4 -3
- chia/wallet/wallet_state_manager.py +320 -191
- chia/wallet/wallet_weight_proof_handler.py +1 -2
- chia/wallet/wsm_apis.py +98 -0
- {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/METADATA +7 -7
- {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/RECORD +443 -436
- mozilla-ca/cacert.pem +3 -165
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +0 -145
- chia/cmds/dev.py +0 -18
- chia/types/blockchain_format/slots.py +0 -9
- chia/types/blockchain_format/sub_epoch_summary.py +0 -5
- chia/types/end_of_slot_bundle.py +0 -5
- chia/types/full_block.py +0 -5
- chia/types/header_block.py +0 -5
- chia/types/spend_bundle_conditions.py +0 -7
- chia/types/transaction_queue_entry.py +0 -56
- chia/types/unfinished_block.py +0 -5
- /chia/cmds/{installers.py → dev/installers.py} +0 -0
- /chia/cmds/{sim.py → dev/sim.py} +0 -0
- /chia/{util → cmds}/dump_keyring.py +0 -0
- /chia/{full_node → consensus}/signage_point.py +0 -0
- /chia/{rpc → data_layer}/data_layer_rpc_client.py +0 -0
- /chia/{rpc → farmer}/farmer_rpc_api.py +0 -0
- /chia/{util → full_node}/full_block_utils.py +0 -0
- /chia/{rpc → harvester}/harvester_rpc_api.py +0 -0
- /chia/{rpc → harvester}/harvester_rpc_client.py +0 -0
- /chia/{full_node → protocols}/fee_estimate.py +0 -0
- /chia/{server → protocols}/outbound_message.py +0 -0
- /chia/{rpc → seeder}/crawler_rpc_api.py +0 -0
- /chia/{util → simulator}/vdf_prover.py +0 -0
- /chia/{util → ssl}/ssl_check.py +0 -0
- /chia/{rpc → timelord}/timelord_rpc_api.py +0 -0
- {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/LICENSE +0 -0
- {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/entry_points.txt +0 -0
|
@@ -3,10 +3,9 @@ from __future__ import annotations
|
|
|
3
3
|
import logging
|
|
4
4
|
from typing import Optional, Union
|
|
5
5
|
|
|
6
|
-
from chia_rs import ConsensusConstants
|
|
6
|
+
from chia_rs import BlockRecord, ConsensusConstants, FullBlock, SubEpochSummary, UnfinishedBlock
|
|
7
7
|
from chia_rs.sized_ints import uint8, uint32, uint64, uint128
|
|
8
8
|
|
|
9
|
-
from chia.consensus.block_record import BlockRecord
|
|
10
9
|
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
11
10
|
from chia.consensus.deficit import calculate_deficit
|
|
12
11
|
from chia.consensus.difficulty_adjustment import (
|
|
@@ -17,9 +16,6 @@ from chia.consensus.difficulty_adjustment import (
|
|
|
17
16
|
height_can_be_first_in_epoch,
|
|
18
17
|
)
|
|
19
18
|
from chia.consensus.pot_iterations import calculate_ip_iters, calculate_sp_iters, is_overflow_block
|
|
20
|
-
from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
|
|
21
|
-
from chia.types.full_block import FullBlock
|
|
22
|
-
from chia.types.unfinished_block import UnfinishedBlock
|
|
23
19
|
|
|
24
20
|
log = logging.getLogger(__name__)
|
|
25
21
|
|
|
@@ -11,8 +11,11 @@ from dataclasses import dataclass
|
|
|
11
11
|
from typing import Optional
|
|
12
12
|
|
|
13
13
|
from chia_rs import (
|
|
14
|
+
BlockRecord,
|
|
14
15
|
ConsensusConstants,
|
|
16
|
+
FullBlock,
|
|
15
17
|
SpendBundleConditions,
|
|
18
|
+
SubEpochSummary,
|
|
16
19
|
get_flags_for_height_and_constants,
|
|
17
20
|
run_block_generator,
|
|
18
21
|
run_block_generator2,
|
|
@@ -20,22 +23,21 @@ from chia_rs import (
|
|
|
20
23
|
from chia_rs.sized_bytes import bytes32
|
|
21
24
|
from chia_rs.sized_ints import uint16, uint32, uint64
|
|
22
25
|
|
|
26
|
+
from chia.consensus.augmented_chain import AugmentedBlockchain
|
|
23
27
|
from chia.consensus.block_header_validation import validate_finished_header_block
|
|
24
|
-
from chia.consensus.block_record import BlockRecord
|
|
25
28
|
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
26
29
|
from chia.consensus.full_block_to_block_record import block_to_block_record
|
|
27
|
-
from chia.consensus.
|
|
30
|
+
from chia.consensus.generator_tools import get_block_header, tx_removals_and_additions
|
|
31
|
+
from chia.consensus.get_block_challenge import get_block_challenge, prev_tx_block
|
|
28
32
|
from chia.consensus.get_block_generator import get_block_generator
|
|
29
|
-
from chia.consensus.pot_iterations import
|
|
33
|
+
from chia.consensus.pot_iterations import (
|
|
34
|
+
is_overflow_block,
|
|
35
|
+
validate_pospace_and_get_required_iters,
|
|
36
|
+
)
|
|
30
37
|
from chia.types.blockchain_format.coin import Coin
|
|
31
|
-
from chia.types.blockchain_format.proof_of_space import verify_and_get_quality_string
|
|
32
|
-
from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
|
|
33
|
-
from chia.types.full_block import FullBlock
|
|
34
38
|
from chia.types.generator_types import BlockGenerator
|
|
35
39
|
from chia.types.validation_state import ValidationState
|
|
36
|
-
from chia.util.augmented_chain import AugmentedBlockchain
|
|
37
40
|
from chia.util.errors import Err
|
|
38
|
-
from chia.util.generator_tools import get_block_header, tx_removals_and_additions
|
|
39
41
|
from chia.util.streamable import Streamable, streamable
|
|
40
42
|
|
|
41
43
|
log = logging.getLogger(__name__)
|
|
@@ -128,11 +130,10 @@ def _pre_validate_block(
|
|
|
128
130
|
removals_and_additions = ([], [])
|
|
129
131
|
|
|
130
132
|
assert conds is None or conds.validated_signature is True
|
|
131
|
-
header_block = get_block_header(block, removals_and_additions)
|
|
132
133
|
required_iters, error = validate_finished_header_block(
|
|
133
134
|
constants,
|
|
134
135
|
blockchain,
|
|
135
|
-
|
|
136
|
+
get_block_header(block, removals_and_additions),
|
|
136
137
|
True, # check_filter
|
|
137
138
|
expected_vs,
|
|
138
139
|
)
|
|
@@ -211,19 +212,19 @@ async def pre_validate_block(
|
|
|
211
212
|
cc_sp_hash: bytes32 = challenge
|
|
212
213
|
else:
|
|
213
214
|
cc_sp_hash = block.reward_chain_block.challenge_chain_sp_vdf.output.get_hash()
|
|
214
|
-
q_str: Optional[bytes32] = verify_and_get_quality_string(
|
|
215
|
-
block.reward_chain_block.proof_of_space, constants, challenge, cc_sp_hash, height=block.height
|
|
216
|
-
)
|
|
217
|
-
if q_str is None:
|
|
218
|
-
return return_error(Err.INVALID_POSPACE)
|
|
219
215
|
|
|
220
|
-
required_iters
|
|
221
|
-
constants
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
vs.difficulty,
|
|
216
|
+
required_iters = validate_pospace_and_get_required_iters(
|
|
217
|
+
constants,
|
|
218
|
+
block.reward_chain_block.proof_of_space,
|
|
219
|
+
challenge,
|
|
225
220
|
cc_sp_hash,
|
|
221
|
+
block.height,
|
|
222
|
+
vs.difficulty,
|
|
223
|
+
vs.ssi,
|
|
224
|
+
prev_tx_block(blockchain, prev_b),
|
|
226
225
|
)
|
|
226
|
+
if required_iters is None:
|
|
227
|
+
return return_error(Err.INVALID_POSPACE)
|
|
227
228
|
|
|
228
229
|
try:
|
|
229
230
|
block_rec = block_to_block_record(
|
chia/consensus/pot_iterations.py
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from chia_rs import ConsensusConstants, PlotSize, ProofOfSpace
|
|
4
6
|
from chia_rs.sized_bytes import bytes32
|
|
5
|
-
from chia_rs.sized_ints import uint8,
|
|
7
|
+
from chia_rs.sized_ints import uint8, uint32, uint64
|
|
6
8
|
|
|
7
9
|
from chia.consensus.pos_quality import _expected_plot_size
|
|
10
|
+
from chia.types.blockchain_format.proof_of_space import verify_and_get_quality_string
|
|
8
11
|
from chia.util.hash import std_hash
|
|
9
12
|
|
|
13
|
+
# TODO: todo_v2_plots add to chia_rs and get from constants
|
|
14
|
+
PHASE_OUT_PERIOD = uint32(10000000)
|
|
15
|
+
|
|
10
16
|
|
|
11
17
|
def is_overflow_block(constants: ConsensusConstants, signage_point_index: uint8) -> bool:
|
|
12
18
|
if signage_point_index >= constants.NUM_SPS_SUB_SLOT:
|
|
@@ -25,6 +31,25 @@ def calculate_sp_iters(constants: ConsensusConstants, sub_slot_iters: uint64, si
|
|
|
25
31
|
return uint64(calculate_sp_interval_iters(constants, sub_slot_iters) * signage_point_index)
|
|
26
32
|
|
|
27
33
|
|
|
34
|
+
def calculate_phase_out(
|
|
35
|
+
constants: ConsensusConstants,
|
|
36
|
+
sub_slot_iters: uint64,
|
|
37
|
+
prev_transaction_block_height: uint32,
|
|
38
|
+
) -> uint64:
|
|
39
|
+
if prev_transaction_block_height <= constants.HARD_FORK2_HEIGHT:
|
|
40
|
+
return uint64(0)
|
|
41
|
+
elif uint32(prev_transaction_block_height - constants.HARD_FORK2_HEIGHT) >= PHASE_OUT_PERIOD:
|
|
42
|
+
return uint64(calculate_sp_interval_iters(constants, sub_slot_iters))
|
|
43
|
+
|
|
44
|
+
return uint64(
|
|
45
|
+
(
|
|
46
|
+
uint32(prev_transaction_block_height - constants.HARD_FORK2_HEIGHT)
|
|
47
|
+
* calculate_sp_interval_iters(constants, sub_slot_iters)
|
|
48
|
+
)
|
|
49
|
+
// PHASE_OUT_PERIOD
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
28
53
|
def calculate_ip_iters(
|
|
29
54
|
constants: ConsensusConstants,
|
|
30
55
|
sub_slot_iters: uint64,
|
|
@@ -46,23 +71,59 @@ def calculate_ip_iters(
|
|
|
46
71
|
return uint64((sp_iters + constants.NUM_SP_INTERVALS_EXTRA * sp_interval_iters + required_iters) % sub_slot_iters)
|
|
47
72
|
|
|
48
73
|
|
|
74
|
+
def validate_pospace_and_get_required_iters(
|
|
75
|
+
constants: ConsensusConstants,
|
|
76
|
+
proof_of_space: ProofOfSpace,
|
|
77
|
+
challenge: bytes32,
|
|
78
|
+
cc_sp_hash: bytes32,
|
|
79
|
+
height: uint32,
|
|
80
|
+
difficulty: uint64,
|
|
81
|
+
sub_slot_iters: uint64,
|
|
82
|
+
prev_transaction_block_height: uint32, # this is the height of the last tx block before the current block SP
|
|
83
|
+
) -> Optional[uint64]:
|
|
84
|
+
q_str: Optional[bytes32] = verify_and_get_quality_string(
|
|
85
|
+
proof_of_space, constants, challenge, cc_sp_hash, height=height
|
|
86
|
+
)
|
|
87
|
+
if q_str is None:
|
|
88
|
+
return None
|
|
89
|
+
|
|
90
|
+
return calculate_iterations_quality(
|
|
91
|
+
constants,
|
|
92
|
+
q_str,
|
|
93
|
+
proof_of_space.size(),
|
|
94
|
+
difficulty,
|
|
95
|
+
cc_sp_hash,
|
|
96
|
+
sub_slot_iters,
|
|
97
|
+
prev_transaction_block_height,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
|
|
49
101
|
def calculate_iterations_quality(
|
|
50
|
-
|
|
102
|
+
constants: ConsensusConstants,
|
|
51
103
|
quality_string: bytes32,
|
|
52
|
-
size:
|
|
104
|
+
size: PlotSize,
|
|
53
105
|
difficulty: uint64,
|
|
54
106
|
cc_sp_output_hash: bytes32,
|
|
107
|
+
ssi: uint64,
|
|
108
|
+
prev_transaction_block_height: uint32, # this is the height of the last tx block before the current block SP
|
|
55
109
|
) -> uint64:
|
|
56
110
|
"""
|
|
57
111
|
Calculates the number of iterations from the quality. This is derives as the difficulty times the constant factor
|
|
58
112
|
times a random number between 0 and 1 (based on quality string), divided by plot size.
|
|
59
113
|
"""
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
114
|
+
if size.size_v1 is not None:
|
|
115
|
+
assert size.size_v2 is None
|
|
116
|
+
sp_quality_string: bytes32 = std_hash(quality_string + cc_sp_output_hash)
|
|
117
|
+
phase_out = calculate_phase_out(constants, ssi, prev_transaction_block_height)
|
|
118
|
+
iters = uint64(
|
|
119
|
+
(
|
|
120
|
+
int(difficulty)
|
|
121
|
+
* int(constants.DIFFICULTY_CONSTANT_FACTOR)
|
|
122
|
+
* int.from_bytes(sp_quality_string, "big", signed=False)
|
|
123
|
+
// (int(pow(2, 256)) * int(_expected_plot_size(size.size_v1)))
|
|
124
|
+
)
|
|
125
|
+
+ phase_out
|
|
126
|
+
)
|
|
127
|
+
return max(iters, uint64(1))
|
|
128
|
+
else:
|
|
129
|
+
raise NotImplementedError
|
|
@@ -2,14 +2,12 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import Optional
|
|
4
4
|
|
|
5
|
-
from chia_rs import ConsensusConstants
|
|
5
|
+
from chia_rs import BlockRecord, ConsensusConstants, EndOfSubSlotBundle
|
|
6
6
|
from chia_rs.sized_bytes import bytes32
|
|
7
7
|
from chia_rs.sized_ints import uint64, uint128
|
|
8
8
|
|
|
9
|
-
from chia.consensus.block_record import BlockRecord
|
|
10
9
|
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
11
10
|
from chia.types.blockchain_format.classgroup import ClassgroupElement
|
|
12
|
-
from chia.types.end_of_slot_bundle import EndOfSubSlotBundle
|
|
13
11
|
|
|
14
12
|
|
|
15
13
|
def get_signage_point_vdf_info(
|
chia/daemon/keychain_proxy.py
CHANGED
|
@@ -97,7 +97,7 @@ class KeychainProxy(DaemonProxy):
|
|
|
97
97
|
self.log.debug(f"Sending request to keychain command: {request['command']} from {request['origin']}.")
|
|
98
98
|
return await super()._get(request)
|
|
99
99
|
except asyncio.TimeoutError:
|
|
100
|
-
raise KeychainProxyConnectionTimeout
|
|
100
|
+
raise KeychainProxyConnectionTimeout
|
|
101
101
|
|
|
102
102
|
async def start(self, wait_for_start: bool = False) -> None:
|
|
103
103
|
self.keychain_connection_task = create_referenced_task(self.connect_to_keychain())
|
|
@@ -156,11 +156,11 @@ class KeychainProxy(DaemonProxy):
|
|
|
156
156
|
if error:
|
|
157
157
|
error_details = response["data"].get("error_details", {})
|
|
158
158
|
if error == KEYCHAIN_ERR_LOCKED:
|
|
159
|
-
raise KeychainIsLocked
|
|
159
|
+
raise KeychainIsLocked
|
|
160
160
|
elif error == KEYCHAIN_ERR_NO_KEYS:
|
|
161
|
-
raise KeychainIsEmpty
|
|
161
|
+
raise KeychainIsEmpty
|
|
162
162
|
elif error == KEYCHAIN_ERR_KEY_NOT_FOUND:
|
|
163
|
-
raise KeychainKeyNotFound
|
|
163
|
+
raise KeychainKeyNotFound
|
|
164
164
|
elif error == KEYCHAIN_ERR_MALFORMED_REQUEST:
|
|
165
165
|
message = error_details.get("message", "")
|
|
166
166
|
raise KeychainMalformedRequest(message)
|
|
@@ -356,7 +356,7 @@ class KeychainProxy(DaemonProxy):
|
|
|
356
356
|
if self.use_local_keychain():
|
|
357
357
|
keys = self.keychain.get_keys(include_secrets=private)
|
|
358
358
|
if len(keys) == 0:
|
|
359
|
-
raise KeychainIsEmpty
|
|
359
|
+
raise KeychainIsEmpty
|
|
360
360
|
else:
|
|
361
361
|
selected_key = keys[0]
|
|
362
362
|
if fingerprint is not None:
|
chia/daemon/server.py
CHANGED
|
@@ -12,7 +12,7 @@ import subprocess
|
|
|
12
12
|
import sys
|
|
13
13
|
import traceback
|
|
14
14
|
import uuid
|
|
15
|
-
from collections.abc import AsyncIterator
|
|
15
|
+
from collections.abc import AsyncIterator, Collection
|
|
16
16
|
from concurrent.futures import ThreadPoolExecutor
|
|
17
17
|
from contextlib import asynccontextmanager
|
|
18
18
|
from enum import Enum
|
|
@@ -27,7 +27,6 @@ from typing_extensions import Protocol
|
|
|
27
27
|
from chia import __version__
|
|
28
28
|
from chia.cmds.init_funcs import check_keys, chia_init
|
|
29
29
|
from chia.cmds.passphrase_funcs import default_passphrase, using_default_passphrase
|
|
30
|
-
from chia.consensus.coinbase import create_puzzlehash_for_pk
|
|
31
30
|
from chia.daemon.keychain_server import KeychainServer, keychain_commands
|
|
32
31
|
from chia.daemon.windows_signal import kill
|
|
33
32
|
from chia.plotters.plotters import get_available_plotters
|
|
@@ -55,17 +54,31 @@ from chia.wallet.derive_keys import (
|
|
|
55
54
|
master_sk_to_pool_sk,
|
|
56
55
|
master_sk_to_wallet_sk,
|
|
57
56
|
)
|
|
57
|
+
from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import puzzle_hash_for_pk
|
|
58
58
|
|
|
59
59
|
io_pool_exc = ThreadPoolExecutor()
|
|
60
60
|
|
|
61
61
|
try:
|
|
62
|
-
from aiohttp import WSMsgType, web
|
|
62
|
+
from aiohttp import WSMessage, WSMsgType, web
|
|
63
63
|
from aiohttp.web_ws import WebSocketResponse
|
|
64
64
|
except ModuleNotFoundError:
|
|
65
65
|
print("Error: Make sure to run . ./activate from the project folder before starting Chia.")
|
|
66
66
|
sys.exit()
|
|
67
67
|
|
|
68
68
|
|
|
69
|
+
def redact_sensitive_data(obj: Any, redaction_triggers: Collection[str] = ("pass", "key", "secret", "mnemonic")) -> Any:
|
|
70
|
+
"""Recursively redact sensitive data from nested dictionaries."""
|
|
71
|
+
if isinstance(obj, dict):
|
|
72
|
+
return {
|
|
73
|
+
key: "***<redacted>***"
|
|
74
|
+
if any(trigger.casefold() in key.casefold() for trigger in redaction_triggers)
|
|
75
|
+
else redact_sensitive_data(value, redaction_triggers)
|
|
76
|
+
for key, value in obj.items()
|
|
77
|
+
}
|
|
78
|
+
else:
|
|
79
|
+
return obj
|
|
80
|
+
|
|
81
|
+
|
|
69
82
|
log = logging.getLogger(__name__)
|
|
70
83
|
|
|
71
84
|
service_plotter = "chia_plotter"
|
|
@@ -267,7 +280,6 @@ class WebSocketServer:
|
|
|
267
280
|
|
|
268
281
|
while True:
|
|
269
282
|
msg = await ws.receive()
|
|
270
|
-
self.log.debug("Received message: %s", msg)
|
|
271
283
|
decoded: WsRpcMessage = {
|
|
272
284
|
"command": "",
|
|
273
285
|
"ack": False,
|
|
@@ -282,6 +294,10 @@ class WebSocketServer:
|
|
|
282
294
|
if "data" not in decoded:
|
|
283
295
|
decoded["data"] = {}
|
|
284
296
|
|
|
297
|
+
redacted_data = redact_sensitive_data(decoded)
|
|
298
|
+
redacted_message = WSMessage(msg.type, redacted_data, msg.extra)
|
|
299
|
+
self.log.debug("Received message: %s", redacted_message)
|
|
300
|
+
|
|
285
301
|
maybe_response = await self.handle_message(ws, decoded)
|
|
286
302
|
if maybe_response is None:
|
|
287
303
|
continue
|
|
@@ -297,6 +313,7 @@ class WebSocketServer:
|
|
|
297
313
|
|
|
298
314
|
await self.send_all_responses(connections, response)
|
|
299
315
|
else:
|
|
316
|
+
self.log.debug("Received non-text message")
|
|
300
317
|
service_names = self.remove_connection(ws)
|
|
301
318
|
|
|
302
319
|
if len(service_names) == 0:
|
|
@@ -669,7 +686,7 @@ class WebSocketServer:
|
|
|
669
686
|
pk = sk.get_g1()
|
|
670
687
|
else:
|
|
671
688
|
pk = master_pk_to_wallet_pk_unhardened(key.public_key, uint32(i))
|
|
672
|
-
wallet_address = encode_puzzle_hash(
|
|
689
|
+
wallet_address = encode_puzzle_hash(puzzle_hash_for_pk(pk), prefix)
|
|
673
690
|
if non_observer_derivation:
|
|
674
691
|
hd_path = f"m/12381n/8444n/2n/{i}n"
|
|
675
692
|
else:
|