diff --git a/sdk/src/driftClient.ts b/sdk/src/driftClient.ts index f663acfca4..92bdc144f7 100644 --- a/sdk/src/driftClient.ts +++ b/sdk/src/driftClient.ts @@ -6466,16 +6466,25 @@ export class DriftClient { const isDelegateSigner = takerInfo.signingAuthority.equals( takerInfo.takerUserAccount.delegate ); - const { signedMsgOrderParams } = this.decodeSignedMsgOrderParamsMessage( - signedSignedMsgOrderParams.orderParams, - isDelegateSigner + + const borshBuf = Buffer.from( + signedSignedMsgOrderParams.orderParams.toString(), + 'hex' ); - if (isUpdateHighLeverageMode(signedMsgOrderParams.bitFlags)) { - remainingAccounts.push({ - pubkey: getHighLeverageModeConfigPublicKey(this.program.programId), - isWritable: true, - isSigner: false, - }); + try { + const { signedMsgOrderParams } = this.decodeSignedMsgOrderParamsMessage( + borshBuf, + isDelegateSigner + ); + if (isUpdateHighLeverageMode(signedMsgOrderParams.bitFlags)) { + remainingAccounts.push({ + pubkey: getHighLeverageModeConfigPublicKey(this.program.programId), + isWritable: true, + isSigner: false, + }); + } + } catch (err) { + console.error('invalid signed order encoding'); } const messageLengthBuffer = Buffer.alloc(2); diff --git a/tests/placeAndMakeSignedMsgBankrun.ts b/tests/placeAndMakeSignedMsgBankrun.ts index 96ec30ac7b..4c8cb6d51f 100644 --- a/tests/placeAndMakeSignedMsgBankrun.ts +++ b/tests/placeAndMakeSignedMsgBankrun.ts @@ -46,6 +46,7 @@ import { convertToNumber, OrderParams, SignedMsgOrderParamsDelegateMessage, + OrderParamsBitFlag, } from '../sdk/src'; import { @@ -1192,6 +1193,69 @@ describe('place and make signedMsg order', () => { await takerDriftClient.unsubscribe(); }); + it('should place with high-leverage mode update', async () => { + const slot = new BN( + await bankrunContextWrapper.connection.toConnection().getSlot() + ); + + const [takerDriftClient, takerDriftClientUser] = + await initializeNewTakerClientAndUser( + bankrunContextWrapper, + chProgram, + usdcMint, + usdcAmount, + marketIndexes, + spotMarketIndexes, + oracleInfos, + bulkAccountLoader + ); + await takerDriftClientUser.fetchAccounts(); + + const marketIndex = 0; + const baseAssetAmount = BASE_PRECISION; + const takerOrderParams = getMarketOrderParams({ + marketIndex, + direction: PositionDirection.LONG, + baseAssetAmount, + auctionStartPrice: new BN(223).mul(PRICE_PRECISION), + auctionEndPrice: new BN(227).mul(PRICE_PRECISION), + auctionDuration: 10, + userOrderId: 1, + postOnly: PostOnlyParams.NONE, + bitFlags: OrderParamsBitFlag.UpdateHighLeverageMode, + }) as OrderParams; + const signedMsgSlot = slot.subn(5); + const uuid = Uint8Array.from(Buffer.from(nanoid(8))); + const takerOrderParamsMessage: SignedMsgOrderParamsMessage = { + signedMsgOrderParams: takerOrderParams, + subAccountId: 0, + slot: signedMsgSlot, + uuid, + takeProfitOrderParams: null, + stopLossOrderParams: null, + }; + const signedOrderParams = takerDriftClient.signSignedMsgOrderParamsMessage( + takerOrderParamsMessage + ); + + await makerDriftClient.initializeHighLeverageModeConfig(1); + await makerDriftClient.placeSignedMsgTakerOrder( + signedOrderParams, + marketIndex, + { + taker: await takerDriftClient.getUserAccountPublicKey(), + takerUserAccount: takerDriftClient.getUserAccount(), + takerStats: takerDriftClient.getUserStatsAccountPublicKey(), + signingAuthority: takerDriftClient.wallet.publicKey, + }, + undefined, + 2 + ); + + await takerDriftClientUser.unsubscribe(); + await takerDriftClient.unsubscribe(); + }); + it('should fail if auction params are not set', async () => { slot = new BN( await bankrunContextWrapper.connection.toConnection().getSlot()