Skip to content

Commit d5339bd

Browse files
authored
Merge pull request #550 from multiversx/tx-refactoring
transactions refactoring
2 parents 470007b + 7bd6d1e commit d5339bd

5 files changed

Lines changed: 95 additions & 368 deletions

File tree

multiversx_sdk_cli/cli_transactions.py

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

5-
from multiversx_sdk import Address, ProxyNetworkProvider, TransactionComputer
5+
from multiversx_sdk import (
6+
Address,
7+
ProxyNetworkProvider,
8+
TransactionComputer,
9+
TransfersController,
10+
)
611

712
from multiversx_sdk_cli import cli_shared, utils
813
from multiversx_sdk_cli.args_validation import (
@@ -13,14 +18,12 @@
1318
validate_proxy_argument,
1419
validate_receiver_args,
1520
)
16-
from multiversx_sdk_cli.base_transactions_controller import BaseTransactionsController
1721
from multiversx_sdk_cli.cli_output import CLIOutputBuilder
1822
from multiversx_sdk_cli.config import get_config_for_network_providers
1923
from multiversx_sdk_cli.errors import BadUsage, IncorrectWalletError, NoWalletProvided
20-
from multiversx_sdk_cli.transactions import (
21-
TransactionsController,
22-
load_transaction_from_file,
23-
)
24+
from multiversx_sdk_cli.guardian_relayer_data import GuardianRelayerData
25+
from multiversx_sdk_cli.signing_wrapper import SigningWrapper
26+
from multiversx_sdk_cli.transactions import load_transaction_from_file
2427

2528
logger = logging.getLogger("cli.transactions")
2629

@@ -101,38 +104,59 @@ def create_transaction(args: Any):
101104
validate_broadcast_args(args)
102105
validate_chain_id_args(args)
103106

107+
if args.data_file:
108+
args.data = Path(args.data_file).read_text()
109+
110+
transfers = getattr(args, "token_transfers", None)
111+
112+
if transfers and args.data:
113+
raise BadUsage("You cannot provide both data and token transfers")
114+
104115
sender = cli_shared.prepare_sender(args)
105116
guardian_and_relayer_data = cli_shared.get_guardian_and_relayer_data(
106117
sender=sender.address.to_bech32(),
107118
args=args,
108119
)
109120

110-
if args.data_file:
111-
args.data = Path(args.data_file).read_text()
112-
113121
native_amount = int(args.value)
114-
115-
transfers = getattr(args, "token_transfers", None)
122+
receiver = Address.new_from_bech32(args.receiver)
116123
transfers = cli_shared.prepare_token_transfers(transfers) if transfers else None
117124

