Perp ix: Mention and reference important constraints
This commit is contained in:
parent
f16f1a6c92
commit
2db617cea5
|
@ -14,6 +14,7 @@ pub struct PerpCancelAllOrders<'info> {
|
|||
mut,
|
||||
has_one = group,
|
||||
constraint = account.load()?.is_operational() @ MangoError::AccountIsFrozen
|
||||
// owner is checked at #1
|
||||
)]
|
||||
pub account: AccountLoader<'info, MangoAccountFixed>,
|
||||
pub owner: Signer<'info>,
|
||||
|
@ -33,6 +34,7 @@ pub struct PerpCancelAllOrders<'info> {
|
|||
|
||||
pub fn perp_cancel_all_orders(ctx: Context<PerpCancelAllOrders>, limit: u8) -> Result<()> {
|
||||
let mut account = ctx.accounts.account.load_full_mut()?;
|
||||
// account constraint #1
|
||||
require!(
|
||||
account.fixed.is_owner_or_delegate(ctx.accounts.owner.key()),
|
||||
MangoError::SomeError
|
||||
|
|
|
@ -16,6 +16,7 @@ pub struct PerpCancelAllOrdersBySide<'info> {
|
|||
mut,
|
||||
has_one = group,
|
||||
constraint = account.load()?.is_operational() @ MangoError::AccountIsFrozen
|
||||
// owner is checked at #1
|
||||
)]
|
||||
pub account: AccountLoader<'info, MangoAccountFixed>,
|
||||
pub owner: Signer<'info>,
|
||||
|
@ -39,6 +40,7 @@ pub fn perp_cancel_all_orders_by_side(
|
|||
limit: u8,
|
||||
) -> Result<()> {
|
||||
let mut account = ctx.accounts.account.load_full_mut()?;
|
||||
// account constraint #1
|
||||
require!(
|
||||
account.fixed.is_owner_or_delegate(ctx.accounts.owner.key()),
|
||||
MangoError::SomeError
|
||||
|
|
|
@ -14,6 +14,7 @@ pub struct PerpCancelOrder<'info> {
|
|||
mut,
|
||||
has_one = group,
|
||||
constraint = account.load()?.is_operational() @ MangoError::AccountIsFrozen
|
||||
// owner is checked at #1
|
||||
)]
|
||||
pub account: AccountLoader<'info, MangoAccountFixed>,
|
||||
pub owner: Signer<'info>,
|
||||
|
@ -33,6 +34,7 @@ pub struct PerpCancelOrder<'info> {
|
|||
|
||||
pub fn perp_cancel_order(ctx: Context<PerpCancelOrder>, order_id: u128) -> Result<()> {
|
||||
let mut account = ctx.accounts.account.load_full_mut()?;
|
||||
// account constraint #1
|
||||
require!(
|
||||
account.fixed.is_owner_or_delegate(ctx.accounts.owner.key()),
|
||||
MangoError::SomeError
|
||||
|
|
|
@ -14,6 +14,7 @@ pub struct PerpCancelOrderByClientOrderId<'info> {
|
|||
mut,
|
||||
has_one = group,
|
||||
constraint = account.load()?.is_operational() @ MangoError::AccountIsFrozen
|
||||
// owner is checked at #1
|
||||
)]
|
||||
pub account: AccountLoader<'info, MangoAccountFixed>,
|
||||
pub owner: Signer<'info>,
|
||||
|
@ -36,6 +37,7 @@ pub fn perp_cancel_order_by_client_order_id(
|
|||
client_order_id: u64,
|
||||
) -> Result<()> {
|
||||
let mut account = ctx.accounts.account.load_full_mut()?;
|
||||
// account constraint #1
|
||||
require!(
|
||||
account.fixed.is_owner_or_delegate(ctx.accounts.owner.key()),
|
||||
MangoError::SomeError
|
||||
|
|
|
@ -20,6 +20,7 @@ pub struct PerpPlaceOrder<'info> {
|
|||
mut,
|
||||
has_one = group,
|
||||
constraint = account.load()?.is_operational() @ MangoError::AccountIsFrozen
|
||||
// owner is checked at #1
|
||||
)]
|
||||
pub account: AccountLoader<'info, MangoAccountFixed>,
|
||||
pub owner: Signer<'info>,
|
||||
|
@ -73,6 +74,7 @@ pub fn perp_place_order(ctx: Context<PerpPlaceOrder>, mut order: Order, limit: u
|
|||
}
|
||||
|
||||
let mut account = ctx.accounts.account.load_full_mut()?;
|
||||
// account constraint #1
|
||||
require!(
|
||||
account.fixed.is_owner_or_delegate(ctx.accounts.owner.key()),
|
||||
MangoError::SomeError
|
||||
|
|
|
@ -31,6 +31,7 @@ pub struct PerpSettleFees<'info> {
|
|||
/// CHECK: Oracle can have different account types, constrained by address in perp_market
|
||||
pub oracle: UncheckedAccount<'info>,
|
||||
|
||||
// bank correctness is checked at #2
|
||||
#[account(mut, has_one = group)]
|
||||
pub settle_bank: AccountLoader<'info, Bank>,
|
||||
|
||||
|
@ -47,12 +48,12 @@ pub fn perp_settle_fees(ctx: Context<PerpSettleFees>, max_settle_amount: u64) ->
|
|||
);
|
||||
|
||||
let mut account = ctx.accounts.account.load_full_mut()?;
|
||||
let mut bank = ctx.accounts.settle_bank.load_mut()?;
|
||||
let mut settle_bank = ctx.accounts.settle_bank.load_mut()?;
|
||||
let mut perp_market = ctx.accounts.perp_market.load_mut()?;
|
||||
|
||||
// Verify that the bank is the quote currency bank
|
||||
// Verify that the bank is the quote currency bank (#2)
|
||||
require_eq!(
|
||||
bank.token_index,
|
||||
settle_bank.token_index,
|
||||
perp_market.settle_token_index,
|
||||
MangoError::InvalidBank
|
||||
);
|
||||
|
@ -118,7 +119,7 @@ pub fn perp_settle_fees(ctx: Context<PerpSettleFees>, max_settle_amount: u64) ->
|
|||
let token_position = account
|
||||
.token_position_mut(perp_market.settle_token_index)?
|
||||
.0;
|
||||
bank.withdraw_without_fee(
|
||||
settle_bank.withdraw_without_fee(
|
||||
token_position,
|
||||
settlement,
|
||||
Clock::get()?.unix_timestamp.try_into().unwrap(),
|
||||
|
@ -132,8 +133,8 @@ pub fn perp_settle_fees(ctx: Context<PerpSettleFees>, max_settle_amount: u64) ->
|
|||
mango_account: ctx.accounts.account.key(),
|
||||
token_index: perp_market.settle_token_index,
|
||||
indexed_position: token_position.indexed_position.to_bits(),
|
||||
deposit_index: bank.deposit_index.to_bits(),
|
||||
borrow_index: bank.borrow_index.to_bits(),
|
||||
deposit_index: settle_bank.deposit_index.to_bits(),
|
||||
borrow_index: settle_bank.borrow_index.to_bits(),
|
||||
});
|
||||
|
||||
emit!(PerpSettleFeesLog {
|
||||
|
@ -144,7 +145,7 @@ pub fn perp_settle_fees(ctx: Context<PerpSettleFees>, max_settle_amount: u64) ->
|
|||
});
|
||||
|
||||
// Bank & perp_market are dropped to prevent re-borrow from remaining_accounts
|
||||
drop(bank);
|
||||
drop(settle_bank);
|
||||
drop(perp_market);
|
||||
|
||||
// Verify that the result of settling did not violate the health of the account that lost money
|
||||
|
|
|
@ -45,6 +45,7 @@ pub struct PerpSettlePnl<'info> {
|
|||
/// CHECK: Oracle can have different account types, constrained by address in perp_market
|
||||
pub oracle: UncheckedAccount<'info>,
|
||||
|
||||
// bank correctness is checked at #2
|
||||
#[account(mut, has_one = group)]
|
||||
pub settle_bank: AccountLoader<'info, Bank>,
|
||||
|
||||
|
@ -95,7 +96,7 @@ pub fn perp_settle_pnl(ctx: Context<PerpSettlePnl>) -> Result<()> {
|
|||
let mut settle_bank = ctx.accounts.settle_bank.load_mut()?;
|
||||
let perp_market = ctx.accounts.perp_market.load()?;
|
||||
|
||||
// Verify that the bank is the quote currency bank
|
||||
// Verify that the bank is the quote currency bank (#2)
|
||||
require!(
|
||||
settle_bank.token_index == settle_token_index,
|
||||
MangoError::InvalidBank
|
||||
|
|
Loading…
Reference in New Issue