cli_commands/
key_params.rs1use sidechain_domain::*;
2use std::convert::Infallible;
3use std::fmt::Display;
4use std::io;
5use std::io::ErrorKind;
6use std::str::FromStr;
7
8#[derive(Clone, Debug)]
9pub struct SidechainSigningKeyParam(pub secp256k1::SecretKey);
10
11impl SidechainSigningKeyParam {
12 pub fn to_pub_key(&self) -> secp256k1::PublicKey {
13 secp256k1::PublicKey::from_secret_key_global(&self.0)
14 }
15}
16
17impl FromStr for SidechainSigningKeyParam {
18 type Err = secp256k1::Error;
19
20 fn from_str(s: &str) -> Result<Self, Self::Err> {
21 let trimmed = s.trim_start_matches("0x");
22 let pair = secp256k1::SecretKey::from_str(trimmed)?;
23 Ok(SidechainSigningKeyParam(pair))
24 }
25}
26
27#[derive(Clone, Debug)]
28pub struct SidechainPublicKeyParam(pub SidechainPublicKey);
29
30impl Display for SidechainPublicKeyParam {
31 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
32 write!(f, "0x{}", hex::encode(&self.0.0))
33 }
34}
35
36impl FromStr for SidechainPublicKeyParam {
37 type Err = secp256k1::Error;
38
39 fn from_str(s: &str) -> Result<Self, Self::Err> {
40 let trimmed = s.trim_start_matches("0x");
41 let pk = secp256k1::PublicKey::from_str(trimmed)?;
42 Ok(SidechainPublicKeyParam(SidechainPublicKey(pk.serialize().to_vec())))
43 }
44}
45
46#[derive(Clone, Debug)]
47pub struct PlainPublicKeyParam(pub String);
48
49impl Display for PlainPublicKeyParam {
50 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
51 write!(f, "{}", self.0)
52 }
53}
54
55impl FromStr for PlainPublicKeyParam {
56 type Err = Infallible;
57
58 fn from_str(s: &str) -> Result<Self, Self::Err> {
59 Ok(PlainPublicKeyParam(s.to_string()))
60 }
61}
62
63#[derive(Debug, thiserror::Error)]
64pub enum Ed25519SigningKeyError {
65 #[error("{0}")]
66 HexError(#[from] hex::FromHexError),
67 #[error("{0}")]
68 Ed25519Error(#[from] ed25519_zebra::Error),
69}
70
71impl From<Ed25519SigningKeyError> for io::Error {
72 fn from(value: Ed25519SigningKeyError) -> Self {
73 io::Error::new(ErrorKind::InvalidInput, value)
74 }
75}
76
77pub(crate) fn parse_zebra_signing_key(
78 s: &str,
79) -> Result<ed25519_zebra::SigningKey, Ed25519SigningKeyError> {
80 let trimmed = s.trim_start_matches("0x");
81 Ok(ed25519_zebra::SigningKey::try_from(hex::decode(trimmed)?.as_slice())?)
82}
83
84#[derive(Clone, Debug)]
85pub struct StakePoolSigningKeyParam(pub ed25519_zebra::SigningKey);
86
87impl FromStr for StakePoolSigningKeyParam {
88 type Err = Ed25519SigningKeyError;
89
90 fn from_str(s: &str) -> Result<Self, Self::Err> {
91 Ok(Self(parse_zebra_signing_key(s)?))
92 }
93}
94
95impl From<[u8; 32]> for StakePoolSigningKeyParam {
96 fn from(key: [u8; 32]) -> Self {
97 Self(ed25519_zebra::SigningKey::from(key))
98 }
99}
100
101impl StakePoolSigningKeyParam {
102 pub fn vkey(&self) -> StakePoolPublicKey {
103 StakePoolPublicKey(ed25519_zebra::VerificationKey::from(&self.0).into())
104 }
105}
106
107#[derive(Clone, Debug)]
108pub struct StakeSigningKeyParam(pub ed25519_zebra::SigningKey);
109
110impl FromStr for StakeSigningKeyParam {
111 type Err = Ed25519SigningKeyError;
112
113 fn from_str(s: &str) -> Result<Self, Self::Err> {
114 Ok(Self(parse_zebra_signing_key(s)?))
115 }
116}
117
118impl StakeSigningKeyParam {
119 pub fn vkey(&self) -> StakePublicKey {
120 StakePublicKey(ed25519_zebra::VerificationKey::from(&self.0).into())
121 }
122}
123
124#[derive(Clone, Debug)]
125pub struct CrossChainSigningKeyParam(pub k256::SecretKey);
126
127impl FromStr for CrossChainSigningKeyParam {
128 type Err = anyhow::Error;
129
130 fn from_str(s: &str) -> Result<Self, Self::Err> {
131 Ok(Self(k256::SecretKey::from_slice(&hex::decode(s)?)?))
132 }
133}
134
135impl CrossChainSigningKeyParam {
136 pub fn vkey(&self) -> CrossChainPublicKey {
137 CrossChainPublicKey(self.0.public_key().to_sec1_bytes().to_vec())
138 }
139}