@velocity-exchange/sdk 0.4.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/lib/browser/adminClient.d.ts +52 -0
- package/lib/browser/adminClient.js +97 -0
- package/lib/browser/config.js +6 -7
- package/lib/browser/constants/numericConstants.d.ts +1 -1
- package/lib/browser/constants/numericConstants.js +1 -1
- package/lib/browser/decode/user.js +5 -1
- package/lib/browser/idl/velocity.d.ts +191 -15
- package/lib/browser/idl/velocity.json +192 -16
- package/lib/browser/orderSubscriber/OrderSubscriber.d.ts +1 -0
- package/lib/browser/orderSubscriber/OrderSubscriber.js +10 -4
- package/lib/browser/pyth/pythLazerSubscriber.js +37 -27
- package/lib/browser/types.d.ts +6 -0
- package/lib/browser/user.d.ts +20 -3
- package/lib/browser/user.js +52 -4
- package/lib/browser/velocityClient.d.ts +46 -10
- package/lib/browser/velocityClient.js +107 -35
- package/lib/node/adminClient.d.ts +52 -0
- package/lib/node/adminClient.d.ts.map +1 -1
- package/lib/node/adminClient.js +97 -0
- package/lib/node/config.d.ts.map +1 -1
- package/lib/node/config.js +6 -7
- package/lib/node/constants/numericConstants.d.ts +1 -1
- package/lib/node/constants/numericConstants.d.ts.map +1 -1
- package/lib/node/constants/numericConstants.js +1 -1
- package/lib/node/decode/user.d.ts.map +1 -1
- package/lib/node/decode/user.js +5 -1
- package/lib/node/idl/velocity.d.ts +191 -15
- package/lib/node/idl/velocity.d.ts.map +1 -1
- package/lib/node/idl/velocity.json +192 -16
- package/lib/node/orderSubscriber/OrderSubscriber.d.ts +1 -0
- package/lib/node/orderSubscriber/OrderSubscriber.d.ts.map +1 -1
- package/lib/node/orderSubscriber/OrderSubscriber.js +10 -4
- package/lib/node/pyth/pythLazerSubscriber.d.ts.map +1 -1
- package/lib/node/pyth/pythLazerSubscriber.js +37 -27
- package/lib/node/types.d.ts +6 -0
- package/lib/node/types.d.ts.map +1 -1
- package/lib/node/user.d.ts +20 -3
- package/lib/node/user.d.ts.map +1 -1
- package/lib/node/user.js +52 -4
- package/lib/node/velocityClient.d.ts +46 -10
- package/lib/node/velocityClient.d.ts.map +1 -1
- package/lib/node/velocityClient.js +107 -35
- package/package.json +7 -3
- package/.prettierignore +0 -1
- package/CHANGELOG.md +0 -132
- package/build-browser.js +0 -58
- package/bunfig.toml +0 -3
- package/esbuild-shims.js +0 -12
- package/scripts/deposit-isolated-positions.ts +0 -110
- package/scripts/find-flagged-users.ts +0 -213
- package/scripts/grpc-client-test-comparison.ts +0 -372
- package/scripts/grpc-multiuser-client-test-comparison.ts +0 -158
- package/scripts/postbuild.js +0 -95
- package/scripts/single-grpc-client-test.ts +0 -284
- package/scripts/withdraw-isolated-positions.ts +0 -174
- package/src/accounts/README_WebSocketAccountSubscriberV2.md +0 -95
- package/src/accounts/README_WebSocketProgramAccountSubscriberV2.md +0 -135
- package/src/accounts/basicUserAccountSubscriber.ts +0 -79
- package/src/accounts/basicUserStatsAccountSubscriber.ts +0 -87
- package/src/accounts/bulkAccountLoader.ts +0 -358
- package/src/accounts/bulkUserStatsSubscription.ts +0 -40
- package/src/accounts/bulkUserSubscription.ts +0 -39
- package/src/accounts/customizedCadenceBulkAccountLoader.ts +0 -250
- package/src/accounts/fetch.ts +0 -200
- package/src/accounts/grpcAccountSubscriber.ts +0 -225
- package/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts +0 -73
- package/src/accounts/grpcMultiAccountSubscriber.ts +0 -566
- package/src/accounts/grpcMultiUserAccountSubscriber.ts +0 -328
- package/src/accounts/grpcProgramAccountSubscriber.ts +0 -264
- package/src/accounts/grpcUserAccountSubscriber.ts +0 -63
- package/src/accounts/grpcUserStatsAccountSubscriber.ts +0 -65
- package/src/accounts/grpcVelocityClientAccountSubscriber.ts +0 -257
- package/src/accounts/grpcVelocityClientAccountSubscriberV2.ts +0 -941
- package/src/accounts/laserProgramAccountSubscriber.ts +0 -266
- package/src/accounts/oneShotUserAccountSubscriber.ts +0 -88
- package/src/accounts/oneShotUserStatsAccountSubscriber.ts +0 -94
- package/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +0 -223
- package/src/accounts/pollingOracleAccountSubscriber.ts +0 -151
- package/src/accounts/pollingTokenAccountSubscriber.ts +0 -147
- package/src/accounts/pollingUserAccountSubscriber.ts +0 -198
- package/src/accounts/pollingUserStatsAccountSubscriber.ts +0 -180
- package/src/accounts/pollingVelocityClientAccountSubscriber.ts +0 -774
- package/src/accounts/testBulkAccountLoader.ts +0 -59
- package/src/accounts/types.ts +0 -428
- package/src/accounts/utils.ts +0 -90
- package/src/accounts/webSocketAccountSubscriber.ts +0 -304
- package/src/accounts/webSocketAccountSubscriberV2.ts +0 -536
- package/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts +0 -171
- package/src/accounts/webSocketProgramAccountSubscriber.ts +0 -244
- package/src/accounts/webSocketProgramAccountSubscriberV2.ts +0 -1048
- package/src/accounts/webSocketProgramAccountsSubscriberV2.ts +0 -1042
- package/src/accounts/webSocketUserAccountSubscriber.ts +0 -139
- package/src/accounts/webSocketUserStatsAccountSubsriber.ts +0 -131
- package/src/accounts/webSocketVelocityClientAccountSubscriber.ts +0 -865
- package/src/accounts/webSocketVelocityClientAccountSubscriberV2.ts +0 -897
- package/src/accounts/websocketProgramUserAccountSubscriber.ts +0 -127
- package/src/addresses/marketAddresses.ts +0 -28
- package/src/addresses/pda.ts +0 -620
- package/src/adminClient.ts +0 -8136
- package/src/assert/assert.ts +0 -5
- package/src/auctionSubscriber/auctionSubscriber.ts +0 -86
- package/src/auctionSubscriber/auctionSubscriberGrpc.ts +0 -99
- package/src/auctionSubscriber/index.ts +0 -9
- package/src/auctionSubscriber/types.ts +0 -30
- package/src/bankrun/bankrunConnection.ts +0 -630
- package/src/blockhashSubscriber/BlockhashSubscriber.ts +0 -160
- package/src/blockhashSubscriber/index.ts +0 -6
- package/src/blockhashSubscriber/types.ts +0 -13
- package/src/clock/clockSubscriber.ts +0 -146
- package/src/config.ts +0 -312
- package/src/constants/index.ts +0 -9
- package/src/constants/numericConstants.ts +0 -194
- package/src/constants/perpMarkets.ts +0 -127
- package/src/constants/spotMarkets.ts +0 -104
- package/src/constants/txConstants.ts +0 -2
- package/src/constituentMap/constituentMap.ts +0 -305
- package/src/constituentMap/pollingConstituentAccountSubscriber.ts +0 -99
- package/src/constituentMap/webSocketConstituentAccountSubscriber.ts +0 -121
- package/src/core/VelocityCore.ts +0 -606
- package/src/core/index.ts +0 -12
- package/src/core/instructions/deposit.ts +0 -64
- package/src/core/instructions/fill.ts +0 -51
- package/src/core/instructions/funding.ts +0 -33
- package/src/core/instructions/liquidation.ts +0 -55
- package/src/core/instructions/orders.ts +0 -84
- package/src/core/instructions/perpOrders.ts +0 -312
- package/src/core/instructions/settlement.ts +0 -40
- package/src/core/instructions/trigger.ts +0 -41
- package/src/core/instructions/withdraw.ts +0 -65
- package/src/core/remainingAccounts.ts +0 -320
- package/src/core/signedMsg.ts +0 -109
- package/src/decode/customCoder.ts +0 -148
- package/src/decode/user.ts +0 -401
- package/src/dlob/DLOB.ts +0 -2793
- package/src/dlob/DLOBNode.ts +0 -305
- package/src/dlob/DLOBSubscriber.ts +0 -269
- package/src/dlob/NodeList.ts +0 -244
- package/src/dlob/orderBookLevels.ts +0 -695
- package/src/dlob/types.ts +0 -37
- package/src/events/eventList.ts +0 -114
- package/src/events/eventSubscriber.ts +0 -521
- package/src/events/eventsServerLogProvider.ts +0 -189
- package/src/events/fetchLogs.ts +0 -219
- package/src/events/parse.ts +0 -271
- package/src/events/pollingLogProvider.ts +0 -113
- package/src/events/sort.ts +0 -51
- package/src/events/txEventCache.ts +0 -92
- package/src/events/types.ts +0 -337
- package/src/events/webSocketLogProvider.ts +0 -152
- package/src/factory/bigNum.ts +0 -709
- package/src/factory/oracleClient.ts +0 -73
- package/src/idl/pyth.json +0 -142
- package/src/idl/pyth.ts +0 -97
- package/src/idl/pyth_solana_receiver.json +0 -628
- package/src/idl/token_faucet.json +0 -229
- package/src/idl/token_faucet.ts +0 -197
- package/src/idl/velocity.json +0 -23974
- package/src/idl/velocity.ts +0 -23980
- package/src/index.ts +0 -150
- package/src/indicative-quotes/indicativeQuotesSender.ts +0 -233
- package/src/isomorphic/README.md +0 -19
- package/src/isomorphic/anchor.browser.ts +0 -44
- package/src/isomorphic/anchor.node.ts +0 -1
- package/src/isomorphic/anchor.ts +0 -1
- package/src/isomorphic/anchor29.browser.ts +0 -24
- package/src/isomorphic/anchor29.node.ts +0 -1
- package/src/isomorphic/anchor29.ts +0 -1
- package/src/isomorphic/grpc.browser.ts +0 -4
- package/src/isomorphic/grpc.node.ts +0 -130
- package/src/isomorphic/grpc.ts +0 -1
- package/src/jupiter/jupiterClient.ts +0 -502
- package/src/keypair.ts +0 -32
- package/src/margin/README.md +0 -138
- package/src/marginCalculation.ts +0 -407
- package/src/marinade/idl/idl.json +0 -1962
- package/src/marinade/index.ts +0 -73
- package/src/marinade/types.ts +0 -3925
- package/src/math/amm.ts +0 -1758
- package/src/math/auction.ts +0 -480
- package/src/math/bankruptcy.ts +0 -138
- package/src/math/builder.ts +0 -130
- package/src/math/conversion.ts +0 -45
- package/src/math/exchangeStatus.ts +0 -261
- package/src/math/funding.ts +0 -498
- package/src/math/insurance.ts +0 -171
- package/src/math/liquidation.ts +0 -433
- package/src/math/margin.ts +0 -327
- package/src/math/market.ts +0 -487
- package/src/math/oracles.ts +0 -477
- package/src/math/orders.ts +0 -500
- package/src/math/position.ts +0 -381
- package/src/math/repeg.ts +0 -223
- package/src/math/spotBalance.ts +0 -996
- package/src/math/spotMarket.ts +0 -115
- package/src/math/spotPosition.ts +0 -263
- package/src/math/state.ts +0 -71
- package/src/math/superStake.ts +0 -602
- package/src/math/tiers.ts +0 -73
- package/src/math/trade.ts +0 -879
- package/src/math/utils.ts +0 -183
- package/src/memcmp.ts +0 -279
- package/src/oracles/oracleClientCache.ts +0 -41
- package/src/oracles/oracleId.ts +0 -99
- package/src/oracles/prelaunchOracleClient.ts +0 -63
- package/src/oracles/pythClient.ts +0 -125
- package/src/oracles/pythLazerClient.ts +0 -141
- package/src/oracles/quoteAssetOracleClient.ts +0 -43
- package/src/oracles/strictOraclePrice.ts +0 -40
- package/src/oracles/types.ts +0 -82
- package/src/oracles/utils.ts +0 -45
- package/src/orderParams.ts +0 -117
- package/src/orderSubscriber/OrderSubscriber.ts +0 -378
- package/src/orderSubscriber/PollingSubscription.ts +0 -50
- package/src/orderSubscriber/WebsocketSubscription.ts +0 -137
- package/src/orderSubscriber/grpcSubscription.ts +0 -155
- package/src/orderSubscriber/index.ts +0 -7
- package/src/orderSubscriber/types.ts +0 -64
- package/src/priorityFee/averageOverSlotsStrategy.ts +0 -17
- package/src/priorityFee/averageStrategy.ts +0 -13
- package/src/priorityFee/ewmaStrategy.ts +0 -51
- package/src/priorityFee/heliusPriorityFeeMethod.ts +0 -68
- package/src/priorityFee/index.ts +0 -16
- package/src/priorityFee/maxOverSlotsStrategy.ts +0 -18
- package/src/priorityFee/maxStrategy.ts +0 -8
- package/src/priorityFee/priorityFeeSubscriber.ts +0 -328
- package/src/priorityFee/priorityFeeSubscriberMap.ts +0 -134
- package/src/priorityFee/solanaPriorityFeeMethod.ts +0 -46
- package/src/priorityFee/types.ts +0 -82
- package/src/priorityFee/velocityPriorityFeeMethod.ts +0 -53
- package/src/pyth/constants.ts +0 -9
- package/src/pyth/index.ts +0 -15
- package/src/pyth/pythLazerSubscriber.ts +0 -365
- package/src/pyth/types.ts +0 -4451
- package/src/pyth/utils.ts +0 -13
- package/src/slot/SlotSubscriber.ts +0 -126
- package/src/slot/SlothashSubscriber.ts +0 -163
- package/src/swap/UnifiedSwapClient.ts +0 -315
- package/src/swift/grpcSignedMsgUserAccountSubscriber.ts +0 -81
- package/src/swift/index.ts +0 -10
- package/src/swift/signedMsgUserAccountSubscriber.ts +0 -251
- package/src/swift/swiftOrderSubscriber.ts +0 -351
- package/src/testClient.ts +0 -42
- package/src/titan/titanClient.ts +0 -438
- package/src/token/index.ts +0 -13
- package/src/tokenFaucet.ts +0 -296
- package/src/tx/baseTxSender.ts +0 -651
- package/src/tx/blockhashFetcher/baseBlockhashFetcher.ts +0 -31
- package/src/tx/blockhashFetcher/cachedBlockhashFetcher.ts +0 -105
- package/src/tx/blockhashFetcher/types.ts +0 -9
- package/src/tx/fastSingleTxSender.ts +0 -200
- package/src/tx/forwardOnlyTxSender.ts +0 -193
- package/src/tx/priorityFeeCalculator.ts +0 -117
- package/src/tx/reportTransactionError.ts +0 -176
- package/src/tx/retryTxSender.ts +0 -177
- package/src/tx/txHandler.ts +0 -1009
- package/src/tx/txParamProcessor.ts +0 -225
- package/src/tx/types.ts +0 -117
- package/src/tx/utils.ts +0 -133
- package/src/tx/whileValidTxSender.ts +0 -377
- package/src/types.ts +0 -2575
- package/src/user.ts +0 -5316
- package/src/userConfig.ts +0 -38
- package/src/userMap/PollingSubscription.ts +0 -61
- package/src/userMap/WebsocketSubscription.ts +0 -93
- package/src/userMap/grpcSubscription.ts +0 -93
- package/src/userMap/referrerMap.ts +0 -360
- package/src/userMap/revenueShareEscrowMap.ts +0 -342
- package/src/userMap/userMap.ts +0 -784
- package/src/userMap/userMapConfig.ts +0 -82
- package/src/userMap/userStatsMap.ts +0 -393
- package/src/userName.ts +0 -37
- package/src/userStats.ts +0 -159
- package/src/userStatsConfig.ts +0 -35
- package/src/util/TransactionConfirmationManager.ts +0 -333
- package/src/util/chainClock.ts +0 -65
- package/src/util/computeUnits.ts +0 -101
- package/src/util/digest.ts +0 -33
- package/src/util/ed25519Utils.ts +0 -95
- package/src/util/promiseTimeout.ts +0 -23
- package/src/velocityClient.ts +0 -14802
- package/src/velocityClientConfig.ts +0 -119
- package/src/wallet.ts +0 -91
- package/tests/VelocityCore/builder_escrow.test.ts +0 -121
- package/tests/VelocityCore/decode.test.ts +0 -16
- package/tests/VelocityCore/fill_trigger.test.ts +0 -73
- package/tests/VelocityCore/instructions.test.ts +0 -46
- package/tests/VelocityCore/pdas.test.ts +0 -30
- package/tests/VelocityCore/perp_orders.test.ts +0 -205
- package/tests/VelocityCore/remainingAccounts.test.ts +0 -72
- package/tests/VelocityCore/settlement_liquidation.test.ts +0 -69
- package/tests/accounts/customizedCadenceBulkAccountLoader.test.ts +0 -211
- package/tests/amm/test.ts +0 -2402
- package/tests/auctions/test.ts +0 -81
- package/tests/bn/test.ts +0 -355
- package/tests/builder/builderFee.test.ts +0 -42
- package/tests/ci/verifyConstants.ts +0 -393
- package/tests/decode/test.ts +0 -262
- package/tests/decode/userAccountBufferStrings.ts +0 -102
- package/tests/dlob/helpers.ts +0 -748
- package/tests/dlob/test.ts +0 -6969
- package/tests/dlob/tickSizeStandardization.ts +0 -545
- package/tests/events/parseLogsForCuUsage.ts +0 -139
- package/tests/exchangeStatus/test.ts +0 -45
- package/tests/insurance/test.ts +0 -40
- package/tests/liquidation/test.ts +0 -125
- package/tests/oracles/mmOracleGate.test.ts +0 -379
- package/tests/oracles/pythPegSnap.test.ts +0 -76
- package/tests/sdkParity/enumParity.test.ts +0 -84
- package/tests/sdkParity/marginCategoryFill.test.ts +0 -143
- package/tests/sdkParity/memcmpOffsets.test.ts +0 -139
- package/tests/spot/test.ts +0 -281
- package/tests/tx/TransactionConfirmationManager.test.ts +0 -312
- package/tests/tx/cachedBlockhashFetcher.test.ts +0 -96
- package/tests/tx/priorityFeeCalculator.ts +0 -77
- package/tests/tx/priorityFeeStrategy.ts +0 -95
- package/tests/user/bankruptcy.ts +0 -165
- package/tests/user/feeAndWithdrawLimits.ts +0 -284
- package/tests/user/getMarginCalculation.ts +0 -586
- package/tests/user/helpers.ts +0 -184
- package/tests/user/liquidations.ts +0 -129
- package/tests/user/marginCalculations.test.ts +0 -321
- package/tests/user/test.ts +0 -833
- package/tsconfig.browser.json +0 -18
- package/tsconfig.json +0 -36
|
@@ -1,502 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AddressLookupTableAccount,
|
|
3
|
-
Connection,
|
|
4
|
-
PublicKey,
|
|
5
|
-
TransactionInstruction,
|
|
6
|
-
TransactionMessage,
|
|
7
|
-
VersionedTransaction,
|
|
8
|
-
} from '@solana/web3.js';
|
|
9
|
-
import fetch, { RequestInit } from 'node-fetch';
|
|
10
|
-
import { BN } from '../isomorphic/anchor';
|
|
11
|
-
import { SwapMode } from '../swap/UnifiedSwapClient';
|
|
12
|
-
|
|
13
|
-
export interface MarketInfo {
|
|
14
|
-
id: string;
|
|
15
|
-
inAmount: number;
|
|
16
|
-
inputMint: string;
|
|
17
|
-
label: string;
|
|
18
|
-
lpFee: Fee;
|
|
19
|
-
notEnoughLiquidity: boolean;
|
|
20
|
-
outAmount: number;
|
|
21
|
-
outputMint: string;
|
|
22
|
-
platformFee: Fee;
|
|
23
|
-
priceImpactPct: number;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface Fee {
|
|
27
|
-
amount: number;
|
|
28
|
-
mint: string;
|
|
29
|
-
pct: number;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface Route {
|
|
33
|
-
amount: number;
|
|
34
|
-
inAmount: number;
|
|
35
|
-
marketInfos: MarketInfo[];
|
|
36
|
-
otherAmountThreshold: number;
|
|
37
|
-
outAmount: number;
|
|
38
|
-
priceImpactPct: number;
|
|
39
|
-
slippageBps: number;
|
|
40
|
-
swapMode: SwapMode;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
*
|
|
45
|
-
* @export
|
|
46
|
-
* @interface RoutePlanStep
|
|
47
|
-
*/
|
|
48
|
-
export interface RoutePlanStep {
|
|
49
|
-
/**
|
|
50
|
-
*
|
|
51
|
-
* @type {SwapInfo}
|
|
52
|
-
* @memberof RoutePlanStep
|
|
53
|
-
*/
|
|
54
|
-
swapInfo: SwapInfo;
|
|
55
|
-
/**
|
|
56
|
-
*
|
|
57
|
-
* @type {number}
|
|
58
|
-
* @memberof RoutePlanStep
|
|
59
|
-
*/
|
|
60
|
-
percent: number;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export interface SwapInfo {
|
|
64
|
-
/**
|
|
65
|
-
*
|
|
66
|
-
* @type {string}
|
|
67
|
-
* @memberof SwapInfo
|
|
68
|
-
*/
|
|
69
|
-
ammKey: string;
|
|
70
|
-
/**
|
|
71
|
-
*
|
|
72
|
-
* @type {string}
|
|
73
|
-
* @memberof SwapInfo
|
|
74
|
-
*/
|
|
75
|
-
label?: string;
|
|
76
|
-
/**
|
|
77
|
-
*
|
|
78
|
-
* @type {string}
|
|
79
|
-
* @memberof SwapInfo
|
|
80
|
-
*/
|
|
81
|
-
inputMint: string;
|
|
82
|
-
/**
|
|
83
|
-
*
|
|
84
|
-
* @type {string}
|
|
85
|
-
* @memberof SwapInfo
|
|
86
|
-
*/
|
|
87
|
-
outputMint: string;
|
|
88
|
-
/**
|
|
89
|
-
*
|
|
90
|
-
* @type {string}
|
|
91
|
-
* @memberof SwapInfo
|
|
92
|
-
*/
|
|
93
|
-
inAmount: string;
|
|
94
|
-
/**
|
|
95
|
-
*
|
|
96
|
-
* @type {string}
|
|
97
|
-
* @memberof SwapInfo
|
|
98
|
-
*/
|
|
99
|
-
outAmount: string;
|
|
100
|
-
/**
|
|
101
|
-
*
|
|
102
|
-
* @type {string}
|
|
103
|
-
* @memberof SwapInfo
|
|
104
|
-
*/
|
|
105
|
-
feeAmount: string;
|
|
106
|
-
/**
|
|
107
|
-
*
|
|
108
|
-
* @type {string}
|
|
109
|
-
* @memberof SwapInfo
|
|
110
|
-
*/
|
|
111
|
-
feeMint: string;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
*
|
|
116
|
-
* @export
|
|
117
|
-
* @interface PlatformFee
|
|
118
|
-
*/
|
|
119
|
-
export interface PlatformFee {
|
|
120
|
-
/**
|
|
121
|
-
*
|
|
122
|
-
* @type {string}
|
|
123
|
-
* @memberof PlatformFee
|
|
124
|
-
*/
|
|
125
|
-
amount?: string;
|
|
126
|
-
/**
|
|
127
|
-
*
|
|
128
|
-
* @type {number}
|
|
129
|
-
* @memberof PlatformFee
|
|
130
|
-
*/
|
|
131
|
-
feeBps?: number;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
*
|
|
136
|
-
* @export
|
|
137
|
-
* @interface QuoteResponse
|
|
138
|
-
*/
|
|
139
|
-
export interface QuoteResponse {
|
|
140
|
-
/**
|
|
141
|
-
*
|
|
142
|
-
* @type {string}
|
|
143
|
-
* @memberof QuoteResponse
|
|
144
|
-
*/
|
|
145
|
-
inputMint: string;
|
|
146
|
-
/**
|
|
147
|
-
*
|
|
148
|
-
* @type {string}
|
|
149
|
-
* @memberof QuoteResponse
|
|
150
|
-
*/
|
|
151
|
-
inAmount: string;
|
|
152
|
-
/**
|
|
153
|
-
*
|
|
154
|
-
* @type {string}
|
|
155
|
-
* @memberof QuoteResponse
|
|
156
|
-
*/
|
|
157
|
-
outputMint: string;
|
|
158
|
-
/**
|
|
159
|
-
*
|
|
160
|
-
* @type {string}
|
|
161
|
-
* @memberof QuoteResponse
|
|
162
|
-
*/
|
|
163
|
-
outAmount: string;
|
|
164
|
-
/**
|
|
165
|
-
*
|
|
166
|
-
* @type {string}
|
|
167
|
-
* @memberof QuoteResponse
|
|
168
|
-
*/
|
|
169
|
-
otherAmountThreshold: string;
|
|
170
|
-
/**
|
|
171
|
-
*
|
|
172
|
-
* @type {SwapMode}
|
|
173
|
-
* @memberof QuoteResponse
|
|
174
|
-
*/
|
|
175
|
-
swapMode: SwapMode;
|
|
176
|
-
/**
|
|
177
|
-
*
|
|
178
|
-
* @type {number}
|
|
179
|
-
* @memberof QuoteResponse
|
|
180
|
-
*/
|
|
181
|
-
slippageBps: number;
|
|
182
|
-
/**
|
|
183
|
-
*
|
|
184
|
-
* @type {PlatformFee}
|
|
185
|
-
* @memberof QuoteResponse
|
|
186
|
-
*/
|
|
187
|
-
platformFee?: PlatformFee;
|
|
188
|
-
/**
|
|
189
|
-
*
|
|
190
|
-
* @type {string}
|
|
191
|
-
* @memberof QuoteResponse
|
|
192
|
-
*/
|
|
193
|
-
priceImpactPct: string;
|
|
194
|
-
/**
|
|
195
|
-
*
|
|
196
|
-
* @type {Array<RoutePlanStep>}
|
|
197
|
-
* @memberof QuoteResponse
|
|
198
|
-
*/
|
|
199
|
-
routePlan: Array<RoutePlanStep>;
|
|
200
|
-
/**
|
|
201
|
-
*
|
|
202
|
-
* @type {number}
|
|
203
|
-
* @memberof QuoteResponse
|
|
204
|
-
*/
|
|
205
|
-
contextSlot?: number;
|
|
206
|
-
/**
|
|
207
|
-
*
|
|
208
|
-
* @type {number}
|
|
209
|
-
* @memberof QuoteResponse
|
|
210
|
-
*/
|
|
211
|
-
timeTaken?: number;
|
|
212
|
-
/**
|
|
213
|
-
*
|
|
214
|
-
* @type {string}
|
|
215
|
-
* @memberof QuoteResponse
|
|
216
|
-
*/
|
|
217
|
-
error?: string;
|
|
218
|
-
/**
|
|
219
|
-
*
|
|
220
|
-
* @type {string}
|
|
221
|
-
* @memberof QuoteResponse
|
|
222
|
-
*/
|
|
223
|
-
errorCode?: string;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
export const RECOMMENDED_JUPITER_API_VERSION = '/v1';
|
|
227
|
-
/** @deprecated Use RECOMMENDED_JUPITER_API instead. lite-api.jup.ag requires migration to api.jup.ag with API key. */
|
|
228
|
-
export const LEGACY_JUPITER_API = 'https://lite-api.jup.ag/swap';
|
|
229
|
-
export const RECOMMENDED_JUPITER_API = 'https://api.jup.ag/swap';
|
|
230
|
-
|
|
231
|
-
export class JupiterClient {
|
|
232
|
-
url: string;
|
|
233
|
-
connection: Connection;
|
|
234
|
-
lookupTableCahce = new Map<string, AddressLookupTableAccount>();
|
|
235
|
-
private apiKey?: string;
|
|
236
|
-
|
|
237
|
-
/**
|
|
238
|
-
* Create a Jupiter client
|
|
239
|
-
* @param connection - Solana connection
|
|
240
|
-
* @param url - Optional custom API URL. Defaults to https://api.jup.ag/swap
|
|
241
|
-
* @param apiKey - API key for Jupiter API. Required for api.jup.ag (free tier available at https://portal.jup.ag)
|
|
242
|
-
*/
|
|
243
|
-
constructor({
|
|
244
|
-
connection,
|
|
245
|
-
url,
|
|
246
|
-
apiKey,
|
|
247
|
-
}: {
|
|
248
|
-
connection: Connection;
|
|
249
|
-
url?: string;
|
|
250
|
-
apiKey?: string;
|
|
251
|
-
}) {
|
|
252
|
-
this.connection = connection;
|
|
253
|
-
this.url = url ?? RECOMMENDED_JUPITER_API;
|
|
254
|
-
this.apiKey = apiKey;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Get the headers for API requests, including API key if configured
|
|
259
|
-
*/
|
|
260
|
-
private getHeaders(contentType?: string): Record<string, string> {
|
|
261
|
-
const headers: Record<string, string> = {};
|
|
262
|
-
if (contentType) {
|
|
263
|
-
headers['Content-Type'] = contentType;
|
|
264
|
-
}
|
|
265
|
-
if (this.apiKey) {
|
|
266
|
-
headers['x-api-key'] = this.apiKey;
|
|
267
|
-
}
|
|
268
|
-
return headers;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* Get routes for a swap
|
|
273
|
-
* @param inputMint the mint of the input token
|
|
274
|
-
* @param outputMint the mint of the output token
|
|
275
|
-
* @param amount the amount of the input token
|
|
276
|
-
* @param slippageBps the slippage tolerance in basis points
|
|
277
|
-
* @param swapMode the swap mode (ExactIn or ExactOut)
|
|
278
|
-
* @param onlyDirectRoutes whether to only return direct routes
|
|
279
|
-
*/
|
|
280
|
-
public async getQuote({
|
|
281
|
-
inputMint,
|
|
282
|
-
outputMint,
|
|
283
|
-
amount,
|
|
284
|
-
maxAccounts = 50, // 50 is an estimated amount with buffer
|
|
285
|
-
slippageBps = 50,
|
|
286
|
-
swapMode = 'ExactIn',
|
|
287
|
-
onlyDirectRoutes = false,
|
|
288
|
-
excludeDexes,
|
|
289
|
-
autoSlippage = false,
|
|
290
|
-
maxAutoSlippageBps,
|
|
291
|
-
usdEstimate,
|
|
292
|
-
}: {
|
|
293
|
-
inputMint: PublicKey;
|
|
294
|
-
outputMint: PublicKey;
|
|
295
|
-
amount: BN;
|
|
296
|
-
maxAccounts?: number;
|
|
297
|
-
slippageBps?: number;
|
|
298
|
-
swapMode?: SwapMode;
|
|
299
|
-
onlyDirectRoutes?: boolean;
|
|
300
|
-
excludeDexes?: string[];
|
|
301
|
-
autoSlippage?: boolean;
|
|
302
|
-
maxAutoSlippageBps?: number;
|
|
303
|
-
usdEstimate?: number;
|
|
304
|
-
}): Promise<QuoteResponse> {
|
|
305
|
-
if (autoSlippage && maxAutoSlippageBps === undefined) {
|
|
306
|
-
throw new Error(
|
|
307
|
-
'JupiterClient.getQuote: maxAutoSlippageBps is required when autoSlippage is enabled'
|
|
308
|
-
);
|
|
309
|
-
}
|
|
310
|
-
if (autoSlippage && usdEstimate === undefined) {
|
|
311
|
-
throw new Error(
|
|
312
|
-
'JupiterClient.getQuote: usdEstimate is required when autoSlippage is enabled'
|
|
313
|
-
);
|
|
314
|
-
}
|
|
315
|
-
const maxAutoSlippageBpsParam =
|
|
316
|
-
autoSlippage && maxAutoSlippageBps !== undefined
|
|
317
|
-
? maxAutoSlippageBps.toString()
|
|
318
|
-
: '0';
|
|
319
|
-
const autoSlippageCollisionUsdValueParam =
|
|
320
|
-
autoSlippage && usdEstimate !== undefined ? usdEstimate.toString() : '0';
|
|
321
|
-
const params = new URLSearchParams({
|
|
322
|
-
inputMint: inputMint.toString(),
|
|
323
|
-
outputMint: outputMint.toString(),
|
|
324
|
-
amount: amount.toString(),
|
|
325
|
-
slippageBps: autoSlippage ? '0' : slippageBps.toString(),
|
|
326
|
-
swapMode,
|
|
327
|
-
onlyDirectRoutes: onlyDirectRoutes.toString(),
|
|
328
|
-
maxAccounts: maxAccounts.toString(),
|
|
329
|
-
autoSlippage: autoSlippage.toString(),
|
|
330
|
-
maxAutoSlippageBps: maxAutoSlippageBpsParam,
|
|
331
|
-
autoSlippageCollisionUsdValue: autoSlippageCollisionUsdValueParam,
|
|
332
|
-
...(excludeDexes && { excludeDexes: excludeDexes.join(',') }),
|
|
333
|
-
});
|
|
334
|
-
if (swapMode === 'ExactOut') {
|
|
335
|
-
params.delete('maxAccounts');
|
|
336
|
-
}
|
|
337
|
-
const apiVersionParam =
|
|
338
|
-
this.url === RECOMMENDED_JUPITER_API || this.url === LEGACY_JUPITER_API
|
|
339
|
-
? RECOMMENDED_JUPITER_API_VERSION
|
|
340
|
-
: '';
|
|
341
|
-
const headers = this.getHeaders();
|
|
342
|
-
const fetchOptions: RequestInit =
|
|
343
|
-
Object.keys(headers).length > 0 ? { headers } : {};
|
|
344
|
-
const quote = await (
|
|
345
|
-
await fetch(
|
|
346
|
-
`${this.url}${apiVersionParam}/quote?${params.toString()}`,
|
|
347
|
-
fetchOptions
|
|
348
|
-
)
|
|
349
|
-
).json();
|
|
350
|
-
return quote as QuoteResponse;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
/**
|
|
354
|
-
* Get a swap transaction for quote
|
|
355
|
-
* @param quoteResponse quote to perform swap
|
|
356
|
-
* @param userPublicKey the signer's wallet public key
|
|
357
|
-
* @param slippageBps the slippage tolerance in basis points
|
|
358
|
-
*/
|
|
359
|
-
public async getSwap({
|
|
360
|
-
quote,
|
|
361
|
-
userPublicKey,
|
|
362
|
-
slippageBps = 50,
|
|
363
|
-
}: {
|
|
364
|
-
quote: QuoteResponse;
|
|
365
|
-
userPublicKey: PublicKey;
|
|
366
|
-
slippageBps?: number;
|
|
367
|
-
}): Promise<VersionedTransaction> {
|
|
368
|
-
if (!quote) {
|
|
369
|
-
throw new Error('Jupiter swap quote not provided. Please try again.');
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
const apiVersionParam =
|
|
373
|
-
this.url === RECOMMENDED_JUPITER_API || this.url === LEGACY_JUPITER_API
|
|
374
|
-
? RECOMMENDED_JUPITER_API_VERSION
|
|
375
|
-
: '';
|
|
376
|
-
const resp = await (
|
|
377
|
-
await fetch(`${this.url}${apiVersionParam}/swap`, {
|
|
378
|
-
method: 'POST',
|
|
379
|
-
headers: this.getHeaders('application/json'),
|
|
380
|
-
body: JSON.stringify({
|
|
381
|
-
quoteResponse: quote,
|
|
382
|
-
userPublicKey,
|
|
383
|
-
slippageBps,
|
|
384
|
-
}),
|
|
385
|
-
})
|
|
386
|
-
).json();
|
|
387
|
-
if (!('swapTransaction' in resp)) {
|
|
388
|
-
throw new Error(
|
|
389
|
-
`swapTransaction not found, error from Jupiter: ${resp.error} ${
|
|
390
|
-
', ' + (resp.message ?? '')
|
|
391
|
-
}`
|
|
392
|
-
);
|
|
393
|
-
}
|
|
394
|
-
const { swapTransaction } = resp;
|
|
395
|
-
|
|
396
|
-
try {
|
|
397
|
-
const swapTransactionBuf = Buffer.from(swapTransaction, 'base64');
|
|
398
|
-
return VersionedTransaction.deserialize(swapTransactionBuf);
|
|
399
|
-
} catch (err) {
|
|
400
|
-
throw new Error(
|
|
401
|
-
'Something went wrong with creating the Jupiter swap transaction. Please try again.'
|
|
402
|
-
);
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
/**
|
|
407
|
-
* Get the transaction message and lookup tables for a transaction
|
|
408
|
-
* @param transaction
|
|
409
|
-
*/
|
|
410
|
-
public async getTransactionMessageAndLookupTables({
|
|
411
|
-
transaction,
|
|
412
|
-
}: {
|
|
413
|
-
transaction: VersionedTransaction;
|
|
414
|
-
}): Promise<{
|
|
415
|
-
transactionMessage: TransactionMessage;
|
|
416
|
-
lookupTables: AddressLookupTableAccount[];
|
|
417
|
-
}> {
|
|
418
|
-
const message = transaction.message;
|
|
419
|
-
|
|
420
|
-
const lookupTables = (
|
|
421
|
-
await Promise.all(
|
|
422
|
-
message.addressTableLookups.map(async (lookup) => {
|
|
423
|
-
return await this.getLookupTable(lookup.accountKey);
|
|
424
|
-
})
|
|
425
|
-
)
|
|
426
|
-
).filter(
|
|
427
|
-
(lookup): lookup is AddressLookupTableAccount => lookup !== undefined
|
|
428
|
-
);
|
|
429
|
-
|
|
430
|
-
const transactionMessage = TransactionMessage.decompile(message, {
|
|
431
|
-
addressLookupTableAccounts: lookupTables,
|
|
432
|
-
});
|
|
433
|
-
return {
|
|
434
|
-
transactionMessage,
|
|
435
|
-
lookupTables,
|
|
436
|
-
};
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
async getLookupTable(
|
|
440
|
-
accountKey: PublicKey
|
|
441
|
-
): Promise<AddressLookupTableAccount | undefined> {
|
|
442
|
-
const cached = this.lookupTableCahce.get(accountKey.toString());
|
|
443
|
-
if (cached !== undefined) {
|
|
444
|
-
return cached;
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
return (
|
|
448
|
-
(await this.connection.getAddressLookupTable(accountKey)).value ??
|
|
449
|
-
undefined
|
|
450
|
-
);
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
/**
|
|
454
|
-
* Get the jupiter instructions from transaction by filtering out instructions to compute budget and associated token programs
|
|
455
|
-
* @param transactionMessage the transaction message
|
|
456
|
-
* @param inputMint the input mint
|
|
457
|
-
* @param outputMint the output mint
|
|
458
|
-
*/
|
|
459
|
-
public getJupiterInstructions({
|
|
460
|
-
transactionMessage,
|
|
461
|
-
inputMint,
|
|
462
|
-
outputMint,
|
|
463
|
-
}: {
|
|
464
|
-
transactionMessage: TransactionMessage;
|
|
465
|
-
inputMint: PublicKey;
|
|
466
|
-
outputMint: PublicKey;
|
|
467
|
-
}): TransactionInstruction[] {
|
|
468
|
-
return transactionMessage.instructions.filter((instruction) => {
|
|
469
|
-
if (
|
|
470
|
-
instruction.programId.toString() ===
|
|
471
|
-
'ComputeBudget111111111111111111111111111111'
|
|
472
|
-
) {
|
|
473
|
-
return false;
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
if (
|
|
477
|
-
instruction.programId.toString() ===
|
|
478
|
-
'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'
|
|
479
|
-
) {
|
|
480
|
-
return false;
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
if (
|
|
484
|
-
instruction.programId.toString() === '11111111111111111111111111111111'
|
|
485
|
-
) {
|
|
486
|
-
return false;
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
if (
|
|
490
|
-
instruction.programId.toString() ===
|
|
491
|
-
'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'
|
|
492
|
-
) {
|
|
493
|
-
const mint = instruction.keys[3].pubkey;
|
|
494
|
-
if (mint.equals(inputMint) || mint.equals(outputMint)) {
|
|
495
|
-
return false;
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
return true;
|
|
500
|
-
});
|
|
501
|
-
}
|
|
502
|
-
}
|
package/src/keypair.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import bs58 from 'bs58';
|
|
3
|
-
import { Keypair } from '@solana/web3.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Loads a Solana `Keypair` from a private key given in any of the common CLI/env formats.
|
|
7
|
-
* @param privateKey - One of: a filesystem path to a JSON keypair file (checked first via
|
|
8
|
-
* `fs.existsSync`); a JSON array string (e.g. `"[1,2,3,...]"`); a comma-separated list of byte
|
|
9
|
-
* values (e.g. `"1,2,3,..."`); or a base58-encoded secret key string (whitespace is stripped).
|
|
10
|
-
* @returns The decoded `Keypair`.
|
|
11
|
-
* @throws Error (from `Keypair.fromSecretKey`) if the decoded bytes are not a valid 64-byte secret key.
|
|
12
|
-
*/
|
|
13
|
-
export function loadKeypair(privateKey: string): Keypair {
|
|
14
|
-
// try to load privateKey as a filepath
|
|
15
|
-
let loadedKey: Uint8Array;
|
|
16
|
-
if (fs.existsSync(privateKey)) {
|
|
17
|
-
privateKey = fs.readFileSync(privateKey).toString();
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
if (privateKey.includes('[') && privateKey.includes(']')) {
|
|
21
|
-
loadedKey = Uint8Array.from(JSON.parse(privateKey));
|
|
22
|
-
} else if (privateKey.includes(',')) {
|
|
23
|
-
loadedKey = Uint8Array.from(
|
|
24
|
-
privateKey.split(',').map((val) => Number(val))
|
|
25
|
-
);
|
|
26
|
-
} else {
|
|
27
|
-
privateKey = privateKey.replace(/\s/g, '');
|
|
28
|
-
loadedKey = new Uint8Array(bs58.decode(privateKey));
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return Keypair.fromSecretKey(Uint8Array.from(loadedKey));
|
|
32
|
-
}
|
package/src/margin/README.md
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
## Margin Calculation Snapshot (SDK)
|
|
2
|
-
|
|
3
|
-
This document describes the single-source-of-truth margin engine in the SDK that mirrors the on-chain `MarginCalculation` and related semantics. The goal is to compute an immutable snapshot in one pass and have existing `User` getters delegate to it, eliminating duplicative work across getters and UI hooks while maintaining parity with the program.
|
|
4
|
-
|
|
5
|
-
### Alignment with on-chain
|
|
6
|
-
|
|
7
|
-
- The SDK snapshot shape mirrors `programs/velocity/src/state/margin_calculation.rs` field-for-field.
|
|
8
|
-
- The inputs and ordering mirror `calculate_margin_requirement_and_total_collateral_and_liability_info` in `programs/velocity/src/math/margin.rs`.
|
|
9
|
-
- Isolated positions are represented as `isolatedMarginCalculations` keyed by perp `marketIndex`, matching program logic.
|
|
10
|
-
|
|
11
|
-
### Core SDK types (shape parity)
|
|
12
|
-
|
|
13
|
-
```ts
|
|
14
|
-
// Types reflect on-chain names and numeric signs
|
|
15
|
-
import { MarketType } from './types';
|
|
16
|
-
|
|
17
|
-
export type MarginCategory = 'Initial' | 'Maintenance' | 'Fill';
|
|
18
|
-
|
|
19
|
-
export type MarginCalculationMode =
|
|
20
|
-
| { type: 'Standard' }
|
|
21
|
-
| { type: 'Liquidation' };
|
|
22
|
-
|
|
23
|
-
export class MarketIdentifier {
|
|
24
|
-
marketType: MarketType;
|
|
25
|
-
marketIndex: number;
|
|
26
|
-
|
|
27
|
-
static spot(marketIndex: number): MarketIdentifier;
|
|
28
|
-
static perp(marketIndex: number): MarketIdentifier;
|
|
29
|
-
equals(other: MarketIdentifier | undefined): boolean;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export class MarginContext {
|
|
33
|
-
marginType: MarginCategory;
|
|
34
|
-
mode: MarginCalculationMode;
|
|
35
|
-
strict: boolean;
|
|
36
|
-
ignoreInvalidDepositOracles: boolean;
|
|
37
|
-
isolatedMarginBuffers: Map<number, BN>;
|
|
38
|
-
crossMarginBuffer: BN;
|
|
39
|
-
|
|
40
|
-
// Factory methods
|
|
41
|
-
static standard(marginType: MarginCategory): MarginContext;
|
|
42
|
-
static liquidation(
|
|
43
|
-
crossMarginBuffer: BN,
|
|
44
|
-
isolatedMarginBuffers: Map<number, BN>
|
|
45
|
-
): MarginContext;
|
|
46
|
-
|
|
47
|
-
// Builder methods (return this for chaining)
|
|
48
|
-
strictMode(strict: boolean): this;
|
|
49
|
-
ignoreInvalidDeposits(ignore: boolean): this;
|
|
50
|
-
setCrossMarginBuffer(crossMarginBuffer: BN): this;
|
|
51
|
-
setIsolatedMarginBuffers(isolatedMarginBuffers: Map<number, BN>): this;
|
|
52
|
-
setIsolatedMarginBuffer(marketIndex: number, isolatedMarginBuffer: BN): this;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export class IsolatedMarginCalculation {
|
|
56
|
-
marginRequirement: BN; // u128
|
|
57
|
-
totalCollateral: BN; // i128 (deposit + pnl)
|
|
58
|
-
totalCollateralBuffer: BN; // i128
|
|
59
|
-
marginRequirementPlusBuffer: BN; // u128
|
|
60
|
-
|
|
61
|
-
getTotalCollateralPlusBuffer(): BN;
|
|
62
|
-
meetsMarginRequirement(): boolean;
|
|
63
|
-
meetsMarginRequirementWithBuffer(): boolean;
|
|
64
|
-
marginShortage(): BN;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export class MarginCalculation {
|
|
68
|
-
context: MarginContext;
|
|
69
|
-
|
|
70
|
-
totalCollateral: BN; // i128
|
|
71
|
-
totalCollateralBuffer: BN; // i128
|
|
72
|
-
marginRequirement: BN; // u128
|
|
73
|
-
marginRequirementPlusBuffer: BN; // u128
|
|
74
|
-
|
|
75
|
-
isolatedMarginCalculations: Map<number, IsolatedMarginCalculation>;
|
|
76
|
-
|
|
77
|
-
totalPerpLiabilityValue: BN; // u128
|
|
78
|
-
|
|
79
|
-
// Cross margin helpers
|
|
80
|
-
getCrossTotalCollateralPlusBuffer(): BN;
|
|
81
|
-
meetsCrossMarginRequirement(): boolean;
|
|
82
|
-
meetsCrossMarginRequirementWithBuffer(): boolean;
|
|
83
|
-
getCrossFreeCollateral(): BN;
|
|
84
|
-
|
|
85
|
-
// Combined (cross + isolated) helpers
|
|
86
|
-
meetsMarginRequirement(): boolean;
|
|
87
|
-
meetsMarginRequirementWithBuffer(): boolean;
|
|
88
|
-
|
|
89
|
-
// Isolated margin helpers
|
|
90
|
-
getIsolatedFreeCollateral(marketIndex: number): BN;
|
|
91
|
-
getIsolatedMarginCalculation(marketIndex: number): IsolatedMarginCalculation | undefined;
|
|
92
|
-
hasIsolatedMarginCalculation(marketIndex: number): boolean;
|
|
93
|
-
}
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
### Computation model (on-demand)
|
|
97
|
-
|
|
98
|
-
- The SDK computes the snapshot on-demand when `getMarginCalculation(...)` is called.
|
|
99
|
-
- No event-driven recomputation by default (oracle prices can change every slot; recomputing every update would be wasteful).
|
|
100
|
-
- Callers (UI/bots) decide polling frequency (e.g., UI can refresh every ~1s on active trade forms).
|
|
101
|
-
|
|
102
|
-
### User integration
|
|
103
|
-
|
|
104
|
-
`User` class provides the primary entrypoint:
|
|
105
|
-
|
|
106
|
-
```ts
|
|
107
|
-
public getMarginCalculation(
|
|
108
|
-
marginCategory: MarginCategory = 'Initial',
|
|
109
|
-
opts?: {
|
|
110
|
-
strict?: boolean; // mirror StrictOraclePrice application
|
|
111
|
-
includeOpenOrders?: boolean; // include open orders in margin calc
|
|
112
|
-
liquidationBufferMap?: Map<number | 'cross', BN>; // margin buffer for liquidation mode
|
|
113
|
-
}
|
|
114
|
-
): MarginCalculation;
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
Existing getters delegate to the snapshot to avoid duplicate work:
|
|
118
|
-
- `getTotalCollateral()` → `snapshot.totalCollateral`
|
|
119
|
-
- `getMarginRequirement(mode)` → `snapshot.marginRequirement`
|
|
120
|
-
- `getFreeCollateral()` → `snapshot.getCrossFreeCollateral()`
|
|
121
|
-
- Per-market isolated FC → `snapshot.getIsolatedFreeCollateral(marketIndex)`
|
|
122
|
-
|
|
123
|
-
### UI compatibility
|
|
124
|
-
|
|
125
|
-
- All existing `User` getters remain and delegate to the snapshot, so current UI keeps working without call-site changes.
|
|
126
|
-
- New consumers can call `user.getMarginCalculation()` to access isolated breakdowns via `isolatedMarginCalculations`.
|
|
127
|
-
|
|
128
|
-
### Testing and parity
|
|
129
|
-
|
|
130
|
-
- Golden tests comparing SDK snapshot against program outputs (cross and isolated, edge cases).
|
|
131
|
-
- Keep math/rounding identical to program (ordering, buffers, funding, open-order IM, oracle strictness).
|
|
132
|
-
|
|
133
|
-
### Migration plan (brief)
|
|
134
|
-
|
|
135
|
-
1. Implement `types` and `engine` with strict parity; land behind a feature flag.
|
|
136
|
-
2. Add `user.getMarginCalculation()` and delegate legacy getters.
|
|
137
|
-
3. Optionally update UI hooks to read richer fields; not required for compatibility.
|
|
138
|
-
4. Expand parity tests; enable by default after validation.
|