chia-blockchain 2.5.7rc3__py3-none-any.whl → 2.5.8rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/__init__.py +8 -4
- chia/_tests/blockchain/blockchain_test_utils.py +6 -8
- chia/_tests/blockchain/test_augmented_chain.py +4 -4
- chia/_tests/blockchain/test_blockchain.py +165 -190
- chia/_tests/blockchain/test_build_chains.py +2 -4
- chia/_tests/blockchain/test_get_block_generator.py +2 -3
- chia/_tests/clvm/coin_store.py +4 -7
- chia/_tests/clvm/test_clvm_step.py +4 -4
- chia/_tests/clvm/test_puzzle_compression.py +2 -1
- chia/_tests/clvm/test_puzzle_drivers.py +2 -2
- chia/_tests/clvm/test_singletons.py +2 -4
- chia/_tests/clvm/test_spend_sim.py +2 -2
- chia/_tests/cmds/cmd_test_utils.py +27 -45
- chia/_tests/cmds/test_cmd_framework.py +6 -6
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_show.py +4 -4
- chia/_tests/cmds/test_tx_config_args.py +1 -2
- chia/_tests/cmds/testing_classes.py +4 -5
- chia/_tests/cmds/wallet/test_did.py +24 -27
- chia/_tests/cmds/wallet/test_nft.py +12 -10
- chia/_tests/cmds/wallet/test_vcs.py +11 -12
- chia/_tests/cmds/wallet/test_wallet.py +134 -89
- chia/_tests/conftest.py +59 -30
- chia/_tests/connection_utils.py +2 -2
- chia/_tests/core/cmds/test_beta.py +4 -4
- chia/_tests/core/cmds/test_keys.py +2 -3
- chia/_tests/core/cmds/test_wallet.py +15 -15
- chia/_tests/core/consensus/test_pot_iterations.py +19 -73
- chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
- chia/_tests/core/daemon/test_daemon.py +11 -11
- chia/_tests/core/data_layer/conftest.py +2 -2
- chia/_tests/core/data_layer/test_data_rpc.py +28 -14
- chia/_tests/core/data_layer/test_data_store.py +10 -10
- chia/_tests/core/data_layer/util.py +11 -11
- chia/_tests/core/farmer/test_farmer_api.py +2 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
- chia/_tests/core/full_node/stores/test_block_store.py +5 -4
- chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
- chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +3 -4
- chia/_tests/core/full_node/test_conditions.py +21 -23
- chia/_tests/core/full_node/test_full_node.py +225 -62
- chia/_tests/core/full_node/test_hint_management.py +2 -4
- chia/_tests/core/full_node/test_performance.py +0 -1
- chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
- chia/_tests/core/full_node/test_transactions.py +1 -2
- chia/_tests/core/full_node/test_tx_processing_queue.py +109 -25
- chia/_tests/core/mempool/test_mempool.py +29 -37
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
- chia/_tests/core/mempool/test_mempool_manager.py +963 -839
- chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
- chia/_tests/core/server/serve.py +7 -7
- chia/_tests/core/server/test_dos.py +1 -2
- chia/_tests/core/server/test_event_loop.py +12 -4
- chia/_tests/core/server/test_loop.py +7 -8
- chia/_tests/core/server/test_rate_limits.py +9 -8
- chia/_tests/core/server/test_server.py +61 -1
- chia/_tests/core/services/test_services.py +2 -2
- chia/_tests/core/ssl/test_ssl.py +2 -2
- chia/_tests/core/test_cost_calculation.py +2 -6
- chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
- chia/_tests/core/test_filter.py +0 -1
- chia/_tests/core/test_full_node_rpc.py +2 -2
- chia/_tests/core/test_merkle_set.py +1 -2
- chia/_tests/core/test_seeder.py +4 -4
- chia/_tests/core/util/test_config.py +4 -4
- chia/_tests/core/util/test_jsonify.py +2 -2
- chia/_tests/core/util/test_keychain.py +3 -3
- chia/_tests/core/util/test_lockfile.py +2 -1
- chia/_tests/core/util/test_log_exceptions.py +1 -2
- chia/_tests/core/util/test_streamable.py +17 -17
- chia/_tests/db/test_db_wrapper.py +3 -2
- chia/_tests/environments/wallet.py +14 -14
- chia/_tests/ether.py +4 -3
- chia/_tests/farmer_harvester/test_farmer.py +41 -24
- chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
- chia/_tests/harvester/test_harvester_api.py +11 -4
- chia/_tests/plot_sync/test_plot_sync.py +13 -11
- chia/_tests/plot_sync/test_receiver.py +11 -10
- chia/_tests/plot_sync/test_sync_simulated.py +2 -2
- chia/_tests/plot_sync/util.py +1 -2
- chia/_tests/plotting/test_plot_manager.py +7 -6
- chia/_tests/plotting/test_prover.py +30 -38
- chia/_tests/pools/test_pool_cmdline.py +4 -6
- chia/_tests/pools/test_pool_rpc.py +203 -61
- chia/_tests/pools/test_pool_wallet.py +3 -3
- chia/_tests/pools/test_wallet_pool_store.py +1 -4
- chia/_tests/process_junit.py +2 -2
- chia/_tests/rpc/test_rpc_client.py +4 -4
- chia/_tests/rpc/test_rpc_server.py +3 -3
- chia/_tests/simulation/test_simulation.py +12 -25
- chia/_tests/solver/test_solver_service.py +13 -4
- chia/_tests/testconfig.py +2 -2
- chia/_tests/timelord/test_new_peak.py +22 -11
- chia/_tests/tools/test_run_block.py +0 -2
- chia/_tests/tools/test_virtual_project.py +2 -1
- chia/_tests/util/benchmarks.py +1 -0
- chia/_tests/util/blockchain.py +38 -36
- chia/_tests/util/blockchain_mock.py +11 -11
- chia/_tests/util/build_network_protocol_files.py +2 -1
- chia/_tests/util/coin_store.py +2 -1
- chia/_tests/util/config.py +1 -1
- chia/_tests/util/db_connection.py +2 -3
- chia/_tests/util/full_sync.py +9 -11
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/get_name_puzzle_conditions.py +2 -0
- chia/_tests/util/misc.py +24 -24
- chia/_tests/util/network_protocol_data.py +20 -3
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +292 -3
- chia/_tests/util/setup_nodes.py +62 -47
- chia/_tests/util/spend_sim.py +57 -57
- chia/_tests/util/test_async_pool.py +2 -3
- chia/_tests/util/test_chia_version.py +1 -3
- chia/_tests/util/test_config.py +3 -3
- chia/_tests/util/test_full_block_utils.py +6 -3
- chia/_tests/util/test_limited_semaphore.py +1 -2
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_network.py +1 -2
- chia/_tests/util/test_priority_mutex.py +3 -3
- chia/_tests/util/test_recursive_replace.py +5 -6
- chia/_tests/util/test_replace_str_to_bytes.py +8 -10
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/time_out_assert.py +2 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
- chia/_tests/wallet/conftest.py +6 -6
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
- chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
- chia/_tests/wallet/did_wallet/test_did.py +16 -6
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
- chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
- chia/_tests/wallet/sync/test_wallet_sync.py +43 -47
- chia/_tests/wallet/test_clvm_streamable.py +2 -3
- chia/_tests/wallet/test_coin_management.py +2 -2
- chia/_tests/wallet/test_conditions.py +45 -51
- chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
- chia/_tests/wallet/test_new_wallet_protocol.py +4 -6
- chia/_tests/wallet/test_notifications.py +14 -14
- chia/_tests/wallet/test_signer_protocol.py +5 -5
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
- chia/_tests/wallet/test_transaction_store.py +20 -20
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +380 -228
- chia/_tests/wallet/test_wallet_action_scope.py +4 -4
- chia/_tests/wallet/test_wallet_blockchain.py +12 -12
- chia/_tests/wallet/test_wallet_coin_store.py +3 -4
- chia/_tests/wallet/test_wallet_node.py +14 -14
- chia/_tests/wallet/test_wallet_test_framework.py +2 -1
- chia/_tests/wallet/test_wallet_utils.py +2 -3
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
- chia/_tests/wallet/wallet_block_tools.py +12 -11
- chia/_tests/weight_proof/config.py +1 -0
- chia/_tests/weight_proof/test_weight_proof.py +5 -4
- chia/apis/__init__.py +21 -0
- chia/apis/farmer_stub.py +102 -0
- chia/apis/full_node_stub.py +372 -0
- chia/apis/harvester_stub.py +57 -0
- chia/apis/introducer_stub.py +35 -0
- chia/apis/solver_stub.py +30 -0
- chia/apis/stub_protocol_registry.py +21 -0
- chia/apis/timelord_stub.py +39 -0
- chia/apis/wallet_stub.py +161 -0
- chia/cmds/beta.py +3 -4
- chia/cmds/beta_funcs.py +4 -3
- chia/cmds/check_wallet_db.py +4 -4
- chia/cmds/chia.py +1 -2
- chia/cmds/cmd_classes.py +11 -13
- chia/cmds/cmd_helpers.py +11 -11
- chia/cmds/cmds_util.py +15 -15
- chia/cmds/coin_funcs.py +6 -7
- chia/cmds/coins.py +2 -3
- chia/cmds/configure.py +1 -2
- chia/cmds/data.py +42 -42
- chia/cmds/data_funcs.py +81 -81
- chia/cmds/db.py +4 -5
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev/data.py +4 -4
- chia/cmds/dev/gh.py +5 -5
- chia/cmds/dev/installers.py +2 -3
- chia/cmds/dev/mempool.py +3 -4
- chia/cmds/dev/mempool_funcs.py +4 -4
- chia/cmds/dev/sim.py +8 -8
- chia/cmds/dump_keyring.py +3 -3
- chia/cmds/farm.py +6 -8
- chia/cmds/farm_funcs.py +25 -24
- chia/cmds/init_funcs.py +4 -4
- chia/cmds/keys.py +16 -18
- chia/cmds/keys_funcs.py +36 -36
- chia/cmds/netspace.py +1 -3
- chia/cmds/netspace_funcs.py +1 -2
- chia/cmds/options.py +3 -2
- chia/cmds/param_types.py +17 -16
- chia/cmds/passphrase.py +6 -7
- chia/cmds/passphrase_funcs.py +11 -13
- chia/cmds/peer.py +1 -3
- chia/cmds/peer_funcs.py +3 -3
- chia/cmds/plotnft.py +6 -7
- chia/cmds/plotnft_funcs.py +37 -26
- chia/cmds/rpc.py +3 -3
- chia/cmds/show.py +3 -5
- chia/cmds/show_funcs.py +9 -9
- chia/cmds/sim_funcs.py +25 -26
- chia/cmds/solver.py +1 -3
- chia/cmds/solver_funcs.py +1 -2
- chia/cmds/start_funcs.py +2 -2
- chia/cmds/wallet.py +76 -81
- chia/cmds/wallet_funcs.py +206 -177
- chia/consensus/augmented_chain.py +6 -6
- chia/consensus/block_body_validation.py +19 -15
- chia/consensus/block_creation.py +25 -21
- chia/consensus/block_header_validation.py +27 -13
- chia/consensus/block_height_map.py +3 -6
- chia/consensus/block_height_map_protocol.py +2 -2
- chia/consensus/block_record.py +2 -4
- chia/consensus/blockchain.py +58 -40
- chia/consensus/blockchain_interface.py +7 -7
- chia/consensus/coin_store_protocol.py +5 -6
- chia/consensus/condition_tools.py +4 -4
- chia/consensus/cost_calculator.py +2 -3
- chia/consensus/default_constants.py +16 -13
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +3 -5
- chia/consensus/find_fork_point.py +2 -4
- chia/consensus/full_block_to_block_record.py +11 -13
- chia/consensus/generator_tools.py +2 -3
- chia/consensus/get_block_challenge.py +42 -26
- chia/consensus/get_block_generator.py +2 -3
- chia/consensus/make_sub_epoch_summary.py +8 -7
- chia/consensus/multiprocess_validation.py +31 -20
- chia/consensus/pos_quality.py +6 -23
- chia/consensus/pot_iterations.py +17 -44
- chia/consensus/signage_point.py +4 -5
- chia/consensus/vdf_info_computation.py +2 -4
- chia/daemon/client.py +8 -8
- chia/daemon/keychain_proxy.py +31 -37
- chia/daemon/server.py +32 -33
- chia/daemon/windows_signal.py +4 -3
- chia/data_layer/data_layer.py +86 -77
- chia/data_layer/data_layer_rpc_api.py +9 -9
- chia/data_layer/data_layer_rpc_client.py +13 -15
- chia/data_layer/data_layer_server.py +3 -3
- chia/data_layer/data_layer_util.py +14 -14
- chia/data_layer/data_layer_wallet.py +94 -101
- chia/data_layer/data_store.py +50 -50
- chia/data_layer/dl_wallet_store.py +9 -12
- chia/data_layer/download_data.py +8 -9
- chia/data_layer/s3_plugin_service.py +5 -9
- chia/data_layer/start_data_layer.py +5 -5
- chia/farmer/farmer.py +31 -31
- chia/farmer/farmer_api.py +45 -33
- chia/farmer/farmer_rpc_api.py +5 -4
- chia/farmer/farmer_rpc_client.py +6 -6
- chia/farmer/start_farmer.py +12 -7
- chia/full_node/block_store.py +13 -16
- chia/full_node/check_fork_next_block.py +1 -2
- chia/full_node/coin_store.py +15 -16
- chia/full_node/eligible_coin_spends.py +3 -3
- chia/full_node/fee_estimate_store.py +2 -3
- chia/full_node/fee_tracker.py +1 -2
- chia/full_node/full_block_utils.py +4 -4
- chia/full_node/full_node.py +238 -224
- chia/full_node/full_node_api.py +193 -150
- chia/full_node/full_node_rpc_api.py +53 -31
- chia/full_node/full_node_rpc_client.py +18 -19
- chia/full_node/full_node_store.py +45 -43
- chia/full_node/hint_management.py +2 -2
- chia/full_node/mempool.py +17 -19
- chia/full_node/mempool_manager.py +89 -42
- chia/full_node/pending_tx_cache.py +2 -3
- chia/full_node/start_full_node.py +5 -5
- chia/full_node/sync_store.py +3 -4
- chia/full_node/tx_processing_queue.py +34 -13
- chia/full_node/weight_proof.py +61 -48
- chia/harvester/harvester.py +25 -24
- chia/harvester/harvester_api.py +61 -38
- chia/harvester/harvester_rpc_api.py +10 -10
- chia/harvester/start_harvester.py +4 -4
- chia/introducer/introducer.py +3 -3
- chia/introducer/introducer_api.py +6 -4
- chia/introducer/start_introducer.py +4 -4
- chia/legacy/keyring.py +3 -3
- chia/plot_sync/delta.py +1 -2
- chia/plot_sync/receiver.py +20 -17
- chia/plot_sync/sender.py +15 -10
- chia/plotters/bladebit.py +7 -7
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +4 -4
- chia/plotters/plotters.py +4 -4
- chia/plotters/plotters_util.py +3 -3
- chia/plotting/cache.py +20 -14
- chia/plotting/check_plots.py +26 -35
- chia/plotting/create_plots.py +22 -23
- chia/plotting/manager.py +21 -14
- chia/plotting/prover.py +59 -42
- chia/plotting/util.py +16 -16
- chia/pools/pool_config.py +2 -1
- chia/pools/pool_puzzles.py +11 -12
- chia/pools/pool_wallet.py +34 -57
- chia/pools/pool_wallet_info.py +39 -10
- chia/protocols/farmer_protocol.py +8 -9
- chia/protocols/fee_estimate.py +3 -4
- chia/protocols/full_node_protocol.py +3 -4
- chia/protocols/harvester_protocol.py +27 -15
- chia/protocols/outbound_message.py +3 -3
- chia/protocols/pool_protocol.py +8 -9
- chia/protocols/shared_protocol.py +1 -2
- chia/protocols/solver_protocol.py +9 -2
- chia/protocols/timelord_protocol.py +4 -7
- chia/protocols/wallet_protocol.py +11 -12
- chia/rpc/rpc_client.py +9 -9
- chia/rpc/rpc_server.py +17 -17
- chia/rpc/util.py +2 -2
- chia/seeder/crawler.py +8 -8
- chia/seeder/crawler_api.py +21 -27
- chia/seeder/crawler_rpc_api.py +2 -2
- chia/seeder/dns_server.py +21 -21
- chia/seeder/start_crawler.py +4 -4
- chia/server/address_manager.py +15 -16
- chia/server/api_protocol.py +11 -11
- chia/server/chia_policy.py +46 -26
- chia/server/introducer_peers.py +2 -3
- chia/server/node_discovery.py +19 -19
- chia/server/rate_limit_numbers.py +4 -5
- chia/server/rate_limits.py +4 -4
- chia/server/resolve_peer_info.py +4 -4
- chia/server/server.py +49 -52
- chia/server/signal_handlers.py +6 -6
- chia/server/start_service.py +17 -17
- chia/server/upnp.py +4 -6
- chia/server/ws_connection.py +52 -37
- chia/simulator/add_blocks_in_batches.py +1 -3
- chia/simulator/block_tools.py +312 -200
- chia/simulator/full_node_simulator.py +56 -35
- chia/simulator/keyring.py +2 -3
- chia/simulator/setup_services.py +16 -15
- chia/simulator/simulator_full_node_rpc_api.py +1 -2
- chia/simulator/simulator_full_node_rpc_client.py +1 -2
- chia/simulator/simulator_protocol.py +1 -2
- chia/simulator/simulator_test_tools.py +3 -3
- chia/simulator/start_simulator.py +7 -7
- chia/simulator/wallet_tools.py +10 -10
- chia/solver/solver.py +10 -10
- chia/solver/solver_api.py +10 -8
- chia/solver/solver_rpc_api.py +2 -2
- chia/solver/start_solver.py +4 -4
- chia/ssl/cacert.pem +148 -90
- chia/ssl/chia_ca.crt +14 -10
- chia/ssl/chia_ca_old.crt +19 -0
- chia/ssl/create_ssl.py +4 -4
- chia/ssl/renewedselfsignedca.conf +4 -0
- chia/ssl/ssl_check.py +1 -2
- chia/timelord/iters_from_block.py +1 -4
- chia/timelord/start_timelord.py +4 -4
- chia/timelord/timelord.py +44 -40
- chia/timelord/timelord_api.py +6 -4
- chia/timelord/timelord_launcher.py +2 -2
- chia/timelord/timelord_rpc_api.py +2 -2
- chia/timelord/timelord_state.py +11 -12
- chia/types/block_protocol.py +1 -3
- chia/types/blockchain_format/coin.py +1 -3
- chia/types/blockchain_format/program.py +11 -8
- chia/types/blockchain_format/proof_of_space.py +123 -76
- chia/types/blockchain_format/tree_hash.py +3 -3
- chia/types/blockchain_format/vdf.py +1 -2
- chia/types/coin_spend.py +3 -3
- chia/types/mempool_item.py +5 -5
- chia/types/mempool_submission_status.py +2 -3
- chia/types/peer_info.py +1 -2
- chia/types/unfinished_header_block.py +3 -4
- chia/types/validation_state.py +1 -2
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +5 -5
- chia/util/bech32m.py +1 -2
- chia/util/beta_metrics.py +2 -2
- chia/util/block_cache.py +4 -4
- chia/util/chia_logging.py +2 -2
- chia/util/chia_version.py +1 -2
- chia/util/config.py +15 -16
- chia/util/db_wrapper.py +26 -27
- chia/util/default_root.py +1 -2
- chia/util/errors.py +3 -3
- chia/util/file_keyring.py +14 -14
- chia/util/files.py +2 -3
- chia/util/hash.py +4 -4
- chia/util/initial-config.yaml +3 -5
- chia/util/inline_executor.py +2 -1
- chia/util/ip_address.py +1 -2
- chia/util/keychain.py +25 -27
- chia/util/keyring_wrapper.py +18 -19
- chia/util/lock.py +3 -4
- chia/util/log_exceptions.py +1 -2
- chia/util/lru_cache.py +2 -2
- chia/util/network.py +6 -6
- chia/util/path.py +2 -3
- chia/util/priority_mutex.py +2 -2
- chia/util/profiler.py +1 -2
- chia/util/safe_cancel_task.py +1 -2
- chia/util/streamable.py +22 -8
- chia/util/task_referencer.py +1 -1
- chia/util/timing.py +3 -3
- chia/util/virtual_project_analysis.py +6 -5
- chia/util/ws_message.py +2 -2
- chia/wallet/cat_wallet/cat_info.py +3 -4
- chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
- chia/wallet/cat_wallet/cat_utils.py +3 -4
- chia/wallet/cat_wallet/cat_wallet.py +61 -83
- chia/wallet/cat_wallet/lineage_store.py +3 -4
- chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
- chia/wallet/coin_selection.py +9 -10
- chia/wallet/conditions.py +120 -105
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
- chia/wallet/derivation_record.py +1 -2
- chia/wallet/derive_keys.py +2 -4
- chia/wallet/did_wallet/did_info.py +10 -11
- chia/wallet/did_wallet/did_wallet.py +36 -82
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
- chia/wallet/driver_protocol.py +5 -7
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
- chia/wallet/nft_wallet/nft_info.py +8 -9
- chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
- chia/wallet/nft_wallet/nft_wallet.py +79 -116
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
- chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
- chia/wallet/nft_wallet/uncurry_nft.py +10 -11
- chia/wallet/notification_manager.py +3 -3
- chia/wallet/notification_store.py +44 -61
- chia/wallet/outer_puzzles.py +6 -7
- chia/wallet/puzzle_drivers.py +34 -6
- chia/wallet/puzzles/clawback/drivers.py +6 -6
- chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
- chia/wallet/puzzles/load_clvm.py +1 -1
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
- chia/wallet/puzzles/singleton_top_layer.py +2 -3
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
- chia/wallet/puzzles/tails.py +3 -3
- chia/wallet/singleton.py +5 -7
- chia/wallet/singleton_record.py +3 -3
- chia/wallet/start_wallet.py +5 -5
- chia/wallet/trade_manager.py +37 -58
- chia/wallet/trade_record.py +4 -4
- chia/wallet/trading/offer.py +59 -46
- chia/wallet/trading/trade_store.py +8 -9
- chia/wallet/transaction_record.py +8 -8
- chia/wallet/uncurried_puzzle.py +1 -2
- chia/wallet/util/clvm_streamable.py +12 -12
- chia/wallet/util/compute_hints.py +4 -5
- chia/wallet/util/curry_and_treehash.py +1 -2
- chia/wallet/util/merkle_tree.py +2 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/wallet/util/signing.py +85 -0
- chia/wallet/util/tx_config.py +15 -6
- chia/wallet/util/wallet_sync_utils.py +14 -16
- chia/wallet/util/wallet_types.py +2 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
- chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
- chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
- chia/wallet/vc_wallet/vc_drivers.py +27 -27
- chia/wallet/vc_wallet/vc_store.py +5 -6
- chia/wallet/vc_wallet/vc_wallet.py +33 -61
- chia/wallet/wallet.py +50 -78
- chia/wallet/wallet_action_scope.py +11 -11
- chia/wallet/wallet_blockchain.py +12 -12
- chia/wallet/wallet_coin_record.py +12 -6
- chia/wallet/wallet_coin_store.py +24 -25
- chia/wallet/wallet_interested_store.py +3 -5
- chia/wallet/wallet_nft_store.py +10 -11
- chia/wallet/wallet_node.py +53 -61
- chia/wallet/wallet_node_api.py +5 -3
- chia/wallet/wallet_protocol.py +23 -23
- chia/wallet/wallet_puzzle_store.py +15 -18
- chia/wallet/wallet_request_types.py +778 -114
- chia/wallet/wallet_retry_store.py +1 -3
- chia/wallet/wallet_rpc_api.py +572 -909
- chia/wallet/wallet_rpc_client.py +87 -279
- chia/wallet/wallet_singleton_store.py +3 -4
- chia/wallet/wallet_state_manager.py +332 -106
- chia/wallet/wallet_transaction_store.py +11 -14
- chia/wallet/wallet_user_store.py +4 -6
- chia/wallet/wallet_weight_proof_handler.py +4 -4
- {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
- chia/apis.py +0 -21
- chia/consensus/check_time_locks.py +0 -57
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
- chia/types/coin_record.py +0 -44
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
- {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
chia/server/ws_connection.py
CHANGED
|
@@ -5,9 +5,10 @@ import logging
|
|
|
5
5
|
import math
|
|
6
6
|
import time
|
|
7
7
|
import traceback
|
|
8
|
-
from collections.abc import Awaitable
|
|
8
|
+
from collections.abc import Awaitable, Callable
|
|
9
9
|
from dataclasses import dataclass, field
|
|
10
|
-
from
|
|
10
|
+
from ipaddress import IPv4Network, IPv6Network
|
|
11
|
+
from typing import Any
|
|
11
12
|
|
|
12
13
|
from aiohttp import ClientSession, WebSocketError, WSCloseCode, WSMessage, WSMsgType
|
|
13
14
|
from aiohttp.client import ClientWebSocketResponse
|
|
@@ -36,14 +37,14 @@ from chia.util.errors import ApiError, ConsensusError, Err, ProtocolError, Times
|
|
|
36
37
|
from chia.util.log_exceptions import log_exceptions
|
|
37
38
|
|
|
38
39
|
# Each message is prepended with LENGTH_BYTES bytes specifying the length
|
|
39
|
-
from chia.util.network import is_localhost
|
|
40
|
+
from chia.util.network import is_in_network, is_localhost
|
|
40
41
|
from chia.util.streamable import Streamable
|
|
41
42
|
from chia.util.task_referencer import create_referenced_task
|
|
42
43
|
|
|
43
44
|
# Max size 2^(8*4) which is around 4GiB
|
|
44
45
|
LENGTH_BYTES: int = 4
|
|
45
46
|
|
|
46
|
-
WebSocket =
|
|
47
|
+
WebSocket = WebSocketResponse | ClientWebSocketResponse
|
|
47
48
|
ConnectionCallback = Callable[["WSChiaConnection"], Awaitable[None]]
|
|
48
49
|
|
|
49
50
|
error_response_version = Version("0.0.35")
|
|
@@ -74,23 +75,23 @@ class WSChiaConnection:
|
|
|
74
75
|
ws: WebSocket = field(repr=False)
|
|
75
76
|
api: ApiProtocol = field(repr=False)
|
|
76
77
|
local_type: NodeType
|
|
77
|
-
local_port:
|
|
78
|
+
local_port: int | None
|
|
78
79
|
local_capabilities_for_handshake: list[tuple[uint16, str]] = field(repr=False)
|
|
79
80
|
local_capabilities: list[Capability]
|
|
80
81
|
peer_info: PeerInfo
|
|
81
82
|
peer_node_id: bytes32
|
|
82
83
|
log: logging.Logger = field(repr=False)
|
|
83
84
|
|
|
84
|
-
close_callback:
|
|
85
|
+
close_callback: ConnectionClosedCallbackProtocol | None = field(repr=False)
|
|
85
86
|
outbound_rate_limiter: RateLimiter
|
|
86
87
|
inbound_rate_limiter: RateLimiter
|
|
87
|
-
|
|
88
|
+
stub_metadata_for_type: dict[NodeType, ApiMetadata] = field(repr=False)
|
|
88
89
|
|
|
89
90
|
# connection properties
|
|
90
91
|
is_outbound: bool
|
|
91
92
|
|
|
92
93
|
# Messaging
|
|
93
|
-
received_message_callback:
|
|
94
|
+
received_message_callback: ConnectionCallback | None = field(repr=False)
|
|
94
95
|
incoming_queue: asyncio.Queue[Message] = field(default_factory=asyncio.Queue, repr=False)
|
|
95
96
|
outgoing_queue: asyncio.Queue[Message] = field(default_factory=asyncio.Queue, repr=False)
|
|
96
97
|
api_tasks: dict[bytes32, asyncio.Task[None]] = field(default_factory=dict, repr=False)
|
|
@@ -103,17 +104,17 @@ class WSChiaConnection:
|
|
|
103
104
|
bytes_written: int = 0
|
|
104
105
|
last_message_time: float = 0
|
|
105
106
|
|
|
106
|
-
peer_server_port:
|
|
107
|
-
inbound_task:
|
|
108
|
-
incoming_message_task:
|
|
109
|
-
outbound_task:
|
|
107
|
+
peer_server_port: uint16 | None = None
|
|
108
|
+
inbound_task: asyncio.Task[None] | None = field(default=None, repr=False)
|
|
109
|
+
incoming_message_task: asyncio.Task[None] | None = field(default=None, repr=False)
|
|
110
|
+
outbound_task: asyncio.Task[None] | None = field(default=None, repr=False)
|
|
110
111
|
_close_event: asyncio.Event = field(default_factory=asyncio.Event, repr=False)
|
|
111
|
-
session:
|
|
112
|
+
session: ClientSession | None = field(default=None, repr=False)
|
|
112
113
|
|
|
113
114
|
pending_requests: dict[uint16, asyncio.Event] = field(default_factory=dict, repr=False)
|
|
114
115
|
request_results: dict[uint16, Message] = field(default_factory=dict, repr=False)
|
|
115
116
|
closed: bool = False
|
|
116
|
-
connection_type:
|
|
117
|
+
connection_type: NodeType | None = None
|
|
117
118
|
request_nonce: uint16 = uint16(0)
|
|
118
119
|
peer_capabilities: list[Capability] = field(default_factory=list)
|
|
119
120
|
# Used by the Chia Seeder.
|
|
@@ -125,23 +126,29 @@ class WSChiaConnection:
|
|
|
125
126
|
repr=False,
|
|
126
127
|
)
|
|
127
128
|
|
|
129
|
+
exempt_peer_networks: list[IPv4Network | IPv6Network] = field(
|
|
130
|
+
default_factory=list,
|
|
131
|
+
repr=False,
|
|
132
|
+
)
|
|
133
|
+
|
|
128
134
|
@classmethod
|
|
129
135
|
def create(
|
|
130
136
|
cls,
|
|
131
137
|
local_type: NodeType,
|
|
132
138
|
ws: WebSocket,
|
|
133
139
|
api: ApiProtocol,
|
|
134
|
-
server_port:
|
|
140
|
+
server_port: int | None,
|
|
135
141
|
log: logging.Logger,
|
|
136
142
|
is_outbound: bool,
|
|
137
|
-
received_message_callback:
|
|
138
|
-
close_callback:
|
|
143
|
+
received_message_callback: ConnectionCallback | None,
|
|
144
|
+
close_callback: ConnectionClosedCallbackProtocol | None,
|
|
139
145
|
peer_id: bytes32,
|
|
140
146
|
inbound_rate_limit_percent: int,
|
|
141
147
|
outbound_rate_limit_percent: int,
|
|
142
148
|
local_capabilities_for_handshake: list[tuple[uint16, str]],
|
|
143
|
-
|
|
144
|
-
session:
|
|
149
|
+
stub_metadata_for_type: dict[NodeType, ApiMetadata],
|
|
150
|
+
session: ClientSession | None = None,
|
|
151
|
+
exempt_peer_networks: list[IPv4Network | IPv6Network] = [],
|
|
145
152
|
) -> WSChiaConnection:
|
|
146
153
|
assert ws._writer is not None
|
|
147
154
|
peername = ws._writer.transport.get_extra_info("peername")
|
|
@@ -172,11 +179,12 @@ class WSChiaConnection:
|
|
|
172
179
|
inbound_rate_limiter=RateLimiter(incoming=True, percentage_of_limit=inbound_rate_limit_percent),
|
|
173
180
|
is_outbound=is_outbound,
|
|
174
181
|
received_message_callback=received_message_callback,
|
|
175
|
-
|
|
182
|
+
stub_metadata_for_type=stub_metadata_for_type,
|
|
176
183
|
session=session,
|
|
184
|
+
exempt_peer_networks=exempt_peer_networks,
|
|
177
185
|
)
|
|
178
186
|
|
|
179
|
-
def _get_extra_info(self, name: str) ->
|
|
187
|
+
def _get_extra_info(self, name: str) -> Any | None:
|
|
180
188
|
writer = self.ws._writer
|
|
181
189
|
assert writer is not None, "websocket's ._writer is None, was .prepare() called?"
|
|
182
190
|
transport = writer.transport
|
|
@@ -305,7 +313,7 @@ class WSChiaConnection:
|
|
|
305
313
|
self,
|
|
306
314
|
ban_time: int = 0,
|
|
307
315
|
ws_close_code: WSCloseCode = WSCloseCode.OK,
|
|
308
|
-
error:
|
|
316
|
+
error: Err | None = None,
|
|
309
317
|
) -> None:
|
|
310
318
|
"""
|
|
311
319
|
Closes the connection, and finally calls the close_callback on the server, so the connection gets removed
|
|
@@ -407,7 +415,7 @@ class WSChiaConnection:
|
|
|
407
415
|
|
|
408
416
|
if full_message.type == ProtocolMessageTypes.error.value:
|
|
409
417
|
error = Error.from_bytes(full_message.data)
|
|
410
|
-
self.
|
|
418
|
+
self.log.warning(f"ApiError: {error} from {self.peer_node_id}, {self.peer_info}")
|
|
411
419
|
return None
|
|
412
420
|
|
|
413
421
|
bare_message_type = ProtocolMessageTypes(full_message.type)
|
|
@@ -427,7 +435,7 @@ class WSChiaConnection:
|
|
|
427
435
|
self.log.warning(f"API not ready, ignore request: {full_message}")
|
|
428
436
|
return None
|
|
429
437
|
|
|
430
|
-
timeout:
|
|
438
|
+
timeout: int | None = 600
|
|
431
439
|
if metadata.execute_task:
|
|
432
440
|
# Don't timeout on methods with execute_task decorator, these need to run fully
|
|
433
441
|
self.execute_tasks.add(task_id)
|
|
@@ -438,7 +446,7 @@ class WSChiaConnection:
|
|
|
438
446
|
else:
|
|
439
447
|
coroutine = metadata.method(self.api, full_message.data)
|
|
440
448
|
|
|
441
|
-
async def wrapped_coroutine() ->
|
|
449
|
+
async def wrapped_coroutine() -> Message | None:
|
|
442
450
|
try:
|
|
443
451
|
result = await coroutine
|
|
444
452
|
return result
|
|
@@ -461,7 +469,7 @@ class WSChiaConnection:
|
|
|
461
469
|
raise
|
|
462
470
|
return None
|
|
463
471
|
|
|
464
|
-
response:
|
|
472
|
+
response: Message | None = await asyncio.wait_for(wrapped_coroutine(), timeout=timeout)
|
|
465
473
|
self.log.debug(
|
|
466
474
|
f"Time taken to process {message_type} from {self.peer_node_id} is {time.time() - start_time} seconds"
|
|
467
475
|
)
|
|
@@ -535,7 +543,7 @@ class WSChiaConnection:
|
|
|
535
543
|
|
|
536
544
|
async def call_api(
|
|
537
545
|
self,
|
|
538
|
-
request_method: Callable[..., Awaitable[
|
|
546
|
+
request_method: Callable[..., Awaitable[Message | None]],
|
|
539
547
|
message: Streamable,
|
|
540
548
|
timeout: int = 60,
|
|
541
549
|
) -> Any:
|
|
@@ -545,7 +553,7 @@ class WSChiaConnection:
|
|
|
545
553
|
assert request_metadata is not None, f"ApiMetadata unavailable for {request_method}"
|
|
546
554
|
if (
|
|
547
555
|
request_metadata.request_type
|
|
548
|
-
not in self.
|
|
556
|
+
not in self.stub_metadata_for_type[self.connection_type].message_type_to_request
|
|
549
557
|
):
|
|
550
558
|
raise AttributeError(
|
|
551
559
|
f"Node type {self.connection_type} does not have method {request_metadata.request_type.name}"
|
|
@@ -572,12 +580,12 @@ class WSChiaConnection:
|
|
|
572
580
|
await self.ban_peer_bad_protocol(error_message)
|
|
573
581
|
raise ProtocolError(Err.INVALID_PROTOCOL_MESSAGE, [error_message])
|
|
574
582
|
|
|
575
|
-
recv_method = self.
|
|
583
|
+
recv_method = self.stub_metadata_for_type[self.local_type].message_type_to_request[recv_message_type].method
|
|
576
584
|
receive_metadata = ApiMetadata.from_bound_method(recv_method)
|
|
577
585
|
assert receive_metadata is not None, f"ApiMetadata unavailable for {recv_method}"
|
|
578
586
|
return receive_metadata.message_class.from_bytes(response.data)
|
|
579
587
|
|
|
580
|
-
async def send_request(self, message_no_id: Message, timeout: int) ->
|
|
588
|
+
async def send_request(self, message_no_id: Message, timeout: int) -> Message | None:
|
|
581
589
|
"""Sends a message and waits for a response."""
|
|
582
590
|
if self.closed:
|
|
583
591
|
return None
|
|
@@ -604,7 +612,7 @@ class WSChiaConnection:
|
|
|
604
612
|
self.log.debug(f"Request timeout: {message}")
|
|
605
613
|
|
|
606
614
|
self.pending_requests.pop(message.id)
|
|
607
|
-
result:
|
|
615
|
+
result: Message | None = None
|
|
608
616
|
if message.id in self.request_results:
|
|
609
617
|
result = self.request_results[message.id]
|
|
610
618
|
assert result is not None
|
|
@@ -631,7 +639,9 @@ class WSChiaConnection:
|
|
|
631
639
|
message, self.local_capabilities, self.peer_capabilities
|
|
632
640
|
)
|
|
633
641
|
if limiter_msg is not None:
|
|
634
|
-
if not is_localhost(self.peer_info.host)
|
|
642
|
+
if not is_localhost(self.peer_info.host) and not is_in_network(
|
|
643
|
+
self.peer_info.host, self.exempt_peer_networks
|
|
644
|
+
):
|
|
635
645
|
message_type = ProtocolMessageTypes(message.type)
|
|
636
646
|
last_time = self.log_rate_limit_last_time[message_type]
|
|
637
647
|
now = time.monotonic()
|
|
@@ -654,7 +664,8 @@ class WSChiaConnection:
|
|
|
654
664
|
return None
|
|
655
665
|
else:
|
|
656
666
|
self.log.debug(
|
|
657
|
-
f"Not rate limiting ourselves
|
|
667
|
+
f"Not rate limiting ourselves or exempt peers. "
|
|
668
|
+
f"message type: {ProtocolMessageTypes(message.type).name}, "
|
|
658
669
|
f"peer: {self.peer_info.host}"
|
|
659
670
|
)
|
|
660
671
|
|
|
@@ -664,7 +675,7 @@ class WSChiaConnection:
|
|
|
664
675
|
)
|
|
665
676
|
self.bytes_written += size
|
|
666
677
|
|
|
667
|
-
async def _read_one_message(self) ->
|
|
678
|
+
async def _read_one_message(self) -> Message | None:
|
|
668
679
|
message: WSMessage = await self.ws.receive()
|
|
669
680
|
|
|
670
681
|
if self.connection_type is not None:
|
|
@@ -705,7 +716,11 @@ class WSChiaConnection:
|
|
|
705
716
|
full_message_loaded, self.local_capabilities, self.peer_capabilities
|
|
706
717
|
)
|
|
707
718
|
if limiter_msg is not None:
|
|
708
|
-
if
|
|
719
|
+
if (
|
|
720
|
+
self.local_type == NodeType.FULL_NODE
|
|
721
|
+
and not is_localhost(self.peer_info.host)
|
|
722
|
+
and not is_in_network(self.peer_info.host, self.exempt_peer_networks)
|
|
723
|
+
):
|
|
709
724
|
details = ", ".join([f"{self.peer_info.host}", f"message: {message_type}", limiter_msg])
|
|
710
725
|
self.log.error(f"Peer has been rate limited and will be disconnected: {details}")
|
|
711
726
|
# Only full node disconnects peers, to prevent abuse and crashing timelords, farmers, etc
|
|
@@ -744,7 +759,7 @@ class WSChiaConnection:
|
|
|
744
759
|
else:
|
|
745
760
|
return "unknown"
|
|
746
761
|
|
|
747
|
-
def get_peer_info(self) ->
|
|
762
|
+
def get_peer_info(self) -> PeerInfo | None:
|
|
748
763
|
result = self._get_extra_info("peername")
|
|
749
764
|
if result is None:
|
|
750
765
|
return None
|
|
@@ -753,7 +768,7 @@ class WSChiaConnection:
|
|
|
753
768
|
return PeerInfo(connection_host, port)
|
|
754
769
|
|
|
755
770
|
def get_peer_logging(self) -> PeerInfo:
|
|
756
|
-
info:
|
|
771
|
+
info: PeerInfo | None = self.get_peer_info()
|
|
757
772
|
if info is None:
|
|
758
773
|
# in this case, we will use self.peer_info.host which is friendlier for logging
|
|
759
774
|
port = self.peer_server_port if self.peer_server_port is not None else self.peer_info.port
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Optional
|
|
4
|
-
|
|
5
3
|
from chia_rs import FullBlock
|
|
6
4
|
from chia_rs.sized_ints import uint32
|
|
7
5
|
|
|
@@ -47,7 +45,7 @@ async def add_blocks_in_batches(
|
|
|
47
45
|
)
|
|
48
46
|
assert success is True
|
|
49
47
|
if state_change_summary is not None:
|
|
50
|
-
peak_fb:
|
|
48
|
+
peak_fb: FullBlock | None = await full_node.blockchain.get_full_peak()
|
|
51
49
|
assert peak_fb is not None
|
|
52
50
|
ppp_result: PeakPostProcessingResult = await full_node.peak_post_processing(
|
|
53
51
|
peak_fb, state_change_summary, None
|