Merge in disabled market updates (#190)
This commit is contained in:
parent
99c3510d27
commit
8d6c746baa
|
@ -430,12 +430,12 @@ fn get_keys_for_market<'a>(
|
|||
if account_flags.intersects(AccountFlag::Permissioned) {
|
||||
let state = transmute_one_pedantic::<MarketStateV2>(transmute_to_bytes(&words))
|
||||
.map_err(|e| e.without_src())?;
|
||||
state.check_flags()?;
|
||||
state.check_flags(true)?;
|
||||
state.inner
|
||||
} else {
|
||||
let state = transmute_one_pedantic::<MarketState>(transmute_to_bytes(&words))
|
||||
.map_err(|e| e.without_src())?;
|
||||
state.check_flags()?;
|
||||
state.check_flags(true)?;
|
||||
state
|
||||
}
|
||||
};
|
||||
|
|
|
@ -90,12 +90,25 @@ impl<'a> DerefMut for Market<'a> {
|
|||
|
||||
impl<'a> Market<'a> {
|
||||
#[inline]
|
||||
pub fn load(market_account: &'a AccountInfo, program_id: &Pubkey) -> DexResult<Self> {
|
||||
pub fn load(
|
||||
market_account: &'a AccountInfo,
|
||||
program_id: &Pubkey,
|
||||
// Allow for the market flag to be set to AccountFlag::Disabled
|
||||
allow_disabled: bool,
|
||||
) -> DexResult<Self> {
|
||||
let flags = Market::account_flags(&market_account.try_borrow_data()?)?;
|
||||
if flags.intersects(AccountFlag::Permissioned) {
|
||||
Ok(Market::V2(MarketStateV2::load(market_account, program_id)?))
|
||||
Ok(Market::V2(MarketStateV2::load(
|
||||
market_account,
|
||||
program_id,
|
||||
allow_disabled,
|
||||
)?))
|
||||
} else {
|
||||
Ok(Market::V1(MarketState::load(market_account, program_id)?))
|
||||
Ok(Market::V1(MarketState::load(
|
||||
market_account,
|
||||
program_id,
|
||||
allow_disabled,
|
||||
)?))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -216,6 +229,7 @@ impl MarketStateV2 {
|
|||
pub fn load<'a>(
|
||||
market_account: &'a AccountInfo,
|
||||
program_id: &Pubkey,
|
||||
allow_disabled: bool,
|
||||
) -> DexResult<RefMut<'a, Self>> {
|
||||
check_assert_eq!(market_account.owner, program_id)?;
|
||||
|
||||
|
@ -231,21 +245,35 @@ impl MarketStateV2 {
|
|||
))
|
||||
});
|
||||
|
||||
state.check_flags()?;
|
||||
state.check_flags(allow_disabled)?;
|
||||
Ok(state)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn check_flags(&self) -> DexResult {
|
||||
pub fn check_flags(&self, allow_disabled: bool) -> DexResult {
|
||||
let flags = BitFlags::from_bits(self.account_flags)
|
||||
.map_err(|_| DexErrorCode::InvalidMarketFlags)?;
|
||||
|
||||
let required_flags =
|
||||
AccountFlag::Initialized | AccountFlag::Market | AccountFlag::Permissioned;
|
||||
if flags != required_flags
|
||||
&& flags != (required_flags | AccountFlag::CrankAuthorityRequired)
|
||||
{
|
||||
Err(DexErrorCode::InvalidMarketFlags)?
|
||||
let required_crank_flags = required_flags | AccountFlag::CrankAuthorityRequired;
|
||||
|
||||
if allow_disabled {
|
||||
let disabled_flags = required_flags | AccountFlag::Disabled;
|
||||
let disabled_crank_flags = required_crank_flags | AccountFlag::Disabled;
|
||||
if flags != required_flags
|
||||
&& flags != required_crank_flags
|
||||
&& flags != disabled_flags
|
||||
&& flags != disabled_crank_flags
|
||||
{
|
||||
return Err(DexErrorCode::InvalidMarketFlags.into());
|
||||
}
|
||||
} else {
|
||||
if flags != required_flags && flags != required_crank_flags {
|
||||
return Err(DexErrorCode::InvalidMarketFlags.into());
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
@ -390,6 +418,7 @@ impl MarketState {
|
|||
pub fn load<'a>(
|
||||
market_account: &'a AccountInfo,
|
||||
program_id: &Pubkey,
|
||||
allow_disabled: bool,
|
||||
) -> DexResult<RefMut<'a, Self>> {
|
||||
check_assert_eq!(market_account.owner, program_id)?;
|
||||
let mut account_data: RefMut<'a, [u8]>;
|
||||
|
@ -403,17 +432,24 @@ impl MarketState {
|
|||
))
|
||||
});
|
||||
|
||||
state.check_flags()?;
|
||||
state.check_flags(allow_disabled)?;
|
||||
Ok(state)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn check_flags(&self) -> DexResult {
|
||||
pub fn check_flags(&self, allow_disabled: bool) -> DexResult {
|
||||
let flags = BitFlags::from_bits(self.account_flags)
|
||||
.map_err(|_| DexErrorCode::InvalidMarketFlags)?;
|
||||
let required_flags = AccountFlag::Initialized | AccountFlag::Market;
|
||||
if flags != required_flags {
|
||||
Err(DexErrorCode::InvalidMarketFlags)?
|
||||
if allow_disabled {
|
||||
let disabled_flags = required_flags | AccountFlag::Disabled;
|
||||
if flags != required_flags && flags != disabled_flags {
|
||||
return Err(DexErrorCode::InvalidMarketFlags.into());
|
||||
}
|
||||
} else {
|
||||
if flags != required_flags {
|
||||
return Err(DexErrorCode::InvalidMarketFlags.into());
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
@ -1725,7 +1761,7 @@ pub(crate) mod account_parser {
|
|||
_ => check_unreachable!()?,
|
||||
};
|
||||
|
||||
let mut market = Market::load(market_acc, program_id)?;
|
||||
let mut market = Market::load(market_acc, program_id, false)?;
|
||||
|
||||
let signer = SignerAccount::new(signer_acc)?;
|
||||
let fee_tier = market
|
||||
|
@ -1819,7 +1855,7 @@ pub(crate) mod account_parser {
|
|||
_ => check_unreachable!()?,
|
||||
};
|
||||
|
||||
let mut market = Market::load(market_acc, program_id)?;
|
||||
let mut market = Market::load(market_acc, program_id, false)?;
|
||||
|
||||
// Dynamic sysvars don't work in unit tests.
|
||||
#[cfg(any(test, feature = "fuzz"))]
|
||||
|
@ -1904,7 +1940,7 @@ pub(crate) mod account_parser {
|
|||
],
|
||||
_
|
||||
) = array_refs![accounts, 0; .. ; 2, 2];
|
||||
let market = Market::load(market_acc, program_id)?;
|
||||
let market = Market::load(market_acc, program_id, true)?;
|
||||
check_assert!(market.consume_events_authority().is_none())?;
|
||||
let event_q = market.load_event_queue_mut(event_q_acc)?;
|
||||
let args = ConsumeEventsArgs {
|
||||
|
@ -1934,7 +1970,7 @@ pub(crate) mod account_parser {
|
|||
ref consume_events_auth,
|
||||
]
|
||||
) = array_refs![accounts, 0; .. ; 3];
|
||||
let market = Market::load(market_acc, program_id)?;
|
||||
let market = Market::load(market_acc, program_id, true)?;
|
||||
check_assert!(consume_events_auth.is_signer)?;
|
||||
check_assert_eq!(
|
||||
Some(consume_events_auth.key),
|
||||
|
@ -1978,7 +2014,7 @@ pub(crate) mod account_parser {
|
|||
ref event_q_acc,
|
||||
] = array_ref![accounts, 0, 6];
|
||||
|
||||
let mut market = Market::load(market_acc, program_id).or(check_unreachable!())?;
|
||||
let mut market = Market::load(market_acc, program_id, true).or(check_unreachable!())?;
|
||||
|
||||
let open_orders_signer = SignerAccount::new(open_orders_signer_acc)?;
|
||||
let mut open_orders = market.load_orders_mut(
|
||||
|
@ -2041,7 +2077,7 @@ pub(crate) mod account_parser {
|
|||
|
||||
let client_order_id = NonZeroU64::new(client_order_id).ok_or(assertion_error!())?;
|
||||
|
||||
let mut market = Market::load(market_acc, program_id).or(check_unreachable!())?;
|
||||
let mut market = Market::load(market_acc, program_id, true).or(check_unreachable!())?;
|
||||
|
||||
let open_orders_signer = SignerAccount::new(open_orders_signer_acc)?;
|
||||
let mut open_orders = market.load_orders_mut(
|
||||
|
@ -2107,7 +2143,7 @@ pub(crate) mod account_parser {
|
|||
ref spl_token_program_acc,
|
||||
], remaining_accounts) = array_refs![accounts, 9; ..;];
|
||||
let spl_token_program = SplTokenProgram::new(spl_token_program_acc)?;
|
||||
let market = Market::load(market_acc, program_id)?;
|
||||
let market = Market::load(market_acc, program_id, true)?;
|
||||
let owner = SignerAccount::new(owner_acc).or(check_unreachable!())?;
|
||||
|
||||
let coin_vault =
|
||||
|
@ -2163,7 +2199,7 @@ pub(crate) mod account_parser {
|
|||
) -> DexResult<T> {
|
||||
check_assert_eq!(accounts.len(), 2)?;
|
||||
let &[ref market_acc, ref signer_acc] = array_ref![accounts, 0, 2];
|
||||
let mut market = Market::load(market_acc, program_id)?;
|
||||
let mut market = Market::load(market_acc, program_id, false)?;
|
||||
let authorization = SigningDisableAuthority::new(signer_acc)?;
|
||||
|
||||
let args = DisableMarketArgs {
|
||||
|
@ -2199,7 +2235,7 @@ pub(crate) mod account_parser {
|
|||
ref spl_token_program
|
||||
] = array_ref![accounts, 0, 6];
|
||||
|
||||
let market = Market::load(market_acc, program_id)?;
|
||||
let market = Market::load(market_acc, program_id, false)?;
|
||||
let pc_vault = PcVault::from_account(pc_vault_acc, &market)?;
|
||||
let fee_receiver = PcWallet::from_account(pc_wallet_acc, &market)?;
|
||||
let vault_signer = VaultSigner::new(vault_signer_acc, &market, program_id)?;
|
||||
|
@ -2242,7 +2278,7 @@ pub(crate) mod account_parser {
|
|||
|
||||
// Validate the accounts given are valid.
|
||||
let owner = SignerAccount::new(owner_acc)?;
|
||||
let market = Market::load(market_acc, program_id)?;
|
||||
let market = Market::load(market_acc, program_id, true)?;
|
||||
let mut open_orders = market.load_orders_mut(
|
||||
open_orders_acc,
|
||||
Some(owner.inner()),
|
||||
|
@ -2308,7 +2344,7 @@ pub(crate) mod account_parser {
|
|||
|
||||
// Validate the accounts given are valid.
|
||||
let owner = SignerAccount::new(owner_acc)?;
|
||||
let market = Market::load(market_acc, program_id)?;
|
||||
let market = Market::load(market_acc, program_id, false)?;
|
||||
|
||||
// Perform open orders initialization.
|
||||
let _open_orders = market.load_orders_mut(
|
||||
|
@ -2353,7 +2389,7 @@ pub(crate) mod account_parser {
|
|||
] = array_ref![accounts, 0, 7];
|
||||
|
||||
let _prune_authority = SignerAccount::new(prune_auth_acc)?;
|
||||
let mut market = Market::load(market_acc, program_id)?;
|
||||
let mut market = Market::load(market_acc, program_id, false)?;
|
||||
check_assert!(market.prune_authority() == Some(prune_auth_acc.key))?;
|
||||
let open_orders_address = open_orders_acc.key;
|
||||
let mut open_orders = market.load_orders_mut(
|
||||
|
|
|
@ -329,7 +329,7 @@ fn test_new_order() {
|
|||
.into_bump_slice();
|
||||
|
||||
{
|
||||
let market = Market::load(&accounts.market, &dex_program_id).unwrap();
|
||||
let market = Market::load(&accounts.market, &dex_program_id, false).unwrap();
|
||||
assert_eq!(identity(market.pc_fees_accrued), 0);
|
||||
assert_eq!(identity(market.pc_deposits_total), 520_000);
|
||||
}
|
||||
|
@ -337,7 +337,7 @@ fn test_new_order() {
|
|||
State::process(dex_program_id, instruction_accounts, &instruction_data).unwrap();
|
||||
|
||||
{
|
||||
let market = Market::load(&accounts.market, &dex_program_id).unwrap();
|
||||
let market = Market::load(&accounts.market, &dex_program_id, false).unwrap();
|
||||
assert_eq!(identity(market.referrer_rebates_accrued), 176);
|
||||
assert_eq!(identity(market.pc_fees_accrued), 584);
|
||||
assert_eq!(
|
||||
|
@ -346,7 +346,7 @@ fn test_new_order() {
|
|||
);
|
||||
}
|
||||
{
|
||||
let open_orders_buyer = Market::load(&accounts.market, &dex_program_id)
|
||||
let open_orders_buyer = Market::load(&accounts.market, &dex_program_id, false)
|
||||
.unwrap()
|
||||
.load_orders_mut(&orders_account_buyer, None, &dex_program_id, None, None)
|
||||
.unwrap();
|
||||
|
@ -354,7 +354,7 @@ fn test_new_order() {
|
|||
assert_eq!(identity(open_orders_buyer.native_coin_total), 0);
|
||||
assert_eq!(identity(open_orders_buyer.native_pc_free), 20_000);
|
||||
assert_eq!(identity(open_orders_buyer.native_pc_total), 520_000);
|
||||
let open_orders_seller = Market::load(&accounts.market, &dex_program_id)
|
||||
let open_orders_seller = Market::load(&accounts.market, &dex_program_id, false)
|
||||
.unwrap()
|
||||
.load_orders_mut(&orders_account_seller, None, &dex_program_id, None, None)
|
||||
.unwrap();
|
||||
|
@ -380,7 +380,7 @@ fn test_new_order() {
|
|||
}
|
||||
|
||||
{
|
||||
let market = Market::load(&accounts.market, &dex_program_id).unwrap();
|
||||
let market = Market::load(&accounts.market, &dex_program_id, false).unwrap();
|
||||
assert_eq!(identity(market.referrer_rebates_accrued), 176);
|
||||
assert_eq!(identity(market.pc_fees_accrued), 584);
|
||||
assert_eq!(
|
||||
|
@ -389,7 +389,7 @@ fn test_new_order() {
|
|||
);
|
||||
}
|
||||
{
|
||||
let open_orders_buyer = Market::load(&accounts.market, &dex_program_id)
|
||||
let open_orders_buyer = Market::load(&accounts.market, &dex_program_id, false)
|
||||
.unwrap()
|
||||
.load_orders_mut(&orders_account_buyer, None, &dex_program_id, None, None)
|
||||
.unwrap();
|
||||
|
@ -397,7 +397,7 @@ fn test_new_order() {
|
|||
assert_eq!(identity(open_orders_buyer.native_coin_total), 4_000);
|
||||
assert_eq!(identity(open_orders_buyer.native_pc_free), 20_120);
|
||||
assert_eq!(identity(open_orders_buyer.native_pc_total), 120_120);
|
||||
let open_orders_seller = Market::load(&accounts.market, &dex_program_id)
|
||||
let open_orders_seller = Market::load(&accounts.market, &dex_program_id, false)
|
||||
.unwrap()
|
||||
.load_orders_mut(&orders_account_seller, None, &dex_program_id, None, None)
|
||||
.unwrap();
|
||||
|
|
Loading…
Reference in New Issue