multiversx-sdk-cli 7.0.0b0__tar.gz → 7.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/PKG-INFO +4 -4
  2. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_contracts.py +38 -29
  3. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_delegation.py +13 -12
  4. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_dns.py +1 -0
  5. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_password.py +8 -0
  6. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_shared.py +73 -20
  7. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_transactions.py +46 -1
  8. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_validators.py +1 -0
  9. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/contract_verification.py +19 -14
  10. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/contracts.py +16 -2
  11. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cosign_transaction.py +2 -2
  12. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/dependencies/modules.py +5 -1
  13. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/dns.py +1 -1
  14. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/transactions.py +51 -14
  15. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/pyproject.toml +4 -4
  16. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/.gitignore +0 -0
  17. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/LICENSE +0 -0
  18. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/README.md +0 -0
  19. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/.vscode/settings.json +0 -0
  20. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/__init__.py +0 -0
  21. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/accounts.py +0 -0
  22. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli.py +0 -0
  23. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_accounts.py +0 -0
  24. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_block.py +0 -0
  25. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_config.py +0 -0
  26. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_data.py +0 -0
  27. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_deps.py +0 -0
  28. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_ledger.py +0 -0
  29. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_localnet.py +0 -0
  30. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_network.py +0 -0
  31. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_output.py +0 -0
  32. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/cli_wallet.py +0 -0
  33. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/config.py +0 -0
  34. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/constants.py +0 -0
  35. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/delegation/__init__.py +0 -0
  36. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/delegation/staking_provider.py +0 -0
  37. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/dependencies/__init__.py +0 -0
  38. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/dependencies/install.py +0 -0
  39. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/dependencies/resolution.py +0 -0
  40. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/diskcache.py +0 -0
  41. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/docker.py +0 -0
  42. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/downloader.py +0 -0
  43. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/errors.py +0 -0
  44. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/guards.py +0 -0
  45. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/interfaces.py +0 -0
  46. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/ledger/__init__.py +0 -0
  47. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/ledger/config.py +0 -0
  48. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/ledger/ledger_app_handler.py +0 -0
  49. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/ledger/ledger_functions.py +0 -0
  50. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/__init__.py +0 -0
  51. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/config_default.py +0 -0
  52. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/config_general.py +0 -0
  53. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/config_networking.py +0 -0
  54. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/config_part.py +0 -0
  55. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/config_root.py +0 -0
  56. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/config_sharding.py +0 -0
  57. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/config_software.py +0 -0
  58. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/constants.py +0 -0
  59. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/genesis.py +0 -0
  60. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/genesis_json.py +0 -0
  61. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/genesis_smart_contracts_json.py +0 -0
  62. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/libraries.py +0 -0
  63. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/node.py +0 -0
  64. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/node_config_toml.py +0 -0
  65. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/nodes_setup_json.py +0 -0
  66. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/p2p_toml.py +0 -0
  67. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/seednode_p2pKey.pem +0 -0
  68. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/step_build_software.py +0 -0
  69. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/step_clean.py +0 -0
  70. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/step_config.py +0 -0
  71. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/step_new.py +0 -0
  72. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/step_prerequisites.py +0 -0
  73. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/step_start.py +0 -0
  74. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/localnet/wallets.py +0 -0
  75. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/myprocess.py +0 -0
  76. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/__init__.py +0 -0
  77. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/constants.py +0 -0
  78. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/core.py +0 -0
  79. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/interfaces.py +0 -0
  80. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/migrations.py +0 -0
  81. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/project_base.py +0 -0
  82. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/project_clang.py +0 -0
  83. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/project_cpp.py +0 -0
  84. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/project_rust.py +0 -0
  85. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/project_sol.py +0 -0
  86. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/__init__.py +0 -0
  87. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/data/__init__.py +0 -0
  88. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/data/common.py +0 -0
  89. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/data/extracted_feature.py +0 -0
  90. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/data/folder_report.py +0 -0
  91. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/data/project_report.py +0 -0
  92. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/data/report.py +0 -0
  93. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/data/wasm_report.py +0 -0
  94. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/do_report.py +0 -0
  95. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/features/__init__.py +0 -0
  96. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/features/features.py +0 -0
  97. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/features/report_option.py +0 -0
  98. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/features/size.py +0 -0
  99. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/features/twiggy_paths_check.py +0 -0
  100. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/format/__init__.py +0 -0
  101. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/format/change_type.py +0 -0
  102. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/format/format_options.py +0 -0
  103. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/report/report_creator.py +0 -0
  104. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/shared.py +0 -0
  105. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/templates.py +0 -0
  106. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/templates_config.py +0 -0
  107. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/projects/templates_repository.py +0 -0
  108. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/simulation.py +0 -0
  109. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/utils.py +0 -0
  110. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/ux.py +0 -0
  111. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/validators/__init__.py +0 -0
  112. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/validators/core.py +0 -0
  113. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/validators/validators_file.py +0 -0
  114. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/version.py +0 -0
  115. {multiversx_sdk_cli-7.0.0b0 → multiversx_sdk_cli-7.1.0}/multiversx_sdk_cli/workstation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: multiversx-sdk-cli
