Skip to content

Commit 6ef32e0

Browse files
committed
refactoring
1 parent a649da9 commit 6ef32e0

8 files changed

Lines changed: 123 additions & 209 deletions

File tree

multiversx_sdk_cli/base_transactions_controller.py

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,32 @@
1-
from typing import Optional, Union
1+
import logging
2+
from typing import Any, Optional, Union
23

3-
from multiversx_sdk import LedgerAccount, Transaction, TransactionComputer
4+
from multiversx_sdk import Address, LedgerAccount, Transaction, TransactionComputer
5+
from multiversx_sdk.abi import (
6+
AddressValue,
7+
BigUIntValue,
8+
BoolValue,
9+
BytesValue,
10+
StringValue,
11+
)
412

13+
from multiversx_sdk_cli.config import get_address_hrp
514
from multiversx_sdk_cli.constants import (
15+
ADDRESS_PREFIX,
616
EXTRA_GAS_LIMIT_FOR_GUARDED_TRANSACTIONS,
717
EXTRA_GAS_LIMIT_FOR_RELAYED_TRANSACTIONS,
18+
FALSE_STR_LOWER,
19+
HEX_PREFIX,
20+
MAINCHAIN_ADDRESS_HRP,
21+
STR_PREFIX,
22+
TRUE_STR_LOWER,
823
)
924
from multiversx_sdk_cli.cosign_transaction import cosign_transaction
25+
from multiversx_sdk_cli.errors import BadUserInput
1026
from multiversx_sdk_cli.interfaces import IAccount
1127

28+
logger = logging.getLogger("base_controller")
29+
1230

