chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
chia/rpc/harvester_rpc_api.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Any,
|
|
3
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
4
4
|
|
|
5
5
|
from chia.harvester.harvester import Harvester
|
|
6
6
|
from chia.rpc.rpc_server import Endpoint, EndpointResult
|
|
@@ -9,11 +9,16 @@ from chia.util.ws_message import WsRpcMessage, create_payload_dict
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class HarvesterRpcApi:
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from chia.rpc.rpc_server import RpcApiProtocol
|
|
14
|
+
|
|
15
|
+
_protocol_check: ClassVar[RpcApiProtocol] = cast("HarvesterRpcApi", None)
|
|
16
|
+
|
|
12
17
|
def __init__(self, harvester: Harvester):
|
|
13
18
|
self.service = harvester
|
|
14
19
|
self.service_name = "chia_harvester"
|
|
15
20
|
|
|
16
|
-
def get_routes(self) ->
|
|
21
|
+
def get_routes(self) -> dict[str, Endpoint]:
|
|
17
22
|
return {
|
|
18
23
|
"/get_plots": self.get_plots,
|
|
19
24
|
"/refresh_plots": self.refresh_plots,
|
|
@@ -25,7 +30,7 @@ class HarvesterRpcApi:
|
|
|
25
30
|
"/update_harvester_config": self.update_harvester_config,
|
|
26
31
|
}
|
|
27
32
|
|
|
28
|
-
async def _state_changed(self, change: str, change_data: Optional[
|
|
33
|
+
async def _state_changed(self, change: str, change_data: Optional[dict[str, Any]] = None) -> list[WsRpcMessage]:
|
|
29
34
|
if change_data is None:
|
|
30
35
|
change_data = {}
|
|
31
36
|
|
|
@@ -48,7 +53,7 @@ class HarvesterRpcApi:
|
|
|
48
53
|
|
|
49
54
|
return payloads
|
|
50
55
|
|
|
51
|
-
async def get_plots(self, _:
|
|
56
|
+
async def get_plots(self, _: dict[str, Any]) -> EndpointResult:
|
|
52
57
|
plots, failed_to_open, not_found = self.service.get_plots()
|
|
53
58
|
return {
|
|
54
59
|
"plots": plots,
|
|
@@ -56,33 +61,33 @@ class HarvesterRpcApi:
|
|
|
56
61
|
"not_found_filenames": not_found,
|
|
57
62
|
}
|
|
58
63
|
|
|
59
|
-
async def refresh_plots(self, _:
|
|
64
|
+
async def refresh_plots(self, _: dict[str, Any]) -> EndpointResult:
|
|
60
65
|
self.service.plot_manager.trigger_refresh()
|
|
61
66
|
return {}
|
|
62
67
|
|
|
63
|
-
async def delete_plot(self, request:
|
|
68
|
+
async def delete_plot(self, request: dict[str, Any]) -> EndpointResult:
|
|
64
69
|
filename = request["filename"]
|
|
65
70
|
if self.service.delete_plot(filename):
|
|
66
71
|
return {}
|
|
67
72
|
raise ValueError(f"Not able to delete file {filename}")
|
|
68
73
|
|
|
69
|
-
async def add_plot_directory(self, request:
|
|
74
|
+
async def add_plot_directory(self, request: dict[str, Any]) -> EndpointResult:
|
|
70
75
|
directory_name = request["dirname"]
|
|
71
76
|
if await self.service.add_plot_directory(directory_name):
|
|
72
77
|
return {}
|
|
73
78
|
raise ValueError(f"Did not add plot directory {directory_name}")
|
|
74
79
|
|
|
75
|
-
async def get_plot_directories(self, _:
|
|
80
|
+
async def get_plot_directories(self, _: dict[str, Any]) -> EndpointResult:
|
|
76
81
|
plot_dirs = await self.service.get_plot_directories()
|
|
77
82
|
return {"directories": plot_dirs}
|
|
78
83
|
|
|
79
|
-
async def remove_plot_directory(self, request:
|
|
84
|
+
async def remove_plot_directory(self, request: dict[str, Any]) -> EndpointResult:
|
|
80
85
|
directory_name = request["dirname"]
|
|
81
86
|
if await self.service.remove_plot_directory(directory_name):
|
|
82
87
|
return {}
|
|
83
88
|
raise ValueError(f"Did not remove plot directory {directory_name}")
|
|
84
89
|
|
|
85
|
-
async def get_harvester_config(self, _:
|
|
90
|
+
async def get_harvester_config(self, _: dict[str, Any]) -> EndpointResult:
|
|
86
91
|
harvester_config = await self.service.get_harvester_config()
|
|
87
92
|
return {
|
|
88
93
|
"use_gpu_harvesting": harvester_config["use_gpu_harvesting"],
|
|
@@ -95,7 +100,7 @@ class HarvesterRpcApi:
|
|
|
95
100
|
"refresh_parameter_interval_seconds": harvester_config["plots_refresh_parameter"].get("interval_seconds"),
|
|
96
101
|
}
|
|
97
102
|
|
|
98
|
-
async def update_harvester_config(self, request:
|
|
103
|
+
async def update_harvester_config(self, request: dict[str, Any]) -> EndpointResult:
|
|
99
104
|
use_gpu_harvesting: Optional[bool] = None
|
|
100
105
|
gpu_index: Optional[int] = None
|
|
101
106
|
enforce_gpu_index: Optional[bool] = None
|
chia/rpc/harvester_rpc_client.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Any,
|
|
3
|
+
from typing import Any, cast
|
|
4
4
|
|
|
5
5
|
from chia.rpc.rpc_client import RpcClient
|
|
6
6
|
|
|
@@ -14,7 +14,7 @@ class HarvesterRpcClient(RpcClient):
|
|
|
14
14
|
to the full node.
|
|
15
15
|
"""
|
|
16
16
|
|
|
17
|
-
async def get_plots(self) ->
|
|
17
|
+
async def get_plots(self) -> dict[str, Any]:
|
|
18
18
|
return await self.fetch("get_plots", {})
|
|
19
19
|
|
|
20
20
|
async def refresh_plots(self) -> None:
|
|
@@ -32,10 +32,10 @@ class HarvesterRpcClient(RpcClient):
|
|
|
32
32
|
result = cast(bool, response["success"])
|
|
33
33
|
return result
|
|
34
34
|
|
|
35
|
-
async def get_plot_directories(self) ->
|
|
35
|
+
async def get_plot_directories(self) -> list[str]:
|
|
36
36
|
response = await self.fetch("get_plot_directories", {})
|
|
37
37
|
# TODO: casting due to lack of type checked deserialization
|
|
38
|
-
result = cast(
|
|
38
|
+
result = cast(list[str], response["directories"])
|
|
39
39
|
return result
|
|
40
40
|
|
|
41
41
|
async def remove_plot_directory(self, dirname: str) -> bool:
|
|
@@ -44,10 +44,10 @@ class HarvesterRpcClient(RpcClient):
|
|
|
44
44
|
result = cast(bool, response["success"])
|
|
45
45
|
return result
|
|
46
46
|
|
|
47
|
-
async def get_harvester_config(self) ->
|
|
47
|
+
async def get_harvester_config(self) -> dict[str, Any]:
|
|
48
48
|
return await self.fetch("get_harvester_config", {})
|
|
49
49
|
|
|
50
|
-
async def update_harvester_config(self, config:
|
|
50
|
+
async def update_harvester_config(self, config: dict[str, Any]) -> bool:
|
|
51
51
|
response = await self.fetch("update_harvester_config", config)
|
|
52
52
|
# TODO: casting due to lack of type checked deserialization
|
|
53
53
|
result = cast(bool, response["success"])
|
chia/rpc/rpc_client.py
CHANGED
|
@@ -2,11 +2,12 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import json
|
|
5
|
+
from collections.abc import AsyncIterator
|
|
5
6
|
from contextlib import asynccontextmanager
|
|
6
7
|
from dataclasses import dataclass
|
|
7
8
|
from pathlib import Path
|
|
8
9
|
from ssl import SSLContext
|
|
9
|
-
from typing import Any,
|
|
10
|
+
from typing import Any, Optional, TypeVar
|
|
10
11
|
|
|
11
12
|
import aiohttp
|
|
12
13
|
|
|
@@ -16,6 +17,7 @@ from chia.server.ssl_context import private_ssl_ca_paths
|
|
|
16
17
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
17
18
|
from chia.util.byte_types import hexstr_to_bytes
|
|
18
19
|
from chia.util.ints import uint16
|
|
20
|
+
from chia.util.task_referencer import create_referenced_task
|
|
19
21
|
|
|
20
22
|
_T_RpcClient = TypeVar("_T_RpcClient", bound="RpcClient")
|
|
21
23
|
|
|
@@ -24,7 +26,7 @@ _T_RpcClient = TypeVar("_T_RpcClient", bound="RpcClient")
|
|
|
24
26
|
# the possibility to identify these errors in new code from having to review and
|
|
25
27
|
# clean up existing code.
|
|
26
28
|
class ResponseFailureError(ValueError):
|
|
27
|
-
def __init__(self, response:
|
|
29
|
+
def __init__(self, response: dict[str, Any]):
|
|
28
30
|
self.response = response
|
|
29
31
|
super().__init__(f"RPC response failure: {json.dumps(response)}")
|
|
30
32
|
|
|
@@ -48,11 +50,11 @@ class RpcClient:
|
|
|
48
50
|
|
|
49
51
|
@classmethod
|
|
50
52
|
async def create(
|
|
51
|
-
cls:
|
|
53
|
+
cls: type[_T_RpcClient],
|
|
52
54
|
self_hostname: str,
|
|
53
55
|
port: uint16,
|
|
54
56
|
root_path: Optional[Path],
|
|
55
|
-
net_config: Optional[
|
|
57
|
+
net_config: Optional[dict[str, Any]],
|
|
56
58
|
) -> _T_RpcClient:
|
|
57
59
|
if (root_path is not None) != (net_config is not None):
|
|
58
60
|
raise ValueError("Either both or neither of root_path and net_config must be provided")
|
|
@@ -77,7 +79,7 @@ class RpcClient:
|
|
|
77
79
|
self = cls(
|
|
78
80
|
hostname=self_hostname,
|
|
79
81
|
port=port,
|
|
80
|
-
url=f"{scheme}://{self_hostname}:{
|
|
82
|
+
url=f"{scheme}://{self_hostname}:{port!s}/",
|
|
81
83
|
session=aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=timeout)),
|
|
82
84
|
ssl_context=ssl_context,
|
|
83
85
|
)
|
|
@@ -87,11 +89,11 @@ class RpcClient:
|
|
|
87
89
|
@classmethod
|
|
88
90
|
@asynccontextmanager
|
|
89
91
|
async def create_as_context(
|
|
90
|
-
cls:
|
|
92
|
+
cls: type[_T_RpcClient],
|
|
91
93
|
self_hostname: str,
|
|
92
94
|
port: uint16,
|
|
93
95
|
root_path: Optional[Path] = None,
|
|
94
|
-
net_config: Optional[
|
|
96
|
+
net_config: Optional[dict[str, Any]] = None,
|
|
95
97
|
) -> AsyncIterator[_T_RpcClient]:
|
|
96
98
|
self = await cls.create(
|
|
97
99
|
self_hostname=self_hostname,
|
|
@@ -105,7 +107,7 @@ class RpcClient:
|
|
|
105
107
|
self.close()
|
|
106
108
|
await self.await_closed()
|
|
107
109
|
|
|
108
|
-
async def fetch(self, path, request_json) ->
|
|
110
|
+
async def fetch(self, path, request_json) -> dict[str, Any]:
|
|
109
111
|
async with self.session.post(
|
|
110
112
|
self.url + path, json=request_json, ssl=self.ssl_context if self.ssl_context is not None else True
|
|
111
113
|
) as response:
|
|
@@ -115,7 +117,7 @@ class RpcClient:
|
|
|
115
117
|
raise ResponseFailureError(res_json)
|
|
116
118
|
return res_json
|
|
117
119
|
|
|
118
|
-
async def get_connections(self, node_type: Optional[NodeType] = None) ->
|
|
120
|
+
async def get_connections(self, node_type: Optional[NodeType] = None) -> list[dict]:
|
|
119
121
|
request = {}
|
|
120
122
|
if node_type is not None:
|
|
121
123
|
request["node_type"] = node_type.value
|
|
@@ -124,20 +126,38 @@ class RpcClient:
|
|
|
124
126
|
connection["node_id"] = hexstr_to_bytes(connection["node_id"])
|
|
125
127
|
return response["connections"]
|
|
126
128
|
|
|
127
|
-
async def open_connection(self, host: str, port: int) ->
|
|
129
|
+
async def open_connection(self, host: str, port: int) -> dict:
|
|
128
130
|
return await self.fetch("open_connection", {"host": host, "port": int(port)})
|
|
129
131
|
|
|
130
|
-
async def close_connection(self, node_id: bytes32) ->
|
|
132
|
+
async def close_connection(self, node_id: bytes32) -> dict:
|
|
131
133
|
return await self.fetch("close_connection", {"node_id": node_id.hex()})
|
|
132
134
|
|
|
133
|
-
async def stop_node(self) ->
|
|
135
|
+
async def stop_node(self) -> dict:
|
|
134
136
|
return await self.fetch("stop_node", {})
|
|
135
137
|
|
|
136
|
-
async def healthz(self) ->
|
|
138
|
+
async def healthz(self) -> dict:
|
|
137
139
|
return await self.fetch("healthz", {})
|
|
138
140
|
|
|
141
|
+
async def get_network_info(self) -> dict:
|
|
142
|
+
return await self.fetch("get_network_info", {})
|
|
143
|
+
|
|
144
|
+
async def get_routes(self) -> dict:
|
|
145
|
+
return await self.fetch("get_routes", {})
|
|
146
|
+
|
|
147
|
+
async def get_version(self) -> dict:
|
|
148
|
+
return await self.fetch("get_version", {})
|
|
149
|
+
|
|
150
|
+
async def get_log_level(self) -> dict:
|
|
151
|
+
return await self.fetch("get_log_level", {})
|
|
152
|
+
|
|
153
|
+
async def set_log_level(self, level: str) -> dict:
|
|
154
|
+
return await self.fetch("set_log_level", {"level": level})
|
|
155
|
+
|
|
156
|
+
async def reset_log_level(self) -> dict:
|
|
157
|
+
return await self.fetch("reset_log_level", {})
|
|
158
|
+
|
|
139
159
|
def close(self) -> None:
|
|
140
|
-
self.closing_task =
|
|
160
|
+
self.closing_task = create_referenced_task(self.session.close())
|
|
141
161
|
|
|
142
162
|
async def await_closed(self) -> None:
|
|
143
163
|
if self.closing_task is not None:
|
chia/rpc/rpc_server.py
CHANGED
|
@@ -4,39 +4,60 @@ import asyncio
|
|
|
4
4
|
import contextlib
|
|
5
5
|
import json
|
|
6
6
|
import logging
|
|
7
|
+
import sys
|
|
7
8
|
import traceback
|
|
9
|
+
from collections.abc import AsyncIterator, Awaitable
|
|
8
10
|
from dataclasses import dataclass
|
|
9
11
|
from pathlib import Path
|
|
10
12
|
from ssl import SSLContext
|
|
11
|
-
from
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
from types import MethodType
|
|
14
|
+
from typing import Any, Callable, ClassVar, Generic, Optional, TypeVar
|
|
15
|
+
|
|
16
|
+
from aiohttp import (
|
|
17
|
+
ClientConnectorError,
|
|
18
|
+
ClientSession,
|
|
19
|
+
ClientWebSocketResponse,
|
|
20
|
+
WSMsgType,
|
|
21
|
+
web,
|
|
22
|
+
)
|
|
14
23
|
from typing_extensions import Protocol, final
|
|
15
24
|
|
|
16
25
|
from chia import __version__
|
|
17
26
|
from chia.rpc.util import wrap_http_handler
|
|
18
27
|
from chia.server.outbound_message import NodeType
|
|
19
|
-
from chia.server.server import
|
|
28
|
+
from chia.server.server import (
|
|
29
|
+
ChiaServer,
|
|
30
|
+
ssl_context_for_client,
|
|
31
|
+
ssl_context_for_server,
|
|
32
|
+
)
|
|
20
33
|
from chia.server.ws_connection import WSChiaConnection
|
|
21
34
|
from chia.types.peer_info import PeerInfo
|
|
22
35
|
from chia.util.byte_types import hexstr_to_bytes
|
|
36
|
+
from chia.util.chia_logging import default_log_level, set_log_level
|
|
23
37
|
from chia.util.config import str2bool
|
|
24
38
|
from chia.util.ints import uint16
|
|
25
39
|
from chia.util.json_util import dict_to_json_str
|
|
26
40
|
from chia.util.network import WebServer, resolve
|
|
27
|
-
from chia.util.
|
|
41
|
+
from chia.util.task_referencer import create_referenced_task
|
|
42
|
+
from chia.util.ws_message import (
|
|
43
|
+
WsRpcMessage,
|
|
44
|
+
create_payload,
|
|
45
|
+
create_payload_dict,
|
|
46
|
+
format_response,
|
|
47
|
+
pong,
|
|
48
|
+
)
|
|
28
49
|
|
|
29
50
|
log = logging.getLogger(__name__)
|
|
30
51
|
max_message_size = 50 * 1024 * 1024 # 50MB
|
|
31
52
|
|
|
32
53
|
|
|
33
|
-
EndpointResult =
|
|
34
|
-
Endpoint = Callable[[
|
|
54
|
+
EndpointResult = dict[str, Any]
|
|
55
|
+
Endpoint = Callable[[dict[str, object]], Awaitable[EndpointResult]]
|
|
35
56
|
_T_RpcApiProtocol = TypeVar("_T_RpcApiProtocol", bound="RpcApiProtocol")
|
|
36
57
|
|
|
37
58
|
|
|
38
59
|
class StateChangedProtocol(Protocol):
|
|
39
|
-
def __call__(self, change: str, change_data: Optional[
|
|
60
|
+
def __call__(self, change: str, change_data: Optional[dict[str, Any]]) -> None: ...
|
|
40
61
|
|
|
41
62
|
|
|
42
63
|
class RpcServiceProtocol(Protocol):
|
|
@@ -54,7 +75,7 @@ class RpcServiceProtocol(Protocol):
|
|
|
54
75
|
# Optional[ChiaServer]
|
|
55
76
|
...
|
|
56
77
|
|
|
57
|
-
def get_connections(self, request_node_type: Optional[NodeType]) ->
|
|
78
|
+
def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
|
|
58
79
|
"""Report the active connections for the service.
|
|
59
80
|
|
|
60
81
|
A default implementation is available and can be called as
|
|
@@ -90,16 +111,16 @@ class RpcApiProtocol(Protocol):
|
|
|
90
111
|
# using a read-only property per https://github.com/python/mypy/issues/12990
|
|
91
112
|
...
|
|
92
113
|
|
|
93
|
-
def get_routes(self) ->
|
|
114
|
+
def get_routes(self) -> dict[str, Endpoint]:
|
|
94
115
|
"""Return the mapping of endpoints to handler callables."""
|
|
95
116
|
...
|
|
96
117
|
|
|
97
|
-
async def _state_changed(self, change: str, change_data: Optional[
|
|
118
|
+
async def _state_changed(self, change: str, change_data: Optional[dict[str, Any]]) -> list[WsRpcMessage]:
|
|
98
119
|
"""Notify the state change system of a changed state."""
|
|
99
120
|
...
|
|
100
121
|
|
|
101
122
|
|
|
102
|
-
def default_get_connections(server: ChiaServer, request_node_type: Optional[NodeType]) ->
|
|
123
|
+
def default_get_connections(server: ChiaServer, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
|
|
103
124
|
connections = server.get_connections(request_node_type)
|
|
104
125
|
con_info = [
|
|
105
126
|
{
|
|
@@ -131,7 +152,8 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
|
|
|
131
152
|
service_name: str
|
|
132
153
|
ssl_context: SSLContext
|
|
133
154
|
ssl_client_context: SSLContext
|
|
134
|
-
net_config:
|
|
155
|
+
net_config: dict[str, Any]
|
|
156
|
+
service_config: dict[str, Any]
|
|
135
157
|
webserver: Optional[WebServer] = None
|
|
136
158
|
daemon_heartbeat: int = 300
|
|
137
159
|
daemon_connection_task: Optional[asyncio.Task[None]] = None
|
|
@@ -147,7 +169,8 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
|
|
|
147
169
|
service_name: str,
|
|
148
170
|
stop_cb: Callable[[], None],
|
|
149
171
|
root_path: Path,
|
|
150
|
-
net_config:
|
|
172
|
+
net_config: dict[str, Any],
|
|
173
|
+
service_config: dict[str, Any],
|
|
151
174
|
prefer_ipv6: bool,
|
|
152
175
|
) -> RpcServer[_T_RpcApiProtocol]:
|
|
153
176
|
crt_path = root_path / net_config["daemon_ssl"]["private_crt"]
|
|
@@ -164,6 +187,7 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
|
|
|
164
187
|
ssl_context,
|
|
165
188
|
ssl_client_context,
|
|
166
189
|
net_config,
|
|
190
|
+
service_config=service_config,
|
|
167
191
|
daemon_heartbeat=daemon_heartbeat,
|
|
168
192
|
prefer_ipv6=prefer_ipv6,
|
|
169
193
|
)
|
|
@@ -196,12 +220,12 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
|
|
|
196
220
|
await self.daemon_connection_task
|
|
197
221
|
self.daemon_connection_task = None
|
|
198
222
|
|
|
199
|
-
async def _state_changed(self, change: str, change_data: Optional[
|
|
223
|
+
async def _state_changed(self, change: str, change_data: Optional[dict[str, Any]]) -> None:
|
|
200
224
|
if self.websocket is None or self.websocket.closed:
|
|
201
225
|
return None
|
|
202
|
-
payloads:
|
|
226
|
+
payloads: list[WsRpcMessage] = await self.rpc_api._state_changed(change, change_data)
|
|
203
227
|
|
|
204
|
-
if change
|
|
228
|
+
if change in {"add_connection", "close_connection", "peer_changed_peak"}:
|
|
205
229
|
data = await self.get_connections({})
|
|
206
230
|
if data is not None:
|
|
207
231
|
payload = create_payload_dict(
|
|
@@ -222,10 +246,10 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
|
|
|
222
246
|
tb = traceback.format_exc()
|
|
223
247
|
log.warning(f"Sending data failed. Exception {tb}.")
|
|
224
248
|
|
|
225
|
-
def state_changed(self, change: str, change_data: Optional[
|
|
249
|
+
def state_changed(self, change: str, change_data: Optional[dict[str, Any]] = None) -> None:
|
|
226
250
|
if self.websocket is None or self.websocket.closed:
|
|
227
251
|
return None
|
|
228
|
-
|
|
252
|
+
create_referenced_task(self._state_changed(change, change_data), known_unreferenced=True)
|
|
229
253
|
|
|
230
254
|
@property
|
|
231
255
|
def listen_port(self) -> uint16:
|
|
@@ -233,42 +257,39 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
|
|
|
233
257
|
raise RuntimeError("RpcServer is not started")
|
|
234
258
|
return self.webserver.listen_port
|
|
235
259
|
|
|
236
|
-
def _get_routes(self) ->
|
|
260
|
+
def _get_routes(self) -> dict[str, Endpoint]:
|
|
237
261
|
return {
|
|
238
262
|
**self.rpc_api.get_routes(),
|
|
239
|
-
|
|
240
|
-
"/get_connections": self.get_connections,
|
|
241
|
-
"/open_connection": self.open_connection,
|
|
242
|
-
"/close_connection": self.close_connection,
|
|
243
|
-
"/stop_node": self.stop_node,
|
|
244
|
-
"/get_routes": self.get_routes,
|
|
245
|
-
"/get_version": self.get_version,
|
|
246
|
-
"/healthz": self.healthz,
|
|
263
|
+
**{path: MethodType(handler, self) for path, handler in self._routes.items()},
|
|
247
264
|
}
|
|
248
265
|
|
|
249
|
-
async def get_routes(self, request:
|
|
266
|
+
async def get_routes(self, request: dict[str, Any]) -> EndpointResult:
|
|
250
267
|
return {
|
|
251
268
|
"success": True,
|
|
252
269
|
"routes": list(self._get_routes().keys()),
|
|
253
270
|
}
|
|
254
271
|
|
|
255
|
-
async def get_network_info(self, _:
|
|
272
|
+
async def get_network_info(self, _: dict[str, Any]) -> EndpointResult:
|
|
256
273
|
network_name = self.net_config["selected_network"]
|
|
257
274
|
address_prefix = self.net_config["network_overrides"]["config"][network_name]["address_prefix"]
|
|
258
275
|
genesis_challenge = self.net_config["network_overrides"]["constants"][network_name]["GENESIS_CHALLENGE"]
|
|
259
|
-
return {
|
|
276
|
+
return {
|
|
277
|
+
"network_name": network_name,
|
|
278
|
+
"network_prefix": address_prefix,
|
|
279
|
+
"genesis_challenge": genesis_challenge,
|
|
280
|
+
}
|
|
260
281
|
|
|
261
|
-
async def get_connections(self, request:
|
|
282
|
+
async def get_connections(self, request: dict[str, Any]) -> EndpointResult:
|
|
262
283
|
request_node_type: Optional[NodeType] = None
|
|
263
284
|
if "node_type" in request:
|
|
264
285
|
request_node_type = NodeType(request["node_type"])
|
|
265
286
|
if self.rpc_api.service.server is None:
|
|
266
287
|
raise ValueError("Global connections is not set")
|
|
267
|
-
con_info:
|
|
288
|
+
con_info: list[dict[str, Any]]
|
|
268
289
|
con_info = self.rpc_api.service.get_connections(request_node_type=request_node_type)
|
|
269
290
|
return {"connections": con_info}
|
|
270
291
|
|
|
271
|
-
async def open_connection(self, request:
|
|
292
|
+
async def open_connection(self, request: dict[str, Any]) -> EndpointResult:
|
|
272
293
|
host = request["host"]
|
|
273
294
|
port = request["port"]
|
|
274
295
|
target_node: PeerInfo = PeerInfo(await resolve(host, prefer_ipv6=self.prefer_ipv6), uint16(int(port)))
|
|
@@ -279,7 +300,7 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
|
|
|
279
300
|
return {"success": False, "error": f"could not connect to {target_node}"}
|
|
280
301
|
return {"success": True}
|
|
281
302
|
|
|
282
|
-
async def close_connection(self, request:
|
|
303
|
+
async def close_connection(self, request: dict[str, Any]) -> EndpointResult:
|
|
283
304
|
node_id = hexstr_to_bytes(request["node_id"])
|
|
284
305
|
if self.rpc_api.service.server is None:
|
|
285
306
|
raise web.HTTPInternalServerError()
|
|
@@ -290,7 +311,7 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
|
|
|
290
311
|
await connection.close()
|
|
291
312
|
return {}
|
|
292
313
|
|
|
293
|
-
async def stop_node(self, request:
|
|
314
|
+
async def stop_node(self, request: dict[str, Any]) -> EndpointResult:
|
|
294
315
|
"""
|
|
295
316
|
Shuts down the node.
|
|
296
317
|
"""
|
|
@@ -298,17 +319,49 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
|
|
|
298
319
|
self.stop_cb()
|
|
299
320
|
return {}
|
|
300
321
|
|
|
301
|
-
async def healthz(self, request:
|
|
322
|
+
async def healthz(self, request: dict[str, Any]) -> EndpointResult:
|
|
302
323
|
return {
|
|
303
324
|
"success": True,
|
|
304
325
|
}
|
|
305
326
|
|
|
306
|
-
async def get_version(self, request:
|
|
327
|
+
async def get_version(self, request: dict[str, Any]) -> EndpointResult:
|
|
307
328
|
return {
|
|
308
329
|
"version": __version__,
|
|
309
330
|
}
|
|
310
331
|
|
|
311
|
-
async def
|
|
332
|
+
async def get_log_level(self, request: dict[str, Any]) -> EndpointResult:
|
|
333
|
+
logger = logging.getLogger()
|
|
334
|
+
level_number = logger.level
|
|
335
|
+
level_name = logging.getLevelName(level_number)
|
|
336
|
+
|
|
337
|
+
if sys.version_info >= (3, 11):
|
|
338
|
+
map = logging.getLevelNamesMapping()
|
|
339
|
+
else:
|
|
340
|
+
map = logging._nameToLevel
|
|
341
|
+
|
|
342
|
+
return {
|
|
343
|
+
"success": True,
|
|
344
|
+
"level": level_name,
|
|
345
|
+
"available_levels": list(map),
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
async def reset_log_level(self, request: dict[str, Any]) -> EndpointResult:
|
|
349
|
+
level_name = self.service_config.get("log_level", default_log_level)
|
|
350
|
+
|
|
351
|
+
return await self.set_log_level(request={"level": level_name})
|
|
352
|
+
|
|
353
|
+
async def set_log_level(self, request: dict[str, Any]) -> EndpointResult:
|
|
354
|
+
error_strings = set_log_level(log_level=request["level"], service_name=self.service_name)
|
|
355
|
+
status = await self.get_log_level(request={})
|
|
356
|
+
|
|
357
|
+
status["success"] &= len(error_strings) == 0
|
|
358
|
+
|
|
359
|
+
return {
|
|
360
|
+
**status,
|
|
361
|
+
"errors": error_strings,
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
async def ws_api(self, message: WsRpcMessage) -> Optional[dict[str, object]]:
|
|
312
365
|
"""
|
|
313
366
|
This function gets called when new message is received via websocket.
|
|
314
367
|
"""
|
|
@@ -317,7 +370,7 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
|
|
|
317
370
|
if message["ack"]:
|
|
318
371
|
return None
|
|
319
372
|
|
|
320
|
-
data:
|
|
373
|
+
data: dict[str, object] = {}
|
|
321
374
|
if "data" in message:
|
|
322
375
|
data = message["data"]
|
|
323
376
|
if command == "ping":
|
|
@@ -407,7 +460,21 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
|
|
|
407
460
|
self.client_session = None
|
|
408
461
|
await asyncio.sleep(2)
|
|
409
462
|
|
|
410
|
-
self.daemon_connection_task =
|
|
463
|
+
self.daemon_connection_task = create_referenced_task(inner())
|
|
464
|
+
|
|
465
|
+
_routes: ClassVar[dict[str, Callable[..., Awaitable[object]]]] = {
|
|
466
|
+
"/get_network_info": get_network_info,
|
|
467
|
+
"/get_connections": get_connections,
|
|
468
|
+
"/open_connection": open_connection,
|
|
469
|
+
"/close_connection": close_connection,
|
|
470
|
+
"/stop_node": stop_node,
|
|
471
|
+
"/get_routes": get_routes,
|
|
472
|
+
"/get_version": get_version,
|
|
473
|
+
"/healthz": healthz,
|
|
474
|
+
"/get_log_level": get_log_level,
|
|
475
|
+
"/set_log_level": set_log_level,
|
|
476
|
+
"/reset_log_level": reset_log_level,
|
|
477
|
+
}
|
|
411
478
|
|
|
412
479
|
|
|
413
480
|
async def start_rpc_server(
|
|
@@ -417,7 +484,8 @@ async def start_rpc_server(
|
|
|
417
484
|
rpc_port: uint16,
|
|
418
485
|
stop_cb: Callable[[], None],
|
|
419
486
|
root_path: Path,
|
|
420
|
-
net_config:
|
|
487
|
+
net_config: dict[str, object],
|
|
488
|
+
service_config: dict[str, object],
|
|
421
489
|
connect_to_daemon: bool = True,
|
|
422
490
|
max_request_body_size: Optional[int] = None,
|
|
423
491
|
) -> RpcServer[_T_RpcApiProtocol]:
|
|
@@ -432,7 +500,13 @@ async def start_rpc_server(
|
|
|
432
500
|
prefer_ipv6 = str2bool(str(net_config.get("prefer_ipv6", False)))
|
|
433
501
|
|
|
434
502
|
rpc_server = RpcServer.create(
|
|
435
|
-
rpc_api,
|
|
503
|
+
rpc_api,
|
|
504
|
+
rpc_api.service_name,
|
|
505
|
+
stop_cb,
|
|
506
|
+
root_path,
|
|
507
|
+
net_config,
|
|
508
|
+
service_config=service_config,
|
|
509
|
+
prefer_ipv6=prefer_ipv6,
|
|
436
510
|
)
|
|
437
511
|
rpc_server.rpc_api.service._set_state_changed_callback(rpc_server.state_changed)
|
|
438
512
|
await rpc_server.start(self_hostname, rpc_port, max_request_body_size)
|
chia/rpc/timelord_rpc_api.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Any,
|
|
3
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
4
4
|
|
|
5
5
|
from chia.rpc.rpc_server import Endpoint
|
|
6
6
|
from chia.timelord.timelord import Timelord
|
|
@@ -8,20 +8,25 @@ from chia.util.ws_message import WsRpcMessage, create_payload_dict
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class TimelordRpcApi:
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from chia.rpc.rpc_server import RpcApiProtocol
|
|
13
|
+
|
|
14
|
+
_protocol_check: ClassVar[RpcApiProtocol] = cast("TimelordRpcApi", None)
|
|
15
|
+
|
|
11
16
|
def __init__(self, timelord: Timelord):
|
|
12
17
|
self.service = timelord
|
|
13
18
|
self.service_name = "chia_timelord"
|
|
14
19
|
|
|
15
|
-
def get_routes(self) ->
|
|
20
|
+
def get_routes(self) -> dict[str, Endpoint]:
|
|
16
21
|
return {}
|
|
17
22
|
|
|
18
|
-
async def _state_changed(self, change: str, change_data: Optional[
|
|
23
|
+
async def _state_changed(self, change: str, change_data: Optional[dict[str, Any]] = None) -> list[WsRpcMessage]:
|
|
19
24
|
payloads = []
|
|
20
25
|
|
|
21
26
|
if change_data is None:
|
|
22
27
|
change_data = {}
|
|
23
28
|
|
|
24
|
-
if change in
|
|
29
|
+
if change in {"finished_pot", "new_compact_proof", "skipping_peak", "new_peak"}:
|
|
25
30
|
payloads.append(create_payload_dict(change, change_data, self.service_name, "metrics"))
|
|
26
31
|
|
|
27
32
|
return payloads
|