@velocity-exchange/sdk 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/lib/browser/adminClient.d.ts +35 -0
- package/lib/browser/adminClient.js +65 -0
- package/lib/browser/config.js +6 -7
- package/lib/browser/constants/numericConstants.d.ts +1 -1
- package/lib/browser/constants/numericConstants.js +1 -1
- package/lib/browser/decode/user.js +5 -1
- package/lib/browser/idl/velocity.d.ts +146 -3
- package/lib/browser/idl/velocity.json +147 -4
- package/lib/browser/orderSubscriber/OrderSubscriber.js +3 -0
- package/lib/browser/pyth/pythLazerSubscriber.js +37 -27
- package/lib/browser/types.d.ts +4 -0
- package/lib/browser/user.d.ts +15 -0
- package/lib/browser/user.js +37 -1
- package/lib/browser/velocityClient.d.ts +46 -10
- package/lib/browser/velocityClient.js +107 -35
- package/lib/node/adminClient.d.ts +35 -0
- package/lib/node/adminClient.d.ts.map +1 -1
- package/lib/node/adminClient.js +65 -0
- package/lib/node/config.d.ts.map +1 -1
- package/lib/node/config.js +6 -7
- package/lib/node/constants/numericConstants.d.ts +1 -1
- package/lib/node/constants/numericConstants.d.ts.map +1 -1
- package/lib/node/constants/numericConstants.js +1 -1
- package/lib/node/decode/user.d.ts.map +1 -1
- package/lib/node/decode/user.js +5 -1
- package/lib/node/idl/velocity.d.ts +146 -3
- package/lib/node/idl/velocity.d.ts.map +1 -1
- package/lib/node/idl/velocity.json +147 -4
- package/lib/node/orderSubscriber/OrderSubscriber.d.ts.map +1 -1
- package/lib/node/orderSubscriber/OrderSubscriber.js +3 -0
- package/lib/node/pyth/pythLazerSubscriber.d.ts.map +1 -1
- package/lib/node/pyth/pythLazerSubscriber.js +37 -27
- package/lib/node/types.d.ts +4 -0
- package/lib/node/types.d.ts.map +1 -1
- package/lib/node/user.d.ts +15 -0
- package/lib/node/user.d.ts.map +1 -1
- package/lib/node/user.js +37 -1
- package/lib/node/velocityClient.d.ts +46 -10
- package/lib/node/velocityClient.d.ts.map +1 -1
- package/lib/node/velocityClient.js +107 -35
- package/package.json +7 -3
- package/.prettierignore +0 -1
- package/CHANGELOG.md +0 -132
- package/build-browser.js +0 -58
- package/bunfig.toml +0 -3
- package/esbuild-shims.js +0 -12
- package/scripts/deposit-isolated-positions.ts +0 -110
- package/scripts/find-flagged-users.ts +0 -213
- package/scripts/grpc-client-test-comparison.ts +0 -372
- package/scripts/grpc-multiuser-client-test-comparison.ts +0 -158
- package/scripts/postbuild.js +0 -95
- package/scripts/single-grpc-client-test.ts +0 -284
- package/scripts/withdraw-isolated-positions.ts +0 -174
- package/src/accounts/README_WebSocketAccountSubscriberV2.md +0 -95
- package/src/accounts/README_WebSocketProgramAccountSubscriberV2.md +0 -135
- package/src/accounts/basicUserAccountSubscriber.ts +0 -79
- package/src/accounts/basicUserStatsAccountSubscriber.ts +0 -87
- package/src/accounts/bulkAccountLoader.ts +0 -358
- package/src/accounts/bulkUserStatsSubscription.ts +0 -40
- package/src/accounts/bulkUserSubscription.ts +0 -39
- package/src/accounts/customizedCadenceBulkAccountLoader.ts +0 -250
- package/src/accounts/fetch.ts +0 -200
- package/src/accounts/grpcAccountSubscriber.ts +0 -225
- package/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts +0 -73
- package/src/accounts/grpcMultiAccountSubscriber.ts +0 -566
- package/src/accounts/grpcMultiUserAccountSubscriber.ts +0 -328
- package/src/accounts/grpcProgramAccountSubscriber.ts +0 -264
- package/src/accounts/grpcUserAccountSubscriber.ts +0 -63
- package/src/accounts/grpcUserStatsAccountSubscriber.ts +0 -65
- package/src/accounts/grpcVelocityClientAccountSubscriber.ts +0 -257
- package/src/accounts/grpcVelocityClientAccountSubscriberV2.ts +0 -941
- package/src/accounts/laserProgramAccountSubscriber.ts +0 -266
- package/src/accounts/oneShotUserAccountSubscriber.ts +0 -88
- package/src/accounts/oneShotUserStatsAccountSubscriber.ts +0 -94
- package/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +0 -223
- package/src/accounts/pollingOracleAccountSubscriber.ts +0 -151
- package/src/accounts/pollingTokenAccountSubscriber.ts +0 -147
- package/src/accounts/pollingUserAccountSubscriber.ts +0 -198
- package/src/accounts/pollingUserStatsAccountSubscriber.ts +0 -180
- package/src/accounts/pollingVelocityClientAccountSubscriber.ts +0 -774
- package/src/accounts/testBulkAccountLoader.ts +0 -59
- package/src/accounts/types.ts +0 -428
- package/src/accounts/utils.ts +0 -90
- package/src/accounts/webSocketAccountSubscriber.ts +0 -304
- package/src/accounts/webSocketAccountSubscriberV2.ts +0 -536
- package/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts +0 -171
- package/src/accounts/webSocketProgramAccountSubscriber.ts +0 -244
- package/src/accounts/webSocketProgramAccountSubscriberV2.ts +0 -1048
- package/src/accounts/webSocketProgramAccountsSubscriberV2.ts +0 -1042
- package/src/accounts/webSocketUserAccountSubscriber.ts +0 -139
- package/src/accounts/webSocketUserStatsAccountSubsriber.ts +0 -131
- package/src/accounts/webSocketVelocityClientAccountSubscriber.ts +0 -865
- package/src/accounts/webSocketVelocityClientAccountSubscriberV2.ts +0 -897
- package/src/accounts/websocketProgramUserAccountSubscriber.ts +0 -127
- package/src/addresses/marketAddresses.ts +0 -28
- package/src/addresses/pda.ts +0 -620
- package/src/adminClient.ts +0 -8136
- package/src/assert/assert.ts +0 -5
- package/src/auctionSubscriber/auctionSubscriber.ts +0 -86
- package/src/auctionSubscriber/auctionSubscriberGrpc.ts +0 -99
- package/src/auctionSubscriber/index.ts +0 -9
- package/src/auctionSubscriber/types.ts +0 -30
- package/src/bankrun/bankrunConnection.ts +0 -630
- package/src/blockhashSubscriber/BlockhashSubscriber.ts +0 -160
- package/src/blockhashSubscriber/index.ts +0 -6
- package/src/blockhashSubscriber/types.ts +0 -13
- package/src/clock/clockSubscriber.ts +0 -146
- package/src/config.ts +0 -312
- package/src/constants/index.ts +0 -9
- package/src/constants/numericConstants.ts +0 -194
- package/src/constants/perpMarkets.ts +0 -127
- package/src/constants/spotMarkets.ts +0 -104
- package/src/constants/txConstants.ts +0 -2
- package/src/constituentMap/constituentMap.ts +0 -305
- package/src/constituentMap/pollingConstituentAccountSubscriber.ts +0 -99
- package/src/constituentMap/webSocketConstituentAccountSubscriber.ts +0 -121
- package/src/core/VelocityCore.ts +0 -606
- package/src/core/index.ts +0 -12
- package/src/core/instructions/deposit.ts +0 -64
- package/src/core/instructions/fill.ts +0 -51
- package/src/core/instructions/funding.ts +0 -33
- package/src/core/instructions/liquidation.ts +0 -55
- package/src/core/instructions/orders.ts +0 -84
- package/src/core/instructions/perpOrders.ts +0 -312
- package/src/core/instructions/settlement.ts +0 -40
- package/src/core/instructions/trigger.ts +0 -41
- package/src/core/instructions/withdraw.ts +0 -65
- package/src/core/remainingAccounts.ts +0 -320
- package/src/core/signedMsg.ts +0 -109
- package/src/decode/customCoder.ts +0 -148
- package/src/decode/user.ts +0 -401
- package/src/dlob/DLOB.ts +0 -2793
- package/src/dlob/DLOBNode.ts +0 -305
- package/src/dlob/DLOBSubscriber.ts +0 -269
- package/src/dlob/NodeList.ts +0 -244
- package/src/dlob/orderBookLevels.ts +0 -695
- package/src/dlob/types.ts +0 -37
- package/src/events/eventList.ts +0 -114
- package/src/events/eventSubscriber.ts +0 -521
- package/src/events/eventsServerLogProvider.ts +0 -189
- package/src/events/fetchLogs.ts +0 -219
- package/src/events/parse.ts +0 -271
- package/src/events/pollingLogProvider.ts +0 -113
- package/src/events/sort.ts +0 -51
- package/src/events/txEventCache.ts +0 -92
- package/src/events/types.ts +0 -337
- package/src/events/webSocketLogProvider.ts +0 -152
- package/src/factory/bigNum.ts +0 -709
- package/src/factory/oracleClient.ts +0 -73
- package/src/idl/pyth.json +0 -142
- package/src/idl/pyth.ts +0 -97
- package/src/idl/pyth_solana_receiver.json +0 -628
- package/src/idl/token_faucet.json +0 -229
- package/src/idl/token_faucet.ts +0 -197
- package/src/idl/velocity.json +0 -23974
- package/src/idl/velocity.ts +0 -23980
- package/src/index.ts +0 -150
- package/src/indicative-quotes/indicativeQuotesSender.ts +0 -233
- package/src/isomorphic/README.md +0 -19
- package/src/isomorphic/anchor.browser.ts +0 -44
- package/src/isomorphic/anchor.node.ts +0 -1
- package/src/isomorphic/anchor.ts +0 -1
- package/src/isomorphic/anchor29.browser.ts +0 -24
- package/src/isomorphic/anchor29.node.ts +0 -1
- package/src/isomorphic/anchor29.ts +0 -1
- package/src/isomorphic/grpc.browser.ts +0 -4
- package/src/isomorphic/grpc.node.ts +0 -130
- package/src/isomorphic/grpc.ts +0 -1
- package/src/jupiter/jupiterClient.ts +0 -502
- package/src/keypair.ts +0 -32
- package/src/margin/README.md +0 -138
- package/src/marginCalculation.ts +0 -407
- package/src/marinade/idl/idl.json +0 -1962
- package/src/marinade/index.ts +0 -73
- package/src/marinade/types.ts +0 -3925
- package/src/math/amm.ts +0 -1758
- package/src/math/auction.ts +0 -480
- package/src/math/bankruptcy.ts +0 -138
- package/src/math/builder.ts +0 -130
- package/src/math/conversion.ts +0 -45
- package/src/math/exchangeStatus.ts +0 -261
- package/src/math/funding.ts +0 -498
- package/src/math/insurance.ts +0 -171
- package/src/math/liquidation.ts +0 -433
- package/src/math/margin.ts +0 -327
- package/src/math/market.ts +0 -487
- package/src/math/oracles.ts +0 -477
- package/src/math/orders.ts +0 -500
- package/src/math/position.ts +0 -381
- package/src/math/repeg.ts +0 -223
- package/src/math/spotBalance.ts +0 -996
- package/src/math/spotMarket.ts +0 -115
- package/src/math/spotPosition.ts +0 -263
- package/src/math/state.ts +0 -71
- package/src/math/superStake.ts +0 -602
- package/src/math/tiers.ts +0 -73
- package/src/math/trade.ts +0 -879
- package/src/math/utils.ts +0 -183
- package/src/memcmp.ts +0 -279
- package/src/oracles/oracleClientCache.ts +0 -41
- package/src/oracles/oracleId.ts +0 -99
- package/src/oracles/prelaunchOracleClient.ts +0 -63
- package/src/oracles/pythClient.ts +0 -125
- package/src/oracles/pythLazerClient.ts +0 -141
- package/src/oracles/quoteAssetOracleClient.ts +0 -43
- package/src/oracles/strictOraclePrice.ts +0 -40
- package/src/oracles/types.ts +0 -82
- package/src/oracles/utils.ts +0 -45
- package/src/orderParams.ts +0 -117
- package/src/orderSubscriber/OrderSubscriber.ts +0 -378
- package/src/orderSubscriber/PollingSubscription.ts +0 -50
- package/src/orderSubscriber/WebsocketSubscription.ts +0 -137
- package/src/orderSubscriber/grpcSubscription.ts +0 -155
- package/src/orderSubscriber/index.ts +0 -7
- package/src/orderSubscriber/types.ts +0 -64
- package/src/priorityFee/averageOverSlotsStrategy.ts +0 -17
- package/src/priorityFee/averageStrategy.ts +0 -13
- package/src/priorityFee/ewmaStrategy.ts +0 -51
- package/src/priorityFee/heliusPriorityFeeMethod.ts +0 -68
- package/src/priorityFee/index.ts +0 -16
- package/src/priorityFee/maxOverSlotsStrategy.ts +0 -18
- package/src/priorityFee/maxStrategy.ts +0 -8
- package/src/priorityFee/priorityFeeSubscriber.ts +0 -328
- package/src/priorityFee/priorityFeeSubscriberMap.ts +0 -134
- package/src/priorityFee/solanaPriorityFeeMethod.ts +0 -46
- package/src/priorityFee/types.ts +0 -82
- package/src/priorityFee/velocityPriorityFeeMethod.ts +0 -53
- package/src/pyth/constants.ts +0 -9
- package/src/pyth/index.ts +0 -15
- package/src/pyth/pythLazerSubscriber.ts +0 -365
- package/src/pyth/types.ts +0 -4451
- package/src/pyth/utils.ts +0 -13
- package/src/slot/SlotSubscriber.ts +0 -126
- package/src/slot/SlothashSubscriber.ts +0 -163
- package/src/swap/UnifiedSwapClient.ts +0 -315
- package/src/swift/grpcSignedMsgUserAccountSubscriber.ts +0 -81
- package/src/swift/index.ts +0 -10
- package/src/swift/signedMsgUserAccountSubscriber.ts +0 -251
- package/src/swift/swiftOrderSubscriber.ts +0 -351
- package/src/testClient.ts +0 -42
- package/src/titan/titanClient.ts +0 -438
- package/src/token/index.ts +0 -13
- package/src/tokenFaucet.ts +0 -296
- package/src/tx/baseTxSender.ts +0 -651
- package/src/tx/blockhashFetcher/baseBlockhashFetcher.ts +0 -31
- package/src/tx/blockhashFetcher/cachedBlockhashFetcher.ts +0 -105
- package/src/tx/blockhashFetcher/types.ts +0 -9
- package/src/tx/fastSingleTxSender.ts +0 -200
- package/src/tx/forwardOnlyTxSender.ts +0 -193
- package/src/tx/priorityFeeCalculator.ts +0 -117
- package/src/tx/reportTransactionError.ts +0 -176
- package/src/tx/retryTxSender.ts +0 -177
- package/src/tx/txHandler.ts +0 -1009
- package/src/tx/txParamProcessor.ts +0 -225
- package/src/tx/types.ts +0 -117
- package/src/tx/utils.ts +0 -133
- package/src/tx/whileValidTxSender.ts +0 -377
- package/src/types.ts +0 -2575
- package/src/user.ts +0 -5316
- package/src/userConfig.ts +0 -38
- package/src/userMap/PollingSubscription.ts +0 -61
- package/src/userMap/WebsocketSubscription.ts +0 -93
- package/src/userMap/grpcSubscription.ts +0 -93
- package/src/userMap/referrerMap.ts +0 -360
- package/src/userMap/revenueShareEscrowMap.ts +0 -342
- package/src/userMap/userMap.ts +0 -784
- package/src/userMap/userMapConfig.ts +0 -82
- package/src/userMap/userStatsMap.ts +0 -393
- package/src/userName.ts +0 -37
- package/src/userStats.ts +0 -159
- package/src/userStatsConfig.ts +0 -35
- package/src/util/TransactionConfirmationManager.ts +0 -333
- package/src/util/chainClock.ts +0 -65
- package/src/util/computeUnits.ts +0 -101
- package/src/util/digest.ts +0 -33
- package/src/util/ed25519Utils.ts +0 -95
- package/src/util/promiseTimeout.ts +0 -23
- package/src/velocityClient.ts +0 -14802
- package/src/velocityClientConfig.ts +0 -119
- package/src/wallet.ts +0 -91
- package/tests/VelocityCore/builder_escrow.test.ts +0 -121
- package/tests/VelocityCore/decode.test.ts +0 -16
- package/tests/VelocityCore/fill_trigger.test.ts +0 -73
- package/tests/VelocityCore/instructions.test.ts +0 -46
- package/tests/VelocityCore/pdas.test.ts +0 -30
- package/tests/VelocityCore/perp_orders.test.ts +0 -205
- package/tests/VelocityCore/remainingAccounts.test.ts +0 -72
- package/tests/VelocityCore/settlement_liquidation.test.ts +0 -69
- package/tests/accounts/customizedCadenceBulkAccountLoader.test.ts +0 -211
- package/tests/amm/test.ts +0 -2402
- package/tests/auctions/test.ts +0 -81
- package/tests/bn/test.ts +0 -355
- package/tests/builder/builderFee.test.ts +0 -42
- package/tests/ci/verifyConstants.ts +0 -393
- package/tests/decode/test.ts +0 -262
- package/tests/decode/userAccountBufferStrings.ts +0 -102
- package/tests/dlob/helpers.ts +0 -748
- package/tests/dlob/test.ts +0 -6969
- package/tests/dlob/tickSizeStandardization.ts +0 -545
- package/tests/events/parseLogsForCuUsage.ts +0 -139
- package/tests/exchangeStatus/test.ts +0 -45
- package/tests/insurance/test.ts +0 -40
- package/tests/liquidation/test.ts +0 -125
- package/tests/oracles/mmOracleGate.test.ts +0 -379
- package/tests/oracles/pythPegSnap.test.ts +0 -76
- package/tests/sdkParity/enumParity.test.ts +0 -84
- package/tests/sdkParity/marginCategoryFill.test.ts +0 -143
- package/tests/sdkParity/memcmpOffsets.test.ts +0 -139
- package/tests/spot/test.ts +0 -281
- package/tests/tx/TransactionConfirmationManager.test.ts +0 -312
- package/tests/tx/cachedBlockhashFetcher.test.ts +0 -96
- package/tests/tx/priorityFeeCalculator.ts +0 -77
- package/tests/tx/priorityFeeStrategy.ts +0 -95
- package/tests/user/bankruptcy.ts +0 -165
- package/tests/user/feeAndWithdrawLimits.ts +0 -284
- package/tests/user/getMarginCalculation.ts +0 -586
- package/tests/user/helpers.ts +0 -184
- package/tests/user/liquidations.ts +0 -129
- package/tests/user/marginCalculations.test.ts +0 -321
- package/tests/user/test.ts +0 -833
- package/tsconfig.browser.json +0 -18
- package/tsconfig.json +0 -36
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { Context, PublicKey } from '@solana/web3.js';
|
|
2
|
-
import { Buffer } from 'buffer';
|
|
3
|
-
import { grpcProgramAccountSubscriber } from '../accounts/grpcProgramAccountSubscriber';
|
|
4
|
-
import { OrderSubscriber } from './OrderSubscriber';
|
|
5
|
-
import { GrpcConfigs, ResubOpts } from '../accounts/types';
|
|
6
|
-
import { UserAccount } from '../types';
|
|
7
|
-
import { getUserFilter, getNonIdleUserFilter } from '../memcmp';
|
|
8
|
-
import { LaserstreamProgramAccountSubscriber } from '../accounts/laserProgramAccountSubscriber';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* `OrderSubscriber` transport backed by a gRPC Geyser stream — either the
|
|
12
|
-
* standard `grpcProgramAccountSubscriber` or, when `grpcConfigs.client ===
|
|
13
|
-
* 'laser'`, `LaserstreamProgramAccountSubscriber` — filtered to non-idle
|
|
14
|
-
* `User` accounts. Same initial-load/resync semantics as `WebsocketSubscription`.
|
|
15
|
-
*/
|
|
16
|
-
export class grpcSubscription {
|
|
17
|
-
private orderSubscriber: OrderSubscriber;
|
|
18
|
-
private skipInitialLoad: boolean;
|
|
19
|
-
private resubOpts?: ResubOpts;
|
|
20
|
-
private resyncIntervalMs?: number;
|
|
21
|
-
|
|
22
|
-
private subscriber?:
|
|
23
|
-
| grpcProgramAccountSubscriber<UserAccount>
|
|
24
|
-
| LaserstreamProgramAccountSubscriber<UserAccount>;
|
|
25
|
-
private resyncTimeoutId?: ReturnType<typeof setTimeout>;
|
|
26
|
-
|
|
27
|
-
private decoded?: boolean;
|
|
28
|
-
|
|
29
|
-
private grpcConfigs: GrpcConfigs;
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* @param grpcConfigs gRPC/Geyser endpoint config; `client: 'laser'` selects the Laserstream implementation, otherwise the standard gRPC subscriber is used.
|
|
33
|
-
* @param orderSubscriber The `OrderSubscriber` to feed with updates.
|
|
34
|
-
* @param skipInitialLoad Skip the initial full `fetch()` snapshot after subscribing; defaults to `false`.
|
|
35
|
-
* @param resubOpts Reconnect behavior for the underlying gRPC subscriber.
|
|
36
|
-
* @param resyncIntervalMs If set, runs a periodic full `fetch()` resync at this interval.
|
|
37
|
-
* @param decoded Whether updates are delivered already Anchor-decoded (`true`, default) or as raw buffers for `OrderSubscriber` to decode itself.
|
|
38
|
-
*/
|
|
39
|
-
constructor({
|
|
40
|
-
grpcConfigs,
|
|
41
|
-
orderSubscriber,
|
|
42
|
-
skipInitialLoad = false,
|
|
43
|
-
resubOpts,
|
|
44
|
-
resyncIntervalMs,
|
|
45
|
-
decoded = true,
|
|
46
|
-
}: {
|
|
47
|
-
grpcConfigs: GrpcConfigs;
|
|
48
|
-
orderSubscriber: OrderSubscriber;
|
|
49
|
-
skipInitialLoad?: boolean;
|
|
50
|
-
resubOpts?: ResubOpts;
|
|
51
|
-
resyncIntervalMs?: number;
|
|
52
|
-
decoded?: boolean;
|
|
53
|
-
}) {
|
|
54
|
-
this.orderSubscriber = orderSubscriber;
|
|
55
|
-
this.skipInitialLoad = skipInitialLoad;
|
|
56
|
-
this.resubOpts = resubOpts;
|
|
57
|
-
this.resyncIntervalMs = resyncIntervalMs;
|
|
58
|
-
this.decoded = decoded;
|
|
59
|
-
this.grpcConfigs = grpcConfigs;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/** Establishes the gRPC/Laserstream program-account subscription (idempotent), optionally backfills with `fetch()`, and starts the resync timer if configured. */
|
|
63
|
-
public async subscribe(): Promise<void> {
|
|
64
|
-
if (this.subscriber) {
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (this.grpcConfigs.client === 'laser') {
|
|
69
|
-
this.subscriber =
|
|
70
|
-
await LaserstreamProgramAccountSubscriber.create<UserAccount>(
|
|
71
|
-
this.grpcConfigs,
|
|
72
|
-
'OrderSubscriber',
|
|
73
|
-
'user',
|
|
74
|
-
this.orderSubscriber.velocityClient.program,
|
|
75
|
-
this.orderSubscriber.decodeFn,
|
|
76
|
-
{
|
|
77
|
-
filters: [getUserFilter(), getNonIdleUserFilter()],
|
|
78
|
-
},
|
|
79
|
-
this.resubOpts
|
|
80
|
-
);
|
|
81
|
-
} else {
|
|
82
|
-
this.subscriber = await grpcProgramAccountSubscriber.create<UserAccount>(
|
|
83
|
-
this.grpcConfigs,
|
|
84
|
-
'OrderSubscriber',
|
|
85
|
-
'user',
|
|
86
|
-
this.orderSubscriber.velocityClient.program,
|
|
87
|
-
this.orderSubscriber.decodeFn,
|
|
88
|
-
{
|
|
89
|
-
filters: [getUserFilter(), getNonIdleUserFilter()],
|
|
90
|
-
},
|
|
91
|
-
this.resubOpts
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
await this.subscriber.subscribe(
|
|
96
|
-
(
|
|
97
|
-
accountId: PublicKey,
|
|
98
|
-
account: UserAccount,
|
|
99
|
-
context: Context,
|
|
100
|
-
buffer: Buffer
|
|
101
|
-
) => {
|
|
102
|
-
const userKey = accountId.toBase58();
|
|
103
|
-
if (this.decoded ?? true) {
|
|
104
|
-
this.orderSubscriber.tryUpdateUserAccount(
|
|
105
|
-
userKey,
|
|
106
|
-
'decoded',
|
|
107
|
-
account,
|
|
108
|
-
context.slot
|
|
109
|
-
);
|
|
110
|
-
} else {
|
|
111
|
-
this.orderSubscriber.tryUpdateUserAccount(
|
|
112
|
-
userKey,
|
|
113
|
-
'buffer',
|
|
114
|
-
buffer,
|
|
115
|
-
context.slot
|
|
116
|
-
);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
);
|
|
120
|
-
|
|
121
|
-
if (!this.skipInitialLoad) {
|
|
122
|
-
await this.orderSubscriber.fetch();
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
if (this.resyncIntervalMs) {
|
|
126
|
-
const recursiveResync = () => {
|
|
127
|
-
this.resyncTimeoutId = setTimeout(() => {
|
|
128
|
-
this.orderSubscriber
|
|
129
|
-
.fetch()
|
|
130
|
-
.catch((e) => {
|
|
131
|
-
console.error('Failed to resync in OrderSubscriber');
|
|
132
|
-
console.log(e);
|
|
133
|
-
})
|
|
134
|
-
.finally(() => {
|
|
135
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
136
|
-
if (!this.resyncTimeoutId) return;
|
|
137
|
-
recursiveResync();
|
|
138
|
-
});
|
|
139
|
-
}, this.resyncIntervalMs);
|
|
140
|
-
};
|
|
141
|
-
recursiveResync();
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/** Tears down the gRPC subscription and cancels the resync timer, if any. No-op if not subscribed. */
|
|
146
|
-
public async unsubscribe(): Promise<void> {
|
|
147
|
-
if (!this.subscriber) return;
|
|
148
|
-
await this.subscriber.unsubscribe();
|
|
149
|
-
this.subscriber = undefined;
|
|
150
|
-
if (this.resyncTimeoutId !== undefined) {
|
|
151
|
-
clearTimeout(this.resyncTimeoutId);
|
|
152
|
-
this.resyncTimeoutId = undefined;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OrderSubscriber — streams all open orders across all users from on-chain state.
|
|
3
|
-
* Used by keeper bots and the DLOB to maintain a live view of the full order book
|
|
4
|
-
* without subscribing to every individual User account separately.
|
|
5
|
-
*/
|
|
6
|
-
export * from './OrderSubscriber';
|
|
7
|
-
export * from './types';
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { Commitment, PublicKey } from '@solana/web3.js';
|
|
2
|
-
import { Order, UserAccount } from '../types';
|
|
3
|
-
import { VelocityClient } from '../velocityClient';
|
|
4
|
-
import { GrpcConfigs } from '../accounts/types';
|
|
5
|
-
|
|
6
|
-
/** Configuration for `OrderSubscriber`. */
|
|
7
|
-
export type OrderSubscriberConfig = {
|
|
8
|
-
velocityClient?: VelocityClient;
|
|
9
|
-
/** Selects the update transport: `'polling'` (interval `getProgramAccounts`), `'websocket'` (program-account subscription), or `'grpc'` (Geyser/Laserstream). `commitment` defaults to `'processed'` if unset; `skipInitialLoad` (websocket/grpc only) skips the initial `fetch()` full snapshot; `resubTimeoutMs`/`logResubMessages` control websocket/grpc reconnect behavior; `resyncIntervalMs` (websocket/grpc only) triggers a periodic full `fetch()` resync on top of the live subscription. */
|
|
10
|
-
subscriptionConfig:
|
|
11
|
-
| {
|
|
12
|
-
type: 'polling';
|
|
13
|
-
frequency: number;
|
|
14
|
-
commitment?: Commitment;
|
|
15
|
-
}
|
|
16
|
-
| {
|
|
17
|
-
type: 'websocket';
|
|
18
|
-
skipInitialLoad?: boolean;
|
|
19
|
-
resubTimeoutMs?: number;
|
|
20
|
-
logResubMessages?: boolean;
|
|
21
|
-
resyncIntervalMs?: number;
|
|
22
|
-
commitment?: Commitment;
|
|
23
|
-
}
|
|
24
|
-
| {
|
|
25
|
-
type: 'grpc';
|
|
26
|
-
grpcConfigs: GrpcConfigs;
|
|
27
|
-
skipInitialLoad?: boolean;
|
|
28
|
-
resubTimeoutMs?: number;
|
|
29
|
-
logResubMessages?: boolean;
|
|
30
|
-
resyncIntervalMs?: number;
|
|
31
|
-
commitment?: Commitment;
|
|
32
|
-
};
|
|
33
|
-
/** Use the hand-written `decodeUser` fast-path decoder instead of the Anchor account coder. Defaults to `true`. */
|
|
34
|
-
fastDecode?: boolean;
|
|
35
|
-
/** For websocket/grpc transports, whether the subscriber's own subscription decodes accounts itself (`true`, default) or passes raw buffers for the caller to decode. */
|
|
36
|
-
decodeData?: boolean;
|
|
37
|
-
/** Widen the account filter from "has at least one order" to "any non-idle user", so idle-but-non-empty accounts are also tracked. Defaults to `false`. */
|
|
38
|
-
fetchAllNonIdleUsers?: boolean;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
/** Events emitted on `OrderSubscriber.eventEmitter`. */
|
|
42
|
-
export interface OrderSubscriberEvents {
|
|
43
|
-
/** Fired when a `User` account update introduces one or more orders newly placed in `(previousObservedSlot, slot]`. */
|
|
44
|
-
orderCreated: (
|
|
45
|
-
account: UserAccount,
|
|
46
|
-
updatedOrders: Order[],
|
|
47
|
-
pubkey: PublicKey,
|
|
48
|
-
slot: number,
|
|
49
|
-
dataType: 'raw' | 'decoded' | 'buffer'
|
|
50
|
-
) => void;
|
|
51
|
-
/** Fired whenever a `User` account update is accepted (i.e. not rejected by the staleness/slot check). */
|
|
52
|
-
userUpdated: (
|
|
53
|
-
account: UserAccount,
|
|
54
|
-
pubkey: PublicKey,
|
|
55
|
-
slot: number,
|
|
56
|
-
dataType: 'raw' | 'decoded' | 'buffer'
|
|
57
|
-
) => void;
|
|
58
|
-
/** Fired for every incoming update, even ones ultimately rejected as stale. */
|
|
59
|
-
updateReceived: (
|
|
60
|
-
pubkey: PublicKey,
|
|
61
|
-
slot: number,
|
|
62
|
-
dataType: 'raw' | 'decoded' | 'buffer'
|
|
63
|
-
) => void;
|
|
64
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { SolanaPriorityFeeResponse } from './solanaPriorityFeeMethod';
|
|
2
|
-
import { PriorityFeeStrategy } from './types';
|
|
3
|
-
|
|
4
|
-
/** `PriorityFeeStrategy` that averages `prioritizationFee` across all samples in the lookback window. Returns `0` for an empty sample set. */
|
|
5
|
-
export class AverageOverSlotsStrategy implements PriorityFeeStrategy {
|
|
6
|
-
calculate(samples: SolanaPriorityFeeResponse[]): number {
|
|
7
|
-
if (samples.length === 0) {
|
|
8
|
-
return 0;
|
|
9
|
-
}
|
|
10
|
-
let runningSumFees = 0;
|
|
11
|
-
|
|
12
|
-
for (let i = 0; i < samples.length; i++) {
|
|
13
|
-
runningSumFees += samples[i].prioritizationFee;
|
|
14
|
-
}
|
|
15
|
-
return runningSumFees / samples.length;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { SolanaPriorityFeeResponse } from './solanaPriorityFeeMethod';
|
|
2
|
-
import { PriorityFeeStrategy } from './types';
|
|
3
|
-
|
|
4
|
-
/** `PriorityFeeStrategy` that averages `prioritizationFee` across all samples. Unlike `AverageOverSlotsStrategy`, does not guard the empty-sample case — calling with `samples.length === 0` returns `NaN`. */
|
|
5
|
-
export class AverageStrategy implements PriorityFeeStrategy {
|
|
6
|
-
calculate(samples: SolanaPriorityFeeResponse[]): number {
|
|
7
|
-
return (
|
|
8
|
-
samples.reduce((a, b) => {
|
|
9
|
-
return a + b.prioritizationFee;
|
|
10
|
-
}, 0) / samples.length
|
|
11
|
-
);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { SolanaPriorityFeeResponse } from './solanaPriorityFeeMethod';
|
|
2
|
-
import { PriorityFeeStrategy } from './types';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* `PriorityFeeStrategy` that computes an exponentially-weighted moving
|
|
6
|
-
* average of `prioritizationFee` over slots, so more recent samples are
|
|
7
|
-
* weighted more heavily and larger slot gaps decay the older sample's
|
|
8
|
-
* influence faster.
|
|
9
|
-
*/
|
|
10
|
-
class EwmaStrategy implements PriorityFeeStrategy {
|
|
11
|
-
private halfLife: number;
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @param halfLife The half life of the EWMA in slots. Default is 25 slots, approx 10 seconds.
|
|
15
|
-
*/
|
|
16
|
-
constructor(halfLife = 25) {
|
|
17
|
-
this.halfLife = halfLife;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// samples provided in desc slot order
|
|
21
|
-
/**
|
|
22
|
-
* @param samples Fee samples sorted descending by slot (as returned by `fetchSolanaPriorityFee`). Reversed internally to process oldest-first.
|
|
23
|
-
* @returns `0` for an empty sample set; the single sample's fee if only one is provided; otherwise the EWMA, decayed per-step by `1 - exp(ln(0.5) / halfLife * slotGap)`.
|
|
24
|
-
*/
|
|
25
|
-
calculate(samples: SolanaPriorityFeeResponse[]): number {
|
|
26
|
-
if (samples.length === 0) {
|
|
27
|
-
return 0;
|
|
28
|
-
}
|
|
29
|
-
if (samples.length === 1) {
|
|
30
|
-
return samples[0].prioritizationFee;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
let ewma = 0;
|
|
34
|
-
|
|
35
|
-
const samplesReversed = samples.slice().reverse();
|
|
36
|
-
for (let i = 0; i < samplesReversed.length; i++) {
|
|
37
|
-
if (i === 0) {
|
|
38
|
-
ewma = samplesReversed[i].prioritizationFee;
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
41
|
-
const gap = samplesReversed[i].slot - samplesReversed[i - 1].slot;
|
|
42
|
-
const alpha = 1 - Math.exp((Math.log(0.5) / this.halfLife) * gap);
|
|
43
|
-
|
|
44
|
-
ewma = alpha * samplesReversed[i].prioritizationFee + (1 - alpha) * ewma;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return ewma;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export { EwmaStrategy };
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import fetch from 'node-fetch';
|
|
2
|
-
|
|
3
|
-
/** Percentile buckets returned by Helius's `getPriorityFeeEstimate` (`includeAllPriorityFeeLevels`). */
|
|
4
|
-
export enum HeliusPriorityLevel {
|
|
5
|
-
MIN = 'min', // 25th percentile
|
|
6
|
-
LOW = 'low', // 25th percentile
|
|
7
|
-
MEDIUM = 'medium', // 50th percentile
|
|
8
|
-
HIGH = 'high', // 75th percentile
|
|
9
|
-
VERY_HIGH = 'veryHigh', // 95th percentile
|
|
10
|
-
UNSAFE_MAX = 'unsafeMax', // 100th percentile
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/** Priority fee (micro-lamports/CU) at each `HeliusPriorityLevel` percentile. */
|
|
14
|
-
export type HeliusPriorityFeeLevels = {
|
|
15
|
-
[key in HeliusPriorityLevel]: number;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
/** Raw JSON-RPC response from Helius's `getPriorityFeeEstimate`. */
|
|
19
|
-
export type HeliusPriorityFeeResponse = {
|
|
20
|
-
jsonrpc: string;
|
|
21
|
-
result: {
|
|
22
|
-
/** Single-value estimate; only populated when `includeAllPriorityFeeLevels` was not requested. */
|
|
23
|
-
priorityFeeEstimate?: number;
|
|
24
|
-
/** Per-percentile estimates; populated when `includeAllPriorityFeeLevels: true` is requested (as `fetchHeliusPriorityFee` does). */
|
|
25
|
-
priorityFeeLevels?: HeliusPriorityFeeLevels;
|
|
26
|
-
};
|
|
27
|
-
id: string;
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Fetches priority fee estimates from the Helius `getPriorityFeeEstimate` API
|
|
32
|
-
* (https://docs.helius.dev/solana-rpc-nodes/alpha-priority-fee-api).
|
|
33
|
-
* @param heliusRpcUrl Helius RPC URL to POST the `getPriorityFeeEstimate` request to.
|
|
34
|
-
* @param lookbackDistance Number of recent slots to consider (`lookbackSlots` option).
|
|
35
|
-
* @param addresses Account keys to scope the estimate to (accounts the transaction will write-lock).
|
|
36
|
-
* @returns The full Helius response (with `includeAllPriorityFeeLevels: true`), or `undefined` if the request failed (error is logged, not thrown).
|
|
37
|
-
*/
|
|
38
|
-
export async function fetchHeliusPriorityFee(
|
|
39
|
-
heliusRpcUrl: string,
|
|
40
|
-
lookbackDistance: number,
|
|
41
|
-
addresses: string[]
|
|
42
|
-
): Promise<HeliusPriorityFeeResponse | undefined> {
|
|
43
|
-
try {
|
|
44
|
-
const response = await fetch(heliusRpcUrl, {
|
|
45
|
-
method: 'POST',
|
|
46
|
-
headers: { 'Content-Type': 'application/json' },
|
|
47
|
-
body: JSON.stringify({
|
|
48
|
-
jsonrpc: '2.0',
|
|
49
|
-
id: '1',
|
|
50
|
-
method: 'getPriorityFeeEstimate',
|
|
51
|
-
params: [
|
|
52
|
-
{
|
|
53
|
-
accountKeys: addresses,
|
|
54
|
-
options: {
|
|
55
|
-
includeAllPriorityFeeLevels: true,
|
|
56
|
-
lookbackSlots: lookbackDistance,
|
|
57
|
-
},
|
|
58
|
-
},
|
|
59
|
-
],
|
|
60
|
-
}),
|
|
61
|
-
});
|
|
62
|
-
return await response.json();
|
|
63
|
-
} catch (err) {
|
|
64
|
-
console.error(err);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return undefined;
|
|
68
|
-
}
|
package/src/priorityFee/index.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Priority fee estimation strategies for Solana transactions.
|
|
3
|
-
* Implementations: average, EWMA, max-over-slots, max. Injected via VelocityClientConfig.
|
|
4
|
-
* Select a strategy based on congestion tolerance vs. cost sensitivity.
|
|
5
|
-
*/
|
|
6
|
-
export * from './averageOverSlotsStrategy';
|
|
7
|
-
export * from './averageStrategy';
|
|
8
|
-
export * from './ewmaStrategy';
|
|
9
|
-
export * from './maxOverSlotsStrategy';
|
|
10
|
-
export * from './maxStrategy';
|
|
11
|
-
export * from './priorityFeeSubscriber';
|
|
12
|
-
export * from './priorityFeeSubscriberMap';
|
|
13
|
-
export * from './solanaPriorityFeeMethod';
|
|
14
|
-
export * from './heliusPriorityFeeMethod';
|
|
15
|
-
export * from './velocityPriorityFeeMethod';
|
|
16
|
-
export * from './types';
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { SolanaPriorityFeeResponse } from './solanaPriorityFeeMethod';
|
|
2
|
-
import { PriorityFeeStrategy } from './types';
|
|
3
|
-
|
|
4
|
-
/** `PriorityFeeStrategy` that takes the max `prioritizationFee` across all samples in the lookback window. Returns `0` for an empty sample set. */
|
|
5
|
-
export class MaxOverSlotsStrategy implements PriorityFeeStrategy {
|
|
6
|
-
calculate(samples: SolanaPriorityFeeResponse[]): number {
|
|
7
|
-
if (samples.length === 0) {
|
|
8
|
-
return 0;
|
|
9
|
-
}
|
|
10
|
-
// Assuming samples are sorted in descending order of slot.
|
|
11
|
-
let currMaxFee = samples[0].prioritizationFee;
|
|
12
|
-
|
|
13
|
-
for (let i = 0; i < samples.length; i++) {
|
|
14
|
-
currMaxFee = Math.max(samples[i].prioritizationFee, currMaxFee);
|
|
15
|
-
}
|
|
16
|
-
return currMaxFee;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { PriorityFeeStrategy } from './types';
|
|
2
|
-
|
|
3
|
-
/** `PriorityFeeStrategy` that takes the max `prioritizationFee` across all samples. Unlike `MaxOverSlotsStrategy`, does not guard the empty-sample case — calling with an empty array returns `-Infinity`. */
|
|
4
|
-
export class MaxStrategy implements PriorityFeeStrategy {
|
|
5
|
-
calculate(samples: { slot: number; prioritizationFee: number }[]): number {
|
|
6
|
-
return Math.max(...samples.map((result) => result.prioritizationFee));
|
|
7
|
-
}
|
|
8
|
-
}
|