use solana_pubkey::Pubkey;
use crate::pda::SETTLEMENT_SEED;
mod known_mints;
pub use known_mints::KNOWN_MINTS;
pub const BUFFER_SEED: &[u8] = b"buffer";
pub const fn buffer_pda_seeds(mint: &[u8; 32]) -> [&[u8]; 3] {
[SETTLEMENT_SEED, mint, BUFFER_SEED]
}
pub fn buffer_pda_signer_seeds<'a>(mint: &'a [u8; 32], bump: &'a [u8; 1]) -> [&'a [u8]; 4] {
let [s0, s1, s2] = buffer_pda_seeds(mint);
[s0, s1, s2, bump]
}
pub fn find_buffer_pda(program_id: &Pubkey, mint: &Pubkey) -> (Pubkey, u8) {
Pubkey::find_program_address(&buffer_pda_seeds(mint.as_array()), program_id)
}
pub const NATIVE_SOL_BUFFER_SEED: &[u8] = b"buffer native sol";
pub const NATIVE_SOL_BUFFER_PDA_SEEDS: [&[u8]; 2] = [SETTLEMENT_SEED, NATIVE_SOL_BUFFER_SEED];
pub fn find_native_sol_buffer_pda(program_id: &Pubkey) -> (Pubkey, u8) {
Pubkey::find_program_address(&NATIVE_SOL_BUFFER_PDA_SEEDS, program_id)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::fixtures::pubkey_from_seed;
use crate::pda::tests::assert_distinct_versions_yield_distinct_pdas;
#[test]
fn find_buffer_pda_uses_canonical_seeds() {
let token = Pubkey::new_unique();
crate::pda::tests::assert_canonical_bump(
|program_id| find_buffer_pda(program_id, &token),
buffer_pda_seeds(token.as_array()),
);
}
#[test]
fn distinct_versions_yield_distinct_buffer_pdas() {
let program_id = pubkey_from_seed("program id");
let mint = Pubkey::new_unique();
let (pda, _) = find_buffer_pda(&program_id, &mint);
assert_distinct_versions_yield_distinct_pdas(
&program_id,
&pda,
&[mint.as_array(), BUFFER_SEED],
);
}
#[test]
fn find_native_sol_buffer_pda_uses_canonical_seeds() {
crate::pda::tests::assert_canonical_bump(
find_native_sol_buffer_pda,
NATIVE_SOL_BUFFER_PDA_SEEDS,
);
}
#[test]
fn distinct_versions_yield_distinct_native_sol_buffer_pdas() {
let program_id = pubkey_from_seed("program id");
let (pda, _) = find_native_sol_buffer_pda(&program_id);
assert_distinct_versions_yield_distinct_pdas(&program_id, &pda, &[NATIVE_SOL_BUFFER_SEED]);
}
mod proptest {
use ::proptest::prelude::*;
use super::*;
proptest! {
#[test]
fn distinct_tokens_yield_distinct_pdas(
program_id in any::<[u8; 32]>(),
token1 in any::<[u8; 32]>(),
token2 in any::<[u8; 32]>(),
) {
prop_assume!(token1 != token2);
let program_id = Pubkey::new_from_array(program_id);
let (pda1, _) = find_buffer_pda(&program_id, &Pubkey::new_from_array(token1));
let (pda2, _) = find_buffer_pda(&program_id, &Pubkey::new_from_array(token2));
prop_assert_ne!(pda1, pda2);
}
}
}
}