@drift-labs/sdk 2.86.0-beta.2 → 2.86.0-beta.21

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.
@@ -99,8 +99,8 @@ export const MainnetSpotMarkets: SpotMarketConfig[] = [
99
99
  {
100
100
  symbol: 'mSOL',
101
101
  marketIndex: 2,
102
- oracle: new PublicKey('E4v1BBgoso9s64TQvmyownAVJbhbEPGyzA3qn4n46qj9'),
103
- oracleSource: OracleSource.PYTH,
102
+ oracle: new PublicKey('FAq7hqjn7FWGXKDwJHzsXGgBcydGTcK4kziJpAGWXjDb'),
103
+ oracleSource: OracleSource.PYTH_PULL,
104
104
  mint: new PublicKey('mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So'),
105
105
  precision: new BN(10).pow(NINE),
106
106
  precisionExp: NINE,
@@ -139,7 +139,7 @@ export const MainnetSpotMarkets: SpotMarketConfig[] = [
139
139
  symbol: 'USDT',
140
140
  marketIndex: 5,
141
141
  oracle: new PublicKey('3vxLXJqLqF3JG5TCbYycbKWRBbCJQLxQmBGCkyqEEefL'),
142
- oracleSource: OracleSource.PYTH_STABLE_COIN,
142
+ oracleSource: OracleSource.PYTH,
143
143
  mint: new PublicKey('Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB'),
144
144
  precision: QUOTE_PRECISION,
145
145
  precisionExp: QUOTE_PRECISION_EXP,
@@ -180,8 +180,8 @@ export const MainnetSpotMarkets: SpotMarketConfig[] = [
180
180
  {
181
181
  symbol: 'bSOL',
182
182
  marketIndex: 8,
183
- oracle: new PublicKey('AFrYBhb5wKQtxRS9UA9YRS4V3dwFm7SqmS6DHKq6YVgo'),
184
- oracleSource: OracleSource.PYTH,
183
+ oracle: new PublicKey('BmDWPMsytWmYkh9n6o7m79eVshVYf2B5GVaqQ2EWKnGH'),
184
+ oracleSource: OracleSource.PYTH_PULL,
185
185
  mint: new PublicKey('bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1'),
186
186
  precision: new BN(10).pow(NINE),
187
187
  precisionExp: NINE,
@@ -192,8 +192,8 @@ export const MainnetSpotMarkets: SpotMarketConfig[] = [
192
192
  {
193
193
  symbol: 'JTO',
194
194
  marketIndex: 9,
195
- oracle: new PublicKey('D8UUgr8a3aR3yUeHLu7v8FWK7E8Y5sSU7qrYBXUJXBQ5'),
196
- oracleSource: OracleSource.PYTH,
195
+ oracle: new PublicKey('Ffq6ACJ17NAgaxC6ocfMzVXL3K61qxB2xHg6WUawWPfP'),
196
+ oracleSource: OracleSource.PYTH_PULL,
197
197
  mint: new PublicKey('jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL'),
198
198
  precision: new BN(10).pow(NINE),
199
199
  precisionExp: NINE,
@@ -237,8 +237,8 @@ export const MainnetSpotMarkets: SpotMarketConfig[] = [
237
237
  {
238
238
  symbol: 'RNDR',
239
239
  marketIndex: 12,
240
- oracle: new PublicKey('CYGfrBJB9HgLf9iZyN4aH5HvUAi2htQ4MjPxeXMf4Egn'),
241
- oracleSource: OracleSource.PYTH,
240
+ oracle: new PublicKey('F3mPHRtJqqq57JPDBmUwUVhpyPLmjE5dAzDfpVgpFkug'),
241
+ oracleSource: OracleSource.PYTH_PULL,
242
242
  mint: new PublicKey('rndrizKT3MK1iimdxRdWabcF7Zg7AR5T4nud4EkHBof'),
243
243
  precision: new BN(10).pow(EIGHT),
244
244
  precisionExp: EIGHT,
@@ -250,8 +250,8 @@ export const MainnetSpotMarkets: SpotMarketConfig[] = [
250
250
  {
251
251
  symbol: 'W',
252
252
  marketIndex: 13,
253
- oracle: new PublicKey('H9j8CT1bFiWHaZUPMooEaxMRHdWdJ5T9CzFn41z96JHW'),
254
- oracleSource: OracleSource.PYTH,
253
+ oracle: new PublicKey('4HbitGsdcFbtFotmYscikQFAAKJ3nYx4t7sV7fTvsk8U'),
254
+ oracleSource: OracleSource.PYTH_PULL,
255
255
  mint: new PublicKey('85VBFQZC9TZkfaptBWjvUw7YbZjy52A6mjtPGjstQAmQ'),
256
256
  precision: new BN(10).pow(SIX),
257
257
  precisionExp: SIX,
@@ -265,8 +265,8 @@ export const MainnetSpotMarkets: SpotMarketConfig[] = [
265
265
  {
266
266
  symbol: 'TNSR',
267
267
  marketIndex: 14,
268
- oracle: new PublicKey('7Cfyymx49ipGsgEsCA2XygAB2DUsan4C6Cyb5c8oR5st'),
269
- oracleSource: OracleSource.SWITCHBOARD,
268
+ oracle: new PublicKey('13jpjpVyU5hGpjsZ4HzCcmBo85wze4N8Au7U6cC3GMip'),
269
+ oracleSource: OracleSource.PYTH_PULL,
270
270
  mint: new PublicKey('TNSRxcUxoT9xBG3de7PiJyTDYu7kskLqcpddxnEJAS6'),
271
271
  precision: new BN(10).pow(NINE),
272
272
  precisionExp: NINE,
@@ -295,8 +295,8 @@ export const MainnetSpotMarkets: SpotMarketConfig[] = [
295
295
  {
296
296
  symbol: 'INF',
297
297
  marketIndex: 16,
298
- oracle: new PublicKey('6AQHz9mpGNjyVafcWdqzzgsJq14Cs8gG6MiQKmdAgCuP'),
299
- oracleSource: OracleSource.SWITCHBOARD,
298
+ oracle: new PublicKey('B7RUYg2zF6UdUSHv2RmpnriPVJccYWojgFydNS1NY5F8'),
299
+ oracleSource: OracleSource.PYTH_PULL,
300
300
  mint: new PublicKey('5oVNBeEEQvYi1cX3ir8Dx5n1P7pdxydbGF2X4TxVusJm'),
301
301
  precision: new BN(10).pow(NINE),
302
302
  precisionExp: NINE,
@@ -317,12 +317,14 @@ export const MainnetSpotMarkets: SpotMarketConfig[] = [
317
317
  {
318
318
  symbol: 'USDY',
319
319
  marketIndex: 18,
320
- oracle: new PublicKey('DiqUGbq5CV8Tjcae1whjrX97qPo6gU7BKAvKNFc2vrX8'),
321
- oracleSource: OracleSource.SWITCHBOARD,
320
+ oracle: new PublicKey('BPTQgHV4y2x4jvKPPkkd9aS8jY7L3DGZBwjEZC8Vm27o'),
321
+ oracleSource: OracleSource.PYTH_PULL,
322
322
  mint: new PublicKey('A1KLoBrKBde8Ty9qtNQUtq3C2ortoC3u7twggz7sEto6'),
323
323
  precision: new BN(10).pow(SIX),
324
324
  precisionExp: SIX,
325
325
  launchTs: 1718811089000,
326
+ pythFeedId:
327
+ '0xe393449f6aff8a4b6d3e1165a7c9ebec103685f3b41e60db4277b5b6d10e7326',
326
328
  },
327
329
  {
328
330
  symbol: 'JLP',
@@ -337,7 +339,7 @@ export const MainnetSpotMarkets: SpotMarketConfig[] = [
337
339
  {
338
340
  symbol: 'POPCAT',
339
341
  marketIndex: 20,
340
- oracle: new PublicKey('2stQe1XLGkuTZ22gQrgZKsb93iG9mWXSLfANMPRjs5Ky'),
342
+ oracle: new PublicKey('3GjpjC8TWsPqjyFSiR7saGxgzD8zqYJNsBnWpenZPEBy'),
341
343
  oracleSource: OracleSource.SWITCHBOARD,
342
344
  mint: new PublicKey('7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr'),
343
345
  precision: new BN(10).pow(NINE),
@@ -2244,6 +2244,42 @@
2244
2244
  ],
2245
2245
  "args": []
2246
2246
  },
2247
+ {
2248
+ "name": "updateUserGovTokenInsuranceStake",
2249
+ "accounts": [
2250
+ {
2251
+ "name": "state",
2252
+ "isMut": false,
2253
+ "isSigner": false
2254
+ },
2255
+ {
2256
+ "name": "spotMarket",
2257
+ "isMut": false,
2258
+ "isSigner": false
2259
+ },
2260
+ {
2261
+ "name": "insuranceFundStake",
2262
+ "isMut": true,
2263
+ "isSigner": false
2264
+ },
2265
+ {
2266
+ "name": "userStats",
2267
+ "isMut": true,
2268
+ "isSigner": false
2269
+ },
2270
+ {
2271
+ "name": "authority",
2272
+ "isMut": false,
2273
+ "isSigner": true
2274
+ },
2275
+ {
2276
+ "name": "insuranceFundVault",
2277
+ "isMut": true,
2278
+ "isSigner": false
2279
+ }
2280
+ ],
2281
+ "args": []
2282
+ },
2247
2283
  {
2248
2284
  "name": "initializeInsuranceFundStake",
2249
2285
  "accounts": [
@@ -5079,6 +5115,155 @@
5079
5115
  }
5080
5116
  ]
5081
5117
  },
5118
+ {
5119
+ "name": "updatePerpMarketFuel",
5120
+ "accounts": [
5121
+ {
5122
+ "name": "admin",
5123
+ "isMut": false,
5124
+ "isSigner": true
5125
+ },
5126
+ {
5127
+ "name": "state",
5128
+ "isMut": false,
5129
+ "isSigner": false
5130
+ },
5131
+ {
5132
+ "name": "perpMarket",
5133
+ "isMut": true,
5134
+ "isSigner": false
5135
+ }
5136
+ ],
5137
+ "args": [
5138
+ {
5139
+ "name": "fuelBoostTaker",
5140
+ "type": {
5141
+ "option": "u8"
5142
+ }
5143
+ },
5144
+ {
5145
+ "name": "fuelBoostMaker",
5146
+ "type": {
5147
+ "option": "u8"
5148
+ }
5149
+ },
5150
+ {
5151
+ "name": "fuelBoostPosition",
5152
+ "type": {
5153
+ "option": "u8"
5154
+ }
5155
+ }
5156
+ ]
5157
+ },
5158
+ {
5159
+ "name": "updateSpotMarketFuel",
5160
+ "accounts": [
5161
+ {
5162
+ "name": "admin",
5163
+ "isMut": false,
5164
+ "isSigner": true
5165
+ },
5166
+ {
5167
+ "name": "state",
5168
+ "isMut": false,
5169
+ "isSigner": false
5170
+ },
5171
+ {
5172
+ "name": "spotMarket",
5173
+ "isMut": true,
5174
+ "isSigner": false
5175
+ }
5176
+ ],
5177
+ "args": [
5178
+ {
5179
+ "name": "fuelBoostDeposits",
5180
+ "type": {
5181
+ "option": "u8"
5182
+ }
5183
+ },
5184
+ {
5185
+ "name": "fuelBoostBorrows",
5186
+ "type": {
5187
+ "option": "u8"
5188
+ }
5189
+ },
5190
+ {
5191
+ "name": "fuelBoostTaker",
5192
+ "type": {
5193
+ "option": "u8"
5194
+ }
5195
+ },
5196
+ {
5197
+ "name": "fuelBoostMaker",
5198
+ "type": {
5199
+ "option": "u8"
5200
+ }
5201
+ },
5202
+ {
5203
+ "name": "fuelBoostInsurance",
5204
+ "type": {
5205
+ "option": "u8"
5206
+ }
5207
+ }
5208
+ ]
5209
+ },
5210
+ {
5211
+ "name": "initUserFuel",
5212
+ "accounts": [
5213
+ {
5214
+ "name": "admin",
5215
+ "isMut": false,
5216
+ "isSigner": true
5217
+ },
5218
+ {
5219
+ "name": "state",
5220
+ "isMut": false,
5221
+ "isSigner": false
5222
+ },
5223
+ {
5224
+ "name": "user",
5225
+ "isMut": true,
5226
+ "isSigner": false
5227
+ },
5228
+ {
5229
+ "name": "userStats",
5230
+ "isMut": true,
5231
+ "isSigner": false
5232
+ }
5233
+ ],
5234
+ "args": [
5235
+ {
5236
+ "name": "fuelBoostDeposits",
5237
+ "type": {
5238
+ "option": "u32"
5239
+ }
5240
+ },
5241
+ {
5242
+ "name": "fuelBoostBorrows",
5243
+ "type": {
5244
+ "option": "u32"
5245
+ }
5246
+ },
5247
+ {
5248
+ "name": "fuelBoostTaker",
5249
+ "type": {
5250
+ "option": "u32"
5251
+ }
5252
+ },
5253
+ {
5254
+ "name": "fuelBoostMaker",
5255
+ "type": {
5256
+ "option": "u32"
5257
+ }
5258
+ },
5259
+ {
5260
+ "name": "fuelBoostInsurance",
5261
+ "type": {
5262
+ "option": "u32"
5263
+ }
5264
+ }
5265
+ ]
5266
+ },
5082
5267
  {
5083
5268
  "name": "updateAdmin",
5084
5269
  "accounts": [
@@ -5918,12 +6103,36 @@
5918
6103
  ],
5919
6104
  "type": "i16"
5920
6105
  },
6106
+ {
6107
+ "name": "fuelBoostPosition",
6108
+ "docs": [
6109
+ "fuel multiplier for perp funding",
6110
+ "precision: 10"
6111
+ ],
6112
+ "type": "u8"
6113
+ },
6114
+ {
6115
+ "name": "fuelBoostTaker",
6116
+ "docs": [
6117
+ "fuel multiplier for perp taker",
6118
+ "precision: 10"
6119
+ ],
6120
+ "type": "u8"
6121
+ },
6122
+ {
6123
+ "name": "fuelBoostMaker",
6124
+ "docs": [
6125
+ "fuel multiplier for perp maker",
6126
+ "precision: 10"
6127
+ ],
6128
+ "type": "u8"
6129
+ },
5921
6130
  {
5922
6131
  "name": "padding",
5923
6132
  "type": {
5924
6133
  "array": [
5925
6134
  "u8",
5926
- 46
6135
+ 43
5927
6136
  ]
5928
6137
  }
5929
6138
  }
@@ -6376,12 +6585,52 @@
6376
6585
  ],
6377
6586
  "type": "u8"
6378
6587
  },
6588
+ {
6589
+ "name": "fuelBoostDeposits",
6590
+ "docs": [
6591
+ "fuel multiplier for spot deposits",
6592
+ "precision: 10"
6593
+ ],
6594
+ "type": "u8"
6595
+ },
6596
+ {
6597
+ "name": "fuelBoostBorrows",
6598
+ "docs": [
6599
+ "fuel multiplier for spot borrows",
6600
+ "precision: 10"
6601
+ ],
6602
+ "type": "u8"
6603
+ },
6604
+ {
6605
+ "name": "fuelBoostTaker",
6606
+ "docs": [
6607
+ "fuel multiplier for spot taker",
6608
+ "precision: 10"
6609
+ ],
6610
+ "type": "u8"
6611
+ },
6612
+ {
6613
+ "name": "fuelBoostMaker",
6614
+ "docs": [
6615
+ "fuel multiplier for spot maker",
6616
+ "precision: 10"
6617
+ ],
6618
+ "type": "u8"
6619
+ },
6620
+ {
6621
+ "name": "fuelBoostInsurance",
6622
+ "docs": [
6623
+ "fuel multiplier for spot insurance stake",
6624
+ "precision: 10"
6625
+ ],
6626
+ "type": "u8"
6627
+ },
6379
6628
  {
6380
6629
  "name": "padding",
6381
6630
  "type": {
6382
6631
  "array": [
6383
6632
  "u8",
6384
- 47
6633
+ 42
6385
6634
  ]
6386
6635
  }
6387
6636
  }
@@ -6729,12 +6978,25 @@
6729
6978
  ],
6730
6979
  "type": "bool"
6731
6980
  },
6981
+ {
6982
+ "name": "padding1",
6983
+ "type": {
6984
+ "array": [
6985
+ "u8",
6986
+ 5
6987
+ ]
6988
+ }
6989
+ },
6990
+ {
6991
+ "name": "lastFuelBonusUpdateTs",
6992
+ "type": "u32"
6993
+ },
6732
6994
  {
6733
6995
  "name": "padding",
6734
6996
  "type": {
6735
6997
  "array": [
6736
6998
  "u8",
6737
- 21
6999
+ 12
6738
7000
  ]
6739
7001
  }
6740
7002
  }
@@ -6855,12 +7117,77 @@
6855
7117
  "name": "disableUpdatePerpBidAskTwap",
6856
7118
  "type": "bool"
6857
7119
  },
7120
+ {
7121
+ "name": "padding1",
7122
+ "type": {
7123
+ "array": [
7124
+ "u8",
7125
+ 2
7126
+ ]
7127
+ }
7128
+ },
7129
+ {
7130
+ "name": "fuelInsurance",
7131
+ "docs": [
7132
+ "accumulated fuel for token amounts of insurance"
7133
+ ],
7134
+ "type": "u32"
7135
+ },
7136
+ {
7137
+ "name": "fuelDeposits",
7138
+ "docs": [
7139
+ "accumulated fuel for notional of deposits"
7140
+ ],
7141
+ "type": "u32"
7142
+ },
7143
+ {
7144
+ "name": "fuelBorrows",
7145
+ "docs": [
7146
+ "accumulate fuel bonus for notional of borrows"
7147
+ ],
7148
+ "type": "u32"
7149
+ },
7150
+ {
7151
+ "name": "fuelPositions",
7152
+ "docs": [
7153
+ "accumulated fuel for perp open interest"
7154
+ ],
7155
+ "type": "u32"
7156
+ },
7157
+ {
7158
+ "name": "fuelTaker",
7159
+ "docs": [
7160
+ "accumulate fuel bonus for taker volume"
7161
+ ],
7162
+ "type": "u32"
7163
+ },
7164
+ {
7165
+ "name": "fuelMaker",
7166
+ "docs": [
7167
+ "accumulate fuel bonus for maker volume"
7168
+ ],
7169
+ "type": "u32"
7170
+ },
7171
+ {
7172
+ "name": "ifStakedGovTokenAmount",
7173
+ "docs": [
7174
+ "The amount of tokens staked in the governance spot markets if"
7175
+ ],
7176
+ "type": "u64"
7177
+ },
7178
+ {
7179
+ "name": "lastFuelIfBonusUpdateTs",
7180
+ "docs": [
7181
+ "last unix ts user stats data was used to update if fuel (u32 to save space)"
7182
+ ],
7183
+ "type": "u32"
7184
+ },
6858
7185
  {
6859
7186
  "name": "padding",
6860
7187
  "type": {
6861
7188
  "array": [
6862
7189
  "u8",
6863
- 50
7190
+ 12
6864
7191
  ]
6865
7192
  }
6866
7193
  }
package/src/index.ts CHANGED
@@ -65,6 +65,7 @@ export * from './slot/SlotSubscriber';
65
65
  export * from './wallet';
66
66
  export * from './types';
67
67
  export * from './math/utils';
68
+ export * from './math/fuel';
68
69
  export * from './config';
69
70
  export * from './constants/numericConstants';
70
71
  export * from './serum/serumSubscriber';
@@ -0,0 +1,70 @@
1
+ import { BN } from '@coral-xyz/anchor';
2
+ import { SpotMarketAccount, PerpMarketAccount } from '..';
3
+ import {
4
+ QUOTE_PRECISION,
5
+ ZERO,
6
+ FUEL_WINDOW,
7
+ } from '../constants/numericConstants';
8
+
9
+ export function calculateInsuranceFuelBonus(
10
+ spotMarket: SpotMarketAccount,
11
+ tokenStakeAmount: BN,
12
+ fuelBonusNumerator: BN
13
+ ): BN {
14
+ const result = tokenStakeAmount
15
+ .abs()
16
+ .mul(fuelBonusNumerator)
17
+ .mul(new BN(spotMarket.fuelBoostInsurance))
18
+ .div(FUEL_WINDOW)
19
+ .div(QUOTE_PRECISION.div(new BN(10)));
20
+ return result;
21
+ }
22
+
23
+ export function calculateSpotFuelBonus(
24
+ spotMarket: SpotMarketAccount,
25
+ signedTokenValue: BN,
26
+ fuelBonusNumerator: BN
27
+ ): BN {
28
+ let result: BN;
29
+
30
+ if (signedTokenValue.abs().lte(QUOTE_PRECISION)) {
31
+ result = ZERO;
32
+ } else if (signedTokenValue.gt(new BN(0))) {
33
+ result = signedTokenValue
34
+ .abs()
35
+ .mul(fuelBonusNumerator)
36
+ .mul(new BN(spotMarket.fuelBoostDeposits))
37
+ .div(FUEL_WINDOW)
38
+ .div(QUOTE_PRECISION.div(new BN(10)));
39
+ } else {
40
+ result = signedTokenValue
41
+ .abs()
42
+ .mul(fuelBonusNumerator)
43
+ .mul(new BN(spotMarket.fuelBoostBorrows))
44
+ .div(FUEL_WINDOW)
45
+ .div(QUOTE_PRECISION.div(new BN(10)));
46
+ }
47
+
48
+ return result;
49
+ }
50
+
51
+ export function calculatePerpFuelBonus(
52
+ perpMarket: PerpMarketAccount,
53
+ baseAssetValue: BN,
54
+ fuelBonusNumerator: BN
55
+ ): BN {
56
+ let result: BN;
57
+
58
+ if (baseAssetValue.abs().lte(QUOTE_PRECISION)) {
59
+ result = new BN(0);
60
+ } else {
61
+ result = baseAssetValue
62
+ .abs()
63
+ .mul(fuelBonusNumerator)
64
+ .mul(new BN(perpMarket.fuelBoostPosition))
65
+ .div(FUEL_WINDOW)
66
+ .div(QUOTE_PRECISION.div(new BN(10)));
67
+ }
68
+
69
+ return result;
70
+ }
package/src/types.ts CHANGED
@@ -636,6 +636,10 @@ export type PerpMarketAccount = {
636
636
  quoteSpotMarketIndex: number;
637
637
  feeAdjustment: number;
638
638
  pausedOperations: number;
639
+
640
+ fuelBoostTaker: number;
641
+ fuelBoostMaker: number;
642
+ fuelBoostPosition: number;
639
643
  };
640
644
 
641
645
  export type HistoricalOracleData = {
@@ -734,6 +738,12 @@ export type SpotMarketAccount = {
734
738
 
735
739
  maxTokenBorrowsFraction: number;
736
740
  minBorrowRate: number;
741
+
742
+ fuelBoostDeposits: number;
743
+ fuelBoostBorrows: number;
744
+ fuelBoostTaker: number;
745
+ fuelBoostMaker: number;
746
+ fuelBoostInsurance: number;
737
747
  };
738
748
 
739
749
  export type PoolBalance = {
@@ -876,6 +886,17 @@ export type UserStatsAccount = {
876
886
  isReferrer: boolean;
877
887
  authority: PublicKey;
878
888
  ifStakedQuoteAssetAmount: BN;
889
+
890
+ lastFuelBonusUpdateTs: number; // u32 onchain
891
+
892
+ fuelInsurance: number;
893
+ fuelDeposits: number;
894
+ fuelBorrows: number;
895
+ fuelPositions: number;
896
+ fuelTaker: number;
897
+ fuelMaker: number;
898
+
899
+ ifStakedGovTokenAmount: BN;
879
900
  };
880
901
 
881
902
  export type UserAccount = {
@@ -905,6 +926,7 @@ export type UserAccount = {
905
926
  hasOpenOrder: boolean;
906
927
  openAuctions: number;
907
928
  hasOpenAuction: boolean;
929
+ lastFuelBonusUpdateTs: number;
908
930
  };
909
931
 
910
932
  export type SpotPosition = {