2022-08-03 01:25:09 -07:00
|
|
|
use anchor_lang::prelude::*;
|
|
|
|
use anchor_spl::token::{Mint, Token, TokenAccount};
|
|
|
|
use fixed::types::I80F48;
|
|
|
|
|
|
|
|
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::*;
|
|
|
|
use crate::util::fill16_from_str;
|
|
|
|
|
2022-08-03 23:25:41 -07:00
|
|
|
const FIRST_BANK_NUM: u32 = 0;
|
|
|
|
|
2022-08-03 01:25:09 -07:00
|
|
|
#[derive(Accounts)]
|
2022-08-03 04:50:49 -07:00
|
|
|
#[instruction(token_index: TokenIndex)]
|
2022-08-03 01:25:09 -07:00
|
|
|
pub struct TokenRegisterTrustless<'info> {
|
|
|
|
#[account(
|
|
|
|
has_one = fast_listing_admin,
|
|
|
|
)]
|
|
|
|
pub group: AccountLoader<'info, Group>,
|
|
|
|
pub fast_listing_admin: Signer<'info>,
|
|
|
|
|
|
|
|
pub mint: Account<'info, Mint>,
|
|
|
|
|
|
|
|
#[account(
|
|
|
|
init,
|
|
|
|
// using the token_index in this seed guards against reusing it
|
2022-08-03 23:25:41 -07:00
|
|
|
seeds = [group.key().as_ref(), b"Bank".as_ref(), &token_index.to_le_bytes(), &FIRST_BANK_NUM.to_le_bytes()],
|
2022-08-03 01:25:09 -07:00
|
|
|
bump,
|
|
|
|
payer = payer,
|
|
|
|
space = 8 + std::mem::size_of::<Bank>(),
|
|
|
|
)]
|
|
|
|
pub bank: AccountLoader<'info, Bank>,
|
|
|
|
|
|
|
|
#[account(
|
|
|
|
init,
|
2022-08-03 23:25:41 -07:00
|
|
|
seeds = [group.key().as_ref(), b"Vault".as_ref(), &token_index.to_le_bytes(), &FIRST_BANK_NUM.to_le_bytes()],
|
2022-08-03 01:25:09 -07:00
|
|
|
bump,
|
|
|
|
token::authority = group,
|
|
|
|
token::mint = mint,
|
|
|
|
payer = payer
|
|
|
|
)]
|
|
|
|
pub vault: Account<'info, TokenAccount>,
|
|
|
|
|
|
|
|
#[account(
|
|
|
|
init,
|
|
|
|
// using the mint in this seed guards against registering the same mint twice
|
|
|
|
seeds = [group.key().as_ref(), b"MintInfo".as_ref(), mint.key().as_ref()],
|
|
|
|
bump,
|
|
|
|
payer = payer,
|
|
|
|
space = 8 + std::mem::size_of::<MintInfo>(),
|
|
|
|
)]
|
|
|
|
pub mint_info: AccountLoader<'info, MintInfo>,
|
|
|
|
|
|
|
|
/// CHECK: The oracle can be one of several different account types
|
|
|
|
pub oracle: UncheckedAccount<'info>,
|
|
|
|
|
|
|
|
#[account(mut)]
|
|
|
|
pub payer: Signer<'info>,
|
|
|
|
|
|
|
|
pub token_program: Program<'info, Token>,
|
|
|
|
pub system_program: Program<'info, System>,
|
|
|
|
pub rent: Sysvar<'info, Rent>,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(clippy::too_many_arguments)]
|
|
|
|
pub fn token_register_trustless(
|
|
|
|
ctx: Context<TokenRegisterTrustless>,
|
|
|
|
token_index: TokenIndex,
|
|
|
|
name: String,
|
|
|
|
) -> Result<()> {
|
|
|
|
require_neq!(token_index, 0);
|
|
|
|
|
|
|
|
let mut bank = ctx.accounts.bank.load_init()?;
|
|
|
|
*bank = Bank {
|
|
|
|
group: ctx.accounts.group.key(),
|
|
|
|
name: fill16_from_str(name)?,
|
|
|
|
mint: ctx.accounts.mint.key(),
|
|
|
|
vault: ctx.accounts.vault.key(),
|
|
|
|
oracle: ctx.accounts.oracle.key(),
|
|
|
|
oracle_config: OracleConfig {
|
|
|
|
conf_filter: I80F48::from_num(0.10),
|
|
|
|
},
|
|
|
|
deposit_index: INDEX_START,
|
|
|
|
borrow_index: INDEX_START,
|
|
|
|
cached_indexed_total_deposits: I80F48::ZERO,
|
|
|
|
cached_indexed_total_borrows: I80F48::ZERO,
|
|
|
|
indexed_deposits: I80F48::ZERO,
|
|
|
|
indexed_borrows: I80F48::ZERO,
|
|
|
|
index_last_updated: Clock::get()?.unix_timestamp,
|
|
|
|
bank_rate_last_updated: Clock::get()?.unix_timestamp,
|
|
|
|
avg_utilization: I80F48::ZERO,
|
2022-08-03 04:50:49 -07:00
|
|
|
adjustment_factor: I80F48::from_num(0.02),
|
|
|
|
util0: I80F48::from_num(0.7),
|
|
|
|
rate0: I80F48::from_num(0.1),
|
2022-08-03 01:25:09 -07:00
|
|
|
util1: I80F48::from_num(0.8),
|
2022-08-03 04:50:49 -07:00
|
|
|
rate1: I80F48::from_num(0.2),
|
|
|
|
max_rate: I80F48::from_num(2.0),
|
2022-08-03 01:25:09 -07:00
|
|
|
collected_fees_native: I80F48::ZERO,
|
2022-08-03 04:50:49 -07:00
|
|
|
loan_origination_fee_rate: I80F48::from_num(0.001),
|
2022-08-03 01:25:09 -07:00
|
|
|
loan_fee_rate: I80F48::from_num(0.005),
|
|
|
|
maint_asset_weight: I80F48::from_num(0),
|
|
|
|
init_asset_weight: I80F48::from_num(0),
|
2022-08-03 04:50:49 -07:00
|
|
|
maint_liab_weight: I80F48::from_num(1.25),
|
2022-08-03 06:11:19 -07:00
|
|
|
init_liab_weight: I80F48::from_num(1.5),
|
2022-08-03 04:50:49 -07:00
|
|
|
liquidation_fee: I80F48::from_num(0.125),
|
2022-08-03 01:25:09 -07:00
|
|
|
dust: I80F48::ZERO,
|
|
|
|
flash_loan_vault_initial: u64::MAX,
|
|
|
|
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,
|
|
|
|
reserved: [0; 256],
|
|
|
|
};
|
2022-08-03 05:54:34 -07:00
|
|
|
require_gt!(bank.max_rate, MINIMUM_MAX_RATE);
|
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,
|
|
|
|
padding1: Default::default(),
|
|
|
|
mint: ctx.accounts.mint.key(),
|
|
|
|
banks: Default::default(),
|
|
|
|
vaults: Default::default(),
|
|
|
|
oracle: ctx.accounts.oracle.key(),
|
|
|
|
registration_time: Clock::get()?.unix_timestamp,
|
2022-08-03 01:37:35 -07:00
|
|
|
group_insurance_fund: 0,
|
|
|
|
reserved: [0; 255],
|
2022-08-03 01:25:09 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
mint_info.banks[0] = ctx.accounts.bank.key();
|
|
|
|
mint_info.vaults[0] = ctx.accounts.vault.key();
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|