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
|
@@ -2,17 +2,18 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import dataclasses
|
|
5
|
+
import io
|
|
5
6
|
import json
|
|
6
7
|
import logging
|
|
7
8
|
import random
|
|
8
9
|
from operator import attrgetter
|
|
9
|
-
from typing import Any,
|
|
10
|
+
from typing import Any, Optional, cast
|
|
11
|
+
from unittest.mock import patch
|
|
10
12
|
|
|
11
13
|
import aiosqlite
|
|
12
14
|
import pytest
|
|
13
15
|
from chia_rs import G1Element, G2Element
|
|
14
16
|
|
|
15
|
-
from chia._tests.conftest import ConsensusMode
|
|
16
17
|
from chia._tests.environments.wallet import WalletStateTransition, WalletTestFramework
|
|
17
18
|
from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none
|
|
18
19
|
from chia._tests.wallet.test_wallet_coin_store import (
|
|
@@ -41,6 +42,8 @@ from chia._tests.wallet.test_wallet_coin_store import (
|
|
|
41
42
|
record_8,
|
|
42
43
|
record_9,
|
|
43
44
|
)
|
|
45
|
+
from chia.cmds.coins import CombineCMD, SplitCMD
|
|
46
|
+
from chia.cmds.param_types import CliAmount
|
|
44
47
|
from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
|
|
45
48
|
from chia.consensus.coinbase import create_puzzlehash_for_pk
|
|
46
49
|
from chia.rpc.full_node_rpc_client import FullNodeRpcClient
|
|
@@ -55,9 +58,13 @@ from chia.rpc.wallet_request_types import (
|
|
|
55
58
|
DIDGetPubkey,
|
|
56
59
|
GetNotifications,
|
|
57
60
|
GetPrivateKey,
|
|
61
|
+
GetSyncStatusResponse,
|
|
62
|
+
GetTimestampForHeight,
|
|
58
63
|
LogIn,
|
|
64
|
+
PushTransactions,
|
|
65
|
+
PushTX,
|
|
66
|
+
SetWalletResyncOnStartup,
|
|
59
67
|
SplitCoins,
|
|
60
|
-
SplitCoinsResponse,
|
|
61
68
|
VerifySignature,
|
|
62
69
|
VerifySignatureResponse,
|
|
63
70
|
)
|
|
@@ -139,6 +146,10 @@ class WalletRpcTestEnvironment:
|
|
|
139
146
|
full_node: FullNodeBundle
|
|
140
147
|
|
|
141
148
|
|
|
149
|
+
async def check_client_synced(wallet_client: WalletRpcClient) -> bool:
|
|
150
|
+
return (await wallet_client.get_sync_status()).synced
|
|
151
|
+
|
|
152
|
+
|
|
142
153
|
async def farm_transaction_block(full_node_api: FullNodeSimulator, wallet_node: WalletNode):
|
|
143
154
|
await full_node_api.farm_blocks_to_puzzlehash(count=1)
|
|
144
155
|
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
@@ -174,7 +185,7 @@ async def generate_funds(full_node_api: FullNodeSimulator, wallet_bundle: Wallet
|
|
|
174
185
|
expected_unconfirmed = initial_balances["unconfirmed_wallet_balance"] + generated_funds
|
|
175
186
|
await time_out_assert(20, get_confirmed_balance, expected_confirmed, wallet_bundle.rpc_client, wallet_id)
|
|
176
187
|
await time_out_assert(20, get_unconfirmed_balance, expected_unconfirmed, wallet_bundle.rpc_client, wallet_id)
|
|
177
|
-
await time_out_assert(20, wallet_bundle.rpc_client
|
|
188
|
+
await time_out_assert(20, check_client_synced, True, wallet_bundle.rpc_client)
|
|
178
189
|
|
|
179
190
|
return generated_funds
|
|
180
191
|
|
|
@@ -224,7 +235,7 @@ async def wallet_rpc_environment(two_wallet_nodes_services, request, self_hostna
|
|
|
224
235
|
yield WalletRpcTestEnvironment(wallet_bundle_1, wallet_bundle_2, node_bundle)
|
|
225
236
|
|
|
226
237
|
|
|
227
|
-
async def create_tx_outputs(wallet: Wallet, output_args:
|
|
238
|
+
async def create_tx_outputs(wallet: Wallet, output_args: list[tuple[int, Optional[list[str]]]]) -> list[dict[str, Any]]:
|
|
228
239
|
outputs = []
|
|
229
240
|
for args in output_args:
|
|
230
241
|
output = {"amount": uint64(args[0]), "puzzle_hash": await wallet.get_new_puzzlehash()}
|
|
@@ -235,7 +246,7 @@ async def create_tx_outputs(wallet: Wallet, output_args: List[Tuple[int, Optiona
|
|
|
235
246
|
return outputs
|
|
236
247
|
|
|
237
248
|
|
|
238
|
-
async def assert_wallet_types(client: WalletRpcClient, expected:
|
|
249
|
+
async def assert_wallet_types(client: WalletRpcClient, expected: dict[WalletType, int]) -> None:
|
|
239
250
|
for wallet_type in WalletType:
|
|
240
251
|
wallets = await client.get_wallets(wallet_type)
|
|
241
252
|
wallet_count = len(wallets)
|
|
@@ -247,7 +258,7 @@ async def assert_wallet_types(client: WalletRpcClient, expected: Dict[WalletType
|
|
|
247
258
|
|
|
248
259
|
def assert_tx_amounts(
|
|
249
260
|
tx: TransactionRecord,
|
|
250
|
-
outputs:
|
|
261
|
+
outputs: list[dict[str, Any]],
|
|
251
262
|
*,
|
|
252
263
|
amount_fee: uint64,
|
|
253
264
|
change_expected: bool,
|
|
@@ -274,7 +285,7 @@ async def assert_push_tx_error(node_rpc: FullNodeRpcClient, tx: TransactionRecor
|
|
|
274
285
|
try:
|
|
275
286
|
await node_rpc.push_tx(spend_bundle)
|
|
276
287
|
except ValueError as error:
|
|
277
|
-
error_string = error.args[0]["error"]
|
|
288
|
+
error_string = error.args[0]["error"]
|
|
278
289
|
if error_string.find("ASSERT_ANNOUNCE_CONSUMED_FAILED") == -1:
|
|
279
290
|
raise ValueError from error
|
|
280
291
|
|
|
@@ -322,7 +333,7 @@ async def test_send_transaction(wallet_rpc_environment: WalletRpcTestEnvironment
|
|
|
322
333
|
|
|
323
334
|
# Tests sending a basic transaction
|
|
324
335
|
extra_conditions = (Remark(Program.to(("test", None))),)
|
|
325
|
-
non_existent_coin = Coin(bytes32
|
|
336
|
+
non_existent_coin = Coin(bytes32.zeros, bytes32.zeros, uint64(0))
|
|
326
337
|
tx_no_push = (
|
|
327
338
|
await client.send_transaction(
|
|
328
339
|
1,
|
|
@@ -379,7 +390,7 @@ async def test_send_transaction(wallet_rpc_environment: WalletRpcTestEnvironment
|
|
|
379
390
|
assert tx_confirmed.confirmed
|
|
380
391
|
assert len(tx_confirmed.get_memos()) == 1
|
|
381
392
|
assert [b"this is a basic tx"] in tx_confirmed.get_memos().values()
|
|
382
|
-
assert
|
|
393
|
+
assert next(iter(tx_confirmed.get_memos().keys())) in [a.name() for a in spend_bundle.additions()]
|
|
383
394
|
|
|
384
395
|
await time_out_assert(20, get_confirmed_balance, generated_funds - tx_amount, client, 1)
|
|
385
396
|
|
|
@@ -405,29 +416,30 @@ async def test_push_transactions(wallet_rpc_environment: WalletRpcTestEnvironmen
|
|
|
405
416
|
)
|
|
406
417
|
).signed_tx
|
|
407
418
|
|
|
408
|
-
resp_client = await client.push_transactions(
|
|
419
|
+
resp_client = await client.push_transactions(
|
|
420
|
+
PushTransactions(transactions=[tx], fee=uint64(10)),
|
|
421
|
+
DEFAULT_TX_CONFIG,
|
|
422
|
+
)
|
|
409
423
|
resp = await client.fetch(
|
|
410
424
|
"push_transactions", {"transactions": [tx.to_json_dict_convenience(wallet_node.config)], "fee": 10}
|
|
411
425
|
)
|
|
412
426
|
assert resp["success"]
|
|
413
|
-
resp = await client.fetch("push_transactions", {"transactions": [tx.
|
|
427
|
+
resp = await client.fetch("push_transactions", {"transactions": [bytes(tx).hex()], "fee": 10})
|
|
414
428
|
assert resp["success"]
|
|
415
429
|
|
|
416
430
|
spend_bundle = WalletSpendBundle.aggregate(
|
|
417
|
-
[
|
|
418
|
-
# We ARE checking that the spend bundle is not None but mypy can't recognize this
|
|
419
|
-
TransactionRecord.from_json_dict_convenience(tx).spend_bundle # type: ignore[type-var]
|
|
420
|
-
for tx in resp_client["transactions"]
|
|
421
|
-
if tx["spend_bundle"] is not None
|
|
422
|
-
]
|
|
431
|
+
[tx.spend_bundle for tx in resp_client.transactions if tx.spend_bundle is not None]
|
|
423
432
|
)
|
|
424
433
|
assert spend_bundle is not None
|
|
425
434
|
await farm_transaction(full_node_api, wallet_node, spend_bundle)
|
|
426
435
|
|
|
427
|
-
for
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
436
|
+
for tx in resp_client.transactions:
|
|
437
|
+
assert (await client.get_transaction(transaction_id=tx.name)).confirmed
|
|
438
|
+
|
|
439
|
+
# Just testing NOT failure here really (parsing)
|
|
440
|
+
await client.push_tx(PushTX(spend_bundle))
|
|
441
|
+
resp = await client.fetch("push_tx", {"spend_bundle": bytes(spend_bundle).hex()})
|
|
442
|
+
assert resp["success"]
|
|
431
443
|
|
|
432
444
|
|
|
433
445
|
@pytest.mark.anyio
|
|
@@ -461,7 +473,9 @@ async def test_get_farmed_amount(wallet_rpc_environment: WalletRpcTestEnvironmen
|
|
|
461
473
|
await full_node_api.farm_blocks_to_wallet(2, wallet)
|
|
462
474
|
|
|
463
475
|
get_farmed_amount_result = await wallet_rpc_client.get_farmed_amount()
|
|
464
|
-
get_timestamp_for_height_result = await wallet_rpc_client.get_timestamp_for_height(
|
|
476
|
+
get_timestamp_for_height_result = await wallet_rpc_client.get_timestamp_for_height(
|
|
477
|
+
GetTimestampForHeight(uint32(3))
|
|
478
|
+
) # genesis + 2
|
|
465
479
|
|
|
466
480
|
expected_result = {
|
|
467
481
|
"blocks_won": 2,
|
|
@@ -469,7 +483,7 @@ async def test_get_farmed_amount(wallet_rpc_environment: WalletRpcTestEnvironmen
|
|
|
469
483
|
"farmer_reward_amount": 500_000_000_000,
|
|
470
484
|
"fee_amount": 0,
|
|
471
485
|
"last_height_farmed": 3,
|
|
472
|
-
"last_time_farmed": get_timestamp_for_height_result,
|
|
486
|
+
"last_time_farmed": get_timestamp_for_height_result.timestamp,
|
|
473
487
|
"pool_reward_amount": 3_500_000_000_000,
|
|
474
488
|
"success": True,
|
|
475
489
|
}
|
|
@@ -490,7 +504,7 @@ async def test_get_farmed_amount_with_fee(wallet_rpc_environment: WalletRpcTestE
|
|
|
490
504
|
async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
491
505
|
await wallet.generate_signed_transaction(
|
|
492
506
|
amount=uint64(5),
|
|
493
|
-
puzzle_hash=bytes32
|
|
507
|
+
puzzle_hash=bytes32.zeros,
|
|
494
508
|
action_scope=action_scope,
|
|
495
509
|
fee=uint64(fee_amount),
|
|
496
510
|
)
|
|
@@ -513,8 +527,8 @@ async def test_get_timestamp_for_height(wallet_rpc_environment: WalletRpcTestEnv
|
|
|
513
527
|
|
|
514
528
|
await generate_funds(full_node_api, env.wallet_1)
|
|
515
529
|
|
|
516
|
-
# This tests that the client returns
|
|
517
|
-
|
|
530
|
+
# This tests that the client returns successfully, rather than raising or returning something unexpected
|
|
531
|
+
await client.get_timestamp_for_height(GetTimestampForHeight(uint32(1)))
|
|
518
532
|
|
|
519
533
|
|
|
520
534
|
@pytest.mark.parametrize(
|
|
@@ -536,7 +550,7 @@ async def test_get_timestamp_for_height(wallet_rpc_environment: WalletRpcTestEnv
|
|
|
536
550
|
@pytest.mark.anyio
|
|
537
551
|
async def test_create_signed_transaction(
|
|
538
552
|
wallet_rpc_environment: WalletRpcTestEnvironment,
|
|
539
|
-
output_args:
|
|
553
|
+
output_args: list[tuple[int, Optional[list[str]]]],
|
|
540
554
|
fee: int,
|
|
541
555
|
select_coin: bool,
|
|
542
556
|
is_cat: bool,
|
|
@@ -604,7 +618,7 @@ async def test_create_signed_transaction(
|
|
|
604
618
|
await time_out_assert(20, get_confirmed_balance, generated_funds - amount_total, wallet_1_rpc, wallet_id)
|
|
605
619
|
|
|
606
620
|
# Assert every coin comes from the same parent
|
|
607
|
-
additions:
|
|
621
|
+
additions: list[Coin] = spend_bundle.additions()
|
|
608
622
|
assert len({c.parent_coin_info for c in additions}) == 2 if is_cat else 1
|
|
609
623
|
|
|
610
624
|
# Assert you can get the spend for each addition
|
|
@@ -617,8 +631,8 @@ async def test_create_signed_transaction(
|
|
|
617
631
|
assert spend is not None
|
|
618
632
|
|
|
619
633
|
# Assert the memos are all correct
|
|
620
|
-
addition_dict:
|
|
621
|
-
memo_dictionary:
|
|
634
|
+
addition_dict: dict[bytes32, Coin] = {addition.name(): addition for addition in additions}
|
|
635
|
+
memo_dictionary: dict[bytes32, list[bytes]] = compute_memos(spend_bundle)
|
|
622
636
|
for output in outputs:
|
|
623
637
|
if "memos" in output:
|
|
624
638
|
found: bool = False
|
|
@@ -1044,7 +1058,7 @@ async def test_cat_endpoints(wallet_rpc_environment: WalletRpcTestEnvironment):
|
|
|
1044
1058
|
|
|
1045
1059
|
# Creates a CAT wallet with 100 mojos and a CAT with 20 mojos and fee=10
|
|
1046
1060
|
await client.create_new_cat_and_wallet(uint64(100), fee=uint64(10), test=True)
|
|
1047
|
-
await time_out_assert(20, client
|
|
1061
|
+
await time_out_assert(20, check_client_synced, True, client)
|
|
1048
1062
|
|
|
1049
1063
|
res = await client.create_new_cat_and_wallet(uint64(20), test=True)
|
|
1050
1064
|
assert res["success"]
|
|
@@ -1068,7 +1082,7 @@ async def test_cat_endpoints(wallet_rpc_environment: WalletRpcTestEnvironment):
|
|
|
1068
1082
|
wid, name = result
|
|
1069
1083
|
assert wid == cat_0_id
|
|
1070
1084
|
assert name == "My cat"
|
|
1071
|
-
result = await client.cat_asset_id_to_name(bytes32
|
|
1085
|
+
result = await client.cat_asset_id_to_name(bytes32.zeros)
|
|
1072
1086
|
assert result is None
|
|
1073
1087
|
verified_asset_id = next(iter(DEFAULT_CATS.items()))[1]["asset_id"]
|
|
1074
1088
|
result = await client.cat_asset_id_to_name(bytes32.from_hexstr(verified_asset_id))
|
|
@@ -1119,7 +1133,7 @@ async def test_cat_endpoints(wallet_rpc_environment: WalletRpcTestEnvironment):
|
|
|
1119
1133
|
cat_0_id,
|
|
1120
1134
|
DEFAULT_TX_CONFIG.override(
|
|
1121
1135
|
excluded_coin_amounts=[uint64(20)],
|
|
1122
|
-
excluded_coin_ids=[bytes32
|
|
1136
|
+
excluded_coin_ids=[bytes32.zeros],
|
|
1123
1137
|
),
|
|
1124
1138
|
uint64(4),
|
|
1125
1139
|
addr_1,
|
|
@@ -1217,7 +1231,7 @@ async def test_offer_endpoints(wallet_rpc_environment: WalletRpcTestEnvironment)
|
|
|
1217
1231
|
assert spend_bundle is not None
|
|
1218
1232
|
await farm_transaction(full_node_api, wallet_node, spend_bundle)
|
|
1219
1233
|
await time_out_assert(5, get_confirmed_balance, 4, wallet_2_rpc, cat_wallet_id)
|
|
1220
|
-
test_crs:
|
|
1234
|
+
test_crs: list[CoinRecord] = await wallet_1_rpc.get_coin_records_by_names(
|
|
1221
1235
|
[a.name() for a in spend_bundle.additions() if a.amount != 4]
|
|
1222
1236
|
)
|
|
1223
1237
|
for cr in test_crs:
|
|
@@ -1231,7 +1245,7 @@ async def test_offer_endpoints(wallet_rpc_environment: WalletRpcTestEnvironment)
|
|
|
1231
1245
|
all_offers = await wallet_1_rpc.get_all_offers()
|
|
1232
1246
|
assert len(all_offers) == 0
|
|
1233
1247
|
|
|
1234
|
-
driver_dict:
|
|
1248
|
+
driver_dict: dict[str, Any] = {cat_asset_id.hex(): {"type": "CAT", "tail": "0x" + cat_asset_id.hex()}}
|
|
1235
1249
|
|
|
1236
1250
|
create_res = await wallet_1_rpc.create_offer_for_ids(
|
|
1237
1251
|
{uint32(1): -5, cat_asset_id.hex(): 1},
|
|
@@ -1261,7 +1275,7 @@ async def test_offer_endpoints(wallet_rpc_environment: WalletRpcTestEnvironment)
|
|
|
1261
1275
|
}
|
|
1262
1276
|
assert advanced_summary == summary
|
|
1263
1277
|
|
|
1264
|
-
id,
|
|
1278
|
+
id, _valid = await wallet_1_rpc.check_offer_validity(offer)
|
|
1265
1279
|
assert id == offer.name()
|
|
1266
1280
|
|
|
1267
1281
|
all_offers = await wallet_1_rpc.get_all_offers(file_contents=True)
|
|
@@ -1412,7 +1426,7 @@ async def test_offer_endpoints(wallet_rpc_environment: WalletRpcTestEnvironment)
|
|
|
1412
1426
|
driver_dict=driver_dict,
|
|
1413
1427
|
)
|
|
1414
1428
|
assert len([o for o in await wallet_1_rpc.get_all_offers() if o.status == TradeStatus.PENDING_ACCEPT.value]) == 1
|
|
1415
|
-
await wallet_1_rpc.cancel_offers(DEFAULT_TX_CONFIG, asset_id=bytes32
|
|
1429
|
+
await wallet_1_rpc.cancel_offers(DEFAULT_TX_CONFIG, asset_id=bytes32.zeros)
|
|
1416
1430
|
assert len([o for o in await wallet_1_rpc.get_all_offers() if o.status == TradeStatus.PENDING_ACCEPT.value]) == 1
|
|
1417
1431
|
await wallet_1_rpc.cancel_offers(DEFAULT_TX_CONFIG, asset_id=cat_asset_id)
|
|
1418
1432
|
assert len([o for o in await wallet_1_rpc.get_all_offers() if o.status == TradeStatus.PENDING_ACCEPT.value]) == 0
|
|
@@ -1748,7 +1762,7 @@ async def test_key_and_address_endpoints(wallet_rpc_environment: WalletRpcTestEn
|
|
|
1748
1762
|
|
|
1749
1763
|
await generate_funds(env.full_node.api, env.wallet_1)
|
|
1750
1764
|
|
|
1751
|
-
assert (await client.get_height_info()) > 0
|
|
1765
|
+
assert (await client.get_height_info()).height > 0
|
|
1752
1766
|
|
|
1753
1767
|
ph = await wallet.get_new_puzzlehash()
|
|
1754
1768
|
addr = encode_puzzle_hash(ph, "txch")
|
|
@@ -1810,7 +1824,7 @@ async def test_key_and_address_endpoints(wallet_rpc_environment: WalletRpcTestEn
|
|
|
1810
1824
|
await client.log_in(LogIn(uint32(pks[1])))
|
|
1811
1825
|
assert len((await client.get_public_keys()).pk_fingerprints) == 1
|
|
1812
1826
|
|
|
1813
|
-
assert not (await client.get_sync_status())
|
|
1827
|
+
assert not (await client.get_sync_status()).synced
|
|
1814
1828
|
|
|
1815
1829
|
wallets = await client.get_wallets()
|
|
1816
1830
|
assert len(wallets) == 1
|
|
@@ -1837,8 +1851,8 @@ async def test_select_coins_rpc(wallet_rpc_environment: WalletRpcTestEnvironment
|
|
|
1837
1851
|
funds = await generate_funds(full_node_api, env.wallet_1)
|
|
1838
1852
|
|
|
1839
1853
|
addr = encode_puzzle_hash(await wallet_2.get_new_puzzlehash(), "txch")
|
|
1840
|
-
coin_300:
|
|
1841
|
-
tx_amounts:
|
|
1854
|
+
coin_300: list[Coin]
|
|
1855
|
+
tx_amounts: list[uint64] = [uint64(1000), uint64(300), uint64(1000), uint64(1000), uint64(10000)]
|
|
1842
1856
|
for tx_amount in tx_amounts:
|
|
1843
1857
|
funds -= tx_amount
|
|
1844
1858
|
# create coins for tests
|
|
@@ -1854,7 +1868,7 @@ async def test_select_coins_rpc(wallet_rpc_environment: WalletRpcTestEnvironment
|
|
|
1854
1868
|
await time_out_assert(20, get_confirmed_balance, funds, client, 1)
|
|
1855
1869
|
|
|
1856
1870
|
# test min coin amount
|
|
1857
|
-
min_coins:
|
|
1871
|
+
min_coins: list[Coin] = await client_2.select_coins(
|
|
1858
1872
|
amount=1000,
|
|
1859
1873
|
wallet_id=1,
|
|
1860
1874
|
coin_selection_config=DEFAULT_COIN_SELECTION_CONFIG.override(min_coin_amount=uint64(1001)),
|
|
@@ -1863,7 +1877,7 @@ async def test_select_coins_rpc(wallet_rpc_environment: WalletRpcTestEnvironment
|
|
|
1863
1877
|
assert len(min_coins) == 1 and min_coins[0].amount == uint64(10000)
|
|
1864
1878
|
|
|
1865
1879
|
# test max coin amount
|
|
1866
|
-
max_coins:
|
|
1880
|
+
max_coins: list[Coin] = await client_2.select_coins(
|
|
1867
1881
|
amount=2000,
|
|
1868
1882
|
wallet_id=1,
|
|
1869
1883
|
coin_selection_config=DEFAULT_COIN_SELECTION_CONFIG.override(
|
|
@@ -1875,7 +1889,7 @@ async def test_select_coins_rpc(wallet_rpc_environment: WalletRpcTestEnvironment
|
|
|
1875
1889
|
|
|
1876
1890
|
# test excluded coin amounts
|
|
1877
1891
|
non_1000_amt: int = sum(a for a in tx_amounts if a != 1000)
|
|
1878
|
-
excluded_amt_coins:
|
|
1892
|
+
excluded_amt_coins: list[Coin] = await client_2.select_coins(
|
|
1879
1893
|
amount=non_1000_amt,
|
|
1880
1894
|
wallet_id=1,
|
|
1881
1895
|
coin_selection_config=DEFAULT_COIN_SELECTION_CONFIG.override(excluded_coin_amounts=[uint64(1000)]),
|
|
@@ -1958,7 +1972,7 @@ async def test_get_coin_records_rpc(wallet_rpc_environment: WalletRpcTestEnviron
|
|
|
1958
1972
|
test_case: str,
|
|
1959
1973
|
test_request: GetCoinRecords,
|
|
1960
1974
|
test_total_count: Optional[int],
|
|
1961
|
-
test_records:
|
|
1975
|
+
test_records: list[WalletCoinRecord],
|
|
1962
1976
|
):
|
|
1963
1977
|
response = await client.get_coin_records(test_request)
|
|
1964
1978
|
assert response["coin_records"] == [coin.to_json_dict_parsed_metadata() for coin in test_records], test_case
|
|
@@ -2089,7 +2103,7 @@ async def test_get_coin_records_rpc_failures(
|
|
|
2089
2103
|
with pytest.raises(ValueError, match=name):
|
|
2090
2104
|
await client.get_coin_records(request)
|
|
2091
2105
|
|
|
2092
|
-
# Type validation is handled via `Streamable.from_json_dict
|
|
2106
|
+
# Type validation is handled via `Streamable.from_json_dict` but the below should make at least sure it triggers.
|
|
2093
2107
|
for field, value in {
|
|
2094
2108
|
"offset": "invalid",
|
|
2095
2109
|
"limit": "invalid",
|
|
@@ -2319,8 +2333,8 @@ async def test_notification_rpcs(wallet_rpc_environment: WalletRpcTestEnvironmen
|
|
|
2319
2333
|
@pytest.mark.limit_consensus_modes(reason="irrelevant")
|
|
2320
2334
|
async def test_verify_signature(
|
|
2321
2335
|
wallet_rpc_environment: WalletRpcTestEnvironment,
|
|
2322
|
-
rpc_request:
|
|
2323
|
-
rpc_response:
|
|
2336
|
+
rpc_request: dict[str, Any],
|
|
2337
|
+
rpc_response: dict[str, Any],
|
|
2324
2338
|
prefix_hex_strings: bool,
|
|
2325
2339
|
):
|
|
2326
2340
|
rpc_server: Optional[RpcServer] = wallet_rpc_environment.wallet_1.service.rpc_server
|
|
@@ -2386,7 +2400,7 @@ async def test_set_wallet_resync_on_startup(wallet_rpc_environment: WalletRpcTes
|
|
|
2386
2400
|
await wc.create_new_did_wallet(1, DEFAULT_TX_CONFIG, 0)
|
|
2387
2401
|
await time_out_assert(5, check_mempool_spend_count, True, full_node_api, 1)
|
|
2388
2402
|
await farm_transaction_block(full_node_api, env.wallet_1.node)
|
|
2389
|
-
await time_out_assert(20, wc
|
|
2403
|
+
await time_out_assert(20, check_client_synced, True, wc)
|
|
2390
2404
|
|
|
2391
2405
|
nft_wallet = await wc.create_new_nft_wallet(None)
|
|
2392
2406
|
nft_wallet_id = nft_wallet["wallet_id"]
|
|
@@ -2401,7 +2415,7 @@ async def test_set_wallet_resync_on_startup(wallet_rpc_environment: WalletRpcTes
|
|
|
2401
2415
|
)
|
|
2402
2416
|
await time_out_assert(5, check_mempool_spend_count, True, full_node_api, 1)
|
|
2403
2417
|
await farm_transaction_block(full_node_api, env.wallet_1.node)
|
|
2404
|
-
await time_out_assert(20, wc
|
|
2418
|
+
await time_out_assert(20, check_client_synced, True, wc)
|
|
2405
2419
|
|
|
2406
2420
|
wallet_node: WalletNode = env.wallet_1.node
|
|
2407
2421
|
wallet_node_2: WalletNode = env.wallet_2.node
|
|
@@ -2419,7 +2433,7 @@ async def test_set_wallet_resync_on_startup(wallet_rpc_environment: WalletRpcTes
|
|
|
2419
2433
|
clawback_coin_id = tx.additions[0].name()
|
|
2420
2434
|
assert tx.spend_bundle is not None
|
|
2421
2435
|
await farm_transaction(full_node_api, wallet_node, tx.spend_bundle)
|
|
2422
|
-
await time_out_assert(20, wc
|
|
2436
|
+
await time_out_assert(20, check_client_synced, True, wc)
|
|
2423
2437
|
await asyncio.sleep(10)
|
|
2424
2438
|
resp = await wc.spend_clawback_coins([clawback_coin_id], 0)
|
|
2425
2439
|
assert resp["success"]
|
|
@@ -2428,11 +2442,11 @@ async def test_set_wallet_resync_on_startup(wallet_rpc_environment: WalletRpcTes
|
|
|
2428
2442
|
10, full_node_api.full_node.mempool_manager.get_spendbundle, bytes32.from_hexstr(resp["transaction_ids"][0])
|
|
2429
2443
|
)
|
|
2430
2444
|
await farm_transaction_block(full_node_api, wallet_node)
|
|
2431
|
-
await time_out_assert(20, wc
|
|
2445
|
+
await time_out_assert(20, check_client_synced, True, wc)
|
|
2432
2446
|
wallet_node_2._close()
|
|
2433
2447
|
await wallet_node_2._await_closed()
|
|
2434
2448
|
# set flag to reset wallet sync data on start
|
|
2435
|
-
await client.set_wallet_resync_on_startup()
|
|
2449
|
+
await client.set_wallet_resync_on_startup(SetWalletResyncOnStartup())
|
|
2436
2450
|
fingerprint = wallet_node.logged_in_fingerprint
|
|
2437
2451
|
assert wallet_node._wallet_state_manager
|
|
2438
2452
|
# 2 reward coins, 1 DID, 1 NFT, 1 clawbacked coin
|
|
@@ -2484,12 +2498,12 @@ async def test_set_wallet_resync_on_startup_disable(wallet_rpc_environment: Wall
|
|
|
2484
2498
|
wallet_node_2._close()
|
|
2485
2499
|
await wallet_node_2._await_closed()
|
|
2486
2500
|
# set flag to reset wallet sync data on start
|
|
2487
|
-
await client.set_wallet_resync_on_startup()
|
|
2501
|
+
await client.set_wallet_resync_on_startup(SetWalletResyncOnStartup())
|
|
2488
2502
|
fingerprint = wallet_node.logged_in_fingerprint
|
|
2489
2503
|
assert wallet_node._wallet_state_manager
|
|
2490
2504
|
assert len(await wallet_node._wallet_state_manager.coin_store.get_all_unspent_coins()) == 2
|
|
2491
2505
|
before_txs = await wallet_node.wallet_state_manager.tx_store.get_all_transactions()
|
|
2492
|
-
await client.set_wallet_resync_on_startup(False)
|
|
2506
|
+
await client.set_wallet_resync_on_startup(SetWalletResyncOnStartup(False))
|
|
2493
2507
|
wallet_node._close()
|
|
2494
2508
|
await wallet_node._await_closed()
|
|
2495
2509
|
config = load_config(wallet_node.root_path, "config.yaml")
|
|
@@ -2625,16 +2639,16 @@ async def test_get_balances(wallet_rpc_environment: WalletRpcTestEnvironment):
|
|
|
2625
2639
|
|
|
2626
2640
|
await generate_funds(full_node_api, env.wallet_1, 1)
|
|
2627
2641
|
|
|
2628
|
-
await time_out_assert(20, client
|
|
2642
|
+
await time_out_assert(20, check_client_synced, True, client)
|
|
2629
2643
|
# Creates a CAT wallet with 100 mojos and a CAT with 20 mojos
|
|
2630
2644
|
await client.create_new_cat_and_wallet(uint64(100), test=True)
|
|
2631
2645
|
|
|
2632
|
-
await time_out_assert(20, client
|
|
2646
|
+
await time_out_assert(20, check_client_synced, True, client)
|
|
2633
2647
|
res = await client.create_new_cat_and_wallet(uint64(20), test=True)
|
|
2634
2648
|
assert res["success"]
|
|
2635
2649
|
await time_out_assert(5, check_mempool_spend_count, True, full_node_api, 2)
|
|
2636
2650
|
await farm_transaction_block(full_node_api, wallet_node)
|
|
2637
|
-
await time_out_assert(20, client
|
|
2651
|
+
await time_out_assert(20, check_client_synced, True, client)
|
|
2638
2652
|
bal = await client.get_wallet_balances()
|
|
2639
2653
|
assert len(bal) == 3
|
|
2640
2654
|
assert bal["1"]["confirmed_wallet_balance"] == 1999999999880
|
|
@@ -2656,9 +2670,9 @@ async def test_get_balances(wallet_rpc_environment: WalletRpcTestEnvironment):
|
|
|
2656
2670
|
],
|
|
2657
2671
|
indirect=True,
|
|
2658
2672
|
)
|
|
2659
|
-
@pytest.mark.limit_consensus_modes(
|
|
2673
|
+
@pytest.mark.limit_consensus_modes(reason="irrelevant")
|
|
2660
2674
|
@pytest.mark.anyio
|
|
2661
|
-
async def test_split_coins(wallet_environments: WalletTestFramework) -> None:
|
|
2675
|
+
async def test_split_coins(wallet_environments: WalletTestFramework, capsys: pytest.CaptureFixture[str]) -> None:
|
|
2662
2676
|
env = wallet_environments.environments[0]
|
|
2663
2677
|
env.wallet_aliases = {
|
|
2664
2678
|
"xch": 1,
|
|
@@ -2667,60 +2681,62 @@ async def test_split_coins(wallet_environments: WalletTestFramework) -> None:
|
|
|
2667
2681
|
|
|
2668
2682
|
# Test XCH first
|
|
2669
2683
|
async with env.wallet_state_manager.new_action_scope(wallet_environments.tx_config) as action_scope:
|
|
2670
|
-
target_coin =
|
|
2684
|
+
target_coin = next(iter(await env.xch_wallet.select_coins(uint64(250_000_000_000), action_scope)))
|
|
2671
2685
|
assert target_coin.amount == 250_000_000_000
|
|
2672
2686
|
|
|
2673
|
-
xch_request =
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2687
|
+
xch_request = SplitCMD(
|
|
2688
|
+
**{
|
|
2689
|
+
**wallet_environments.cmd_tx_endpoint_args(env),
|
|
2690
|
+
**dict(
|
|
2691
|
+
id=env.wallet_aliases["xch"],
|
|
2692
|
+
number_of_coins=100,
|
|
2693
|
+
amount_per_coin=CliAmount(amount=uint64(100), mojos=True),
|
|
2694
|
+
target_coin_id=target_coin.name(),
|
|
2695
|
+
fee=uint64(1_000_000_000_000), # 1 XCH
|
|
2696
|
+
push=True,
|
|
2697
|
+
),
|
|
2698
|
+
}
|
|
2680
2699
|
)
|
|
2681
2700
|
|
|
2682
2701
|
with pytest.raises(ResponseFailureError, match="501 coins is greater then the maximum limit of 500 coins"):
|
|
2683
|
-
await
|
|
2684
|
-
dataclasses.replace(xch_request, number_of_coins=uint16(501)),
|
|
2685
|
-
wallet_environments.tx_config,
|
|
2686
|
-
)
|
|
2702
|
+
await dataclasses.replace(xch_request, number_of_coins=501).run()
|
|
2687
2703
|
|
|
2688
2704
|
with pytest.raises(ResponseFailureError, match="Could not find coin with ID 00000000000000000"):
|
|
2689
|
-
await
|
|
2690
|
-
dataclasses.replace(xch_request, target_coin_id=bytes32([0] * 32)),
|
|
2691
|
-
wallet_environments.tx_config,
|
|
2692
|
-
)
|
|
2705
|
+
await dataclasses.replace(xch_request, target_coin_id=bytes32.zeros).run()
|
|
2693
2706
|
|
|
2694
2707
|
with pytest.raises(ResponseFailureError, match="is less than the total amount of the split"):
|
|
2695
|
-
await
|
|
2696
|
-
|
|
2697
|
-
|
|
2698
|
-
)
|
|
2708
|
+
await dataclasses.replace(
|
|
2709
|
+
xch_request, amount_per_coin=CliAmount(amount=uint64(1_000_000_000_000), mojos=True)
|
|
2710
|
+
).run()
|
|
2699
2711
|
|
|
2700
|
-
|
|
2701
|
-
|
|
2702
|
-
|
|
2703
|
-
|
|
2704
|
-
|
|
2712
|
+
# We catch this one
|
|
2713
|
+
capsys.readouterr()
|
|
2714
|
+
await dataclasses.replace(xch_request, id=50).run()
|
|
2715
|
+
output = (capsys.readouterr()).out
|
|
2716
|
+
assert "Wallet id: 50 not found" in output
|
|
2705
2717
|
|
|
2718
|
+
# This one only "works" on the RPC
|
|
2706
2719
|
env.wallet_state_manager.wallets[uint32(42)] = object() # type: ignore[assignment]
|
|
2707
2720
|
with pytest.raises(ResponseFailureError, match="Cannot split coins from non-fungible wallet types"):
|
|
2708
|
-
|
|
2709
|
-
|
|
2710
|
-
|
|
2721
|
+
assert xch_request.amount_per_coin is not None # hey there mypy
|
|
2722
|
+
rpc_request = SplitCoins(
|
|
2723
|
+
wallet_id=uint32(42),
|
|
2724
|
+
number_of_coins=uint16(xch_request.number_of_coins),
|
|
2725
|
+
amount_per_coin=xch_request.amount_per_coin.convert_amount(1),
|
|
2726
|
+
target_coin_id=xch_request.target_coin_id,
|
|
2727
|
+
fee=xch_request.fee,
|
|
2728
|
+
push=xch_request.push,
|
|
2711
2729
|
)
|
|
2730
|
+
await env.rpc_client.split_coins(rpc_request, wallet_environments.tx_config)
|
|
2731
|
+
|
|
2712
2732
|
del env.wallet_state_manager.wallets[uint32(42)]
|
|
2713
2733
|
|
|
2714
|
-
|
|
2715
|
-
|
|
2716
|
-
|
|
2717
|
-
)
|
|
2718
|
-
assert response == SplitCoinsResponse([], [])
|
|
2734
|
+
await dataclasses.replace(xch_request, number_of_coins=0).run()
|
|
2735
|
+
output = (capsys.readouterr()).out
|
|
2736
|
+
assert "Transaction sent" not in output
|
|
2719
2737
|
|
|
2720
|
-
|
|
2721
|
-
xch_request
|
|
2722
|
-
wallet_environments.tx_config,
|
|
2723
|
-
)
|
|
2738
|
+
with wallet_environments.new_puzzle_hashes_allowed():
|
|
2739
|
+
await xch_request.run()
|
|
2724
2740
|
|
|
2725
2741
|
await wallet_environments.process_pending_states(
|
|
2726
2742
|
[
|
|
@@ -2775,21 +2791,24 @@ async def test_split_coins(wallet_environments: WalletTestFramework) -> None:
|
|
|
2775
2791
|
)
|
|
2776
2792
|
|
|
2777
2793
|
async with env.wallet_state_manager.new_action_scope(wallet_environments.tx_config) as action_scope:
|
|
2778
|
-
target_coin =
|
|
2794
|
+
target_coin = next(iter(await cat_wallet.select_coins(uint64(50), action_scope)))
|
|
2779
2795
|
assert target_coin.amount == 50
|
|
2780
2796
|
|
|
2781
|
-
cat_request =
|
|
2782
|
-
|
|
2783
|
-
|
|
2784
|
-
|
|
2785
|
-
|
|
2786
|
-
|
|
2797
|
+
cat_request = SplitCMD(
|
|
2798
|
+
**{
|
|
2799
|
+
**wallet_environments.cmd_tx_endpoint_args(env),
|
|
2800
|
+
**dict(
|
|
2801
|
+
id=env.wallet_aliases["cat"],
|
|
2802
|
+
number_of_coins=50,
|
|
2803
|
+
amount_per_coin=CliAmount(amount=uint64(1), mojos=True),
|
|
2804
|
+
target_coin_id=target_coin.name(),
|
|
2805
|
+
push=True,
|
|
2806
|
+
),
|
|
2807
|
+
}
|
|
2787
2808
|
)
|
|
2788
2809
|
|
|
2789
|
-
|
|
2790
|
-
cat_request
|
|
2791
|
-
wallet_environments.tx_config,
|
|
2792
|
-
)
|
|
2810
|
+
with wallet_environments.new_puzzle_hashes_allowed():
|
|
2811
|
+
await dataclasses.replace(cat_request).run()
|
|
2793
2812
|
|
|
2794
2813
|
await wallet_environments.process_pending_states(
|
|
2795
2814
|
[
|
|
@@ -2817,6 +2836,17 @@ async def test_split_coins(wallet_environments: WalletTestFramework) -> None:
|
|
|
2817
2836
|
]
|
|
2818
2837
|
)
|
|
2819
2838
|
|
|
2839
|
+
# Test a not synced error
|
|
2840
|
+
assert xch_request.rpc_info.client_info is not None
|
|
2841
|
+
|
|
2842
|
+
async def not_synced() -> GetSyncStatusResponse:
|
|
2843
|
+
return GetSyncStatusResponse(False, False)
|
|
2844
|
+
|
|
2845
|
+
xch_request.rpc_info.client_info.client.get_sync_status = not_synced # type: ignore[method-assign]
|
|
2846
|
+
await xch_request.run()
|
|
2847
|
+
output = (capsys.readouterr()).out
|
|
2848
|
+
assert "Wallet not synced. Please wait." in output
|
|
2849
|
+
|
|
2820
2850
|
|
|
2821
2851
|
@pytest.mark.parametrize(
|
|
2822
2852
|
"wallet_environments",
|
|
@@ -2828,9 +2858,9 @@ async def test_split_coins(wallet_environments: WalletTestFramework) -> None:
|
|
|
2828
2858
|
],
|
|
2829
2859
|
indirect=True,
|
|
2830
2860
|
)
|
|
2831
|
-
@pytest.mark.limit_consensus_modes(
|
|
2861
|
+
@pytest.mark.limit_consensus_modes(reason="irrelevant")
|
|
2832
2862
|
@pytest.mark.anyio
|
|
2833
|
-
async def test_combine_coins(wallet_environments: WalletTestFramework) -> None:
|
|
2863
|
+
async def test_combine_coins(wallet_environments: WalletTestFramework, capsys: pytest.CaptureFixture[str]) -> None:
|
|
2834
2864
|
env = wallet_environments.environments[0]
|
|
2835
2865
|
env.wallet_aliases = {
|
|
2836
2866
|
"xch": 1,
|
|
@@ -2841,7 +2871,7 @@ async def test_combine_coins(wallet_environments: WalletTestFramework) -> None:
|
|
|
2841
2871
|
|
|
2842
2872
|
# Grab one of the 0.25 ones to specify
|
|
2843
2873
|
async with env.wallet_state_manager.new_action_scope(wallet_environments.tx_config) as action_scope:
|
|
2844
|
-
target_coin =
|
|
2874
|
+
target_coin = next(iter(await env.xch_wallet.select_coins(uint64(250_000_000_000), action_scope)))
|
|
2845
2875
|
assert target_coin.amount == 250_000_000_000
|
|
2846
2876
|
|
|
2847
2877
|
# These parameters will give us the maximum amount of behavior coverage
|
|
@@ -2849,53 +2879,55 @@ async def test_combine_coins(wallet_environments: WalletTestFramework) -> None:
|
|
|
2849
2879
|
# - Less amount than will have to be selected in order create it
|
|
2850
2880
|
# - Higher # coins than necessary to create it
|
|
2851
2881
|
fee = uint64(100)
|
|
2852
|
-
xch_combine_request =
|
|
2853
|
-
|
|
2854
|
-
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
2858
|
-
|
|
2882
|
+
xch_combine_request = CombineCMD(
|
|
2883
|
+
**{
|
|
2884
|
+
**wallet_environments.cmd_tx_endpoint_args(env),
|
|
2885
|
+
**dict(
|
|
2886
|
+
id=env.wallet_aliases["xch"],
|
|
2887
|
+
target_amount=CliAmount(amount=uint64(1_000_000_000_000), mojos=True),
|
|
2888
|
+
number_of_coins=uint16(3),
|
|
2889
|
+
input_coins=(target_coin.name(),),
|
|
2890
|
+
fee=fee,
|
|
2891
|
+
push=True,
|
|
2892
|
+
),
|
|
2893
|
+
}
|
|
2859
2894
|
)
|
|
2860
2895
|
|
|
2861
2896
|
# Test some error cases first
|
|
2862
2897
|
with pytest.raises(ResponseFailureError, match="greater then the maximum limit"):
|
|
2863
|
-
await
|
|
2864
|
-
dataclasses.replace(xch_combine_request, number_of_coins=uint16(501)),
|
|
2865
|
-
wallet_environments.tx_config,
|
|
2866
|
-
)
|
|
2898
|
+
await dataclasses.replace(xch_combine_request, number_of_coins=uint16(501)).run()
|
|
2867
2899
|
|
|
2868
2900
|
with pytest.raises(ResponseFailureError, match="You need at least two coins to combine"):
|
|
2869
|
-
await
|
|
2870
|
-
dataclasses.replace(xch_combine_request, number_of_coins=uint16(0)),
|
|
2871
|
-
wallet_environments.tx_config,
|
|
2872
|
-
)
|
|
2901
|
+
await dataclasses.replace(xch_combine_request, number_of_coins=uint16(0)).run()
|
|
2873
2902
|
|
|
2874
2903
|
with pytest.raises(ResponseFailureError, match="More coin IDs specified than desired number of coins to combine"):
|
|
2875
|
-
await
|
|
2876
|
-
dataclasses.replace(xch_combine_request, target_coin_ids=[bytes32([0] * 32)] * 100),
|
|
2877
|
-
wallet_environments.tx_config,
|
|
2878
|
-
)
|
|
2904
|
+
await dataclasses.replace(xch_combine_request, input_coins=(bytes32.zeros,) * 100).run()
|
|
2879
2905
|
|
|
2880
|
-
|
|
2881
|
-
|
|
2882
|
-
|
|
2883
|
-
|
|
2884
|
-
|
|
2906
|
+
# We catch this one
|
|
2907
|
+
capsys.readouterr()
|
|
2908
|
+
await dataclasses.replace(xch_combine_request, id=50).run()
|
|
2909
|
+
output = (capsys.readouterr()).out
|
|
2910
|
+
assert "Wallet id: 50 not found" in output
|
|
2885
2911
|
|
|
2912
|
+
# This one only "works" on the RPC
|
|
2886
2913
|
env.wallet_state_manager.wallets[uint32(42)] = object() # type: ignore[assignment]
|
|
2887
2914
|
with pytest.raises(ResponseFailureError, match="Cannot combine coins from non-fungible wallet types"):
|
|
2888
|
-
|
|
2889
|
-
|
|
2890
|
-
|
|
2915
|
+
assert xch_combine_request.target_amount is not None # hey there mypy
|
|
2916
|
+
rpc_request = CombineCoins(
|
|
2917
|
+
wallet_id=uint32(42),
|
|
2918
|
+
target_coin_amount=xch_combine_request.target_amount.convert_amount(1),
|
|
2919
|
+
number_of_coins=uint16(xch_combine_request.number_of_coins),
|
|
2920
|
+
target_coin_ids=list(xch_combine_request.input_coins),
|
|
2921
|
+
fee=xch_combine_request.fee,
|
|
2922
|
+
push=xch_combine_request.push,
|
|
2891
2923
|
)
|
|
2924
|
+
await env.rpc_client.combine_coins(rpc_request, wallet_environments.tx_config)
|
|
2925
|
+
|
|
2892
2926
|
del env.wallet_state_manager.wallets[uint32(42)]
|
|
2893
2927
|
|
|
2894
2928
|
# Now push the request
|
|
2895
|
-
|
|
2896
|
-
xch_combine_request
|
|
2897
|
-
wallet_environments.tx_config,
|
|
2898
|
-
)
|
|
2929
|
+
with patch("sys.stdin", new=io.StringIO("y\n")):
|
|
2930
|
+
await xch_combine_request.run()
|
|
2899
2931
|
|
|
2900
2932
|
await wallet_environments.process_pending_states(
|
|
2901
2933
|
[
|
|
@@ -2955,7 +2987,7 @@ async def test_combine_coins(wallet_environments: WalletTestFramework) -> None:
|
|
|
2955
2987
|
async with env.wallet_state_manager.new_action_scope(wallet_environments.tx_config, push=True) as action_scope:
|
|
2956
2988
|
await cat_wallet.generate_signed_transaction(
|
|
2957
2989
|
[BIG_COIN_AMOUNT, SMALL_COIN_AMOUNT, REALLY_SMALL_COIN_AMOUNT],
|
|
2958
|
-
[await env.xch_wallet.get_puzzle_hash(new=action_scope.config.tx_config.reuse_puzhash)] * 3,
|
|
2990
|
+
[await env.xch_wallet.get_puzzle_hash(new=not action_scope.config.tx_config.reuse_puzhash)] * 3,
|
|
2959
2991
|
action_scope,
|
|
2960
2992
|
)
|
|
2961
2993
|
|
|
@@ -2976,20 +3008,23 @@ async def test_combine_coins(wallet_environments: WalletTestFramework) -> None:
|
|
|
2976
3008
|
)
|
|
2977
3009
|
|
|
2978
3010
|
# We're going to test that we select the two smaller coins
|
|
2979
|
-
cat_combine_request =
|
|
2980
|
-
|
|
2981
|
-
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
|
|
2985
|
-
|
|
2986
|
-
|
|
3011
|
+
cat_combine_request = CombineCMD(
|
|
3012
|
+
**{
|
|
3013
|
+
**wallet_environments.cmd_tx_endpoint_args(env),
|
|
3014
|
+
**dict(
|
|
3015
|
+
id=env.wallet_aliases["cat"],
|
|
3016
|
+
target_amount=None,
|
|
3017
|
+
number_of_coins=uint16(2),
|
|
3018
|
+
input_coins=(),
|
|
3019
|
+
largest_first=False,
|
|
3020
|
+
fee=fee,
|
|
3021
|
+
push=True,
|
|
3022
|
+
),
|
|
3023
|
+
}
|
|
2987
3024
|
)
|
|
2988
3025
|
|
|
2989
|
-
|
|
2990
|
-
cat_combine_request
|
|
2991
|
-
wallet_environments.tx_config,
|
|
2992
|
-
)
|
|
3026
|
+
with patch("sys.stdin", new=io.StringIO("y\n")):
|
|
3027
|
+
await cat_combine_request.run()
|
|
2993
3028
|
|
|
2994
3029
|
await wallet_environments.process_pending_states(
|
|
2995
3030
|
[
|
|
@@ -3023,6 +3058,17 @@ async def test_combine_coins(wallet_environments: WalletTestFramework) -> None:
|
|
|
3023
3058
|
]
|
|
3024
3059
|
)
|
|
3025
3060
|
|
|
3061
|
+
# Test a not synced error
|
|
3062
|
+
assert xch_combine_request.rpc_info.client_info is not None
|
|
3063
|
+
|
|
3064
|
+
async def not_synced() -> GetSyncStatusResponse:
|
|
3065
|
+
return GetSyncStatusResponse(False, False)
|
|
3066
|
+
|
|
3067
|
+
xch_combine_request.rpc_info.client_info.client.get_sync_status = not_synced # type: ignore[method-assign]
|
|
3068
|
+
await xch_combine_request.run()
|
|
3069
|
+
output = (capsys.readouterr()).out
|
|
3070
|
+
assert "Wallet not synced. Please wait." in output
|
|
3071
|
+
|
|
3026
3072
|
|
|
3027
3073
|
@pytest.mark.parametrize(
|
|
3028
3074
|
"wallet_environments",
|
|
@@ -3053,31 +3099,32 @@ async def test_fee_bigger_than_selection_coin_combining(wallet_environments: Wal
|
|
|
3053
3099
|
|
|
3054
3100
|
# Grab one of the 0.25 ones to specify
|
|
3055
3101
|
async with env.wallet_state_manager.new_action_scope(wallet_environments.tx_config) as action_scope:
|
|
3056
|
-
target_coin =
|
|
3102
|
+
target_coin = next(iter(await env.xch_wallet.select_coins(uint64(250_000_000_000), action_scope)))
|
|
3057
3103
|
assert target_coin.amount == 250_000_000_000
|
|
3058
3104
|
|
|
3059
3105
|
fee = uint64(1_750_000_000_000)
|
|
3060
3106
|
# Under standard circumstances we would select the small coins, but this is not enough to pay the fee
|
|
3061
3107
|
# Instead, we will grab the big coin first and combine it with one of the smaller coins
|
|
3062
|
-
xch_combine_request =
|
|
3063
|
-
|
|
3064
|
-
|
|
3065
|
-
|
|
3066
|
-
|
|
3067
|
-
|
|
3108
|
+
xch_combine_request = CombineCMD(
|
|
3109
|
+
**{
|
|
3110
|
+
**wallet_environments.cmd_tx_endpoint_args(env),
|
|
3111
|
+
**dict(
|
|
3112
|
+
id=env.wallet_aliases["xch"],
|
|
3113
|
+
number_of_coins=uint16(2),
|
|
3114
|
+
input_coins=(),
|
|
3115
|
+
fee=fee,
|
|
3116
|
+
push=True,
|
|
3117
|
+
largest_first=False,
|
|
3118
|
+
),
|
|
3119
|
+
}
|
|
3068
3120
|
)
|
|
3069
3121
|
|
|
3070
3122
|
# First test an error where fee selection causes too many coins to be selected
|
|
3071
3123
|
with pytest.raises(ResponseFailureError, match="without selecting more coins than specified: 3"):
|
|
3072
|
-
await
|
|
3073
|
-
dataclasses.replace(xch_combine_request, fee=uint64(2_250_000_000_000)),
|
|
3074
|
-
wallet_environments.tx_config,
|
|
3075
|
-
)
|
|
3124
|
+
await dataclasses.replace(xch_combine_request, fee=uint64(2_250_000_000_000)).run()
|
|
3076
3125
|
|
|
3077
|
-
|
|
3078
|
-
xch_combine_request
|
|
3079
|
-
wallet_environments.tx_config,
|
|
3080
|
-
)
|
|
3126
|
+
with patch("sys.stdin", new=io.StringIO("y\n")):
|
|
3127
|
+
await xch_combine_request.run()
|
|
3081
3128
|
|
|
3082
3129
|
await wallet_environments.process_pending_states(
|
|
3083
3130
|
[
|