Skip to content

Commit 413c87d

Browse files
committed
move authority check into get_revenue_share_escrow_account
1 parent 0e9b82f commit 413c87d

File tree

7 files changed

+30
-24
lines changed

7 files changed

+30
-24
lines changed

programs/drift/src/error.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,8 @@ pub enum ErrorCode {
645645
BuilderRevoked,
646646
#[msg("Builder fee is greater than max fee bps")]
647647
InvalidBuilderFee,
648+
#[msg("RevenueShareEscrow authority mismatch")]
649+
RevenueShareEscrowAuthorityMismatch,
648650
#[msg("RevenueShareEscrow has too many active orders")]
649651
RevenueShareEscrowOrdersAccountFull,
650652
#[msg("Invalid RevenueShareAccount")]

programs/drift/src/instructions/keeper.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ fn fill_order<'c: 'info, 'info>(
148148
let builder_codes_enabled = state.builder_codes_enabled();
149149
let builder_referral_enabled = state.builder_referral_enabled();
150150
let mut escrow = if builder_codes_enabled || builder_referral_enabled {
151-
get_revenue_share_escrow_account(&mut remaining_accounts_iter)?
151+
get_revenue_share_escrow_account(&mut remaining_accounts_iter, &load!(ctx.accounts.user)?.authority)?
152152
} else {
153153
None
154154
};
@@ -643,16 +643,16 @@ pub fn handle_place_signed_msg_taker_order<'c: 'info, 'info>(
643643

644644
let high_leverage_mode_config = get_high_leverage_mode_config(&mut remaining_accounts)?;
645645

646+
let taker_key = ctx.accounts.user.key();
647+
let mut taker = load_mut!(ctx.accounts.user)?;
648+
let mut signed_msg_taker = ctx.accounts.signed_msg_user_orders.load_mut()?;
649+
646650
let escrow = if state.builder_codes_enabled() {
647-
get_revenue_share_escrow_account(&mut remaining_accounts)?
651+
get_revenue_share_escrow_account(&mut remaining_accounts, &taker.authority)?
648652
} else {
649653
None
650654
};
651655

652-
let taker_key = ctx.accounts.user.key();
653-
let mut taker = load_mut!(ctx.accounts.user)?;
654-
let mut signed_msg_taker = ctx.accounts.signed_msg_user_orders.load_mut()?;
655-
656656
place_signed_msg_taker_order(
657657
taker_key,
658658
&mut taker,
@@ -1054,7 +1054,7 @@ pub fn handle_settle_pnl<'c: 'info, 'info>(
10541054
let (mut builder_escrow, maybe_rev_share_map) =
10551055
if state.builder_codes_enabled() || state.builder_referral_enabled() {
10561056
(
1057-
get_revenue_share_escrow_account(&mut remaining_accounts)?,
1057+
get_revenue_share_escrow_account(&mut remaining_accounts, &user.authority)?,
10581058
load_revenue_share_map(&mut remaining_accounts).ok(),
10591059
)
10601060
} else {
@@ -1162,7 +1162,7 @@ pub fn handle_settle_multiple_pnls<'c: 'info, 'info>(
11621162
let (mut builder_escrow, maybe_rev_share_map) =
11631163
if state.builder_codes_enabled() || state.builder_referral_enabled() {
11641164
(
1165-
get_revenue_share_escrow_account(&mut remaining_accounts)?,
1165+
get_revenue_share_escrow_account(&mut remaining_accounts, &user.authority)?,
11661166
load_revenue_share_map(&mut remaining_accounts).ok(),
11671167
)
11681168
} else {

programs/drift/src/instructions/optional_accounts.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::state::traits::Size;
2020
use crate::state::user::{User, UserStats};
2121
use crate::{validate, OracleSource};
2222
use anchor_lang::accounts::account::Account;
23-
use anchor_lang::prelude::{AccountInfo, Interface};
23+
use anchor_lang::prelude::{AccountInfo, Interface, Pubkey};
2424
use anchor_lang::prelude::{AccountLoader, InterfaceAccount};
2525
use anchor_lang::Discriminator;
2626
use anchor_spl::token::TokenAccount;
@@ -279,6 +279,7 @@ pub fn get_high_leverage_mode_config<'a>(
279279

280280
pub fn get_revenue_share_escrow_account<'a>(
281281
account_info_iter: &mut Peekable<Iter<'a, AccountInfo<'a>>>,
282+
expected_authority: &Pubkey,
282283
) -> DriftResult<Option<RevenueShareEscrowZeroCopyMut<'a>>> {
283284
let account_info = account_info_iter.peek();
284285
if account_info.is_none() {
@@ -304,5 +305,11 @@ pub fn get_revenue_share_escrow_account<'a>(
304305
drop(borrowed_data);
305306
let escrow: RevenueShareEscrowZeroCopyMut<'a> = account_info.load_zc_mut()?;
306307

308+
validate!(
309+
escrow.fixed.authority == *expected_authority,
310+
ErrorCode::RevenueShareEscrowAuthorityMismatch,
311+
"invalid RevenueShareEscrow authority"
312+
)?;
313+
307314
Ok(Some(escrow))
308315
}

programs/drift/src/instructions/user.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2597,7 +2597,7 @@ pub fn handle_place_and_make_perp_order<'c: 'info, 'info>(
25972597
let builder_referral_enabled = state.builder_referral_enabled();
25982598
let builder_codes_enabled = state.builder_codes_enabled();
25992599
let mut escrow = if builder_codes_enabled || builder_referral_enabled {
2600-
get_revenue_share_escrow_account(remaining_accounts_iter)?
2600+
get_revenue_share_escrow_account(remaining_accounts_iter, &load!(ctx.accounts.taker)?.authority)?
26012601
} else {
26022602
None
26032603
};
@@ -2709,7 +2709,7 @@ pub fn handle_place_and_make_signed_msg_perp_order<'c: 'info, 'info>(
27092709
let builder_referral_enabled = state.builder_referral_enabled();
27102710
let builder_codes_enabled = state.builder_codes_enabled();
27112711
let mut escrow = if builder_codes_enabled || builder_referral_enabled {
2712-
get_revenue_share_escrow_account(remaining_accounts_iter)?
2712+
get_revenue_share_escrow_account(remaining_accounts_iter, &load!(ctx.accounts.taker)?.authority)?
27132713
} else {
27142714
None
27152715
};

programs/drift/src/state/revenue_share_map.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use anchor_lang::Discriminator;
1010
use arrayref::array_ref;
1111
use solana_program::account_info::AccountInfo;
1212
use solana_program::pubkey::Pubkey;
13-
use std::cell::{Ref, RefMut};
13+
use std::cell::RefMut;
1414
use std::collections::BTreeMap;
1515
use std::iter::Peekable;
1616
use std::panic::Location;

sdk/src/idl/drift.json

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14041,7 +14041,9 @@
1404114041
},
1404214042
{
1404314043
"name": "builderFee",
14044-
"type": "u64",
14044+
"type": {
14045+
"option": "u64"
14046+
},
1404514047
"index": false
1404614048
}
1404714049
]
@@ -16685,13 +16687,13 @@
1668516687
},
1668616688
{
1668716689
"code": 6320,
16688-
"name": "RevenueShareEscrowOrdersAccountFull",
16689-
"msg": "RevenueShareEscrow has too many active orders"
16690+
"name": "RevenueShareEscrowAuthorityMismatch",
16691+
"msg": "RevenueShareEscrow authority mismatch"
1669016692
},
1669116693
{
1669216694
"code": 6321,
16693-
"name": "RevenueShareEscrowMissing",
16694-
"msg": "RevenueShareEscrow missing"
16695+
"name": "RevenueShareEscrowOrdersAccountFull",
16696+
"msg": "RevenueShareEscrow has too many active orders"
1669516697
},
1669616698
{
1669716699
"code": 6322,
@@ -16707,11 +16709,6 @@
1670716709
"code": 6324,
1670816710
"name": "UnableToLoadRevenueShareAccount",
1670916711
"msg": "Unable to load builder account"
16710-
},
16711-
{
16712-
"code": 6325,
16713-
"name": "RevenueShareOrderNotFound",
16714-
"msg": "RevenueShare order not found"
1671516712
}
1671616713
],
1671716714
"metadata": {

tests/builderCodes.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -650,11 +650,11 @@ describe('builder codes', () => {
650650
const events = parseLogs(builderClient.program, logs);
651651
assert(events[0].name === 'OrderActionRecord');
652652
const fillQuoteAssetAmount = events[0].data['quoteAssetAmountFilled'] as BN;
653-
const builderFee = events[0].data['builderFee'] as BN;
653+
const builderFee = events[0].data['builderFee'] as BN | null;
654654
const takerFee = events[0].data['takerFee'] as BN;
655655
const totalFeePaid = takerFee;
656656
const referrerReward = new BN(events[0].data['referrerReward'] as number);
657-
assert(builderFee.eq(ZERO));
657+
assert(builderFee === null);
658658
assert(referrerReward.gt(ZERO));
659659

660660
await user2Client.fetchAccounts();

0 commit comments

Comments
 (0)