@drift-labs/sdk 2.142.0-beta.5 → 2.142.0-beta.6
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/browser/accounts/grpcDriftClientAccountSubscriberV2.d.ts +2 -0
- package/lib/browser/accounts/grpcDriftClientAccountSubscriberV2.js +48 -0
- package/lib/browser/accounts/grpcMultiAccountSubscriber.d.ts +1 -0
- package/lib/browser/accounts/grpcMultiAccountSubscriber.js +3 -0
- package/lib/node/accounts/grpcDriftClientAccountSubscriberV2.d.ts +2 -0
- package/lib/node/accounts/grpcDriftClientAccountSubscriberV2.d.ts.map +1 -1
- package/lib/node/accounts/grpcDriftClientAccountSubscriberV2.js +48 -0
- package/lib/node/accounts/grpcMultiAccountSubscriber.d.ts +1 -0
- package/lib/node/accounts/grpcMultiAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/grpcMultiAccountSubscriber.js +3 -0
- package/package.json +1 -1
- package/scripts/client-test.ts +23 -0
- package/src/accounts/grpcDriftClientAccountSubscriberV2.ts +52 -0
- package/src/accounts/grpcMultiAccountSubscriber.ts +4 -0
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.142.0-beta.
|
|
1
|
+
2.142.0-beta.6
|
|
@@ -14,6 +14,8 @@ export declare class grpcDriftClientAccountSubscriberV2 extends WebSocketDriftCl
|
|
|
14
14
|
subscribe(): Promise<boolean>;
|
|
15
15
|
getMarketAccountAndSlot(marketIndex: number): DataAndSlot<PerpMarketAccount> | undefined;
|
|
16
16
|
getSpotMarketAccountAndSlot(marketIndex: number): DataAndSlot<SpotMarketAccount> | undefined;
|
|
17
|
+
setPerpOracleMap(): Promise<void>;
|
|
18
|
+
setSpotOracleMap(): Promise<void>;
|
|
17
19
|
subscribeToPerpMarketAccounts(): Promise<boolean>;
|
|
18
20
|
subscribeToSpotMarketAccounts(): Promise<boolean>;
|
|
19
21
|
subscribeToOracles(): Promise<boolean>;
|
|
@@ -69,6 +69,54 @@ class grpcDriftClientAccountSubscriberV2 extends webSocketDriftClientAccountSubs
|
|
|
69
69
|
var _a;
|
|
70
70
|
return (_a = this.spotMarketsSubscriber) === null || _a === void 0 ? void 0 : _a.getAccountData(this.spotMarketIndexToAccountPubkeyMap.get(marketIndex));
|
|
71
71
|
}
|
|
72
|
+
async setPerpOracleMap() {
|
|
73
|
+
var _a;
|
|
74
|
+
const perpMarketsMap = (_a = this.perpMarketsSubscriber) === null || _a === void 0 ? void 0 : _a.getAccountDataMap();
|
|
75
|
+
const perpMarkets = Array.from(perpMarketsMap.values());
|
|
76
|
+
const addOraclePromises = [];
|
|
77
|
+
for (const perpMarket of perpMarkets) {
|
|
78
|
+
if (!perpMarket || !perpMarket.data) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const perpMarketAccount = perpMarket.data;
|
|
82
|
+
const perpMarketIndex = perpMarketAccount.marketIndex;
|
|
83
|
+
const oracle = perpMarketAccount.amm.oracle;
|
|
84
|
+
const oracleId = (0, oracleId_1.getOracleId)(oracle, perpMarket.data.amm.oracleSource);
|
|
85
|
+
if (!this.oracleSubscribers.has(oracleId)) {
|
|
86
|
+
addOraclePromises.push(this.addOracle({
|
|
87
|
+
publicKey: oracle,
|
|
88
|
+
source: perpMarket.data.amm.oracleSource,
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
this.perpOracleMap.set(perpMarketIndex, oracle);
|
|
92
|
+
this.perpOracleStringMap.set(perpMarketIndex, oracleId);
|
|
93
|
+
}
|
|
94
|
+
await Promise.all(addOraclePromises);
|
|
95
|
+
}
|
|
96
|
+
async setSpotOracleMap() {
|
|
97
|
+
var _a;
|
|
98
|
+
const spotMarketsMap = (_a = this.spotMarketsSubscriber) === null || _a === void 0 ? void 0 : _a.getAccountDataMap();
|
|
99
|
+
const spotMarkets = Array.from(spotMarketsMap.values());
|
|
100
|
+
const addOraclePromises = [];
|
|
101
|
+
for (const spotMarket of spotMarkets) {
|
|
102
|
+
if (!spotMarket || !spotMarket.data) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const spotMarketAccount = spotMarket.data;
|
|
106
|
+
const spotMarketIndex = spotMarketAccount.marketIndex;
|
|
107
|
+
const oracle = spotMarketAccount.oracle;
|
|
108
|
+
const oracleId = (0, oracleId_1.getOracleId)(oracle, spotMarketAccount.oracleSource);
|
|
109
|
+
if (!this.oracleSubscribers.has(oracleId)) {
|
|
110
|
+
addOraclePromises.push(this.addOracle({
|
|
111
|
+
publicKey: oracle,
|
|
112
|
+
source: spotMarketAccount.oracleSource,
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
this.spotOracleMap.set(spotMarketIndex, oracle);
|
|
116
|
+
this.spotOracleStringMap.set(spotMarketIndex, oracleId);
|
|
117
|
+
}
|
|
118
|
+
await Promise.all(addOraclePromises);
|
|
119
|
+
}
|
|
72
120
|
async subscribeToPerpMarketAccounts() {
|
|
73
121
|
const perpMarketIndexToAccountPubkeys = await Promise.all(this.perpMarketIndexes.map(async (marketIndex) => [
|
|
74
122
|
marketIndex,
|
|
@@ -24,6 +24,7 @@ export declare class grpcMultiAccountSubscriber<T> {
|
|
|
24
24
|
static create<U>(grpcConfigs: GrpcConfigs, accountName: string, program: Program, decodeBuffer?: (buffer: Buffer, pubkey?: string) => U, resubOpts?: ResubOpts, clientProp?: Client, onUnsubscribe?: () => Promise<void>): Promise<grpcMultiAccountSubscriber<U>>;
|
|
25
25
|
setAccountData(accountPubkey: PublicKey, data: T, slot?: number): void;
|
|
26
26
|
getAccountData(accountPubkey: PublicKey): DataAndSlot<T> | undefined;
|
|
27
|
+
getAccountDataMap(): Map<string, DataAndSlot<T>>;
|
|
27
28
|
subscribe(accounts: PublicKey[], onChange: (accountId: PublicKey, data: T, context: Context, buffer: Buffer) => void): Promise<void>;
|
|
28
29
|
addAccounts(accounts: PublicKey[]): Promise<void>;
|
|
29
30
|
removeAccounts(accounts: PublicKey[]): Promise<void>;
|
|
@@ -62,6 +62,9 @@ class grpcMultiAccountSubscriber {
|
|
|
62
62
|
getAccountData(accountPubkey) {
|
|
63
63
|
return this.dataMap.get(accountPubkey.toBase58());
|
|
64
64
|
}
|
|
65
|
+
getAccountDataMap() {
|
|
66
|
+
return this.dataMap;
|
|
67
|
+
}
|
|
65
68
|
async subscribe(accounts, onChange) {
|
|
66
69
|
if (this.listenerId != null || this.isUnsubscribing) {
|
|
67
70
|
return;
|
|
@@ -14,6 +14,8 @@ export declare class grpcDriftClientAccountSubscriberV2 extends WebSocketDriftCl
|
|
|
14
14
|
subscribe(): Promise<boolean>;
|
|
15
15
|
getMarketAccountAndSlot(marketIndex: number): DataAndSlot<PerpMarketAccount> | undefined;
|
|
16
16
|
getSpotMarketAccountAndSlot(marketIndex: number): DataAndSlot<SpotMarketAccount> | undefined;
|
|
17
|
+
setPerpOracleMap(): Promise<void>;
|
|
18
|
+
setSpotOracleMap(): Promise<void>;
|
|
17
19
|
subscribeToPerpMarketAccounts(): Promise<boolean>;
|
|
18
20
|
subscribeToSpotMarketAccounts(): Promise<boolean>;
|
|
19
21
|
subscribeToOracles(): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grpcDriftClientAccountSubscriberV2.d.ts","sourceRoot":"","sources":["../../../src/accounts/grpcDriftClientAccountSubscriberV2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAE,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAQ5C,OAAO,EACN,WAAW,EACX,qBAAqB,EACrB,WAAW,EACX,SAAS,EACT,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAgB,MAAM,UAAU,CAAC;AAM9E,qBAAa,kCAAmC,SAAQ,qCAAqC;IAC5F,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,qBAAqB,CAAC,CAAgD;IAC9E,OAAO,CAAC,qBAAqB,CAAC,CAAgD;IAC9E,OAAO,CAAC,qBAAqB,CAAC,CAA8C;IAC5E,OAAO,CAAC,iCAAiC,CAAgC;IACzE,OAAO,CAAC,iCAAiC,CAAgC;gBAGxE,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,OAAO,EAChB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,iBAAiB,EAAE,MAAM,EAAE,EAC3B,WAAW,EAAE,UAAU,EAAE,EACzB,8BAA8B,EAAE,OAAO,EACvC,qBAAqB,EAAE,qBAAqB,EAC5C,SAAS,CAAC,EAAE,SAAS;IAcT,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAiFjC,uBAAuB,CAC/B,WAAW,EAAE,MAAM,GACjB,WAAW,CAAC,iBAAiB,CAAC,GAAG,SAAS;IAMpC,2BAA2B,CACnC,WAAW,EAAE,MAAM,GACjB,WAAW,CAAC,iBAAiB,CAAC,GAAG,SAAS;IAM9B,6BAA6B,IAAI,OAAO,CAAC,OAAO,CAAC;IA2DjD,6BAA6B,IAAI,OAAO,CAAC,OAAO,CAAC;IA2DjD,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAyE/C,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CAO3C"}
|
|
1
|
+
{"version":3,"file":"grpcDriftClientAccountSubscriberV2.d.ts","sourceRoot":"","sources":["../../../src/accounts/grpcDriftClientAccountSubscriberV2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAE,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAQ5C,OAAO,EACN,WAAW,EACX,qBAAqB,EACrB,WAAW,EACX,SAAS,EACT,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAgB,MAAM,UAAU,CAAC;AAM9E,qBAAa,kCAAmC,SAAQ,qCAAqC;IAC5F,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,qBAAqB,CAAC,CAAgD;IAC9E,OAAO,CAAC,qBAAqB,CAAC,CAAgD;IAC9E,OAAO,CAAC,qBAAqB,CAAC,CAA8C;IAC5E,OAAO,CAAC,iCAAiC,CAAgC;IACzE,OAAO,CAAC,iCAAiC,CAAgC;gBAGxE,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,OAAO,EAChB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,iBAAiB,EAAE,MAAM,EAAE,EAC3B,WAAW,EAAE,UAAU,EAAE,EACzB,8BAA8B,EAAE,OAAO,EACvC,qBAAqB,EAAE,qBAAqB,EAC5C,SAAS,CAAC,EAAE,SAAS;IAcT,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAiFjC,uBAAuB,CAC/B,WAAW,EAAE,MAAM,GACjB,WAAW,CAAC,iBAAiB,CAAC,GAAG,SAAS;IAMpC,2BAA2B,CACnC,WAAW,EAAE,MAAM,GACjB,WAAW,CAAC,iBAAiB,CAAC,GAAG,SAAS;IAM9B,gBAAgB;IA0BhB,gBAAgB;IA0BhB,6BAA6B,IAAI,OAAO,CAAC,OAAO,CAAC;IA2DjD,6BAA6B,IAAI,OAAO,CAAC,OAAO,CAAC;IA2DjD,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAyE/C,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CAO3C"}
|
|
@@ -69,6 +69,54 @@ class grpcDriftClientAccountSubscriberV2 extends webSocketDriftClientAccountSubs
|
|
|
69
69
|
var _a;
|
|
70
70
|
return (_a = this.spotMarketsSubscriber) === null || _a === void 0 ? void 0 : _a.getAccountData(this.spotMarketIndexToAccountPubkeyMap.get(marketIndex));
|
|
71
71
|
}
|
|
72
|
+
async setPerpOracleMap() {
|
|
73
|
+
var _a;
|
|
74
|
+
const perpMarketsMap = (_a = this.perpMarketsSubscriber) === null || _a === void 0 ? void 0 : _a.getAccountDataMap();
|
|
75
|
+
const perpMarkets = Array.from(perpMarketsMap.values());
|
|
76
|
+
const addOraclePromises = [];
|
|
77
|
+
for (const perpMarket of perpMarkets) {
|
|
78
|
+
if (!perpMarket || !perpMarket.data) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const perpMarketAccount = perpMarket.data;
|
|
82
|
+
const perpMarketIndex = perpMarketAccount.marketIndex;
|
|
83
|
+
const oracle = perpMarketAccount.amm.oracle;
|
|
84
|
+
const oracleId = (0, oracleId_1.getOracleId)(oracle, perpMarket.data.amm.oracleSource);
|
|
85
|
+
if (!this.oracleSubscribers.has(oracleId)) {
|
|
86
|
+
addOraclePromises.push(this.addOracle({
|
|
87
|
+
publicKey: oracle,
|
|
88
|
+
source: perpMarket.data.amm.oracleSource,
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
this.perpOracleMap.set(perpMarketIndex, oracle);
|
|
92
|
+
this.perpOracleStringMap.set(perpMarketIndex, oracleId);
|
|
93
|
+
}
|
|
94
|
+
await Promise.all(addOraclePromises);
|
|
95
|
+
}
|
|
96
|
+
async setSpotOracleMap() {
|
|
97
|
+
var _a;
|
|
98
|
+
const spotMarketsMap = (_a = this.spotMarketsSubscriber) === null || _a === void 0 ? void 0 : _a.getAccountDataMap();
|
|
99
|
+
const spotMarkets = Array.from(spotMarketsMap.values());
|
|
100
|
+
const addOraclePromises = [];
|
|
101
|
+
for (const spotMarket of spotMarkets) {
|
|
102
|
+
if (!spotMarket || !spotMarket.data) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const spotMarketAccount = spotMarket.data;
|
|
106
|
+
const spotMarketIndex = spotMarketAccount.marketIndex;
|
|
107
|
+
const oracle = spotMarketAccount.oracle;
|
|
108
|
+
const oracleId = (0, oracleId_1.getOracleId)(oracle, spotMarketAccount.oracleSource);
|
|
109
|
+
if (!this.oracleSubscribers.has(oracleId)) {
|
|
110
|
+
addOraclePromises.push(this.addOracle({
|
|
111
|
+
publicKey: oracle,
|
|
112
|
+
source: spotMarketAccount.oracleSource,
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
this.spotOracleMap.set(spotMarketIndex, oracle);
|
|
116
|
+
this.spotOracleStringMap.set(spotMarketIndex, oracleId);
|
|
117
|
+
}
|
|
118
|
+
await Promise.all(addOraclePromises);
|
|
119
|
+
}
|
|
72
120
|
async subscribeToPerpMarketAccounts() {
|
|
73
121
|
const perpMarketIndexToAccountPubkeys = await Promise.all(this.perpMarketIndexes.map(async (marketIndex) => [
|
|
74
122
|
marketIndex,
|
|
@@ -24,6 +24,7 @@ export declare class grpcMultiAccountSubscriber<T> {
|
|
|
24
24
|
static create<U>(grpcConfigs: GrpcConfigs, accountName: string, program: Program, decodeBuffer?: (buffer: Buffer, pubkey?: string) => U, resubOpts?: ResubOpts, clientProp?: Client, onUnsubscribe?: () => Promise<void>): Promise<grpcMultiAccountSubscriber<U>>;
|
|
25
25
|
setAccountData(accountPubkey: PublicKey, data: T, slot?: number): void;
|
|
26
26
|
getAccountData(accountPubkey: PublicKey): DataAndSlot<T> | undefined;
|
|
27
|
+
getAccountDataMap(): Map<string, DataAndSlot<T>>;
|
|
27
28
|
subscribe(accounts: PublicKey[], onChange: (accountId: PublicKey, data: T, context: Context, buffer: Buffer) => void): Promise<void>;
|
|
28
29
|
addAccounts(accounts: PublicKey[]): Promise<void>;
|
|
29
30
|
removeAccounts(accounts: PublicKey[]): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grpcMultiAccountSubscriber.d.ts","sourceRoot":"","sources":["../../../src/accounts/grpcMultiAccountSubscriber.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIrD,OAAO,EACN,MAAM,EAMN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAU9D,qBAAa,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAwD;IACtE,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAC,CAAyC;IAChE,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,aAAa,CAAC,CAAsB;IAErC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,UAAS;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAgC;IAClD,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,WAAW,CAGf;IAEJ,OAAO,CAAC,OAAO,CAAqC;IAEpD,OAAO;WAkBa,MAAM,CAAC,CAAC,EAC3B,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,EAChB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,CAAC,EACrD,SAAS,CAAC,EAAE,SAAS,EACrB,UAAU,CAAC,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACjC,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;IAuBzC,cAAc,CAAC,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAItE,cAAc,CAAC,aAAa,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS;
|
|
1
|
+
{"version":3,"file":"grpcMultiAccountSubscriber.d.ts","sourceRoot":"","sources":["../../../src/accounts/grpcMultiAccountSubscriber.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIrD,OAAO,EACN,MAAM,EAMN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAU9D,qBAAa,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAwD;IACtE,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAC,CAAyC;IAChE,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,aAAa,CAAC,CAAsB;IAErC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,UAAS;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAgC;IAClD,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,WAAW,CAGf;IAEJ,OAAO,CAAC,OAAO,CAAqC;IAEpD,OAAO;WAkBa,MAAM,CAAC,CAAC,EAC3B,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,EAChB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,CAAC,EACrD,SAAS,CAAC,EAAE,SAAS,EACrB,UAAU,CAAC,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACjC,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;IAuBzC,cAAc,CAAC,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAItE,cAAc,CAAC,aAAa,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS;IAIpE,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAI1C,SAAS,CACd,QAAQ,EAAE,SAAS,EAAE,EACrB,QAAQ,EAAE,CACT,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,KACV,IAAI,GACP,OAAO,CAAC,IAAI,CAAC;IA+FV,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCjD,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCpD,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IA4ClC,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,UAAU;CAIlB"}
|
|
@@ -62,6 +62,9 @@ class grpcMultiAccountSubscriber {
|
|
|
62
62
|
getAccountData(accountPubkey) {
|
|
63
63
|
return this.dataMap.get(accountPubkey.toBase58());
|
|
64
64
|
}
|
|
65
|
+
getAccountDataMap() {
|
|
66
|
+
return this.dataMap;
|
|
67
|
+
}
|
|
65
68
|
async subscribe(accounts, onChange) {
|
|
66
69
|
if (this.listenerId != null || this.isUnsubscribing) {
|
|
67
70
|
return;
|
package/package.json
CHANGED
package/scripts/client-test.ts
CHANGED
|
@@ -104,6 +104,12 @@ async function initializeGrpcDriftClientV2() {
|
|
|
104
104
|
'Perp market data market index:',
|
|
105
105
|
perpMarketData?.marketIndex
|
|
106
106
|
);
|
|
107
|
+
const oracle = driftClient.getOracleDataForPerpMarket(data.marketIndex);
|
|
108
|
+
const mmOracle = driftClient.getMMOracleDataForPerpMarket(
|
|
109
|
+
data.marketIndex
|
|
110
|
+
);
|
|
111
|
+
console.log('Perp oracle price:', oracle.price.toString());
|
|
112
|
+
console.log('Perp MM oracle price:', mmOracle.price.toString());
|
|
107
113
|
perpMarketUpdateCount++;
|
|
108
114
|
if (
|
|
109
115
|
perpMarketUpdateCount >= 10 &&
|
|
@@ -127,6 +133,8 @@ async function initializeGrpcDriftClientV2() {
|
|
|
127
133
|
'Spot market data market index:',
|
|
128
134
|
spotMarketData?.marketIndex
|
|
129
135
|
);
|
|
136
|
+
const oracle = driftClient.getOracleDataForSpotMarket(data.marketIndex);
|
|
137
|
+
console.log('Spot oracle price:', oracle.price.toString());
|
|
130
138
|
spotMarketUpdateCount++;
|
|
131
139
|
if (
|
|
132
140
|
perpMarketUpdateCount >= 10 &&
|
|
@@ -175,6 +183,21 @@ async function initializeGrpcDriftClientV2() {
|
|
|
175
183
|
await driftClient.subscribe();
|
|
176
184
|
console.log('DriftClient initialized and listening for updates.');
|
|
177
185
|
|
|
186
|
+
for (const marketIndex of config.perpMarketIndexes) {
|
|
187
|
+
const oracle = driftClient.getOracleDataForPerpMarket(marketIndex);
|
|
188
|
+
const mmOracle = driftClient.getMMOracleDataForPerpMarket(marketIndex);
|
|
189
|
+
console.log('Initial perp oracle price:', oracle.price.toString());
|
|
190
|
+
console.log('Initial perp MM oracle price:', mmOracle.price.toString());
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
for (const marketIndex of config.spotMarketIndexes) {
|
|
194
|
+
const oracle = driftClient.getOracleDataForSpotMarket(marketIndex);
|
|
195
|
+
console.log('Initial spot oracle price:', oracle.price.toString());
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const stateAccount = driftClient.getStateAccount();
|
|
199
|
+
console.log('Initial state account:', stateAccount.toString());
|
|
200
|
+
|
|
178
201
|
await updatePromise;
|
|
179
202
|
console.log('Received required number of updates.');
|
|
180
203
|
}
|
|
@@ -149,6 +149,58 @@ export class grpcDriftClientAccountSubscriberV2 extends WebSocketDriftClientAcco
|
|
|
149
149
|
);
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
+
override async setPerpOracleMap() {
|
|
153
|
+
const perpMarketsMap = this.perpMarketsSubscriber?.getAccountDataMap();
|
|
154
|
+
const perpMarkets = Array.from(perpMarketsMap.values());
|
|
155
|
+
const addOraclePromises = [];
|
|
156
|
+
for (const perpMarket of perpMarkets) {
|
|
157
|
+
if (!perpMarket || !perpMarket.data) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const perpMarketAccount = perpMarket.data;
|
|
161
|
+
const perpMarketIndex = perpMarketAccount.marketIndex;
|
|
162
|
+
const oracle = perpMarketAccount.amm.oracle;
|
|
163
|
+
const oracleId = getOracleId(oracle, perpMarket.data.amm.oracleSource);
|
|
164
|
+
if (!this.oracleSubscribers.has(oracleId)) {
|
|
165
|
+
addOraclePromises.push(
|
|
166
|
+
this.addOracle({
|
|
167
|
+
publicKey: oracle,
|
|
168
|
+
source: perpMarket.data.amm.oracleSource,
|
|
169
|
+
})
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
this.perpOracleMap.set(perpMarketIndex, oracle);
|
|
173
|
+
this.perpOracleStringMap.set(perpMarketIndex, oracleId);
|
|
174
|
+
}
|
|
175
|
+
await Promise.all(addOraclePromises);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
override async setSpotOracleMap() {
|
|
179
|
+
const spotMarketsMap = this.spotMarketsSubscriber?.getAccountDataMap();
|
|
180
|
+
const spotMarkets = Array.from(spotMarketsMap.values());
|
|
181
|
+
const addOraclePromises = [];
|
|
182
|
+
for (const spotMarket of spotMarkets) {
|
|
183
|
+
if (!spotMarket || !spotMarket.data) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const spotMarketAccount = spotMarket.data;
|
|
187
|
+
const spotMarketIndex = spotMarketAccount.marketIndex;
|
|
188
|
+
const oracle = spotMarketAccount.oracle;
|
|
189
|
+
const oracleId = getOracleId(oracle, spotMarketAccount.oracleSource);
|
|
190
|
+
if (!this.oracleSubscribers.has(oracleId)) {
|
|
191
|
+
addOraclePromises.push(
|
|
192
|
+
this.addOracle({
|
|
193
|
+
publicKey: oracle,
|
|
194
|
+
source: spotMarketAccount.oracleSource,
|
|
195
|
+
})
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
this.spotOracleMap.set(spotMarketIndex, oracle);
|
|
199
|
+
this.spotOracleStringMap.set(spotMarketIndex, oracleId);
|
|
200
|
+
}
|
|
201
|
+
await Promise.all(addOraclePromises);
|
|
202
|
+
}
|
|
203
|
+
|
|
152
204
|
override async subscribeToPerpMarketAccounts(): Promise<boolean> {
|
|
153
205
|
const perpMarketIndexToAccountPubkeys: Array<[number, PublicKey]> =
|
|
154
206
|
await Promise.all(
|
|
@@ -101,6 +101,10 @@ export class grpcMultiAccountSubscriber<T> {
|
|
|
101
101
|
return this.dataMap.get(accountPubkey.toBase58());
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
+
getAccountDataMap(): Map<string, DataAndSlot<T>> {
|
|
105
|
+
return this.dataMap;
|
|
106
|
+
}
|
|
107
|
+
|
|
104
108
|
async subscribe(
|
|
105
109
|
accounts: PublicKey[],
|
|
106
110
|
onChange: (
|