1331
class BaseTransactionsController:
1432
def __init__(self) -> None:
@@ -84,3 +102,45 @@ def _sign_guarded_transaction_if_guardian(
84102
def _sign_relayed_transaction_if_relayer(self, transaction: Transaction, relayer: Union[IAccount, None]):
85103
if relayer and transaction.relayer:
86104
transaction.relayer_signature = relayer.sign_transaction(transaction)
105+
106+
def _prepare_args_for_factory(self, arguments: list[str]) -> list[Any]:
107+
args: list[Any] = []
108+
109+
for arg in arguments:
110+
if arg.startswith(HEX_PREFIX):
111+
args.append(BytesValue(self._hex_to_bytes(arg)))
112+
elif arg.isnumeric():
113+
args.append(BigUIntValue(int(arg)))
114+
elif arg.startswith(ADDRESS_PREFIX):
115+
args.append(AddressValue.new_from_address(Address.new_from_bech32(arg[len(ADDRESS_PREFIX) :])))
116+
elif arg.startswith(MAINCHAIN_ADDRESS_HRP):
117+
# this flow will be removed in the future
118+
logger.warning(
119+
"Address argument has no prefix. This flow will be removed in the future. Please provide each address using the `addr:` prefix. (e.g. --arguments addr:erd1...)"
120+
)
121+
args.append(AddressValue.new_from_address(Address.new_from_bech32(arg)))
122+
elif arg.startswith(get_address_hrp()):
123+
args.append(AddressValue.new_from_address(Address.new_from_bech32(arg)))
124+
elif arg.lower() == FALSE_STR_LOWER:
125+
args.append(BoolValue(False))
126+
elif arg.lower() == TRUE_STR_LOWER:
127+
args.append(BoolValue(True))
128+
elif arg.startswith(STR_PREFIX):
129+
args.append(StringValue(arg[len(STR_PREFIX) :]))
130+
else:
131+
raise BadUserInput(
132+
f"Unknown argument type for argument: `{arg}`. Use `mxpy contract <sub-command> --help` to check all supported arguments"
133+
)
134+
135+
return args
136+
137+
def _hex_to_bytes(self, arg: str):
138+
argument = arg[len(HEX_PREFIX) :]
139+
argument = argument.upper()
140+
argument = self.ensure_even_length(argument)
141+
return bytes.fromhex(argument)
142+
143+
def ensure_even_length(self, string: str) -> str:
144+
if len(string) % 2 == 1:
145+
return "0" + string
146+
return string

multiversx_sdk_cli/cli_contracts.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,10 @@ def call(args: Any):
412412
arguments, should_prepare_args = _get_contract_arguments(args)
413413
contract_address = Address.new_from_bech32(args.contract)
414414

415+
token_transfers = None
416+
if args.token_transfers:
417+
token_transfers = cli_shared.prepare_token_transfers(args.token_transfers)
418+
415419
tx = contract.prepare_execute_transaction(
416420
caller=sender,
417421
contract=contract_address,
@@ -420,7 +424,7 @@ def call(args: Any):
420424
should_prepare_args=should_prepare_args,
421425
gas_limit=int(args.gas_limit),
422426
value=int(args.value),
423-
transfers=args.token_transfers,
427+
token_transfers=token_transfers,
424428
nonce=sender.nonce,
425429
version=int(args.version),
426430
options=int(args.options),

multiversx_sdk_cli/cli_multisig.py

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@
2222
SendAsyncCall,
2323
SendTransferExecuteEgld,
2424
SendTransferExecuteEsdt,
25-
Token,
26-
TokenComputer,
27-
TokenTransfer,
2825
Transaction,
2926
TransactionsFactoryConfig,
3027
)
@@ -1189,7 +1186,7 @@ def deposit(args: Any):
11891186

11901187
token_transfers = args.token_transfers or None
11911188
if token_transfers:
1192-
token_transfers = _prepare_token_transfers(token_transfers)
1189+
token_transfers = cli_shared.prepare_token_transfers(token_transfers)
11931190

11941191
tx = multisig.prepare_deposit_transaction(
11951192
owner=sender,
@@ -1444,7 +1441,7 @@ def transfer_and_execute(args: Any):
14441441
gas_price=int(args.gas_price),
14451442
version=int(args.version),
14461443
options=int(args.options),
1447-
should_prepare_args=should_prepare_args,
1444+
should_prepare_args_for_factory=should_prepare_args,
14481445
guardian_and_relayer_data=guardian_and_relayer_data,
14491446
opt_gas_limit=opt_gas_limit,
14501447
function=function,
@@ -1485,7 +1482,7 @@ def transfer_and_execute_esdt(args: Any):
14851482
function = args.function if args.function else None
14861483
contract_abi = Abi.load(Path(args.contract_abi)) if args.contract_abi else None
14871484
arguments, should_prepare_args = _get_contract_arguments(args)
1488-
token_transfers = _prepare_token_transfers(args.token_transfers)
1485+
token_transfers = cli_shared.prepare_token_transfers(args.token_transfers)
14891486

14901487
tx = multisig.prepare_transfer_execute_esdt_transaction(
14911488
owner=sender,
@@ -1496,7 +1493,7 @@ def transfer_and_execute_esdt(args: Any):
14961493
gas_price=int(args.gas_price),
14971494
version=int(args.version),
14981495
options=int(args.options),
1499-
should_prepare_args=should_prepare_args,
1496+
should_prepare_args_for_factory=should_prepare_args,
15001497
guardian_and_relayer_data=guardian_and_relayer_data,
15011498
token_transfers=token_transfers,
15021499
opt_gas_limit=opt_gas_limit,
@@ -1534,7 +1531,7 @@ def async_call(args: Any):
15341531

15351532
token_transfers = args.token_transfers or None
15361533
if token_transfers:
1537-
token_transfers = _prepare_token_transfers(args.token_transfers)
1534+
token_transfers = cli_shared.prepare_token_transfers(args.token_transfers)
15381535

15391536
tx = multisig.prepare_async_call_transaction(
15401537
owner=sender,
@@ -1545,7 +1542,7 @@ def async_call(args: Any):
15451542
gas_price=int(args.gas_price),
15461543
version=int(args.version),
15471544
options=int(args.options),
1548-
should_prepare_args=should_prepare_args,
1545+
should_prepare_args_for_factory=should_prepare_args,
15491546
guardian_and_relayer_data=guardian_and_relayer_data,
15501547
native_token_amount=int(args.value),
15511548
token_transfers=token_transfers,
@@ -1593,7 +1590,7 @@ def deploy_from_source(args: Any):
15931590
readable=args.metadata_readable,
15941591
payable=args.metadata_payable,
15951592
payable_by_sc=args.metadata_payable_by_sc,
1596-
should_prepare_args=should_prepare_args,
1593+
should_prepare_args_for_factory=should_prepare_args,
15971594
guardian_and_relayer_data=guardian_and_relayer_data,
15981595
native_token_amount=int(args.value),
15991596
abi=contract_abi,
@@ -1640,7 +1637,7 @@ def upgrade_from_source(args: Any):
16401637
readable=args.metadata_readable,
16411638
payable=args.metadata_payable,
16421639
payable_by_sc=args.metadata_payable_by_sc,
1643-
should_prepare_args=should_prepare_args,
1640+
should_prepare_args_for_factory=should_prepare_args,
16441641
guardian_and_relayer_data=guardian_and_relayer_data,
16451642
native_token_amount=int(args.value),
16461643
abi=contract_abi,
@@ -2247,22 +2244,6 @@ def _get_contract_arguments(args: Any) -> tuple[list[Any], bool]:
22472244
return args.arguments, True
22482245

22492246

2250-
def _prepare_token_transfers(transfers: list[str]) -> list[TokenTransfer]:
2251-
token_computer = TokenComputer()
2252-
token_transfers: list[TokenTransfer] = []
2253-
2254-
for i in range(0, len(transfers) - 1, 2):
2255-
identifier = transfers[i]
2256-
amount = int(transfers[i + 1])
2257-
nonce = token_computer.extract_nonce_from_extended_identifier(identifier)
2258-
2259-
token = Token(identifier, nonce)
2260-
transfer = TokenTransfer(token, amount)
2261-
token_transfers.append(transfer)
2262-
2263-
return token_transfers
2264-
2265-
22662247
def _send_or_simulate(tx: Transaction, contract_address: Address, args: Any):
22672248
output_builder = cli_shared.send_or_simulate(tx, args, dump_output=False)
22682249
output_builder.set_contract_address(contract_address)

multiversx_sdk_cli/cli_shared.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
ApiNetworkProvider,
1212
LedgerAccount,
1313
ProxyNetworkProvider,
14+
Token,
15+
TokenComputer,
16+
TokenTransfer,
1417
Transaction,
1518
)
1619

@@ -617,3 +620,20 @@ def prepare_guardian_relayer_data(args: Any) -> GuardianRelayerData:
617620
relayer=relayer,
618621
relayer_address=relayer_address,
619622
)
623+
624+
625+
def prepare_token_transfers(transfers: list[str]) -> list[TokenTransfer]:
626+
"""Converts a list of token transfers as received from the CLI to a list of TokenTransfer objects."""
627+
token_computer = TokenComputer()
628+
token_transfers: list[TokenTransfer] = []
629+
630+
for i in range(0, len(transfers) - 1, 2):
631+
identifier = transfers[i]
632+
amount = int(transfers[i + 1])
633+
nonce = token_computer.extract_nonce_from_extended_identifier(identifier)
634+
635+
token = Token(identifier, nonce)
636+
transfer = TokenTransfer(token, amount)
637+
token_transfers.append(transfer)
638+
639+
return token_transfers

multiversx_sdk_cli/cli_transactions.py

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,7 @@
22
from pathlib import Path
33
from typing import Any
44

5-
from multiversx_sdk import (
6-
Address,
7-
ProxyNetworkProvider,
8-
Token,
9-
TokenComputer,
10-
TokenTransfer,
11-
TransactionComputer,
12-
)
5+
from multiversx_sdk import Address, ProxyNetworkProvider, TransactionComputer
136

147
from multiversx_sdk_cli import cli_shared, utils
158
from multiversx_sdk_cli.args_validation import (
@@ -133,7 +126,7 @@ def create_transaction(args: Any):
133126
gas_limit = int(args.gas_limit) if args.gas_limit else 0
134127

135128
transfers = getattr(args, "token_transfers", None)
136-
transfers = prepare_token_transfers(transfers) if transfers else None
129+
transfers = cli_shared.prepare_token_transfers(transfers) if transfers else None
137130

138131
chain_id = cli_shared.get_chain_id(args.chain, args.proxy)
139132
tx_controller = TransactionsController(chain_id)
@@ -155,22 +148,6 @@ def create_transaction(args: Any):
155148
cli_shared.send_or_simulate(tx, args)
156149

157150

158-
def prepare_token_transfers(transfers: list[Any]) -> list[TokenTransfer]:
159-
token_computer = TokenComputer()
160-
token_transfers: list[TokenTransfer] = []
161-
162-
for i in range(0, len(transfers) - 1, 2):
163-
identifier = transfers[i]
164-
amount = int(transfers[i + 1])
165-
nonce = token_computer.extract_nonce_from_extended_identifier(identifier)
166-
167-
token = Token(identifier, nonce)
168-
transfer = TokenTransfer(token, amount)
169-
token_transfers.append(transfer)
170-
171-
return token_transfers
172-
173-
174151
def send_transaction(args: Any):
175152
validate_proxy_argument(args)
176153

multiversx_sdk_cli/constants.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,10 @@
1919
TCS_SERVICE_ID = "MultiversXTCSService"
2020
EXTRA_GAS_LIMIT_FOR_GUARDED_TRANSACTIONS = 50_000
2121
EXTRA_GAS_LIMIT_FOR_RELAYED_TRANSACTIONS = 50_000
22+
23+
HEX_PREFIX = "0x"
24+
FALSE_STR_LOWER = "false"
25+
TRUE_STR_LOWER = "true"
26+
STR_PREFIX = "str:"
27+
ADDRESS_PREFIX = "addr:"
28+
MAINCHAIN_ADDRESS_HRP = "erd"

0 commit comments

Comments
 (0)