@velocity-exchange/sdk 0.4.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/lib/browser/adminClient.d.ts +52 -0
- package/lib/browser/adminClient.js +97 -0
- package/lib/browser/config.js +6 -7
- package/lib/browser/constants/numericConstants.d.ts +1 -1
- package/lib/browser/constants/numericConstants.js +1 -1
- package/lib/browser/decode/user.js +5 -1
- package/lib/browser/idl/velocity.d.ts +191 -15
- package/lib/browser/idl/velocity.json +192 -16
- package/lib/browser/orderSubscriber/OrderSubscriber.d.ts +1 -0
- package/lib/browser/orderSubscriber/OrderSubscriber.js +10 -4
- package/lib/browser/pyth/pythLazerSubscriber.js +37 -27
- package/lib/browser/types.d.ts +6 -0
- package/lib/browser/user.d.ts +20 -3
- package/lib/browser/user.js +52 -4
- package/lib/browser/velocityClient.d.ts +46 -10
- package/lib/browser/velocityClient.js +107 -35
- package/lib/node/adminClient.d.ts +52 -0
- package/lib/node/adminClient.d.ts.map +1 -1
- package/lib/node/adminClient.js +97 -0
- package/lib/node/config.d.ts.map +1 -1
- package/lib/node/config.js +6 -7
- package/lib/node/constants/numericConstants.d.ts +1 -1
- package/lib/node/constants/numericConstants.d.ts.map +1 -1
- package/lib/node/constants/numericConstants.js +1 -1
- package/lib/node/decode/user.d.ts.map +1 -1
- package/lib/node/decode/user.js +5 -1
- package/lib/node/idl/velocity.d.ts +191 -15
- package/lib/node/idl/velocity.d.ts.map +1 -1
- package/lib/node/idl/velocity.json +192 -16
- package/lib/node/orderSubscriber/OrderSubscriber.d.ts +1 -0
- package/lib/node/orderSubscriber/OrderSubscriber.d.ts.map +1 -1
- package/lib/node/orderSubscriber/OrderSubscriber.js +10 -4
- package/lib/node/pyth/pythLazerSubscriber.d.ts.map +1 -1
- package/lib/node/pyth/pythLazerSubscriber.js +37 -27
- package/lib/node/types.d.ts +6 -0
- package/lib/node/types.d.ts.map +1 -1
- package/lib/node/user.d.ts +20 -3
- package/lib/node/user.d.ts.map +1 -1
- package/lib/node/user.js +52 -4
- package/lib/node/velocityClient.d.ts +46 -10
- package/lib/node/velocityClient.d.ts.map +1 -1
- package/lib/node/velocityClient.js +107 -35
- package/package.json +7 -3
- package/.prettierignore +0 -1
- package/CHANGELOG.md +0 -132
- package/build-browser.js +0 -58
- package/bunfig.toml +0 -3
- package/esbuild-shims.js +0 -12
- package/scripts/deposit-isolated-positions.ts +0 -110
- package/scripts/find-flagged-users.ts +0 -213
- package/scripts/grpc-client-test-comparison.ts +0 -372
- package/scripts/grpc-multiuser-client-test-comparison.ts +0 -158
- package/scripts/postbuild.js +0 -95
- package/scripts/single-grpc-client-test.ts +0 -284
- package/scripts/withdraw-isolated-positions.ts +0 -174
- package/src/accounts/README_WebSocketAccountSubscriberV2.md +0 -95
- package/src/accounts/README_WebSocketProgramAccountSubscriberV2.md +0 -135
- package/src/accounts/basicUserAccountSubscriber.ts +0 -79
- package/src/accounts/basicUserStatsAccountSubscriber.ts +0 -87
- package/src/accounts/bulkAccountLoader.ts +0 -358
- package/src/accounts/bulkUserStatsSubscription.ts +0 -40
- package/src/accounts/bulkUserSubscription.ts +0 -39
- package/src/accounts/customizedCadenceBulkAccountLoader.ts +0 -250
- package/src/accounts/fetch.ts +0 -200
- package/src/accounts/grpcAccountSubscriber.ts +0 -225
- package/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts +0 -73
- package/src/accounts/grpcMultiAccountSubscriber.ts +0 -566
- package/src/accounts/grpcMultiUserAccountSubscriber.ts +0 -328
- package/src/accounts/grpcProgramAccountSubscriber.ts +0 -264
- package/src/accounts/grpcUserAccountSubscriber.ts +0 -63
- package/src/accounts/grpcUserStatsAccountSubscriber.ts +0 -65
- package/src/accounts/grpcVelocityClientAccountSubscriber.ts +0 -257
- package/src/accounts/grpcVelocityClientAccountSubscriberV2.ts +0 -941
- package/src/accounts/laserProgramAccountSubscriber.ts +0 -266
- package/src/accounts/oneShotUserAccountSubscriber.ts +0 -88
- package/src/accounts/oneShotUserStatsAccountSubscriber.ts +0 -94
- package/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +0 -223
- package/src/accounts/pollingOracleAccountSubscriber.ts +0 -151
- package/src/accounts/pollingTokenAccountSubscriber.ts +0 -147
- package/src/accounts/pollingUserAccountSubscriber.ts +0 -198
- package/src/accounts/pollingUserStatsAccountSubscriber.ts +0 -180
- package/src/accounts/pollingVelocityClientAccountSubscriber.ts +0 -774
- package/src/accounts/testBulkAccountLoader.ts +0 -59
- package/src/accounts/types.ts +0 -428
- package/src/accounts/utils.ts +0 -90
- package/src/accounts/webSocketAccountSubscriber.ts +0 -304
- package/src/accounts/webSocketAccountSubscriberV2.ts +0 -536
- package/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts +0 -171
- package/src/accounts/webSocketProgramAccountSubscriber.ts +0 -244
- package/src/accounts/webSocketProgramAccountSubscriberV2.ts +0 -1048
- package/src/accounts/webSocketProgramAccountsSubscriberV2.ts +0 -1042
- package/src/accounts/webSocketUserAccountSubscriber.ts +0 -139
- package/src/accounts/webSocketUserStatsAccountSubsriber.ts +0 -131
- package/src/accounts/webSocketVelocityClientAccountSubscriber.ts +0 -865
- package/src/accounts/webSocketVelocityClientAccountSubscriberV2.ts +0 -897
- package/src/accounts/websocketProgramUserAccountSubscriber.ts +0 -127
- package/src/addresses/marketAddresses.ts +0 -28
- package/src/addresses/pda.ts +0 -620
- package/src/adminClient.ts +0 -8136
- package/src/assert/assert.ts +0 -5
- package/src/auctionSubscriber/auctionSubscriber.ts +0 -86
- package/src/auctionSubscriber/auctionSubscriberGrpc.ts +0 -99
- package/src/auctionSubscriber/index.ts +0 -9
- package/src/auctionSubscriber/types.ts +0 -30
- package/src/bankrun/bankrunConnection.ts +0 -630
- package/src/blockhashSubscriber/BlockhashSubscriber.ts +0 -160
- package/src/blockhashSubscriber/index.ts +0 -6
- package/src/blockhashSubscriber/types.ts +0 -13
- package/src/clock/clockSubscriber.ts +0 -146
- package/src/config.ts +0 -312
- package/src/constants/index.ts +0 -9
- package/src/constants/numericConstants.ts +0 -194
- package/src/constants/perpMarkets.ts +0 -127
- package/src/constants/spotMarkets.ts +0 -104
- package/src/constants/txConstants.ts +0 -2
- package/src/constituentMap/constituentMap.ts +0 -305
- package/src/constituentMap/pollingConstituentAccountSubscriber.ts +0 -99
- package/src/constituentMap/webSocketConstituentAccountSubscriber.ts +0 -121
- package/src/core/VelocityCore.ts +0 -606
- package/src/core/index.ts +0 -12
- package/src/core/instructions/deposit.ts +0 -64
- package/src/core/instructions/fill.ts +0 -51
- package/src/core/instructions/funding.ts +0 -33
- package/src/core/instructions/liquidation.ts +0 -55
- package/src/core/instructions/orders.ts +0 -84
- package/src/core/instructions/perpOrders.ts +0 -312
- package/src/core/instructions/settlement.ts +0 -40
- package/src/core/instructions/trigger.ts +0 -41
- package/src/core/instructions/withdraw.ts +0 -65
- package/src/core/remainingAccounts.ts +0 -320
- package/src/core/signedMsg.ts +0 -109
- package/src/decode/customCoder.ts +0 -148
- package/src/decode/user.ts +0 -401
- package/src/dlob/DLOB.ts +0 -2793
- package/src/dlob/DLOBNode.ts +0 -305
- package/src/dlob/DLOBSubscriber.ts +0 -269
- package/src/dlob/NodeList.ts +0 -244
- package/src/dlob/orderBookLevels.ts +0 -695
- package/src/dlob/types.ts +0 -37
- package/src/events/eventList.ts +0 -114
- package/src/events/eventSubscriber.ts +0 -521
- package/src/events/eventsServerLogProvider.ts +0 -189
- package/src/events/fetchLogs.ts +0 -219
- package/src/events/parse.ts +0 -271
- package/src/events/pollingLogProvider.ts +0 -113
- package/src/events/sort.ts +0 -51
- package/src/events/txEventCache.ts +0 -92
- package/src/events/types.ts +0 -337
- package/src/events/webSocketLogProvider.ts +0 -152
- package/src/factory/bigNum.ts +0 -709
- package/src/factory/oracleClient.ts +0 -73
- package/src/idl/pyth.json +0 -142
- package/src/idl/pyth.ts +0 -97
- package/src/idl/pyth_solana_receiver.json +0 -628
- package/src/idl/token_faucet.json +0 -229
- package/src/idl/token_faucet.ts +0 -197
- package/src/idl/velocity.json +0 -23974
- package/src/idl/velocity.ts +0 -23980
- package/src/index.ts +0 -150
- package/src/indicative-quotes/indicativeQuotesSender.ts +0 -233
- package/src/isomorphic/README.md +0 -19
- package/src/isomorphic/anchor.browser.ts +0 -44
- package/src/isomorphic/anchor.node.ts +0 -1
- package/src/isomorphic/anchor.ts +0 -1
- package/src/isomorphic/anchor29.browser.ts +0 -24
- package/src/isomorphic/anchor29.node.ts +0 -1
- package/src/isomorphic/anchor29.ts +0 -1
- package/src/isomorphic/grpc.browser.ts +0 -4
- package/src/isomorphic/grpc.node.ts +0 -130
- package/src/isomorphic/grpc.ts +0 -1
- package/src/jupiter/jupiterClient.ts +0 -502
- package/src/keypair.ts +0 -32
- package/src/margin/README.md +0 -138
- package/src/marginCalculation.ts +0 -407
- package/src/marinade/idl/idl.json +0 -1962
- package/src/marinade/index.ts +0 -73
- package/src/marinade/types.ts +0 -3925
- package/src/math/amm.ts +0 -1758
- package/src/math/auction.ts +0 -480
- package/src/math/bankruptcy.ts +0 -138
- package/src/math/builder.ts +0 -130
- package/src/math/conversion.ts +0 -45
- package/src/math/exchangeStatus.ts +0 -261
- package/src/math/funding.ts +0 -498
- package/src/math/insurance.ts +0 -171
- package/src/math/liquidation.ts +0 -433
- package/src/math/margin.ts +0 -327
- package/src/math/market.ts +0 -487
- package/src/math/oracles.ts +0 -477
- package/src/math/orders.ts +0 -500
- package/src/math/position.ts +0 -381
- package/src/math/repeg.ts +0 -223
- package/src/math/spotBalance.ts +0 -996
- package/src/math/spotMarket.ts +0 -115
- package/src/math/spotPosition.ts +0 -263
- package/src/math/state.ts +0 -71
- package/src/math/superStake.ts +0 -602
- package/src/math/tiers.ts +0 -73
- package/src/math/trade.ts +0 -879
- package/src/math/utils.ts +0 -183
- package/src/memcmp.ts +0 -279
- package/src/oracles/oracleClientCache.ts +0 -41
- package/src/oracles/oracleId.ts +0 -99
- package/src/oracles/prelaunchOracleClient.ts +0 -63
- package/src/oracles/pythClient.ts +0 -125
- package/src/oracles/pythLazerClient.ts +0 -141
- package/src/oracles/quoteAssetOracleClient.ts +0 -43
- package/src/oracles/strictOraclePrice.ts +0 -40
- package/src/oracles/types.ts +0 -82
- package/src/oracles/utils.ts +0 -45
- package/src/orderParams.ts +0 -117
- package/src/orderSubscriber/OrderSubscriber.ts +0 -378
- package/src/orderSubscriber/PollingSubscription.ts +0 -50
- package/src/orderSubscriber/WebsocketSubscription.ts +0 -137
- package/src/orderSubscriber/grpcSubscription.ts +0 -155
- package/src/orderSubscriber/index.ts +0 -7
- package/src/orderSubscriber/types.ts +0 -64
- package/src/priorityFee/averageOverSlotsStrategy.ts +0 -17
- package/src/priorityFee/averageStrategy.ts +0 -13
- package/src/priorityFee/ewmaStrategy.ts +0 -51
- package/src/priorityFee/heliusPriorityFeeMethod.ts +0 -68
- package/src/priorityFee/index.ts +0 -16
- package/src/priorityFee/maxOverSlotsStrategy.ts +0 -18
- package/src/priorityFee/maxStrategy.ts +0 -8
- package/src/priorityFee/priorityFeeSubscriber.ts +0 -328
- package/src/priorityFee/priorityFeeSubscriberMap.ts +0 -134
- package/src/priorityFee/solanaPriorityFeeMethod.ts +0 -46
- package/src/priorityFee/types.ts +0 -82
- package/src/priorityFee/velocityPriorityFeeMethod.ts +0 -53
- package/src/pyth/constants.ts +0 -9
- package/src/pyth/index.ts +0 -15
- package/src/pyth/pythLazerSubscriber.ts +0 -365
- package/src/pyth/types.ts +0 -4451
- package/src/pyth/utils.ts +0 -13
- package/src/slot/SlotSubscriber.ts +0 -126
- package/src/slot/SlothashSubscriber.ts +0 -163
- package/src/swap/UnifiedSwapClient.ts +0 -315
- package/src/swift/grpcSignedMsgUserAccountSubscriber.ts +0 -81
- package/src/swift/index.ts +0 -10
- package/src/swift/signedMsgUserAccountSubscriber.ts +0 -251
- package/src/swift/swiftOrderSubscriber.ts +0 -351
- package/src/testClient.ts +0 -42
- package/src/titan/titanClient.ts +0 -438
- package/src/token/index.ts +0 -13
- package/src/tokenFaucet.ts +0 -296
- package/src/tx/baseTxSender.ts +0 -651
- package/src/tx/blockhashFetcher/baseBlockhashFetcher.ts +0 -31
- package/src/tx/blockhashFetcher/cachedBlockhashFetcher.ts +0 -105
- package/src/tx/blockhashFetcher/types.ts +0 -9
- package/src/tx/fastSingleTxSender.ts +0 -200
- package/src/tx/forwardOnlyTxSender.ts +0 -193
- package/src/tx/priorityFeeCalculator.ts +0 -117
- package/src/tx/reportTransactionError.ts +0 -176
- package/src/tx/retryTxSender.ts +0 -177
- package/src/tx/txHandler.ts +0 -1009
- package/src/tx/txParamProcessor.ts +0 -225
- package/src/tx/types.ts +0 -117
- package/src/tx/utils.ts +0 -133
- package/src/tx/whileValidTxSender.ts +0 -377
- package/src/types.ts +0 -2575
- package/src/user.ts +0 -5316
- package/src/userConfig.ts +0 -38
- package/src/userMap/PollingSubscription.ts +0 -61
- package/src/userMap/WebsocketSubscription.ts +0 -93
- package/src/userMap/grpcSubscription.ts +0 -93
- package/src/userMap/referrerMap.ts +0 -360
- package/src/userMap/revenueShareEscrowMap.ts +0 -342
- package/src/userMap/userMap.ts +0 -784
- package/src/userMap/userMapConfig.ts +0 -82
- package/src/userMap/userStatsMap.ts +0 -393
- package/src/userName.ts +0 -37
- package/src/userStats.ts +0 -159
- package/src/userStatsConfig.ts +0 -35
- package/src/util/TransactionConfirmationManager.ts +0 -333
- package/src/util/chainClock.ts +0 -65
- package/src/util/computeUnits.ts +0 -101
- package/src/util/digest.ts +0 -33
- package/src/util/ed25519Utils.ts +0 -95
- package/src/util/promiseTimeout.ts +0 -23
- package/src/velocityClient.ts +0 -14802
- package/src/velocityClientConfig.ts +0 -119
- package/src/wallet.ts +0 -91
- package/tests/VelocityCore/builder_escrow.test.ts +0 -121
- package/tests/VelocityCore/decode.test.ts +0 -16
- package/tests/VelocityCore/fill_trigger.test.ts +0 -73
- package/tests/VelocityCore/instructions.test.ts +0 -46
- package/tests/VelocityCore/pdas.test.ts +0 -30
- package/tests/VelocityCore/perp_orders.test.ts +0 -205
- package/tests/VelocityCore/remainingAccounts.test.ts +0 -72
- package/tests/VelocityCore/settlement_liquidation.test.ts +0 -69
- package/tests/accounts/customizedCadenceBulkAccountLoader.test.ts +0 -211
- package/tests/amm/test.ts +0 -2402
- package/tests/auctions/test.ts +0 -81
- package/tests/bn/test.ts +0 -355
- package/tests/builder/builderFee.test.ts +0 -42
- package/tests/ci/verifyConstants.ts +0 -393
- package/tests/decode/test.ts +0 -262
- package/tests/decode/userAccountBufferStrings.ts +0 -102
- package/tests/dlob/helpers.ts +0 -748
- package/tests/dlob/test.ts +0 -6969
- package/tests/dlob/tickSizeStandardization.ts +0 -545
- package/tests/events/parseLogsForCuUsage.ts +0 -139
- package/tests/exchangeStatus/test.ts +0 -45
- package/tests/insurance/test.ts +0 -40
- package/tests/liquidation/test.ts +0 -125
- package/tests/oracles/mmOracleGate.test.ts +0 -379
- package/tests/oracles/pythPegSnap.test.ts +0 -76
- package/tests/sdkParity/enumParity.test.ts +0 -84
- package/tests/sdkParity/marginCategoryFill.test.ts +0 -143
- package/tests/sdkParity/memcmpOffsets.test.ts +0 -139
- package/tests/spot/test.ts +0 -281
- package/tests/tx/TransactionConfirmationManager.test.ts +0 -312
- package/tests/tx/cachedBlockhashFetcher.test.ts +0 -96
- package/tests/tx/priorityFeeCalculator.ts +0 -77
- package/tests/tx/priorityFeeStrategy.ts +0 -95
- package/tests/user/bankruptcy.ts +0 -165
- package/tests/user/feeAndWithdrawLimits.ts +0 -284
- package/tests/user/getMarginCalculation.ts +0 -586
- package/tests/user/helpers.ts +0 -184
- package/tests/user/liquidations.ts +0 -129
- package/tests/user/marginCalculations.test.ts +0 -321
- package/tests/user/test.ts +0 -833
- package/tsconfig.browser.json +0 -18
- package/tsconfig.json +0 -36
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
import { BufferAndSlot, ProgramAccountSubscriber, ResubOpts } from './types';
|
|
2
|
-
import { AnchorProvider } from '../isomorphic/anchor';
|
|
3
|
-
import {
|
|
4
|
-
Commitment,
|
|
5
|
-
Context,
|
|
6
|
-
KeyedAccountInfo,
|
|
7
|
-
MemcmpFilter,
|
|
8
|
-
PublicKey,
|
|
9
|
-
} from '@solana/web3.js';
|
|
10
|
-
import { VelocityProgram } from '../config';
|
|
11
|
-
import * as Buffer from 'buffer';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Default `ProgramAccountSubscriber` implementation: tracks every account owned by the program
|
|
15
|
-
* (optionally narrowed by `options.filters`) via `connection.onProgramAccountChange`, decoding
|
|
16
|
-
* each notification with `decodeBufferFn`. Maintains a per-account (not single, unlike
|
|
17
|
-
* `WebSocketAccountSubscriber`) `bufferAndSlotMap`, since one program subscription covers many
|
|
18
|
-
* accounts; updates are applied per-account only when the notification's slot is not older than
|
|
19
|
-
* that account's last-seen slot and its buffer actually changed. If `resubOpts.resubTimeoutMs`
|
|
20
|
-
* is set, a watchdog timer resubscribes the whole program subscription whenever no notification
|
|
21
|
-
* (for *any* account) arrives within that window. This is the base class extended by
|
|
22
|
-
* `grpcProgramAccountSubscriber` and `LaserstreamProgramAccountSubscriber` for gRPC Geyser-backed
|
|
23
|
-
* tracking.
|
|
24
|
-
*/
|
|
25
|
-
export class WebSocketProgramAccountSubscriber<T>
|
|
26
|
-
implements ProgramAccountSubscriber<T>
|
|
27
|
-
{
|
|
28
|
-
subscriptionName: string;
|
|
29
|
-
accountDiscriminator: string;
|
|
30
|
-
bufferAndSlot?: BufferAndSlot;
|
|
31
|
-
bufferAndSlotMap: Map<string, BufferAndSlot> = new Map();
|
|
32
|
-
program: VelocityProgram;
|
|
33
|
-
decodeBuffer: (accountName: string, ix: Buffer) => T;
|
|
34
|
-
private _onChange?: (
|
|
35
|
-
accountId: PublicKey,
|
|
36
|
-
data: T,
|
|
37
|
-
context: Context,
|
|
38
|
-
buffer: Buffer
|
|
39
|
-
) => void;
|
|
40
|
-
get onChange(): (
|
|
41
|
-
accountId: PublicKey,
|
|
42
|
-
data: T,
|
|
43
|
-
context: Context,
|
|
44
|
-
buffer: Buffer
|
|
45
|
-
) => void {
|
|
46
|
-
if (!this._onChange) {
|
|
47
|
-
throw new Error('onChange callback function must be set');
|
|
48
|
-
}
|
|
49
|
-
return this._onChange;
|
|
50
|
-
}
|
|
51
|
-
set onChange(
|
|
52
|
-
onChange: (
|
|
53
|
-
accountId: PublicKey,
|
|
54
|
-
data: T,
|
|
55
|
-
context: Context,
|
|
56
|
-
buffer: Buffer
|
|
57
|
-
) => void
|
|
58
|
-
) {
|
|
59
|
-
this._onChange = onChange;
|
|
60
|
-
}
|
|
61
|
-
listenerId?: number;
|
|
62
|
-
resubOpts?: ResubOpts;
|
|
63
|
-
isUnsubscribing = false;
|
|
64
|
-
timeoutId?: ReturnType<typeof setTimeout>;
|
|
65
|
-
options: { filters: MemcmpFilter[]; commitment?: Commitment };
|
|
66
|
-
|
|
67
|
-
receivingData = false;
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* @param subscriptionName Human-readable name for logging.
|
|
71
|
-
* @param accountDiscriminator Anchor account type name passed to `decodeBufferFn` for each update.
|
|
72
|
-
* @param program Anchor program whose accounts to watch (filtered to `program.programId` as owner).
|
|
73
|
-
* @param decodeBufferFn Decode function for each account's raw buffer.
|
|
74
|
-
* @param options `filters` narrowing which program accounts are watched (empty watches every account owned by the program); `commitment` for the subscription, defaulting to the provider's configured commitment.
|
|
75
|
-
* @param resubOpts Resubscription watchdog options; omit to disable the inactivity timer.
|
|
76
|
-
*/
|
|
77
|
-
public constructor(
|
|
78
|
-
subscriptionName: string,
|
|
79
|
-
accountDiscriminator: string,
|
|
80
|
-
program: VelocityProgram,
|
|
81
|
-
decodeBufferFn: (accountName: string, ix: Buffer) => T,
|
|
82
|
-
options: { filters: MemcmpFilter[]; commitment?: Commitment } = {
|
|
83
|
-
filters: [],
|
|
84
|
-
},
|
|
85
|
-
resubOpts?: ResubOpts
|
|
86
|
-
) {
|
|
87
|
-
this.subscriptionName = subscriptionName;
|
|
88
|
-
this.accountDiscriminator = accountDiscriminator;
|
|
89
|
-
this.program = program;
|
|
90
|
-
this.decodeBuffer = decodeBufferFn;
|
|
91
|
-
this.resubOpts = resubOpts;
|
|
92
|
-
if (
|
|
93
|
-
this.resubOpts?.resubTimeoutMs != null &&
|
|
94
|
-
this.resubOpts.resubTimeoutMs < 1000
|
|
95
|
-
) {
|
|
96
|
-
console.log(
|
|
97
|
-
'resubTimeoutMs should be at least 1000ms to avoid spamming resub'
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
this.options = options;
|
|
101
|
-
this.receivingData = false;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Attaches the `onProgramAccountChange` WebSocket listener. Idempotent: a no-op if already
|
|
106
|
-
* subscribed or mid-unsubscribe. Does not perform an initial fetch of matching accounts — the
|
|
107
|
-
* caller must fetch any pre-existing accounts separately if needed.
|
|
108
|
-
* @param onChange Invoked once per changed account with its pubkey, decoded data, the notification's `Context`, and the raw buffer.
|
|
109
|
-
*/
|
|
110
|
-
async subscribe(
|
|
111
|
-
onChange: (
|
|
112
|
-
accountId: PublicKey,
|
|
113
|
-
data: T,
|
|
114
|
-
context: Context,
|
|
115
|
-
buffer: Buffer
|
|
116
|
-
) => void
|
|
117
|
-
): Promise<void> {
|
|
118
|
-
if (this.listenerId != null || this.isUnsubscribing) {
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
this.onChange = onChange;
|
|
123
|
-
|
|
124
|
-
this.listenerId = this.program.provider.connection.onProgramAccountChange(
|
|
125
|
-
this.program.programId,
|
|
126
|
-
(keyedAccountInfo, context) => {
|
|
127
|
-
if (this.resubOpts?.resubTimeoutMs) {
|
|
128
|
-
this.receivingData = true;
|
|
129
|
-
clearTimeout(this.timeoutId);
|
|
130
|
-
this.handleRpcResponse(context, keyedAccountInfo);
|
|
131
|
-
this.setTimeout();
|
|
132
|
-
} else {
|
|
133
|
-
this.handleRpcResponse(context, keyedAccountInfo);
|
|
134
|
-
}
|
|
135
|
-
},
|
|
136
|
-
this.options.commitment ??
|
|
137
|
-
(this.program.provider as AnchorProvider).opts.commitment,
|
|
138
|
-
this.options.filters
|
|
139
|
-
);
|
|
140
|
-
|
|
141
|
-
if (this.resubOpts?.resubTimeoutMs) {
|
|
142
|
-
this.receivingData = true;
|
|
143
|
-
this.setTimeout();
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
protected setTimeout(): void {
|
|
148
|
-
if (!this._onChange) {
|
|
149
|
-
throw new Error('onChange callback function must be set');
|
|
150
|
-
}
|
|
151
|
-
this.timeoutId = setTimeout(
|
|
152
|
-
async () => {
|
|
153
|
-
if (this.isUnsubscribing) {
|
|
154
|
-
// If we are in the process of unsubscribing, do not attempt to resubscribe
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
if (this.receivingData) {
|
|
159
|
-
if (this.resubOpts?.logResubMessages) {
|
|
160
|
-
console.log(
|
|
161
|
-
`No ws data from ${this.subscriptionName} in ${this.resubOpts?.resubTimeoutMs}ms, resubscribing`
|
|
162
|
-
);
|
|
163
|
-
}
|
|
164
|
-
await this.unsubscribe(true);
|
|
165
|
-
this.receivingData = false;
|
|
166
|
-
await this.subscribe(this.onChange);
|
|
167
|
-
}
|
|
168
|
-
},
|
|
169
|
-
this.resubOpts?.resubTimeoutMs
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Applies a raw notification for one account within the program subscription: decodes and
|
|
175
|
-
* stores it (updating that account's entry in `bufferAndSlotMap` and invoking `onChange`) only
|
|
176
|
-
* if the slot is not older than the cached one for that specific account and the buffer's
|
|
177
|
-
* bytes actually changed (or this is the first observation of that account).
|
|
178
|
-
*/
|
|
179
|
-
handleRpcResponse(
|
|
180
|
-
context: Context,
|
|
181
|
-
keyedAccountInfo: KeyedAccountInfo
|
|
182
|
-
): void {
|
|
183
|
-
const newSlot = context.slot;
|
|
184
|
-
let newBuffer: Buffer | undefined = undefined;
|
|
185
|
-
if (keyedAccountInfo) {
|
|
186
|
-
newBuffer = keyedAccountInfo.accountInfo.data;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
const accountId = keyedAccountInfo.accountId.toBase58();
|
|
190
|
-
const existingBufferAndSlot = this.bufferAndSlotMap.get(accountId);
|
|
191
|
-
|
|
192
|
-
if (!existingBufferAndSlot) {
|
|
193
|
-
if (newBuffer) {
|
|
194
|
-
this.bufferAndSlotMap.set(accountId, {
|
|
195
|
-
buffer: newBuffer,
|
|
196
|
-
slot: newSlot,
|
|
197
|
-
});
|
|
198
|
-
const account = this.decodeBuffer(this.accountDiscriminator, newBuffer);
|
|
199
|
-
this.onChange(keyedAccountInfo.accountId, account, context, newBuffer);
|
|
200
|
-
}
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
if (newSlot < existingBufferAndSlot.slot) {
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
const oldBuffer = existingBufferAndSlot.buffer;
|
|
209
|
-
if (newBuffer && (!oldBuffer || !newBuffer.equals(oldBuffer))) {
|
|
210
|
-
this.bufferAndSlotMap.set(accountId, {
|
|
211
|
-
buffer: newBuffer,
|
|
212
|
-
slot: newSlot,
|
|
213
|
-
});
|
|
214
|
-
const account = this.decodeBuffer(this.accountDiscriminator, newBuffer);
|
|
215
|
-
this.onChange(keyedAccountInfo.accountId, account, context, newBuffer);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Tears down the `onProgramAccountChange` listener and cancels any pending resub timeout.
|
|
221
|
-
* @param onResub Internal flag set to `true` when called as part of an automatic resubscribe cycle, which preserves `resubOpts.resubTimeoutMs` instead of clearing it. Callers should omit this.
|
|
222
|
-
*/
|
|
223
|
-
unsubscribe(onResub = false): Promise<void> {
|
|
224
|
-
if (!onResub && this.resubOpts) {
|
|
225
|
-
this.resubOpts.resubTimeoutMs = undefined;
|
|
226
|
-
}
|
|
227
|
-
this.isUnsubscribing = true;
|
|
228
|
-
clearTimeout(this.timeoutId);
|
|
229
|
-
this.timeoutId = undefined;
|
|
230
|
-
|
|
231
|
-
if (this.listenerId != null) {
|
|
232
|
-
const promise = this.program.provider.connection
|
|
233
|
-
.removeAccountChangeListener(this.listenerId)
|
|
234
|
-
.then(() => {
|
|
235
|
-
this.listenerId = undefined;
|
|
236
|
-
this.isUnsubscribing = false;
|
|
237
|
-
});
|
|
238
|
-
return promise;
|
|
239
|
-
} else {
|
|
240
|
-
this.isUnsubscribing = false;
|
|
241
|
-
return Promise.resolve();
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|