3
- Version: 7.0.0b0
3
+ Version: 7.1.0
4
4
  Summary: MultiversX Smart Contracts Tools
5
5
  Project-URL: Homepage, https://github.com/multiversx/mx-sdk-py-cli
6
6
  Author: MultiversX
@@ -12,9 +12,9 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Programming Language :: Python :: 3
13
13
  Requires-Python: >=3.8
14
14
  Requires-Dist: ledgercomm[hid]
15
- Requires-Dist: multiversx-sdk-core>=0.4.1
16
- Requires-Dist: multiversx-sdk-network-providers==0.6.*
17
- Requires-Dist: multiversx-sdk-wallet==0.6.*
15
+ Requires-Dist: multiversx-sdk-core>=0.5.0
16
+ Requires-Dist: multiversx-sdk-network-providers>=0.11.0
17
+ Requires-Dist: multiversx-sdk-wallet>=0.7.0
18
18
  Requires-Dist: prettytable
19
19
  Requires-Dist: requests
20
20
  Requires-Dist: requests-cache
@@ -14,8 +14,7 @@ from multiversx_sdk_cli.contract_verification import \
14
14
  trigger_contract_verification
15
15
  from multiversx_sdk_cli.contracts import CodeMetadata, SmartContract
16
16
  from multiversx_sdk_cli.docker import is_docker_installed, run_docker
17
- from multiversx_sdk_cli.errors import DockerMissingError
18
- from multiversx_sdk_cli.projects import load_project
17
+ from multiversx_sdk_cli.errors import DockerMissingError, NoWalletProvided
19
18
  from multiversx_sdk_cli.projects.core import get_project_paths_recursively
20
19
  from multiversx_sdk_cli.transactions import Transaction
21
20
  from multiversx_sdk_cli.cosign_transaction import cosign_transaction
@@ -71,7 +70,7 @@ def setup_parser(args: List[str], subparsers: Any) -> Any:
71
70
 
72
71
  output_description = CLIOutputBuilder.describe(with_contract=True, with_transaction_on_network=True, with_simulation=True)
73
72
  sub = cli_shared.add_command_subparser(subparsers, "contract", "deploy", f"Deploy a Smart Contract.{output_description}")
74
- _add_project_or_bytecode_arg(sub)
73
+ _add_bytecode_arg(sub)
75
74
  _add_metadata_arg(sub)
76
75
  cli_shared.add_outfile_arg(sub)
77
76
  cli_shared.add_wallet_args(args, sub)
@@ -83,6 +82,7 @@ def setup_parser(args: List[str], subparsers: Any) -> Any:
83
82
  sub.add_argument("--timeout", default=100, help="max num of seconds to wait for result"
84
83
  " - only valid if --wait-result is set")
85
84
  cli_shared.add_broadcast_args(sub)
85
+ cli_shared.add_guardian_wallet_args(args, sub)
86
86
 
87
87
  sub.set_defaults(func=deploy)
88
88
 
@@ -100,6 +100,7 @@ def setup_parser(args: List[str], subparsers: Any) -> Any:
100
100
  sub.add_argument("--timeout", default=100, help="max num of seconds to wait for result"
101
101
  " - only valid if --wait-result is set")
102
102
  cli_shared.add_broadcast_args(sub, relay=True)
103
+ cli_shared.add_guardian_wallet_args(args, sub)
103
104
 
104
105
  sub.set_defaults(func=call)
105
106
 
@@ -107,7 +108,7 @@ def setup_parser(args: List[str], subparsers: Any) -> Any:
107
108
  f"Upgrade a previously-deployed Smart Contract.{output_description}")
108
109
  _add_contract_arg(sub)
109
110
  cli_shared.add_outfile_arg(sub)
110
- _add_project_or_bytecode_arg(sub)
111
+ _add_bytecode_arg(sub)
111
112
  _add_metadata_arg(sub)
112
113
  cli_shared.add_wallet_args(args, sub)
113
114
  cli_shared.add_proxy_arg(sub)
@@ -118,6 +119,7 @@ def setup_parser(args: List[str], subparsers: Any) -> Any:
118
119
  sub.add_argument("--timeout", default=100, help="max num of seconds to wait for result"
119
120
  " - only valid if --wait-result is set")
120
121
  cli_shared.add_broadcast_args(sub)
122
+ cli_shared.add_guardian_wallet_args(args, sub)
121
123
 
122
124
  sub.set_defaults(func=upgrade)
123
125
 
@@ -147,6 +149,7 @@ def setup_parser(args: List[str], subparsers: Any) -> Any:
147
149
  help="the url of the service that validates the contract",
148
150
  )
149
151
  sub.add_argument("--docker-image", required=True, help="the docker image used for the build")
