@velocity-exchange/sdk 0.1.0 → 0.2.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/CHANGELOG.md +15 -0
- package/bun.lock +23 -1
- package/lib/browser/accounts/basicUserAccountSubscriber.d.ts +5 -3
- package/lib/browser/accounts/basicUserAccountSubscriber.js +4 -3
- package/lib/browser/accounts/basicUserStatsAccountSubscriber.d.ts +5 -3
- package/lib/browser/accounts/basicUserStatsAccountSubscriber.js +4 -3
- package/lib/browser/accounts/bulkAccountLoader.d.ts +5 -5
- package/lib/browser/accounts/bulkAccountLoader.js +12 -1
- package/lib/browser/accounts/grpcAccountSubscriber.d.ts +2 -1
- package/lib/browser/accounts/grpcAccountSubscriber.js +8 -2
- package/lib/browser/accounts/grpcMultiAccountSubscriber.d.ts +3 -2
- package/lib/browser/accounts/grpcMultiAccountSubscriber.js +13 -5
- package/lib/browser/accounts/grpcMultiUserAccountSubscriber.d.ts +2 -1
- package/lib/browser/accounts/grpcMultiUserAccountSubscriber.js +12 -8
- package/lib/browser/accounts/grpcProgramAccountSubscriber.d.ts +2 -1
- package/lib/browser/accounts/grpcProgramAccountSubscriber.js +8 -2
- package/lib/browser/accounts/grpcVelocityClientAccountSubscriber.js +18 -3
- package/lib/browser/accounts/grpcVelocityClientAccountSubscriberV2.d.ts +1 -1
- package/lib/browser/accounts/grpcVelocityClientAccountSubscriberV2.js +40 -17
- package/lib/browser/accounts/laserProgramAccountSubscriber.js +3 -0
- package/lib/browser/accounts/oneShotUserAccountSubscriber.js +4 -3
- package/lib/browser/accounts/oneShotUserStatsAccountSubscriber.js +7 -3
- package/lib/browser/accounts/pollingInsuranceFundStakeAccountSubscriber.d.ts +4 -2
- package/lib/browser/accounts/pollingInsuranceFundStakeAccountSubscriber.js +3 -3
- package/lib/browser/accounts/pollingOracleAccountSubscriber.d.ts +0 -2
- package/lib/browser/accounts/pollingOracleAccountSubscriber.js +16 -5
- package/lib/browser/accounts/pollingTokenAccountSubscriber.d.ts +0 -2
- package/lib/browser/accounts/pollingTokenAccountSubscriber.js +16 -5
- package/lib/browser/accounts/pollingUserAccountSubscriber.d.ts +8 -4
- package/lib/browser/accounts/pollingUserAccountSubscriber.js +17 -11
- package/lib/browser/accounts/pollingUserStatsAccountSubscriber.d.ts +4 -2
- package/lib/browser/accounts/pollingUserStatsAccountSubscriber.js +6 -6
- package/lib/browser/accounts/pollingVelocityClientAccountSubscriber.d.ts +7 -1
- package/lib/browser/accounts/pollingVelocityClientAccountSubscriber.js +64 -28
- package/lib/browser/accounts/types.d.ts +4 -4
- package/lib/browser/accounts/utils.d.ts +1 -0
- package/lib/browser/accounts/utils.js +8 -1
- package/lib/browser/accounts/webSocketAccountSubscriber.d.ts +4 -2
- package/lib/browser/accounts/webSocketAccountSubscriber.js +17 -5
- package/lib/browser/accounts/webSocketAccountSubscriberV2.d.ts +4 -2
- package/lib/browser/accounts/webSocketAccountSubscriberV2.js +17 -6
- package/lib/browser/accounts/webSocketInsuranceFundStakeAccountSubscriber.d.ts +4 -2
- package/lib/browser/accounts/webSocketInsuranceFundStakeAccountSubscriber.js +9 -0
- package/lib/browser/accounts/webSocketProgramAccountSubscriber.d.ts +3 -1
- package/lib/browser/accounts/webSocketProgramAccountSubscriber.js +14 -3
- package/lib/browser/accounts/webSocketProgramAccountSubscriberV2.d.ts +3 -1
- package/lib/browser/accounts/webSocketProgramAccountSubscriberV2.js +15 -3
- package/lib/browser/accounts/webSocketProgramAccountsSubscriberV2.d.ts +3 -1
- package/lib/browser/accounts/webSocketProgramAccountsSubscriberV2.js +14 -4
- package/lib/browser/accounts/webSocketUserAccountSubscriber.d.ts +4 -2
- package/lib/browser/accounts/webSocketUserAccountSubscriber.js +9 -0
- package/lib/browser/accounts/webSocketUserStatsAccountSubsriber.d.ts +4 -2
- package/lib/browser/accounts/webSocketUserStatsAccountSubsriber.js +9 -0
- package/lib/browser/accounts/webSocketVelocityClientAccountSubscriber.d.ts +4 -4
- package/lib/browser/accounts/webSocketVelocityClientAccountSubscriber.js +48 -20
- package/lib/browser/accounts/webSocketVelocityClientAccountSubscriberV2.d.ts +7 -3
- package/lib/browser/accounts/webSocketVelocityClientAccountSubscriberV2.js +45 -14
- package/lib/browser/accounts/websocketProgramUserAccountSubscriber.d.ts +1 -1
- package/lib/browser/accounts/websocketProgramUserAccountSubscriber.js +0 -3
- package/lib/browser/addresses/marketAddresses.js +3 -2
- package/lib/browser/addresses/pda.d.ts +0 -2
- package/lib/browser/addresses/pda.js +1 -14
- package/lib/browser/adminClient.d.ts +24 -28
- package/lib/browser/adminClient.js +156 -157
- package/lib/browser/auctionSubscriber/auctionSubscriber.d.ts +1 -1
- package/lib/browser/auctionSubscriber/auctionSubscriber.js +6 -4
- package/lib/browser/auctionSubscriber/auctionSubscriberGrpc.d.ts +1 -1
- package/lib/browser/auctionSubscriber/auctionSubscriberGrpc.js +9 -4
- package/lib/browser/bankrun/bankrunConnection.d.ts +6 -4
- package/lib/browser/bankrun/bankrunConnection.js +69 -31
- package/lib/browser/blockhashSubscriber/BlockhashSubscriber.d.ts +1 -1
- package/lib/browser/blockhashSubscriber/BlockhashSubscriber.js +3 -2
- package/lib/browser/clock/clockSubscriber.d.ts +6 -6
- package/lib/browser/clock/clockSubscriber.js +4 -3
- package/lib/browser/config.d.ts +1 -1
- package/lib/browser/config.js +8 -4
- package/lib/browser/constants/index.d.ts +1 -2
- package/lib/browser/constants/index.js +1 -2
- package/lib/browser/constants/numericConstants.d.ts +1 -3
- package/lib/browser/constants/numericConstants.js +3 -5
- package/lib/browser/constituentMap/constituentMap.js +5 -1
- package/lib/browser/constituentMap/pollingConstituentAccountSubscriber.js +3 -2
- package/lib/browser/constituentMap/webSocketConstituentAccountSubscriber.d.ts +2 -3
- package/lib/browser/constituentMap/webSocketConstituentAccountSubscriber.js +10 -3
- package/lib/browser/core/instructions/perpOrders.d.ts +14 -0
- package/lib/browser/core/instructions/perpOrders.js +14 -0
- package/lib/browser/core/remainingAccounts.d.ts +2 -2
- package/lib/browser/core/remainingAccounts.js +2 -2
- package/lib/browser/decode/user.js +9 -1
- package/lib/browser/dlob/DLOB.d.ts +6 -1
- package/lib/browser/dlob/DLOB.js +201 -138
- package/lib/browser/dlob/DLOBNode.d.ts +5 -2
- package/lib/browser/dlob/DLOBNode.js +7 -0
- package/lib/browser/dlob/DLOBSubscriber.js +37 -32
- package/lib/browser/dlob/NodeList.js +8 -7
- package/lib/browser/dlob/orderBookLevels.js +19 -12
- package/lib/browser/events/eventList.js +4 -1
- package/lib/browser/events/eventSubscriber.d.ts +5 -2
- package/lib/browser/events/eventSubscriber.js +75 -26
- package/lib/browser/events/eventsServerLogProvider.d.ts +1 -1
- package/lib/browser/events/eventsServerLogProvider.js +15 -8
- package/lib/browser/events/fetchLogs.d.ts +1 -1
- package/lib/browser/events/fetchLogs.js +4 -2
- package/lib/browser/events/pollingLogProvider.d.ts +1 -1
- package/lib/browser/events/pollingLogProvider.js +1 -0
- package/lib/browser/events/txEventCache.js +6 -2
- package/lib/browser/events/types.d.ts +2 -4
- package/lib/browser/events/types.js +0 -2
- package/lib/browser/events/webSocketLogProvider.d.ts +1 -1
- package/lib/browser/events/webSocketLogProvider.js +5 -2
- package/lib/browser/factory/bigNum.js +1 -1
- package/lib/browser/idl/velocity.d.ts +1243 -1586
- package/lib/browser/idl/velocity.json +1234 -1577
- package/lib/browser/index.d.ts +0 -2
- package/lib/browser/index.js +0 -2
- package/lib/browser/jupiter/jupiterClient.d.ts +1 -1
- package/lib/browser/jupiter/jupiterClient.js +18 -8
- package/lib/browser/marginCalculation.js +1 -0
- package/lib/browser/math/amm.d.ts +31 -13
- package/lib/browser/math/amm.js +77 -22
- package/lib/browser/math/bankruptcy.js +1 -1
- package/lib/browser/math/funding.js +6 -6
- package/lib/browser/math/insurance.d.ts +1 -1
- package/lib/browser/math/insurance.js +4 -5
- package/lib/browser/math/margin.d.ts +1 -9
- package/lib/browser/math/margin.js +3 -62
- package/lib/browser/math/market.d.ts +4 -12
- package/lib/browser/math/market.js +6 -40
- package/lib/browser/math/oracles.d.ts +0 -3
- package/lib/browser/math/oracles.js +1 -14
- package/lib/browser/math/orders.d.ts +0 -5
- package/lib/browser/math/orders.js +2 -74
- package/lib/browser/math/position.d.ts +0 -4
- package/lib/browser/math/position.js +5 -10
- package/lib/browser/math/repeg.d.ts +0 -1
- package/lib/browser/math/repeg.js +1 -23
- package/lib/browser/math/spotBalance.d.ts +4 -4
- package/lib/browser/math/spotBalance.js +6 -6
- package/lib/browser/math/spotMarket.d.ts +0 -6
- package/lib/browser/math/spotMarket.js +1 -16
- package/lib/browser/math/spotPosition.d.ts +4 -4
- package/lib/browser/math/state.d.ts +0 -2
- package/lib/browser/math/state.js +1 -9
- package/lib/browser/math/superStake.d.ts +3 -53
- package/lib/browser/math/superStake.js +16 -13
- package/lib/browser/math/trade.js +6 -6
- package/lib/browser/memcmp.d.ts +0 -1
- package/lib/browser/memcmp.js +1 -10
- package/lib/browser/oracles/prelaunchOracleClient.js +3 -2
- package/lib/browser/oracles/pythClient.js +9 -3
- package/lib/browser/oracles/pythLazerClient.js +3 -2
- package/lib/browser/oracles/utils.d.ts +4 -0
- package/lib/browser/oracles/utils.js +9 -1
- package/lib/browser/orderSubscriber/OrderSubscriber.d.ts +1 -1
- package/lib/browser/orderSubscriber/OrderSubscriber.js +8 -2
- package/lib/browser/priorityFee/heliusPriorityFeeMethod.d.ts +1 -1
- package/lib/browser/priorityFee/priorityFeeSubscriber.d.ts +1 -1
- package/lib/browser/priorityFee/priorityFeeSubscriber.js +32 -8
- package/lib/browser/priorityFee/solanaPriorityFeeMethod.d.ts +1 -1
- package/lib/browser/pyth/types.d.ts +0 -1
- package/lib/browser/slot/SlotSubscriber.d.ts +1 -1
- package/lib/browser/slot/SlotSubscriber.js +2 -1
- package/lib/browser/slot/SlothashSubscriber.d.ts +3 -2
- package/lib/browser/slot/SlothashSubscriber.js +11 -4
- package/lib/browser/swift/grpcSignedMsgUserAccountSubscriber.d.ts +0 -3
- package/lib/browser/swift/grpcSignedMsgUserAccountSubscriber.js +5 -5
- package/lib/browser/swift/signedMsgUserAccountSubscriber.d.ts +3 -2
- package/lib/browser/swift/signedMsgUserAccountSubscriber.js +13 -5
- package/lib/browser/swift/swiftOrderSubscriber.d.ts +1 -1
- package/lib/browser/swift/swiftOrderSubscriber.js +10 -5
- package/lib/browser/testClient.js +3 -2
- package/lib/browser/tokenFaucet.js +16 -2
- package/lib/browser/tx/baseTxSender.d.ts +4 -4
- package/lib/browser/tx/baseTxSender.js +5 -4
- package/lib/browser/tx/fastSingleTxSender.d.ts +3 -3
- package/lib/browser/tx/fastSingleTxSender.js +9 -5
- package/lib/browser/tx/reportTransactionError.d.ts +2 -2
- package/lib/browser/tx/reportTransactionError.js +5 -1
- package/lib/browser/tx/retryTxSender.d.ts +1 -1
- package/lib/browser/tx/retryTxSender.js +4 -2
- package/lib/browser/tx/txHandler.d.ts +7 -1
- package/lib/browser/tx/txHandler.js +54 -40
- package/lib/browser/tx/txParamProcessor.d.ts +4 -1
- package/lib/browser/tx/txParamProcessor.js +6 -0
- package/lib/browser/tx/types.d.ts +1 -1
- package/lib/browser/tx/whileValidTxSender.d.ts +1 -6
- package/lib/browser/tx/whileValidTxSender.js +35 -13
- package/lib/browser/types.d.ts +27 -70
- package/lib/browser/types.js +2 -2
- package/lib/browser/user.d.ts +21 -7
- package/lib/browser/user.js +156 -132
- package/lib/browser/userMap/WebsocketSubscription.d.ts +1 -1
- package/lib/browser/userMap/grpcSubscription.d.ts +1 -1
- package/lib/browser/userMap/referrerMap.js +10 -3
- package/lib/browser/userMap/revenueShareEscrowMap.js +4 -0
- package/lib/browser/userMap/userMap.d.ts +1 -1
- package/lib/browser/userMap/userMap.js +36 -23
- package/lib/browser/userMap/userStatsMap.d.ts +1 -1
- package/lib/browser/userMap/userStatsMap.js +18 -13
- package/lib/browser/userStats.d.ts +7 -2
- package/lib/browser/userStats.js +18 -4
- package/lib/browser/util/TransactionConfirmationManager.js +4 -2
- package/lib/browser/util/chainClock.d.ts +1 -1
- package/lib/browser/util/computeUnits.d.ts +1 -1
- package/lib/browser/util/computeUnits.js +6 -1
- package/lib/browser/velocityClient.d.ts +92 -34
- package/lib/browser/velocityClient.js +414 -280
- package/lib/node/accounts/basicUserAccountSubscriber.d.ts +5 -3
- package/lib/node/accounts/basicUserAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/basicUserAccountSubscriber.js +4 -3
- package/lib/node/accounts/basicUserStatsAccountSubscriber.d.ts +5 -3
- package/lib/node/accounts/basicUserStatsAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/basicUserStatsAccountSubscriber.js +4 -3
- package/lib/node/accounts/bulkAccountLoader.d.ts +5 -5
- package/lib/node/accounts/bulkAccountLoader.d.ts.map +1 -1
- package/lib/node/accounts/bulkAccountLoader.js +12 -1
- package/lib/node/accounts/grpcAccountSubscriber.d.ts +2 -1
- package/lib/node/accounts/grpcAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/grpcAccountSubscriber.js +8 -2
- package/lib/node/accounts/grpcMultiAccountSubscriber.d.ts +3 -2
- package/lib/node/accounts/grpcMultiAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/grpcMultiAccountSubscriber.js +13 -5
- package/lib/node/accounts/grpcMultiUserAccountSubscriber.d.ts +2 -1
- package/lib/node/accounts/grpcMultiUserAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/grpcMultiUserAccountSubscriber.js +12 -8
- package/lib/node/accounts/grpcProgramAccountSubscriber.d.ts +2 -1
- package/lib/node/accounts/grpcProgramAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/grpcProgramAccountSubscriber.js +8 -2
- package/lib/node/accounts/grpcVelocityClientAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/grpcVelocityClientAccountSubscriber.js +18 -3
- package/lib/node/accounts/grpcVelocityClientAccountSubscriberV2.d.ts +1 -1
- package/lib/node/accounts/grpcVelocityClientAccountSubscriberV2.d.ts.map +1 -1
- package/lib/node/accounts/grpcVelocityClientAccountSubscriberV2.js +40 -17
- package/lib/node/accounts/laserProgramAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/laserProgramAccountSubscriber.js +3 -0
- package/lib/node/accounts/oneShotUserAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/oneShotUserAccountSubscriber.js +4 -3
- package/lib/node/accounts/oneShotUserStatsAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/oneShotUserStatsAccountSubscriber.js +7 -3
- package/lib/node/accounts/pollingInsuranceFundStakeAccountSubscriber.d.ts +4 -2
- package/lib/node/accounts/pollingInsuranceFundStakeAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/pollingInsuranceFundStakeAccountSubscriber.js +3 -3
- package/lib/node/accounts/pollingOracleAccountSubscriber.d.ts +0 -2
- package/lib/node/accounts/pollingOracleAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/pollingOracleAccountSubscriber.js +16 -5
- package/lib/node/accounts/pollingTokenAccountSubscriber.d.ts +0 -2
- package/lib/node/accounts/pollingTokenAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/pollingTokenAccountSubscriber.js +16 -5
- package/lib/node/accounts/pollingUserAccountSubscriber.d.ts +8 -4
- package/lib/node/accounts/pollingUserAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/pollingUserAccountSubscriber.js +17 -11
- package/lib/node/accounts/pollingUserStatsAccountSubscriber.d.ts +4 -2
- package/lib/node/accounts/pollingUserStatsAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/pollingUserStatsAccountSubscriber.js +6 -6
- package/lib/node/accounts/pollingVelocityClientAccountSubscriber.d.ts +7 -1
- package/lib/node/accounts/pollingVelocityClientAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/pollingVelocityClientAccountSubscriber.js +64 -28
- package/lib/node/accounts/types.d.ts +4 -4
- package/lib/node/accounts/types.d.ts.map +1 -1
- package/lib/node/accounts/utils.d.ts +1 -0
- package/lib/node/accounts/utils.d.ts.map +1 -1
- package/lib/node/accounts/utils.js +8 -1
- package/lib/node/accounts/webSocketAccountSubscriber.d.ts +4 -2
- package/lib/node/accounts/webSocketAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/webSocketAccountSubscriber.js +17 -5
- package/lib/node/accounts/webSocketAccountSubscriberV2.d.ts +4 -2
- package/lib/node/accounts/webSocketAccountSubscriberV2.d.ts.map +1 -1
- package/lib/node/accounts/webSocketAccountSubscriberV2.js +17 -6
- package/lib/node/accounts/webSocketInsuranceFundStakeAccountSubscriber.d.ts +4 -2
- package/lib/node/accounts/webSocketInsuranceFundStakeAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/webSocketInsuranceFundStakeAccountSubscriber.js +9 -0
- package/lib/node/accounts/webSocketProgramAccountSubscriber.d.ts +3 -1
- package/lib/node/accounts/webSocketProgramAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/webSocketProgramAccountSubscriber.js +14 -3
- package/lib/node/accounts/webSocketProgramAccountSubscriberV2.d.ts +3 -1
- package/lib/node/accounts/webSocketProgramAccountSubscriberV2.d.ts.map +1 -1
- package/lib/node/accounts/webSocketProgramAccountSubscriberV2.js +15 -3
- package/lib/node/accounts/webSocketProgramAccountsSubscriberV2.d.ts +3 -1
- package/lib/node/accounts/webSocketProgramAccountsSubscriberV2.d.ts.map +1 -1
- package/lib/node/accounts/webSocketProgramAccountsSubscriberV2.js +14 -4
- package/lib/node/accounts/webSocketUserAccountSubscriber.d.ts +4 -2
- package/lib/node/accounts/webSocketUserAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/webSocketUserAccountSubscriber.js +9 -0
- package/lib/node/accounts/webSocketUserStatsAccountSubsriber.d.ts +4 -2
- package/lib/node/accounts/webSocketUserStatsAccountSubsriber.d.ts.map +1 -1
- package/lib/node/accounts/webSocketUserStatsAccountSubsriber.js +9 -0
- package/lib/node/accounts/webSocketVelocityClientAccountSubscriber.d.ts +4 -4
- package/lib/node/accounts/webSocketVelocityClientAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/webSocketVelocityClientAccountSubscriber.js +48 -20
- package/lib/node/accounts/webSocketVelocityClientAccountSubscriberV2.d.ts +7 -3
- package/lib/node/accounts/webSocketVelocityClientAccountSubscriberV2.d.ts.map +1 -1
- package/lib/node/accounts/webSocketVelocityClientAccountSubscriberV2.js +45 -14
- package/lib/node/accounts/websocketProgramUserAccountSubscriber.d.ts +1 -1
- package/lib/node/accounts/websocketProgramUserAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/websocketProgramUserAccountSubscriber.js +0 -3
- package/lib/node/addresses/marketAddresses.d.ts.map +1 -1
- package/lib/node/addresses/marketAddresses.js +3 -2
- package/lib/node/addresses/pda.d.ts +0 -2
- package/lib/node/addresses/pda.d.ts.map +1 -1
- package/lib/node/addresses/pda.js +1 -14
- package/lib/node/adminClient.d.ts +24 -28
- package/lib/node/adminClient.d.ts.map +1 -1
- package/lib/node/adminClient.js +156 -157
- package/lib/node/auctionSubscriber/auctionSubscriber.d.ts +1 -1
- package/lib/node/auctionSubscriber/auctionSubscriber.d.ts.map +1 -1
- package/lib/node/auctionSubscriber/auctionSubscriber.js +6 -4
- package/lib/node/auctionSubscriber/auctionSubscriberGrpc.d.ts +1 -1
- package/lib/node/auctionSubscriber/auctionSubscriberGrpc.d.ts.map +1 -1
- package/lib/node/auctionSubscriber/auctionSubscriberGrpc.js +9 -4
- package/lib/node/bankrun/bankrunConnection.d.ts +6 -4
- package/lib/node/bankrun/bankrunConnection.d.ts.map +1 -1
- package/lib/node/bankrun/bankrunConnection.js +69 -31
- package/lib/node/blockhashSubscriber/BlockhashSubscriber.d.ts +1 -1
- package/lib/node/blockhashSubscriber/BlockhashSubscriber.d.ts.map +1 -1
- package/lib/node/blockhashSubscriber/BlockhashSubscriber.js +3 -2
- package/lib/node/clock/clockSubscriber.d.ts +6 -6
- package/lib/node/clock/clockSubscriber.d.ts.map +1 -1
- package/lib/node/clock/clockSubscriber.js +4 -3
- package/lib/node/config.d.ts +1 -1
- package/lib/node/config.d.ts.map +1 -1
- package/lib/node/config.js +8 -4
- package/lib/node/constants/index.d.ts +1 -2
- package/lib/node/constants/index.d.ts.map +1 -1
- package/lib/node/constants/index.js +1 -2
- package/lib/node/constants/numericConstants.d.ts +1 -3
- package/lib/node/constants/numericConstants.d.ts.map +1 -1
- package/lib/node/constants/numericConstants.js +3 -5
- package/lib/node/constituentMap/constituentMap.d.ts.map +1 -1
- package/lib/node/constituentMap/constituentMap.js +5 -1
- package/lib/node/constituentMap/pollingConstituentAccountSubscriber.d.ts.map +1 -1
- package/lib/node/constituentMap/pollingConstituentAccountSubscriber.js +3 -2
- package/lib/node/constituentMap/webSocketConstituentAccountSubscriber.d.ts +2 -3
- package/lib/node/constituentMap/webSocketConstituentAccountSubscriber.d.ts.map +1 -1
- package/lib/node/constituentMap/webSocketConstituentAccountSubscriber.js +10 -3
- package/lib/node/core/instructions/perpOrders.d.ts +14 -0
- package/lib/node/core/instructions/perpOrders.d.ts.map +1 -1
- package/lib/node/core/instructions/perpOrders.js +14 -0
- package/lib/node/core/remainingAccounts.d.ts +2 -2
- package/lib/node/core/remainingAccounts.d.ts.map +1 -1
- package/lib/node/core/remainingAccounts.js +2 -2
- package/lib/node/decode/user.d.ts.map +1 -1
- package/lib/node/decode/user.js +9 -1
- package/lib/node/dlob/DLOB.d.ts +6 -1
- package/lib/node/dlob/DLOB.d.ts.map +1 -1
- package/lib/node/dlob/DLOB.js +201 -138
- package/lib/node/dlob/DLOBNode.d.ts +5 -2
- package/lib/node/dlob/DLOBNode.d.ts.map +1 -1
- package/lib/node/dlob/DLOBNode.js +7 -0
- package/lib/node/dlob/DLOBSubscriber.d.ts.map +1 -1
- package/lib/node/dlob/DLOBSubscriber.js +37 -32
- package/lib/node/dlob/NodeList.d.ts.map +1 -1
- package/lib/node/dlob/NodeList.js +8 -7
- package/lib/node/dlob/orderBookLevels.d.ts.map +1 -1
- package/lib/node/dlob/orderBookLevels.js +19 -12
- package/lib/node/events/eventList.d.ts +3 -3
- package/lib/node/events/eventList.d.ts.map +1 -1
- package/lib/node/events/eventList.js +4 -1
- package/lib/node/events/eventSubscriber.d.ts +5 -2
- package/lib/node/events/eventSubscriber.d.ts.map +1 -1
- package/lib/node/events/eventSubscriber.js +75 -26
- package/lib/node/events/eventsServerLogProvider.d.ts +2 -2
- package/lib/node/events/eventsServerLogProvider.d.ts.map +1 -1
- package/lib/node/events/eventsServerLogProvider.js +15 -8
- package/lib/node/events/fetchLogs.d.ts +1 -1
- package/lib/node/events/fetchLogs.d.ts.map +1 -1
- package/lib/node/events/fetchLogs.js +4 -2
- package/lib/node/events/pollingLogProvider.d.ts +2 -2
- package/lib/node/events/pollingLogProvider.d.ts.map +1 -1
- package/lib/node/events/pollingLogProvider.js +1 -0
- package/lib/node/events/txEventCache.d.ts +3 -3
- package/lib/node/events/txEventCache.d.ts.map +1 -1
- package/lib/node/events/txEventCache.js +6 -2
- package/lib/node/events/types.d.ts +2 -4
- package/lib/node/events/types.d.ts.map +1 -1
- package/lib/node/events/types.js +0 -2
- package/lib/node/events/webSocketLogProvider.d.ts +2 -2
- package/lib/node/events/webSocketLogProvider.d.ts.map +1 -1
- package/lib/node/events/webSocketLogProvider.js +5 -2
- package/lib/node/factory/bigNum.js +1 -1
- package/lib/node/idl/velocity.d.ts +1243 -1586
- package/lib/node/idl/velocity.d.ts.map +1 -1
- package/lib/node/idl/velocity.json +1234 -1577
- package/lib/node/index.d.ts +0 -2
- package/lib/node/index.d.ts.map +1 -1
- package/lib/node/index.js +0 -2
- package/lib/node/jupiter/jupiterClient.d.ts +1 -1
- package/lib/node/jupiter/jupiterClient.d.ts.map +1 -1
- package/lib/node/jupiter/jupiterClient.js +18 -8
- package/lib/node/marginCalculation.d.ts.map +1 -1
- package/lib/node/marginCalculation.js +1 -0
- package/lib/node/math/amm.d.ts +31 -13
- package/lib/node/math/amm.d.ts.map +1 -1
- package/lib/node/math/amm.js +77 -22
- package/lib/node/math/bankruptcy.js +1 -1
- package/lib/node/math/funding.d.ts.map +1 -1
- package/lib/node/math/funding.js +6 -6
- package/lib/node/math/insurance.d.ts +1 -1
- package/lib/node/math/insurance.d.ts.map +1 -1
- package/lib/node/math/insurance.js +4 -5
- package/lib/node/math/margin.d.ts +1 -9
- package/lib/node/math/margin.d.ts.map +1 -1
- package/lib/node/math/margin.js +3 -62
- package/lib/node/math/market.d.ts +4 -12
- package/lib/node/math/market.d.ts.map +1 -1
- package/lib/node/math/market.js +6 -40
- package/lib/node/math/oracles.d.ts +0 -3
- package/lib/node/math/oracles.d.ts.map +1 -1
- package/lib/node/math/oracles.js +1 -14
- package/lib/node/math/orders.d.ts +0 -5
- package/lib/node/math/orders.d.ts.map +1 -1
- package/lib/node/math/orders.js +2 -74
- package/lib/node/math/position.d.ts +1 -5
- package/lib/node/math/position.d.ts.map +1 -1
- package/lib/node/math/position.js +5 -10
- package/lib/node/math/repeg.d.ts +0 -1
- package/lib/node/math/repeg.d.ts.map +1 -1
- package/lib/node/math/repeg.js +1 -23
- package/lib/node/math/spotBalance.d.ts +4 -4
- package/lib/node/math/spotBalance.d.ts.map +1 -1
- package/lib/node/math/spotBalance.js +6 -6
- package/lib/node/math/spotMarket.d.ts +0 -6
- package/lib/node/math/spotMarket.d.ts.map +1 -1
- package/lib/node/math/spotMarket.js +1 -16
- package/lib/node/math/spotPosition.d.ts +4 -4
- package/lib/node/math/spotPosition.d.ts.map +1 -1
- package/lib/node/math/state.d.ts +0 -2
- package/lib/node/math/state.d.ts.map +1 -1
- package/lib/node/math/state.js +1 -9
- package/lib/node/math/superStake.d.ts +3 -53
- package/lib/node/math/superStake.d.ts.map +1 -1
- package/lib/node/math/superStake.js +16 -13
- package/lib/node/math/trade.d.ts +2 -2
- package/lib/node/math/trade.d.ts.map +1 -1
- package/lib/node/math/trade.js +6 -6
- package/lib/node/memcmp.d.ts +0 -1
- package/lib/node/memcmp.d.ts.map +1 -1
- package/lib/node/memcmp.js +1 -10
- package/lib/node/oracles/oracleClientCache.d.ts +1 -1
- package/lib/node/oracles/prelaunchOracleClient.d.ts.map +1 -1
- package/lib/node/oracles/prelaunchOracleClient.js +3 -2
- package/lib/node/oracles/pythClient.d.ts.map +1 -1
- package/lib/node/oracles/pythClient.js +9 -3
- package/lib/node/oracles/pythLazerClient.d.ts.map +1 -1
- package/lib/node/oracles/pythLazerClient.js +3 -2
- package/lib/node/oracles/utils.d.ts +4 -0
- package/lib/node/oracles/utils.d.ts.map +1 -1
- package/lib/node/oracles/utils.js +9 -1
- package/lib/node/orderSubscriber/OrderSubscriber.d.ts +1 -1
- package/lib/node/orderSubscriber/OrderSubscriber.d.ts.map +1 -1
- package/lib/node/orderSubscriber/OrderSubscriber.js +8 -2
- package/lib/node/priorityFee/heliusPriorityFeeMethod.d.ts +1 -1
- package/lib/node/priorityFee/heliusPriorityFeeMethod.d.ts.map +1 -1
- package/lib/node/priorityFee/priorityFeeSubscriber.d.ts +1 -1
- package/lib/node/priorityFee/priorityFeeSubscriber.d.ts.map +1 -1
- package/lib/node/priorityFee/priorityFeeSubscriber.js +32 -8
- package/lib/node/priorityFee/solanaPriorityFeeMethod.d.ts +1 -1
- package/lib/node/priorityFee/solanaPriorityFeeMethod.d.ts.map +1 -1
- package/lib/node/pyth/types.d.ts +0 -1
- package/lib/node/pyth/types.d.ts.map +1 -1
- package/lib/node/slot/SlotSubscriber.d.ts +1 -1
- package/lib/node/slot/SlotSubscriber.d.ts.map +1 -1
- package/lib/node/slot/SlotSubscriber.js +2 -1
- package/lib/node/slot/SlothashSubscriber.d.ts +3 -2
- package/lib/node/slot/SlothashSubscriber.d.ts.map +1 -1
- package/lib/node/slot/SlothashSubscriber.js +11 -4
- package/lib/node/swift/grpcSignedMsgUserAccountSubscriber.d.ts +0 -3
- package/lib/node/swift/grpcSignedMsgUserAccountSubscriber.d.ts.map +1 -1
- package/lib/node/swift/grpcSignedMsgUserAccountSubscriber.js +5 -5
- package/lib/node/swift/signedMsgUserAccountSubscriber.d.ts +3 -2
- package/lib/node/swift/signedMsgUserAccountSubscriber.d.ts.map +1 -1
- package/lib/node/swift/signedMsgUserAccountSubscriber.js +13 -5
- package/lib/node/swift/swiftOrderSubscriber.d.ts +1 -1
- package/lib/node/swift/swiftOrderSubscriber.d.ts.map +1 -1
- package/lib/node/swift/swiftOrderSubscriber.js +10 -5
- package/lib/node/testClient.js +3 -2
- package/lib/node/tokenFaucet.d.ts.map +1 -1
- package/lib/node/tokenFaucet.js +16 -2
- package/lib/node/tx/baseTxSender.d.ts +4 -4
- package/lib/node/tx/baseTxSender.d.ts.map +1 -1
- package/lib/node/tx/baseTxSender.js +5 -4
- package/lib/node/tx/fastSingleTxSender.d.ts +3 -3
- package/lib/node/tx/fastSingleTxSender.d.ts.map +1 -1
- package/lib/node/tx/fastSingleTxSender.js +9 -5
- package/lib/node/tx/reportTransactionError.d.ts +2 -2
- package/lib/node/tx/reportTransactionError.d.ts.map +1 -1
- package/lib/node/tx/reportTransactionError.js +5 -1
- package/lib/node/tx/retryTxSender.d.ts +1 -1
- package/lib/node/tx/retryTxSender.d.ts.map +1 -1
- package/lib/node/tx/retryTxSender.js +4 -2
- package/lib/node/tx/txHandler.d.ts +9 -3
- package/lib/node/tx/txHandler.d.ts.map +1 -1
- package/lib/node/tx/txHandler.js +54 -40
- package/lib/node/tx/txParamProcessor.d.ts +4 -1
- package/lib/node/tx/txParamProcessor.d.ts.map +1 -1
- package/lib/node/tx/txParamProcessor.js +6 -0
- package/lib/node/tx/types.d.ts +1 -1
- package/lib/node/tx/types.d.ts.map +1 -1
- package/lib/node/tx/whileValidTxSender.d.ts +1 -6
- package/lib/node/tx/whileValidTxSender.d.ts.map +1 -1
- package/lib/node/tx/whileValidTxSender.js +35 -13
- package/lib/node/types.d.ts +25 -68
- package/lib/node/types.d.ts.map +1 -1
- package/lib/node/types.js +2 -2
- package/lib/node/user.d.ts +21 -7
- package/lib/node/user.d.ts.map +1 -1
- package/lib/node/user.js +156 -132
- package/lib/node/userMap/WebsocketSubscription.d.ts +1 -1
- package/lib/node/userMap/WebsocketSubscription.d.ts.map +1 -1
- package/lib/node/userMap/grpcSubscription.d.ts +1 -1
- package/lib/node/userMap/grpcSubscription.d.ts.map +1 -1
- package/lib/node/userMap/referrerMap.d.ts.map +1 -1
- package/lib/node/userMap/referrerMap.js +10 -3
- package/lib/node/userMap/revenueShareEscrowMap.d.ts.map +1 -1
- package/lib/node/userMap/revenueShareEscrowMap.js +4 -0
- package/lib/node/userMap/userMap.d.ts +1 -1
- package/lib/node/userMap/userMap.d.ts.map +1 -1
- package/lib/node/userMap/userMap.js +36 -23
- package/lib/node/userMap/userStatsMap.d.ts +1 -1
- package/lib/node/userMap/userStatsMap.d.ts.map +1 -1
- package/lib/node/userMap/userStatsMap.js +18 -13
- package/lib/node/userStats.d.ts +7 -2
- package/lib/node/userStats.d.ts.map +1 -1
- package/lib/node/userStats.js +18 -4
- package/lib/node/util/TransactionConfirmationManager.d.ts.map +1 -1
- package/lib/node/util/TransactionConfirmationManager.js +4 -2
- package/lib/node/util/chainClock.d.ts +1 -1
- package/lib/node/util/chainClock.d.ts.map +1 -1
- package/lib/node/util/computeUnits.d.ts +1 -1
- package/lib/node/util/computeUnits.d.ts.map +1 -1
- package/lib/node/util/computeUnits.js +6 -1
- package/lib/node/velocityClient.d.ts +93 -35
- package/lib/node/velocityClient.d.ts.map +1 -1
- package/lib/node/velocityClient.js +414 -280
- package/package.json +5 -3
- package/src/accounts/basicUserAccountSubscriber.ts +7 -5
- package/src/accounts/basicUserStatsAccountSubscriber.ts +9 -5
- package/src/accounts/bulkAccountLoader.ts +20 -7
- package/src/accounts/grpcAccountSubscriber.ts +11 -3
- package/src/accounts/grpcMultiAccountSubscriber.ts +24 -9
- package/src/accounts/grpcMultiUserAccountSubscriber.ts +16 -12
- package/src/accounts/grpcProgramAccountSubscriber.ts +11 -3
- package/src/accounts/grpcVelocityClientAccountSubscriber.ts +17 -7
- package/src/accounts/grpcVelocityClientAccountSubscriberV2.ts +66 -39
- package/src/accounts/laserProgramAccountSubscriber.ts +3 -0
- package/src/accounts/oneShotUserAccountSubscriber.ts +5 -3
- package/src/accounts/oneShotUserStatsAccountSubscriber.ts +8 -3
- package/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +11 -5
- package/src/accounts/pollingOracleAccountSubscriber.ts +17 -10
- package/src/accounts/pollingTokenAccountSubscriber.ts +17 -10
- package/src/accounts/pollingUserAccountSubscriber.ts +26 -20
- package/src/accounts/pollingUserStatsAccountSubscriber.ts +12 -10
- package/src/accounts/pollingVelocityClientAccountSubscriber.ts +76 -30
- package/src/accounts/types.ts +6 -4
- package/src/accounts/utils.ts +10 -0
- package/src/accounts/webSocketAccountSubscriber.ts +23 -10
- package/src/accounts/webSocketAccountSubscriberV2.ts +23 -8
- package/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts +17 -2
- package/src/accounts/webSocketProgramAccountSubscriber.ts +29 -4
- package/src/accounts/webSocketProgramAccountSubscriberV2.ts +30 -4
- package/src/accounts/webSocketProgramAccountsSubscriberV2.ts +29 -4
- package/src/accounts/webSocketUserAccountSubscriber.ts +11 -2
- package/src/accounts/webSocketUserStatsAccountSubsriber.ts +15 -2
- package/src/accounts/webSocketVelocityClientAccountSubscriber.ts +76 -48
- package/src/accounts/webSocketVelocityClientAccountSubscriberV2.ts +74 -35
- package/src/accounts/websocketProgramUserAccountSubscriber.ts +1 -6
- package/src/addresses/marketAddresses.ts +3 -2
- package/src/addresses/pda.ts +0 -25
- package/src/adminClient.ts +273 -303
- package/src/auctionSubscriber/auctionSubscriber.ts +7 -5
- package/src/auctionSubscriber/auctionSubscriberGrpc.ts +12 -5
- package/src/bankrun/bankrunConnection.ts +83 -39
- package/src/blockhashSubscriber/BlockhashSubscriber.ts +5 -4
- package/src/clock/clockSubscriber.ts +10 -9
- package/src/config.ts +8 -3
- package/src/constants/index.ts +1 -2
- package/src/constants/numericConstants.ts +3 -3
- package/src/constituentMap/constituentMap.ts +8 -1
- package/src/constituentMap/pollingConstituentAccountSubscriber.ts +4 -2
- package/src/constituentMap/webSocketConstituentAccountSubscriber.ts +13 -4
- package/src/core/instructions/perpOrders.ts +14 -0
- package/src/core/remainingAccounts.ts +4 -4
- package/src/decode/user.ts +8 -1
- package/src/dlob/DLOB.ts +296 -172
- package/src/dlob/DLOBNode.ts +23 -3
- package/src/dlob/DLOBSubscriber.ts +51 -34
- package/src/dlob/NodeList.ts +8 -7
- package/src/dlob/orderBookLevels.ts +45 -25
- package/src/events/eventList.ts +4 -1
- package/src/events/eventSubscriber.ts +107 -49
- package/src/events/eventsServerLogProvider.ts +22 -13
- package/src/events/fetchLogs.ts +3 -3
- package/src/events/pollingLogProvider.ts +2 -2
- package/src/events/txEventCache.ts +8 -2
- package/src/events/types.ts +0 -8
- package/src/events/webSocketLogProvider.ts +5 -3
- package/src/factory/bigNum.ts +2 -2
- package/src/idl/velocity.json +1234 -1577
- package/src/idl/velocity.ts +1234 -1577
- package/src/index.ts +0 -2
- package/src/jupiter/jupiterClient.ts +30 -10
- package/src/marginCalculation.ts +1 -0
- package/src/math/amm.ts +188 -33
- package/src/math/bankruptcy.ts +1 -1
- package/src/math/funding.ts +7 -6
- package/src/math/insurance.ts +6 -8
- package/src/math/margin.ts +5 -112
- package/src/math/market.ts +6 -96
- package/src/math/oracles.ts +0 -17
- package/src/math/orders.ts +1 -110
- package/src/math/position.ts +4 -16
- package/src/math/repeg.ts +0 -29
- package/src/math/spotBalance.ts +14 -10
- package/src/math/spotMarket.ts +2 -28
- package/src/math/spotPosition.ts +4 -4
- package/src/math/state.ts +0 -8
- package/src/math/superStake.ts +19 -65
- package/src/math/trade.ts +2 -6
- package/src/memcmp.ts +0 -9
- package/src/oracles/prelaunchOracleClient.ts +7 -2
- package/src/oracles/pythClient.ts +12 -3
- package/src/oracles/pythLazerClient.ts +7 -2
- package/src/oracles/utils.ts +15 -0
- package/src/orderSubscriber/OrderSubscriber.ts +10 -4
- package/src/priorityFee/heliusPriorityFeeMethod.ts +1 -1
- package/src/priorityFee/priorityFeeSubscriber.ts +45 -9
- package/src/priorityFee/solanaPriorityFeeMethod.ts +1 -1
- package/src/pyth/types.ts +0 -2
- package/src/slot/SlotSubscriber.ts +3 -3
- package/src/slot/SlothashSubscriber.ts +17 -6
- package/src/swift/grpcSignedMsgUserAccountSubscriber.ts +5 -6
- package/src/swift/signedMsgUserAccountSubscriber.ts +16 -8
- package/src/swift/swiftOrderSubscriber.ts +10 -9
- package/src/testClient.ts +2 -2
- package/src/tokenFaucet.ts +22 -3
- package/src/tx/baseTxSender.ts +10 -10
- package/src/tx/fastSingleTxSender.ts +12 -8
- package/src/tx/reportTransactionError.ts +12 -7
- package/src/tx/retryTxSender.ts +6 -4
- package/src/tx/txHandler.ts +88 -43
- package/src/tx/txParamProcessor.ts +18 -3
- package/src/tx/types.ts +1 -1
- package/src/tx/whileValidTxSender.ts +51 -22
- package/src/types.ts +39 -75
- package/src/user.ts +200 -152
- package/src/userMap/WebsocketSubscription.ts +1 -1
- package/src/userMap/grpcSubscription.ts +1 -1
- package/src/userMap/referrerMap.ts +13 -9
- package/src/userMap/revenueShareEscrowMap.ts +6 -1
- package/src/userMap/userMap.ts +43 -25
- package/src/userMap/userStatsMap.ts +32 -19
- package/src/userStats.ts +21 -8
- package/src/util/TransactionConfirmationManager.ts +10 -2
- package/src/util/chainClock.ts +1 -1
- package/src/util/computeUnits.ts +7 -3
- package/src/velocityClient.ts +536 -383
- package/tests/amm/test.ts +138 -0
- package/tests/dlob/helpers.ts +6 -1
- package/tsconfig.json +1 -0
- package/lib/browser/constants/insuranceFund.d.ts +0 -5
- package/lib/browser/constants/insuranceFund.js +0 -9
- package/lib/browser/tx/forwardOnlyTxSender.d.ts +0 -37
- package/lib/browser/tx/forwardOnlyTxSender.js +0 -92
- package/lib/browser/util/tps.d.ts +0 -2
- package/lib/browser/util/tps.js +0 -16
- package/lib/node/constants/insuranceFund.d.ts +0 -6
- package/lib/node/constants/insuranceFund.d.ts.map +0 -1
- package/lib/node/constants/insuranceFund.js +0 -9
- package/lib/node/tx/forwardOnlyTxSender.d.ts +0 -38
- package/lib/node/tx/forwardOnlyTxSender.d.ts.map +0 -1
- package/lib/node/tx/forwardOnlyTxSender.js +0 -92
- package/lib/node/util/tps.d.ts +0 -3
- package/lib/node/util/tps.d.ts.map +0 -1
- package/lib/node/util/tps.js +0 -16
- package/src/constants/insuranceFund.ts +0 -8
- package/src/tx/forwardOnlyTxSender.ts +0 -145
- package/src/util/tps.ts +0 -27
package/src/user.ts
CHANGED
|
@@ -58,6 +58,7 @@ import {
|
|
|
58
58
|
UserAccountEvents,
|
|
59
59
|
UserAccountSubscriber,
|
|
60
60
|
} from './accounts/types';
|
|
61
|
+
import { assertDataAndSlot } from './accounts/utils';
|
|
61
62
|
import { BigNum } from './factory/bigNum';
|
|
62
63
|
import { BN } from './isomorphic/anchor';
|
|
63
64
|
import { calculateBaseAssetValue, calculatePositionPNL } from './math/position';
|
|
@@ -224,19 +225,47 @@ export class User {
|
|
|
224
225
|
this.isSubscribed = false;
|
|
225
226
|
}
|
|
226
227
|
|
|
227
|
-
public getUserAccount(): UserAccount {
|
|
228
|
-
return this.accountSubscriber.getUserAccountAndSlot()
|
|
228
|
+
public getUserAccount(): UserAccount | undefined {
|
|
229
|
+
return this.accountSubscriber.getUserAccountAndSlot()?.data;
|
|
229
230
|
}
|
|
230
231
|
|
|
231
|
-
|
|
232
|
+
/**
|
|
233
|
+
* Like {@link getUserAccount} but throws a named error instead of returning
|
|
234
|
+
* `undefined` when the account has not been loaded yet. Use at call sites
|
|
235
|
+
* that structurally require a loaded account.
|
|
236
|
+
*/
|
|
237
|
+
public getUserAccountOrThrow(): UserAccount {
|
|
238
|
+
const userAccount = this.getUserAccount();
|
|
239
|
+
if (!userAccount) {
|
|
240
|
+
throw new Error(
|
|
241
|
+
`User account not loaded: ${this.getUserAccountPublicKey().toString()}`
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
return userAccount;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
public async forceGetUserAccount(): Promise<UserAccount | undefined> {
|
|
232
248
|
await this.fetchAccounts();
|
|
233
|
-
|
|
249
|
+
const account = this.accountSubscriber.getUserAccountAndSlot();
|
|
250
|
+
return account?.data;
|
|
234
251
|
}
|
|
235
252
|
|
|
236
253
|
public getUserAccountAndSlot(): DataAndSlot<UserAccount> | undefined {
|
|
237
254
|
return this.accountSubscriber.getUserAccountAndSlot();
|
|
238
255
|
}
|
|
239
256
|
|
|
257
|
+
/**
|
|
258
|
+
* Like {@link getUserAccountAndSlot} but throws a named error instead of
|
|
259
|
+
* returning `undefined` when the account has not been loaded yet. Use at
|
|
260
|
+
* call sites that structurally require a loaded account.
|
|
261
|
+
*/
|
|
262
|
+
public getUserAccountAndSlotOrThrow(): DataAndSlot<UserAccount> {
|
|
263
|
+
return assertDataAndSlot(
|
|
264
|
+
this.accountSubscriber.getUserAccountAndSlot(),
|
|
265
|
+
`User account not loaded: ${this.getUserAccountPublicKey().toString()}`
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
|
|
240
269
|
public getPerpPositionForUserAccount(
|
|
241
270
|
userAccount: UserAccount,
|
|
242
271
|
marketIndex: number
|
|
@@ -252,22 +281,30 @@ export class User {
|
|
|
252
281
|
* @returns userPerpPosition
|
|
253
282
|
*/
|
|
254
283
|
public getPerpPosition(marketIndex: number): PerpPosition | undefined {
|
|
255
|
-
const userAccount = this.
|
|
284
|
+
const userAccount = this.getUserAccountOrThrow();
|
|
256
285
|
return this.getPerpPositionForUserAccount(userAccount, marketIndex);
|
|
257
286
|
}
|
|
258
287
|
|
|
259
288
|
public getPerpPositionOrEmpty(marketIndex: number): PerpPosition {
|
|
260
|
-
const userAccount = this.
|
|
289
|
+
const userAccount = this.getUserAccountOrThrow();
|
|
261
290
|
return (
|
|
262
291
|
this.getPerpPositionForUserAccount(userAccount, marketIndex) ??
|
|
263
292
|
this.getEmptyPosition(marketIndex)
|
|
264
293
|
);
|
|
265
294
|
}
|
|
266
295
|
|
|
296
|
+
public getPerpPositionOrThrow(marketIndex: number): PerpPosition {
|
|
297
|
+
const position = this.getPerpPosition(marketIndex);
|
|
298
|
+
if (!position) {
|
|
299
|
+
throw new Error(`No perp position found for market ${marketIndex}`);
|
|
300
|
+
}
|
|
301
|
+
return position;
|
|
302
|
+
}
|
|
303
|
+
|
|
267
304
|
public getPerpPositionAndSlot(
|
|
268
305
|
marketIndex: number
|
|
269
306
|
): DataAndSlot<PerpPosition | undefined> {
|
|
270
|
-
const userAccount = this.
|
|
307
|
+
const userAccount = this.getUserAccountAndSlotOrThrow();
|
|
271
308
|
const perpPosition = this.getPerpPositionForUserAccount(
|
|
272
309
|
userAccount.data,
|
|
273
310
|
marketIndex
|
|
@@ -293,14 +330,14 @@ export class User {
|
|
|
293
330
|
* @returns userSpotPosition
|
|
294
331
|
*/
|
|
295
332
|
public getSpotPosition(marketIndex: number): SpotPosition | undefined {
|
|
296
|
-
const userAccount = this.
|
|
333
|
+
const userAccount = this.getUserAccountOrThrow();
|
|
297
334
|
return this.getSpotPositionForUserAccount(userAccount, marketIndex);
|
|
298
335
|
}
|
|
299
336
|
|
|
300
337
|
public getSpotPositionAndSlot(
|
|
301
338
|
marketIndex: number
|
|
302
339
|
): DataAndSlot<SpotPosition | undefined> {
|
|
303
|
-
const userAccount = this.
|
|
340
|
+
const userAccount = this.getUserAccountAndSlotOrThrow();
|
|
304
341
|
const spotPosition = this.getSpotPositionForUserAccount(
|
|
305
342
|
userAccount.data,
|
|
306
343
|
marketIndex
|
|
@@ -334,7 +371,8 @@ export class User {
|
|
|
334
371
|
if (spotPosition === undefined) {
|
|
335
372
|
return ZERO;
|
|
336
373
|
}
|
|
337
|
-
const spotMarket =
|
|
374
|
+
const spotMarket =
|
|
375
|
+
this.velocityClient.getSpotMarketAccountOrThrow(marketIndex);
|
|
338
376
|
return getSignedTokenAmount(
|
|
339
377
|
getTokenAmount(
|
|
340
378
|
spotPosition.scaledBalance,
|
|
@@ -372,8 +410,8 @@ export class User {
|
|
|
372
410
|
const perpPosition = this.getPerpPosition(perpMarketIndex);
|
|
373
411
|
if (!perpPosition) return ZERO;
|
|
374
412
|
const perpMarket =
|
|
375
|
-
this.velocityClient.
|
|
376
|
-
const spotMarket = this.velocityClient.
|
|
413
|
+
this.velocityClient.getPerpMarketAccountOrThrow(perpMarketIndex);
|
|
414
|
+
const spotMarket = this.velocityClient.getSpotMarketAccountOrThrow(
|
|
377
415
|
perpMarket.quoteSpotMarketIndex
|
|
378
416
|
);
|
|
379
417
|
if (perpPosition === undefined) {
|
|
@@ -395,10 +433,10 @@ export class User {
|
|
|
395
433
|
return total;
|
|
396
434
|
}
|
|
397
435
|
|
|
398
|
-
const perpMarket = this.velocityClient.
|
|
436
|
+
const perpMarket = this.velocityClient.getPerpMarketAccountOrThrow(
|
|
399
437
|
perpPosition.marketIndex
|
|
400
438
|
);
|
|
401
|
-
const quoteSpotMarket = this.velocityClient.
|
|
439
|
+
const quoteSpotMarket = this.velocityClient.getSpotMarketAccountOrThrow(
|
|
402
440
|
perpMarket.quoteSpotMarketIndex
|
|
403
441
|
);
|
|
404
442
|
const quoteOraclePriceData = this.getOracleDataForSpotMarket(
|
|
@@ -438,12 +476,12 @@ export class User {
|
|
|
438
476
|
* @returns Order
|
|
439
477
|
*/
|
|
440
478
|
public getOrder(orderId: number): Order | undefined {
|
|
441
|
-
const userAccount = this.
|
|
479
|
+
const userAccount = this.getUserAccountOrThrow();
|
|
442
480
|
return this.getOrderForUserAccount(userAccount, orderId);
|
|
443
481
|
}
|
|
444
482
|
|
|
445
483
|
public getOrderAndSlot(orderId: number): DataAndSlot<Order | undefined> {
|
|
446
|
-
const userAccount = this.
|
|
484
|
+
const userAccount = this.getUserAccountAndSlotOrThrow();
|
|
447
485
|
const order = this.getOrderForUserAccount(userAccount.data, orderId);
|
|
448
486
|
return {
|
|
449
487
|
data: order,
|
|
@@ -465,14 +503,14 @@ export class User {
|
|
|
465
503
|
* @returns Order
|
|
466
504
|
*/
|
|
467
505
|
public getOrderByUserOrderId(userOrderId: number): Order | undefined {
|
|
468
|
-
const userAccount = this.
|
|
506
|
+
const userAccount = this.getUserAccountOrThrow();
|
|
469
507
|
return this.getOrderByUserIdForUserAccount(userAccount, userOrderId);
|
|
470
508
|
}
|
|
471
509
|
|
|
472
510
|
public getOrderByUserOrderIdAndSlot(
|
|
473
511
|
userOrderId: number
|
|
474
512
|
): DataAndSlot<Order | undefined> {
|
|
475
|
-
const userAccount = this.
|
|
513
|
+
const userAccount = this.getUserAccountAndSlotOrThrow();
|
|
476
514
|
const order = this.getOrderByUserIdForUserAccount(
|
|
477
515
|
userAccount.data,
|
|
478
516
|
userOrderId
|
|
@@ -483,7 +521,9 @@ export class User {
|
|
|
483
521
|
};
|
|
484
522
|
}
|
|
485
523
|
|
|
486
|
-
public getOpenOrdersForUserAccount(
|
|
524
|
+
public getOpenOrdersForUserAccount(
|
|
525
|
+
userAccount?: UserAccount
|
|
526
|
+
): Order[] | undefined {
|
|
487
527
|
return userAccount?.orders.filter((order) =>
|
|
488
528
|
isVariant(order.status, 'open')
|
|
489
529
|
);
|
|
@@ -491,12 +531,12 @@ export class User {
|
|
|
491
531
|
|
|
492
532
|
public getOpenOrders(): Order[] {
|
|
493
533
|
const userAccount = this.getUserAccount();
|
|
494
|
-
return this.getOpenOrdersForUserAccount(userAccount);
|
|
534
|
+
return this.getOpenOrdersForUserAccount(userAccount) ?? [];
|
|
495
535
|
}
|
|
496
536
|
|
|
497
537
|
public getOpenOrdersAndSlot(): DataAndSlot<Order[]> {
|
|
498
|
-
const userAccount = this.
|
|
499
|
-
const openOrders = this.getOpenOrdersForUserAccount(userAccount.data);
|
|
538
|
+
const userAccount = this.getUserAccountAndSlotOrThrow();
|
|
539
|
+
const openOrders = this.getOpenOrdersForUserAccount(userAccount.data) ?? [];
|
|
500
540
|
return {
|
|
501
541
|
data: openOrders,
|
|
502
542
|
slot: userAccount.slot,
|
|
@@ -521,7 +561,7 @@ export class User {
|
|
|
521
561
|
* @returns : open asks
|
|
522
562
|
*/
|
|
523
563
|
public getPerpBidAsks(marketIndex: number): [BN, BN] {
|
|
524
|
-
const position = this.
|
|
564
|
+
const position = this.getPerpPositionOrThrow(marketIndex);
|
|
525
565
|
|
|
526
566
|
const totalOpenBids = position.openBids;
|
|
527
567
|
const totalOpenAsks = position.openAsks;
|
|
@@ -536,12 +576,13 @@ export class User {
|
|
|
536
576
|
public getPerpBuyingPower(
|
|
537
577
|
marketIndex: number,
|
|
538
578
|
collateralBuffer = ZERO,
|
|
539
|
-
maxMarginRatio = undefined,
|
|
579
|
+
maxMarginRatio: number | undefined = undefined,
|
|
540
580
|
positionType: 'isolated' | 'cross' = 'cross'
|
|
541
581
|
): BN {
|
|
542
582
|
const perpPosition = this.getPerpPositionOrEmpty(marketIndex);
|
|
543
583
|
|
|
544
|
-
const perpMarket =
|
|
584
|
+
const perpMarket =
|
|
585
|
+
this.velocityClient.getPerpMarketAccountOrThrow(marketIndex);
|
|
545
586
|
const oraclePriceData = this.getOracleDataForPerpMarket(marketIndex);
|
|
546
587
|
const worstCaseBaseAssetAmount = perpPosition
|
|
547
588
|
? calculateWorstCaseBaseAssetAmount(
|
|
@@ -591,18 +632,24 @@ export class User {
|
|
|
591
632
|
);
|
|
592
633
|
}
|
|
593
634
|
|
|
635
|
+
private resolveMaxMarginRatio(perpMarketMaxMarginRatio?: number): number {
|
|
636
|
+
// 0 means "no custom margin ratio override", so Math.max returns
|
|
637
|
+
// userAccount.maxMarginRatio unchanged — the expected semantic.
|
|
638
|
+
return Math.max(
|
|
639
|
+
perpMarketMaxMarginRatio ?? 0,
|
|
640
|
+
this.getUserAccountOrThrow().maxMarginRatio
|
|
641
|
+
);
|
|
642
|
+
}
|
|
643
|
+
|
|
594
644
|
getPerpBuyingPowerFromFreeCollateralAndBaseAssetAmount(
|
|
595
645
|
marketIndex: number,
|
|
596
646
|
freeCollateral: BN,
|
|
597
647
|
baseAssetAmount: BN,
|
|
598
|
-
perpMarketMaxMarginRatio = undefined
|
|
648
|
+
perpMarketMaxMarginRatio: number | undefined = undefined
|
|
599
649
|
): BN {
|
|
600
|
-
const maxMarginRatio =
|
|
601
|
-
perpMarketMaxMarginRatio,
|
|
602
|
-
this.getUserAccount().maxMarginRatio
|
|
603
|
-
);
|
|
650
|
+
const maxMarginRatio = this.resolveMaxMarginRatio(perpMarketMaxMarginRatio);
|
|
604
651
|
const marginRatio = calculateMarketMarginRatio(
|
|
605
|
-
this.velocityClient.
|
|
652
|
+
this.velocityClient.getPerpMarketAccountOrThrow(marketIndex),
|
|
606
653
|
baseAssetAmount,
|
|
607
654
|
'Initial',
|
|
608
655
|
maxMarginRatio
|
|
@@ -747,11 +794,11 @@ export class User {
|
|
|
747
794
|
}
|
|
748
795
|
|
|
749
796
|
public getActivePerpPositions(): PerpPosition[] {
|
|
750
|
-
const userAccount = this.
|
|
797
|
+
const userAccount = this.getUserAccountOrThrow();
|
|
751
798
|
return this.getActivePerpPositionsForUserAccount(userAccount);
|
|
752
799
|
}
|
|
753
800
|
public getActivePerpPositionsAndSlot(): DataAndSlot<PerpPosition[]> {
|
|
754
|
-
const userAccount = this.
|
|
801
|
+
const userAccount = this.getUserAccountAndSlotOrThrow();
|
|
755
802
|
const positions = this.getActivePerpPositionsForUserAccount(
|
|
756
803
|
userAccount.data
|
|
757
804
|
);
|
|
@@ -770,11 +817,11 @@ export class User {
|
|
|
770
817
|
}
|
|
771
818
|
|
|
772
819
|
public getActiveSpotPositions(): SpotPosition[] {
|
|
773
|
-
const userAccount = this.
|
|
820
|
+
const userAccount = this.getUserAccountOrThrow();
|
|
774
821
|
return this.getActiveSpotPositionsForUserAccount(userAccount);
|
|
775
822
|
}
|
|
776
823
|
public getActiveSpotPositionsAndSlot(): DataAndSlot<SpotPosition[]> {
|
|
777
|
-
const userAccount = this.
|
|
824
|
+
const userAccount = this.getUserAccountAndSlotOrThrow();
|
|
778
825
|
const positions = this.getActiveSpotPositionsForUserAccount(
|
|
779
826
|
userAccount.data
|
|
780
827
|
);
|
|
@@ -800,14 +847,14 @@ export class User {
|
|
|
800
847
|
marketIndex !== undefined ? pos.marketIndex === marketIndex : true
|
|
801
848
|
)
|
|
802
849
|
.reduce((unrealizedPnl, perpPosition) => {
|
|
803
|
-
const market = this.velocityClient.
|
|
850
|
+
const market = this.velocityClient.getPerpMarketAccountOrThrow(
|
|
804
851
|
perpPosition.marketIndex
|
|
805
852
|
);
|
|
806
853
|
const oraclePriceData = this.getMMOracleDataForPerpMarket(
|
|
807
854
|
market.marketIndex
|
|
808
855
|
);
|
|
809
856
|
|
|
810
|
-
const quoteSpotMarket = this.velocityClient.
|
|
857
|
+
const quoteSpotMarket = this.velocityClient.getSpotMarketAccountOrThrow(
|
|
811
858
|
market.quoteSpotMarketIndex
|
|
812
859
|
);
|
|
813
860
|
const quoteOraclePriceData = this.getOracleDataForSpotMarket(
|
|
@@ -871,12 +918,12 @@ export class User {
|
|
|
871
918
|
* @returns : Precision QUOTE_PRECISION
|
|
872
919
|
*/
|
|
873
920
|
public getUnrealizedFundingPNL(marketIndex?: number): BN {
|
|
874
|
-
return this.
|
|
921
|
+
return this.getUserAccountOrThrow()
|
|
875
922
|
.perpPositions.filter((pos) =>
|
|
876
923
|
marketIndex !== undefined ? pos.marketIndex === marketIndex : true
|
|
877
924
|
)
|
|
878
925
|
.reduce((pnl, perpPosition) => {
|
|
879
|
-
const market = this.velocityClient.
|
|
926
|
+
const market = this.velocityClient.getPerpMarketAccountOrThrow(
|
|
880
927
|
perpPosition.marketIndex
|
|
881
928
|
);
|
|
882
929
|
return pnl.add(calculateUnsettledFundingPnl(market, perpPosition));
|
|
@@ -895,7 +942,7 @@ export class User {
|
|
|
895
942
|
let netQuoteValue = ZERO;
|
|
896
943
|
let totalAssetValue = ZERO;
|
|
897
944
|
let totalLiabilityValue = ZERO;
|
|
898
|
-
for (const spotPosition of this.
|
|
945
|
+
for (const spotPosition of this.getUserAccountOrThrow().spotPositions) {
|
|
899
946
|
const countForBase =
|
|
900
947
|
marketIndex === undefined || spotPosition.marketIndex === marketIndex;
|
|
901
948
|
|
|
@@ -911,7 +958,9 @@ export class User {
|
|
|
911
958
|
}
|
|
912
959
|
|
|
913
960
|
const spotMarketAccount: SpotMarketAccount =
|
|
914
|
-
this.velocityClient.
|
|
961
|
+
this.velocityClient.getSpotMarketAccountOrThrow(
|
|
962
|
+
spotPosition.marketIndex
|
|
963
|
+
);
|
|
915
964
|
|
|
916
965
|
const oraclePriceData = this.getOracleDataForSpotMarket(
|
|
917
966
|
spotPosition.marketIndex
|
|
@@ -1014,7 +1063,7 @@ export class User {
|
|
|
1014
1063
|
spotMarketAccount,
|
|
1015
1064
|
strictOraclePrice,
|
|
1016
1065
|
marginCategory,
|
|
1017
|
-
this.
|
|
1066
|
+
this.getUserAccountOrThrow().maxMarginRatio
|
|
1018
1067
|
);
|
|
1019
1068
|
|
|
1020
1069
|
if (worstCaseTokenAmount.gt(ZERO) && countForBase) {
|
|
@@ -1047,7 +1096,10 @@ export class User {
|
|
|
1047
1096
|
if (worstCaseQuoteTokenAmount.lt(ZERO) && countForQuote) {
|
|
1048
1097
|
let weight = SPOT_MARKET_WEIGHT_PRECISION;
|
|
1049
1098
|
if (marginCategory === 'Initial') {
|
|
1050
|
-
weight = BN.max(
|
|
1099
|
+
weight = BN.max(
|
|
1100
|
+
weight,
|
|
1101
|
+
new BN(this.getUserAccountOrThrow().maxMarginRatio)
|
|
1102
|
+
);
|
|
1051
1103
|
}
|
|
1052
1104
|
|
|
1053
1105
|
const weightedTokenValue = worstCaseQuoteTokenAmount
|
|
@@ -1104,7 +1156,7 @@ export class User {
|
|
|
1104
1156
|
tokenAmount,
|
|
1105
1157
|
strictOraclePrice,
|
|
1106
1158
|
spotMarketAccount,
|
|
1107
|
-
this.
|
|
1159
|
+
this.getUserAccountOrThrow().maxMarginRatio,
|
|
1108
1160
|
marginCategory,
|
|
1109
1161
|
liquidationBuffer
|
|
1110
1162
|
);
|
|
@@ -1138,7 +1190,7 @@ export class User {
|
|
|
1138
1190
|
tokenAmount,
|
|
1139
1191
|
strictOraclePrice,
|
|
1140
1192
|
spotMarketAccount,
|
|
1141
|
-
this.
|
|
1193
|
+
this.getUserAccountOrThrow().maxMarginRatio,
|
|
1142
1194
|
marginCategory
|
|
1143
1195
|
);
|
|
1144
1196
|
}
|
|
@@ -1199,8 +1251,15 @@ export class User {
|
|
|
1199
1251
|
});
|
|
1200
1252
|
|
|
1201
1253
|
if (perpMarketIndex !== undefined) {
|
|
1202
|
-
const
|
|
1254
|
+
const isolatedMarginCalculation =
|
|
1203
1255
|
marginCalc.isolatedMarginCalculations.get(perpMarketIndex);
|
|
1256
|
+
if (!isolatedMarginCalculation) {
|
|
1257
|
+
throw new Error(
|
|
1258
|
+
`No isolated margin calculation for perp market ${perpMarketIndex}`
|
|
1259
|
+
);
|
|
1260
|
+
}
|
|
1261
|
+
const { totalCollateral, totalCollateralBuffer } =
|
|
1262
|
+
isolatedMarginCalculation;
|
|
1204
1263
|
if (liquidationBuffer?.gt(ZERO)) {
|
|
1205
1264
|
return totalCollateralBuffer;
|
|
1206
1265
|
}
|
|
@@ -1300,7 +1359,7 @@ export class User {
|
|
|
1300
1359
|
includeOpenOrders?: boolean,
|
|
1301
1360
|
strict = false
|
|
1302
1361
|
): BN {
|
|
1303
|
-
const market = this.velocityClient.
|
|
1362
|
+
const market = this.velocityClient.getPerpMarketAccountOrThrow(
|
|
1304
1363
|
perpPosition.marketIndex
|
|
1305
1364
|
);
|
|
1306
1365
|
|
|
@@ -1334,7 +1393,7 @@ export class User {
|
|
|
1334
1393
|
if (marginCategory) {
|
|
1335
1394
|
const userCustomMargin = Math.max(
|
|
1336
1395
|
perpPosition.maxMarginRatio,
|
|
1337
|
-
this.
|
|
1396
|
+
this.getUserAccountOrThrow().maxMarginRatio
|
|
1338
1397
|
);
|
|
1339
1398
|
let marginRatio = new BN(
|
|
1340
1399
|
calculateMarketMarginRatio(
|
|
@@ -1353,7 +1412,7 @@ export class User {
|
|
|
1353
1412
|
marginRatio = ZERO;
|
|
1354
1413
|
}
|
|
1355
1414
|
|
|
1356
|
-
const quoteSpotMarket = this.velocityClient.
|
|
1415
|
+
const quoteSpotMarket = this.velocityClient.getSpotMarketAccountOrThrow(
|
|
1357
1416
|
market.quoteSpotMarketIndex
|
|
1358
1417
|
);
|
|
1359
1418
|
const quoteOraclePriceData =
|
|
@@ -1396,7 +1455,7 @@ export class User {
|
|
|
1396
1455
|
includeOpenOrders?: boolean,
|
|
1397
1456
|
strict = false
|
|
1398
1457
|
): BN {
|
|
1399
|
-
const perpPosition = this.
|
|
1458
|
+
const perpPosition = this.getPerpPositionOrThrow(marketIndex);
|
|
1400
1459
|
return this.calculateWeightedPerpPositionLiability(
|
|
1401
1460
|
perpPosition,
|
|
1402
1461
|
marginCategory,
|
|
@@ -1441,7 +1500,7 @@ export class User {
|
|
|
1441
1500
|
includeOpenOrders = false
|
|
1442
1501
|
): BN {
|
|
1443
1502
|
const userPosition = this.getPerpPositionOrEmpty(marketIndex);
|
|
1444
|
-
const market = this.velocityClient.
|
|
1503
|
+
const market = this.velocityClient.getPerpMarketAccountOrThrow(
|
|
1445
1504
|
userPosition.marketIndex
|
|
1446
1505
|
);
|
|
1447
1506
|
return calculateBaseAssetValueWithOracle(
|
|
@@ -1462,7 +1521,7 @@ export class User {
|
|
|
1462
1521
|
includeOpenOrders = false
|
|
1463
1522
|
): BN {
|
|
1464
1523
|
const userPosition = this.getPerpPositionOrEmpty(marketIndex);
|
|
1465
|
-
const market = this.velocityClient.
|
|
1524
|
+
const market = this.velocityClient.getPerpMarketAccountOrThrow(
|
|
1466
1525
|
userPosition.marketIndex
|
|
1467
1526
|
);
|
|
1468
1527
|
|
|
@@ -1501,7 +1560,7 @@ export class User {
|
|
|
1501
1560
|
amountToClose?: BN,
|
|
1502
1561
|
useAMMClose = false
|
|
1503
1562
|
): [BN, BN] {
|
|
1504
|
-
const market = this.velocityClient.
|
|
1563
|
+
const market = this.velocityClient.getPerpMarketAccountOrThrow(
|
|
1505
1564
|
position.marketIndex
|
|
1506
1565
|
);
|
|
1507
1566
|
|
|
@@ -1590,7 +1649,7 @@ export class User {
|
|
|
1590
1649
|
|
|
1591
1650
|
getLeverageComponents(
|
|
1592
1651
|
includeOpenOrders = true,
|
|
1593
|
-
marginCategory: MarginCategory = undefined,
|
|
1652
|
+
marginCategory: MarginCategory | undefined = undefined,
|
|
1594
1653
|
perpMarketIndex?: number
|
|
1595
1654
|
): {
|
|
1596
1655
|
perpLiabilityValue: BN;
|
|
@@ -1606,14 +1665,14 @@ export class User {
|
|
|
1606
1665
|
undefined,
|
|
1607
1666
|
includeOpenOrders
|
|
1608
1667
|
);
|
|
1609
|
-
const perpMarket = this.velocityClient.
|
|
1668
|
+
const perpMarket = this.velocityClient.getPerpMarketAccountOrThrow(
|
|
1610
1669
|
perpPosition.marketIndex
|
|
1611
1670
|
);
|
|
1612
1671
|
|
|
1613
1672
|
const oraclePriceData = this.getOracleDataForPerpMarket(
|
|
1614
1673
|
perpPosition.marketIndex
|
|
1615
1674
|
);
|
|
1616
|
-
const quoteSpotMarket = this.velocityClient.
|
|
1675
|
+
const quoteSpotMarket = this.velocityClient.getSpotMarketAccountOrThrow(
|
|
1617
1676
|
perpMarket.quoteSpotMarketIndex
|
|
1618
1677
|
);
|
|
1619
1678
|
const quoteOraclePriceData = this.getOracleDataForSpotMarket(
|
|
@@ -1686,6 +1745,12 @@ export class User {
|
|
|
1686
1745
|
|
|
1687
1746
|
const spotPosition = this.getSpotPosition(spotMarketAccount.marketIndex);
|
|
1688
1747
|
|
|
1748
|
+
if (!spotPosition) {
|
|
1749
|
+
throw new Error(
|
|
1750
|
+
`No spot position found for market ${spotMarketAccount.marketIndex}`
|
|
1751
|
+
);
|
|
1752
|
+
}
|
|
1753
|
+
|
|
1689
1754
|
if (isSpotPositionAvailable(spotPosition)) {
|
|
1690
1755
|
return false;
|
|
1691
1756
|
}
|
|
@@ -1772,8 +1837,8 @@ export class User {
|
|
|
1772
1837
|
*/
|
|
1773
1838
|
getTotalAllTimePnl(): BN {
|
|
1774
1839
|
const netUsdValue = this.getNetUsdValue();
|
|
1775
|
-
const totalDeposits = this.
|
|
1776
|
-
const totalWithdraws = this.
|
|
1840
|
+
const totalDeposits = this.getUserAccountOrThrow().totalDeposits;
|
|
1841
|
+
const totalWithdraws = this.getUserAccountOrThrow().totalWithdraws;
|
|
1777
1842
|
|
|
1778
1843
|
const totalPnl = netUsdValue.add(totalWithdraws).sub(totalDeposits);
|
|
1779
1844
|
|
|
@@ -2012,7 +2077,7 @@ export class User {
|
|
|
2012
2077
|
|
|
2013
2078
|
public isCrossMarginBeingLiquidated(): boolean {
|
|
2014
2079
|
return (
|
|
2015
|
-
(this.
|
|
2080
|
+
(this.getUserAccountOrThrow().status &
|
|
2016
2081
|
(UserStatus.BEING_LIQUIDATED | UserStatus.BANKRUPT)) >
|
|
2017
2082
|
0
|
|
2018
2083
|
);
|
|
@@ -2039,7 +2104,7 @@ export class User {
|
|
|
2039
2104
|
);
|
|
2040
2105
|
|
|
2041
2106
|
return (
|
|
2042
|
-
(position?.positionFlag &
|
|
2107
|
+
((position?.positionFlag ?? 0) &
|
|
2043
2108
|
(PositionFlag.BeingLiquidated | PositionFlag.Bankruptcy)) >
|
|
2044
2109
|
0
|
|
2045
2110
|
);
|
|
@@ -2068,11 +2133,11 @@ export class User {
|
|
|
2068
2133
|
}
|
|
2069
2134
|
|
|
2070
2135
|
public hasStatus(status: UserStatus): boolean {
|
|
2071
|
-
return (this.
|
|
2136
|
+
return (this.getUserAccountOrThrow().status & status) > 0;
|
|
2072
2137
|
}
|
|
2073
2138
|
|
|
2074
2139
|
public isBankrupt(): boolean {
|
|
2075
|
-
return (this.
|
|
2140
|
+
return (this.getUserAccountOrThrow().status & UserStatus.BANKRUPT) > 0;
|
|
2076
2141
|
}
|
|
2077
2142
|
|
|
2078
2143
|
/**
|
|
@@ -2080,12 +2145,12 @@ export class User {
|
|
|
2080
2145
|
* @returns
|
|
2081
2146
|
*/
|
|
2082
2147
|
public needsToSettleFundingPayment(): boolean {
|
|
2083
|
-
for (const userPosition of this.
|
|
2148
|
+
for (const userPosition of this.getUserAccountOrThrow().perpPositions) {
|
|
2084
2149
|
if (userPosition.baseAssetAmount.eq(ZERO)) {
|
|
2085
2150
|
continue;
|
|
2086
2151
|
}
|
|
2087
2152
|
|
|
2088
|
-
const market = this.velocityClient.
|
|
2153
|
+
const market = this.velocityClient.getPerpMarketAccountOrThrow(
|
|
2089
2154
|
userPosition.marketIndex
|
|
2090
2155
|
);
|
|
2091
2156
|
if (
|
|
@@ -2126,7 +2191,7 @@ export class User {
|
|
|
2126
2191
|
totalCollateral.sub(maintenanceMarginRequirement)
|
|
2127
2192
|
);
|
|
2128
2193
|
|
|
2129
|
-
const market = this.velocityClient.
|
|
2194
|
+
const market = this.velocityClient.getSpotMarketAccountOrThrow(marketIndex);
|
|
2130
2195
|
let signedTokenAmount = getSignedTokenAmount(
|
|
2131
2196
|
getTokenAmount(
|
|
2132
2197
|
currentSpotPosition.scaledBalance,
|
|
@@ -2217,9 +2282,9 @@ export class User {
|
|
|
2217
2282
|
offsetCollateral = ZERO,
|
|
2218
2283
|
marginType?: MarginType
|
|
2219
2284
|
): BN {
|
|
2220
|
-
const market = this.velocityClient.
|
|
2285
|
+
const market = this.velocityClient.getPerpMarketAccountOrThrow(marketIndex);
|
|
2221
2286
|
|
|
2222
|
-
const oracle =
|
|
2287
|
+
const oracle = market.oracle;
|
|
2223
2288
|
|
|
2224
2289
|
const oraclePrice =
|
|
2225
2290
|
this.velocityClient.getOracleDataForPerpMarket(marketIndex).price;
|
|
@@ -2431,7 +2496,7 @@ export class User {
|
|
|
2431
2496
|
|
|
2432
2497
|
const userCustomMargin = Math.max(
|
|
2433
2498
|
perpPosition.maxMarginRatio,
|
|
2434
|
-
this.
|
|
2499
|
+
this.getUserAccountOrThrow().maxMarginRatio
|
|
2435
2500
|
);
|
|
2436
2501
|
const marginRatio = calculateMarketMarginRatio(
|
|
2437
2502
|
market,
|
|
@@ -2480,7 +2545,7 @@ export class User {
|
|
|
2480
2545
|
|
|
2481
2546
|
const userCustomMargin = Math.max(
|
|
2482
2547
|
perpPosition.maxMarginRatio,
|
|
2483
|
-
this.
|
|
2548
|
+
this.getUserAccountOrThrow().maxMarginRatio
|
|
2484
2549
|
);
|
|
2485
2550
|
|
|
2486
2551
|
const marginRatio = calculateMarketMarginRatio(
|
|
@@ -2593,10 +2658,7 @@ export class User {
|
|
|
2593
2658
|
estEntryPrice?: BN,
|
|
2594
2659
|
perpMarketMaxMarginRatio?: number
|
|
2595
2660
|
): BN {
|
|
2596
|
-
const maxMarginRatio =
|
|
2597
|
-
perpMarketMaxMarginRatio,
|
|
2598
|
-
this.getUserAccount().maxMarginRatio
|
|
2599
|
-
);
|
|
2661
|
+
const maxMarginRatio = this.resolveMaxMarginRatio(perpMarketMaxMarginRatio);
|
|
2600
2662
|
return calculateMarginUSDCRequiredForTrade(
|
|
2601
2663
|
this.velocityClient,
|
|
2602
2664
|
targetMarketIndex,
|
|
@@ -2612,10 +2674,7 @@ export class User {
|
|
|
2612
2674
|
collateralIndex: number,
|
|
2613
2675
|
perpMarketMaxMarginRatio?: number
|
|
2614
2676
|
): BN {
|
|
2615
|
-
const maxMarginRatio =
|
|
2616
|
-
perpMarketMaxMarginRatio,
|
|
2617
|
-
this.getUserAccount().maxMarginRatio
|
|
2618
|
-
);
|
|
2677
|
+
const maxMarginRatio = this.resolveMaxMarginRatio(perpMarketMaxMarginRatio);
|
|
2619
2678
|
return calculateCollateralDepositRequiredForTrade(
|
|
2620
2679
|
this.velocityClient,
|
|
2621
2680
|
targetMarketIndex,
|
|
@@ -2636,7 +2695,7 @@ export class User {
|
|
|
2636
2695
|
public getMaxTradeSizeUSDCForPerp(
|
|
2637
2696
|
targetMarketIndex: number,
|
|
2638
2697
|
tradeSide: PositionDirection,
|
|
2639
|
-
maxMarginRatio = undefined,
|
|
2698
|
+
maxMarginRatio: number | undefined = undefined,
|
|
2640
2699
|
positionType: 'isolated' | 'cross' = 'cross'
|
|
2641
2700
|
): { tradeSize: BN; oppositeSideTradeSize: BN } {
|
|
2642
2701
|
let tradeSize = ZERO;
|
|
@@ -2656,7 +2715,7 @@ export class User {
|
|
|
2656
2715
|
const oracleData = this.getMMOracleDataForPerpMarket(targetMarketIndex);
|
|
2657
2716
|
|
|
2658
2717
|
const marketAccount =
|
|
2659
|
-
this.velocityClient.
|
|
2718
|
+
this.velocityClient.getPerpMarketAccountOrThrow(targetMarketIndex);
|
|
2660
2719
|
|
|
2661
2720
|
// add any position we have on the opposite side of the current trade, because we can "flip" the size of this position without taking any extra leverage.
|
|
2662
2721
|
const oppositeSizeLiabilityValue = targetingSameSide
|
|
@@ -2695,7 +2754,7 @@ export class User {
|
|
|
2695
2754
|
const marginRequirement = this.getInitialMarginRequirement();
|
|
2696
2755
|
const marginRatio = Math.max(
|
|
2697
2756
|
currentPosition.maxMarginRatio,
|
|
2698
|
-
this.
|
|
2757
|
+
this.getUserAccountOrThrow().maxMarginRatio
|
|
2699
2758
|
);
|
|
2700
2759
|
const marginFreedByClosing = perpLiabilityValue
|
|
2701
2760
|
.mul(new BN(marginRatio))
|
|
@@ -2783,7 +2842,8 @@ export class User {
|
|
|
2783
2842
|
currentQuoteAssetValue?: BN,
|
|
2784
2843
|
currentSpotMarketNetValue?: BN
|
|
2785
2844
|
): BN {
|
|
2786
|
-
const market =
|
|
2845
|
+
const market =
|
|
2846
|
+
this.velocityClient.getSpotMarketAccountOrThrow(targetMarketIndex);
|
|
2787
2847
|
const oraclePrice =
|
|
2788
2848
|
this.velocityClient.getOracleDataForSpotMarket(targetMarketIndex).price;
|
|
2789
2849
|
|
|
@@ -2803,11 +2863,11 @@ export class User {
|
|
|
2803
2863
|
isVariant(direction, 'long')
|
|
2804
2864
|
? SpotBalanceType.DEPOSIT
|
|
2805
2865
|
: SpotBalanceType.BORROW,
|
|
2806
|
-
this.
|
|
2866
|
+
this.getUserAccountOrThrow().maxMarginRatio
|
|
2807
2867
|
);
|
|
2808
2868
|
|
|
2809
2869
|
let tradeAmount = ZERO;
|
|
2810
|
-
if (this.
|
|
2870
|
+
if (this.getUserAccountOrThrow().isMarginTradingEnabled) {
|
|
2811
2871
|
// if the user is buying/selling and already short/long, need to account for closing out short/long
|
|
2812
2872
|
if (isVariant(direction, 'long') && currentSpotMarketNetValue.lt(ZERO)) {
|
|
2813
2873
|
tradeAmount = currentSpotMarketNetValue.abs();
|
|
@@ -2817,7 +2877,7 @@ export class User {
|
|
|
2817
2877
|
'Initial',
|
|
2818
2878
|
this.getTokenAmount(targetMarketIndex).abs(),
|
|
2819
2879
|
SpotBalanceType.BORROW,
|
|
2820
|
-
this.
|
|
2880
|
+
this.getUserAccountOrThrow().maxMarginRatio
|
|
2821
2881
|
);
|
|
2822
2882
|
freeCollateral = freeCollateral.add(
|
|
2823
2883
|
tradeAmount.mul(new BN(marginRatio)).div(MARGIN_PRECISION)
|
|
@@ -2833,7 +2893,7 @@ export class User {
|
|
|
2833
2893
|
'Initial',
|
|
2834
2894
|
this.getTokenAmount(targetMarketIndex),
|
|
2835
2895
|
SpotBalanceType.DEPOSIT,
|
|
2836
|
-
this.
|
|
2896
|
+
this.getUserAccountOrThrow().maxMarginRatio
|
|
2837
2897
|
);
|
|
2838
2898
|
freeCollateral = freeCollateral.add(
|
|
2839
2899
|
tradeAmount.mul(new BN(marginRatio)).div(MARGIN_PRECISION)
|
|
@@ -2875,8 +2935,10 @@ export class User {
|
|
|
2875
2935
|
calculateSwap?: (inAmount: BN) => BN;
|
|
2876
2936
|
iterationLimit?: number;
|
|
2877
2937
|
}): { inAmount: BN; outAmount: BN; leverage: BN } {
|
|
2878
|
-
const inMarket =
|
|
2879
|
-
|
|
2938
|
+
const inMarket =
|
|
2939
|
+
this.velocityClient.getSpotMarketAccountOrThrow(inMarketIndex);
|
|
2940
|
+
const outMarket =
|
|
2941
|
+
this.velocityClient.getSpotMarketAccountOrThrow(outMarketIndex);
|
|
2880
2942
|
|
|
2881
2943
|
const inOraclePriceData = this.getOracleDataForSpotMarket(inMarketIndex);
|
|
2882
2944
|
const inOraclePrice = inOraclePriceData.price;
|
|
@@ -3133,14 +3195,14 @@ export class User {
|
|
|
3133
3195
|
const marginCategory = 'Initial';
|
|
3134
3196
|
|
|
3135
3197
|
const spotMarketAccount: SpotMarketAccount =
|
|
3136
|
-
this.velocityClient.
|
|
3198
|
+
this.velocityClient.getSpotMarketAccountOrThrow(spotPosition.marketIndex);
|
|
3137
3199
|
|
|
3138
3200
|
const { freeCollateralContribution } = getWorstCaseTokenAmounts(
|
|
3139
3201
|
spotPosition,
|
|
3140
3202
|
spotMarketAccount,
|
|
3141
3203
|
strictOraclePrice,
|
|
3142
3204
|
marginCategory,
|
|
3143
|
-
this.
|
|
3205
|
+
this.getUserAccountOrThrow().maxMarginRatio
|
|
3144
3206
|
);
|
|
3145
3207
|
|
|
3146
3208
|
return freeCollateralContribution;
|
|
@@ -3157,14 +3219,14 @@ export class User {
|
|
|
3157
3219
|
let totalLiabilityValue = ZERO;
|
|
3158
3220
|
|
|
3159
3221
|
const spotMarketAccount: SpotMarketAccount =
|
|
3160
|
-
this.velocityClient.
|
|
3222
|
+
this.velocityClient.getSpotMarketAccountOrThrow(spotPosition.marketIndex);
|
|
3161
3223
|
|
|
3162
3224
|
const { tokenValue, ordersValue } = getWorstCaseTokenAmounts(
|
|
3163
3225
|
spotPosition,
|
|
3164
3226
|
spotMarketAccount,
|
|
3165
3227
|
strictOraclePrice,
|
|
3166
3228
|
'Initial',
|
|
3167
|
-
this.
|
|
3229
|
+
this.getUserAccountOrThrow().maxMarginRatio
|
|
3168
3230
|
);
|
|
3169
3231
|
|
|
3170
3232
|
if (tokenValue.gte(ZERO)) {
|
|
@@ -3203,8 +3265,10 @@ export class User {
|
|
|
3203
3265
|
inAmount: BN;
|
|
3204
3266
|
outAmount: BN;
|
|
3205
3267
|
}): BN {
|
|
3206
|
-
const inMarket =
|
|
3207
|
-
|
|
3268
|
+
const inMarket =
|
|
3269
|
+
this.velocityClient.getSpotMarketAccountOrThrow(inMarketIndex);
|
|
3270
|
+
const outMarket =
|
|
3271
|
+
this.velocityClient.getSpotMarketAccountOrThrow(outMarketIndex);
|
|
3208
3272
|
|
|
3209
3273
|
const inOraclePriceData = this.getOracleDataForSpotMarket(inMarketIndex);
|
|
3210
3274
|
const inOraclePrice = inOraclePriceData.price;
|
|
@@ -3407,7 +3471,7 @@ export class User {
|
|
|
3407
3471
|
const currentPosition = this.getPerpPositionOrEmpty(targetMarketIndex);
|
|
3408
3472
|
|
|
3409
3473
|
const perpMarket =
|
|
3410
|
-
this.velocityClient.
|
|
3474
|
+
this.velocityClient.getPerpMarketAccountOrThrow(targetMarketIndex);
|
|
3411
3475
|
const oracleData = this.getOracleDataForPerpMarket(targetMarketIndex);
|
|
3412
3476
|
|
|
3413
3477
|
let {
|
|
@@ -3477,17 +3541,15 @@ export class User {
|
|
|
3477
3541
|
public getUserFeeTier(marketType: MarketType, now?: BN) {
|
|
3478
3542
|
const state = this.velocityClient.getStateAccount();
|
|
3479
3543
|
|
|
3480
|
-
const feeTierIndex = 0;
|
|
3481
3544
|
if (isVariant(marketType, 'perp')) {
|
|
3482
3545
|
const userStatsAccount: UserStatsAccount = this.velocityClient
|
|
3483
|
-
.
|
|
3484
|
-
.
|
|
3546
|
+
.getUserStatsOrThrow()
|
|
3547
|
+
.getAccountOrThrow();
|
|
3485
3548
|
|
|
3486
3549
|
const total30dVolume = getUser30dRollingVolumeEstimate(
|
|
3487
3550
|
userStatsAccount,
|
|
3488
3551
|
now
|
|
3489
3552
|
);
|
|
3490
|
-
const stakedGovAssetAmount = userStatsAccount.ifStakedGovTokenAmount;
|
|
3491
3553
|
|
|
3492
3554
|
const volumeThresholds = [
|
|
3493
3555
|
new BN(2_000_000).mul(QUOTE_PRECISION),
|
|
@@ -3496,14 +3558,6 @@ export class User {
|
|
|
3496
3558
|
new BN(80_000_000).mul(QUOTE_PRECISION),
|
|
3497
3559
|
new BN(200_000_000).mul(QUOTE_PRECISION),
|
|
3498
3560
|
];
|
|
3499
|
-
const stakeThresholds = [
|
|
3500
|
-
new BN(1_000 - 1).mul(QUOTE_PRECISION),
|
|
3501
|
-
new BN(10_000 - 1).mul(QUOTE_PRECISION),
|
|
3502
|
-
new BN(50_000 - 1).mul(QUOTE_PRECISION),
|
|
3503
|
-
new BN(100_000 - 1).mul(QUOTE_PRECISION),
|
|
3504
|
-
new BN(250_000 - 5).mul(QUOTE_PRECISION),
|
|
3505
|
-
];
|
|
3506
|
-
const stakeBenefitFrac = [0, 5, 10, 20, 30, 40];
|
|
3507
3561
|
|
|
3508
3562
|
let feeTierIndex = 5;
|
|
3509
3563
|
for (let i = 0; i < volumeThresholds.length; i++) {
|
|
@@ -3513,29 +3567,10 @@ export class User {
|
|
|
3513
3567
|
}
|
|
3514
3568
|
}
|
|
3515
3569
|
|
|
3516
|
-
|
|
3517
|
-
for (let i = 0; i < stakeThresholds.length; i++) {
|
|
3518
|
-
if (stakedGovAssetAmount.lt(stakeThresholds[i])) {
|
|
3519
|
-
stakeBenefitIndex = i;
|
|
3520
|
-
break;
|
|
3521
|
-
}
|
|
3522
|
-
}
|
|
3523
|
-
|
|
3524
|
-
const stakeBenefit = stakeBenefitFrac[stakeBenefitIndex];
|
|
3525
|
-
|
|
3526
|
-
const tier = { ...state.perpFeeStructure.feeTiers[feeTierIndex] };
|
|
3527
|
-
|
|
3528
|
-
if (stakeBenefit > 0) {
|
|
3529
|
-
tier.feeNumerator = (tier.feeNumerator * (100 - stakeBenefit)) / 100;
|
|
3530
|
-
|
|
3531
|
-
tier.makerRebateNumerator =
|
|
3532
|
-
(tier.makerRebateNumerator * (100 + stakeBenefit)) / 100;
|
|
3533
|
-
}
|
|
3534
|
-
|
|
3535
|
-
return tier;
|
|
3570
|
+
return state.perpFeeStructure.feeTiers[feeTierIndex];
|
|
3536
3571
|
}
|
|
3537
3572
|
|
|
3538
|
-
return state.spotFeeStructure.feeTiers[
|
|
3573
|
+
return state.spotFeeStructure.feeTiers[0];
|
|
3539
3574
|
}
|
|
3540
3575
|
|
|
3541
3576
|
/**
|
|
@@ -3570,7 +3605,8 @@ export class User {
|
|
|
3570
3605
|
*/
|
|
3571
3606
|
public getWithdrawalLimit(marketIndex: number, reduceOnly?: boolean): BN {
|
|
3572
3607
|
const nowTs = new BN(Math.floor(Date.now() / 1000));
|
|
3573
|
-
const spotMarket =
|
|
3608
|
+
const spotMarket =
|
|
3609
|
+
this.velocityClient.getSpotMarketAccountOrThrow(marketIndex);
|
|
3574
3610
|
|
|
3575
3611
|
// eslint-disable-next-line prefer-const
|
|
3576
3612
|
let { borrowLimit, withdrawLimit } = calculateWithdrawLimit(
|
|
@@ -3662,12 +3698,13 @@ export class User {
|
|
|
3662
3698
|
depositAmount: BN;
|
|
3663
3699
|
maxDepositAmount: BN;
|
|
3664
3700
|
} {
|
|
3665
|
-
const spotMarket =
|
|
3701
|
+
const spotMarket =
|
|
3702
|
+
this.velocityClient.getSpotMarketAccountOrThrow(marketIndex);
|
|
3666
3703
|
const maxDepositAmount = spotMarket.withdrawGuardThreshold.div(new BN(10));
|
|
3667
3704
|
const position = this.getSpotPosition(marketIndex);
|
|
3668
3705
|
|
|
3669
|
-
const netDeposits = this.
|
|
3670
|
-
this.
|
|
3706
|
+
const netDeposits = this.getUserAccountOrThrow().totalDeposits.sub(
|
|
3707
|
+
this.getUserAccountOrThrow().totalWithdraws
|
|
3671
3708
|
);
|
|
3672
3709
|
|
|
3673
3710
|
if (!position) {
|
|
@@ -3712,7 +3749,7 @@ export class User {
|
|
|
3712
3749
|
}
|
|
3713
3750
|
|
|
3714
3751
|
public canMakeIdle(slot: BN): boolean {
|
|
3715
|
-
const userAccount = this.
|
|
3752
|
+
const userAccount = this.getUserAccountOrThrow();
|
|
3716
3753
|
if (userAccount.idle) {
|
|
3717
3754
|
return false;
|
|
3718
3755
|
}
|
|
@@ -3770,14 +3807,16 @@ export class User {
|
|
|
3770
3807
|
userStatsAccount?: UserStatsAccount,
|
|
3771
3808
|
now?: BN
|
|
3772
3809
|
): { canDelete: boolean; reason?: string } {
|
|
3773
|
-
const userAccount = this.
|
|
3810
|
+
const userAccount = this.getUserAccountOrThrow();
|
|
3774
3811
|
const userStatsAccountToUse =
|
|
3775
|
-
userStatsAccount
|
|
3812
|
+
userStatsAccount ??
|
|
3813
|
+
this.velocityClient.getUserStatsOrThrow().getAccount();
|
|
3776
3814
|
const nowInSeconds = now || new BN(Math.floor(Date.now() / 1000));
|
|
3777
3815
|
const stateAccount = this.velocityClient.getStateAccount();
|
|
3778
3816
|
|
|
3779
3817
|
// Referrer cannot delete sub_account_id 0
|
|
3780
3818
|
const isReferrer =
|
|
3819
|
+
userStatsAccountToUse !== undefined &&
|
|
3781
3820
|
(userStatsAccountToUse.referrerStatus & ReferrerStatus.IsReferrer) > 0;
|
|
3782
3821
|
if (isReferrer && userAccount.subAccountId === 0) {
|
|
3783
3822
|
return { canDelete: false, reason: 'is-subaccount-0-referrer' };
|
|
@@ -3813,7 +3852,7 @@ export class User {
|
|
|
3813
3852
|
}
|
|
3814
3853
|
|
|
3815
3854
|
// Fresh account (< 13 days) with init fee must be idle
|
|
3816
|
-
if (stateAccount.maxInitializeUserFee > 0) {
|
|
3855
|
+
if (stateAccount.maxInitializeUserFee > 0 && userStatsAccountToUse) {
|
|
3817
3856
|
const minActionTs = BN.min(
|
|
3818
3857
|
userStatsAccountToUse.lastFillerVolume30DTs,
|
|
3819
3858
|
BN.min(
|
|
@@ -3843,7 +3882,9 @@ export class User {
|
|
|
3843
3882
|
safestPerpTier = Math.min(
|
|
3844
3883
|
safestPerpTier,
|
|
3845
3884
|
getPerpMarketTierNumber(
|
|
3846
|
-
this.velocityClient.
|
|
3885
|
+
this.velocityClient.getPerpMarketAccountOrThrow(
|
|
3886
|
+
perpPosition.marketIndex
|
|
3887
|
+
)
|
|
3847
3888
|
)
|
|
3848
3889
|
);
|
|
3849
3890
|
}
|
|
@@ -3856,7 +3897,9 @@ export class User {
|
|
|
3856
3897
|
safestSpotTier = Math.min(
|
|
3857
3898
|
safestSpotTier,
|
|
3858
3899
|
getSpotMarketTierNumber(
|
|
3859
|
-
this.velocityClient.
|
|
3900
|
+
this.velocityClient.getSpotMarketAccountOrThrow(
|
|
3901
|
+
spotPosition.marketIndex
|
|
3902
|
+
)
|
|
3860
3903
|
)
|
|
3861
3904
|
);
|
|
3862
3905
|
}
|
|
@@ -3880,7 +3923,7 @@ export class User {
|
|
|
3880
3923
|
quoteOraclePriceData?: OraclePriceData;
|
|
3881
3924
|
includeOpenOrders?: boolean;
|
|
3882
3925
|
}): HealthComponent {
|
|
3883
|
-
const perpMarket = this.velocityClient.
|
|
3926
|
+
const perpMarket = this.velocityClient.getPerpMarketAccountOrThrow(
|
|
3884
3927
|
perpPosition.marketIndex
|
|
3885
3928
|
);
|
|
3886
3929
|
const _oraclePriceData =
|
|
@@ -3908,7 +3951,7 @@ export class User {
|
|
|
3908
3951
|
|
|
3909
3952
|
const userCustomMargin = Math.max(
|
|
3910
3953
|
perpPosition.maxMarginRatio,
|
|
3911
|
-
this.
|
|
3954
|
+
this.getUserAccountOrThrow().maxMarginRatio
|
|
3912
3955
|
);
|
|
3913
3956
|
const marginRatio = new BN(
|
|
3914
3957
|
calculateMarketMarginRatio(
|
|
@@ -3955,7 +3998,7 @@ export class User {
|
|
|
3955
3998
|
};
|
|
3956
3999
|
|
|
3957
4000
|
for (const perpPosition of this.getActivePerpPositions()) {
|
|
3958
|
-
const perpMarket = this.velocityClient.
|
|
4001
|
+
const perpMarket = this.velocityClient.getPerpMarketAccountOrThrow(
|
|
3959
4002
|
perpPosition.marketIndex
|
|
3960
4003
|
);
|
|
3961
4004
|
|
|
@@ -3975,7 +4018,7 @@ export class User {
|
|
|
3975
4018
|
})
|
|
3976
4019
|
);
|
|
3977
4020
|
|
|
3978
|
-
const quoteSpotMarket = this.velocityClient.
|
|
4021
|
+
const quoteSpotMarket = this.velocityClient.getSpotMarketAccountOrThrow(
|
|
3979
4022
|
perpMarket.quoteSpotMarketIndex
|
|
3980
4023
|
);
|
|
3981
4024
|
|
|
@@ -4019,7 +4062,9 @@ export class User {
|
|
|
4019
4062
|
let netQuoteValue = ZERO;
|
|
4020
4063
|
for (const spotPosition of this.getActiveSpotPositions()) {
|
|
4021
4064
|
const spotMarketAccount: SpotMarketAccount =
|
|
4022
|
-
this.velocityClient.
|
|
4065
|
+
this.velocityClient.getSpotMarketAccountOrThrow(
|
|
4066
|
+
spotPosition.marketIndex
|
|
4067
|
+
);
|
|
4023
4068
|
|
|
4024
4069
|
const oraclePriceData = this.getOracleDataForSpotMarket(
|
|
4025
4070
|
spotPosition.marketIndex
|
|
@@ -4052,7 +4097,7 @@ export class User {
|
|
|
4052
4097
|
spotMarketAccount,
|
|
4053
4098
|
strictOraclePrice,
|
|
4054
4099
|
marginCategory,
|
|
4055
|
-
this.
|
|
4100
|
+
this.getUserAccountOrThrow().maxMarginRatio
|
|
4056
4101
|
);
|
|
4057
4102
|
|
|
4058
4103
|
netQuoteValue = netQuoteValue.add(ordersValue);
|
|
@@ -4097,7 +4142,7 @@ export class User {
|
|
|
4097
4142
|
oraclePriceData.price,
|
|
4098
4143
|
spotMarketAccount,
|
|
4099
4144
|
marginCategory,
|
|
4100
|
-
this.
|
|
4145
|
+
this.getUserAccountOrThrow().maxMarginRatio
|
|
4101
4146
|
);
|
|
4102
4147
|
|
|
4103
4148
|
if (netQuoteValue.lt(ZERO)) {
|
|
@@ -4205,7 +4250,9 @@ export class User {
|
|
|
4205
4250
|
|
|
4206
4251
|
// Equivalent to on-chain user_custom_margin_ratio
|
|
4207
4252
|
const userCustomMarginRatio =
|
|
4208
|
-
marginCategory === 'Initial'
|
|
4253
|
+
marginCategory === 'Initial'
|
|
4254
|
+
? this.getUserAccountOrThrow().maxMarginRatio
|
|
4255
|
+
: 0;
|
|
4209
4256
|
|
|
4210
4257
|
// Initialize calc via JS mirror of Rust/on-chain MarginCalculation
|
|
4211
4258
|
const isolatedMarginBuffers = new Map<number, BN>();
|
|
@@ -4224,12 +4271,12 @@ export class User {
|
|
|
4224
4271
|
const calc = new MarginCalculation(ctx);
|
|
4225
4272
|
|
|
4226
4273
|
// SPOT POSITIONS
|
|
4227
|
-
for (const spotPosition of this.
|
|
4274
|
+
for (const spotPosition of this.getUserAccountOrThrow().spotPositions) {
|
|
4228
4275
|
if (isSpotPositionAvailable(spotPosition)) continue;
|
|
4229
4276
|
|
|
4230
4277
|
const isQuote = spotPosition.marketIndex === QUOTE_SPOT_MARKET_INDEX;
|
|
4231
4278
|
|
|
4232
|
-
const spotMarket = this.velocityClient.
|
|
4279
|
+
const spotMarket = this.velocityClient.getSpotMarketAccountOrThrow(
|
|
4233
4280
|
spotPosition.marketIndex
|
|
4234
4281
|
);
|
|
4235
4282
|
const oraclePriceData = this.getOracleDataForSpotMarket(
|
|
@@ -4335,10 +4382,10 @@ export class User {
|
|
|
4335
4382
|
|
|
4336
4383
|
// PERP POSITIONS
|
|
4337
4384
|
for (const marketPosition of this.getActivePerpPositions()) {
|
|
4338
|
-
const market = this.velocityClient.
|
|
4385
|
+
const market = this.velocityClient.getPerpMarketAccountOrThrow(
|
|
4339
4386
|
marketPosition.marketIndex
|
|
4340
4387
|
);
|
|
4341
|
-
const quoteSpotMarket = this.velocityClient.
|
|
4388
|
+
const quoteSpotMarket = this.velocityClient.getSpotMarketAccountOrThrow(
|
|
4342
4389
|
market.quoteSpotMarketIndex
|
|
4343
4390
|
);
|
|
4344
4391
|
const quoteOraclePriceData = this.getOracleDataForSpotMarket(
|
|
@@ -4444,9 +4491,10 @@ export class User {
|
|
|
4444
4491
|
// derive isolated quote deposit value, mirroring on-chain logic
|
|
4445
4492
|
let depositValue = ZERO;
|
|
4446
4493
|
if (marketPosition.isolatedPositionScaledBalance?.gt(ZERO)) {
|
|
4447
|
-
const quoteSpotMarket =
|
|
4448
|
-
|
|
4449
|
-
|
|
4494
|
+
const quoteSpotMarket =
|
|
4495
|
+
this.velocityClient.getSpotMarketAccountOrThrow(
|
|
4496
|
+
market.quoteSpotMarketIndex
|
|
4497
|
+
);
|
|
4450
4498
|
const quoteOraclePriceData = this.getOracleDataForSpotMarket(
|
|
4451
4499
|
market.quoteSpotMarketIndex
|
|
4452
4500
|
);
|