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/wallet/trade_manager.py
CHANGED
|
@@ -4,7 +4,7 @@ import dataclasses
|
|
|
4
4
|
import logging
|
|
5
5
|
import time
|
|
6
6
|
from collections import deque
|
|
7
|
-
from typing import TYPE_CHECKING, Any,
|
|
7
|
+
from typing import TYPE_CHECKING, Any, Optional, Union
|
|
8
8
|
|
|
9
9
|
from typing_extensions import Literal
|
|
10
10
|
|
|
@@ -72,20 +72,20 @@ class TradeManager:
|
|
|
72
72
|
{
|
|
73
73
|
"coin": bytes
|
|
74
74
|
"parent_spend": bytes
|
|
75
|
-
"siblings":
|
|
76
|
-
"sibling_spends":
|
|
77
|
-
"sibling_puzzles":
|
|
78
|
-
"sibling_solutions":
|
|
75
|
+
"siblings": list[bytes] # other coins of the same type being offered
|
|
76
|
+
"sibling_spends": list[bytes] # The parent spends for the siblings
|
|
77
|
+
"sibling_puzzles": list[Program] # The inner puzzles of the siblings (always OFFER_MOD)
|
|
78
|
+
"sibling_solutions": list[Program] # The inner solution of the siblings
|
|
79
79
|
}
|
|
80
80
|
)
|
|
81
81
|
|
|
82
82
|
Wallet:
|
|
83
83
|
- Segments in this code that call general wallet methods are highlighted by comments: # ATTENTION: new wallets
|
|
84
84
|
- To be able to be traded, a wallet must implement these methods on itself:
|
|
85
|
-
- generate_signed_transaction(...) ->
|
|
85
|
+
- generate_signed_transaction(...) -> list[TransactionRecord] (See cat_wallet.py for full API)
|
|
86
86
|
- convert_puzzle_hash(puzzle_hash: bytes32) -> bytes32 # Converts a puzzlehash from outer to inner puzzle
|
|
87
87
|
- get_puzzle_info(asset_id: bytes32) -> PuzzleInfo
|
|
88
|
-
- get_coins_to_offer(asset_id: bytes32, amount: uint64) ->
|
|
88
|
+
- get_coins_to_offer(asset_id: bytes32, amount: uint64) -> set[Coin]
|
|
89
89
|
- If you would like assets from your wallet to be referenced with just a wallet ID, you must also implement:
|
|
90
90
|
- get_asset_id() -> bytes32
|
|
91
91
|
- Finally, you must make sure that your wallet will respond appropriately when these WSM methods are called:
|
|
@@ -97,7 +97,7 @@ class TradeManager:
|
|
|
97
97
|
wallet_state_manager: WalletStateManager
|
|
98
98
|
log: logging.Logger
|
|
99
99
|
trade_store: TradeStore
|
|
100
|
-
most_recently_deserialized_trade: Optional[
|
|
100
|
+
most_recently_deserialized_trade: Optional[tuple[bytes32, Offer]]
|
|
101
101
|
|
|
102
102
|
@staticmethod
|
|
103
103
|
async def create(
|
|
@@ -116,13 +116,13 @@ class TradeManager:
|
|
|
116
116
|
self.most_recently_deserialized_trade = None
|
|
117
117
|
return self
|
|
118
118
|
|
|
119
|
-
async def get_offers_with_status(self, status: TradeStatus) ->
|
|
119
|
+
async def get_offers_with_status(self, status: TradeStatus) -> list[TradeRecord]:
|
|
120
120
|
records = await self.trade_store.get_trade_record_with_status(status)
|
|
121
121
|
return records
|
|
122
122
|
|
|
123
123
|
async def get_coins_of_interest(
|
|
124
124
|
self,
|
|
125
|
-
) ->
|
|
125
|
+
) -> set[bytes32]:
|
|
126
126
|
"""
|
|
127
127
|
Returns list of coins we want to check if they are included in filter,
|
|
128
128
|
These will include coins that belong to us and coins that that on other side of treade
|
|
@@ -132,14 +132,15 @@ class TradeManager:
|
|
|
132
132
|
)
|
|
133
133
|
return coin_ids
|
|
134
134
|
|
|
135
|
-
async def
|
|
135
|
+
async def get_trades_by_coin(self, coin: Coin) -> list[TradeRecord]:
|
|
136
136
|
all_trades = await self.get_all_trades()
|
|
137
|
+
trades_by_coin = []
|
|
137
138
|
for trade in all_trades:
|
|
138
139
|
if trade.status == TradeStatus.CANCELLED.value:
|
|
139
140
|
continue
|
|
140
141
|
if coin in trade.coins_of_interest:
|
|
141
|
-
|
|
142
|
-
return
|
|
142
|
+
trades_by_coin.append(trade)
|
|
143
|
+
return trades_by_coin
|
|
143
144
|
|
|
144
145
|
async def coins_of_interest_farmed(
|
|
145
146
|
self, coin_state: CoinState, fork_height: Optional[uint32], peer: WSChiaConnection
|
|
@@ -151,64 +152,65 @@ class TradeManager:
|
|
|
151
152
|
If our coins got farmed but coins from other side didn't, we successfully canceled trade by spending inputs.
|
|
152
153
|
"""
|
|
153
154
|
self.log.info(f"coins_of_interest_farmed: {coin_state}")
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
# And get all relevant coin states
|
|
181
|
-
coin_states = await self.wallet_state_manager.wallet_node.get_coin_state(
|
|
182
|
-
our_addition_ids,
|
|
183
|
-
peer=peer,
|
|
184
|
-
fork_height=fork_height,
|
|
185
|
-
)
|
|
186
|
-
assert coin_states is not None
|
|
187
|
-
coin_state_names: List[bytes32] = [cs.coin.name() for cs in coin_states]
|
|
188
|
-
# If any of our settlement_payments were spent, this offer was a success!
|
|
189
|
-
if set(our_addition_ids) == set(coin_state_names):
|
|
190
|
-
height = coin_state.spent_height
|
|
191
|
-
assert height is not None
|
|
192
|
-
await self.trade_store.set_status(trade.trade_id, TradeStatus.CONFIRMED, index=height)
|
|
193
|
-
tx_records: List[TransactionRecord] = await self.calculate_tx_records_for_offer(offer, False)
|
|
194
|
-
for tx in tx_records:
|
|
195
|
-
if TradeStatus(trade.status) == TradeStatus.PENDING_ACCEPT:
|
|
196
|
-
await self.wallet_state_manager.add_transaction(
|
|
197
|
-
dataclasses.replace(tx, confirmed_at_height=height, confirmed=True)
|
|
198
|
-
)
|
|
155
|
+
trades = await self.get_trades_by_coin(coin_state.coin)
|
|
156
|
+
for trade in trades:
|
|
157
|
+
if trade is None:
|
|
158
|
+
self.log.error(f"Coin: {coin_state.coin}, not in any trade")
|
|
159
|
+
continue
|
|
160
|
+
if coin_state.spent_height is None:
|
|
161
|
+
self.log.error(f"Coin: {coin_state.coin}, has not been spent so trade can remain valid")
|
|
162
|
+
# Then let's filter the offer into coins that WE offered
|
|
163
|
+
if (
|
|
164
|
+
self.most_recently_deserialized_trade is not None
|
|
165
|
+
and trade.trade_id == self.most_recently_deserialized_trade[0]
|
|
166
|
+
):
|
|
167
|
+
offer = self.most_recently_deserialized_trade[1]
|
|
168
|
+
else:
|
|
169
|
+
offer = Offer.from_bytes(trade.offer)
|
|
170
|
+
self.most_recently_deserialized_trade = (trade.trade_id, offer)
|
|
171
|
+
primary_coin_ids = [c.name() for c in offer.removals()]
|
|
172
|
+
# TODO: Add `WalletCoinStore.get_coins`.
|
|
173
|
+
result = await self.wallet_state_manager.coin_store.get_coin_records(
|
|
174
|
+
coin_id_filter=HashFilter.include(primary_coin_ids)
|
|
175
|
+
)
|
|
176
|
+
our_primary_coins: list[Coin] = [cr.coin for cr in result.records]
|
|
177
|
+
our_additions: list[Coin] = list(
|
|
178
|
+
filter(lambda c: offer.get_root_removal(c) in our_primary_coins, offer.additions())
|
|
179
|
+
)
|
|
180
|
+
our_addition_ids: list[bytes32] = [c.name() for c in our_additions]
|
|
199
181
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
182
|
+
# And get all relevant coin states
|
|
183
|
+
coin_states = await self.wallet_state_manager.wallet_node.get_coin_state(
|
|
184
|
+
our_addition_ids,
|
|
185
|
+
peer=peer,
|
|
186
|
+
fork_height=fork_height,
|
|
187
|
+
)
|
|
188
|
+
assert coin_states is not None
|
|
189
|
+
coin_state_names: list[bytes32] = [cs.coin.name() for cs in coin_states]
|
|
190
|
+
# If any of our settlement_payments were spent, this offer was a success!
|
|
191
|
+
if set(our_addition_ids) == set(coin_state_names):
|
|
192
|
+
height = coin_state.spent_height
|
|
193
|
+
assert height is not None
|
|
194
|
+
await self.trade_store.set_status(trade.trade_id, TradeStatus.CONFIRMED, index=height)
|
|
195
|
+
tx_records: list[TransactionRecord] = await self.calculate_tx_records_for_offer(offer, False)
|
|
196
|
+
for tx in tx_records:
|
|
197
|
+
if TradeStatus(trade.status) == TradeStatus.PENDING_ACCEPT:
|
|
198
|
+
await self.wallet_state_manager.add_transaction(
|
|
199
|
+
dataclasses.replace(tx, confirmed_at_height=height, confirmed=True)
|
|
200
|
+
)
|
|
210
201
|
|
|
211
|
-
|
|
202
|
+
self.log.info(f"Trade with id: {trade.trade_id} confirmed at height: {height}")
|
|
203
|
+
else:
|
|
204
|
+
# In any other scenario this trade failed
|
|
205
|
+
await self.wallet_state_manager.delete_trade_transactions(trade.trade_id)
|
|
206
|
+
if trade.status == TradeStatus.PENDING_CANCEL.value:
|
|
207
|
+
await self.trade_store.set_status(trade.trade_id, TradeStatus.CANCELLED)
|
|
208
|
+
self.log.info(f"Trade with id: {trade.trade_id} canceled")
|
|
209
|
+
elif trade.status == TradeStatus.PENDING_CONFIRM.value:
|
|
210
|
+
await self.trade_store.set_status(trade.trade_id, TradeStatus.FAILED)
|
|
211
|
+
self.log.warning(f"Trade with id: {trade.trade_id} failed")
|
|
212
|
+
|
|
213
|
+
async def get_locked_coins(self) -> dict[bytes32, WalletCoinRecord]:
|
|
212
214
|
"""Returns a dictionary of confirmed coins that are locked by a trade."""
|
|
213
215
|
all_pending = []
|
|
214
216
|
pending_accept = await self.get_offers_with_status(TradeStatus.PENDING_ACCEPT)
|
|
@@ -230,8 +232,8 @@ class TradeManager:
|
|
|
230
232
|
)
|
|
231
233
|
).coin_id_to_record
|
|
232
234
|
|
|
233
|
-
async def get_all_trades(self) ->
|
|
234
|
-
all:
|
|
235
|
+
async def get_all_trades(self) -> list[TradeRecord]:
|
|
236
|
+
all: list[TradeRecord] = await self.trade_store.get_all_trades()
|
|
235
237
|
return all
|
|
236
238
|
|
|
237
239
|
async def get_trade_by_id(self, trade_id: bytes32) -> Optional[TradeRecord]:
|
|
@@ -244,22 +246,22 @@ class TradeManager:
|
|
|
244
246
|
|
|
245
247
|
async def cancel_pending_offers(
|
|
246
248
|
self,
|
|
247
|
-
|
|
249
|
+
trade_ids: list[bytes32],
|
|
248
250
|
action_scope: WalletActionScope,
|
|
249
251
|
fee: uint64 = uint64(0),
|
|
250
252
|
secure: bool = True, # Cancel with a transaction on chain
|
|
251
|
-
trade_cache:
|
|
252
|
-
extra_conditions:
|
|
253
|
+
trade_cache: dict[bytes32, TradeRecord] = {}, # Optional pre-fetched trade records for optimization
|
|
254
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
253
255
|
) -> None:
|
|
254
256
|
"""This will create a transaction that includes coins that were offered"""
|
|
255
257
|
|
|
256
258
|
# Need to do some pre-figuring of announcements that will be need to be made
|
|
257
|
-
announcement_nonce: bytes32 = std_hash(b"".join(
|
|
258
|
-
trade_records:
|
|
259
|
-
all_cancellation_coins:
|
|
260
|
-
announcement_creations:
|
|
261
|
-
announcement_assertions:
|
|
262
|
-
for trade_id in
|
|
259
|
+
announcement_nonce: bytes32 = std_hash(b"".join(trade_ids))
|
|
260
|
+
trade_records: list[TradeRecord] = []
|
|
261
|
+
all_cancellation_coins: list[list[Coin]] = []
|
|
262
|
+
announcement_creations: deque[CreateCoinAnnouncement] = deque()
|
|
263
|
+
announcement_assertions: deque[AssertCoinAnnouncement] = deque()
|
|
264
|
+
for trade_id in trade_ids:
|
|
263
265
|
if trade_id in trade_cache:
|
|
264
266
|
trade = trade_cache[trade_id]
|
|
265
267
|
else:
|
|
@@ -282,7 +284,7 @@ class TradeManager:
|
|
|
282
284
|
# Make every coin assert the announcement from the one before them
|
|
283
285
|
announcement_assertions.rotate(1)
|
|
284
286
|
|
|
285
|
-
all_txs:
|
|
287
|
+
all_txs: list[TransactionRecord] = []
|
|
286
288
|
fee_to_pay: uint64 = fee
|
|
287
289
|
for trade, cancellation_coins in zip(trade_records, all_cancellation_coins):
|
|
288
290
|
self.log.info(f"Secure-Cancel pending offer with id trade_id {trade.trade_id.hex()}")
|
|
@@ -292,8 +294,9 @@ class TradeManager:
|
|
|
292
294
|
await self.trade_store.set_status(trade.trade_id, TradeStatus.CANCELLED)
|
|
293
295
|
continue
|
|
294
296
|
|
|
295
|
-
cancellation_additions:
|
|
297
|
+
cancellation_additions: list[Coin] = []
|
|
296
298
|
valid_times: ConditionValidTimes = parse_timelock_info(extra_conditions)
|
|
299
|
+
trades_to_cancel: list[TradeRecord] = []
|
|
297
300
|
for coin in cancellation_coins:
|
|
298
301
|
wallet = await self.wallet_state_manager.get_wallet_for_coin(coin.name())
|
|
299
302
|
|
|
@@ -306,7 +309,7 @@ class TradeManager:
|
|
|
306
309
|
)
|
|
307
310
|
|
|
308
311
|
if len(trade_records) > 1 or len(cancellation_coins) > 1:
|
|
309
|
-
announcement_conditions:
|
|
312
|
+
announcement_conditions: tuple[Condition, ...] = (
|
|
310
313
|
announcement_creations.popleft(),
|
|
311
314
|
announcement_assertions.popleft(),
|
|
312
315
|
)
|
|
@@ -318,7 +321,7 @@ class TradeManager:
|
|
|
318
321
|
if wallet.type() == WalletType.STANDARD_WALLET:
|
|
319
322
|
assert isinstance(wallet, Wallet)
|
|
320
323
|
if fee_to_pay > coin.amount:
|
|
321
|
-
selected_coins:
|
|
324
|
+
selected_coins: set[Coin] = await wallet.select_coins(
|
|
322
325
|
uint64(fee_to_pay - coin.amount),
|
|
323
326
|
action_scope,
|
|
324
327
|
)
|
|
@@ -391,7 +394,14 @@ class TradeManager:
|
|
|
391
394
|
)
|
|
392
395
|
all_txs.append(incoming_tx)
|
|
393
396
|
|
|
397
|
+
# The statuses of trades which offer cancellation coin needs to be set to `PENDING_CANCEL`
|
|
398
|
+
trades_to_cancel.extend(await self.get_trades_by_coin(coin))
|
|
399
|
+
|
|
394
400
|
await self.trade_store.set_status(trade.trade_id, TradeStatus.PENDING_CANCEL)
|
|
401
|
+
self.log.info(f"Cancelling trade: {trade.trade_id}")
|
|
402
|
+
for t in trades_to_cancel:
|
|
403
|
+
await self.trade_store.set_status(t.trade_id, TradeStatus.PENDING_CANCEL)
|
|
404
|
+
self.log.info(f"Cancelling trade: {t.trade_id} along with {trade.trade_id}")
|
|
395
405
|
|
|
396
406
|
if secure:
|
|
397
407
|
async with action_scope.use() as interface:
|
|
@@ -415,9 +425,9 @@ class TradeManager:
|
|
|
415
425
|
await self.trade_store.add_trade_record(trade, offer_name)
|
|
416
426
|
|
|
417
427
|
# We want to subscribe to the coin IDs of all coins that are not the ephemeral offer coins
|
|
418
|
-
offered_coins:
|
|
419
|
-
non_offer_additions:
|
|
420
|
-
non_offer_removals:
|
|
428
|
+
offered_coins: set[Coin] = {value for values in offer.get_offered_coins().values() for value in values}
|
|
429
|
+
non_offer_additions: set[Coin] = set(offer.additions()) ^ offered_coins
|
|
430
|
+
non_offer_removals: set[Coin] = set(offer.removals()) ^ offered_coins
|
|
421
431
|
await self.wallet_state_manager.add_interested_coin_ids(
|
|
422
432
|
[coin.name() for coin in (*non_offer_removals, *non_offer_additions)]
|
|
423
433
|
)
|
|
@@ -426,15 +436,15 @@ class TradeManager:
|
|
|
426
436
|
|
|
427
437
|
async def create_offer_for_ids(
|
|
428
438
|
self,
|
|
429
|
-
offer:
|
|
439
|
+
offer: dict[Union[int, bytes32], int],
|
|
430
440
|
action_scope: WalletActionScope,
|
|
431
|
-
driver_dict: Optional[
|
|
441
|
+
driver_dict: Optional[dict[bytes32, PuzzleInfo]] = None,
|
|
432
442
|
solver: Optional[Solver] = None,
|
|
433
443
|
fee: uint64 = uint64(0),
|
|
434
444
|
validate_only: bool = False,
|
|
435
|
-
extra_conditions:
|
|
445
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
436
446
|
taking: bool = False,
|
|
437
|
-
) -> Union[
|
|
447
|
+
) -> Union[tuple[Literal[True], TradeRecord, None], tuple[Literal[False], None, str]]:
|
|
438
448
|
if driver_dict is None:
|
|
439
449
|
driver_dict = {}
|
|
440
450
|
if solver is None:
|
|
@@ -476,14 +486,14 @@ class TradeManager:
|
|
|
476
486
|
|
|
477
487
|
async def _create_offer_for_ids(
|
|
478
488
|
self,
|
|
479
|
-
offer_dict:
|
|
489
|
+
offer_dict: dict[Union[int, bytes32], int],
|
|
480
490
|
action_scope: WalletActionScope,
|
|
481
|
-
driver_dict: Optional[
|
|
491
|
+
driver_dict: Optional[dict[bytes32, PuzzleInfo]] = None,
|
|
482
492
|
solver: Optional[Solver] = None,
|
|
483
493
|
fee: uint64 = uint64(0),
|
|
484
|
-
extra_conditions:
|
|
494
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
485
495
|
taking: bool = False,
|
|
486
|
-
) -> Union[
|
|
496
|
+
) -> Union[tuple[Literal[True], Offer, None], tuple[Literal[False], None, str]]:
|
|
487
497
|
"""
|
|
488
498
|
Offer is dictionary of wallet ids and amount
|
|
489
499
|
"""
|
|
@@ -492,23 +502,28 @@ class TradeManager:
|
|
|
492
502
|
if solver is None:
|
|
493
503
|
solver = Solver({})
|
|
494
504
|
try:
|
|
495
|
-
coins_to_offer:
|
|
496
|
-
requested_payments:
|
|
497
|
-
offer_dict_no_ints:
|
|
505
|
+
coins_to_offer: dict[Union[int, bytes32], set[Coin]] = {}
|
|
506
|
+
requested_payments: dict[Optional[bytes32], list[Payment]] = {}
|
|
507
|
+
offer_dict_no_ints: dict[Optional[bytes32], int] = {}
|
|
498
508
|
for id, amount in offer_dict.items():
|
|
499
509
|
asset_id: Optional[bytes32] = None
|
|
500
510
|
# asset_id can either be none if asset is XCH or
|
|
501
511
|
# bytes32 if another asset (e.g. NFT, CAT)
|
|
502
512
|
if amount > 0:
|
|
503
513
|
# this is what we are receiving in the trade
|
|
504
|
-
memos:
|
|
514
|
+
memos: list[bytes] = []
|
|
505
515
|
if isinstance(id, int):
|
|
506
516
|
wallet_id = uint32(id)
|
|
507
517
|
wallet = self.wallet_state_manager.wallets.get(wallet_id)
|
|
508
518
|
assert isinstance(wallet, (CATWallet, Wallet))
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
519
|
+
if isinstance(wallet, Wallet):
|
|
520
|
+
p2_ph: bytes32 = await wallet.get_puzzle_hash(
|
|
521
|
+
new=not action_scope.config.tx_config.reuse_puzhash
|
|
522
|
+
)
|
|
523
|
+
else:
|
|
524
|
+
p2_ph = await wallet.standard_wallet.get_puzzle_hash(
|
|
525
|
+
new=not action_scope.config.tx_config.reuse_puzhash
|
|
526
|
+
)
|
|
512
527
|
if wallet.type() != WalletType.STANDARD_WALLET:
|
|
513
528
|
if callable(getattr(wallet, "get_asset_id", None)): # ATTENTION: new wallets
|
|
514
529
|
assert isinstance(wallet, CATWallet)
|
|
@@ -601,13 +616,13 @@ class TradeManager:
|
|
|
601
616
|
if potential_special_offer is not None:
|
|
602
617
|
return True, potential_special_offer, None
|
|
603
618
|
|
|
604
|
-
all_coins:
|
|
605
|
-
notarized_payments:
|
|
619
|
+
all_coins: list[Coin] = [c for coins in coins_to_offer.values() for c in coins]
|
|
620
|
+
notarized_payments: dict[Optional[bytes32], list[NotarizedPayment]] = Offer.notarize_payments(
|
|
606
621
|
requested_payments, all_coins
|
|
607
622
|
)
|
|
608
623
|
announcements_to_assert = Offer.calculate_announcements(notarized_payments, driver_dict)
|
|
609
624
|
|
|
610
|
-
all_transactions:
|
|
625
|
+
all_transactions: list[TransactionRecord] = []
|
|
611
626
|
fee_left_to_pay: uint64 = fee
|
|
612
627
|
# The access of the sorted keys here makes sure we create the XCH transaction first to make sure we pay fee
|
|
613
628
|
# with the XCH side of the offer and don't create an extra fee transaction in other wallets.
|
|
@@ -689,9 +704,9 @@ class TradeManager:
|
|
|
689
704
|
await wsm.create_wallet_for_puzzle_info(offer.driver_dict[key])
|
|
690
705
|
|
|
691
706
|
async def check_offer_validity(self, offer: Offer, peer: WSChiaConnection) -> bool:
|
|
692
|
-
all_removals:
|
|
693
|
-
all_removal_names:
|
|
694
|
-
non_ephemeral_removals:
|
|
707
|
+
all_removals: list[Coin] = offer.removals()
|
|
708
|
+
all_removal_names: list[bytes32] = [c.name() for c in all_removals]
|
|
709
|
+
non_ephemeral_removals: list[Coin] = list(
|
|
695
710
|
filter(lambda c: c.parent_coin_info not in all_removal_names, all_removals)
|
|
696
711
|
)
|
|
697
712
|
coin_states = await self.wallet_state_manager.wallet_node.get_coin_state(
|
|
@@ -700,27 +715,27 @@ class TradeManager:
|
|
|
700
715
|
|
|
701
716
|
return len(coin_states) == len(non_ephemeral_removals) and all([cs.spent_height is None for cs in coin_states])
|
|
702
717
|
|
|
703
|
-
async def calculate_tx_records_for_offer(self, offer: Offer, validate: bool) ->
|
|
718
|
+
async def calculate_tx_records_for_offer(self, offer: Offer, validate: bool) -> list[TransactionRecord]:
|
|
704
719
|
if validate:
|
|
705
720
|
final_spend_bundle: WalletSpendBundle = offer.to_valid_spend()
|
|
706
|
-
hint_dict:
|
|
707
|
-
additions_dict:
|
|
721
|
+
hint_dict: dict[bytes32, bytes32] = {}
|
|
722
|
+
additions_dict: dict[bytes32, Coin] = {}
|
|
708
723
|
for hinted_coins, _ in (
|
|
709
724
|
compute_spend_hints_and_additions(spend) for spend in final_spend_bundle.coin_spends
|
|
710
725
|
):
|
|
711
726
|
hint_dict.update({id: hc.hint for id, hc in hinted_coins.items() if hc.hint is not None})
|
|
712
727
|
additions_dict.update({id: hc.coin for id, hc in hinted_coins.items()})
|
|
713
|
-
all_additions:
|
|
728
|
+
all_additions: list[Coin] = list(a for a in additions_dict.values())
|
|
714
729
|
else:
|
|
715
730
|
final_spend_bundle = offer._bundle
|
|
716
731
|
hint_dict = offer.hints()
|
|
717
732
|
all_additions = offer.additions()
|
|
718
733
|
|
|
719
|
-
settlement_coins:
|
|
720
|
-
settlement_coin_ids:
|
|
734
|
+
settlement_coins: list[Coin] = [c for coins in offer.get_offered_coins().values() for c in coins]
|
|
735
|
+
settlement_coin_ids: list[bytes32] = [c.name() for c in settlement_coins]
|
|
721
736
|
|
|
722
|
-
removals:
|
|
723
|
-
additions:
|
|
737
|
+
removals: list[Coin] = final_spend_bundle.removals()
|
|
738
|
+
additions: list[Coin] = list(a for a in all_additions if a not in removals)
|
|
724
739
|
valid_times: ConditionValidTimes = parse_timelock_info(
|
|
725
740
|
parse_conditions_non_consensus(
|
|
726
741
|
condition
|
|
@@ -733,7 +748,7 @@ class TradeManager:
|
|
|
733
748
|
|
|
734
749
|
txs = []
|
|
735
750
|
|
|
736
|
-
addition_dict:
|
|
751
|
+
addition_dict: dict[uint32, list[Coin]] = {}
|
|
737
752
|
for addition in additions:
|
|
738
753
|
wallet_identifier = await self.wallet_state_manager.get_wallet_identifier_for_coin(
|
|
739
754
|
addition,
|
|
@@ -770,7 +785,7 @@ class TradeManager:
|
|
|
770
785
|
addition_dict[wallet_identifier.id].append(addition)
|
|
771
786
|
|
|
772
787
|
# While we want additions to show up as separate records, removals of the same wallet should show as one
|
|
773
|
-
removal_dict:
|
|
788
|
+
removal_dict: dict[uint32, list[Coin]] = {}
|
|
774
789
|
for removal in removals:
|
|
775
790
|
wallet_identifier = await self.wallet_state_manager.get_wallet_identifier_for_coin(
|
|
776
791
|
removal,
|
|
@@ -780,7 +795,7 @@ class TradeManager:
|
|
|
780
795
|
removal_dict.setdefault(wallet_identifier.id, [])
|
|
781
796
|
removal_dict[wallet_identifier.id].append(removal)
|
|
782
797
|
|
|
783
|
-
all_removals:
|
|
798
|
+
all_removals: list[bytes32] = [r.name() for removals in removal_dict.values() for r in removals]
|
|
784
799
|
|
|
785
800
|
for wid, grouped_removals in removal_dict.items():
|
|
786
801
|
wallet = self.wallet_state_manager.wallets[wid]
|
|
@@ -788,12 +803,12 @@ class TradeManager:
|
|
|
788
803
|
removal_tree_hash = Program.to([coin_as_list(rem) for rem in grouped_removals]).get_tree_hash()
|
|
789
804
|
# We also need to calculate the sent amount
|
|
790
805
|
removed: int = sum(c.amount for c in grouped_removals)
|
|
791
|
-
removed_ids:
|
|
792
|
-
all_additions_from_grouped_removals:
|
|
806
|
+
removed_ids: list[bytes32] = [c.name() for c in grouped_removals]
|
|
807
|
+
all_additions_from_grouped_removals: list[Coin] = [
|
|
793
808
|
c for c in all_additions if c.parent_coin_info in removed_ids
|
|
794
809
|
]
|
|
795
|
-
potential_change_coins:
|
|
796
|
-
change_coins:
|
|
810
|
+
potential_change_coins: list[Coin] = addition_dict[wid] if wid in addition_dict else []
|
|
811
|
+
change_coins: list[Coin] = [c for c in potential_change_coins if c.parent_coin_info in all_removals]
|
|
797
812
|
change_amount: int = sum(c.amount for c in change_coins)
|
|
798
813
|
sent_amount: int = (
|
|
799
814
|
removed
|
|
@@ -835,12 +850,12 @@ class TradeManager:
|
|
|
835
850
|
action_scope: WalletActionScope,
|
|
836
851
|
solver: Optional[Solver] = None,
|
|
837
852
|
fee: uint64 = uint64(0),
|
|
838
|
-
extra_conditions:
|
|
853
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
839
854
|
) -> TradeRecord:
|
|
840
855
|
if solver is None:
|
|
841
856
|
solver = Solver({})
|
|
842
|
-
take_offer_dict:
|
|
843
|
-
arbitrage:
|
|
857
|
+
take_offer_dict: dict[Union[bytes32, int], int] = {}
|
|
858
|
+
arbitrage: dict[Optional[bytes32], int] = offer.arbitrage()
|
|
844
859
|
|
|
845
860
|
for asset_id, amount in arbitrage.items():
|
|
846
861
|
if asset_id is None:
|
|
@@ -852,7 +867,7 @@ class TradeManager:
|
|
|
852
867
|
wallet = await self.wallet_state_manager.get_wallet_for_asset_id(asset_id.hex())
|
|
853
868
|
if wallet is None and amount < 0:
|
|
854
869
|
raise ValueError(f"Do not have a wallet for asset ID: {asset_id} to fulfill offer")
|
|
855
|
-
elif wallet is None or wallet.type() in
|
|
870
|
+
elif wallet is None or wallet.type() in {WalletType.NFT, WalletType.DATA_LAYER}:
|
|
856
871
|
key = asset_id
|
|
857
872
|
else:
|
|
858
873
|
key = int(wallet.id())
|
|
@@ -878,7 +893,7 @@ class TradeManager:
|
|
|
878
893
|
if not result[0] or result[1] is None:
|
|
879
894
|
raise ValueError(result[2])
|
|
880
895
|
|
|
881
|
-
|
|
896
|
+
_success, take_offer, _error = result
|
|
882
897
|
|
|
883
898
|
complete_offer, valid_spend_solver = await self.check_for_final_modifications(
|
|
884
899
|
Offer.aggregate([offer, take_offer]), solver, inner_action_scope
|
|
@@ -890,7 +905,7 @@ class TradeManager:
|
|
|
890
905
|
)
|
|
891
906
|
await self.maybe_create_wallets_for_offer(complete_offer)
|
|
892
907
|
|
|
893
|
-
tx_records:
|
|
908
|
+
tx_records: list[TransactionRecord] = await self.calculate_tx_records_for_offer(complete_offer, True)
|
|
894
909
|
|
|
895
910
|
trade_record: TradeRecord = TradeRecord(
|
|
896
911
|
confirmed_at_index=uint32(0),
|
|
@@ -917,12 +932,12 @@ class TradeManager:
|
|
|
917
932
|
|
|
918
933
|
async def check_for_special_offer_making(
|
|
919
934
|
self,
|
|
920
|
-
offer_dict:
|
|
921
|
-
driver_dict:
|
|
935
|
+
offer_dict: dict[Optional[bytes32], int],
|
|
936
|
+
driver_dict: dict[bytes32, PuzzleInfo],
|
|
922
937
|
action_scope: WalletActionScope,
|
|
923
938
|
solver: Solver,
|
|
924
939
|
fee: uint64 = uint64(0),
|
|
925
|
-
extra_conditions:
|
|
940
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
926
941
|
) -> Optional[Offer]:
|
|
927
942
|
for puzzle_info in driver_dict.values():
|
|
928
943
|
if (
|
|
@@ -974,7 +989,7 @@ class TradeManager:
|
|
|
974
989
|
return True
|
|
975
990
|
return False
|
|
976
991
|
|
|
977
|
-
async def get_offer_summary(self, offer: Offer) ->
|
|
992
|
+
async def get_offer_summary(self, offer: Offer) -> dict[str, Any]:
|
|
978
993
|
for puzzle_info in offer.driver_dict.values():
|
|
979
994
|
if (
|
|
980
995
|
puzzle_info.check_type(
|
|
@@ -999,18 +1014,18 @@ class TradeManager:
|
|
|
999
1014
|
k: v
|
|
1000
1015
|
for k, v in valid_times.to_json_dict().items()
|
|
1001
1016
|
if k
|
|
1002
|
-
not in
|
|
1017
|
+
not in {
|
|
1003
1018
|
"max_secs_after_created",
|
|
1004
1019
|
"min_secs_since_created",
|
|
1005
1020
|
"max_blocks_after_created",
|
|
1006
1021
|
"min_blocks_since_created",
|
|
1007
|
-
|
|
1022
|
+
}
|
|
1008
1023
|
},
|
|
1009
1024
|
}
|
|
1010
1025
|
|
|
1011
1026
|
async def check_for_final_modifications(
|
|
1012
1027
|
self, offer: Offer, solver: Solver, action_scope: WalletActionScope
|
|
1013
|
-
) ->
|
|
1028
|
+
) -> tuple[Offer, Solver]:
|
|
1014
1029
|
for puzzle_info in offer.driver_dict.values():
|
|
1015
1030
|
if (
|
|
1016
1031
|
puzzle_info.check_type(
|
|
@@ -1033,17 +1048,16 @@ class TradeManager:
|
|
|
1033
1048
|
if WalletType(wallet.type()) == WalletType.VC:
|
|
1034
1049
|
assert isinstance(wallet, VCWallet)
|
|
1035
1050
|
return await wallet.add_vc_authorization(offer, solver, action_scope)
|
|
1036
|
-
|
|
1037
|
-
raise ValueError("No VCs to approve CR-CATs with") # pragma: no cover
|
|
1051
|
+
raise ValueError("No VCs to approve CR-CATs with") # pragma: no cover
|
|
1038
1052
|
|
|
1039
1053
|
return offer, Solver({})
|
|
1040
1054
|
|
|
1041
1055
|
async def check_for_requested_payment_modifications(
|
|
1042
1056
|
self,
|
|
1043
|
-
requested_payments:
|
|
1044
|
-
driver_dict:
|
|
1057
|
+
requested_payments: dict[Optional[bytes32], list[Payment]],
|
|
1058
|
+
driver_dict: dict[bytes32, PuzzleInfo],
|
|
1045
1059
|
taking: bool,
|
|
1046
|
-
) ->
|
|
1060
|
+
) -> dict[Optional[bytes32], list[Payment]]:
|
|
1047
1061
|
# This function exclusively deals with CR-CATs for now
|
|
1048
1062
|
if not taking:
|
|
1049
1063
|
for asset_id, puzzle_info in driver_dict.items():
|
chia/wallet/trade_record.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Any,
|
|
4
|
+
from typing import Any, Optional, TypeVar
|
|
5
5
|
|
|
6
6
|
from chia.types.blockchain_format.coin import Coin
|
|
7
7
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
@@ -28,12 +28,12 @@ class TradeRecordOld(Streamable):
|
|
|
28
28
|
sent: uint32
|
|
29
29
|
offer: bytes
|
|
30
30
|
taken_offer: Optional[bytes]
|
|
31
|
-
coins_of_interest:
|
|
31
|
+
coins_of_interest: list[Coin]
|
|
32
32
|
trade_id: bytes32
|
|
33
33
|
status: uint32 # TradeStatus, enum not streamable
|
|
34
|
-
sent_to:
|
|
34
|
+
sent_to: list[tuple[str, uint8, Optional[str]]] # MempoolSubmissionStatus.status enum not streamable
|
|
35
35
|
|
|
36
|
-
def to_json_dict_convenience(self) ->
|
|
36
|
+
def to_json_dict_convenience(self) -> dict[str, Any]:
|
|
37
37
|
formatted = self.to_json_dict()
|
|
38
38
|
formatted["status"] = TradeStatus(self.status).name
|
|
39
39
|
offer_to_summarize: bytes = self.offer if self.taken_offer is None else self.taken_offer
|
|
@@ -51,7 +51,7 @@ class TradeRecordOld(Streamable):
|
|
|
51
51
|
|
|
52
52
|
@classmethod
|
|
53
53
|
def from_json_dict_convenience(
|
|
54
|
-
cls:
|
|
54
|
+
cls: type[_T_TradeRecord], record: dict[str, Any], offer: str = ""
|
|
55
55
|
) -> _T_TradeRecord:
|
|
56
56
|
new_record = record.copy()
|
|
57
57
|
new_record["status"] = TradeStatus[record["status"]].value
|