chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
# flake8: noqa: E501
|
|
2
1
|
from __future__ import annotations
|
|
3
2
|
|
|
4
|
-
from chia_rs import AugSchemeMPL, PrivateKey
|
|
5
|
-
|
|
6
3
|
from chia.pools.pool_config import PoolWalletConfig
|
|
7
4
|
from chia.util.config import create_default_chia_config, load_config, lock_config, save_config
|
|
8
5
|
|
|
@@ -18,9 +15,10 @@ def test_pool_config(tmp_path):
|
|
|
18
15
|
eg_config.rename(to_config)
|
|
19
16
|
config = load_config(test_root, "test_pool_config.yaml")
|
|
20
17
|
|
|
21
|
-
auth_sk: PrivateKey = AugSchemeMPL.key_gen(b"1" * 32)
|
|
22
18
|
d = {
|
|
23
|
-
"owner_public_key":
|
|
19
|
+
"owner_public_key": (
|
|
20
|
+
"84c3fcf9d5581c1ddc702cb0f3b4a06043303b334dd993ab42b2c320ebfa98e5ce558448615b3f69638ba92cf7f43da5"
|
|
21
|
+
),
|
|
24
22
|
"p2_singleton_puzzle_hash": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824",
|
|
25
23
|
"payout_instructions": "c2b08e41d766da4116e388357ed957d04ad754623a915f3fd65188a8746cf3e8",
|
|
26
24
|
"pool_url": "localhost",
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import copy
|
|
4
|
-
from typing import List
|
|
5
4
|
from unittest import TestCase
|
|
6
5
|
|
|
7
6
|
import pytest
|
|
@@ -205,7 +204,7 @@ class TestPoolPuzzles(TestCase):
|
|
|
205
204
|
assert launcher_id_to_p2_puzzle_hash(launcher_id, DELAY_TIME, DELAY_PH) == p2_singleton_ph
|
|
206
205
|
assert get_seconds_and_delayed_puzhash_from_p2_singleton_puzzle(p2_singleton_puz) == (DELAY_TIME, DELAY_PH)
|
|
207
206
|
coin_db.farm_coin(p2_singleton_ph, time, 1750000000000)
|
|
208
|
-
coin_sols:
|
|
207
|
+
coin_sols: list[CoinSpend] = create_absorb_spend(
|
|
209
208
|
launcher_coinsol,
|
|
210
209
|
pool_state,
|
|
211
210
|
launcher_coin,
|
|
@@ -220,13 +219,13 @@ class TestPoolPuzzles(TestCase):
|
|
|
220
219
|
)
|
|
221
220
|
|
|
222
221
|
# ABSORB A NON EXISTENT REWARD (Negative test)
|
|
223
|
-
last_coinsol: CoinSpend =
|
|
222
|
+
last_coinsol: CoinSpend = next(
|
|
224
223
|
filter(
|
|
225
224
|
lambda e: e.coin.amount == START_AMOUNT,
|
|
226
225
|
coin_sols,
|
|
227
226
|
)
|
|
228
|
-
)
|
|
229
|
-
coin_sols:
|
|
227
|
+
)
|
|
228
|
+
coin_sols: list[CoinSpend] = create_absorb_spend(
|
|
230
229
|
last_coinsol,
|
|
231
230
|
pool_state,
|
|
232
231
|
launcher_coin,
|
|
@@ -236,12 +235,12 @@ class TestPoolPuzzles(TestCase):
|
|
|
236
235
|
DELAY_PH, # height
|
|
237
236
|
)
|
|
238
237
|
# pick the larger coin, otherwise we'll fail with Err.MINTING_COIN
|
|
239
|
-
singleton_coinsol: CoinSpend =
|
|
238
|
+
singleton_coinsol: CoinSpend = next(
|
|
240
239
|
filter(
|
|
241
240
|
lambda e: e.coin.amount != START_AMOUNT,
|
|
242
241
|
coin_sols,
|
|
243
242
|
)
|
|
244
|
-
)
|
|
243
|
+
)
|
|
245
244
|
# Spend it and hope it fails!
|
|
246
245
|
with pytest.raises(
|
|
247
246
|
BadSpendBundleError, match="condition validation failure Err.ASSERT_ANNOUNCE_CONSUMED_FAILED"
|
|
@@ -332,7 +331,7 @@ class TestPoolPuzzles(TestCase):
|
|
|
332
331
|
# create the farming reward
|
|
333
332
|
coin_db.farm_coin(p2_singleton_ph, time, 1750000000000)
|
|
334
333
|
# generate relevant coin solutions
|
|
335
|
-
coin_sols:
|
|
334
|
+
coin_sols: list[CoinSpend] = create_absorb_spend(
|
|
336
335
|
travel_coinsol,
|
|
337
336
|
target_pool_state,
|
|
338
337
|
launcher_coin,
|
|
@@ -349,12 +348,12 @@ class TestPoolPuzzles(TestCase):
|
|
|
349
348
|
# LEAVE THE WAITING ROOM
|
|
350
349
|
time = CoinTimestamp(20000000, 10000)
|
|
351
350
|
# find the singleton
|
|
352
|
-
singleton_coinsol: CoinSpend =
|
|
351
|
+
singleton_coinsol: CoinSpend = next(
|
|
353
352
|
filter(
|
|
354
353
|
lambda e: e.coin.amount == START_AMOUNT,
|
|
355
354
|
coin_sols,
|
|
356
355
|
)
|
|
357
|
-
)
|
|
356
|
+
)
|
|
358
357
|
singleton: Coin = get_most_recent_singleton_coin_from_coin_spend(singleton_coinsol)
|
|
359
358
|
# get the relevant coin solution
|
|
360
359
|
return_coinsol, _ = create_travel_spend(
|
|
@@ -383,7 +382,7 @@ class TestPoolPuzzles(TestCase):
|
|
|
383
382
|
time = CoinTimestamp(20000000, 10005)
|
|
384
383
|
# create the farming reward
|
|
385
384
|
coin_db.farm_coin(p2_singleton_ph, time, 1750000000000)
|
|
386
|
-
coin_sols:
|
|
385
|
+
coin_sols: list[CoinSpend] = create_absorb_spend(
|
|
387
386
|
return_coinsol,
|
|
388
387
|
pool_state,
|
|
389
388
|
launcher_coin,
|
|
@@ -4,10 +4,11 @@ import asyncio
|
|
|
4
4
|
import contextlib
|
|
5
5
|
import logging
|
|
6
6
|
import tempfile
|
|
7
|
+
from collections.abc import AsyncIterator
|
|
7
8
|
from dataclasses import dataclass
|
|
8
9
|
from pathlib import Path
|
|
9
10
|
from shutil import rmtree
|
|
10
|
-
from typing import Any,
|
|
11
|
+
from typing import Any, Union
|
|
11
12
|
|
|
12
13
|
import pytest
|
|
13
14
|
|
|
@@ -15,12 +16,14 @@ import pytest
|
|
|
15
16
|
from _pytest.fixtures import SubRequest
|
|
16
17
|
from chia_rs import G1Element
|
|
17
18
|
|
|
19
|
+
from chia._tests.environments.wallet import WalletStateTransition, WalletTestFramework
|
|
18
20
|
from chia._tests.util.setup_nodes import setup_simulators_and_wallets_service
|
|
19
21
|
from chia._tests.util.time_out_assert import time_out_assert
|
|
20
22
|
from chia.consensus.constants import ConsensusConstants
|
|
21
23
|
from chia.pools.pool_puzzles import SINGLETON_LAUNCHER_HASH
|
|
22
24
|
from chia.pools.pool_wallet_info import PoolSingletonState, PoolWalletInfo
|
|
23
25
|
from chia.rpc.wallet_rpc_client import WalletRpcClient
|
|
26
|
+
from chia.simulator.add_blocks_in_batches import add_blocks_in_batches
|
|
24
27
|
from chia.simulator.block_tools import BlockTools, get_plot_dir
|
|
25
28
|
from chia.simulator.full_node_simulator import FullNodeSimulator
|
|
26
29
|
from chia.simulator.simulator_protocol import ReorgProtocol
|
|
@@ -34,15 +37,21 @@ from chia.util.config import load_config
|
|
|
34
37
|
from chia.util.ints import uint32, uint64
|
|
35
38
|
from chia.wallet.derive_keys import find_authentication_sk, find_owner_sk
|
|
36
39
|
from chia.wallet.transaction_record import TransactionRecord
|
|
40
|
+
from chia.wallet.util.transaction_type import TransactionType
|
|
37
41
|
from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
|
|
38
42
|
from chia.wallet.util.wallet_types import WalletType
|
|
39
43
|
from chia.wallet.wallet_node import WalletNode
|
|
44
|
+
from chia.wallet.wallet_state_manager import WalletStateManager
|
|
40
45
|
|
|
41
46
|
# TODO: Compare deducted fees in all tests against reported total_fee
|
|
42
47
|
|
|
48
|
+
# limit to plain consensus mode for all tests
|
|
49
|
+
pytestmark = [pytest.mark.limit_consensus_modes(reason="irrelevant")]
|
|
50
|
+
|
|
43
51
|
log = logging.getLogger(__name__)
|
|
44
52
|
FEE_AMOUNT = uint64(29_000)
|
|
45
53
|
MAX_WAIT_SECS = 30 # A high value for WAIT_SECS is useful when paused in the debugger
|
|
54
|
+
LOCK_HEIGHT = uint32(5)
|
|
46
55
|
|
|
47
56
|
|
|
48
57
|
def get_pool_plot_dir() -> Path:
|
|
@@ -91,7 +100,7 @@ def fee(trusted: bool) -> uint64:
|
|
|
91
100
|
return uint64(0)
|
|
92
101
|
|
|
93
102
|
|
|
94
|
-
OneWalletNodeAndRpc =
|
|
103
|
+
OneWalletNodeAndRpc = tuple[WalletRpcClient, Any, FullNodeSimulator, int, BlockTools]
|
|
95
104
|
|
|
96
105
|
|
|
97
106
|
@pytest.fixture(scope="function")
|
|
@@ -129,17 +138,17 @@ async def one_wallet_node_and_rpc(
|
|
|
129
138
|
await client.await_closed()
|
|
130
139
|
|
|
131
140
|
|
|
132
|
-
Setup =
|
|
141
|
+
Setup = tuple[FullNodeSimulator, WalletNode, bytes32, int, WalletRpcClient]
|
|
133
142
|
|
|
134
143
|
|
|
135
144
|
@pytest.fixture(scope="function")
|
|
136
145
|
async def setup(
|
|
137
|
-
one_wallet_and_one_simulator_services:
|
|
146
|
+
one_wallet_and_one_simulator_services: tuple[list[SimulatorFullNodeService], list[WalletService], BlockTools],
|
|
138
147
|
trusted: bool,
|
|
139
148
|
self_hostname: str,
|
|
140
149
|
) -> AsyncIterator[Setup]:
|
|
141
150
|
rmtree(get_pool_plot_dir(), ignore_errors=True)
|
|
142
|
-
[full_node_service], [wallet_service],
|
|
151
|
+
[full_node_service], [wallet_service], _bt = one_wallet_and_one_simulator_services
|
|
143
152
|
full_node_api: FullNodeSimulator = full_node_service._api
|
|
144
153
|
wallet_node = wallet_service._node
|
|
145
154
|
our_ph_record = await wallet_node.wallet_state_manager.get_unused_derivation_record(uint32(1), hardened=True)
|
|
@@ -180,6 +189,90 @@ async def setup(
|
|
|
180
189
|
await client.await_closed()
|
|
181
190
|
|
|
182
191
|
|
|
192
|
+
async def verify_pool_state(wallet_rpc: WalletRpcClient, w_id: int, expected_state: PoolSingletonState) -> bool:
|
|
193
|
+
pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(w_id))[0]
|
|
194
|
+
return pw_status.current.state == expected_state.value
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
async def process_plotnft_create(
|
|
198
|
+
wallet_test_framework: WalletTestFramework, expected_state: PoolSingletonState, second_nft: bool = False
|
|
199
|
+
) -> int:
|
|
200
|
+
wallet_rpc: WalletRpcClient = wallet_test_framework.environments[0].rpc_client
|
|
201
|
+
|
|
202
|
+
pre_block_balance_updates: dict[Union[int, str], dict[str, int]] = {
|
|
203
|
+
1: {
|
|
204
|
+
"confirmed_wallet_balance": 0,
|
|
205
|
+
"unconfirmed_wallet_balance": -1,
|
|
206
|
+
"<=#spendable_balance": 1,
|
|
207
|
+
"<=#max_send_amount": 1,
|
|
208
|
+
">=#pending_change": 1, # any amount increase
|
|
209
|
+
"pending_coin_removal_count": 1,
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
post_block_balance_updates: dict[Union[int, str], dict[str, int]] = {
|
|
214
|
+
1: {
|
|
215
|
+
"confirmed_wallet_balance": -1,
|
|
216
|
+
"unconfirmed_wallet_balance": 0,
|
|
217
|
+
">=#spendable_balance": 1,
|
|
218
|
+
">=#max_send_amount": 1,
|
|
219
|
+
"<=#pending_change": 1, # any amount decrease
|
|
220
|
+
"<=#pending_coin_removal_count": 1,
|
|
221
|
+
},
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if second_nft:
|
|
225
|
+
post_block = post_block_balance_updates | {
|
|
226
|
+
2: {
|
|
227
|
+
"set_remainder": True, # TODO: sometimes this fails with pending_coin_removal_count
|
|
228
|
+
},
|
|
229
|
+
3: {"init": True, "unspent_coin_count": 1},
|
|
230
|
+
}
|
|
231
|
+
else:
|
|
232
|
+
post_block = post_block_balance_updates | {2: {"init": True, "unspent_coin_count": 1}}
|
|
233
|
+
|
|
234
|
+
await wallet_test_framework.process_pending_states(
|
|
235
|
+
[
|
|
236
|
+
WalletStateTransition(
|
|
237
|
+
pre_block_balance_updates=pre_block_balance_updates,
|
|
238
|
+
post_block_balance_updates=post_block,
|
|
239
|
+
)
|
|
240
|
+
]
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
summaries_response = await wallet_rpc.get_wallets(WalletType.POOLING_WALLET)
|
|
244
|
+
assert len(summaries_response) == 2 if second_nft else 1
|
|
245
|
+
wallet_id: int = summaries_response[-1]["id"]
|
|
246
|
+
|
|
247
|
+
await verify_pool_state(wallet_rpc, wallet_id, expected_state=expected_state)
|
|
248
|
+
return wallet_id
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
async def create_new_plotnft(
|
|
252
|
+
wallet_test_framework: WalletTestFramework, self_pool: bool = False, second_nft: bool = False
|
|
253
|
+
) -> int:
|
|
254
|
+
wallet_state_manager: WalletStateManager = wallet_test_framework.environments[0].wallet_state_manager
|
|
255
|
+
wallet_rpc: WalletRpcClient = wallet_test_framework.environments[0].rpc_client
|
|
256
|
+
|
|
257
|
+
our_ph = await wallet_state_manager.main_wallet.get_new_puzzlehash()
|
|
258
|
+
|
|
259
|
+
await wallet_rpc.create_new_pool_wallet(
|
|
260
|
+
target_puzzlehash=our_ph,
|
|
261
|
+
backup_host="",
|
|
262
|
+
mode="new",
|
|
263
|
+
relative_lock_height=uint32(0) if self_pool else LOCK_HEIGHT,
|
|
264
|
+
state="SELF_POOLING" if self_pool else "FARMING_TO_POOL",
|
|
265
|
+
pool_url="" if self_pool else "http://pool.example.com",
|
|
266
|
+
fee=uint64(0),
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
return await process_plotnft_create(
|
|
270
|
+
wallet_test_framework=wallet_test_framework,
|
|
271
|
+
expected_state=PoolSingletonState.SELF_POOLING if self_pool else PoolSingletonState.FARMING_TO_POOL,
|
|
272
|
+
second_nft=second_nft,
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
|
|
183
276
|
class TestPoolWalletRpc:
|
|
184
277
|
@pytest.mark.anyio
|
|
185
278
|
async def test_create_new_pool_wallet_self_farm(
|
|
@@ -188,7 +281,7 @@ class TestPoolWalletRpc:
|
|
|
188
281
|
fee: uint64,
|
|
189
282
|
self_hostname: str,
|
|
190
283
|
) -> None:
|
|
191
|
-
client, wallet_node, full_node_api,
|
|
284
|
+
client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
|
|
192
285
|
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
193
286
|
|
|
194
287
|
our_ph = await wallet.get_new_puzzlehash()
|
|
@@ -216,8 +309,8 @@ class TestPoolWalletRpc:
|
|
|
216
309
|
assert status.current.relative_lock_height == 0
|
|
217
310
|
assert status.current.version == 1
|
|
218
311
|
# Check that config has been written properly
|
|
219
|
-
full_config:
|
|
220
|
-
pool_list:
|
|
312
|
+
full_config: dict[str, Any] = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
|
|
313
|
+
pool_list: list[dict[str, Any]] = full_config["pool"]["pool_list"]
|
|
221
314
|
assert len(pool_list) == 1
|
|
222
315
|
pool_config = pool_list[0]
|
|
223
316
|
assert (
|
|
@@ -240,7 +333,7 @@ class TestPoolWalletRpc:
|
|
|
240
333
|
fee: uint64,
|
|
241
334
|
self_hostname: str,
|
|
242
335
|
) -> None:
|
|
243
|
-
client, wallet_node, full_node_api,
|
|
336
|
+
client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
|
|
244
337
|
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
245
338
|
|
|
246
339
|
our_ph = await wallet.get_new_puzzlehash()
|
|
@@ -269,8 +362,8 @@ class TestPoolWalletRpc:
|
|
|
269
362
|
assert status.current.relative_lock_height == 10
|
|
270
363
|
assert status.current.version == 1
|
|
271
364
|
# Check that config has been written properly
|
|
272
|
-
full_config:
|
|
273
|
-
pool_list:
|
|
365
|
+
full_config: dict[str, Any] = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
|
|
366
|
+
pool_list: list[dict[str, Any]] = full_config["pool"]["pool_list"]
|
|
274
367
|
assert len(pool_list) == 1
|
|
275
368
|
pool_config = pool_list[0]
|
|
276
369
|
assert (
|
|
@@ -294,7 +387,7 @@ class TestPoolWalletRpc:
|
|
|
294
387
|
fee: uint64,
|
|
295
388
|
self_hostname: str,
|
|
296
389
|
) -> None:
|
|
297
|
-
client, wallet_node, full_node_api,
|
|
390
|
+
client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
|
|
298
391
|
|
|
299
392
|
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
300
393
|
|
|
@@ -333,7 +426,7 @@ class TestPoolWalletRpc:
|
|
|
333
426
|
assert status_3.current.state == PoolSingletonState.SELF_POOLING.value
|
|
334
427
|
|
|
335
428
|
full_config = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
|
|
336
|
-
pool_list:
|
|
429
|
+
pool_list: list[dict[str, Any]] = full_config["pool"]["pool_list"]
|
|
337
430
|
assert len(pool_list) == 2
|
|
338
431
|
|
|
339
432
|
assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
|
|
@@ -403,7 +496,7 @@ class TestPoolWalletRpc:
|
|
|
403
496
|
async def test_absorb_self(
|
|
404
497
|
self, one_wallet_node_and_rpc: OneWalletNodeAndRpc, fee: uint64, self_hostname: str
|
|
405
498
|
) -> None:
|
|
406
|
-
client, wallet_node, full_node_api,
|
|
499
|
+
client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
|
|
407
500
|
bt = full_node_api.bt
|
|
408
501
|
|
|
409
502
|
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
@@ -430,19 +523,28 @@ class TestPoolWalletRpc:
|
|
|
430
523
|
guarantee_transaction_block=True,
|
|
431
524
|
)
|
|
432
525
|
|
|
433
|
-
|
|
434
|
-
await full_node_api.full_node.add_block(block)
|
|
526
|
+
await add_blocks_in_batches(blocks[-3:], full_node_api.full_node)
|
|
435
527
|
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
436
528
|
|
|
437
529
|
bal = await client.get_wallet_balance(2)
|
|
438
530
|
assert bal["confirmed_wallet_balance"] == 2 * 1_750_000_000_000
|
|
439
531
|
|
|
440
532
|
# Claim 2 * 1.75, and farm a new 1.75
|
|
441
|
-
absorb_txs:
|
|
533
|
+
absorb_txs: list[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee)))["transactions"]
|
|
442
534
|
await full_node_api.wait_transaction_records_entered_mempool(records=absorb_txs)
|
|
443
535
|
await full_node_api.farm_blocks_to_puzzlehash(count=2, farm_to=our_ph, guarantee_transaction_blocks=True)
|
|
444
536
|
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
445
537
|
await full_node_api.check_transactions_confirmed(wallet_node.wallet_state_manager, absorb_txs)
|
|
538
|
+
assert (
|
|
539
|
+
len(
|
|
540
|
+
[
|
|
541
|
+
tx
|
|
542
|
+
for tx in await wallet_node.wallet_state_manager.tx_store.get_all_transactions()
|
|
543
|
+
if TransactionType(tx.type) is TransactionType.INCOMING_TX and tx.amount == 1_750_000_000_000
|
|
544
|
+
]
|
|
545
|
+
)
|
|
546
|
+
== 2
|
|
547
|
+
)
|
|
446
548
|
new_status: PoolWalletInfo = (await client.pw_status(2))[0]
|
|
447
549
|
assert status.current == new_status.current
|
|
448
550
|
assert status.tip_singleton_coin_id != new_status.tip_singleton_coin_id
|
|
@@ -450,7 +552,7 @@ class TestPoolWalletRpc:
|
|
|
450
552
|
assert bal["confirmed_wallet_balance"] == 1 * 1_750_000_000_000
|
|
451
553
|
|
|
452
554
|
# Claim another 1.75
|
|
453
|
-
absorb_txs1:
|
|
555
|
+
absorb_txs1: list[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee)))["transactions"]
|
|
454
556
|
|
|
455
557
|
await full_node_api.wait_transaction_records_entered_mempool(records=absorb_txs1)
|
|
456
558
|
|
|
@@ -520,8 +622,7 @@ class TestPoolWalletRpc:
|
|
|
520
622
|
)
|
|
521
623
|
|
|
522
624
|
block_count = 3
|
|
523
|
-
|
|
524
|
-
await full_node_api.full_node.add_block(block)
|
|
625
|
+
await add_blocks_in_batches(blocks[-block_count:], full_node_api.full_node)
|
|
525
626
|
await full_node_api.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
|
|
526
627
|
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
527
628
|
|
|
@@ -534,7 +635,7 @@ class TestPoolWalletRpc:
|
|
|
534
635
|
assert bal["confirmed_wallet_balance"] == pool_expected_confirmed_balance
|
|
535
636
|
|
|
536
637
|
# Claim
|
|
537
|
-
absorb_txs:
|
|
638
|
+
absorb_txs: list[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee), 1))["transactions"]
|
|
538
639
|
await full_node_api.process_transaction_records(records=absorb_txs)
|
|
539
640
|
main_expected_confirmed_balance -= fee
|
|
540
641
|
main_expected_confirmed_balance += 1_750_000_000_000
|
|
@@ -592,8 +693,7 @@ class TestPoolWalletRpc:
|
|
|
592
693
|
)
|
|
593
694
|
|
|
594
695
|
block_count = 3
|
|
595
|
-
|
|
596
|
-
await full_node_api.full_node.add_block(block)
|
|
696
|
+
await add_blocks_in_batches(blocks[-block_count:], full_node_api.full_node)
|
|
597
697
|
await full_node_api.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
|
|
598
698
|
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
599
699
|
# Pooled plots don't have balance
|
|
@@ -603,7 +703,7 @@ class TestPoolWalletRpc:
|
|
|
603
703
|
|
|
604
704
|
# Claim block_count * 1.75
|
|
605
705
|
ret = await client.pw_absorb_rewards(2, uint64(fee))
|
|
606
|
-
absorb_txs:
|
|
706
|
+
absorb_txs: list[TransactionRecord] = ret["transactions"]
|
|
607
707
|
if fee == 0:
|
|
608
708
|
assert ret["fee_transaction"] is None
|
|
609
709
|
else:
|
|
@@ -652,8 +752,7 @@ class TestPoolWalletRpc:
|
|
|
652
752
|
block_list_input=blocks,
|
|
653
753
|
guarantee_transaction_block=True,
|
|
654
754
|
)
|
|
655
|
-
|
|
656
|
-
await full_node_api.full_node.add_block(block)
|
|
755
|
+
await add_blocks_in_batches(blocks[-2:], full_node_api.full_node)
|
|
657
756
|
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
658
757
|
|
|
659
758
|
# Absorb the farmed reward
|
|
@@ -679,8 +778,8 @@ class TestPoolWalletRpc:
|
|
|
679
778
|
if fee != 0:
|
|
680
779
|
pytest.skip("need to fix this test for non-zero fees")
|
|
681
780
|
|
|
682
|
-
full_node_api, wallet_node, our_ph,
|
|
683
|
-
pool_ph = bytes32
|
|
781
|
+
full_node_api, wallet_node, our_ph, _total_block_rewards, client = setup
|
|
782
|
+
pool_ph = bytes32.zeros
|
|
684
783
|
|
|
685
784
|
assert wallet_node._wallet_state_manager is not None
|
|
686
785
|
|
|
@@ -715,7 +814,7 @@ class TestPoolWalletRpc:
|
|
|
715
814
|
assert status_2.target is None
|
|
716
815
|
|
|
717
816
|
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
718
|
-
join_pool:
|
|
817
|
+
join_pool: dict[str, Any] = await client.pw_join_pool(
|
|
719
818
|
wallet_id,
|
|
720
819
|
pool_ph,
|
|
721
820
|
"https://pool.example.com",
|
|
@@ -727,7 +826,7 @@ class TestPoolWalletRpc:
|
|
|
727
826
|
assert join_pool_tx is not None
|
|
728
827
|
await full_node_api.wait_transaction_records_entered_mempool(records=[join_pool_tx])
|
|
729
828
|
|
|
730
|
-
join_pool_2:
|
|
829
|
+
join_pool_2: dict[str, Any] = await client.pw_join_pool(
|
|
731
830
|
wallet_id_2, pool_ph, "https://pool.example.com", uint32(10), uint64(fee)
|
|
732
831
|
)
|
|
733
832
|
assert join_pool_2["success"]
|
|
@@ -760,8 +859,8 @@ class TestPoolWalletRpc:
|
|
|
760
859
|
@pytest.mark.anyio
|
|
761
860
|
async def test_leave_pool(self, setup: Setup, fee: uint64, self_hostname: str) -> None:
|
|
762
861
|
"""This tests self-pooling -> pooling -> escaping -> self pooling"""
|
|
763
|
-
full_node_api, wallet_node, our_ph,
|
|
764
|
-
pool_ph = bytes32
|
|
862
|
+
full_node_api, wallet_node, our_ph, _total_block_rewards, client = setup
|
|
863
|
+
pool_ph = bytes32.zeros
|
|
765
864
|
|
|
766
865
|
assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
|
|
767
866
|
|
|
@@ -820,7 +919,7 @@ class TestPoolWalletRpc:
|
|
|
820
919
|
|
|
821
920
|
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
822
921
|
|
|
823
|
-
leave_pool_tx:
|
|
922
|
+
leave_pool_tx: dict[str, Any] = await client.pw_self_pool(wallet_id, uint64(fee))
|
|
824
923
|
assert leave_pool_tx["transaction"].wallet_id == wallet_id
|
|
825
924
|
assert leave_pool_tx["transaction"].amount == 1
|
|
826
925
|
await full_node_api.wait_transaction_records_entered_mempool(records=leave_pool_tx["transactions"])
|
|
@@ -856,80 +955,95 @@ class TestPoolWalletRpc:
|
|
|
856
955
|
await time_out_assert(timeout=MAX_WAIT_SECS, function=status_is_self_pooling)
|
|
857
956
|
assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
|
|
858
957
|
|
|
958
|
+
@pytest.mark.parametrize(
|
|
959
|
+
"wallet_environments",
|
|
960
|
+
[
|
|
961
|
+
{
|
|
962
|
+
"num_environments": 1,
|
|
963
|
+
"blocks_needed": [10],
|
|
964
|
+
}
|
|
965
|
+
],
|
|
966
|
+
indirect=True,
|
|
967
|
+
)
|
|
859
968
|
@pytest.mark.anyio
|
|
860
|
-
async def test_change_pools(
|
|
969
|
+
async def test_change_pools(
|
|
970
|
+
self,
|
|
971
|
+
fee: uint64,
|
|
972
|
+
wallet_environments: WalletTestFramework,
|
|
973
|
+
) -> None:
|
|
861
974
|
"""This tests Pool A -> escaping -> Pool B"""
|
|
862
|
-
full_node_api, wallet_node, our_ph, total_block_rewards, client = setup
|
|
863
|
-
pool_a_ph = bytes32([0] * 32)
|
|
864
|
-
pool_b_ph = bytes32([0] * 32)
|
|
865
|
-
|
|
866
|
-
WAIT_SECS = 200
|
|
867
|
-
assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
|
|
868
|
-
|
|
869
|
-
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
870
|
-
|
|
871
|
-
creation_tx: TransactionRecord = await client.create_new_pool_wallet(
|
|
872
|
-
pool_a_ph, "https://pool-a.org", uint32(5), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", fee
|
|
873
|
-
)
|
|
874
|
-
|
|
875
|
-
await full_node_api.wait_transaction_records_entered_mempool(records=[creation_tx])
|
|
876
|
-
|
|
877
|
-
await full_node_api.farm_blocks_to_puzzlehash(count=6, farm_to=our_ph, guarantee_transaction_blocks=True)
|
|
878
|
-
assert not full_node_api.txs_in_mempool(txs=[creation_tx])
|
|
879
|
-
|
|
880
|
-
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
881
975
|
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
wallet_id: int = summaries_response[0]["id"]
|
|
885
|
-
status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
|
|
886
|
-
|
|
887
|
-
assert status.current.state == PoolSingletonState.FARMING_TO_POOL.value
|
|
888
|
-
assert status.target is None
|
|
889
|
-
|
|
890
|
-
async def status_is_farming_to_pool() -> bool:
|
|
891
|
-
await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
|
|
892
|
-
pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
|
|
893
|
-
return pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
|
|
976
|
+
wallet_state_manager: WalletStateManager = wallet_environments.environments[0].wallet_state_manager
|
|
977
|
+
wallet_rpc: WalletRpcClient = wallet_environments.environments[0].rpc_client
|
|
894
978
|
|
|
895
|
-
|
|
979
|
+
wallet_state_manager.config["reuse_public_key_for_change"][
|
|
980
|
+
str(wallet_state_manager.root_pubkey.get_fingerprint())
|
|
981
|
+
] = wallet_environments.tx_config.reuse_puzhash
|
|
896
982
|
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
assert pw_info.current.relative_lock_height == 5
|
|
983
|
+
# Create a farming plotnft to url http://pool.example.com
|
|
984
|
+
wallet_id = await create_new_plotnft(wallet_environments)
|
|
900
985
|
|
|
901
|
-
|
|
986
|
+
# Join a different pool
|
|
902
987
|
join_pool_tx: TransactionRecord = (
|
|
903
|
-
await
|
|
988
|
+
await wallet_rpc.pw_join_pool(
|
|
904
989
|
wallet_id,
|
|
905
|
-
|
|
990
|
+
bytes32.zeros,
|
|
906
991
|
"https://pool-b.org",
|
|
907
|
-
|
|
992
|
+
LOCK_HEIGHT,
|
|
908
993
|
uint64(fee),
|
|
909
994
|
)
|
|
910
995
|
)["transaction"]
|
|
911
996
|
assert join_pool_tx is not None
|
|
912
997
|
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
998
|
+
await wallet_environments.full_node.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
|
|
999
|
+
await verify_pool_state(wallet_rpc, wallet_id, PoolSingletonState.LEAVING_POOL)
|
|
1000
|
+
await wallet_environments.full_node.farm_blocks_to_puzzlehash(
|
|
1001
|
+
count=LOCK_HEIGHT + 2, guarantee_transaction_blocks=True
|
|
1002
|
+
)
|
|
1003
|
+
await wallet_environments.full_node.wait_for_wallet_synced(
|
|
1004
|
+
wallet_node=wallet_environments.environments[0].node, timeout=20
|
|
1005
|
+
)
|
|
917
1006
|
|
|
918
|
-
|
|
919
|
-
|
|
1007
|
+
async def farm_blocks_until_state(
|
|
1008
|
+
state: PoolSingletonState,
|
|
1009
|
+
wallet_rpc: WalletRpcClient,
|
|
1010
|
+
wallet_id: int,
|
|
1011
|
+
full_node: FullNodeSimulator,
|
|
1012
|
+
wallet_node: WalletNode,
|
|
1013
|
+
max_blocks: int = 10 * (LOCK_HEIGHT + 2),
|
|
1014
|
+
) -> bool:
|
|
1015
|
+
block_chunk = LOCK_HEIGHT + 2
|
|
1016
|
+
total_blocks_farmed = 0
|
|
1017
|
+
while total_blocks_farmed < max_blocks:
|
|
1018
|
+
await full_node.farm_blocks_to_puzzlehash(count=block_chunk, guarantee_transaction_blocks=True)
|
|
1019
|
+
total_blocks_farmed += block_chunk
|
|
1020
|
+
print(f"Checking state after {total_blocks_farmed} blocks")
|
|
1021
|
+
|
|
1022
|
+
await full_node.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
1023
|
+
pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(wallet_id))[0]
|
|
1024
|
+
if pw_status.current.state == state.value:
|
|
1025
|
+
return True
|
|
1026
|
+
return False
|
|
1027
|
+
|
|
1028
|
+
assert await farm_blocks_until_state(
|
|
1029
|
+
PoolSingletonState.FARMING_TO_POOL,
|
|
1030
|
+
wallet_rpc,
|
|
1031
|
+
wallet_id,
|
|
1032
|
+
wallet_environments.full_node,
|
|
1033
|
+
wallet_environments.environments[0].node,
|
|
1034
|
+
)
|
|
920
1035
|
|
|
921
|
-
await
|
|
922
|
-
|
|
923
|
-
assert
|
|
924
|
-
assert
|
|
925
|
-
assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
|
|
1036
|
+
pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(wallet_id))[0]
|
|
1037
|
+
assert pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
|
|
1038
|
+
assert pw_status.current.pool_url == "https://pool-b.org"
|
|
1039
|
+
assert pw_status.current.relative_lock_height == LOCK_HEIGHT
|
|
926
1040
|
|
|
927
1041
|
@pytest.mark.anyio
|
|
928
1042
|
async def test_change_pools_reorg(self, setup: Setup, fee: uint64, self_hostname: str) -> None:
|
|
929
1043
|
"""This tests Pool A -> escaping -> reorg -> escaping -> Pool B"""
|
|
930
|
-
full_node_api, wallet_node, our_ph,
|
|
931
|
-
pool_a_ph = bytes32
|
|
932
|
-
pool_b_ph = bytes32
|
|
1044
|
+
full_node_api, wallet_node, our_ph, _total_block_rewards, client = setup
|
|
1045
|
+
pool_a_ph = bytes32.zeros
|
|
1046
|
+
pool_b_ph = bytes32.zeros
|
|
933
1047
|
WAIT_SECS = 30
|
|
934
1048
|
|
|
935
1049
|
assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
|
|
@@ -965,7 +1079,7 @@ class TestPoolWalletRpc:
|
|
|
965
1079
|
assert pw_info.current.pool_url == "https://pool-a.org"
|
|
966
1080
|
assert pw_info.current.relative_lock_height == 5
|
|
967
1081
|
|
|
968
|
-
join_pool_txs:
|
|
1082
|
+
join_pool_txs: list[TransactionRecord] = (
|
|
969
1083
|
await client.pw_join_pool(
|
|
970
1084
|
wallet_id,
|
|
971
1085
|
pool_b_ph,
|
|
@@ -995,8 +1109,7 @@ class TestPoolWalletRpc:
|
|
|
995
1109
|
transaction_data=next(tx.spend_bundle for tx in join_pool_txs if tx.spend_bundle is not None),
|
|
996
1110
|
)
|
|
997
1111
|
|
|
998
|
-
|
|
999
|
-
await full_node_api.full_node.add_block(block)
|
|
1112
|
+
await add_blocks_in_batches(more_blocks[-3:], full_node_api.full_node)
|
|
1000
1113
|
|
|
1001
1114
|
await time_out_assert(timeout=WAIT_SECS, function=status_is_leaving_no_blocks)
|
|
1002
1115
|
|