Skip to content

Commit e2e6a66

Browse files
committed
Merge branch 'environment-config' into address-config
2 parents a0ca485 + 32787af commit e2e6a66

21 files changed

Lines changed: 7818 additions & 284 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
@@ -18,8 +18,10 @@
1818
import multiversx_sdk_cli.cli_dns
1919
import multiversx_sdk_cli.cli_env
2020
import multiversx_sdk_cli.cli_faucet
21+
import multiversx_sdk_cli.cli_governance
2122
import multiversx_sdk_cli.cli_ledger
2223
import multiversx_sdk_cli.cli_localnet
24+
import multiversx_sdk_cli.cli_multisig
2325
import multiversx_sdk_cli.cli_transactions
2426
import multiversx_sdk_cli.cli_validator_wallet
2527
import multiversx_sdk_cli.cli_validators
@@ -127,6 +129,8 @@ def setup_parser(args: list[str]):
127129
commands.append(multiversx_sdk_cli.cli_delegation.setup_parser(args, subparsers))
128130
commands.append(multiversx_sdk_cli.cli_dns.setup_parser(args, subparsers))
129131
commands.append(multiversx_sdk_cli.cli_faucet.setup_parser(args, subparsers))
132+
commands.append(multiversx_sdk_cli.cli_multisig.setup_parser(args, subparsers))
133+
commands.append(multiversx_sdk_cli.cli_governance.setup_parser(args, subparsers))
130134
commands.append(multiversx_sdk_cli.cli_env.setup_parser(subparsers))
131135

132136
parser.epilog = """

multiversx_sdk_cli/cli_contracts.py

Lines changed: 16 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -56,23 +56,13 @@ def setup_parser(args: list[str], subparsers: Any) -> Any:
5656
)
5757
_add_bytecode_arg(sub)
5858
_add_contract_abi_arg(sub)
59-
_add_metadata_arg(sub)
59+
cli_shared.add_metadata_arg(sub)
6060
cli_shared.add_outfile_arg(sub)
6161
cli_shared.add_wallet_args(args, sub)
6262
cli_shared.add_proxy_arg(sub)
6363
cli_shared.add_tx_args(args, sub, with_receiver=False, with_data=False)
6464
_add_arguments_arg(sub)
65-
sub.add_argument(
66-
"--wait-result",
67-
action="store_true",
68-
default=False,
69-
help="signal to wait for the transaction result - only valid if --send is set",
70-
)
71-
sub.add_argument(
72-
"--timeout",
73-
default=100,
74-
help="max num of seconds to wait for result" " - only valid if --wait-result is set",
75-
)
65+
cli_shared.add_wait_result_and_timeout_args(sub)
7666
cli_shared.add_broadcast_args(sub)
7767
cli_shared.add_guardian_wallet_args(args, sub)
7868
cli_shared.add_relayed_v3_wallet_args(args, sub)
@@ -94,17 +84,7 @@ def setup_parser(args: list[str], subparsers: Any) -> Any:
9484
_add_function_arg(sub)
9585
_add_arguments_arg(sub)
9686
cli_shared.add_token_transfers_args(sub)
97-
sub.add_argument(
98-
"--wait-result",
99-
action="store_true",
100-
default=False,
101-
help="signal to wait for the transaction result - only valid if --send is set",
102-
)
103-
sub.add_argument(
104-
"--timeout",
105-
default=100,
106-
help="max num of seconds to wait for result" " - only valid if --wait-result is set",
107-
)
87+
cli_shared.add_wait_result_and_timeout_args(sub)
10888
cli_shared.add_broadcast_args(sub)
10989
cli_shared.add_guardian_wallet_args(args, sub)
11090
cli_shared.add_relayed_v3_wallet_args(args, sub)
@@ -121,22 +101,12 @@ def setup_parser(args: list[str], subparsers: Any) -> Any:
121101
_add_contract_abi_arg(sub)
122102
cli_shared.add_outfile_arg(sub)
123103
_add_bytecode_arg(sub)
124-
_add_metadata_arg(sub)
104+
cli_shared.add_metadata_arg(sub)
125105
cli_shared.add_wallet_args(args, sub)
126106
cli_shared.add_proxy_arg(sub)
127107
cli_shared.add_tx_args(args, sub, with_receiver=False, with_data=False)
128108
_add_arguments_arg(sub)
129-
sub.add_argument(
130-
"--wait-result",
131-
action="store_true",
132-
default=False,
133-
help="signal to wait for the transaction result - only valid if --send is set",
134-
)
135-
sub.add_argument(
136-
"--timeout",
137-
default=100,
138-
help="max num of seconds to wait for result" " - only valid if --wait-result is set",
139-
)
109+
cli_shared.add_wait_result_and_timeout_args(sub)
140110
cli_shared.add_broadcast_args(sub)
141111
cli_shared.add_guardian_wallet_args(args, sub)
142112
cli_shared.add_relayed_v3_wallet_args(args, sub)
@@ -336,34 +306,6 @@ def _add_arguments_arg(sub: Any):
336306
)
337307

338308

339-
def _add_metadata_arg(sub: Any):
340-
sub.add_argument(
341-
"--metadata-not-upgradeable",
342-
dest="metadata_upgradeable",
343-
action="store_false",
344-
help="‼ mark the contract as NOT upgradeable (default: upgradeable)",
345-
)
346-
sub.add_argument(
347-
"--metadata-not-readable",
348-
dest="metadata_readable",
349-
action="store_false",
350-
help="‼ mark the contract as NOT readable (default: readable)",
351-
)
352-
sub.add_argument(
353-
"--metadata-payable",
354-
dest="metadata_payable",
355-
action="store_true",
356-
help="‼ mark the contract as payable (default: not payable)",
357-
)
358-
sub.add_argument(
359-
"--metadata-payable-by-sc",
360-
dest="metadata_payable_by_sc",
361-
action="store_true",
362-
help="‼ mark the contract as payable by SC (default: not payable by SC)",
363-
)
364-
sub.set_defaults(metadata_upgradeable=True, metadata_payable=False)
365-
366-
367309
def build(args: Any):
368310
message = """This command cannot build smart contracts anymore.
369311
@@ -376,8 +318,7 @@ def build(args: Any):
376318
def deploy(args: Any):
377319
logger.debug("deploy")
378320

