2022-08-03 01:25:09 -07:00
|
|
|
use anchor_lang::prelude::*;
|
|
|
|
use fixed::types::I80F48;
|
|
|
|
|
2022-11-24 02:55:22 -08:00
|
|
|
use crate::accounts_zerocopy::AccountInfoRef;
|
2022-08-03 01:25:09 -07:00
|
|
|
use crate::error::*;
|
2022-08-03 04:50:49 -07:00
|
|
|
use crate::instructions::INDEX_START;
|
2022-08-03 01:25:09 -07:00
|
|
|
use crate::state::*;
|
2022-08-12 07:05:32 -07:00
|
|
|
use crate::util::fill_from_str;
|
2022-08-03 01:25:09 -07:00
|
|
|
|
2023-11-17 11:08:25 -08:00
|
|
|
use crate::logs::{emit_stack, TokenMetaDataLogV2};
|
2022-10-07 12:12:55 -07:00
|
|
|
|
2023-02-14 23:42:07 -08:00
|
|
|
use crate::accounts_ix::*;
|
2022-08-03 01:25:09 -07:00
|
|
|
|
|
|
|
#[allow(clippy::too_many_arguments)]
|
|
|
|
pub fn token_register_trustless(
|
|
|
|
ctx: Context<TokenRegisterTrustless>,
|
|
|
|
token_index: TokenIndex,
|
|
|
|
name: String,
|
|
|
|
) -> Result<()> {
|
2023-03-20 05:42:30 -07:00
|
|
|
require_neq!(token_index, QUOTE_TOKEN_INDEX);
|
|
|
|
require_neq!(token_index, TokenIndex::MAX);
|
2022-08-03 01:25:09 -07:00
|
|
|
|
2022-11-25 04:45:17 -08:00
|
|
|
let now_ts: u64 = Clock::get()?.unix_timestamp.try_into().unwrap();
|
2023-10-17 04:14:49 -07:00
|
|
|
{
|
|
|
|
let mut group = ctx.accounts.group.load_mut()?;
|
|
|
|
let week = 7 * 24 * 60 * 60;
|
|
|
|
if now_ts >= group.fast_listing_interval_start + week {
|
|
|
|
group.fast_listing_interval_start = now_ts / week * week;
|
|
|
|
group.fast_listings_in_interval = 0;
|
|
|
|
}
|
|
|
|
group.fast_listings_in_interval += 1;
|
|
|
|
require_gte!(
|
|
|
|
group.allowed_fast_listings_per_interval,
|
|
|
|
group.fast_listings_in_interval
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
let net_borrow_limit_window_size_ts = 24 * 60 * 60u64;
|
2022-11-24 02:55:22 -08:00
|
|
|
|
2022-08-03 01:25:09 -07:00
|
|
|
let mut bank = ctx.accounts.bank.load_init()?;
|
|
|
|
*bank = Bank {
|
|
|
|
group: ctx.accounts.group.key(),
|
2022-08-12 07:05:32 -07:00
|
|
|
name: fill_from_str(&name)?,
|
2022-08-03 01:25:09 -07:00
|
|
|
mint: ctx.accounts.mint.key(),
|
|
|
|
vault: ctx.accounts.vault.key(),
|
|
|
|
oracle: ctx.accounts.oracle.key(),
|
2023-01-04 00:24:40 -08:00
|
|
|
oracle_config: OracleConfig {
|
|
|
|
conf_filter: I80F48::from_num(0.10),
|
2023-08-15 04:33:48 -07:00
|
|
|
max_staleness_slots: 10000,
|
2023-01-04 00:24:40 -08:00
|
|
|
reserved: [0; 72],
|
|
|
|
},
|
|
|
|
stable_price_model: StablePriceModel::default(),
|
2022-08-03 01:25:09 -07:00
|
|
|
deposit_index: INDEX_START,
|
|
|
|
borrow_index: INDEX_START,
|
|
|
|
indexed_deposits: I80F48::ZERO,
|
|
|
|
indexed_borrows: I80F48::ZERO,
|
2022-11-24 02:55:22 -08:00
|
|
|
index_last_updated: now_ts,
|
|
|
|
bank_rate_last_updated: now_ts,
|
2022-08-03 01:25:09 -07:00
|
|
|
avg_utilization: I80F48::ZERO,
|
2022-08-06 04:04:18 -07:00
|
|
|
// 10% daily adjustment at 0% or 100% utilization
|
|
|
|
adjustment_factor: I80F48::from_num(0.004),
|
2023-03-31 03:45:26 -07:00
|
|
|
util0: I80F48::from_num(0.5),
|
2023-10-17 04:14:07 -07:00
|
|
|
rate0: I80F48::from_num(0.018),
|
2023-10-19 01:21:11 -07:00
|
|
|
util1: I80F48::from_num(0.75),
|
2023-10-17 04:14:07 -07:00
|
|
|
rate1: I80F48::from_num(0.05),
|
|
|
|
max_rate: I80F48::from_num(0.5),
|
2022-08-03 01:25:09 -07:00
|
|
|
collected_fees_native: I80F48::ZERO,
|
2023-10-19 01:21:11 -07:00
|
|
|
loan_origination_fee_rate: I80F48::from_num(0.0020),
|
2022-08-03 01:25:09 -07:00
|
|
|
loan_fee_rate: I80F48::from_num(0.005),
|
2023-10-19 01:21:11 -07:00
|
|
|
maint_asset_weight: I80F48::from_num(0.75), // 4x leverage
|
|
|
|
init_asset_weight: I80F48::from_num(0.5), // 2x leverage
|
|
|
|
maint_liab_weight: I80F48::from_num(1.25), // 4x leverage
|
|
|
|
init_liab_weight: I80F48::from_num(1.5), // 2x leverage
|
|
|
|
liquidation_fee: I80F48::from_num(0.125),
|
2022-08-03 01:25:09 -07:00
|
|
|
dust: I80F48::ZERO,
|
2022-08-06 03:59:13 -07:00
|
|
|
flash_loan_token_account_initial: u64::MAX,
|
2022-08-03 01:25:09 -07:00
|
|
|
flash_loan_approved_amount: 0,
|
|
|
|
token_index,
|
|
|
|
bump: *ctx.bumps.get("bank").ok_or(MangoError::SomeError)?,
|
|
|
|
mint_decimals: ctx.accounts.mint.decimals,
|
|
|
|
bank_num: 0,
|
2022-11-25 04:45:17 -08:00
|
|
|
min_vault_to_deposits_ratio: 0.2,
|
2022-12-06 00:34:02 -08:00
|
|
|
net_borrow_limit_window_size_ts,
|
|
|
|
last_net_borrows_window_start_ts: now_ts / net_borrow_limit_window_size_ts
|
|
|
|
* net_borrow_limit_window_size_ts,
|
2023-08-09 04:55:53 -07:00
|
|
|
net_borrow_limit_per_window_quote: 5_000_000_000, // $5k
|
2022-12-02 03:24:11 -08:00
|
|
|
net_borrows_in_window: 0,
|
2023-05-03 22:59:39 -07:00
|
|
|
borrow_weight_scale_start_quote: 5_000_000_000.0, // $5k
|
|
|
|
deposit_weight_scale_start_quote: 5_000_000_000.0, // $5k
|
2023-10-19 01:21:11 -07:00
|
|
|
reduce_only: 0, // allow both deposits and borrows
|
2023-04-13 03:44:12 -07:00
|
|
|
force_close: 0,
|
2023-07-14 07:27:52 -07:00
|
|
|
padding: Default::default(),
|
2023-07-13 09:22:35 -07:00
|
|
|
fees_withdrawn: 0,
|
2023-08-08 01:21:13 -07:00
|
|
|
token_conditional_swap_taker_fee_rate: 0.0005,
|
|
|
|
token_conditional_swap_maker_fee_rate: 0.0005,
|
2023-11-02 02:40:43 -07:00
|
|
|
flash_loan_swap_fee_rate: 0.0,
|
2023-10-17 04:14:07 -07:00
|
|
|
interest_target_utilization: 0.5,
|
|
|
|
interest_curve_scaling: 4.0,
|
2023-11-02 02:40:31 -07:00
|
|
|
deposits_in_serum: 0,
|
2023-11-14 05:52:04 -08:00
|
|
|
maint_weight_shift_start: 0,
|
|
|
|
maint_weight_shift_end: 0,
|
|
|
|
maint_weight_shift_duration_inv: I80F48::ZERO,
|
|
|
|
maint_weight_shift_asset_target: I80F48::ZERO,
|
|
|
|
maint_weight_shift_liab_target: I80F48::ZERO,
|
2023-11-17 11:08:25 -08:00
|
|
|
fallback_oracle: ctx.accounts.fallback_oracle.key(),
|
|
|
|
reserved: [0; 1976],
|
2022-08-03 01:25:09 -07:00
|
|
|
};
|
|
|
|
|
2023-06-21 06:25:24 -07:00
|
|
|
if let Ok(oracle_price) =
|
|
|
|
bank.oracle_price(&AccountInfoRef::borrow(ctx.accounts.oracle.as_ref())?, None)
|
|
|
|
{
|
|
|
|
bank.stable_price_model
|
|
|
|
.reset_to_price(oracle_price.to_num(), now_ts);
|
|
|
|
} else {
|
|
|
|
bank.stable_price_model.reset_on_nonzero_price = 1;
|
|
|
|
}
|
2022-11-24 02:55:22 -08:00
|
|
|
|
2023-08-09 04:55:53 -07:00
|
|
|
bank.verify()?;
|
|
|
|
|
2022-08-03 01:25:09 -07:00
|
|
|
let mut mint_info = ctx.accounts.mint_info.load_init()?;
|
|
|
|
*mint_info = MintInfo {
|
|
|
|
group: ctx.accounts.group.key(),
|
|
|
|
token_index,
|
2022-08-08 09:50:59 -07:00
|
|
|
group_insurance_fund: 0,
|
2022-08-03 01:25:09 -07:00
|
|
|
padding1: Default::default(),
|
|
|
|
mint: ctx.accounts.mint.key(),
|
|
|
|
banks: Default::default(),
|
|
|
|
vaults: Default::default(),
|
|
|
|
oracle: ctx.accounts.oracle.key(),
|
2023-11-17 11:08:25 -08:00
|
|
|
fallback_oracle: ctx.accounts.fallback_oracle.key(),
|
2022-11-10 05:41:20 -08:00
|
|
|
registration_time: Clock::get()?.unix_timestamp.try_into().unwrap(),
|
2023-11-17 11:08:25 -08:00
|
|
|
reserved: [0; 2528],
|
2022-08-03 01:25:09 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
mint_info.banks[0] = ctx.accounts.bank.key();
|
|
|
|
mint_info.vaults[0] = ctx.accounts.vault.key();
|
|
|
|
|
2023-11-22 09:42:32 -08:00
|
|
|
emit_stack(TokenMetaDataLogV2 {
|
2022-10-07 12:12:55 -07:00
|
|
|
mango_group: ctx.accounts.group.key(),
|
|
|
|
mint: ctx.accounts.mint.key(),
|
2023-01-12 05:26:55 -08:00
|
|
|
token_index,
|
2022-10-07 12:12:55 -07:00
|
|
|
mint_decimals: ctx.accounts.mint.decimals,
|
|
|
|
oracle: ctx.accounts.oracle.key(),
|
2023-11-17 11:08:25 -08:00
|
|
|
fallback_oracle: ctx.accounts.fallback_oracle.key(),
|
2022-10-07 12:12:55 -07:00
|
|
|
mint_info: ctx.accounts.mint_info.key(),
|
|
|
|
});
|
|
|
|
|
2022-08-03 01:25:09 -07:00
|
|
|
Ok(())
|
|
|
|
}
|