118125
chain_id = cli_shared.get_chain_id(args.proxy, args.chain)
119126
gas_estimator = cli_shared.initialize_gas_limit_estimator(args)
120-
tx_controller = TransactionsController(chain_id, gas_estimator)
121-
122-
tx = tx_controller.create_transaction(
127+
controller = TransfersController(chain_id=chain_id, gas_limit_estimator=gas_estimator)
128+
129+
if not transfers:
130+
tx = controller.create_transaction_for_native_token_transfer(
131+
sender=sender,
132+
nonce=sender.nonce,
133+
receiver=receiver,
134+
native_transfer_amount=native_amount,
135+
data=args.data.encode() if args.data else None,
136+
guardian=guardian_and_relayer_data.guardian_address,
137+
relayer=guardian_and_relayer_data.relayer_address,
138+
gas_limit=args.gas_limit,
139+
gas_price=args.gas_price,
140+
)
141+
else:
142+
tx = controller.create_transaction_for_transfer(
143+
sender=sender,
144+
nonce=sender.nonce,
145+
receiver=receiver,
146+
native_transfer_amount=native_amount,
147+
token_transfers=transfers,
148+
guardian=guardian_and_relayer_data.guardian_address,
149+
relayer=guardian_and_relayer_data.relayer_address,
150+
gas_limit=args.gas_limit,
151+
gas_price=args.gas_price,
152+
)
153+
154+
cli_shared.alter_transaction_and_sign_again_if_needed(
155+
args=args,
156+
tx=tx,
123157
sender=sender,
124-
receiver=Address.new_from_bech32(args.receiver),
125-
native_amount=native_amount,
126-
gas_limit=args.gas_limit,
127-
gas_price=args.gas_price,
128-
nonce=sender.nonce,
129-
version=args.version,
130-
options=args.options,
131-
token_transfers=transfers,
132-
data=args.data,
133158
guardian_and_relayer_data=guardian_and_relayer_data,
134159
)
135-
136160
cli_shared.send_or_simulate(tx, args)
137161

138162

@@ -180,18 +204,24 @@ def sign_transaction(args: Any):
180204

181205
tx_computer = TransactionComputer()
182206
if tx.guardian and not tx_computer.has_options_set_for_guarded_transaction(tx):
183-
raise BadUsage("Guardian wallet provided but the transaction has incorrect options.")
207+
raise BadUsage("Guardian wallet provided but the transaction has incorrect options")
184208

185-
tx_controller = BaseTransactionsController()
186-
tx_controller.sign_transaction(
187-
transaction=tx,
188-
sender=sender,
209+
guardian_and_relayer = GuardianRelayerData(
189210
guardian=guardian,
211+
guardian_address=tx.guardian,
190212
relayer=relayer,
213+
relayer_address=tx.relayer,
191214
guardian_service_url=args.guardian_service_url,
192215
guardian_2fa_code=args.guardian_2fa_code,
193216
)
194217

218+
signer = SigningWrapper()
219+
signer.sign_transaction(
220+
transaction=tx,
221+
sender=sender,
222+
guardian_and_relayer=guardian_and_relayer,
223+
)
224+
195225
cli_shared.send_or_simulate(tx, args)
196226

197227

multiversx_sdk_cli/dns.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
AddressComputer,
77
SmartContractQuery,
88
SmartContractQueryResponse,
9+
TransfersController,
910
)
1011

1112
from multiversx_sdk_cli import cli_shared
@@ -16,7 +17,6 @@
1617
)
1718
from multiversx_sdk_cli.config_env import get_address_hrp
1819
from multiversx_sdk_cli.constants import ADDRESS_ZERO_HEX
19-
from multiversx_sdk_cli.transactions import TransactionsController
2020

2121
MaxNumShards = 256
2222
ShardIdentiferLen = 2
@@ -77,21 +77,26 @@ def register(args: Any):
7777

7878
chain_id = cli_shared.get_chain_id(args.proxy, args.chain)
7979
gas_estimator = cli_shared.initialize_gas_limit_estimator(args)
80-
controller = TransactionsController(chain_id=chain_id, gas_limit_estimator=gas_estimator)
80+
controller = TransfersController(chain_id=chain_id, gas_limit_estimator=gas_estimator)
8181

82-
tx = controller.create_transaction(
82+
tx = controller.create_transaction_for_native_token_transfer(
8383
sender=sender,
8484
receiver=receiver,
85-
native_amount=native_amount,
85+
native_transfer_amount=native_amount,
8686
gas_limit=args.gas_limit,
8787
gas_price=args.gas_price,
8888
nonce=sender.nonce,
89-
version=args.version,
90-
options=args.options,
91-
data=data,
92-
guardian_and_relayer_data=guardian_and_relayer_data,
89+
data=data.encode(),
90+
guardian=guardian_and_relayer_data.guardian_address,
91+
relayer=guardian_and_relayer_data.relayer_address,
9392
)
9493

94+
cli_shared.alter_transaction_and_sign_again_if_needed(
95+
args=args,
96+
tx=tx,
97+
sender=sender,
98+
guardian_and_relayer_data=guardian_and_relayer_data,
99+
)
95100
cli_shared.send_or_simulate(tx, args)
96101

97102

multiversx_sdk_cli/tests/test_cli_transactions.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,28 @@ def test_estimate_gas_with_multiplier(capsys: Any):
463463
assert tx_json["gasLimit"] == 75000
464464

465465

466+
def test_raise_error_when_data_and_transfers_provided(capsys: Any):
467+
return_code = main(
468+
[
469+
"tx",
470+
"new",
471+
"--pem",
472+
str(testdata_path / "alice.pem"),
473+
"--receiver",
474+
"erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx",
475+
"--nonce",
476+
"7",
477+
"--chain",
478+
"D",
479+
"--data",
480+
"hello",
481+
"--token-transfers",
482+
"TEST-123456",
483+
]
484+
)
485+
assert return_code == 1
486+
487+
466488
def _read_stdout(capsys: Any) -> str:
467489
stdout: str = capsys.readouterr().out.strip()
468490
return stdout

0 commit comments

Comments
 (0)