152
+ sub.add_argument("--contract-variant", required=False, default=None, help="in case of a multicontract, specify the contract variant you want to verify")
150
153
  cli_shared.add_wallet_args(args, sub)
151
154
  sub.set_defaults(func=verify)
152
155
 
@@ -191,12 +194,9 @@ def _add_recursive_arg(sub: Any):
191
194
  sub.add_argument("-r", "--recursive", dest="recursive", action="store_true", help="locate projects recursively")
192
195
 
193
196
 
194
- def _add_project_or_bytecode_arg(sub: Any):
195
- group = sub.add_mutually_exclusive_group(required=True)
196
- group.add_argument("--project", default=os.getcwd(),
197
- help="🗀 the project directory (default: current directory)")
198
- group.add_argument("--bytecode", type=str,
199
- help="the file containing the WASM bytecode")
197
+ def _add_bytecode_arg(sub: Any):
198
+ sub.add_argument("--bytecode", type=str, required=True,
199
+ help="the file containing the WASM bytecode")
200
200
 
201
201
 
202
202
  def _add_contract_arg(sub: Any):
@@ -285,7 +285,7 @@ def run_tests(args: Any):
285
285
 
286
286
  def deploy(args: Any):
287
287
  logger.debug("deploy")
288
- cli_shared.check_guardian_args(args)
288
+ cli_shared.check_guardian_and_options_args(args)
289
289
  cli_shared.check_broadcast_args(args)
290
290
 
291
291
  arguments = args.arguments
@@ -299,9 +299,7 @@ def deploy(args: Any):
299
299
  sender = _prepare_sender(args)
300
300
 
301
301
  tx = contract.deploy(sender, arguments, gas_price, gas_limit, value, chain, version, args.guardian, args.options)
302
-
303
- if args.guardian:
304
- tx = cosign_transaction(tx, args.guardian_service_url, args.guardian_2fa_code)
302
+ tx = _sign_guarded_tx(args, tx)
305
303
 
306
304
  logger.info("Contract address: %s", contract.address)
307
305
  utils.log_explorer_contract_address(chain, contract.address)
@@ -310,12 +308,7 @@ def deploy(args: Any):
310
308
 
311
309
 
312
310
  def _prepare_contract(args: Any) -> SmartContract:
313
- if args.bytecode and len(args.bytecode):
314
- bytecode = utils.read_binary_file(Path(args.bytecode)).hex()
315
- else:
316
- project_path = Path(args.project)
317
- project = load_project(project_path)
318
- bytecode = project.get_bytecode()
311
+ bytecode = utils.read_binary_file(Path(args.bytecode)).hex()
319
312
 
320
313
  metadata = CodeMetadata(upgradeable=args.metadata_upgradeable, readable=args.metadata_readable,
321
314
  payable=args.metadata_payable, payable_by_sc=args.metadata_payable_by_sc)
@@ -360,9 +353,28 @@ def _prepare_signer(args: Any) -> Account:
360
353
  return sender
361
354
 
362
355
 
356
+ def _sign_guarded_tx(args: Any, tx: Transaction) -> Transaction:
357
+ signature = tx.signature
358
+ tx.signature = ""
359
+
360
+ try:
361
+ guardian_account = cli_shared.prepare_guardian_account(args)
362
+ except NoWalletProvided:
363
+ guardian_account = None
364
+
365
+ if guardian_account:
366
+ tx.guardianSignature = guardian_account.sign_transaction(tx)
367
+ elif args.guardian:
368
+ tx = cosign_transaction(tx, args.guardian_service_url, args.guardian_2fa_code) # type: ignore
369
+
370
+ tx.signature = signature
371
+
372
+ return tx
373
+
374
+
363
375
  def call(args: Any):
364
376
  logger.debug("call")
365
- cli_shared.check_guardian_args(args)
377
+ cli_shared.check_guardian_and_options_args(args)
366
378
  cli_shared.check_broadcast_args(args)
367
379
 
368
380
  contract_address = args.contract
@@ -378,9 +390,7 @@ def call(args: Any):
378
390
  sender = _prepare_sender(args)
379
391
 
380
392
  tx = contract.execute(sender, function, arguments, gas_price, gas_limit, value, chain, version, args.guardian, args.options)
381
-
382
- if args.guardian:
383
- tx = cosign_transaction(tx, args.guardian_service_url, args.guardian_2fa_code)
393
+ tx = _sign_guarded_tx(args, tx)
384
394
 
385
395
  _send_or_simulate(tx, contract, args)
386
396
 
@@ -401,10 +411,8 @@ def upgrade(args: Any):
401
411
  contract.address = Address(contract_address)
402
412
  sender = _prepare_sender(args)
403
413
 
