From 26e5848cdb2ac42f834dc9d722b7c8f7c9778ed8 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Mon, 19 Feb 2024 18:32:11 +0200 Subject: [PATCH] fixes after review --- multiversx_sdk_cli/cli_shared.py | 17 +++------ multiversx_sdk_cli/cli_transactions.py | 28 +++++---------- multiversx_sdk_cli/custom_network_provider.py | 36 +++++++++++++++++++ multiversx_sdk_cli/transactions.py | 18 ++-------- 4 files changed, 53 insertions(+), 46 deletions(-) create mode 100644 multiversx_sdk_cli/custom_network_provider.py diff --git a/multiversx_sdk_cli/cli_shared.py b/multiversx_sdk_cli/cli_shared.py index 483078b4..1f5dc517 100644 --- a/multiversx_sdk_cli/cli_shared.py +++ b/multiversx_sdk_cli/cli_shared.py @@ -6,7 +6,6 @@ from typing import Any, Dict, List, Text, cast from multiversx_sdk_core import Address -from multiversx_sdk_network_providers import GenericError from multiversx_sdk_network_providers.proxy_network_provider import \ ProxyNetworkProvider @@ -17,7 +16,8 @@ load_password) from multiversx_sdk_cli.constants import (DEFAULT_TX_VERSION, TRANSACTION_OPTIONS_TX_GUARDED) -from multiversx_sdk_cli.errors import ArgumentsNotProvidedError, ProxyError +from multiversx_sdk_cli.custom_network_provider import CustomNetworkProvider +from multiversx_sdk_cli.errors import ArgumentsNotProvidedError from multiversx_sdk_cli.interfaces import ITransaction from multiversx_sdk_cli.ledger.ledger_functions import do_get_ledger_address from multiversx_sdk_cli.simulation import Simulator @@ -250,7 +250,7 @@ def check_options_for_guarded_tx(options: int): def send_or_simulate(tx: ITransaction, args: Any, dump_output: bool = True) -> CLIOutputBuilder: - proxy = ProxyNetworkProvider(args.proxy) + proxy = CustomNetworkProvider(args.proxy) is_set_wait_result = hasattr(args, "wait_result") and args.wait_result is_set_send = hasattr(args, "send") and args.send @@ -269,15 +269,8 @@ def send_or_simulate(tx: ITransaction, args: Any, dump_output: bool = True) -> C transaction_on_network = send_and_wait_for_result(tx, proxy, args.timeout) output_builder.set_awaited_transaction(transaction_on_network) elif send_only: - try: - hash = proxy.send_transaction(tx) - output_builder.set_emitted_transaction_hash(hash) - except GenericError as ge: - url = ge.url - message = ge.data["error"] - data = ge.data["data"] - code = ge.data["code"] - raise ProxyError(message, url, data, code) + hash = proxy.send_transaction(tx) + output_builder.set_emitted_transaction_hash(hash) elif simulate: simulation = Simulator(proxy).run(tx) output_builder.set_simulation_results(simulation) diff --git a/multiversx_sdk_cli/cli_transactions.py b/multiversx_sdk_cli/cli_transactions.py index 139706f9..5c89e389 100644 --- a/multiversx_sdk_cli/cli_transactions.py +++ b/multiversx_sdk_cli/cli_transactions.py @@ -1,14 +1,11 @@ from pathlib import Path from typing import Any, List -from multiversx_sdk_network_providers import GenericError -from multiversx_sdk_network_providers.proxy_network_provider import \ - ProxyNetworkProvider - from multiversx_sdk_cli import cli_shared, utils from multiversx_sdk_cli.cli_output import CLIOutputBuilder from multiversx_sdk_cli.cosign_transaction import cosign_transaction -from multiversx_sdk_cli.errors import NoWalletProvided, ProxyError +from multiversx_sdk_cli.custom_network_provider import CustomNetworkProvider +from multiversx_sdk_cli.errors import NoWalletProvided from multiversx_sdk_cli.transactions import (compute_relayed_v1_data, do_prepare_transaction, load_transaction_from_file) @@ -89,26 +86,19 @@ def send_transaction(args: Any): tx = load_transaction_from_file(args.infile) output = CLIOutputBuilder() - proxy = ProxyNetworkProvider(args.proxy) + proxy = CustomNetworkProvider(args.proxy) - try: - tx_hash = proxy.send_transaction(tx) - output.set_emitted_transaction_hash(tx_hash) - except GenericError as ge: - url = ge.url - message = ge.data["error"] - data = ge.data["data"] - code = ge.data["code"] - raise ProxyError(message, url, data, code) - finally: - output = output.set_emitted_transaction(tx).build() - utils.dump_out_json(output, outfile=args.outfile) + tx_hash = proxy.send_transaction(tx) + output.set_emitted_transaction_hash(tx_hash) + + output = output.set_emitted_transaction(tx).build() + utils.dump_out_json(output, outfile=args.outfile) def get_transaction(args: Any): args = utils.as_object(args) omit_fields = cli_shared.parse_omit_fields_arg(args) - proxy = ProxyNetworkProvider(args.proxy) + proxy = CustomNetworkProvider(args.proxy) transaction = proxy.get_transaction(args.hash, True) output = CLIOutputBuilder().set_transaction_on_network(transaction, omit_fields).build() diff --git a/multiversx_sdk_cli/custom_network_provider.py b/multiversx_sdk_cli/custom_network_provider.py new file mode 100644 index 00000000..3354a495 --- /dev/null +++ b/multiversx_sdk_cli/custom_network_provider.py @@ -0,0 +1,36 @@ +from typing import Any, Dict, Optional, Protocol + +from multiversx_sdk_network_providers import GenericError, ProxyNetworkProvider + +from multiversx_sdk_cli.errors import ProxyError +from multiversx_sdk_cli.interfaces import ISimulateResponse, ITransaction + + +class ITransactionOnNetwork(Protocol): + hash: str + is_completed: Optional[bool] + + def to_dictionary(self) -> Dict[str, Any]: + ... + + +class CustomNetworkProvider: + def __init__(self, url: str) -> None: + self._provider = ProxyNetworkProvider(url) + + def send_transaction(self, transaction: ITransaction) -> str: + try: + hash = self._provider.send_transaction(transaction) + return hash + except GenericError as ge: + url = ge.url + message = ge.data.get("error", "") + data = ge.data.get("data", "") + code = ge.data.get("code", "") + raise ProxyError(message, url, data, code) + + def get_transaction(self, tx_hash: str, with_process_status: Optional[bool] = False) -> ITransactionOnNetwork: + return self._provider.get_transaction(tx_hash, with_process_status) + + def simulate_transaction(self, transaction: ITransaction) -> ISimulateResponse: + return self._provider.simulate_transaction(transaction) diff --git a/multiversx_sdk_cli/transactions.py b/multiversx_sdk_cli/transactions.py index 2265ea01..c9430396 100644 --- a/multiversx_sdk_cli/transactions.py +++ b/multiversx_sdk_cli/transactions.py @@ -2,17 +2,16 @@ import json import logging import time -from typing import Any, Dict, Optional, Protocol, Sequence, TextIO, Tuple +from typing import Any, Dict, Optional, Protocol, TextIO from multiversx_sdk_core import Address, Transaction, TransactionPayload -from multiversx_sdk_network_providers import GenericError from multiversx_sdk_cli import errors from multiversx_sdk_cli.accounts import Account, LedgerAccount from multiversx_sdk_cli.cli_password import (load_guardian_password, load_password) from multiversx_sdk_cli.cosign_transaction import cosign_transaction -from multiversx_sdk_cli.errors import NoWalletProvided, ProxyError +from multiversx_sdk_cli.errors import NoWalletProvided from multiversx_sdk_cli.interfaces import ITransaction from multiversx_sdk_cli.ledger.ledger_functions import do_get_ledger_address @@ -31,9 +30,6 @@ class INetworkProvider(Protocol): def send_transaction(self, transaction: ITransaction) -> str: ... - def send_transactions(self, transactions: Sequence[ITransaction]) -> Tuple[int, Dict[str, str]]: - ... - def get_transaction(self, tx_hash: str, with_process_status: Optional[bool] = False) -> ITransactionOnNetwork: ... @@ -133,15 +129,7 @@ def send_and_wait_for_result(transaction: ITransaction, proxy: INetworkProvider, def _send_transaction_and_wait_for_result(proxy: INetworkProvider, payload: ITransaction, num_seconds_timeout: int = 100) -> ITransactionOnNetwork: AWAIT_TRANSACTION_PERIOD = 5 - try: - tx_hash = proxy.send_transaction(payload) - except GenericError as ge: - url = ge.url - message = ge.data["error"] - data = ge.data["data"] - code = ge.data["code"] - raise ProxyError(message, url, data, code) - + tx_hash = proxy.send_transaction(payload) num_periods_to_wait = int(num_seconds_timeout / AWAIT_TRANSACTION_PERIOD) for _ in range(0, num_periods_to_wait):