use starknet::{
core::types::Felt,
signers::{LocalWallet, Signer, SignerInteractivityContext, SigningKey, VerifyingKey},
};
use crate::error::{Result, StarkzapError};
#[derive(Debug, Clone)]
pub struct StarkSigner {
pub(crate) wallet: LocalWallet,
pub(crate) address: Option<Felt>,
pub(crate) public_key: Felt,
}
impl StarkSigner {
pub fn from_private_key(private_key_hex: &str) -> Result<Self> {
let pk_felt =
Felt::from_hex(private_key_hex).map_err(|_| StarkzapError::InvalidPrivateKey)?;
let signing_key = SigningKey::from_secret_scalar(pk_felt);
let public_key = signing_key.verifying_key().scalar();
let wallet = LocalWallet::from(signing_key);
Ok(Self {
wallet,
address: None,
public_key,
})
}
pub fn new(private_key_hex: &str, address_hex: &str) -> Result<Self> {
let address = Felt::from_hex(address_hex)
.map_err(|_| StarkzapError::InvalidAddress(address_hex.to_string()))?;
let mut signer = Self::from_private_key(private_key_hex)?;
signer.address = Some(address);
Ok(signer)
}
pub fn with_address(mut self, address_hex: &str) -> Result<Self> {
let address = Felt::from_hex(address_hex)
.map_err(|_| StarkzapError::InvalidAddress(address_hex.to_string()))?;
self.address = Some(address);
Ok(self)
}
pub fn address(&self) -> Option<Felt> {
self.address
}
pub fn public_key(&self) -> Felt {
self.public_key
}
pub fn local_wallet(&self) -> &LocalWallet {
&self.wallet
}
}
#[cfg_attr(not(target_arch = "wasm32"), async_trait::async_trait)]
#[cfg_attr(target_arch = "wasm32", async_trait::async_trait(?Send))]
impl Signer for StarkSigner {
type GetPublicKeyError = StarkzapError;
type SignError = StarkzapError;
async fn get_public_key(&self) -> std::result::Result<VerifyingKey, Self::GetPublicKeyError> {
Ok(VerifyingKey::from_scalar(self.public_key))
}
async fn sign_hash(
&self,
hash: &Felt,
) -> std::result::Result<starknet::core::crypto::Signature, Self::SignError> {
self.wallet
.sign_hash(hash)
.await
.map_err(|e| StarkzapError::Signer(e.to_string()))
}
fn is_interactive(&self, _context: SignerInteractivityContext<'_>) -> bool {
false
}
}