Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
197 changes: 127 additions & 70 deletions controller/core/src/keys.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,6 @@ pub struct ConstAccs<T> {
pub tokenkeg: T,
pub token_2022: T,
pub instructions_sysvar: T,

// whitelisted SOL value calculator programs
pub sanctum_spl_svc: T,
pub sanctum_spl_multi_svc: T,
pub spl_svc: T,
pub lido_svc: T,
pub marinade_svc: T,
pub wsol_svc: T,
}

macro_rules! id_str {
Expand Down Expand Up @@ -57,21 +49,21 @@ pub const PROGRAM_ID_STR: &str = if cfg!(feature = "reserve-v2") {
INF_PROGRAM_ID_STR
};

const DEFAULT_PP_ID_STR: &str = if cfg!(feature = "reserve-v2") {
"uppoVuoFZuXisHkrxCU96VvNibU6vzxkEpeH3WbmnEn"
} else {
"s1b6NRXj6ygNu1QMKXh2H9LUR2aPApAAm1UQ2DjdhNV"
};

pub const CONST_KEY_STRS: ConstAccs<&'static str> = ConstAccs::const_from_destr(ConstAccsDestr {
program: PROGRAM_ID_STR,
default_pp: DEFAULT_PP_ID_STR,
init_admin: "GRwm4EXMyVwtftQeTft7DZT3HBRxx439PrKq4oM6BwoZ",
default_pp: "s1b6NRXj6ygNu1QMKXh2H9LUR2aPApAAm1UQ2DjdhNV",
sys_prog: "11111111111111111111111111111111",
atoken: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",
tokenkeg: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
token_2022: "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",
instructions_sysvar: "Sysvar1nstructions1111111111111111111111111",
sanctum_spl_svc: "sspUE1vrh7xRoXxGsg7vR1zde2WdGtJRbyK9uRumBDy",
sanctum_spl_multi_svc: "ssmbu3KZxgonUtjEMCKspZzxvUQCxAFnyh1rcHUeEDo",
spl_svc: "sp1V4h2gWorkGhVcazBc22Hfo2f5sd7jcjT4EDPrWFF",
lido_svc: "1idUSy4MGGKyKhvjSnGZ6Zc7Q4eKQcibym4BkEEw9KR",
marinade_svc: "mare3SCyfZkAndpBRBeonETmkCCB3TJTTrz8ZN2dnhP",
wsol_svc: "wsoGmxQLSvwWpuaidCApxN5kEowLe2HLQLJhCQnj4bE",
});

