@drift-labs/sdk 0.2.0-master.21 → 0.2.0-master.24
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/lib/accounts/types.d.ts +1 -0
- package/lib/addresses/pda.d.ts +3 -0
- package/lib/addresses/pda.js +23 -1
- package/lib/admin.d.ts +3 -0
- package/lib/admin.js +31 -0
- package/lib/clearingHouse.d.ts +9 -2
- package/lib/clearingHouse.js +132 -4
- package/lib/clearingHouseUser.js +5 -5
- package/lib/config.js +1 -1
- package/lib/constants/banks.d.ts +2 -0
- package/lib/constants/banks.js +9 -0
- package/lib/constants/numericConstants.d.ts +2 -0
- package/lib/constants/numericConstants.js +4 -1
- package/lib/events/sort.js +7 -10
- package/lib/events/types.d.ts +2 -1
- package/lib/events/types.js +1 -0
- package/lib/idl/clearing_house.json +1008 -147
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/math/amm.js +2 -2
- package/lib/math/insurance.d.ts +4 -0
- package/lib/math/insurance.js +27 -0
- package/lib/math/margin.d.ts +1 -1
- package/lib/math/margin.js +5 -7
- package/lib/math/position.js +1 -1
- package/lib/types.d.ts +56 -20
- package/lib/types.js +0 -3
- package/package.json +1 -1
- package/src/addresses/marketAddresses.js +26 -0
- package/src/addresses/pda.ts +47 -0
- package/src/admin.ts +65 -0
- package/src/assert/assert.js +9 -0
- package/src/clearingHouse.ts +217 -9
- package/src/clearingHouseUser.ts +10 -6
- package/src/config.ts +1 -1
- package/src/constants/banks.js +42 -0
- package/src/constants/banks.ts +16 -0
- package/src/constants/markets.js +42 -0
- package/src/constants/numericConstants.js +41 -0
- package/src/constants/numericConstants.ts +4 -0
- package/src/events/eventList.js +77 -0
- package/src/events/sort.ts +10 -14
- package/src/events/txEventCache.js +71 -0
- package/src/events/types.ts +3 -0
- package/src/examples/makeTradeExample.js +80 -0
- package/src/factory/bigNum.js +390 -0
- package/src/factory/oracleClient.js +20 -0
- package/src/idl/clearing_house.json +1008 -147
- package/src/index.ts +1 -0
- package/src/math/amm.ts +2 -2
- package/src/math/auction.js +42 -0
- package/src/math/conversion.js +11 -0
- package/src/math/funding.js +248 -0
- package/src/math/insurance.ts +35 -0
- package/src/math/margin.ts +3 -10
- package/src/math/oracles.js +26 -0
- package/src/math/position.ts +2 -2
- package/src/math/repeg.js +128 -0
- package/src/math/state.js +15 -0
- package/src/math/trade.js +253 -0
- package/src/math/utils.js +26 -0
- package/src/math/utils.js.map +1 -0
- package/src/oracles/oracleClientCache.js +19 -0
- package/src/oracles/pythClient.js +46 -0
- package/src/oracles/quoteAssetOracleClient.js +32 -0
- package/src/oracles/switchboardClient.js +69 -0
- package/src/oracles/types.js +2 -0
- package/src/orderParams.js +20 -0
- package/src/slot/SlotSubscriber.js +39 -0
- package/src/token/index.js +38 -0
- package/src/tokenFaucet.js +189 -0
- package/src/tx/types.js +2 -0
- package/src/tx/utils.js +17 -0
- package/src/types.ts +64 -20
- package/src/userName.js +20 -0
- package/src/util/computeUnits.js +27 -0
- package/src/util/getTokenAddress.js +9 -0
- package/src/util/promiseTimeout.js +14 -0
- package/src/util/tps.js +27 -0
- package/src/wallet.js +35 -0
- package/my-script/.env +0 -7
- package/my-script/getUserStats.ts +0 -124
- package/my-script/multiConnections.ts +0 -137
- package/my-script/test-regex.ts +0 -11
- package/my-script/utils.ts +0 -52
- package/my-script/ww18NdhuLSQPCrHSx7V68eZJpe2y311heWeXJfSmP3Q.json +0 -1
- package/my-script/ww2z7N9TG1PLLUQGQF2VKzCFaPtQ5FBhRfeEAuy6c5C.json +0 -1
- package/my-script/ww3StJtTubhwssqAhvSSAc5ifCgKjzmF8hz7Gt2DmSa.json +0 -1
package/src/clearingHouse.ts
CHANGED
|
@@ -40,6 +40,7 @@ import { EventEmitter } from 'events';
|
|
|
40
40
|
import StrictEventEmitter from 'strict-event-emitter-types';
|
|
41
41
|
import {
|
|
42
42
|
getClearingHouseStateAccountPublicKey,
|
|
43
|
+
getInsuranceFundStakeAccountPublicKey,
|
|
43
44
|
getMarketPublicKey,
|
|
44
45
|
getUserAccountPublicKey,
|
|
45
46
|
getUserAccountPublicKeySync,
|
|
@@ -2175,6 +2176,7 @@ export class ClearingHouse {
|
|
|
2175
2176
|
public async resolvePerpBankruptcy(
|
|
2176
2177
|
userAccountPublicKey: PublicKey,
|
|
2177
2178
|
userAccount: UserAccount,
|
|
2179
|
+
bankIndex: BN,
|
|
2178
2180
|
marketIndex: BN
|
|
2179
2181
|
): Promise<TransactionSignature> {
|
|
2180
2182
|
const { txSig } = await this.txSender.send(
|
|
@@ -2182,6 +2184,7 @@ export class ClearingHouse {
|
|
|
2182
2184
|
await this.getResolvePerpBankruptcyIx(
|
|
2183
2185
|
userAccountPublicKey,
|
|
2184
2186
|
userAccount,
|
|
2187
|
+
bankIndex,
|
|
2185
2188
|
marketIndex
|
|
2186
2189
|
)
|
|
2187
2190
|
),
|
|
@@ -2194,24 +2197,36 @@ export class ClearingHouse {
|
|
|
2194
2197
|
public async getResolvePerpBankruptcyIx(
|
|
2195
2198
|
userAccountPublicKey: PublicKey,
|
|
2196
2199
|
userAccount: UserAccount,
|
|
2200
|
+
bankIndex: BN,
|
|
2197
2201
|
marketIndex: BN
|
|
2198
2202
|
): Promise<TransactionInstruction> {
|
|
2199
2203
|
const liquidatorPublicKey = await this.getUserAccountPublicKey();
|
|
2200
2204
|
|
|
2201
2205
|
const remainingAccounts = this.getRemainingAccountsWithCounterparty({
|
|
2202
2206
|
writableMarketIndex: marketIndex,
|
|
2207
|
+
writableBankIndexes: [bankIndex],
|
|
2203
2208
|
counterPartyUserAccount: userAccount,
|
|
2204
2209
|
});
|
|
2205
2210
|
|
|
2206
|
-
|
|
2207
|
-
|
|
2208
|
-
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
|
|
2211
|
+
const bank = this.getBankAccount(bankIndex);
|
|
2212
|
+
|
|
2213
|
+
return await this.program.instruction.resolvePerpBankruptcy(
|
|
2214
|
+
bankIndex,
|
|
2215
|
+
marketIndex,
|
|
2216
|
+
{
|
|
2217
|
+
accounts: {
|
|
2218
|
+
state: await this.getStatePublicKey(),
|
|
2219
|
+
authority: this.wallet.publicKey,
|
|
2220
|
+
user: userAccountPublicKey,
|
|
2221
|
+
liquidator: liquidatorPublicKey,
|
|
2222
|
+
bankVault: bank.vault,
|
|
2223
|
+
insuranceFundVault: bank.insuranceFundVault,
|
|
2224
|
+
insuranceFundVaultAuthority: bank.insuranceFundVaultAuthority,
|
|
2225
|
+
tokenProgram: TOKEN_PROGRAM_ID,
|
|
2226
|
+
},
|
|
2227
|
+
remainingAccounts: remainingAccounts,
|
|
2228
|
+
}
|
|
2229
|
+
);
|
|
2215
2230
|
}
|
|
2216
2231
|
|
|
2217
2232
|
public async resolveBorrowBankruptcy(
|
|
@@ -2245,12 +2260,18 @@ export class ClearingHouse {
|
|
|
2245
2260
|
counterPartyUserAccount: userAccount,
|
|
2246
2261
|
});
|
|
2247
2262
|
|
|
2263
|
+
const bank = this.getBankAccount(bankIndex);
|
|
2264
|
+
|
|
2248
2265
|
return await this.program.instruction.resolveBorrowBankruptcy(bankIndex, {
|
|
2249
2266
|
accounts: {
|
|
2250
2267
|
state: await this.getStatePublicKey(),
|
|
2251
2268
|
authority: this.wallet.publicKey,
|
|
2252
2269
|
user: userAccountPublicKey,
|
|
2253
2270
|
liquidator: liquidatorPublicKey,
|
|
2271
|
+
bankVault: bank.vault,
|
|
2272
|
+
insuranceFundVault: bank.insuranceFundVault,
|
|
2273
|
+
insuranceFundVaultAuthority: bank.insuranceFundVaultAuthority,
|
|
2274
|
+
tokenProgram: TOKEN_PROGRAM_ID,
|
|
2254
2275
|
},
|
|
2255
2276
|
remainingAccounts: remainingAccounts,
|
|
2256
2277
|
});
|
|
@@ -2480,4 +2501,191 @@ export class ClearingHouse {
|
|
|
2480
2501
|
|
|
2481
2502
|
return oracleData;
|
|
2482
2503
|
}
|
|
2504
|
+
|
|
2505
|
+
public async initializeInsuranceFundStake(
|
|
2506
|
+
bankIndex: BN
|
|
2507
|
+
): Promise<TransactionSignature> {
|
|
2508
|
+
const { txSig } = await this.txSender.send(
|
|
2509
|
+
wrapInTx(await this.getInitializeInsuranceFundStakeIx(bankIndex)),
|
|
2510
|
+
[],
|
|
2511
|
+
this.opts
|
|
2512
|
+
);
|
|
2513
|
+
return txSig;
|
|
2514
|
+
}
|
|
2515
|
+
|
|
2516
|
+
public async getInitializeInsuranceFundStakeIx(
|
|
2517
|
+
bankIndex: BN
|
|
2518
|
+
): Promise<TransactionInstruction> {
|
|
2519
|
+
const ifStakeAccountPublicKey = getInsuranceFundStakeAccountPublicKey(
|
|
2520
|
+
this.program.programId,
|
|
2521
|
+
this.wallet.publicKey,
|
|
2522
|
+
bankIndex
|
|
2523
|
+
);
|
|
2524
|
+
|
|
2525
|
+
return await this.program.instruction.initializeInsuranceFundStake(
|
|
2526
|
+
bankIndex,
|
|
2527
|
+
{
|
|
2528
|
+
accounts: {
|
|
2529
|
+
insuranceFundStake: ifStakeAccountPublicKey,
|
|
2530
|
+
bank: this.getBankAccount(bankIndex).pubkey,
|
|
2531
|
+
userStats: this.getUserStatsAccountPublicKey(),
|
|
2532
|
+
authority: this.wallet.publicKey,
|
|
2533
|
+
payer: this.wallet.publicKey,
|
|
2534
|
+
rent: anchor.web3.SYSVAR_RENT_PUBKEY,
|
|
2535
|
+
systemProgram: anchor.web3.SystemProgram.programId,
|
|
2536
|
+
state: await this.getStatePublicKey(),
|
|
2537
|
+
},
|
|
2538
|
+
}
|
|
2539
|
+
);
|
|
2540
|
+
}
|
|
2541
|
+
|
|
2542
|
+
public async addInsuranceFundStake(
|
|
2543
|
+
bankIndex: BN,
|
|
2544
|
+
amount: BN,
|
|
2545
|
+
collateralAccountPublicKey: PublicKey
|
|
2546
|
+
): Promise<TransactionSignature> {
|
|
2547
|
+
const bank = this.getBankAccount(bankIndex);
|
|
2548
|
+
const ifStakeAccountPublicKey = getInsuranceFundStakeAccountPublicKey(
|
|
2549
|
+
this.program.programId,
|
|
2550
|
+
this.wallet.publicKey,
|
|
2551
|
+
bankIndex
|
|
2552
|
+
);
|
|
2553
|
+
|
|
2554
|
+
const remainingAccounts = this.getRemainingAccounts({
|
|
2555
|
+
writableBankIndex: bankIndex,
|
|
2556
|
+
});
|
|
2557
|
+
|
|
2558
|
+
return await this.program.rpc.addInsuranceFundStake(bankIndex, amount, {
|
|
2559
|
+
accounts: {
|
|
2560
|
+
state: await this.getStatePublicKey(),
|
|
2561
|
+
bank: bank.pubkey,
|
|
2562
|
+
insuranceFundStake: ifStakeAccountPublicKey,
|
|
2563
|
+
userStats: this.getUserStatsAccountPublicKey(),
|
|
2564
|
+
authority: this.wallet.publicKey,
|
|
2565
|
+
insuranceFundVault: bank.insuranceFundVault,
|
|
2566
|
+
userTokenAccount: collateralAccountPublicKey,
|
|
2567
|
+
tokenProgram: TOKEN_PROGRAM_ID,
|
|
2568
|
+
},
|
|
2569
|
+
remainingAccounts,
|
|
2570
|
+
});
|
|
2571
|
+
}
|
|
2572
|
+
|
|
2573
|
+
public async requestRemoveInsuranceFundStake(
|
|
2574
|
+
bankIndex: BN,
|
|
2575
|
+
amount: BN
|
|
2576
|
+
): Promise<TransactionSignature> {
|
|
2577
|
+
const bank = this.getBankAccount(bankIndex);
|
|
2578
|
+
const ifStakeAccountPublicKey = getInsuranceFundStakeAccountPublicKey(
|
|
2579
|
+
this.program.programId,
|
|
2580
|
+
this.wallet.publicKey,
|
|
2581
|
+
bankIndex
|
|
2582
|
+
);
|
|
2583
|
+
|
|
2584
|
+
const remainingAccounts = this.getRemainingAccounts({
|
|
2585
|
+
writableBankIndex: bankIndex,
|
|
2586
|
+
});
|
|
2587
|
+
|
|
2588
|
+
return await this.program.rpc.requestRemoveInsuranceFundStake(
|
|
2589
|
+
bankIndex,
|
|
2590
|
+
amount,
|
|
2591
|
+
{
|
|
2592
|
+
accounts: {
|
|
2593
|
+
state: await this.getStatePublicKey(),
|
|
2594
|
+
bank: bank.pubkey,
|
|
2595
|
+
insuranceFundStake: ifStakeAccountPublicKey,
|
|
2596
|
+
userStats: this.getUserStatsAccountPublicKey(),
|
|
2597
|
+
authority: this.wallet.publicKey,
|
|
2598
|
+
insuranceFundVault: bank.insuranceFundVault,
|
|
2599
|
+
// userTokenAccount: collateralAccountPublicKey,
|
|
2600
|
+
// tokenProgram: TOKEN_PROGRAM_ID,
|
|
2601
|
+
},
|
|
2602
|
+
remainingAccounts,
|
|
2603
|
+
}
|
|
2604
|
+
);
|
|
2605
|
+
}
|
|
2606
|
+
|
|
2607
|
+
public async cancelRequestRemoveInsuranceFundStake(
|
|
2608
|
+
bankIndex: BN
|
|
2609
|
+
): Promise<TransactionSignature> {
|
|
2610
|
+
const bank = this.getBankAccount(bankIndex);
|
|
2611
|
+
const ifStakeAccountPublicKey = getInsuranceFundStakeAccountPublicKey(
|
|
2612
|
+
this.program.programId,
|
|
2613
|
+
this.wallet.publicKey,
|
|
2614
|
+
bankIndex
|
|
2615
|
+
);
|
|
2616
|
+
|
|
2617
|
+
const remainingAccounts = this.getRemainingAccounts({
|
|
2618
|
+
writableBankIndex: bankIndex,
|
|
2619
|
+
});
|
|
2620
|
+
|
|
2621
|
+
return await this.program.rpc.cancelRequestRemoveInsuranceFundStake(
|
|
2622
|
+
bankIndex,
|
|
2623
|
+
{
|
|
2624
|
+
accounts: {
|
|
2625
|
+
state: await this.getStatePublicKey(),
|
|
2626
|
+
bank: bank.pubkey,
|
|
2627
|
+
insuranceFundStake: ifStakeAccountPublicKey,
|
|
2628
|
+
userStats: this.getUserStatsAccountPublicKey(),
|
|
2629
|
+
authority: this.wallet.publicKey,
|
|
2630
|
+
insuranceFundVault: bank.insuranceFundVault,
|
|
2631
|
+
// userTokenAccount: collateralAccountPublicKey,
|
|
2632
|
+
// tokenProgram: TOKEN_PROGRAM_ID,
|
|
2633
|
+
},
|
|
2634
|
+
remainingAccounts,
|
|
2635
|
+
}
|
|
2636
|
+
);
|
|
2637
|
+
}
|
|
2638
|
+
|
|
2639
|
+
public async removeInsuranceFundStake(
|
|
2640
|
+
bankIndex: BN,
|
|
2641
|
+
collateralAccountPublicKey: PublicKey
|
|
2642
|
+
): Promise<TransactionSignature> {
|
|
2643
|
+
const bank = this.getBankAccount(bankIndex);
|
|
2644
|
+
const ifStakeAccountPublicKey = getInsuranceFundStakeAccountPublicKey(
|
|
2645
|
+
this.program.programId,
|
|
2646
|
+
this.wallet.publicKey,
|
|
2647
|
+
bankIndex
|
|
2648
|
+
);
|
|
2649
|
+
|
|
2650
|
+
const remainingAccounts = this.getRemainingAccounts({
|
|
2651
|
+
writableBankIndex: bankIndex,
|
|
2652
|
+
});
|
|
2653
|
+
|
|
2654
|
+
return await this.program.rpc.removeInsuranceFundStake(bankIndex, {
|
|
2655
|
+
accounts: {
|
|
2656
|
+
state: await this.getStatePublicKey(),
|
|
2657
|
+
bank: bank.pubkey,
|
|
2658
|
+
insuranceFundStake: ifStakeAccountPublicKey,
|
|
2659
|
+
userStats: this.getUserStatsAccountPublicKey(),
|
|
2660
|
+
authority: this.wallet.publicKey,
|
|
2661
|
+
insuranceFundVault: bank.insuranceFundVault,
|
|
2662
|
+
insuranceFundVaultAuthority: bank.insuranceFundVaultAuthority,
|
|
2663
|
+
userTokenAccount: collateralAccountPublicKey,
|
|
2664
|
+
tokenProgram: TOKEN_PROGRAM_ID,
|
|
2665
|
+
},
|
|
2666
|
+
remainingAccounts,
|
|
2667
|
+
});
|
|
2668
|
+
}
|
|
2669
|
+
|
|
2670
|
+
public async settleRevenueToInsuranceFund(
|
|
2671
|
+
bankIndex: BN
|
|
2672
|
+
): Promise<TransactionSignature> {
|
|
2673
|
+
const bank = this.getBankAccount(bankIndex);
|
|
2674
|
+
|
|
2675
|
+
const remainingAccounts = this.getRemainingAccounts({
|
|
2676
|
+
writableBankIndex: bankIndex,
|
|
2677
|
+
});
|
|
2678
|
+
|
|
2679
|
+
return await this.program.rpc.settleRevenueToInsuranceFund(bankIndex, {
|
|
2680
|
+
accounts: {
|
|
2681
|
+
state: await this.getStatePublicKey(),
|
|
2682
|
+
bank: bank.pubkey,
|
|
2683
|
+
bankVault: bank.vault,
|
|
2684
|
+
bankVaultAuthority: bank.vaultAuthority,
|
|
2685
|
+
insuranceFundVault: bank.insuranceFundVault,
|
|
2686
|
+
tokenProgram: TOKEN_PROGRAM_ID,
|
|
2687
|
+
},
|
|
2688
|
+
remainingAccounts,
|
|
2689
|
+
});
|
|
2690
|
+
}
|
|
2483
2691
|
}
|
package/src/clearingHouseUser.ts
CHANGED
|
@@ -46,7 +46,7 @@ import {
|
|
|
46
46
|
calculateLiabilityWeight,
|
|
47
47
|
} from './math/bankBalance';
|
|
48
48
|
import {
|
|
49
|
-
|
|
49
|
+
calculateBaseAssetValueWithOracle,
|
|
50
50
|
calculateWorstCaseBaseAssetAmount,
|
|
51
51
|
} from './math/margin';
|
|
52
52
|
import { OraclePriceData } from './oracles/types';
|
|
@@ -568,7 +568,7 @@ export class ClearingHouseUser {
|
|
|
568
568
|
const market = this.clearingHouse.getMarketAccount(
|
|
569
569
|
marketPosition.marketIndex
|
|
570
570
|
);
|
|
571
|
-
const posVal =
|
|
571
|
+
const posVal = calculateBaseAssetValueWithOracle(
|
|
572
572
|
market,
|
|
573
573
|
marketPosition,
|
|
574
574
|
this.getOracleDataForMarket(market.marketIndex)
|
|
@@ -593,7 +593,11 @@ export class ClearingHouseUser {
|
|
|
593
593
|
const market = this.clearingHouse.getMarketAccount(
|
|
594
594
|
userPosition.marketIndex
|
|
595
595
|
);
|
|
596
|
-
return
|
|
596
|
+
return calculateBaseAssetValueWithOracle(
|
|
597
|
+
market,
|
|
598
|
+
userPosition,
|
|
599
|
+
oraclePriceData
|
|
600
|
+
);
|
|
597
601
|
}
|
|
598
602
|
|
|
599
603
|
public getPositionSide(
|
|
@@ -644,7 +648,7 @@ export class ClearingHouseUser {
|
|
|
644
648
|
oraclePriceData
|
|
645
649
|
);
|
|
646
650
|
} else {
|
|
647
|
-
baseAssetValue =
|
|
651
|
+
baseAssetValue = calculateBaseAssetValueWithOracle(
|
|
648
652
|
market,
|
|
649
653
|
position,
|
|
650
654
|
oraclePriceData
|
|
@@ -818,7 +822,7 @@ export class ClearingHouseUser {
|
|
|
818
822
|
proposedMarketPosition.marketIndex
|
|
819
823
|
);
|
|
820
824
|
|
|
821
|
-
const proposedMarketPositionValue =
|
|
825
|
+
const proposedMarketPositionValue = calculateBaseAssetValueWithOracle(
|
|
822
826
|
market,
|
|
823
827
|
proposedMarketPosition,
|
|
824
828
|
this.getOracleDataForMarket(market.marketIndex)
|
|
@@ -835,7 +839,7 @@ export class ClearingHouseUser {
|
|
|
835
839
|
const market = this.clearingHouse.getMarketAccount(
|
|
836
840
|
position.marketIndex
|
|
837
841
|
);
|
|
838
|
-
const positionValue =
|
|
842
|
+
const positionValue = calculateBaseAssetValueWithOracle(
|
|
839
843
|
market,
|
|
840
844
|
position,
|
|
841
845
|
this.getOracleDataForMarket(market.marketIndex)
|
package/src/config.ts
CHANGED
|
@@ -28,7 +28,7 @@ export const configs: { [key in DriftEnv]: DriftConfig } = {
|
|
|
28
28
|
devnet: {
|
|
29
29
|
ENV: 'devnet',
|
|
30
30
|
PYTH_ORACLE_MAPPING_ADDRESS: 'BmA9Z6FjioHJPpjT39QazZyhDRUdZy2ezwx4GiDdE2u2',
|
|
31
|
-
CLEARING_HOUSE_PROGRAM_ID: '
|
|
31
|
+
CLEARING_HOUSE_PROGRAM_ID: 'HbUKwqFPjz9r7ZtT416AU8aaecDQMKKiDCTS3AdXnS6c',
|
|
32
32
|
USDC_MINT_ADDRESS: '8zGuJQqwhZafTah7Uc7Z4tXRnguqkn5KLFAP8oV6PHe2',
|
|
33
33
|
MARKETS: DevnetMarkets,
|
|
34
34
|
BANKS: DevnetBanks,
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Banks = exports.MainnetBanks = exports.DevnetBanks = exports.WRAPPED_SOL_MINT = void 0;
|
|
4
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
5
|
+
const __1 = require("../");
|
|
6
|
+
exports.WRAPPED_SOL_MINT = new web3_js_1.PublicKey('So11111111111111111111111111111111111111112');
|
|
7
|
+
exports.DevnetBanks = [
|
|
8
|
+
{
|
|
9
|
+
symbol: 'USDC',
|
|
10
|
+
bankIndex: new __1.BN(0),
|
|
11
|
+
oracle: web3_js_1.PublicKey.default,
|
|
12
|
+
oracleSource: __1.OracleSource.QUOTE_ASSET,
|
|
13
|
+
mint: new web3_js_1.PublicKey('8zGuJQqwhZafTah7Uc7Z4tXRnguqkn5KLFAP8oV6PHe2'),
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
symbol: 'SOL',
|
|
17
|
+
bankIndex: new __1.BN(1),
|
|
18
|
+
oracle: new web3_js_1.PublicKey('J83w4HKfqxwcq3BEMMkPFSppX3gqekLyLJBexebFVkix'),
|
|
19
|
+
oracleSource: __1.OracleSource.PYTH,
|
|
20
|
+
mint: new web3_js_1.PublicKey(exports.WRAPPED_SOL_MINT),
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
symbol: 'BTC',
|
|
24
|
+
bankIndex: new __1.BN(2),
|
|
25
|
+
oracle: new web3_js_1.PublicKey('HovQMDrbAgAYPCmHVSrezcSmkMtXSSUsLDFANExrZh2J'),
|
|
26
|
+
oracleSource: __1.OracleSource.PYTH,
|
|
27
|
+
mint: new web3_js_1.PublicKey('3BZPwbcqB5kKScF3TEXxwNfx5ipV13kbRVDvfVp5c6fv'),
|
|
28
|
+
},
|
|
29
|
+
];
|
|
30
|
+
exports.MainnetBanks = [
|
|
31
|
+
{
|
|
32
|
+
symbol: 'USDC',
|
|
33
|
+
bankIndex: new __1.BN(0),
|
|
34
|
+
oracle: web3_js_1.PublicKey.default,
|
|
35
|
+
oracleSource: __1.OracleSource.QUOTE_ASSET,
|
|
36
|
+
mint: new web3_js_1.PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'),
|
|
37
|
+
},
|
|
38
|
+
];
|
|
39
|
+
exports.Banks = {
|
|
40
|
+
devnet: exports.DevnetBanks,
|
|
41
|
+
'mainnet-beta': exports.MainnetBanks,
|
|
42
|
+
};
|
package/src/constants/banks.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { PublicKey } from '@solana/web3.js';
|
|
2
2
|
import { BN, DriftEnv, OracleSource } from '../';
|
|
3
|
+
import {
|
|
4
|
+
BANK_BALANCE_PRECISION,
|
|
5
|
+
BANK_BALANCE_PRECISION_EXP,
|
|
6
|
+
LAMPORTS_EXP,
|
|
7
|
+
LAMPORTS_PRECISION,
|
|
8
|
+
} from './numericConstants';
|
|
3
9
|
|
|
4
10
|
export type BankConfig = {
|
|
5
11
|
symbol: string;
|
|
@@ -7,6 +13,8 @@ export type BankConfig = {
|
|
|
7
13
|
oracle: PublicKey;
|
|
8
14
|
mint: PublicKey;
|
|
9
15
|
oracleSource: OracleSource;
|
|
16
|
+
precision: BN;
|
|
17
|
+
precisionExp: BN;
|
|
10
18
|
};
|
|
11
19
|
|
|
12
20
|
export const WRAPPED_SOL_MINT = new PublicKey(
|
|
@@ -20,6 +28,8 @@ export const DevnetBanks: BankConfig[] = [
|
|
|
20
28
|
oracle: PublicKey.default,
|
|
21
29
|
oracleSource: OracleSource.QUOTE_ASSET,
|
|
22
30
|
mint: new PublicKey('8zGuJQqwhZafTah7Uc7Z4tXRnguqkn5KLFAP8oV6PHe2'),
|
|
31
|
+
precision: BANK_BALANCE_PRECISION,
|
|
32
|
+
precisionExp: BANK_BALANCE_PRECISION_EXP,
|
|
23
33
|
},
|
|
24
34
|
{
|
|
25
35
|
symbol: 'SOL',
|
|
@@ -27,6 +37,8 @@ export const DevnetBanks: BankConfig[] = [
|
|
|
27
37
|
oracle: new PublicKey('J83w4HKfqxwcq3BEMMkPFSppX3gqekLyLJBexebFVkix'),
|
|
28
38
|
oracleSource: OracleSource.PYTH,
|
|
29
39
|
mint: new PublicKey(WRAPPED_SOL_MINT),
|
|
40
|
+
precision: LAMPORTS_PRECISION,
|
|
41
|
+
precisionExp: LAMPORTS_EXP,
|
|
30
42
|
},
|
|
31
43
|
{
|
|
32
44
|
symbol: 'BTC',
|
|
@@ -34,6 +46,8 @@ export const DevnetBanks: BankConfig[] = [
|
|
|
34
46
|
oracle: new PublicKey('HovQMDrbAgAYPCmHVSrezcSmkMtXSSUsLDFANExrZh2J'),
|
|
35
47
|
oracleSource: OracleSource.PYTH,
|
|
36
48
|
mint: new PublicKey('3BZPwbcqB5kKScF3TEXxwNfx5ipV13kbRVDvfVp5c6fv'),
|
|
49
|
+
precision: BANK_BALANCE_PRECISION,
|
|
50
|
+
precisionExp: BANK_BALANCE_PRECISION_EXP,
|
|
37
51
|
},
|
|
38
52
|
];
|
|
39
53
|
|
|
@@ -44,6 +58,8 @@ export const MainnetBanks: BankConfig[] = [
|
|
|
44
58
|
oracle: PublicKey.default,
|
|
45
59
|
oracleSource: OracleSource.QUOTE_ASSET,
|
|
46
60
|
mint: new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'),
|
|
61
|
+
precision: BANK_BALANCE_PRECISION,
|
|
62
|
+
precisionExp: BANK_BALANCE_PRECISION_EXP,
|
|
47
63
|
},
|
|
48
64
|
];
|
|
49
65
|
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Markets = exports.MainnetMarkets = exports.DevnetMarkets = void 0;
|
|
4
|
+
const __1 = require("../");
|
|
5
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
6
|
+
exports.DevnetMarkets = [
|
|
7
|
+
{
|
|
8
|
+
fullName: 'Solana',
|
|
9
|
+
category: ['L1', 'Infra'],
|
|
10
|
+
symbol: 'SOL-PERP',
|
|
11
|
+
baseAssetSymbol: 'SOL',
|
|
12
|
+
marketIndex: new __1.BN(0),
|
|
13
|
+
oracle: new web3_js_1.PublicKey('J83w4HKfqxwcq3BEMMkPFSppX3gqekLyLJBexebFVkix'),
|
|
14
|
+
launchTs: 1655751353000,
|
|
15
|
+
oracleSource: __1.OracleSource.PYTH,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
fullName: 'Bitcoin',
|
|
19
|
+
category: ['L1', 'Payment'],
|
|
20
|
+
symbol: 'BTC-PERP',
|
|
21
|
+
baseAssetSymbol: 'BTC',
|
|
22
|
+
marketIndex: new __1.BN(1),
|
|
23
|
+
oracle: new web3_js_1.PublicKey('HovQMDrbAgAYPCmHVSrezcSmkMtXSSUsLDFANExrZh2J'),
|
|
24
|
+
launchTs: 1655751353000,
|
|
25
|
+
oracleSource: __1.OracleSource.PYTH,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
fullName: 'Ethereum',
|
|
29
|
+
category: ['L1', 'Infra'],
|
|
30
|
+
symbol: 'ETH-PERP',
|
|
31
|
+
baseAssetSymbol: 'ETH',
|
|
32
|
+
marketIndex: new __1.BN(2),
|
|
33
|
+
oracle: new web3_js_1.PublicKey('EdVCmQ9FSPcVe5YySXDPCRmc8aDQLKJ9xvYBMZPie1Vw'),
|
|
34
|
+
launchTs: 1637691133472,
|
|
35
|
+
oracleSource: __1.OracleSource.PYTH,
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
exports.MainnetMarkets = [];
|
|
39
|
+
exports.Markets = {
|
|
40
|
+
devnet: exports.DevnetMarkets,
|
|
41
|
+
'mainnet-beta': [],
|
|
42
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QUOTE_ASSET_BANK_INDEX = exports.ONE_YEAR = exports.BID_ASK_SPREAD_PRECISION = exports.MARGIN_PRECISION = exports.AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO = exports.PRICE_TO_QUOTE_PRECISION = exports.PRICE_DIV_PEG = exports.AMM_TO_QUOTE_PRECISION_RATIO = exports.BASE_PRECISION_EXP = exports.BASE_PRECISION = exports.AMM_RESERVE_PRECISION = exports.PEG_PRECISION = exports.FUNDING_PAYMENT_PRECISION = exports.MARK_PRICE_PRECISION = exports.QUOTE_PRECISION = exports.LIQUIDATION_FEE_PRECISION = exports.BANK_BALANCE_PRECISION = exports.BANK_BALANCE_PRECISION_EXP = exports.BANK_WEIGHT_PRECISION = exports.BANK_RATE_PRECISION = exports.BANK_UTILIZATION_PRECISION = exports.BANK_CUMULATIVE_INTEREST_PRECISION = exports.BANK_INTEREST_PRECISION = exports.AMM_RESERVE_PRECISION_EXP = exports.PEG_PRECISION_EXP = exports.FUNDING_RATE_PRECISION_EXP = exports.MARK_PRICE_PRECISION_EXP = exports.FUNDING_PAYMENT_PRECISION_EXP = exports.QUOTE_PRECISION_EXP = exports.MAX_LEVERAGE = exports.TEN_MILLION = exports.BN_MAX = exports.TEN_THOUSAND = exports.TEN = exports.TWO = exports.ONE = exports.ZERO = void 0;
|
|
4
|
+
const __1 = require("../");
|
|
5
|
+
exports.ZERO = new __1.BN(0);
|
|
6
|
+
exports.ONE = new __1.BN(1);
|
|
7
|
+
exports.TWO = new __1.BN(2);
|
|
8
|
+
exports.TEN = new __1.BN(10);
|
|
9
|
+
exports.TEN_THOUSAND = new __1.BN(10000);
|
|
10
|
+
exports.BN_MAX = new __1.BN(Number.MAX_SAFE_INTEGER);
|
|
11
|
+
exports.TEN_MILLION = exports.TEN_THOUSAND.mul(exports.TEN_THOUSAND);
|
|
12
|
+
exports.MAX_LEVERAGE = new __1.BN(5);
|
|
13
|
+
exports.QUOTE_PRECISION_EXP = new __1.BN(6);
|
|
14
|
+
exports.FUNDING_PAYMENT_PRECISION_EXP = new __1.BN(4);
|
|
15
|
+
exports.MARK_PRICE_PRECISION_EXP = new __1.BN(10);
|
|
16
|
+
exports.FUNDING_RATE_PRECISION_EXP = exports.MARK_PRICE_PRECISION_EXP.mul(exports.FUNDING_PAYMENT_PRECISION_EXP);
|
|
17
|
+
exports.PEG_PRECISION_EXP = new __1.BN(3);
|
|
18
|
+
exports.AMM_RESERVE_PRECISION_EXP = new __1.BN(13);
|
|
19
|
+
exports.BANK_INTEREST_PRECISION = new __1.BN(1000000);
|
|
20
|
+
exports.BANK_CUMULATIVE_INTEREST_PRECISION = new __1.BN(10000000000);
|
|
21
|
+
exports.BANK_UTILIZATION_PRECISION = new __1.BN(1000000);
|
|
22
|
+
exports.BANK_RATE_PRECISION = new __1.BN(1000000);
|
|
23
|
+
exports.BANK_WEIGHT_PRECISION = new __1.BN(100);
|
|
24
|
+
exports.BANK_BALANCE_PRECISION_EXP = new __1.BN(6);
|
|
25
|
+
exports.BANK_BALANCE_PRECISION = new __1.BN(10).pow(exports.BANK_BALANCE_PRECISION_EXP);
|
|
26
|
+
exports.LIQUIDATION_FEE_PRECISION = new __1.BN(1000000);
|
|
27
|
+
exports.QUOTE_PRECISION = new __1.BN(10).pow(exports.QUOTE_PRECISION_EXP);
|
|
28
|
+
exports.MARK_PRICE_PRECISION = new __1.BN(10).pow(exports.MARK_PRICE_PRECISION_EXP);
|
|
29
|
+
exports.FUNDING_PAYMENT_PRECISION = new __1.BN(10).pow(exports.FUNDING_PAYMENT_PRECISION_EXP);
|
|
30
|
+
exports.PEG_PRECISION = new __1.BN(10).pow(exports.PEG_PRECISION_EXP);
|
|
31
|
+
exports.AMM_RESERVE_PRECISION = new __1.BN(10).pow(exports.AMM_RESERVE_PRECISION_EXP);
|
|
32
|
+
exports.BASE_PRECISION = exports.AMM_RESERVE_PRECISION;
|
|
33
|
+
exports.BASE_PRECISION_EXP = exports.AMM_RESERVE_PRECISION_EXP;
|
|
34
|
+
exports.AMM_TO_QUOTE_PRECISION_RATIO = exports.AMM_RESERVE_PRECISION.div(exports.QUOTE_PRECISION); // 10^7
|
|
35
|
+
exports.PRICE_DIV_PEG = exports.MARK_PRICE_PRECISION.div(exports.PEG_PRECISION); //10^7
|
|
36
|
+
exports.PRICE_TO_QUOTE_PRECISION = exports.MARK_PRICE_PRECISION.div(exports.QUOTE_PRECISION);
|
|
37
|
+
exports.AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO = exports.AMM_RESERVE_PRECISION.mul(exports.PEG_PRECISION).div(exports.QUOTE_PRECISION); // 10^10
|
|
38
|
+
exports.MARGIN_PRECISION = exports.TEN_THOUSAND;
|
|
39
|
+
exports.BID_ASK_SPREAD_PRECISION = new __1.BN(1000000);
|
|
40
|
+
exports.ONE_YEAR = new __1.BN(31536000);
|
|
41
|
+
exports.QUOTE_ASSET_BANK_INDEX = new __1.BN(0);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { LAMPORTS_PER_SOL } from '@solana/web3.js';
|
|
1
2
|
import { BN } from '../';
|
|
2
3
|
|
|
3
4
|
export const ZERO = new BN(0);
|
|
@@ -66,3 +67,6 @@ export const BID_ASK_SPREAD_PRECISION = new BN(1000000);
|
|
|
66
67
|
export const ONE_YEAR = new BN(31536000);
|
|
67
68
|
|
|
68
69
|
export const QUOTE_ASSET_BANK_INDEX = new BN(0);
|
|
70
|
+
|
|
71
|
+
export const LAMPORTS_PRECISION = new BN(LAMPORTS_PER_SOL);
|
|
72
|
+
export const LAMPORTS_EXP = new BN(Math.log10(LAMPORTS_PER_SOL));
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventList = void 0;
|
|
4
|
+
class Node {
|
|
5
|
+
constructor(event, next, prev) {
|
|
6
|
+
this.event = event;
|
|
7
|
+
this.next = next;
|
|
8
|
+
this.prev = prev;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
class EventList {
|
|
12
|
+
constructor(eventType, maxSize, sortFn, orderDirection) {
|
|
13
|
+
this.eventType = eventType;
|
|
14
|
+
this.maxSize = maxSize;
|
|
15
|
+
this.sortFn = sortFn;
|
|
16
|
+
this.orderDirection = orderDirection;
|
|
17
|
+
this.size = 0;
|
|
18
|
+
}
|
|
19
|
+
insert(event) {
|
|
20
|
+
this.size++;
|
|
21
|
+
const newNode = new Node(event);
|
|
22
|
+
if (this.head === undefined) {
|
|
23
|
+
this.head = this.tail = newNode;
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (this.sortFn(this.head.event, newNode.event) ===
|
|
27
|
+
(this.orderDirection === 'asc' ? 'less than' : 'greater than')) {
|
|
28
|
+
this.head.prev = newNode;
|
|
29
|
+
newNode.next = this.head;
|
|
30
|
+
this.head = newNode;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
let currentNode = this.head;
|
|
34
|
+
while (currentNode.next !== undefined &&
|
|
35
|
+
this.sortFn(currentNode.next.event, newNode.event) !==
|
|
36
|
+
(this.orderDirection === 'asc' ? 'less than' : 'greater than')) {
|
|
37
|
+
currentNode = currentNode.next;
|
|
38
|
+
}
|
|
39
|
+
newNode.next = currentNode.next;
|
|
40
|
+
if (currentNode.next !== undefined) {
|
|
41
|
+
newNode.next.prev = newNode;
|
|
42
|
+
}
|
|
43
|
+
currentNode.next = newNode;
|
|
44
|
+
newNode.prev = currentNode;
|
|
45
|
+
}
|
|
46
|
+
if (this.size > this.maxSize) {
|
|
47
|
+
this.detach();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
detach() {
|
|
51
|
+
const node = this.tail;
|
|
52
|
+
if (node.prev !== undefined) {
|
|
53
|
+
node.prev.next = node.next;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
this.head = node.next;
|
|
57
|
+
}
|
|
58
|
+
if (node.next !== undefined) {
|
|
59
|
+
node.next.prev = node.prev;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
this.tail = node.prev;
|
|
63
|
+
}
|
|
64
|
+
this.size--;
|
|
65
|
+
}
|
|
66
|
+
toArray() {
|
|
67
|
+
return Array.from(this);
|
|
68
|
+
}
|
|
69
|
+
*[Symbol.iterator]() {
|
|
70
|
+
let node = this.head;
|
|
71
|
+
while (node) {
|
|
72
|
+
yield node.event;
|
|
73
|
+
node = node.next;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.EventList = EventList;
|
package/src/events/sort.ts
CHANGED
|
@@ -6,8 +6,8 @@ import {
|
|
|
6
6
|
SortFn,
|
|
7
7
|
Event,
|
|
8
8
|
} from './types';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { OrderActionRecord } from '../types';
|
|
10
|
+
import { ZERO } from '../index';
|
|
11
11
|
|
|
12
12
|
function clientSortAscFn(): 'less than' {
|
|
13
13
|
return 'less than';
|
|
@@ -24,21 +24,17 @@ function defaultBlockchainSortFn(
|
|
|
24
24
|
return currentEvent.slot <= newEvent.slot ? 'less than' : 'greater than';
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
function
|
|
28
|
-
currentEvent: Event<
|
|
29
|
-
newEvent: Event<
|
|
27
|
+
function orderActionRecordSortFn(
|
|
28
|
+
currentEvent: Event<OrderActionRecord>,
|
|
29
|
+
newEvent: Event<OrderActionRecord>
|
|
30
30
|
): 'less than' | 'greater than' {
|
|
31
|
-
const currentEventMarketIndex =
|
|
32
|
-
|
|
33
|
-
: currentEvent.takerOrder.marketIndex;
|
|
34
|
-
const newEventMarketIndex = !newEvent.maker.equals(PublicKey.default)
|
|
35
|
-
? newEvent.makerOrder.marketIndex
|
|
36
|
-
: newEvent.takerOrder.marketIndex;
|
|
31
|
+
const currentEventMarketIndex = currentEvent.marketIndex;
|
|
32
|
+
const newEventMarketIndex = newEvent.marketIndex;
|
|
37
33
|
if (!currentEventMarketIndex.eq(newEventMarketIndex)) {
|
|
38
34
|
return currentEvent.ts.lte(newEvent.ts) ? 'less than' : 'greater than';
|
|
39
35
|
}
|
|
40
36
|
|
|
41
|
-
if (currentEvent.fillRecordId
|
|
37
|
+
if (currentEvent.fillRecordId?.gt(ZERO) && newEvent.fillRecordId?.gt(ZERO)) {
|
|
42
38
|
return currentEvent.fillRecordId.lte(newEvent.fillRecordId)
|
|
43
39
|
? 'less than'
|
|
44
40
|
: 'greater than';
|
|
@@ -57,8 +53,8 @@ export function getSortFn(
|
|
|
57
53
|
}
|
|
58
54
|
|
|
59
55
|
switch (eventType) {
|
|
60
|
-
case '
|
|
61
|
-
return
|
|
56
|
+
case 'OrderActionRecord':
|
|
57
|
+
return orderActionRecordSortFn;
|
|
62
58
|
default:
|
|
63
59
|
return defaultBlockchainSortFn;
|
|
64
60
|
}
|