pub use secp256k1::XOnlyPublicKey;
use secp256k1::Secp256k1;
use crate::Scalar;
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub struct XOnlyPrivateKey {
key: secp256k1::SecretKey,
}
impl XOnlyPrivateKey {
pub fn from_raw(key: secp256k1::SecretKey) -> Self {
XOnlyPrivateKey {
key,
}
}
pub fn compute_public_key<C: secp256k1::Signing>(self, context: &Secp256k1<C>) -> secp256k1::XOnlyPublicKey {
secp256k1::PublicKey::from_secret_key(context, &self.key).into()
}
pub fn add_tweak(self, tweak: &Scalar) -> Result<Self, secp256k1::Error> {
self.key.add_tweak(tweak).map(|key| XOnlyPrivateKey { key })
}
pub fn mul_tweak(self, tweak: &Scalar) -> Result<Self, secp256k1::Error> {
self.key.mul_tweak(tweak).map(|key| XOnlyPrivateKey { key })
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub struct XOnlyKeyPair {
key: secp256k1::KeyPair,
}
impl XOnlyKeyPair {
pub fn from_raw(key: secp256k1::KeyPair) -> Self {
XOnlyKeyPair {
key,
}
}
pub fn public_key(self) -> secp256k1::XOnlyPublicKey {
secp256k1::PublicKey::from(self.key).into()
}
pub fn private_key(self) -> XOnlyPrivateKey {
XOnlyPrivateKey::from_raw(self.key.into())
}
pub fn add_tweak<C: secp256k1::Signing + secp256k1::Verification>(self, context: &Secp256k1<C>, tweak: &Scalar) -> Result<Self, secp256k1::Error> {
self.key.add_xonly_tweak(context, tweak).map(|key| XOnlyKeyPair { key })
}
}