//! @brief Example Rust-based BPF program that performs a ristretto multiply

pub mod ristretto;

use crate::ristretto::ristretto_mul;
use curve25519_dalek::{constants::RISTRETTO_BASEPOINT_POINT, scalar::Scalar};
use solana_program::{
    account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, msg, pubkey::Pubkey,
};

fn test_ristretto_mul() -> ProgramResult {
    let point = RISTRETTO_BASEPOINT_POINT;
    let scalar = Scalar::zero();
    let result = ristretto_mul(&point, &scalar)?;
    assert_ne!(point, result);

    let point = RISTRETTO_BASEPOINT_POINT;
    let scalar = Scalar::one();
    let result = ristretto_mul(&point, &scalar)?;
    assert_eq!(point, result);

    Ok(())
}

entrypoint!(process_instruction);
fn process_instruction(
    _program_id: &Pubkey,
    _accounts: &[AccountInfo],
    _instruction_data: &[u8],
) -> ProgramResult {
    msg!("Ristretto multiply");

    test_ristretto_mul()?;

    Ok(())
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn test_ristretto() {
        test_ristretto_mul().unwrap();
    }
}
