|
17 | 17 | Transaction, |
18 | 18 | ) |
19 | 19 |
|
20 | | -from multiversx_sdk_cli import config, errors, utils |
| 20 | +from multiversx_sdk_cli import config, utils |
| 21 | +from multiversx_sdk_cli.address import ( |
| 22 | + get_active_address, |
| 23 | + read_address_config_file, |
| 24 | + resolve_address_config_path, |
| 25 | +) |
21 | 26 | from multiversx_sdk_cli.cli_output import CLIOutputBuilder |
22 | 27 | from multiversx_sdk_cli.cli_password import ( |
23 | 28 | load_guardian_password, |
|
31 | 36 | ) |
32 | 37 | from multiversx_sdk_cli.env import MxpyEnv, get_address_hrp |
33 | 38 | from multiversx_sdk_cli.errors import ( |
| 39 | + AddressConfigFileError, |
34 | 40 | ArgumentsNotProvidedError, |
35 | 41 | BadUsage, |
36 | 42 | IncorrectWalletError, |
| 43 | + InvalidAddressConfigValue, |
| 44 | + NoWalletProvided, |
| 45 | + UnknownAddressAliasError, |
37 | 46 | ) |
38 | 47 | from multiversx_sdk_cli.guardian_relayer_data import GuardianRelayerData |
39 | 48 | from multiversx_sdk_cli.interfaces import IAccount |
@@ -155,6 +164,7 @@ def add_tx_args( |
155 | 164 |
|
156 | 165 |
|
157 | 166 | def add_wallet_args(args: list[str], sub: Any): |
| 167 | + sub.add_argument("--sender", type=str, help="the alias of the wallet set in the address config") |
158 | 168 | sub.add_argument( |
159 | 169 | "--pem", |
160 | 170 | required=False, |
@@ -309,8 +319,64 @@ def prepare_account(args: Any): |
309 | 319 | ) |
310 | 320 | elif args.ledger: |
311 | 321 | return LedgerAccount(address_index=args.sender_wallet_index) |
| 322 | + elif args.sender: |
| 323 | + file_path = resolve_address_config_path() |
| 324 | + if not file_path.is_file(): |
| 325 | + raise AddressConfigFileError("The address config file was not found") |
| 326 | + |
| 327 | + file = read_address_config_file() |
| 328 | + if file == dict(): |
| 329 | + raise AddressConfigFileError("Address config file is empty") |
| 330 | + |
| 331 | + addresses: dict[str, Any] = file["addresses"] |
| 332 | + wallet = addresses.get(args.sender, None) |
| 333 | + if not wallet: |
| 334 | + raise UnknownAddressAliasError(args.sender) |
| 335 | + |
| 336 | + logger.info(f"Using sender [{args.sender}] from address config.") |
| 337 | + return _load_wallet_from_address_config(wallet=wallet, hrp=hrp) |
| 338 | + else: |
| 339 | + active_address = get_active_address() |
| 340 | + if active_address == dict(): |
| 341 | + logger.info("No default wallet found in address config.") |
| 342 | + raise NoWalletProvided() |
| 343 | + |
| 344 | + alias_of_default_wallet = read_address_config_file().get("active", "") |
| 345 | + logger.info(f"Using sender [{alias_of_default_wallet}] from address config.") |
| 346 | + |
| 347 | + return _load_wallet_from_address_config(wallet=active_address, hrp=hrp) |
| 348 | + |
| 349 | + |
| 350 | +def _load_wallet_from_address_config(wallet: dict[str, str], hrp: str) -> Account: |
| 351 | + kind = wallet.get("kind", None) |
| 352 | + if not kind: |
| 353 | + raise AddressConfigFileError("'kind' field must be set in the address config") |
| 354 | + |
| 355 | + if kind not in ["pem", "keystore"]: |
| 356 | + raise InvalidAddressConfigValue("'kind' must be 'pem' or 'keystore'") |
| 357 | + |
| 358 | + path = wallet.get("path", None) |
| 359 | + if not path: |
| 360 | + raise AddressConfigFileError("'path' field must be set in the address config") |
| 361 | + path = Path(path) |
| 362 | + |
| 363 | + index = int(wallet.get("index", 0)) |
| 364 | + |
| 365 | + if kind == "pem": |
| 366 | + return Account.new_from_pem(file_path=path, index=index, hrp=hrp) |
312 | 367 | else: |
313 | | - raise errors.NoWalletProvided() |
| 368 | + password = wallet.get("password", "") |
| 369 | + password_path = wallet.get("passwordPath", None) |
| 370 | + |
| 371 | + if not password and not password_path: |
| 372 | + raise AddressConfigFileError( |
| 373 | + "'password' or 'passwordPath' must be set in the address config for keystore wallets" |
| 374 | + ) |
| 375 | + |
| 376 | + if password_path: |
| 377 | + password = Path(password_path).read_text().splitlines()[0].strip() |
| 378 | + |
| 379 | + return Account.new_from_keystore(file_path=path, password=password, address_index=index, hrp=hrp) |
314 | 380 |
|
315 | 381 |
|
316 | 382 | def _get_address_hrp(args: Any) -> str: |
|
0 commit comments