use super::{wallet::send, Result};
use crate::Client;
use sn_transfers::genesis::{create_faucet_wallet, load_genesis_wallet};
use sn_transfers::wallet::LocalWallet;
use sn_transfers::{CashNote, MainPubkey, NanoTokens};
pub async fn get_tokens_from_faucet(
amount: NanoTokens,
to: MainPubkey,
client: &Client,
) -> Result<CashNote> {
Ok(send(
load_faucet_wallet_from_genesis_wallet(client).await?,
amount,
to,
client,
true,
)
.await?)
}
pub async fn load_faucet_wallet_from_genesis_wallet(client: &Client) -> Result<LocalWallet> {
println!("Loading faucet...");
let mut faucet_wallet = create_faucet_wallet();
let faucet_balance = faucet_wallet.balance();
if !faucet_balance.is_zero() {
println!("Faucet wallet balance: {faucet_balance}");
return Ok(faucet_wallet);
}
println!("Loading genesis...");
let genesis_wallet = load_genesis_wallet()?;
let faucet_balance = genesis_wallet.balance();
println!("Sending {faucet_balance} from genesis to faucet wallet..");
let cash_note = send(
genesis_wallet,
faucet_balance,
faucet_wallet.address(),
client,
true,
)
.await?;
faucet_wallet.deposit(&vec![cash_note.clone()])?;
faucet_wallet
.store()
.expect("Faucet wallet shall be stored successfully.");
println!("Faucet wallet balance: {}", faucet_wallet.balance());
println!("Verifying the transfer from genesis...");
if let Err(error) = client.verify(&cash_note).await {
panic!("Could not verify the transfer from genesis: {error:?}");
} else {
println!("Successfully verified the transfer from genesis on the second try.");
}
Ok(faucet_wallet)
}