@@ -53,6 +53,15 @@ enum Commands {
5353 #[ arg( short, long) ]
5454 id : String ,
5555 } ,
56+ /// Rename a challenge (storage unaffected - uses UUID)
57+ Rename {
58+ /// Challenge ID (UUID)
59+ #[ arg( short, long) ]
60+ id : String ,
61+ /// New name for the challenge
62+ #[ arg( short, long) ]
63+ name : String ,
64+ } ,
5665 /// List all challenges
5766 List ,
5867 /// Show validator status
@@ -242,6 +251,47 @@ impl SudoCli {
242251 Ok ( ( ) )
243252 }
244253
254+ async fn rename_challenge ( & self , challenge_id : & str , new_name : & str ) -> Result < ( ) > {
255+ let timestamp = chrono:: Utc :: now ( ) . timestamp_millis ( ) ;
256+ let challenge_id = ChallengeId :: from_string ( challenge_id) ;
257+
258+ // Sign the message
259+ let msg_to_sign = format ! ( "sudo:rename:{}:{}:{}" , challenge_id, new_name, timestamp) ;
260+ let signature = self . sign ( msg_to_sign. as_bytes ( ) ) ?;
261+
262+ let request = SudoRequest {
263+ action : "rename" . to_string ( ) ,
264+ challenge_id : challenge_id. to_string ( ) ,
265+ data : None ,
266+ name : Some ( new_name. to_string ( ) ) ,
267+ signature : hex:: encode ( & signature) ,
268+ timestamp,
269+ } ;
270+
271+ let response = self
272+ . client
273+ . post ( format ! ( "{}/sudo/challenge" , self . rpc_url) )
274+ . json ( & request)
275+ . send ( )
276+ . await
277+ . context ( "Failed to send request" ) ?;
278+
279+ if response. status ( ) . is_success ( ) {
280+ let result: SudoResponse = response. json ( ) . await ?;
281+ if result. success {
282+ info ! ( challenge_id = %challenge_id, new_name = new_name, "Challenge renamed" ) ;
283+ } else {
284+ warn ! ( message = %result. message, "Rename failed" ) ;
285+ }
286+ } else {
287+ let status = response. status ( ) ;
288+ let text = response. text ( ) . await . unwrap_or_default ( ) ;
289+ error ! ( status = %status, body = %text, "RPC request failed" ) ;
290+ }
291+
292+ Ok ( ( ) )
293+ }
294+
245295 async fn list_challenges ( & self ) -> Result < ( ) > {
246296 let response = self
247297 . client
@@ -390,6 +440,9 @@ async fn main() -> Result<()> {
390440 Some ( Commands :: Deactivate { id } ) => {
391441 sudo_cli. set_challenge_status ( & id, false ) . await ?;
392442 }
443+ Some ( Commands :: Rename { id, name } ) => {
444+ sudo_cli. rename_challenge ( & id, & name) . await ?;
445+ }
393446 Some ( Commands :: List ) => {
394447 sudo_cli. list_challenges ( ) . await ?;
395448 }
0 commit comments