Skip to content

Commit 460e392

Browse files
committed
feat: add sign and verify commands to utils binary
1 parent ed82d98 commit 460e392

File tree

1 file changed

+78
-9
lines changed

1 file changed

+78
-9
lines changed

bins/utils/src/main.rs

Lines changed: 78 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,82 @@
11
use sp_core::{sr25519, Pair};
2+
use std::env;
23

34
fn main() {
4-
let secret_hex = "0000000000000000000000000000000000000000000000000000000000000001";
5-
let bytes = hex::decode(secret_hex).expect("Invalid hex");
6-
let mut arr = [0u8; 32];
7-
arr.copy_from_slice(&bytes);
8-
9-
// Use sr25519 (Substrate/Bittensor standard)
10-
let pair = sr25519::Pair::from_seed(&arr);
11-
let public = pair.public();
12-
println!("{}", hex::encode(public.0));
5+
let args: Vec<String> = env::args().collect();
6+
7+
if args.len() < 2 {
8+
print_usage();
9+
return;
10+
}
11+
12+
match args[1].as_str() {
13+
"hotkey-from-mnemonic" => {
14+
if args.len() < 3 {
15+
eprintln!("Usage: utils hotkey-from-mnemonic <mnemonic>");
16+
std::process::exit(1);
17+
}
18+
let mnemonic = &args[2];
19+
let (pair, _) = sr25519::Pair::from_phrase(mnemonic, None).expect("Invalid mnemonic");
20+
println!("{}", hex::encode(pair.public().0));
21+
}
22+
"sign" => {
23+
if args.len() < 4 {
24+
eprintln!("Usage: utils sign <mnemonic> <message>");
25+
std::process::exit(1);
26+
}
27+
let mnemonic = &args[2];
28+
let message = &args[3];
29+
let (pair, _) = sr25519::Pair::from_phrase(mnemonic, None).expect("Invalid mnemonic");
30+
let signature = pair.sign(message.as_bytes());
31+
println!("{}", hex::encode(signature.0));
32+
}
33+
"verify" => {
34+
if args.len() < 5 {
35+
eprintln!("Usage: utils verify <hotkey_hex> <message> <signature_hex>");
36+
std::process::exit(1);
37+
}
38+
let hotkey_hex = &args[2];
39+
let message = &args[3];
40+
let sig_hex = &args[4];
41+
42+
let hotkey_bytes = hex::decode(hotkey_hex).expect("Invalid hotkey hex");
43+
let sig_bytes = hex::decode(sig_hex).expect("Invalid signature hex");
44+
45+
let mut hotkey_arr = [0u8; 32];
46+
let mut sig_arr = [0u8; 64];
47+
hotkey_arr.copy_from_slice(&hotkey_bytes);
48+
sig_arr.copy_from_slice(&sig_bytes);
49+
50+
let public = sr25519::Public::from_raw(hotkey_arr);
51+
let signature = sr25519::Signature::from_raw(sig_arr);
52+
53+
let valid = sr25519::Pair::verify(&signature, message.as_bytes(), &public);
54+
println!("{}", valid);
55+
}
56+
"from-seed" => {
57+
if args.len() < 3 {
58+
eprintln!("Usage: utils from-seed <seed_hex>");
59+
std::process::exit(1);
60+
}
61+
let seed_hex = &args[2];
62+
let bytes = hex::decode(seed_hex).expect("Invalid hex");
63+
let mut arr = [0u8; 32];
64+
arr.copy_from_slice(&bytes);
65+
let pair = sr25519::Pair::from_seed(&arr);
66+
println!("{}", hex::encode(pair.public().0));
67+
}
68+
_ => {
69+
print_usage();
70+
}
71+
}
72+
}
73+
74+
fn print_usage() {
75+
eprintln!("Platform Utilities");
76+
eprintln!();
77+
eprintln!("Commands:");
78+
eprintln!(" hotkey-from-mnemonic <mnemonic> - Get hotkey from BIP39 mnemonic");
79+
eprintln!(" sign <mnemonic> <message> - Sign a message with mnemonic");
80+
eprintln!(" verify <hotkey> <message> <sig> - Verify a signature");
81+
eprintln!(" from-seed <seed_hex> - Get hotkey from seed hex");
1382
}

0 commit comments

Comments
 (0)