pub const CONST_KEYS_OWNED: ConstAccs<[u8; 32]> = ConstAccs(const_map!(
Expand Down Expand Up @@ -108,35 +100,35 @@ pub const INSTRUCTIONS_SYSVAR_ID_STR: &str = CONST_KEY_STRS.instructions_sysvar(
#[deprecated = "Use `*CONST_KEYS_OWNED.instructions_sysvar()` instead"]
pub const INSTRUCTIONS_SYSVAR_ID: [u8; 32] = *CONST_KEYS_OWNED.instructions_sysvar();

#[deprecated = "Use `CONST_KEY_STRS.sanctum_spl_svc()` instead"]
pub const SANCTUM_SPL_SVC_ID_STR: &str = CONST_KEY_STRS.sanctum_spl_svc();
#[deprecated = "Use `*CONST_KEYS_OWNED.sanctum_spl_svc()` instead"]
pub const SANCTUM_SPL_SVC_ID: [u8; 32] = *CONST_KEYS_OWNED.sanctum_spl_svc();
#[deprecated = "Use `WHITELISTED_SVC_PROGS_STR.sanctum_spl_svc()` instead"]
pub const SANCTUM_SPL_SVC_ID_STR: &str = WHITELISTED_SVC_PROGS_STR.sanctum_spl_svc();
#[deprecated = "Use `*WHITELISTED_SVC_PROGS.sanctum_spl_svc()` instead"]
pub const SANCTUM_SPL_SVC_ID: [u8; 32] = *WHITELISTED_SVC_PROGS.sanctum_spl_svc();

#[deprecated = "Use `CONST_KEY_STRS.sanctum_spl_multi_svc()` instead"]
pub const SANCTUM_SPL_MULTI_SVC_ID_STR: &str = CONST_KEY_STRS.sanctum_spl_multi_svc();
#[deprecated = "Use `*CONST_KEYS_OWNED.sanctum_spl_multi_svc()` instead"]
pub const SANCTUM_SPL_MULTI_SVC_ID: [u8; 32] = *CONST_KEYS_OWNED.sanctum_spl_multi_svc();
#[deprecated = "Use `WHITELISTED_SVC_PROGS_STR.sanctum_spl_multi_svc()` instead"]
pub const SANCTUM_SPL_MULTI_SVC_ID_STR: &str = WHITELISTED_SVC_PROGS_STR.sanctum_spl_multi_svc();
#[deprecated = "Use `*WHITELISTED_SVC_PROGS.sanctum_spl_multi_svc()` instead"]
pub const SANCTUM_SPL_MULTI_SVC_ID: [u8; 32] = *WHITELISTED_SVC_PROGS.sanctum_spl_multi_svc();

#[deprecated = "Use `CONST_KEY_STRS.spl_svc()` instead"]
pub const SPL_SVC_ID_STR: &str = CONST_KEY_STRS.spl_svc();
#[deprecated = "Use `*CONST_KEYS_OWNED.spl_svc()` instead"]
pub const SPL_SVC_ID: [u8; 32] = *CONST_KEYS_OWNED.spl_svc();
#[deprecated = "Use `WHITELISTED_SVC_PROGS_STR.spl_svc()` instead"]
pub const SPL_SVC_ID_STR: &str = WHITELISTED_SVC_PROGS_STR.spl_svc();
#[deprecated = "Use `*WHITELISTED_SVC_PROGS.spl_svc()` instead"]
pub const SPL_SVC_ID: [u8; 32] = *WHITELISTED_SVC_PROGS.spl_svc();

#[deprecated = "Use `CONST_KEY_STRS.lido_svc()` instead"]
pub const LIDO_SVC_ID_STR: &str = CONST_KEY_STRS.lido_svc();
#[deprecated = "Use `*CONST_KEYS_OWNED.lido_svc()` instead"]
pub const LIDO_SVC_ID: [u8; 32] = *CONST_KEYS_OWNED.lido_svc();
#[deprecated = "Use `WHITELISTED_SVC_PROGS_STR.lido_svc()` instead"]
pub const LIDO_SVC_ID_STR: &str = WHITELISTED_SVC_PROGS_STR.lido_svc();
#[deprecated = "Use `*WHITELISTED_SVC_PROGS.lido_svc()` instead"]
pub const LIDO_SVC_ID: [u8; 32] = *WHITELISTED_SVC_PROGS.lido_svc();

#[deprecated = "Use `CONST_KEY_STRS.marinade_svc()` instead"]
pub const MARINADE_SVC_ID_STR: &str = CONST_KEY_STRS.marinade_svc();
#[deprecated = "Use `*CONST_KEYS_OWNED.marinade_svc()` instead"]
pub const MARINADE_SVC_ID: [u8; 32] = *CONST_KEYS_OWNED.marinade_svc();
#[deprecated = "Use `WHITELISTED_SVC_PROGS_STR.marinade_svc()` instead"]
pub const MARINADE_SVC_ID_STR: &str = WHITELISTED_SVC_PROGS_STR.marinade_svc();
#[deprecated = "Use `*WHITELISTED_SVC_PROGS.marinade_svc()` instead"]
pub const MARINADE_SVC_ID: [u8; 32] = *WHITELISTED_SVC_PROGS.marinade_svc();

#[deprecated = "Use `CONST_KEY_STRS.wsol_svc()` instead"]
pub const WSOL_SVC_ID_STR: &str = CONST_KEY_STRS.wsol_svc();
#[deprecated = "Use `*CONST_KEYS_OWNED.wsol_svc()` instead"]
pub const WSOL_SVC_ID: [u8; 32] = *CONST_KEYS_OWNED.wsol_svc();
#[deprecated = "Use `WHITELISTED_SVC_PROGS_STR.wsol_svc()` instead"]
pub const WSOL_SVC_ID_STR: &str = WHITELISTED_SVC_PROGS_STR.wsol_svc();
#[deprecated = "Use `*WHITELISTED_SVC_PROGS.wsol_svc()` instead"]
pub const WSOL_SVC_ID: [u8; 32] = *WHITELISTED_SVC_PROGS.wsol_svc();

#[deprecated = "Use `CONST_PDA_KEYS_OWNED.pool_state()` instead"]
pub const POOL_STATE_ID: [u8; 32] = *CONST_PDA_KEYS_OWNED.pool_state();
Expand Down Expand Up @@ -175,29 +167,80 @@ pub const DISABLE_POOL_AUTHORITY_LIST_ID_STR: &str =
#[deprecated = "Use `CONST_PDA_BUMPS.disable_pool_authority_list()` instead"]
pub const DISABLE_POOL_AUTHORITY_LIST_BUMP: u8 = *CONST_PDA_BUMPS.disable_pool_authority_list();

// Hardcoded whitelisted sol value calculator program IDs.
// Duplicated with consts in the other svc crates,
// but declaring them separately here to avoid adding another dependency

pub const WHITELISTED_SVC_PROGS: [[u8; 32]; 6] = {
let ConstAccsDestr {
sanctum_spl_svc,
sanctum_spl_multi_svc,
spl_svc,
lido_svc,
marinade_svc,
wsol_svc,
..
} = CONST_KEYS_OWNED.const_into_destr();
[
sanctum_spl_svc,
sanctum_spl_multi_svc,
spl_svc,
lido_svc,
marinade_svc,
wsol_svc,
]
};
// but declaring them separately here to avoid adding another dependency.
// Declared as consts for reuse across reserve-v2 feature

const SANCTUM_SPL_SVC: &str = "sspUE1vrh7xRoXxGsg7vR1zde2WdGtJRbyK9uRumBDy";
const SANCTUM_SPL_MULTI_SVC: &str = "ssmbu3KZxgonUtjEMCKspZzxvUQCxAFnyh1rcHUeEDo";
const SPL_SVC: &str = "sp1V4h2gWorkGhVcazBc22Hfo2f5sd7jcjT4EDPrWFF";
const LIDO_SVC: &str = "1idUSy4MGGKyKhvjSnGZ6Zc7Q4eKQcibym4BkEEw9KR";
const MARINADE_SVC: &str = "mare3SCyfZkAndpBRBeonETmkCCB3TJTTrz8ZN2dnhP";
const WSOL_SVC: &str = "wsoGmxQLSvwWpuaidCApxN5kEowLe2HLQLJhCQnj4bE";

#[cfg(not(feature = "reserve-v2"))]
mod svc_whitelist {
use super::*;

/// Hardcoded whitelisted SOL value calculator program IDs
#[generic_array_struct(all pub)]
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)]
pub struct SvcWhitelist<T> {
pub sanctum_spl_svc: T,
pub sanctum_spl_multi_svc: T,
pub spl_svc: T,
pub lido_svc: T,
pub marinade_svc: T,
pub wsol_svc: T,
}

pub const WHITELISTED_SVC_PROGS_STR: SvcWhitelist<&'static str> =
SvcWhitelist::const_from_destr(SvcWhitelistDestr {
sanctum_spl_svc: SANCTUM_SPL_SVC,
sanctum_spl_multi_svc: SANCTUM_SPL_MULTI_SVC,
spl_svc: SPL_SVC,
lido_svc: LIDO_SVC,
marinade_svc: MARINADE_SVC,
wsol_svc: WSOL_SVC,
});
}

#[cfg(feature = "reserve-v2")]
mod svc_whitelist {
use super::*;

/// Hardcoded whitelisted SOL value calculator program IDs
#[generic_array_struct(all pub)]
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)]
pub struct SvcWhitelist<T> {
pub sanctum_spl_svc: T,
pub sanctum_spl_multi_svc: T,
pub spl_svc: T,
pub lido_svc: T,
pub marinade_svc: T,
pub wsol_svc: T,
pub inf_svc: T,
}

