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/plotters/plotters_util.py
CHANGED
|
@@ -7,12 +7,14 @@ import os
|
|
|
7
7
|
import signal
|
|
8
8
|
import subprocess
|
|
9
9
|
import sys
|
|
10
|
+
from collections.abc import Iterator
|
|
10
11
|
from datetime import datetime
|
|
11
12
|
from pathlib import Path
|
|
12
|
-
from typing import
|
|
13
|
+
from typing import Optional, TextIO
|
|
13
14
|
|
|
14
15
|
from chia.util.chia_version import chia_short_version
|
|
15
16
|
from chia.util.config import lock_and_load_config
|
|
17
|
+
from chia.util.task_referencer import create_referenced_task
|
|
16
18
|
|
|
17
19
|
|
|
18
20
|
@contextlib.contextmanager
|
|
@@ -59,7 +61,7 @@ async def run_plotter(root_path, plotter, args, progress_dict):
|
|
|
59
61
|
process.terminate()
|
|
60
62
|
|
|
61
63
|
# For Windows, we'll install a SIGINT handler to catch Ctrl-C (KeyboardInterrupt isn't raised)
|
|
62
|
-
if sys.platform in
|
|
64
|
+
if sys.platform in {"win32", "cygwin"}:
|
|
63
65
|
signal.signal(signal.SIGINT, sigint_handler)
|
|
64
66
|
installed_sigint_handler = True
|
|
65
67
|
|
|
@@ -82,13 +84,13 @@ async def run_plotter(root_path, plotter, args, progress_dict):
|
|
|
82
84
|
try:
|
|
83
85
|
await asyncio.wait(
|
|
84
86
|
[
|
|
85
|
-
|
|
87
|
+
create_referenced_task(
|
|
86
88
|
_read_stream(
|
|
87
89
|
process.stdout,
|
|
88
90
|
process_stdout_line,
|
|
89
91
|
)
|
|
90
92
|
),
|
|
91
|
-
|
|
93
|
+
create_referenced_task(
|
|
92
94
|
_read_stream(
|
|
93
95
|
process.stderr,
|
|
94
96
|
process_stderr_line,
|
chia/plotting/cache.py
CHANGED
|
@@ -3,10 +3,11 @@ from __future__ import annotations
|
|
|
3
3
|
import logging
|
|
4
4
|
import time
|
|
5
5
|
import traceback
|
|
6
|
+
from collections.abc import ItemsView, KeysView, ValuesView
|
|
6
7
|
from dataclasses import dataclass, field
|
|
7
8
|
from math import ceil
|
|
8
9
|
from pathlib import Path
|
|
9
|
-
from typing import
|
|
10
|
+
from typing import Optional
|
|
10
11
|
|
|
11
12
|
from chia_rs import G1Element
|
|
12
13
|
from chiapos import DiskProver
|
|
@@ -37,7 +38,7 @@ class DiskCacheEntry(Streamable):
|
|
|
37
38
|
@streamable
|
|
38
39
|
@dataclass(frozen=True)
|
|
39
40
|
class CacheDataV1(Streamable):
|
|
40
|
-
entries:
|
|
41
|
+
entries: list[tuple[str, DiskCacheEntry]]
|
|
41
42
|
|
|
42
43
|
|
|
43
44
|
@dataclass
|
|
@@ -84,7 +85,7 @@ class CacheEntry:
|
|
|
84
85
|
class Cache:
|
|
85
86
|
_path: Path
|
|
86
87
|
_changed: bool = False
|
|
87
|
-
_data:
|
|
88
|
+
_data: dict[Path, CacheEntry] = field(default_factory=dict)
|
|
88
89
|
expiry_seconds: int = 7 * 24 * 60 * 60 # Keep the cache entries alive for 7 days after its last access
|
|
89
90
|
|
|
90
91
|
def __post_init__(self) -> None:
|
|
@@ -97,7 +98,7 @@ class Cache:
|
|
|
97
98
|
self._data[path] = entry
|
|
98
99
|
self._changed = True
|
|
99
100
|
|
|
100
|
-
def remove(self, cache_keys:
|
|
101
|
+
def remove(self, cache_keys: list[Path]) -> None:
|
|
101
102
|
for key in cache_keys:
|
|
102
103
|
if key in self._data:
|
|
103
104
|
del self._data[key]
|
|
@@ -105,7 +106,7 @@ class Cache:
|
|
|
105
106
|
|
|
106
107
|
def save(self) -> None:
|
|
107
108
|
try:
|
|
108
|
-
disk_cache_entries:
|
|
109
|
+
disk_cache_entries: dict[str, DiskCacheEntry] = {
|
|
109
110
|
str(path): DiskCacheEntry(
|
|
110
111
|
bytes(cache_entry.prover),
|
|
111
112
|
cache_entry.farmer_public_key,
|
|
@@ -136,8 +137,8 @@ class Cache:
|
|
|
136
137
|
start = time.time()
|
|
137
138
|
cache_data: CacheDataV1 = CacheDataV1.from_bytes(stored_cache.blob)
|
|
138
139
|
self._data = {}
|
|
139
|
-
estimated_c2_sizes:
|
|
140
|
-
measured_sizes:
|
|
140
|
+
estimated_c2_sizes: dict[int, int] = {}
|
|
141
|
+
measured_sizes: dict[int, int] = {
|
|
141
142
|
32: 738,
|
|
142
143
|
33: 1083,
|
|
143
144
|
34: 1771,
|
chia/plotting/check_plots.py
CHANGED
|
@@ -6,7 +6,7 @@ from collections import Counter
|
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
from threading import Lock
|
|
8
8
|
from time import sleep, time
|
|
9
|
-
from typing import
|
|
9
|
+
from typing import Optional
|
|
10
10
|
|
|
11
11
|
from chia_rs import G1Element
|
|
12
12
|
from chiapos import Verifier
|
|
@@ -103,7 +103,7 @@ def check_plots(
|
|
|
103
103
|
log.info("Plot filenames expected to end with -[64 char plot ID].plot")
|
|
104
104
|
|
|
105
105
|
if list_duplicates:
|
|
106
|
-
all_filenames:
|
|
106
|
+
all_filenames: list[Path] = []
|
|
107
107
|
for paths in get_plot_filenames(root_path).values():
|
|
108
108
|
all_filenames += paths
|
|
109
109
|
find_duplicate_plot_IDs(all_filenames)
|
|
@@ -135,7 +135,7 @@ def check_plots(
|
|
|
135
135
|
log.info(f"Starting to test each plot with {num} challenges each\n")
|
|
136
136
|
total_good_plots: Counter[str] = Counter()
|
|
137
137
|
total_size = 0
|
|
138
|
-
bad_plots_list:
|
|
138
|
+
bad_plots_list: list[Path] = []
|
|
139
139
|
|
|
140
140
|
with plot_manager:
|
|
141
141
|
|
|
@@ -148,7 +148,7 @@ def check_plots(
|
|
|
148
148
|
|
|
149
149
|
# Look up local_sk from plot to save locked memory
|
|
150
150
|
(
|
|
151
|
-
|
|
151
|
+
_pool_public_key_or_puzzle_hash,
|
|
152
152
|
farmer_public_key,
|
|
153
153
|
local_master_sk,
|
|
154
154
|
) = parse_plot_info(pr.get_memo())
|
|
@@ -161,8 +161,8 @@ def check_plots(
|
|
|
161
161
|
if plot_info.pool_contract_puzzle_hash is not None:
|
|
162
162
|
pca: str = encode_puzzle_hash(plot_info.pool_contract_puzzle_hash, address_prefix)
|
|
163
163
|
log.info(f"\t{'Pool contract address:':<23} {pca}")
|
|
164
|
-
log.info(f"\t{'Farmer public key:'
|
|
165
|
-
log.info(f"\t{'Local sk:'
|
|
164
|
+
log.info(f"\t{'Farmer public key:':<23} {farmer_public_key}")
|
|
165
|
+
log.info(f"\t{'Local sk:':<23} {local_sk}")
|
|
166
166
|
|
|
167
167
|
total_proofs = 0
|
|
168
168
|
caught_exception: bool = False
|
|
@@ -229,14 +229,14 @@ def check_plots(
|
|
|
229
229
|
|
|
230
230
|
if total_proofs > 0 and caught_exception is False:
|
|
231
231
|
log.info(
|
|
232
|
-
f"\tProofs {total_proofs} / {challenges}, {round(total_proofs/float(challenges), 4)}. "
|
|
232
|
+
f"\tProofs {total_proofs} / {challenges}, {round(total_proofs / float(challenges), 4)}. "
|
|
233
233
|
f"Filepath: {plot_path}"
|
|
234
234
|
)
|
|
235
235
|
total_good_plots[pr.get_size()] += 1
|
|
236
236
|
total_size += plot_path.stat().st_size
|
|
237
237
|
else:
|
|
238
238
|
log.error(
|
|
239
|
-
f"\tProofs {total_proofs} / {challenges}, {round(total_proofs/float(challenges), 4)} "
|
|
239
|
+
f"\tProofs {total_proofs} / {challenges}, {round(total_proofs / float(challenges), 4)} "
|
|
240
240
|
f"Filepath: {plot_path}"
|
|
241
241
|
)
|
|
242
242
|
bad_plots_list.append(plot_path)
|
chia/plotting/create_plots.py
CHANGED
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import logging
|
|
4
4
|
from datetime import datetime
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import
|
|
6
|
+
from typing import Optional
|
|
7
7
|
|
|
8
8
|
from chia_rs import AugSchemeMPL, G1Element, PrivateKey
|
|
9
9
|
from chiapos import DiskPlotter
|
|
@@ -105,7 +105,7 @@ class PlotKeysResolver:
|
|
|
105
105
|
except Exception as e:
|
|
106
106
|
log.error(f"Keychain proxy failed with error: {e}")
|
|
107
107
|
else:
|
|
108
|
-
sk_ent: Optional[
|
|
108
|
+
sk_ent: Optional[tuple[PrivateKey, bytes]] = None
|
|
109
109
|
keychain: Keychain = Keychain()
|
|
110
110
|
if self.alt_fingerprint is not None:
|
|
111
111
|
sk_ent = keychain.get_private_key_by_fingerprint(self.alt_fingerprint)
|
|
@@ -151,8 +151,8 @@ async def create_plots(
|
|
|
151
151
|
args: Params,
|
|
152
152
|
keys: PlotKeys,
|
|
153
153
|
use_datetime: bool = True,
|
|
154
|
-
test_private_keys: Optional[
|
|
155
|
-
) ->
|
|
154
|
+
test_private_keys: Optional[list[PrivateKey]] = None,
|
|
155
|
+
) -> tuple[dict[bytes32, Path], dict[bytes32, Path]]:
|
|
156
156
|
if args.tmp2_dir is None:
|
|
157
157
|
args.tmp2_dir = args.tmp_dir
|
|
158
158
|
assert (keys.pool_public_key is None) != (keys.pool_contract_puzzle_hash is None)
|
|
@@ -182,8 +182,8 @@ async def create_plots(
|
|
|
182
182
|
|
|
183
183
|
args.final_dir.mkdir(parents=True, exist_ok=True)
|
|
184
184
|
|
|
185
|
-
created_plots:
|
|
186
|
-
existing_plots:
|
|
185
|
+
created_plots: dict[bytes32, Path] = {}
|
|
186
|
+
existing_plots: dict[bytes32, Path] = {}
|
|
187
187
|
for i in range(num):
|
|
188
188
|
# Generate a random master secret key
|
|
189
189
|
if test_private_keys is not None:
|
chia/plotting/manager.py
CHANGED
|
@@ -6,7 +6,7 @@ import time
|
|
|
6
6
|
import traceback
|
|
7
7
|
from concurrent.futures.thread import ThreadPoolExecutor
|
|
8
8
|
from pathlib import Path
|
|
9
|
-
from typing import Any, Callable,
|
|
9
|
+
from typing import Any, Callable, Optional
|
|
10
10
|
|
|
11
11
|
from chia_rs import G1Element
|
|
12
12
|
from chiapos import DiskProver, decompressor_context_queue
|
|
@@ -27,13 +27,13 @@ log = logging.getLogger(__name__)
|
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
class PlotManager:
|
|
30
|
-
plots:
|
|
31
|
-
plot_filename_paths:
|
|
30
|
+
plots: dict[Path, PlotInfo]
|
|
31
|
+
plot_filename_paths: dict[str, tuple[str, set[str]]]
|
|
32
32
|
plot_filename_paths_lock: threading.Lock
|
|
33
|
-
failed_to_open_filenames:
|
|
34
|
-
no_key_filenames:
|
|
35
|
-
farmer_public_keys:
|
|
36
|
-
pool_public_keys:
|
|
33
|
+
failed_to_open_filenames: dict[Path, int]
|
|
34
|
+
no_key_filenames: set[Path]
|
|
35
|
+
farmer_public_keys: list[G1Element]
|
|
36
|
+
pool_public_keys: list[G1Element]
|
|
37
37
|
cache: Cache
|
|
38
38
|
match_str: Optional[str]
|
|
39
39
|
open_no_key_filenames: bool
|
|
@@ -137,7 +137,7 @@ class PlotManager:
|
|
|
137
137
|
def set_refresh_callback(self, callback: Callable):
|
|
138
138
|
self._refresh_callback = callback
|
|
139
139
|
|
|
140
|
-
def set_public_keys(self, farmer_public_keys:
|
|
140
|
+
def set_public_keys(self, farmer_public_keys: list[G1Element], pool_public_keys: list[G1Element]):
|
|
141
141
|
self.farmer_public_keys = farmer_public_keys
|
|
142
142
|
self.pool_public_keys = pool_public_keys
|
|
143
143
|
|
|
@@ -151,7 +151,7 @@ class PlotManager:
|
|
|
151
151
|
with self:
|
|
152
152
|
return len(self.plots)
|
|
153
153
|
|
|
154
|
-
def get_duplicates(self) ->
|
|
154
|
+
def get_duplicates(self) -> list[Path]:
|
|
155
155
|
result = []
|
|
156
156
|
for plot_filename, paths_entry in self.plot_filename_paths.items():
|
|
157
157
|
_, duplicated_paths = paths_entry
|
|
@@ -188,9 +188,9 @@ class PlotManager:
|
|
|
188
188
|
if not self._refreshing_enabled:
|
|
189
189
|
return
|
|
190
190
|
|
|
191
|
-
plot_filenames:
|
|
192
|
-
plot_directories:
|
|
193
|
-
plot_paths:
|
|
191
|
+
plot_filenames: dict[Path, list[Path]] = get_plot_filenames(self.root_path)
|
|
192
|
+
plot_directories: set[Path] = set(plot_filenames.keys())
|
|
193
|
+
plot_paths: set[Path] = set()
|
|
194
194
|
for paths in plot_filenames.values():
|
|
195
195
|
plot_paths.update(paths)
|
|
196
196
|
|
|
@@ -208,7 +208,7 @@ class PlotManager:
|
|
|
208
208
|
if path not in plot_paths:
|
|
209
209
|
self.no_key_filenames.remove(path)
|
|
210
210
|
|
|
211
|
-
filenames_to_remove:
|
|
211
|
+
filenames_to_remove: list[str] = []
|
|
212
212
|
for plot_filename, paths_entry in self.plot_filename_paths.items():
|
|
213
213
|
loaded_path, duplicated_paths = paths_entry
|
|
214
214
|
loaded_plot = Path(loaded_path) / Path(plot_filename)
|
|
@@ -221,7 +221,7 @@ class PlotManager:
|
|
|
221
221
|
# No need to check the duplicates here since we drop the whole entry
|
|
222
222
|
continue
|
|
223
223
|
|
|
224
|
-
paths_to_remove:
|
|
224
|
+
paths_to_remove: list[str] = []
|
|
225
225
|
for path_str in duplicated_paths:
|
|
226
226
|
loaded_plot = Path(path_str) / Path(plot_filename)
|
|
227
227
|
if loaded_plot not in plot_paths:
|
|
@@ -258,7 +258,7 @@ class PlotManager:
|
|
|
258
258
|
|
|
259
259
|
# Cleanup unused cache
|
|
260
260
|
self.log.debug(f"_refresh_task: cached entries before cleanup: {len(self.cache)}")
|
|
261
|
-
remove_paths:
|
|
261
|
+
remove_paths: list[Path] = []
|
|
262
262
|
for path, cache_entry in self.cache.items():
|
|
263
263
|
if cache_entry.expired(Cache.expiry_seconds) and path not in self.plots:
|
|
264
264
|
remove_paths.append(path)
|
|
@@ -281,7 +281,7 @@ class PlotManager:
|
|
|
281
281
|
log.error(f"_refresh_callback raised: {e} with the traceback: {traceback.format_exc()}")
|
|
282
282
|
self.reset()
|
|
283
283
|
|
|
284
|
-
def refresh_batch(self, plot_paths:
|
|
284
|
+
def refresh_batch(self, plot_paths: list[Path], plot_directories: set[Path]) -> PlotRefreshResult:
|
|
285
285
|
start_time: float = time.time()
|
|
286
286
|
result: PlotRefreshResult = PlotRefreshResult(processed=len(plot_paths))
|
|
287
287
|
counter_lock = threading.Lock()
|
|
@@ -308,11 +308,11 @@ class PlotManager:
|
|
|
308
308
|
if file_path in self.plots:
|
|
309
309
|
return self.plots[file_path]
|
|
310
310
|
|
|
311
|
-
entry: Optional[
|
|
311
|
+
entry: Optional[tuple[str, set[str]]] = self.plot_filename_paths.get(file_path.name)
|
|
312
312
|
if entry is not None:
|
|
313
|
-
|
|
313
|
+
_loaded_parent, duplicates = entry
|
|
314
314
|
if str(file_path.parent) in duplicates:
|
|
315
|
-
log.debug(f"Skip duplicated plot {
|
|
315
|
+
log.debug(f"Skip duplicated plot {file_path!s}")
|
|
316
316
|
return None
|
|
317
317
|
try:
|
|
318
318
|
if not file_path.exists():
|
|
@@ -325,7 +325,7 @@ class PlotManager:
|
|
|
325
325
|
if not cache_hit:
|
|
326
326
|
prover = DiskProver(str(file_path))
|
|
327
327
|
|
|
328
|
-
log.debug(f"process_file {
|
|
328
|
+
log.debug(f"process_file {file_path!s}")
|
|
329
329
|
|
|
330
330
|
expected_size = _expected_plot_size(prover.get_size()) * UI_ACTUAL_SPACE_CONSTANT_FACTOR
|
|
331
331
|
|
|
@@ -383,7 +383,7 @@ class PlotManager:
|
|
|
383
383
|
self.no_key_filenames.remove(file_path)
|
|
384
384
|
|
|
385
385
|
with self.plot_filename_paths_lock:
|
|
386
|
-
paths: Optional[
|
|
386
|
+
paths: Optional[tuple[str, set[str]]] = self.plot_filename_paths.get(file_path.name)
|
|
387
387
|
if paths is None:
|
|
388
388
|
paths = (str(Path(cache_entry.prover.get_filename()).parent), set())
|
|
389
389
|
self.plot_filename_paths[file_path.name] = paths
|
|
@@ -419,7 +419,7 @@ class PlotManager:
|
|
|
419
419
|
return new_plot_info
|
|
420
420
|
|
|
421
421
|
with self, ThreadPoolExecutor() as executor:
|
|
422
|
-
plots_refreshed:
|
|
422
|
+
plots_refreshed: dict[Path, PlotInfo] = {}
|
|
423
423
|
for new_plot in executor.map(process_file, plot_paths):
|
|
424
424
|
if new_plot is not None:
|
|
425
425
|
plots_refreshed[Path(new_plot.prover.get_filename())] = new_plot
|
chia/plotting/util.py
CHANGED
|
@@ -4,7 +4,7 @@ import logging
|
|
|
4
4
|
from dataclasses import dataclass, field
|
|
5
5
|
from enum import Enum, IntEnum
|
|
6
6
|
from pathlib import Path
|
|
7
|
-
from typing import Any,
|
|
7
|
+
from typing import Any, Optional, Union
|
|
8
8
|
|
|
9
9
|
from chia_rs import G1Element, PrivateKey
|
|
10
10
|
from chiapos import DiskProver
|
|
@@ -70,8 +70,8 @@ class PlotRefreshEvents(Enum):
|
|
|
70
70
|
|
|
71
71
|
@dataclass
|
|
72
72
|
class PlotRefreshResult:
|
|
73
|
-
loaded:
|
|
74
|
-
removed:
|
|
73
|
+
loaded: list[PlotInfo] = field(default_factory=list)
|
|
74
|
+
removed: list[Path] = field(default_factory=list)
|
|
75
75
|
processed: int = 0
|
|
76
76
|
remaining: int = 0
|
|
77
77
|
duration: float = 0
|
|
@@ -99,28 +99,29 @@ class HarvestingMode(IntEnum):
|
|
|
99
99
|
GPU = 2
|
|
100
100
|
|
|
101
101
|
|
|
102
|
-
def get_plot_directories(root_path: Path, config:
|
|
102
|
+
def get_plot_directories(root_path: Path, config: Optional[dict] = None) -> list[str]:
|
|
103
103
|
if config is None:
|
|
104
104
|
config = load_config(root_path, "config.yaml")
|
|
105
105
|
return config["harvester"]["plot_directories"] or []
|
|
106
106
|
|
|
107
107
|
|
|
108
|
-
def get_plot_filenames(root_path: Path) ->
|
|
108
|
+
def get_plot_filenames(root_path: Path) -> dict[Path, list[Path]]:
|
|
109
109
|
# Returns a map from directory to a list of all plots in the directory
|
|
110
|
-
all_files:
|
|
110
|
+
all_files: dict[Path, list[Path]] = {}
|
|
111
111
|
config = load_config(root_path, "config.yaml")
|
|
112
112
|
recursive_scan: bool = config["harvester"].get("recursive_plot_scan", DEFAULT_RECURSIVE_PLOT_SCAN)
|
|
113
|
+
recursive_follow_links: bool = config["harvester"].get("recursive_follow_links", False)
|
|
113
114
|
for directory_name in get_plot_directories(root_path, config):
|
|
114
115
|
try:
|
|
115
116
|
directory = Path(directory_name).resolve()
|
|
116
117
|
except (OSError, RuntimeError):
|
|
117
118
|
log.exception(f"Failed to resolve {directory_name}")
|
|
118
119
|
continue
|
|
119
|
-
all_files[directory] = get_filenames(directory, recursive_scan)
|
|
120
|
+
all_files[directory] = get_filenames(directory, recursive_scan, recursive_follow_links)
|
|
120
121
|
return all_files
|
|
121
122
|
|
|
122
123
|
|
|
123
|
-
def add_plot_directory(root_path: Path, str_path: str) ->
|
|
124
|
+
def add_plot_directory(root_path: Path, str_path: str) -> dict:
|
|
124
125
|
path: Path = Path(str_path).resolve()
|
|
125
126
|
if not path.exists():
|
|
126
127
|
raise ValueError(f"Path doesn't exist: {path}")
|
|
@@ -140,7 +141,7 @@ def add_plot_directory(root_path: Path, str_path: str) -> Dict:
|
|
|
140
141
|
def remove_plot_directory(root_path: Path, str_path: str) -> None:
|
|
141
142
|
log.debug(f"remove_plot_directory {str_path}")
|
|
142
143
|
with lock_and_load_config(root_path, "config.yaml") as config:
|
|
143
|
-
str_paths:
|
|
144
|
+
str_paths: list[str] = get_plot_directories(root_path, config)
|
|
144
145
|
# If path str matches exactly, remove
|
|
145
146
|
if str_path in str_paths:
|
|
146
147
|
str_paths.remove(str_path)
|
|
@@ -155,13 +156,13 @@ def remove_plot_directory(root_path: Path, str_path: str) -> None:
|
|
|
155
156
|
|
|
156
157
|
|
|
157
158
|
def remove_plot(path: Path):
|
|
158
|
-
log.debug(f"remove_plot {
|
|
159
|
+
log.debug(f"remove_plot {path!s}")
|
|
159
160
|
# Remove absolute and relative paths
|
|
160
161
|
if path.exists():
|
|
161
162
|
path.unlink()
|
|
162
163
|
|
|
163
164
|
|
|
164
|
-
def get_harvester_config(root_path: Path) ->
|
|
165
|
+
def get_harvester_config(root_path: Path) -> dict[str, Any]:
|
|
165
166
|
config = load_config(root_path, "config.yaml")
|
|
166
167
|
|
|
167
168
|
plots_refresh_parameter = (
|
|
@@ -219,7 +220,7 @@ def update_harvester_config(
|
|
|
219
220
|
save_config(root_path, "config.yaml", config)
|
|
220
221
|
|
|
221
222
|
|
|
222
|
-
def get_filenames(directory: Path, recursive: bool) ->
|
|
223
|
+
def get_filenames(directory: Path, recursive: bool, follow_links: bool) -> list[Path]:
|
|
223
224
|
try:
|
|
224
225
|
if not directory.exists():
|
|
225
226
|
log.warning(f"Directory: {directory} does not exist.")
|
|
@@ -227,17 +228,28 @@ def get_filenames(directory: Path, recursive: bool) -> List[Path]:
|
|
|
227
228
|
except OSError as e:
|
|
228
229
|
log.warning(f"Error checking if directory {directory} exists: {e}")
|
|
229
230
|
return []
|
|
230
|
-
all_files:
|
|
231
|
+
all_files: list[Path] = []
|
|
231
232
|
try:
|
|
232
|
-
|
|
233
|
-
|
|
233
|
+
if follow_links and recursive:
|
|
234
|
+
import glob
|
|
235
|
+
|
|
236
|
+
files = glob.glob(str(directory / "**" / "*.plot"), recursive=True)
|
|
237
|
+
for file in files:
|
|
238
|
+
filepath = Path(file).resolve()
|
|
239
|
+
if filepath.is_file() and not filepath.name.startswith("._"):
|
|
240
|
+
all_files.append(filepath)
|
|
241
|
+
else:
|
|
242
|
+
glob_function = directory.rglob if recursive else directory.glob
|
|
243
|
+
all_files = [
|
|
244
|
+
child for child in glob_function("*.plot") if child.is_file() and not child.name.startswith("._")
|
|
245
|
+
]
|
|
234
246
|
log.debug(f"get_filenames: {len(all_files)} files found in {directory}, recursive: {recursive}")
|
|
235
247
|
except Exception as e:
|
|
236
248
|
log.warning(f"Error reading directory {directory} {e}")
|
|
237
249
|
return all_files
|
|
238
250
|
|
|
239
251
|
|
|
240
|
-
def parse_plot_info(memo: bytes) ->
|
|
252
|
+
def parse_plot_info(memo: bytes) -> tuple[Union[G1Element, bytes32], G1Element, PrivateKey]:
|
|
241
253
|
# Parses the plot info bytes into keys
|
|
242
254
|
if len(memo) == (48 + 48 + 32):
|
|
243
255
|
# This is a public key memo
|
|
@@ -286,12 +298,12 @@ def find_duplicate_plot_IDs(all_filenames=None) -> None:
|
|
|
286
298
|
all_filenames = []
|
|
287
299
|
plot_ids_set = set()
|
|
288
300
|
duplicate_plot_ids = set()
|
|
289
|
-
all_filenames_str:
|
|
301
|
+
all_filenames_str: list[str] = []
|
|
290
302
|
|
|
291
303
|
for filename in all_filenames:
|
|
292
304
|
filename_str: str = str(filename)
|
|
293
305
|
all_filenames_str.append(filename_str)
|
|
294
|
-
filename_parts:
|
|
306
|
+
filename_parts: list[str] = filename_str.split("-")
|
|
295
307
|
plot_id: str = filename_parts[-1]
|
|
296
308
|
# Skipped parsing and verifying plot ID for faster performance
|
|
297
309
|
# Skipped checking K size for faster performance
|
|
@@ -306,7 +318,7 @@ def find_duplicate_plot_IDs(all_filenames=None) -> None:
|
|
|
306
318
|
|
|
307
319
|
for plot_id in duplicate_plot_ids:
|
|
308
320
|
log_message: str = plot_id + " found in multiple files:\n"
|
|
309
|
-
duplicate_filenames:
|
|
321
|
+
duplicate_filenames: list[str] = [filename_str for filename_str in all_filenames_str if plot_id in filename_str]
|
|
310
322
|
for filename_str in duplicate_filenames:
|
|
311
323
|
log_message += "\t" + filename_str + "\n"
|
|
312
324
|
log.warning(f"{log_message}")
|
chia/pools/pool_config.py
CHANGED
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import logging
|
|
4
4
|
from dataclasses import dataclass
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import Any, Callable
|
|
6
|
+
from typing import Any, Callable
|
|
7
7
|
|
|
8
8
|
from chia_rs import G1Element
|
|
9
9
|
|
|
@@ -22,7 +22,7 @@ pool_list:
|
|
|
22
22
|
pool_url: localhost
|
|
23
23
|
p2_singleton_puzzle_hash: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
|
|
24
24
|
target_puzzle_hash: 344587cf06a39db471d2cc027504e8688a0a67cce961253500c956c73603fd58
|
|
25
|
-
"""
|
|
25
|
+
"""
|
|
26
26
|
|
|
27
27
|
log = logging.getLogger(__name__)
|
|
28
28
|
|
|
@@ -38,9 +38,9 @@ class PoolWalletConfig(Streamable):
|
|
|
38
38
|
owner_public_key: G1Element
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
def load_pool_config(root_path: Path) ->
|
|
41
|
+
def load_pool_config(root_path: Path) -> list[PoolWalletConfig]:
|
|
42
42
|
config = load_config(root_path, "config.yaml")
|
|
43
|
-
ret_list:
|
|
43
|
+
ret_list: list[PoolWalletConfig] = []
|
|
44
44
|
pool_list = config["pool"].get("pool_list", [])
|
|
45
45
|
if pool_list is None:
|
|
46
46
|
return ret_list
|
|
@@ -63,7 +63,7 @@ def load_pool_config(root_path: Path) -> List[PoolWalletConfig]:
|
|
|
63
63
|
|
|
64
64
|
|
|
65
65
|
def update_pool_url(root_path: Path, pool_wallet_config: PoolWalletConfig, pool_url: str) -> None:
|
|
66
|
-
def update_pool_url_for_entry(config_entry:
|
|
66
|
+
def update_pool_url_for_entry(config_entry: dict[str, Any]) -> bool:
|
|
67
67
|
if config_entry.get("pool_url", "") != pool_url:
|
|
68
68
|
config_entry["pool_url"] = pool_url
|
|
69
69
|
|
|
@@ -82,7 +82,7 @@ def update_pool_url(root_path: Path, pool_wallet_config: PoolWalletConfig, pool_
|
|
|
82
82
|
def update_pool_config_entry(
|
|
83
83
|
root_path: Path,
|
|
84
84
|
pool_wallet_config: PoolWalletConfig,
|
|
85
|
-
update_closure: Callable[[
|
|
85
|
+
update_closure: Callable[[dict[str, Any]], bool],
|
|
86
86
|
update_log_message: str,
|
|
87
87
|
) -> None:
|
|
88
88
|
with lock_and_load_config(root_path, "config.yaml") as config:
|
|
@@ -104,7 +104,7 @@ def update_pool_config_entry(
|
|
|
104
104
|
save_config(root_path, "config.yaml", config)
|
|
105
105
|
|
|
106
106
|
|
|
107
|
-
async def update_pool_config(root_path: Path, pool_config_list:
|
|
107
|
+
async def update_pool_config(root_path: Path, pool_config_list: list[PoolWalletConfig]) -> None:
|
|
108
108
|
with lock_and_load_config(root_path, "config.yaml") as full_config:
|
|
109
109
|
full_config["pool"]["pool_list"] = [c.to_json_dict() for c in pool_config_list]
|
|
110
110
|
save_config(root_path, "config.yaml", full_config)
|
chia/pools/pool_puzzles.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Optional
|
|
5
5
|
|
|
6
6
|
from chia_rs import G1Element
|
|
7
7
|
from clvm.casts import int_to_bytes
|
|
@@ -115,7 +115,7 @@ def launcher_id_to_p2_puzzle_hash(launcher_id: bytes32, seconds_delay: uint64, d
|
|
|
115
115
|
return create_p2_singleton_puzzle_hash(SINGLETON_MOD_HASH, launcher_id, seconds_delay, delayed_puzzle_hash)
|
|
116
116
|
|
|
117
117
|
|
|
118
|
-
def get_delayed_puz_info_from_launcher_spend(coinsol: CoinSpend) ->
|
|
118
|
+
def get_delayed_puz_info_from_launcher_spend(coinsol: CoinSpend) -> tuple[uint64, bytes32]:
|
|
119
119
|
extra_data = Program.from_bytes(bytes(coinsol.solution)).rest().rest().first()
|
|
120
120
|
# Extra data is (pool_state delayed_puz_info)
|
|
121
121
|
# Delayed puz info is (seconds delayed_puzzle_hash)
|
|
@@ -143,11 +143,11 @@ def get_template_singleton_inner_puzzle(inner_puzzle: Program) -> Program:
|
|
|
143
143
|
r = inner_puzzle.uncurry()
|
|
144
144
|
if r is None:
|
|
145
145
|
return False
|
|
146
|
-
uncurried_inner_puzzle,
|
|
146
|
+
uncurried_inner_puzzle, _args = r
|
|
147
147
|
return uncurried_inner_puzzle
|
|
148
148
|
|
|
149
149
|
|
|
150
|
-
def get_seconds_and_delayed_puzhash_from_p2_singleton_puzzle(puzzle: Program) ->
|
|
150
|
+
def get_seconds_and_delayed_puzhash_from_p2_singleton_puzzle(puzzle: Program) -> tuple[uint64, bytes32]:
|
|
151
151
|
r = puzzle.uncurry()
|
|
152
152
|
if r is None:
|
|
153
153
|
return False
|
|
@@ -161,17 +161,17 @@ def get_seconds_and_delayed_puzhash_from_p2_singleton_puzzle(puzzle: Program) ->
|
|
|
161
161
|
# Verify that a puzzle is a Pool Wallet Singleton
|
|
162
162
|
def is_pool_singleton_inner_puzzle(inner_puzzle: Program) -> bool:
|
|
163
163
|
inner_f = get_template_singleton_inner_puzzle(inner_puzzle)
|
|
164
|
-
return inner_f in
|
|
164
|
+
return inner_f in (POOL_WAITING_ROOM_MOD, POOL_MEMBER_MOD) # noqa: PLR6201
|
|
165
165
|
|
|
166
166
|
|
|
167
167
|
def is_pool_waitingroom_inner_puzzle(inner_puzzle: Program) -> bool:
|
|
168
168
|
inner_f = get_template_singleton_inner_puzzle(inner_puzzle)
|
|
169
|
-
return inner_f
|
|
169
|
+
return inner_f == POOL_WAITING_ROOM_MOD
|
|
170
170
|
|
|
171
171
|
|
|
172
172
|
def is_pool_member_inner_puzzle(inner_puzzle: Program) -> bool:
|
|
173
173
|
inner_f = get_template_singleton_inner_puzzle(inner_puzzle)
|
|
174
|
-
return inner_f
|
|
174
|
+
return inner_f == POOL_MEMBER_MOD
|
|
175
175
|
|
|
176
176
|
|
|
177
177
|
# This spend will use the escape-type spend path for whichever state you are currently in
|
|
@@ -185,7 +185,7 @@ def create_travel_spend(
|
|
|
185
185
|
genesis_challenge: bytes32,
|
|
186
186
|
delay_time: uint64,
|
|
187
187
|
delay_ph: bytes32,
|
|
188
|
-
) ->
|
|
188
|
+
) -> tuple[CoinSpend, Program]:
|
|
189
189
|
inner_puzzle: Program = pool_state_to_inner_puzzle(
|
|
190
190
|
current,
|
|
191
191
|
launcher_coin.name(),
|
|
@@ -251,7 +251,7 @@ def create_absorb_spend(
|
|
|
251
251
|
genesis_challenge: bytes32,
|
|
252
252
|
delay_time: uint64,
|
|
253
253
|
delay_ph: bytes32,
|
|
254
|
-
) ->
|
|
254
|
+
) -> list[CoinSpend]:
|
|
255
255
|
inner_puzzle: Program = pool_state_to_inner_puzzle(
|
|
256
256
|
current_state, launcher_coin.name(), genesis_challenge, delay_time, delay_ph
|
|
257
257
|
)
|
|
@@ -309,7 +309,7 @@ def create_absorb_spend(
|
|
|
309
309
|
|
|
310
310
|
|
|
311
311
|
def get_most_recent_singleton_coin_from_coin_spend(coin_sol: CoinSpend) -> Optional[Coin]:
|
|
312
|
-
additions:
|
|
312
|
+
additions: list[Coin] = compute_additions(coin_sol)
|
|
313
313
|
for coin in additions:
|
|
314
314
|
if coin.amount % 2 == 1:
|
|
315
315
|
return coin
|
|
@@ -335,7 +335,7 @@ def get_pubkey_from_member_inner_puzzle(inner_puzzle: Program) -> G1Element:
|
|
|
335
335
|
|
|
336
336
|
def uncurry_pool_member_inner_puzzle(
|
|
337
337
|
inner_puzzle: Program,
|
|
338
|
-
) ->
|
|
338
|
+
) -> tuple[Program, Program, Program, Program, Program, Program]:
|
|
339
339
|
"""
|
|
340
340
|
Take a puzzle and return `None` if it's not a "pool member" inner puzzle, or
|
|
341
341
|
a triple of `mod_hash, relative_lock_height, pubkey` if it is.
|
|
@@ -352,7 +352,7 @@ def uncurry_pool_member_inner_puzzle(
|
|
|
352
352
|
return inner_f, target_puzzle_hash, p2_singleton_hash, owner_pubkey, pool_reward_prefix, escape_puzzlehash
|
|
353
353
|
|
|
354
354
|
|
|
355
|
-
def uncurry_pool_waitingroom_inner_puzzle(inner_puzzle: Program) ->
|
|
355
|
+
def uncurry_pool_waitingroom_inner_puzzle(inner_puzzle: Program) -> tuple[Program, Program, Program, Program]:
|
|
356
356
|
"""
|
|
357
357
|
Take a puzzle and return `None` if it's not a "pool member" inner puzzle, or
|
|
358
358
|
a triple of `mod_hash, relative_lock_height, pubkey` if it is.
|
|
@@ -362,9 +362,9 @@ def uncurry_pool_waitingroom_inner_puzzle(inner_puzzle: Program) -> Tuple[Progra
|
|
|
362
362
|
r = inner_puzzle.uncurry()
|
|
363
363
|
if r is None:
|
|
364
364
|
raise ValueError("Failed to unpack inner puzzle")
|
|
365
|
-
|
|
365
|
+
_inner_f, args = r
|
|
366
366
|
v = args.as_iter()
|
|
367
|
-
target_puzzle_hash, p2_singleton_hash, owner_pubkey,
|
|
367
|
+
target_puzzle_hash, p2_singleton_hash, owner_pubkey, _genesis_challenge, relative_lock_height = tuple(v)
|
|
368
368
|
return target_puzzle_hash, relative_lock_height, owner_pubkey, p2_singleton_hash
|
|
369
369
|
|
|
370
370
|
|
|
@@ -410,7 +410,7 @@ def solution_to_pool_state(full_spend: CoinSpend) -> Optional[PoolState]:
|
|
|
410
410
|
|
|
411
411
|
# Spend which is not absorb, and is not the launcher
|
|
412
412
|
num_args = len(inner_solution.as_python())
|
|
413
|
-
assert num_args in
|
|
413
|
+
assert num_args in {2, 3}
|
|
414
414
|
|
|
415
415
|
if num_args == 2:
|
|
416
416
|
# pool member
|
|
@@ -445,7 +445,7 @@ def pool_state_to_inner_puzzle(
|
|
|
445
445
|
delay_time,
|
|
446
446
|
delay_ph,
|
|
447
447
|
)
|
|
448
|
-
if pool_state.state in
|
|
448
|
+
if pool_state.state in {LEAVING_POOL.value, SELF_POOLING.value}:
|
|
449
449
|
return escaping_inner_puzzle
|
|
450
450
|
else:
|
|
451
451
|
return create_pooling_inner_puzzle(
|