@velocity-exchange/sdk 0.4.0 → 0.6.0
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 +35 -0
- package/lib/browser/adminClient.js +65 -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 +146 -3
- package/lib/browser/idl/velocity.json +147 -4
- package/lib/browser/orderSubscriber/OrderSubscriber.js +3 -0
- package/lib/browser/pyth/pythLazerSubscriber.js +37 -27
- package/lib/browser/types.d.ts +4 -0
- package/lib/browser/user.d.ts +15 -0
- package/lib/browser/user.js +37 -1
- package/lib/browser/velocityClient.d.ts +46 -10
- package/lib/browser/velocityClient.js +107 -35
- package/lib/node/adminClient.d.ts +35 -0
- package/lib/node/adminClient.d.ts.map +1 -1
- package/lib/node/adminClient.js +65 -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 +146 -3
- package/lib/node/idl/velocity.d.ts.map +1 -1
- package/lib/node/idl/velocity.json +147 -4
- package/lib/node/orderSubscriber/OrderSubscriber.d.ts.map +1 -1
- package/lib/node/orderSubscriber/OrderSubscriber.js +3 -0
- package/lib/node/pyth/pythLazerSubscriber.d.ts.map +1 -1
- package/lib/node/pyth/pythLazerSubscriber.js +37 -27
- package/lib/node/types.d.ts +4 -0
- package/lib/node/types.d.ts.map +1 -1
- package/lib/node/user.d.ts +15 -0
- package/lib/node/user.d.ts.map +1 -1
- package/lib/node/user.js +37 -1
- 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
|
@@ -3042,7 +3042,8 @@ class VelocityClient {
|
|
|
3042
3042
|
* @param subAccountId - Sub-account id to withdraw from; defaults to `this.activeSubAccountId`.
|
|
3043
3043
|
* @returns The `withdraw` instruction.
|
|
3044
3044
|
*/
|
|
3045
|
-
async getWithdrawIx(amount, marketIndex, userTokenAccount, reduceOnly = false, subAccountId) {
|
|
3045
|
+
async getWithdrawIx(amount, marketIndex, userTokenAccount, reduceOnly = false, subAccountId, overrides) {
|
|
3046
|
+
var _a;
|
|
3046
3047
|
const user = await this.getUserAccountPublicKey(subAccountId);
|
|
3047
3048
|
const remainingAccounts = this.getRemainingAccounts({
|
|
3048
3049
|
userAccounts: [this.getUserAccountOrThrow(subAccountId)],
|
|
@@ -3068,7 +3069,7 @@ class VelocityClient {
|
|
|
3068
3069
|
user,
|
|
3069
3070
|
userStats: this.getUserStatsAccountPublicKey(),
|
|
3070
3071
|
userTokenAccount,
|
|
3071
|
-
authority: this.wallet.publicKey,
|
|
3072
|
+
authority: (_a = overrides === null || overrides === void 0 ? void 0 : overrides.authority) !== null && _a !== void 0 ? _a : this.wallet.publicKey,
|
|
3072
3073
|
tokenProgram,
|
|
3073
3074
|
remainingAccounts,
|
|
3074
3075
|
});
|
|
@@ -3154,14 +3155,23 @@ class VelocityClient {
|
|
|
3154
3155
|
* @param marketIndex - Spot market index of the balance to transfer.
|
|
3155
3156
|
* @param fromSubAccountId - Sub-account id to debit.
|
|
3156
3157
|
* @param toSubAccountId - Sub-account id to credit.
|
|
3158
|
+
* @param equityFloorDelta - Equity floor (QUOTE_PRECISION) to move from the debited to the credited
|
|
3159
|
+
* sub-account along with the funds, keeping the sum of floors constant. The debited side must stay
|
|
3160
|
+
* at/above its reduced floor and the credited side's collateral (after the transfer lands) must back
|
|
3161
|
+
* its increased floor, else the transfer reverts with `InvalidEquityFloorTransfer`. Pass `'auto'`
|
|
3162
|
+
* (quote market only) to move the minimal floor needed for the debited side to stay at/above its
|
|
3163
|
+
* floor: `max(0, amount - (collateral - floor))`, capped at the debited side's floor. The auto delta
|
|
3164
|
+
* never exceeds `amount`, so the credited side stays backed whenever it was before. Client-side
|
|
3165
|
+
* pricing can differ slightly from the on-chain strict check at the exact boundary; retry with an
|
|
3166
|
+
* explicit padded delta if an `'auto'` transfer reverts. Defaults to zero.
|
|
3157
3167
|
* @param txParams - Optional compute-unit/priority-fee overrides for the transaction.
|
|
3158
3168
|
* @returns The transaction signature.
|
|
3159
3169
|
* @throws (on-chain) if `allowDelegateTransfer` is not enabled, if the signer is not the delegate on
|
|
3160
3170
|
* both sub-accounts, if the sub-accounts have different owners, if either is bankrupt, or if
|
|
3161
3171
|
* `fromSubAccountId === toSubAccountId`.
|
|
3162
3172
|
*/
|
|
3163
|
-
async transferDepositByDelegate(amount, marketIndex, fromSubAccountId, toSubAccountId, txParams) {
|
|
3164
|
-
const { txSig, slot } = await this.sendTransaction(await this.buildTransaction(await this.getTransferDepositByDelegateIx(amount, marketIndex, fromSubAccountId, toSubAccountId), txParams), [], this.opts);
|
|
3173
|
+
async transferDepositByDelegate(amount, marketIndex, fromSubAccountId, toSubAccountId, equityFloorDelta = numericConstants_1.ZERO, txParams) {
|
|
3174
|
+
const { txSig, slot } = await this.sendTransaction(await this.buildTransaction(await this.getTransferDepositByDelegateIx(amount, marketIndex, fromSubAccountId, toSubAccountId, equityFloorDelta), txParams), [], this.opts);
|
|
3165
3175
|
if (fromSubAccountId === this.activeSubAccountId ||
|
|
3166
3176
|
toSubAccountId === this.activeSubAccountId) {
|
|
3167
3177
|
this.cacheSpotMarketSlot(slot, marketIndex);
|
|
@@ -3179,28 +3189,49 @@ class VelocityClient {
|
|
|
3179
3189
|
* @param toSubAccountId - Sub-account id to credit.
|
|
3180
3190
|
* @returns The instruction.
|
|
3181
3191
|
*/
|
|
3182
|
-
async getTransferDepositByDelegateIx(amount, marketIndex, fromSubAccountId, toSubAccountId) {
|
|
3192
|
+
async getTransferDepositByDelegateIx(amount, marketIndex, fromSubAccountId, toSubAccountId, equityFloorDelta = numericConstants_1.ZERO) {
|
|
3183
3193
|
const fromUser = await (0, pda_1.getUserAccountPublicKey)(this.program.programId, this.authority, fromSubAccountId);
|
|
3184
3194
|
const toUser = await (0, pda_1.getUserAccountPublicKey)(this.program.programId, this.authority, toSubAccountId);
|
|
3185
|
-
let
|
|
3186
|
-
|
|
3187
|
-
|
|
3188
|
-
|
|
3189
|
-
|
|
3190
|
-
|
|
3191
|
-
|
|
3192
|
-
|
|
3193
|
-
|
|
3195
|
+
let resolvedFloorDelta;
|
|
3196
|
+
if (equityFloorDelta === 'auto') {
|
|
3197
|
+
// auto assumes amount and equity share QUOTE_PRECISION; for
|
|
3198
|
+
// non-quote markets the caller must value the tokens themselves
|
|
3199
|
+
if (marketIndex !== numericConstants_1.QUOTE_SPOT_MARKET_INDEX) {
|
|
3200
|
+
throw new Error("equityFloorDelta 'auto' is only supported for the quote spot market; pass an explicit delta");
|
|
3201
|
+
}
|
|
3202
|
+
const fromUserClass = this.getUser(fromSubAccountId, this.authority);
|
|
3203
|
+
const floor = fromUserClass.getUserAccountOrThrow().equityFloor;
|
|
3204
|
+
if (floor.lte(numericConstants_1.ZERO)) {
|
|
3205
|
+
resolvedFloorDelta = numericConstants_1.ZERO;
|
|
3206
|
+
}
|
|
3207
|
+
else {
|
|
3208
|
+
const excess = anchor_1.BN.max(fromUserClass.getTotalCollateral('Initial', true).sub(floor), numericConstants_1.ZERO);
|
|
3209
|
+
resolvedFloorDelta = anchor_1.BN.min(anchor_1.BN.max(amount.sub(excess), numericConstants_1.ZERO), floor);
|
|
3210
|
+
}
|
|
3194
3211
|
}
|
|
3195
3212
|
else {
|
|
3196
|
-
|
|
3197
|
-
remainingAccounts = this.getRemainingAccounts({
|
|
3198
|
-
userAccounts: [fromUserAccount],
|
|
3199
|
-
useMarketLastSlotCache: true,
|
|
3200
|
-
writableSpotMarketIndexes: [marketIndex],
|
|
3201
|
-
});
|
|
3213
|
+
resolvedFloorDelta = equityFloorDelta;
|
|
3202
3214
|
}
|
|
3203
|
-
|
|
3215
|
+
const loadUserAccount = async (subAccountId, userPublicKey) => {
|
|
3216
|
+
const userMapKey = this.getUserMapKey(subAccountId, this.authority);
|
|
3217
|
+
const mapUser = this.users.get(userMapKey);
|
|
3218
|
+
if (mapUser) {
|
|
3219
|
+
return mapUser.getUserAccountOrThrow();
|
|
3220
|
+
}
|
|
3221
|
+
return (await this.program.account.user.fetch(userPublicKey));
|
|
3222
|
+
};
|
|
3223
|
+
// moving equity floor triggers an on-chain margin check of the credited
|
|
3224
|
+
// side, so its markets/oracles must be in the remaining accounts too
|
|
3225
|
+
const userAccounts = [await loadUserAccount(fromSubAccountId, fromUser)];
|
|
3226
|
+
if (resolvedFloorDelta.gt(numericConstants_1.ZERO)) {
|
|
3227
|
+
userAccounts.push(await loadUserAccount(toSubAccountId, toUser));
|
|
3228
|
+
}
|
|
3229
|
+
const remainingAccounts = this.getRemainingAccounts({
|
|
3230
|
+
userAccounts,
|
|
3231
|
+
useMarketLastSlotCache: true,
|
|
3232
|
+
writableSpotMarketIndexes: [marketIndex],
|
|
3233
|
+
});
|
|
3234
|
+
return await this.program.instruction.transferDepositByDelegate(marketIndex, amount, resolvedFloorDelta, {
|
|
3204
3235
|
accounts: {
|
|
3205
3236
|
delegate: this.wallet.publicKey,
|
|
3206
3237
|
fromUser,
|
|
@@ -5241,6 +5272,42 @@ class VelocityClient {
|
|
|
5241
5272
|
remainingAccounts,
|
|
5242
5273
|
});
|
|
5243
5274
|
}
|
|
5275
|
+
/**
|
|
5276
|
+
* Keeper instruction: trips the authority-wide equity floor breaker. Proves on-chain that the
|
|
5277
|
+
* given subaccount's cross-margin total collateral is below its `equityFloor` (reverts with
|
|
5278
|
+
* `SufficientCollateral` otherwise, or if no floor is set) and sets `equityBreakerTripped` on the
|
|
5279
|
+
* authority's `UserStats` — every subaccount of the authority then rejects risk-increasing fills,
|
|
5280
|
+
* withdrawals and transfers out until the warm admin calls `resetEquityFloorBreaker`.
|
|
5281
|
+
* Permissionless — any signer may trip it; the margin calculation is the proof.
|
|
5282
|
+
* @param userAccountPublicKey - Public key of the breached subaccount's user account.
|
|
5283
|
+
* @param user - Decoded user account of the breached subaccount.
|
|
5284
|
+
* @param txParams - Optional compute-unit/priority-fee overrides.
|
|
5285
|
+
* @returns The transaction signature.
|
|
5286
|
+
*/
|
|
5287
|
+
async tripEquityFloorBreaker(userAccountPublicKey, user, txParams) {
|
|
5288
|
+
const { txSig } = await this.sendTransaction(await this.buildTransaction(await this.getTripEquityFloorBreakerIx(userAccountPublicKey, user), txParams), [], this.opts);
|
|
5289
|
+
return txSig;
|
|
5290
|
+
}
|
|
5291
|
+
/**
|
|
5292
|
+
* Builds the `tripEquityFloorBreaker` instruction. See `tripEquityFloorBreaker` for semantics.
|
|
5293
|
+
* @param userAccountPublicKey - Public key of the breached subaccount's user account.
|
|
5294
|
+
* @param userAccount - Decoded user account of the breached subaccount.
|
|
5295
|
+
* @returns The instruction.
|
|
5296
|
+
*/
|
|
5297
|
+
async getTripEquityFloorBreakerIx(userAccountPublicKey, userAccount) {
|
|
5298
|
+
const remainingAccounts = this.getRemainingAccounts({
|
|
5299
|
+
userAccounts: [userAccount],
|
|
5300
|
+
});
|
|
5301
|
+
return await this.program.instruction.tripEquityFloorBreaker({
|
|
5302
|
+
accounts: {
|
|
5303
|
+
state: await this.getStatePublicKey(),
|
|
5304
|
+
keeper: this.wallet.publicKey,
|
|
5305
|
+
user: userAccountPublicKey,
|
|
5306
|
+
userStats: (0, pda_1.getUserStatsAccountPublicKey)(this.program.programId, userAccount.authority),
|
|
5307
|
+
},
|
|
5308
|
+
remainingAccounts,
|
|
5309
|
+
});
|
|
5310
|
+
}
|
|
5244
5311
|
/**
|
|
5245
5312
|
* Keeper instruction: marks a user account idle after confirming (via `validate_user_is_idle`)
|
|
5246
5313
|
* it has been inactive long enough — the inactivity window is shorter (accelerated) when the
|
|
@@ -7183,11 +7250,12 @@ class VelocityClient {
|
|
|
7183
7250
|
}
|
|
7184
7251
|
/**
|
|
7185
7252
|
* Keeper instruction: estimates the market's bid/ask price from the given makers' resting DLOB
|
|
7186
|
-
* orders (
|
|
7187
|
-
*
|
|
7188
|
-
*
|
|
7189
|
-
*
|
|
7190
|
-
*
|
|
7253
|
+
* orders (kept only within `±BID_ASK_TWAP_MAX_ORACLE_DIVERGENCE_PERCENT` of the oracle price on
|
|
7254
|
+
* both sides) and folds the estimate into `lastBidPriceTwap`/`lastAskPriceTwap`. This does NOT
|
|
7255
|
+
* update the funding rate, crank funding separately via `getUpdateFundingRateIx`. Restricted:
|
|
7256
|
+
* the calling wallet's `UserStats` (which must be the signer's own) must have
|
|
7257
|
+
* `canUpdateBidAskTwap` set and at least 1000 USDC (`QUOTE_PRECISION`, 1e6) staked in the
|
|
7258
|
+
* insurance fund (`ifStakedQuoteAssetAmount`), or the instruction reverts.
|
|
7191
7259
|
* @param perpMarketIndex - Perp market index to update.
|
|
7192
7260
|
* @param makers - `(maker, makerStats)` pairs whose resting orders are sampled for the estimate.
|
|
7193
7261
|
* @param txParams - Optional compute-unit/priority-fee overrides.
|
|
@@ -7433,15 +7501,17 @@ class VelocityClient {
|
|
|
7433
7501
|
* @param marketIndex - Spot market index whose insurance fund to stake into.
|
|
7434
7502
|
* @returns The instruction.
|
|
7435
7503
|
*/
|
|
7436
|
-
async getInitializeInsuranceFundStakeIx(marketIndex) {
|
|
7437
|
-
|
|
7504
|
+
async getInitializeInsuranceFundStakeIx(marketIndex, overrides) {
|
|
7505
|
+
var _a;
|
|
7506
|
+
const authority = (_a = overrides === null || overrides === void 0 ? void 0 : overrides.authority) !== null && _a !== void 0 ? _a : this.wallet.publicKey;
|
|
7507
|
+
const ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId, authority, marketIndex);
|
|
7438
7508
|
const accounts = {
|
|
7439
7509
|
insuranceFundStake: ifStakeAccountPublicKey,
|
|
7440
7510
|
spotMarket: this.getSpotMarketAccountOrThrow(marketIndex).pubkey,
|
|
7441
|
-
userStats: (0, pda_1.getUserStatsAccountPublicKey)(this.program.programId,
|
|
7511
|
+
userStats: (0, pda_1.getUserStatsAccountPublicKey)(this.program.programId, authority // only allow payer to initialize own insurance fund stake account
|
|
7442
7512
|
),
|
|
7443
|
-
authority
|
|
7444
|
-
payer:
|
|
7513
|
+
authority,
|
|
7514
|
+
payer: authority,
|
|
7445
7515
|
rent: web3_js_1.SYSVAR_RENT_PUBKEY,
|
|
7446
7516
|
systemProgram: web3_js_1.SystemProgram.programId,
|
|
7447
7517
|
state: await this.getStatePublicKey(),
|
|
@@ -7462,9 +7532,11 @@ class VelocityClient {
|
|
|
7462
7532
|
* @param collateralAccountPublicKey - Token account to debit for the stake.
|
|
7463
7533
|
* @returns The instruction.
|
|
7464
7534
|
*/
|
|
7465
|
-
async getAddInsuranceFundStakeIx(marketIndex, amount, collateralAccountPublicKey) {
|
|
7535
|
+
async getAddInsuranceFundStakeIx(marketIndex, amount, collateralAccountPublicKey, overrides) {
|
|
7536
|
+
var _a;
|
|
7537
|
+
const authority = (_a = overrides === null || overrides === void 0 ? void 0 : overrides.authority) !== null && _a !== void 0 ? _a : this.wallet.publicKey;
|
|
7466
7538
|
const spotMarket = this.getSpotMarketAccountOrThrow(marketIndex);
|
|
7467
|
-
const ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId,
|
|
7539
|
+
const ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId, authority, marketIndex);
|
|
7468
7540
|
const remainingAccounts = [];
|
|
7469
7541
|
this.addTokenMintToRemainingAccounts(spotMarket, remainingAccounts);
|
|
7470
7542
|
if (this.isTransferHook(spotMarket)) {
|
|
@@ -7476,9 +7548,9 @@ class VelocityClient {
|
|
|
7476
7548
|
state: await this.getStatePublicKey(),
|
|
7477
7549
|
spotMarket: spotMarket.pubkey,
|
|
7478
7550
|
insuranceFundStake: ifStakeAccountPublicKey,
|
|
7479
|
-
userStats: (0, pda_1.getUserStatsAccountPublicKey)(this.program.programId,
|
|
7551
|
+
userStats: (0, pda_1.getUserStatsAccountPublicKey)(this.program.programId, authority // only allow payer to add to own insurance fund stake account
|
|
7480
7552
|
),
|
|
7481
|
-
authority
|
|
7553
|
+
authority,
|
|
7482
7554
|
spotMarketVault: spotMarket.vault,
|
|
7483
7555
|
insuranceFundVault: spotMarket.insuranceFund.vault,
|
|
7484
7556
|
velocitySigner: this.getSignerPublicKey(),
|
package/package.json
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@velocity-exchange/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"main": "lib/node/index.js",
|
|
5
5
|
"types": "lib/node/index.d.ts",
|
|
6
6
|
"module": "./lib/browser/index.js",
|
|
7
|
+
"files": [
|
|
8
|
+
"lib"
|
|
9
|
+
],
|
|
7
10
|
"repository": {
|
|
8
11
|
"type": "git",
|
|
9
|
-
"url": "git
|
|
12
|
+
"url": "git+https://github.com/velocity-exchange/velocity-v1.git",
|
|
13
|
+
"directory": "packages/sdk"
|
|
10
14
|
},
|
|
11
15
|
"scripts": {
|
|
12
16
|
"lint": "eslint './**/*.{ts,tsx}' --quiet --format unix",
|
|
@@ -111,7 +115,7 @@
|
|
|
111
115
|
},
|
|
112
116
|
"description": "SDK for Velocity Protocol",
|
|
113
117
|
"engines": {
|
|
114
|
-
"node": "
|
|
118
|
+
"node": ">=20"
|
|
115
119
|
},
|
|
116
120
|
"resolutions": {
|
|
117
121
|
"@solana/web3.js": "1.98.0",
|
package/.prettierignore
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
src/idl/velocity.ts
|
package/CHANGELOG.md
DELETED
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
# @velocity-exchange/sdk
|
|
2
|
-
|
|
3
|
-
## 0.4.0
|
|
4
|
-
|
|
5
|
-
### Minor Changes
|
|
6
|
-
|
|
7
|
-
- [#197](https://github.com/velocity-exchange/velocity-v1/pull/197) [`900c07d`](https://github.com/velocity-exchange/velocity-v1/commit/900c07d9da7e106c82fbe65b3d92226d090bdee9) Thanks [@jordy25519](https://github.com/jordy25519)! - Attach the taker's `RevenueShareEscrow` on perp fills for referred takers. `getFillPerpOrderIx` gains an optional `takerIsReferred` flag; when set (or when the order carries a builder code) the deterministic escrow PDA is added to the fill. This mirrors the on-chain fill gate, which reads `UserStats.referrerStatus` (the `BuilderReferral` bit), so referred takers' fills no longer revert with `UnableToLoadRevenueShareAccount`. `ReferrerMap` gains `isBuilderReferral(authority)` and `mustGetIsBuilderReferral(authority)`, sourcing the bit from the UserStats fetch it already performs.
|
|
8
|
-
|
|
9
|
-
- [#189](https://github.com/velocity-exchange/velocity-v1/pull/189) [`8df28ac`](https://github.com/velocity-exchange/velocity-v1/commit/8df28ac6d113760ae4a8cdff4ad438cb25efce2c) Thanks [@ChesterSim](https://github.com/ChesterSim)! - Program↔SDK parity fixes from the 2026-07-02 audit: renamed deprecated Switchboard
|
|
10
|
-
OracleSource keys to match the IDL (fixes a decode crash on affected markets), applied
|
|
11
|
-
the $100 initial-margin unrealized-PnL cap, standardized auction/limit prices to order
|
|
12
|
-
tick size across the DLOB, isolated-position handling in bankruptcy/liquidation math,
|
|
13
|
-
corrected MM-oracle validity gating, referrer_status memcmp offset, PerpOperation and
|
|
14
|
-
OrderBitFlag bit values, wired five missing event records into EventSubscriber, fixed
|
|
15
|
-
withdraw-limit divisors, multi-pool margin segregation, referee/builder fee estimation,
|
|
16
|
-
and added AdminClient.updatePauseAdmin plus admin CLI commands for pause-admin rotation
|
|
17
|
-
and fee-pool transfers. Also fixed withdrawFromIsolatedPerpPosition's withdraw-all path:
|
|
18
|
-
it substituted the MIN_I64 sentinel into the instruction's unsigned u64 amount (serializing
|
|
19
|
-
as 2^63, so full withdrawals always failed on-chain with InsufficientCollateral); it now
|
|
20
|
-
clamps the request to the position's deposit plus claimable PnL.
|
|
21
|
-
|
|
22
|
-
Follow-up completeness fixes: DLOBSubscriber.getL2/getL3 (and the dlob-server publisher) now
|
|
23
|
-
thread orderTickSize so the public book view is tick-standardized like on-chain; added
|
|
24
|
-
hasIsolatedMarginBankrupt and wired isolated-only bankruptcy detection into keeper resolution
|
|
25
|
-
(isIsolatedPositionBankrupt now guards against non-isolated indices); getMarketFees applies the
|
|
26
|
-
referee discount and calculateFeeForQuoteAmount accepts builder params so both public fee-prediction
|
|
27
|
-
entry points match on-chain; and isFallbackAvailableLiquiditySource now fully mirrors
|
|
28
|
-
amm_fill_gates_ok, adding the market-drawdown and MM-vs-exchange oracle volatility gates.
|
|
29
|
-
|
|
30
|
-
Low-risk parity follow-ups: MarginCategory now includes 'Fill' as a single shared type, handled
|
|
31
|
-
across perp margin ratio / unrealized-asset-weight and spot asset/liability weights (the
|
|
32
|
-
integer-averaged midpoint of initial and maintenance, mirroring get_margin_ratio /
|
|
33
|
-
get_asset_weight / get_liability_weight) instead of throwing or returning undefined; the
|
|
34
|
-
worst-tier taker-fee estimate in calculateEntriesEffectOnFreeCollateral now ceil-divides to match
|
|
35
|
-
calculate_taker_fee; MM-oracle validity is computed with the raw exchange confidence (matching
|
|
36
|
-
get_mm_oracle_price_data) while the returned MM price keeps its diff-adjusted confidence; and
|
|
37
|
-
corrected the OracleSourceNum doc (it is an SDK-internal oracle-id encoding, not the on-chain
|
|
38
|
-
Borsh discriminant).
|
|
39
|
-
|
|
40
|
-
Visible/breaking API changes in this release: `OracleSource.SWITCHBOARD` /
|
|
41
|
-
`OracleSource.SWITCHBOARD_ON_DEMAND` (and the corresponding `OracleSourceNum` entries) are renamed
|
|
42
|
-
to `DEPRECATED_SWITCHBOARD` / `DEPRECATED_SWITCHBOARD_ON_DEMAND` with no aliases kept for the old
|
|
43
|
-
names; `ContractType.FUTURE` is renamed to `DEPRECATED_FUTURE`; and `FeatureBitFlags.BUILDER_REFERRAL`
|
|
44
|
-
is removed outright, since no such on-chain flag exists. Separately, `getLimitPrice` gained a new
|
|
45
|
-
optional trailing `tickSize` parameter — the existing `fallbackPrice` parameter stays in its original
|
|
46
|
-
4th position, so old 4-argument call sites keep working unchanged.
|
|
47
|
-
|
|
48
|
-
### Patch Changes
|
|
49
|
-
|
|
50
|
-
- [#199](https://github.com/velocity-exchange/velocity-v1/pull/199) [`dff8a47`](https://github.com/velocity-exchange/velocity-v1/commit/dff8a4754f6b736fed330b2ab4fa5685db4f8159) Thanks [@jordy25519](https://github.com/jordy25519)! - Add BTC-PERP (index 1) and ETH-PERP (index 2) to `DevnetPerpMarkets`, reflecting the two Pyth-Lazer perp markets re-created on devnet. ETH-PERP uses lazer feed 2 (real ETH price feed).
|
|
51
|
-
|
|
52
|
-
- [#193](https://github.com/velocity-exchange/velocity-v1/pull/193) [`bafd699`](https://github.com/velocity-exchange/velocity-v1/commit/bafd6990f8322f232d2f0d17042beb0e9c567164) Thanks [@jordy25519](https://github.com/jordy25519)! - Remove the stale `FettyRIP` (marketIndex 2) entry from `DevnetPerpMarkets`. That perp market was deleted on-chain, but the hand-maintained devnet config still listed it, so consumers that enumerate all perp markets (keeper-bots-v2, dlob-server) crashed with `Perp market config for 2 not found` when resolving the nonexistent market. The devnet config now mirrors on-chain state (SOL-PERP at index 0 only).
|
|
53
|
-
|
|
54
|
-
## 0.3.0
|
|
55
|
-
|
|
56
|
-
### Minor Changes
|
|
57
|
-
|
|
58
|
-
- [#172](https://github.com/velocity-exchange/velocity-v1/pull/172) [`b7d15b9`](https://github.com/velocity-exchange/velocity-v1/commit/b7d15b970a74d267aeaf20bb644d5344b9aadc61) Thanks [@0xahzam](https://github.com/0xahzam)! - Decouple solvency-repair from the withdraw pause. The `resolve_perp_pnl_deficit`,
|
|
59
|
-
`resolve_perp_bankruptcy`, and `resolve_spot_bankruptcy` instructions are now gated by a
|
|
60
|
-
new `State.solvencyStatus` bitfield instead of `WithdrawPaused`, so user withdrawals can
|
|
61
|
-
be halted while solvency repair keeps running (or repair can be frozen on its own). Adds
|
|
62
|
-
the `SolvencyStatus` enum, `StateAccount.solvencyStatus`, a `solvencyRepairPaused()`
|
|
63
|
-
helper, `AdminClient.updateSolvencyStatus`, and the `exchange set-solvency-status` admin
|
|
64
|
-
CLI command.
|
|
65
|
-
|
|
66
|
-
- [#141](https://github.com/velocity-exchange/velocity-v1/pull/141) [`3f148f8`](https://github.com/velocity-exchange/velocity-v1/commit/3f148f8b477e4176e11e0660adb0e67dd5163d3b) Thanks [@ChewingGlass](https://github.com/ChewingGlass)! - Harden the native fast-path admin handlers. The
|
|
67
|
-
`update_amm_spread_adjustment_native` instruction now requires the program
|
|
68
|
-
`State` account: `getUpdateAmmSpreadAdjustmentNativeIx` is now **async** and
|
|
69
|
-
returns a `Promise<TransactionInstruction>` (it derives and appends the state
|
|
70
|
-
account), and its compute-unit budget was raised to cover the on-chain account
|
|
71
|
-
validation. Direct callers must `await` the builder. Two new program error
|
|
72
|
-
codes are surfaced in the IDL: `InvalidNativeStateAccount` (6355) and
|
|
73
|
-
`InvalidNativePerpMarketAccount` (6356).
|
|
74
|
-
|
|
75
|
-
### Patch Changes
|
|
76
|
-
|
|
77
|
-
- [#173](https://github.com/velocity-exchange/velocity-v1/pull/173) [`2f6c64d`](https://github.com/velocity-exchange/velocity-v1/commit/2f6c64d54f1146d8e7f9ee4ab556929c6bf8b920) Thanks [@ChesterSim](https://github.com/ChesterSim)! - Fix stale `User` account byte offsets in `memcmp` filters and `OrderSubscriber`.
|
|
78
|
-
|
|
79
|
-
The Velocity `User` account is 4496 bytes, but the memcmp filters and the
|
|
80
|
-
`OrderSubscriber` staleness check still used offsets from the older 4376-byte
|
|
81
|
-
layout. As a result `getUserWithOrderFilter()` matched zero accounts, so any
|
|
82
|
-
consumer that bulk-loads users-with-orders (e.g. the DLOB server's
|
|
83
|
-
`OrderSubscriber.fetch()`) loaded no orders and produced an empty order book
|
|
84
|
-
(vAMM-only L2, empty L3). Offsets for `idle`, `hasOpenOrder`, `hasOpenAuction`,
|
|
85
|
-
`poolId`, and `lastActiveSlot` are corrected to match the on-chain layout.
|
|
86
|
-
|
|
87
|
-
## 0.2.6
|
|
88
|
-
|
|
89
|
-
### Patch Changes
|
|
90
|
-
|
|
91
|
-
- [#156](https://github.com/velocity-exchange/velocity-v1/pull/156) [`d3b58ab`](https://github.com/velocity-exchange/velocity-v1/commit/d3b58ab7e3ad33f0e6634ff87e9b150915b3aa13) Thanks [@ChesterSim](https://github.com/ChesterSim)! - Fix account decoder to pass account names as-is instead of capitalizing them. The
|
|
92
|
-
Anchor v1 IDL program constructor already camelCases account names, so the extra
|
|
93
|
-
`capitalize()` call was incorrect and caused decoding failures in the gRPC and
|
|
94
|
-
WebSocket subscribers.
|
|
95
|
-
|
|
96
|
-
## 0.2.5
|
|
97
|
-
|
|
98
|
-
### Patch Changes
|
|
99
|
-
|
|
100
|
-
- [#155](https://github.com/velocity-exchange/velocity-v1/pull/155) [`15073bc`](https://github.com/velocity-exchange/velocity-v1/commit/15073bc0b740b2d1cad471126a00368e72655bd5) Thanks [@ChesterSim](https://github.com/ChesterSim)! - Make the `UserAccountSubscriber` "not subscribed" contract consistent and fix a
|
|
101
|
-
misleading error message. `getUserAccountAndSlot()` now throws `NotSubscribedError`
|
|
102
|
-
when called before `subscribe()` on the gRPC-multi and WebSocket-program subscribers
|
|
103
|
-
too (the WebSocket and polling subscribers already did) — so `User.getUserAccount()`
|
|
104
|
-
uniformly throws when not subscribed and returns `undefined` only when subscribed but
|
|
105
|
-
the account was not found on chain. `getUserAccountOrThrow()` /
|
|
106
|
-
`getUserAccountAndSlotOrThrow()` now throw `User account not found: <pubkey>` (was
|
|
107
|
-
`User account not loaded`), since after `subscribe()` resolves a missing account means
|
|
108
|
-
"not found", not "still loading".
|
|
109
|
-
|
|
110
|
-
## 0.2.4
|
|
111
|
-
|
|
112
|
-
### Patch Changes
|
|
113
|
-
|
|
114
|
-
- [#127](https://github.com/velocity-exchange/velocity-v1/pull/127) [`4f8e7aa`](https://github.com/velocity-exchange/velocity-v1/commit/4f8e7aaef0e35b190fc0b91cd29314d902d1ccab) Thanks [@ChesterSim](https://github.com/ChesterSim)! - reflect Typescript types on IDL changes
|
|
115
|
-
|
|
116
|
-
## 0.2.3
|
|
117
|
-
|
|
118
|
-
### Patch Changes
|
|
119
|
-
|
|
120
|
-
- [#100](https://github.com/velocity-exchange/velocity-v1/pull/100) [`ae78769`](https://github.com/velocity-exchange/velocity-v1/commit/ae78769ef58355202c030435c2796ef045fe30a0) Thanks [@ChesterSim](https://github.com/ChesterSim)! - add back ForwardOnlyTxSender and calculateMaxRemainingDeposit
|
|
121
|
-
|
|
122
|
-
## 0.2.2
|
|
123
|
-
|
|
124
|
-
### Patch Changes
|
|
125
|
-
|
|
126
|
-
- [#97](https://github.com/velocity-exchange/velocity-v1/pull/97) [`022a949`](https://github.com/velocity-exchange/velocity-v1/commit/022a949cb1802171ca57a61260f86c8908f94f34) Thanks [@ChewingGlass](https://github.com/ChewingGlass)! - Re-export `PriceUpdateAccount` from the package root and declare `@types/node` as a devDependency (fixes the SDK build under isolated installs). Enables downstream apps (dlob-server, keeper-bots-v2) to consume the velocity SDK without reaching into subpaths.
|
|
127
|
-
|
|
128
|
-
## 0.2.1
|
|
129
|
-
|
|
130
|
-
### Patch Changes
|
|
131
|
-
|
|
132
|
-
- [`4fd7462`](https://github.com/velocity-exchange/velocity-v1/commit/4fd7462bfa3c55e31e3457b1b65f519cf052a6fa) Thanks [@ChewingGlass](https://github.com/ChewingGlass)! - Testing new changelog based package publishing flow
|
package/build-browser.js
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
const esbuild = require('esbuild');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
|
|
4
|
-
async function build() {
|
|
5
|
-
try {
|
|
6
|
-
await esbuild.build({
|
|
7
|
-
entryPoints: ['./lib/browser/index.js'],
|
|
8
|
-
bundle: true,
|
|
9
|
-
minify: true,
|
|
10
|
-
format: 'cjs',
|
|
11
|
-
platform: 'browser',
|
|
12
|
-
target: ['es2020'],
|
|
13
|
-
outfile: './dist/browser.min.js',
|
|
14
|
-
external: [
|
|
15
|
-
'@solana/web3.js',
|
|
16
|
-
'@coral-xyz/anchor',
|
|
17
|
-
'@coral-xyz/anchor-30',
|
|
18
|
-
],
|
|
19
|
-
define: {
|
|
20
|
-
'process.env.NODE_ENV': '"production"',
|
|
21
|
-
'global': 'globalThis',
|
|
22
|
-
},
|
|
23
|
-
inject: [path.resolve(__dirname, 'esbuild-shims.js')],
|
|
24
|
-
alias: {
|
|
25
|
-
// Node polyfills for browser
|
|
26
|
-
'crypto': 'crypto-browserify',
|
|
27
|
-
'stream': 'stream-browserify',
|
|
28
|
-
'path': 'path-browserify',
|
|
29
|
-
'os': 'os-browserify/browser',
|
|
30
|
-
'process': 'process/browser',
|
|
31
|
-
'vm': 'vm-browserify',
|
|
32
|
-
},
|
|
33
|
-
// Ignore node-only modules
|
|
34
|
-
plugins: [{
|
|
35
|
-
name: 'ignore-node-modules',
|
|
36
|
-
setup(build) {
|
|
37
|
-
build.onResolve({ filter: /^(fs|net|dns|tls|http2)$/ }, args => {
|
|
38
|
-
return { path: args.path, namespace: 'ignore-ns' };
|
|
39
|
-
});
|
|
40
|
-
build.onLoad({ filter: /.*/, namespace: 'ignore-ns' }, () => {
|
|
41
|
-
return { contents: 'export default {}' };
|
|
42
|
-
});
|
|
43
|
-
},
|
|
44
|
-
}],
|
|
45
|
-
loader: {
|
|
46
|
-
'.json': 'json',
|
|
47
|
-
},
|
|
48
|
-
treeShaking: true,
|
|
49
|
-
sourcemap: false,
|
|
50
|
-
});
|
|
51
|
-
console.log('✅ Browser build complete');
|
|
52
|
-
} catch (error) {
|
|
53
|
-
console.error('❌ Build failed:', error);
|
|
54
|
-
process.exit(1);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
build();
|
package/bunfig.toml
DELETED
package/esbuild-shims.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Buffer } from 'buffer';
|
|
2
|
-
import process from 'process';
|
|
3
|
-
|
|
4
|
-
if (typeof globalThis.Buffer === 'undefined') {
|
|
5
|
-
globalThis.Buffer = Buffer;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
if (typeof globalThis.process === 'undefined') {
|
|
9
|
-
globalThis.process = process;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export { Buffer, process };
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { Connection, Keypair, PublicKey } from '@solana/web3.js';
|
|
2
|
-
import dotenv from 'dotenv';
|
|
3
|
-
import { AnchorProvider, Idl, Program, ProgramAccount, BN } from '@coral-xyz/anchor';
|
|
4
|
-
import velocityIDL from '../src/idl/velocity.json';
|
|
5
|
-
import {
|
|
6
|
-
VELOCITY_PROGRAM_ID,
|
|
7
|
-
PerpMarketAccount,
|
|
8
|
-
SpotMarketAccount,
|
|
9
|
-
OracleInfo,
|
|
10
|
-
Wallet,
|
|
11
|
-
numberToSafeBN,
|
|
12
|
-
} from '../src';
|
|
13
|
-
import { VelocityClient } from '../src/velocityClient';
|
|
14
|
-
import { VelocityClientConfig } from '../src/velocityClientConfig';
|
|
15
|
-
|
|
16
|
-
async function main() {
|
|
17
|
-
dotenv.config({ path: '../' });
|
|
18
|
-
|
|
19
|
-
const RPC_ENDPOINT = process.env.RPC_ENDPOINT;
|
|
20
|
-
if (!RPC_ENDPOINT) throw new Error('RPC_ENDPOINT env var required');
|
|
21
|
-
|
|
22
|
-
let keypair: Keypair;
|
|
23
|
-
const pk = process.env.PRIVATE_KEY;
|
|
24
|
-
if (pk) {
|
|
25
|
-
const secret = Uint8Array.from(JSON.parse(pk));
|
|
26
|
-
keypair = Keypair.fromSecretKey(secret);
|
|
27
|
-
} else {
|
|
28
|
-
keypair = new Keypair();
|
|
29
|
-
console.warn('Using ephemeral keypair. Provide PRIVATE_KEY to use a real wallet.');
|
|
30
|
-
}
|
|
31
|
-
const wallet = new Wallet(keypair);
|
|
32
|
-
|
|
33
|
-
const connection = new Connection(RPC_ENDPOINT);
|
|
34
|
-
const provider = new AnchorProvider(connection, wallet as any, {
|
|
35
|
-
commitment: 'processed',
|
|
36
|
-
});
|
|
37
|
-
const programId = new PublicKey(VELOCITY_PROGRAM_ID);
|
|
38
|
-
const program = new Program(velocityIDL as Idl, programId, provider);
|
|
39
|
-
|
|
40
|
-
const allPerpMarketProgramAccounts =
|
|
41
|
-
(await program.account.perpMarket.all()) as ProgramAccount<PerpMarketAccount>[];
|
|
42
|
-
const perpMarketIndexes = allPerpMarketProgramAccounts.map((val) => val.account.marketIndex);
|
|
43
|
-
const allSpotMarketProgramAccounts =
|
|
44
|
-
(await program.account.spotMarket.all()) as ProgramAccount<SpotMarketAccount>[];
|
|
45
|
-
const spotMarketIndexes = allSpotMarketProgramAccounts.map((val) => val.account.marketIndex);
|
|
46
|
-
|
|
47
|
-
const seen = new Set<string>();
|
|
48
|
-
const oracleInfos: OracleInfo[] = [];
|
|
49
|
-
for (const acct of allPerpMarketProgramAccounts) {
|
|
50
|
-
const key = `${acct.account.amm.oracle.toBase58()}-${Object.keys(acct.account.amm.oracleSource)[0]}`;
|
|
51
|
-
if (!seen.has(key)) {
|
|
52
|
-
seen.add(key);
|
|
53
|
-
oracleInfos.push({ publicKey: acct.account.amm.oracle, source: acct.account.amm.oracleSource });
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
for (const acct of allSpotMarketProgramAccounts) {
|
|
57
|
-
const key = `${acct.account.oracle.toBase58()}-${Object.keys(acct.account.oracleSource)[0]}`;
|
|
58
|
-
if (!seen.has(key)) {
|
|
59
|
-
seen.add(key);
|
|
60
|
-
oracleInfos.push({ publicKey: acct.account.oracle, source: acct.account.oracleSource });
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const clientConfig: VelocityClientConfig = {
|
|
65
|
-
connection,
|
|
66
|
-
wallet,
|
|
67
|
-
programID: programId,
|
|
68
|
-
accountSubscription: { type: 'websocket', commitment: 'processed' },
|
|
69
|
-
perpMarketIndexes,
|
|
70
|
-
spotMarketIndexes,
|
|
71
|
-
oracleInfos,
|
|
72
|
-
env: 'devnet',
|
|
73
|
-
};
|
|
74
|
-
const client = new VelocityClient(clientConfig);
|
|
75
|
-
await client.subscribe();
|
|
76
|
-
|
|
77
|
-
const candidates = perpMarketIndexes.filter((i) => i >= 0 && i <= 5);
|
|
78
|
-
const targetMarketIndex = candidates.length
|
|
79
|
-
? candidates[Math.floor(Math.random() * candidates.length)]
|
|
80
|
-
: perpMarketIndexes[0];
|
|
81
|
-
|
|
82
|
-
const perpMarketAccount = client.getPerpMarketAccount(targetMarketIndex);
|
|
83
|
-
const quoteSpotMarketIndex = perpMarketAccount.quoteSpotMarketIndex;
|
|
84
|
-
const spotMarketAccount = client.getSpotMarketAccount(quoteSpotMarketIndex);
|
|
85
|
-
|
|
86
|
-
const precision = new BN(10).pow(new BN(spotMarketAccount.decimals));
|
|
87
|
-
const amount = numberToSafeBN(0.01, precision);
|
|
88
|
-
|
|
89
|
-
const userTokenAccount = await client.getAssociatedTokenAccount(quoteSpotMarketIndex);
|
|
90
|
-
const ix = await client.getDepositIntoIsolatedPerpPositionIx(
|
|
91
|
-
amount,
|
|
92
|
-
targetMarketIndex,
|
|
93
|
-
userTokenAccount,
|
|
94
|
-
0
|
|
95
|
-
);
|
|
96
|
-
|
|
97
|
-
const tx = await client.buildTransaction([ix]);
|
|
98
|
-
const { txSig } = await client.sendTransaction(tx);
|
|
99
|
-
console.log(`Deposited into isolated perp market ${targetMarketIndex}: ${txSig}`);
|
|
100
|
-
|
|
101
|
-
await client.getUser().unsubscribe();
|
|
102
|
-
await client.unsubscribe();
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
main().catch((e) => {
|
|
106
|
-
console.error(e);
|
|
107
|
-
process.exit(1);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
|