use solana_hash::Hash;
use solana_pubkey::Pubkey;
use crate::pda::SETTLEMENT_SEED;
pub const ORDER_SEED: &[u8] = b"order";
pub fn order_pda_seeds(uid: &Hash) -> [&[u8]; 3] {
[SETTLEMENT_SEED, uid.as_ref(), ORDER_SEED]
}
pub fn order_pda_signer_seeds<'a>(uid: &'a Hash, bump: &'a [u8; 1]) -> [&'a [u8]; 4] {
let [s0, s1, s2] = order_pda_seeds(uid);
[s0, s1, s2, bump]
}
pub fn find_order_pda(program_id: &Pubkey, uid: &Hash) -> (Pubkey, u8) {
Pubkey::find_program_address(&order_pda_seeds(uid), 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_order_pda_uses_canonical_seeds() {
let uid = Hash::new_from_array(*Pubkey::new_unique().as_array());
crate::pda::tests::assert_canonical_bump(
|program_id| find_order_pda(program_id, &uid),
order_pda_seeds(&uid),
);
}
#[test]
fn distinct_versions_yield_distinct_order_pdas() {
let uid = Hash::new_from_array(*Pubkey::new_unique().as_array());
let program_id = pubkey_from_seed("program id");
let (pda, _) = find_order_pda(&program_id, &uid);
assert_distinct_versions_yield_distinct_pdas(
&program_id,
&pda,
&[uid.as_ref(), ORDER_SEED],
);
}
mod proptest {
use ::proptest::prelude::*;
use super::*;
proptest! {
#[test]
fn distinct_uids_yield_distinct_pdas(
program_id in any::<[u8; 32]>(),
uid1 in any::<[u8; 32]>(),
uid2 in any::<[u8; 32]>(),
) {
prop_assume!(uid1 != uid2);
let program_id = Pubkey::new_from_array(program_id);
let (pda1, _) = find_order_pda(&program_id, &Hash::new_from_array(uid1));
let (pda2, _) = find_order_pda(&program_id, &Hash::new_from_array(uid2));
prop_assert_ne!(pda1, pda2);
}
}
}
}