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