#[macro_use]
extern crate lazy_static;
mod authorized;
pub use authorized::*;
mod config;
pub use config::*;
#[cfg(test)]
mod tests;
use snarkvm::console::{
account::{Address, PrivateKey},
program::{Literal, Value},
types::{Boolean, U64},
};
use anyhow::Result;
use core::str::FromStr;
use rand::{CryptoRng, Rng};
pub struct Credits;
impl Credits {
pub fn bond_public(
private_key: &str,
validator: &str,
amount_in_microcredits: u64,
priority_fee_in_microcredits: u64,
broadcast: bool,
rng: &mut (impl Rng + CryptoRng),
) -> Result<Authorized<N>> {
let private_key = PrivateKey::<N>::from_str(private_key)?;
let validator = Address::<N>::from_str(validator)?;
let amount_in_microcredits = U64::<N>::new(amount_in_microcredits);
let (program_id, function_name) = ("credits.aleo", "bond_public");
let inputs =
vec![Value::<N>::from(Literal::Address(validator)), Value::from(Literal::U64(amount_in_microcredits))];
Self::authorize(&private_key, program_id, function_name, inputs, priority_fee_in_microcredits, broadcast, rng)
}
pub fn unbond_public(
private_key: &str,
amount_in_microcredits: u64,
priority_fee_in_microcredits: u64,
broadcast: bool,
rng: &mut (impl Rng + CryptoRng),
) -> Result<Authorized<N>> {
let private_key = PrivateKey::<N>::from_str(private_key)?;
let amount_in_microcredits = U64::<N>::new(amount_in_microcredits);
let (program_id, function_name) = ("credits.aleo", "unbond_public");
let inputs = vec![Value::from(Literal::U64(amount_in_microcredits))];
Self::authorize(&private_key, program_id, function_name, inputs, priority_fee_in_microcredits, broadcast, rng)
}
pub fn unbond_delegator_as_validator(
private_key: &str,
delegator: &str,
priority_fee_in_microcredits: u64,
broadcast: bool,
rng: &mut (impl Rng + CryptoRng),
) -> Result<Authorized<N>> {
let private_key = PrivateKey::<N>::from_str(private_key)?;
let delegator = Address::<N>::from_str(delegator)?;
let (program_id, function_name) = ("credits.aleo", "unbond_delegator_as_validator");
let inputs = vec![Value::<N>::from(Literal::Address(delegator))];
Self::authorize(&private_key, program_id, function_name, inputs, priority_fee_in_microcredits, broadcast, rng)
}
pub fn claim_unbond_public(
private_key: &str,
priority_fee_in_microcredits: u64,
broadcast: bool,
rng: &mut (impl Rng + CryptoRng),
) -> Result<Authorized<N>> {
let private_key = PrivateKey::<N>::from_str(private_key)?;
let (program_id, function_name) = ("credits.aleo", "claim_unbond_public");
Self::authorize(&private_key, program_id, function_name, vec![], priority_fee_in_microcredits, broadcast, rng)
}
pub fn set_validator_state(
private_key: &str,
is_open: bool,
priority_fee_in_microcredits: u64,
broadcast: bool,
rng: &mut (impl Rng + CryptoRng),
) -> Result<Authorized<N>> {
let private_key = PrivateKey::<N>::from_str(private_key)?;
let is_open = Boolean::<N>::new(is_open);
let (program_id, function_name) = ("credits.aleo", "set_validator_state");
let inputs = vec![Value::<N>::from(Literal::Boolean(is_open))];
Self::authorize(&private_key, program_id, function_name, inputs, priority_fee_in_microcredits, broadcast, rng)
}
pub fn transfer_public(
private_key: &str,
recipient: &str,
amount_in_microcredits: u64,
priority_fee_in_microcredits: u64,
broadcast: bool,
rng: &mut (impl Rng + CryptoRng),
) -> Result<Authorized<N>> {
let private_key = PrivateKey::<N>::from_str(private_key)?;
let recipient = Address::<N>::from_str(recipient)?;
let amount_in_microcredits = U64::<N>::new(amount_in_microcredits);
let (program_id, function_name) = ("credits.aleo", "transfer_public");
let inputs =
vec![Value::<N>::from(Literal::Address(recipient)), Value::from(Literal::U64(amount_in_microcredits))];
Self::authorize(&private_key, program_id, function_name, inputs, priority_fee_in_microcredits, broadcast, rng)
}
pub fn transfer_public_to_private(
private_key: &str,
recipient: &str,
amount_in_microcredits: u64,
priority_fee_in_microcredits: u64,
broadcast: bool,
rng: &mut (impl Rng + CryptoRng),
) -> Result<Authorized<N>> {
let private_key = PrivateKey::<N>::from_str(private_key)?;
let recipient = Address::<N>::from_str(recipient)?;
let amount_in_microcredits = U64::<N>::new(amount_in_microcredits);
let (program_id, function_name) = ("credits.aleo", "transfer_public_to_private");
let inputs =
vec![Value::<N>::from(Literal::Address(recipient)), Value::from(Literal::U64(amount_in_microcredits))];
Self::authorize(&private_key, program_id, function_name, inputs, priority_fee_in_microcredits, broadcast, rng)
}
}
impl Credits {
fn authorize(
private_key: &PrivateKey<N>,
program_id: &str,
function_name: &str,
inputs: Vec<Value<N>>,
priority_fee_in_microcredits: u64,
broadcast: bool,
rng: &mut (impl Rng + CryptoRng),
) -> Result<Authorized<N>> {
let function = PROCESS.authorize::<A, _>(private_key, program_id, function_name, inputs.into_iter(), rng)?;
let execution_id = function.to_execution_id()?;
let base_fee_in_microcredits = get_base_fee_in_microcredits(program_id, function_name)?;
let fee = match base_fee_in_microcredits == 0 && priority_fee_in_microcredits == 0 {
true => None,
false => Some(PROCESS.authorize_fee_public::<A, _>(
private_key,
base_fee_in_microcredits,
priority_fee_in_microcredits,
execution_id,
rng,
)?),
};
Ok(Authorized::<N>::new(function, fee, broadcast))
}
}