From 9000e06c772195f8e47550c482a0a12eddbe7035 Mon Sep 17 00:00:00 2001 From: Wei Date: Fri, 23 Dec 2022 16:19:32 +0800 Subject: [PATCH 1/5] refactor orca adapter --- programs/adapter-orca/src/lib.rs | 390 ++++++++++++------------------- 1 file changed, 154 insertions(+), 236 deletions(-) diff --git a/programs/adapter-orca/src/lib.rs b/programs/adapter-orca/src/lib.rs index f455810..f9c87fc 100644 --- a/programs/adapter-orca/src/lib.rs +++ b/programs/adapter-orca/src/lib.rs @@ -10,6 +10,8 @@ declare_id!("ADPTTyNqameXftbqsxwXhbs7v7XP8E82YMaUStPgjmU5"); #[program] pub mod adapter_orca { + use std::vec; + use super::*; pub fn add_liquidity<'a, 'b, 'c, 'info>( @@ -22,24 +24,14 @@ pub mod adapter_orca { msg!("Input: {:?}", input_struct); // Use remaining accounts - let lp_token_account_info = ctx.remaining_accounts[7].clone(); - let mut lp_token_account = Account::::try_from(&lp_token_account_info)?; - let lp_token_amount_before = lp_token_account.amount; - + let mut lp_token_account_and_balance = + load_token_account_and_balance(ctx.remaining_accounts, 7); // Get the data from input_struct let pool_token_in_amount = input_struct.token_in_amount; + // Load Ix accounts + let add_lp_accounts = + load_remaining_accounts(ctx.remaining_accounts, vec![0, 1, 2, 3, 4, 5, 6, 7, 8]); - let add_lp_accounts = vec![ - AccountMeta::new_readonly(ctx.remaining_accounts[0].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[1].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[2].key(), true), - AccountMeta::new(ctx.remaining_accounts[3].key(), false), - AccountMeta::new(ctx.remaining_accounts[4].key(), false), - AccountMeta::new(ctx.remaining_accounts[5].key(), false), - AccountMeta::new(ctx.remaining_accounts[6].key(), false), - AccountMeta::new(ctx.remaining_accounts[7].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[8].key(), false), - ]; // Build Ix Data const ADD_LP_IX: u8 = 4; let minimal_receive: u64 = 0; @@ -56,16 +48,9 @@ pub mod adapter_orca { invoke(&ix, ctx.remaining_accounts)?; - lp_token_account.reload()?; - let lp_token_amount_after = lp_token_account.amount; - let lp_amount = lp_token_amount_after - .checked_sub(lp_token_amount_before) - .unwrap(); - - msg!("lp_amount: {}", lp_amount.to_string()); // Wrap Output let output_struct = AddLiquidityOutputWrapper { - lp_amount, + lp_amount: lp_token_account_and_balance.get_balance_change(), ..Default::default() }; let mut output: Vec = Vec::new(); @@ -92,127 +77,76 @@ pub mod adapter_orca { let lp_amount = input_struct.lp_amount; // Use remaining accounts - let lp_token_account_info = ctx.remaining_accounts[7].clone(); - let mut lp_token_account = Account::::try_from(&lp_token_account_info)?; - let lp_token_amount_before = lp_token_account.amount; - + let mut lp_token_account_and_balance = + load_token_account_and_balance(ctx.remaining_accounts, 4); msg!("lp_amount: {}", lp_amount.to_string()); - let (ix, token_a_amount_before, token_b_amount_before) = match input_struct.action { - // RemoveLiquidity - 2 => { - const REMOVE_LP_IX: u8 = 3; - let remove_lp_accounts = vec![ - AccountMeta::new_readonly(ctx.remaining_accounts[0].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[1].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[2].key(), true), - AccountMeta::new(ctx.remaining_accounts[3].key(), false), - AccountMeta::new(ctx.remaining_accounts[4].key(), false), - AccountMeta::new(ctx.remaining_accounts[5].key(), false), - AccountMeta::new(ctx.remaining_accounts[6].key(), false), - AccountMeta::new(ctx.remaining_accounts[7].key(), false), - AccountMeta::new(ctx.remaining_accounts[8].key(), false), - AccountMeta::new(ctx.remaining_accounts[9].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[10].key(), false), - ]; - let token_a_account_amount = - Account::::try_from(&ctx.remaining_accounts[7].clone()) - .unwrap() - .amount; - let token_b_account_amount = - Account::::try_from(&ctx.remaining_accounts[8].clone()) - .unwrap() - .amount; - - let minimal_receive: u64 = 0; - - let mut remove_lp_data = vec![]; - remove_lp_data.append(&mut REMOVE_LP_IX.to_le_bytes().to_vec()); - remove_lp_data.append(&mut lp_amount.to_le_bytes().to_vec()); - remove_lp_data.append(&mut minimal_receive.to_le_bytes().to_vec()); - remove_lp_data.append(&mut minimal_receive.to_le_bytes().to_vec()); - - ( - Instruction { - program_id: ctx.accounts.base_program_id.key(), - accounts: remove_lp_accounts, - data: remove_lp_data, - }, - token_a_account_amount, - token_b_account_amount, - ) - } - // RemoveLiquiditySingle - 3 => { - const REMOVE_LP_IX: u8 = 5; - let remove_lp_accounts = vec![ - AccountMeta::new_readonly(ctx.remaining_accounts[0].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[1].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[2].key(), true), - AccountMeta::new(ctx.remaining_accounts[3].key(), false), - AccountMeta::new(ctx.remaining_accounts[4].key(), false), - AccountMeta::new(ctx.remaining_accounts[5].key(), false), - AccountMeta::new(ctx.remaining_accounts[6].key(), false), - AccountMeta::new(ctx.remaining_accounts[7].key(), false), - AccountMeta::new(ctx.remaining_accounts[8].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[9].key(), false), - ]; - let minimal_receive: u64 = 1; - - let mut remove_lp_data = vec![]; - remove_lp_data.append(&mut REMOVE_LP_IX.to_le_bytes().to_vec()); - remove_lp_data.append(&mut minimal_receive.to_le_bytes().to_vec()); - remove_lp_data.append(&mut lp_amount.to_le_bytes().to_vec()); - let (token_a_amount_before, token_b_amount_before) = ( - Account::::try_from(&ctx.remaining_accounts[7].clone()) - .unwrap() - .amount, - 0_u64, - ); - - ( - Instruction { - program_id: ctx.accounts.base_program_id.key(), - accounts: remove_lp_accounts, - data: remove_lp_data, - }, - token_a_amount_before, - token_b_amount_before, - ) - } - _ => { - return Err(ErrorCode::UnsupportedAction.into()); - } - }; + let (ix, mut token_a_account_and_balance, token_b_account_and_balance) = + match input_struct.action { + // RemoveLiquidity + 2 => { + const REMOVE_LP_IX: u8 = 3; + let remove_lp_accounts = load_remaining_accounts( + ctx.remaining_accounts, + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + ); + + let minimal_receive: u64 = 0; + + let mut remove_lp_data = vec![]; + remove_lp_data.append(&mut REMOVE_LP_IX.to_le_bytes().to_vec()); + remove_lp_data.append(&mut lp_amount.to_le_bytes().to_vec()); + remove_lp_data.append(&mut minimal_receive.to_le_bytes().to_vec()); + remove_lp_data.append(&mut minimal_receive.to_le_bytes().to_vec()); + + ( + Instruction { + program_id: ctx.accounts.base_program_id.key(), + accounts: remove_lp_accounts, + data: remove_lp_data, + }, + load_token_account_and_balance(ctx.remaining_accounts, 7), + Some(load_token_account_and_balance(ctx.remaining_accounts, 8)), + ) + } + // RemoveLiquiditySingle + 3 => { + const REMOVE_LP_IX: u8 = 5; + let remove_lp_accounts = load_remaining_accounts( + ctx.remaining_accounts, + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + ); + + let minimal_receive: u64 = 1; + + let mut remove_lp_data = vec![]; + remove_lp_data.append(&mut REMOVE_LP_IX.to_le_bytes().to_vec()); + remove_lp_data.append(&mut minimal_receive.to_le_bytes().to_vec()); + remove_lp_data.append(&mut lp_amount.to_le_bytes().to_vec()); + ( + Instruction { + program_id: ctx.accounts.base_program_id.key(), + accounts: remove_lp_accounts, + data: remove_lp_data, + }, + load_token_account_and_balance(ctx.remaining_accounts, 7), + None, + ) + } + _ => { + return Err(ErrorCode::UnsupportedAction.into()); + } + }; invoke(&ix, ctx.remaining_accounts)?; - // Load lp amount change - lp_token_account.reload(); - let lp_amount = lp_token_amount_before - .checked_sub(lp_token_account.amount) - .unwrap(); - - // Load Token A amount change - let a_out_amount = Account::::try_from(&ctx.remaining_accounts[7].clone()) - .unwrap() - .amount - .checked_sub(token_a_amount_before) - .unwrap(); - - // Load Token B amount change only for both side - let b_out_amount = match input_struct.action { - 2 => Account::::try_from(&ctx.remaining_accounts[8].clone()) - .unwrap() - .amount - .checked_sub(token_b_amount_before) - .unwrap(), - _ => 0_u64, - }; // Wrap Output let output_struct = RemoveLiquidityOutputWrapper { - token_a_out_amount: a_out_amount, - token_b_out_amount: b_out_amount, - lp_amount: lp_amount, + token_a_out_amount: token_a_account_and_balance.get_balance_change(), + token_b_out_amount: match token_b_account_and_balance { + Some(mut i) => i.get_balance_change(), + None => 0_u64, + }, + lp_amount: lp_token_account_and_balance.get_balance_change(), ..Default::default() }; let mut output: Vec = Vec::new(); @@ -238,28 +172,16 @@ pub mod adapter_orca { let lp_amount = input_struct.lp_amount; // Use remaining accounts - let lp_token_account_info = ctx.remaining_accounts[1].clone(); - let mut lp_token_account = Account::::try_from(&lp_token_account_info)?; - let lp_token_amount_before = lp_token_account.amount; - - let share_token_account_info = ctx.remaining_accounts[5].clone(); - let mut share_token_account = Account::::try_from(&share_token_account_info)?; - let share_token_amount_before = share_token_account.amount; - - let stake_accounts = vec![ - AccountMeta::new_readonly(ctx.remaining_accounts[0].key(), true), - AccountMeta::new(ctx.remaining_accounts[1].key(), false), - AccountMeta::new(ctx.remaining_accounts[2].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[3].key(), true), - AccountMeta::new(ctx.remaining_accounts[4].key(), false), - AccountMeta::new(ctx.remaining_accounts[5].key(), false), - AccountMeta::new(ctx.remaining_accounts[6].key(), false), - AccountMeta::new(ctx.remaining_accounts[7].key(), false), - AccountMeta::new(ctx.remaining_accounts[8].key(), false), - AccountMeta::new(ctx.remaining_accounts[9].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[10].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[11].key(), false), - ]; + let mut lp_token_account_and_balance = + load_token_account_and_balance(ctx.remaining_accounts, 1); + + let mut share_token_account_and_balance = + load_token_account_and_balance(ctx.remaining_accounts, 5); + + let stake_accounts = load_remaining_accounts( + ctx.remaining_accounts, + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + ); const STAKE_IX: u8 = 2; let mut stake_data = vec![]; @@ -274,23 +196,10 @@ pub mod adapter_orca { invoke(&ix, ctx.remaining_accounts)?; - // Load lp amount change - lp_token_account.reload(); - let lp_amount = lp_token_amount_before - .checked_sub(lp_token_account.amount) - .unwrap(); - - // Load share amount change - share_token_account.reload(); - let share_amount = share_token_account - .amount - .checked_sub(share_token_amount_before) - .unwrap(); - // Wrap Output let output_struct = StakeOutputWrapper { - share_amount: share_amount, - lp_amount: lp_amount, + share_amount: share_token_account_and_balance.get_balance_change(), + lp_amount: lp_token_account_and_balance.get_balance_change(), ..Default::default() }; let mut output: Vec = Vec::new(); @@ -318,28 +227,15 @@ pub mod adapter_orca { msg!("lp_amount: {}", lp_amount.to_string()); // Use remaining accounts - let lp_token_account_info = ctx.remaining_accounts[1].clone(); - let mut lp_token_account = Account::::try_from(&lp_token_account_info)?; - let lp_token_amount_before = lp_token_account.amount; - - let share_token_account_info = ctx.remaining_accounts[4].clone(); - let mut share_token_account = Account::::try_from(&share_token_account_info)?; - let share_token_amount_before = share_token_account.amount; - - let unstake_accounts = vec![ - AccountMeta::new_readonly(ctx.remaining_accounts[0].key(), true), - AccountMeta::new(ctx.remaining_accounts[1].key(), false), - AccountMeta::new(ctx.remaining_accounts[2].key(), false), - AccountMeta::new(ctx.remaining_accounts[3].key(), false), - AccountMeta::new(ctx.remaining_accounts[4].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[5].key(), true), - AccountMeta::new(ctx.remaining_accounts[6].key(), false), - AccountMeta::new(ctx.remaining_accounts[7].key(), false), - AccountMeta::new(ctx.remaining_accounts[8].key(), false), - AccountMeta::new(ctx.remaining_accounts[9].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[10].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[11].key(), false), - ]; + let mut lp_token_account_and_balance = + load_token_account_and_balance(ctx.remaining_accounts, 1); + + let mut share_token_account_and_balance = + load_token_account_and_balance(ctx.remaining_accounts, 4); + let unstake_accounts = load_remaining_accounts( + ctx.remaining_accounts, + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + ); const UNSTAKE_IX: u8 = 3; let mut unstake_data = vec![]; @@ -354,24 +250,10 @@ pub mod adapter_orca { invoke(&ix, ctx.remaining_accounts)?; - lp_token_account.reload(); - // Load lp amount change - lp_token_account.reload(); - let lp_amount = lp_token_account - .amount - .checked_sub(lp_token_amount_before) - .unwrap(); - - // Load share amount change - share_token_account.reload(); - let share_amount = share_token_amount_before - .checked_sub(share_token_account.amount) - .unwrap(); - // Wrap Output let output_struct = UnstakeOutputWrapper { - share_amount: share_amount, - lp_amount: lp_amount, + share_amount: share_token_account_and_balance.get_balance_change(), + lp_amount: lp_token_account_and_balance.get_balance_change(), ..Default::default() }; let mut output: Vec = Vec::new(); @@ -390,12 +272,9 @@ pub mod adapter_orca { input: Vec, ) -> Result<()> { // Use remaining accounts - let reward_token_account_info = ctx.remaining_accounts[5].clone(); - let mut reward_token_account = - Account::::try_from(&reward_token_account_info)?; - let reward_token_amount_before = reward_token_account.amount; + let mut reward_account_and_balance = + load_token_account_and_balance(ctx.remaining_accounts, 1); - // Get Input let mut input_bytes = &input[..]; let input_struct = HarvestInputWrapper::deserialize(&mut input_bytes)?; @@ -403,16 +282,8 @@ pub mod adapter_orca { // Harvest let harvest_ix: u8 = 4; - let harvest_accounts = vec![ - AccountMeta::new_readonly(ctx.remaining_accounts[0].key(), true), - AccountMeta::new(ctx.remaining_accounts[1].key(), false), - AccountMeta::new(ctx.remaining_accounts[2].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[3].key(), false), - AccountMeta::new(ctx.remaining_accounts[4].key(), false), - AccountMeta::new(ctx.remaining_accounts[5].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[6].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[7].key(), false), - ]; + let harvest_accounts = + load_remaining_accounts(ctx.remaining_accounts, vec![0, 1, 2, 3, 4, 5, 6, 7]); let mut harvest_data = vec![]; harvest_data.push(harvest_ix); @@ -424,16 +295,9 @@ pub mod adapter_orca { invoke(&ix, ctx.remaining_accounts)?; - // Load reward amount change - reward_token_account.reload(); - let reward_amount = reward_token_account - .amount - .checked_sub(reward_token_amount_before) - .unwrap(); - // Wrap Output let output_struct = HarvestOutputWrapper { - reward_amount: reward_amount, + reward_amount: reward_account_and_balance.get_balance_change(), ..Default::default() }; let mut output: Vec = Vec::new(); @@ -591,3 +455,57 @@ impl From for HarvestOutputTuple { (reward_amount, dummy_2, dummy_3, dummy_4) } } + +pub fn load_token_account_and_balance<'info>( + remaining_accounts: &[AccountInfo<'info>], + account_index: usize, +) -> TokenAccountAndBalance<'info> { + let token_account_info = &remaining_accounts[account_index]; + let token_account = Account::::try_from(token_account_info).unwrap(); + let balance_before = token_account.amount.clone(); + return TokenAccountAndBalance { + token_accout: token_account, + balance_before: balance_before, + }; +} + +pub struct TokenAccountAndBalance<'info> { + token_accout: Account<'info, TokenAccount>, + balance_before: u64, +} + +impl<'info> TokenAccountAndBalance<'info> { + pub fn get_balance_change(&mut self) -> u64 { + self.token_accout.reload().unwrap(); + let balance_before = self.balance_before; + let balance_after = self.token_accout.amount; + if balance_after > balance_before { + balance_after.checked_sub(balance_before).unwrap() + } else if balance_after == balance_before { + 0_u64 + } else { + balance_before.checked_sub(balance_after).unwrap() + } + } +} + +pub fn load_remaining_accounts<'info>( + remaining_accounts: &[AccountInfo<'info>], + index_array: Vec, +) -> Vec { + let mut accounts: Vec = vec![]; + for index in index_array.iter() { + if remaining_accounts[*index].is_writable { + accounts.push(AccountMeta::new( + remaining_accounts[*index].key(), + remaining_accounts[*index].is_signer, + )) + } else { + accounts.push(AccountMeta::new_readonly( + remaining_accounts[*index].key(), + remaining_accounts[*index].is_signer, + )) + } + } + return accounts; +} From f9844a5b6a370aea982302a689f64d9a8ac9cae7 Mon Sep 17 00:00:00 2001 From: Wei Date: Fri, 6 Jan 2023 16:10:06 +0800 Subject: [PATCH 2/5] move redundant code to adapter common lib --- Cargo.toml | 3 +- adapter_common/Cargo.toml | 10 +++++ adapter_common/src/lib.rs | 81 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 adapter_common/Cargo.toml create mode 100644 adapter_common/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index a60de98..2dd4b16 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,4 +1,5 @@ [workspace] members = [ - "programs/*" + "programs/*", + "adapter_common" ] diff --git a/adapter_common/Cargo.toml b/adapter_common/Cargo.toml new file mode 100644 index 0000000..bca982c --- /dev/null +++ b/adapter_common/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "adapter-common" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anchor-lang = "0.24.2" +anchor-spl = "0.24.2" diff --git a/adapter_common/src/lib.rs b/adapter_common/src/lib.rs new file mode 100644 index 0000000..5e9b25f --- /dev/null +++ b/adapter_common/src/lib.rs @@ -0,0 +1,81 @@ +use anchor_lang::prelude::*; +use anchor_lang::solana_program::hash::hash; +use anchor_lang::solana_program::instruction::AccountMeta; +use anchor_spl::token::TokenAccount; + +pub fn load_token_account_and_balance<'info>( + remaining_accounts: &[AccountInfo<'info>], + account_index: usize, +) -> TokenAccountAndBalance<'info> { + let token_account_info = &remaining_accounts[account_index]; + let token_account = Account::::try_from(token_account_info).unwrap(); + let balance_before = token_account.amount.clone(); + return TokenAccountAndBalance { + token_accout: token_account, + balance_before: balance_before, + }; +} + +pub struct TokenAccountAndBalance<'info> { + token_accout: Account<'info, TokenAccount>, + balance_before: u64, +} + +impl<'info> TokenAccountAndBalance<'info> { + pub fn get_balance_change(&mut self) -> u64 { + self.token_accout.reload().unwrap(); + let balance_before = self.balance_before; + let balance_after = self.token_accout.amount; + if balance_after > balance_before { + balance_after.checked_sub(balance_before).unwrap() + } else if balance_after == balance_before { + 0_u64 + } else { + balance_before.checked_sub(balance_after).unwrap() + } + } +} + +pub fn load_remaining_accounts<'info>( + remaining_accounts: &[AccountInfo<'info>], + index_array: Vec, +) -> Vec { + let mut accounts: Vec = vec![]; + for index in index_array.iter() { + if remaining_accounts[*index].is_writable { + accounts.push(AccountMeta::new( + remaining_accounts[*index].key(), + remaining_accounts[*index].is_signer, + )) + } else { + accounts.push(AccountMeta::new_readonly( + remaining_accounts[*index].key(), + remaining_accounts[*index].is_signer, + )) + } + } + return accounts; +} + +pub fn sighash(namespace: &str, name: &str) -> [u8; 8] { + let preimage = format!("{}:{}", namespace, name); + let mut sighash = [0u8; 8]; + + sighash.copy_from_slice(&hash(preimage.as_bytes()).to_bytes()[..8]); + sighash +} + + +#[error_code] +pub enum ErrorCode { + #[msg("Unsupported Action")] + UnsupportedAction, + #[msg("Unsupported PoolDirection")] + UnsupportedPoolDirection, + #[msg("Unsupported Action Version")] + UnsupportedVersion, + #[msg("Unsupported Vault Protocol")] + UnsupportedVaultProtocol, + #[msg("Index might out of bound, currently only support 30 addresses")] + IndexOutOfBound, +} From f974281c629cad38952be9a66f508bcd94f4c41b Mon Sep 17 00:00:00 2001 From: Wei Date: Fri, 6 Jan 2023 16:12:58 +0800 Subject: [PATCH 3/5] use adapter_common package in adapters --- programs/adapter-friktion/Cargo.toml | 2 +- programs/adapter-friktion/src/lib.rs | 178 +++++------------------- programs/adapter-katana/Cargo.toml | 2 +- programs/adapter-katana/src/lib.rs | 49 +------ programs/adapter-lifinity/Cargo.toml | 1 + programs/adapter-lifinity/src/lib.rs | 10 +- programs/adapter-nft-finance/Cargo.toml | 1 + programs/adapter-nft-finance/src/lib.rs | 18 +-- programs/adapter-orca/Cargo.toml | 4 +- programs/adapter-orca/src/lib.rs | 70 +--------- programs/adapter-raydium/Cargo.toml | 1 + programs/adapter-raydium/src/lib.rs | 18 +-- programs/adapter-saber/Cargo.toml | 1 + programs/adapter-saber/src/lib.rs | 18 +-- programs/adapter-tulip/Cargo.toml | 1 + programs/adapter-tulip/src/lib.rs | 71 +--------- 16 files changed, 48 insertions(+), 397 deletions(-) diff --git a/programs/adapter-friktion/Cargo.toml b/programs/adapter-friktion/Cargo.toml index 62cf60e..af0ba1d 100644 --- a/programs/adapter-friktion/Cargo.toml +++ b/programs/adapter-friktion/Cargo.toml @@ -17,4 +17,4 @@ default = [] [dependencies] anchor-lang = "0.24.2" -anchor-spl = "0.24.2" +adapter-common = { path = "../../adapter_common",version= "0.1.0" } diff --git a/programs/adapter-friktion/src/lib.rs b/programs/adapter-friktion/src/lib.rs index b2ed31c..37f7160 100644 --- a/programs/adapter-friktion/src/lib.rs +++ b/programs/adapter-friktion/src/lib.rs @@ -1,11 +1,6 @@ +use adapter_common::{load_remaining_accounts, load_token_account_and_balance, sighash}; use anchor_lang::prelude::*; -use anchor_lang::solana_program::{ - hash::hash, - instruction::{AccountMeta, Instruction}, - program::invoke, - pubkey::Pubkey, -}; -use anchor_spl::token::TokenAccount; +use anchor_lang::solana_program::{instruction::Instruction, program::invoke, pubkey::Pubkey}; declare_id!("ADPTzbsaBdXA3FqXoPHjaTjPfh9kadxxFKxonZihP1Ji"); @@ -28,27 +23,13 @@ pub mod adapter_friktion { let mut deposit_data = sighash("global", "deposit").to_vec(); deposit_data.append(&mut input_struct.deposit_amount.try_to_vec()?); - let deposit_accounts = vec![ - AccountMeta::new(ctx.remaining_accounts[0].key(), true), - AccountMeta::new_readonly(ctx.remaining_accounts[0].key(), true), - AccountMeta::new_readonly(ctx.remaining_accounts[0].key(), false), - AccountMeta::new(ctx.remaining_accounts[1].key(), false), - AccountMeta::new(ctx.remaining_accounts[2].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[3].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[4].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[5].key(), false), - AccountMeta::new(ctx.remaining_accounts[6].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[7].key(), false), - AccountMeta::new(ctx.remaining_accounts[8].key(), false), - AccountMeta::new(ctx.remaining_accounts[9].key(), false), - AccountMeta::new(ctx.remaining_accounts[10].key(), false), - AccountMeta::new(ctx.remaining_accounts[11].key(), false), - AccountMeta::new(ctx.remaining_accounts[12].key(), false), - AccountMeta::new(ctx.remaining_accounts[13].key(), false), - AccountMeta::new(ctx.remaining_accounts[14].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[15].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[16].key(), false), - ]; + let deposit_accounts = load_remaining_accounts( + ctx.remaining_accounts, + vec![ + 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + ], + ); + let ix = Instruction { program_id: ctx.accounts.base_program_id.key(), accounts: deposit_accounts, @@ -87,28 +68,12 @@ pub mod adapter_friktion { let mut data = sighash("global", "withdraw").to_vec(); data.append(&mut input_struct.share_amount.try_to_vec()?); - - let accounts = vec![ - AccountMeta::new(ctx.remaining_accounts[0].key(), true), - AccountMeta::new_readonly(ctx.remaining_accounts[0].key(), true), - AccountMeta::new_readonly(ctx.remaining_accounts[0].key(), false), - AccountMeta::new(ctx.remaining_accounts[1].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[2].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[3].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[4].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[5].key(), false), - AccountMeta::new(ctx.remaining_accounts[6].key(), false), - AccountMeta::new(ctx.remaining_accounts[7].key(), false), - AccountMeta::new(ctx.remaining_accounts[8].key(), false), - AccountMeta::new(ctx.remaining_accounts[9].key(), false), - AccountMeta::new(ctx.remaining_accounts[10].key(), false), - AccountMeta::new(ctx.remaining_accounts[11].key(), false), - AccountMeta::new(ctx.remaining_accounts[12].key(), false), - AccountMeta::new(ctx.remaining_accounts[13].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[14].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[15].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[16].key(), false), - ]; + let accounts = load_remaining_accounts( + ctx.remaining_accounts, + vec![ + 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + ], + ); let ix = Instruction { program_id: ctx.accounts.base_program_id.key(), @@ -147,19 +112,11 @@ pub mod adapter_friktion { load_token_account_and_balance(ctx.remaining_accounts, 5); let data = sighash("global", "cancel_pending_withdrawal").to_vec(); - let accounts = vec![ - AccountMeta::new(ctx.remaining_accounts[0].key(), true), - AccountMeta::new_readonly(ctx.remaining_accounts[1].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[2].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[3].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[4].key(), false), - AccountMeta::new(ctx.remaining_accounts[5].key(), false), - AccountMeta::new(ctx.remaining_accounts[6].key(), false), - AccountMeta::new(ctx.remaining_accounts[7].key(), false), - AccountMeta::new(ctx.remaining_accounts[8].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[9].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[10].key(), false), - ]; + + let accounts = load_remaining_accounts( + ctx.remaining_accounts, + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + ); let ix = Instruction { program_id: ctx.accounts.base_program_id.key(), @@ -198,19 +155,10 @@ pub mod adapter_friktion { load_token_account_and_balance(ctx.remaining_accounts, 4); let data = sighash("global", "cancel_pending_deposit").to_vec(); - let accounts = vec![ - AccountMeta::new_readonly(ctx.remaining_accounts[0].key(), true), - AccountMeta::new_readonly(ctx.remaining_accounts[1].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[2].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[3].key(), false), - AccountMeta::new(ctx.remaining_accounts[4].key(), false), - AccountMeta::new(ctx.remaining_accounts[5].key(), false), - AccountMeta::new(ctx.remaining_accounts[6].key(), false), - AccountMeta::new(ctx.remaining_accounts[7].key(), false), - AccountMeta::new(ctx.remaining_accounts[8].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[9].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[10].key(), false), - ]; + let accounts = load_remaining_accounts( + ctx.remaining_accounts, + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + ); let ix = Instruction { program_id: ctx.accounts.base_program_id.key(), @@ -249,19 +197,11 @@ pub mod adapter_friktion { load_token_account_and_balance(ctx.remaining_accounts, 5); let data = sighash("global", "claim_pending_withdrawal").to_vec(); - let accounts = vec![ - AccountMeta::new(ctx.remaining_accounts[0].key(), true), - AccountMeta::new_readonly(ctx.remaining_accounts[1].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[2].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[3].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[4].key(), false), - AccountMeta::new(ctx.remaining_accounts[5].key(), false), - AccountMeta::new(ctx.remaining_accounts[6].key(), false), - AccountMeta::new(ctx.remaining_accounts[7].key(), false), - AccountMeta::new(ctx.remaining_accounts[8].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[9].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[10].key(), false), - ]; + + let accounts = load_remaining_accounts( + ctx.remaining_accounts, + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + ); let ix = Instruction { program_id: ctx.accounts.base_program_id.key(), @@ -300,18 +240,8 @@ pub mod adapter_friktion { load_token_account_and_balance(ctx.remaining_accounts, 4); let data = sighash("global", "claim_pending_deposit").to_vec(); - let accounts = vec![ - AccountMeta::new(ctx.remaining_accounts[0].key(), true), - AccountMeta::new_readonly(ctx.remaining_accounts[1].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[2].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[3].key(), false), - AccountMeta::new(ctx.remaining_accounts[4].key(), false), - AccountMeta::new(ctx.remaining_accounts[5].key(), false), - AccountMeta::new(ctx.remaining_accounts[6].key(), false), - AccountMeta::new(ctx.remaining_accounts[7].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[8].key(), false), - AccountMeta::new_readonly(ctx.remaining_accounts[9].key(), false), - ]; + let accounts = + load_remaining_accounts(ctx.remaining_accounts, vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); let ix = Instruction { program_id: ctx.accounts.base_program_id.key(), @@ -499,49 +429,3 @@ impl From for FinalizeWithdrawOutputTuple { (withdraw_amount, dummy_2, dummy_3, dummy_4) } } - -#[error_code] -pub enum ErrorCode { - #[msg("Unsupported Action")] - UnsupportedAction, -} - -pub fn sighash(namespace: &str, name: &str) -> [u8; 8] { - let preimage = format!("{}:{}", namespace, name); - let mut sighash = [0u8; 8]; - - sighash.copy_from_slice(&hash(preimage.as_bytes()).to_bytes()[..8]); - sighash -} - -pub fn load_token_account_and_balance<'info>( - remaining_accounts: &[AccountInfo<'info>], - account_index: usize, -) -> TokenAccountAndBalance<'info> { - let token_account_info = &remaining_accounts[account_index]; - let token_account = Account::::try_from(token_account_info).unwrap(); - let balance_before = token_account.amount.clone(); - return TokenAccountAndBalance { - token_accout: token_account, - balance_before: balance_before, - }; // (token_account.clone(), token_account.amount.clone()); -} - -pub struct TokenAccountAndBalance<'info> { - token_accout: Account<'info, TokenAccount>, - balance_before: u64, -} -impl<'info> TokenAccountAndBalance<'info> { - pub fn get_balance_change(&mut self) -> u64 { - self.token_accout.reload().unwrap(); - let balance_before = self.balance_before; - let balance_after = self.token_accout.amount; - if balance_after > balance_before { - balance_after.checked_sub(balance_before).unwrap() - } else if balance_after == balance_before { - 0_u64 - } else { - balance_before.checked_sub(balance_after).unwrap() - } - } -} diff --git a/programs/adapter-katana/Cargo.toml b/programs/adapter-katana/Cargo.toml index 450435f..0d7ce91 100644 --- a/programs/adapter-katana/Cargo.toml +++ b/programs/adapter-katana/Cargo.toml @@ -16,4 +16,4 @@ cpi = ["no-entrypoint"] [dependencies] anchor-lang = "0.24.2" -anchor-spl = "0.24.2" +adapter-common = { path = "../../adapter_common",version= "0.1.0" } \ No newline at end of file diff --git a/programs/adapter-katana/src/lib.rs b/programs/adapter-katana/src/lib.rs index 05cca6e..40e4cf7 100644 --- a/programs/adapter-katana/src/lib.rs +++ b/programs/adapter-katana/src/lib.rs @@ -1,11 +1,10 @@ +use adapter_common::{load_token_account_and_balance, sighash}; use anchor_lang::prelude::*; use anchor_lang::solana_program::{ - hash::hash, instruction::{AccountMeta, Instruction}, program::invoke, pubkey::Pubkey, }; -use anchor_spl::token::TokenAccount; declare_id!("ADPTwDKJTizC3V8gZXDxt5uLjJv4pBnh1nTTf9dZJnS2"); @@ -293,20 +292,6 @@ pub struct GatewayStateWrapper { pub pool_direction: u8, } -#[error_code] -pub enum ErrorCode { - #[msg("Unsupported Action")] - UnsupportedAction, -} - -pub fn sighash(namespace: &str, name: &str) -> [u8; 8] { - let preimage = format!("{}:{}", namespace, name); - let mut sighash = [0u8; 8]; - - sighash.copy_from_slice(&hash(preimage.as_bytes()).to_bytes()[..8]); - sighash -} - #[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug, Default)] pub struct InitiateDepositInputWrapper { pub deposit_amount: u64, @@ -438,35 +423,3 @@ impl From for FinalizeWithdrawOutputTuple { (withdraw_amount, dummy_2, dummy_3, dummy_4) } } - -pub fn load_token_account_and_balance<'info>( - remaining_accounts: &[AccountInfo<'info>], - account_index: usize, -) -> TokenAccountAndBalance<'info> { - let token_account_info = &remaining_accounts[account_index]; - let token_account = Account::::try_from(token_account_info).unwrap(); - let balance_before = token_account.amount.clone(); - return TokenAccountAndBalance { - token_accout: token_account, - balance_before: balance_before, - }; // (token_account.clone(), token_account.amount.clone()); -} - -pub struct TokenAccountAndBalance<'info> { - token_accout: Account<'info, TokenAccount>, - balance_before: u64, -} -impl<'info> TokenAccountAndBalance<'info> { - pub fn get_balance_change(&mut self) -> u64 { - self.token_accout.reload().unwrap(); - let balance_before = self.balance_before; - let balance_after = self.token_accout.amount; - if balance_after > balance_before { - balance_after.checked_sub(balance_before).unwrap() - } else if balance_after == balance_before { - 0_u64 - } else { - balance_before.checked_sub(balance_after).unwrap() - } - } -} diff --git a/programs/adapter-lifinity/Cargo.toml b/programs/adapter-lifinity/Cargo.toml index e8d449b..11c29cd 100644 --- a/programs/adapter-lifinity/Cargo.toml +++ b/programs/adapter-lifinity/Cargo.toml @@ -17,3 +17,4 @@ cpi = ["no-entrypoint"] [dependencies] anchor-lang = "0.24.2" anchor-spl = "0.24.2" +adapter-common = { path = "../../adapter_common",version= "0.1.0" } \ No newline at end of file diff --git a/programs/adapter-lifinity/src/lib.rs b/programs/adapter-lifinity/src/lib.rs index ebf5d0d..91b4b43 100644 --- a/programs/adapter-lifinity/src/lib.rs +++ b/programs/adapter-lifinity/src/lib.rs @@ -1,6 +1,6 @@ +use adapter_common::sighash; use anchor_lang::prelude::*; use anchor_lang::solana_program::{ - hash::hash, instruction::{AccountMeta, Instruction}, program::invoke, pubkey::Pubkey, @@ -380,11 +380,3 @@ impl From for RemoveLiquidityOutputTuple { (token_a_amount, token_b_amount, lp_amount, dummy_4) } } - -pub fn sighash(namespace: &str, name: &str) -> [u8; 8] { - let preimage = format!("{}:{}", namespace, name); - let mut sighash = [0u8; 8]; - - sighash.copy_from_slice(&hash(preimage.as_bytes()).to_bytes()[..8]); - sighash -} diff --git a/programs/adapter-nft-finance/Cargo.toml b/programs/adapter-nft-finance/Cargo.toml index 532c210..f563abe 100644 --- a/programs/adapter-nft-finance/Cargo.toml +++ b/programs/adapter-nft-finance/Cargo.toml @@ -21,3 +21,4 @@ overflow-checks = true [dependencies] anchor-lang = "0.24.2" anchor-spl = "0.24.2" +adapter-common = { path = "../../adapter_common",version= "0.1.0" } \ No newline at end of file diff --git a/programs/adapter-nft-finance/src/lib.rs b/programs/adapter-nft-finance/src/lib.rs index 8f35f6a..6e4d5e4 100644 --- a/programs/adapter-nft-finance/src/lib.rs +++ b/programs/adapter-nft-finance/src/lib.rs @@ -1,6 +1,6 @@ +use adapter_common::sighash; use anchor_lang::prelude::*; use anchor_lang::solana_program::{ - hash::hash, instruction::{AccountMeta, Instruction}, program::invoke, pubkey::Pubkey, @@ -449,19 +449,3 @@ impl From for ClaimOutputTuple { (reward_token_amount, dummy_2, dummy_3, dummy_4) } } - -#[error_code] -pub enum ErrorCode { - #[msg("Unsupported PoolDirection")] - UnsupportedPoolDirection, - #[msg("Unsupported Action")] - UnsupportedAction, -} - -pub fn sighash(namespace: &str, name: &str) -> [u8; 8] { - let preimage = format!("{}:{}", namespace, name); - let mut sighash = [0u8; 8]; - - sighash.copy_from_slice(&hash(preimage.as_bytes()).to_bytes()[..8]); - sighash -} diff --git a/programs/adapter-orca/Cargo.toml b/programs/adapter-orca/Cargo.toml index f643c17..ccced27 100644 --- a/programs/adapter-orca/Cargo.toml +++ b/programs/adapter-orca/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "adapter-orca" +name = "adapter_orca" version = "0.1.0" description = "Created with Anchor" edition = "2021" @@ -16,4 +16,4 @@ cpi = ["no-entrypoint"] [dependencies] anchor-lang = "0.24.2" -anchor-spl = "0.24.2" +adapter-common = { path = "../../adapter_common",version= "0.1.0" } \ No newline at end of file diff --git a/programs/adapter-orca/src/lib.rs b/programs/adapter-orca/src/lib.rs index f9c87fc..79c8482 100644 --- a/programs/adapter-orca/src/lib.rs +++ b/programs/adapter-orca/src/lib.rs @@ -1,10 +1,6 @@ +use adapter_common::{load_remaining_accounts, load_token_account_and_balance, ErrorCode}; use anchor_lang::prelude::*; -use anchor_lang::solana_program::{ - instruction::{AccountMeta, Instruction}, - program::invoke, - pubkey::Pubkey, -}; -use anchor_spl::token::TokenAccount; +use anchor_lang::solana_program::{instruction::Instruction, program::invoke, pubkey::Pubkey}; declare_id!("ADPTTyNqameXftbqsxwXhbs7v7XP8E82YMaUStPgjmU5"); @@ -320,14 +316,6 @@ pub struct Action<'info> { pub base_program_id: AccountInfo<'info>, } -#[error_code] -pub enum ErrorCode { - #[msg("Unsupported PoolDirection")] - UnsupportedPoolDirection, - #[msg("Unsupported Action")] - UnsupportedAction, -} - #[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)] pub struct AddLiquidityInputWrapper { pub token_in_amount: u64, @@ -455,57 +443,3 @@ impl From for HarvestOutputTuple { (reward_amount, dummy_2, dummy_3, dummy_4) } } - -pub fn load_token_account_and_balance<'info>( - remaining_accounts: &[AccountInfo<'info>], - account_index: usize, -) -> TokenAccountAndBalance<'info> { - let token_account_info = &remaining_accounts[account_index]; - let token_account = Account::::try_from(token_account_info).unwrap(); - let balance_before = token_account.amount.clone(); - return TokenAccountAndBalance { - token_accout: token_account, - balance_before: balance_before, - }; -} - -pub struct TokenAccountAndBalance<'info> { - token_accout: Account<'info, TokenAccount>, - balance_before: u64, -} - -impl<'info> TokenAccountAndBalance<'info> { - pub fn get_balance_change(&mut self) -> u64 { - self.token_accout.reload().unwrap(); - let balance_before = self.balance_before; - let balance_after = self.token_accout.amount; - if balance_after > balance_before { - balance_after.checked_sub(balance_before).unwrap() - } else if balance_after == balance_before { - 0_u64 - } else { - balance_before.checked_sub(balance_after).unwrap() - } - } -} - -pub fn load_remaining_accounts<'info>( - remaining_accounts: &[AccountInfo<'info>], - index_array: Vec, -) -> Vec { - let mut accounts: Vec = vec![]; - for index in index_array.iter() { - if remaining_accounts[*index].is_writable { - accounts.push(AccountMeta::new( - remaining_accounts[*index].key(), - remaining_accounts[*index].is_signer, - )) - } else { - accounts.push(AccountMeta::new_readonly( - remaining_accounts[*index].key(), - remaining_accounts[*index].is_signer, - )) - } - } - return accounts; -} diff --git a/programs/adapter-raydium/Cargo.toml b/programs/adapter-raydium/Cargo.toml index be97593..3d736f7 100644 --- a/programs/adapter-raydium/Cargo.toml +++ b/programs/adapter-raydium/Cargo.toml @@ -18,3 +18,4 @@ default = [] [dependencies] anchor-lang = "0.24.2" anchor-spl = "0.24.2" +adapter-common = { path = "../../adapter_common",version= "0.1.0" } \ No newline at end of file diff --git a/programs/adapter-raydium/src/lib.rs b/programs/adapter-raydium/src/lib.rs index dba73d0..c601c5c 100644 --- a/programs/adapter-raydium/src/lib.rs +++ b/programs/adapter-raydium/src/lib.rs @@ -1,6 +1,6 @@ +use adapter_common::ErrorCode; use anchor_lang::prelude::*; use anchor_lang::solana_program::{ - hash::hash, instruction::{AccountMeta, Instruction}, program::invoke, pubkey::Pubkey, @@ -655,19 +655,3 @@ impl From for HarvestOutputTuple { (reward_a_amount, reward_b_amount, dummy_3, dummy_4) } } - -#[error_code] -pub enum ErrorCode { - #[msg("Unsupported PoolDirection")] - UnsupportedPoolDirection, - #[msg("Unsupported Action Version")] - UnsupportedVersion, -} - -pub fn sighash(namespace: &str, name: &str) -> [u8; 8] { - let preimage = format!("{}:{}", namespace, name); - let mut sighash = [0u8; 8]; - - sighash.copy_from_slice(&hash(preimage.as_bytes()).to_bytes()[..8]); - sighash -} diff --git a/programs/adapter-saber/Cargo.toml b/programs/adapter-saber/Cargo.toml index 117cfb2..c66d26c 100644 --- a/programs/adapter-saber/Cargo.toml +++ b/programs/adapter-saber/Cargo.toml @@ -17,3 +17,4 @@ cpi = ["no-entrypoint"] [dependencies] anchor-lang = "0.24.2" anchor-spl = "0.24.2" +adapter-common = { path = "../../adapter_common",version= "0.1.0" } \ No newline at end of file diff --git a/programs/adapter-saber/src/lib.rs b/programs/adapter-saber/src/lib.rs index b154776..21bde38 100644 --- a/programs/adapter-saber/src/lib.rs +++ b/programs/adapter-saber/src/lib.rs @@ -1,6 +1,6 @@ +use adapter_common::{sighash, ErrorCode}; use anchor_lang::prelude::*; use anchor_lang::solana_program::{ - hash::hash, instruction::{AccountMeta, Instruction}, program::invoke, pubkey::Pubkey, @@ -540,19 +540,3 @@ impl From for HarvestOutputTuple { (dummy_1, dummy_2, dummy_3, dummy_4) } } - -#[error_code] -pub enum ErrorCode { - #[msg("Unsupported PoolDirection")] - UnsupportedPoolDirection, - #[msg("Unsupported Action")] - UnsupportedAction, -} - -pub fn sighash(namespace: &str, name: &str) -> [u8; 8] { - let preimage = format!("{}:{}", namespace, name); - let mut sighash = [0u8; 8]; - - sighash.copy_from_slice(&hash(preimage.as_bytes()).to_bytes()[..8]); - sighash -} diff --git a/programs/adapter-tulip/Cargo.toml b/programs/adapter-tulip/Cargo.toml index 7f77707..8156646 100644 --- a/programs/adapter-tulip/Cargo.toml +++ b/programs/adapter-tulip/Cargo.toml @@ -17,6 +17,7 @@ cpi = ["no-entrypoint"] [dependencies] anchor-lang = "0.24.2" anchor-spl = "0.24.2" +adapter-common = { path = "../../adapter_common",version= "0.1.0" } spl-associated-token-account = "1.0.3" hex = "0.4.3" tulip-arrform = "0.1.2" diff --git a/programs/adapter-tulip/src/lib.rs b/programs/adapter-tulip/src/lib.rs index e096cfe..e5ae11d 100644 --- a/programs/adapter-tulip/src/lib.rs +++ b/programs/adapter-tulip/src/lib.rs @@ -1,6 +1,6 @@ +use adapter_common::{load_remaining_accounts, load_token_account_and_balance, sighash, ErrorCode}; use anchor_lang::prelude::*; use anchor_lang::solana_program::{ - hash::hash, instruction::{AccountMeta, Instruction}, program::invoke, pubkey::Pubkey, @@ -559,75 +559,6 @@ impl From for UnsupplyOutputTuple { } } -#[error_code] -pub enum ErrorCode { - #[msg("Unsupported Vault Protocol")] - UnsupportedVaultProtocol, - #[msg("Index might out of bound, currently only support 30 addresses")] - IndexOutOfBound, -} - -pub fn sighash(namespace: &str, name: &str) -> [u8; 8] { - let preimage = format!("{}:{}", namespace, name); - let mut sighash = [0u8; 8]; - - sighash.copy_from_slice(&hash(preimage.as_bytes()).to_bytes()[..8]); - sighash -} -pub fn load_token_account_and_balance<'info>( - remaining_accounts: &[AccountInfo<'info>], - account_index: usize, -) -> TokenAccountAndBalance<'info> { - let token_account_info = &remaining_accounts[account_index]; - let token_account = Account::::try_from(token_account_info).unwrap(); - let balance_before = token_account.amount.clone(); - return TokenAccountAndBalance { - token_account, - balance_before, - }; -} - -pub struct TokenAccountAndBalance<'info> { - token_account: Account<'info, TokenAccount>, - balance_before: u64, -} - -impl<'info> TokenAccountAndBalance<'info> { - pub fn get_balance_change(&mut self) -> u64 { - self.token_account.reload().unwrap(); - let balance_before = self.balance_before; - let balance_after = self.token_account.amount; - if balance_after > balance_before { - balance_after.checked_sub(balance_before).unwrap() - } else if balance_after == balance_before { - 0_u64 - } else { - balance_before.checked_sub(balance_after).unwrap() - } - } -} - -pub fn load_remaining_accounts<'info>( - remaining_accounts: &[AccountInfo<'info>], - index_array: Vec, -) -> Vec { - let mut accounts: Vec = vec![]; - for index in index_array.iter() { - if remaining_accounts[*index].is_writable { - accounts.push(AccountMeta::new( - remaining_accounts[*index].key(), - remaining_accounts[*index].is_signer, - )) - } else { - accounts.push(AccountMeta::new_readonly( - remaining_accounts[*index].key(), - remaining_accounts[*index].is_signer, - )) - } - } - return accounts; -} - pub fn get_account_info_array<'info>( remaining_accounts: &[AccountInfo<'info>], index_array: Vec, From aa3849a34cbf9ca400317476a0d2e5d300fe2d34 Mon Sep 17 00:00:00 2001 From: Wei Date: Fri, 6 Jan 2023 16:13:19 +0800 Subject: [PATCH 4/5] update IDL --- target/idl/adapter_friktion.json | 7 ------- target/idl/adapter_katana.json | 7 ------- target/idl/adapter_nft_finance.json | 12 ------------ target/idl/adapter_orca.json | 12 ------------ target/idl/adapter_raydium.json | 12 ------------ target/idl/adapter_saber.json | 12 ------------ target/idl/adapter_tulip.json | 12 ------------ target/types/adapter_friktion.ts | 14 -------------- target/types/adapter_katana.ts | 14 -------------- target/types/adapter_nft_finance.ts | 24 ------------------------ target/types/adapter_orca.ts | 24 ------------------------ target/types/adapter_raydium.ts | 24 ------------------------ target/types/adapter_saber.ts | 24 ------------------------ target/types/adapter_tulip.ts | 24 ------------------------ 14 files changed, 222 deletions(-) diff --git a/target/idl/adapter_friktion.json b/target/idl/adapter_friktion.json index 0c0e4b6..567be79 100644 --- a/target/idl/adapter_friktion.json +++ b/target/idl/adapter_friktion.json @@ -326,12 +326,5 @@ ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedAction", - "msg": "Unsupported Action" - } ] } \ No newline at end of file diff --git a/target/idl/adapter_katana.json b/target/idl/adapter_katana.json index 3a084b5..62e62e1 100644 --- a/target/idl/adapter_katana.json +++ b/target/idl/adapter_katana.json @@ -355,12 +355,5 @@ ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedAction", - "msg": "Unsupported Action" - } ] } \ No newline at end of file diff --git a/target/idl/adapter_nft_finance.json b/target/idl/adapter_nft_finance.json index 447d490..4844fa0 100644 --- a/target/idl/adapter_nft_finance.json +++ b/target/idl/adapter_nft_finance.json @@ -274,17 +274,5 @@ ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedPoolDirection", - "msg": "Unsupported PoolDirection" - }, - { - "code": 6001, - "name": "UnsupportedAction", - "msg": "Unsupported Action" - } ] } \ No newline at end of file diff --git a/target/idl/adapter_orca.json b/target/idl/adapter_orca.json index 673b73f..6c952b0 100644 --- a/target/idl/adapter_orca.json +++ b/target/idl/adapter_orca.json @@ -288,17 +288,5 @@ ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedPoolDirection", - "msg": "Unsupported PoolDirection" - }, - { - "code": 6001, - "name": "UnsupportedAction", - "msg": "Unsupported Action" - } ] } \ No newline at end of file diff --git a/target/idl/adapter_raydium.json b/target/idl/adapter_raydium.json index 918e37a..85ef18b 100644 --- a/target/idl/adapter_raydium.json +++ b/target/idl/adapter_raydium.json @@ -880,17 +880,5 @@ ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedPoolDirection", - "msg": "Unsupported PoolDirection" - }, - { - "code": 6001, - "name": "UnsupportedVersion", - "msg": "Unsupported Action Version" - } ] } \ No newline at end of file diff --git a/target/idl/adapter_saber.json b/target/idl/adapter_saber.json index 1dffb37..396bb05 100644 --- a/target/idl/adapter_saber.json +++ b/target/idl/adapter_saber.json @@ -306,17 +306,5 @@ ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedPoolDirection", - "msg": "Unsupported PoolDirection" - }, - { - "code": 6001, - "name": "UnsupportedAction", - "msg": "Unsupported Action" - } ] } \ No newline at end of file diff --git a/target/idl/adapter_tulip.json b/target/idl/adapter_tulip.json index 974151a..25bfb7f 100644 --- a/target/idl/adapter_tulip.json +++ b/target/idl/adapter_tulip.json @@ -252,17 +252,5 @@ ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedVaultProtocol", - "msg": "Unsupported Vault Protocol" - }, - { - "code": 6001, - "name": "IndexOutOfBound", - "msg": "Index might out of bound, currently only support 30 addresses" - } ] } \ No newline at end of file diff --git a/target/types/adapter_friktion.ts b/target/types/adapter_friktion.ts index 8170f7b..265d886 100644 --- a/target/types/adapter_friktion.ts +++ b/target/types/adapter_friktion.ts @@ -326,13 +326,6 @@ export type AdapterFriktion = { ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedAction", - "msg": "Unsupported Action" - } ] }; @@ -664,12 +657,5 @@ export const IDL: AdapterFriktion = { ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedAction", - "msg": "Unsupported Action" - } ] }; diff --git a/target/types/adapter_katana.ts b/target/types/adapter_katana.ts index a591441..cd1f26b 100644 --- a/target/types/adapter_katana.ts +++ b/target/types/adapter_katana.ts @@ -355,13 +355,6 @@ export type AdapterKatana = { ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedAction", - "msg": "Unsupported Action" - } ] }; @@ -722,12 +715,5 @@ export const IDL: AdapterKatana = { ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedAction", - "msg": "Unsupported Action" - } ] }; diff --git a/target/types/adapter_nft_finance.ts b/target/types/adapter_nft_finance.ts index 5519e5f..ece91fd 100644 --- a/target/types/adapter_nft_finance.ts +++ b/target/types/adapter_nft_finance.ts @@ -274,18 +274,6 @@ export type AdapterNftFinance = { ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedPoolDirection", - "msg": "Unsupported PoolDirection" - }, - { - "code": 6001, - "name": "UnsupportedAction", - "msg": "Unsupported Action" - } ] }; @@ -565,17 +553,5 @@ export const IDL: AdapterNftFinance = { ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedPoolDirection", - "msg": "Unsupported PoolDirection" - }, - { - "code": 6001, - "name": "UnsupportedAction", - "msg": "Unsupported Action" - } ] }; diff --git a/target/types/adapter_orca.ts b/target/types/adapter_orca.ts index 2e254a9..8f6abd4 100644 --- a/target/types/adapter_orca.ts +++ b/target/types/adapter_orca.ts @@ -288,18 +288,6 @@ export type AdapterOrca = { ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedPoolDirection", - "msg": "Unsupported PoolDirection" - }, - { - "code": 6001, - "name": "UnsupportedAction", - "msg": "Unsupported Action" - } ] }; @@ -593,17 +581,5 @@ export const IDL: AdapterOrca = { ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedPoolDirection", - "msg": "Unsupported PoolDirection" - }, - { - "code": 6001, - "name": "UnsupportedAction", - "msg": "Unsupported Action" - } ] }; diff --git a/target/types/adapter_raydium.ts b/target/types/adapter_raydium.ts index 1adc5da..5b318cf 100644 --- a/target/types/adapter_raydium.ts +++ b/target/types/adapter_raydium.ts @@ -880,18 +880,6 @@ export type AdapterRaydium = { ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedPoolDirection", - "msg": "Unsupported PoolDirection" - }, - { - "code": 6001, - "name": "UnsupportedVersion", - "msg": "Unsupported Action Version" - } ] }; @@ -1777,17 +1765,5 @@ export const IDL: AdapterRaydium = { ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedPoolDirection", - "msg": "Unsupported PoolDirection" - }, - { - "code": 6001, - "name": "UnsupportedVersion", - "msg": "Unsupported Action Version" - } ] }; diff --git a/target/types/adapter_saber.ts b/target/types/adapter_saber.ts index 808d6bd..a5b6f5d 100644 --- a/target/types/adapter_saber.ts +++ b/target/types/adapter_saber.ts @@ -306,18 +306,6 @@ export type AdapterSaber = { ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedPoolDirection", - "msg": "Unsupported PoolDirection" - }, - { - "code": 6001, - "name": "UnsupportedAction", - "msg": "Unsupported Action" - } ] }; @@ -629,17 +617,5 @@ export const IDL: AdapterSaber = { ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedPoolDirection", - "msg": "Unsupported PoolDirection" - }, - { - "code": 6001, - "name": "UnsupportedAction", - "msg": "Unsupported Action" - } ] }; diff --git a/target/types/adapter_tulip.ts b/target/types/adapter_tulip.ts index e37afa6..ee0a648 100644 --- a/target/types/adapter_tulip.ts +++ b/target/types/adapter_tulip.ts @@ -252,18 +252,6 @@ export type AdapterTulip = { ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedVaultProtocol", - "msg": "Unsupported Vault Protocol" - }, - { - "code": 6001, - "name": "IndexOutOfBound", - "msg": "Index might out of bound, currently only support 30 addresses" - } ] }; @@ -521,17 +509,5 @@ export const IDL: AdapterTulip = { ] } } - ], - "errors": [ - { - "code": 6000, - "name": "UnsupportedVaultProtocol", - "msg": "Unsupported Vault Protocol" - }, - { - "code": 6001, - "name": "IndexOutOfBound", - "msg": "Index might out of bound, currently only support 30 addresses" - } ] }; From 4a8aa709246dacdd4d26ab94e32c5fc18eecbee3 Mon Sep 17 00:00:00 2001 From: Wei Date: Fri, 6 Jan 2023 16:13:35 +0800 Subject: [PATCH 5/5] update cargo lock --- Cargo.lock | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c643f19..8b6918c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,7 +3,7 @@ version = 3 [[package]] -name = "adapter-francium" +name = "adapter-common" version = "0.1.0" dependencies = [ "anchor-lang", @@ -11,7 +11,7 @@ dependencies = [ ] [[package]] -name = "adapter-friktion" +name = "adapter-francium" version = "0.1.0" dependencies = [ "anchor-lang", @@ -19,23 +19,23 @@ dependencies = [ ] [[package]] -name = "adapter-katana" +name = "adapter-friktion" version = "0.1.0" dependencies = [ + "adapter-common", "anchor-lang", - "anchor-spl", ] [[package]] -name = "adapter-larix" +name = "adapter-katana" version = "0.1.0" dependencies = [ + "adapter-common", "anchor-lang", - "anchor-spl", ] [[package]] -name = "adapter-lifinity" +name = "adapter-larix" version = "0.1.0" dependencies = [ "anchor-lang", @@ -43,17 +43,19 @@ dependencies = [ ] [[package]] -name = "adapter-nft-finance" +name = "adapter-lifinity" version = "0.1.0" dependencies = [ + "adapter-common", "anchor-lang", "anchor-spl", ] [[package]] -name = "adapter-orca" +name = "adapter-nft-finance" version = "0.1.0" dependencies = [ + "adapter-common", "anchor-lang", "anchor-spl", ] @@ -62,6 +64,7 @@ dependencies = [ name = "adapter-raydium" version = "0.1.0" dependencies = [ + "adapter-common", "anchor-lang", "anchor-spl", ] @@ -70,6 +73,7 @@ dependencies = [ name = "adapter-saber" version = "0.1.0" dependencies = [ + "adapter-common", "anchor-lang", "anchor-spl", ] @@ -86,6 +90,7 @@ dependencies = [ name = "adapter-tulip" version = "0.1.0" dependencies = [ + "adapter-common", "anchor-lang", "anchor-spl", "arrayref", @@ -102,6 +107,14 @@ dependencies = [ "uint", ] +[[package]] +name = "adapter_orca" +version = "0.1.0" +dependencies = [ + "adapter-common", + "anchor-lang", +] + [[package]] name = "ahash" version = "0.7.6"