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 = "solv1";
pub const FARM_KEY: Farm = Farm::Lending {
name: Lending::MULTI_DEPOSIT,
};
pub const ACCOUNT: Pubkey = static_pubkey!("2WNw7tW2G54UCXN726S5tR9XutSEDeMf7xamidQtWszK");
pub const PDA: Pubkey = static_pubkey!("FzSwmSA7ZsKsfCRZGnfxb13HYX4nZpMQfBjqpg5bjT5V");
pub const SHARES_MINT: Pubkey = static_pubkey!("DgnaQdr5VkNbH7n8qN471Hgsw19hUbMBhUs1N3MQKgtu");
pub const UNDERLYING_COMPOUND_QUEUE: Pubkey =
static_pubkey!("637PczfBDWSRX5d55M8punyQEzdx3G3htMwhrD6cVcAk");
pub const UNDERLYING_DEPOSIT_QUEUE: Pubkey =
static_pubkey!("8HjBSJvQQwaC81gY1sND1ekNwjEvewYvrJeEh4Be6nQQ");
pub const UNDERLYING_WITHDRAW_QUEUE: Pubkey =
static_pubkey!("9k8MUkfjNDH1XPRNhSia57aAb7HGneP1jREQRPc3XZh7");
pub const UNDERLYING_MINT: Pubkey =
static_pubkey!("So11111111111111111111111111111111111111112");
pub const REBALANCE_STATE_TRANSITION: Pubkey =
static_pubkey!("7VrQy2dzGBff69rwz7XxfF9FB5Pvgi9UQFNGwept4dzt");
pub const REBALANCE_STATE_TRANSITION_UNDERLYING: Pubkey =
static_pubkey!("GrDw6ChbbA119r694Wvtnc9dYuBi2BbT1mHJLT5ovuB9");
pub const SOLEND_OPTIMIZER_SHARES_ACCOUNT: Pubkey =
static_pubkey!("96jC6s6whzjxov8E8pL6t6jJsPPXkeKWQx1CZzLQiahp");
pub const TULIP_OPTIMIZER_SHARES_ACCOUNT: Pubkey =
static_pubkey!("qv1gRK7rQkuzyewtg4Xbqgmr8J99FnDhELYtsjCUuws");
pub const MANGO_OPTIMIZER_SHARES_ACCOUNT: Pubkey =
static_pubkey!("7XdtJRhMYg5DS5uueCjpWHAxRYFaDUFu2MkG5AWE4Ywx");
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::SOL };
pub const ACCOUNT: Pubkey = static_pubkey!("2DPDpyd8pUoNDux8E7ZbzCgQtvyyVv8gPHUAzHDRXiWN");
pub const PDA: Pubkey = static_pubkey!("9ftmG873yFyybF51v85QjrvYfYZTu83mSgQo6wHtEqTh");
pub const SHARES_MINT: Pubkey = static_pubkey!("934f2qngiJN2XnCjqMkEJjECgMGzCBfJF6SCBqzRYBKw");
pub const UNDERLYING_COMPOUND_QUEUE: Pubkey =
static_pubkey!("7q6UP1BhkAxbzkK9HSTbUU8GE3YgGnFTvL4sApMgN9Yt");
pub const UNDERLYING_DEPOSIT_QUEUE: Pubkey =
static_pubkey!("57V8aNbjFzZHLs7TrzqgMDvLxuaaMzouLapi3eawytoB");
pub const UNDERLYING_WITHDRAW_QUEUE: Pubkey =
static_pubkey!("GKXUBegwfoVBrTJmEbsUZ8sxRtx6Pk54rgerYNvVPP63");
pub const UNDERLYING_MINT: Pubkey =
static_pubkey!("So11111111111111111111111111111111111111112");
pub const CONFIG_DATA_ACCOUNT: Pubkey =
static_pubkey!("7sqrzaBWTf7apr5z2VmAb61g6CbzFr5mzjWcYur8arcA");
pub const INFORMATION_ACCOUNT: Pubkey =
static_pubkey!("5vCZXDNn8NTFrvQvNGGRhNAEf5tHqXq83xnmjJMJSFmE");
pub const PROGRAM_ID: Pubkey = static_pubkey!("So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo");
pub const COLLATERAL_MINT: Pubkey =
static_pubkey!("5h6ssFpeDeRbzsEHDbTQNH7nVGgsKrZydxdSTnLm6QdV");
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!("H6ARHf6YXhGYeQfUzQNGk6rDNnLBQKrenN712K4AQJEG");
pub const SWITCHBOARD_PRICE_ACCOUNT: Pubkey =
static_pubkey!("AdtRGGhmqvom3Jemp5YNrxd9q9unX36BZk1pujkkXijL");
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!("8PbodeaosQP19SjYFx855UMqWxH2HynZLdBXmsrbac36");
pub const RESERVE_LIQUIDITY_ACCOUNT: Pubkey =
static_pubkey!("8UviNr47S8eL6J3WfDxMRa3hvLta1VDJwNWqsDgtN3Cv");
pub const COLLATERAL_TOKEN_ACCOUNT: Pubkey =
static_pubkey!("4bKoFNye8HxwkK2jfq3XHaLmfcKWZtd1fAA6DsMYqx3f");
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::SOL };
pub const ACCOUNT: Pubkey = static_pubkey!("5KrsibBDuJyifhFMnpKhicZxpdjse8o4M3viXgqyduoH");
pub const PDA: Pubkey = static_pubkey!("3xk85iPpM4ni7WaiioCbLeq29KRXVVkx7myJgKHQ1v2S");
pub const SHARES_MINT: Pubkey = static_pubkey!("DVumpNbQZNXvTpK8oY31DrQ9gNdK5hHRqhs7oApPF9Qo");
pub const UNDERLYING_COMPOUND_QUEUE: Pubkey =
static_pubkey!("CbgZWaX2R2etnvb2xz86ehWf97ZaFWqGVSV3qLJAhNpV");
pub const UNDERLYING_DEPOSIT_QUEUE: Pubkey =
static_pubkey!("67FuierfDeYa1eru2rFh3EKxmrziYWaPS4uKnpW3fUoh");
pub const UNDERLYING_WITHDRAW_QUEUE: Pubkey =
static_pubkey!("DSgsM43L563zHaioGHAzAysVdT89EPLZyzAbBN83QyxT");
pub const UNDERLYING_MINT: Pubkey =
static_pubkey!("So11111111111111111111111111111111111111112");
pub const CONFIG_DATA_ACCOUNT: Pubkey =
static_pubkey!("Hv7bo9Y1jXRYs3gV9BJz8vYG3Gandw2NofPxrdKJ7ps5");
pub const INFORMATION_ACCOUNT: Pubkey =
static_pubkey!("5j8x3giFz4fJfjKZAWELUP5DXHwjdn6xtch59od7EHxj");
pub const PROGRAM_ID: Pubkey = static_pubkey!("4bcFeLv4nydFrsZqV5CgwCVrPhkQKsXtzfy2KyMz7ozM");
pub const COLLATERAL_MINT: Pubkey =
static_pubkey!("H4Q3hDbuMUw8Bu72Ph8oV2xMQ7BFNbekpfQZKS2xF7jW");
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!("DQAcms41gjYzidRooXRE9GQM1jAauPXDcEpMbVh4FEc7");
pub const PYTH_PROGRAM_ID: Pubkey =
static_pubkey!("5JQ8Mhdp2wv3HWcfjq9Ts8kwzCAeBADFBDAgBznzRsE4");
pub const RESERVE_ACCOUNT: Pubkey =
static_pubkey!("FzbfXR7sopQL29Ubu312tkqWMxSre4dYSrFyYAjUYiC4");
pub const RESERVE_LIQUIDITY_ACCOUNT: Pubkey =
static_pubkey!("CPs1jJ5XAjhcAJsmTToWksAiPEqoLwKMbb1Z83rzaaaU");
pub const COLLATERAL_TOKEN_ACCOUNT: Pubkey =
static_pubkey!("DrB1QrmkdrTN4BfrZUpKzHMG1h7MkBrnMwz5HRHDiiSo");
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::SOL };
pub const ACCOUNT: Pubkey = static_pubkey!("4oJXs6Gx4Sj1YBY4DndMaB97RqUXzkW21t8YZGerEAvt");
pub const PDA: Pubkey = static_pubkey!("BodRnr1TUSbzENAWEXr3QWbrPSFo1ahyWbsxZZd8TTP");
pub const SHARES_MINT: Pubkey = static_pubkey!("4jpVgQaLL3aDPxo2q1NoaWVLp6TfcH6ZVeUMKKDFph22");
pub const UNDERLYING_COMPOUND_QUEUE: Pubkey =
static_pubkey!("Dp4dE9n2DRNyLurBg9VP4xby9yUYLw28hqExopFe4rEd");
pub const UNDERLYING_DEPOSIT_QUEUE: Pubkey =
static_pubkey!("CGv35EfXdUxddZoWbKApZ7XRgHmyVt9XXydjT4ZfuCs6");
pub const UNDERLYING_WITHDRAW_QUEUE: Pubkey =
static_pubkey!("Aty8vpK1gHm5YoLJBSegwxpCY2QmoebFQXkUd3xq1f4w");
pub const UNDERLYING_MINT: Pubkey =
static_pubkey!("So11111111111111111111111111111111111111112");
pub const CONFIG_DATA_ACCOUNT: Pubkey =
static_pubkey!("6tGs1Yfejxo8pcyRiCovDkH5wvUAD5TsErpouQenPjfx");
pub const INFORMATION_ACCOUNT: Pubkey =
static_pubkey!("CGfAEaUSv1soa8Z3XMNpdnstGwRM46c1E5WxuRkpBFRw");
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!("AVn3JRGhifPCxjxZsU3tQuo4U4dTHizHzBDGW983tx47");
pub const ROOT_BANK: Pubkey = static_pubkey!("7jH1uLmiB2zbHNe6juZZYjQCrvquakTwd3yMaQpeP8rR");
pub const NODE_BANK: Pubkey = static_pubkey!("2bqJYcA1A8gw4qJFjyE2G4akiUunpd9rP6QzfnxHqSqr");
pub const OPTIMIZER_MANGO_ACCOUNT: Pubkey =
static_pubkey!("7jH1uLmiB2zbHNe6juZZYjQCrvquakTwd3yMaQpeP8rR");
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,
}
}
}