Skip to content
Closed
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
2,821 changes: 2,820 additions & 1 deletion CLI.md

Large diffs are not rendered by default.

53 changes: 53 additions & 0 deletions CLI.md.sh
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,59 @@ generate() {

group "Faucet" "faucet"
command "Faucet.Request" "faucet request"

group "Multisig" "multisig"
command "Multisig.Deploy" "multisig deploy"
command "Multisig.Deposit" "multisig deposit"
command "Multisig.DiscardAction" "multisig discard-action"
command "Multisig.DiscardBatch" "multisig discard-batch"
command "Multisig.AddBoardMember" "multisig add-board-member"
command "Multisig.AddProposer" "multisig add-proposer"
command "Multisig.RemoveUser" "multisig remove-user"
command "Multisig.ChangeQuorum" "multisig change-quorum"
command "Multisig.TransferAndExecute" "multisig transfer-and-execute"
command "Multisig.TransferAndExecuteEsdt" "multisig transfer-and-execute-esdt"
command "Multisig.AsyncCall" "multisig async-call"
command "Multisig.DeployFromSource" "multisig deploy-from-source"
command "Multisig.UpgradeFromSource" "multisig upgrade-from-source"
command "Multisig.SignAction" "multisig sign-action"
command "Multisig.SignBatch" "multisig sign-batch"
command "Multisig.SignAndPerform" "multisig sign-and-perform"
command "Multisig.SignBatchAndPerform" "multisig sign-batch-and-perform"
command "Multisig.UnsignAction" "multisig unsign-action"
command "Multisig.UnsignBatch" "multisig unsign-batch"
command "Multisig.UnsignForOutdatedMembers" "multisig unsign-for-outdated-members"
command "Multisig.PerformAction" "multisig perform-action"
command "Multisig.PerformBatch" "multisig perform-batch"
command "Multisig.GetQuorum" "multisig get-quorum"
command "Multisig.GetNumBoardMembers" "multisig get-num-board-members"
command "Multisig.GetNumGroups" "multisig get-num-groups"
command "Multisig.GetNumProposers" "multisig get-num-proposers"
command "Multisig.GetActionGroup" "multisig get-action-group"
command "Multisig.GetLastActionGroupId" "multisig get-last-action-group-id"
command "Multisig.GetLastActionLastIndex" "multisig get-action-last-index"
command "Multisig.IsSignedBy" "multisig is-signed-by"
command "Multisig.IsQuorumReached" "multisig is-quorum-reached"
command "Multisig.GetPendingActions" "multisig get-pending-actions"
command "Multisig.GetUserRole" "multisig get-user-role"
command "Multisig.GetBoardMemebers" "multisig get-board-members"
command "Multisig.GetProposers" "multisig get-proposers"
command "Multisig.GetActionData" "multisig get-action-data"
command "Multisig.GetActionSigners" "multisig get-action-signers"
command "Multisig.GetActionSignersCount" "multisig get-action-signers-count"
command "Multisig.GetActionValidSignersCount" "multisig get-action-valid-signers-count"
command "Multisig.ParseProposeAction" "multisig parse-propose-action"

group "Governance" "governance"
command "Governance.Propose" "governance propose"
command "Governance.Vote" "governance vote"
command "Governance.CloseProposal" "governance close-proposal"
command "Governance.ClearEndedProposals" "governance clear-ended-proposals"
command "Governance.ClaimAccumulatedFees" "governance claim-accumulated-fees"
command "Governance.ChangeConfig" "governance change-config"
command "Governance.GetVotingPower" "governance get-voting-power"
command "Governance.GetConfig" "governance get-config"
command "Governance.GetDelegatedVoteInfo" "governance get-delegated-vote-info"
}

generate
81 changes: 79 additions & 2 deletions multiversx_sdk_cli/base_transactions_controller.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,33 @@
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.guardian_relayer_data import GuardianRelayerData
from multiversx_sdk_cli.interfaces import IAccount

logger = logging.getLogger("base_controller")


class BaseTransactionsController:
def __init__(self) -> None:
Expand Down Expand Up @@ -84,3 +103,61 @@ 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

def _set_transaction_fields(
self,
transaction: Transaction,
nonce: int,
version: int,
options: int,
gas_price: int,
guardian_and_relayer_data: GuardianRelayerData,
):
transaction.nonce = nonce
transaction.version = version
transaction.options = options
transaction.gas_price = gas_price
transaction.guardian = guardian_and_relayer_data.guardian_address
transaction.relayer = guardian_and_relayer_data.relayer_address
4 changes: 4 additions & 0 deletions multiversx_sdk_cli/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@
import multiversx_sdk_cli.cli_deps
import multiversx_sdk_cli.cli_dns
import multiversx_sdk_cli.cli_faucet
import multiversx_sdk_cli.cli_governance
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 +124,8 @@ 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))
commands.append(multiversx_sdk_cli.cli_governance.setup_parser(args, subparsers))

parser.epilog = """
----------------------
Expand Down
74 changes: 10 additions & 64 deletions multiversx_sdk_cli/cli_contracts.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,23 +56,13 @@ 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)
cli_shared.add_tx_args(args, sub, with_receiver=False, with_data=False)
_add_arguments_arg(sub)
sub.add_argument(
"--wait-result",
action="store_true",
default=False,
help="signal to wait for the transaction result - only valid if --send is set",
)
sub.add_argument(
"--timeout",
default=100,
help="max num of seconds to wait for result" " - only valid if --wait-result is set",
)
cli_shared.add_wait_result_and_timeout_args(sub)
cli_shared.add_broadcast_args(sub)
cli_shared.add_guardian_wallet_args(args, sub)
cli_shared.add_relayed_v3_wallet_args(args, sub)
Expand All @@ -94,17 +84,7 @@ def setup_parser(args: list[str], subparsers: Any) -> Any:
_add_function_arg(sub)
_add_arguments_arg(sub)
cli_shared.add_token_transfers_args(sub)
sub.add_argument(
"--wait-result",
action="store_true",
default=False,
help="signal to wait for the transaction result - only valid if --send is set",
)
sub.add_argument(
"--timeout",
default=100,
help="max num of seconds to wait for result" " - only valid if --wait-result is set",
)
cli_shared.add_wait_result_and_timeout_args(sub)
cli_shared.add_broadcast_args(sub)
cli_shared.add_guardian_wallet_args(args, sub)
cli_shared.add_relayed_v3_wallet_args(args, sub)
Expand All @@ -121,22 +101,12 @@ 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)
_add_arguments_arg(sub)
sub.add_argument(
"--wait-result",
action="store_true",
default=False,
help="signal to wait for the transaction result - only valid if --send is set",
)
sub.add_argument(
"--timeout",
default=100,
help="max num of seconds to wait for result" " - only valid if --wait-result is set",
)
cli_shared.add_wait_result_and_timeout_args(sub)
cli_shared.add_broadcast_args(sub)
cli_shared.add_guardian_wallet_args(args, sub)
cli_shared.add_relayed_v3_wallet_args(args, sub)
Expand Down Expand Up @@ -336,34 +306,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 @@ -445,6 +387,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 @@ -454,7 +400,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,
nonce=sender.nonce,
version=int(args.version),
options=int(args.options),
Expand Down
Loading
Loading