pub const WHITELISTED_SVC_PROGS_STR: SvcWhitelist<&'static str> =
SvcWhitelist::const_from_destr(SvcWhitelistDestr {
sanctum_spl_svc: SANCTUM_SPL_SVC,
sanctum_spl_multi_svc: SANCTUM_SPL_MULTI_SVC,
spl_svc: SPL_SVC,
lido_svc: LIDO_SVC,
marinade_svc: MARINADE_SVC,
wsol_svc: WSOL_SVC,
inf_svc: "1nf7dspGYz1CTALJbtNgjvcSYWiFz5N3c2EuUZLSWCL",
});
}

pub use svc_whitelist::*;

pub const WHITELISTED_SVC_PROGS: SvcWhitelist<[u8; 32]> = SvcWhitelist(const_map!(
[0; 32],
WHITELISTED_SVC_PROGS_STR.0,
const_crypto::bs58::decode_pubkey
));

#[cfg(test)]
mod tests {
Expand All @@ -209,17 +252,31 @@ mod tests {
#[test]
fn whitelisted_svcs_snapshot() {
let all: String = WHITELISTED_SVC_PROGS
.0
.iter()
.flat_map(|pk| [Pubkey::new_from_array(*pk).to_string(), ",\n".to_owned()])
.collect();
expect![[r#"
sspUE1vrh7xRoXxGsg7vR1zde2WdGtJRbyK9uRumBDy,
ssmbu3KZxgonUtjEMCKspZzxvUQCxAFnyh1rcHUeEDo,
sp1V4h2gWorkGhVcazBc22Hfo2f5sd7jcjT4EDPrWFF,
1idUSy4MGGKyKhvjSnGZ6Zc7Q4eKQcibym4BkEEw9KR,
mare3SCyfZkAndpBRBeonETmkCCB3TJTTrz8ZN2dnhP,
wsoGmxQLSvwWpuaidCApxN5kEowLe2HLQLJhCQnj4bE,
"#]]
.assert_eq(&all);
let exp = if cfg!(feature = "reserve-v2") {
expect![[r#"
sspUE1vrh7xRoXxGsg7vR1zde2WdGtJRbyK9uRumBDy,
ssmbu3KZxgonUtjEMCKspZzxvUQCxAFnyh1rcHUeEDo,
sp1V4h2gWorkGhVcazBc22Hfo2f5sd7jcjT4EDPrWFF,
1idUSy4MGGKyKhvjSnGZ6Zc7Q4eKQcibym4BkEEw9KR,
mare3SCyfZkAndpBRBeonETmkCCB3TJTTrz8ZN2dnhP,
wsoGmxQLSvwWpuaidCApxN5kEowLe2HLQLJhCQnj4bE,
1nf7dspGYz1CTALJbtNgjvcSYWiFz5N3c2EuUZLSWCL,
"#]]
} else {
expect![[r#"
sspUE1vrh7xRoXxGsg7vR1zde2WdGtJRbyK9uRumBDy,
ssmbu3KZxgonUtjEMCKspZzxvUQCxAFnyh1rcHUeEDo,
sp1V4h2gWorkGhVcazBc22Hfo2f5sd7jcjT4EDPrWFF,
1idUSy4MGGKyKhvjSnGZ6Zc7Q4eKQcibym4BkEEw9KR,
mare3SCyfZkAndpBRBeonETmkCCB3TJTTrz8ZN2dnhP,
wsoGmxQLSvwWpuaidCApxN5kEowLe2HLQLJhCQnj4bE,
"#]]
};

exp.assert_eq(&all);
}
}
2 changes: 2 additions & 0 deletions controller/jiminy/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ pub mod account_utils;
pub mod cpi;
pub mod pda_onchain;
pub mod program_err;

mod log_buf;
39 changes: 39 additions & 0 deletions controller/jiminy/src/log_buf.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
use core::fmt;

/// Fixed-capacity, stack-only [`fmt::Write`] sink. Never allocates.
///
/// On overflow the message is silently truncated at a UTF-8 char boundary.
pub struct LogBuf<const N: usize> {
buf: [u8; N],
len: usize,
}

#[allow(clippy::new_without_default)]
impl<const N: usize> LogBuf<N> {
pub const fn new() -> Self {
Self {
buf: [0; N],
len: 0,
}
}

pub fn as_str(&self) -> &str {
// SAFETY: `write_str` only ever copies whole `&str` contents and snaps
// truncation to a char boundary, so the buffer is always valid UTF-8.
unsafe { core::str::from_utf8_unchecked(&self.buf[..self.len]) }
}
}

impl<const N: usize> fmt::Write for LogBuf<N> {
#[inline]
fn write_str(&mut self, s: &str) -> fmt::Result {
let space = N - self.len;
let mut n = s.len().min(space);
while !s.is_char_boundary(n) {
n -= 1;
}
self.buf[self.len..self.len + n].copy_from_slice(&s.as_bytes()[..n]);
self.len += n;
Ok(())
}
}
Loading
Loading