Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 62 additions & 2 deletions multiversx_sdk_cli/base_transactions_controller.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,32 @@
from typing import Optional, Union
import logging
from typing import Any, Optional, Union

from multiversx_sdk import LedgerAccount, Transaction, TransactionComputer
from multiversx_sdk import Address, LedgerAccount, Transaction, TransactionComputer
from multiversx_sdk.abi import (
AddressValue,
BigUIntValue,
BoolValue,
BytesValue,
StringValue,
)

from multiversx_sdk_cli.config import get_address_hrp
from multiversx_sdk_cli.constants import (
ADDRESS_PREFIX,
EXTRA_GAS_LIMIT_FOR_GUARDED_TRANSACTIONS,
EXTRA_GAS_LIMIT_FOR_RELAYED_TRANSACTIONS,
FALSE_STR_LOWER,
HEX_PREFIX,
MAINCHAIN_ADDRESS_HRP,
STR_PREFIX,
TRUE_STR_LOWER,
)
from multiversx_sdk_cli.cosign_transaction import cosign_transaction
from multiversx_sdk_cli.errors import BadUserInput
from multiversx_sdk_cli.interfaces import IAccount

logger = logging.getLogger("base_controller")


class BaseTransactionsController:
def __init__(self) -> None:
Expand Down Expand Up @@ -84,3 +102,45 @@ def _sign_guarded_transaction_if_guardian(
def _sign_relayed_transaction_if_relayer(self, transaction: Transaction, relayer: Union[IAccount, None]):
if relayer and transaction.relayer:
transaction.relayer_signature = relayer.sign_transaction(transaction)

def _convert_args_to_typed_values(self, arguments: list[str]) -> list[Any]:
args: list[Any] = []

for arg in arguments:
if arg.startswith(HEX_PREFIX):
args.append(BytesValue(self._hex_to_bytes(arg)))
elif arg.isnumeric():
args.append(BigUIntValue(int(arg)))
elif arg.startswith(ADDRESS_PREFIX):
args.append(AddressValue.new_from_address(Address.new_from_bech32(arg[len(ADDRESS_PREFIX) :])))
elif arg.startswith(MAINCHAIN_ADDRESS_HRP):
# this flow will be removed in the future
logger.warning(
"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...)"
)
args.append(AddressValue.new_from_address(Address.new_from_bech32(arg)))
elif arg.startswith(get_address_hrp()):
args.append(AddressValue.new_from_address(Address.new_from_bech32(arg)))
elif arg.lower() == FALSE_STR_LOWER:
args.append(BoolValue(False))
elif arg.lower() == TRUE_STR_LOWER:
args.append(BoolValue(True))
elif arg.startswith(STR_PREFIX):
args.append(StringValue(arg[len(STR_PREFIX) :]))
else:
raise BadUserInput(
f"Unknown argument type for argument: `{arg}`. Use `mxpy contract <sub-command> --help` to check all supported arguments"
)

return args

def _hex_to_bytes(self, arg: str):
argument = arg[len(HEX_PREFIX) :]
argument = argument.upper()
argument = self.ensure_even_length(argument)
return bytes.fromhex(argument)

def ensure_even_length(self, string: str) -> str:
if len(string) % 2 == 1:
return "0" + string
return string
2 changes: 2 additions & 0 deletions multiversx_sdk_cli/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import multiversx_sdk_cli.cli_faucet
import multiversx_sdk_cli.cli_ledger
import multiversx_sdk_cli.cli_localnet
import multiversx_sdk_cli.cli_multisig
import multiversx_sdk_cli.cli_transactions
import multiversx_sdk_cli.cli_validator_wallet
import multiversx_sdk_cli.cli_validators
Expand Down Expand Up @@ -122,6 +123,7 @@ def setup_parser(args: list[str]):
commands.append(multiversx_sdk_cli.cli_delegation.setup_parser(args, subparsers))
commands.append(multiversx_sdk_cli.cli_dns.setup_parser(args, subparsers))
commands.append(multiversx_sdk_cli.cli_faucet.setup_parser(args, subparsers))
commands.append(multiversx_sdk_cli.cli_multisig.setup_parser(args, subparsers))

parser.epilog = """
----------------------
Expand Down
38 changes: 7 additions & 31 deletions multiversx_sdk_cli/cli_contracts.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def setup_parser(args: list[str], subparsers: Any) -> Any:
)
_add_bytecode_arg(sub)
_add_contract_abi_arg(sub)
_add_metadata_arg(sub)
cli_shared.add_metadata_arg(sub)
cli_shared.add_outfile_arg(sub)
cli_shared.add_wallet_args(args, sub)
cli_shared.add_proxy_arg(sub)
Expand Down Expand Up @@ -118,7 +118,7 @@ def setup_parser(args: list[str], subparsers: Any) -> Any:
_add_contract_abi_arg(sub)
cli_shared.add_outfile_arg(sub)
_add_bytecode_arg(sub)
_add_metadata_arg(sub)
cli_shared.add_metadata_arg(sub)
cli_shared.add_wallet_args(args, sub)
cli_shared.add_proxy_arg(sub)
cli_shared.add_tx_args(args, sub, with_receiver=False, with_data=False)
Expand Down Expand Up @@ -304,34 +304,6 @@ def _add_arguments_arg(sub: Any):
)


def _add_metadata_arg(sub: Any):
sub.add_argument(
"--metadata-not-upgradeable",
dest="metadata_upgradeable",
action="store_false",
help="‼ mark the contract as NOT upgradeable (default: upgradeable)",
)
sub.add_argument(
"--metadata-not-readable",
dest="metadata_readable",
action="store_false",
help="‼ mark the contract as NOT readable (default: readable)",
)
sub.add_argument(
"--metadata-payable",
dest="metadata_payable",
action="store_true",
help="‼ mark the contract as payable (default: not payable)",
)
sub.add_argument(
"--metadata-payable-by-sc",
dest="metadata_payable_by_sc",
action="store_true",
help="‼ mark the contract as payable by SC (default: not payable by SC)",
)
sub.set_defaults(metadata_upgradeable=True, metadata_payable=False)


def build(args: Any):
message = """This command cannot build smart contracts anymore.

Expand Down Expand Up @@ -413,6 +385,10 @@ def call(args: Any):
arguments, should_prepare_args = _get_contract_arguments(args)
contract_address = Address.new_from_bech32(args.contract)

token_transfers = None
if args.token_transfers:
token_transfers = cli_shared.prepare_token_transfers(args.token_transfers)

tx = contract.prepare_execute_transaction(
caller=sender,
contract=contract_address,
Expand All @@ -422,7 +398,7 @@ def call(args: Any):
gas_limit=int(args.gas_limit),
gas_price=int(args.gas_price),
value=int(args.value),
transfers=args.token_transfers,
token_transfers=token_transfers,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see we use the class SmartContract - in a future PR, maybe we can drop it / replace it with a regular smart contracts controller (if sufficient)?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might work. I'll think about it.

nonce=sender.nonce,
version=int(args.version),
options=int(args.options),
Expand Down
Loading
Loading