404
- tx = contract.upgrade(sender, arguments, gas_price, gas_limit, value, chain, version, args.guardian_address, args.options)
405
-
406
- if args.guardian:
407
- tx = cosign_transaction(tx, args.guardian_service_url, args.guardian_2fa_code)
414
+ tx = contract.upgrade(sender, arguments, gas_price, gas_limit, value, chain, version, args.guardian, args.options)
415
+ tx = _sign_guarded_tx(args, tx)
408
416
 
409
417
  _send_or_simulate(tx, contract, args)
410
418
 
@@ -435,9 +443,10 @@ def verify(args: Any) -> None:
435
443
 
436
444
  owner = _prepare_signer(args)
437
445
  docker_image = args.docker_image
446
+ contract_variant = args.contract_variant
438
447
 
439
448
  trigger_contract_verification(
440
- packaged_src, owner, contract, verifier_url, docker_image
449
+ packaged_src, owner, contract, verifier_url, docker_image, contract_variant
441
450
  )
442
451
  logger.info("Contract verification request completed!")
443
452
 
@@ -134,10 +134,11 @@ def _add_common_arguments(args: List[str], sub: Any):
134
134
  cli_shared.add_tx_args(args, sub, with_receiver=False, with_data=False, with_estimate_gas=True, with_guardian=True)
135
135
  cli_shared.add_broadcast_args(sub, relay=False)
136
136
  cli_shared.add_outfile_arg(sub, what="signed transaction, hash")
137
+ cli_shared.add_guardian_wallet_args(args, sub)
137
138
 
138
139
 
139
140
  def do_create_delegation_contract(args: Any):
140
- cli_shared.check_guardian_args(args)
141
+ cli_shared.check_guardian_and_options_args(args)
141
142
  cli_shared.check_broadcast_args(args)
142
143
  cli_shared.prepare_nonce_in_args(args)
143
144
  staking_provider.prepare_args_for_create_new_staking_contract(args)
@@ -161,7 +162,7 @@ def get_contract_address_by_deploy_tx_hash(args: Any):
161
162
 
162
163
 
163
164
  def add_new_nodes(args: Any):
164
- cli_shared.check_guardian_args(args)
165
+ cli_shared.check_guardian_and_options_args(args)
165
166
  cli_shared.check_broadcast_args(args)
166
167
  cli_shared.prepare_nonce_in_args(args)
167
168
  staking_provider.prepare_args_for_add_nodes(args)
@@ -171,7 +172,7 @@ def add_new_nodes(args: Any):
171
172
 
172
173
 
173
174
  def remove_nodes(args: Any):
174
- cli_shared.check_guardian_args(args)
175
+ cli_shared.check_guardian_and_options_args(args)
175
176
  cli_shared.check_broadcast_args(args)
176
177
  cli_shared.prepare_nonce_in_args(args)
177
178
  staking_provider.prepare_args_for_remove_nodes(args)
@@ -181,7 +182,7 @@ def remove_nodes(args: Any):
181
182
 
182
183
 
183
184
  def stake_nodes(args: Any):
184
- cli_shared.check_guardian_args(args)
185
+ cli_shared.check_guardian_and_options_args(args)
185
186
  cli_shared.check_broadcast_args(args)
186
187
  cli_shared.prepare_nonce_in_args(args)
187
188
  staking_provider.prepare_args_for_stake_nodes(args)
@@ -191,7 +192,7 @@ def stake_nodes(args: Any):
191
192
 
192
193
 
193
194
  def unbond_nodes(args: Any):
194
- cli_shared.check_guardian_args(args)
195
+ cli_shared.check_guardian_and_options_args(args)
195
196
  cli_shared.check_broadcast_args(args)
196
197
  cli_shared.prepare_nonce_in_args(args)
197
198
  staking_provider.prepare_args_for_unbond_nodes(args)
@@ -201,7 +202,7 @@ def unbond_nodes(args: Any):
201
202
 
202
203
 
203
204
  def unstake_nodes(args: Any):
204
- cli_shared.check_guardian_args(args)
205
+ cli_shared.check_guardian_and_options_args(args)
205
206
  cli_shared.check_broadcast_args(args)
206
207
  cli_shared.prepare_nonce_in_args(args)
207
208
  staking_provider.prepare_args_for_unstake_nodes(args)
@@ -211,7 +212,7 @@ def unstake_nodes(args: Any):
211
212
 
212
213
 
213
214
  def unjail_nodes(args: Any):
214
- cli_shared.check_guardian_args(args)
215
+ cli_shared.check_guardian_and_options_args(args)
215
216
  cli_shared.check_broadcast_args(args)
216
217
  cli_shared.prepare_nonce_in_args(args)
217
218
  staking_provider.prepare_args_for_unjail_nodes(args)
@@ -221,7 +222,7 @@ def unjail_nodes(args: Any):
221
222
 
222
223
 
223
224
  def change_service_fee(args: Any):
224
- cli_shared.check_guardian_args(args)
225
+ cli_shared.check_guardian_and_options_args(args)
225
226
  cli_shared.check_broadcast_args(args)
226
227
  cli_shared.prepare_nonce_in_args(args)
