diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3b39518f7..0f505a0ba 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: node: ["18.x"] - solana: ["1.14.11"] + solana: ["1.14.18"] steps: - name: Git checkout uses: actions/checkout@v3 @@ -52,4 +52,4 @@ jobs: run: yarn validator & sleep 3 - name: Test - run: yarn test \ No newline at end of file + run: yarn test diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index f70cb684d..06498e1fe 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,12 @@ # @convergence-rfq/cli +## 4.5.17 + +### Patch Changes + +- Updated dependencies + - @convergence-rfq/sdk@4.5.17 + ## 4.5.16 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index d2bf790ed..7847640f2 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "@convergence-rfq/cli", "description": "Official Convergence CLI", - "version": "4.5.16", + "version": "4.5.17", "license": "MIT", "publishConfig": { "access": "public" @@ -47,7 +47,7 @@ "cli": "ts-node src/index.ts" }, "dependencies": { - "@convergence-rfq/sdk": "4.5.16", + "@convergence-rfq/sdk": "4.5.17", "@solana/web3.js": "^1.73.0", "@types/cookie": "^0.5.1", "commander": "^10.0.0" diff --git a/packages/js/CHANGELOG.md b/packages/js/CHANGELOG.md index 0572a0148..434098b1b 100644 --- a/packages/js/CHANGELOG.md +++ b/packages/js/CHANGELOG.md @@ -1,5 +1,12 @@ # @convergence-rfq/sdk +## 4.5.17 + +### Patch Changes + +- Add expirationTimestamp to Response Model + Update CPL solita packages to version 2.2.14 + ## 4.5.16 ### Patch Changes diff --git a/packages/js/package.json b/packages/js/package.json index 89b544d9f..9ae2adca4 100644 --- a/packages/js/package.json +++ b/packages/js/package.json @@ -1,7 +1,7 @@ { "name": "@convergence-rfq/sdk", "description": "Official Convergence RFQ SDK", - "version": "4.5.16", + "version": "4.5.17", "license": "MIT", "publishConfig": { "access": "public" @@ -51,11 +51,11 @@ "@bundlr-network/client": "^0.8.8", "@convergence-rfq/beet": "0.7.10", "@convergence-rfq/beet-solana": "0.4.11", - "@convergence-rfq/psyoptions-american-instrument": "2.2.13", - "@convergence-rfq/psyoptions-european-instrument": "2.2.13", - "@convergence-rfq/rfq": "2.2.13", - "@convergence-rfq/risk-engine": "2.2.13", - "@convergence-rfq/spot-instrument": "2.2.13", + "@convergence-rfq/psyoptions-american-instrument": "2.2.14", + "@convergence-rfq/psyoptions-european-instrument": "2.2.14", + "@convergence-rfq/rfq": "2.2.14", + "@convergence-rfq/risk-engine": "2.2.14", + "@convergence-rfq/spot-instrument": "2.2.14", "@coral-xyz/borsh": "^0.26.0", "@mithraic-labs/psy-american": "^0.2.3", "@mithraic-labs/tokenized-euros": "^0.2.3", diff --git a/packages/js/src/plugins/rfqModule/models/Response.ts b/packages/js/src/plugins/rfqModule/models/Response.ts index 11f9114fb..463e802f8 100644 --- a/packages/js/src/plugins/rfqModule/models/Response.ts +++ b/packages/js/src/plugins/rfqModule/models/Response.ts @@ -2,7 +2,10 @@ import { PublicKey } from '@solana/web3.js'; import { DefaultingParty as SolitaDefaultingParty } from '@convergence-rfq/rfq'; import { ResponseAccount } from '../accounts'; -import { removeDecimals } from '../../../utils/conversions'; +import { + convertTimestampToMilliSeconds, + removeDecimals, +} from '../../../utils/conversions'; import { assert } from '../../../utils/assert'; import { Confirmation, fromSolitaConfirmation } from './Confirmation'; import { AuthoritySide, fromSolitaAuthoritySide } from './AuthoritySide'; @@ -34,6 +37,9 @@ export type Response = { /** The timestamp at which this response was created. */ readonly creationTimestamp: number; + /** The timestamp at which this response will expire. */ + readonly expirationTimestamp: number; + /** The bid required for sell and optionally two-way order types. */ readonly bid: Quote | null; @@ -89,7 +95,12 @@ export const toResponse = ( address: account.publicKey, maker: account.data.maker, rfq: account.data.rfq, - creationTimestamp: Number(account.data.creationTimestamp) * 1_000, + creationTimestamp: convertTimestampToMilliSeconds( + account.data.creationTimestamp + ), + expirationTimestamp: convertTimestampToMilliSeconds( + account.data.expirationTimestamp + ), makerCollateralLocked: removeDecimals( account.data.makerCollateralLocked, collateralDecimals diff --git a/packages/js/src/plugins/rfqModule/models/Rfq.ts b/packages/js/src/plugins/rfqModule/models/Rfq.ts index d53e04e06..1db4e9c47 100644 --- a/packages/js/src/plugins/rfqModule/models/Rfq.ts +++ b/packages/js/src/plugins/rfqModule/models/Rfq.ts @@ -1,7 +1,10 @@ import { PublicKey } from '@solana/web3.js'; import { RfqAccount } from '../accounts'; import { assert } from '../../../utils/assert'; -import { convertTimestamp, removeDecimals } from '../../../utils/conversions'; +import { + convertTimestampToMilliSeconds, + removeDecimals, +} from '../../../utils/conversions'; import { SpotLegInstrument, SpotQuoteInstrument, @@ -114,7 +117,9 @@ export const toRfq = async ( quoteMint: SpotLegInstrument.deserializeInstrumentData( Buffer.from(account.data.quoteAsset.instrumentData) ).mintAddress, - creationTimestamp: convertTimestamp(account.data.creationTimestamp), + creationTimestamp: convertTimestampToMilliSeconds( + account.data.creationTimestamp + ), activeWindow: account.data.activeWindow, settlingWindow: account.data.settlingWindow, expectedLegsSize: account.data.expectedLegsSize, diff --git a/packages/js/src/plugins/rfqModule/operations/confirmResponse.ts b/packages/js/src/plugins/rfqModule/operations/confirmResponse.ts index 81bb25098..e0ec2d5db 100644 --- a/packages/js/src/plugins/rfqModule/operations/confirmResponse.ts +++ b/packages/js/src/plugins/rfqModule/operations/confirmResponse.ts @@ -14,6 +14,7 @@ import { TransactionBuilder, TransactionBuilderOptions, } from '../../../utils/TransactionBuilder'; +import { Response } from '../models'; import { ResponseSide, toSolitaQuoteSide } from '../models/ResponseSide'; import { toSolitaOverrideLegMultiplierBps } from '../models/Confirmation'; @@ -181,13 +182,19 @@ export const confirmResponseBuilder = async ( }), } = params; + const responseModel = await convergence + .rfqs() + .findResponseByAddress({ address: response }); + + if (isResponseExpired(responseModel)) { + throw new Error('Response is expired'); + } + const { overrideLegMultiplier = null } = params; const overrideLegMultiplierBps = overrideLegMultiplier && toSolitaOverrideLegMultiplierBps(overrideLegMultiplier); - const responseModel = await convergence - .rfqs() - .findResponseByAddress({ address: response }); + const makerCollateralInfo = convergence.collateral().pdas().collateralInfo({ user: responseModel.maker, programs, @@ -264,3 +271,7 @@ export const confirmResponseBuilder = async ( } ); }; + +const isResponseExpired = (response: Response): boolean => { + return Date.now() > response.expirationTimestamp; +}; diff --git a/packages/js/src/plugins/rfqModule/operations/respondToRfq.ts b/packages/js/src/plugins/rfqModule/operations/respondToRfq.ts index 529505697..258f56295 100644 --- a/packages/js/src/plugins/rfqModule/operations/respondToRfq.ts +++ b/packages/js/src/plugins/rfqModule/operations/respondToRfq.ts @@ -1,6 +1,7 @@ import { createRespondToRfqInstruction } from '@convergence-rfq/rfq'; import { PublicKey, AccountMeta, ComputeBudgetProgram } from '@solana/web3.js'; +import BN from 'bn.js'; import { SendAndConfirmTransactionResponse } from '../../rpcModule'; import { assertResponse, Response } from '../models/Response'; import { Convergence } from '../../../Convergence'; @@ -17,6 +18,7 @@ import { } from '../../../utils/TransactionBuilder'; import { Quote, Rfq } from '../models'; import { toSolitaQuote } from '../models/Quote'; +import { convertTimestampToSeconds } from '@/utils'; const getNextResponsePdaAndDistinguisher = async ( cvg: Convergence, @@ -99,6 +101,11 @@ export type RespondToRfqInput = { */ ask?: Quote; + /** + * The optional response expirationTimestamp in seconds. + */ + expirationTimestamp?: number; + /** * The address of the RFQ account. */ @@ -239,6 +246,7 @@ export const respondToRfqBuilder = async ( user: maker.publicKey, programs, }), + expirationTimestamp, } = params; if (!bid && !ask) { @@ -247,6 +255,27 @@ export const respondToRfqBuilder = async ( const rfqModel = await convergence.rfqs().findRfqByAddress({ address: rfq }); + const rfqExpirationTimestampSeconds = + convertTimestampToSeconds(rfqModel.creationTimestamp) + + rfqModel.activeWindow; + + const currentTimestampSeconds = convertTimestampToSeconds(Date.now()); + + let expirationTimestampBn: BN; + + if (!expirationTimestamp) { + expirationTimestampBn = new BN(rfqExpirationTimestampSeconds); + } else { + if (expirationTimestamp < currentTimestampSeconds) { + throw new Error('Expiration timestamp must be in the future'); + } + if (expirationTimestamp > rfqExpirationTimestampSeconds) { + throw new Error('Response expiration must be less than RFQ expiration'); + } + + expirationTimestampBn = new BN(expirationTimestamp); + } + const { response, pdaDistinguisher } = await getNextResponsePdaAndDistinguisher( convergence, @@ -323,6 +352,7 @@ export const respondToRfqBuilder = async ( bid: bid && toSolitaQuote(bid, rfqModel.quoteAsset.getDecimals()), ask: ask && toSolitaQuote(ask, rfqModel.quoteAsset.getDecimals()), pdaDistinguisher, + expirationTimestamp: expirationTimestampBn, } ), signers: [maker], diff --git a/packages/js/src/utils/conversions.ts b/packages/js/src/utils/conversions.ts index 4755437bc..265af495e 100644 --- a/packages/js/src/utils/conversions.ts +++ b/packages/js/src/utils/conversions.ts @@ -50,10 +50,22 @@ export const addDecimals = (value: number, decimals: number = 0): BN => { * @param timestamp {bignum} Solita timestamp * @returns {number} timestamp in milliseconds */ -export function convertTimestamp(timestamp: bignum): number { +export function convertTimestampToMilliSeconds( + timestamp: bignum | number +): number { + if (typeof timestamp === 'number') { + return timestamp * 1_000; + } return Number(timestamp) * 1_000; } +export function convertTimestampToSeconds(timestamp: bignum | number): number { + if (typeof timestamp === 'number') { + return Math.floor(timestamp / 1_000); + } + return Math.floor(Number(timestamp) / 1_000); +} + /** * Used to roundUp values to a certain amount of decimals. * diff --git a/packages/js/tests/helpers.ts b/packages/js/tests/helpers.ts index aa52d4ade..28b5345df 100644 --- a/packages/js/tests/helpers.ts +++ b/packages/js/tests/helpers.ts @@ -404,9 +404,11 @@ export const createRfq = async ( cvg: Convergence, amount: number, orderType: OrderType, + activeWindow?: number, rfqType: 'open' | 'fixed-base' | 'fixed-quote' = 'fixed-base', quoteMintPk = QUOTE_MINT_PK, baseMintPk = BASE_MINT_BTC_PK + // 10 minutes ) => { let instrumentAmount = 1; let fixedSizeAmount = 1; @@ -429,6 +431,7 @@ export const createRfq = async ( orderType, fixedSize: { type: rfqType, amount: fixedSizeAmount }, quoteAsset: await SpotQuoteInstrument.create(cvg, quoteMint), + activeWindow, }); return { rfq, response }; }; @@ -438,6 +441,7 @@ export const respondToRfq = async ( rfq: Rfq, bid?: number, ask?: number, + responseExpirationTimestamp?: number, legsMultiplier?: number ) => { if (!bid && !ask) { @@ -448,6 +452,7 @@ export const respondToRfq = async ( rfq: rfq.address, bid: bid ? { price: bid, legsMultiplier } : undefined, ask: ask ? { price: ask, legsMultiplier } : undefined, + expirationTimestamp: responseExpirationTimestamp, }); }; @@ -663,3 +668,17 @@ export const createEuropeanIronCondor = async ( return { rfq }; }; + +export const expectError = async (promise: Promise, errorText: string) => { + try { + await promise; + throw new Error('No error thrown!'); + } catch (e) { + if ( + !e?.message.includes(errorText) && + !e?.logs?.some((e: string) => e.includes(errorText)) + ) { + throw e; + } + } +}; diff --git a/packages/js/tests/integration/psyoptionsAmerican.spec.ts b/packages/js/tests/integration/psyoptionsAmerican.spec.ts index 2b9a21b7c..abd60fc7d 100644 --- a/packages/js/tests/integration/psyoptionsAmerican.spec.ts +++ b/packages/js/tests/integration/psyoptionsAmerican.spec.ts @@ -124,6 +124,7 @@ describe('integration.psyoptionsAmerican', () => { rfq, undefined, 150_123, + undefined, 5 ); expect(rfqResponse).toHaveProperty('address'); @@ -209,6 +210,7 @@ describe('integration.psyoptionsAmerican', () => { rfq, 220_111, 150_123, + undefined, 5 ); expect(rfqResponse).toHaveProperty('address'); diff --git a/packages/js/tests/integration/psyoptionsEuropean.spec.ts b/packages/js/tests/integration/psyoptionsEuropean.spec.ts index 128390ac0..e038ae827 100644 --- a/packages/js/tests/integration/psyoptionsEuropean.spec.ts +++ b/packages/js/tests/integration/psyoptionsEuropean.spec.ts @@ -121,6 +121,7 @@ describe('integration.psyoptionsEuropean', () => { rfq, undefined, 150_123, + undefined, 5 ); expect(rfqResponse).toHaveProperty('address'); @@ -208,6 +209,7 @@ describe('integration.psyoptionsEuropean', () => { rfq, 220_111, 150_123, + undefined, 5 ); expect(rfqResponse).toHaveProperty('address'); @@ -290,6 +292,7 @@ describe('integration.psyoptionsEuropean', () => { rfq, 150_123, undefined, + undefined, 5 ); expect(rfqResponse).toHaveProperty('address'); diff --git a/packages/js/tests/unit/response.spec.ts b/packages/js/tests/unit/response.spec.ts index 08085665e..f6547d999 100644 --- a/packages/js/tests/unit/response.spec.ts +++ b/packages/js/tests/unit/response.spec.ts @@ -1,7 +1,13 @@ import { expect } from 'expect'; -import { Rfq } from '../../src'; -import { createUserCvg, createRfq, respondToRfq } from '../helpers'; +import { Rfq, convertTimestampToSeconds } from '../../src'; +import { + createUserCvg, + createRfq, + respondToRfq, + sleep, + expectError, +} from '../helpers'; describe('unit.response', () => { const makerCvg = createUserCvg('maker'); @@ -219,4 +225,36 @@ describe('unit.response', () => { expect(r.rfq.toBase58()).toEqual(rfq0.address.toBase58()) ); }); + + it('Cannot confirm Response if response is expired', async () => { + const rfq = await createRfq(takerCvg, amount0, 'buy', 3); + + const res = await respondToRfq( + makerCvg, + rfq.rfq, + undefined, + amount1, + convertTimestampToSeconds(Date.now()) + 2 + ); + + await sleep(2); + + await expectError( + takerCvg.rfqs().confirmResponse({ + response: res.rfqResponse.address, + rfq: rfq.rfq.address, + side: 'ask', + }), + 'Response is expired' + ); + + await makerCvg.rfqs().unlockResponseCollateral({ + response: res.rfqResponse.address, + }); + + await makerCvg.rfqs().cleanUpResponse({ + response: res.rfqResponse.address, + maker: makerCvg.identity().publicKey, + }); + }); }); diff --git a/packages/js/tests/unit/settlementResult.spec.ts b/packages/js/tests/unit/settlementResult.spec.ts index aa7097c3e..2a87526cd 100644 --- a/packages/js/tests/unit/settlementResult.spec.ts +++ b/packages/js/tests/unit/settlementResult.spec.ts @@ -89,6 +89,7 @@ describe('unit.settlementResult', () => { takerCvg, quoteAmount, 'buy', + undefined, 'fixed-quote' ); expect(rfq).toHaveProperty('address'); @@ -135,13 +136,20 @@ describe('unit.settlementResult', () => { const baseAmount = 1; const quoteAmount = 12_300.9783; - const { rfq } = await createRfq(takerCvg, baseAmount, 'buy', 'open'); + const { rfq } = await createRfq( + takerCvg, + baseAmount, + 'buy', + undefined, + 'open' + ); expect(rfq).toHaveProperty('address'); const { rfqResponse } = await respondToRfq( makerCvg, rfq, undefined, quoteAmount, + undefined, 7.456 ); expect(rfqResponse).toHaveProperty('address'); @@ -181,13 +189,20 @@ describe('unit.settlementResult', () => { const baseAmount = 1; const quoteAmount = 70_999.97; - const { rfq } = await createRfq(takerCvg, baseAmount, 'sell', 'open'); + const { rfq } = await createRfq( + takerCvg, + baseAmount, + 'sell', + undefined, + 'open' + ); expect(rfq).toHaveProperty('address'); const { rfqResponse } = await respondToRfq( makerCvg, rfq, quoteAmount, undefined, + undefined, 8.456123456 ); const responseResult = takerCvg.rfqs().getSettlementResult({ diff --git a/packages/validator/fixtures/programs/psyoptions_american_instrument.so b/packages/validator/fixtures/programs/psyoptions_american_instrument.so index c10f17170..f083932dc 100755 Binary files a/packages/validator/fixtures/programs/psyoptions_american_instrument.so and b/packages/validator/fixtures/programs/psyoptions_american_instrument.so differ diff --git a/packages/validator/fixtures/programs/psyoptions_european_instrument.so b/packages/validator/fixtures/programs/psyoptions_european_instrument.so index a97b3252d..e9fcc1745 100755 Binary files a/packages/validator/fixtures/programs/psyoptions_european_instrument.so and b/packages/validator/fixtures/programs/psyoptions_european_instrument.so differ diff --git a/packages/validator/fixtures/programs/rfq.so b/packages/validator/fixtures/programs/rfq.so index c19590396..a11dcc184 100755 Binary files a/packages/validator/fixtures/programs/rfq.so and b/packages/validator/fixtures/programs/rfq.so differ diff --git a/packages/validator/fixtures/programs/risk_engine.so b/packages/validator/fixtures/programs/risk_engine.so index 3a27cf9ac..6d77b1cee 100755 Binary files a/packages/validator/fixtures/programs/risk_engine.so and b/packages/validator/fixtures/programs/risk_engine.so differ diff --git a/packages/validator/fixtures/programs/spot_instrument.so b/packages/validator/fixtures/programs/spot_instrument.so index 8abba2e6a..ea0cb2aa1 100755 Binary files a/packages/validator/fixtures/programs/spot_instrument.so and b/packages/validator/fixtures/programs/spot_instrument.so differ diff --git a/yarn.lock b/yarn.lock index 4327fc8d7..dd9ebc26b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1240,10 +1240,10 @@ bn.js "^5.2.0" debug "^4.3.3" -"@convergence-rfq/psyoptions-american-instrument@2.2.13": - version "2.2.13" - resolved "https://registry.yarnpkg.com/@convergence-rfq/psyoptions-american-instrument/-/psyoptions-american-instrument-2.2.13.tgz#c4d0ab251ecc325a382e0e75ca743711a49fc7c7" - integrity sha512-DAsERQdjTxPhayB3GElWKlKsFPrd42XnG+CLg6+7Q1SZGDQFB19G7UafcwJJmik5wwrxcWJHLCONhmPZEmLCAg== +"@convergence-rfq/psyoptions-american-instrument@2.2.14": + version "2.2.14" + resolved "https://registry.yarnpkg.com/@convergence-rfq/psyoptions-american-instrument/-/psyoptions-american-instrument-2.2.14.tgz#25e2da5709ae4dd3d031d54112f10016003cd2ae" + integrity sha512-8uEDCLPqc26nCwPWpm43xFN9wv3x9BSWf2h0kUhfmGUFnyVH7VfIrMNlxJwC2S6329TtlnTyl5bDbO2a+aMPQw== dependencies: "@convergence-rfq/beet" "^0.7.10" "@convergence-rfq/beet-solana" "^0.4.11" @@ -1251,10 +1251,10 @@ "@solana/web3.js" "^1.56.2" bn.js "^5.2.0" -"@convergence-rfq/psyoptions-european-instrument@2.2.13": - version "2.2.13" - resolved "https://registry.yarnpkg.com/@convergence-rfq/psyoptions-european-instrument/-/psyoptions-european-instrument-2.2.13.tgz#1915a640040011eb193d6b96dc26ca3ed992941e" - integrity sha512-S7jM0mrhjx3QiT62fJAKVWSBlqcXCpk+KESNvy7mdSnJZGgpVTnyQeLWSqwO2cDElDOLn4Z40yfRTRgxssuPnw== +"@convergence-rfq/psyoptions-european-instrument@2.2.14": + version "2.2.14" + resolved "https://registry.yarnpkg.com/@convergence-rfq/psyoptions-european-instrument/-/psyoptions-european-instrument-2.2.14.tgz#eff403b346cc28424b7fc34404615b29292b341e" + integrity sha512-6Ga6iRaP2aQmrCcwT7G15Oucuvq6ySqAYHijS1MIUfw/iP9uqbpYdb2eDdUBMY8lY9CTvwm3zZ9C4i1NLDQJog== dependencies: "@convergence-rfq/beet" "^0.7.10" "@convergence-rfq/beet-solana" "^0.4.11" @@ -1262,10 +1262,10 @@ "@solana/web3.js" "^1.56.2" bn.js "^5.2.0" -"@convergence-rfq/rfq@2.2.13": - version "2.2.13" - resolved "https://registry.yarnpkg.com/@convergence-rfq/rfq/-/rfq-2.2.13.tgz#d78cd575ee176935c42ee178a51d6ee8e7637d89" - integrity sha512-0/QzK8roBoc/oCKVj/Z0gHeBYxjLvxlb1SqvmVlqlQPWjpoZfAojse04+g5c1LnUO9X0STU0Cn5tKDFbt0Jerg== +"@convergence-rfq/rfq@2.2.14": + version "2.2.14" + resolved "https://registry.yarnpkg.com/@convergence-rfq/rfq/-/rfq-2.2.14.tgz#7b2ad2d33908f6cc17c776b7d2ce2ab80c70af8a" + integrity sha512-MGGVOrJ7zjoJrjd3WNpCX2upzrw6XipJuRU2MAuffVV53p5t7xS896MONW5eCt/Zp4ffvWO9PYh5s0dZkcs17g== dependencies: "@convergence-rfq/beet" "^0.7.10" "@convergence-rfq/beet-solana" "^0.4.11" @@ -1273,10 +1273,10 @@ "@solana/web3.js" "^1.56.2" bn.js "^5.2.0" -"@convergence-rfq/risk-engine@2.2.13": - version "2.2.13" - resolved "https://registry.yarnpkg.com/@convergence-rfq/risk-engine/-/risk-engine-2.2.13.tgz#0449366fe33f31711f1c484e7e95d9871ffb9b23" - integrity sha512-koUzlOGm20/sH42IYkiM34NCL4lsNX7YO93rILgdmm68I31njx7gNxLneLvyebfMcvJiSF3NKdmbu3dpn/U8Qg== +"@convergence-rfq/risk-engine@2.2.14": + version "2.2.14" + resolved "https://registry.yarnpkg.com/@convergence-rfq/risk-engine/-/risk-engine-2.2.14.tgz#1ecefeb27ea9233df8bab970953f2b41d1a538e4" + integrity sha512-mAhALsP5w/UEfwz4wn6p/6niTkOvjG4Ae5KXQH36g0KMwCHdFipr45ZPkqmiGAR0cT1PvOiz376qa566BUyt2Q== dependencies: "@convergence-rfq/beet" "^0.7.10" "@convergence-rfq/beet-solana" "^0.4.11" @@ -1284,10 +1284,10 @@ "@solana/web3.js" "^1.56.2" bn.js "^5.2.0" -"@convergence-rfq/spot-instrument@2.2.13": - version "2.2.13" - resolved "https://registry.yarnpkg.com/@convergence-rfq/spot-instrument/-/spot-instrument-2.2.13.tgz#06550c962f0f4e68ed277c551586b138fec5b329" - integrity sha512-C2l0/vALFR7SxPrVu0GvzlyYrLH/Uy2wZ5IyDHnn74Xt/SBUOx4VdB2F2mHyLl/KG+yLaMREfcmBB7ZV2FHEyQ== +"@convergence-rfq/spot-instrument@2.2.14": + version "2.2.14" + resolved "https://registry.yarnpkg.com/@convergence-rfq/spot-instrument/-/spot-instrument-2.2.14.tgz#5b7596022245045f44d3565d94deda658e034438" + integrity sha512-NTeiltgcM36akuXIwrXSAavoec61rQq1Z2siLM0TXG/wC9B8LGvDkXQdUfu0jqrgXe5auf2cPOxsq3E80AAEZg== dependencies: "@convergence-rfq/beet" "^0.7.10" "@convergence-rfq/beet-solana" "^0.4.11"