Skip to content

Commit f83240a

Browse files
authored
token-swap: Prevent single deposits for curves that don't allow it (solana-labs#2590)
1 parent d5581db commit f83240a

File tree

1 file changed

+72
-1
lines changed

1 file changed

+72
-1
lines changed

token-swap/program/src/processor.rs

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,10 @@ impl Processor {
744744
let token_program_info = next_account_info(account_info_iter)?;
745745

746746
let token_swap = SwapVersion::unpack(&swap_info.data.borrow())?;
747+
let calculator = &token_swap.swap_curve().calculator;
748+
if !calculator.allows_deposits() {
749+
return Err(SwapError::UnsupportedCurveOperation.into());
750+
}
747751
let source_account =
748752
Self::unpack_token_account(source_info, token_swap.token_program_id())?;
749753
let swap_token_a =
@@ -793,7 +797,7 @@ impl Processor {
793797
)
794798
.ok_or(SwapError::ZeroTradingTokens)?
795799
} else {
796-
token_swap.swap_curve().calculator.new_pool_supply()
800+
calculator.new_pool_supply()
797801
};
798802

799803
let pool_token_amount = to_u64(pool_token_amount)?;
@@ -6855,4 +6859,71 @@ mod tests {
68556859
)
68566860
.unwrap();
68576861
}
6862+
6863+
#[test]
6864+
fn test_deposits_allowed_single_token() {
6865+
let trade_fee_numerator = 1;
6866+
let trade_fee_denominator = 10;
6867+
let owner_trade_fee_numerator = 1;
6868+
let owner_trade_fee_denominator = 30;
6869+
let owner_withdraw_fee_numerator = 0;
6870+
let owner_withdraw_fee_denominator = 30;
6871+
let host_fee_numerator = 10;
6872+
let host_fee_denominator = 100;
6873+
6874+
let token_a_amount = 1_000_000;
6875+
let token_b_amount = 0;
6876+
let fees = Fees {
6877+
trade_fee_numerator,
6878+
trade_fee_denominator,
6879+
owner_trade_fee_numerator,
6880+
owner_trade_fee_denominator,
6881+
owner_withdraw_fee_numerator,
6882+
owner_withdraw_fee_denominator,
6883+
host_fee_numerator,
6884+
host_fee_denominator,
6885+
};
6886+
6887+
let token_b_offset = 2_000_000;
6888+
let swap_curve = SwapCurve {
6889+
curve_type: CurveType::Offset,
6890+
calculator: Box::new(OffsetCurve { token_b_offset }),
6891+
};
6892+
let creator_key = Pubkey::new_unique();
6893+
let depositor_key = Pubkey::new_unique();
6894+
6895+
let mut accounts = SwapAccountInfo::new(
6896+
&creator_key,
6897+
fees,
6898+
swap_curve,
6899+
token_a_amount,
6900+
token_b_amount,
6901+
);
6902+
6903+
accounts.initialize_swap().unwrap();
6904+
6905+
let initial_a = 1_000_000;
6906+
let initial_b = 2_000_000;
6907+
let (
6908+
_depositor_token_a_key,
6909+
_depositor_token_a_account,
6910+
depositor_token_b_key,
6911+
mut depositor_token_b_account,
6912+
depositor_pool_key,
6913+
mut depositor_pool_account,
6914+
) = accounts.setup_token_accounts(&creator_key, &depositor_key, initial_a, initial_b, 0);
6915+
6916+
assert_eq!(
6917+
Err(SwapError::UnsupportedCurveOperation.into()),
6918+
accounts.deposit_single_token_type_exact_amount_in(
6919+
&depositor_key,
6920+
&depositor_token_b_key,
6921+
&mut depositor_token_b_account,
6922+
&depositor_pool_key,
6923+
&mut depositor_pool_account,
6924+
initial_b,
6925+
0,
6926+
)
6927+
);
6928+
}
68586929
}

0 commit comments

Comments
 (0)