From 2f9dfc74fcfea3c8dcfefd2ac79b2e33bc2fda7c Mon Sep 17 00:00:00 2001 From: Nour Alharithi Date: Tue, 14 Jan 2025 18:59:00 -0800 Subject: [PATCH] fix memory issue --- programs/jit-proxy/src/instructions/jit.rs | 49 +++++++++++----------- ts/sdk/src/jitProxyClient.ts | 40 ++++++++++++++++-- ts/sdk/src/jitter/baseJitter.ts | 11 ++--- ts/sdk/src/jitter/jitterShotgun.ts | 5 +++ ts/sdk/src/jitter/jitterSniper.ts | 1 + ts/sdk/src/types/jit_proxy.ts | 18 ++++++++ 6 files changed, 88 insertions(+), 36 deletions(-) diff --git a/programs/jit-proxy/src/instructions/jit.rs b/programs/jit-proxy/src/instructions/jit.rs index 39d951e..bc66bb9 100644 --- a/programs/jit-proxy/src/instructions/jit.rs +++ b/programs/jit-proxy/src/instructions/jit.rs @@ -601,43 +601,42 @@ fn place_and_make_swift<'info>( order_params: OrderParams, swift_order_uuid: [u8; 8], ) -> Result<()> { - let drift_program = ctx.accounts.drift_program.to_account_info().clone(); + let drift_program = ctx.accounts.drift_program.to_account_info(); + let state = ctx.accounts.state.to_account_info(); + let authority = ctx.accounts.authority.to_account_info(); + let taker = ctx.accounts.taker.to_account_info(); + let taker_stats = ctx.accounts.taker_stats.to_account_info(); + let taker_swift_user_orders = ctx.accounts.taker_swift_user_orders.to_account_info(); let cpi_account_place_taker_order = PlaceSwiftTakerOrder { - state: ctx.accounts.state.to_account_info().clone(), - authority: ctx.accounts.authority.to_account_info().clone(), - user: ctx.accounts.taker.to_account_info().clone(), - user_stats: ctx.accounts.taker_stats.to_account_info().clone(), - swift_user_orders: ctx - .accounts - .taker_swift_user_orders - .to_account_info() - .clone(), + state: state.clone(), + authority: authority.clone(), + user: taker.clone(), + user_stats: taker_stats.clone(), + swift_user_orders: taker_swift_user_orders.clone(), ix_sysvar: ctx.accounts.ix_sysvar.clone(), }; - let cpi_accounts_place_and_make = PlaceAndMakeSwift { - state: ctx.accounts.state.to_account_info().clone(), - user: ctx.accounts.user.to_account_info().clone(), - user_stats: ctx.accounts.user_stats.to_account_info().clone(), - authority: ctx.accounts.authority.to_account_info().clone(), - taker: ctx.accounts.taker.to_account_info().clone(), - taker_stats: ctx.accounts.taker_stats.to_account_info().clone(), - taker_swift_user_orders: ctx - .accounts - .taker_swift_user_orders - .to_account_info() - .clone(), - }; - let cpi_context_place_taker_order = CpiContext::new(drift_program.clone(), cpi_account_place_taker_order) - .with_remaining_accounts(ctx.remaining_accounts.iter().skip(1).cloned().collect()); + .with_remaining_accounts(ctx.remaining_accounts.into()); drift::cpi::place_swift_taker_order( cpi_context_place_taker_order, swift_order_params_message_bytes, )?; + msg!("Made it past first cpi"); + + let cpi_accounts_place_and_make = PlaceAndMakeSwift { + state, + user: ctx.accounts.user.to_account_info().clone(), + user_stats: ctx.accounts.user_stats.to_account_info().clone(), + authority: ctx.accounts.authority.to_account_info().clone(), + taker, + taker_stats, + taker_swift_user_orders, + }; + let cpi_context_place_and_make = CpiContext::new(drift_program, cpi_accounts_place_and_make) .with_remaining_accounts(ctx.remaining_accounts.into()); diff --git a/ts/sdk/src/jitProxyClient.ts b/ts/sdk/src/jitProxyClient.ts index 7bc51cc..76f3d05 100644 --- a/ts/sdk/src/jitProxyClient.ts +++ b/ts/sdk/src/jitProxyClient.ts @@ -2,6 +2,7 @@ import { BN, createMinimalEd25519VerifyIx, DriftClient, + getSwiftUserAccountPublicKey, isVariant, MakerInfo, MarketType, @@ -12,7 +13,13 @@ import { UserAccount, } from '@drift-labs/sdk'; import { IDL, JitProxy } from './types/jit_proxy'; -import { PublicKey, TransactionInstruction } from '@solana/web3.js'; +import { + PublicKey, + SYSVAR_INSTRUCTIONS_PUBKEY, + TransactionInstruction, + TransactionMessage, + VersionedTransaction, +} from '@solana/web3.js'; import { Program } from '@coral-xyz/anchor'; import { TxSigAndSlot } from '@drift-labs/sdk'; import { SignedSwiftOrderParams } from '@drift-labs/sdk/lib/node/swift/types'; @@ -91,7 +98,7 @@ export class JitProxyClient { params.signedSwiftOrderParams.orderParams, ]); const swiftOrderParamsSignatureIx = createMinimalEd25519VerifyIx( - 3, + 1, 12, swiftIxData, 0 @@ -101,6 +108,27 @@ export class JitProxyClient { [swiftOrderParamsSignatureIx, ix], txParams ); + let resp; + try { + const message = new TransactionMessage({ + payerKey: this.driftClient.wallet.payer.publicKey, + recentBlockhash: ( + await this.driftClient.connection.getLatestBlockhash() + ).blockhash, + instructions: [swiftOrderParamsSignatureIx, ix], + }).compileToV0Message([this.driftClient.lookupTableAccount]); + + const tx = new VersionedTransaction(message); + resp = await this.driftClient.connection.simulateTransaction(tx, { + sigVerify: false, + replaceRecentBlockhash: true, + commitment: 'processed', + }); + console.log(resp); + } catch (e) { + console.error(e); + } + return await this.driftClient.sendTransaction(tx); } @@ -197,6 +225,7 @@ export class JitProxyClient { subAccountId, uuid, marketIndex, + signedSwiftOrderParams, }: JitSwiftIxParams): Promise { subAccountId = subAccountId !== undefined @@ -232,14 +261,19 @@ export class JitProxyClient { }; return this.program.methods - .jitSwift(jitSwiftParams) + .jitSwift(signedSwiftOrderParams.orderParams, jitSwiftParams) .accounts({ taker: takerKey, takerStats: takerStatsKey, + takerSwiftUserOrders: getSwiftUserAccountPublicKey( + this.driftClient.program.programId, + takerKey + ), state: await this.driftClient.getStatePublicKey(), user: await this.driftClient.getUserAccountPublicKey(subAccountId), userStats: this.driftClient.getUserStatsAccountPublicKey(), driftProgram: this.driftClient.program.programId, + ixSysvar: SYSVAR_INSTRUCTIONS_PUBKEY, }) .remainingAccounts(remainingAccounts) .instruction(); diff --git a/ts/sdk/src/jitter/baseJitter.ts b/ts/sdk/src/jitter/baseJitter.ts index 71e975e..f1e0069 100644 --- a/ts/sdk/src/jitter/baseJitter.ts +++ b/ts/sdk/src/jitter/baseJitter.ts @@ -86,9 +86,8 @@ export abstract class BaseJitter { this.driftClient, new BulkAccountLoader(this.driftClient.connection, 'confirmed', 0) ); - - this.swiftOrderSubscriber = swiftOrderSubscriber; this.slotSubscriber = slotSubscriber; + this.swiftOrderSubscriber = swiftOrderSubscriber; } async subscribe(): Promise { @@ -248,7 +247,7 @@ export abstract class BaseJitter { }; swiftOrder.price = getAuctionPrice( swiftOrder, - this.slotSubscriber.getSlot(), + this.slotSubscriber?.getSlot(), this.driftClient.getOracleDataForPerpMarket(swiftOrder.marketIndex) .price ); @@ -282,11 +281,7 @@ export abstract class BaseJitter { const perpMarketAccount = this.driftClient.getPerpMarketAccount( swiftOrder.marketIndex ); - if ( - swiftOrder.baseAssetAmount - .sub(swiftOrder.baseAssetAmountFilled) - .lte(perpMarketAccount.amm.minOrderSize) - ) { + if (swiftOrder.baseAssetAmount.lt(perpMarketAccount.amm.minOrderSize)) { return; } diff --git a/ts/sdk/src/jitter/jitterShotgun.ts b/ts/sdk/src/jitter/jitterShotgun.ts index b71c0e8..fe51a27 100644 --- a/ts/sdk/src/jitter/jitterShotgun.ts +++ b/ts/sdk/src/jitter/jitterShotgun.ts @@ -5,6 +5,7 @@ import { DriftClient, Order, PostOnlyParams, + SlotSubscriber, SwiftOrderSubscriber, UserAccount, UserStatsMap, @@ -19,12 +20,14 @@ export class JitterShotgun extends BaseJitter { driftClient, userStatsMap, swiftOrderSubscriber, + slotSubscriber, }: { driftClient: DriftClient; auctionSubscriber: AuctionSubscriber; jitProxyClient: JitProxyClient; userStatsMap?: UserStatsMap; swiftOrderSubscriber?: SwiftOrderSubscriber; + slotSubscriber?: SlotSubscriber; }) { super({ auctionSubscriber, @@ -32,6 +35,7 @@ export class JitterShotgun extends BaseJitter { driftClient, userStatsMap, swiftOrderSubscriber, + slotSubscriber, }); } @@ -174,6 +178,7 @@ export class JitterShotgun extends BaseJitter { return; } catch (e) { console.error(`Failed to fill ${orderSignature}`); + console.log(e); if (e.message.includes('0x1770') || e.message.includes('0x1771')) { console.log('Order does not cross params yet, retrying'); } else if (e.message.includes('0x1779')) { diff --git a/ts/sdk/src/jitter/jitterSniper.ts b/ts/sdk/src/jitter/jitterSniper.ts index d2cc633..36a50e0 100644 --- a/ts/sdk/src/jitter/jitterSniper.ts +++ b/ts/sdk/src/jitter/jitterSniper.ts @@ -58,6 +58,7 @@ export class JitterSniper extends BaseJitter { driftClient, userStatsMap, swiftOrderSubscriber, + slotSubscriber, }); this.slotSubscriber = slotSubscriber; } diff --git a/ts/sdk/src/types/jit_proxy.ts b/ts/sdk/src/types/jit_proxy.ts index 1098a20..ddd3338 100644 --- a/ts/sdk/src/types/jit_proxy.ts +++ b/ts/sdk/src/types/jit_proxy.ts @@ -92,9 +92,18 @@ export type JitProxy = { name: 'driftProgram'; isMut: false; isSigner: false; + }, + { + name: 'ixSysvar'; + isMut: false; + isSigner: false; } ]; args: [ + { + name: 'swiftOrderParamsMessageBytes'; + type: 'bytes'; + }, { name: 'params'; type: { @@ -476,8 +485,17 @@ export const IDL: JitProxy = { isMut: false, isSigner: false, }, + { + name: 'ixSysvar', + isMut: false, + isSigner: false, + }, ], args: [ + { + name: 'swiftOrderParamsMessageBytes', + type: 'bytes', + }, { name: 'params', type: {