use anchor_lang::prelude::*;
use anchor_lang::solana_program;
use static_pubkey::static_pubkey;
use tulipv2_sdk_farms::{lending::Lending, Farm};
use crate::config::deposit_tracking::issue_shares::DepositAddresses;
use crate::config::deposit_tracking::register::RegisterDepositTrackingAddresses;
use crate::config::deposit_tracking::traits::{
IssueShares, RegisterDepositTracking, WithdrawDepositTracking,
};
use crate::config::deposit_tracking::withdraw::WithdrawDepositTrackingAddresses;
use crate::config::lending::traits::WithdrawMultiOptimizerVault;
use crate::config::lending::withdraw::WithdrawAddresses;
use crate::config::lending::Platform;
use crate::config::lending::withdraw::PlatformConfigAddresses;
pub mod multi_deposit {
use super::*;
pub struct ProgramConfig;
pub const TAG_STRING: &str = "rayv1";
pub const FARM_KEY: Farm = Farm::Lending {
name: Lending::MULTI_DEPOSIT,
};
pub const ACCOUNT: Pubkey = static_pubkey!("EH1iQnhDqQpHsVJWLw8oC1ehDqVaPGh7JH6ctG4dAQ2d");
pub const PDA: Pubkey = static_pubkey!("2fuStNc5WdN2fyqU4At35mbzFeuuhAz5XUs3k5DEJ4L9");
pub const SHARES_MINT: Pubkey = static_pubkey!("6JKtKEFiyp67VPN61nTCyUpY1cLrAZ7qpXiBsKqWZqWh");
pub const UNDERLYING_COMPOUND_QUEUE: Pubkey =
static_pubkey!("5GdPPY5avs9VdYJPgCE7GuYdAbmUnsdkxHZ9UYATtmx2");
pub const UNDERLYING_DEPOSIT_QUEUE: Pubkey =
static_pubkey!("CZMaihH88aKCkYEtUJXYxKCPizmxifc5wtFTgH4eWjcR");
pub const UNDERLYING_WITHDRAW_QUEUE: Pubkey =
static_pubkey!("BYySDEiFHyqWohWuvLiDQyZnex39vREtdRckn9MkqY35");
pub const UNDERLYING_MINT: Pubkey =
static_pubkey!("4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R");
pub const REBALANCE_STATE_TRANSITION: Pubkey =
static_pubkey!("3r7Ft3TawHenBiiTMCDpsRpaQmaTk26Hd67iCBycS6Bv");
pub const REBALANCE_STATE_TRANSITION_UNDERLYING: Pubkey =
static_pubkey!("6zFk7gwbEysqeoedRadpVm9dMUX3vjuam5YBaK1guF3V");
pub const SOLEND_OPTIMIZER_SHARES_ACCOUNT: Pubkey =
static_pubkey!("3o1T6wQ33RChKuhvnPpd1MdnNfvXK64Hv3w7Y1RDEgWd");
pub const TULIP_OPTIMIZER_SHARES_ACCOUNT: Pubkey =
static_pubkey!("EU7UfDMra9S1E6XAkWnNCdfNdE9L8Cngn3Db6uwidDNT");
pub const MANGO_OPTIMIZER_SHARES_ACCOUNT: Pubkey =
static_pubkey!("Cq8zdnesy1soVFVYiyuMH7rRYvzb4K42YHMRcDvN8Pv7");
impl ProgramConfig {
pub fn issue_shares_ix(user: Pubkey) -> impl IssueShares {
DepositAddresses::new(user, ACCOUNT, PDA, SHARES_MINT, UNDERLYING_MINT)
}
pub fn register_deposit_tracking_ix(user: Pubkey) -> impl RegisterDepositTracking {
RegisterDepositTrackingAddresses::new(user, ACCOUNT, SHARES_MINT, UNDERLYING_MINT)
}
pub fn withdraw_deposit_tracking(user: Pubkey) -> impl WithdrawDepositTracking {
WithdrawDepositTrackingAddresses::new(user, ACCOUNT, SHARES_MINT)
}
pub fn withdraw_multi_deposit_optimizer_vault(
user: Pubkey,
platform: Platform,
) -> std::result::Result<impl WithdrawMultiOptimizerVault, std::io::Error> {
let (standalone_config, platform_config) = if platform.eq(&Platform::MangoV3) {
(
(
ProgramConfig::get_mango_remaining_accounts().to_vec(),
platform,
),
super::mango::platform_config(),
)
} else if platform.eq(&Platform::Solend) {
(
(
ProgramConfig::get_solend_remaining_accounts().to_vec(),
platform,
),
super::solend::platform_config(),
)
} else {
(
(
ProgramConfig::get_tulip_remaining_accounts().to_vec(),
platform,
),
super::tulip::platform_config(),
)
};
WithdrawAddresses::new(
user,
ACCOUNT,
PDA,
SHARES_MINT,
UNDERLYING_MINT,
UNDERLYING_WITHDRAW_QUEUE,
platform_config,
(&standalone_config.0, standalone_config.1),
)
}
pub fn get_tulip_remaining_accounts() -> [Pubkey; 7] {
[
super::tulip::COLLATERAL_TOKEN_ACCOUNT,
super::tulip::RESERVE_ACCOUNT,
super::tulip::RESERVE_LIQUIDITY_ACCOUNT,
super::tulip::COLLATERAL_MINT,
super::tulip::LENDING_MARKET_ACCOUNT,
super::tulip::LENDING_MARKET_AUTHORITY,
super::tulip::PYTH_PRICE_ACCOUNT,
]
}
pub fn get_solend_remaining_accounts() -> [Pubkey; 8] {
[
super::solend::COLLATERAL_TOKEN_ACCOUNT,
super::solend::RESERVE_ACCOUNT,
super::solend::RESERVE_LIQUIDITY_ACCOUNT,
super::solend::COLLATERAL_MINT,
super::solend::LENDING_MARKET_ACCOUNT,
super::solend::LENDING_MARKET_AUTHORITY,
super::solend::PYTH_PRICE_ACCOUNT,
super::solend::SWITCHBOARD_PRICE_ACCOUNT,
]
}
pub fn get_mango_remaining_accounts() -> [Pubkey; 7] {
[
super::mango::GROUP,
super::mango::OPTIMIZER_MANGO_ACCOUNT,
super::mango::CACHE,
super::mango::ROOT_BANK,
super::mango::NODE_BANK,
super::mango::GROUP_TOKEN_ACCOUNT,
super::mango::GROUP_SIGNER,
]
}
}
}
pub mod solend {
use super::*;
pub const TAG_STRING: &str = "solend";
pub const FARM_KEY: Farm = Farm::Lending { name: Lending::RAY };
pub const ACCOUNT: Pubkey = static_pubkey!("8eAWyCa27MCukBBswRWBMc6RB4pLQQ2oyXr7sTKFvGXH");
pub const PDA: Pubkey = static_pubkey!("Bauzn5i1iWNJrFFBG4f8R1M8ozmiYdiB8Ldz8vWehLpn");
pub const SHARES_MINT: Pubkey = static_pubkey!("D99R1P1t3N6x8Sh43fBmU22Lk8e64QY2EoUmRMwxRDKm");
pub const UNDERLYING_COMPOUND_QUEUE: Pubkey =
static_pubkey!("EDnKnorFduAJj1hsy8roWxYxMTTzcqkUooS82Kj9v3fg");
pub const UNDERLYING_DEPOSIT_QUEUE: Pubkey =
static_pubkey!("HV54izUjLNThr6GCuxKtZVxd97R5jW9h3KeERzparGWA");
pub const UNDERLYING_WITHDRAW_QUEUE: Pubkey =
static_pubkey!("BV3XEjiiSqYSTbYvHaMP12x1wfUf6E4NbZ2JwK5hdYDA");
pub const UNDERLYING_MINT: Pubkey =
static_pubkey!("4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R");
pub const CONFIG_DATA_ACCOUNT: Pubkey =
static_pubkey!("FXXz3MhPpL9qxEkDDXtJvpfXXWBRgmcbcGuckEbmr7L2");
pub const INFORMATION_ACCOUNT: Pubkey =
static_pubkey!("HQqw2qS8FbDBV6uHZv2m8dmavgkDrBxWBevCRYj8fr6g");
pub const PROGRAM_ID: Pubkey = static_pubkey!("So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo");
pub const COLLATERAL_MINT: Pubkey =
static_pubkey!("2d95ZC8L5XP6xCnaKx8D5U5eX6rKbboBBAwuBLxaFmmJ");
pub const LENDING_MARKET_ACCOUNT: Pubkey =
static_pubkey!("4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY");
pub const LENDING_MARKET_AUTHORITY: Pubkey =
static_pubkey!("DdZR6zRFiUt4S5mg7AV1uKB2z1f1WzcNYCaTEEWPAuby");
pub const PYTH_PRICE_ACCOUNT: Pubkey =
static_pubkey!("AnLf8tVYCM816gmBjiy8n53eXKKEDydT5piYjjQDPgTB");
pub const SWITCHBOARD_PRICE_ACCOUNT: Pubkey =
static_pubkey!("CppyF6264uKZkGua1brTUa2fSVdMFSCszwzDs76HCuzU");
pub const PYTH_PROGRAM_ID: Pubkey =
static_pubkey!("FsJ3A3u2vn5cTVofAjvy6y5kwABJAqYWpe4975bi2epH");
pub const SWITCHBOARD_PROGRAM_ID: Pubkey =
static_pubkey!("DtmE9D2CSB4L5D6A15mraeEjrGMm6auWVzgaD8hK2tZM");
pub const RESERVE_ACCOUNT: Pubkey =
static_pubkey!("9n2exoMQwMTzfw6NFoFFujxYPndWVLtKREJePssrKb36");
pub const RESERVE_LIQUIDITY_ACCOUNT: Pubkey =
static_pubkey!("5JT6EK5wLEYGpAXMY2BXvhoeuQCp93eo4os2EtXwnPG1");
pub const COLLATERAL_TOKEN_ACCOUNT: Pubkey =
static_pubkey!("4pNagyM2WWUzimpfRvATKUvoZXmHs3WYFuWXnX6N3gWr");
pub fn platform_config() -> PlatformConfigAddresses {
PlatformConfigAddresses {
vault: ACCOUNT,
vault_pda: PDA,
information_account: INFORMATION_ACCOUNT,
config_data_account: CONFIG_DATA_ACCOUNT,
shares_mint: SHARES_MINT,
underlying_deposit_queue: UNDERLYING_DEPOSIT_QUEUE,
lending_program: PROGRAM_ID,
}
}
}
pub mod tulip {
use super::*;
pub const TAG_STRING: &str = "tulip";
pub const FARM_KEY: Farm = Farm::Lending { name: Lending::RAY };
pub const ACCOUNT: Pubkey = static_pubkey!("7RqGWFDK8J7AUB498ged2ZrmK5otqPE2nFM5RZQ3sCZ3");
pub const PDA: Pubkey = static_pubkey!("CdN3RmtGr6qF3Jbwvbac3m1JG8RRBK9hLwEf3hohcD5Q");
pub const SHARES_MINT: Pubkey = static_pubkey!("nEG5LAQCeHRs5TMcneJShmn36XCBNBaSYet9LP9CVtn");
pub const UNDERLYING_COMPOUND_QUEUE: Pubkey =
static_pubkey!("4CPrFtixPnQnRmB6PeAase7nuMTodYLEaBsnEE7TycGJ");
pub const UNDERLYING_DEPOSIT_QUEUE: Pubkey =
static_pubkey!("HvmxJubQcvhL3vuZBnUhoQ2AB1otYZXuvG3LDeGRpzrS");
pub const UNDERLYING_WITHDRAW_QUEUE: Pubkey =
static_pubkey!("2iEp3QGNUgzaQL5h3Cng7v6PxQCskDiccf7M3jR1YUzb");
pub const UNDERLYING_MINT: Pubkey =
static_pubkey!("4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R");
pub const CONFIG_DATA_ACCOUNT: Pubkey =
static_pubkey!("r5Qo4jPp9J5Qn83RhL4LAAzWyfRWBwjup5dsQcx58G3");
pub const INFORMATION_ACCOUNT: Pubkey =
static_pubkey!("J4kVv8c7JWb8vnTYb3pjySYCovt22pFGpfesDsF4mxFS");
pub const PROGRAM_ID: Pubkey = static_pubkey!("4bcFeLv4nydFrsZqV5CgwCVrPhkQKsXtzfy2KyMz7ozM");
pub const COLLATERAL_MINT: Pubkey =
static_pubkey!("8Lg7TowFuMQoGiTsLE6qV9x3czRgDmVy8f8Vv8KS4uW");
pub const LENDING_MARKET_ACCOUNT: Pubkey =
static_pubkey!("D1cqtVThyebK9KXKGXrCEuiqaNf5L4UfM1vHgCqiJxym");
pub const LENDING_MARKET_AUTHORITY: Pubkey =
static_pubkey!("8gEGZbUfVE1poBq71VHKX9LU7ca4x8wTUyZgcbyQe51s");
pub const PYTH_PRICE_ACCOUNT: Pubkey =
static_pubkey!("83fYH17UZaTCpr6GNcPcS5pZkfxwR1CaEVhYKfkqE8YF");
pub const PYTH_PROGRAM_ID: Pubkey =
static_pubkey!("5JQ8Mhdp2wv3HWcfjq9Ts8kwzCAeBADFBDAgBznzRsE4");
pub const RESERVE_ACCOUNT: Pubkey =
static_pubkey!("9Bm8d2izGsf9eT6Wr79DTnXBkW2LHYVQa57QzeoTbsAF");
pub const RESERVE_LIQUIDITY_ACCOUNT: Pubkey =
static_pubkey!("9SG6E3jBTTHLNgpV6ueUYypMYMkm4K5zyS9tk9Rsjm8Y");
pub const COLLATERAL_TOKEN_ACCOUNT: Pubkey =
static_pubkey!("A3YnPZ79vShgpKmM6VdKfGdgjNYPZZRE73N5qRheqFgi");
pub fn platform_config() -> PlatformConfigAddresses {
PlatformConfigAddresses {
vault: ACCOUNT,
vault_pda: PDA,
information_account: INFORMATION_ACCOUNT,
config_data_account: CONFIG_DATA_ACCOUNT,
shares_mint: SHARES_MINT,
underlying_deposit_queue: UNDERLYING_DEPOSIT_QUEUE,
lending_program: PROGRAM_ID,
}
}
}
pub mod mango {
use super::*;
pub const TAG_STRING: &str = "mango";
pub const FARM_KEY: Farm = Farm::Lending { name: Lending::RAY };
pub const ACCOUNT: Pubkey = static_pubkey!("A1tu6mY4CrVynaNTVPMtWfecJmXT2nNqwkhmyAjRaSvc");
pub const PDA: Pubkey = static_pubkey!("2aLJaJoMczpeFk3Fbi2cj4waxieS2VB5EwFsvUVevRMu");
pub const SHARES_MINT: Pubkey = static_pubkey!("HcrgGozsr3b35yhpGz132dSFaXHkRzYJhHt6tsFKsQon");
pub const UNDERLYING_COMPOUND_QUEUE: Pubkey =
static_pubkey!("EE1Abe9AT17PH6tM1m4wBPqiFBPRMskCyUPWAqxeNoA6");
pub const UNDERLYING_DEPOSIT_QUEUE: Pubkey =
static_pubkey!("Ee8ASkBb6G2d4V4aTqXMcVqs8JMEY82B1CsMgRqDoeG9");
pub const UNDERLYING_WITHDRAW_QUEUE: Pubkey =
static_pubkey!("B8S7mgLdLHgToqwFert2piFYvQKGSxrjnQb9XvTf1Nsq");
pub const UNDERLYING_MINT: Pubkey =
static_pubkey!("4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R");
pub const CONFIG_DATA_ACCOUNT: Pubkey =
static_pubkey!("Bzfz6u83YDZfJuiHcYQu6SqUoaShQWQRxQXzVCG3Sx63");
pub const INFORMATION_ACCOUNT: Pubkey =
static_pubkey!("HmschYQ6kCgnvXV8FvVymnJJaLv8iZYK4jhDZQVq6EKv");
pub const PROGRAM_ID: Pubkey = static_pubkey!("mv3ekLzLbnVPNxjSKvqBpU3ZeZXPQdEC3bp5MDEBG68");
pub const CACHE: Pubkey = static_pubkey!("EBDRoayCDDUvDgCimta45ajQeXbexv7aKqJubruqpyvu");
pub const GROUP: Pubkey = static_pubkey!("98pjRuQjK3qA6gXts96PqZT4Ze5QmnCmt3QYjhbUSPue");
pub const GROUP_SIGNER: Pubkey = static_pubkey!("9BVcYqEQxyccuwznvxXqDkSJFavvTyheiTYk231T1A8S");
pub const GROUP_TOKEN_ACCOUNT: Pubkey =
static_pubkey!("4XgHdo9zTMm42bYTPjNgq8FwR3yVwL67kvCFjWVurW44");
pub const ROOT_BANK: Pubkey = static_pubkey!("7TNHrBUDH3FL9uy9hxjmRcKNNaCBG9sYPuDJSJuj3LGs");
pub const NODE_BANK: Pubkey = static_pubkey!("GDNCSCaVzhD2L164GwUv8JqTdaHCuYGg21JjXQDtuofk");
pub const OPTIMIZER_MANGO_ACCOUNT: Pubkey =
static_pubkey!("41U4mtXqjiBH2WLJ3E5Sr4f7VcxfTtjEvcAnREn3AGrL");
pub fn platform_config() -> PlatformConfigAddresses {
PlatformConfigAddresses {
vault: ACCOUNT,
vault_pda: PDA,
information_account: INFORMATION_ACCOUNT,
config_data_account: CONFIG_DATA_ACCOUNT,
shares_mint: SHARES_MINT,
underlying_deposit_queue: UNDERLYING_DEPOSIT_QUEUE,
lending_program: PROGRAM_ID,
}
}
}