cow_settlement_interface/pda/
buffer.rs1use solana_pubkey::Pubkey;
28
29use crate::pda::SETTLEMENT_SEED;
30
31mod known_mints;
32pub use known_mints::KNOWN_MINTS;
33
34pub const BUFFER_SEED: &[u8] = b"buffer";
36
37pub const fn buffer_pda_seeds(mint: &[u8; 32]) -> [&[u8]; 3] {
44 [SETTLEMENT_SEED, mint, BUFFER_SEED]
45}
46
47pub fn buffer_pda_signer_seeds<'a>(mint: &'a [u8; 32], bump: &'a [u8; 1]) -> [&'a [u8]; 4] {
49 let [s0, s1, s2] = buffer_pda_seeds(mint);
50 [s0, s1, s2, bump]
51}
52
53pub fn find_buffer_pda(program_id: &Pubkey, mint: &Pubkey) -> (Pubkey, u8) {
55 Pubkey::find_program_address(&buffer_pda_seeds(mint.as_array()), program_id)
56}
57
58pub const NATIVE_SOL_BUFFER_SEED: &[u8] = b"buffer native sol";
60
61pub const NATIVE_SOL_BUFFER_PDA_SEEDS: [&[u8]; 2] = [SETTLEMENT_SEED, NATIVE_SOL_BUFFER_SEED];
63
64pub fn find_native_sol_buffer_pda(program_id: &Pubkey) -> (Pubkey, u8) {
66 Pubkey::find_program_address(&NATIVE_SOL_BUFFER_PDA_SEEDS, program_id)
67}
68
69#[cfg(test)]
70mod tests {
71 use super::*;
72 use crate::fixtures::pubkey_from_seed;
73 use crate::pda::tests::assert_distinct_versions_yield_distinct_pdas;
74
75 #[test]
76 fn find_buffer_pda_uses_canonical_seeds() {
77 let token = Pubkey::new_unique();
78
79 crate::pda::tests::assert_canonical_bump(
80 |program_id| find_buffer_pda(program_id, &token),
81 buffer_pda_seeds(token.as_array()),
82 );
83 }
84
85 #[test]
86 fn distinct_versions_yield_distinct_buffer_pdas() {
87 let program_id = pubkey_from_seed("program id");
88 let mint = Pubkey::new_unique();
89 let (pda, _) = find_buffer_pda(&program_id, &mint);
90
91 assert_distinct_versions_yield_distinct_pdas(
92 &program_id,
93 &pda,
94 &[mint.as_array(), BUFFER_SEED],
95 );
96 }
97
98 #[test]
99 fn find_native_sol_buffer_pda_uses_canonical_seeds() {
100 crate::pda::tests::assert_canonical_bump(
101 find_native_sol_buffer_pda,
102 NATIVE_SOL_BUFFER_PDA_SEEDS,
103 );
104 }
105
106 #[test]
107 fn distinct_versions_yield_distinct_native_sol_buffer_pdas() {
108 let program_id = pubkey_from_seed("program id");
109 let (pda, _) = find_native_sol_buffer_pda(&program_id);
110 assert_distinct_versions_yield_distinct_pdas(&program_id, &pda, &[NATIVE_SOL_BUFFER_SEED]);
111 }
112
113 mod proptest {
114 use ::proptest::prelude::*;
115
116 use super::*;
117
118 proptest! {
119 #[test]
120 fn distinct_tokens_yield_distinct_pdas(
121 program_id in any::<[u8; 32]>(),
122 token1 in any::<[u8; 32]>(),
123 token2 in any::<[u8; 32]>(),
124 ) {
125 prop_assume!(token1 != token2);
126 let program_id = Pubkey::new_from_array(program_id);
127 let (pda1, _) = find_buffer_pda(&program_id, &Pubkey::new_from_array(token1));
128 let (pda2, _) = find_buffer_pda(&program_id, &Pubkey::new_from_array(token2));
129 prop_assert_ne!(pda1, pda2);
130 }
131 }
132 }
133}