227
228
  staking_provider.prepare_args_change_service_fee(args)
@@ -231,7 +232,7 @@ def change_service_fee(args: Any):
231
232
 
232
233
 
233
234
  def modify_delegation_cap(args: Any):
234
- cli_shared.check_guardian_args(args)
235
+ cli_shared.check_guardian_and_options_args(args)
235
236
  cli_shared.check_broadcast_args(args)
236
237
  cli_shared.prepare_nonce_in_args(args)
237
238
  staking_provider.prepare_args_modify_delegation_cap(args)
@@ -241,7 +242,7 @@ def modify_delegation_cap(args: Any):
241
242
 
242
243
 
243
244
  def automatic_activation(args: Any):
244
- cli_shared.check_guardian_args(args)
245
+ cli_shared.check_guardian_and_options_args(args)
245
246
  cli_shared.check_broadcast_args(args)
246
247
  cli_shared.prepare_nonce_in_args(args)
247
248
  staking_provider.prepare_args_automatic_activation(args)
@@ -251,7 +252,7 @@ def automatic_activation(args: Any):
251
252
 
252
253
 
253
254
  def redelegate_cap(args: Any):
254
- cli_shared.check_guardian_args(args)
255
+ cli_shared.check_guardian_and_options_args(args)
255
256
  cli_shared.check_broadcast_args(args)
256
257
  cli_shared.prepare_nonce_in_args(args)
257
258
  staking_provider.prepare_args_redelegate_cap(args)
@@ -261,7 +262,7 @@ def redelegate_cap(args: Any):
261
262
 
262
263
 
263
264
  def set_metadata(args: Any):
264
- cli_shared.check_guardian_args(args)
265
+ cli_shared.check_guardian_and_options_args(args)
265
266
  cli_shared.check_broadcast_args(args)
266
267
  cli_shared.prepare_nonce_in_args(args)
267
268
  staking_provider.prepare_args_set_metadata(args)
@@ -18,6 +18,7 @@ def setup_parser(args: List[str], subparsers: Any) -> Any:
18
18
  cli_shared.add_wallet_args(args, sub)
19
19
  cli_shared.add_proxy_arg(sub)
20
20
  cli_shared.add_tx_args(args, sub, with_receiver=False, with_data=False, with_guardian=True)
21
+ cli_shared.add_guardian_wallet_args(args, sub)
21
22
  sub.add_argument("--name", help="the name to register")
22
23
  sub.set_defaults(func=register)
23
24
 
@@ -1,8 +1,16 @@
1
1
  from typing import Any
2
2
  from getpass import getpass
3
3
 
4
+
4
5
  def load_password(args: Any):
5
6
  if args.passfile:
6
7
  with open(args.passfile) as pass_file:
7
8
  return pass_file.read().strip()
8
9
  return getpass("Keyfile's password: ")
10
+
11
+
12
+ def load_guardian_password(args: Any):
13
+ if args.guardian_passfile:
14
+ with open(args.guardian_passfile) as pass_file:
15
+ return pass_file.read().strip()
16
+ return getpass("Keyfile's password: ")
@@ -10,7 +10,7 @@ from multiversx_sdk_network_providers.proxy_network_provider import \
10
10
  from multiversx_sdk_cli import config, errors, utils
11
11
  from multiversx_sdk_cli.accounts import Account
12
12
  from multiversx_sdk_cli.cli_output import CLIOutputBuilder
13
- from multiversx_sdk_cli.cli_password import load_password
13
+ from multiversx_sdk_cli.cli_password import load_password, load_guardian_password
14
14
  from multiversx_sdk_cli.ledger.ledger_functions import do_get_ledger_address
15
15
  from multiversx_sdk_cli.simulation import Simulator
16
16
  from multiversx_sdk_cli.transactions import Transaction
