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
}
}