@drift-labs/sdk 2.40.0-beta.7 → 2.40.0-beta.9
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/VERSION +1 -1
- package/lib/accounts/types.d.ts +5 -1
- package/lib/accounts/webSocketAccountSubscriber.d.ts +6 -1
- package/lib/accounts/webSocketAccountSubscriber.js +28 -2
- package/lib/accounts/webSocketDriftClientAccountSubscriber.d.ts +2 -1
- package/lib/accounts/webSocketDriftClientAccountSubscriber.js +6 -5
- package/lib/accounts/webSocketProgramAccountSubscriber.d.ts +32 -0
- package/lib/accounts/webSocketProgramAccountSubscriber.js +99 -0
- package/lib/accounts/webSocketUserAccountSubscriber.d.ts +2 -1
- package/lib/accounts/webSocketUserAccountSubscriber.js +3 -2
- package/lib/accounts/webSocketUserStatsAccountSubsriber.d.ts +2 -1
- package/lib/accounts/webSocketUserStatsAccountSubsriber.js +3 -2
- package/lib/auctionSubscriber/auctionSubscriber.d.ts +3 -2
- package/lib/auctionSubscriber/auctionSubscriber.js +15 -7
- package/lib/auctionSubscriber/types.d.ts +1 -0
- package/lib/constants/spotMarkets.js +1 -1
- package/lib/driftClient.js +3 -3
- package/lib/driftClientConfig.d.ts +1 -0
- package/lib/math/superStake.d.ts +51 -4
- package/lib/math/superStake.js +173 -21
- package/lib/math/utils.d.ts +1 -0
- package/lib/math/utils.js +10 -1
- package/lib/orderSubscriber/OrderSubscriber.d.ts +1 -3
- package/lib/orderSubscriber/OrderSubscriber.js +4 -3
- package/lib/orderSubscriber/WebsocketSubscription.d.ts +4 -2
- package/lib/orderSubscriber/WebsocketSubscription.js +13 -12
- package/lib/orderSubscriber/types.d.ts +1 -0
- package/package.json +1 -1
- package/src/accounts/types.ts +8 -1
- package/src/accounts/webSocketAccountSubscriber.ts +36 -2
- package/src/accounts/webSocketDriftClientAccountSubscriber.ts +15 -5
- package/src/accounts/webSocketProgramAccountSubscriber.ts +152 -0
- package/src/accounts/webSocketUserAccountSubscriber.ts +10 -2
- package/src/accounts/webSocketUserStatsAccountSubsriber.ts +10 -2
- package/src/auctionSubscriber/auctionSubscriber.ts +30 -21
- package/src/auctionSubscriber/types.ts +1 -0
- package/src/constants/spotMarkets.ts +1 -1
- package/src/driftClient.ts +2 -1
- package/src/driftClientConfig.ts +1 -0
- package/src/math/superStake.ts +248 -24
- package/src/math/utils.ts +12 -0
- package/src/orderSubscriber/OrderSubscriber.ts +12 -7
- package/src/orderSubscriber/WebsocketSubscription.ts +33 -23
- package/src/orderSubscriber/types.ts +1 -0
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.40.0-beta.
|
|
1
|
+
2.40.0-beta.9
|
package/lib/accounts/types.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { SpotMarketAccount, PerpMarketAccount, OracleSource, StateAccount, UserAccount, UserStatsAccount } from '../types';
|
|
4
4
|
import StrictEventEmitter from 'strict-event-emitter-types';
|
|
5
5
|
import { EventEmitter } from 'events';
|
|
6
|
-
import { PublicKey } from '@solana/web3.js';
|
|
6
|
+
import { Context, PublicKey } from '@solana/web3.js';
|
|
7
7
|
import { Account } from '@solana/spl-token';
|
|
8
8
|
import { OracleInfo, OraclePriceData } from '..';
|
|
9
9
|
export interface AccountSubscriber<T> {
|
|
@@ -13,6 +13,10 @@ export interface AccountSubscriber<T> {
|
|
|
13
13
|
unsubscribe(): Promise<void>;
|
|
14
14
|
setData(userAccount: T, slot?: number): void;
|
|
15
15
|
}
|
|
16
|
+
export interface ProgramAccountSubscriber<T> {
|
|
17
|
+
subscribe(onChange: (accountId: PublicKey, data: T, context: Context) => void): Promise<void>;
|
|
18
|
+
unsubscribe(): Promise<void>;
|
|
19
|
+
}
|
|
16
20
|
export declare class NotSubscribedError extends Error {
|
|
17
21
|
name: string;
|
|
18
22
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
2
3
|
import { DataAndSlot, BufferAndSlot, AccountSubscriber } from './types';
|
|
3
4
|
import { Program } from '@coral-xyz/anchor';
|
|
4
5
|
import { AccountInfo, Context, PublicKey } from '@solana/web3.js';
|
|
@@ -11,9 +12,13 @@ export declare class WebSocketAccountSubscriber<T> implements AccountSubscriber<
|
|
|
11
12
|
decodeBufferFn: (buffer: Buffer) => T;
|
|
12
13
|
onChange: (data: T) => void;
|
|
13
14
|
listenerId?: number;
|
|
14
|
-
|
|
15
|
+
resubTimeoutMs?: number;
|
|
16
|
+
timeoutId?: NodeJS.Timeout;
|
|
17
|
+
receivingData: boolean;
|
|
18
|
+
constructor(accountName: string, program: Program, accountPublicKey: PublicKey, decodeBuffer?: (buffer: Buffer) => T, resubTimeoutMs?: number);
|
|
15
19
|
subscribe(onChange: (data: T) => void): Promise<void>;
|
|
16
20
|
setData(data: T, slot?: number): void;
|
|
21
|
+
private setTimeout;
|
|
17
22
|
fetch(): Promise<void>;
|
|
18
23
|
handleRpcResponse(context: Context, accountInfo?: AccountInfo<Buffer>): void;
|
|
19
24
|
decodeBuffer(buffer: Buffer): T;
|
|
@@ -3,11 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.WebSocketAccountSubscriber = void 0;
|
|
4
4
|
const utils_1 = require("./utils");
|
|
5
5
|
class WebSocketAccountSubscriber {
|
|
6
|
-
constructor(accountName, program, accountPublicKey, decodeBuffer) {
|
|
6
|
+
constructor(accountName, program, accountPublicKey, decodeBuffer, resubTimeoutMs) {
|
|
7
7
|
this.accountName = accountName;
|
|
8
8
|
this.program = program;
|
|
9
9
|
this.accountPublicKey = accountPublicKey;
|
|
10
10
|
this.decodeBufferFn = decodeBuffer;
|
|
11
|
+
this.resubTimeoutMs = resubTimeoutMs;
|
|
12
|
+
this.receivingData = false;
|
|
11
13
|
}
|
|
12
14
|
async subscribe(onChange) {
|
|
13
15
|
if (this.listenerId) {
|
|
@@ -18,8 +20,19 @@ class WebSocketAccountSubscriber {
|
|
|
18
20
|
await this.fetch();
|
|
19
21
|
}
|
|
20
22
|
this.listenerId = this.program.provider.connection.onAccountChange(this.accountPublicKey, (accountInfo, context) => {
|
|
21
|
-
this.
|
|
23
|
+
if (this.resubTimeoutMs) {
|
|
24
|
+
this.receivingData = true;
|
|
25
|
+
clearTimeout(this.timeoutId);
|
|
26
|
+
this.handleRpcResponse(context, accountInfo);
|
|
27
|
+
this.setTimeout();
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
this.handleRpcResponse(context, accountInfo);
|
|
31
|
+
}
|
|
22
32
|
}, this.program.provider.opts.commitment);
|
|
33
|
+
if (this.resubTimeoutMs) {
|
|
34
|
+
this.setTimeout();
|
|
35
|
+
}
|
|
23
36
|
}
|
|
24
37
|
setData(data, slot) {
|
|
25
38
|
const newSlot = slot || 0;
|
|
@@ -31,6 +44,19 @@ class WebSocketAccountSubscriber {
|
|
|
31
44
|
slot,
|
|
32
45
|
};
|
|
33
46
|
}
|
|
47
|
+
setTimeout() {
|
|
48
|
+
if (!this.onChange) {
|
|
49
|
+
throw new Error('onChange callback function must be set');
|
|
50
|
+
}
|
|
51
|
+
this.timeoutId = setTimeout(async () => {
|
|
52
|
+
if (this.receivingData) {
|
|
53
|
+
console.log(`No ws data from ${this.accountName} in ${this.resubTimeoutMs}ms, resubscribing`);
|
|
54
|
+
await this.unsubscribe();
|
|
55
|
+
this.receivingData = false;
|
|
56
|
+
await this.subscribe(this.onChange);
|
|
57
|
+
}
|
|
58
|
+
}, this.resubTimeoutMs);
|
|
59
|
+
}
|
|
34
60
|
async fetch() {
|
|
35
61
|
const rpcResponse = await this.program.provider.connection.getAccountInfoAndContext(this.accountPublicKey, this.program.provider.opts.commitment);
|
|
36
62
|
this.handleRpcResponse(rpcResponse.context, rpcResponse === null || rpcResponse === void 0 ? void 0 : rpcResponse.value);
|
|
@@ -15,6 +15,7 @@ export declare class WebSocketDriftClientAccountSubscriber implements DriftClien
|
|
|
15
15
|
spotMarketIndexes: number[];
|
|
16
16
|
oracleInfos: OracleInfo[];
|
|
17
17
|
oracleClientCache: OracleClientCache;
|
|
18
|
+
resubTimeoutMs?: number;
|
|
18
19
|
shouldFindAllMarketsAndOracles: boolean;
|
|
19
20
|
eventEmitter: StrictEventEmitter<EventEmitter, DriftClientAccountEvents>;
|
|
20
21
|
stateAccountSubscriber?: AccountSubscriber<StateAccount>;
|
|
@@ -24,7 +25,7 @@ export declare class WebSocketDriftClientAccountSubscriber implements DriftClien
|
|
|
24
25
|
private isSubscribing;
|
|
25
26
|
private subscriptionPromise;
|
|
26
27
|
private subscriptionPromiseResolver;
|
|
27
|
-
constructor(program: Program, perpMarketIndexes: number[], spotMarketIndexes: number[], oracleInfos: OracleInfo[], shouldFindAllMarketsAndOracles: boolean);
|
|
28
|
+
constructor(program: Program, perpMarketIndexes: number[], spotMarketIndexes: number[], oracleInfos: OracleInfo[], shouldFindAllMarketsAndOracles: boolean, resubTimeoutMs?: number);
|
|
28
29
|
subscribe(): Promise<boolean>;
|
|
29
30
|
subscribeToPerpMarketAccounts(): Promise<boolean>;
|
|
30
31
|
subscribeToPerpMarketAccount(marketIndex: number): Promise<boolean>;
|
|
@@ -10,7 +10,7 @@ const oracleClientCache_1 = require("../oracles/oracleClientCache");
|
|
|
10
10
|
const quoteAssetOracleClient_1 = require("../oracles/quoteAssetOracleClient");
|
|
11
11
|
const config_1 = require("../config");
|
|
12
12
|
class WebSocketDriftClientAccountSubscriber {
|
|
13
|
-
constructor(program, perpMarketIndexes, spotMarketIndexes, oracleInfos, shouldFindAllMarketsAndOracles) {
|
|
13
|
+
constructor(program, perpMarketIndexes, spotMarketIndexes, oracleInfos, shouldFindAllMarketsAndOracles, resubTimeoutMs) {
|
|
14
14
|
this.oracleClientCache = new oracleClientCache_1.OracleClientCache();
|
|
15
15
|
this.perpMarketAccountSubscribers = new Map();
|
|
16
16
|
this.spotMarketAccountSubscribers = new Map();
|
|
@@ -23,6 +23,7 @@ class WebSocketDriftClientAccountSubscriber {
|
|
|
23
23
|
this.spotMarketIndexes = spotMarketIndexes;
|
|
24
24
|
this.oracleInfos = oracleInfos;
|
|
25
25
|
this.shouldFindAllMarketsAndOracles = shouldFindAllMarketsAndOracles;
|
|
26
|
+
this.resubTimeoutMs = resubTimeoutMs;
|
|
26
27
|
}
|
|
27
28
|
async subscribe() {
|
|
28
29
|
if (this.isSubscribed) {
|
|
@@ -43,7 +44,7 @@ class WebSocketDriftClientAccountSubscriber {
|
|
|
43
44
|
}
|
|
44
45
|
const statePublicKey = await (0, pda_1.getDriftStateAccountPublicKey)(this.program.programId);
|
|
45
46
|
// create and activate main state account subscription
|
|
46
|
-
this.stateAccountSubscriber = new webSocketAccountSubscriber_1.WebSocketAccountSubscriber('state', this.program, statePublicKey);
|
|
47
|
+
this.stateAccountSubscriber = new webSocketAccountSubscriber_1.WebSocketAccountSubscriber('state', this.program, statePublicKey, undefined, this.resubTimeoutMs);
|
|
47
48
|
await this.stateAccountSubscriber.subscribe((data) => {
|
|
48
49
|
this.eventEmitter.emit('stateAccountUpdate', data);
|
|
49
50
|
this.eventEmitter.emit('update');
|
|
@@ -68,7 +69,7 @@ class WebSocketDriftClientAccountSubscriber {
|
|
|
68
69
|
}
|
|
69
70
|
async subscribeToPerpMarketAccount(marketIndex) {
|
|
70
71
|
const perpMarketPublicKey = await (0, pda_1.getPerpMarketPublicKey)(this.program.programId, marketIndex);
|
|
71
|
-
const accountSubscriber = new webSocketAccountSubscriber_1.WebSocketAccountSubscriber('perpMarket', this.program, perpMarketPublicKey);
|
|
72
|
+
const accountSubscriber = new webSocketAccountSubscriber_1.WebSocketAccountSubscriber('perpMarket', this.program, perpMarketPublicKey, undefined, this.resubTimeoutMs);
|
|
72
73
|
await accountSubscriber.subscribe((data) => {
|
|
73
74
|
this.eventEmitter.emit('perpMarketAccountUpdate', data);
|
|
74
75
|
this.eventEmitter.emit('update');
|
|
@@ -84,7 +85,7 @@ class WebSocketDriftClientAccountSubscriber {
|
|
|
84
85
|
}
|
|
85
86
|
async subscribeToSpotMarketAccount(marketIndex) {
|
|
86
87
|
const marketPublicKey = await (0, pda_1.getSpotMarketPublicKey)(this.program.programId, marketIndex);
|
|
87
|
-
const accountSubscriber = new webSocketAccountSubscriber_1.WebSocketAccountSubscriber('spotMarket', this.program, marketPublicKey);
|
|
88
|
+
const accountSubscriber = new webSocketAccountSubscriber_1.WebSocketAccountSubscriber('spotMarket', this.program, marketPublicKey, undefined, this.resubTimeoutMs);
|
|
88
89
|
await accountSubscriber.subscribe((data) => {
|
|
89
90
|
this.eventEmitter.emit('spotMarketAccountUpdate', data);
|
|
90
91
|
this.eventEmitter.emit('update');
|
|
@@ -104,7 +105,7 @@ class WebSocketDriftClientAccountSubscriber {
|
|
|
104
105
|
const client = this.oracleClientCache.get(oracleInfo.source, this.program.provider.connection);
|
|
105
106
|
const accountSubscriber = new webSocketAccountSubscriber_1.WebSocketAccountSubscriber('oracle', this.program, oracleInfo.publicKey, (buffer) => {
|
|
106
107
|
return client.getOraclePriceDataFromBuffer(buffer);
|
|
107
|
-
});
|
|
108
|
+
}, this.resubTimeoutMs);
|
|
108
109
|
await accountSubscriber.subscribe((data) => {
|
|
109
110
|
this.eventEmitter.emit('oraclePriceUpdate', oracleInfo.publicKey, data);
|
|
110
111
|
this.eventEmitter.emit('update');
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { DataAndSlot, BufferAndSlot, ProgramAccountSubscriber } from './types';
|
|
4
|
+
import { Program } from '@coral-xyz/anchor';
|
|
5
|
+
import { Commitment, Context, KeyedAccountInfo, MemcmpFilter, PublicKey } from '@solana/web3.js';
|
|
6
|
+
export declare class WebSocketProgramAccountSubscriber<T> implements ProgramAccountSubscriber<T> {
|
|
7
|
+
subscriptionName: string;
|
|
8
|
+
accountDiscriminator: string;
|
|
9
|
+
dataAndSlot?: DataAndSlot<T> & {
|
|
10
|
+
accountId: PublicKey;
|
|
11
|
+
};
|
|
12
|
+
bufferAndSlot?: BufferAndSlot;
|
|
13
|
+
program: Program;
|
|
14
|
+
decodeBuffer: (accountName: string, ix: Buffer) => T;
|
|
15
|
+
onChange: (accountId: PublicKey, data: T, context: Context) => void;
|
|
16
|
+
listenerId?: number;
|
|
17
|
+
resubTimeoutMs?: number;
|
|
18
|
+
timeoutId?: NodeJS.Timeout;
|
|
19
|
+
options: {
|
|
20
|
+
filters: MemcmpFilter[];
|
|
21
|
+
commitment?: Commitment;
|
|
22
|
+
};
|
|
23
|
+
receivingData: boolean;
|
|
24
|
+
constructor(subscriptionName: string, accountDiscriminator: string, program: Program, decodeBufferFn: (accountName: string, ix: Buffer) => T, options?: {
|
|
25
|
+
filters: MemcmpFilter[];
|
|
26
|
+
commitment?: Commitment;
|
|
27
|
+
}, resubTimeoutMs?: number);
|
|
28
|
+
subscribe(onChange: (accountId: PublicKey, data: T, context: Context) => void): Promise<void>;
|
|
29
|
+
private setTimeout;
|
|
30
|
+
handleRpcResponse(context: Context, keyedAccountInfo: KeyedAccountInfo): void;
|
|
31
|
+
unsubscribe(): Promise<void>;
|
|
32
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebSocketProgramAccountSubscriber = void 0;
|
|
4
|
+
class WebSocketProgramAccountSubscriber {
|
|
5
|
+
constructor(subscriptionName, accountDiscriminator, program, decodeBufferFn, options = {
|
|
6
|
+
filters: [],
|
|
7
|
+
}, resubTimeoutMs) {
|
|
8
|
+
this.receivingData = false;
|
|
9
|
+
this.subscriptionName = subscriptionName;
|
|
10
|
+
this.accountDiscriminator = accountDiscriminator;
|
|
11
|
+
this.program = program;
|
|
12
|
+
this.decodeBuffer = decodeBufferFn;
|
|
13
|
+
this.resubTimeoutMs = resubTimeoutMs;
|
|
14
|
+
this.options = options;
|
|
15
|
+
this.receivingData = false;
|
|
16
|
+
}
|
|
17
|
+
async subscribe(onChange) {
|
|
18
|
+
var _a;
|
|
19
|
+
if (this.listenerId) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
this.onChange = onChange;
|
|
23
|
+
this.listenerId = this.program.provider.connection.onProgramAccountChange(this.program.programId, (keyedAccountInfo, context) => {
|
|
24
|
+
if (this.resubTimeoutMs) {
|
|
25
|
+
this.receivingData = true;
|
|
26
|
+
clearTimeout(this.timeoutId);
|
|
27
|
+
this.handleRpcResponse(context, keyedAccountInfo);
|
|
28
|
+
this.setTimeout();
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this.handleRpcResponse(context, keyedAccountInfo);
|
|
32
|
+
}
|
|
33
|
+
}, (_a = this.options.commitment) !== null && _a !== void 0 ? _a : this.program.provider.opts.commitment, this.options.filters);
|
|
34
|
+
if (this.resubTimeoutMs) {
|
|
35
|
+
this.setTimeout();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
setTimeout() {
|
|
39
|
+
if (!this.onChange) {
|
|
40
|
+
throw new Error('onChange callback function must be set');
|
|
41
|
+
}
|
|
42
|
+
this.timeoutId = setTimeout(async () => {
|
|
43
|
+
if (this.receivingData) {
|
|
44
|
+
console.log(`No ws data from ${this.subscriptionName} in ${this.resubTimeoutMs}ms, resubscribing`);
|
|
45
|
+
await this.unsubscribe();
|
|
46
|
+
this.receivingData = false;
|
|
47
|
+
await this.subscribe(this.onChange);
|
|
48
|
+
}
|
|
49
|
+
}, this.resubTimeoutMs);
|
|
50
|
+
}
|
|
51
|
+
handleRpcResponse(context, keyedAccountInfo) {
|
|
52
|
+
const newSlot = context.slot;
|
|
53
|
+
let newBuffer = undefined;
|
|
54
|
+
if (keyedAccountInfo) {
|
|
55
|
+
newBuffer = keyedAccountInfo.accountInfo.data;
|
|
56
|
+
}
|
|
57
|
+
if (!this.bufferAndSlot) {
|
|
58
|
+
this.bufferAndSlot = {
|
|
59
|
+
buffer: newBuffer,
|
|
60
|
+
slot: newSlot,
|
|
61
|
+
};
|
|
62
|
+
if (newBuffer) {
|
|
63
|
+
const account = this.decodeBuffer(this.accountDiscriminator, newBuffer);
|
|
64
|
+
this.dataAndSlot = {
|
|
65
|
+
data: account,
|
|
66
|
+
slot: newSlot,
|
|
67
|
+
accountId: keyedAccountInfo.accountId,
|
|
68
|
+
};
|
|
69
|
+
this.onChange(keyedAccountInfo.accountId, account, context);
|
|
70
|
+
}
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (newSlot <= this.bufferAndSlot.slot) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const oldBuffer = this.bufferAndSlot.buffer;
|
|
77
|
+
if (newBuffer && (!oldBuffer || !newBuffer.equals(oldBuffer))) {
|
|
78
|
+
this.bufferAndSlot = {
|
|
79
|
+
buffer: newBuffer,
|
|
80
|
+
slot: newSlot,
|
|
81
|
+
};
|
|
82
|
+
const account = this.decodeBuffer(this.accountDiscriminator, newBuffer);
|
|
83
|
+
this.dataAndSlot = {
|
|
84
|
+
data: account,
|
|
85
|
+
slot: newSlot,
|
|
86
|
+
accountId: keyedAccountInfo.accountId,
|
|
87
|
+
};
|
|
88
|
+
this.onChange(keyedAccountInfo.accountId, account, context);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
unsubscribe() {
|
|
92
|
+
if (this.listenerId) {
|
|
93
|
+
const promise = this.program.provider.connection.removeAccountChangeListener(this.listenerId);
|
|
94
|
+
this.listenerId = undefined;
|
|
95
|
+
return promise;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.WebSocketProgramAccountSubscriber = WebSocketProgramAccountSubscriber;
|
|
@@ -7,11 +7,12 @@ import { PublicKey } from '@solana/web3.js';
|
|
|
7
7
|
import { UserAccount } from '../types';
|
|
8
8
|
export declare class WebSocketUserAccountSubscriber implements UserAccountSubscriber {
|
|
9
9
|
isSubscribed: boolean;
|
|
10
|
+
reconnectTimeoutMs?: number;
|
|
10
11
|
program: Program;
|
|
11
12
|
eventEmitter: StrictEventEmitter<EventEmitter, UserAccountEvents>;
|
|
12
13
|
userAccountPublicKey: PublicKey;
|
|
13
14
|
userDataAccountSubscriber: AccountSubscriber<UserAccount>;
|
|
14
|
-
constructor(program: Program, userAccountPublicKey: PublicKey);
|
|
15
|
+
constructor(program: Program, userAccountPublicKey: PublicKey, reconnectTimeoutMs?: number);
|
|
15
16
|
subscribe(userAccount?: UserAccount): Promise<boolean>;
|
|
16
17
|
fetch(): Promise<void>;
|
|
17
18
|
unsubscribe(): Promise<void>;
|
|
@@ -5,17 +5,18 @@ const types_1 = require("./types");
|
|
|
5
5
|
const events_1 = require("events");
|
|
6
6
|
const webSocketAccountSubscriber_1 = require("./webSocketAccountSubscriber");
|
|
7
7
|
class WebSocketUserAccountSubscriber {
|
|
8
|
-
constructor(program, userAccountPublicKey) {
|
|
8
|
+
constructor(program, userAccountPublicKey, reconnectTimeoutMs) {
|
|
9
9
|
this.isSubscribed = false;
|
|
10
10
|
this.program = program;
|
|
11
11
|
this.userAccountPublicKey = userAccountPublicKey;
|
|
12
12
|
this.eventEmitter = new events_1.EventEmitter();
|
|
13
|
+
this.reconnectTimeoutMs = reconnectTimeoutMs;
|
|
13
14
|
}
|
|
14
15
|
async subscribe(userAccount) {
|
|
15
16
|
if (this.isSubscribed) {
|
|
16
17
|
return true;
|
|
17
18
|
}
|
|
18
|
-
this.userDataAccountSubscriber = new webSocketAccountSubscriber_1.WebSocketAccountSubscriber('user', this.program, this.userAccountPublicKey);
|
|
19
|
+
this.userDataAccountSubscriber = new webSocketAccountSubscriber_1.WebSocketAccountSubscriber('user', this.program, this.userAccountPublicKey, undefined, this.reconnectTimeoutMs);
|
|
19
20
|
if (userAccount) {
|
|
20
21
|
this.userDataAccountSubscriber.setData(userAccount);
|
|
21
22
|
}
|
|
@@ -7,11 +7,12 @@ import { PublicKey } from '@solana/web3.js';
|
|
|
7
7
|
import { UserStatsAccount } from '../types';
|
|
8
8
|
export declare class WebSocketUserStatsAccountSubscriber implements UserStatsAccountSubscriber {
|
|
9
9
|
isSubscribed: boolean;
|
|
10
|
+
reconnectTimeoutMs?: number;
|
|
10
11
|
program: Program;
|
|
11
12
|
eventEmitter: StrictEventEmitter<EventEmitter, UserStatsAccountEvents>;
|
|
12
13
|
userStatsAccountPublicKey: PublicKey;
|
|
13
14
|
userStatsAccountSubscriber: AccountSubscriber<UserStatsAccount>;
|
|
14
|
-
constructor(program: Program, userStatsAccountPublicKey: PublicKey);
|
|
15
|
+
constructor(program: Program, userStatsAccountPublicKey: PublicKey, reconnectTimeoutMs?: number);
|
|
15
16
|
subscribe(userStatsAccount?: UserStatsAccount): Promise<boolean>;
|
|
16
17
|
fetch(): Promise<void>;
|
|
17
18
|
unsubscribe(): Promise<void>;
|
|
@@ -5,17 +5,18 @@ const types_1 = require("./types");
|
|
|
5
5
|
const events_1 = require("events");
|
|
6
6
|
const webSocketAccountSubscriber_1 = require("./webSocketAccountSubscriber");
|
|
7
7
|
class WebSocketUserStatsAccountSubscriber {
|
|
8
|
-
constructor(program, userStatsAccountPublicKey) {
|
|
8
|
+
constructor(program, userStatsAccountPublicKey, reconnectTimeoutMs) {
|
|
9
9
|
this.isSubscribed = false;
|
|
10
10
|
this.program = program;
|
|
11
11
|
this.userStatsAccountPublicKey = userStatsAccountPublicKey;
|
|
12
12
|
this.eventEmitter = new events_1.EventEmitter();
|
|
13
|
+
this.reconnectTimeoutMs = reconnectTimeoutMs;
|
|
13
14
|
}
|
|
14
15
|
async subscribe(userStatsAccount) {
|
|
15
16
|
if (this.isSubscribed) {
|
|
16
17
|
return true;
|
|
17
18
|
}
|
|
18
|
-
this.userStatsAccountSubscriber = new webSocketAccountSubscriber_1.WebSocketAccountSubscriber('userStats', this.program, this.userStatsAccountPublicKey);
|
|
19
|
+
this.userStatsAccountSubscriber = new webSocketAccountSubscriber_1.WebSocketAccountSubscriber('userStats', this.program, this.userStatsAccountPublicKey, undefined, this.reconnectTimeoutMs);
|
|
19
20
|
if (userStatsAccount) {
|
|
20
21
|
this.userStatsAccountSubscriber.setData(userStatsAccount);
|
|
21
22
|
}
|
|
@@ -5,9 +5,10 @@ import { EventEmitter } from 'events';
|
|
|
5
5
|
export declare class AuctionSubscriber {
|
|
6
6
|
private driftClient;
|
|
7
7
|
private opts;
|
|
8
|
+
private resubTimeoutMs?;
|
|
8
9
|
eventEmitter: StrictEventEmitter<EventEmitter, AuctionSubscriberEvents>;
|
|
9
|
-
private
|
|
10
|
-
constructor({ driftClient, opts }: AuctionSubscriberConfig);
|
|
10
|
+
private subscriber;
|
|
11
|
+
constructor({ driftClient, opts, resubTimeoutMs }: AuctionSubscriberConfig);
|
|
11
12
|
subscribe(): Promise<void>;
|
|
12
13
|
unsubscribe(): Promise<void>;
|
|
13
14
|
}
|
|
@@ -3,22 +3,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.AuctionSubscriber = void 0;
|
|
4
4
|
const memcmp_1 = require("../memcmp");
|
|
5
5
|
const events_1 = require("events");
|
|
6
|
+
const webSocketProgramAccountSubscriber_1 = require("../accounts/webSocketProgramAccountSubscriber");
|
|
6
7
|
class AuctionSubscriber {
|
|
7
|
-
constructor({ driftClient, opts }) {
|
|
8
|
+
constructor({ driftClient, opts, resubTimeoutMs }) {
|
|
8
9
|
this.driftClient = driftClient;
|
|
9
10
|
this.opts = opts || this.driftClient.opts;
|
|
10
11
|
this.eventEmitter = new events_1.EventEmitter();
|
|
12
|
+
this.resubTimeoutMs = resubTimeoutMs;
|
|
11
13
|
}
|
|
12
14
|
async subscribe() {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
if (!this.subscriber) {
|
|
16
|
+
this.subscriber = new webSocketProgramAccountSubscriber_1.WebSocketProgramAccountSubscriber('AuctionSubscriber', 'User', this.driftClient.program, this.driftClient.program.account.user.coder.accounts.decode.bind(this.driftClient.program.account.user.coder.accounts), {
|
|
17
|
+
filters: [(0, memcmp_1.getUserFilter)(), (0, memcmp_1.getUserWithAuctionFilter)()],
|
|
18
|
+
commitment: this.driftClient.opts.commitment,
|
|
19
|
+
}, this.resubTimeoutMs);
|
|
20
|
+
}
|
|
21
|
+
await this.subscriber.subscribe((accountId, data, context) => {
|
|
22
|
+
this.eventEmitter.emit('onAccountUpdate', data, accountId, context.slot);
|
|
23
|
+
});
|
|
17
24
|
}
|
|
18
25
|
async unsubscribe() {
|
|
19
|
-
if (this.
|
|
20
|
-
|
|
26
|
+
if (!this.subscriber) {
|
|
27
|
+
return;
|
|
21
28
|
}
|
|
29
|
+
this.subscriber.unsubscribe();
|
|
22
30
|
}
|
|
23
31
|
}
|
|
24
32
|
exports.AuctionSubscriber = AuctionSubscriber;
|
|
@@ -4,6 +4,7 @@ import { ConfirmOptions, PublicKey } from '@solana/web3.js';
|
|
|
4
4
|
export type AuctionSubscriberConfig = {
|
|
5
5
|
driftClient: DriftClient;
|
|
6
6
|
opts?: ConfirmOptions;
|
|
7
|
+
resubTimeoutMs?: number;
|
|
7
8
|
};
|
|
8
9
|
export interface AuctionSubscriberEvents {
|
|
9
10
|
onAccountUpdate: (account: UserAccount, pubkey: PublicKey, slot: number) => void;
|
|
@@ -100,7 +100,7 @@ exports.MainnetSpotMarkets = [
|
|
|
100
100
|
serumMarket: new web3_js_1.PublicKey('B2na8Awyd7cpC59iEU43FagJAPLigr3AP3s38KM982bu'),
|
|
101
101
|
},
|
|
102
102
|
{
|
|
103
|
-
symbol: '
|
|
103
|
+
symbol: 'JitoSOL',
|
|
104
104
|
marketIndex: 6,
|
|
105
105
|
oracle: new web3_js_1.PublicKey('7yyaeuJ1GGtVBLT2z2xub5ZWYKaNhF28mj1RdV4VDFVk'),
|
|
106
106
|
oracleSource: __1.OracleSource.PYTH,
|
package/lib/driftClient.js
CHANGED
|
@@ -66,7 +66,7 @@ class DriftClient {
|
|
|
66
66
|
this._isSubscribed = val;
|
|
67
67
|
}
|
|
68
68
|
constructor(config) {
|
|
69
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
|
|
69
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
|
|
70
70
|
this.users = new Map();
|
|
71
71
|
this._isSubscribed = false;
|
|
72
72
|
this.perpMarketLastSlotCache = new Map();
|
|
@@ -139,11 +139,11 @@ class DriftClient {
|
|
|
139
139
|
this.accountSubscriber = new pollingDriftClientAccountSubscriber_1.PollingDriftClientAccountSubscriber(this.program, config.accountSubscription.accountLoader, (_o = config.perpMarketIndexes) !== null && _o !== void 0 ? _o : [], (_p = config.spotMarketIndexes) !== null && _p !== void 0 ? _p : [], (_q = config.oracleInfos) !== null && _q !== void 0 ? _q : [], noMarketsAndOraclesSpecified);
|
|
140
140
|
}
|
|
141
141
|
else {
|
|
142
|
-
this.accountSubscriber = new webSocketDriftClientAccountSubscriber_1.WebSocketDriftClientAccountSubscriber(this.program, (_r = config.perpMarketIndexes) !== null && _r !== void 0 ? _r : [], (_s = config.spotMarketIndexes) !== null && _s !== void 0 ? _s : [], (_t = config.oracleInfos) !== null && _t !== void 0 ? _t : [], noMarketsAndOraclesSpecified);
|
|
142
|
+
this.accountSubscriber = new webSocketDriftClientAccountSubscriber_1.WebSocketDriftClientAccountSubscriber(this.program, (_r = config.perpMarketIndexes) !== null && _r !== void 0 ? _r : [], (_s = config.spotMarketIndexes) !== null && _s !== void 0 ? _s : [], (_t = config.oracleInfos) !== null && _t !== void 0 ? _t : [], noMarketsAndOraclesSpecified, (_u = config.accountSubscription) === null || _u === void 0 ? void 0 : _u.resubTimeoutMs);
|
|
143
143
|
}
|
|
144
144
|
this.eventEmitter = this.accountSubscriber.eventEmitter;
|
|
145
145
|
this.txSender =
|
|
146
|
-
(
|
|
146
|
+
(_v = config.txSender) !== null && _v !== void 0 ? _v : new retryTxSender_1.RetryTxSender({
|
|
147
147
|
connection: this.connection,
|
|
148
148
|
wallet: this.wallet,
|
|
149
149
|
opts: this.opts,
|
package/lib/math/superStake.d.ts
CHANGED
|
@@ -4,11 +4,12 @@ import { DriftClient } from '../driftClient';
|
|
|
4
4
|
import { BN } from '@coral-xyz/anchor';
|
|
5
5
|
import { User } from '../user';
|
|
6
6
|
import { DepositRecord } from '../types';
|
|
7
|
-
export declare function findBestSuperStakeIxs({ amount, jupiterClient, driftClient, userAccountPublicKey,
|
|
7
|
+
export declare function findBestSuperStakeIxs({ marketIndex, amount, jupiterClient, driftClient, userAccountPublicKey, price, forceMarinade, onlyDirectRoutes, }: {
|
|
8
|
+
marketIndex: number;
|
|
8
9
|
amount: BN;
|
|
9
10
|
jupiterClient: JupiterClient;
|
|
10
11
|
driftClient: DriftClient;
|
|
11
|
-
|
|
12
|
+
price?: number;
|
|
12
13
|
userAccountPublicKey?: PublicKey;
|
|
13
14
|
forceMarinade?: boolean;
|
|
14
15
|
onlyDirectRoutes?: boolean;
|
|
@@ -18,8 +19,54 @@ export declare function findBestSuperStakeIxs({ amount, jupiterClient, driftClie
|
|
|
18
19
|
method: 'jupiter' | 'marinade';
|
|
19
20
|
price: number;
|
|
20
21
|
}>;
|
|
21
|
-
export declare function
|
|
22
|
+
export declare function findBestMSolSuperStakeIxs({ amount, jupiterClient, driftClient, userAccountPublicKey, price, forceMarinade, onlyDirectRoutes, }: {
|
|
23
|
+
amount: BN;
|
|
24
|
+
jupiterClient: JupiterClient;
|
|
25
|
+
driftClient: DriftClient;
|
|
26
|
+
price?: number;
|
|
27
|
+
userAccountPublicKey?: PublicKey;
|
|
28
|
+
forceMarinade?: boolean;
|
|
29
|
+
onlyDirectRoutes?: boolean;
|
|
30
|
+
}): Promise<{
|
|
31
|
+
ixs: TransactionInstruction[];
|
|
32
|
+
lookupTables: AddressLookupTableAccount[];
|
|
33
|
+
method: 'jupiter' | 'marinade';
|
|
34
|
+
price: number;
|
|
35
|
+
}>;
|
|
36
|
+
export declare function findBestJitoSolSuperStakeIxs({ amount, jupiterClient, driftClient, userAccountPublicKey, onlyDirectRoutes, }: {
|
|
37
|
+
amount: BN;
|
|
38
|
+
jupiterClient: JupiterClient;
|
|
39
|
+
driftClient: DriftClient;
|
|
40
|
+
userAccountPublicKey?: PublicKey;
|
|
41
|
+
onlyDirectRoutes?: boolean;
|
|
42
|
+
}): Promise<{
|
|
43
|
+
ixs: TransactionInstruction[];
|
|
44
|
+
lookupTables: AddressLookupTableAccount[];
|
|
45
|
+
method: 'jupiter' | 'marinade';
|
|
46
|
+
price: number;
|
|
47
|
+
}>;
|
|
48
|
+
export type JITO_SOL_METRICS_ENDPOINT_RESPONSE = {
|
|
49
|
+
data: {
|
|
50
|
+
getStakePoolStats: {
|
|
51
|
+
tvl: {
|
|
52
|
+
data: number;
|
|
53
|
+
date: string;
|
|
54
|
+
}[];
|
|
55
|
+
supply: {
|
|
56
|
+
data: number;
|
|
57
|
+
date: string;
|
|
58
|
+
}[];
|
|
59
|
+
apy: {
|
|
60
|
+
data: number;
|
|
61
|
+
date: string;
|
|
62
|
+
}[];
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
export declare function fetchJitoSolMetrics(): Promise<JITO_SOL_METRICS_ENDPOINT_RESPONSE>;
|
|
67
|
+
export declare function calculateSolEarned({ marketIndex, user, depositRecords, }: {
|
|
68
|
+
marketIndex: number;
|
|
22
69
|
user: User;
|
|
23
70
|
depositRecords: DepositRecord[];
|
|
24
71
|
}): Promise<BN>;
|
|
25
|
-
export declare function calculateEstimatedSuperStakeLiquidationPrice(
|
|
72
|
+
export declare function calculateEstimatedSuperStakeLiquidationPrice(lstDepositAmount: number, lstMaintenanceAssetWeight: number, solBorrowAmount: number, solMaintenanceLiabilityWeight: number, lstPriceRatio: number): number;
|