#[macro_use]
extern crate tracing;
mod cashnotes;
mod error;
mod genesis;
mod transfers;
mod wallet;
pub(crate) use cashnotes::{Input, TransactionBuilder};
pub use cashnotes::{
CashNote, DerivationIndex, DerivedSecretKey, Hash, MainPubkey, MainSecretKey, NanoTokens,
SignedSpend, Spend, SpendAddress, Transaction, UniquePubkey, UnsignedTransfer,
};
pub use error::{Result, TransferError};
pub use transfers::{CashNoteRedemption, OfflineTransfer, Transfer};
pub use genesis::{
calculate_royalties_fee, create_faucet_wallet, create_first_cash_note_from_key,
get_faucet_data_dir, is_genesis_parent_tx, is_genesis_spend, load_genesis_wallet,
Error as GenesisError, GENESIS_CASHNOTE, GENESIS_CASHNOTE_SK, NETWORK_ROYALTIES_PK,
TOTAL_SUPPLY,
};
pub use wallet::{
bls_secret_from_hex, wallet_lockfile_name, Error as WalletError, HotWallet, Payment,
PaymentQuote, QuotingMetrics, Result as WalletResult, WalletApi, WatchOnlyWallet,
QUOTE_EXPIRATION_SECS, WALLET_DIR_NAME,
};
pub use bls::{self, rand, Ciphertext, Signature};
pub mod rng {
use crate::rand::{
rngs::{StdRng, ThreadRng},
SeedableRng,
};
use tiny_keccak::{Hasher, Sha3};
pub fn thread_rng() -> ThreadRng {
crate::rand::thread_rng()
}
pub fn from_seed(seed: <StdRng as SeedableRng>::Seed) -> StdRng {
StdRng::from_seed(seed)
}
pub fn from_vec(vec: &[u8]) -> StdRng {
let mut sha3 = Sha3::v256();
sha3.update(vec);
let mut hash = [0u8; 32];
sha3.finalize(&mut hash);
from_seed(hash)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::rng::from_vec;
#[test]
fn confirm_generating_same_key() {
let rng_seed = b"testing generating same key";
let content = b"some context to try with";
let mut rng_1 = from_vec(rng_seed);
let reward_key_1 = MainSecretKey::random_from_rng(&mut rng_1);
let sig = reward_key_1.sign(content);
let mut rng_2 = from_vec(rng_seed);
let reward_key_2 = MainSecretKey::random_from_rng(&mut rng_2);
assert!(reward_key_2.main_pubkey().verify(&sig, content));
}
}