@@ -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+
10651141pub ( 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