Skip to content

Commit 66d8bde

Browse files
authored
Merge pull request #515 from multiversx/multisig
Multisig integration
2 parents 05bb9d9 + ae4f002 commit 66d8bde

13 files changed

Lines changed: 3986 additions & 143 deletions

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 _convert_args_to_typed_values(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.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import multiversx_sdk_cli.cli_faucet
1919
import multiversx_sdk_cli.cli_ledger
2020
import multiversx_sdk_cli.cli_localnet
21+
import multiversx_sdk_cli.cli_multisig
2122
import multiversx_sdk_cli.cli_transactions
2223
import multiversx_sdk_cli.cli_validator_wallet
2324
import multiversx_sdk_cli.cli_validators
@@ -122,6 +123,7 @@ def setup_parser(args: list[str]):
122123
commands.append(multiversx_sdk_cli.cli_delegation.setup_parser(args, subparsers))
123124
commands.append(multiversx_sdk_cli.cli_dns.setup_parser(args, subparsers))
124125
commands.append(multiversx_sdk_cli.cli_faucet.setup_parser(args, subparsers))
126+
commands.append(multiversx_sdk_cli.cli_multisig.setup_parser(args, subparsers))
125127

126128
parser.epilog = """
127129
----------------------

multiversx_sdk_cli/cli_contracts.py

Lines changed: 7 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def setup_parser(args: list[str], subparsers: Any) -> Any:
5353
)
5454
_add_bytecode_arg(sub)
5555
_add_contract_abi_arg(sub)
56-
_add_metadata_arg(sub)
56+
cli_shared.add_metadata_arg(sub)
5757
cli_shared.add_outfile_arg(sub)
5858
cli_shared.add_wallet_args(args, sub)
5959
cli_shared.add_proxy_arg(sub)
@@ -118,7 +118,7 @@ def setup_parser(args: list[str], subparsers: Any) -> Any:
118118
_add_contract_abi_arg(sub)
119119
cli_shared.add_outfile_arg(sub)
120120
_add_bytecode_arg(sub)
121-
_add_metadata_arg(sub)
121+
cli_shared.add_metadata_arg(sub)
122122
cli_shared.add_wallet_args(args, sub)
123123
cli_shared.add_proxy_arg(sub)
124124
cli_shared.add_tx_args(args, sub, with_receiver=False, with_data=False)
@@ -304,34 +304,6 @@ def _add_arguments_arg(sub: Any):
304304
)
305305

306306

307-
def _add_metadata_arg(sub: Any):
308-
sub.add_argument(
309-
"--metadata-not-upgradeable",
310-
dest="metadata_upgradeable",
311-
action="store_false",
312-
help="‼ mark the contract as NOT upgradeable (default: upgradeable)",
313-
)
314-
sub.add_argument(
315-
"--metadata-not-readable",
316-
dest="metadata_readable",
317-
action="store_false",
318-
help="‼ mark the contract as NOT readable (default: readable)",
319-
)
320-
sub.add_argument(
321-
"--metadata-payable",
322-
dest="metadata_payable",
323-
action="store_true",
324-
help="‼ mark the contract as payable (default: not payable)",
325-
)
326-
sub.add_argument(
327-
"--metadata-payable-by-sc",
328-
dest="metadata_payable_by_sc",
329-
action="store_true",
330-
help="‼ mark the contract as payable by SC (default: not payable by SC)",
331-
)
332-
sub.set_defaults(metadata_upgradeable=True, metadata_payable=False)
333-
334-
335307
def build(args: Any):
336308
message = """This command cannot build smart contracts anymore.
337309
@@ -413,6 +385,10 @@ def call(args: Any):
413385
arguments, should_prepare_args = _get_contract_arguments(args)
414386
contract_address = Address.new_from_bech32(args.contract)
415387

388+
token_transfers = None
389+
if args.token_transfers:
390+
token_transfers = cli_shared.prepare_token_transfers(args.token_transfers)
391+
416392
tx = contract.prepare_execute_transaction(
417393
caller=sender,
418394
contract=contract_address,
@@ -422,7 +398,7 @@ def call(args: Any):
422398
gas_limit=int(args.gas_limit),
423399
gas_price=int(args.gas_price),
424400
value=int(args.value),
425-
transfers=args.token_transfers,
401+
token_transfers=token_transfers,
426402
nonce=sender.nonce,
427403
version=int(args.version),
428404
options=int(args.options),

0 commit comments

Comments
 (0)