@@ -79,13 +79,17 @@ def add_tx_args(args: List[str], sub: Any, with_nonce: bool = True, with_receive
79
79
  sub.add_argument("--version", type=int, default=config.get_tx_version(), help="the transaction version (default: %(default)s)")
80
80
 
81
81
  if with_guardian:
82
- sub.add_argument("--guardian", type=str, help="the address of the guradian")
83
- sub.add_argument("--guardian-service-url", type=str, help="the url of the guardian service")
84
- sub.add_argument("--guardian-2fa-code", type=str, help="the 2fa code for the guardian")
82
+ add_guardian_args(sub)
85
83
 
86
84
  sub.add_argument("--options", type=int, default=0, help="the transaction options (default: 0)")
87
85
 
88
86
 
87
+ def add_guardian_args(sub: Any):
88
+ sub.add_argument("--guardian", type=str, help="the address of the guradian")
89
+ sub.add_argument("--guardian-service-url", type=str, help="the url of the guardian service")
90
+ sub.add_argument("--guardian-2fa-code", type=str, help="the 2fa code for the guardian")
91
+
92
+
89
93
  def add_wallet_args(args: List[str], sub: Any):
90
94
  sub.add_argument("--pem", required=check_if_sign_method_required(args, "--pem"), help="🔑 the PEM file, if keyfile not provided")
91
95
  sub.add_argument("--pem-index", default=0, help="🔑 the index in the PEM file (default: %(default)s)")
@@ -97,6 +101,16 @@ def add_wallet_args(args: List[str], sub: Any):
97
101
  sub.add_argument("--sender-username", required=False, help="🖄 the username of the sender")
98
102
 
99
103
 
104
+ def add_guardian_wallet_args(args: List[str], sub: Any):
105
+ sub.add_argument("--guardian-pem", required=check_if_sign_method_required(args, "--guardian-pem"), help="🔑 the PEM file, if keyfile not provided")
106
+ sub.add_argument("--guardian-pem-index", default=0, help="🔑 the index in the PEM file (default: %(default)s)")
107
+ sub.add_argument("--guardian-keyfile", required=check_if_sign_method_required(args, "--guardian-keyfile"), help="🔑 a JSON keyfile, if PEM not provided")
108
+ sub.add_argument("--guardian-passfile", help="🔑 a file containing keyfile's password, if keyfile provided")
109
+ sub.add_argument("--guardian-ledger", action="store_true", required=check_if_sign_method_required(args, "--guardian-ledger"), default=False, help="🔐 bool flag for signing transaction using ledger")
110
+ sub.add_argument("--guardian-ledger-account-index", type=int, default=0, help="🔐 the index of the account when using Ledger")
111
+ sub.add_argument("--guardian-ledger-address-index", type=int, default=0, help="🔐 the index of the address when using Ledger")
112
+
113
+
100
114
  def add_proxy_arg(sub: Any):
101
115
  sub.add_argument("--proxy", default=config.get_proxy(), help="🔗 the URL of the proxy (default: %(default)s)")
102
116
 
@@ -121,19 +135,39 @@ def parse_omit_fields_arg(args: Any) -> List[str]:
121
135
  return cast(List[str], parsed)
122
136
 
123
137
 
138
+ def prepare_account(args: Any):
139
+ if args.pem:
140
+ account = Account(pem_file=args.pem, pem_index=args.pem_index)
141
+ elif args.keyfile:
142
+ password = load_password(args)
143
+ account = Account(key_file=args.keyfile, password=password)
144
+ elif args.ledger:
145
+ address = do_get_ledger_address(account_index=args.ledger_account_index, address_index=args.ledger_address_index)
146
+ account = Account(address=address)
147
+ else:
148
+ raise errors.NoWalletProvided()
149
+
150
+ return account
151
+
152
+
153
+ def prepare_guardian_account(args: Any):
154
+ if args.guardian_pem:
155
+ account = Account(pem_file=args.guardian_pem, pem_index=args.guardian_pem_index)
156
+ elif args.guardian_keyfile:
157
+ password = load_guardian_password(args)
158
+ account = Account(key_file=args.guardian_keyfile, password=password)
159
+ elif args.guardian_ledger:
160
+ address = do_get_ledger_address(account_index=args.guardian_ledger_account_index, address_index=args.guardian_ledger_address_index)
161
+ account = Account(address=address)
162
+ else:
163
+ raise errors.NoWalletProvided()
164
+
165
+ return account
166
+
167
+
124
168
  def prepare_nonce_in_args(args: Any):
125
169
  if args.recall_nonce:
126
- if args.pem:
127
- account = Account(pem_file=args.pem, pem_index=args.pem_index)
128
- elif args.keyfile:
129
- password = load_password(args)
130
- account = Account(key_file=args.keyfile, password=password)
131
- elif args.ledger:
132
- address = do_get_ledger_address(account_index=args.ledger_account_index, address_index=args.ledger_address_index)
133
- account = Account(address=address)
134
- else:
135
- raise errors.NoWalletProvided()
136
-
170
+ account = prepare_account(args)
137
171
  account.sync_nonce(ProxyNetworkProvider(args.proxy))
138
172
  args.nonce = account.nonce
139
173
 
@@ -154,13 +188,32 @@ def check_broadcast_args(args: Any):
154
188
  raise errors.BadUsage("Cannot both 'simulate' and 'send' a transaction")
155
189
 
156
190
 
191
+ def check_guardian_and_options_args(args: Any):
192
+ check_guardian_args(args)
193
+ if args.guardian:
194
+ check_options_for_guarded_tx(args.options)
195
+
196
+
157
197
  def check_guardian_args(args: Any):
158
- if any([args.guardian, args.guardian_service_url, args.guardian_2fa_code]):
159
- if not all([args.guardian, args.guardian_service_url, args.guardian_2fa_code]):
160
- raise errors.BadUsage("All guardian arguments must be provided")
198
+ if args.guardian:
199
+ if should_sign_with_cosigner_service(args) and should_sign_with_guardian_key(args):
200
+ raise errors.BadUsage("Guarded tx should be signed using either a cosigning service or a guardian key")
201
+
202
+ if not should_sign_with_cosigner_service(args) and not should_sign_with_guardian_key(args):
203
+ raise errors.BadUsage("Missing guardian signing arguments")
204
+
205
+
206
+ def should_sign_with_cosigner_service(args: Any) -> bool:
207
+ return all([args.guardian_service_url, args.guardian_2fa_code])
208
+
209
+
210
+ def should_sign_with_guardian_key(args: Any) -> bool:
211
+ return any([args.guardian_pem, args.guardian_keyfile, args.guardian_ledger])
212
+
161
213
 
162
- if not args.options & TRANSACTION_OPTIONS_TX_GUARDED == TRANSACTION_OPTIONS_TX_GUARDED:
163
- raise errors.BadUsage("For guarded transactions the guarded flag must be set.")
214
+ def check_options_for_guarded_tx(options: int):
215
+ if not options & TRANSACTION_OPTIONS_TX_GUARDED == TRANSACTION_OPTIONS_TX_GUARDED:
216
+ raise errors.BadUsage("Invalid guarded transaction's options. The second least significant bit must be set.")
164
217
 
165
218
 
166
219
  def send_or_simulate(tx: Transaction, args: Any, dump_output: bool = True) -> CLIOutputBuilder:
@@ -4,7 +4,9 @@ from typing import Any, List
4
4
  from multiversx_sdk_cli import cli_shared, utils
5
5
  from multiversx_sdk_cli.cli_output import CLIOutputBuilder
6
6
  from multiversx_sdk_network_providers.proxy_network_provider import ProxyNetworkProvider
7
+ from multiversx_sdk_cli.errors import NoWalletProvided
7
8
  from multiversx_sdk_cli.transactions import Transaction, do_prepare_transaction
9
+ from multiversx_sdk_cli.cosign_transaction import cosign_transaction
8
10
 
9
11
 
10
12
  def setup_parser(args: List[str], subparsers: Any) -> Any:
@@ -16,6 +18,7 @@ def setup_parser(args: List[str], subparsers: Any) -> Any:
16
18
  cli_shared.add_outfile_arg(sub, what="signed transaction, hash")
17
19
  cli_shared.add_broadcast_args(sub, relay=True)
18
20
  cli_shared.add_proxy_arg(sub)
21
+ cli_shared.add_guardian_wallet_args(args, sub)
19
22
  sub.add_argument("--wait-result", action="store_true", default=False,
20
23
  help="signal to wait for the transaction result - only valid if --send is set")
21
24
  sub.add_argument("--timeout", default=100, help="max num of seconds to wait for result"
@@ -36,6 +39,16 @@ def setup_parser(args: List[str], subparsers: Any) -> Any:
36
39
  cli_shared.add_omit_fields_arg(sub)
37
40
  sub.set_defaults(func=get_transaction)
38
41
 
42
+ sub = cli_shared.add_command_subparser(subparsers, "tx", "sign", f"Sign a previously saved transaction.{CLIOutputBuilder.describe()}")
43
+ cli_shared.add_wallet_args(args, sub)
44
+ cli_shared.add_infile_arg(sub, what="a previously saved transaction")
45
+ cli_shared.add_outfile_arg(sub, what="the signed transaction")
46
+ cli_shared.add_broadcast_args(sub, relay=True)
47
+ cli_shared.add_proxy_arg(sub)
48
+ cli_shared.add_guardian_args(sub)
49
+ cli_shared.add_guardian_wallet_args(args, sub)
50
+ sub.set_defaults(func=sign_transaction)
51
+
39
52
  parser.epilog = cli_shared.build_group_epilog(subparsers)
40
53
  return subparsers
41
54
 
@@ -49,7 +62,7 @@ def _add_common_arguments(args: List[str], sub: Any):
49
62
  def create_transaction(args: Any):
50
63
  args = utils.as_object(args)
51
64
 
52
- cli_shared.check_guardian_args(args)
65
+ cli_shared.check_guardian_and_options_args(args)
53
66
  cli_shared.check_broadcast_args(args)
54
67
  cli_shared.prepare_nonce_in_args(args)
55
68
 
@@ -85,3 +98,35 @@ def get_transaction(args: Any):
85
98
  transaction = proxy.get_transaction(args.hash)
86
99
  output = CLIOutputBuilder().set_transaction_on_network(transaction, omit_fields).build()
87
100
  utils.dump_out_json(output)
101
+
102
+
103
+ def sign_transaction(args: Any):
104
+ args = utils.as_object(args)
105
+
106
+ cli_shared.check_guardian_args(args)
107
+ cli_shared.check_broadcast_args(args)
108
+
109
+ tx = Transaction.load_from_file(args.infile)
110
+ if args.guardian:
111
+ cli_shared.check_options_for_guarded_tx(tx.options)
112
+
113
+ # clear existing signatures, if any
114
+ tx.guardianSignature = ""
115
+ tx.signature = ""
116
+
117
+ account = cli_shared.prepare_account(args)
118
+ signature = account.sign_transaction(tx)
119
+
120
+ try:
121
+ guardian_account = cli_shared.prepare_guardian_account(args)
122
+ except NoWalletProvided:
123
+ guardian_account = None
124
+
125
+ if guardian_account:
126
+ tx.guardianSignature = guardian_account.sign_transaction(tx)
127
+ elif args.guardian:
128
+ tx = cosign_transaction(tx, args.guardian_service_url, args.guardian_2fa_code)
129
+
130
+ tx.signature = signature
131
+
132
+ cli_shared.send_or_simulate(tx, args)
@@ -91,6 +91,7 @@ def _add_common_arguments(args: List[str], sub: Any):
91
91
  cli_shared.add_tx_args(args, sub, with_receiver=False, with_data=False, with_estimate_gas=True, with_guardian=True)
92
92
  cli_shared.add_broadcast_args(sub, relay=False)
93
93
  cli_shared.add_outfile_arg(sub, what="signed transaction, hash")
94
+ cli_shared.add_guardian_wallet_args(args, sub)
94
95
 
95
96
 
96
97
  def _add_nodes_arg(sub: Any):
@@ -3,7 +3,7 @@ import json
3
3
  import logging
4
4
  import time
5
5
  from pathlib import Path
6
- from typing import Any, Dict, Tuple
6
+ from typing import Any, Dict, Tuple, Optional
7
7
 
8
8
  import requests
9
9
 
@@ -24,11 +24,13 @@ class ContractVerificationRequest:
24
24
  source_code: Dict[str, Any],
25
25
  signature: bytes,
26
26
  docker_image: str,
27
+ contract_variant: Optional[str]
27
28
  ) -> None:
28
29
  self.contract = contract
29
30
  self.source_code = source_code
30
31
  self.signature = signature
31
32
  self.docker_image = docker_image
33
+ self.contract_variant = contract_variant
32
34
 
33
35
  def to_dictionary(self) -> Dict[str, Any]:
34
36
  return {
@@ -36,39 +38,42 @@ class ContractVerificationRequest:
36
38
  "payload": {
37
39
  "contract": self.contract.bech32(),
38
40
  "dockerImage": self.docker_image,
39
- "sourceCode": self.source_code
41
+ "sourceCode": self.source_code,
42
+ "contractVariant": self.contract_variant
40
43
  }
41
44
  }
42
45
 
43
46
 
44
47
  class ContractVerificationPayload:
45
- def __init__(self, contract: Address, source_code: Dict[str, Any], docker_image: str,) -> None:
48
+ def __init__(self, contract: Address, source_code: Dict[str, Any], docker_image: str, contract_variant: Optional[str]) -> None:
46
49
  self.contract = contract
47
50
  self.source_code = source_code
48
51
  self.docker_image = docker_image
52
+ self.contract_variant = contract_variant
49
53
 
50
- def serialize(self):
54
+ def serialize(self) -> str:
51
55
  payload = {
52
56
  "contract": self.contract.bech32(),
53
57
  "dockerImage": self.docker_image,
54
- "sourceCode": self.source_code
58
+ "sourceCode": self.source_code,
59
+ "contractVariant": self.contract_variant
55
60
  }
56
61
 
57
62
  return json.dumps(payload, separators=(',', ':'))
58
63
 
59
64
 
60
65
  def trigger_contract_verification(
61
- packaged_source: Path,
62
- owner: Account,
63
- contract: Address,
64
- verifier_url: str,
65
- docker_image: str,
66
- ):
66
+ packaged_source: Path,
67
+ owner: Account,
68
+ contract: Address,
69
+ verifier_url: str,
70
+ docker_image: str,
71
+ contract_variant: Optional[str]):
67
72
  source_code = read_json_file(packaged_source)
68
73
 
69
- payload = ContractVerificationPayload(contract, source_code, docker_image).serialize()
74
+ payload = ContractVerificationPayload(contract, source_code, docker_image, contract_variant).serialize()
70
75
  signature = _create_request_signature(owner, contract, payload.encode())
71
- contract_verification = ContractVerificationRequest(contract, source_code, signature, docker_image)
76
+ contract_verification = ContractVerificationRequest(contract, source_code, signature, docker_image, contract_variant)
72
77
 
73
78
  request_dictionary = contract_verification.to_dictionary()
74
79
 
@@ -100,7 +105,7 @@ def _create_request_signature(account: Account, contract_address: Address, reque
100
105
  raw_data_to_sign = f"{contract_address.bech32()}{hashed_payload}"
101
106
 
102
107
  signature_hex = account.sign_message(raw_data_to_sign.encode())
103
- signature: bytes = bytes.fromhex(signature_hex)
108
+ signature = bytes.fromhex(signature_hex)
104
109
 
105
110
  return signature
106
111