chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc1.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
chia/pools/pool_wallet.py
CHANGED
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import dataclasses
|
|
4
4
|
import logging
|
|
5
5
|
import time
|
|
6
|
-
from typing import TYPE_CHECKING, Any, ClassVar,
|
|
6
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
7
7
|
|
|
8
8
|
from chia_rs import G1Element, G2Element, PrivateKey
|
|
9
9
|
from typing_extensions import final
|
|
@@ -80,7 +80,7 @@ class PoolWallet:
|
|
|
80
80
|
next_transaction_fee: uint64 = uint64(0)
|
|
81
81
|
next_tx_config: TXConfig = DEFAULT_TX_CONFIG
|
|
82
82
|
target_state: Optional[PoolState] = None
|
|
83
|
-
_owner_sk_and_index: Optional[
|
|
83
|
+
_owner_sk_and_index: Optional[tuple[PrivateKey, uint32]] = None
|
|
84
84
|
|
|
85
85
|
"""
|
|
86
86
|
From the user's perspective, this is not a wallet at all, but a way to control
|
|
@@ -137,7 +137,7 @@ class PoolWallet:
|
|
|
137
137
|
@classmethod
|
|
138
138
|
def _verify_self_pooled(cls, state: PoolState) -> Optional[str]:
|
|
139
139
|
err = ""
|
|
140
|
-
if state.pool_url not in
|
|
140
|
+
if state.pool_url not in {None, ""}:
|
|
141
141
|
err += " Unneeded pool_url for self-pooling"
|
|
142
142
|
|
|
143
143
|
if state.relative_lock_height != 0:
|
|
@@ -159,7 +159,7 @@ class PoolWallet:
|
|
|
159
159
|
f"is greater than recommended maximum ({cls.MAXIMUM_RELATIVE_LOCK_HEIGHT})"
|
|
160
160
|
)
|
|
161
161
|
|
|
162
|
-
if state.pool_url in
|
|
162
|
+
if state.pool_url in {None, ""}:
|
|
163
163
|
err += " Empty pool url in pooling state"
|
|
164
164
|
return err
|
|
165
165
|
|
|
@@ -177,10 +177,7 @@ class PoolWallet:
|
|
|
177
177
|
|
|
178
178
|
if state.state == PoolSingletonState.SELF_POOLING.value:
|
|
179
179
|
return cls._verify_self_pooled(state)
|
|
180
|
-
elif
|
|
181
|
-
state.state == PoolSingletonState.FARMING_TO_POOL.value
|
|
182
|
-
or state.state == PoolSingletonState.LEAVING_POOL.value
|
|
183
|
-
):
|
|
180
|
+
elif state.state in {PoolSingletonState.FARMING_TO_POOL.value, PoolSingletonState.LEAVING_POOL.value}:
|
|
184
181
|
return cls._verify_pooling_state(state)
|
|
185
182
|
else:
|
|
186
183
|
return "Internal Error"
|
|
@@ -191,12 +188,12 @@ class PoolWallet:
|
|
|
191
188
|
if err:
|
|
192
189
|
raise ValueError(f"Invalid internal Pool State: {err}: {initial_target_state}")
|
|
193
190
|
|
|
194
|
-
async def get_spend_history(self) ->
|
|
191
|
+
async def get_spend_history(self) -> list[tuple[uint32, CoinSpend]]:
|
|
195
192
|
return await self.wallet_state_manager.pool_store.get_spends_for_wallet(self.wallet_id)
|
|
196
193
|
|
|
197
194
|
async def get_current_state(self) -> PoolWalletInfo:
|
|
198
|
-
history:
|
|
199
|
-
all_spends:
|
|
195
|
+
history: list[tuple[uint32, CoinSpend]] = await self.get_spend_history()
|
|
196
|
+
all_spends: list[CoinSpend] = [cs for _, cs in history]
|
|
200
197
|
|
|
201
198
|
# We must have at least the launcher spend
|
|
202
199
|
assert len(all_spends) >= 1
|
|
@@ -228,21 +225,29 @@ class PoolWallet:
|
|
|
228
225
|
last_singleton_spend_height,
|
|
229
226
|
)
|
|
230
227
|
|
|
231
|
-
async def get_unconfirmed_transactions(self) ->
|
|
228
|
+
async def get_unconfirmed_transactions(self) -> list[TransactionRecord]:
|
|
232
229
|
return await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(self.wallet_id)
|
|
233
230
|
|
|
234
|
-
async def get_tip(self) ->
|
|
231
|
+
async def get_tip(self) -> tuple[uint32, CoinSpend]:
|
|
235
232
|
return (await self.wallet_state_manager.pool_store.get_spends_for_wallet(self.wallet_id))[-1]
|
|
236
233
|
|
|
237
234
|
async def update_pool_config(self) -> None:
|
|
238
235
|
current_state: PoolWalletInfo = await self.get_current_state()
|
|
239
|
-
pool_config_list:
|
|
240
|
-
pool_config_dict:
|
|
236
|
+
pool_config_list: list[PoolWalletConfig] = load_pool_config(self.wallet_state_manager.root_path)
|
|
237
|
+
pool_config_dict: dict[bytes32, PoolWalletConfig] = {c.launcher_id: c for c in pool_config_list}
|
|
241
238
|
existing_config: Optional[PoolWalletConfig] = pool_config_dict.get(current_state.launcher_id, None)
|
|
242
239
|
payout_instructions: str = existing_config.payout_instructions if existing_config is not None else ""
|
|
243
240
|
|
|
244
241
|
if len(payout_instructions) == 0:
|
|
245
|
-
|
|
242
|
+
reuse_puzhash_config = self.wallet_state_manager.config.get("reuse_public_key_for_change", None)
|
|
243
|
+
if reuse_puzhash_config is None:
|
|
244
|
+
reuse_puzhash = False
|
|
245
|
+
else:
|
|
246
|
+
reuse_puzhash = reuse_puzhash_config.get(
|
|
247
|
+
str(self.wallet_state_manager.root_pubkey.get_fingerprint()), False
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
payout_instructions = (await self.standard_wallet.get_puzzle_hash(new=not reuse_puzhash)).hex()
|
|
246
251
|
self.log.info(f"New config entry. Generated payout_instructions puzzle hash: {payout_instructions}")
|
|
247
252
|
|
|
248
253
|
new_config: PoolWalletConfig = PoolWalletConfig(
|
|
@@ -262,7 +267,7 @@ class PoolWallet:
|
|
|
262
267
|
The DB must be committed after calling this method. All validation should be done here. Returns True iff
|
|
263
268
|
the spend is a valid transition spend for the singleton, False otherwise.
|
|
264
269
|
"""
|
|
265
|
-
tip:
|
|
270
|
+
tip: tuple[uint32, CoinSpend] = await self.get_tip()
|
|
266
271
|
tip_spend = tip[1]
|
|
267
272
|
|
|
268
273
|
tip_coin: Optional[Coin] = get_most_recent_singleton_coin_from_coin_spend(tip_spend)
|
|
@@ -270,7 +275,7 @@ class PoolWallet:
|
|
|
270
275
|
spent_coin_name: bytes32 = tip_coin.name()
|
|
271
276
|
|
|
272
277
|
if spent_coin_name != new_state.coin.name():
|
|
273
|
-
history:
|
|
278
|
+
history: list[tuple[uint32, CoinSpend]] = await self.get_spend_history()
|
|
274
279
|
if new_state.coin.name() in [sp.coin.name() for _, sp in history]:
|
|
275
280
|
self.log.info(f"Already have state transition: {new_state.coin.name().hex()}")
|
|
276
281
|
else:
|
|
@@ -304,7 +309,7 @@ class PoolWallet:
|
|
|
304
309
|
Returns True if the wallet should be removed.
|
|
305
310
|
"""
|
|
306
311
|
try:
|
|
307
|
-
history:
|
|
312
|
+
history: list[tuple[uint32, CoinSpend]] = await self.wallet_state_manager.pool_store.get_spends_for_wallet(
|
|
308
313
|
self.wallet_id
|
|
309
314
|
)
|
|
310
315
|
prev_state: PoolWalletInfo = await self.get_current_state()
|
|
@@ -326,7 +331,7 @@ class PoolWallet:
|
|
|
326
331
|
wallet_state_manager: Any,
|
|
327
332
|
wallet: Wallet,
|
|
328
333
|
launcher_coin_id: bytes32,
|
|
329
|
-
block_spends:
|
|
334
|
+
block_spends: list[CoinSpend],
|
|
330
335
|
block_height: uint32,
|
|
331
336
|
*,
|
|
332
337
|
name: Optional[str] = None,
|
|
@@ -391,8 +396,8 @@ class PoolWallet:
|
|
|
391
396
|
fee: uint64 = uint64(0),
|
|
392
397
|
p2_singleton_delay_time: Optional[uint64] = None,
|
|
393
398
|
p2_singleton_delayed_ph: Optional[bytes32] = None,
|
|
394
|
-
extra_conditions:
|
|
395
|
-
) ->
|
|
399
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
400
|
+
) -> tuple[bytes32, bytes32]:
|
|
396
401
|
"""
|
|
397
402
|
A "plot NFT", or pool wallet, represents the idea of a set of plots that all pay to
|
|
398
403
|
the same pooling puzzle. This puzzle is a `chia singleton` that is
|
|
@@ -405,7 +410,9 @@ class PoolWallet:
|
|
|
405
410
|
standard_wallet = main_wallet
|
|
406
411
|
|
|
407
412
|
if p2_singleton_delayed_ph is None:
|
|
408
|
-
p2_singleton_delayed_ph = await main_wallet.
|
|
413
|
+
p2_singleton_delayed_ph = await main_wallet.get_puzzle_hash(
|
|
414
|
+
new=not action_scope.config.tx_config.reuse_puzhash
|
|
415
|
+
)
|
|
409
416
|
if p2_singleton_delay_time is None:
|
|
410
417
|
p2_singleton_delay_time = uint64(604800)
|
|
411
418
|
|
|
@@ -414,12 +421,12 @@ class PoolWallet:
|
|
|
414
421
|
if balance < PoolWallet.MINIMUM_INITIAL_BALANCE:
|
|
415
422
|
raise ValueError("Not enough balance in main wallet to create a managed plotting pool.")
|
|
416
423
|
if balance < PoolWallet.MINIMUM_INITIAL_BALANCE + fee:
|
|
417
|
-
raise ValueError("Not enough balance in main wallet to create a managed plotting pool with fee {fee}.")
|
|
424
|
+
raise ValueError(f"Not enough balance in main wallet to create a managed plotting pool with fee {fee}.")
|
|
418
425
|
|
|
419
426
|
# Verify Parameters - raise if invalid
|
|
420
427
|
PoolWallet._verify_initial_target_state(initial_target_state)
|
|
421
428
|
|
|
422
|
-
|
|
429
|
+
_singleton_puzzle_hash, launcher_coin_id = await PoolWallet.generate_launcher_spend(
|
|
423
430
|
standard_wallet,
|
|
424
431
|
uint64(1),
|
|
425
432
|
fee,
|
|
@@ -437,7 +444,7 @@ class PoolWallet:
|
|
|
437
444
|
|
|
438
445
|
return p2_singleton_puzzle_hash, launcher_coin_id
|
|
439
446
|
|
|
440
|
-
async def _get_owner_key_cache(self) ->
|
|
447
|
+
async def _get_owner_key_cache(self) -> tuple[PrivateKey, uint32]:
|
|
441
448
|
if self._owner_sk_and_index is None:
|
|
442
449
|
self._owner_sk_and_index = find_owner_sk(
|
|
443
450
|
[self.wallet_state_manager.get_master_private_key()],
|
|
@@ -453,7 +460,7 @@ class PoolWallet:
|
|
|
453
460
|
self,
|
|
454
461
|
fee: uint64,
|
|
455
462
|
action_scope: WalletActionScope,
|
|
456
|
-
extra_conditions:
|
|
463
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
457
464
|
) -> None:
|
|
458
465
|
await self.standard_wallet.generate_signed_transaction(
|
|
459
466
|
uint64(0),
|
|
@@ -514,19 +521,19 @@ class PoolWallet:
|
|
|
514
521
|
assert new_inner_puzzle != inner_puzzle
|
|
515
522
|
if is_pool_member_inner_puzzle(inner_puzzle):
|
|
516
523
|
(
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
524
|
+
_inner_f,
|
|
525
|
+
_target_puzzle_hash,
|
|
526
|
+
_p2_singleton_hash,
|
|
527
|
+
_pubkey_as_program,
|
|
528
|
+
_pool_reward_prefix,
|
|
529
|
+
_escape_puzzle_hash,
|
|
523
530
|
) = uncurry_pool_member_inner_puzzle(inner_puzzle)
|
|
524
531
|
elif is_pool_waitingroom_inner_puzzle(inner_puzzle):
|
|
525
532
|
(
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
533
|
+
_target_puzzle_hash, # payout_puzzle_hash
|
|
534
|
+
_relative_lock_height,
|
|
535
|
+
_pubkey_as_program,
|
|
536
|
+
_p2_singleton_hash,
|
|
530
537
|
) = uncurry_pool_waitingroom_inner_puzzle(inner_puzzle)
|
|
531
538
|
else:
|
|
532
539
|
raise RuntimeError("Invalid state")
|
|
@@ -570,13 +577,13 @@ class PoolWallet:
|
|
|
570
577
|
delay_time: uint64,
|
|
571
578
|
delay_ph: bytes32,
|
|
572
579
|
action_scope: WalletActionScope,
|
|
573
|
-
extra_conditions:
|
|
574
|
-
) ->
|
|
580
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
581
|
+
) -> tuple[bytes32, bytes32]:
|
|
575
582
|
"""
|
|
576
583
|
Creates the initial singleton, which includes spending an origin coin, the launcher, and creating a singleton
|
|
577
584
|
with the "pooling" inner state, which can be either self pooling or using a pool
|
|
578
585
|
"""
|
|
579
|
-
coins:
|
|
586
|
+
coins: set[Coin] = await standard_wallet.select_coins(uint64(amount + fee), action_scope)
|
|
580
587
|
if coins is None:
|
|
581
588
|
raise ValueError("Not enough coins to create pool wallet")
|
|
582
589
|
|
|
@@ -663,7 +670,7 @@ class PoolWallet:
|
|
|
663
670
|
msg = f"Asked to change to current state. Target = {target_state}"
|
|
664
671
|
self.log.info(msg)
|
|
665
672
|
raise ValueError(msg)
|
|
666
|
-
elif current_state.current.state in
|
|
673
|
+
elif current_state.current.state in {SELF_POOLING.value, LEAVING_POOL.value}:
|
|
667
674
|
total_fee = fee
|
|
668
675
|
elif current_state.current.state == FARMING_TO_POOL.value:
|
|
669
676
|
total_fee = uint64(fee * 2)
|
|
@@ -674,7 +681,7 @@ class PoolWallet:
|
|
|
674
681
|
)
|
|
675
682
|
PoolWallet._verify_initial_target_state(target_state)
|
|
676
683
|
if current_state.current.state == LEAVING_POOL.value:
|
|
677
|
-
history:
|
|
684
|
+
history: list[tuple[uint32, CoinSpend]] = await self.get_spend_history()
|
|
678
685
|
last_height: uint32 = history[-1][0]
|
|
679
686
|
if (
|
|
680
687
|
await self.wallet_state_manager.blockchain.get_finished_sync_up_to()
|
|
@@ -711,7 +718,7 @@ class PoolWallet:
|
|
|
711
718
|
|
|
712
719
|
if current_state.current.state == LEAVING_POOL.value:
|
|
713
720
|
total_fee = fee
|
|
714
|
-
history:
|
|
721
|
+
history: list[tuple[uint32, CoinSpend]] = await self.get_spend_history()
|
|
715
722
|
last_height: uint32 = history[-1][0]
|
|
716
723
|
if (
|
|
717
724
|
await self.wallet_state_manager.blockchain.get_finished_sync_up_to()
|
|
@@ -746,21 +753,21 @@ class PoolWallet:
|
|
|
746
753
|
unspent_coin_records = await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(self.wallet_id)
|
|
747
754
|
if len(unspent_coin_records) == 0:
|
|
748
755
|
raise ValueError("Nothing to claim, no transactions to p2_singleton_puzzle_hash")
|
|
749
|
-
farming_rewards:
|
|
750
|
-
coin_to_height_farmed:
|
|
756
|
+
farming_rewards: list[TransactionRecord] = await self.wallet_state_manager.tx_store.get_farming_rewards()
|
|
757
|
+
coin_to_height_farmed: dict[Coin, uint32] = {}
|
|
751
758
|
for tx_record in farming_rewards:
|
|
752
759
|
height_farmed: Optional[uint32] = tx_record.height_farmed(
|
|
753
760
|
self.wallet_state_manager.constants.GENESIS_CHALLENGE
|
|
754
761
|
)
|
|
755
762
|
assert height_farmed is not None
|
|
756
763
|
coin_to_height_farmed[tx_record.additions[0]] = height_farmed
|
|
757
|
-
history:
|
|
764
|
+
history: list[tuple[uint32, CoinSpend]] = await self.get_spend_history()
|
|
758
765
|
assert len(history) > 0
|
|
759
766
|
delayed_seconds, delayed_puzhash = get_delayed_puz_info_from_launcher_spend(history[0][1])
|
|
760
767
|
current_state: PoolWalletInfo = await self.get_current_state()
|
|
761
768
|
last_solution: CoinSpend = history[-1][1]
|
|
762
769
|
|
|
763
|
-
all_spends:
|
|
770
|
+
all_spends: list[CoinSpend] = []
|
|
764
771
|
total_amount = 0
|
|
765
772
|
|
|
766
773
|
# The coins being claimed are gathered into the `SpendBundle`, :absorb_spend:
|
|
@@ -778,7 +785,7 @@ class PoolWallet:
|
|
|
778
785
|
self.log.info(f"pool wallet truncating absorb to {max_spends_in_tx} spends to fit into block")
|
|
779
786
|
print(f"pool wallet truncating absorb to {max_spends_in_tx} spends to fit into block")
|
|
780
787
|
break
|
|
781
|
-
absorb_spend:
|
|
788
|
+
absorb_spend: list[CoinSpend] = create_absorb_spend(
|
|
782
789
|
last_solution,
|
|
783
790
|
current_state.current,
|
|
784
791
|
current_state.launcher_coin,
|
|
@@ -821,7 +828,7 @@ class PoolWallet:
|
|
|
821
828
|
confirmed=False,
|
|
822
829
|
sent=uint32(0),
|
|
823
830
|
spend_bundle=claim_spend,
|
|
824
|
-
additions=claim_spend.additions(),
|
|
831
|
+
additions=[add for add in claim_spend.additions() if add.amount == last_solution.coin.amount],
|
|
825
832
|
removals=claim_spend.removals(),
|
|
826
833
|
wallet_id=uint32(self.wallet_id),
|
|
827
834
|
sent_to=[],
|
|
@@ -846,16 +853,16 @@ class PoolWallet:
|
|
|
846
853
|
raise ValueError(f"Internal error. Pool wallet {self.wallet_id} state: {pool_wallet_info.current}")
|
|
847
854
|
|
|
848
855
|
if (
|
|
849
|
-
self.target_state.state in
|
|
856
|
+
self.target_state.state in {FARMING_TO_POOL.value, SELF_POOLING.value}
|
|
850
857
|
and pool_wallet_info.current.state == LEAVING_POOL.value
|
|
851
858
|
):
|
|
852
859
|
leave_height = tip_height + pool_wallet_info.current.relative_lock_height
|
|
853
860
|
|
|
854
861
|
# Add some buffer (+2) to reduce chances of a reorg
|
|
855
862
|
if peak_height > leave_height + 2:
|
|
856
|
-
unconfirmed:
|
|
857
|
-
|
|
858
|
-
)
|
|
863
|
+
unconfirmed: list[
|
|
864
|
+
TransactionRecord
|
|
865
|
+
] = await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(self.wallet_id)
|
|
859
866
|
next_tip: Optional[Coin] = get_most_recent_singleton_coin_from_coin_spend(tip_spend)
|
|
860
867
|
assert next_tip is not None
|
|
861
868
|
|
|
@@ -879,7 +886,7 @@ class PoolWallet:
|
|
|
879
886
|
await self.generate_travel_transactions(self.next_transaction_fee, action_scope)
|
|
880
887
|
|
|
881
888
|
async def have_unconfirmed_transaction(self) -> bool:
|
|
882
|
-
unconfirmed:
|
|
889
|
+
unconfirmed: list[TransactionRecord] = await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(
|
|
883
890
|
self.wallet_id
|
|
884
891
|
)
|
|
885
892
|
return len(unconfirmed) > 0
|
|
@@ -887,7 +894,7 @@ class PoolWallet:
|
|
|
887
894
|
async def get_confirmed_balance(self, _: Optional[object] = None) -> uint128:
|
|
888
895
|
amount: uint128 = uint128(0)
|
|
889
896
|
if (await self.get_current_state()).current.state == SELF_POOLING.value:
|
|
890
|
-
unspent_coin_records:
|
|
897
|
+
unspent_coin_records: list[WalletCoinRecord] = list(
|
|
891
898
|
await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(self.wallet_id)
|
|
892
899
|
)
|
|
893
900
|
for record in unspent_coin_records:
|
|
@@ -904,13 +911,13 @@ class PoolWallet:
|
|
|
904
911
|
async def get_pending_change_balance(self) -> uint64:
|
|
905
912
|
return uint64(0)
|
|
906
913
|
|
|
907
|
-
async def get_max_send_amount(self, records: Optional[
|
|
914
|
+
async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
908
915
|
return uint128(0)
|
|
909
916
|
|
|
910
917
|
async def coin_added(self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: Optional[object]) -> None:
|
|
911
918
|
pass
|
|
912
919
|
|
|
913
|
-
async def select_coins(self, amount: uint64, action_scope: WalletActionScope) ->
|
|
920
|
+
async def select_coins(self, amount: uint64, action_scope: WalletActionScope) -> set[Coin]:
|
|
914
921
|
raise RuntimeError("PoolWallet does not support select_coins()")
|
|
915
922
|
|
|
916
923
|
def require_derivation_paths(self) -> bool:
|
chia/pools/pool_wallet_info.py
CHANGED
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from enum import IntEnum
|
|
5
|
-
from typing import Any,
|
|
5
|
+
from typing import Any, Optional
|
|
6
6
|
|
|
7
7
|
from chia_rs import G1Element
|
|
8
8
|
|
|
@@ -62,7 +62,7 @@ class PoolState(Streamable):
|
|
|
62
62
|
|
|
63
63
|
|
|
64
64
|
def initial_pool_state_from_dict(
|
|
65
|
-
state_dict:
|
|
65
|
+
state_dict: dict[str, Any],
|
|
66
66
|
owner_pubkey: G1Element,
|
|
67
67
|
owner_puzzle_hash: bytes32,
|
|
68
68
|
) -> PoolState:
|
|
@@ -93,7 +93,7 @@ def create_pool_state(
|
|
|
93
93
|
relative_lock_height: uint32,
|
|
94
94
|
) -> PoolState:
|
|
95
95
|
if state not in {s.value for s in PoolSingletonState}:
|
|
96
|
-
raise AssertionError("state {state} is not a valid PoolSingletonState,")
|
|
96
|
+
raise AssertionError(f"state {state} is not a valid PoolSingletonState,")
|
|
97
97
|
ps = PoolState(
|
|
98
98
|
POOL_PROTOCOL_VERSION, uint8(state), target_puzzle_hash, owner_pubkey, pool_url, relative_lock_height
|
|
99
99
|
)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Optional
|
|
5
5
|
|
|
6
6
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
7
7
|
from chia.types.blockchain_format.vdf import VDFInfo, VDFProof
|
|
@@ -90,7 +90,7 @@ class RequestBlocks(Streamable):
|
|
|
90
90
|
class RespondBlocks(Streamable):
|
|
91
91
|
start_height: uint32
|
|
92
92
|
end_height: uint32
|
|
93
|
-
blocks:
|
|
93
|
+
blocks: list[FullBlock]
|
|
94
94
|
|
|
95
95
|
|
|
96
96
|
@streamable
|
|
@@ -216,4 +216,4 @@ class RequestPeers(Streamable):
|
|
|
216
216
|
@streamable
|
|
217
217
|
@dataclass(frozen=True)
|
|
218
218
|
class RespondPeers(Streamable):
|
|
219
|
-
peer_list:
|
|
219
|
+
peer_list: list[TimestampedPeerInfo]
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from enum import IntEnum
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import Optional
|
|
6
6
|
|
|
7
7
|
from chia_rs import G1Element, G2Element
|
|
8
8
|
|
|
@@ -29,8 +29,8 @@ class PoolDifficulty(Streamable):
|
|
|
29
29
|
@streamable
|
|
30
30
|
@dataclass(frozen=True)
|
|
31
31
|
class HarvesterHandshake(Streamable):
|
|
32
|
-
farmer_public_keys:
|
|
33
|
-
pool_public_keys:
|
|
32
|
+
farmer_public_keys: list[G1Element]
|
|
33
|
+
pool_public_keys: list[G1Element]
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
@streamable
|
|
@@ -41,7 +41,7 @@ class NewSignagePointHarvester(Streamable):
|
|
|
41
41
|
sub_slot_iters: uint64
|
|
42
42
|
signage_point_index: uint8
|
|
43
43
|
sp_hash: bytes32
|
|
44
|
-
pool_difficulties:
|
|
44
|
+
pool_difficulties: list[PoolDifficulty]
|
|
45
45
|
filter_prefix_bits: uint8
|
|
46
46
|
|
|
47
47
|
|
|
@@ -90,9 +90,9 @@ class RequestSignatures(Streamable):
|
|
|
90
90
|
plot_identifier: str
|
|
91
91
|
challenge_hash: bytes32
|
|
92
92
|
sp_hash: bytes32
|
|
93
|
-
messages:
|
|
93
|
+
messages: list[bytes32]
|
|
94
94
|
# This, and rc_block_unfinished are only set when using a third-party harvester (see CHIP-22)
|
|
95
|
-
message_data: Optional[
|
|
95
|
+
message_data: Optional[list[Optional[SignatureRequestSourceData]]]
|
|
96
96
|
rc_block_unfinished: Optional[RewardChainBlockUnfinished]
|
|
97
97
|
|
|
98
98
|
|
|
@@ -104,7 +104,7 @@ class RespondSignatures(Streamable):
|
|
|
104
104
|
sp_hash: bytes32
|
|
105
105
|
local_pk: G1Element
|
|
106
106
|
farmer_pk: G1Element
|
|
107
|
-
message_signatures:
|
|
107
|
+
message_signatures: list[tuple[bytes32, G2Element]]
|
|
108
108
|
include_source_signature_data: bool
|
|
109
109
|
farmer_reward_address_override: Optional[bytes32]
|
|
110
110
|
|
|
@@ -132,9 +132,9 @@ class RequestPlots(Streamable):
|
|
|
132
132
|
@streamable
|
|
133
133
|
@dataclass(frozen=True)
|
|
134
134
|
class RespondPlots(Streamable):
|
|
135
|
-
plots:
|
|
136
|
-
failed_to_open_filenames:
|
|
137
|
-
no_key_filenames:
|
|
135
|
+
plots: list[Plot]
|
|
136
|
+
failed_to_open_filenames: list[str]
|
|
137
|
+
no_key_filenames: list[str]
|
|
138
138
|
|
|
139
139
|
|
|
140
140
|
@streamable
|
|
@@ -166,7 +166,7 @@ class PlotSyncStart(Streamable):
|
|
|
166
166
|
@dataclass(frozen=True)
|
|
167
167
|
class PlotSyncPathList(Streamable):
|
|
168
168
|
identifier: PlotSyncIdentifier
|
|
169
|
-
data:
|
|
169
|
+
data: list[str]
|
|
170
170
|
final: bool
|
|
171
171
|
|
|
172
172
|
def __str__(self) -> str:
|
|
@@ -177,7 +177,7 @@ class PlotSyncPathList(Streamable):
|
|
|
177
177
|
@dataclass(frozen=True)
|
|
178
178
|
class PlotSyncPlotList(Streamable):
|
|
179
179
|
identifier: PlotSyncIdentifier
|
|
180
|
-
data:
|
|
180
|
+
data: list[Plot]
|
|
181
181
|
final: bool
|
|
182
182
|
|
|
183
183
|
def __str__(self) -> str:
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import List
|
|
5
4
|
|
|
6
5
|
from chia.types.peer_info import TimestampedPeerInfo
|
|
7
6
|
from chia.util.streamable import Streamable, streamable
|
|
@@ -23,4 +22,4 @@ class RequestPeersIntroducer(Streamable):
|
|
|
23
22
|
@streamable
|
|
24
23
|
@dataclass(frozen=True)
|
|
25
24
|
class RespondPeersIntroducer(Streamable):
|
|
26
|
-
peer_list:
|
|
25
|
+
peer_list: list[TimestampedPeerInfo]
|
|
@@ -100,10 +100,10 @@ class ProtocolMessageTypes(Enum):
|
|
|
100
100
|
|
|
101
101
|
# More wallet protocol
|
|
102
102
|
coin_state_update = 69
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
103
|
+
register_for_ph_updates = 70
|
|
104
|
+
respond_to_ph_updates = 71
|
|
105
|
+
register_for_coin_updates = 72
|
|
106
|
+
respond_to_coin_updates = 73
|
|
107
107
|
request_children = 74
|
|
108
108
|
respond_children = 75
|
|
109
109
|
request_ses_hashes = 76
|
|
@@ -41,8 +41,8 @@ VALID_REPLY_MESSAGE_MAP = {
|
|
|
41
41
|
pmt.request_compact_vdf: [pmt.respond_compact_vdf],
|
|
42
42
|
pmt.request_peers: [pmt.respond_peers],
|
|
43
43
|
pmt.request_header_blocks: [pmt.respond_header_blocks, pmt.reject_header_blocks, pmt.reject_block_headers],
|
|
44
|
-
pmt.
|
|
45
|
-
pmt.
|
|
44
|
+
pmt.register_for_ph_updates: [pmt.respond_to_ph_updates],
|
|
45
|
+
pmt.register_for_coin_updates: [pmt.respond_to_coin_updates],
|
|
46
46
|
pmt.request_children: [pmt.respond_children],
|
|
47
47
|
pmt.request_ses_hashes: [pmt.respond_ses_hashes],
|
|
48
48
|
pmt.request_block_headers: [pmt.respond_block_headers, pmt.reject_block_headers, pmt.reject_header_blocks],
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from enum import IntEnum
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import Optional
|
|
6
6
|
|
|
7
7
|
from chia.server.outbound_message import NodeType
|
|
8
8
|
from chia.util.ints import int16, uint8, uint16
|
|
@@ -47,7 +47,7 @@ class Capability(IntEnum):
|
|
|
47
47
|
|
|
48
48
|
# These are the default capabilities used in all outgoing handshakes.
|
|
49
49
|
# "1" means the capability is supported and enabled.
|
|
50
|
-
_capabilities:
|
|
50
|
+
_capabilities: list[tuple[uint16, str]] = [
|
|
51
51
|
(uint16(Capability.BASE.value), "1"),
|
|
52
52
|
(uint16(Capability.BLOCK_HEADERS.value), "1"),
|
|
53
53
|
(uint16(Capability.RATE_LIMITS_V2.value), "1"),
|
|
@@ -75,7 +75,7 @@ class Handshake(Streamable):
|
|
|
75
75
|
software_version: str
|
|
76
76
|
server_port: uint16
|
|
77
77
|
node_type: uint8
|
|
78
|
-
capabilities:
|
|
78
|
+
capabilities: list[tuple[uint16, str]]
|
|
79
79
|
|
|
80
80
|
|
|
81
81
|
@streamable
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Optional
|
|
5
5
|
|
|
6
6
|
from chia.types.blockchain_format.foliage import Foliage
|
|
7
7
|
from chia.types.blockchain_format.reward_chain_block import RewardChainBlock, RewardChainBlockUnfinished
|
|
@@ -28,7 +28,7 @@ class NewPeakTimelord(Streamable):
|
|
|
28
28
|
sub_epoch_summary: Optional[
|
|
29
29
|
SubEpochSummary
|
|
30
30
|
] # If NewPeak is the last slot in epoch, the next slot should include this
|
|
31
|
-
previous_reward_challenges:
|
|
31
|
+
previous_reward_challenges: list[tuple[bytes32, uint128]]
|
|
32
32
|
last_challenge_sb_or_eos_total_iters: uint128
|
|
33
33
|
passes_ses_height_but_not_yet_included: bool
|
|
34
34
|
|