@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
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
|
-
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
import { Connection, Keypair, PublicKey } from '@solana/web3.js';
|
|
2
|
-
import dotenv from 'dotenv';
|
|
3
|
-
import {
|
|
4
|
-
VelocityClient,
|
|
5
|
-
VelocityClientConfig,
|
|
6
|
-
Wallet,
|
|
7
|
-
UserMap,
|
|
8
|
-
VELOCITY_PROGRAM_ID,
|
|
9
|
-
getMarketsAndOraclesForSubscription,
|
|
10
|
-
BulkAccountLoader,
|
|
11
|
-
BN,
|
|
12
|
-
PerpPosition,
|
|
13
|
-
} from '../src';
|
|
14
|
-
import { TransactionSignature } from '@solana/web3.js';
|
|
15
|
-
import fs from 'fs';
|
|
16
|
-
import os from 'os';
|
|
17
|
-
import path from 'path';
|
|
18
|
-
|
|
19
|
-
async function main() {
|
|
20
|
-
dotenv.config({ path: '../' });
|
|
21
|
-
// Simple CLI parsing
|
|
22
|
-
interface CliOptions {
|
|
23
|
-
mode: 'list' | 'one' | 'all';
|
|
24
|
-
targetUser?: string;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function parseCliArgs(): CliOptions {
|
|
28
|
-
const args = process.argv.slice(2);
|
|
29
|
-
let mode: CliOptions['mode'] = 'list';
|
|
30
|
-
let targetUser: string | undefined = undefined;
|
|
31
|
-
for (let i = 0; i < args.length; i++) {
|
|
32
|
-
const arg = args[i];
|
|
33
|
-
if (arg === '--mode' && i + 1 < args.length) {
|
|
34
|
-
const next = args[i + 1] as CliOptions['mode'];
|
|
35
|
-
if (next === 'list' || next === 'one' || next === 'all') {
|
|
36
|
-
mode = next;
|
|
37
|
-
}
|
|
38
|
-
i++;
|
|
39
|
-
} else if ((arg === '--user' || arg === '--target') && i + 1 < args.length) {
|
|
40
|
-
targetUser = args[i + 1];
|
|
41
|
-
i++;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return { mode, targetUser };
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const { mode, targetUser } = parseCliArgs();
|
|
48
|
-
|
|
49
|
-
const RPC_ENDPOINT =
|
|
50
|
-
process.env.RPC_ENDPOINT ?? 'https://api.mainnet-beta.solana.com';
|
|
51
|
-
|
|
52
|
-
const connection = new Connection(RPC_ENDPOINT);
|
|
53
|
-
const keypairPath =
|
|
54
|
-
process.env.SOLANA_KEYPAIR ??
|
|
55
|
-
path.join(os.homedir(), '.config', 'solana', 'id.json');
|
|
56
|
-
const secret = JSON.parse(fs.readFileSync(keypairPath, 'utf-8')) as number[];
|
|
57
|
-
const wallet = new Wallet(Keypair.fromSecretKey(Uint8Array.from(secret)));
|
|
58
|
-
|
|
59
|
-
const { perpMarketIndexes, spotMarketIndexes, oracleInfos } =
|
|
60
|
-
getMarketsAndOraclesForSubscription('mainnet-beta');
|
|
61
|
-
|
|
62
|
-
const accountLoader = new BulkAccountLoader(connection, 'confirmed', 60_000);
|
|
63
|
-
|
|
64
|
-
const clientConfig: VelocityClientConfig = {
|
|
65
|
-
connection,
|
|
66
|
-
wallet,
|
|
67
|
-
programID: new PublicKey(VELOCITY_PROGRAM_ID),
|
|
68
|
-
accountSubscription: {
|
|
69
|
-
type: 'polling',
|
|
70
|
-
accountLoader,
|
|
71
|
-
},
|
|
72
|
-
perpMarketIndexes,
|
|
73
|
-
spotMarketIndexes,
|
|
74
|
-
oracleInfos,
|
|
75
|
-
env: 'mainnet-beta',
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
const client = new VelocityClient(clientConfig);
|
|
79
|
-
await client.subscribe();
|
|
80
|
-
|
|
81
|
-
const userMap = new UserMap({
|
|
82
|
-
velocityClient: client,
|
|
83
|
-
subscriptionConfig: {
|
|
84
|
-
type: 'polling',
|
|
85
|
-
frequency: 60_000,
|
|
86
|
-
commitment: 'confirmed',
|
|
87
|
-
},
|
|
88
|
-
includeIdle: false,
|
|
89
|
-
syncConfig: { type: 'paginated' },
|
|
90
|
-
throwOnFailedSync: false,
|
|
91
|
-
});
|
|
92
|
-
await userMap.subscribe();
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const flaggedUsers: Array<{
|
|
96
|
-
userPubkey: string;
|
|
97
|
-
authority: string;
|
|
98
|
-
flags: Array<{ marketIndex: number; flag: number; isolatedPositionScaledBalance: BN }>;
|
|
99
|
-
}> = [];
|
|
100
|
-
|
|
101
|
-
console.log(`User map size: ${Array.from(userMap.entries()).length}`);
|
|
102
|
-
|
|
103
|
-
for (const [userPubkey, user] of userMap.entries()) {
|
|
104
|
-
const userAccount = user.getUserAccount();
|
|
105
|
-
const flaggedPositions = userAccount.perpPositions
|
|
106
|
-
.filter((p) => p.positionFlag >= 1 || p.isolatedPositionScaledBalance.toString() !== '0')
|
|
107
|
-
.map((p) => ({ marketIndex: p.marketIndex, flag: p.positionFlag, isolatedPositionScaledBalance: p.isolatedPositionScaledBalance, fullPosition: p }));
|
|
108
|
-
|
|
109
|
-
if (flaggedPositions.length > 0) {
|
|
110
|
-
if(mode === 'one' && userPubkey === targetUser) {
|
|
111
|
-
console.log(`flagged positions on user ${userPubkey}`);
|
|
112
|
-
console.log(flaggedPositions.map((p) => `mkt=${p.marketIndex}, flag=${p.flag}, isolatedPositionScaledBalance=${p.isolatedPositionScaledBalance.toString()}, fullPosition=${fullLogPerpPosition(p.fullPosition)}`).join('\n\n; '));
|
|
113
|
-
}
|
|
114
|
-
flaggedUsers.push({
|
|
115
|
-
userPubkey,
|
|
116
|
-
authority: userAccount.authority.toBase58(),
|
|
117
|
-
flags: flaggedPositions,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Mode 1: list flagged users (default)
|
|
123
|
-
if (mode === 'list') {
|
|
124
|
-
console.log(`Flagged users (positionFlag >= 1 || isolatedPositionScaledBalance > 0): ${flaggedUsers.length}`);
|
|
125
|
-
for (const u of flaggedUsers) {
|
|
126
|
-
const flagsStr = u.flags
|
|
127
|
-
.map((f) => `mkt=${f.marketIndex}, flag=${f.flag}, isolatedPositionScaledBalance=${f.isolatedPositionScaledBalance.toString()}`)
|
|
128
|
-
.join('; ');
|
|
129
|
-
console.log(
|
|
130
|
-
`- authority=${u.authority} userAccount=${u.userPubkey} -> [${flagsStr}]`
|
|
131
|
-
);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// Helper to invoke updateUserIdle
|
|
136
|
-
async function updateUserIdleFor(userAccountPubkeyStr: string): Promise<TransactionSignature | undefined> {
|
|
137
|
-
const userObj = userMap.get(userAccountPubkeyStr);
|
|
138
|
-
if (!userObj) {
|
|
139
|
-
console.warn(`User ${userAccountPubkeyStr} not found in userMap`);
|
|
140
|
-
return undefined;
|
|
141
|
-
}
|
|
142
|
-
try {
|
|
143
|
-
const sig = await client.updateUserIdle(
|
|
144
|
-
new PublicKey(userAccountPubkeyStr),
|
|
145
|
-
userObj.getUserAccount()
|
|
146
|
-
);
|
|
147
|
-
console.log(`updateUserIdle sent for userAccount=${userAccountPubkeyStr} -> tx=${sig}`);
|
|
148
|
-
return sig;
|
|
149
|
-
} catch (e) {
|
|
150
|
-
console.error(`Failed updateUserIdle for userAccount=${userAccountPubkeyStr}`, e);
|
|
151
|
-
return undefined;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// Mode 2: updateUserIdle on a single flagged user
|
|
156
|
-
if (mode === 'one') {
|
|
157
|
-
if (flaggedUsers.length === 0) {
|
|
158
|
-
console.log('No flagged users to update.');
|
|
159
|
-
} else {
|
|
160
|
-
const chosen =
|
|
161
|
-
(targetUser && flaggedUsers.find((u) => u.userPubkey === targetUser)) ||
|
|
162
|
-
flaggedUsers[0];
|
|
163
|
-
console.log(
|
|
164
|
-
`Updating single flagged userAccount=${chosen.userPubkey} authority=${chosen.authority}`
|
|
165
|
-
);
|
|
166
|
-
await updateUserIdleFor(chosen.userPubkey);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// Mode 3: updateUserIdle on all flagged users
|
|
171
|
-
if (mode === 'all') {
|
|
172
|
-
if (flaggedUsers.length === 0) {
|
|
173
|
-
console.log('No flagged users to update.');
|
|
174
|
-
} else {
|
|
175
|
-
console.log(`Updating all ${flaggedUsers.length} flagged users...`);
|
|
176
|
-
for (const u of flaggedUsers) {
|
|
177
|
-
await updateUserIdleFor(u.userPubkey);
|
|
178
|
-
}
|
|
179
|
-
console.log('Finished updating all flagged users.');
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
await userMap.unsubscribe();
|
|
184
|
-
await client.unsubscribe();
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
main().catch((e) => {
|
|
188
|
-
console.error(e);
|
|
189
|
-
process.exit(1);
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
function fullLogPerpPosition(position: PerpPosition) {
|
|
194
|
-
|
|
195
|
-
return `
|
|
196
|
-
[PERP POSITION]
|
|
197
|
-
baseAssetAmount=${position.baseAssetAmount.toString()}
|
|
198
|
-
quoteAssetAmount=${position.quoteAssetAmount.toString()}
|
|
199
|
-
quoteBreakEvenAmount=${position.quoteBreakEvenAmount.toString()}
|
|
200
|
-
quoteEntryAmount=${position.quoteEntryAmount.toString()}
|
|
201
|
-
openBids=${position.openBids.toString()}
|
|
202
|
-
openAsks=${position.openAsks.toString()}
|
|
203
|
-
settledPnl=${position.settledPnl.toString()}
|
|
204
|
-
remainderBaseAssetAmount=${position.remainderBaseAssetAmount}
|
|
205
|
-
maxMarginRatio=${position.maxMarginRatio}
|
|
206
|
-
marketIndex=${position.marketIndex}
|
|
207
|
-
openOrders=${position.openOrders}
|
|
208
|
-
positionFlag=${position.positionFlag}
|
|
209
|
-
isolatedPositionScaledBalance=${position.isolatedPositionScaledBalance.toString()}
|
|
210
|
-
`;
|
|
211
|
-
|
|
212
|
-
}
|
|
213
|
-
|