@velocity-exchange/sdk 0.2.5 → 0.4.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 +93 -0
- package/README.md +3 -3
- package/lib/browser/accounts/basicUserAccountSubscriber.d.ts +18 -0
- package/lib/browser/accounts/basicUserAccountSubscriber.js +18 -0
- package/lib/browser/accounts/basicUserStatsAccountSubscriber.d.ts +18 -0
- package/lib/browser/accounts/basicUserStatsAccountSubscriber.js +18 -0
- package/lib/browser/accounts/bulkAccountLoader.d.ts +52 -0
- package/lib/browser/accounts/bulkAccountLoader.js +51 -0
- package/lib/browser/accounts/bulkUserStatsSubscription.d.ts +9 -2
- package/lib/browser/accounts/bulkUserStatsSubscription.js +9 -2
- package/lib/browser/accounts/bulkUserSubscription.d.ts +8 -2
- package/lib/browser/accounts/bulkUserSubscription.js +8 -2
- package/lib/browser/accounts/customizedCadenceBulkAccountLoader.d.ts +37 -0
- package/lib/browser/accounts/customizedCadenceBulkAccountLoader.js +37 -0
- package/lib/browser/accounts/fetch.d.ts +59 -2
- package/lib/browser/accounts/fetch.js +57 -2
- package/lib/browser/accounts/grpcAccountSubscriber.d.ts +30 -0
- package/lib/browser/accounts/grpcAccountSubscriber.js +30 -0
- package/lib/browser/accounts/grpcInsuranceFundStakeAccountSubscriber.d.ts +16 -0
- package/lib/browser/accounts/grpcInsuranceFundStakeAccountSubscriber.js +16 -0
- package/lib/browser/accounts/grpcMultiAccountSubscriber.d.ts +60 -1
- package/lib/browser/accounts/grpcMultiAccountSubscriber.js +118 -37
- package/lib/browser/accounts/grpcMultiUserAccountSubscriber.d.ts +32 -0
- package/lib/browser/accounts/grpcMultiUserAccountSubscriber.js +40 -12
- package/lib/browser/accounts/grpcProgramAccountSubscriber.d.ts +33 -0
- package/lib/browser/accounts/grpcProgramAccountSubscriber.js +33 -0
- package/lib/browser/accounts/grpcUserAccountSubscriber.d.ts +15 -0
- package/lib/browser/accounts/grpcUserAccountSubscriber.js +15 -0
- package/lib/browser/accounts/grpcUserStatsAccountSubscriber.d.ts +15 -0
- package/lib/browser/accounts/grpcUserStatsAccountSubscriber.js +15 -0
- package/lib/browser/accounts/grpcVelocityClientAccountSubscriber.d.ts +41 -0
- package/lib/browser/accounts/grpcVelocityClientAccountSubscriber.js +41 -0
- package/lib/browser/accounts/grpcVelocityClientAccountSubscriberV2.d.ts +116 -0
- package/lib/browser/accounts/grpcVelocityClientAccountSubscriberV2.js +152 -1
- package/lib/browser/accounts/laserProgramAccountSubscriber.d.ts +34 -0
- package/lib/browser/accounts/laserProgramAccountSubscriber.js +34 -0
- package/lib/browser/accounts/oneShotUserAccountSubscriber.d.ts +19 -0
- package/lib/browser/accounts/oneShotUserAccountSubscriber.js +19 -0
- package/lib/browser/accounts/oneShotUserStatsAccountSubscriber.d.ts +19 -0
- package/lib/browser/accounts/oneShotUserStatsAccountSubscriber.js +19 -0
- package/lib/browser/accounts/pollingInsuranceFundStakeAccountSubscriber.d.ts +31 -0
- package/lib/browser/accounts/pollingInsuranceFundStakeAccountSubscriber.js +31 -0
- package/lib/browser/accounts/pollingOracleAccountSubscriber.d.ts +19 -0
- package/lib/browser/accounts/pollingOracleAccountSubscriber.js +21 -2
- package/lib/browser/accounts/pollingTokenAccountSubscriber.d.ts +22 -0
- package/lib/browser/accounts/pollingTokenAccountSubscriber.js +22 -0
- package/lib/browser/accounts/pollingUserAccountSubscriber.d.ts +32 -0
- package/lib/browser/accounts/pollingUserAccountSubscriber.js +32 -0
- package/lib/browser/accounts/pollingUserStatsAccountSubscriber.d.ts +22 -0
- package/lib/browser/accounts/pollingUserStatsAccountSubscriber.js +22 -0
- package/lib/browser/accounts/pollingVelocityClientAccountSubscriber.d.ts +83 -0
- package/lib/browser/accounts/pollingVelocityClientAccountSubscriber.js +84 -1
- package/lib/browser/accounts/testBulkAccountLoader.d.ts +8 -0
- package/lib/browser/accounts/testBulkAccountLoader.js +8 -0
- package/lib/browser/accounts/types.d.ts +149 -0
- package/lib/browser/accounts/types.js +13 -0
- package/lib/browser/accounts/utils.d.ts +18 -0
- package/lib/browser/accounts/utils.js +32 -16
- package/lib/browser/accounts/webSocketAccountSubscriber.d.ts +41 -0
- package/lib/browser/accounts/webSocketAccountSubscriber.js +41 -0
- package/lib/browser/accounts/webSocketAccountSubscriberV2.d.ts +31 -0
- package/lib/browser/accounts/webSocketAccountSubscriberV2.js +31 -23
- package/lib/browser/accounts/webSocketInsuranceFundStakeAccountSubscriber.d.ts +27 -0
- package/lib/browser/accounts/webSocketInsuranceFundStakeAccountSubscriber.js +27 -0
- package/lib/browser/accounts/webSocketProgramAccountSubscriber.d.ts +36 -0
- package/lib/browser/accounts/webSocketProgramAccountSubscriber.js +36 -0
- package/lib/browser/accounts/webSocketProgramAccountSubscriberV2.d.ts +21 -0
- package/lib/browser/accounts/webSocketProgramAccountSubscriberV2.js +25 -0
- package/lib/browser/accounts/webSocketProgramAccountsSubscriberV2.d.ts +21 -0
- package/lib/browser/accounts/webSocketProgramAccountsSubscriberV2.js +21 -0
- package/lib/browser/accounts/webSocketUserAccountSubscriber.d.ts +26 -0
- package/lib/browser/accounts/webSocketUserAccountSubscriber.js +26 -0
- package/lib/browser/accounts/webSocketUserStatsAccountSubsriber.d.ts +20 -0
- package/lib/browser/accounts/webSocketUserStatsAccountSubsriber.js +20 -0
- package/lib/browser/accounts/webSocketVelocityClientAccountSubscriber.d.ts +121 -0
- package/lib/browser/accounts/webSocketVelocityClientAccountSubscriber.js +123 -2
- package/lib/browser/accounts/webSocketVelocityClientAccountSubscriberV2.d.ts +96 -0
- package/lib/browser/accounts/webSocketVelocityClientAccountSubscriberV2.js +108 -0
- package/lib/browser/accounts/websocketProgramUserAccountSubscriber.d.ts +28 -0
- package/lib/browser/accounts/websocketProgramUserAccountSubscriber.js +33 -0
- package/lib/browser/addresses/marketAddresses.d.ts +10 -0
- package/lib/browser/addresses/marketAddresses.js +10 -0
- package/lib/browser/addresses/pda.d.ts +214 -2
- package/lib/browser/addresses/pda.js +217 -5
- package/lib/browser/adminClient.d.ts +2139 -5
- package/lib/browser/adminClient.js +2173 -11
- package/lib/browser/auctionSubscriber/auctionSubscriber.d.ts +15 -0
- package/lib/browser/auctionSubscriber/auctionSubscriber.js +15 -0
- package/lib/browser/auctionSubscriber/auctionSubscriberGrpc.d.ts +19 -0
- package/lib/browser/auctionSubscriber/auctionSubscriberGrpc.js +19 -0
- package/lib/browser/auctionSubscriber/index.d.ts +6 -0
- package/lib/browser/auctionSubscriber/index.js +6 -0
- package/lib/browser/auctionSubscriber/types.d.ts +7 -0
- package/lib/browser/blockhashSubscriber/BlockhashSubscriber.d.ts +33 -0
- package/lib/browser/blockhashSubscriber/BlockhashSubscriber.js +33 -0
- package/lib/browser/blockhashSubscriber/index.d.ts +5 -0
- package/lib/browser/blockhashSubscriber/index.js +5 -0
- package/lib/browser/blockhashSubscriber/types.d.ts +5 -0
- package/lib/browser/clock/clockSubscriber.d.ts +24 -0
- package/lib/browser/clock/clockSubscriber.js +22 -0
- package/lib/browser/config.d.ts +58 -4
- package/lib/browser/config.js +88 -21
- package/lib/browser/constants/numericConstants.d.ts +67 -0
- package/lib/browser/constants/numericConstants.js +68 -1
- package/lib/browser/constants/perpMarkets.d.ts +10 -0
- package/lib/browser/constants/perpMarkets.js +40 -908
- package/lib/browser/constants/spotMarkets.d.ts +13 -0
- package/lib/browser/constants/spotMarkets.js +16 -742
- package/lib/browser/constants/txConstants.d.ts +1 -0
- package/lib/browser/constants/txConstants.js +1 -0
- package/lib/browser/core/VelocityCore.d.ts +285 -8
- package/lib/browser/core/VelocityCore.js +281 -8
- package/lib/browser/core/instructions/deposit.d.ts +22 -0
- package/lib/browser/core/instructions/deposit.js +22 -0
- package/lib/browser/core/instructions/fill.d.ts +17 -0
- package/lib/browser/core/instructions/fill.js +17 -0
- package/lib/browser/core/instructions/funding.d.ts +12 -0
- package/lib/browser/core/instructions/funding.js +12 -0
- package/lib/browser/core/instructions/liquidation.d.ts +18 -0
- package/lib/browser/core/instructions/liquidation.js +18 -0
- package/lib/browser/core/instructions/orders.d.ts +28 -0
- package/lib/browser/core/instructions/orders.js +28 -0
- package/lib/browser/core/instructions/perpOrders.d.ts +106 -0
- package/lib/browser/core/instructions/perpOrders.js +106 -0
- package/lib/browser/core/instructions/settlement.d.ts +14 -0
- package/lib/browser/core/instructions/settlement.js +14 -0
- package/lib/browser/core/instructions/trigger.d.ts +15 -0
- package/lib/browser/core/instructions/trigger.js +15 -0
- package/lib/browser/core/instructions/withdraw.d.ts +21 -0
- package/lib/browser/core/instructions/withdraw.js +21 -0
- package/lib/browser/core/remainingAccounts.d.ts +47 -3
- package/lib/browser/core/remainingAccounts.js +20 -0
- package/lib/browser/core/signedMsg.d.ts +38 -0
- package/lib/browser/core/signedMsg.js +33 -0
- package/lib/browser/decode/customCoder.d.ts +39 -3
- package/lib/browser/decode/customCoder.js +45 -3
- package/lib/browser/decode/user.d.ts +22 -0
- package/lib/browser/decode/user.js +22 -0
- package/lib/browser/dlob/DLOB.d.ts +502 -53
- package/lib/browser/dlob/DLOB.js +540 -98
- package/lib/browser/dlob/DLOBNode.d.ts +86 -4
- package/lib/browser/dlob/DLOBNode.js +37 -4
- package/lib/browser/dlob/DLOBSubscriber.d.ts +39 -12
- package/lib/browser/dlob/DLOBSubscriber.js +42 -12
- package/lib/browser/dlob/NodeList.d.ts +69 -0
- package/lib/browser/dlob/NodeList.js +66 -0
- package/lib/browser/dlob/orderBookLevels.d.ts +106 -13
- package/lib/browser/dlob/orderBookLevels.js +84 -14
- package/lib/browser/dlob/types.d.ts +15 -0
- package/lib/browser/events/eventList.d.ts +14 -0
- package/lib/browser/events/eventList.js +14 -0
- package/lib/browser/events/eventSubscriber.d.ts +87 -10
- package/lib/browser/events/eventSubscriber.js +93 -8
- package/lib/browser/events/eventsServerLogProvider.d.ts +22 -0
- package/lib/browser/events/eventsServerLogProvider.js +27 -0
- package/lib/browser/events/fetchLogs.d.ts +31 -0
- package/lib/browser/events/fetchLogs.js +46 -1
- package/lib/browser/events/parse.d.ts +23 -0
- package/lib/browser/events/parse.js +23 -0
- package/lib/browser/events/pollingLogProvider.d.ts +24 -0
- package/lib/browser/events/pollingLogProvider.js +24 -0
- package/lib/browser/events/sort.d.ts +11 -0
- package/lib/browser/events/sort.js +12 -0
- package/lib/browser/events/txEventCache.d.ts +13 -3
- package/lib/browser/events/txEventCache.js +19 -7
- package/lib/browser/events/types.d.ts +118 -2
- package/lib/browser/events/types.js +11 -0
- package/lib/browser/events/webSocketLogProvider.d.ts +23 -0
- package/lib/browser/events/webSocketLogProvider.js +28 -0
- package/lib/browser/factory/oracleClient.js +2 -2
- package/lib/browser/idl/velocity.d.ts +50 -1
- package/lib/browser/idl/velocity.json +50 -1
- package/lib/browser/keypair.d.ts +8 -0
- package/lib/browser/keypair.js +8 -0
- package/lib/browser/marginCalculation.d.ts +134 -2
- package/lib/browser/marginCalculation.js +121 -0
- package/lib/browser/math/amm.d.ts +348 -29
- package/lib/browser/math/amm.js +310 -32
- package/lib/browser/math/auction.d.ts +95 -19
- package/lib/browser/math/auction.js +118 -28
- package/lib/browser/math/bankruptcy.d.ts +46 -0
- package/lib/browser/math/bankruptcy.js +89 -1
- package/lib/browser/math/builder.d.ts +64 -8
- package/lib/browser/math/builder.js +71 -9
- package/lib/browser/math/conversion.d.ts +21 -0
- package/lib/browser/math/conversion.js +21 -0
- package/lib/browser/math/exchangeStatus.d.ts +92 -0
- package/lib/browser/math/exchangeStatus.js +111 -1
- package/lib/browser/math/funding.d.ts +57 -20
- package/lib/browser/math/funding.js +63 -23
- package/lib/browser/math/insurance.d.ts +62 -0
- package/lib/browser/math/insurance.js +62 -0
- package/lib/browser/math/liquidation.d.ts +127 -11
- package/lib/browser/math/liquidation.js +182 -19
- package/lib/browser/math/margin.d.ts +79 -13
- package/lib/browser/math/margin.js +80 -14
- package/lib/browser/math/market.d.ts +135 -15
- package/lib/browser/math/market.js +145 -17
- package/lib/browser/math/oracles.d.ts +113 -0
- package/lib/browser/math/oracles.js +118 -1
- package/lib/browser/math/orders.d.ts +115 -7
- package/lib/browser/math/orders.js +133 -18
- package/lib/browser/math/position.d.ts +80 -33
- package/lib/browser/math/position.js +80 -33
- package/lib/browser/math/repeg.d.ts +48 -10
- package/lib/browser/math/repeg.js +48 -10
- package/lib/browser/math/spotBalance.d.ts +200 -5
- package/lib/browser/math/spotBalance.js +239 -10
- package/lib/browser/math/spotMarket.d.ts +36 -3
- package/lib/browser/math/spotMarket.js +36 -3
- package/lib/browser/math/spotPosition.d.ts +72 -0
- package/lib/browser/math/spotPosition.js +62 -0
- package/lib/browser/math/state.d.ts +31 -0
- package/lib/browser/math/state.js +32 -1
- package/lib/browser/math/superStake.d.ts +126 -2
- package/lib/browser/math/superStake.js +123 -3
- package/lib/browser/math/tiers.d.ts +29 -0
- package/lib/browser/math/tiers.js +29 -0
- package/lib/browser/math/trade.d.ts +102 -51
- package/lib/browser/math/trade.js +101 -55
- package/lib/browser/math/utils.d.ts +71 -9
- package/lib/browser/math/utils.js +71 -9
- package/lib/browser/memcmp.d.ts +94 -0
- package/lib/browser/memcmp.js +129 -7
- package/lib/browser/oracles/oracleClientCache.d.ts +16 -0
- package/lib/browser/oracles/oracleClientCache.js +16 -0
- package/lib/browser/oracles/oracleId.d.ts +31 -0
- package/lib/browser/oracles/oracleId.js +39 -8
- package/lib/browser/oracles/prelaunchOracleClient.d.ts +20 -0
- package/lib/browser/oracles/prelaunchOracleClient.js +20 -0
- package/lib/browser/oracles/pythClient.d.ts +31 -0
- package/lib/browser/oracles/pythClient.js +32 -1
- package/lib/browser/oracles/pythLazerClient.d.ts +34 -0
- package/lib/browser/oracles/pythLazerClient.js +35 -1
- package/lib/browser/oracles/quoteAssetOracleClient.d.ts +18 -0
- package/lib/browser/oracles/quoteAssetOracleClient.js +18 -0
- package/lib/browser/oracles/strictOraclePrice.d.ts +21 -0
- package/lib/browser/oracles/strictOraclePrice.js +21 -0
- package/lib/browser/oracles/types.d.ts +45 -0
- package/lib/browser/oracles/utils.d.ts +20 -0
- package/lib/browser/oracles/utils.js +20 -0
- package/lib/browser/orderParams.d.ts +42 -4
- package/lib/browser/orderParams.js +42 -4
- package/lib/browser/orderSubscriber/OrderSubscriber.d.ts +56 -0
- package/lib/browser/orderSubscriber/OrderSubscriber.js +67 -2
- package/lib/browser/orderSubscriber/PollingSubscription.d.ts +11 -0
- package/lib/browser/orderSubscriber/PollingSubscription.js +11 -0
- package/lib/browser/orderSubscriber/WebsocketSubscription.d.ts +18 -0
- package/lib/browser/orderSubscriber/WebsocketSubscription.js +18 -0
- package/lib/browser/orderSubscriber/grpcSubscription.d.ts +16 -0
- package/lib/browser/orderSubscriber/grpcSubscription.js +16 -0
- package/lib/browser/orderSubscriber/types.d.ts +9 -0
- package/lib/browser/priorityFee/averageOverSlotsStrategy.d.ts +1 -0
- package/lib/browser/priorityFee/averageOverSlotsStrategy.js +1 -0
- package/lib/browser/priorityFee/averageStrategy.d.ts +1 -0
- package/lib/browser/priorityFee/averageStrategy.js +1 -0
- package/lib/browser/priorityFee/ewmaStrategy.d.ts +10 -0
- package/lib/browser/priorityFee/ewmaStrategy.js +10 -0
- package/lib/browser/priorityFee/heliusPriorityFeeMethod.d.ts +13 -0
- package/lib/browser/priorityFee/heliusPriorityFeeMethod.js +9 -2
- package/lib/browser/priorityFee/maxOverSlotsStrategy.d.ts +1 -0
- package/lib/browser/priorityFee/maxOverSlotsStrategy.js +1 -0
- package/lib/browser/priorityFee/maxStrategy.d.ts +1 -0
- package/lib/browser/priorityFee/maxStrategy.js +1 -0
- package/lib/browser/priorityFee/priorityFeeSubscriber.d.ts +39 -0
- package/lib/browser/priorityFee/priorityFeeSubscriber.js +39 -0
- package/lib/browser/priorityFee/priorityFeeSubscriberMap.d.ts +20 -1
- package/lib/browser/priorityFee/priorityFeeSubscriberMap.js +21 -2
- package/lib/browser/priorityFee/solanaPriorityFeeMethod.d.ts +12 -0
- package/lib/browser/priorityFee/solanaPriorityFeeMethod.js +10 -0
- package/lib/browser/priorityFee/types.d.ts +32 -0
- package/lib/browser/priorityFee/types.js +5 -0
- package/lib/browser/priorityFee/velocityPriorityFeeMethod.d.ts +11 -0
- package/lib/browser/priorityFee/velocityPriorityFeeMethod.js +8 -0
- package/lib/browser/slot/SlotSubscriber.d.ts +18 -0
- package/lib/browser/slot/SlotSubscriber.js +16 -0
- package/lib/browser/slot/SlothashSubscriber.d.ts +26 -0
- package/lib/browser/slot/SlothashSubscriber.js +25 -1
- package/lib/browser/swift/swiftOrderSubscriber.js +2 -2
- package/lib/browser/tokenFaucet.d.ts +2 -2
- package/lib/browser/tokenFaucet.js +11 -4
- package/lib/browser/tx/baseTxSender.d.ts +163 -0
- package/lib/browser/tx/baseTxSender.js +174 -6
- package/lib/browser/tx/blockhashFetcher/baseBlockhashFetcher.d.ts +12 -0
- package/lib/browser/tx/blockhashFetcher/baseBlockhashFetcher.js +12 -0
- package/lib/browser/tx/blockhashFetcher/cachedBlockhashFetcher.d.ts +15 -0
- package/lib/browser/tx/blockhashFetcher/cachedBlockhashFetcher.js +15 -0
- package/lib/browser/tx/blockhashFetcher/types.d.ts +4 -0
- package/lib/browser/tx/fastSingleTxSender.d.ts +47 -0
- package/lib/browser/tx/fastSingleTxSender.js +48 -1
- package/lib/browser/tx/forwardOnlyTxSender.d.ts +48 -0
- package/lib/browser/tx/forwardOnlyTxSender.js +48 -0
- package/lib/browser/tx/reportTransactionError.d.ts +18 -6
- package/lib/browser/tx/reportTransactionError.js +18 -6
- package/lib/browser/tx/retryTxSender.d.ts +40 -0
- package/lib/browser/tx/retryTxSender.js +39 -0
- package/lib/browser/tx/txHandler.d.ts +146 -35
- package/lib/browser/tx/txHandler.js +132 -32
- package/lib/browser/tx/txParamProcessor.d.ts +47 -0
- package/lib/browser/tx/txParamProcessor.js +47 -0
- package/lib/browser/tx/types.d.ts +46 -0
- package/lib/browser/tx/types.js +5 -0
- package/lib/browser/tx/utils.d.ts +26 -0
- package/lib/browser/tx/utils.js +26 -0
- package/lib/browser/tx/whileValidTxSender.d.ts +82 -0
- package/lib/browser/tx/whileValidTxSender.js +81 -0
- package/lib/browser/types.d.ts +786 -13
- package/lib/browser/types.js +133 -9
- package/lib/browser/user.d.ts +645 -84
- package/lib/browser/user.js +779 -96
- package/lib/browser/userMap/PollingSubscription.d.ts +10 -0
- package/lib/browser/userMap/PollingSubscription.js +14 -2
- package/lib/browser/userMap/WebsocketSubscription.d.ts +9 -0
- package/lib/browser/userMap/WebsocketSubscription.js +9 -0
- package/lib/browser/userMap/grpcSubscription.d.ts +8 -0
- package/lib/browser/userMap/grpcSubscription.js +8 -0
- package/lib/browser/userMap/referrerMap.d.ts +72 -2
- package/lib/browser/userMap/referrerMap.js +84 -2
- package/lib/browser/userMap/revenueShareEscrowMap.d.ts +37 -10
- package/lib/browser/userMap/revenueShareEscrowMap.js +38 -11
- package/lib/browser/userMap/userMap.d.ts +81 -3
- package/lib/browser/userMap/userMap.js +81 -4
- package/lib/browser/userMap/userMapConfig.d.ts +23 -0
- package/lib/browser/userMap/userStatsMap.d.ts +22 -0
- package/lib/browser/userMap/userStatsMap.js +22 -0
- package/lib/browser/userName.d.ts +16 -0
- package/lib/browser/userName.js +16 -0
- package/lib/browser/userStats.d.ts +28 -1
- package/lib/browser/userStats.js +28 -1
- package/lib/browser/util/TransactionConfirmationManager.d.ts +33 -0
- package/lib/browser/util/TransactionConfirmationManager.js +33 -0
- package/lib/browser/util/chainClock.d.ts +24 -0
- package/lib/browser/util/chainClock.js +20 -0
- package/lib/browser/util/computeUnits.d.ts +32 -0
- package/lib/browser/util/computeUnits.js +32 -0
- package/lib/browser/util/digest.d.ts +17 -0
- package/lib/browser/util/digest.js +17 -0
- package/lib/browser/util/ed25519Utils.d.ts +12 -2
- package/lib/browser/util/ed25519Utils.js +12 -2
- package/lib/browser/util/promiseTimeout.d.ts +9 -0
- package/lib/browser/util/promiseTimeout.js +9 -0
- package/lib/browser/velocityClient.d.ts +3323 -216
- package/lib/browser/velocityClient.js +3428 -249
- package/lib/browser/wallet.d.ts +37 -0
- package/lib/browser/wallet.js +37 -0
- package/lib/node/accounts/basicUserAccountSubscriber.d.ts +18 -0
- package/lib/node/accounts/basicUserAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/basicUserAccountSubscriber.js +18 -0
- package/lib/node/accounts/basicUserStatsAccountSubscriber.d.ts +18 -0
- package/lib/node/accounts/basicUserStatsAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/basicUserStatsAccountSubscriber.js +18 -0
- package/lib/node/accounts/bulkAccountLoader.d.ts +52 -0
- package/lib/node/accounts/bulkAccountLoader.d.ts.map +1 -1
- package/lib/node/accounts/bulkAccountLoader.js +51 -0
- package/lib/node/accounts/bulkUserStatsSubscription.d.ts +9 -2
- package/lib/node/accounts/bulkUserStatsSubscription.d.ts.map +1 -1
- package/lib/node/accounts/bulkUserStatsSubscription.js +9 -2
- package/lib/node/accounts/bulkUserSubscription.d.ts +8 -2
- package/lib/node/accounts/bulkUserSubscription.d.ts.map +1 -1
- package/lib/node/accounts/bulkUserSubscription.js +8 -2
- package/lib/node/accounts/customizedCadenceBulkAccountLoader.d.ts +37 -0
- package/lib/node/accounts/customizedCadenceBulkAccountLoader.d.ts.map +1 -1
- package/lib/node/accounts/customizedCadenceBulkAccountLoader.js +37 -0
- package/lib/node/accounts/fetch.d.ts +59 -2
- package/lib/node/accounts/fetch.d.ts.map +1 -1
- package/lib/node/accounts/fetch.js +57 -2
- package/lib/node/accounts/grpcAccountSubscriber.d.ts +30 -0
- package/lib/node/accounts/grpcAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/grpcAccountSubscriber.js +30 -0
- package/lib/node/accounts/grpcInsuranceFundStakeAccountSubscriber.d.ts +16 -0
- package/lib/node/accounts/grpcInsuranceFundStakeAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/grpcInsuranceFundStakeAccountSubscriber.js +16 -0
- package/lib/node/accounts/grpcMultiAccountSubscriber.d.ts +60 -1
- package/lib/node/accounts/grpcMultiAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/grpcMultiAccountSubscriber.js +118 -37
- package/lib/node/accounts/grpcMultiUserAccountSubscriber.d.ts +32 -0
- package/lib/node/accounts/grpcMultiUserAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/grpcMultiUserAccountSubscriber.js +40 -12
- package/lib/node/accounts/grpcProgramAccountSubscriber.d.ts +33 -0
- package/lib/node/accounts/grpcProgramAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/grpcProgramAccountSubscriber.js +33 -0
- package/lib/node/accounts/grpcUserAccountSubscriber.d.ts +15 -0
- package/lib/node/accounts/grpcUserAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/grpcUserAccountSubscriber.js +15 -0
- package/lib/node/accounts/grpcUserStatsAccountSubscriber.d.ts +15 -0
- package/lib/node/accounts/grpcUserStatsAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/grpcUserStatsAccountSubscriber.js +15 -0
- package/lib/node/accounts/grpcVelocityClientAccountSubscriber.d.ts +41 -0
- package/lib/node/accounts/grpcVelocityClientAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/grpcVelocityClientAccountSubscriber.js +41 -0
- package/lib/node/accounts/grpcVelocityClientAccountSubscriberV2.d.ts +116 -0
- package/lib/node/accounts/grpcVelocityClientAccountSubscriberV2.d.ts.map +1 -1
- package/lib/node/accounts/grpcVelocityClientAccountSubscriberV2.js +152 -1
- package/lib/node/accounts/laserProgramAccountSubscriber.d.ts +34 -0
- package/lib/node/accounts/laserProgramAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/laserProgramAccountSubscriber.js +34 -0
- package/lib/node/accounts/oneShotUserAccountSubscriber.d.ts +19 -0
- package/lib/node/accounts/oneShotUserAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/oneShotUserAccountSubscriber.js +19 -0
- package/lib/node/accounts/oneShotUserStatsAccountSubscriber.d.ts +19 -0
- package/lib/node/accounts/oneShotUserStatsAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/oneShotUserStatsAccountSubscriber.js +19 -0
- package/lib/node/accounts/pollingInsuranceFundStakeAccountSubscriber.d.ts +31 -0
- package/lib/node/accounts/pollingInsuranceFundStakeAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/pollingInsuranceFundStakeAccountSubscriber.js +31 -0
- package/lib/node/accounts/pollingOracleAccountSubscriber.d.ts +19 -0
- package/lib/node/accounts/pollingOracleAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/pollingOracleAccountSubscriber.js +21 -2
- package/lib/node/accounts/pollingTokenAccountSubscriber.d.ts +22 -0
- package/lib/node/accounts/pollingTokenAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/pollingTokenAccountSubscriber.js +22 -0
- package/lib/node/accounts/pollingUserAccountSubscriber.d.ts +32 -0
- package/lib/node/accounts/pollingUserAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/pollingUserAccountSubscriber.js +32 -0
- package/lib/node/accounts/pollingUserStatsAccountSubscriber.d.ts +22 -0
- package/lib/node/accounts/pollingUserStatsAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/pollingUserStatsAccountSubscriber.js +22 -0
- package/lib/node/accounts/pollingVelocityClientAccountSubscriber.d.ts +83 -0
- package/lib/node/accounts/pollingVelocityClientAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/pollingVelocityClientAccountSubscriber.js +84 -1
- package/lib/node/accounts/testBulkAccountLoader.d.ts +8 -0
- package/lib/node/accounts/testBulkAccountLoader.d.ts.map +1 -1
- package/lib/node/accounts/testBulkAccountLoader.js +8 -0
- package/lib/node/accounts/types.d.ts +149 -0
- package/lib/node/accounts/types.d.ts.map +1 -1
- package/lib/node/accounts/types.js +13 -0
- package/lib/node/accounts/utils.d.ts +18 -0
- package/lib/node/accounts/utils.d.ts.map +1 -1
- package/lib/node/accounts/utils.js +32 -16
- package/lib/node/accounts/webSocketAccountSubscriber.d.ts +41 -0
- package/lib/node/accounts/webSocketAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/webSocketAccountSubscriber.js +41 -0
- package/lib/node/accounts/webSocketAccountSubscriberV2.d.ts +31 -0
- package/lib/node/accounts/webSocketAccountSubscriberV2.d.ts.map +1 -1
- package/lib/node/accounts/webSocketAccountSubscriberV2.js +31 -23
- package/lib/node/accounts/webSocketInsuranceFundStakeAccountSubscriber.d.ts +27 -0
- package/lib/node/accounts/webSocketInsuranceFundStakeAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/webSocketInsuranceFundStakeAccountSubscriber.js +27 -0
- package/lib/node/accounts/webSocketProgramAccountSubscriber.d.ts +36 -0
- package/lib/node/accounts/webSocketProgramAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/webSocketProgramAccountSubscriber.js +36 -0
- package/lib/node/accounts/webSocketProgramAccountSubscriberV2.d.ts +21 -0
- package/lib/node/accounts/webSocketProgramAccountSubscriberV2.d.ts.map +1 -1
- package/lib/node/accounts/webSocketProgramAccountSubscriberV2.js +25 -0
- package/lib/node/accounts/webSocketProgramAccountsSubscriberV2.d.ts +21 -0
- package/lib/node/accounts/webSocketProgramAccountsSubscriberV2.d.ts.map +1 -1
- package/lib/node/accounts/webSocketProgramAccountsSubscriberV2.js +21 -0
- package/lib/node/accounts/webSocketUserAccountSubscriber.d.ts +26 -0
- package/lib/node/accounts/webSocketUserAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/webSocketUserAccountSubscriber.js +26 -0
- package/lib/node/accounts/webSocketUserStatsAccountSubsriber.d.ts +20 -0
- package/lib/node/accounts/webSocketUserStatsAccountSubsriber.d.ts.map +1 -1
- package/lib/node/accounts/webSocketUserStatsAccountSubsriber.js +20 -0
- package/lib/node/accounts/webSocketVelocityClientAccountSubscriber.d.ts +121 -0
- package/lib/node/accounts/webSocketVelocityClientAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/webSocketVelocityClientAccountSubscriber.js +123 -2
- package/lib/node/accounts/webSocketVelocityClientAccountSubscriberV2.d.ts +96 -0
- package/lib/node/accounts/webSocketVelocityClientAccountSubscriberV2.d.ts.map +1 -1
- package/lib/node/accounts/webSocketVelocityClientAccountSubscriberV2.js +108 -0
- package/lib/node/accounts/websocketProgramUserAccountSubscriber.d.ts +28 -0
- package/lib/node/accounts/websocketProgramUserAccountSubscriber.d.ts.map +1 -1
- package/lib/node/accounts/websocketProgramUserAccountSubscriber.js +33 -0
- package/lib/node/addresses/marketAddresses.d.ts +10 -0
- package/lib/node/addresses/marketAddresses.d.ts.map +1 -1
- package/lib/node/addresses/marketAddresses.js +10 -0
- package/lib/node/addresses/pda.d.ts +214 -2
- package/lib/node/addresses/pda.d.ts.map +1 -1
- package/lib/node/addresses/pda.js +217 -5
- package/lib/node/adminClient.d.ts +2139 -5
- package/lib/node/adminClient.d.ts.map +1 -1
- package/lib/node/adminClient.js +2173 -11
- package/lib/node/auctionSubscriber/auctionSubscriber.d.ts +15 -0
- package/lib/node/auctionSubscriber/auctionSubscriber.d.ts.map +1 -1
- package/lib/node/auctionSubscriber/auctionSubscriber.js +15 -0
- package/lib/node/auctionSubscriber/auctionSubscriberGrpc.d.ts +19 -0
- package/lib/node/auctionSubscriber/auctionSubscriberGrpc.d.ts.map +1 -1
- package/lib/node/auctionSubscriber/auctionSubscriberGrpc.js +19 -0
- package/lib/node/auctionSubscriber/index.d.ts +6 -0
- package/lib/node/auctionSubscriber/index.d.ts.map +1 -1
- package/lib/node/auctionSubscriber/index.js +6 -0
- package/lib/node/auctionSubscriber/types.d.ts +7 -0
- package/lib/node/auctionSubscriber/types.d.ts.map +1 -1
- package/lib/node/blockhashSubscriber/BlockhashSubscriber.d.ts +33 -0
- package/lib/node/blockhashSubscriber/BlockhashSubscriber.d.ts.map +1 -1
- package/lib/node/blockhashSubscriber/BlockhashSubscriber.js +33 -0
- package/lib/node/blockhashSubscriber/index.d.ts +5 -0
- package/lib/node/blockhashSubscriber/index.d.ts.map +1 -1
- package/lib/node/blockhashSubscriber/index.js +5 -0
- package/lib/node/blockhashSubscriber/types.d.ts +5 -0
- package/lib/node/blockhashSubscriber/types.d.ts.map +1 -1
- package/lib/node/clock/clockSubscriber.d.ts +24 -0
- package/lib/node/clock/clockSubscriber.d.ts.map +1 -1
- package/lib/node/clock/clockSubscriber.js +22 -0
- package/lib/node/config.d.ts +58 -4
- package/lib/node/config.d.ts.map +1 -1
- package/lib/node/config.js +88 -21
- package/lib/node/constants/numericConstants.d.ts +67 -0
- package/lib/node/constants/numericConstants.d.ts.map +1 -1
- package/lib/node/constants/numericConstants.js +68 -1
- package/lib/node/constants/perpMarkets.d.ts +10 -0
- package/lib/node/constants/perpMarkets.d.ts.map +1 -1
- package/lib/node/constants/perpMarkets.js +40 -908
- package/lib/node/constants/spotMarkets.d.ts +13 -0
- package/lib/node/constants/spotMarkets.d.ts.map +1 -1
- package/lib/node/constants/spotMarkets.js +16 -742
- package/lib/node/constants/txConstants.d.ts +1 -0
- package/lib/node/constants/txConstants.d.ts.map +1 -1
- package/lib/node/constants/txConstants.js +1 -0
- package/lib/node/core/VelocityCore.d.ts +285 -8
- package/lib/node/core/VelocityCore.d.ts.map +1 -1
- package/lib/node/core/VelocityCore.js +281 -8
- package/lib/node/core/instructions/deposit.d.ts +22 -0
- package/lib/node/core/instructions/deposit.d.ts.map +1 -1
- package/lib/node/core/instructions/deposit.js +22 -0
- package/lib/node/core/instructions/fill.d.ts +17 -0
- package/lib/node/core/instructions/fill.d.ts.map +1 -1
- package/lib/node/core/instructions/fill.js +17 -0
- package/lib/node/core/instructions/funding.d.ts +12 -0
- package/lib/node/core/instructions/funding.d.ts.map +1 -1
- package/lib/node/core/instructions/funding.js +12 -0
- package/lib/node/core/instructions/liquidation.d.ts +18 -0
- package/lib/node/core/instructions/liquidation.d.ts.map +1 -1
- package/lib/node/core/instructions/liquidation.js +18 -0
- package/lib/node/core/instructions/orders.d.ts +28 -0
- package/lib/node/core/instructions/orders.d.ts.map +1 -1
- package/lib/node/core/instructions/orders.js +28 -0
- package/lib/node/core/instructions/perpOrders.d.ts +106 -0
- package/lib/node/core/instructions/perpOrders.d.ts.map +1 -1
- package/lib/node/core/instructions/perpOrders.js +106 -0
- package/lib/node/core/instructions/settlement.d.ts +14 -0
- package/lib/node/core/instructions/settlement.d.ts.map +1 -1
- package/lib/node/core/instructions/settlement.js +14 -0
- package/lib/node/core/instructions/trigger.d.ts +15 -0
- package/lib/node/core/instructions/trigger.d.ts.map +1 -1
- package/lib/node/core/instructions/trigger.js +15 -0
- package/lib/node/core/instructions/withdraw.d.ts +21 -0
- package/lib/node/core/instructions/withdraw.d.ts.map +1 -1
- package/lib/node/core/instructions/withdraw.js +21 -0
- package/lib/node/core/remainingAccounts.d.ts +47 -3
- package/lib/node/core/remainingAccounts.d.ts.map +1 -1
- package/lib/node/core/remainingAccounts.js +20 -0
- package/lib/node/core/signedMsg.d.ts +38 -0
- package/lib/node/core/signedMsg.d.ts.map +1 -1
- package/lib/node/core/signedMsg.js +33 -0
- package/lib/node/decode/customCoder.d.ts +39 -3
- package/lib/node/decode/customCoder.d.ts.map +1 -1
- package/lib/node/decode/customCoder.js +45 -3
- package/lib/node/decode/user.d.ts +22 -0
- package/lib/node/decode/user.d.ts.map +1 -1
- package/lib/node/decode/user.js +22 -0
- package/lib/node/dlob/DLOB.d.ts +502 -53
- package/lib/node/dlob/DLOB.d.ts.map +1 -1
- package/lib/node/dlob/DLOB.js +540 -98
- package/lib/node/dlob/DLOBNode.d.ts +86 -4
- package/lib/node/dlob/DLOBNode.d.ts.map +1 -1
- package/lib/node/dlob/DLOBNode.js +37 -4
- package/lib/node/dlob/DLOBSubscriber.d.ts +39 -12
- package/lib/node/dlob/DLOBSubscriber.d.ts.map +1 -1
- package/lib/node/dlob/DLOBSubscriber.js +42 -12
- package/lib/node/dlob/NodeList.d.ts +69 -0
- package/lib/node/dlob/NodeList.d.ts.map +1 -1
- package/lib/node/dlob/NodeList.js +66 -0
- package/lib/node/dlob/orderBookLevels.d.ts +106 -13
- package/lib/node/dlob/orderBookLevels.d.ts.map +1 -1
- package/lib/node/dlob/orderBookLevels.js +84 -14
- package/lib/node/dlob/types.d.ts +15 -0
- package/lib/node/dlob/types.d.ts.map +1 -1
- package/lib/node/events/eventList.d.ts +14 -0
- package/lib/node/events/eventList.d.ts.map +1 -1
- package/lib/node/events/eventList.js +14 -0
- package/lib/node/events/eventSubscriber.d.ts +87 -10
- package/lib/node/events/eventSubscriber.d.ts.map +1 -1
- package/lib/node/events/eventSubscriber.js +93 -8
- package/lib/node/events/eventsServerLogProvider.d.ts +22 -0
- package/lib/node/events/eventsServerLogProvider.d.ts.map +1 -1
- package/lib/node/events/eventsServerLogProvider.js +27 -0
- package/lib/node/events/fetchLogs.d.ts +31 -0
- package/lib/node/events/fetchLogs.d.ts.map +1 -1
- package/lib/node/events/fetchLogs.js +46 -1
- package/lib/node/events/parse.d.ts +23 -0
- package/lib/node/events/parse.d.ts.map +1 -1
- package/lib/node/events/parse.js +23 -0
- package/lib/node/events/pollingLogProvider.d.ts +24 -0
- package/lib/node/events/pollingLogProvider.d.ts.map +1 -1
- package/lib/node/events/pollingLogProvider.js +24 -0
- package/lib/node/events/sort.d.ts +11 -0
- package/lib/node/events/sort.d.ts.map +1 -1
- package/lib/node/events/sort.js +12 -0
- package/lib/node/events/txEventCache.d.ts +13 -3
- package/lib/node/events/txEventCache.d.ts.map +1 -1
- package/lib/node/events/txEventCache.js +19 -7
- package/lib/node/events/types.d.ts +118 -2
- package/lib/node/events/types.d.ts.map +1 -1
- package/lib/node/events/types.js +11 -0
- package/lib/node/events/webSocketLogProvider.d.ts +23 -0
- package/lib/node/events/webSocketLogProvider.d.ts.map +1 -1
- package/lib/node/events/webSocketLogProvider.js +28 -0
- package/lib/node/factory/oracleClient.js +2 -2
- package/lib/node/idl/velocity.d.ts +50 -1
- package/lib/node/idl/velocity.d.ts.map +1 -1
- package/lib/node/idl/velocity.json +50 -1
- package/lib/node/keypair.d.ts +8 -0
- package/lib/node/keypair.d.ts.map +1 -1
- package/lib/node/keypair.js +8 -0
- package/lib/node/marginCalculation.d.ts +134 -2
- package/lib/node/marginCalculation.d.ts.map +1 -1
- package/lib/node/marginCalculation.js +121 -0
- package/lib/node/math/amm.d.ts +348 -29
- package/lib/node/math/amm.d.ts.map +1 -1
- package/lib/node/math/amm.js +310 -32
- package/lib/node/math/auction.d.ts +95 -19
- package/lib/node/math/auction.d.ts.map +1 -1
- package/lib/node/math/auction.js +118 -28
- package/lib/node/math/bankruptcy.d.ts +46 -0
- package/lib/node/math/bankruptcy.d.ts.map +1 -1
- package/lib/node/math/bankruptcy.js +89 -1
- package/lib/node/math/builder.d.ts +64 -8
- package/lib/node/math/builder.d.ts.map +1 -1
- package/lib/node/math/builder.js +71 -9
- package/lib/node/math/conversion.d.ts +21 -0
- package/lib/node/math/conversion.d.ts.map +1 -1
- package/lib/node/math/conversion.js +21 -0
- package/lib/node/math/exchangeStatus.d.ts +92 -0
- package/lib/node/math/exchangeStatus.d.ts.map +1 -1
- package/lib/node/math/exchangeStatus.js +111 -1
- package/lib/node/math/funding.d.ts +57 -20
- package/lib/node/math/funding.d.ts.map +1 -1
- package/lib/node/math/funding.js +63 -23
- package/lib/node/math/insurance.d.ts +62 -0
- package/lib/node/math/insurance.d.ts.map +1 -1
- package/lib/node/math/insurance.js +62 -0
- package/lib/node/math/liquidation.d.ts +127 -11
- package/lib/node/math/liquidation.d.ts.map +1 -1
- package/lib/node/math/liquidation.js +182 -19
- package/lib/node/math/margin.d.ts +79 -13
- package/lib/node/math/margin.d.ts.map +1 -1
- package/lib/node/math/margin.js +80 -14
- package/lib/node/math/market.d.ts +135 -15
- package/lib/node/math/market.d.ts.map +1 -1
- package/lib/node/math/market.js +145 -17
- package/lib/node/math/oracles.d.ts +113 -0
- package/lib/node/math/oracles.d.ts.map +1 -1
- package/lib/node/math/oracles.js +118 -1
- package/lib/node/math/orders.d.ts +115 -7
- package/lib/node/math/orders.d.ts.map +1 -1
- package/lib/node/math/orders.js +133 -18
- package/lib/node/math/position.d.ts +80 -33
- package/lib/node/math/position.d.ts.map +1 -1
- package/lib/node/math/position.js +80 -33
- package/lib/node/math/repeg.d.ts +48 -10
- package/lib/node/math/repeg.d.ts.map +1 -1
- package/lib/node/math/repeg.js +48 -10
- package/lib/node/math/spotBalance.d.ts +200 -5
- package/lib/node/math/spotBalance.d.ts.map +1 -1
- package/lib/node/math/spotBalance.js +239 -10
- package/lib/node/math/spotMarket.d.ts +36 -3
- package/lib/node/math/spotMarket.d.ts.map +1 -1
- package/lib/node/math/spotMarket.js +36 -3
- package/lib/node/math/spotPosition.d.ts +72 -0
- package/lib/node/math/spotPosition.d.ts.map +1 -1
- package/lib/node/math/spotPosition.js +62 -0
- package/lib/node/math/state.d.ts +31 -0
- package/lib/node/math/state.d.ts.map +1 -1
- package/lib/node/math/state.js +32 -1
- package/lib/node/math/superStake.d.ts +126 -2
- package/lib/node/math/superStake.d.ts.map +1 -1
- package/lib/node/math/superStake.js +123 -3
- package/lib/node/math/tiers.d.ts +29 -0
- package/lib/node/math/tiers.d.ts.map +1 -1
- package/lib/node/math/tiers.js +29 -0
- package/lib/node/math/trade.d.ts +102 -51
- package/lib/node/math/trade.d.ts.map +1 -1
- package/lib/node/math/trade.js +101 -55
- package/lib/node/math/utils.d.ts +71 -9
- package/lib/node/math/utils.d.ts.map +1 -1
- package/lib/node/math/utils.js +71 -9
- package/lib/node/memcmp.d.ts +94 -0
- package/lib/node/memcmp.d.ts.map +1 -1
- package/lib/node/memcmp.js +129 -7
- package/lib/node/oracles/oracleClientCache.d.ts +16 -0
- package/lib/node/oracles/oracleClientCache.d.ts.map +1 -1
- package/lib/node/oracles/oracleClientCache.js +16 -0
- package/lib/node/oracles/oracleId.d.ts +31 -0
- package/lib/node/oracles/oracleId.d.ts.map +1 -1
- package/lib/node/oracles/oracleId.js +39 -8
- package/lib/node/oracles/prelaunchOracleClient.d.ts +20 -0
- package/lib/node/oracles/prelaunchOracleClient.d.ts.map +1 -1
- package/lib/node/oracles/prelaunchOracleClient.js +20 -0
- package/lib/node/oracles/pythClient.d.ts +31 -0
- package/lib/node/oracles/pythClient.d.ts.map +1 -1
- package/lib/node/oracles/pythClient.js +32 -1
- package/lib/node/oracles/pythLazerClient.d.ts +34 -0
- package/lib/node/oracles/pythLazerClient.d.ts.map +1 -1
- package/lib/node/oracles/pythLazerClient.js +35 -1
- package/lib/node/oracles/quoteAssetOracleClient.d.ts +18 -0
- package/lib/node/oracles/quoteAssetOracleClient.d.ts.map +1 -1
- package/lib/node/oracles/quoteAssetOracleClient.js +18 -0
- package/lib/node/oracles/strictOraclePrice.d.ts +21 -0
- package/lib/node/oracles/strictOraclePrice.d.ts.map +1 -1
- package/lib/node/oracles/strictOraclePrice.js +21 -0
- package/lib/node/oracles/types.d.ts +45 -0
- package/lib/node/oracles/types.d.ts.map +1 -1
- package/lib/node/oracles/utils.d.ts +20 -0
- package/lib/node/oracles/utils.d.ts.map +1 -1
- package/lib/node/oracles/utils.js +20 -0
- package/lib/node/orderParams.d.ts +42 -4
- package/lib/node/orderParams.d.ts.map +1 -1
- package/lib/node/orderParams.js +42 -4
- package/lib/node/orderSubscriber/OrderSubscriber.d.ts +56 -0
- package/lib/node/orderSubscriber/OrderSubscriber.d.ts.map +1 -1
- package/lib/node/orderSubscriber/OrderSubscriber.js +67 -2
- package/lib/node/orderSubscriber/PollingSubscription.d.ts +11 -0
- package/lib/node/orderSubscriber/PollingSubscription.d.ts.map +1 -1
- package/lib/node/orderSubscriber/PollingSubscription.js +11 -0
- package/lib/node/orderSubscriber/WebsocketSubscription.d.ts +18 -0
- package/lib/node/orderSubscriber/WebsocketSubscription.d.ts.map +1 -1
- package/lib/node/orderSubscriber/WebsocketSubscription.js +18 -0
- package/lib/node/orderSubscriber/grpcSubscription.d.ts +16 -0
- package/lib/node/orderSubscriber/grpcSubscription.d.ts.map +1 -1
- package/lib/node/orderSubscriber/grpcSubscription.js +16 -0
- package/lib/node/orderSubscriber/types.d.ts +9 -0
- package/lib/node/orderSubscriber/types.d.ts.map +1 -1
- package/lib/node/priorityFee/averageOverSlotsStrategy.d.ts +1 -0
- package/lib/node/priorityFee/averageOverSlotsStrategy.d.ts.map +1 -1
- package/lib/node/priorityFee/averageOverSlotsStrategy.js +1 -0
- package/lib/node/priorityFee/averageStrategy.d.ts +1 -0
- package/lib/node/priorityFee/averageStrategy.d.ts.map +1 -1
- package/lib/node/priorityFee/averageStrategy.js +1 -0
- package/lib/node/priorityFee/ewmaStrategy.d.ts +10 -0
- package/lib/node/priorityFee/ewmaStrategy.d.ts.map +1 -1
- package/lib/node/priorityFee/ewmaStrategy.js +10 -0
- package/lib/node/priorityFee/heliusPriorityFeeMethod.d.ts +13 -0
- package/lib/node/priorityFee/heliusPriorityFeeMethod.d.ts.map +1 -1
- package/lib/node/priorityFee/heliusPriorityFeeMethod.js +9 -2
- package/lib/node/priorityFee/maxOverSlotsStrategy.d.ts +1 -0
- package/lib/node/priorityFee/maxOverSlotsStrategy.d.ts.map +1 -1
- package/lib/node/priorityFee/maxOverSlotsStrategy.js +1 -0
- package/lib/node/priorityFee/maxStrategy.d.ts +1 -0
- package/lib/node/priorityFee/maxStrategy.d.ts.map +1 -1
- package/lib/node/priorityFee/maxStrategy.js +1 -0
- package/lib/node/priorityFee/priorityFeeSubscriber.d.ts +39 -0
- package/lib/node/priorityFee/priorityFeeSubscriber.d.ts.map +1 -1
- package/lib/node/priorityFee/priorityFeeSubscriber.js +39 -0
- package/lib/node/priorityFee/priorityFeeSubscriberMap.d.ts +20 -1
- package/lib/node/priorityFee/priorityFeeSubscriberMap.d.ts.map +1 -1
- package/lib/node/priorityFee/priorityFeeSubscriberMap.js +21 -2
- package/lib/node/priorityFee/solanaPriorityFeeMethod.d.ts +12 -0
- package/lib/node/priorityFee/solanaPriorityFeeMethod.d.ts.map +1 -1
- package/lib/node/priorityFee/solanaPriorityFeeMethod.js +10 -0
- package/lib/node/priorityFee/types.d.ts +32 -0
- package/lib/node/priorityFee/types.d.ts.map +1 -1
- package/lib/node/priorityFee/types.js +5 -0
- package/lib/node/priorityFee/velocityPriorityFeeMethod.d.ts +11 -0
- package/lib/node/priorityFee/velocityPriorityFeeMethod.d.ts.map +1 -1
- package/lib/node/priorityFee/velocityPriorityFeeMethod.js +8 -0
- package/lib/node/slot/SlotSubscriber.d.ts +18 -0
- package/lib/node/slot/SlotSubscriber.d.ts.map +1 -1
- package/lib/node/slot/SlotSubscriber.js +16 -0
- package/lib/node/slot/SlothashSubscriber.d.ts +26 -0
- package/lib/node/slot/SlothashSubscriber.d.ts.map +1 -1
- package/lib/node/slot/SlothashSubscriber.js +25 -1
- package/lib/node/swift/swiftOrderSubscriber.js +2 -2
- package/lib/node/tokenFaucet.d.ts +2 -2
- package/lib/node/tokenFaucet.d.ts.map +1 -1
- package/lib/node/tokenFaucet.js +11 -4
- package/lib/node/tx/baseTxSender.d.ts +163 -0
- package/lib/node/tx/baseTxSender.d.ts.map +1 -1
- package/lib/node/tx/baseTxSender.js +174 -6
- package/lib/node/tx/blockhashFetcher/baseBlockhashFetcher.d.ts +12 -0
- package/lib/node/tx/blockhashFetcher/baseBlockhashFetcher.d.ts.map +1 -1
- package/lib/node/tx/blockhashFetcher/baseBlockhashFetcher.js +12 -0
- package/lib/node/tx/blockhashFetcher/cachedBlockhashFetcher.d.ts +15 -0
- package/lib/node/tx/blockhashFetcher/cachedBlockhashFetcher.d.ts.map +1 -1
- package/lib/node/tx/blockhashFetcher/cachedBlockhashFetcher.js +15 -0
- package/lib/node/tx/blockhashFetcher/types.d.ts +4 -0
- package/lib/node/tx/blockhashFetcher/types.d.ts.map +1 -1
- package/lib/node/tx/fastSingleTxSender.d.ts +47 -0
- package/lib/node/tx/fastSingleTxSender.d.ts.map +1 -1
- package/lib/node/tx/fastSingleTxSender.js +48 -1
- package/lib/node/tx/forwardOnlyTxSender.d.ts +48 -0
- package/lib/node/tx/forwardOnlyTxSender.d.ts.map +1 -1
- package/lib/node/tx/forwardOnlyTxSender.js +48 -0
- package/lib/node/tx/reportTransactionError.d.ts +18 -6
- package/lib/node/tx/reportTransactionError.d.ts.map +1 -1
- package/lib/node/tx/reportTransactionError.js +18 -6
- package/lib/node/tx/retryTxSender.d.ts +40 -0
- package/lib/node/tx/retryTxSender.d.ts.map +1 -1
- package/lib/node/tx/retryTxSender.js +39 -0
- package/lib/node/tx/txHandler.d.ts +146 -35
- package/lib/node/tx/txHandler.d.ts.map +1 -1
- package/lib/node/tx/txHandler.js +132 -32
- package/lib/node/tx/txParamProcessor.d.ts +47 -0
- package/lib/node/tx/txParamProcessor.d.ts.map +1 -1
- package/lib/node/tx/txParamProcessor.js +47 -0
- package/lib/node/tx/types.d.ts +46 -0
- package/lib/node/tx/types.d.ts.map +1 -1
- package/lib/node/tx/types.js +5 -0
- package/lib/node/tx/utils.d.ts +26 -0
- package/lib/node/tx/utils.d.ts.map +1 -1
- package/lib/node/tx/utils.js +26 -0
- package/lib/node/tx/whileValidTxSender.d.ts +82 -0
- package/lib/node/tx/whileValidTxSender.d.ts.map +1 -1
- package/lib/node/tx/whileValidTxSender.js +81 -0
- package/lib/node/types.d.ts +786 -13
- package/lib/node/types.d.ts.map +1 -1
- package/lib/node/types.js +133 -9
- package/lib/node/user.d.ts +645 -84
- package/lib/node/user.d.ts.map +1 -1
- package/lib/node/user.js +779 -96
- package/lib/node/userMap/PollingSubscription.d.ts +10 -0
- package/lib/node/userMap/PollingSubscription.d.ts.map +1 -1
- package/lib/node/userMap/PollingSubscription.js +14 -2
- package/lib/node/userMap/WebsocketSubscription.d.ts +9 -0
- package/lib/node/userMap/WebsocketSubscription.d.ts.map +1 -1
- package/lib/node/userMap/WebsocketSubscription.js +9 -0
- package/lib/node/userMap/grpcSubscription.d.ts +8 -0
- package/lib/node/userMap/grpcSubscription.d.ts.map +1 -1
- package/lib/node/userMap/grpcSubscription.js +8 -0
- package/lib/node/userMap/referrerMap.d.ts +72 -2
- package/lib/node/userMap/referrerMap.d.ts.map +1 -1
- package/lib/node/userMap/referrerMap.js +84 -2
- package/lib/node/userMap/revenueShareEscrowMap.d.ts +37 -10
- package/lib/node/userMap/revenueShareEscrowMap.d.ts.map +1 -1
- package/lib/node/userMap/revenueShareEscrowMap.js +38 -11
- package/lib/node/userMap/userMap.d.ts +81 -3
- package/lib/node/userMap/userMap.d.ts.map +1 -1
- package/lib/node/userMap/userMap.js +81 -4
- package/lib/node/userMap/userMapConfig.d.ts +23 -0
- package/lib/node/userMap/userMapConfig.d.ts.map +1 -1
- package/lib/node/userMap/userStatsMap.d.ts +22 -0
- package/lib/node/userMap/userStatsMap.d.ts.map +1 -1
- package/lib/node/userMap/userStatsMap.js +22 -0
- package/lib/node/userName.d.ts +16 -0
- package/lib/node/userName.d.ts.map +1 -1
- package/lib/node/userName.js +16 -0
- package/lib/node/userStats.d.ts +28 -1
- package/lib/node/userStats.d.ts.map +1 -1
- package/lib/node/userStats.js +28 -1
- package/lib/node/util/TransactionConfirmationManager.d.ts +33 -0
- package/lib/node/util/TransactionConfirmationManager.d.ts.map +1 -1
- package/lib/node/util/TransactionConfirmationManager.js +33 -0
- package/lib/node/util/chainClock.d.ts +24 -0
- package/lib/node/util/chainClock.d.ts.map +1 -1
- package/lib/node/util/chainClock.js +20 -0
- package/lib/node/util/computeUnits.d.ts +32 -0
- package/lib/node/util/computeUnits.d.ts.map +1 -1
- package/lib/node/util/computeUnits.js +32 -0
- package/lib/node/util/digest.d.ts +17 -0
- package/lib/node/util/digest.d.ts.map +1 -1
- package/lib/node/util/digest.js +17 -0
- package/lib/node/util/ed25519Utils.d.ts +12 -2
- package/lib/node/util/ed25519Utils.d.ts.map +1 -1
- package/lib/node/util/ed25519Utils.js +12 -2
- package/lib/node/util/promiseTimeout.d.ts +9 -0
- package/lib/node/util/promiseTimeout.d.ts.map +1 -1
- package/lib/node/util/promiseTimeout.js +9 -0
- package/lib/node/velocityClient.d.ts +3323 -216
- package/lib/node/velocityClient.d.ts.map +1 -1
- package/lib/node/velocityClient.js +3428 -249
- package/lib/node/wallet.d.ts +37 -0
- package/lib/node/wallet.d.ts.map +1 -1
- package/lib/node/wallet.js +37 -0
- package/package.json +2 -1
- package/src/accounts/basicUserAccountSubscriber.ts +18 -0
- package/src/accounts/basicUserStatsAccountSubscriber.ts +18 -0
- package/src/accounts/bulkAccountLoader.ts +52 -0
- package/src/accounts/bulkUserStatsSubscription.ts +9 -2
- package/src/accounts/bulkUserSubscription.ts +8 -2
- package/src/accounts/customizedCadenceBulkAccountLoader.ts +37 -0
- package/src/accounts/fetch.ts +59 -2
- package/src/accounts/grpcAccountSubscriber.ts +30 -0
- package/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts +16 -0
- package/src/accounts/grpcMultiAccountSubscriber.ts +121 -38
- package/src/accounts/grpcMultiUserAccountSubscriber.ts +49 -11
- package/src/accounts/grpcProgramAccountSubscriber.ts +33 -0
- package/src/accounts/grpcUserAccountSubscriber.ts +15 -0
- package/src/accounts/grpcUserStatsAccountSubscriber.ts +15 -0
- package/src/accounts/grpcVelocityClientAccountSubscriber.ts +41 -0
- package/src/accounts/grpcVelocityClientAccountSubscriberV2.ts +160 -1
- package/src/accounts/laserProgramAccountSubscriber.ts +34 -0
- package/src/accounts/oneShotUserAccountSubscriber.ts +19 -0
- package/src/accounts/oneShotUserStatsAccountSubscriber.ts +19 -0
- package/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +31 -0
- package/src/accounts/pollingOracleAccountSubscriber.ts +21 -2
- package/src/accounts/pollingTokenAccountSubscriber.ts +22 -0
- package/src/accounts/pollingUserAccountSubscriber.ts +32 -0
- package/src/accounts/pollingUserStatsAccountSubscriber.ts +22 -0
- package/src/accounts/pollingVelocityClientAccountSubscriber.ts +84 -1
- package/src/accounts/testBulkAccountLoader.ts +8 -0
- package/src/accounts/types.ts +149 -0
- package/src/accounts/utils.ts +42 -24
- package/src/accounts/webSocketAccountSubscriber.ts +41 -0
- package/src/accounts/webSocketAccountSubscriberV2.ts +31 -23
- package/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts +27 -0
- package/src/accounts/webSocketProgramAccountSubscriber.ts +36 -0
- package/src/accounts/webSocketProgramAccountSubscriberV2.ts +26 -0
- package/src/accounts/webSocketProgramAccountsSubscriberV2.ts +21 -0
- package/src/accounts/webSocketUserAccountSubscriber.ts +26 -0
- package/src/accounts/webSocketUserStatsAccountSubsriber.ts +20 -0
- package/src/accounts/webSocketVelocityClientAccountSubscriber.ts +127 -2
- package/src/accounts/webSocketVelocityClientAccountSubscriberV2.ts +110 -0
- package/src/accounts/websocketProgramUserAccountSubscriber.ts +33 -0
- package/src/addresses/marketAddresses.ts +10 -0
- package/src/addresses/pda.ts +228 -12
- package/src/adminClient.ts +2184 -4
- package/src/auctionSubscriber/auctionSubscriber.ts +15 -0
- package/src/auctionSubscriber/auctionSubscriberGrpc.ts +19 -0
- package/src/auctionSubscriber/index.ts +6 -0
- package/src/auctionSubscriber/types.ts +7 -0
- package/src/blockhashSubscriber/BlockhashSubscriber.ts +33 -0
- package/src/blockhashSubscriber/index.ts +5 -0
- package/src/blockhashSubscriber/types.ts +5 -4
- package/src/clock/clockSubscriber.ts +24 -0
- package/src/config.ts +109 -22
- package/src/constants/numericConstants.ts +70 -0
- package/src/constants/perpMarkets.ts +45 -960
- package/src/constants/spotMarkets.ts +23 -793
- package/src/constants/txConstants.ts +1 -0
- package/src/core/VelocityCore.ts +286 -8
- package/src/core/instructions/deposit.ts +22 -0
- package/src/core/instructions/fill.ts +17 -0
- package/src/core/instructions/funding.ts +12 -0
- package/src/core/instructions/liquidation.ts +18 -0
- package/src/core/instructions/orders.ts +28 -0
- package/src/core/instructions/perpOrders.ts +106 -0
- package/src/core/instructions/settlement.ts +14 -0
- package/src/core/instructions/trigger.ts +15 -0
- package/src/core/instructions/withdraw.ts +21 -0
- package/src/core/remainingAccounts.ts +47 -3
- package/src/core/signedMsg.ts +38 -0
- package/src/decode/customCoder.ts +46 -3
- package/src/decode/user.ts +22 -0
- package/src/dlob/DLOB.ts +668 -97
- package/src/dlob/DLOBNode.ts +98 -6
- package/src/dlob/DLOBSubscriber.ts +49 -12
- package/src/dlob/NodeList.ts +69 -0
- package/src/dlob/orderBookLevels.ts +108 -14
- package/src/dlob/types.ts +15 -0
- package/src/events/eventList.ts +14 -0
- package/src/events/eventSubscriber.ts +100 -19
- package/src/events/eventsServerLogProvider.ts +28 -0
- package/src/events/fetchLogs.ts +52 -2
- package/src/events/parse.ts +23 -0
- package/src/events/pollingLogProvider.ts +24 -0
- package/src/events/sort.ts +12 -0
- package/src/events/txEventCache.ts +19 -7
- package/src/events/types.ts +131 -11
- package/src/events/webSocketLogProvider.ts +29 -0
- package/src/factory/oracleClient.ts +2 -2
- package/src/idl/velocity.json +50 -1
- package/src/idl/velocity.ts +50 -1
- package/src/keypair.ts +8 -0
- package/src/marginCalculation.ts +153 -2
- package/src/math/amm.ts +371 -36
- package/src/math/auction.ts +139 -30
- package/src/math/bankruptcy.ts +104 -1
- package/src/math/builder.ts +74 -8
- package/src/math/conversion.ts +21 -0
- package/src/math/exchangeStatus.ts +125 -0
- package/src/math/funding.ts +63 -23
- package/src/math/insurance.ts +62 -0
- package/src/math/liquidation.ts +227 -17
- package/src/math/margin.ts +80 -14
- package/src/math/market.ts +148 -17
- package/src/math/oracles.ts +124 -0
- package/src/math/orders.ts +144 -18
- package/src/math/position.ts +80 -33
- package/src/math/repeg.ts +48 -10
- package/src/math/spotBalance.ts +252 -12
- package/src/math/spotMarket.ts +36 -3
- package/src/math/spotPosition.ts +72 -0
- package/src/math/state.ts +32 -1
- package/src/math/superStake.ts +126 -3
- package/src/math/tiers.ts +29 -0
- package/src/math/trade.ts +125 -55
- package/src/math/utils.ts +71 -9
- package/src/memcmp.ts +131 -7
- package/src/oracles/oracleClientCache.ts +16 -0
- package/src/oracles/oracleId.ts +39 -6
- package/src/oracles/prelaunchOracleClient.ts +20 -0
- package/src/oracles/pythClient.ts +32 -1
- package/src/oracles/pythLazerClient.ts +35 -1
- package/src/oracles/quoteAssetOracleClient.ts +18 -0
- package/src/oracles/strictOraclePrice.ts +21 -0
- package/src/oracles/types.ts +45 -0
- package/src/oracles/utils.ts +20 -0
- package/src/orderParams.ts +42 -4
- package/src/orderSubscriber/OrderSubscriber.ts +74 -2
- package/src/orderSubscriber/PollingSubscription.ts +11 -0
- package/src/orderSubscriber/WebsocketSubscription.ts +18 -0
- package/src/orderSubscriber/grpcSubscription.ts +16 -0
- package/src/orderSubscriber/types.ts +9 -0
- package/src/priorityFee/averageOverSlotsStrategy.ts +1 -0
- package/src/priorityFee/averageStrategy.ts +1 -0
- package/src/priorityFee/ewmaStrategy.ts +10 -0
- package/src/priorityFee/heliusPriorityFeeMethod.ts +13 -2
- package/src/priorityFee/maxOverSlotsStrategy.ts +1 -0
- package/src/priorityFee/maxStrategy.ts +1 -0
- package/src/priorityFee/priorityFeeSubscriber.ts +39 -0
- package/src/priorityFee/priorityFeeSubscriberMap.ts +21 -2
- package/src/priorityFee/solanaPriorityFeeMethod.ts +12 -0
- package/src/priorityFee/types.ts +33 -15
- package/src/priorityFee/velocityPriorityFeeMethod.ts +11 -0
- package/src/slot/SlotSubscriber.ts +18 -0
- package/src/slot/SlothashSubscriber.ts +27 -1
- package/src/swift/swiftOrderSubscriber.ts +2 -2
- package/src/tokenFaucet.ts +10 -7
- package/src/tx/baseTxSender.ts +185 -5
- package/src/tx/blockhashFetcher/baseBlockhashFetcher.ts +12 -0
- package/src/tx/blockhashFetcher/cachedBlockhashFetcher.ts +15 -0
- package/src/tx/blockhashFetcher/types.ts +4 -0
- package/src/tx/fastSingleTxSender.ts +58 -4
- package/src/tx/forwardOnlyTxSender.ts +48 -0
- package/src/tx/reportTransactionError.ts +18 -6
- package/src/tx/retryTxSender.ts +40 -0
- package/src/tx/txHandler.ts +146 -35
- package/src/tx/txParamProcessor.ts +47 -0
- package/src/tx/types.ts +46 -0
- package/src/tx/utils.ts +26 -0
- package/src/tx/whileValidTxSender.ts +82 -0
- package/src/types.ts +783 -22
- package/src/user.ts +869 -110
- package/src/userMap/PollingSubscription.ts +16 -2
- package/src/userMap/WebsocketSubscription.ts +9 -0
- package/src/userMap/grpcSubscription.ts +8 -0
- package/src/userMap/referrerMap.ts +92 -3
- package/src/userMap/revenueShareEscrowMap.ts +38 -11
- package/src/userMap/userMap.ts +82 -4
- package/src/userMap/userMapConfig.ts +23 -10
- package/src/userMap/userStatsMap.ts +22 -0
- package/src/userName.ts +16 -0
- package/src/userStats.ts +28 -1
- package/src/util/TransactionConfirmationManager.ts +33 -0
- package/src/util/chainClock.ts +24 -0
- package/src/util/computeUnits.ts +32 -0
- package/src/util/digest.ts +17 -0
- package/src/util/ed25519Utils.ts +12 -2
- package/src/util/promiseTimeout.ts +9 -0
- package/src/velocityClient.ts +3456 -254
- package/src/wallet.ts +37 -0
- package/tests/VelocityCore/builder_escrow.test.ts +121 -0
- package/tests/amm/test.ts +102 -0
- package/tests/builder/builderFee.test.ts +42 -0
- package/tests/dlob/helpers.ts +1 -0
- package/tests/dlob/tickSizeStandardization.ts +545 -0
- package/tests/exchangeStatus/test.ts +45 -0
- package/tests/liquidation/test.ts +125 -0
- package/tests/oracles/mmOracleGate.test.ts +379 -0
- package/tests/oracles/pythPegSnap.test.ts +76 -0
- package/tests/sdkParity/enumParity.test.ts +84 -0
- package/tests/sdkParity/marginCategoryFill.test.ts +143 -0
- package/tests/sdkParity/memcmpOffsets.test.ts +139 -0
- package/tests/spot/test.ts +55 -0
- package/tests/user/bankruptcy.ts +165 -0
- package/tests/user/feeAndWithdrawLimits.ts +284 -0
- package/tests/user/getMarginCalculation.ts +226 -1
- package/tests/user/test.ts +8 -4
package/src/dlob/DLOB.ts
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* Used by keeper bots to identify the best maker orders to match against taker fills.
|
|
6
6
|
*
|
|
7
7
|
* Key types:
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* `DLOBNode` — a single order node with price/size/user info (DLOBNode.ts)
|
|
9
|
+
* `DLOBSubscriber` — subscribes to on-chain accounts and keeps the DLOB live (DLOBSubscriber.ts)
|
|
10
|
+
* `NodeList` — sorted linked list of DLOBNodes per side/market (NodeList.ts)
|
|
11
11
|
* `orderBookLevels.ts` — aggregated L2/L3 book level construction for quoting
|
|
12
12
|
*/
|
|
13
13
|
import { getOrderSignature, NodeList } from './NodeList';
|
|
@@ -59,9 +59,12 @@ import {
|
|
|
59
59
|
import { isFallbackAvailableLiquiditySource } from '../math/auction';
|
|
60
60
|
import { convertToNumber } from '../math/conversion';
|
|
61
61
|
|
|
62
|
+
/** An on-chain order paired with the pubkey of its owning `User` account. */
|
|
62
63
|
export type DLOBOrder = { user: PublicKey; order: Order };
|
|
64
|
+
/** A list of `DLOBOrder`s, e.g. the flattened output of `DLOB.getDLOBOrders`. */
|
|
63
65
|
export type DLOBOrders = DLOBOrder[];
|
|
64
66
|
|
|
67
|
+
/** The full set of sorted `NodeList`s the DLOB maintains for one market, one per order category and side. */
|
|
65
68
|
export type MarketNodeLists = {
|
|
66
69
|
restingLimit: {
|
|
67
70
|
ask: NodeList<'restingLimit'>;
|
|
@@ -99,11 +102,13 @@ type OrderBookCallback = () => void;
|
|
|
99
102
|
*/
|
|
100
103
|
export type DLOBFilterFcn = (node: DLOBNode) => boolean;
|
|
101
104
|
|
|
105
|
+
/** A taker node paired with the maker node(s) it should be filled against. `makerNodes` is empty when the fill is expected to route through fallback (e.g. vAMM) liquidity or is an expiration/cancellation rather than a maker match. */
|
|
102
106
|
export type NodeToFill = {
|
|
103
107
|
node: DLOBNode;
|
|
104
108
|
makerNodes: DLOBNode[];
|
|
105
109
|
};
|
|
106
110
|
|
|
111
|
+
/** A trigger order whose `triggerPrice` has been crossed and is ready to be triggered on-chain. */
|
|
107
112
|
export type NodeToTrigger = {
|
|
108
113
|
node: TriggerOrderNode;
|
|
109
114
|
};
|
|
@@ -130,13 +135,26 @@ function getUserAccountOrThrow(node: DLOBNode): string {
|
|
|
130
135
|
return node.userAccount;
|
|
131
136
|
}
|
|
132
137
|
|
|
138
|
+
/**
|
|
139
|
+
* In-memory order book. Indexes every open order it is given into per-market, per-side sorted
|
|
140
|
+
* `NodeList`s (see `MarketNodeLists`), and provides the crossing/fill-finding logic
|
|
141
|
+
* (`findNodesToFill`) and aggregated book views (`getL2`/`getL3`) that keepers and clients use to
|
|
142
|
+
* predict and drive on-chain fills. A `DLOB` instance is normally built once per slot (e.g. via
|
|
143
|
+
* `initFromUserMap`) rather than mutated indefinitely, since state changes (`insertOrder`,
|
|
144
|
+
* `delete`) must be paired with the caller's own bookkeeping of what's already been applied.
|
|
145
|
+
*/
|
|
133
146
|
export class DLOB {
|
|
147
|
+
/** Order signatures (`getOrderSignature`) currently open, keyed by market type (`'perp'`/`'spot'`). */
|
|
134
148
|
openOrders = new Map<MarketTypeStr, Set<string>>();
|
|
149
|
+
/** Every market's `MarketNodeLists`, keyed by market type then market index. */
|
|
135
150
|
orderLists = new Map<MarketTypeStr, Map<number, MarketNodeLists>>();
|
|
151
|
+
/** The highest slot `updateRestingLimitOrders` has processed; used to skip redundant re-promotion of taking→resting orders when called with a slot that's already been seen. */
|
|
136
152
|
maxSlotForRestingLimitOrders = 0;
|
|
137
153
|
|
|
154
|
+
/** Set to `true` once `initFromUserMap` has successfully populated this instance; `initFromUserMap` is then a no-op. */
|
|
138
155
|
initialized = false;
|
|
139
156
|
|
|
157
|
+
/** Constructs an empty, uninitialized `DLOB` with no orders. Call `initFromUserMap` (or `insertOrder`/`insertSignedMsgOrder`) to populate it. */
|
|
140
158
|
public constructor() {
|
|
141
159
|
this.init();
|
|
142
160
|
}
|
|
@@ -195,6 +213,7 @@ export class DLOB {
|
|
|
195
213
|
return marketNodeLists;
|
|
196
214
|
}
|
|
197
215
|
|
|
216
|
+
/** Empties every order list and resets the DLOB to its freshly-constructed (uninitialized) state, including `maxSlotForRestingLimitOrders` and `initialized`. */
|
|
198
217
|
public clear() {
|
|
199
218
|
for (const openOrders of this.openOrders.values()) {
|
|
200
219
|
openOrders.clear();
|
|
@@ -218,9 +237,15 @@ export class DLOB {
|
|
|
218
237
|
}
|
|
219
238
|
|
|
220
239
|
/**
|
|
221
|
-
*
|
|
240
|
+
* Populates this DLOB from every open order across every user in `userMap`. For reduce-only
|
|
241
|
+
* orders, the fillable amount is capped via `calculateOrderBaseAssetAmount` against the
|
|
242
|
+
* user's existing perp position for that market, rather than trusting the order's full
|
|
243
|
+
* stated `baseAssetAmount`. No-ops (returns `false` immediately) if this instance has already
|
|
244
|
+
* been initialized — call `clear()` first to rebuild from scratch.
|
|
222
245
|
*
|
|
223
|
-
* @
|
|
246
|
+
* @param userMap map of all users' accounts to index orders from
|
|
247
|
+
* @param slot slot orders are inserted at, used to classify taking vs. resting limit orders
|
|
248
|
+
* @returns `true` if this call performed initialization, `false` if it was already initialized
|
|
224
249
|
*/
|
|
225
250
|
public async initFromUserMap(
|
|
226
251
|
userMap: UserMap,
|
|
@@ -258,6 +283,22 @@ export class DLOB {
|
|
|
258
283
|
return true;
|
|
259
284
|
}
|
|
260
285
|
|
|
286
|
+
/**
|
|
287
|
+
* Inserts a single on-chain order into the appropriate `NodeList` for its market/side/type.
|
|
288
|
+
* No-ops if the order's status isn't `open`, or if its `orderType` isn't one of the
|
|
289
|
+
* DLOB-supported types (`market`, `limit`, `triggerMarket`, `triggerLimit`, `oracle`).
|
|
290
|
+
* Lazily creates the market's `MarketNodeLists` (via `addOrderList`) on first insert for that
|
|
291
|
+
* market. Which list the order lands in (taking vs. resting limit, floating, market, or
|
|
292
|
+
* inactive trigger) is decided by `getListForOnChainOrder`.
|
|
293
|
+
*
|
|
294
|
+
* @param order the on-chain order to insert
|
|
295
|
+
* @param userAccount base58 pubkey string of the order's owner
|
|
296
|
+
* @param slot current slot, used to classify taking vs. resting limit orders
|
|
297
|
+
* @param baseAssetAmount remaining fillable base amount, BASE_PRECISION (1e9) — for
|
|
298
|
+
* reduce-only orders this should be the position-capped amount (see
|
|
299
|
+
* `calculateOrderBaseAssetAmount`), not the raw `order.baseAssetAmount`
|
|
300
|
+
* @param onInsert optional callback invoked after a successful insert
|
|
301
|
+
*/
|
|
261
302
|
public insertOrder(
|
|
262
303
|
order: Order,
|
|
263
304
|
userAccount: string,
|
|
@@ -297,6 +338,16 @@ export class DLOB {
|
|
|
297
338
|
}
|
|
298
339
|
}
|
|
299
340
|
|
|
341
|
+
/**
|
|
342
|
+
* Inserts an off-chain signed-message order (not yet landed on-chain) into the market's
|
|
343
|
+
* `signedMsg` bid/ask list, unconditionally (no status/order-type filtering, unlike
|
|
344
|
+
* `insertOrder`). Lazily creates the market's `MarketNodeLists` on first insert.
|
|
345
|
+
*
|
|
346
|
+
* @param order the signed-message order to insert
|
|
347
|
+
* @param userAccount base58 pubkey string of the order's owner
|
|
348
|
+
* @param baseAssetAmount remaining fillable base amount, BASE_PRECISION (1e9); defaults to `order.baseAssetAmount`
|
|
349
|
+
* @param onInsert optional callback invoked after insert
|
|
350
|
+
*/
|
|
300
351
|
public insertSignedMsgOrder(
|
|
301
352
|
order: Order,
|
|
302
353
|
userAccount: string,
|
|
@@ -323,6 +374,7 @@ export class DLOB {
|
|
|
323
374
|
}
|
|
324
375
|
}
|
|
325
376
|
|
|
377
|
+
/** Creates and registers an empty `MarketNodeLists` (all six order categories, both sides) for `marketIndex`, overwriting any existing lists for that market. */
|
|
326
378
|
addOrderList(marketType: MarketTypeStr, marketIndex: number): void {
|
|
327
379
|
this.getOrderListsForMarketType(marketType).set(marketIndex, {
|
|
328
380
|
restingLimit: {
|
|
@@ -352,6 +404,17 @@ export class DLOB {
|
|
|
352
404
|
});
|
|
353
405
|
}
|
|
354
406
|
|
|
407
|
+
/**
|
|
408
|
+
* Removes an order from whichever `NodeList` it currently lives in. No-ops if the order's
|
|
409
|
+
* status isn't `open`. First calls `updateRestingLimitOrders(slot)` so a taking-limit order
|
|
410
|
+
* that has since become a resting-limit order is looked up (and removed from) the correct
|
|
411
|
+
* list.
|
|
412
|
+
*
|
|
413
|
+
* @param order the order to remove
|
|
414
|
+
* @param userAccount pubkey of the order's owner
|
|
415
|
+
* @param slot current slot, used to resolve which list the order is currently in
|
|
416
|
+
* @param onDelete optional callback invoked after a successful delete
|
|
417
|
+
*/
|
|
355
418
|
public delete(
|
|
356
419
|
order: Order,
|
|
357
420
|
userAccount: PublicKey,
|
|
@@ -374,6 +437,18 @@ export class DLOB {
|
|
|
374
437
|
}
|
|
375
438
|
}
|
|
376
439
|
|
|
440
|
+
/**
|
|
441
|
+
* Determines which `NodeList` an order belongs in, given its current state and the slot:
|
|
442
|
+
* a trigger order (`triggerMarket`/`triggerLimit`) that hasn't fired yet goes in
|
|
443
|
+
* `trigger.above`/`trigger.below`; a market/oracle-type order goes in `market`; a limit order
|
|
444
|
+
* with a non-zero `oraclePriceOffset` goes in `floatingLimit`; otherwise a limit order goes in
|
|
445
|
+
* `restingLimit` once its auction is complete or it's post-only (per `isRestingLimitOrder`),
|
|
446
|
+
* and in `takingLimit` while still auctioning.
|
|
447
|
+
*
|
|
448
|
+
* @param order the order to classify
|
|
449
|
+
* @param slot current slot, used to evaluate `isRestingLimitOrder`
|
|
450
|
+
* @returns the matching `NodeList`, or `undefined` if the order's market has no `MarketNodeLists` registered yet (e.g. `insertOrder`/`addOrderList` hasn't been called for it)
|
|
451
|
+
*/
|
|
377
452
|
public getListForOnChainOrder(
|
|
378
453
|
order: Order,
|
|
379
454
|
slot: number
|
|
@@ -426,6 +501,15 @@ export class DLOB {
|
|
|
426
501
|
return list;
|
|
427
502
|
}
|
|
428
503
|
|
|
504
|
+
/**
|
|
505
|
+
* Promotes any `takingLimit` orders across all perp and spot markets whose auction has since
|
|
506
|
+
* completed (per `isRestingLimitOrder`) into their market's `restingLimit` list. No-ops if
|
|
507
|
+
* `slot` is not newer than the last slot this was called with (`maxSlotForRestingLimitOrders`),
|
|
508
|
+
* so it is cheap to call defensively before any read that depends on resting-limit state
|
|
509
|
+
* being current (most getters here do so internally).
|
|
510
|
+
*
|
|
511
|
+
* @param slot current slot
|
|
512
|
+
*/
|
|
429
513
|
public updateRestingLimitOrders(slot: number): void {
|
|
430
514
|
if (slot <= this.maxSlotForRestingLimitOrders) {
|
|
431
515
|
return;
|
|
@@ -438,6 +522,7 @@ export class DLOB {
|
|
|
438
522
|
this.updateRestingLimitOrdersForMarketType(slot, 'spot');
|
|
439
523
|
}
|
|
440
524
|
|
|
525
|
+
/** Does the `takingLimit` → `restingLimit` promotion (see `updateRestingLimitOrders`) for every market of one market type. */
|
|
441
526
|
updateRestingLimitOrdersForMarketType(
|
|
442
527
|
slot: number,
|
|
443
528
|
marketTypeStr: MarketTypeStr
|
|
@@ -478,6 +563,15 @@ export class DLOB {
|
|
|
478
563
|
}
|
|
479
564
|
}
|
|
480
565
|
|
|
566
|
+
/**
|
|
567
|
+
* Looks up an order by id/owner across every `NodeList` in the DLOB (perp and spot, all
|
|
568
|
+
* categories/sides) via `getNodeLists`. O(number of lists); prefer a narrower lookup (e.g.
|
|
569
|
+
* `NodeList.get`) if you already know the order's market/type.
|
|
570
|
+
*
|
|
571
|
+
* @param orderId the order's id (unique per user account)
|
|
572
|
+
* @param userAccount pubkey of the order's owner
|
|
573
|
+
* @returns the matching `Order`, or `undefined` if not found in any list
|
|
574
|
+
*/
|
|
481
575
|
public getOrder(orderId: number, userAccount: PublicKey): Order | undefined {
|
|
482
576
|
const orderSignature = getOrderSignature(orderId, userAccount.toString());
|
|
483
577
|
for (const nodeList of this.getNodeLists()) {
|
|
@@ -490,6 +584,28 @@ export class DLOB {
|
|
|
490
584
|
return undefined;
|
|
491
585
|
}
|
|
492
586
|
|
|
587
|
+
/**
|
|
588
|
+
* Top-level entry point for keepers: finds every node in one market that is currently
|
|
589
|
+
* fillable, combining four sources — crossing resting-limit orders
|
|
590
|
+
* (`findRestingLimitOrderNodesToFill`), taking (still-auctioning) orders that cross a maker or
|
|
591
|
+
* fallback price (`findTakingNodesToFill`), expired orders to cancel/settle
|
|
592
|
+
* (`findExpiredNodesToFill`), and unfillable reduce-only orders below the step size to cancel
|
|
593
|
+
* (`findUnfillableReduceOnlyOrdersToCancel`). Returns `[]` immediately if fills are paused for
|
|
594
|
+
* this market (`fillPaused`). The market's `orderTickSize` is read from `marketAccount` and
|
|
595
|
+
* threaded through to every price comparison below so all crossing checks agree with on-chain
|
|
596
|
+
* price standardization.
|
|
597
|
+
*
|
|
598
|
+
* @param marketIndex the market to scan
|
|
599
|
+
* @param fallbackBid best available non-DLOB bid (e.g. vAMM), PRICE_PRECISION (1e6); `undefined` disables fallback-bid crossing checks
|
|
600
|
+
* @param fallbackAsk best available non-DLOB ask (e.g. vAMM), PRICE_PRECISION (1e6); `undefined` disables fallback-ask crossing checks
|
|
601
|
+
* @param slot current slot
|
|
602
|
+
* @param ts current unix timestamp (seconds), used to find expired orders
|
|
603
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`; determines whether `oraclePriceData`/`marketAccount` are typed as spot or perp
|
|
604
|
+
* @param oraclePriceData oracle price data for the market (`MMOraclePriceData` for perp, `OraclePriceData` for spot)
|
|
605
|
+
* @param stateAccount global protocol state, used for pause checks and fee-tier maker rebates
|
|
606
|
+
* @param marketAccount the market's account, used for `orderTickSize`/`orderStepSize` and pause checks
|
|
607
|
+
* @returns deduplicated `NodeToFill`s (see `mergeNodesToFill`) merging resting-limit and taking-order matches, plus expired and cancel-eligible nodes appended
|
|
608
|
+
*/
|
|
493
609
|
public findNodesToFill<T extends MarketType>(
|
|
494
610
|
marketIndex: number,
|
|
495
611
|
fallbackBid: BN | undefined,
|
|
@@ -511,6 +627,9 @@ export class DLOB {
|
|
|
511
627
|
|
|
512
628
|
const isAmmPaused = ammPaused(stateAccount, marketAccount);
|
|
513
629
|
|
|
630
|
+
const tickSize = (marketAccount as PerpMarketAccount | SpotMarketAccount)
|
|
631
|
+
.orderTickSize;
|
|
632
|
+
|
|
514
633
|
const { makerRebateNumerator, makerRebateDenominator } =
|
|
515
634
|
this.getMakerRebate(marketType, stateAccount, marketAccount);
|
|
516
635
|
|
|
@@ -524,7 +643,8 @@ export class DLOB {
|
|
|
524
643
|
stateAccount,
|
|
525
644
|
marketAccount,
|
|
526
645
|
fallbackAsk,
|
|
527
|
-
fallbackBid
|
|
646
|
+
fallbackBid,
|
|
647
|
+
tickSize
|
|
528
648
|
);
|
|
529
649
|
|
|
530
650
|
const restingLimitOrderNodesToFill: Array<NodeToFill> =
|
|
@@ -539,7 +659,8 @@ export class DLOB {
|
|
|
539
659
|
makerRebateNumerator,
|
|
540
660
|
makerRebateDenominator,
|
|
541
661
|
fallbackAsk,
|
|
542
|
-
fallbackBid
|
|
662
|
+
fallbackBid,
|
|
663
|
+
tickSize
|
|
543
664
|
);
|
|
544
665
|
|
|
545
666
|
// get expired market nodes
|
|
@@ -569,6 +690,18 @@ export class DLOB {
|
|
|
569
690
|
.concat(cancelReduceOnlyNodesToFill);
|
|
570
691
|
}
|
|
571
692
|
|
|
693
|
+
/**
|
|
694
|
+
* Reads the tier-0 maker rebate fraction (`makerRebateNumerator / makerRebateDenominator`)
|
|
695
|
+
* for a market from `stateAccount`'s perp/spot fee structure, then scales the numerator up by
|
|
696
|
+
* the market's `feeAdjustment` percentage if one is set. Used by `findRestingLimitOrderNodesToFill`
|
|
697
|
+
* to size the buffer added to fallback prices so fallback fills aren't triggered by rebate-sized
|
|
698
|
+
* noise.
|
|
699
|
+
*
|
|
700
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
701
|
+
* @param stateAccount global protocol state holding the perp/spot fee tier tables
|
|
702
|
+
* @param marketAccount the specific market, whose optional `feeAdjustment` (percent) scales the rebate
|
|
703
|
+
* @returns the rebate as a numerator/denominator pair (unitless fraction, not a fixed-point BN)
|
|
704
|
+
*/
|
|
572
705
|
getMakerRebate(
|
|
573
706
|
marketType: MarketType,
|
|
574
707
|
stateAccount: StateAccount,
|
|
@@ -597,6 +730,16 @@ export class DLOB {
|
|
|
597
730
|
return { makerRebateNumerator, makerRebateDenominator };
|
|
598
731
|
}
|
|
599
732
|
|
|
733
|
+
/**
|
|
734
|
+
* Merges two `NodeToFill` arrays (typically resting-limit crossings and taking-order
|
|
735
|
+
* crossings for the same market/pass) by taker order signature, concatenating `makerNodes`
|
|
736
|
+
* for any taker that appears in both — e.g. an order that both crosses a resting maker and
|
|
737
|
+
* separately crosses fallback liquidity ends up as one `NodeToFill` with both maker sources.
|
|
738
|
+
*
|
|
739
|
+
* @param restingLimitOrderNodesToFill fills found via resting-limit crossing
|
|
740
|
+
* @param takingOrderNodesToFill fills found via taking-order crossing
|
|
741
|
+
* @returns one `NodeToFill` per distinct taker order, with all matched maker nodes combined
|
|
742
|
+
*/
|
|
600
743
|
mergeNodesToFill(
|
|
601
744
|
restingLimitOrderNodesToFill: NodeToFill[],
|
|
602
745
|
takingOrderNodesToFill: NodeToFill[]
|
|
@@ -631,6 +774,29 @@ export class DLOB {
|
|
|
631
774
|
return Array.from(mergedNodesToFill.values());
|
|
632
775
|
}
|
|
633
776
|
|
|
777
|
+
/**
|
|
778
|
+
* Finds resting-limit-order fills for a market: resting bids/asks that cross each other
|
|
779
|
+
* (`findCrossingRestingLimitOrders`), plus resting asks that cross the fallback bid and
|
|
780
|
+
* resting bids that cross the fallback ask (each skipped entirely if the AMM is paused).
|
|
781
|
+
* The fallback price on each side is tightened by the maker rebate before comparing, so a
|
|
782
|
+
* maker order priced exactly at the rebate-adjusted fallback isn't spuriously flagged as
|
|
783
|
+
* crossing (`fallbackBidWithBuffer = fallbackBid - fallbackBid * makerRebateNumerator / makerRebateDenominator`,
|
|
784
|
+
* and symmetrically for the ask).
|
|
785
|
+
*
|
|
786
|
+
* @param marketIndex the market to scan
|
|
787
|
+
* @param slot current slot
|
|
788
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
789
|
+
* @param oraclePriceData oracle price data for the market
|
|
790
|
+
* @param isAmmPaused if true, skips fallback-crossing checks (only maker-vs-maker crossings are returned)
|
|
791
|
+
* @param stateAccount global protocol state, forwarded to fallback-availability checks
|
|
792
|
+
* @param marketAccount the market's account, forwarded to fallback-availability checks
|
|
793
|
+
* @param makerRebateNumerator numerator of the maker rebate fraction (see `getMakerRebate`)
|
|
794
|
+
* @param makerRebateDenominator denominator of the maker rebate fraction (see `getMakerRebate`)
|
|
795
|
+
* @param fallbackAsk best available non-DLOB ask, PRICE_PRECISION (1e6); `undefined` skips fallback-ask crossing
|
|
796
|
+
* @param fallbackBid best available non-DLOB bid, PRICE_PRECISION (1e6); `undefined` skips fallback-bid crossing
|
|
797
|
+
* @param tickSize market order tick size, PRICE_PRECISION (1e6), threaded into every price comparison; omit to fall back to no rounding
|
|
798
|
+
* @returns `NodeToFill`s for maker-crossing-maker and maker-crossing-fallback matches
|
|
799
|
+
*/
|
|
634
800
|
public findRestingLimitOrderNodesToFill<T extends MarketType>(
|
|
635
801
|
marketIndex: number,
|
|
636
802
|
slot: number,
|
|
@@ -646,7 +812,8 @@ export class DLOB {
|
|
|
646
812
|
makerRebateNumerator: number,
|
|
647
813
|
makerRebateDenominator: number,
|
|
648
814
|
fallbackAsk: BN | undefined,
|
|
649
|
-
fallbackBid: BN | undefined
|
|
815
|
+
fallbackBid: BN | undefined,
|
|
816
|
+
tickSize?: BN
|
|
650
817
|
): NodeToFill[] {
|
|
651
818
|
const nodesToFill = new Array<NodeToFill>();
|
|
652
819
|
|
|
@@ -654,7 +821,8 @@ export class DLOB {
|
|
|
654
821
|
marketIndex,
|
|
655
822
|
slot,
|
|
656
823
|
marketType,
|
|
657
|
-
oraclePriceData
|
|
824
|
+
oraclePriceData,
|
|
825
|
+
tickSize
|
|
658
826
|
);
|
|
659
827
|
|
|
660
828
|
for (const crossingNode of crossingNodes) {
|
|
@@ -666,7 +834,9 @@ export class DLOB {
|
|
|
666
834
|
marketIndex,
|
|
667
835
|
slot,
|
|
668
836
|
marketType,
|
|
669
|
-
oraclePriceData
|
|
837
|
+
oraclePriceData,
|
|
838
|
+
undefined,
|
|
839
|
+
tickSize
|
|
670
840
|
);
|
|
671
841
|
|
|
672
842
|
const fallbackBidWithBuffer = fallbackBid.sub(
|
|
@@ -685,7 +855,8 @@ export class DLOB {
|
|
|
685
855
|
return askPrice.lte(fallbackBidWithBuffer);
|
|
686
856
|
},
|
|
687
857
|
stateAccount,
|
|
688
|
-
marketAccount
|
|
858
|
+
marketAccount,
|
|
859
|
+
tickSize
|
|
689
860
|
);
|
|
690
861
|
|
|
691
862
|
for (const askCrossingFallback of asksCrossingFallback) {
|
|
@@ -698,7 +869,9 @@ export class DLOB {
|
|
|
698
869
|
marketIndex,
|
|
699
870
|
slot,
|
|
700
871
|
marketType,
|
|
701
|
-
oraclePriceData
|
|
872
|
+
oraclePriceData,
|
|
873
|
+
undefined,
|
|
874
|
+
tickSize
|
|
702
875
|
);
|
|
703
876
|
|
|
704
877
|
const fallbackAskWithBuffer = fallbackAsk.add(
|
|
@@ -717,7 +890,8 @@ export class DLOB {
|
|
|
717
890
|
return bidPrice.gte(fallbackAskWithBuffer);
|
|
718
891
|
},
|
|
719
892
|
stateAccount,
|
|
720
|
-
marketAccount
|
|
893
|
+
marketAccount,
|
|
894
|
+
tickSize
|
|
721
895
|
);
|
|
722
896
|
|
|
723
897
|
for (const bidCrossingFallback of bidsCrossingFallback) {
|
|
@@ -728,6 +902,27 @@ export class DLOB {
|
|
|
728
902
|
return nodesToFill;
|
|
729
903
|
}
|
|
730
904
|
|
|
905
|
+
/**
|
|
906
|
+
* Finds fills for taking (still-auctioning) orders: taking asks crossing resting bids or the
|
|
907
|
+
* fallback bid, and taking bids crossing resting asks or the fallback ask
|
|
908
|
+
* (`findTakingNodesCrossingMakerNodes` / `findNodesCrossingFallbackLiquidity`). Fallback
|
|
909
|
+
* crossing checks are skipped entirely when `isAmmPaused`. For spot markets, a taking order is
|
|
910
|
+
* only allowed to cross the opposite fallback price if doing so wouldn't also require crossing
|
|
911
|
+
* beyond the *other* fallback price (see the inline `fallbackBid`/`fallbackAsk` guards) —
|
|
912
|
+
* this prevents a taking order from routing through DLOB makers priced worse than the AMM.
|
|
913
|
+
*
|
|
914
|
+
* @param marketIndex the market to scan
|
|
915
|
+
* @param slot current slot
|
|
916
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
917
|
+
* @param oraclePriceData oracle price data for the market
|
|
918
|
+
* @param isAmmPaused if true, skips fallback-crossing checks
|
|
919
|
+
* @param state global protocol state, forwarded to fallback-availability checks
|
|
920
|
+
* @param marketAccount the market's account, forwarded to fallback-availability checks
|
|
921
|
+
* @param fallbackAsk best available non-DLOB ask, PRICE_PRECISION (1e6); `undefined` skips ask-side fallback crossing
|
|
922
|
+
* @param fallbackBid best available non-DLOB bid, PRICE_PRECISION (1e6); `undefined` skips bid-side fallback crossing
|
|
923
|
+
* @param tickSize market order tick size, PRICE_PRECISION (1e6), threaded into every price comparison; omit to fall back to no rounding
|
|
924
|
+
* @returns `NodeToFill`s for taking orders that cross a resting maker or fallback liquidity
|
|
925
|
+
*/
|
|
731
926
|
public findTakingNodesToFill<T extends MarketType>(
|
|
732
927
|
marketIndex: number,
|
|
733
928
|
slot: number,
|
|
@@ -741,7 +936,8 @@ export class DLOB {
|
|
|
741
936
|
? SpotMarketAccount
|
|
742
937
|
: PerpMarketAccount,
|
|
743
938
|
fallbackAsk: BN | undefined,
|
|
744
|
-
fallbackBid?: BN | undefined
|
|
939
|
+
fallbackBid?: BN | undefined,
|
|
940
|
+
tickSize?: BN
|
|
745
941
|
): NodeToFill[] {
|
|
746
942
|
const nodesToFill = new Array<NodeToFill>();
|
|
747
943
|
|
|
@@ -770,7 +966,8 @@ export class DLOB {
|
|
|
770
966
|
}
|
|
771
967
|
}
|
|
772
968
|
return takerPrice === undefined || takerPrice.lte(makerPrice);
|
|
773
|
-
}
|
|
969
|
+
},
|
|
970
|
+
tickSize
|
|
774
971
|
);
|
|
775
972
|
for (const takingAskCrossingBid of takingAsksCrossingBids) {
|
|
776
973
|
nodesToFill.push(takingAskCrossingBid);
|
|
@@ -793,7 +990,8 @@ export class DLOB {
|
|
|
793
990
|
return takerPrice === undefined || takerPrice.lte(fallbackBid);
|
|
794
991
|
},
|
|
795
992
|
state,
|
|
796
|
-
marketAccount
|
|
993
|
+
marketAccount,
|
|
994
|
+
tickSize
|
|
797
995
|
);
|
|
798
996
|
|
|
799
997
|
for (const takingAskCrossingFallback of takingAsksCrossingFallback) {
|
|
@@ -827,7 +1025,8 @@ export class DLOB {
|
|
|
827
1025
|
}
|
|
828
1026
|
|
|
829
1027
|
return takerPrice === undefined || takerPrice.gte(makerPrice);
|
|
830
|
-
}
|
|
1028
|
+
},
|
|
1029
|
+
tickSize
|
|
831
1030
|
);
|
|
832
1031
|
|
|
833
1032
|
for (const takingBidToFill of takingBidsToFill) {
|
|
@@ -851,7 +1050,8 @@ export class DLOB {
|
|
|
851
1050
|
return takerPrice === undefined || takerPrice.gte(fallbackAsk);
|
|
852
1051
|
},
|
|
853
1052
|
state,
|
|
854
|
-
marketAccount
|
|
1053
|
+
marketAccount,
|
|
1054
|
+
tickSize
|
|
855
1055
|
);
|
|
856
1056
|
for (const marketBidCrossingFallback of takingBidsCrossingFallback) {
|
|
857
1057
|
nodesToFill.push(marketBidCrossingFallback);
|
|
@@ -861,6 +1061,28 @@ export class DLOB {
|
|
|
861
1061
|
return nodesToFill;
|
|
862
1062
|
}
|
|
863
1063
|
|
|
1064
|
+
/**
|
|
1065
|
+
* Walks `takerNodeGenerator` (taking bids or asks, sorted by arrival slot) against a fresh
|
|
1066
|
+
* maker-side generator (built per taker via `makerNodeGeneratorFn`, e.g.
|
|
1067
|
+
* `getRestingLimitBids`) and records a `NodeToFill` for every taker/maker pair that
|
|
1068
|
+
* `doesCross` accepts, skipping same-user matches. For each match this method also **mutates
|
|
1069
|
+
* DLOB state**: it applies the simulated fill to both the maker's and taker's order lists
|
|
1070
|
+
* (via `NodeList.update`) so subsequent iterations see updated `baseAssetAmountFilled` and a
|
|
1071
|
+
* taker stops matching once fully filled. Because maker nodes (sorted by price) are scanned
|
|
1072
|
+
* in order, `doesCross` returning false breaks out of the maker loop entirely — this is
|
|
1073
|
+
* correct for resting-limit makers but relies on the maker generator being price-sorted, not
|
|
1074
|
+
* time-sorted.
|
|
1075
|
+
*
|
|
1076
|
+
* @param marketIndex the market being scanned (used only to route signed-message taker fills into the right list)
|
|
1077
|
+
* @param slot current slot, forwarded to price lookups
|
|
1078
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
1079
|
+
* @param oraclePriceData oracle price data for the market
|
|
1080
|
+
* @param takerNodeGenerator taking orders to check, e.g. from `getTakingAsks`/`getTakingBids`
|
|
1081
|
+
* @param makerNodeGeneratorFn factory invoked once per taker to get a fresh maker-side generator, e.g. `getRestingLimitBids`/`getRestingLimitAsks`
|
|
1082
|
+
* @param doesCross given the taker's price (`undefined` if it has none, e.g. still mid-auction) and the maker's price, returns whether they cross
|
|
1083
|
+
* @param tickSize market order tick size, PRICE_PRECISION (1e6), threaded into all price lookups
|
|
1084
|
+
* @returns one `NodeToFill` per matched taker/maker pair (a taker matched against multiple makers yields multiple entries, each with one maker)
|
|
1085
|
+
*/
|
|
864
1086
|
public findTakingNodesCrossingMakerNodes<T extends MarketType>(
|
|
865
1087
|
marketIndex: number,
|
|
866
1088
|
slot: number,
|
|
@@ -875,9 +1097,12 @@ export class DLOB {
|
|
|
875
1097
|
marketType: T,
|
|
876
1098
|
oraclePriceData: T extends { spot: unknown }
|
|
877
1099
|
? OraclePriceData
|
|
878
|
-
: MMOraclePriceData
|
|
1100
|
+
: MMOraclePriceData,
|
|
1101
|
+
filterFcn?: DLOBFilterFcn,
|
|
1102
|
+
tickSize?: BN
|
|
879
1103
|
) => Generator<DLOBNode>,
|
|
880
|
-
doesCross: (takerPrice: BN | undefined, makerPrice: BN) => boolean
|
|
1104
|
+
doesCross: (takerPrice: BN | undefined, makerPrice: BN) => boolean,
|
|
1105
|
+
tickSize?: BN
|
|
881
1106
|
): NodeToFill[] {
|
|
882
1107
|
const nodesToFill = new Array<NodeToFill>();
|
|
883
1108
|
|
|
@@ -886,7 +1111,9 @@ export class DLOB {
|
|
|
886
1111
|
marketIndex,
|
|
887
1112
|
slot,
|
|
888
1113
|
marketType,
|
|
889
|
-
oraclePriceData
|
|
1114
|
+
oraclePriceData,
|
|
1115
|
+
undefined,
|
|
1116
|
+
tickSize
|
|
890
1117
|
);
|
|
891
1118
|
|
|
892
1119
|
for (const makerNode of makerNodeGenerator) {
|
|
@@ -896,8 +1123,12 @@ export class DLOB {
|
|
|
896
1123
|
continue;
|
|
897
1124
|
}
|
|
898
1125
|
|
|
899
|
-
const makerPrice = makerNode.getPriceOrThrow(
|
|
900
|
-
|
|
1126
|
+
const makerPrice = makerNode.getPriceOrThrow(
|
|
1127
|
+
oraclePriceData,
|
|
1128
|
+
slot,
|
|
1129
|
+
tickSize
|
|
1130
|
+
);
|
|
1131
|
+
const takerPrice = takerNode.getPrice(oraclePriceData, slot, tickSize);
|
|
901
1132
|
|
|
902
1133
|
const ordersCross = doesCross(takerPrice, makerPrice);
|
|
903
1134
|
if (!ordersCross) {
|
|
@@ -963,6 +1194,27 @@ export class DLOB {
|
|
|
963
1194
|
return nodesToFill;
|
|
964
1195
|
}
|
|
965
1196
|
|
|
1197
|
+
/**
|
|
1198
|
+
* Scans `nodeGenerator` for nodes that both cross the fallback price (`doesCross`, evaluated
|
|
1199
|
+
* against each node's `getLimitPrice`, or crossing unconditionally if the node has no limit
|
|
1200
|
+
* price) and have fallback liquidity actually available to fill against. For spot markets,
|
|
1201
|
+
* post-only orders are skipped (they can never take against the AMM) and fallback liquidity
|
|
1202
|
+
* is always considered available; for perp markets, availability additionally requires
|
|
1203
|
+
* `isFallbackAvailableLiquiditySource` (broadly: the order's auction is complete and the
|
|
1204
|
+
* oracle is valid enough for AMM fills). Does not mutate any order state — unlike
|
|
1205
|
+
* `findTakingNodesCrossingMakerNodes`, fallback fills are expected to be sized/settled
|
|
1206
|
+
* on-chain rather than simulated here.
|
|
1207
|
+
*
|
|
1208
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
1209
|
+
* @param slot current slot
|
|
1210
|
+
* @param oraclePriceData oracle price data for the market
|
|
1211
|
+
* @param nodeGenerator candidate nodes to check, e.g. resting-limit or taking orders
|
|
1212
|
+
* @param doesCross given a node's limit price (`undefined` if it has none), returns whether it crosses the fallback price
|
|
1213
|
+
* @param state global protocol state, used by the perp fallback-availability check
|
|
1214
|
+
* @param marketAccount the market's account, used by the perp fallback-availability check
|
|
1215
|
+
* @param tickSize market order tick size, PRICE_PRECISION (1e6), used to resolve each node's limit price
|
|
1216
|
+
* @returns `NodeToFill`s with an empty `makerNodes` array (the fill is expected to route through fallback liquidity, not a DLOB maker)
|
|
1217
|
+
*/
|
|
966
1218
|
public findNodesCrossingFallbackLiquidity<T extends MarketType>(
|
|
967
1219
|
marketType: T,
|
|
968
1220
|
slot: number,
|
|
@@ -974,7 +1226,8 @@ export class DLOB {
|
|
|
974
1226
|
state: StateAccount,
|
|
975
1227
|
marketAccount: T extends { spot: unknown }
|
|
976
1228
|
? SpotMarketAccount
|
|
977
|
-
: PerpMarketAccount
|
|
1229
|
+
: PerpMarketAccount,
|
|
1230
|
+
tickSize?: BN
|
|
978
1231
|
): NodeToFill[] {
|
|
979
1232
|
const nodesToFill = new Array<NodeToFill>();
|
|
980
1233
|
|
|
@@ -987,7 +1240,13 @@ export class DLOB {
|
|
|
987
1240
|
continue;
|
|
988
1241
|
}
|
|
989
1242
|
const nodeOrder = getOrderOrThrow(node);
|
|
990
|
-
const nodePrice = getLimitPrice(
|
|
1243
|
+
const nodePrice = getLimitPrice(
|
|
1244
|
+
nodeOrder,
|
|
1245
|
+
oraclePriceData,
|
|
1246
|
+
slot,
|
|
1247
|
+
undefined,
|
|
1248
|
+
tickSize
|
|
1249
|
+
);
|
|
991
1250
|
|
|
992
1251
|
// order crosses if there is no limit price or it crosses fallback price
|
|
993
1252
|
const crosses = doesCross(nodePrice);
|
|
@@ -1016,6 +1275,20 @@ export class DLOB {
|
|
|
1016
1275
|
return nodesToFill;
|
|
1017
1276
|
}
|
|
1018
1277
|
|
|
1278
|
+
/**
|
|
1279
|
+
* Finds orders in a market that are eligible to be expired: any non-trigger, non-TIF-limit
|
|
1280
|
+
* order whose `maxTs` (plus a 25-second buffer for limit orders, via `isOrderExpired`) has
|
|
1281
|
+
* passed the given timestamp. Also proactively removes (not just reports) signed-message
|
|
1282
|
+
* orders whose auction window (`order.slot + order.auctionDuration`) has passed `slot`, since
|
|
1283
|
+
* those never landed on-chain and have no on-chain expiration to wait for.
|
|
1284
|
+
*
|
|
1285
|
+
* @param marketIndex the market to scan
|
|
1286
|
+
* @param ts current unix timestamp (seconds)
|
|
1287
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
1288
|
+
* @param slot current slot; required if the market has any signed-message orders (throws otherwise)
|
|
1289
|
+
* @returns `NodeToFill`s (with empty `makerNodes`) for orders ready to expire
|
|
1290
|
+
* @throws if a signed-message order is present and `slot` was not provided
|
|
1291
|
+
*/
|
|
1019
1292
|
public findExpiredNodesToFill(
|
|
1020
1293
|
marketIndex: number,
|
|
1021
1294
|
ts: number,
|
|
@@ -1103,6 +1376,17 @@ export class DLOB {
|
|
|
1103
1376
|
return nodesToFill;
|
|
1104
1377
|
}
|
|
1105
1378
|
|
|
1379
|
+
/**
|
|
1380
|
+
* Finds reduce-only orders across every category/side in a market whose remaining
|
|
1381
|
+
* `baseAssetAmount` (as tracked on the node, not necessarily the order's original size) has
|
|
1382
|
+
* dropped below the market's minimum step size — meaning the order can never be filled again
|
|
1383
|
+
* and should be canceled by a keeper rather than left to linger.
|
|
1384
|
+
*
|
|
1385
|
+
* @param marketIndex the market to scan
|
|
1386
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
1387
|
+
* @param stepSize market's minimum order step size, BASE_PRECISION (1e9)
|
|
1388
|
+
* @returns `NodeToFill`s (with empty `makerNodes`) for reduce-only orders that should be canceled
|
|
1389
|
+
*/
|
|
1106
1390
|
public findUnfillableReduceOnlyOrdersToCancel(
|
|
1107
1391
|
marketIndex: number,
|
|
1108
1392
|
marketType: MarketType,
|
|
@@ -1149,6 +1433,19 @@ export class DLOB {
|
|
|
1149
1433
|
|
|
1150
1434
|
return nodesToFill;
|
|
1151
1435
|
}
|
|
1436
|
+
/**
|
|
1437
|
+
* Yields taking (still-auctioning) bid nodes for a market — market-bid orders, taking-limit
|
|
1438
|
+
* bids, and signed-message bids not yet resting — merged in arrival order (earliest `slot`
|
|
1439
|
+
* first, via `getBestNode`). Calls `updateRestingLimitOrders(slot)` first so a signed-message
|
|
1440
|
+
* order that has since become a resting-limit order is excluded here.
|
|
1441
|
+
*
|
|
1442
|
+
* @param marketIndex the market to scan
|
|
1443
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
1444
|
+
* @param slot current slot
|
|
1445
|
+
* @param oraclePriceData oracle price data for the market (unused for the ordering itself, forwarded to `getBestNode`)
|
|
1446
|
+
* @param filterFcn optional predicate; nodes it rejects are skipped and not yielded
|
|
1447
|
+
* @returns a generator of taking bid nodes, or an empty generator if the market has no `MarketNodeLists`
|
|
1448
|
+
*/
|
|
1152
1449
|
*getTakingBids<T extends MarketType>(
|
|
1153
1450
|
marketIndex: number,
|
|
1154
1451
|
marketType: T,
|
|
@@ -1188,6 +1485,7 @@ export class DLOB {
|
|
|
1188
1485
|
);
|
|
1189
1486
|
}
|
|
1190
1487
|
|
|
1488
|
+
/** Same as `getTakingBids`, but for the ask side. */
|
|
1191
1489
|
*getTakingAsks<T extends MarketType>(
|
|
1192
1490
|
marketIndex: number,
|
|
1193
1491
|
marketType: T,
|
|
@@ -1227,6 +1525,7 @@ export class DLOB {
|
|
|
1227
1525
|
);
|
|
1228
1526
|
}
|
|
1229
1527
|
|
|
1528
|
+
/** Filters a `signedMsg` `NodeList`'s nodes by an arbitrary predicate — used to split signed-message orders into "still taking" vs. "now resting" subsets based on `isRestingLimitOrder`. */
|
|
1230
1529
|
protected *signedMsgGenerator(
|
|
1231
1530
|
signedMsgOrderList: NodeList<'signedMsg'>,
|
|
1232
1531
|
filter: (x: DLOBNode) => boolean
|
|
@@ -1238,6 +1537,20 @@ export class DLOB {
|
|
|
1238
1537
|
}
|
|
1239
1538
|
}
|
|
1240
1539
|
|
|
1540
|
+
/**
|
|
1541
|
+
* K-way-merges multiple node generators (e.g. one per order category feeding one side of the
|
|
1542
|
+
* book) into a single generator ordered by `compareFcn`, skipping nodes that are already
|
|
1543
|
+
* fully filled (`isBaseFilled`) or rejected by `filterFcn`. This is the shared core behind
|
|
1544
|
+
* `getTakingBids`/`getTakingAsks`/`getRestingLimitBids`/`getRestingLimitAsks`/`getBids`/`getAsks`
|
|
1545
|
+
* — each just supplies a different `generatorList` and `compareFcn`.
|
|
1546
|
+
*
|
|
1547
|
+
* @param generatorList the node generators to merge; each must already be sorted per `compareFcn`
|
|
1548
|
+
* @param oraclePriceData oracle price data, forwarded to `compareFcn`
|
|
1549
|
+
* @param slot current slot, forwarded to `compareFcn`
|
|
1550
|
+
* @param compareFcn returns true if `bestDLOBNode` should be preferred over `currentDLOBNode`
|
|
1551
|
+
* @param filterFcn optional predicate; nodes it rejects are advanced past and not yielded
|
|
1552
|
+
* @returns a single generator yielding the merged, filtered, non-fully-filled nodes in `compareFcn` order
|
|
1553
|
+
*/
|
|
1241
1554
|
protected *getBestNode<T extends MarketTypeStr>(
|
|
1242
1555
|
generatorList: Array<Generator<DLOBNode>>,
|
|
1243
1556
|
oraclePriceData: T extends 'spot' ? OraclePriceData : MMOraclePriceData,
|
|
@@ -1298,6 +1611,23 @@ export class DLOB {
|
|
|
1298
1611
|
}
|
|
1299
1612
|
}
|
|
1300
1613
|
|
|
1614
|
+
/**
|
|
1615
|
+
* Yields resting-limit ask nodes for a market — `restingLimit`, `floatingLimit`, and any
|
|
1616
|
+
* `signedMsg` asks that have become resting — merged best-price-first (lowest ask price
|
|
1617
|
+
* first, ties broken by `getBestNode`'s underlying comparator). Calls
|
|
1618
|
+
* `updateRestingLimitOrders(slot)` first. `tickSize` is threaded into every price comparison
|
|
1619
|
+
* via `DLOBNode.getPriceOrThrow`, so pass the market's `orderTickSize` to match on-chain
|
|
1620
|
+
* price standardization — omitting it defaults to no rounding (tick of 1).
|
|
1621
|
+
*
|
|
1622
|
+
* @param marketIndex the market to scan
|
|
1623
|
+
* @param slot current slot
|
|
1624
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
1625
|
+
* @param oraclePriceData oracle price data for the market; required for spot markets (throws if missing)
|
|
1626
|
+
* @param filterFcn optional predicate; nodes it rejects are skipped
|
|
1627
|
+
* @param tickSize market order tick size, PRICE_PRECISION (1e6); defaults to no rounding if omitted
|
|
1628
|
+
* @returns a generator of resting-limit ask nodes, best price first
|
|
1629
|
+
* @throws if `marketType` is spot and `oraclePriceData` is not provided; also throws (via `getPriceOrThrow`) if any node has no resolvable limit price
|
|
1630
|
+
*/
|
|
1301
1631
|
*getRestingLimitAsks<T extends MarketType>(
|
|
1302
1632
|
marketIndex: number,
|
|
1303
1633
|
slot: number,
|
|
@@ -1305,7 +1635,8 @@ export class DLOB {
|
|
|
1305
1635
|
oraclePriceData: T extends { spot: unknown }
|
|
1306
1636
|
? OraclePriceData
|
|
1307
1637
|
: MMOraclePriceData,
|
|
1308
|
-
filterFcn?: DLOBFilterFcn
|
|
1638
|
+
filterFcn?: DLOBFilterFcn,
|
|
1639
|
+
tickSize?: BN
|
|
1309
1640
|
): Generator<DLOBNode> {
|
|
1310
1641
|
if (isVariant(marketType, 'spot') && !oraclePriceData) {
|
|
1311
1642
|
throw new Error('Must provide OraclePriceData to get spot asks');
|
|
@@ -1334,13 +1665,14 @@ export class DLOB {
|
|
|
1334
1665
|
slot,
|
|
1335
1666
|
(bestNode, currentNode, slot, oraclePriceData) => {
|
|
1336
1667
|
return bestNode
|
|
1337
|
-
.getPriceOrThrow(oraclePriceData, slot)
|
|
1338
|
-
.lt(currentNode.getPriceOrThrow(oraclePriceData, slot));
|
|
1668
|
+
.getPriceOrThrow(oraclePriceData, slot, tickSize)
|
|
1669
|
+
.lt(currentNode.getPriceOrThrow(oraclePriceData, slot, tickSize));
|
|
1339
1670
|
},
|
|
1340
1671
|
filterFcn
|
|
1341
1672
|
);
|
|
1342
1673
|
}
|
|
1343
1674
|
|
|
1675
|
+
/** Same as `getRestingLimitAsks`, but for the bid side (merged best-price-first, highest bid first). */
|
|
1344
1676
|
*getRestingLimitBids<T extends MarketType>(
|
|
1345
1677
|
marketIndex: number,
|
|
1346
1678
|
slot: number,
|
|
@@ -1348,7 +1680,8 @@ export class DLOB {
|
|
|
1348
1680
|
oraclePriceData: T extends { spot: unknown }
|
|
1349
1681
|
? OraclePriceData
|
|
1350
1682
|
: MMOraclePriceData,
|
|
1351
|
-
filterFcn?: DLOBFilterFcn
|
|
1683
|
+
filterFcn?: DLOBFilterFcn,
|
|
1684
|
+
tickSize?: BN
|
|
1352
1685
|
): Generator<DLOBNode> {
|
|
1353
1686
|
if (isVariant(marketType, 'spot') && !oraclePriceData) {
|
|
1354
1687
|
throw new Error('Must provide OraclePriceData to get spot bids');
|
|
@@ -1377,21 +1710,28 @@ export class DLOB {
|
|
|
1377
1710
|
slot,
|
|
1378
1711
|
(bestNode, currentNode, slot, oraclePriceData) => {
|
|
1379
1712
|
return bestNode
|
|
1380
|
-
.getPriceOrThrow(oraclePriceData, slot)
|
|
1381
|
-
.gt(currentNode.getPriceOrThrow(oraclePriceData, slot));
|
|
1713
|
+
.getPriceOrThrow(oraclePriceData, slot, tickSize)
|
|
1714
|
+
.gt(currentNode.getPriceOrThrow(oraclePriceData, slot, tickSize));
|
|
1382
1715
|
},
|
|
1383
1716
|
filterFcn
|
|
1384
1717
|
);
|
|
1385
1718
|
}
|
|
1386
1719
|
|
|
1387
1720
|
/**
|
|
1388
|
-
*
|
|
1389
|
-
*
|
|
1390
|
-
*
|
|
1391
|
-
*
|
|
1392
|
-
*
|
|
1393
|
-
*
|
|
1394
|
-
* @param
|
|
1721
|
+
* Merges `getTakingAsks` and `getRestingLimitAsks` into a single best-price-first generator
|
|
1722
|
+
* (ties broken by earliest arrival slot). Nodes with no resolvable price (e.g. still
|
|
1723
|
+
* mid-auction) sort as price `0` — i.e. best — since `getPrice` (not `getPriceOrThrow`) is
|
|
1724
|
+
* used here. Unlike `findTakingNodesToFill`/`findNodesToFill`, this does **not** merge in
|
|
1725
|
+
* fallback (e.g. vAMM) liquidity; the `fallbackAsk` parameter is currently unused/reserved.
|
|
1726
|
+
*
|
|
1727
|
+
* @param marketIndex the market to scan
|
|
1728
|
+
* @param fallbackAsk currently unused
|
|
1729
|
+
* @param slot current slot
|
|
1730
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
1731
|
+
* @param oraclePriceData oracle price data for the market; required for spot markets (throws if missing)
|
|
1732
|
+
* @param filterFcn optional predicate; nodes it rejects are skipped
|
|
1733
|
+
* @param tickSize market order tick size, PRICE_PRECISION (1e6); defaults to no rounding if omitted
|
|
1734
|
+
* @returns a generator of all ask nodes (taking + resting-limit), best price first
|
|
1395
1735
|
*/
|
|
1396
1736
|
*getAsks<T extends MarketType>(
|
|
1397
1737
|
marketIndex: number,
|
|
@@ -1401,7 +1741,8 @@ export class DLOB {
|
|
|
1401
1741
|
oraclePriceData: T extends { spot: unknown }
|
|
1402
1742
|
? OraclePriceData
|
|
1403
1743
|
: MMOraclePriceData,
|
|
1404
|
-
filterFcn?: DLOBFilterFcn
|
|
1744
|
+
filterFcn?: DLOBFilterFcn,
|
|
1745
|
+
tickSize?: BN
|
|
1405
1746
|
): Generator<DLOBNode> {
|
|
1406
1747
|
if (isVariant(marketType, 'spot') && !oraclePriceData) {
|
|
1407
1748
|
throw new Error('Must provide OraclePriceData to get spot asks');
|
|
@@ -1409,7 +1750,14 @@ export class DLOB {
|
|
|
1409
1750
|
|
|
1410
1751
|
const generatorList = [
|
|
1411
1752
|
this.getTakingAsks(marketIndex, marketType, slot, oraclePriceData),
|
|
1412
|
-
this.getRestingLimitAsks(
|
|
1753
|
+
this.getRestingLimitAsks(
|
|
1754
|
+
marketIndex,
|
|
1755
|
+
slot,
|
|
1756
|
+
marketType,
|
|
1757
|
+
oraclePriceData,
|
|
1758
|
+
undefined,
|
|
1759
|
+
tickSize
|
|
1760
|
+
),
|
|
1413
1761
|
];
|
|
1414
1762
|
|
|
1415
1763
|
yield* this.getBestNode(
|
|
@@ -1417,9 +1765,10 @@ export class DLOB {
|
|
|
1417
1765
|
oraclePriceData,
|
|
1418
1766
|
slot,
|
|
1419
1767
|
(bestNode, currentNode, slot, oraclePriceData) => {
|
|
1420
|
-
const bestNodePrice =
|
|
1768
|
+
const bestNodePrice =
|
|
1769
|
+
bestNode.getPrice(oraclePriceData, slot, tickSize) ?? ZERO;
|
|
1421
1770
|
const currentNodePrice =
|
|
1422
|
-
currentNode.getPrice(oraclePriceData, slot) ?? ZERO;
|
|
1771
|
+
currentNode.getPrice(oraclePriceData, slot, tickSize) ?? ZERO;
|
|
1423
1772
|
|
|
1424
1773
|
if (bestNodePrice.eq(currentNodePrice)) {
|
|
1425
1774
|
return getOrderOrThrow(bestNode).slot.lt(
|
|
@@ -1434,13 +1783,19 @@ export class DLOB {
|
|
|
1434
1783
|
}
|
|
1435
1784
|
|
|
1436
1785
|
/**
|
|
1437
|
-
*
|
|
1438
|
-
*
|
|
1439
|
-
*
|
|
1440
|
-
*
|
|
1441
|
-
*
|
|
1442
|
-
* @param
|
|
1443
|
-
* @param
|
|
1786
|
+
* Merges `getTakingBids` and `getRestingLimitBids` into a single best-price-first generator
|
|
1787
|
+
* (ties broken by earliest arrival slot). Nodes with no resolvable price sort as `BN_MAX` —
|
|
1788
|
+
* i.e. worst — since a priceless bid shouldn't be preferred over a priced one. Does not merge
|
|
1789
|
+
* in fallback (e.g. vAMM) liquidity; the `fallbackBid` parameter is currently unused/reserved.
|
|
1790
|
+
*
|
|
1791
|
+
* @param marketIndex the market to scan
|
|
1792
|
+
* @param fallbackBid currently unused
|
|
1793
|
+
* @param slot current slot
|
|
1794
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
1795
|
+
* @param oraclePriceData oracle price data for the market; required for spot markets (throws if missing)
|
|
1796
|
+
* @param filterFcn optional predicate; nodes it rejects are skipped
|
|
1797
|
+
* @param tickSize market order tick size, PRICE_PRECISION (1e6); defaults to no rounding if omitted
|
|
1798
|
+
* @returns a generator of all bid nodes (taking + resting-limit), best price first
|
|
1444
1799
|
*/
|
|
1445
1800
|
*getBids<T extends MarketType>(
|
|
1446
1801
|
marketIndex: number,
|
|
@@ -1450,7 +1805,8 @@ export class DLOB {
|
|
|
1450
1805
|
oraclePriceData: T extends { spot: unknown }
|
|
1451
1806
|
? OraclePriceData
|
|
1452
1807
|
: MMOraclePriceData,
|
|
1453
|
-
filterFcn?: DLOBFilterFcn
|
|
1808
|
+
filterFcn?: DLOBFilterFcn,
|
|
1809
|
+
tickSize?: BN
|
|
1454
1810
|
): Generator<DLOBNode> {
|
|
1455
1811
|
if (isVariant(marketType, 'spot') && !oraclePriceData) {
|
|
1456
1812
|
throw new Error('Must provide OraclePriceData to get spot bids');
|
|
@@ -1458,7 +1814,14 @@ export class DLOB {
|
|
|
1458
1814
|
|
|
1459
1815
|
const generatorList = [
|
|
1460
1816
|
this.getTakingBids(marketIndex, marketType, slot, oraclePriceData),
|
|
1461
|
-
this.getRestingLimitBids(
|
|
1817
|
+
this.getRestingLimitBids(
|
|
1818
|
+
marketIndex,
|
|
1819
|
+
slot,
|
|
1820
|
+
marketType,
|
|
1821
|
+
oraclePriceData,
|
|
1822
|
+
undefined,
|
|
1823
|
+
tickSize
|
|
1824
|
+
),
|
|
1462
1825
|
];
|
|
1463
1826
|
|
|
1464
1827
|
yield* this.getBestNode(
|
|
@@ -1467,9 +1830,9 @@ export class DLOB {
|
|
|
1467
1830
|
slot,
|
|
1468
1831
|
(bestNode, currentNode, slot, oraclePriceData) => {
|
|
1469
1832
|
const bestNodePrice =
|
|
1470
|
-
bestNode.getPrice(oraclePriceData, slot) ?? BN_MAX;
|
|
1833
|
+
bestNode.getPrice(oraclePriceData, slot, tickSize) ?? BN_MAX;
|
|
1471
1834
|
const currentNodePrice =
|
|
1472
|
-
currentNode.getPrice(oraclePriceData, slot) ?? BN_MAX;
|
|
1835
|
+
currentNode.getPrice(oraclePriceData, slot, tickSize) ?? BN_MAX;
|
|
1473
1836
|
|
|
1474
1837
|
if (bestNodePrice.eq(currentNodePrice)) {
|
|
1475
1838
|
return getOrderOrThrow(bestNode).slot.lt(
|
|
@@ -1483,13 +1846,30 @@ export class DLOB {
|
|
|
1483
1846
|
);
|
|
1484
1847
|
}
|
|
1485
1848
|
|
|
1849
|
+
/**
|
|
1850
|
+
* Finds pairs of resting-limit asks and bids that cross each other (`bidPrice >= askPrice`),
|
|
1851
|
+
* assigns maker/taker roles via `determineMakerAndTaker` (post-only orders are always makers;
|
|
1852
|
+
* otherwise whichever order's auction finished later is the taker), and simulates the fill by
|
|
1853
|
+
* updating both orders' `baseAssetAmountFilled` in their `NodeList`s so subsequent iterations
|
|
1854
|
+
* see the reduced remaining size. Same-user matches are skipped. Because both ask and bid
|
|
1855
|
+
* generators are price-sorted, the inner loop `break`s as soon as `bidPrice < askPrice` for a
|
|
1856
|
+
* given ask, since no later (worse) bid can cross either.
|
|
1857
|
+
*
|
|
1858
|
+
* @param marketIndex the market to scan
|
|
1859
|
+
* @param slot current slot
|
|
1860
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
1861
|
+
* @param oraclePriceData oracle price data for the market
|
|
1862
|
+
* @param tickSize market order tick size, PRICE_PRECISION (1e6), threaded into all price lookups
|
|
1863
|
+
* @returns `NodeToFill`s (taker node + one maker node each) for every crossing pair found
|
|
1864
|
+
*/
|
|
1486
1865
|
findCrossingRestingLimitOrders<T extends MarketType>(
|
|
1487
1866
|
marketIndex: number,
|
|
1488
1867
|
slot: number,
|
|
1489
1868
|
marketType: T,
|
|
1490
1869
|
oraclePriceData: T extends { spot: unknown }
|
|
1491
1870
|
? OraclePriceData
|
|
1492
|
-
: MMOraclePriceData
|
|
1871
|
+
: MMOraclePriceData,
|
|
1872
|
+
tickSize?: BN
|
|
1493
1873
|
): NodeToFill[] {
|
|
1494
1874
|
const nodesToFill = new Array<NodeToFill>();
|
|
1495
1875
|
|
|
@@ -1497,18 +1877,30 @@ export class DLOB {
|
|
|
1497
1877
|
marketIndex,
|
|
1498
1878
|
slot,
|
|
1499
1879
|
marketType,
|
|
1500
|
-
oraclePriceData
|
|
1880
|
+
oraclePriceData,
|
|
1881
|
+
undefined,
|
|
1882
|
+
tickSize
|
|
1501
1883
|
)) {
|
|
1502
1884
|
const bidGenerator = this.getRestingLimitBids(
|
|
1503
1885
|
marketIndex,
|
|
1504
1886
|
slot,
|
|
1505
1887
|
marketType,
|
|
1506
|
-
oraclePriceData
|
|
1888
|
+
oraclePriceData,
|
|
1889
|
+
undefined,
|
|
1890
|
+
tickSize
|
|
1507
1891
|
);
|
|
1508
1892
|
|
|
1509
1893
|
for (const bidNode of bidGenerator) {
|
|
1510
|
-
const bidPrice = bidNode.getPriceOrThrow(
|
|
1511
|
-
|
|
1894
|
+
const bidPrice = bidNode.getPriceOrThrow(
|
|
1895
|
+
oraclePriceData,
|
|
1896
|
+
slot,
|
|
1897
|
+
tickSize
|
|
1898
|
+
);
|
|
1899
|
+
const askPrice = askNode.getPriceOrThrow(
|
|
1900
|
+
oraclePriceData,
|
|
1901
|
+
slot,
|
|
1902
|
+
tickSize
|
|
1903
|
+
);
|
|
1512
1904
|
|
|
1513
1905
|
// orders don't cross
|
|
1514
1906
|
if (bidPrice.lt(askPrice)) {
|
|
@@ -1573,6 +1965,16 @@ export class DLOB {
|
|
|
1573
1965
|
return nodesToFill;
|
|
1574
1966
|
}
|
|
1575
1967
|
|
|
1968
|
+
/**
|
|
1969
|
+
* Decides which of a crossing ask/bid pair is the maker and which is the taker: if both are
|
|
1970
|
+
* post-only, they can't be matched (`undefined`); if exactly one is post-only, it's the
|
|
1971
|
+
* maker; otherwise whichever order's auction window (`order.slot + order.auctionDuration`)
|
|
1972
|
+
* ends later is treated as the taker (it "arrived crossing" the earlier order).
|
|
1973
|
+
*
|
|
1974
|
+
* @param askNode the crossing ask node
|
|
1975
|
+
* @param bidNode the crossing bid node
|
|
1976
|
+
* @returns the assigned `{ takerNode, makerNode }`, or `undefined` if both orders are post-only and neither can take
|
|
1977
|
+
*/
|
|
1576
1978
|
determineMakerAndTaker(
|
|
1577
1979
|
askNode: DLOBNode,
|
|
1578
1980
|
bidNode: DLOBNode
|
|
@@ -1607,48 +2009,88 @@ export class DLOB {
|
|
|
1607
2009
|
}
|
|
1608
2010
|
}
|
|
1609
2011
|
|
|
2012
|
+
/**
|
|
2013
|
+
* Gets the best (lowest) resting-limit ask price for a market. Does not consider fallback
|
|
2014
|
+
* (e.g. vAMM) liquidity.
|
|
2015
|
+
*
|
|
2016
|
+
* @param marketIndex the market to query
|
|
2017
|
+
* @param slot current slot
|
|
2018
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
2019
|
+
* @param oraclePriceData oracle price data for the market
|
|
2020
|
+
* @param tickSize market order tick size, PRICE_PRECISION (1e6); defaults to no rounding if omitted
|
|
2021
|
+
* @returns the best ask price, PRICE_PRECISION (1e6), or `undefined` if there are no resting-limit asks
|
|
2022
|
+
*/
|
|
1610
2023
|
public getBestAsk<T extends MarketType>(
|
|
1611
2024
|
marketIndex: number,
|
|
1612
2025
|
slot: number,
|
|
1613
2026
|
marketType: T,
|
|
1614
2027
|
oraclePriceData: T extends { spot: unknown }
|
|
1615
2028
|
? OraclePriceData
|
|
1616
|
-
: MMOraclePriceData
|
|
2029
|
+
: MMOraclePriceData,
|
|
2030
|
+
tickSize?: BN
|
|
1617
2031
|
): BN | undefined {
|
|
1618
2032
|
const bestAsk = this.getRestingLimitAsks(
|
|
1619
2033
|
marketIndex,
|
|
1620
2034
|
slot,
|
|
1621
2035
|
marketType,
|
|
1622
|
-
oraclePriceData
|
|
2036
|
+
oraclePriceData,
|
|
2037
|
+
undefined,
|
|
2038
|
+
tickSize
|
|
1623
2039
|
).next().value;
|
|
1624
2040
|
|
|
1625
2041
|
if (bestAsk) {
|
|
1626
|
-
return bestAsk.getPrice(oraclePriceData, slot);
|
|
2042
|
+
return bestAsk.getPrice(oraclePriceData, slot, tickSize);
|
|
1627
2043
|
}
|
|
1628
2044
|
return undefined;
|
|
1629
2045
|
}
|
|
1630
2046
|
|
|
2047
|
+
/**
|
|
2048
|
+
* Gets the best (highest) resting-limit bid price for a market. Does not consider fallback
|
|
2049
|
+
* (e.g. vAMM) liquidity.
|
|
2050
|
+
*
|
|
2051
|
+
* @param marketIndex the market to query
|
|
2052
|
+
* @param slot current slot
|
|
2053
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
2054
|
+
* @param oraclePriceData oracle price data for the market
|
|
2055
|
+
* @param tickSize market order tick size, PRICE_PRECISION (1e6); defaults to no rounding if omitted
|
|
2056
|
+
* @returns the best bid price, PRICE_PRECISION (1e6), or `undefined` if there are no resting-limit bids
|
|
2057
|
+
*/
|
|
1631
2058
|
public getBestBid<T extends MarketType>(
|
|
1632
2059
|
marketIndex: number,
|
|
1633
2060
|
slot: number,
|
|
1634
2061
|
marketType: T,
|
|
1635
2062
|
oraclePriceData: T extends { spot: unknown }
|
|
1636
2063
|
? OraclePriceData
|
|
1637
|
-
: MMOraclePriceData
|
|
2064
|
+
: MMOraclePriceData,
|
|
2065
|
+
tickSize?: BN
|
|
1638
2066
|
): BN | undefined {
|
|
1639
2067
|
const bestBid = this.getRestingLimitBids(
|
|
1640
2068
|
marketIndex,
|
|
1641
2069
|
slot,
|
|
1642
2070
|
marketType,
|
|
1643
|
-
oraclePriceData
|
|
2071
|
+
oraclePriceData,
|
|
2072
|
+
undefined,
|
|
2073
|
+
tickSize
|
|
1644
2074
|
).next().value;
|
|
1645
2075
|
|
|
1646
2076
|
if (bestBid) {
|
|
1647
|
-
return bestBid.getPrice(oraclePriceData, slot);
|
|
2077
|
+
return bestBid.getPrice(oraclePriceData, slot, tickSize);
|
|
1648
2078
|
}
|
|
1649
2079
|
return undefined;
|
|
1650
2080
|
}
|
|
1651
2081
|
|
|
2082
|
+
/**
|
|
2083
|
+
* Yields untriggered trigger orders that would close a position in `direction`: for a `long`
|
|
2084
|
+
* position, short-direction orders in the `trigger.below` list (stop triggers on a price
|
|
2085
|
+
* drop); for a `short` position, long-direction orders in `trigger.above` (stop triggers on a
|
|
2086
|
+
* price rise). Includes both `triggerMarket` and `triggerLimit` order types — see
|
|
2087
|
+
* `getStopLossMarkets`/`getStopLossLimits` to filter to one.
|
|
2088
|
+
*
|
|
2089
|
+
* @param marketIndex the market to scan
|
|
2090
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
2091
|
+
* @param direction the direction of the position being protected (not the order's own direction)
|
|
2092
|
+
* @returns a generator of stop-loss trigger order nodes
|
|
2093
|
+
*/
|
|
1652
2094
|
public *getStopLosses(
|
|
1653
2095
|
marketIndex: number,
|
|
1654
2096
|
marketType: MarketType,
|
|
@@ -1672,6 +2114,7 @@ export class DLOB {
|
|
|
1672
2114
|
}
|
|
1673
2115
|
}
|
|
1674
2116
|
|
|
2117
|
+
/** Same as `getStopLosses`, filtered to `triggerMarket` orders only. */
|
|
1675
2118
|
public *getStopLossMarkets(
|
|
1676
2119
|
marketIndex: number,
|
|
1677
2120
|
marketType: MarketType,
|
|
@@ -1684,6 +2127,7 @@ export class DLOB {
|
|
|
1684
2127
|
}
|
|
1685
2128
|
}
|
|
1686
2129
|
|
|
2130
|
+
/** Same as `getStopLosses`, filtered to `triggerLimit` orders only. */
|
|
1687
2131
|
public *getStopLossLimits(
|
|
1688
2132
|
marketIndex: number,
|
|
1689
2133
|
marketType: MarketType,
|
|
@@ -1696,6 +2140,18 @@ export class DLOB {
|
|
|
1696
2140
|
}
|
|
1697
2141
|
}
|
|
1698
2142
|
|
|
2143
|
+
/**
|
|
2144
|
+
* Yields untriggered trigger orders that would close a position in `direction` for profit:
|
|
2145
|
+
* for a `long` position, short-direction orders in `trigger.above` (take-profit on a price
|
|
2146
|
+
* rise); for a `short` position, long-direction orders in `trigger.below` (take-profit on a
|
|
2147
|
+
* price drop). Includes both `triggerMarket` and `triggerLimit` order types — see
|
|
2148
|
+
* `getTakeProfitMarkets`/`getTakeProfitLimits` to filter to one.
|
|
2149
|
+
*
|
|
2150
|
+
* @param marketIndex the market to scan
|
|
2151
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
2152
|
+
* @param direction the direction of the position being protected (not the order's own direction)
|
|
2153
|
+
* @returns a generator of take-profit trigger order nodes
|
|
2154
|
+
*/
|
|
1699
2155
|
public *getTakeProfits(
|
|
1700
2156
|
marketIndex: number,
|
|
1701
2157
|
marketType: MarketType,
|
|
@@ -1719,6 +2175,7 @@ export class DLOB {
|
|
|
1719
2175
|
}
|
|
1720
2176
|
}
|
|
1721
2177
|
|
|
2178
|
+
/** Same as `getTakeProfits`, filtered to `triggerMarket` orders only. */
|
|
1722
2179
|
public *getTakeProfitMarkets(
|
|
1723
2180
|
marketIndex: number,
|
|
1724
2181
|
marketType: MarketType,
|
|
@@ -1735,6 +2192,7 @@ export class DLOB {
|
|
|
1735
2192
|
}
|
|
1736
2193
|
}
|
|
1737
2194
|
|
|
2195
|
+
/** Same as `getTakeProfits`, filtered to `triggerLimit` orders only. */
|
|
1738
2196
|
public *getTakeProfitLimits(
|
|
1739
2197
|
marketIndex: number,
|
|
1740
2198
|
marketType: MarketType,
|
|
@@ -1751,6 +2209,20 @@ export class DLOB {
|
|
|
1751
2209
|
}
|
|
1752
2210
|
}
|
|
1753
2211
|
|
|
2212
|
+
/**
|
|
2213
|
+
* Finds trigger orders whose condition is now satisfied by `triggerPrice`: `trigger.above`
|
|
2214
|
+
* orders with `triggerPrice > order.triggerPrice`, and `trigger.below` orders with
|
|
2215
|
+
* `triggerPrice < order.triggerPrice`. Both lists are sorted by trigger price with the
|
|
2216
|
+
* nearest-to-triggering order at `head`, so each scan walks from `head` and `break`s at the
|
|
2217
|
+
* first order that isn't (yet) triggered. Returns `[]` immediately if the exchange is paused.
|
|
2218
|
+
*
|
|
2219
|
+
* @param marketIndex the market to scan
|
|
2220
|
+
* @param slot current slot (currently unused by the scan itself, reserved for future use)
|
|
2221
|
+
* @param triggerPrice the price to check trigger conditions against, PRICE_PRECISION (1e6) — typically the current oracle or mark price
|
|
2222
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
2223
|
+
* @param stateAccount global protocol state, used for the exchange-pause check
|
|
2224
|
+
* @returns `NodeToTrigger`s for every order ready to be triggered on-chain
|
|
2225
|
+
*/
|
|
1754
2226
|
public findNodesToTrigger(
|
|
1755
2227
|
marketIndex: number,
|
|
1756
2228
|
slot: number,
|
|
@@ -1809,6 +2281,17 @@ export class DLOB {
|
|
|
1809
2281
|
return nodesToTrigger;
|
|
1810
2282
|
}
|
|
1811
2283
|
|
|
2284
|
+
/**
|
|
2285
|
+
* Debug helper: logs the market's best bid, best ask, and mid price (all resting-limit only,
|
|
2286
|
+
* no fallback liquidity), along with each side's spread to the current oracle price, as a
|
|
2287
|
+
* percentage.
|
|
2288
|
+
*
|
|
2289
|
+
* @param velocityClient client used to resolve market accounts and oracle price data
|
|
2290
|
+
* @param slotSubscriber source of the current slot
|
|
2291
|
+
* @param marketIndex the market to print
|
|
2292
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
2293
|
+
* @throws if the market currently has no resting-limit bid or ask (best bid/ask is `undefined`)
|
|
2294
|
+
*/
|
|
1812
2295
|
public printTop(
|
|
1813
2296
|
velocityClient: VelocityClient,
|
|
1814
2297
|
slotSubscriber: SlotSubscriber,
|
|
@@ -1918,6 +2401,7 @@ export class DLOB {
|
|
|
1918
2401
|
}
|
|
1919
2402
|
}
|
|
1920
2403
|
|
|
2404
|
+
/** Flattens every order across every `NodeList` (perp and spot, all categories/sides) into a single `DLOBOrders` array of `{ user, order }` pairs, in no particular cross-list order. */
|
|
1921
2405
|
public getDLOBOrders(): DLOBOrders {
|
|
1922
2406
|
const dlobOrders: DLOBOrders = [];
|
|
1923
2407
|
|
|
@@ -1933,6 +2417,7 @@ export class DLOB {
|
|
|
1933
2417
|
return dlobOrders;
|
|
1934
2418
|
}
|
|
1935
2419
|
|
|
2420
|
+
/** Yields every `NodeList` (all ten category/side combinations, per market) across every perp market, then every spot market. Used by `getOrder`/`getDLOBOrders` to walk the entire book. */
|
|
1936
2421
|
*getNodeLists(): Generator<NodeList<DLOBNodeType>> {
|
|
1937
2422
|
for (const [_, nodeLists] of this.getOrderListsForMarketType('perp')) {
|
|
1938
2423
|
yield nodeLists.restingLimit.bid;
|
|
@@ -1962,14 +2447,20 @@ export class DLOB {
|
|
|
1962
2447
|
}
|
|
1963
2448
|
|
|
1964
2449
|
/**
|
|
1965
|
-
* Get an L2 view of the order book for a given market
|
|
2450
|
+
* Get an L2 (aggregated price/size) view of the order book for a given market: resting-limit
|
|
2451
|
+
* DLOB liquidity merged with any supplied fallback generators (e.g. the vAMM, via
|
|
2452
|
+
* `getVammL2Generator`), then bucketed into up to `depth` levels per side via `createL2Levels`.
|
|
2453
|
+
* Does not include taking (still-auctioning) orders — only resting-limit makers and fallback
|
|
2454
|
+
* liquidity are represented.
|
|
1966
2455
|
*
|
|
1967
|
-
* @param marketIndex
|
|
1968
|
-
* @param marketType
|
|
1969
|
-
* @param slot
|
|
1970
|
-
* @param oraclePriceData
|
|
1971
|
-
* @param depth how many levels of the order book to return
|
|
1972
|
-
* @param fallbackL2Generators
|
|
2456
|
+
* @param marketIndex the market to build a book for
|
|
2457
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
2458
|
+
* @param slot current slot, used to resolve resting-limit order prices
|
|
2459
|
+
* @param oraclePriceData oracle price data for the market
|
|
2460
|
+
* @param depth how many price levels of the order book to return, per side
|
|
2461
|
+
* @param fallbackL2Generators additional non-DLOB liquidity sources to merge in, e.g. `getVammL2Generator`'s output; defaults to `[]`
|
|
2462
|
+
* @param tickSize market order tick size, PRICE_PRECISION (1e6), threaded into all DLOB price lookups; defaults to no rounding if omitted
|
|
2463
|
+
* @returns the merged `L2OrderBook`, tagged with the given `slot`
|
|
1973
2464
|
*/
|
|
1974
2465
|
public getL2<T extends MarketType>({
|
|
1975
2466
|
marketIndex,
|
|
@@ -1978,6 +2469,7 @@ export class DLOB {
|
|
|
1978
2469
|
oraclePriceData,
|
|
1979
2470
|
depth,
|
|
1980
2471
|
fallbackL2Generators = [],
|
|
2472
|
+
tickSize,
|
|
1981
2473
|
}: {
|
|
1982
2474
|
marketIndex: number;
|
|
1983
2475
|
marketType: T;
|
|
@@ -1987,11 +2479,20 @@ export class DLOB {
|
|
|
1987
2479
|
: MMOraclePriceData;
|
|
1988
2480
|
depth: number;
|
|
1989
2481
|
fallbackL2Generators?: L2OrderBookGenerator[];
|
|
2482
|
+
tickSize?: BN;
|
|
1990
2483
|
}): L2OrderBook {
|
|
1991
2484
|
const makerAskL2LevelGenerator = getL2GeneratorFromDLOBNodes(
|
|
1992
|
-
this.getRestingLimitAsks(
|
|
2485
|
+
this.getRestingLimitAsks(
|
|
2486
|
+
marketIndex,
|
|
2487
|
+
slot,
|
|
2488
|
+
marketType,
|
|
2489
|
+
oraclePriceData,
|
|
2490
|
+
undefined,
|
|
2491
|
+
tickSize
|
|
2492
|
+
),
|
|
1993
2493
|
oraclePriceData,
|
|
1994
|
-
slot
|
|
2494
|
+
slot,
|
|
2495
|
+
tickSize
|
|
1995
2496
|
);
|
|
1996
2497
|
|
|
1997
2498
|
const fallbackAskGenerators = fallbackL2Generators.map(
|
|
@@ -2010,9 +2511,17 @@ export class DLOB {
|
|
|
2010
2511
|
const asks = createL2Levels(askL2LevelGenerator, depth);
|
|
2011
2512
|
|
|
2012
2513
|
const makerBidGenerator = getL2GeneratorFromDLOBNodes(
|
|
2013
|
-
this.getRestingLimitBids(
|
|
2514
|
+
this.getRestingLimitBids(
|
|
2515
|
+
marketIndex,
|
|
2516
|
+
slot,
|
|
2517
|
+
marketType,
|
|
2518
|
+
oraclePriceData,
|
|
2519
|
+
undefined,
|
|
2520
|
+
tickSize
|
|
2521
|
+
),
|
|
2014
2522
|
oraclePriceData,
|
|
2015
|
-
slot
|
|
2523
|
+
slot,
|
|
2524
|
+
tickSize
|
|
2016
2525
|
);
|
|
2017
2526
|
|
|
2018
2527
|
const fallbackBidGenerators = fallbackL2Generators.map((fallbackOrders) => {
|
|
@@ -2036,18 +2545,22 @@ export class DLOB {
|
|
|
2036
2545
|
}
|
|
2037
2546
|
|
|
2038
2547
|
/**
|
|
2039
|
-
* Get an L3 view of the order book for a given market.
|
|
2548
|
+
* Get an L3 (individual resting order) view of the order book for a given market. Only
|
|
2549
|
+
* resting-limit orders are included — no taking orders and no fallback (e.g. vAMM) liquidity.
|
|
2040
2550
|
*
|
|
2041
|
-
* @param marketIndex
|
|
2042
|
-
* @param marketType
|
|
2043
|
-
* @param slot
|
|
2044
|
-
* @param oraclePriceData
|
|
2551
|
+
* @param marketIndex the market to build a book for
|
|
2552
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
2553
|
+
* @param slot current slot, used to resolve resting-limit order prices
|
|
2554
|
+
* @param oraclePriceData oracle price data for the market
|
|
2555
|
+
* @param tickSize market order tick size, PRICE_PRECISION (1e6); defaults to no rounding if omitted
|
|
2556
|
+
* @returns the `L3OrderBook`, tagged with the given `slot`
|
|
2045
2557
|
*/
|
|
2046
2558
|
public getL3<T extends MarketType>({
|
|
2047
2559
|
marketIndex,
|
|
2048
2560
|
marketType,
|
|
2049
2561
|
slot,
|
|
2050
2562
|
oraclePriceData,
|
|
2563
|
+
tickSize,
|
|
2051
2564
|
}: {
|
|
2052
2565
|
marketIndex: number;
|
|
2053
2566
|
marketType: T;
|
|
@@ -2055,6 +2568,7 @@ export class DLOB {
|
|
|
2055
2568
|
oraclePriceData: T extends { spot: unknown }
|
|
2056
2569
|
? OraclePriceData
|
|
2057
2570
|
: MMOraclePriceData;
|
|
2571
|
+
tickSize?: BN;
|
|
2058
2572
|
}): L3OrderBook {
|
|
2059
2573
|
const bids: L3Level[] = [];
|
|
2060
2574
|
const asks: L3Level[] = [];
|
|
@@ -2063,13 +2577,15 @@ export class DLOB {
|
|
|
2063
2577
|
marketIndex,
|
|
2064
2578
|
slot,
|
|
2065
2579
|
marketType,
|
|
2066
|
-
oraclePriceData
|
|
2580
|
+
oraclePriceData,
|
|
2581
|
+
undefined,
|
|
2582
|
+
tickSize
|
|
2067
2583
|
);
|
|
2068
2584
|
|
|
2069
2585
|
for (const ask of restingAsks) {
|
|
2070
2586
|
const askOrder = getOrderOrThrow(ask);
|
|
2071
2587
|
asks.push({
|
|
2072
|
-
price: ask.getPriceOrThrow(oraclePriceData, slot),
|
|
2588
|
+
price: ask.getPriceOrThrow(oraclePriceData, slot, tickSize),
|
|
2073
2589
|
size: askOrder.baseAssetAmount.sub(askOrder.baseAssetAmountFilled),
|
|
2074
2590
|
maker: new PublicKey(getUserAccountOrThrow(ask)),
|
|
2075
2591
|
orderId: askOrder.orderId,
|
|
@@ -2080,13 +2596,15 @@ export class DLOB {
|
|
|
2080
2596
|
marketIndex,
|
|
2081
2597
|
slot,
|
|
2082
2598
|
marketType,
|
|
2083
|
-
oraclePriceData
|
|
2599
|
+
oraclePriceData,
|
|
2600
|
+
undefined,
|
|
2601
|
+
tickSize
|
|
2084
2602
|
);
|
|
2085
2603
|
|
|
2086
2604
|
for (const bid of restingBids) {
|
|
2087
2605
|
const bidOrder = getOrderOrThrow(bid);
|
|
2088
2606
|
bids.push({
|
|
2089
|
-
price: bid.getPriceOrThrow(oraclePriceData, slot),
|
|
2607
|
+
price: bid.getPriceOrThrow(oraclePriceData, slot, tickSize),
|
|
2090
2608
|
size: bidOrder.baseAssetAmount.sub(bidOrder.baseAssetAmountFilled),
|
|
2091
2609
|
maker: new PublicKey(getUserAccountOrThrow(bid)),
|
|
2092
2610
|
orderId: bidOrder.orderId,
|
|
@@ -2104,12 +2622,13 @@ export class DLOB {
|
|
|
2104
2622
|
baseAmountIn: BN,
|
|
2105
2623
|
oraclePriceData: OraclePriceData,
|
|
2106
2624
|
slot: number,
|
|
2107
|
-
dlobSide: Generator<DLOBNode
|
|
2625
|
+
dlobSide: Generator<DLOBNode>,
|
|
2626
|
+
tickSize?: BN
|
|
2108
2627
|
): BN {
|
|
2109
2628
|
let runningSumQuote = ZERO;
|
|
2110
2629
|
let runningSumBase = ZERO;
|
|
2111
2630
|
for (const side of dlobSide) {
|
|
2112
|
-
const price = side.getPriceOrThrow(oraclePriceData, slot); //side.order.quoteAssetAmount.div(side.order.baseAssetAmount);
|
|
2631
|
+
const price = side.getPriceOrThrow(oraclePriceData, slot, tickSize); //side.order.quoteAssetAmount.div(side.order.baseAssetAmount);
|
|
2113
2632
|
const sideOrder = getOrderOrThrow(side);
|
|
2114
2633
|
const baseAmountRemaining = sideOrder.baseAssetAmount.sub(
|
|
2115
2634
|
sideOrder.baseAssetAmountFilled
|
|
@@ -2131,14 +2650,21 @@ export class DLOB {
|
|
|
2131
2650
|
}
|
|
2132
2651
|
|
|
2133
2652
|
/**
|
|
2653
|
+
* Estimates the quote amount that would be filled for a given base amount, walking
|
|
2654
|
+
* resting-limit asks (for a `long`/buy) or bids (for a `short`/sell) from best price outward
|
|
2655
|
+
* and summing `price * size` until `baseAmount` is consumed. Does not include fallback (e.g.
|
|
2656
|
+
* vAMM) liquidity or taking orders, and does not mutate any order state — this is a read-only
|
|
2657
|
+
* estimate, not a simulated fill.
|
|
2134
2658
|
*
|
|
2135
|
-
* @param
|
|
2136
|
-
* @param
|
|
2137
|
-
* @param
|
|
2138
|
-
* @param
|
|
2139
|
-
* @param
|
|
2140
|
-
* @param
|
|
2141
|
-
* @
|
|
2659
|
+
* @param marketIndex the market to estimate against
|
|
2660
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
2661
|
+
* @param baseAmount the base amount to fill, BASE_PRECISION (1e9)
|
|
2662
|
+
* @param orderDirection direction of the hypothetical taker order (`long` walks asks, `short` walks bids)
|
|
2663
|
+
* @param slot current slot, used to resolve resting-limit order prices
|
|
2664
|
+
* @param oraclePriceData oracle price data for the market
|
|
2665
|
+
* @param tickSize market order tick size, PRICE_PRECISION (1e6); defaults to no rounding if omitted
|
|
2666
|
+
* @returns the estimated quote amount filled, QUOTE_PRECISION (1e6); if resting liquidity is thinner than `baseAmount`, the result silently reflects only the liquidity that was actually walked (no error/flag for partial fill), and is `0` if there is no resting liquidity on that side at all
|
|
2667
|
+
* @throws if `orderDirection` is neither `long` nor `short`
|
|
2142
2668
|
*/
|
|
2143
2669
|
public estimateFillWithExactBaseAmount<T extends MarketType>({
|
|
2144
2670
|
marketIndex,
|
|
@@ -2147,6 +2673,7 @@ export class DLOB {
|
|
|
2147
2673
|
orderDirection,
|
|
2148
2674
|
slot,
|
|
2149
2675
|
oraclePriceData,
|
|
2676
|
+
tickSize,
|
|
2150
2677
|
}: {
|
|
2151
2678
|
marketIndex: number;
|
|
2152
2679
|
marketType: T;
|
|
@@ -2156,20 +2683,37 @@ export class DLOB {
|
|
|
2156
2683
|
oraclePriceData: T extends { spot: unknown }
|
|
2157
2684
|
? OraclePriceData
|
|
2158
2685
|
: MMOraclePriceData;
|
|
2686
|
+
tickSize?: BN;
|
|
2159
2687
|
}): BN {
|
|
2160
2688
|
if (isVariant(orderDirection, 'long')) {
|
|
2161
2689
|
return this.estimateFillExactBaseAmountInForSide(
|
|
2162
2690
|
baseAmount,
|
|
2163
2691
|
oraclePriceData,
|
|
2164
2692
|
slot,
|
|
2165
|
-
this.getRestingLimitAsks(
|
|
2693
|
+
this.getRestingLimitAsks(
|
|
2694
|
+
marketIndex,
|
|
2695
|
+
slot,
|
|
2696
|
+
marketType,
|
|
2697
|
+
oraclePriceData,
|
|
2698
|
+
undefined,
|
|
2699
|
+
tickSize
|
|
2700
|
+
),
|
|
2701
|
+
tickSize
|
|
2166
2702
|
);
|
|
2167
2703
|
} else if (isVariant(orderDirection, 'short')) {
|
|
2168
2704
|
return this.estimateFillExactBaseAmountInForSide(
|
|
2169
2705
|
baseAmount,
|
|
2170
2706
|
oraclePriceData,
|
|
2171
2707
|
slot,
|
|
2172
|
-
this.getRestingLimitBids(
|
|
2708
|
+
this.getRestingLimitBids(
|
|
2709
|
+
marketIndex,
|
|
2710
|
+
slot,
|
|
2711
|
+
marketType,
|
|
2712
|
+
oraclePriceData,
|
|
2713
|
+
undefined,
|
|
2714
|
+
tickSize
|
|
2715
|
+
),
|
|
2716
|
+
tickSize
|
|
2173
2717
|
);
|
|
2174
2718
|
}
|
|
2175
2719
|
throw new Error(
|
|
@@ -2179,6 +2723,22 @@ export class DLOB {
|
|
|
2179
2723
|
);
|
|
2180
2724
|
}
|
|
2181
2725
|
|
|
2726
|
+
/**
|
|
2727
|
+
* Collects the pubkeys of up to `numMakers` distinct makers currently resting best-priced on
|
|
2728
|
+
* one side of the book — bids for a `long` taker, asks for a `short` taker — in best-price
|
|
2729
|
+
* order. Used to pick candidate maker accounts to pass as `remaining_accounts` when
|
|
2730
|
+
* submitting a fill instruction. A maker with multiple resting orders at different prices
|
|
2731
|
+
* only counts once toward `numMakers`.
|
|
2732
|
+
*
|
|
2733
|
+
* @param marketIndex the market to scan
|
|
2734
|
+
* @param marketType `MarketType.PERP` or `MarketType.SPOT`
|
|
2735
|
+
* @param direction direction of the taker order being matched (`long` collects bid-side makers, `short` collects ask-side makers)
|
|
2736
|
+
* @param slot current slot, used to resolve resting-limit order prices
|
|
2737
|
+
* @param oraclePriceData oracle price data for the market
|
|
2738
|
+
* @param numMakers maximum number of distinct maker pubkeys to return
|
|
2739
|
+
* @param tickSize market order tick size, PRICE_PRECISION (1e6); defaults to no rounding if omitted
|
|
2740
|
+
* @returns up to `numMakers` distinct maker `PublicKey`s, best price first
|
|
2741
|
+
*/
|
|
2182
2742
|
public getBestMakers<T extends MarketType>({
|
|
2183
2743
|
marketIndex,
|
|
2184
2744
|
marketType,
|
|
@@ -2186,6 +2746,7 @@ export class DLOB {
|
|
|
2186
2746
|
slot,
|
|
2187
2747
|
oraclePriceData,
|
|
2188
2748
|
numMakers,
|
|
2749
|
+
tickSize,
|
|
2189
2750
|
}: {
|
|
2190
2751
|
marketIndex: number;
|
|
2191
2752
|
marketType: T;
|
|
@@ -2195,15 +2756,25 @@ export class DLOB {
|
|
|
2195
2756
|
? OraclePriceData
|
|
2196
2757
|
: MMOraclePriceData;
|
|
2197
2758
|
numMakers: number;
|
|
2759
|
+
tickSize?: BN;
|
|
2198
2760
|
}): PublicKey[] {
|
|
2199
2761
|
const makers = new Map<string, PublicKey>();
|
|
2200
2762
|
const generator = isVariant(direction, 'long')
|
|
2201
|
-
? this.getRestingLimitBids(
|
|
2763
|
+
? this.getRestingLimitBids(
|
|
2764
|
+
marketIndex,
|
|
2765
|
+
slot,
|
|
2766
|
+
marketType,
|
|
2767
|
+
oraclePriceData,
|
|
2768
|
+
undefined,
|
|
2769
|
+
tickSize
|
|
2770
|
+
)
|
|
2202
2771
|
: this.getRestingLimitAsks(
|
|
2203
2772
|
marketIndex,
|
|
2204
2773
|
slot,
|
|
2205
2774
|
marketType,
|
|
2206
|
-
oraclePriceData
|
|
2775
|
+
oraclePriceData,
|
|
2776
|
+
undefined,
|
|
2777
|
+
tickSize
|
|
2207
2778
|
);
|
|
2208
2779
|
|
|
2209
2780
|
for (const node of generator) {
|