379-
cli_config = MxpyEnv.from_active_env()
380-
cli_shared.set_proxy_from_config_if_not_provided(args, cli_config)
321+
cli_shared.set_proxy_from_config_if_not_provided(args)
381322

382323
validate_transaction_args(args)
383324
validate_broadcast_args(args)
@@ -419,6 +360,8 @@ def deploy(args: Any):
419360
contract_address = address_computer.compute_contract_address(deployer=sender.address, deployment_nonce=tx.nonce)
420361

421362
logger.info("Contract address: %s", contract_address.to_bech32())
363+
364+
cli_config = MxpyEnv.from_active_env()
422365
utils.log_explorer_contract_address(args.chain, contract_address.to_bech32(), cli_config.explorer_url)
423366

424367
_send_or_simulate(tx, contract_address, args)
@@ -427,8 +370,7 @@ def deploy(args: Any):
427370
def call(args: Any):
428371
logger.debug("call")
429372

430-
cli_config = MxpyEnv.from_active_env()
431-
cli_shared.set_proxy_from_config_if_not_provided(args, cli_config)
373+
cli_shared.set_proxy_from_config_if_not_provided(args)
432374

433375
validate_transaction_args(args)
434376
validate_broadcast_args(args)
@@ -449,6 +391,10 @@ def call(args: Any):
449391
arguments, should_prepare_args = _get_contract_arguments(args)
450392
contract_address = Address.new_from_bech32(args.contract)
451393

394+
token_transfers = None
395+
if args.token_transfers:
396+
token_transfers = cli_shared.prepare_token_transfers(args.token_transfers)
397+
452398
tx = contract.prepare_execute_transaction(
453399
caller=sender,
454400
contract=contract_address,
@@ -458,7 +404,7 @@ def call(args: Any):
458404
gas_limit=int(args.gas_limit),
459405
gas_price=int(args.gas_price),
460406
value=int(args.value),
461-
transfers=args.token_transfers,
407+
token_transfers=token_transfers,
462408
nonce=sender.nonce,
463409
version=int(args.version),
464410
options=int(args.options),
@@ -471,8 +417,7 @@ def call(args: Any):
471417
def upgrade(args: Any):
472418
logger.debug("upgrade")
473419

474-
cli_config = MxpyEnv.from_active_env()
475-
cli_shared.set_proxy_from_config_if_not_provided(args, cli_config)
420+
cli_shared.set_proxy_from_config_if_not_provided(args)
476421

477422
validate_transaction_args(args)
478423
validate_broadcast_args(args)
@@ -518,8 +463,7 @@ def upgrade(args: Any):
518463
def query(args: Any):
519464
logger.debug("query")
520465

521-
cli_config = MxpyEnv.from_active_env()
522-
cli_shared.set_proxy_from_config_if_not_provided(args, cli_config)
466+
cli_shared.set_proxy_from_config_if_not_provided(args)
523467

524468
validate_proxy_argument(args)
525469

0 commit comments

Comments
 (0)