arcium-anchor 0.5.2

A helper crate for integrating Arcium into Solana programs.
Documentation
use anchor_lang::prelude::*;
use arcium_client::idl::arcium::types::{AccountArgument, ArgumentList, ArgumentRef};

pub struct ArgBuilder {
    args: ArgumentList,
}

impl ArgBuilder {
    #[allow(clippy::new_without_default)]
    pub const fn new() -> Self {
        Self {
            args: ArgumentList {
                args: Vec::new(),
                byte_arrays: Vec::new(),
                plaintext_numbers: Vec::new(),
                values_128_bit: Vec::new(),
                accounts: Vec::new(),
            },
        }
    }

    pub fn plaintext_bool(mut self, value: bool) -> Self {
        self.args.args.push(ArgumentRef::PlaintextBool(value));
        self
    }

    pub fn plaintext_u8(mut self, value: u8) -> Self {
        self.args.args.push(ArgumentRef::PlaintextU8(value));
        self
    }

    pub fn plaintext_i8(mut self, value: i8) -> Self {
        self.args.args.push(ArgumentRef::PlaintextI8(value));
        self
    }

    pub fn plaintext_u16(mut self, value: u16) -> Self {
        self.args.args.push(ArgumentRef::PlaintextU16(
            self.args.plaintext_numbers.len() as u8
        ));
        self.args.plaintext_numbers.push(value as u64);
        self
    }

    pub fn plaintext_u32(mut self, value: u32) -> Self {
        self.args.args.push(ArgumentRef::PlaintextU32(
            self.args.plaintext_numbers.len() as u8
        ));
        self.args.plaintext_numbers.push(value as u64);
        self
    }

    pub fn plaintext_u64(mut self, value: u64) -> Self {
        self.args.args.push(ArgumentRef::PlaintextU64(
            self.args.plaintext_numbers.len() as u8
        ));
        self.args.plaintext_numbers.push(value);
        self
    }

    pub fn plaintext_i16(mut self, value: i16) -> Self {
        self.args.args.push(ArgumentRef::PlaintextI16(
            self.args.plaintext_numbers.len() as u8
        ));
        self.args.plaintext_numbers.push(value as u64);
        self
    }

    pub fn plaintext_i32(mut self, value: i32) -> Self {
        self.args.args.push(ArgumentRef::PlaintextI32(
            self.args.plaintext_numbers.len() as u8
        ));
        self.args.plaintext_numbers.push(value as u64);
        self
    }

    pub fn plaintext_i64(mut self, value: i64) -> Self {
        self.args.args.push(ArgumentRef::PlaintextI64(
            self.args.plaintext_numbers.len() as u8
        ));
        self.args.plaintext_numbers.push(value as u64);
        self
    }

    pub fn plaintext_float(mut self, value: f64) -> Self {
        self.args.args.push(ArgumentRef::PlaintextFloat(
            self.args.plaintext_numbers.len() as u8,
        ));
        self.args.plaintext_numbers.push(value as u64);
        self
    }

    pub fn plaintext_i128(mut self, value: i128) -> Self {
        self.args.args.push(ArgumentRef::PlaintextI128(
            self.args.values_128_bit.len() as u8
        ));
        self.args.values_128_bit.push(value as u128);
        self
    }

    pub fn plaintext_u128(mut self, value: u128) -> Self {
        self.args.args.push(ArgumentRef::PlaintextU128(
            self.args.values_128_bit.len() as u8
        ));
        self.args.values_128_bit.push(value);
        self
    }

