chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc1.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
chia/_tests/util/rpc.py
CHANGED
|
@@ -18,6 +18,9 @@ async def validate_get_routes(client: RpcClient, api: RpcApiProtocol) -> None:
|
|
|
18
18
|
"/get_routes",
|
|
19
19
|
"/get_version",
|
|
20
20
|
"/healthz",
|
|
21
|
+
"/get_log_level",
|
|
22
|
+
"/set_log_level",
|
|
23
|
+
"/reset_log_level",
|
|
21
24
|
]
|
|
22
25
|
assert len(routes_api) > 0
|
|
23
26
|
assert sorted(routes_client) == sorted(routes_api + routes_server)
|
chia/_tests/util/run_block.py
CHANGED
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import json
|
|
4
4
|
from dataclasses import dataclass
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any
|
|
7
7
|
|
|
8
8
|
from chia_rs import Coin
|
|
9
9
|
|
|
@@ -27,7 +27,7 @@ DESERIALIZE_MOD = load_serialized_clvm_maybe_recompile(
|
|
|
27
27
|
class NPC:
|
|
28
28
|
coin_name: bytes32
|
|
29
29
|
puzzle_hash: bytes32
|
|
30
|
-
conditions:
|
|
30
|
+
conditions: list[tuple[ConditionOpcode, list[ConditionWithArgs]]]
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
@dataclass
|
|
@@ -36,23 +36,23 @@ class CAT:
|
|
|
36
36
|
memo: str
|
|
37
37
|
npc: NPC
|
|
38
38
|
|
|
39
|
-
def cat_to_dict(self) ->
|
|
39
|
+
def cat_to_dict(self) -> dict[str, Any]:
|
|
40
40
|
return {"asset_id": self.asset_id, "memo": self.memo, "npc": npc_to_dict(self.npc)}
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
def condition_with_args_to_dict(condition_with_args: ConditionWithArgs) ->
|
|
43
|
+
def condition_with_args_to_dict(condition_with_args: ConditionWithArgs) -> dict[str, Any]:
|
|
44
44
|
return {
|
|
45
45
|
"condition_opcode": condition_with_args.opcode.name,
|
|
46
46
|
"arguments": [arg.hex() for arg in condition_with_args.vars],
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
def condition_list_to_dict(condition_list:
|
|
50
|
+
def condition_list_to_dict(condition_list: tuple[ConditionOpcode, list[ConditionWithArgs]]) -> list[dict[str, Any]]:
|
|
51
51
|
assert all([condition_list[0] == cwa.opcode for cwa in condition_list[1]])
|
|
52
52
|
return [condition_with_args_to_dict(cwa) for cwa in condition_list[1]]
|
|
53
53
|
|
|
54
54
|
|
|
55
|
-
def npc_to_dict(npc: NPC) ->
|
|
55
|
+
def npc_to_dict(npc: NPC) -> dict[str, Any]:
|
|
56
56
|
return {
|
|
57
57
|
"coin_name": npc.coin_name.hex(),
|
|
58
58
|
"conditions": [{"condition_type": c[0].name, "conditions": condition_list_to_dict(c)} for c in npc.conditions],
|
|
@@ -60,13 +60,13 @@ def npc_to_dict(npc: NPC) -> Dict[str, Any]:
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
|
|
63
|
-
def run_generator(block_generator: BlockGenerator, constants: ConsensusConstants, max_cost: int) ->
|
|
63
|
+
def run_generator(block_generator: BlockGenerator, constants: ConsensusConstants, max_cost: int) -> list[CAT]:
|
|
64
64
|
block_args = block_generator.generator_refs
|
|
65
|
-
|
|
65
|
+
_cost, block_result = block_generator.program.run_with_cost(max_cost, [DESERIALIZE_MOD, block_args])
|
|
66
66
|
|
|
67
67
|
coin_spends = block_result.first()
|
|
68
68
|
|
|
69
|
-
cat_list:
|
|
69
|
+
cat_list: list[CAT] = []
|
|
70
70
|
for spend in coin_spends.as_iter():
|
|
71
71
|
parent, puzzle, amount, solution = spend.as_iter()
|
|
72
72
|
args = match_cat_puzzle(uncurry_puzzle(puzzle))
|
|
@@ -79,7 +79,7 @@ def run_generator(block_generator: BlockGenerator, constants: ConsensusConstants
|
|
|
79
79
|
|
|
80
80
|
puzzle_result = puzzle.run(solution)
|
|
81
81
|
|
|
82
|
-
conds:
|
|
82
|
+
conds: dict[ConditionOpcode, list[ConditionWithArgs]] = {}
|
|
83
83
|
|
|
84
84
|
for condition in puzzle_result.as_python():
|
|
85
85
|
op = ConditionOpcode(condition[0])
|
|
@@ -126,7 +126,7 @@ def run_generator(block_generator: BlockGenerator, constants: ConsensusConstants
|
|
|
126
126
|
return cat_list
|
|
127
127
|
|
|
128
128
|
|
|
129
|
-
def ref_list_to_args(ref_list:
|
|
129
|
+
def ref_list_to_args(ref_list: list[uint32], root_path: Path) -> list[bytes]:
|
|
130
130
|
args = []
|
|
131
131
|
for height in ref_list:
|
|
132
132
|
with open(root_path / f"{height}.json", "rb") as f:
|
|
@@ -139,10 +139,10 @@ def ref_list_to_args(ref_list: List[uint32], root_path: Path) -> List[bytes]:
|
|
|
139
139
|
|
|
140
140
|
def run_generator_with_args(
|
|
141
141
|
generator_program_hex: str,
|
|
142
|
-
generator_args:
|
|
142
|
+
generator_args: list[bytes],
|
|
143
143
|
constants: ConsensusConstants,
|
|
144
144
|
cost: uint64,
|
|
145
|
-
) ->
|
|
145
|
+
) -> list[CAT]:
|
|
146
146
|
if not generator_program_hex:
|
|
147
147
|
return []
|
|
148
148
|
generator_program = SerializedProgram.fromhex(generator_program_hex)
|
|
@@ -150,11 +150,11 @@ def run_generator_with_args(
|
|
|
150
150
|
return run_generator(block_generator, constants, min(constants.MAX_BLOCK_COST_CLVM, cost))
|
|
151
151
|
|
|
152
152
|
|
|
153
|
-
def run_json_block(full_block:
|
|
153
|
+
def run_json_block(full_block: dict[str, Any], parent: Path, constants: ConsensusConstants) -> list[CAT]:
|
|
154
154
|
ref_list = full_block["block"]["transactions_generator_ref_list"]
|
|
155
|
-
tx_info:
|
|
155
|
+
tx_info: dict[str, Any] = full_block["block"]["transactions_info"]
|
|
156
156
|
generator_program_hex: str = full_block["block"]["transactions_generator"]
|
|
157
|
-
cat_list:
|
|
157
|
+
cat_list: list[CAT] = []
|
|
158
158
|
if tx_info and generator_program_hex:
|
|
159
159
|
cost = tx_info["cost"]
|
|
160
160
|
args = ref_list_to_args(ref_list, parent)
|
chia/_tests/util/setup_nodes.py
CHANGED
|
@@ -3,10 +3,11 @@ from __future__ import annotations
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import contextlib
|
|
5
5
|
import logging
|
|
6
|
+
from collections.abc import AsyncIterator
|
|
6
7
|
from contextlib import AsyncExitStack, ExitStack, asynccontextmanager
|
|
7
8
|
from dataclasses import dataclass
|
|
8
9
|
from pathlib import Path
|
|
9
|
-
from typing import
|
|
10
|
+
from typing import Optional, Union
|
|
10
11
|
|
|
11
12
|
import anyio
|
|
12
13
|
|
|
@@ -46,8 +47,8 @@ from chia.util.keychain import Keychain
|
|
|
46
47
|
from chia.util.timing import adjusted_timeout, backoff_times
|
|
47
48
|
from chia.wallet.wallet_node import WalletNode
|
|
48
49
|
|
|
49
|
-
OldSimulatorsAndWallets =
|
|
50
|
-
SimulatorsAndWalletsServices =
|
|
50
|
+
OldSimulatorsAndWallets = tuple[list[FullNodeSimulator], list[tuple[WalletNode, ChiaServer]], BlockTools]
|
|
51
|
+
SimulatorsAndWalletsServices = tuple[list[SimulatorFullNodeService], list[WalletService], BlockTools]
|
|
51
52
|
|
|
52
53
|
|
|
53
54
|
@dataclass(frozen=True)
|
|
@@ -64,8 +65,8 @@ class FullSystem:
|
|
|
64
65
|
|
|
65
66
|
@dataclass
|
|
66
67
|
class SimulatorsAndWallets:
|
|
67
|
-
simulators:
|
|
68
|
-
wallets:
|
|
68
|
+
simulators: list[FullNodeEnvironment]
|
|
69
|
+
wallets: list[WalletEnvironment]
|
|
69
70
|
bt: BlockTools
|
|
70
71
|
|
|
71
72
|
|
|
@@ -79,12 +80,12 @@ log = logging.getLogger(__name__)
|
|
|
79
80
|
@asynccontextmanager
|
|
80
81
|
async def setup_two_nodes(
|
|
81
82
|
consensus_constants: ConsensusConstants, db_version: int, self_hostname: str
|
|
82
|
-
) -> AsyncIterator[
|
|
83
|
+
) -> AsyncIterator[tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools]]:
|
|
83
84
|
"""
|
|
84
85
|
Setup and teardown of two full nodes, with blockchains and separate DBs.
|
|
85
86
|
"""
|
|
86
87
|
|
|
87
|
-
config_overrides = {"full_node.max_sync_wait": 0}
|
|
88
|
+
config_overrides = {"full_node.max_sync_wait": 0, "full_node.log_coins": True}
|
|
88
89
|
with TempKeyring(populate=True) as keychain1, TempKeyring(populate=True) as keychain2:
|
|
89
90
|
bt1 = await create_block_tools_async(
|
|
90
91
|
constants=consensus_constants, keychain=keychain1, config_overrides=config_overrides
|
|
@@ -116,11 +117,11 @@ async def setup_two_nodes(
|
|
|
116
117
|
@asynccontextmanager
|
|
117
118
|
async def setup_n_nodes(
|
|
118
119
|
consensus_constants: ConsensusConstants, n: int, db_version: int, self_hostname: str
|
|
119
|
-
) -> AsyncIterator[
|
|
120
|
+
) -> AsyncIterator[list[FullNodeAPI]]:
|
|
120
121
|
"""
|
|
121
122
|
Setup and teardown of n full nodes, with blockchains and separate DBs.
|
|
122
123
|
"""
|
|
123
|
-
config_overrides = {"full_node.max_sync_wait": 0}
|
|
124
|
+
config_overrides = {"full_node.max_sync_wait": 0, "full_node.log_coins": True}
|
|
124
125
|
with ExitStack() as stack:
|
|
125
126
|
keychains = [stack.enter_context(TempKeyring(populate=True)) for _ in range(n)]
|
|
126
127
|
async with AsyncExitStack() as async_exit_stack:
|
|
@@ -154,8 +155,8 @@ async def setup_simulators_and_wallets(
|
|
|
154
155
|
key_seed: Optional[bytes32] = None,
|
|
155
156
|
initial_num_public_keys: int = 5,
|
|
156
157
|
db_version: int = 2,
|
|
157
|
-
config_overrides: Optional[
|
|
158
|
-
disable_capabilities: Optional[
|
|
158
|
+
config_overrides: Optional[dict[str, int]] = None,
|
|
159
|
+
disable_capabilities: Optional[list[Capability]] = None,
|
|
159
160
|
) -> AsyncIterator[SimulatorsAndWallets]:
|
|
160
161
|
with TempKeyring(populate=True) as keychain1, TempKeyring(populate=True) as keychain2:
|
|
161
162
|
if config_overrides is None:
|
|
@@ -175,7 +176,7 @@ async def setup_simulators_and_wallets(
|
|
|
175
176
|
disable_capabilities,
|
|
176
177
|
) as (bt_tools, simulators, wallets_services):
|
|
177
178
|
async with contextlib.AsyncExitStack() as exit_stack:
|
|
178
|
-
wallets:
|
|
179
|
+
wallets: list[WalletEnvironment] = []
|
|
179
180
|
for service in wallets_services:
|
|
180
181
|
assert service.rpc_server is not None
|
|
181
182
|
|
|
@@ -207,9 +208,9 @@ async def setup_simulators_and_wallets_service(
|
|
|
207
208
|
key_seed: Optional[bytes32] = None,
|
|
208
209
|
initial_num_public_keys: int = 5,
|
|
209
210
|
db_version: int = 2,
|
|
210
|
-
config_overrides: Optional[
|
|
211
|
-
disable_capabilities: Optional[
|
|
212
|
-
) -> AsyncIterator[
|
|
211
|
+
config_overrides: Optional[dict[str, int]] = None,
|
|
212
|
+
disable_capabilities: Optional[list[Capability]] = None,
|
|
213
|
+
) -> AsyncIterator[tuple[list[SimulatorFullNodeService], list[WalletService], BlockTools]]:
|
|
213
214
|
with TempKeyring(populate=True) as keychain1, TempKeyring(populate=True) as keychain2:
|
|
214
215
|
async with setup_simulators_and_wallets_inner(
|
|
215
216
|
db_version,
|
|
@@ -240,13 +241,14 @@ async def setup_simulators_and_wallets_inner(
|
|
|
240
241
|
spam_filter_after_n_txs: int,
|
|
241
242
|
wallet_count: int,
|
|
242
243
|
xch_spam_amount: int,
|
|
243
|
-
config_overrides: Optional[
|
|
244
|
-
disable_capabilities: Optional[
|
|
245
|
-
) -> AsyncIterator[
|
|
244
|
+
config_overrides: Optional[dict[str, int]],
|
|
245
|
+
disable_capabilities: Optional[list[Capability]],
|
|
246
|
+
) -> AsyncIterator[tuple[list[BlockTools], list[SimulatorFullNodeService], list[WalletService]]]:
|
|
246
247
|
if config_overrides is not None and "full_node.max_sync_wait" not in config_overrides:
|
|
247
248
|
config_overrides["full_node.max_sync_wait"] = 0
|
|
249
|
+
config_overrides["full_node.log_coins"] = True
|
|
248
250
|
async with AsyncExitStack() as async_exit_stack:
|
|
249
|
-
bt_tools:
|
|
251
|
+
bt_tools: list[BlockTools] = [
|
|
250
252
|
await create_block_tools_async(consensus_constants, keychain=keychain1, config_overrides=config_overrides)
|
|
251
253
|
for _ in range(0, simulator_count)
|
|
252
254
|
]
|
|
@@ -258,7 +260,7 @@ async def setup_simulators_and_wallets_inner(
|
|
|
258
260
|
)
|
|
259
261
|
)
|
|
260
262
|
|
|
261
|
-
simulators:
|
|
263
|
+
simulators: list[SimulatorFullNodeService] = [
|
|
262
264
|
await async_exit_stack.enter_async_context(
|
|
263
265
|
# Passing simulator=True gets us this type guaranteed
|
|
264
266
|
setup_full_node( # type: ignore[arg-type]
|
|
@@ -274,7 +276,7 @@ async def setup_simulators_and_wallets_inner(
|
|
|
274
276
|
for index in range(0, simulator_count)
|
|
275
277
|
]
|
|
276
278
|
|
|
277
|
-
wallets:
|
|
279
|
+
wallets: list[WalletService] = [
|
|
278
280
|
await async_exit_stack.enter_async_context(
|
|
279
281
|
setup_wallet_node(
|
|
280
282
|
bt_tools[index].config["self_hostname"],
|
|
@@ -301,7 +303,7 @@ async def setup_farmer_multi_harvester(
|
|
|
301
303
|
consensus_constants: ConsensusConstants,
|
|
302
304
|
*,
|
|
303
305
|
start_services: bool,
|
|
304
|
-
) -> AsyncIterator[
|
|
306
|
+
) -> AsyncIterator[tuple[list[HarvesterService], FarmerService, BlockTools]]:
|
|
305
307
|
async with AsyncExitStack() as async_exit_stack:
|
|
306
308
|
farmer_service = await async_exit_stack.enter_async_context(
|
|
307
309
|
setup_farmer(
|
|
@@ -359,7 +361,7 @@ async def setup_full_system_inner(
|
|
|
359
361
|
keychain2: Keychain,
|
|
360
362
|
shared_b_tools: BlockTools,
|
|
361
363
|
) -> AsyncIterator[FullSystem]:
|
|
362
|
-
config_overrides = {"full_node.max_sync_wait": 0}
|
|
364
|
+
config_overrides = {"full_node.max_sync_wait": 0, "full_node.log_coins": True}
|
|
363
365
|
if b_tools is None:
|
|
364
366
|
b_tools = await create_block_tools_async(
|
|
365
367
|
constants=consensus_constants, keychain=keychain1, config_overrides=config_overrides
|
|
@@ -3,23 +3,24 @@ from __future__ import annotations
|
|
|
3
3
|
import contextlib
|
|
4
4
|
import json
|
|
5
5
|
import random
|
|
6
|
+
from collections.abc import AsyncIterator
|
|
6
7
|
from contextlib import asynccontextmanager
|
|
7
8
|
from dataclasses import dataclass
|
|
8
9
|
from pathlib import Path
|
|
9
|
-
from typing import Any,
|
|
10
|
+
from typing import Any, Callable, Optional, TypeVar
|
|
10
11
|
|
|
11
12
|
import anyio
|
|
13
|
+
from chia_rs import DONT_VALIDATE_SIGNATURE, G2Element, get_flags_for_height_and_constants, run_block_generator2
|
|
12
14
|
|
|
13
15
|
from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
|
|
14
16
|
from chia.consensus.coinbase import create_farmer_coin, create_pool_coin
|
|
15
17
|
from chia.consensus.constants import ConsensusConstants
|
|
16
|
-
from chia.consensus.cost_calculator import NPCResult
|
|
17
18
|
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
18
19
|
from chia.full_node.bundle_tools import simple_solution_generator
|
|
19
20
|
from chia.full_node.coin_store import CoinStore
|
|
20
21
|
from chia.full_node.hint_store import HintStore
|
|
21
22
|
from chia.full_node.mempool import Mempool
|
|
22
|
-
from chia.full_node.mempool_check_conditions import
|
|
23
|
+
from chia.full_node.mempool_check_conditions import get_puzzle_and_solution_for_coin
|
|
23
24
|
from chia.full_node.mempool_manager import MempoolManager
|
|
24
25
|
from chia.types.blockchain_format.coin import Coin
|
|
25
26
|
from chia.types.blockchain_format.program import INFINITE_COST
|
|
@@ -51,7 +52,7 @@ and is designed so that you could test with it and then swap in a real rpc clien
|
|
|
51
52
|
@asynccontextmanager
|
|
52
53
|
async def sim_and_client(
|
|
53
54
|
db_path: Optional[Path] = None, defaults: ConsensusConstants = DEFAULT_CONSTANTS, pass_prefarm: bool = True
|
|
54
|
-
) -> AsyncIterator[
|
|
55
|
+
) -> AsyncIterator[tuple[SpendSim, SimClient]]:
|
|
55
56
|
async with SpendSim.managed(db_path, defaults) as sim:
|
|
56
57
|
client: SimClient = SimClient(sim)
|
|
57
58
|
if pass_prefarm:
|
|
@@ -61,19 +62,22 @@ async def sim_and_client(
|
|
|
61
62
|
|
|
62
63
|
class CostLogger:
|
|
63
64
|
def __init__(self) -> None:
|
|
64
|
-
self.cost_dict:
|
|
65
|
-
self.cost_dict_no_puzs:
|
|
65
|
+
self.cost_dict: dict[str, int] = {}
|
|
66
|
+
self.cost_dict_no_puzs: dict[str, int] = {}
|
|
66
67
|
|
|
67
68
|
def add_cost(self, descriptor: str, spend_bundle: T_SpendBundle) -> T_SpendBundle:
|
|
68
69
|
program: BlockGenerator = simple_solution_generator(spend_bundle)
|
|
69
|
-
|
|
70
|
-
|
|
70
|
+
flags = get_flags_for_height_and_constants(DEFAULT_CONSTANTS.HARD_FORK_HEIGHT, DEFAULT_CONSTANTS)
|
|
71
|
+
_err, conds = run_block_generator2(
|
|
72
|
+
bytes(program.program),
|
|
73
|
+
[],
|
|
71
74
|
INFINITE_COST,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
+
flags | DONT_VALIDATE_SIGNATURE,
|
|
76
|
+
G2Element(),
|
|
77
|
+
None,
|
|
78
|
+
DEFAULT_CONSTANTS,
|
|
75
79
|
)
|
|
76
|
-
cost = uint64(0 if
|
|
80
|
+
cost = uint64(0 if conds is None else conds.cost)
|
|
77
81
|
self.cost_dict[descriptor] = cost
|
|
78
82
|
cost_to_subtract: int = 0
|
|
79
83
|
for cs in spend_bundle.coin_spends:
|
|
@@ -102,7 +106,7 @@ _T_SimBlockRecord = TypeVar("_T_SimBlockRecord", bound="SimBlockRecord")
|
|
|
102
106
|
@streamable
|
|
103
107
|
@dataclass(frozen=True)
|
|
104
108
|
class SimBlockRecord(Streamable):
|
|
105
|
-
reward_claims_incorporated:
|
|
109
|
+
reward_claims_incorporated: list[Coin]
|
|
106
110
|
height: uint32
|
|
107
111
|
prev_transaction_block_height: uint32
|
|
108
112
|
timestamp: uint64
|
|
@@ -111,7 +115,7 @@ class SimBlockRecord(Streamable):
|
|
|
111
115
|
prev_transaction_block_hash: bytes32
|
|
112
116
|
|
|
113
117
|
@classmethod
|
|
114
|
-
def create(cls:
|
|
118
|
+
def create(cls: type[_T_SimBlockRecord], rci: list[Coin], height: uint32, timestamp: uint64) -> _T_SimBlockRecord:
|
|
115
119
|
prev_transaction_block_height = uint32(height - 1 if height > 0 else 0)
|
|
116
120
|
return cls(
|
|
117
121
|
rci,
|
|
@@ -129,8 +133,8 @@ class SimBlockRecord(Streamable):
|
|
|
129
133
|
class SimStore(Streamable):
|
|
130
134
|
timestamp: uint64
|
|
131
135
|
block_height: uint32
|
|
132
|
-
block_records:
|
|
133
|
-
blocks:
|
|
136
|
+
block_records: list[SimBlockRecord]
|
|
137
|
+
blocks: list[SimFullBlock]
|
|
134
138
|
|
|
135
139
|
|
|
136
140
|
_T_SpendSim = TypeVar("_T_SpendSim", bound="SpendSim")
|
|
@@ -140,8 +144,8 @@ class SpendSim:
|
|
|
140
144
|
db_wrapper: DBWrapper2
|
|
141
145
|
coin_store: CoinStore
|
|
142
146
|
mempool_manager: MempoolManager
|
|
143
|
-
block_records:
|
|
144
|
-
blocks:
|
|
147
|
+
block_records: list[SimBlockRecord]
|
|
148
|
+
blocks: list[SimFullBlock]
|
|
145
149
|
timestamp: uint64
|
|
146
150
|
block_height: uint32
|
|
147
151
|
defaults: ConsensusConstants
|
|
@@ -150,7 +154,7 @@ class SpendSim:
|
|
|
150
154
|
@classmethod
|
|
151
155
|
@contextlib.asynccontextmanager
|
|
152
156
|
async def managed(
|
|
153
|
-
cls:
|
|
157
|
+
cls: type[_T_SpendSim], db_path: Optional[Path] = None, defaults: ConsensusConstants = DEFAULT_CONSTANTS
|
|
154
158
|
) -> AsyncIterator[_T_SpendSim]:
|
|
155
159
|
self = cls()
|
|
156
160
|
if db_path is None:
|
|
@@ -196,7 +200,7 @@ class SpendSim:
|
|
|
196
200
|
)
|
|
197
201
|
await c.close()
|
|
198
202
|
|
|
199
|
-
async def new_peak(self, spent_coins_ids: Optional[
|
|
203
|
+
async def new_peak(self, spent_coins_ids: Optional[list[bytes32]]) -> None:
|
|
200
204
|
await self.mempool_manager.new_peak(self.block_records[-1], spent_coins_ids)
|
|
201
205
|
|
|
202
206
|
def new_coin_record(self, coin: Coin, coinbase: bool = False) -> CoinRecord:
|
|
@@ -208,7 +212,7 @@ class SpendSim:
|
|
|
208
212
|
self.timestamp,
|
|
209
213
|
)
|
|
210
214
|
|
|
211
|
-
async def all_non_reward_coins(self) ->
|
|
215
|
+
async def all_non_reward_coins(self) -> list[Coin]:
|
|
212
216
|
coins = set()
|
|
213
217
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
214
218
|
cursor = await conn.execute(
|
|
@@ -231,7 +235,7 @@ class SpendSim:
|
|
|
231
235
|
self,
|
|
232
236
|
puzzle_hash: bytes32 = bytes32(b"0" * 32),
|
|
233
237
|
item_inclusion_filter: Optional[Callable[[bytes32], bool]] = None,
|
|
234
|
-
) ->
|
|
238
|
+
) -> tuple[list[Coin], list[Coin]]:
|
|
235
239
|
# Fees get calculated
|
|
236
240
|
fees = uint64(0)
|
|
237
241
|
for item in self.mempool_manager.mempool.all_items():
|
|
@@ -257,8 +261,8 @@ class SpendSim:
|
|
|
257
261
|
|
|
258
262
|
# Coin store gets updated
|
|
259
263
|
generator_bundle: Optional[SpendBundle] = None
|
|
260
|
-
return_additions:
|
|
261
|
-
return_removals:
|
|
264
|
+
return_additions: list[Coin] = []
|
|
265
|
+
return_removals: list[Coin] = []
|
|
262
266
|
spent_coins_ids = None
|
|
263
267
|
if (len(self.block_records) > 0) and (self.mempool_manager.mempool.size() > 0):
|
|
264
268
|
peak = self.mempool_manager.peak
|
|
@@ -274,7 +278,7 @@ class SpendSim:
|
|
|
274
278
|
generator_bundle = bundle
|
|
275
279
|
for spend in generator_bundle.coin_spends:
|
|
276
280
|
hint_dict, _ = compute_spend_hints_and_additions(spend)
|
|
277
|
-
hints:
|
|
281
|
+
hints: list[tuple[bytes32, bytes]] = []
|
|
278
282
|
hint_obj: HintedCoin
|
|
279
283
|
for coin_name, hint_obj in hint_dict.items():
|
|
280
284
|
if hint_obj.hint is not None:
|
|
@@ -334,7 +338,7 @@ class SimClient:
|
|
|
334
338
|
def __init__(self, service: SpendSim) -> None:
|
|
335
339
|
self.service = service
|
|
336
340
|
|
|
337
|
-
async def push_tx(self, spend_bundle: SpendBundle) ->
|
|
341
|
+
async def push_tx(self, spend_bundle: SpendBundle) -> tuple[MempoolInclusionStatus, Optional[Err]]:
|
|
338
342
|
try:
|
|
339
343
|
spend_bundle_id = spend_bundle.name()
|
|
340
344
|
sbc = await self.service.mempool_manager.pre_validate_spendbundle(spend_bundle, spend_bundle_id)
|
|
@@ -351,12 +355,12 @@ class SimClient:
|
|
|
351
355
|
|
|
352
356
|
async def get_coin_records_by_names(
|
|
353
357
|
self,
|
|
354
|
-
names:
|
|
358
|
+
names: list[bytes32],
|
|
355
359
|
start_height: Optional[int] = None,
|
|
356
360
|
end_height: Optional[int] = None,
|
|
357
361
|
include_spent_coins: bool = False,
|
|
358
|
-
) ->
|
|
359
|
-
kwargs:
|
|
362
|
+
) -> list[CoinRecord]:
|
|
363
|
+
kwargs: dict[str, Any] = {"include_spent_coins": include_spent_coins, "names": names}
|
|
360
364
|
if start_height is not None:
|
|
361
365
|
kwargs["start_height"] = start_height
|
|
362
366
|
if end_height is not None:
|
|
@@ -365,12 +369,12 @@ class SimClient:
|
|
|
365
369
|
|
|
366
370
|
async def get_coin_records_by_parent_ids(
|
|
367
371
|
self,
|
|
368
|
-
parent_ids:
|
|
372
|
+
parent_ids: list[bytes32],
|
|
369
373
|
start_height: Optional[int] = None,
|
|
370
374
|
end_height: Optional[int] = None,
|
|
371
375
|
include_spent_coins: bool = False,
|
|
372
|
-
) ->
|
|
373
|
-
kwargs:
|
|
376
|
+
) -> list[CoinRecord]:
|
|
377
|
+
kwargs: dict[str, Any] = {"include_spent_coins": include_spent_coins, "parent_ids": parent_ids}
|
|
374
378
|
if start_height is not None:
|
|
375
379
|
kwargs["start_height"] = start_height
|
|
376
380
|
if end_height is not None:
|
|
@@ -383,8 +387,8 @@ class SimClient:
|
|
|
383
387
|
include_spent_coins: bool = True,
|
|
384
388
|
start_height: Optional[int] = None,
|
|
385
389
|
end_height: Optional[int] = None,
|
|
386
|
-
) ->
|
|
387
|
-
kwargs:
|
|
390
|
+
) -> list[CoinRecord]:
|
|
391
|
+
kwargs: dict[str, Any] = {"include_spent_coins": include_spent_coins, "puzzle_hash": puzzle_hash}
|
|
388
392
|
if start_height is not None:
|
|
389
393
|
kwargs["start_height"] = start_height
|
|
390
394
|
if end_height is not None:
|
|
@@ -393,12 +397,12 @@ class SimClient:
|
|
|
393
397
|
|
|
394
398
|
async def get_coin_records_by_puzzle_hashes(
|
|
395
399
|
self,
|
|
396
|
-
puzzle_hashes:
|
|
400
|
+
puzzle_hashes: list[bytes32],
|
|
397
401
|
include_spent_coins: bool = True,
|
|
398
402
|
start_height: Optional[int] = None,
|
|
399
403
|
end_height: Optional[int] = None,
|
|
400
|
-
) ->
|
|
401
|
-
kwargs:
|
|
404
|
+
) -> list[CoinRecord]:
|
|
405
|
+
kwargs: dict[str, Any] = {"include_spent_coins": include_spent_coins, "puzzle_hashes": puzzle_hashes}
|
|
402
406
|
if start_height is not None:
|
|
403
407
|
kwargs["start_height"] = start_height
|
|
404
408
|
if end_height is not None:
|
|
@@ -406,32 +410,32 @@ class SimClient:
|
|
|
406
410
|
return await self.service.coin_store.get_coin_records_by_puzzle_hashes(**kwargs)
|
|
407
411
|
|
|
408
412
|
async def get_block_record_by_height(self, height: uint32) -> SimBlockRecord:
|
|
409
|
-
return
|
|
413
|
+
return next(filter(lambda block: block.height == height, self.service.block_records))
|
|
410
414
|
|
|
411
415
|
async def get_block_record(self, header_hash: bytes32) -> SimBlockRecord:
|
|
412
|
-
return
|
|
416
|
+
return next(filter(lambda block: block.header_hash == header_hash, self.service.block_records))
|
|
413
417
|
|
|
414
|
-
async def get_block_records(self, start: uint32, end: uint32) ->
|
|
418
|
+
async def get_block_records(self, start: uint32, end: uint32) -> list[SimBlockRecord]:
|
|
415
419
|
return list(filter(lambda block: (block.height >= start) and (block.height < end), self.service.block_records))
|
|
416
420
|
|
|
417
421
|
async def get_block(self, header_hash: bytes32) -> SimFullBlock:
|
|
418
|
-
selected_block: SimBlockRecord =
|
|
422
|
+
selected_block: SimBlockRecord = next(
|
|
419
423
|
filter(lambda br: br.header_hash == header_hash, self.service.block_records)
|
|
420
|
-
)
|
|
424
|
+
)
|
|
421
425
|
block_height: uint32 = selected_block.height
|
|
422
|
-
block: SimFullBlock =
|
|
426
|
+
block: SimFullBlock = next(filter(lambda block: block.height == block_height, self.service.blocks))
|
|
423
427
|
return block
|
|
424
428
|
|
|
425
|
-
async def get_all_block(self, start: uint32, end: uint32) ->
|
|
429
|
+
async def get_all_block(self, start: uint32, end: uint32) -> list[SimFullBlock]:
|
|
426
430
|
return list(filter(lambda block: (block.height >= start) and (block.height < end), self.service.blocks))
|
|
427
431
|
|
|
428
|
-
async def get_additions_and_removals(self, header_hash: bytes32) ->
|
|
429
|
-
selected_block: SimBlockRecord =
|
|
432
|
+
async def get_additions_and_removals(self, header_hash: bytes32) -> tuple[list[CoinRecord], list[CoinRecord]]:
|
|
433
|
+
selected_block: SimBlockRecord = next(
|
|
430
434
|
filter(lambda br: br.header_hash == header_hash, self.service.block_records)
|
|
431
|
-
)
|
|
435
|
+
)
|
|
432
436
|
block_height: uint32 = selected_block.height
|
|
433
|
-
additions:
|
|
434
|
-
removals:
|
|
437
|
+
additions: list[CoinRecord] = await self.service.coin_store.get_coins_added_at_height(block_height)
|
|
438
|
+
removals: list[CoinRecord] = await self.service.coin_store.get_coins_removed_at_height(block_height)
|
|
435
439
|
return additions, removals
|
|
436
440
|
|
|
437
441
|
async def get_puzzle_and_solution(self, coin_id: bytes32, height: uint32) -> CoinSpend:
|
|
@@ -443,16 +447,16 @@ class SimClient:
|
|
|
443
447
|
spend_info = get_puzzle_and_solution_for_coin(generator, coin_record.coin, height, self.service.defaults)
|
|
444
448
|
return CoinSpend(coin_record.coin, spend_info.puzzle, spend_info.solution)
|
|
445
449
|
|
|
446
|
-
async def get_all_mempool_tx_ids(self) ->
|
|
450
|
+
async def get_all_mempool_tx_ids(self) -> list[bytes32]:
|
|
447
451
|
return self.service.mempool_manager.mempool.all_item_ids()
|
|
448
452
|
|
|
449
|
-
async def get_all_mempool_items(self) ->
|
|
453
|
+
async def get_all_mempool_items(self) -> dict[bytes32, MempoolItem]:
|
|
450
454
|
spends = {}
|
|
451
455
|
for item in self.service.mempool_manager.mempool.all_items():
|
|
452
456
|
spends[item.name] = item
|
|
453
457
|
return spends
|
|
454
458
|
|
|
455
|
-
async def get_mempool_item_by_tx_id(self, tx_id: bytes32) -> Optional[
|
|
459
|
+
async def get_mempool_item_by_tx_id(self, tx_id: bytes32) -> Optional[dict[str, Any]]:
|
|
456
460
|
item = self.service.mempool_manager.get_mempool_item(tx_id)
|
|
457
461
|
if item is None:
|
|
458
462
|
return None
|
|
@@ -465,13 +469,13 @@ class SimClient:
|
|
|
465
469
|
include_spent_coins: bool = True,
|
|
466
470
|
start_height: Optional[int] = None,
|
|
467
471
|
end_height: Optional[int] = None,
|
|
468
|
-
) ->
|
|
472
|
+
) -> list[CoinRecord]:
|
|
469
473
|
"""
|
|
470
474
|
Retrieves coins by hint, by default returns unspent coins.
|
|
471
475
|
"""
|
|
472
|
-
names:
|
|
476
|
+
names: list[bytes32] = await self.service.hint_store.get_coin_ids(hint)
|
|
473
477
|
|
|
474
|
-
kwargs:
|
|
478
|
+
kwargs: dict[str, Any] = {
|
|
475
479
|
"include_spent_coins": False,
|
|
476
480
|
"names": names,
|
|
477
481
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import contextlib
|
|
4
|
+
from collections.abc import AsyncIterator, Iterator
|
|
4
5
|
from dataclasses import dataclass
|
|
5
|
-
from typing import
|
|
6
|
+
from typing import Generic, TypeVar
|
|
6
7
|
|
|
7
8
|
T = TypeVar("T")
|
|
8
9
|
|
|
@@ -10,13 +11,13 @@ T = TypeVar("T")
|
|
|
10
11
|
@dataclass
|
|
11
12
|
class SplitManager(Generic[T]):
|
|
12
13
|
# NOTE: only for transitional testing use, please avoid usage
|
|
13
|
-
manager:
|
|
14
|
+
manager: contextlib.AbstractContextManager[object]
|
|
14
15
|
object: T
|
|
15
16
|
_entered: bool = False
|
|
16
17
|
_exited: bool = False
|
|
17
18
|
|
|
18
19
|
def enter(self) -> None:
|
|
19
|
-
messages:
|
|
20
|
+
messages: list[str] = []
|
|
20
21
|
if self._entered:
|
|
21
22
|
messages.append("already entered")
|
|
22
23
|
if self._exited:
|
|
@@ -31,7 +32,7 @@ class SplitManager(Generic[T]):
|
|
|
31
32
|
if if_needed and (not self._entered or self._exited):
|
|
32
33
|
return
|
|
33
34
|
|
|
34
|
-
messages:
|
|
35
|
+
messages: list[str] = []
|
|
35
36
|
if not self._entered:
|
|
36
37
|
messages.append("not yet entered")
|
|
37
38
|
if self._exited:
|
|
@@ -46,13 +47,13 @@ class SplitManager(Generic[T]):
|
|
|
46
47
|
@dataclass
|
|
47
48
|
class SplitAsyncManager(Generic[T]):
|
|
48
49
|
# NOTE: only for transitional testing use, please avoid usage
|
|
49
|
-
manager:
|
|
50
|
+
manager: contextlib.AbstractAsyncContextManager[object]
|
|
50
51
|
object: T
|
|
51
52
|
_entered: bool = False
|
|
52
53
|
_exited: bool = False
|
|
53
54
|
|
|
54
55
|
async def enter(self) -> None:
|
|
55
|
-
messages:
|
|
56
|
+
messages: list[str] = []
|
|
56
57
|
if self._entered:
|
|
57
58
|
messages.append("already entered")
|
|
58
59
|
if self._exited:
|
|
@@ -67,7 +68,7 @@ class SplitAsyncManager(Generic[T]):
|
|
|
67
68
|
if if_needed and (not self._entered or self._exited):
|
|
68
69
|
return
|
|
69
70
|
|
|
70
|
-
messages:
|
|
71
|
+
messages: list[str] = []
|
|
71
72
|
if not self._entered:
|
|
72
73
|
messages.append("not yet entered")
|
|
73
74
|
if self._exited:
|
|
@@ -80,7 +81,7 @@ class SplitAsyncManager(Generic[T]):
|
|
|
80
81
|
|
|
81
82
|
|
|
82
83
|
@contextlib.contextmanager
|
|
83
|
-
def split_manager(manager:
|
|
84
|
+
def split_manager(manager: contextlib.AbstractContextManager[object], object: T) -> Iterator[SplitManager[T]]:
|
|
84
85
|
# NOTE: only for transitional testing use, please avoid usage
|
|
85
86
|
split = SplitManager(manager=manager, object=object)
|
|
86
87
|
try:
|
|
@@ -90,7 +91,9 @@ def split_manager(manager: ContextManager[object], object: T) -> Iterator[SplitM
|
|
|
90
91
|
|
|
91
92
|
|
|
92
93
|
@contextlib.asynccontextmanager
|
|
93
|
-
async def split_async_manager(
|
|
94
|
+
async def split_async_manager(
|
|
95
|
+
manager: contextlib.AbstractAsyncContextManager[object], object: T
|
|
96
|
+
) -> AsyncIterator[SplitAsyncManager[T]]:
|
|
94
97
|
# NOTE: only for transitional testing use, please avoid usage
|
|
95
98
|
split = SplitAsyncManager(manager=manager, object=object)
|
|
96
99
|
try:
|