chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
chia/cmds/cmds_util.py
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import contextlib
|
|
3
4
|
import dataclasses
|
|
4
5
|
import logging
|
|
5
6
|
import traceback
|
|
7
|
+
from collections.abc import AsyncIterator
|
|
6
8
|
from contextlib import asynccontextmanager
|
|
7
9
|
from pathlib import Path
|
|
8
|
-
from typing import Any,
|
|
10
|
+
from typing import Any, Callable, Optional, TypeVar
|
|
9
11
|
|
|
10
12
|
import click
|
|
11
13
|
from aiohttp import ClientConnectorCertificateError, ClientConnectorError
|
|
@@ -24,7 +26,6 @@ from chia.simulator.simulator_full_node_rpc_client import SimulatorFullNodeRpcCl
|
|
|
24
26
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
25
27
|
from chia.types.mempool_submission_status import MempoolSubmissionStatus
|
|
26
28
|
from chia.util.config import load_config
|
|
27
|
-
from chia.util.default_root import DEFAULT_ROOT_PATH
|
|
28
29
|
from chia.util.errors import CliRpcConnectionError, InvalidPathError
|
|
29
30
|
from chia.util.ints import uint16, uint32, uint64
|
|
30
31
|
from chia.util.keychain import KeyData
|
|
@@ -33,7 +34,7 @@ from chia.wallet.conditions import ConditionValidTimes
|
|
|
33
34
|
from chia.wallet.transaction_record import TransactionRecord
|
|
34
35
|
from chia.wallet.util.tx_config import CoinSelectionConfig, CoinSelectionConfigLoader, TXConfig, TXConfigLoader
|
|
35
36
|
|
|
36
|
-
NODE_TYPES:
|
|
37
|
+
NODE_TYPES: dict[str, type[RpcClient]] = {
|
|
37
38
|
"base": RpcClient,
|
|
38
39
|
"farmer": FarmerRpcClient,
|
|
39
40
|
"wallet": WalletRpcClient,
|
|
@@ -43,7 +44,7 @@ NODE_TYPES: Dict[str, Type[RpcClient]] = {
|
|
|
43
44
|
"simulator": SimulatorFullNodeRpcClient,
|
|
44
45
|
}
|
|
45
46
|
|
|
46
|
-
node_config_section_names:
|
|
47
|
+
node_config_section_names: dict[type[RpcClient], str] = {
|
|
47
48
|
RpcClient: "base",
|
|
48
49
|
FarmerRpcClient: "farmer",
|
|
49
50
|
WalletRpcClient: "wallet",
|
|
@@ -92,21 +93,18 @@ async def validate_client_connection(
|
|
|
92
93
|
|
|
93
94
|
@asynccontextmanager
|
|
94
95
|
async def get_any_service_client(
|
|
95
|
-
client_type:
|
|
96
|
+
client_type: type[_T_RpcClient],
|
|
97
|
+
root_path: Path,
|
|
96
98
|
rpc_port: Optional[int] = None,
|
|
97
|
-
root_path: Optional[Path] = None,
|
|
98
99
|
consume_errors: bool = True,
|
|
99
100
|
use_ssl: bool = True,
|
|
100
|
-
) -> AsyncIterator[
|
|
101
|
+
) -> AsyncIterator[tuple[_T_RpcClient, dict[str, Any]]]:
|
|
101
102
|
"""
|
|
102
103
|
Yields a tuple with a RpcClient for the applicable node type a dictionary of the node's configuration,
|
|
103
104
|
and a fingerprint if applicable. However, if connecting to the node fails then we will return None for
|
|
104
105
|
the RpcClient.
|
|
105
106
|
"""
|
|
106
107
|
|
|
107
|
-
if root_path is None:
|
|
108
|
-
root_path = DEFAULT_ROOT_PATH
|
|
109
|
-
|
|
110
108
|
node_type = node_config_section_names.get(client_type)
|
|
111
109
|
if node_type is None:
|
|
112
110
|
# Click already checks this, so this should never happen
|
|
@@ -116,42 +114,44 @@ async def get_any_service_client(
|
|
|
116
114
|
self_hostname = config["self_hostname"]
|
|
117
115
|
if rpc_port is None:
|
|
118
116
|
rpc_port = config[node_type]["rpc_port"]
|
|
119
|
-
# select node client type based on string
|
|
120
|
-
if use_ssl:
|
|
121
|
-
node_client = await client_type.create(self_hostname, uint16(rpc_port), root_path=root_path, net_config=config)
|
|
122
|
-
else:
|
|
123
|
-
node_client = await client_type.create(self_hostname, uint16(rpc_port), root_path=None, net_config=None)
|
|
124
117
|
|
|
125
|
-
|
|
126
|
-
#
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
118
|
+
async with contextlib.AsyncExitStack() as exit_stack:
|
|
119
|
+
# select node client type based on string
|
|
120
|
+
if use_ssl:
|
|
121
|
+
node_client = await exit_stack.enter_async_context(
|
|
122
|
+
client_type.create_as_context(self_hostname, uint16(rpc_port), root_path=root_path, net_config=config)
|
|
123
|
+
)
|
|
124
|
+
else:
|
|
125
|
+
node_client = await exit_stack.enter_async_context(
|
|
126
|
+
client_type.create_as_context(self_hostname, uint16(rpc_port), root_path=None, net_config=None)
|
|
127
|
+
)
|
|
132
128
|
|
|
133
|
-
|
|
134
|
-
|
|
129
|
+
try:
|
|
130
|
+
# check if we can connect to node
|
|
131
|
+
await validate_client_connection(node_client, node_type, rpc_port, consume_errors)
|
|
132
|
+
yield node_client, config
|
|
133
|
+
except ResponseFailureError as e:
|
|
134
|
+
if not consume_errors:
|
|
135
|
+
raise
|
|
135
136
|
|
|
136
|
-
|
|
137
|
+
response = dict(e.response)
|
|
138
|
+
tb = response.pop("traceback", None)
|
|
137
139
|
|
|
138
|
-
|
|
139
|
-
print(f"Traceback:\n{tb}")
|
|
140
|
-
except Exception as e: # this is only here to make the errors more user-friendly.
|
|
141
|
-
if not consume_errors or isinstance(e, (CliRpcConnectionError, click.Abort)):
|
|
142
|
-
# CliRpcConnectionError will be handled by click.
|
|
143
|
-
raise
|
|
144
|
-
print(f"Exception from '{node_type}' {e}:\n{traceback.format_exc()}")
|
|
140
|
+
print(f"{ResponseFailureError(response=response)}")
|
|
145
141
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
142
|
+
if tb is not None:
|
|
143
|
+
print(f"Traceback:\n{tb}")
|
|
144
|
+
except Exception as e: # this is only here to make the errors more user-friendly.
|
|
145
|
+
if not consume_errors or isinstance(e, (CliRpcConnectionError, click.Abort)):
|
|
146
|
+
# CliRpcConnectionError will be handled by click.
|
|
147
|
+
raise
|
|
148
|
+
print(f"Exception from '{node_type}' {e}:\n{traceback.format_exc()}")
|
|
149
149
|
|
|
150
150
|
|
|
151
151
|
async def get_wallet(root_path: Path, wallet_client: WalletRpcClient, fingerprint: Optional[int]) -> int:
|
|
152
152
|
selected_fingerprint: int
|
|
153
153
|
keychain_proxy: Optional[KeychainProxy] = None
|
|
154
|
-
all_keys:
|
|
154
|
+
all_keys: list[KeyData] = []
|
|
155
155
|
|
|
156
156
|
try:
|
|
157
157
|
if fingerprint is not None:
|
|
@@ -177,9 +177,10 @@ async def get_wallet(root_path: Path, wallet_client: WalletRpcClient, fingerprin
|
|
|
177
177
|
current_sync_status: str = ""
|
|
178
178
|
indent = " "
|
|
179
179
|
if logged_in_key is not None:
|
|
180
|
-
|
|
180
|
+
sync_response = await wallet_client.get_sync_status()
|
|
181
|
+
if sync_response.synced:
|
|
181
182
|
current_sync_status = "Synced"
|
|
182
|
-
elif
|
|
183
|
+
elif sync_response.syncing:
|
|
183
184
|
current_sync_status = "Syncing"
|
|
184
185
|
else:
|
|
185
186
|
current_sync_status = "Not Synced"
|
|
@@ -243,12 +244,12 @@ async def get_wallet(root_path: Path, wallet_client: WalletRpcClient, fingerprin
|
|
|
243
244
|
|
|
244
245
|
@asynccontextmanager
|
|
245
246
|
async def get_wallet_client(
|
|
247
|
+
root_path: Path,
|
|
246
248
|
wallet_rpc_port: Optional[int] = None,
|
|
247
249
|
fingerprint: Optional[int] = None,
|
|
248
|
-
root_path: Path = DEFAULT_ROOT_PATH,
|
|
249
250
|
consume_errors: bool = True,
|
|
250
|
-
) -> AsyncIterator[
|
|
251
|
-
async with get_any_service_client(WalletRpcClient,
|
|
251
|
+
) -> AsyncIterator[tuple[WalletRpcClient, int, dict[str, Any]]]:
|
|
252
|
+
async with get_any_service_client(WalletRpcClient, root_path, wallet_rpc_port, consume_errors) as (
|
|
252
253
|
wallet_client,
|
|
253
254
|
config,
|
|
254
255
|
):
|
|
@@ -261,7 +262,7 @@ def cli_confirm(input_message: str, abort_message: str = "Did not confirm. Abort
|
|
|
261
262
|
Raise a click.Abort if the user does not respond with 'y' or 'yes'
|
|
262
263
|
"""
|
|
263
264
|
response = input(input_message).lower()
|
|
264
|
-
if response not in
|
|
265
|
+
if response not in {"y", "yes"}:
|
|
265
266
|
print(abort_message)
|
|
266
267
|
raise click.Abort()
|
|
267
268
|
|
|
@@ -323,7 +324,7 @@ def timelock_args(enable: Optional[bool] = None) -> Callable[[Callable[..., None
|
|
|
323
324
|
min_time=uint64.construct_optional(kwargs["valid_at"]),
|
|
324
325
|
max_time=uint64.construct_optional(kwargs["expires_at"]),
|
|
325
326
|
),
|
|
326
|
-
**{k: v for k, v in kwargs.items() if k not in
|
|
327
|
+
**{k: v for k, v in kwargs.items() if k not in {"valid_at", "expires_at"}},
|
|
327
328
|
)
|
|
328
329
|
|
|
329
330
|
return click.option(
|
|
@@ -350,27 +351,26 @@ def timelock_args(enable: Optional[bool] = None) -> Callable[[Callable[..., None
|
|
|
350
351
|
@streamable
|
|
351
352
|
@dataclasses.dataclass(frozen=True)
|
|
352
353
|
class TransactionBundle(Streamable):
|
|
353
|
-
txs:
|
|
354
|
+
txs: list[TransactionRecord]
|
|
354
355
|
|
|
355
356
|
|
|
356
357
|
def tx_out_cmd(
|
|
357
358
|
enable_timelock_args: Optional[bool] = None,
|
|
358
|
-
) -> Callable[[Callable[...,
|
|
359
|
-
|
|
360
|
-
def _tx_out_cmd(func: Callable[..., List[TransactionRecord]]) -> Callable[..., None]:
|
|
359
|
+
) -> Callable[[Callable[..., list[TransactionRecord]]], Callable[..., None]]:
|
|
360
|
+
def _tx_out_cmd(func: Callable[..., list[TransactionRecord]]) -> Callable[..., None]:
|
|
361
361
|
@timelock_args(enable=enable_timelock_args)
|
|
362
|
-
def original_cmd(
|
|
363
|
-
txs:
|
|
364
|
-
if
|
|
365
|
-
print(f"Writing transactions to file {
|
|
366
|
-
with open(Path(
|
|
362
|
+
def original_cmd(transaction_file_out: Optional[str] = None, **kwargs: Any) -> None:
|
|
363
|
+
txs: list[TransactionRecord] = func(**kwargs)
|
|
364
|
+
if transaction_file_out is not None:
|
|
365
|
+
print(f"Writing transactions to file {transaction_file_out}:")
|
|
366
|
+
with open(Path(transaction_file_out), "wb") as file:
|
|
367
367
|
file.write(bytes(TransactionBundle(txs)))
|
|
368
368
|
|
|
369
369
|
return click.option(
|
|
370
370
|
"--push/--no-push", help="Push the transaction to the network", type=bool, is_flag=True, default=True
|
|
371
371
|
)(
|
|
372
372
|
click.option(
|
|
373
|
-
"--transaction-file",
|
|
373
|
+
"--transaction-file-out",
|
|
374
374
|
help="A file to write relevant transactions to",
|
|
375
375
|
type=str,
|
|
376
376
|
required=False,
|
|
@@ -385,8 +385,8 @@ def tx_out_cmd(
|
|
|
385
385
|
class CMDCoinSelectionConfigLoader:
|
|
386
386
|
min_coin_amount: CliAmount = cli_amount_none
|
|
387
387
|
max_coin_amount: CliAmount = cli_amount_none
|
|
388
|
-
excluded_coin_amounts: Optional[
|
|
389
|
-
excluded_coin_ids: Optional[
|
|
388
|
+
excluded_coin_amounts: Optional[list[CliAmount]] = None
|
|
389
|
+
excluded_coin_ids: Optional[list[bytes32]] = None
|
|
390
390
|
|
|
391
391
|
def to_coin_selection_config(self, mojo_per_unit: int) -> CoinSelectionConfig:
|
|
392
392
|
return CoinSelectionConfigLoader(
|
|
@@ -405,7 +405,7 @@ class CMDCoinSelectionConfigLoader:
|
|
|
405
405
|
class CMDTXConfigLoader(CMDCoinSelectionConfigLoader):
|
|
406
406
|
reuse_puzhash: Optional[bool] = None
|
|
407
407
|
|
|
408
|
-
def to_tx_config(self, mojo_per_unit: int, config:
|
|
408
|
+
def to_tx_config(self, mojo_per_unit: int, config: dict[str, Any], fingerprint: int) -> TXConfig:
|
|
409
409
|
cs_config = self.to_coin_selection_config(mojo_per_unit)
|
|
410
410
|
return TXConfigLoader(
|
|
411
411
|
cs_config.min_coin_amount,
|
|
@@ -476,16 +476,6 @@ def format_minutes(minutes: int) -> str:
|
|
|
476
476
|
return "Unknown"
|
|
477
477
|
|
|
478
478
|
|
|
479
|
-
def prompt_yes_no(prompt: str) -> bool:
|
|
480
|
-
while True:
|
|
481
|
-
response = str(input(prompt + " (y/n): ")).lower().strip()
|
|
482
|
-
ch = response[:1]
|
|
483
|
-
if ch == "y":
|
|
484
|
-
return True
|
|
485
|
-
elif ch == "n":
|
|
486
|
-
return False
|
|
487
|
-
|
|
488
|
-
|
|
489
479
|
def validate_directory_writable(path: Path) -> None:
|
|
490
480
|
write_test_path = path / ".write_test"
|
|
491
481
|
try:
|
chia/cmds/coin_funcs.py
CHANGED
|
@@ -2,9 +2,11 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import dataclasses
|
|
4
4
|
import sys
|
|
5
|
-
from
|
|
5
|
+
from collections.abc import Sequence
|
|
6
|
+
from typing import Optional
|
|
6
7
|
|
|
7
|
-
from chia.cmds.
|
|
8
|
+
from chia.cmds.cmd_helpers import WalletClientInfo
|
|
9
|
+
from chia.cmds.cmds_util import CMDCoinSelectionConfigLoader, CMDTXConfigLoader, cli_confirm
|
|
8
10
|
from chia.cmds.param_types import CliAmount
|
|
9
11
|
from chia.cmds.wallet_funcs import get_mojo_per_unit, get_wallet_type, print_balance
|
|
10
12
|
from chia.rpc.wallet_request_types import CombineCoins, SplitCoins
|
|
@@ -20,8 +22,7 @@ from chia.wallet.util.wallet_types import WalletType
|
|
|
20
22
|
|
|
21
23
|
async def async_list(
|
|
22
24
|
*,
|
|
23
|
-
|
|
24
|
-
fingerprint: Optional[int],
|
|
25
|
+
client_info: WalletClientInfo,
|
|
25
26
|
wallet_id: int,
|
|
26
27
|
max_coin_amount: CliAmount,
|
|
27
28
|
min_coin_amount: CliAmount,
|
|
@@ -30,61 +31,60 @@ async def async_list(
|
|
|
30
31
|
show_unconfirmed: bool,
|
|
31
32
|
paginate: Optional[bool],
|
|
32
33
|
) -> None:
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
34
|
+
addr_prefix = selected_network_address_prefix(client_info.config)
|
|
35
|
+
if paginate is None:
|
|
36
|
+
paginate = sys.stdout.isatty()
|
|
37
|
+
try:
|
|
38
|
+
wallet_type = await get_wallet_type(wallet_id=wallet_id, wallet_client=client_info.client)
|
|
39
|
+
mojo_per_unit = get_mojo_per_unit(wallet_type)
|
|
40
|
+
except LookupError:
|
|
41
|
+
print(f"Wallet id: {wallet_id} not found.")
|
|
42
|
+
return
|
|
43
|
+
if not (await client_info.client.get_sync_status()).synced:
|
|
44
|
+
print("Wallet not synced. Please wait.")
|
|
45
|
+
return
|
|
46
|
+
conf_coins, unconfirmed_removals, unconfirmed_additions = await client_info.client.get_spendable_coins(
|
|
47
|
+
wallet_id=wallet_id,
|
|
48
|
+
coin_selection_config=CMDCoinSelectionConfigLoader(
|
|
49
|
+
max_coin_amount=max_coin_amount,
|
|
50
|
+
min_coin_amount=min_coin_amount,
|
|
51
|
+
excluded_coin_amounts=list(excluded_amounts),
|
|
52
|
+
excluded_coin_ids=list(excluded_coin_ids),
|
|
53
|
+
).to_coin_selection_config(mojo_per_unit),
|
|
54
|
+
)
|
|
55
|
+
print(f"There are a total of {len(conf_coins) + len(unconfirmed_additions)} coins in wallet {wallet_id}.")
|
|
56
|
+
print(f"{len(conf_coins)} confirmed coins.")
|
|
57
|
+
print(f"{len(unconfirmed_additions)} unconfirmed additions.")
|
|
58
|
+
print(f"{len(unconfirmed_removals)} unconfirmed removals.")
|
|
59
|
+
print("Confirmed coins:")
|
|
60
|
+
print_coins(
|
|
61
|
+
"\tAddress: {} Amount: {}, Confirmed in block: {}\n",
|
|
62
|
+
[(cr.coin, str(cr.confirmed_block_index)) for cr in conf_coins],
|
|
63
|
+
mojo_per_unit,
|
|
64
|
+
addr_prefix,
|
|
65
|
+
paginate,
|
|
66
|
+
)
|
|
67
|
+
if show_unconfirmed:
|
|
68
|
+
print("\nUnconfirmed Removals:")
|
|
69
|
+
print_coins(
|
|
70
|
+
"\tPrevious Address: {} Amount: {}, Confirmed in block: {}\n",
|
|
71
|
+
[(cr.coin, str(cr.confirmed_block_index)) for cr in unconfirmed_removals],
|
|
72
|
+
mojo_per_unit,
|
|
73
|
+
addr_prefix,
|
|
74
|
+
paginate,
|
|
54
75
|
)
|
|
55
|
-
print(
|
|
56
|
-
print(f"{len(conf_coins)} confirmed coins.")
|
|
57
|
-
print(f"{len(unconfirmed_additions)} unconfirmed additions.")
|
|
58
|
-
print(f"{len(unconfirmed_removals)} unconfirmed removals.")
|
|
59
|
-
print("Confirmed coins:")
|
|
76
|
+
print("\nUnconfirmed Additions:")
|
|
60
77
|
print_coins(
|
|
61
|
-
"\
|
|
62
|
-
[(
|
|
78
|
+
"\tNew Address: {} Amount: {}, Not yet confirmed in a block.{}\n",
|
|
79
|
+
[(coin, "") for coin in unconfirmed_additions],
|
|
63
80
|
mojo_per_unit,
|
|
64
81
|
addr_prefix,
|
|
65
82
|
paginate,
|
|
66
83
|
)
|
|
67
|
-
if show_unconfirmed:
|
|
68
|
-
print("\nUnconfirmed Removals:")
|
|
69
|
-
print_coins(
|
|
70
|
-
"\tPrevious Address: {} Amount: {}, Confirmed in block: {}\n",
|
|
71
|
-
[(cr.coin, str(cr.confirmed_block_index)) for cr in unconfirmed_removals],
|
|
72
|
-
mojo_per_unit,
|
|
73
|
-
addr_prefix,
|
|
74
|
-
paginate,
|
|
75
|
-
)
|
|
76
|
-
print("\nUnconfirmed Additions:")
|
|
77
|
-
print_coins(
|
|
78
|
-
"\tNew Address: {} Amount: {}, Not yet confirmed in a block.{}\n",
|
|
79
|
-
[(coin, "") for coin in unconfirmed_additions],
|
|
80
|
-
mojo_per_unit,
|
|
81
|
-
addr_prefix,
|
|
82
|
-
paginate,
|
|
83
|
-
)
|
|
84
84
|
|
|
85
85
|
|
|
86
86
|
def print_coins(
|
|
87
|
-
target_string: str, coins:
|
|
87
|
+
target_string: str, coins: list[tuple[Coin, str]], mojo_per_unit: int, addr_prefix: str, paginate: bool
|
|
88
88
|
) -> None:
|
|
89
89
|
if len(coins) == 0:
|
|
90
90
|
print("\tNo Coins.")
|
|
@@ -113,15 +113,14 @@ def print_coins(
|
|
|
113
113
|
|
|
114
114
|
async def async_combine(
|
|
115
115
|
*,
|
|
116
|
-
|
|
117
|
-
fingerprint: Optional[int],
|
|
116
|
+
client_info: WalletClientInfo,
|
|
118
117
|
wallet_id: int,
|
|
119
118
|
fee: uint64,
|
|
120
119
|
max_coin_amount: CliAmount,
|
|
121
120
|
min_coin_amount: CliAmount,
|
|
122
121
|
excluded_amounts: Sequence[CliAmount],
|
|
123
122
|
coins_to_exclude: Sequence[bytes32],
|
|
124
|
-
reuse_puzhash: bool,
|
|
123
|
+
reuse_puzhash: Optional[bool],
|
|
125
124
|
number_of_coins: int,
|
|
126
125
|
target_coin_amount: Optional[CliAmount],
|
|
127
126
|
target_coin_ids: Sequence[bytes32],
|
|
@@ -129,132 +128,148 @@ async def async_combine(
|
|
|
129
128
|
push: bool,
|
|
130
129
|
condition_valid_times: ConditionValidTimes,
|
|
131
130
|
override: bool,
|
|
132
|
-
) ->
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
return []
|
|
131
|
+
) -> list[TransactionRecord]:
|
|
132
|
+
try:
|
|
133
|
+
wallet_type = await get_wallet_type(wallet_id=wallet_id, wallet_client=client_info.client)
|
|
134
|
+
mojo_per_unit = get_mojo_per_unit(wallet_type)
|
|
135
|
+
except LookupError:
|
|
136
|
+
print(f"Wallet id: {wallet_id} not found.")
|
|
137
|
+
return []
|
|
138
|
+
if not (await client_info.client.get_sync_status()).synced:
|
|
139
|
+
print("Wallet not synced. Please wait.")
|
|
140
|
+
return []
|
|
143
141
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
142
|
+
tx_config = CMDTXConfigLoader(
|
|
143
|
+
max_coin_amount=max_coin_amount,
|
|
144
|
+
min_coin_amount=min_coin_amount,
|
|
145
|
+
excluded_coin_amounts=list(excluded_amounts),
|
|
146
|
+
excluded_coin_ids=list(coins_to_exclude),
|
|
147
|
+
reuse_puzhash=reuse_puzhash,
|
|
148
|
+
).to_tx_config(mojo_per_unit, client_info.config, client_info.fingerprint)
|
|
151
149
|
|
|
152
|
-
|
|
153
|
-
None if target_coin_amount is None else target_coin_amount.convert_amount(mojo_per_unit)
|
|
154
|
-
)
|
|
150
|
+
final_target_coin_amount = None if target_coin_amount is None else target_coin_amount.convert_amount(mojo_per_unit)
|
|
155
151
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
152
|
+
combine_request = CombineCoins(
|
|
153
|
+
wallet_id=uint32(wallet_id),
|
|
154
|
+
target_coin_amount=final_target_coin_amount,
|
|
155
|
+
number_of_coins=uint16(number_of_coins),
|
|
156
|
+
target_coin_ids=list(target_coin_ids),
|
|
157
|
+
largest_first=largest_first,
|
|
158
|
+
fee=fee,
|
|
159
|
+
push=False,
|
|
160
|
+
)
|
|
161
|
+
resp = await client_info.client.combine_coins(
|
|
162
|
+
combine_request,
|
|
163
|
+
tx_config,
|
|
164
|
+
timelock_info=condition_valid_times,
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
if not override and wallet_id == 1 and fee >= sum(coin.amount for tx in resp.transactions for coin in tx.removals):
|
|
168
|
+
print("Fee is >= the amount of coins selected. To continue, please use --override flag.")
|
|
169
|
+
return []
|
|
170
|
+
|
|
171
|
+
print(f"Transactions would combine up to {number_of_coins} coins.")
|
|
172
|
+
if push:
|
|
173
|
+
cli_confirm("Would you like to Continue? (y/n): ")
|
|
174
|
+
resp = await client_info.client.combine_coins(
|
|
175
|
+
dataclasses.replace(combine_request, push=True),
|
|
167
176
|
tx_config,
|
|
168
177
|
timelock_info=condition_valid_times,
|
|
169
178
|
)
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
and fee >= sum(coin.amount for tx in resp.transactions for coin in tx.removals)
|
|
175
|
-
):
|
|
176
|
-
print("Fee is >= the amount of coins selected. To continue, please use --override flag.")
|
|
177
|
-
return []
|
|
178
|
-
|
|
179
|
-
print(f"Transactions would combine up to {number_of_coins} coins.")
|
|
180
|
-
if push:
|
|
181
|
-
cli_confirm("Would you like to Continue? (y/n): ")
|
|
182
|
-
resp = await wallet_client.combine_coins(
|
|
183
|
-
dataclasses.replace(combine_request, push=True),
|
|
184
|
-
tx_config,
|
|
185
|
-
timelock_info=condition_valid_times,
|
|
179
|
+
for tx in resp.transactions:
|
|
180
|
+
print(f"Transaction sent: {tx.name}")
|
|
181
|
+
print(
|
|
182
|
+
f"To get status, use command: chia wallet get_transaction -f {client_info.fingerprint} -tx 0x{tx.name}"
|
|
186
183
|
)
|
|
187
|
-
for tx in resp.transactions:
|
|
188
|
-
print(f"Transaction sent: {tx.name}")
|
|
189
|
-
print(f"To get status, use command: chia wallet get_transaction -f {fingerprint} -tx 0x{tx.name}")
|
|
190
184
|
|
|
191
|
-
|
|
185
|
+
return resp.transactions
|
|
192
186
|
|
|
193
187
|
|
|
194
188
|
async def async_split(
|
|
195
189
|
*,
|
|
196
|
-
|
|
197
|
-
fingerprint: Optional[int],
|
|
190
|
+
client_info: WalletClientInfo,
|
|
198
191
|
wallet_id: int,
|
|
199
192
|
fee: uint64,
|
|
200
|
-
number_of_coins: int,
|
|
201
|
-
amount_per_coin: CliAmount,
|
|
193
|
+
number_of_coins: Optional[int],
|
|
194
|
+
amount_per_coin: Optional[CliAmount],
|
|
202
195
|
target_coin_id: bytes32,
|
|
203
196
|
max_coin_amount: CliAmount,
|
|
204
197
|
min_coin_amount: CliAmount,
|
|
205
198
|
excluded_amounts: Sequence[CliAmount],
|
|
206
199
|
coins_to_exclude: Sequence[bytes32],
|
|
207
|
-
reuse_puzhash: bool,
|
|
200
|
+
reuse_puzhash: Optional[bool],
|
|
208
201
|
push: bool,
|
|
209
202
|
condition_valid_times: ConditionValidTimes,
|
|
210
|
-
) ->
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
203
|
+
) -> list[TransactionRecord]:
|
|
204
|
+
try:
|
|
205
|
+
wallet_type = await get_wallet_type(wallet_id=wallet_id, wallet_client=client_info.client)
|
|
206
|
+
mojo_per_unit = get_mojo_per_unit(wallet_type)
|
|
207
|
+
except LookupError:
|
|
208
|
+
print(f"Wallet id: {wallet_id} not found.")
|
|
209
|
+
return []
|
|
210
|
+
if not (await client_info.client.get_sync_status()).synced:
|
|
211
|
+
print("Wallet not synced. Please wait.")
|
|
212
|
+
return []
|
|
213
|
+
|
|
214
|
+
if number_of_coins is None and amount_per_coin is None:
|
|
215
|
+
print("Must use either -a or -n. For more information run --help.")
|
|
216
|
+
return []
|
|
217
|
+
|
|
218
|
+
if number_of_coins is None:
|
|
219
|
+
coins = await client_info.client.get_coin_records_by_names([target_coin_id])
|
|
220
|
+
if len(coins) == 0:
|
|
221
|
+
print("Could not find target coin.")
|
|
217
222
|
return []
|
|
218
|
-
|
|
219
|
-
|
|
223
|
+
assert amount_per_coin is not None
|
|
224
|
+
number_of_coins = int(coins[0].coin.amount // amount_per_coin.convert_amount(mojo_per_unit))
|
|
225
|
+
elif amount_per_coin is None:
|
|
226
|
+
coins = await client_info.client.get_coin_records_by_names([target_coin_id])
|
|
227
|
+
if len(coins) == 0:
|
|
228
|
+
print("Could not find target coin.")
|
|
220
229
|
return []
|
|
230
|
+
assert number_of_coins is not None
|
|
231
|
+
amount_per_coin = CliAmount(True, uint64(coins[0].coin.amount // number_of_coins))
|
|
221
232
|
|
|
222
|
-
|
|
233
|
+
final_amount_per_coin = amount_per_coin.convert_amount(mojo_per_unit)
|
|
223
234
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
235
|
+
tx_config = CMDTXConfigLoader(
|
|
236
|
+
max_coin_amount=max_coin_amount,
|
|
237
|
+
min_coin_amount=min_coin_amount,
|
|
238
|
+
excluded_coin_amounts=list(excluded_amounts),
|
|
239
|
+
excluded_coin_ids=list(coins_to_exclude),
|
|
240
|
+
reuse_puzhash=reuse_puzhash,
|
|
241
|
+
).to_tx_config(mojo_per_unit, client_info.config, client_info.fingerprint)
|
|
231
242
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
243
|
+
transactions: list[TransactionRecord] = (
|
|
244
|
+
await client_info.client.split_coins(
|
|
245
|
+
SplitCoins(
|
|
246
|
+
wallet_id=uint32(wallet_id),
|
|
247
|
+
number_of_coins=uint16(number_of_coins),
|
|
248
|
+
amount_per_coin=uint64(final_amount_per_coin),
|
|
249
|
+
target_coin_id=target_coin_id,
|
|
250
|
+
fee=fee,
|
|
251
|
+
push=push,
|
|
252
|
+
),
|
|
253
|
+
tx_config=tx_config,
|
|
254
|
+
timelock_info=condition_valid_times,
|
|
255
|
+
)
|
|
256
|
+
).transactions
|
|
246
257
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
print(f"To get status, use command: chia wallet get_transaction -f {fingerprint} -tx 0x{tx.name}")
|
|
251
|
-
dust_threshold = config.get("xch_spam_amount", 1000000) # min amount per coin in mojo
|
|
252
|
-
spam_filter_after_n_txs = config.get("spam_filter_after_n_txs", 200) # how many txs to wait before filtering
|
|
253
|
-
if final_amount_per_coin < dust_threshold and wallet_type == WalletType.STANDARD_WALLET:
|
|
258
|
+
if push:
|
|
259
|
+
for tx in transactions:
|
|
260
|
+
print(f"Transaction sent: {tx.name}")
|
|
254
261
|
print(
|
|
255
|
-
f"
|
|
256
|
-
f"{dust_threshold / (1 if amount_per_coin.mojos else mojo_per_unit)}. Some or all of the Coins "
|
|
257
|
-
f"{'will' if number_of_coins > spam_filter_after_n_txs else 'may'} not show up in your wallet unless "
|
|
258
|
-
f"you decrease the dust limit to below {final_amount_per_coin} mojos or disable it by setting it to 0."
|
|
262
|
+
f"To get status, use command: chia wallet get_transaction -f {client_info.fingerprint} -tx 0x{tx.name}"
|
|
259
263
|
)
|
|
260
|
-
|
|
264
|
+
dust_threshold = client_info.config.get("xch_spam_amount", 1000000) # min amount per coin in mojo
|
|
265
|
+
spam_filter_after_n_txs = client_info.config.get(
|
|
266
|
+
"spam_filter_after_n_txs", 200
|
|
267
|
+
) # how many txs to wait before filtering
|
|
268
|
+
if final_amount_per_coin < dust_threshold and wallet_type == WalletType.STANDARD_WALLET:
|
|
269
|
+
print(
|
|
270
|
+
f"WARNING: The amount per coin: {amount_per_coin.amount} is less than the dust threshold: "
|
|
271
|
+
f"{dust_threshold / (1 if amount_per_coin.mojos else mojo_per_unit)}. Some or all of the Coins "
|
|
272
|
+
f"{'will' if number_of_coins > spam_filter_after_n_txs else 'may'} not show up in your wallet unless "
|
|
273
|
+
f"you decrease the dust limit to below {final_amount_per_coin} mojos or disable it by setting it to 0."
|
|
274
|
+
)
|
|
275
|
+
return transactions
|