|
2 | 2 | from pathlib import Path |
3 | 3 | from typing import Any |
4 | 4 |
|
5 | | -from multiversx_sdk import Address, ProxyNetworkProvider, TransactionComputer |
| 5 | +from multiversx_sdk import ( |
| 6 | + Address, |
| 7 | + ProxyNetworkProvider, |
| 8 | + TransactionComputer, |
| 9 | + TransfersController, |
| 10 | +) |
6 | 11 |
|
7 | 12 | from multiversx_sdk_cli import cli_shared, utils |
8 | 13 | from multiversx_sdk_cli.args_validation import ( |
|
13 | 18 | validate_proxy_argument, |
14 | 19 | validate_receiver_args, |
15 | 20 | ) |
16 | | -from multiversx_sdk_cli.base_transactions_controller import BaseTransactionsController |
17 | 21 | from multiversx_sdk_cli.cli_output import CLIOutputBuilder |
18 | 22 | from multiversx_sdk_cli.config import get_config_for_network_providers |
19 | 23 | 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 |
24 | 27 |
|
25 | 28 | logger = logging.getLogger("cli.transactions") |
26 | 29 |
|
@@ -101,38 +104,59 @@ def create_transaction(args: Any): |
101 | 104 | validate_broadcast_args(args) |
102 | 105 | validate_chain_id_args(args) |
103 | 106 |
|
| 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 | + |
104 | 115 | sender = cli_shared.prepare_sender(args) |
105 | 116 | guardian_and_relayer_data = cli_shared.get_guardian_and_relayer_data( |
106 | 117 | sender=sender.address.to_bech32(), |
107 | 118 | args=args, |
108 | 119 | ) |
109 | 120 |
|
110 | | - if args.data_file: |
111 | | - args.data = Path(args.data_file).read_text() |
112 | | - |
113 | 121 | native_amount = int(args.value) |
114 | | - |
115 | | - transfers = getattr(args, "token_transfers", None) |
| 122 | + receiver = Address.new_from_bech32(args.receiver) |
116 | 123 | transfers = cli_shared.prepare_token_transfers(transfers) if transfers else None |
117 | 124 |
|
118 | 125 | chain_id = cli_shared.get_chain_id(args.proxy, args.chain) |
119 | 126 | 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, |
123 | 157 | 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, |
133 | 158 | guardian_and_relayer_data=guardian_and_relayer_data, |
134 | 159 | ) |
135 | | - |
136 | 160 | cli_shared.send_or_simulate(tx, args) |
137 | 161 |
|
138 | 162 |
|
@@ -180,18 +204,24 @@ def sign_transaction(args: Any): |
180 | 204 |
|
181 | 205 | tx_computer = TransactionComputer() |
182 | 206 | 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") |
184 | 208 |
|
185 | | - tx_controller = BaseTransactionsController() |
186 | | - tx_controller.sign_transaction( |
187 | | - transaction=tx, |
188 | | - sender=sender, |
| 209 | + guardian_and_relayer = GuardianRelayerData( |
189 | 210 | guardian=guardian, |
| 211 | + guardian_address=tx.guardian, |
190 | 212 | relayer=relayer, |
| 213 | + relayer_address=tx.relayer, |
191 | 214 | guardian_service_url=args.guardian_service_url, |
192 | 215 | guardian_2fa_code=args.guardian_2fa_code, |
193 | 216 | ) |
194 | 217 |
|
| 218 | + signer = SigningWrapper() |
| 219 | + signer.sign_transaction( |
| 220 | + transaction=tx, |
| 221 | + sender=sender, |
| 222 | + guardian_and_relayer=guardian_and_relayer, |
| 223 | + ) |
| 224 | + |
195 | 225 | cli_shared.send_or_simulate(tx, args) |
196 | 226 |
|
197 | 227 |
|
|
0 commit comments