Skip to content

Commit b5127f3

Browse files
Merge pull request #226 from darthsiroftardis/add-contract-package-arg
Add contract package arg
2 parents 03303a5 + 9778501 commit b5127f3

File tree

2 files changed

+103
-13
lines changed

2 files changed

+103
-13
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ tempfile = "3.8.1"
6060
casper-types = { version = "5.0.0", features = ["std", "json-schema", "testing"] }
6161

6262
[patch.crates-io]
63-
casper-types = { git = "https://github.com/casper-network/casper-node.git", branch = "feat-2.0" }
63+
casper-types = { git = "https://github.com/casper-network/casper-node.git", branch = "dev" }
6464

6565
[package.metadata.deb]
6666
features = ["vendored-openssl"]

src/transaction/creation_common.rs

Lines changed: 102 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ pub(super) enum DisplayOrder {
4949
NewPublicKey,
5050
PackageAlias,
5151
PackageAddr,
52+
ContractPackageHash,
5253
EntityAlias,
5354
PaymentAmount,
5455
PricingMode,
@@ -62,6 +63,7 @@ pub(super) enum DisplayOrder {
6263
NewValidator,
6364
Delegator,
6465
EntityAddr,
66+
ContractHash,
6567
RpcId,
6668
Verbose,
6769
}
@@ -983,13 +985,12 @@ pub(super) mod entity_addr {
983985
use casper_types::{EntityAddr, Key};
984986

985987
pub const ARG_NAME: &str = "entity-address";
986-
const ARG_VALUE_NAME: &str = "FORMATTED STRING or PATH";
988+
const ARG_VALUE_NAME: &str = "FORMATTED STRING";
987989
const ARG_HELP: &str = "The formatted string representing an addressable entity address.";
988990

989991
pub fn arg() -> Arg {
990992
Arg::new(ARG_NAME)
991993
.long(ARG_NAME)
992-
.required(true)
993994
.value_name(ARG_VALUE_NAME)
994995
.help(ARG_HELP)
995996
.display_order(DisplayOrder::EntityAddr as usize)
@@ -1012,7 +1013,45 @@ pub(super) mod entity_addr {
10121013
match entity_addr {
10131014
Key::AddressableEntity(entity_addr) => Ok(entity_addr),
10141015
_ => Err(CliError::from(Error::InvalidKeyVariant {
1015-
expected_variant: "AddressibleEntity".to_string(),
1016+
expected_variant: "AddressableEntity".to_string(),
1017+
actual: entity_addr,
1018+
})),
1019+
}
1020+
}
1021+
}
1022+
1023+
pub(super) mod contract_hash {
1024+
use super::*;
1025+
use casper_client::cli::CliError;
1026+
use casper_client::Error;
1027+
use casper_types::{EntityAddr, Key};
1028+
1029+
pub const ARG_NAME: &str = "contract-hash";
1030+
const ARG_VALUE_NAME: &str = "FORMATTED STRING";
1031+
const ARG_HELP: &str = "The formatted string prefixed by hash- representing a 1.x contract.";
1032+
1033+
pub fn arg() -> Arg {
1034+
Arg::new(ARG_NAME)
1035+
.long(ARG_NAME)
1036+
.value_name(ARG_VALUE_NAME)
1037+
.help(ARG_HELP)
1038+
.display_order(DisplayOrder::ContractHash as usize)
1039+
}
1040+
1041+
pub fn get(matches: &ArgMatches) -> Option<&str> {
1042+
matches.get_one::<String>(ARG_NAME).map(String::as_str)
1043+
}
1044+
1045+
pub(super) fn parse_contract_hash(value: &str) -> Result<EntityAddr, CliError> {
1046+
let entity_addr =
1047+
Key::from_formatted_str(value).map_err(|error| CliError::FailedToParseKey {
1048+
context: "contract hash",
1049+
error,
1050+
})?;
1051+
match entity_addr {
1052+
Key::Hash(hash_addr) => Ok(EntityAddr::SmartContract(hash_addr)),
1053+
_ => Err(CliError::from(Error::InvalidKeyVariant {
1054+
expected_variant: "Key::Hash".to_string(),
10161055
actual: entity_addr,
10171056
})),
10181057
}
@@ -1026,15 +1065,14 @@ pub(super) mod package_addr {
10261065

10271066
pub const ARG_NAME: &str = "package-address";
10281067
const ARG_VALUE_NAME: &str = "FORMATTED STRING or PATH";
1029-
const ARG_HELP: &str = "The formatted string representing an addressable entity address.";
1068+
const ARG_HELP: &str = "The formatted string representing an package address.";
10301069

10311070
pub fn arg() -> Arg {
10321071
Arg::new(ARG_NAME)
10331072
.long(ARG_NAME)
1034-
.required(true)
10351073
.value_name(ARG_VALUE_NAME)
10361074
.help(ARG_HELP)
1037-
.display_order(DisplayOrder::PackageAddr as usize)
1075+
.display_order(DisplayOrder::ContractPackageHash as usize)
10381076
}
10391077

10401078
pub fn get(matches: &ArgMatches) -> Option<&str> {
@@ -1062,6 +1100,44 @@ pub(super) mod package_addr {
10621100
}
10631101
}
10641102

1103+
pub(super) mod contract_package_hash {
1104+
use super::*;
1105+
use casper_client::{cli::CliError, Error};
1106+
use casper_types::{Key, PackageAddr};
1107+
1108+
pub const ARG_NAME: &str = "contract-package-hash";
1109+
const ARG_VALUE_NAME: &str = "FORMATTED STRING";
1110+
const ARG_HELP: &str =
1111+
"The formatted string prefixed by hash- representing a 1.x contract package";
1112+
1113+
pub fn arg() -> Arg {
1114+
Arg::new(ARG_NAME)
1115+
.long(ARG_NAME)
1116+
.value_name(ARG_VALUE_NAME)
1117+
.help(ARG_HELP)
1118+
.display_order(DisplayOrder::PackageAddr as usize)
1119+
}
1120+
1121+
pub fn get(matches: &ArgMatches) -> Option<&str> {
1122+
matches.get_one::<String>(ARG_NAME).map(String::as_str)
1123+
}
1124+
1125+
pub(super) fn parse_package_addr(value: &str) -> Result<PackageAddr, CliError> {
1126+
let package_addr =
1127+
Key::from_formatted_str(value).map_err(|error| CliError::FailedToParseKey {
1128+
context: "contract-package-hash",
1129+
error,
1130+
})?;
1131+
match package_addr {
1132+
Key::Hash(package_addr) => Ok(package_addr),
1133+
_ => Err(CliError::Core(Error::InvalidKeyVariant {
1134+
expected_variant: "ContractPackageHash".to_string(),
1135+
actual: package_addr,
1136+
})),
1137+
}
1138+
}
1139+
}
1140+
10651141
pub(super) mod session_entry_point {
10661142
use super::*;
10671143

@@ -1985,8 +2061,13 @@ pub(super) mod invocable_entity {
19852061
show_simple_arg_examples_and_exit_if_required(matches);
19862062
show_json_args_examples_and_exit_if_required(matches);
19872063

1988-
let entity_addr_str = entity_addr::get(matches)?;
1989-
let entity_addr = entity_addr::parse_entity_addr(entity_addr_str)?;
2064+
let entity_addr = match contract_hash::get(matches) {
2065+
None => {
2066+
let entity_addr_str = entity_addr::get(matches)?;
2067+
entity_addr::parse_entity_addr(entity_addr_str)?
2068+
}
2069+
Some(contract_hash_as_str) => contract_hash::parse_contract_hash(contract_hash_as_str)?,
2070+
};
19902071

19912072
let entry_point = session_entry_point::get(matches).unwrap_or_default();
19922073
let runtime = get_transaction_runtime(matches)?;
@@ -2001,7 +2082,8 @@ pub(super) mod invocable_entity {
20012082

20022083
fn add_args(invocable_entity_subcommand: Command) -> Command {
20032084
invocable_entity_subcommand
2004-
.arg(entity_addr::arg())
2085+
.arg(entity_addr::arg().required_unless_present(contract_hash::ARG_NAME))
2086+
.arg(contract_hash::arg())
20052087
.arg(session_entry_point::arg())
20062088
.arg(transaction_runtime::arg())
20072089
.arg(transferred_value::arg())
@@ -2086,8 +2168,15 @@ pub(super) mod package {
20862168
show_simple_arg_examples_and_exit_if_required(matches);
20872169
show_json_args_examples_and_exit_if_required(matches);
20882170

2089-
let maybe_package_addr_str = package_addr::get(matches);
2090-
let package_addr = package_addr::parse_package_addr(maybe_package_addr_str)?;
2171+
let package_addr = match contract_package_hash::get(matches) {
2172+
None => {
2173+
let maybe_package_addr_str = package_addr::get(matches);
2174+
package_addr::parse_package_addr(maybe_package_addr_str)?
2175+
}
2176+
Some(contract_package_as_str) => {
2177+
contract_package_hash::parse_package_addr(contract_package_as_str)?
2178+
}
2179+
};
20912180
let maybe_entity_version = session_version::get(matches);
20922181
let runtime = get_transaction_runtime(matches)?;
20932182

@@ -2104,7 +2193,8 @@ pub(super) mod package {
21042193

21052194
fn add_args(package_subcommand: Command) -> Command {
21062195
package_subcommand
2107-
.arg(package_addr::arg())
2196+
.arg(package_addr::arg().required_unless_present(contract_package_hash::ARG_NAME))
2197+
.arg(contract_package_hash::arg())
21082198
.arg(session_version::arg())
21092199
.arg(session_entry_point::arg())
21102200
}

0 commit comments

Comments
 (0)