pub mod box_selector;
pub mod secret_key;
pub mod signing;
pub mod tx_builder;
use secret_key::SecretKey;
use signing::{sign_transaction, TxSigningError};
use thiserror::Error;
use crate::chain::ergo_state_context::ErgoStateContext;
use crate::chain::transaction::Transaction;
use crate::sigma_protocol::{
private_input::PrivateInput,
prover::{Prover, TestProver},
};
use self::signing::TransactionContext;
pub struct Wallet {
prover: Box<dyn Prover>,
}
#[derive(Error, PartialEq, Eq, Debug, Clone)]
pub enum WalletError {
#[error("Transaction signing error: {0}")]
TxSigningError(TxSigningError),
}
impl From<TxSigningError> for WalletError {
fn from(e: TxSigningError) -> Self {
WalletError::TxSigningError(e)
}
}
impl Wallet {
pub fn from_secrets(secrets: Vec<SecretKey>) -> Wallet {
let prover = TestProver {
secrets: secrets.into_iter().map(PrivateInput::from).collect(),
};
Wallet {
prover: Box::new(prover),
}
}
pub fn sign_transaction(
&self,
tx_context: TransactionContext,
state_context: &ErgoStateContext,
) -> Result<Transaction, WalletError> {
sign_transaction(self.prover.as_ref(), tx_context, state_context).map_err(WalletError::from)
}
}