    pub fn encrypted_bool(mut self, value: [u8; 32]) -> Self {
        self.args
            .args
            .push(ArgumentRef::EncryptedBool(self.args.byte_arrays.len() as u8));
        self.args.byte_arrays.push(value);
        self
    }
    pub fn encrypted_u8(mut self, value: [u8; 32]) -> Self {
        self.args
            .args
            .push(ArgumentRef::EncryptedU8(self.args.byte_arrays.len() as u8));
        self.args.byte_arrays.push(value);
        self
    }
    pub fn encrypted_u16(mut self, value: [u8; 32]) -> Self {
        self.args
            .args
            .push(ArgumentRef::EncryptedU16(self.args.byte_arrays.len() as u8));
        self.args.byte_arrays.push(value);
        self
    }
    pub fn encrypted_u32(mut self, value: [u8; 32]) -> Self {
        self.args
            .args
            .push(ArgumentRef::EncryptedU32(self.args.byte_arrays.len() as u8));
        self.args.byte_arrays.push(value);
        self
    }
    pub fn encrypted_u64(mut self, value: [u8; 32]) -> Self {
        self.args
            .args
            .push(ArgumentRef::EncryptedU64(self.args.byte_arrays.len() as u8));
        self.args.byte_arrays.push(value);
        self
    }
    pub fn encrypted_u128(mut self, value: [u8; 32]) -> Self {
        self.args
            .args
            .push(ArgumentRef::EncryptedU128(self.args.byte_arrays.len() as u8));
        self.args.byte_arrays.push(value);
        self
    }
    pub fn encrypted_float(mut self, value: [u8; 32]) -> Self {
        self.args.args.push(ArgumentRef::EncryptedFloat(
            self.args.byte_arrays.len() as u8
        ));
        self.args.byte_arrays.push(value);
        self
    }

    pub fn encrypted_i8(mut self, value: [u8; 32]) -> Self {
        self.args
            .args
            .push(ArgumentRef::EncryptedI8(self.args.byte_arrays.len() as u8));
        self.args.byte_arrays.push(value);
        self
    }
    pub fn encrypted_i16(mut self, value: [u8; 32]) -> Self {
        self.args
            .args
            .push(ArgumentRef::EncryptedI16(self.args.byte_arrays.len() as u8));
        self.args.byte_arrays.push(value);
        self
    }
    pub fn encrypted_i32(mut self, value: [u8; 32]) -> Self {
        self.args
            .args
            .push(ArgumentRef::EncryptedI32(self.args.byte_arrays.len() as u8));
        self.args.byte_arrays.push(value);
        self
    }
    pub fn encrypted_i64(mut self, value: [u8; 32]) -> Self {
        self.args
            .args
            .push(ArgumentRef::EncryptedI64(self.args.byte_arrays.len() as u8));
        self.args.byte_arrays.push(value);
        self
    }

    pub fn encrypted_i128(mut self, value: [u8; 32]) -> Self {
        self.args
            .args
            .push(ArgumentRef::EncryptedI128(self.args.byte_arrays.len() as u8));
        self.args.byte_arrays.push(value);
        self
    }

    pub fn plaintext_point(mut self, value: [u8; 32]) -> Self {
        self.args.args.push(ArgumentRef::PlaintextPoint(
            self.args.byte_arrays.len() as u8
        ));
        self.args.byte_arrays.push(value);
        self
    }

    pub fn x25519_pubkey(mut self, value: [u8; 32]) -> Self {
        self.args
            .args
            .push(ArgumentRef::X25519Pubkey(self.args.byte_arrays.len() as u8));
        self.args.byte_arrays.push(value);
        self
    }

    pub fn arcis_ed25519_signature(mut self, value: [u8; 64]) -> Self {
        self.args.args.push(ArgumentRef::ArcisEd25519Signature(
            self.args.byte_arrays.len() as u8,
        ));
        let mut lower_bytes = [0u8; 32];
        let mut upper_bytes = [0u8; 32];
        lower_bytes.copy_from_slice(&value[0..32]);
        upper_bytes.copy_from_slice(&value[32..64]);

        self.args.byte_arrays.push(lower_bytes);
        self.args.byte_arrays.push(upper_bytes);
        self
    }

    pub fn account(mut self, pubkey: Pubkey, offset: u32, length: u32) -> Self {
        self.args
            .args
            .push(ArgumentRef::Account(self.args.accounts.len() as u8));
        self.args.accounts.push(AccountArgument {
            pubkey,
            offset,
            length,
        });
        self
    }

    pub fn build(self) -> ArgumentList {
        self.args
    }
}