chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__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.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.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.0rc1.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
chia/wallet/trading/offer.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass, field
|
|
4
|
-
from typing import Any, BinaryIO,
|
|
4
|
+
from typing import Any, BinaryIO, Optional, Union
|
|
5
5
|
|
|
6
6
|
from chia_rs import G2Element
|
|
7
7
|
from clvm_tools.binutils import disassemble
|
|
@@ -45,12 +45,11 @@ from chia.wallet.wallet_spend_bundle import WalletSpendBundle
|
|
|
45
45
|
|
|
46
46
|
OFFER_MOD = load_clvm_maybe_recompile("settlement_payments.clsp")
|
|
47
47
|
OFFER_MOD_HASH = OFFER_MOD.get_tree_hash()
|
|
48
|
-
ZERO_32 = bytes32([0] * 32)
|
|
49
48
|
|
|
50
49
|
|
|
51
50
|
def detect_dependent_coin(
|
|
52
|
-
names:
|
|
53
|
-
) -> Optional[
|
|
51
|
+
names: list[bytes32], deps: dict[bytes32, list[bytes32]], announcement_dict: dict[bytes32, list[bytes32]]
|
|
52
|
+
) -> Optional[tuple[bytes32, bytes32]]:
|
|
54
53
|
# First, we check for any dependencies on coins in the same bundle
|
|
55
54
|
for name in names:
|
|
56
55
|
for dependency in deps[name]:
|
|
@@ -63,7 +62,7 @@ def detect_dependent_coin(
|
|
|
63
62
|
|
|
64
63
|
@dataclass(frozen=True)
|
|
65
64
|
class NotarizedPayment(Payment):
|
|
66
|
-
nonce: bytes32 =
|
|
65
|
+
nonce: bytes32 = bytes32.zeros
|
|
67
66
|
|
|
68
67
|
@classmethod
|
|
69
68
|
def from_condition_and_nonce(cls, condition: Program, nonce: bytes32) -> NotarizedPayment:
|
|
@@ -75,19 +74,19 @@ class NotarizedPayment(Payment):
|
|
|
75
74
|
|
|
76
75
|
@dataclass(frozen=True, eq=False)
|
|
77
76
|
class Offer:
|
|
78
|
-
requested_payments:
|
|
79
|
-
Optional[bytes32],
|
|
77
|
+
requested_payments: dict[
|
|
78
|
+
Optional[bytes32], list[NotarizedPayment]
|
|
80
79
|
] # The key is the asset id of the asset being requested
|
|
81
80
|
_bundle: WalletSpendBundle
|
|
82
|
-
driver_dict:
|
|
81
|
+
driver_dict: dict[bytes32, PuzzleInfo] # asset_id -> asset driver
|
|
83
82
|
|
|
84
83
|
# this is a cache of the coin additions made by the SpendBundle (_bundle)
|
|
85
84
|
# ordered by the coin being spent
|
|
86
|
-
_additions:
|
|
87
|
-
_hints:
|
|
88
|
-
_offered_coins:
|
|
85
|
+
_additions: dict[Coin, list[Coin]] = field(init=False, repr=False)
|
|
86
|
+
_hints: dict[bytes32, bytes32] = field(init=False)
|
|
87
|
+
_offered_coins: dict[Optional[bytes32], list[Coin]] = field(init=False, repr=False)
|
|
89
88
|
_final_spend_bundle: Optional[WalletSpendBundle] = field(init=False, repr=False)
|
|
90
|
-
_conditions: Optional[
|
|
89
|
+
_conditions: Optional[dict[Coin, list[Condition]]] = field(init=False)
|
|
91
90
|
|
|
92
91
|
@staticmethod
|
|
93
92
|
def ph() -> bytes32:
|
|
@@ -95,15 +94,15 @@ class Offer:
|
|
|
95
94
|
|
|
96
95
|
@staticmethod
|
|
97
96
|
def notarize_payments(
|
|
98
|
-
requested_payments:
|
|
99
|
-
coins:
|
|
100
|
-
) ->
|
|
97
|
+
requested_payments: dict[Optional[bytes32], list[Payment]], # `None` means you are requesting XCH
|
|
98
|
+
coins: list[Coin],
|
|
99
|
+
) -> dict[Optional[bytes32], list[NotarizedPayment]]:
|
|
101
100
|
# This sort should be reproducible in CLVM with `>s`
|
|
102
|
-
sorted_coins:
|
|
103
|
-
sorted_coin_list:
|
|
101
|
+
sorted_coins: list[Coin] = sorted(coins, key=Coin.name)
|
|
102
|
+
sorted_coin_list: list[list[Union[bytes32, uint64]]] = [coin_as_list(c) for c in sorted_coins]
|
|
104
103
|
nonce: bytes32 = Program.to(sorted_coin_list).get_tree_hash()
|
|
105
104
|
|
|
106
|
-
notarized_payments:
|
|
105
|
+
notarized_payments: dict[Optional[bytes32], list[NotarizedPayment]] = {}
|
|
107
106
|
for asset_id, payments in requested_payments.items():
|
|
108
107
|
notarized_payments[asset_id] = []
|
|
109
108
|
for p in payments:
|
|
@@ -115,10 +114,10 @@ class Offer:
|
|
|
115
114
|
# The announcements returned from this function must be asserted in whatever spend bundle is created by the wallet
|
|
116
115
|
@staticmethod
|
|
117
116
|
def calculate_announcements(
|
|
118
|
-
notarized_payments:
|
|
119
|
-
driver_dict:
|
|
120
|
-
) ->
|
|
121
|
-
announcements:
|
|
117
|
+
notarized_payments: dict[Optional[bytes32], list[NotarizedPayment]],
|
|
118
|
+
driver_dict: dict[bytes32, PuzzleInfo],
|
|
119
|
+
) -> list[AssertPuzzleAnnouncement]:
|
|
120
|
+
announcements: list[AssertPuzzleAnnouncement] = []
|
|
122
121
|
for asset_id, payments in notarized_payments.items():
|
|
123
122
|
if asset_id is not None:
|
|
124
123
|
if asset_id not in driver_dict:
|
|
@@ -135,7 +134,7 @@ class Offer:
|
|
|
135
134
|
def __post_init__(self) -> None:
|
|
136
135
|
# Verify that there are no duplicate payments
|
|
137
136
|
for payments in self.requested_payments.values():
|
|
138
|
-
payment_programs:
|
|
137
|
+
payment_programs: list[bytes32] = [p.name() for p in payments]
|
|
139
138
|
if len(set(payment_programs)) != len(payment_programs):
|
|
140
139
|
raise ValueError("Bundle has duplicate requested payments")
|
|
141
140
|
|
|
@@ -145,8 +144,8 @@ class Offer:
|
|
|
145
144
|
raise ValueError("Offer does not have enough driver information about the requested payments")
|
|
146
145
|
|
|
147
146
|
# populate the _additions cache
|
|
148
|
-
adds:
|
|
149
|
-
hints:
|
|
147
|
+
adds: dict[Coin, list[Coin]] = {}
|
|
148
|
+
hints: dict[bytes32, bytes32] = {}
|
|
150
149
|
max_cost = int(DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM)
|
|
151
150
|
for cs in self._bundle.coin_spends:
|
|
152
151
|
# you can't spend the same coin twice in the same SpendBundle
|
|
@@ -164,9 +163,9 @@ class Offer:
|
|
|
164
163
|
object.__setattr__(self, "_hints", hints)
|
|
165
164
|
object.__setattr__(self, "_conditions", None)
|
|
166
165
|
|
|
167
|
-
def conditions(self) ->
|
|
166
|
+
def conditions(self) -> dict[Coin, list[Condition]]:
|
|
168
167
|
if self._conditions is None:
|
|
169
|
-
conditions:
|
|
168
|
+
conditions: dict[Coin, list[Condition]] = {}
|
|
170
169
|
max_cost = int(DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM)
|
|
171
170
|
for cs in self._bundle.coin_spends:
|
|
172
171
|
try:
|
|
@@ -181,7 +180,7 @@ class Offer:
|
|
|
181
180
|
assert self._conditions is not None, "self._conditions is None"
|
|
182
181
|
return self._conditions
|
|
183
182
|
|
|
184
|
-
def valid_times(self) ->
|
|
183
|
+
def valid_times(self) -> dict[Coin, ConditionValidTimes]:
|
|
185
184
|
return {coin: parse_timelock_info(conditions) for coin, conditions in self.conditions().items()}
|
|
186
185
|
|
|
187
186
|
def absolute_valid_times_ban_relatives(self) -> ConditionValidTimes:
|
|
@@ -197,13 +196,13 @@ class Offer:
|
|
|
197
196
|
raise ValueError("Offers with relative timelocks are not currently supported")
|
|
198
197
|
return valid_times
|
|
199
198
|
|
|
200
|
-
def hints(self) ->
|
|
199
|
+
def hints(self) -> dict[bytes32, bytes32]:
|
|
201
200
|
return self._hints
|
|
202
201
|
|
|
203
|
-
def additions(self) ->
|
|
202
|
+
def additions(self) -> list[Coin]:
|
|
204
203
|
return [c for additions in self._additions.values() for c in additions]
|
|
205
204
|
|
|
206
|
-
def removals(self) ->
|
|
205
|
+
def removals(self) -> list[Coin]:
|
|
207
206
|
return self._bundle.removals()
|
|
208
207
|
|
|
209
208
|
def fees(self) -> int:
|
|
@@ -212,7 +211,7 @@ class Offer:
|
|
|
212
211
|
amount_out = sum(_.amount for _ in self.additions())
|
|
213
212
|
return int(amount_in - amount_out)
|
|
214
213
|
|
|
215
|
-
def coin_spends(self) ->
|
|
214
|
+
def coin_spends(self) -> list[CoinSpend]:
|
|
216
215
|
return self._bundle.coin_spends
|
|
217
216
|
|
|
218
217
|
def aggregated_signature(self) -> G2Element:
|
|
@@ -220,15 +219,15 @@ class Offer:
|
|
|
220
219
|
|
|
221
220
|
# This method does not get every coin that is being offered, only the `settlement_payment` children
|
|
222
221
|
# It's also a little heuristic, but it should get most things
|
|
223
|
-
def _get_offered_coins(self) ->
|
|
224
|
-
offered_coins:
|
|
222
|
+
def _get_offered_coins(self) -> dict[Optional[bytes32], list[Coin]]:
|
|
223
|
+
offered_coins: dict[Optional[bytes32], list[Coin]] = {}
|
|
225
224
|
|
|
226
225
|
for parent_spend in self._bundle.coin_spends:
|
|
227
|
-
coins_for_this_spend:
|
|
226
|
+
coins_for_this_spend: list[Coin] = []
|
|
228
227
|
|
|
229
228
|
parent_puzzle: UncurriedPuzzle = uncurry_puzzle(parent_spend.puzzle_reveal)
|
|
230
229
|
parent_solution: Program = parent_spend.solution.to_program()
|
|
231
|
-
additions:
|
|
230
|
+
additions: list[Coin] = self._additions[parent_spend.coin]
|
|
232
231
|
|
|
233
232
|
puzzle_driver = match_puzzle(parent_puzzle)
|
|
234
233
|
if puzzle_driver is not None:
|
|
@@ -240,7 +239,7 @@ class Offer:
|
|
|
240
239
|
# We're going to look at the conditions created by the inner puzzle
|
|
241
240
|
conditions: Program = inner_puzzle.run(inner_solution)
|
|
242
241
|
expected_num_matches: int = 0
|
|
243
|
-
offered_amounts:
|
|
242
|
+
offered_amounts: list[int] = []
|
|
244
243
|
for condition in conditions.as_iter():
|
|
245
244
|
if condition.first() == 51 and condition.rest().first() == OFFER_MOD_HASH:
|
|
246
245
|
expected_num_matches += 1
|
|
@@ -281,7 +280,7 @@ class Offer:
|
|
|
281
280
|
offered_coins[asset_id].extend(coins_for_this_spend)
|
|
282
281
|
return offered_coins
|
|
283
282
|
|
|
284
|
-
def get_offered_coins(self) ->
|
|
283
|
+
def get_offered_coins(self) -> dict[Optional[bytes32], list[Coin]]:
|
|
285
284
|
try:
|
|
286
285
|
if self._offered_coins is not None:
|
|
287
286
|
return self._offered_coins
|
|
@@ -289,52 +288,52 @@ class Offer:
|
|
|
289
288
|
object.__setattr__(self, "_offered_coins", self._get_offered_coins())
|
|
290
289
|
return self._offered_coins
|
|
291
290
|
|
|
292
|
-
def get_offered_amounts(self) ->
|
|
293
|
-
offered_coins:
|
|
294
|
-
offered_amounts:
|
|
291
|
+
def get_offered_amounts(self) -> dict[Optional[bytes32], int]:
|
|
292
|
+
offered_coins: dict[Optional[bytes32], list[Coin]] = self.get_offered_coins()
|
|
293
|
+
offered_amounts: dict[Optional[bytes32], int] = {}
|
|
295
294
|
for asset_id, coins in offered_coins.items():
|
|
296
295
|
offered_amounts[asset_id] = uint64(sum(c.amount for c in coins))
|
|
297
296
|
return offered_amounts
|
|
298
297
|
|
|
299
|
-
def get_requested_payments(self) ->
|
|
298
|
+
def get_requested_payments(self) -> dict[Optional[bytes32], list[NotarizedPayment]]:
|
|
300
299
|
return self.requested_payments
|
|
301
300
|
|
|
302
|
-
def get_requested_amounts(self) ->
|
|
303
|
-
requested_amounts:
|
|
301
|
+
def get_requested_amounts(self) -> dict[Optional[bytes32], int]:
|
|
302
|
+
requested_amounts: dict[Optional[bytes32], int] = {}
|
|
304
303
|
for asset_id, coins in self.get_requested_payments().items():
|
|
305
304
|
requested_amounts[asset_id] = uint64(sum(c.amount for c in coins))
|
|
306
305
|
return requested_amounts
|
|
307
306
|
|
|
308
|
-
def arbitrage(self) ->
|
|
307
|
+
def arbitrage(self) -> dict[Optional[bytes32], int]:
|
|
309
308
|
"""
|
|
310
309
|
Returns a dictionary of the type of each asset and amount that is involved in the trade
|
|
311
310
|
With the amount being how much their offered amount within the offer
|
|
312
311
|
exceeds/falls short of their requested amount.
|
|
313
312
|
"""
|
|
314
|
-
offered_amounts:
|
|
315
|
-
requested_amounts:
|
|
313
|
+
offered_amounts: dict[Optional[bytes32], int] = self.get_offered_amounts()
|
|
314
|
+
requested_amounts: dict[Optional[bytes32], int] = self.get_requested_amounts()
|
|
316
315
|
|
|
317
|
-
arbitrage_dict:
|
|
316
|
+
arbitrage_dict: dict[Optional[bytes32], int] = {}
|
|
318
317
|
for asset_id in [*requested_amounts.keys(), *offered_amounts.keys()]:
|
|
319
318
|
arbitrage_dict[asset_id] = offered_amounts.get(asset_id, 0) - requested_amounts.get(asset_id, 0)
|
|
320
319
|
|
|
321
320
|
return arbitrage_dict
|
|
322
321
|
|
|
323
322
|
# This is a method mostly for the UI that creates a JSON summary of the offer
|
|
324
|
-
def summary(self) ->
|
|
325
|
-
offered_amounts:
|
|
326
|
-
requested_amounts:
|
|
323
|
+
def summary(self) -> tuple[dict[str, int], dict[str, int], dict[str, dict[str, Any]], ConditionValidTimes]:
|
|
324
|
+
offered_amounts: dict[Optional[bytes32], int] = self.get_offered_amounts()
|
|
325
|
+
requested_amounts: dict[Optional[bytes32], int] = self.get_requested_amounts()
|
|
327
326
|
|
|
328
|
-
def keys_to_strings(dic:
|
|
329
|
-
new_dic:
|
|
330
|
-
for key in dic:
|
|
327
|
+
def keys_to_strings(dic: dict[Optional[bytes32], Any]) -> dict[str, Any]:
|
|
328
|
+
new_dic: dict[str, Any] = {}
|
|
329
|
+
for key, val in dic.items():
|
|
331
330
|
if key is None:
|
|
332
|
-
new_dic["xch"] =
|
|
331
|
+
new_dic["xch"] = val
|
|
333
332
|
else:
|
|
334
|
-
new_dic[key.hex()] =
|
|
333
|
+
new_dic[key.hex()] = val
|
|
335
334
|
return new_dic
|
|
336
335
|
|
|
337
|
-
driver_dict:
|
|
336
|
+
driver_dict: dict[str, Any] = {}
|
|
338
337
|
for key, value in self.driver_dict.items():
|
|
339
338
|
driver_dict[key.hex()] = value.info
|
|
340
339
|
|
|
@@ -347,12 +346,12 @@ class Offer:
|
|
|
347
346
|
|
|
348
347
|
# Also mostly for the UI, returns a dictionary of assets and how much of them is pended for this offer
|
|
349
348
|
# This method is also imperfect for sufficiently complex spends
|
|
350
|
-
def get_pending_amounts(self) ->
|
|
351
|
-
all_additions:
|
|
352
|
-
all_removals:
|
|
353
|
-
non_ephemeral_removals:
|
|
349
|
+
def get_pending_amounts(self) -> dict[str, int]:
|
|
350
|
+
all_additions: list[Coin] = self.additions()
|
|
351
|
+
all_removals: list[Coin] = self.removals()
|
|
352
|
+
non_ephemeral_removals: list[Coin] = list(filter(lambda c: c not in all_additions, all_removals))
|
|
354
353
|
|
|
355
|
-
pending_dict:
|
|
354
|
+
pending_dict: dict[str, int] = {}
|
|
356
355
|
# First we add up the amounts of all coins that share an ancestor with the offered coins (i.e. a primary coin)
|
|
357
356
|
for asset_id, coins in self.get_offered_coins().items():
|
|
358
357
|
name = "xch" if asset_id is None else asset_id.hex()
|
|
@@ -372,16 +371,16 @@ class Offer:
|
|
|
372
371
|
return pending_dict
|
|
373
372
|
|
|
374
373
|
# This method returns all of the coins that are being used in the offer (without which it would be invalid)
|
|
375
|
-
def get_involved_coins(self) ->
|
|
374
|
+
def get_involved_coins(self) -> list[Coin]:
|
|
376
375
|
additions = self.additions()
|
|
377
376
|
return list(filter(lambda c: c not in additions, self.removals()))
|
|
378
377
|
|
|
379
378
|
# This returns the non-ephemeral removal that is an ancestor of the specified coin
|
|
380
379
|
# This should maybe move to the SpendBundle object at some point
|
|
381
380
|
def get_root_removal(self, coin: Coin) -> Coin:
|
|
382
|
-
all_removals:
|
|
383
|
-
all_removal_ids:
|
|
384
|
-
non_ephemeral_removals:
|
|
381
|
+
all_removals: set[Coin] = set(self.removals())
|
|
382
|
+
all_removal_ids: set[bytes32] = {c.name() for c in all_removals}
|
|
383
|
+
non_ephemeral_removals: set[Coin] = {
|
|
385
384
|
c for c in all_removals if c.parent_coin_info not in {r.name() for r in all_removals}
|
|
386
385
|
}
|
|
387
386
|
if coin.name() not in all_removal_ids and coin.parent_coin_info not in all_removal_ids:
|
|
@@ -393,19 +392,19 @@ class Offer:
|
|
|
393
392
|
return coin
|
|
394
393
|
|
|
395
394
|
# This will only return coins that are ancestors of settlement payments
|
|
396
|
-
def get_primary_coins(self) ->
|
|
397
|
-
primary_coins:
|
|
395
|
+
def get_primary_coins(self) -> list[Coin]:
|
|
396
|
+
primary_coins: set[Coin] = set()
|
|
398
397
|
for _, coins in self.get_offered_coins().items():
|
|
399
398
|
for coin in coins:
|
|
400
399
|
primary_coins.add(self.get_root_removal(coin))
|
|
401
400
|
return list(primary_coins)
|
|
402
401
|
|
|
403
402
|
# This returns the minimum coins that when spent will invalidate the rest of the bundle
|
|
404
|
-
def get_cancellation_coins(self) ->
|
|
403
|
+
def get_cancellation_coins(self) -> list[Coin]:
|
|
405
404
|
# First, we're going to gather:
|
|
406
|
-
dependencies:
|
|
407
|
-
announcements:
|
|
408
|
-
coin_names:
|
|
405
|
+
dependencies: dict[bytes32, list[bytes32]] = {} # all of the hashes that each coin depends on
|
|
406
|
+
announcements: dict[bytes32, list[bytes32]] = {} # all of the hashes of the announcement that each coin makes
|
|
407
|
+
coin_names: list[bytes32] = [] # The names of all the coins
|
|
409
408
|
additions = self.additions()
|
|
410
409
|
for spend in [cs for cs in self._bundle.coin_spends if cs.coin not in additions]:
|
|
411
410
|
name = bytes32(spend.coin.name())
|
|
@@ -430,8 +429,8 @@ class Offer:
|
|
|
430
429
|
if removed is None:
|
|
431
430
|
break
|
|
432
431
|
removed_coin, provider = removed
|
|
433
|
-
removed_announcements:
|
|
434
|
-
remove_these_keys:
|
|
432
|
+
removed_announcements: list[bytes32] = announcements[removed_coin]
|
|
433
|
+
remove_these_keys: list[bytes32] = [removed_coin]
|
|
435
434
|
while True:
|
|
436
435
|
for coin, deps in dependencies.items():
|
|
437
436
|
if set(deps) & set(removed_announcements) and coin != provider:
|
|
@@ -449,14 +448,14 @@ class Offer:
|
|
|
449
448
|
return [cs.coin for cs in self._bundle.coin_spends if cs.coin.name() in coin_names]
|
|
450
449
|
|
|
451
450
|
@classmethod
|
|
452
|
-
def aggregate(cls, offers:
|
|
453
|
-
total_requested_payments:
|
|
451
|
+
def aggregate(cls, offers: list[Offer]) -> Offer:
|
|
452
|
+
total_requested_payments: dict[Optional[bytes32], list[NotarizedPayment]] = {}
|
|
454
453
|
total_bundle = WalletSpendBundle([], G2Element())
|
|
455
|
-
total_driver_dict:
|
|
454
|
+
total_driver_dict: dict[bytes32, PuzzleInfo] = {}
|
|
456
455
|
for offer in offers:
|
|
457
456
|
# First check for any overlap in inputs
|
|
458
|
-
total_inputs:
|
|
459
|
-
offer_inputs:
|
|
457
|
+
total_inputs: set[Coin] = {cs.coin for cs in total_bundle.coin_spends}
|
|
458
|
+
offer_inputs: set[Coin] = {cs.coin for cs in offer._bundle.coin_spends}
|
|
460
459
|
if total_inputs & offer_inputs:
|
|
461
460
|
raise ValueError("The aggregated offers overlap inputs")
|
|
462
461
|
|
|
@@ -486,34 +485,34 @@ class Offer:
|
|
|
486
485
|
if not self.is_valid():
|
|
487
486
|
raise ValueError("Offer is currently incomplete")
|
|
488
487
|
|
|
489
|
-
completion_spends:
|
|
490
|
-
all_offered_coins:
|
|
491
|
-
total_arbitrage_amount:
|
|
488
|
+
completion_spends: list[CoinSpend] = []
|
|
489
|
+
all_offered_coins: dict[Optional[bytes32], list[Coin]] = self.get_offered_coins()
|
|
490
|
+
total_arbitrage_amount: dict[Optional[bytes32], int] = self.arbitrage()
|
|
492
491
|
for asset_id, payments in self.requested_payments.items():
|
|
493
|
-
offered_coins:
|
|
492
|
+
offered_coins: list[Coin] = all_offered_coins[asset_id]
|
|
494
493
|
|
|
495
494
|
# Because of CAT supply laws, we must specify a place for the leftovers to go
|
|
496
495
|
arbitrage_amount: int = total_arbitrage_amount[asset_id]
|
|
497
|
-
all_payments:
|
|
496
|
+
all_payments: list[NotarizedPayment] = payments.copy()
|
|
498
497
|
if arbitrage_amount > 0:
|
|
499
498
|
assert arbitrage_amount is not None
|
|
500
499
|
assert arbitrage_ph is not None
|
|
501
500
|
all_payments.append(NotarizedPayment(arbitrage_ph, uint64(arbitrage_amount)))
|
|
502
501
|
|
|
503
502
|
# Some assets need to know about siblings so we need to collect all spends first to be able to use them
|
|
504
|
-
coin_to_spend_dict:
|
|
505
|
-
coin_to_solution_dict:
|
|
503
|
+
coin_to_spend_dict: dict[Coin, CoinSpend] = {}
|
|
504
|
+
coin_to_solution_dict: dict[Coin, Program] = {}
|
|
506
505
|
for coin in offered_coins:
|
|
507
|
-
parent_spend: CoinSpend =
|
|
506
|
+
parent_spend: CoinSpend = next(
|
|
508
507
|
filter(lambda cs: cs.coin.name() == coin.parent_coin_info, self._bundle.coin_spends)
|
|
509
|
-
)
|
|
508
|
+
)
|
|
510
509
|
coin_to_spend_dict[coin] = parent_spend
|
|
511
510
|
|
|
512
511
|
inner_solutions = []
|
|
513
512
|
if coin == offered_coins[0]:
|
|
514
|
-
nonces:
|
|
513
|
+
nonces: list[bytes32] = [p.nonce for p in all_payments]
|
|
515
514
|
for nonce in list(dict.fromkeys(nonces)): # dedup without messing with order
|
|
516
|
-
nonce_payments:
|
|
515
|
+
nonce_payments: list[NotarizedPayment] = list(filter(lambda p: p.nonce == nonce, all_payments))
|
|
517
516
|
inner_solutions.append((nonce, [np.as_condition_args() for np in nonce_payments]))
|
|
518
517
|
coin_to_solution_dict[coin] = Program.to(inner_solutions)
|
|
519
518
|
|
|
@@ -580,19 +579,19 @@ class Offer:
|
|
|
580
579
|
except AttributeError:
|
|
581
580
|
pass
|
|
582
581
|
# Before we serialize this as a SpendBundle, we need to serialize the `requested_payments` as dummy CoinSpends
|
|
583
|
-
additional_coin_spends:
|
|
582
|
+
additional_coin_spends: list[CoinSpend] = []
|
|
584
583
|
for asset_id, payments in self.requested_payments.items():
|
|
585
584
|
puzzle_reveal: Program = construct_puzzle(self.driver_dict[asset_id], OFFER_MOD) if asset_id else OFFER_MOD
|
|
586
585
|
inner_solutions = []
|
|
587
|
-
nonces:
|
|
586
|
+
nonces: list[bytes32] = [p.nonce for p in payments]
|
|
588
587
|
for nonce in list(dict.fromkeys(nonces)): # dedup without messing with order
|
|
589
|
-
nonce_payments:
|
|
588
|
+
nonce_payments: list[NotarizedPayment] = list(filter(lambda p: p.nonce == nonce, payments))
|
|
590
589
|
inner_solutions.append((nonce, [np.as_condition_args() for np in nonce_payments]))
|
|
591
590
|
|
|
592
591
|
additional_coin_spends.append(
|
|
593
592
|
make_spend(
|
|
594
593
|
Coin(
|
|
595
|
-
|
|
594
|
+
bytes32.zeros,
|
|
596
595
|
puzzle_reveal.get_tree_hash(),
|
|
597
596
|
uint64(0),
|
|
598
597
|
),
|
|
@@ -613,9 +612,9 @@ class Offer:
|
|
|
613
612
|
@classmethod
|
|
614
613
|
def from_spend_bundle(cls, bundle: WalletSpendBundle) -> Offer:
|
|
615
614
|
# Because of the `to_spend_bundle` method, we need to parse the dummy CoinSpends as `requested_payments`
|
|
616
|
-
requested_payments:
|
|
617
|
-
driver_dict:
|
|
618
|
-
leftover_coin_spends:
|
|
615
|
+
requested_payments: dict[Optional[bytes32], list[NotarizedPayment]] = {}
|
|
616
|
+
driver_dict: dict[bytes32, PuzzleInfo] = {}
|
|
617
|
+
leftover_coin_spends: list[CoinSpend] = []
|
|
619
618
|
for coin_spend in bundle.coin_spends:
|
|
620
619
|
driver = match_puzzle(uncurry_puzzle(coin_spend.puzzle_reveal))
|
|
621
620
|
if driver is not None:
|
|
@@ -624,8 +623,8 @@ class Offer:
|
|
|
624
623
|
driver_dict[asset_id] = driver
|
|
625
624
|
else:
|
|
626
625
|
asset_id = None
|
|
627
|
-
if coin_spend.coin.parent_coin_info ==
|
|
628
|
-
notarized_payments:
|
|
626
|
+
if coin_spend.coin.parent_coin_info == bytes32.zeros:
|
|
627
|
+
notarized_payments: list[NotarizedPayment] = []
|
|
629
628
|
for payment_group in coin_spend.solution.to_program().as_iter():
|
|
630
629
|
nonce = bytes32(payment_group.first().as_atom())
|
|
631
630
|
payment_args_list = payment_group.rest().as_iter()
|
|
@@ -652,7 +651,7 @@ class Offer:
|
|
|
652
651
|
def compress(self, version: Optional[int] = None) -> bytes:
|
|
653
652
|
as_spend_bundle = self.to_spend_bundle()
|
|
654
653
|
if version is None:
|
|
655
|
-
mods:
|
|
654
|
+
mods: list[bytes] = [bytes(s.puzzle_reveal.to_program().uncurry()[0]) for s in as_spend_bundle.coin_spends]
|
|
656
655
|
version = max(lowest_best_version(mods), 6) # Clients lower than version 6 should not be able to parse
|
|
657
656
|
return compress_object_with_puzzles(bytes(as_spend_bundle), version)
|
|
658
657
|
|
|
@@ -675,7 +674,7 @@ class Offer:
|
|
|
675
674
|
|
|
676
675
|
@classmethod
|
|
677
676
|
def from_bech32(cls, offer_bech32: str) -> Offer:
|
|
678
|
-
|
|
677
|
+
_hrpgot, data = bech32_decode(offer_bech32, max_length=len(offer_bech32))
|
|
679
678
|
if data is None:
|
|
680
679
|
raise ValueError("Invalid Offer")
|
|
681
680
|
decoded = convertbits(list(data), 5, 8, False)
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
from time import perf_counter
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import Optional
|
|
6
6
|
|
|
7
7
|
import aiosqlite
|
|
8
8
|
|
|
@@ -23,7 +23,7 @@ async def migrate_coin_of_interest(log: logging.Logger, db: aiosqlite.Connection
|
|
|
23
23
|
start_time = perf_counter()
|
|
24
24
|
rows = await db.execute_fetchall("SELECT trade_record, trade_id from trade_records")
|
|
25
25
|
|
|
26
|
-
inserts:
|
|
26
|
+
inserts: list[tuple[bytes32, bytes32]] = []
|
|
27
27
|
for row in rows:
|
|
28
28
|
record: TradeRecordOld = TradeRecordOld.from_bytes(row[0])
|
|
29
29
|
for coin in record.coins_of_interest:
|
|
@@ -57,7 +57,7 @@ async def migrate_is_my_offer(log: logging.Logger, db_connection: aiosqlite.Conn
|
|
|
57
57
|
rows = await cursor.fetchall()
|
|
58
58
|
await cursor.close()
|
|
59
59
|
|
|
60
|
-
updates:
|
|
60
|
+
updates: list[tuple[int, str]] = []
|
|
61
61
|
for row in rows:
|
|
62
62
|
record = TradeRecordOld.from_bytes(row[0])
|
|
63
63
|
is_my_offer = 1 if record.is_my_offer else 0
|
|
@@ -142,7 +142,7 @@ class TradeStore:
|
|
|
142
142
|
try:
|
|
143
143
|
await conn.execute("CREATE TABLE trade_record_times(trade_id blob PRIMARY KEY, valid_times blob)")
|
|
144
144
|
async with await conn.execute("SELECT trade_id from trade_records") as cursor:
|
|
145
|
-
trade_ids:
|
|
145
|
+
trade_ids: list[bytes32] = [bytes32.from_hexstr(row[0]) for row in await cursor.fetchall()]
|
|
146
146
|
await conn.executemany(
|
|
147
147
|
"INSERT INTO trade_record_times (trade_id, valid_times) VALUES(?, ?)",
|
|
148
148
|
[(id, bytes(ConditionValidTimes())) for id in trade_ids],
|
|
@@ -204,7 +204,7 @@ class TradeStore:
|
|
|
204
204
|
)
|
|
205
205
|
await cursor.close()
|
|
206
206
|
cursor = await conn.execute(
|
|
207
|
-
"INSERT OR REPLACE INTO trade_record_times
|
|
207
|
+
"INSERT OR REPLACE INTO trade_record_times (trade_id, valid_times) VALUES(?, ?)",
|
|
208
208
|
(
|
|
209
209
|
record.trade_id,
|
|
210
210
|
bytes(record.valid_times),
|
|
@@ -214,7 +214,7 @@ class TradeStore:
|
|
|
214
214
|
# remove all current coin ids
|
|
215
215
|
await conn.execute("DELETE FROM coin_of_interest_to_trade_record WHERE trade_id=?", (record.trade_id,))
|
|
216
216
|
# now recreate them all
|
|
217
|
-
inserts:
|
|
217
|
+
inserts: list[tuple[bytes32, bytes32]] = []
|
|
218
218
|
for coin in record.coins_of_interest:
|
|
219
219
|
inserts.append((coin.name(), record.trade_id))
|
|
220
220
|
await conn.executemany(
|
|
@@ -294,7 +294,7 @@ class TradeStore:
|
|
|
294
294
|
await self.add_trade_record(tx, offer.name())
|
|
295
295
|
return True
|
|
296
296
|
|
|
297
|
-
async def get_trades_count(self) ->
|
|
297
|
+
async def get_trades_count(self) -> tuple[int, int, int]:
|
|
298
298
|
"""
|
|
299
299
|
Returns the number of trades in the database broken down by is_my_offer status
|
|
300
300
|
"""
|
|
@@ -334,7 +334,7 @@ class TradeStore:
|
|
|
334
334
|
return (await self._get_new_trade_records_from_old([TradeRecordOld.from_bytes(row[0])]))[0]
|
|
335
335
|
return None
|
|
336
336
|
|
|
337
|
-
async def get_trade_record_with_status(self, status: TradeStatus) ->
|
|
337
|
+
async def get_trade_record_with_status(self, status: TradeStatus) -> list[TradeRecord]:
|
|
338
338
|
"""
|
|
339
339
|
Checks DB for TradeRecord with id: id and returns it.
|
|
340
340
|
"""
|
|
@@ -345,7 +345,7 @@ class TradeStore:
|
|
|
345
345
|
|
|
346
346
|
return await self._get_new_trade_records_from_old([TradeRecordOld.from_bytes(row[0]) for row in rows])
|
|
347
347
|
|
|
348
|
-
async def get_coin_ids_of_interest_with_trade_statuses(self, trade_statuses:
|
|
348
|
+
async def get_coin_ids_of_interest_with_trade_statuses(self, trade_statuses: list[TradeStatus]) -> set[bytes32]:
|
|
349
349
|
"""
|
|
350
350
|
Checks DB for TradeRecord with id: id and returns it.
|
|
351
351
|
"""
|
|
@@ -360,7 +360,7 @@ class TradeStore:
|
|
|
360
360
|
)
|
|
361
361
|
return {bytes32(row[0]) for row in rows}
|
|
362
362
|
|
|
363
|
-
async def get_all_trades(self) ->
|
|
363
|
+
async def get_all_trades(self) -> list[TradeRecord]:
|
|
364
364
|
"""
|
|
365
365
|
Returns all stored trades.
|
|
366
366
|
"""
|
|
@@ -382,7 +382,7 @@ class TradeStore:
|
|
|
382
382
|
exclude_my_offers: bool = False,
|
|
383
383
|
exclude_taken_offers: bool = False,
|
|
384
384
|
include_completed: bool = False,
|
|
385
|
-
) ->
|
|
385
|
+
) -> list[TradeRecord]:
|
|
386
386
|
"""
|
|
387
387
|
Return a list of trades sorted by a key and between a start and end index.
|
|
388
388
|
"""
|
|
@@ -486,11 +486,11 @@ class TradeStore:
|
|
|
486
486
|
await (await conn.execute("DELETE FROM trade_records WHERE trade_id=?", (trade_id.hex(),))).close()
|
|
487
487
|
await (await conn.execute("DELETE FROM trade_record_times WHERE trade_id=?", (trade_id,))).close()
|
|
488
488
|
|
|
489
|
-
async def _get_new_trade_records_from_old(self, old_records:
|
|
490
|
-
trade_id_to_valid_times:
|
|
489
|
+
async def _get_new_trade_records_from_old(self, old_records: list[TradeRecordOld]) -> list[TradeRecord]:
|
|
490
|
+
trade_id_to_valid_times: dict[bytes, ConditionValidTimes] = {}
|
|
491
491
|
empty_valid_times = ConditionValidTimes()
|
|
492
492
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
493
|
-
chunked_records:
|
|
493
|
+
chunked_records: list[list[TradeRecordOld]] = [
|
|
494
494
|
old_records[i : min(len(old_records), i + self.db_wrapper.host_parameter_limit)]
|
|
495
495
|
for i in range(0, len(old_records), self.db_wrapper.host_parameter_limit)
|
|
496
496
|
]
|