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
|
@@ -4,7 +4,7 @@ import dataclasses
|
|
|
4
4
|
import logging
|
|
5
5
|
import time
|
|
6
6
|
import traceback
|
|
7
|
-
from typing import TYPE_CHECKING, Any, ClassVar,
|
|
7
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
8
8
|
|
|
9
9
|
from chia_rs import G1Element
|
|
10
10
|
from typing_extensions import Unpack
|
|
@@ -69,12 +69,12 @@ CAT_MOD_HASH_HASH = Program.to(CAT_MOD_HASH).get_tree_hash()
|
|
|
69
69
|
QUOTED_MOD_HASH = calculate_hash_of_quoted_mod_hash(CAT_MOD_HASH)
|
|
70
70
|
|
|
71
71
|
|
|
72
|
-
def not_ephemeral_additions(sp: WalletSpendBundle) ->
|
|
73
|
-
removals:
|
|
72
|
+
def not_ephemeral_additions(sp: WalletSpendBundle) -> list[Coin]:
|
|
73
|
+
removals: set[Coin] = set()
|
|
74
74
|
for cs in sp.coin_spends:
|
|
75
75
|
removals.add(cs.coin)
|
|
76
76
|
|
|
77
|
-
additions:
|
|
77
|
+
additions: list[Coin] = []
|
|
78
78
|
max_cost = int(DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM)
|
|
79
79
|
for cs in sp.coin_spends:
|
|
80
80
|
coins, cost = compute_additions_with_cost(cs, max_cost=max_cost)
|
|
@@ -106,7 +106,7 @@ class CATWallet:
|
|
|
106
106
|
async def create_new_cat_wallet(
|
|
107
107
|
wallet_state_manager: WalletStateManager,
|
|
108
108
|
wallet: Wallet,
|
|
109
|
-
cat_tail_info:
|
|
109
|
+
cat_tail_info: dict[str, Any],
|
|
110
110
|
amount: uint64,
|
|
111
111
|
action_scope: WalletActionScope,
|
|
112
112
|
fee: uint64 = uint64(0),
|
|
@@ -144,10 +144,10 @@ class CATWallet:
|
|
|
144
144
|
)
|
|
145
145
|
assert self.cat_info.limitations_program_hash != empty_bytes
|
|
146
146
|
except Exception:
|
|
147
|
-
await wallet_state_manager.
|
|
147
|
+
await wallet_state_manager.delete_wallet(self.id())
|
|
148
148
|
raise
|
|
149
149
|
if spend_bundle is None:
|
|
150
|
-
await wallet_state_manager.
|
|
150
|
+
await wallet_state_manager.delete_wallet(self.id())
|
|
151
151
|
raise ValueError("Failed to create spend.")
|
|
152
152
|
|
|
153
153
|
await self.wallet_state_manager.add_new_wallet(self)
|
|
@@ -160,7 +160,7 @@ class CATWallet:
|
|
|
160
160
|
await self.set_name(name)
|
|
161
161
|
|
|
162
162
|
# Change and actual CAT coin
|
|
163
|
-
non_ephemeral_coins:
|
|
163
|
+
non_ephemeral_coins: list[Coin] = not_ephemeral_additions(spend_bundle)
|
|
164
164
|
cat_coin = None
|
|
165
165
|
puzzle_store = self.wallet_state_manager.puzzle_store
|
|
166
166
|
for c in non_ephemeral_coins:
|
|
@@ -257,7 +257,7 @@ class CATWallet:
|
|
|
257
257
|
puzzle_driver: PuzzleInfo,
|
|
258
258
|
name: Optional[str] = None,
|
|
259
259
|
# We're hinting this as Any for mypy by should explore adding this to the wallet protocol and hinting properly
|
|
260
|
-
potential_subclasses:
|
|
260
|
+
potential_subclasses: dict[AssetType, Any] = {},
|
|
261
261
|
) -> Any:
|
|
262
262
|
next_layer: Optional[PuzzleInfo] = puzzle_driver.also()
|
|
263
263
|
if next_layer is not None:
|
|
@@ -310,7 +310,7 @@ class CATWallet:
|
|
|
310
310
|
def id(self) -> uint32:
|
|
311
311
|
return self.wallet_info.id
|
|
312
312
|
|
|
313
|
-
async def get_confirmed_balance(self, record_list: Optional[
|
|
313
|
+
async def get_confirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
314
314
|
if record_list is None:
|
|
315
315
|
record_list = await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(self.id())
|
|
316
316
|
|
|
@@ -323,7 +323,7 @@ class CATWallet:
|
|
|
323
323
|
self.log.info(f"Confirmed balance for cat wallet {self.id()} is {amount}")
|
|
324
324
|
return uint128(amount)
|
|
325
325
|
|
|
326
|
-
async def get_unconfirmed_balance(self, unspent_records: Optional[
|
|
326
|
+
async def get_unconfirmed_balance(self, unspent_records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
327
327
|
return await self.wallet_state_manager.get_unconfirmed_balance(self.id(), unspent_records)
|
|
328
328
|
|
|
329
329
|
@property
|
|
@@ -335,14 +335,14 @@ class CATWallet:
|
|
|
335
335
|
# avoid full block TXs
|
|
336
336
|
return int(self.wallet_state_manager.constants.MAX_BLOCK_COST_CLVM / 2 / self.cost_of_single_tx)
|
|
337
337
|
|
|
338
|
-
async def get_max_spendable_coins(self, records: Optional[
|
|
339
|
-
spendable:
|
|
338
|
+
async def get_max_spendable_coins(self, records: Optional[set[WalletCoinRecord]] = None) -> set[WalletCoinRecord]:
|
|
339
|
+
spendable: list[WalletCoinRecord] = list(
|
|
340
340
|
await self.wallet_state_manager.get_spendable_coins_for_wallet(self.id(), records)
|
|
341
341
|
)
|
|
342
342
|
spendable.sort(reverse=True, key=lambda record: record.coin.amount)
|
|
343
343
|
return set(spendable[0 : min(len(spendable), self.max_send_quantity)])
|
|
344
344
|
|
|
345
|
-
async def get_max_send_amount(self, records: Optional[
|
|
345
|
+
async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
346
346
|
return uint128(sum(cr.coin.amount for cr in await self.get_max_spendable_coins()))
|
|
347
347
|
|
|
348
348
|
def get_name(self) -> str:
|
|
@@ -422,27 +422,6 @@ class CATWallet:
|
|
|
422
422
|
# We also need to make sure there's no record of the transaction
|
|
423
423
|
await self.wallet_state_manager.tx_store.delete_transaction_record(record.coin.name())
|
|
424
424
|
|
|
425
|
-
async def get_new_inner_hash(self) -> bytes32:
|
|
426
|
-
puzzle = await self.get_new_inner_puzzle()
|
|
427
|
-
return puzzle.get_tree_hash()
|
|
428
|
-
|
|
429
|
-
async def get_new_inner_puzzle(self) -> Program:
|
|
430
|
-
return await self.standard_wallet.get_new_puzzle()
|
|
431
|
-
|
|
432
|
-
async def get_new_puzzlehash(self) -> bytes32:
|
|
433
|
-
return await self.standard_wallet.get_new_puzzlehash()
|
|
434
|
-
|
|
435
|
-
async def get_puzzle_hash(self, new: bool) -> bytes32:
|
|
436
|
-
if new:
|
|
437
|
-
return await self.get_new_puzzlehash()
|
|
438
|
-
else:
|
|
439
|
-
record: Optional[DerivationRecord] = (
|
|
440
|
-
await self.wallet_state_manager.get_current_derivation_record_for_wallet(self.standard_wallet.id())
|
|
441
|
-
)
|
|
442
|
-
if record is None:
|
|
443
|
-
return await self.get_new_puzzlehash()
|
|
444
|
-
return record.puzzle_hash
|
|
445
|
-
|
|
446
425
|
def require_derivation_paths(self) -> bool:
|
|
447
426
|
return True
|
|
448
427
|
|
|
@@ -456,10 +435,17 @@ class CATWallet:
|
|
|
456
435
|
limitations_program_hash_hash = Program.to(self.cat_info.limitations_program_hash).get_tree_hash()
|
|
457
436
|
return curry_and_treehash(QUOTED_MOD_HASH, CAT_MOD_HASH_HASH, limitations_program_hash_hash, inner_puzzle_hash)
|
|
458
437
|
|
|
459
|
-
async def
|
|
460
|
-
|
|
438
|
+
async def get_cat_puzzle_hash(self, new: bool) -> bytes32:
|
|
439
|
+
if new:
|
|
440
|
+
return (await self.wallet_state_manager.get_unused_derivation_record(self.id())).puzzle_hash
|
|
441
|
+
else:
|
|
442
|
+
derivation_record = await self.wallet_state_manager.get_current_derivation_record_for_wallet(self.id())
|
|
443
|
+
if derivation_record is None:
|
|
444
|
+
return (await self.wallet_state_manager.get_unused_derivation_record(self.id())).puzzle_hash
|
|
445
|
+
|
|
446
|
+
return derivation_record.puzzle_hash
|
|
461
447
|
|
|
462
|
-
async def get_spendable_balance(self, records: Optional[
|
|
448
|
+
async def get_spendable_balance(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
463
449
|
coins = await self.get_cat_spendable_coins(records)
|
|
464
450
|
amount = 0
|
|
465
451
|
for record in coins:
|
|
@@ -493,10 +479,10 @@ class CATWallet:
|
|
|
493
479
|
|
|
494
480
|
return uint64(addition_amount)
|
|
495
481
|
|
|
496
|
-
async def get_cat_spendable_coins(self, records: Optional[
|
|
497
|
-
result:
|
|
482
|
+
async def get_cat_spendable_coins(self, records: Optional[set[WalletCoinRecord]] = None) -> list[WalletCoinRecord]:
|
|
483
|
+
result: list[WalletCoinRecord] = []
|
|
498
484
|
|
|
499
|
-
record_list:
|
|
485
|
+
record_list: set[WalletCoinRecord] = await self.wallet_state_manager.get_spendable_coins_for_wallet(
|
|
500
486
|
self.id(), records
|
|
501
487
|
)
|
|
502
488
|
|
|
@@ -511,17 +497,17 @@ class CATWallet:
|
|
|
511
497
|
self,
|
|
512
498
|
amount: uint64,
|
|
513
499
|
action_scope: WalletActionScope,
|
|
514
|
-
) ->
|
|
500
|
+
) -> set[Coin]:
|
|
515
501
|
"""
|
|
516
502
|
Returns a set of coins that can be used for generating a new transaction.
|
|
517
503
|
Note: Must be called under wallet state manager lock
|
|
518
504
|
"""
|
|
519
505
|
spendable_amount: uint128 = await self.get_spendable_balance()
|
|
520
|
-
spendable_coins:
|
|
506
|
+
spendable_coins: list[WalletCoinRecord] = await self.get_cat_spendable_coins()
|
|
521
507
|
|
|
522
508
|
# Try to use coins from the store, if there isn't enough of "unused"
|
|
523
509
|
# coins use change coins that are not confirmed yet
|
|
524
|
-
unconfirmed_removals:
|
|
510
|
+
unconfirmed_removals: dict[bytes32, Coin] = await self.wallet_state_manager.unconfirmed_removals_for_wallet(
|
|
525
511
|
self.id()
|
|
526
512
|
)
|
|
527
513
|
async with action_scope.use() as interface:
|
|
@@ -538,18 +524,18 @@ class CATWallet:
|
|
|
538
524
|
return coins
|
|
539
525
|
|
|
540
526
|
async def inner_puzzle_for_cat_puzhash(self, cat_hash: bytes32) -> Program:
|
|
541
|
-
record: Optional[
|
|
542
|
-
|
|
543
|
-
)
|
|
527
|
+
record: Optional[
|
|
528
|
+
DerivationRecord
|
|
529
|
+
] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(cat_hash)
|
|
544
530
|
if record is None:
|
|
545
531
|
raise RuntimeError(f"Missing Derivation Record for CAT puzzle_hash {cat_hash}")
|
|
546
532
|
inner_puzzle: Program = self.standard_wallet.puzzle_for_pk(record.pubkey)
|
|
547
533
|
return inner_puzzle
|
|
548
534
|
|
|
549
535
|
async def convert_puzzle_hash(self, puzzle_hash: bytes32) -> bytes32:
|
|
550
|
-
record: Optional[
|
|
551
|
-
|
|
552
|
-
)
|
|
536
|
+
record: Optional[
|
|
537
|
+
DerivationRecord
|
|
538
|
+
] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(puzzle_hash)
|
|
553
539
|
if record is None:
|
|
554
540
|
return puzzle_hash # TODO: check if we have a test for this case!
|
|
555
541
|
else:
|
|
@@ -563,7 +549,7 @@ class CATWallet:
|
|
|
563
549
|
fee: uint64,
|
|
564
550
|
amount_to_claim: uint64,
|
|
565
551
|
action_scope: WalletActionScope,
|
|
566
|
-
extra_conditions:
|
|
552
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
567
553
|
) -> Optional[AssertCoinAnnouncement]:
|
|
568
554
|
"""
|
|
569
555
|
This function creates a non-CAT transaction to pay fees, contribute funds for issuance, and absorb melt value.
|
|
@@ -579,7 +565,7 @@ class CATWallet:
|
|
|
579
565
|
fee,
|
|
580
566
|
action_scope,
|
|
581
567
|
)
|
|
582
|
-
origin_id =
|
|
568
|
+
origin_id = next(iter(chia_coins)).name()
|
|
583
569
|
await self.standard_wallet.generate_signed_transaction(
|
|
584
570
|
uint64(0),
|
|
585
571
|
(await self.standard_wallet.get_puzzle_hash(not action_scope.config.tx_config.reuse_puzhash)),
|
|
@@ -595,7 +581,7 @@ class CATWallet:
|
|
|
595
581
|
fee,
|
|
596
582
|
action_scope,
|
|
597
583
|
)
|
|
598
|
-
origin_id =
|
|
584
|
+
origin_id = next(iter(chia_coins)).name()
|
|
599
585
|
selected_amount = sum(c.amount for c in chia_coins)
|
|
600
586
|
await self.standard_wallet.generate_signed_transaction(
|
|
601
587
|
uint64(selected_amount + amount_to_claim - fee),
|
|
@@ -627,12 +613,12 @@ class CATWallet:
|
|
|
627
613
|
|
|
628
614
|
async def generate_unsigned_spendbundle(
|
|
629
615
|
self,
|
|
630
|
-
payments:
|
|
616
|
+
payments: list[Payment],
|
|
631
617
|
action_scope: WalletActionScope,
|
|
632
618
|
fee: uint64 = uint64(0),
|
|
633
|
-
cat_discrepancy: Optional[
|
|
634
|
-
coins: Optional[
|
|
635
|
-
extra_conditions:
|
|
619
|
+
cat_discrepancy: Optional[tuple[int, Program, Program]] = None, # (extra_delta, tail_reveal, tail_solution)
|
|
620
|
+
coins: Optional[set[Coin]] = None,
|
|
621
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
636
622
|
) -> WalletSpendBundle:
|
|
637
623
|
if cat_discrepancy is not None:
|
|
638
624
|
extra_delta, tail_reveal, tail_solution = cat_discrepancy
|
|
@@ -666,17 +652,17 @@ class CATWallet:
|
|
|
666
652
|
|
|
667
653
|
if change > 0:
|
|
668
654
|
derivation_record = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(
|
|
669
|
-
|
|
655
|
+
next(iter(cat_coins)).puzzle_hash
|
|
670
656
|
)
|
|
671
657
|
if derivation_record is not None and action_scope.config.tx_config.reuse_puzhash:
|
|
672
658
|
change_puzhash = self.standard_wallet.puzzle_hash_for_pk(derivation_record.pubkey)
|
|
673
659
|
for payment in payments:
|
|
674
660
|
if change_puzhash == payment.puzzle_hash and change == payment.amount:
|
|
675
661
|
# We cannot create two coins has same id, create a new puzhash for the change
|
|
676
|
-
change_puzhash = await self.
|
|
662
|
+
change_puzhash = await self.standard_wallet.get_puzzle_hash(new=True)
|
|
677
663
|
break
|
|
678
664
|
else:
|
|
679
|
-
change_puzhash = await self.
|
|
665
|
+
change_puzhash = await self.standard_wallet.get_puzzle_hash(new=True)
|
|
680
666
|
primaries.append(Payment(change_puzhash, uint64(change), [change_puzhash]))
|
|
681
667
|
|
|
682
668
|
# Loop through the coins we've selected and gather the information we need to spend them
|
|
@@ -756,17 +742,17 @@ class CATWallet:
|
|
|
756
742
|
|
|
757
743
|
async def generate_signed_transaction(
|
|
758
744
|
self,
|
|
759
|
-
amounts:
|
|
760
|
-
puzzle_hashes:
|
|
745
|
+
amounts: list[uint64],
|
|
746
|
+
puzzle_hashes: list[bytes32],
|
|
761
747
|
action_scope: WalletActionScope,
|
|
762
748
|
fee: uint64 = uint64(0),
|
|
763
|
-
coins: Optional[
|
|
764
|
-
memos: Optional[
|
|
765
|
-
extra_conditions:
|
|
749
|
+
coins: Optional[set[Coin]] = None,
|
|
750
|
+
memos: Optional[list[list[bytes]]] = None,
|
|
751
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
766
752
|
**kwargs: Unpack[GSTOptionalArgs],
|
|
767
753
|
) -> None:
|
|
768
754
|
# (extra_delta, tail_reveal, tail_solution)
|
|
769
|
-
cat_discrepancy: Optional[
|
|
755
|
+
cat_discrepancy: Optional[tuple[int, Program, Program]] = kwargs.get("cat_discrepancy", None)
|
|
770
756
|
if memos is None:
|
|
771
757
|
memos = [[] for _ in range(len(puzzle_hashes))]
|
|
772
758
|
|
|
@@ -775,7 +761,7 @@ class CATWallet:
|
|
|
775
761
|
|
|
776
762
|
payments = []
|
|
777
763
|
for amount, puzhash, memo_list in zip(amounts, puzzle_hashes, memos):
|
|
778
|
-
memos_with_hint:
|
|
764
|
+
memos_with_hint: list[bytes] = [puzhash]
|
|
779
765
|
memos_with_hint.extend(memo_list)
|
|
780
766
|
payments.append(Payment(puzhash, amount, memos_with_hint))
|
|
781
767
|
|
|
@@ -790,10 +776,10 @@ class CATWallet:
|
|
|
790
776
|
)
|
|
791
777
|
|
|
792
778
|
async with action_scope.use() as interface:
|
|
793
|
-
other_tx_removals:
|
|
779
|
+
other_tx_removals: set[Coin] = {
|
|
794
780
|
removal for tx in interface.side_effects.transactions for removal in tx.removals
|
|
795
781
|
}
|
|
796
|
-
other_tx_additions:
|
|
782
|
+
other_tx_additions: set[Coin] = {
|
|
797
783
|
removal for tx in interface.side_effects.transactions for removal in tx.additions
|
|
798
784
|
}
|
|
799
785
|
interface.side_effects.transactions.append(
|
|
@@ -854,7 +840,7 @@ class CATWallet:
|
|
|
854
840
|
asset_id: Optional[bytes32],
|
|
855
841
|
amount: uint64,
|
|
856
842
|
action_scope: WalletActionScope,
|
|
857
|
-
) ->
|
|
843
|
+
) -> set[Coin]:
|
|
858
844
|
balance = await self.get_confirmed_balance()
|
|
859
845
|
if balance < amount:
|
|
860
846
|
raise Exception(f"insufficient funds in wallet {self.id()}")
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Optional
|
|
5
5
|
|
|
6
6
|
from chia.types.blockchain_format.coin import Coin
|
|
7
7
|
from chia.types.blockchain_format.program import Program
|
|
@@ -15,7 +15,7 @@ from chia.util.streamable import Streamable, streamable
|
|
|
15
15
|
class LockedCoinInfo(Streamable):
|
|
16
16
|
coin: Coin
|
|
17
17
|
inner_puzzle: Program # This is the lockup puzzle, not the lockup_puzzle's inner_puzzle
|
|
18
|
-
active_votes:
|
|
18
|
+
active_votes: list[Optional[bytes32]]
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
@streamable
|
|
@@ -25,4 +25,4 @@ class DAOCATInfo(Streamable):
|
|
|
25
25
|
free_cat_wallet_id: uint64
|
|
26
26
|
limitations_program_hash: bytes32
|
|
27
27
|
my_tail: Optional[Program] # this is the program
|
|
28
|
-
locked_coins:
|
|
28
|
+
locked_coins: list[LockedCoinInfo]
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import time
|
|
5
|
-
from typing import TYPE_CHECKING, Any, ClassVar,
|
|
5
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
6
6
|
|
|
7
7
|
from chia_rs import G1Element
|
|
8
8
|
|
|
@@ -152,7 +152,7 @@ class DAOCATWallet:
|
|
|
152
152
|
parent_spend = await fetch_coin_spend(height, parent_coin.coin, peer)
|
|
153
153
|
uncurried = parent_spend.puzzle_reveal.uncurry()
|
|
154
154
|
cat_inner = uncurried[1].at("rrf")
|
|
155
|
-
active_votes_list:
|
|
155
|
+
active_votes_list: list[Optional[bytes32]] = []
|
|
156
156
|
|
|
157
157
|
record = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(coin.puzzle_hash)
|
|
158
158
|
if record:
|
|
@@ -227,7 +227,7 @@ class DAOCATWallet:
|
|
|
227
227
|
self.log.info(f"Removing parent {name} (probably had a non-CAT parent)")
|
|
228
228
|
await self.lineage_store.remove_lineage_proof(name)
|
|
229
229
|
|
|
230
|
-
async def advanced_select_coins(self, amount: uint64, proposal_id: bytes32) ->
|
|
230
|
+
async def advanced_select_coins(self, amount: uint64, proposal_id: bytes32) -> list[LockedCoinInfo]:
|
|
231
231
|
coins = []
|
|
232
232
|
s = 0
|
|
233
233
|
for coin in self.dao_cat_info.locked_coins:
|
|
@@ -258,7 +258,7 @@ class DAOCATWallet:
|
|
|
258
258
|
is_yes_vote: bool,
|
|
259
259
|
proposal_puzzle: Optional[Program] = None,
|
|
260
260
|
) -> WalletSpendBundle:
|
|
261
|
-
coins:
|
|
261
|
+
coins: list[LockedCoinInfo] = await self.advanced_select_coins(amount, proposal_id)
|
|
262
262
|
running_sum = 0 # this will be used for change calculation
|
|
263
263
|
change = sum(c.coin.amount for c in coins) - amount
|
|
264
264
|
extra_delta, limitations_solution = 0, Program.to([])
|
|
@@ -288,7 +288,7 @@ class DAOCATWallet:
|
|
|
288
288
|
lockup_innerpuz_list = []
|
|
289
289
|
if running_sum + coin.amount <= amount:
|
|
290
290
|
vote_amount = coin.amount
|
|
291
|
-
running_sum
|
|
291
|
+
running_sum += coin.amount
|
|
292
292
|
primaries = [
|
|
293
293
|
Payment(
|
|
294
294
|
new_innerpuzzle.get_tree_hash(),
|
|
@@ -303,7 +303,7 @@ class DAOCATWallet:
|
|
|
303
303
|
)
|
|
304
304
|
else:
|
|
305
305
|
vote_amount = uint64(amount - running_sum)
|
|
306
|
-
running_sum
|
|
306
|
+
running_sum += coin.amount
|
|
307
307
|
primaries = [
|
|
308
308
|
Payment(
|
|
309
309
|
new_innerpuzzle.get_tree_hash(),
|
|
@@ -365,8 +365,8 @@ class DAOCATWallet:
|
|
|
365
365
|
amount: uint64,
|
|
366
366
|
action_scope: WalletActionScope,
|
|
367
367
|
fee: uint64 = uint64(0),
|
|
368
|
-
extra_conditions:
|
|
369
|
-
) ->
|
|
368
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
369
|
+
) -> list[TransactionRecord]:
|
|
370
370
|
"""
|
|
371
371
|
Enter existing CATs for the DAO into voting mode
|
|
372
372
|
"""
|
|
@@ -378,7 +378,7 @@ class DAOCATWallet:
|
|
|
378
378
|
# get the lockup puzzle hash
|
|
379
379
|
lockup_puzzle = await self.get_new_puzzle()
|
|
380
380
|
# create the cat spend
|
|
381
|
-
txs:
|
|
381
|
+
txs: list[TransactionRecord] = await cat_wallet.generate_signed_transaction(
|
|
382
382
|
[amount],
|
|
383
383
|
[lockup_puzzle.get_tree_hash()],
|
|
384
384
|
action_scope,
|
|
@@ -393,10 +393,10 @@ class DAOCATWallet:
|
|
|
393
393
|
|
|
394
394
|
async def exit_vote_state(
|
|
395
395
|
self,
|
|
396
|
-
coins:
|
|
396
|
+
coins: list[LockedCoinInfo],
|
|
397
397
|
action_scope: WalletActionScope,
|
|
398
398
|
fee: uint64 = uint64(0),
|
|
399
|
-
extra_conditions:
|
|
399
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
400
400
|
) -> None:
|
|
401
401
|
extra_delta, limitations_solution = 0, Program.to([])
|
|
402
402
|
limitations_program_reveal = Program.to([])
|
|
@@ -495,11 +495,11 @@ class DAOCATWallet:
|
|
|
495
495
|
|
|
496
496
|
async def remove_active_proposal(
|
|
497
497
|
self,
|
|
498
|
-
proposal_id_list:
|
|
498
|
+
proposal_id_list: list[bytes32],
|
|
499
499
|
action_scope: WalletActionScope,
|
|
500
500
|
fee: uint64 = uint64(0),
|
|
501
501
|
) -> WalletSpendBundle:
|
|
502
|
-
locked_coins:
|
|
502
|
+
locked_coins: list[tuple[LockedCoinInfo, list[bytes32]]] = []
|
|
503
503
|
for lci in self.dao_cat_info.locked_coins:
|
|
504
504
|
my_finished_proposals = []
|
|
505
505
|
for active_vote in lci.active_votes:
|
|
@@ -609,16 +609,16 @@ class DAOCATWallet:
|
|
|
609
609
|
async def match_hinted_coin(self, coin: Coin, hint: bytes32) -> bool:
|
|
610
610
|
raise NotImplementedError("Method not implemented for DAO CAT Wallet") # pragma: no cover
|
|
611
611
|
|
|
612
|
-
async def get_spendable_balance(self, records: Optional[
|
|
612
|
+
async def get_spendable_balance(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
613
613
|
return uint128(0)
|
|
614
614
|
|
|
615
|
-
async def get_confirmed_balance(self, record_list: Optional[
|
|
615
|
+
async def get_confirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
616
616
|
amount = 0
|
|
617
617
|
for coin in self.dao_cat_info.locked_coins:
|
|
618
618
|
amount += coin.coin.amount
|
|
619
619
|
return uint128(amount)
|
|
620
620
|
|
|
621
|
-
async def get_unconfirmed_balance(self, unspent_records: Optional[
|
|
621
|
+
async def get_unconfirmed_balance(self, unspent_records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
622
622
|
return uint128(0)
|
|
623
623
|
|
|
624
624
|
async def get_pending_change_balance(self) -> uint64:
|
|
@@ -628,10 +628,10 @@ class DAOCATWallet:
|
|
|
628
628
|
self,
|
|
629
629
|
amount: uint64,
|
|
630
630
|
action_scope: WalletActionScope,
|
|
631
|
-
) ->
|
|
631
|
+
) -> set[Coin]:
|
|
632
632
|
return set()
|
|
633
633
|
|
|
634
|
-
async def get_max_send_amount(self, unspent_records: Optional[
|
|
634
|
+
async def get_max_send_amount(self, unspent_records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
635
635
|
return uint128(0)
|
|
636
636
|
|
|
637
637
|
async def get_votable_balance(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Optional
|
|
5
5
|
|
|
6
6
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
7
7
|
from chia.util.db_wrapper import DBWrapper2
|
|
@@ -60,7 +60,7 @@ class CATLineageStore:
|
|
|
60
60
|
|
|
61
61
|
return None
|
|
62
62
|
|
|
63
|
-
async def get_all_lineage_proofs(self) ->
|
|
63
|
+
async def get_all_lineage_proofs(self) -> dict[bytes32, LineageProof]:
|
|
64
64
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
65
65
|
cursor = await conn.execute(f"SELECT * FROM {self.table_name}")
|
|
66
66
|
rows = await cursor.fetchall()
|
chia/wallet/coin_selection.py
CHANGED
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import random
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import Optional
|
|
6
6
|
|
|
7
7
|
from chia.types.blockchain_format.coin import Coin
|
|
8
8
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
@@ -14,11 +14,11 @@ from chia.wallet.wallet_coin_record import WalletCoinRecord
|
|
|
14
14
|
async def select_coins(
|
|
15
15
|
spendable_amount: uint128,
|
|
16
16
|
coin_selection_config: CoinSelectionConfig,
|
|
17
|
-
spendable_coins:
|
|
18
|
-
unconfirmed_removals:
|
|
17
|
+
spendable_coins: list[WalletCoinRecord],
|
|
18
|
+
unconfirmed_removals: dict[bytes32, Coin],
|
|
19
19
|
log: logging.Logger,
|
|
20
20
|
amount: uint128,
|
|
21
|
-
) ->
|
|
21
|
+
) -> set[Coin]:
|
|
22
22
|
"""
|
|
23
23
|
Returns a set of coins that can be used for generating a new transaction.
|
|
24
24
|
"""
|
|
@@ -33,7 +33,7 @@ async def select_coins(
|
|
|
33
33
|
|
|
34
34
|
max_num_coins = 500
|
|
35
35
|
sum_spendable_coins = 0
|
|
36
|
-
valid_spendable_coins:
|
|
36
|
+
valid_spendable_coins: list[Coin] = []
|
|
37
37
|
|
|
38
38
|
for coin_record in spendable_coins: # remove all the unconfirmed coins, excluded coins and dust.
|
|
39
39
|
coin_name: bytes32 = coin_record.coin.name()
|
|
@@ -76,7 +76,7 @@ async def select_coins(
|
|
|
76
76
|
# Check for an exact match with all of the coins smaller than the amount.
|
|
77
77
|
# If we have more, smaller coins than the amount we run the next algorithm.
|
|
78
78
|
smaller_coin_sum = 0 # coins smaller than target.
|
|
79
|
-
smaller_coins:
|
|
79
|
+
smaller_coins: list[Coin] = []
|
|
80
80
|
for coin in valid_spendable_coins:
|
|
81
81
|
if coin.amount < amount:
|
|
82
82
|
smaller_coin_sum += coin.amount
|
|
@@ -90,7 +90,7 @@ async def select_coins(
|
|
|
90
90
|
log.debug(f"Selected closest greater coin: {smallest_coin.name()}")
|
|
91
91
|
return {smallest_coin}
|
|
92
92
|
elif smaller_coin_sum > amount:
|
|
93
|
-
coin_set: Optional[
|
|
93
|
+
coin_set: Optional[set[Coin]] = knapsack_coin_algorithm(
|
|
94
94
|
smaller_coins, amount, coin_selection_config.max_coin_amount, max_num_coins
|
|
95
95
|
)
|
|
96
96
|
log.debug(f"Selected coins from knapsack algorithm: {coin_set}")
|
|
@@ -119,7 +119,7 @@ async def select_coins(
|
|
|
119
119
|
|
|
120
120
|
|
|
121
121
|
# we use this to check if one of the coins exactly matches the target.
|
|
122
|
-
def check_for_exact_match(coin_list:
|
|
122
|
+
def check_for_exact_match(coin_list: list[Coin], target: uint64) -> Optional[Coin]:
|
|
123
123
|
for coin in coin_list:
|
|
124
124
|
if coin.amount == target:
|
|
125
125
|
return coin
|
|
@@ -128,7 +128,7 @@ def check_for_exact_match(coin_list: List[Coin], target: uint64) -> Optional[Coi
|
|
|
128
128
|
|
|
129
129
|
# amount of coins smaller than target, followed by a list of all valid spendable coins.
|
|
130
130
|
# Coins must be sorted in descending amount order.
|
|
131
|
-
def select_smallest_coin_over_target(target: uint128, sorted_coin_list:
|
|
131
|
+
def select_smallest_coin_over_target(target: uint128, sorted_coin_list: list[Coin]) -> Optional[Coin]:
|
|
132
132
|
if sorted_coin_list[0].amount < target:
|
|
133
133
|
return None
|
|
134
134
|
for coin in reversed(sorted_coin_list):
|
|
@@ -140,15 +140,15 @@ def select_smallest_coin_over_target(target: uint128, sorted_coin_list: List[Coi
|
|
|
140
140
|
# we use this to find the set of coins which have total value closest to the target, but at least the target.
|
|
141
141
|
# IMPORTANT: The coins have to be sorted in descending order or else this function will not work.
|
|
142
142
|
def knapsack_coin_algorithm(
|
|
143
|
-
smaller_coins:
|
|
144
|
-
) -> Optional[
|
|
143
|
+
smaller_coins: list[Coin], target: uint128, max_coin_amount: int, max_num_coins: int, seed: bytes = b"knapsack seed"
|
|
144
|
+
) -> Optional[set[Coin]]:
|
|
145
145
|
best_set_sum = max_coin_amount
|
|
146
|
-
best_set_of_coins: Optional[
|
|
146
|
+
best_set_of_coins: Optional[set[Coin]] = None
|
|
147
147
|
ran: random.Random = random.Random()
|
|
148
148
|
ran.seed(seed)
|
|
149
149
|
for i in range(1000):
|
|
150
150
|
# reset these variables every loop.
|
|
151
|
-
selected_coins:
|
|
151
|
+
selected_coins: set[Coin] = set()
|
|
152
152
|
selected_coins_sum = 0
|
|
153
153
|
n_pass = 0
|
|
154
154
|
target_reached = False
|
|
@@ -177,9 +177,9 @@ def knapsack_coin_algorithm(
|
|
|
177
177
|
|
|
178
178
|
# Adds up the largest coins in the list, resulting in the minimum number of selected coins. A solution
|
|
179
179
|
# is guaranteed if and only if the sum(coins) >= target. Coins must be sorted in descending amount order.
|
|
180
|
-
def sum_largest_coins(target: uint128, sorted_coins:
|
|
180
|
+
def sum_largest_coins(target: uint128, sorted_coins: list[Coin]) -> Optional[set[Coin]]:
|
|
181
181
|
total_value = 0
|
|
182
|
-
selected_coins:
|
|
182
|
+
selected_coins: set[Coin] = set()
|
|
183
183
|
for coin in sorted_coins:
|
|
184
184
|
total_value += coin.amount
|
|
185
185
|
selected_coins.add(coin)
|