|
1 | 1 | use sp_core::{sr25519, Pair}; |
| 2 | +use std::env; |
2 | 3 |
|
3 | 4 | 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"); |
13 | 82 | } |
0 commit comments