Skip to content

Commit 693d730

Browse files
committed
Merge branch 'feat/next' into environment-config
2 parents 4e029f2 + 4fe058f commit 693d730

18 files changed

Lines changed: 7768 additions & 190 deletions

CLI.md

Lines changed: 2820 additions & 1 deletion
Large diffs are not rendered by default.

CLI.md.sh

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,59 @@ generate() {
131131
group "Faucet" "faucet"
132132
command "Faucet.Request" "faucet request"
133133

134+
group "Multisig" "multisig"
135+
command "Multisig.Deploy" "multisig deploy"
136+
command "Multisig.Deposit" "multisig deposit"
137+
command "Multisig.DiscardAction" "multisig discard-action"
138+
command "Multisig.DiscardBatch" "multisig discard-batch"
139+
command "Multisig.AddBoardMember" "multisig add-board-member"
140+
command "Multisig.AddProposer" "multisig add-proposer"
141+
command "Multisig.RemoveUser" "multisig remove-user"
142+
command "Multisig.ChangeQuorum" "multisig change-quorum"
143+
command "Multisig.TransferAndExecute" "multisig transfer-and-execute"
144+
command "Multisig.TransferAndExecuteEsdt" "multisig transfer-and-execute-esdt"
145+
command "Multisig.AsyncCall" "multisig async-call"
146+
command "Multisig.DeployFromSource" "multisig deploy-from-source"
147+
command "Multisig.UpgradeFromSource" "multisig upgrade-from-source"
148+
command "Multisig.SignAction" "multisig sign-action"
149+
command "Multisig.SignBatch" "multisig sign-batch"
150+
command "Multisig.SignAndPerform" "multisig sign-and-perform"
151+
command "Multisig.SignBatchAndPerform" "multisig sign-batch-and-perform"
152+
command "Multisig.UnsignAction" "multisig unsign-action"
153+
command "Multisig.UnsignBatch" "multisig unsign-batch"
154+
command "Multisig.UnsignForOutdatedMembers" "multisig unsign-for-outdated-members"
155+
command "Multisig.PerformAction" "multisig perform-action"
156+
command "Multisig.PerformBatch" "multisig perform-batch"
157+
command "Multisig.GetQuorum" "multisig get-quorum"
158+
command "Multisig.GetNumBoardMembers" "multisig get-num-board-members"
159+
command "Multisig.GetNumGroups" "multisig get-num-groups"
160+
command "Multisig.GetNumProposers" "multisig get-num-proposers"
161+
command "Multisig.GetActionGroup" "multisig get-action-group"
162+
command "Multisig.GetLastActionGroupId" "multisig get-last-action-group-id"
163+
command "Multisig.GetLastActionLastIndex" "multisig get-action-last-index"
164+
command "Multisig.IsSignedBy" "multisig is-signed-by"
165+
command "Multisig.IsQuorumReached" "multisig is-quorum-reached"
166+
command "Multisig.GetPendingActions" "multisig get-pending-actions"
167+
command "Multisig.GetUserRole" "multisig get-user-role"
168+
command "Multisig.GetBoardMemebers" "multisig get-board-members"
169+
command "Multisig.GetProposers" "multisig get-proposers"
170+
command "Multisig.GetActionData" "multisig get-action-data"
171+
command "Multisig.GetActionSigners" "multisig get-action-signers"
172+
command "Multisig.GetActionSignersCount" "multisig get-action-signers-count"
173+
command "Multisig.GetActionValidSignersCount" "multisig get-action-valid-signers-count"
174+
command "Multisig.ParseProposeAction" "multisig parse-propose-action"
175+
176+
group "Governance" "governance"
177+
command "Governance.Propose" "governance propose"
178+
command "Governance.Vote" "governance vote"
179+
command "Governance.CloseProposal" "governance close-proposal"
180+
command "Governance.ClearEndedProposals" "governance clear-ended-proposals"
181+
command "Governance.ClaimAccumulatedFees" "governance claim-accumulated-fees"
182+
command "Governance.ChangeConfig" "governance change-config"
183+
command "Governance.GetVotingPower" "governance get-voting-power"
184+
command "Governance.GetConfig" "governance get-config"
185+
command "Governance.GetDelegatedVoteInfo" "governance get-delegated-vote-info"
186+
134187
group "Environment" "env"
135188
command "Environment.New" "env new"
136189
command "Environment.Set" "env set"

multiversx_sdk_cli/base_transactions_controller.py

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,33 @@
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

513
from multiversx_sdk_cli.constants import (
14+
ADDRESS_PREFIX,
615
EXTRA_GAS_LIMIT_FOR_GUARDED_TRANSACTIONS,
716
EXTRA_GAS_LIMIT_FOR_RELAYED_TRANSACTIONS,
17+
FALSE_STR_LOWER,
18+
HEX_PREFIX,
19+
MAINCHAIN_ADDRESS_HRP,
20+
STR_PREFIX,
21+
TRUE_STR_LOWER,
822
)
923
from multiversx_sdk_cli.cosign_transaction import cosign_transaction
24+
from multiversx_sdk_cli.env import get_address_hrp
25+
from multiversx_sdk_cli.errors import BadUserInput
26+
from multiversx_sdk_cli.guardian_relayer_data import GuardianRelayerData
1027
from multiversx_sdk_cli.interfaces import IAccount
1128

29+
logger = logging.getLogger("base_controller")
30+
1231

1332
class BaseTransactionsController:
1433
def __init__(self) -> None:
@@ -84,3 +103,61 @@ def _sign_guarded_transaction_if_guardian(
84103
def _sign_relayed_transaction_if_relayer(self, transaction: Transaction, relayer: Union[IAccount, None]):
85104
if relayer and transaction.relayer:
86105
transaction.relayer_signature = relayer.sign_transaction(transaction)
106+
107+
def _convert_args_to_typed_values(self, arguments: list[str]) -> list[Any]:
108+
args: list[Any] = []
109+
110+
for arg in arguments:
111+
if arg.startswith(HEX_PREFIX):
112+
args.append(BytesValue(self._hex_to_bytes(arg)))
113+
elif arg.isnumeric():
114+
args.append(BigUIntValue(int(arg)))
115+
elif arg.startswith(ADDRESS_PREFIX):
116+
args.append(AddressValue.new_from_address(Address.new_from_bech32(arg[len(ADDRESS_PREFIX) :])))
117+
elif arg.startswith(MAINCHAIN_ADDRESS_HRP):
118+
# this flow will be removed in the future
119+
logger.warning(
120+
"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...)"
121+
)
122+
args.append(AddressValue.new_from_address(Address.new_from_bech32(arg)))
123+
elif arg.startswith(get_address_hrp()):
124+
args.append(AddressValue.new_from_address(Address.new_from_bech32(arg)))
125+
elif arg.lower() == FALSE_STR_LOWER:
126+
args.append(BoolValue(False))
127+
elif arg.lower() == TRUE_STR_LOWER:
128+
args.append(BoolValue(True))
129+
elif arg.startswith(STR_PREFIX):
130+
args.append(StringValue(arg[len(STR_PREFIX) :]))
131+
else:
132+
raise BadUserInput(
133+
f"Unknown argument type for argument: `{arg}`. Use `mxpy contract <sub-command> --help` to check all supported arguments"
134+
)
135+
136+
return args
137+
138+
def _hex_to_bytes(self, arg: str):
139+
argument = arg[len(HEX_PREFIX) :]
140+
argument = argument.upper()
141+
argument = self.ensure_even_length(argument)
142+
return bytes.fromhex(argument)
143+
144+
def ensure_even_length(self, string: str) -> str:
145+
if len(string) % 2 == 1:
146+
return "0" + string
147+
return string
148+
149+
def _set_transaction_fields(
150+
self,
151+
transaction: Transaction,
152+
nonce: int,
153+
version: int,
154+
options: int,
155+
gas_price: int,
156+
guardian_and_relayer_data: GuardianRelayerData,
157+
):
158+
transaction.nonce = nonce
159+
transaction.version = version
160+
transaction.options = options
161+
transaction.gas_price = gas_price
162+
transaction.guardian = guardian_and_relayer_data.guardian_address
163+
transaction.relayer = guardian_and_relayer_data.relayer_address

multiversx_sdk_cli/cli.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
import multiversx_sdk_cli.cli_dns
1818
import multiversx_sdk_cli.cli_env
1919
import multiversx_sdk_cli.cli_faucet
20+
import multiversx_sdk_cli.cli_governance
2021
import multiversx_sdk_cli.cli_ledger
2122
import multiversx_sdk_cli.cli_localnet
23+
import multiversx_sdk_cli.cli_multisig
2224
import multiversx_sdk_cli.cli_transactions
2325
import multiversx_sdk_cli.cli_validator_wallet
2426
import multiversx_sdk_cli.cli_validators
@@ -125,6 +127,8 @@ def setup_parser(args: list[str]):
125127
commands.append(multiversx_sdk_cli.cli_delegation.setup_parser(args, subparsers))
126128
commands.append(multiversx_sdk_cli.cli_dns.setup_parser(args, subparsers))
127129
commands.append(multiversx_sdk_cli.cli_faucet.setup_parser(args, subparsers))
130+
commands.append(multiversx_sdk_cli.cli_multisig.setup_parser(args, subparsers))
131+
commands.append(multiversx_sdk_cli.cli_governance.setup_parser(args, subparsers))
128132
commands.append(multiversx_sdk_cli.cli_env.setup_parser(subparsers))
129133

130134
parser.epilog = """

multiversx_sdk_cli/cli_contracts.py

Lines changed: 10 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -57,23 +57,13 @@ def setup_parser(args: list[str], subparsers: Any) -> Any:
5757
)
5858
_add_bytecode_arg(sub)
5959
_add_contract_abi_arg(sub)
60-
_add_metadata_arg(sub)
60+
cli_shared.add_metadata_arg(sub)
6161
cli_shared.add_outfile_arg(sub)
6262
cli_shared.add_wallet_args(args, sub)
6363
cli_shared.add_proxy_arg(sub)
6464
cli_shared.add_tx_args(args, sub, with_receiver=False, with_data=False)
6565
_add_arguments_arg(sub)
66-
sub.add_argument(
67-
"--wait-result",
68-
action="store_true",
69-
default=False,
70-
help="signal to wait for the transaction result - only valid if --send is set",
71-
)
72-
sub.add_argument(
73-
"--timeout",
74-
default=100,
75-
help="max num of seconds to wait for result" " - only valid if --wait-result is set",
76-
)
66+
cli_shared.add_wait_result_and_timeout_args(sub)
7767
cli_shared.add_broadcast_args(sub)
7868
cli_shared.add_guardian_wallet_args(args, sub)
7969
cli_shared.add_relayed_v3_wallet_args(args, sub)
@@ -95,17 +85,7 @@ def setup_parser(args: list[str], subparsers: Any) -> Any:
9585
_add_function_arg(sub)
9686
_add_arguments_arg(sub)
9787
cli_shared.add_token_transfers_args(sub)
98-
sub.add_argument(
99-
"--wait-result",
100-
action="store_true",
101-
default=False,
102-
help="signal to wait for the transaction result - only valid if --send is set",
103-
)
104-
sub.add_argument(
105-
"--timeout",
106-
default=100,
107-
help="max num of seconds to wait for result" " - only valid if --wait-result is set",
108-
)
88+
cli_shared.add_wait_result_and_timeout_args(sub)
10989
cli_shared.add_broadcast_args(sub)
11090
cli_shared.add_guardian_wallet_args(args, sub)
11191
cli_shared.add_relayed_v3_wallet_args(args, sub)
@@ -122,22 +102,12 @@ def setup_parser(args: list[str], subparsers: Any) -> Any:
122102
_add_contract_abi_arg(sub)
123103
cli_shared.add_outfile_arg(sub)
124104
_add_bytecode_arg(sub)
125-
_add_metadata_arg(sub)
105+
cli_shared.add_metadata_arg(sub)
126106
cli_shared.add_wallet_args(args, sub)
127107
cli_shared.add_proxy_arg(sub)
128108
cli_shared.add_tx_args(args, sub, with_receiver=False, with_data=False)
129109
_add_arguments_arg(sub)
130-
sub.add_argument(
131-
"--wait-result",
132-
action="store_true",
133-
default=False,
134-
help="signal to wait for the transaction result - only valid if --send is set",
135-
)
136-
sub.add_argument(
137-
"--timeout",
138-
default=100,
139-
help="max num of seconds to wait for result" " - only valid if --wait-result is set",
140-
)
110+
cli_shared.add_wait_result_and_timeout_args(sub)
141111
cli_shared.add_broadcast_args(sub)
142112
cli_shared.add_guardian_wallet_args(args, sub)
143113
cli_shared.add_relayed_v3_wallet_args(args, sub)
@@ -337,34 +307,6 @@ def _add_arguments_arg(sub: Any):
337307
)
338308

339309

340-
def _add_metadata_arg(sub: Any):
341-
sub.add_argument(
342-
"--metadata-not-upgradeable",
343-
dest="metadata_upgradeable",
344-
action="store_false",
345-
help="‼ mark the contract as NOT upgradeable (default: upgradeable)",
346-
)
347-
sub.add_argument(
348-
"--metadata-not-readable",
349-
dest="metadata_readable",
350-
action="store_false",
351-
help="‼ mark the contract as NOT readable (default: readable)",
352-
)
353-
sub.add_argument(
354-
"--metadata-payable",
355-
dest="metadata_payable",
356-
action="store_true",
357-
help="‼ mark the contract as payable (default: not payable)",
358-
)
359-
sub.add_argument(
360-
"--metadata-payable-by-sc",
361-
dest="metadata_payable_by_sc",
362-
action="store_true",
363-
help="‼ mark the contract as payable by SC (default: not payable by SC)",
364-
)
365-
sub.set_defaults(metadata_upgradeable=True, metadata_payable=False)
366-
367-
368310
def build(args: Any):
369311
message = """This command cannot build smart contracts anymore.
370312
@@ -452,6 +394,10 @@ def call(args: Any):
452394
arguments, should_prepare_args = _get_contract_arguments(args)
453395
contract_address = Address.new_from_bech32(args.contract)
454396

397+
token_transfers = None
398+
if args.token_transfers:
399+
token_transfers = cli_shared.prepare_token_transfers(args.token_transfers)
400+
455401
tx = contract.prepare_execute_transaction(
456402
caller=sender,
457403
contract=contract_address,
@@ -461,7 +407,7 @@ def call(args: Any):
461407
gas_limit=int(args.gas_limit),
462408
gas_price=int(args.gas_price),
463409
value=int(args.value),
464-
transfers=args.token_transfers,
410+
token_transfers=token_transfers,
465411
nonce=sender.nonce,
466412
version=int(args.version),
467413
options=int(args.options),

0 commit comments

Comments
 (0)