@velocity-exchange/sdk 0.4.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/lib/browser/adminClient.d.ts +52 -0
- package/lib/browser/adminClient.js +97 -0
- package/lib/browser/config.js +6 -7
- package/lib/browser/constants/numericConstants.d.ts +1 -1
- package/lib/browser/constants/numericConstants.js +1 -1
- package/lib/browser/decode/user.js +5 -1
- package/lib/browser/idl/velocity.d.ts +191 -15
- package/lib/browser/idl/velocity.json +192 -16
- package/lib/browser/orderSubscriber/OrderSubscriber.d.ts +1 -0
- package/lib/browser/orderSubscriber/OrderSubscriber.js +10 -4
- package/lib/browser/pyth/pythLazerSubscriber.js +37 -27
- package/lib/browser/types.d.ts +6 -0
- package/lib/browser/user.d.ts +20 -3
- package/lib/browser/user.js +52 -4
- package/lib/browser/velocityClient.d.ts +46 -10
- package/lib/browser/velocityClient.js +107 -35
- package/lib/node/adminClient.d.ts +52 -0
- package/lib/node/adminClient.d.ts.map +1 -1
- package/lib/node/adminClient.js +97 -0
- package/lib/node/config.d.ts.map +1 -1
- package/lib/node/config.js +6 -7
- package/lib/node/constants/numericConstants.d.ts +1 -1
- package/lib/node/constants/numericConstants.d.ts.map +1 -1
- package/lib/node/constants/numericConstants.js +1 -1
- package/lib/node/decode/user.d.ts.map +1 -1
- package/lib/node/decode/user.js +5 -1
- package/lib/node/idl/velocity.d.ts +191 -15
- package/lib/node/idl/velocity.d.ts.map +1 -1
- package/lib/node/idl/velocity.json +192 -16
- package/lib/node/orderSubscriber/OrderSubscriber.d.ts +1 -0
- package/lib/node/orderSubscriber/OrderSubscriber.d.ts.map +1 -1
- package/lib/node/orderSubscriber/OrderSubscriber.js +10 -4
- package/lib/node/pyth/pythLazerSubscriber.d.ts.map +1 -1
- package/lib/node/pyth/pythLazerSubscriber.js +37 -27
- package/lib/node/types.d.ts +6 -0
- package/lib/node/types.d.ts.map +1 -1
- package/lib/node/user.d.ts +20 -3
- package/lib/node/user.d.ts.map +1 -1
- package/lib/node/user.js +52 -4
- package/lib/node/velocityClient.d.ts +46 -10
- package/lib/node/velocityClient.d.ts.map +1 -1
- package/lib/node/velocityClient.js +107 -35
- package/package.json +7 -3
- package/.prettierignore +0 -1
- package/CHANGELOG.md +0 -132
- package/build-browser.js +0 -58
- package/bunfig.toml +0 -3
- package/esbuild-shims.js +0 -12
- package/scripts/deposit-isolated-positions.ts +0 -110
- package/scripts/find-flagged-users.ts +0 -213
- package/scripts/grpc-client-test-comparison.ts +0 -372
- package/scripts/grpc-multiuser-client-test-comparison.ts +0 -158
- package/scripts/postbuild.js +0 -95
- package/scripts/single-grpc-client-test.ts +0 -284
- package/scripts/withdraw-isolated-positions.ts +0 -174
- package/src/accounts/README_WebSocketAccountSubscriberV2.md +0 -95
- package/src/accounts/README_WebSocketProgramAccountSubscriberV2.md +0 -135
- package/src/accounts/basicUserAccountSubscriber.ts +0 -79
- package/src/accounts/basicUserStatsAccountSubscriber.ts +0 -87
- package/src/accounts/bulkAccountLoader.ts +0 -358
- package/src/accounts/bulkUserStatsSubscription.ts +0 -40
- package/src/accounts/bulkUserSubscription.ts +0 -39
- package/src/accounts/customizedCadenceBulkAccountLoader.ts +0 -250
- package/src/accounts/fetch.ts +0 -200
- package/src/accounts/grpcAccountSubscriber.ts +0 -225
- package/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts +0 -73
- package/src/accounts/grpcMultiAccountSubscriber.ts +0 -566
- package/src/accounts/grpcMultiUserAccountSubscriber.ts +0 -328
- package/src/accounts/grpcProgramAccountSubscriber.ts +0 -264
- package/src/accounts/grpcUserAccountSubscriber.ts +0 -63
- package/src/accounts/grpcUserStatsAccountSubscriber.ts +0 -65
- package/src/accounts/grpcVelocityClientAccountSubscriber.ts +0 -257
- package/src/accounts/grpcVelocityClientAccountSubscriberV2.ts +0 -941
- package/src/accounts/laserProgramAccountSubscriber.ts +0 -266
- package/src/accounts/oneShotUserAccountSubscriber.ts +0 -88
- package/src/accounts/oneShotUserStatsAccountSubscriber.ts +0 -94
- package/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +0 -223
- package/src/accounts/pollingOracleAccountSubscriber.ts +0 -151
- package/src/accounts/pollingTokenAccountSubscriber.ts +0 -147
- package/src/accounts/pollingUserAccountSubscriber.ts +0 -198
- package/src/accounts/pollingUserStatsAccountSubscriber.ts +0 -180
- package/src/accounts/pollingVelocityClientAccountSubscriber.ts +0 -774
- package/src/accounts/testBulkAccountLoader.ts +0 -59
- package/src/accounts/types.ts +0 -428
- package/src/accounts/utils.ts +0 -90
- package/src/accounts/webSocketAccountSubscriber.ts +0 -304
- package/src/accounts/webSocketAccountSubscriberV2.ts +0 -536
- package/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts +0 -171
- package/src/accounts/webSocketProgramAccountSubscriber.ts +0 -244
- package/src/accounts/webSocketProgramAccountSubscriberV2.ts +0 -1048
- package/src/accounts/webSocketProgramAccountsSubscriberV2.ts +0 -1042
- package/src/accounts/webSocketUserAccountSubscriber.ts +0 -139
- package/src/accounts/webSocketUserStatsAccountSubsriber.ts +0 -131
- package/src/accounts/webSocketVelocityClientAccountSubscriber.ts +0 -865
- package/src/accounts/webSocketVelocityClientAccountSubscriberV2.ts +0 -897
- package/src/accounts/websocketProgramUserAccountSubscriber.ts +0 -127
- package/src/addresses/marketAddresses.ts +0 -28
- package/src/addresses/pda.ts +0 -620
- package/src/adminClient.ts +0 -8136
- package/src/assert/assert.ts +0 -5
- package/src/auctionSubscriber/auctionSubscriber.ts +0 -86
- package/src/auctionSubscriber/auctionSubscriberGrpc.ts +0 -99
- package/src/auctionSubscriber/index.ts +0 -9
- package/src/auctionSubscriber/types.ts +0 -30
- package/src/bankrun/bankrunConnection.ts +0 -630
- package/src/blockhashSubscriber/BlockhashSubscriber.ts +0 -160
- package/src/blockhashSubscriber/index.ts +0 -6
- package/src/blockhashSubscriber/types.ts +0 -13
- package/src/clock/clockSubscriber.ts +0 -146
- package/src/config.ts +0 -312
- package/src/constants/index.ts +0 -9
- package/src/constants/numericConstants.ts +0 -194
- package/src/constants/perpMarkets.ts +0 -127
- package/src/constants/spotMarkets.ts +0 -104
- package/src/constants/txConstants.ts +0 -2
- package/src/constituentMap/constituentMap.ts +0 -305
- package/src/constituentMap/pollingConstituentAccountSubscriber.ts +0 -99
- package/src/constituentMap/webSocketConstituentAccountSubscriber.ts +0 -121
- package/src/core/VelocityCore.ts +0 -606
- package/src/core/index.ts +0 -12
- package/src/core/instructions/deposit.ts +0 -64
- package/src/core/instructions/fill.ts +0 -51
- package/src/core/instructions/funding.ts +0 -33
- package/src/core/instructions/liquidation.ts +0 -55
- package/src/core/instructions/orders.ts +0 -84
- package/src/core/instructions/perpOrders.ts +0 -312
- package/src/core/instructions/settlement.ts +0 -40
- package/src/core/instructions/trigger.ts +0 -41
- package/src/core/instructions/withdraw.ts +0 -65
- package/src/core/remainingAccounts.ts +0 -320
- package/src/core/signedMsg.ts +0 -109
- package/src/decode/customCoder.ts +0 -148
- package/src/decode/user.ts +0 -401
- package/src/dlob/DLOB.ts +0 -2793
- package/src/dlob/DLOBNode.ts +0 -305
- package/src/dlob/DLOBSubscriber.ts +0 -269
- package/src/dlob/NodeList.ts +0 -244
- package/src/dlob/orderBookLevels.ts +0 -695
- package/src/dlob/types.ts +0 -37
- package/src/events/eventList.ts +0 -114
- package/src/events/eventSubscriber.ts +0 -521
- package/src/events/eventsServerLogProvider.ts +0 -189
- package/src/events/fetchLogs.ts +0 -219
- package/src/events/parse.ts +0 -271
- package/src/events/pollingLogProvider.ts +0 -113
- package/src/events/sort.ts +0 -51
- package/src/events/txEventCache.ts +0 -92
- package/src/events/types.ts +0 -337
- package/src/events/webSocketLogProvider.ts +0 -152
- package/src/factory/bigNum.ts +0 -709
- package/src/factory/oracleClient.ts +0 -73
- package/src/idl/pyth.json +0 -142
- package/src/idl/pyth.ts +0 -97
- package/src/idl/pyth_solana_receiver.json +0 -628
- package/src/idl/token_faucet.json +0 -229
- package/src/idl/token_faucet.ts +0 -197
- package/src/idl/velocity.json +0 -23974
- package/src/idl/velocity.ts +0 -23980
- package/src/index.ts +0 -150
- package/src/indicative-quotes/indicativeQuotesSender.ts +0 -233
- package/src/isomorphic/README.md +0 -19
- package/src/isomorphic/anchor.browser.ts +0 -44
- package/src/isomorphic/anchor.node.ts +0 -1
- package/src/isomorphic/anchor.ts +0 -1
- package/src/isomorphic/anchor29.browser.ts +0 -24
- package/src/isomorphic/anchor29.node.ts +0 -1
- package/src/isomorphic/anchor29.ts +0 -1
- package/src/isomorphic/grpc.browser.ts +0 -4
- package/src/isomorphic/grpc.node.ts +0 -130
- package/src/isomorphic/grpc.ts +0 -1
- package/src/jupiter/jupiterClient.ts +0 -502
- package/src/keypair.ts +0 -32
- package/src/margin/README.md +0 -138
- package/src/marginCalculation.ts +0 -407
- package/src/marinade/idl/idl.json +0 -1962
- package/src/marinade/index.ts +0 -73
- package/src/marinade/types.ts +0 -3925
- package/src/math/amm.ts +0 -1758
- package/src/math/auction.ts +0 -480
- package/src/math/bankruptcy.ts +0 -138
- package/src/math/builder.ts +0 -130
- package/src/math/conversion.ts +0 -45
- package/src/math/exchangeStatus.ts +0 -261
- package/src/math/funding.ts +0 -498
- package/src/math/insurance.ts +0 -171
- package/src/math/liquidation.ts +0 -433
- package/src/math/margin.ts +0 -327
- package/src/math/market.ts +0 -487
- package/src/math/oracles.ts +0 -477
- package/src/math/orders.ts +0 -500
- package/src/math/position.ts +0 -381
- package/src/math/repeg.ts +0 -223
- package/src/math/spotBalance.ts +0 -996
- package/src/math/spotMarket.ts +0 -115
- package/src/math/spotPosition.ts +0 -263
- package/src/math/state.ts +0 -71
- package/src/math/superStake.ts +0 -602
- package/src/math/tiers.ts +0 -73
- package/src/math/trade.ts +0 -879
- package/src/math/utils.ts +0 -183
- package/src/memcmp.ts +0 -279
- package/src/oracles/oracleClientCache.ts +0 -41
- package/src/oracles/oracleId.ts +0 -99
- package/src/oracles/prelaunchOracleClient.ts +0 -63
- package/src/oracles/pythClient.ts +0 -125
- package/src/oracles/pythLazerClient.ts +0 -141
- package/src/oracles/quoteAssetOracleClient.ts +0 -43
- package/src/oracles/strictOraclePrice.ts +0 -40
- package/src/oracles/types.ts +0 -82
- package/src/oracles/utils.ts +0 -45
- package/src/orderParams.ts +0 -117
- package/src/orderSubscriber/OrderSubscriber.ts +0 -378
- package/src/orderSubscriber/PollingSubscription.ts +0 -50
- package/src/orderSubscriber/WebsocketSubscription.ts +0 -137
- package/src/orderSubscriber/grpcSubscription.ts +0 -155
- package/src/orderSubscriber/index.ts +0 -7
- package/src/orderSubscriber/types.ts +0 -64
- package/src/priorityFee/averageOverSlotsStrategy.ts +0 -17
- package/src/priorityFee/averageStrategy.ts +0 -13
- package/src/priorityFee/ewmaStrategy.ts +0 -51
- package/src/priorityFee/heliusPriorityFeeMethod.ts +0 -68
- package/src/priorityFee/index.ts +0 -16
- package/src/priorityFee/maxOverSlotsStrategy.ts +0 -18
- package/src/priorityFee/maxStrategy.ts +0 -8
- package/src/priorityFee/priorityFeeSubscriber.ts +0 -328
- package/src/priorityFee/priorityFeeSubscriberMap.ts +0 -134
- package/src/priorityFee/solanaPriorityFeeMethod.ts +0 -46
- package/src/priorityFee/types.ts +0 -82
- package/src/priorityFee/velocityPriorityFeeMethod.ts +0 -53
- package/src/pyth/constants.ts +0 -9
- package/src/pyth/index.ts +0 -15
- package/src/pyth/pythLazerSubscriber.ts +0 -365
- package/src/pyth/types.ts +0 -4451
- package/src/pyth/utils.ts +0 -13
- package/src/slot/SlotSubscriber.ts +0 -126
- package/src/slot/SlothashSubscriber.ts +0 -163
- package/src/swap/UnifiedSwapClient.ts +0 -315
- package/src/swift/grpcSignedMsgUserAccountSubscriber.ts +0 -81
- package/src/swift/index.ts +0 -10
- package/src/swift/signedMsgUserAccountSubscriber.ts +0 -251
- package/src/swift/swiftOrderSubscriber.ts +0 -351
- package/src/testClient.ts +0 -42
- package/src/titan/titanClient.ts +0 -438
- package/src/token/index.ts +0 -13
- package/src/tokenFaucet.ts +0 -296
- package/src/tx/baseTxSender.ts +0 -651
- package/src/tx/blockhashFetcher/baseBlockhashFetcher.ts +0 -31
- package/src/tx/blockhashFetcher/cachedBlockhashFetcher.ts +0 -105
- package/src/tx/blockhashFetcher/types.ts +0 -9
- package/src/tx/fastSingleTxSender.ts +0 -200
- package/src/tx/forwardOnlyTxSender.ts +0 -193
- package/src/tx/priorityFeeCalculator.ts +0 -117
- package/src/tx/reportTransactionError.ts +0 -176
- package/src/tx/retryTxSender.ts +0 -177
- package/src/tx/txHandler.ts +0 -1009
- package/src/tx/txParamProcessor.ts +0 -225
- package/src/tx/types.ts +0 -117
- package/src/tx/utils.ts +0 -133
- package/src/tx/whileValidTxSender.ts +0 -377
- package/src/types.ts +0 -2575
- package/src/user.ts +0 -5316
- package/src/userConfig.ts +0 -38
- package/src/userMap/PollingSubscription.ts +0 -61
- package/src/userMap/WebsocketSubscription.ts +0 -93
- package/src/userMap/grpcSubscription.ts +0 -93
- package/src/userMap/referrerMap.ts +0 -360
- package/src/userMap/revenueShareEscrowMap.ts +0 -342
- package/src/userMap/userMap.ts +0 -784
- package/src/userMap/userMapConfig.ts +0 -82
- package/src/userMap/userStatsMap.ts +0 -393
- package/src/userName.ts +0 -37
- package/src/userStats.ts +0 -159
- package/src/userStatsConfig.ts +0 -35
- package/src/util/TransactionConfirmationManager.ts +0 -333
- package/src/util/chainClock.ts +0 -65
- package/src/util/computeUnits.ts +0 -101
- package/src/util/digest.ts +0 -33
- package/src/util/ed25519Utils.ts +0 -95
- package/src/util/promiseTimeout.ts +0 -23
- package/src/velocityClient.ts +0 -14802
- package/src/velocityClientConfig.ts +0 -119
- package/src/wallet.ts +0 -91
- package/tests/VelocityCore/builder_escrow.test.ts +0 -121
- package/tests/VelocityCore/decode.test.ts +0 -16
- package/tests/VelocityCore/fill_trigger.test.ts +0 -73
- package/tests/VelocityCore/instructions.test.ts +0 -46
- package/tests/VelocityCore/pdas.test.ts +0 -30
- package/tests/VelocityCore/perp_orders.test.ts +0 -205
- package/tests/VelocityCore/remainingAccounts.test.ts +0 -72
- package/tests/VelocityCore/settlement_liquidation.test.ts +0 -69
- package/tests/accounts/customizedCadenceBulkAccountLoader.test.ts +0 -211
- package/tests/amm/test.ts +0 -2402
- package/tests/auctions/test.ts +0 -81
- package/tests/bn/test.ts +0 -355
- package/tests/builder/builderFee.test.ts +0 -42
- package/tests/ci/verifyConstants.ts +0 -393
- package/tests/decode/test.ts +0 -262
- package/tests/decode/userAccountBufferStrings.ts +0 -102
- package/tests/dlob/helpers.ts +0 -748
- package/tests/dlob/test.ts +0 -6969
- package/tests/dlob/tickSizeStandardization.ts +0 -545
- package/tests/events/parseLogsForCuUsage.ts +0 -139
- package/tests/exchangeStatus/test.ts +0 -45
- package/tests/insurance/test.ts +0 -40
- package/tests/liquidation/test.ts +0 -125
- package/tests/oracles/mmOracleGate.test.ts +0 -379
- package/tests/oracles/pythPegSnap.test.ts +0 -76
- package/tests/sdkParity/enumParity.test.ts +0 -84
- package/tests/sdkParity/marginCategoryFill.test.ts +0 -143
- package/tests/sdkParity/memcmpOffsets.test.ts +0 -139
- package/tests/spot/test.ts +0 -281
- package/tests/tx/TransactionConfirmationManager.test.ts +0 -312
- package/tests/tx/cachedBlockhashFetcher.test.ts +0 -96
- package/tests/tx/priorityFeeCalculator.ts +0 -77
- package/tests/tx/priorityFeeStrategy.ts +0 -95
- package/tests/user/bankruptcy.ts +0 -165
- package/tests/user/feeAndWithdrawLimits.ts +0 -284
- package/tests/user/getMarginCalculation.ts +0 -586
- package/tests/user/helpers.ts +0 -184
- package/tests/user/liquidations.ts +0 -129
- package/tests/user/marginCalculations.test.ts +0 -321
- package/tests/user/test.ts +0 -833
- package/tsconfig.browser.json +0 -18
- package/tsconfig.json +0 -36
package/src/pyth/utils.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { PublicKey } from '@solana/web3.js';
|
|
2
|
-
|
|
3
|
-
export const getGuardianSetPda = (
|
|
4
|
-
guardianSetIndex: number,
|
|
5
|
-
wormholeProgramId: PublicKey
|
|
6
|
-
) => {
|
|
7
|
-
const guardianSetIndexBuf = Buffer.alloc(4);
|
|
8
|
-
guardianSetIndexBuf.writeUInt32BE(guardianSetIndex, 0);
|
|
9
|
-
return PublicKey.findProgramAddressSync(
|
|
10
|
-
[Buffer.from('GuardianSet'), guardianSetIndexBuf],
|
|
11
|
-
wormholeProgramId
|
|
12
|
-
)[0];
|
|
13
|
-
};
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import { Connection } from '@solana/web3.js';
|
|
2
|
-
import { EventEmitter } from 'events';
|
|
3
|
-
import StrictEventEmitter from 'strict-event-emitter-types/types/src';
|
|
4
|
-
|
|
5
|
-
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
6
|
-
type SlotSubscriberConfig = {
|
|
7
|
-
resubTimeoutMs?: number;
|
|
8
|
-
}; // for future customization
|
|
9
|
-
|
|
10
|
-
/** Events emitted on `SlotSubscriber.eventEmitter`. */
|
|
11
|
-
export interface SlotSubscriberEvents {
|
|
12
|
-
/** Fired whenever a new, strictly-greater slot is observed (including the initial slot fetched by `subscribe()`). */
|
|
13
|
-
newSlot: (newSlot: number) => void;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* SlotSubscriber — tracks the current slot via `connection.onSlotChange`,
|
|
18
|
-
* with an optional stall-detection resubscribe. Slot updates that are not
|
|
19
|
-
* strictly greater than the currently tracked slot are ignored (protects
|
|
20
|
-
* against out-of-order delivery).
|
|
21
|
-
*/
|
|
22
|
-
export class SlotSubscriber {
|
|
23
|
-
currentSlot = 0;
|
|
24
|
-
subscriptionId?: number;
|
|
25
|
-
eventEmitter: StrictEventEmitter<EventEmitter, SlotSubscriberEvents>;
|
|
26
|
-
|
|
27
|
-
// Reconnection
|
|
28
|
-
timeoutId?: ReturnType<typeof setTimeout>;
|
|
29
|
-
resubTimeoutMs?: number;
|
|
30
|
-
isUnsubscribing = false;
|
|
31
|
-
receivingData = false;
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* @param connection RPC connection to subscribe on.
|
|
35
|
-
* @param config.resubTimeoutMs If set to a positive value, resubscribe when no slot update arrives for this many ms; `0` (or unset) disables the resubscribe watchdog. Positive values below 1000ms log a warning (too aggressive) but are still honored.
|
|
36
|
-
*/
|
|
37
|
-
public constructor(
|
|
38
|
-
private connection: Connection,
|
|
39
|
-
config?: SlotSubscriberConfig
|
|
40
|
-
) {
|
|
41
|
-
this.eventEmitter = new EventEmitter();
|
|
42
|
-
this.resubTimeoutMs = config?.resubTimeoutMs;
|
|
43
|
-
if (this.resubTimeoutMs !== undefined && this.resubTimeoutMs < 1000) {
|
|
44
|
-
console.log(
|
|
45
|
-
'resubTimeoutMs should be at least 1000ms to avoid spamming resub'
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/** Fetches the current slot once via RPC, then subscribes to `onSlotChange` for live updates. Idempotent while already subscribed. */
|
|
51
|
-
public async subscribe(): Promise<void> {
|
|
52
|
-
if (this.subscriptionId != null) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const newSlot = await this.connection.getSlot('confirmed');
|
|
57
|
-
this.updateCurrentSlot(newSlot);
|
|
58
|
-
|
|
59
|
-
this.subscriptionId = this.connection.onSlotChange((slotInfo) => {
|
|
60
|
-
const newSlot = slotInfo.slot;
|
|
61
|
-
|
|
62
|
-
if (!this.currentSlot || this.currentSlot < newSlot) {
|
|
63
|
-
if (this.resubTimeoutMs && !this.isUnsubscribing) {
|
|
64
|
-
this.receivingData = true;
|
|
65
|
-
clearTimeout(this.timeoutId);
|
|
66
|
-
this.setTimeout();
|
|
67
|
-
}
|
|
68
|
-
this.updateCurrentSlot(newSlot);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
if (this.resubTimeoutMs) {
|
|
73
|
-
this.receivingData = true;
|
|
74
|
-
this.setTimeout();
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
private updateCurrentSlot(slot: number) {
|
|
79
|
-
this.currentSlot = slot;
|
|
80
|
-
this.eventEmitter.emit('newSlot', slot);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
private setTimeout(): void {
|
|
84
|
-
this.timeoutId = setTimeout(async () => {
|
|
85
|
-
if (this.isUnsubscribing) {
|
|
86
|
-
// If we are in the process of unsubscribing, do not attempt to resubscribe
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
if (this.receivingData) {
|
|
91
|
-
console.log(
|
|
92
|
-
`No new slot in ${this.resubTimeoutMs}ms, slot subscriber resubscribing`
|
|
93
|
-
);
|
|
94
|
-
await this.unsubscribe(true);
|
|
95
|
-
this.receivingData = false;
|
|
96
|
-
await this.subscribe();
|
|
97
|
-
}
|
|
98
|
-
}, this.resubTimeoutMs);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/** @returns The most recently observed slot, or `0` if `subscribe()` hasn't completed yet. */
|
|
102
|
-
public getSlot(): number {
|
|
103
|
-
return this.currentSlot;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Removes the `onSlotChange` listener and cancels the resub timeout.
|
|
108
|
-
* @param onResub Internal flag used when unsubscribing as part of an automatic resubscribe cycle; when `false` (a caller-initiated unsubscribe), also permanently disables future auto-resubscribe by clearing `resubTimeoutMs`.
|
|
109
|
-
*/
|
|
110
|
-
public async unsubscribe(onResub = false): Promise<void> {
|
|
111
|
-
if (!onResub) {
|
|
112
|
-
this.resubTimeoutMs = undefined;
|
|
113
|
-
}
|
|
114
|
-
this.isUnsubscribing = true;
|
|
115
|
-
clearTimeout(this.timeoutId);
|
|
116
|
-
this.timeoutId = undefined;
|
|
117
|
-
|
|
118
|
-
if (this.subscriptionId != null) {
|
|
119
|
-
await this.connection.removeSlotChangeListener(this.subscriptionId);
|
|
120
|
-
this.subscriptionId = undefined;
|
|
121
|
-
this.isUnsubscribing = false;
|
|
122
|
-
} else {
|
|
123
|
-
this.isUnsubscribing = false;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Commitment,
|
|
3
|
-
Connection,
|
|
4
|
-
SYSVAR_SLOT_HASHES_PUBKEY,
|
|
5
|
-
} from '@solana/web3.js';
|
|
6
|
-
import bs58 from 'bs58';
|
|
7
|
-
import { BN } from '../isomorphic/anchor';
|
|
8
|
-
|
|
9
|
-
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
10
|
-
type SlothashSubscriberConfig = {
|
|
11
|
-
resubTimeoutMs?: number;
|
|
12
|
-
commitment?: Commitment;
|
|
13
|
-
}; // for future customization
|
|
14
|
-
|
|
15
|
-
/** A slot and its corresponding blockhash, decoded from the `SysvarS1otHashes111111111111111111111111111` account. */
|
|
16
|
-
export type Slothash = {
|
|
17
|
-
slot: number;
|
|
18
|
-
/** Base58-encoded blockhash for that slot. */
|
|
19
|
-
hash: string;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* SlothashSubscriber — tracks the most recent entry of the `SlotHashes`
|
|
24
|
-
* sysvar via `connection.onAccountChange`, with an optional stall-detection
|
|
25
|
-
* resubscribe. Updates whose slot is not strictly greater than the currently
|
|
26
|
-
* tracked one are ignored.
|
|
27
|
-
*/
|
|
28
|
-
export class SlothashSubscriber {
|
|
29
|
-
private _currentSlothash?: Slothash;
|
|
30
|
-
private get currentSlothash(): Slothash {
|
|
31
|
-
if (!this._currentSlothash) {
|
|
32
|
-
throw new Error(
|
|
33
|
-
'SlothashSubscriber: slothash accessed before subscribe()'
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
return this._currentSlothash;
|
|
37
|
-
}
|
|
38
|
-
subscriptionId?: number;
|
|
39
|
-
commitment: Commitment;
|
|
40
|
-
|
|
41
|
-
// Reconnection
|
|
42
|
-
timeoutId?: ReturnType<typeof setTimeout>;
|
|
43
|
-
resubTimeoutMs?: number;
|
|
44
|
-
isUnsubscribing = false;
|
|
45
|
-
receivingData = false;
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* @param connection RPC connection to subscribe on.
|
|
49
|
-
* @param config.commitment Commitment for both the initial fetch and the account-change subscription; defaults to `'processed'`.
|
|
50
|
-
* @param config.resubTimeoutMs If set to a positive value, resubscribe when no update arrives for this many ms; `0` (or unset) disables the resubscribe watchdog. Positive values below 1000ms log a warning but are still honored.
|
|
51
|
-
*/
|
|
52
|
-
public constructor(
|
|
53
|
-
private connection: Connection,
|
|
54
|
-
config?: SlothashSubscriberConfig
|
|
55
|
-
) {
|
|
56
|
-
this.resubTimeoutMs = config?.resubTimeoutMs;
|
|
57
|
-
this.commitment = config?.commitment ?? 'processed';
|
|
58
|
-
if (this.resubTimeoutMs != null && this.resubTimeoutMs < 1000) {
|
|
59
|
-
console.log(
|
|
60
|
-
'resubTimeoutMs should be at least 1000ms to avoid spamming resub'
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Fetches the `SlotHashes` sysvar once via RPC, then subscribes to
|
|
67
|
-
* `onAccountChange` for live updates. Idempotent while already subscribed.
|
|
68
|
-
* @throws If the sysvar account can't be fetched on the initial load.
|
|
69
|
-
*/
|
|
70
|
-
public async subscribe(): Promise<void> {
|
|
71
|
-
if (this.subscriptionId != null) {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const currentAccountData = await this.connection.getAccountInfo(
|
|
76
|
-
SYSVAR_SLOT_HASHES_PUBKEY,
|
|
77
|
-
this.commitment
|
|
78
|
-
);
|
|
79
|
-
if (currentAccountData == null) {
|
|
80
|
-
throw new Error('Failed to retrieve current slot hash');
|
|
81
|
-
}
|
|
82
|
-
this._currentSlothash = deserializeSlothash(currentAccountData.data);
|
|
83
|
-
|
|
84
|
-
this.subscriptionId = this.connection.onAccountChange(
|
|
85
|
-
SYSVAR_SLOT_HASHES_PUBKEY,
|
|
86
|
-
(slothashInfo, context) => {
|
|
87
|
-
if (
|
|
88
|
-
!this._currentSlothash ||
|
|
89
|
-
this._currentSlothash.slot < context.slot
|
|
90
|
-
) {
|
|
91
|
-
if (this.resubTimeoutMs && !this.isUnsubscribing) {
|
|
92
|
-
this.receivingData = true;
|
|
93
|
-
clearTimeout(this.timeoutId);
|
|
94
|
-
this.setTimeout();
|
|
95
|
-
}
|
|
96
|
-
this._currentSlothash = deserializeSlothash(slothashInfo.data);
|
|
97
|
-
}
|
|
98
|
-
},
|
|
99
|
-
this.commitment
|
|
100
|
-
);
|
|
101
|
-
|
|
102
|
-
if (this.resubTimeoutMs) {
|
|
103
|
-
this.receivingData = true;
|
|
104
|
-
this.setTimeout();
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
private setTimeout(): void {
|
|
109
|
-
this.timeoutId = setTimeout(async () => {
|
|
110
|
-
if (this.isUnsubscribing) {
|
|
111
|
-
// If we are in the process of unsubscribing, do not attempt to resubscribe
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
if (this.receivingData) {
|
|
116
|
-
console.log(
|
|
117
|
-
`No new slot in ${this.resubTimeoutMs}ms, slot subscriber resubscribing`
|
|
118
|
-
);
|
|
119
|
-
await this.unsubscribe(true);
|
|
120
|
-
this.receivingData = false;
|
|
121
|
-
await this.subscribe();
|
|
122
|
-
}
|
|
123
|
-
}, this.resubTimeoutMs);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* @returns The most recently observed `Slothash`.
|
|
128
|
-
* @throws If called before `subscribe()` has completed its initial fetch.
|
|
129
|
-
*/
|
|
130
|
-
public getSlothash(): Slothash {
|
|
131
|
-
return this.currentSlothash;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Removes the `onAccountChange` listener and cancels the resub timeout.
|
|
136
|
-
* @param onResub Internal flag used when unsubscribing as part of an automatic resubscribe cycle; when `false`, also permanently disables future auto-resubscribe by clearing `resubTimeoutMs`.
|
|
137
|
-
*/
|
|
138
|
-
public async unsubscribe(onResub = false): Promise<void> {
|
|
139
|
-
if (!onResub) {
|
|
140
|
-
this.resubTimeoutMs = undefined;
|
|
141
|
-
}
|
|
142
|
-
this.isUnsubscribing = true;
|
|
143
|
-
clearTimeout(this.timeoutId);
|
|
144
|
-
this.timeoutId = undefined;
|
|
145
|
-
|
|
146
|
-
if (this.subscriptionId != null) {
|
|
147
|
-
await this.connection.removeAccountChangeListener(this.subscriptionId);
|
|
148
|
-
this.subscriptionId = undefined;
|
|
149
|
-
this.isUnsubscribing = false;
|
|
150
|
-
} else {
|
|
151
|
-
this.isUnsubscribing = false;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
function deserializeSlothash(data: Buffer): Slothash {
|
|
157
|
-
const slotNumber = new BN(data.subarray(8, 16), 10, 'le');
|
|
158
|
-
const hash = bs58.encode(data.subarray(16, 48));
|
|
159
|
-
return {
|
|
160
|
-
slot: slotNumber.toNumber(),
|
|
161
|
-
hash,
|
|
162
|
-
};
|
|
163
|
-
}
|
|
@@ -1,315 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Connection,
|
|
3
|
-
PublicKey,
|
|
4
|
-
TransactionMessage,
|
|
5
|
-
AddressLookupTableAccount,
|
|
6
|
-
VersionedTransaction,
|
|
7
|
-
TransactionInstruction,
|
|
8
|
-
} from '@solana/web3.js';
|
|
9
|
-
import { BN } from '../isomorphic/anchor';
|
|
10
|
-
import {
|
|
11
|
-
JupiterClient,
|
|
12
|
-
QuoteResponse as JupiterQuoteResponse,
|
|
13
|
-
} from '../jupiter/jupiterClient';
|
|
14
|
-
import { TitanClient, SwapMode as TitanSwapMode } from '../titan/titanClient';
|
|
15
|
-
|
|
16
|
-
export type SwapMode = 'ExactIn' | 'ExactOut';
|
|
17
|
-
export type SwapClientType = 'jupiter' | 'titan';
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Unified quote response interface that combines properties from both Jupiter and Titan
|
|
21
|
-
* This provides a consistent interface while allowing for provider-specific fields
|
|
22
|
-
*/
|
|
23
|
-
export interface UnifiedQuoteResponse {
|
|
24
|
-
// Core properties available in both providers
|
|
25
|
-
inputMint: string;
|
|
26
|
-
inAmount: string;
|
|
27
|
-
outputMint: string;
|
|
28
|
-
outAmount: string;
|
|
29
|
-
swapMode: SwapMode;
|
|
30
|
-
slippageBps: number;
|
|
31
|
-
routePlan: Array<{ swapInfo: any; percent: number }>;
|
|
32
|
-
|
|
33
|
-
// Optional properties that may not be available in all providers
|
|
34
|
-
otherAmountThreshold?: string; // Jupiter has this, Titan doesn't
|
|
35
|
-
priceImpactPct?: string; // Jupiter provides this, Titan doesn't (we calculate it)
|
|
36
|
-
platformFee?: { amount?: string; feeBps?: number }; // Format varies between providers
|
|
37
|
-
contextSlot?: number;
|
|
38
|
-
timeTaken?: number;
|
|
39
|
-
error?: string;
|
|
40
|
-
errorCode?: string;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export interface SwapQuoteParams {
|
|
44
|
-
inputMint: PublicKey;
|
|
45
|
-
outputMint: PublicKey;
|
|
46
|
-
amount: BN;
|
|
47
|
-
userPublicKey?: PublicKey; // Required for Titan, optional for Jupiter
|
|
48
|
-
maxAccounts?: number;
|
|
49
|
-
slippageBps?: number;
|
|
50
|
-
swapMode?: SwapMode;
|
|
51
|
-
onlyDirectRoutes?: boolean;
|
|
52
|
-
excludeDexes?: string[];
|
|
53
|
-
sizeConstraint?: number; // Titan-specific
|
|
54
|
-
accountsLimitWritable?: number; // Titan-specific
|
|
55
|
-
autoSlippage?: boolean; // Jupiter-specific
|
|
56
|
-
maxAutoSlippageBps?: number; // Jupiter-specific
|
|
57
|
-
usdEstimate?: number; // Jupiter-specific
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export interface SwapTransactionParams {
|
|
61
|
-
quote: UnifiedQuoteResponse;
|
|
62
|
-
userPublicKey: PublicKey;
|
|
63
|
-
slippageBps?: number;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export interface SwapTransactionResult {
|
|
67
|
-
transaction?: VersionedTransaction; // Jupiter returns this
|
|
68
|
-
transactionMessage?: TransactionMessage; // Titan returns this
|
|
69
|
-
lookupTables?: AddressLookupTableAccount[]; // Titan returns this
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export class UnifiedSwapClient {
|
|
73
|
-
private client: JupiterClient | TitanClient;
|
|
74
|
-
private clientType: SwapClientType;
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Create a unified swap client
|
|
78
|
-
* @param clientType - 'jupiter' or 'titan'
|
|
79
|
-
* @param connection - Solana connection
|
|
80
|
-
* @param authToken - For Titan: auth token (required when not using proxy). For Jupiter: API key (required for api.jup.ag, get free key at https://portal.jup.ag)
|
|
81
|
-
* @param url - Optional custom URL
|
|
82
|
-
* @param proxyUrl - Optional proxy URL for Titan
|
|
83
|
-
*/
|
|
84
|
-
constructor({
|
|
85
|
-
clientType,
|
|
86
|
-
connection,
|
|
87
|
-
authToken,
|
|
88
|
-
url,
|
|
89
|
-
proxyUrl,
|
|
90
|
-
}: {
|
|
91
|
-
clientType: SwapClientType;
|
|
92
|
-
connection: Connection;
|
|
93
|
-
authToken?: string; // For Titan: auth token. For Jupiter: API key (required for api.jup.ag)
|
|
94
|
-
url?: string; // Optional custom URL
|
|
95
|
-
proxyUrl?: string; // Optional proxy URL for Titan
|
|
96
|
-
}) {
|
|
97
|
-
this.clientType = clientType;
|
|
98
|
-
|
|
99
|
-
if (clientType === 'jupiter') {
|
|
100
|
-
this.client = new JupiterClient({
|
|
101
|
-
connection,
|
|
102
|
-
url,
|
|
103
|
-
apiKey: authToken,
|
|
104
|
-
});
|
|
105
|
-
} else if (clientType === 'titan') {
|
|
106
|
-
this.client = new TitanClient({
|
|
107
|
-
connection,
|
|
108
|
-
authToken: authToken || '', // Not needed when using proxy
|
|
109
|
-
url,
|
|
110
|
-
proxyUrl,
|
|
111
|
-
});
|
|
112
|
-
} else {
|
|
113
|
-
throw new Error(`Unsupported client type: ${clientType}`);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Get a swap quote from the underlying client
|
|
119
|
-
*/
|
|
120
|
-
public async getQuote(
|
|
121
|
-
params: SwapQuoteParams
|
|
122
|
-
): Promise<UnifiedQuoteResponse> {
|
|
123
|
-
if (this.clientType === 'jupiter') {
|
|
124
|
-
const jupiterClient = this.client as JupiterClient;
|
|
125
|
-
const {
|
|
126
|
-
userPublicKey: _userPublicKey, // Not needed for Jupiter
|
|
127
|
-
sizeConstraint: _sizeConstraint, // Jupiter-specific params to exclude
|
|
128
|
-
accountsLimitWritable: _accountsLimitWritable,
|
|
129
|
-
...jupiterParams
|
|
130
|
-
} = params;
|
|
131
|
-
|
|
132
|
-
return await jupiterClient.getQuote(jupiterParams);
|
|
133
|
-
} else {
|
|
134
|
-
const titanClient = this.client as TitanClient;
|
|
135
|
-
const {
|
|
136
|
-
autoSlippage: _autoSlippage, // Titan-specific params to exclude
|
|
137
|
-
maxAutoSlippageBps: _maxAutoSlippageBps,
|
|
138
|
-
usdEstimate: _usdEstimate,
|
|
139
|
-
...titanParams
|
|
140
|
-
} = params;
|
|
141
|
-
|
|
142
|
-
if (!titanParams.userPublicKey) {
|
|
143
|
-
throw new Error('userPublicKey is required for Titan quotes');
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// Cast to ensure TypeScript knows userPublicKey is defined
|
|
147
|
-
const titanParamsWithUser = {
|
|
148
|
-
...titanParams,
|
|
149
|
-
userPublicKey: titanParams.userPublicKey,
|
|
150
|
-
swapMode: titanParams.swapMode as string, // Titan expects string
|
|
151
|
-
sizeConstraint: titanParams.sizeConstraint || 1280 - 375, // Use same default as getSwapInstructions
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
return await titanClient.getQuote(titanParamsWithUser);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Get a swap transaction from the underlying client
|
|
160
|
-
*/
|
|
161
|
-
public async getSwap(
|
|
162
|
-
params: SwapTransactionParams
|
|
163
|
-
): Promise<SwapTransactionResult> {
|
|
164
|
-
if (this.clientType === 'jupiter') {
|
|
165
|
-
const jupiterClient = this.client as JupiterClient;
|
|
166
|
-
// Cast the quote to Jupiter's specific QuoteResponse type
|
|
167
|
-
const jupiterParams = {
|
|
168
|
-
...params,
|
|
169
|
-
quote: params.quote as JupiterQuoteResponse,
|
|
170
|
-
};
|
|
171
|
-
const transaction = await jupiterClient.getSwap(jupiterParams);
|
|
172
|
-
return { transaction };
|
|
173
|
-
} else {
|
|
174
|
-
const titanClient = this.client as TitanClient;
|
|
175
|
-
const { userPublicKey } = params;
|
|
176
|
-
|
|
177
|
-
// For Titan, we need to reconstruct the parameters from the quote
|
|
178
|
-
const result = await titanClient.getSwap({
|
|
179
|
-
userPublicKey,
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
return {
|
|
183
|
-
transactionMessage: result.transactionMessage,
|
|
184
|
-
lookupTables: result.lookupTables,
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Get swap instructions from the underlying client (Jupiter or Titan)
|
|
191
|
-
* This is the core swap logic without any context preparation
|
|
192
|
-
*/
|
|
193
|
-
public async getSwapInstructions({
|
|
194
|
-
inputMint,
|
|
195
|
-
outputMint,
|
|
196
|
-
amount,
|
|
197
|
-
userPublicKey,
|
|
198
|
-
slippageBps,
|
|
199
|
-
swapMode = 'ExactIn',
|
|
200
|
-
onlyDirectRoutes = false,
|
|
201
|
-
quote,
|
|
202
|
-
sizeConstraint,
|
|
203
|
-
}: {
|
|
204
|
-
inputMint: PublicKey;
|
|
205
|
-
outputMint: PublicKey;
|
|
206
|
-
amount: BN;
|
|
207
|
-
userPublicKey: PublicKey;
|
|
208
|
-
slippageBps?: number;
|
|
209
|
-
swapMode?: SwapMode;
|
|
210
|
-
onlyDirectRoutes?: boolean;
|
|
211
|
-
quote?: UnifiedQuoteResponse;
|
|
212
|
-
sizeConstraint?: number;
|
|
213
|
-
}): Promise<{
|
|
214
|
-
instructions: TransactionInstruction[];
|
|
215
|
-
lookupTables: AddressLookupTableAccount[];
|
|
216
|
-
}> {
|
|
217
|
-
const isExactOut = swapMode === 'ExactOut';
|
|
218
|
-
let swapInstructions: TransactionInstruction[];
|
|
219
|
-
let lookupTables: AddressLookupTableAccount[];
|
|
220
|
-
|
|
221
|
-
if (this.clientType === 'jupiter') {
|
|
222
|
-
const jupiterClient = this.client as JupiterClient;
|
|
223
|
-
|
|
224
|
-
// Get quote if not provided
|
|
225
|
-
let finalQuote = quote as JupiterQuoteResponse;
|
|
226
|
-
if (!finalQuote) {
|
|
227
|
-
finalQuote = await jupiterClient.getQuote({
|
|
228
|
-
inputMint,
|
|
229
|
-
outputMint,
|
|
230
|
-
amount,
|
|
231
|
-
slippageBps,
|
|
232
|
-
swapMode,
|
|
233
|
-
onlyDirectRoutes,
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
if (!finalQuote) {
|
|
238
|
-
throw new Error('Could not fetch swap quote. Please try again.');
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// Get swap transaction and extract instructions
|
|
242
|
-
const transaction = await jupiterClient.getSwap({
|
|
243
|
-
quote: finalQuote,
|
|
244
|
-
userPublicKey,
|
|
245
|
-
slippageBps,
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
const { transactionMessage, lookupTables: jupiterLookupTables } =
|
|
249
|
-
await jupiterClient.getTransactionMessageAndLookupTables({
|
|
250
|
-
transaction,
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
swapInstructions = jupiterClient.getJupiterInstructions({
|
|
254
|
-
transactionMessage,
|
|
255
|
-
inputMint,
|
|
256
|
-
outputMint,
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
lookupTables = jupiterLookupTables;
|
|
260
|
-
} else {
|
|
261
|
-
const titanClient = this.client as TitanClient;
|
|
262
|
-
|
|
263
|
-
// For Titan, get swap directly (it handles quote internally)
|
|
264
|
-
const { transactionMessage, lookupTables: titanLookupTables } =
|
|
265
|
-
await titanClient.getSwap({
|
|
266
|
-
inputMint,
|
|
267
|
-
outputMint,
|
|
268
|
-
amount,
|
|
269
|
-
userPublicKey,
|
|
270
|
-
slippageBps,
|
|
271
|
-
swapMode: isExactOut ? TitanSwapMode.ExactOut : TitanSwapMode.ExactIn,
|
|
272
|
-
onlyDirectRoutes,
|
|
273
|
-
sizeConstraint: sizeConstraint || 1280 - 375, // MAX_TX_BYTE_SIZE - buffer for velocity instructions
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
swapInstructions = titanClient.getTitanInstructions({
|
|
277
|
-
transactionMessage,
|
|
278
|
-
inputMint,
|
|
279
|
-
outputMint,
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
lookupTables = titanLookupTables;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
return { instructions: swapInstructions, lookupTables };
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* Get the underlying client instance
|
|
290
|
-
*/
|
|
291
|
-
public getClient(): JupiterClient | TitanClient {
|
|
292
|
-
return this.client;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Get the client type
|
|
297
|
-
*/
|
|
298
|
-
public getClientType(): SwapClientType {
|
|
299
|
-
return this.clientType;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
/**
|
|
303
|
-
* Check if this is a Jupiter client
|
|
304
|
-
*/
|
|
305
|
-
public isJupiter(): boolean {
|
|
306
|
-
return this.clientType === 'jupiter';
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
/**
|
|
310
|
-
* Check if this is a Titan client
|
|
311
|
-
*/
|
|
312
|
-
public isTitan(): boolean {
|
|
313
|
-
return this.clientType === 'titan';
|
|
314
|
-
}
|
|
315
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { Context, PublicKey } from '@solana/web3.js';
|
|
2
|
-
import { grpcProgramAccountSubscriber } from '../accounts/grpcProgramAccountSubscriber';
|
|
3
|
-
import { GrpcConfigs } from '../accounts/types';
|
|
4
|
-
import { SignedMsgUserOrdersAccount } from '../types';
|
|
5
|
-
import { getSignedMsgUserOrdersFilter } from '../memcmp';
|
|
6
|
-
import {
|
|
7
|
-
SignedMsgUserOrdersAccountSubscriber,
|
|
8
|
-
SignedMsgUserOrdersAccountSubscriberConfig,
|
|
9
|
-
} from './signedMsgUserAccountSubscriber';
|
|
10
|
-
|
|
11
|
-
export class grpcSignedMsgUserOrdersAccountSubscriber extends SignedMsgUserOrdersAccountSubscriber {
|
|
12
|
-
private grpcConfigs: GrpcConfigs;
|
|
13
|
-
|
|
14
|
-
constructor({
|
|
15
|
-
grpcConfigs,
|
|
16
|
-
...rest
|
|
17
|
-
}: SignedMsgUserOrdersAccountSubscriberConfig & {
|
|
18
|
-
grpcConfigs: GrpcConfigs;
|
|
19
|
-
}) {
|
|
20
|
-
super(rest);
|
|
21
|
-
this.grpcConfigs = grpcConfigs;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
public async subscribe(): Promise<void> {
|
|
25
|
-
if (!this._subscriber) {
|
|
26
|
-
this._subscriber =
|
|
27
|
-
await grpcProgramAccountSubscriber.create<SignedMsgUserOrdersAccount>(
|
|
28
|
-
this.grpcConfigs,
|
|
29
|
-
'SingedMsgUserOrdersAccountMap',
|
|
30
|
-
'signedMsgUserOrders',
|
|
31
|
-
this.velocityClient.program,
|
|
32
|
-
this.decodeFn,
|
|
33
|
-
{
|
|
34
|
-
filters: [getSignedMsgUserOrdersFilter()],
|
|
35
|
-
},
|
|
36
|
-
this.resubOpts
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
await this.subscriber.subscribe(
|
|
41
|
-
(
|
|
42
|
-
_accountId: PublicKey,
|
|
43
|
-
account: SignedMsgUserOrdersAccount,
|
|
44
|
-
context: Context
|
|
45
|
-
) => {
|
|
46
|
-
this.tryUpdateSignedMsgUserOrdersAccount(
|
|
47
|
-
account,
|
|
48
|
-
'decoded',
|
|
49
|
-
context.slot
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
if (this.resyncIntervalMs) {
|
|
55
|
-
const recursiveResync = () => {
|
|
56
|
-
this.resyncTimeoutId = setTimeout(() => {
|
|
57
|
-
this.fetch()
|
|
58
|
-
.catch((e) => {
|
|
59
|
-
console.error('Failed to resync in OrderSubscriber');
|
|
60
|
-
console.log(e);
|
|
61
|
-
})
|
|
62
|
-
.finally(() => {
|
|
63
|
-
if (!this.resyncTimeoutId) return;
|
|
64
|
-
recursiveResync();
|
|
65
|
-
});
|
|
66
|
-
}, this.resyncIntervalMs);
|
|
67
|
-
};
|
|
68
|
-
recursiveResync();
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
public async unsubscribe(): Promise<void> {
|
|
73
|
-
if (!this._subscriber) return;
|
|
74
|
-
await this._subscriber.unsubscribe();
|
|
75
|
-
this._subscriber = undefined;
|
|
76
|
-
if (this.resyncTimeoutId !== undefined) {
|
|
77
|
-
clearTimeout(this.resyncTimeoutId);
|
|
78
|
-
this.resyncTimeoutId = undefined;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
package/src/swift/index.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Swift / signed-message order infrastructure.
|
|
3
|
-
* Supports off-chain signed order messages that are matched and settled on-chain without
|
|
4
|
-
* a separate place-order transaction. Used for low-latency taker flows.
|
|
5
|
-
* `swiftOrderSubscriber.ts` — subscribes to incoming Swift orders via gRPC or WebSocket.
|
|
6
|
-
* `signedMsgUserAccountSubscriber.ts` — caches signed-message user account state.
|
|
7
|
-
*/
|
|
8
|
-
export * from './swiftOrderSubscriber';
|
|
9
|
-
export * from './signedMsgUserAccountSubscriber';
|
|
10
|
-
export * from './grpcSignedMsgUserAccountSubscriber';
|