1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
use anchor_lang::prelude::*;
use arrayref::array_ref;
use solana_program::{
account_info::AccountInfo,
program::invoke,
program_memory::sol_memcmp,
program_pack::{IsInitialized, Pack},
pubkey::{Pubkey, PUBKEY_BYTES},
system_instruction,
};
use crate::{
constants::{NULL_STRING, REPLACEMENT_INDEX, REPLACEMENT_INDEX_INCREMENT, HIDDEN_SECTION},
CandyError,
};
pub fn assert_initialized<T: Pack + IsInitialized>(account_info: &AccountInfo) -> Result<T> {
let account: T = T::unpack_unchecked(&account_info.data.borrow())?;
if !account.is_initialized() {
Err(CandyError::Uninitialized.into())
} else {
Ok(account)
}
}
pub fn get_config_count(data: &[u8]) -> Result<usize> {
Ok(u32::from_le_bytes(*array_ref![data, HIDDEN_SECTION, 4]) as usize)
}
pub fn cmp_pubkeys(a: &Pubkey, b: &Pubkey) -> bool {
sol_memcmp(a.as_ref(), b.as_ref(), PUBKEY_BYTES) == 0
}
pub fn fixed_length_string(value: String, length: usize) -> Result<String> {
if length < value.len() {
return err!(CandyError::ExceededLengthError);
}
let padding = NULL_STRING.repeat(length - value.len());
Ok(value + &padding)
}
pub fn punish_bots<'a>(
error: CandyError,
bot_account: AccountInfo<'a>,
payment_account: AccountInfo<'a>,
system_program: AccountInfo<'a>,
fee: u64,
) -> Result<()> {
msg!(
"{}, Candy Machine Botting is taxed at {:?} lamports",
error.to_string(),
fee
);
let final_fee = fee.min(bot_account.lamports());
invoke(
&system_instruction::transfer(bot_account.key, payment_account.key, final_fee),
&[bot_account, payment_account, system_program],
)?;
Ok(())
}
pub fn replace_patterns(value: String, index: usize) -> String {
let mut mutable = value;
if mutable.contains(REPLACEMENT_INDEX_INCREMENT) {
mutable = mutable.replace(REPLACEMENT_INDEX_INCREMENT, &(index + 1).to_string());
}
if mutable.contains(REPLACEMENT_INDEX) {
mutable = mutable.replace(REPLACEMENT_INDEX, &index.to_string());
}
mutable
}
#[cfg(test)]
pub mod tests {
use super::*;
#[test]
fn check_keys_equal() {
let key1 = Pubkey::new_unique();
assert!(cmp_pubkeys(&key1, &key1));
}
#[test]
fn check_keys_not_equal() {
let key1 = Pubkey::new_unique();
let key2 = Pubkey::new_unique();
assert!(!cmp_pubkeys(&key1, &key2));
}
}