diff --git a/keeper/src/crank.rs b/keeper/src/crank.rs index 0c0adb012..1aa370465 100644 --- a/keeper/src/crank.rs +++ b/keeper/src/crank.rs @@ -58,7 +58,9 @@ pub async fn loop_update_index(mango_client: Arc, token_index: Toke let res = tokio::task::spawn_blocking(move || -> anyhow::Result<()> { let mint_info = client.get_mint_info(&token_index); let banks_for_a_token = client.banks_cache_by_token_index.get(&token_index).unwrap(); - let token_name = banks_for_a_token.get(0).unwrap().1.name(); + let some_bank = banks_for_a_token.get(0).unwrap().1; + let token_name = some_bank.name(); + let oracle = some_bank.oracle; let bank_pubkeys_for_a_token = banks_for_a_token .into_iter() @@ -72,7 +74,7 @@ pub async fn loop_update_index(mango_client: Arc, token_index: Toke let mut ix = Instruction { program_id: mango_v4::id(), accounts: anchor_lang::ToAccountMetas::to_account_metas( - &mango_v4::accounts::UpdateIndex { mint_info }, + &mango_v4::accounts::UpdateIndex { mint_info, oracle }, None, ), data: anchor_lang::InstructionData::data( diff --git a/programs/mango-v4/src/instructions/update_index.rs b/programs/mango-v4/src/instructions/update_index.rs index 17e256af8..6abed272f 100644 --- a/programs/mango-v4/src/instructions/update_index.rs +++ b/programs/mango-v4/src/instructions/update_index.rs @@ -2,17 +2,21 @@ use anchor_lang::prelude::*; use crate::logs::UpdateIndexLog; use crate::{ - accounts_zerocopy::{LoadMutZeroCopyRef, LoadZeroCopyRef}, - state::{Bank, MintInfo}, + accounts_zerocopy::{AccountInfoRef, LoadMutZeroCopyRef, LoadZeroCopyRef}, + state::{oracle_price, Bank, MintInfo}, }; use checked_math as cm; use fixed::types::I80F48; #[derive(Accounts)] pub struct UpdateIndex<'info> { pub mint_info: AccountLoader<'info, MintInfo>, + pub oracle: UncheckedAccount<'info>, } pub fn update_index(ctx: Context) -> Result<()> { + let mint_info = ctx.accounts.mint_info.load()?; + require_keys_eq!(mint_info.oracle.key(), ctx.accounts.oracle.key()); + ctx.accounts .mint_info .load()? @@ -27,7 +31,7 @@ pub fn update_index(ctx: Context) -> Result<()> { } let now_ts = Clock::get()?.unix_timestamp; - let (diff_ts, deposit_index, borrow_index) = { + let (diff_ts, deposit_index, borrow_index, oracle_conf_filter, base_token_decimals) = { let mut some_bank = ctx.remaining_accounts[0].load_mut::()?; // TODO: should we enforce a minimum window between 2 update_index ix calls? @@ -36,7 +40,13 @@ pub fn update_index(ctx: Context) -> Result<()> { let (deposit_index, borrow_index) = some_bank.compute_index(indexed_total_deposits, indexed_total_borrows, diff_ts)?; - (diff_ts, deposit_index, borrow_index) + ( + diff_ts, + deposit_index, + borrow_index, + some_bank.oracle_config.conf_filter, + some_bank.mint_decimals, + ) }; msg!("indexed_total_deposits {}", indexed_total_deposits); @@ -56,16 +66,21 @@ pub fn update_index(ctx: Context) -> Result<()> { bank.deposit_index = deposit_index; bank.borrow_index = borrow_index; - - // clarkeni TODO: add prices - emit!(UpdateIndexLog { - mango_group: bank.group.key(), - token_index: bank.token_index, - deposit_index: bank.deposit_index.to_bits(), - borrow_index: bank.borrow_index.to_bits(), - // price: oracle_price.to_bits(), - }); } + let price = oracle_price( + &AccountInfoRef::borrow(ctx.accounts.oracle.as_ref())?, + oracle_conf_filter, + base_token_decimals, + )?; + + emit!(UpdateIndexLog { + mango_group: mint_info.group.key(), + token_index: mint_info.token_index, + deposit_index: deposit_index.to_bits(), + borrow_index: borrow_index.to_bits(), + price: price.to_bits(), + }); + Ok(()) } diff --git a/programs/mango-v4/src/logs.rs b/programs/mango-v4/src/logs.rs index 1455584bd..e4fe4138d 100644 --- a/programs/mango-v4/src/logs.rs +++ b/programs/mango-v4/src/logs.rs @@ -132,7 +132,7 @@ pub struct UpdateIndexLog { pub token_index: u16, pub deposit_index: i128, // I80F48 pub borrow_index: i128, // I80F48 - // pub price: i128, // I80F48 + pub price: i128, // I80F48 } #[event] diff --git a/programs/mango-v4/tests/program_test/mango_client.rs b/programs/mango-v4/tests/program_test/mango_client.rs index e0e276354..80a8b681b 100644 --- a/programs/mango-v4/tests/program_test/mango_client.rs +++ b/programs/mango-v4/tests/program_test/mango_client.rs @@ -13,8 +13,6 @@ use solana_program::instruction::Instruction; use solana_sdk::instruction; use solana_sdk::signature::{Keypair, Signer}; use solana_sdk::transport::TransportError; -use spl_associated_token_account::get_associated_token_address; - use std::str::FromStr; use std::sync::Arc; @@ -2433,6 +2431,7 @@ impl ClientInstruction for BenchmarkInstruction { } pub struct UpdateIndexInstruction { pub mint_info: Pubkey, + pub oracle: Pubkey, pub banks: Vec, } #[async_trait::async_trait(?Send)] @@ -2447,6 +2446,7 @@ impl ClientInstruction for UpdateIndexInstruction { let instruction = Self::Instruction {}; let accounts = Self::Accounts { mint_info: self.mint_info, + oracle: self.oracle, }; let mut instruction = make_instruction(program_id, &accounts, instruction); diff --git a/programs/mango-v4/tests/test_basic.rs b/programs/mango-v4/tests/test_basic.rs index 22fdc57a7..9635cc068 100644 --- a/programs/mango-v4/tests/test_basic.rs +++ b/programs/mango-v4/tests/test_basic.rs @@ -136,15 +136,15 @@ async fn test_basic() -> Result<(), TransportError> { // TEST: Close account and de register bank // + let mint_info: MintInfo = solana.get_account(tokens[0].mint_info).await; + // withdraw whatever is remaining, can't close bank vault without this send_tx( solana, UpdateIndexInstruction { mint_info: tokens[0].mint_info, - banks: { - let mint_info: MintInfo = solana.get_account(tokens[0].mint_info).await; - mint_info.banks.to_vec() - }, + banks: mint_info.banks.to_vec(), + oracle: mint_info.oracle, }, ) .await diff --git a/programs/mango-v4/tests/test_delegate.rs b/programs/mango-v4/tests/test_delegate.rs index 4b98f31b0..88aadb130 100644 --- a/programs/mango-v4/tests/test_delegate.rs +++ b/programs/mango-v4/tests/test_delegate.rs @@ -1,6 +1,5 @@ #![cfg(feature = "test-bpf")] -use fixed::types::I80F48; use solana_program_test::*; use solana_sdk::{signature::Keypair, signature::Signer, transport::TransportError}; diff --git a/programs/mango-v4/tests/test_update_index.rs b/programs/mango-v4/tests/test_update_index.rs index 0a71993c5..9df181e9f 100644 --- a/programs/mango-v4/tests/test_update_index.rs +++ b/programs/mango-v4/tests/test_update_index.rs @@ -100,14 +100,14 @@ async fn test_update_index() -> Result<(), TransportError> { solana.advance_clock().await; + let mint_info: MintInfo = solana.get_account(tokens[0].mint_info).await; + send_tx( solana, UpdateIndexInstruction { mint_info: tokens[0].mint_info, - banks: { - let mint_info: MintInfo = solana.get_account(tokens[0].mint_info).await; - mint_info.banks.to_vec() - }, + banks: mint_info.banks.to_vec(), + oracle: mint_info.oracle, }, ) .await diff --git a/ts/client/src/mango_v4.ts b/ts/client/src/mango_v4.ts index 7d31f507c..326891772 100644 --- a/ts/client/src/mango_v4.ts +++ b/ts/client/src/mango_v4.ts @@ -540,6 +540,11 @@ export type MangoV4 = { "name": "mintInfo", "isMut": false, "isSigner": false + }, + { + "name": "oracle", + "isMut": false, + "isSigner": false } ], "args": [] @@ -4242,6 +4247,11 @@ export type MangoV4 = { "name": "borrowIndex", "type": "i128", "index": false + }, + { + "name": "price", + "type": "i128", + "index": false } ] }, @@ -4922,6 +4932,11 @@ export const IDL: MangoV4 = { "name": "mintInfo", "isMut": false, "isSigner": false + }, + { + "name": "oracle", + "isMut": false, + "isSigner": false } ], "args": [] @@ -8624,6 +8639,11 @@ export const IDL: MangoV4 = { "name": "borrowIndex", "type": "i128", "index": false + }, + { + "name": "price", + "type": "i128", + "index": false } ] },