@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,304 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DataAndSlot,
|
|
3
|
-
BufferAndSlot,
|
|
4
|
-
AccountSubscriber,
|
|
5
|
-
ResubOpts,
|
|
6
|
-
} from './types';
|
|
7
|
-
import { AnchorProvider } from '../isomorphic/anchor';
|
|
8
|
-
import { AccountInfo, Commitment, Context, PublicKey } from '@solana/web3.js';
|
|
9
|
-
import { VelocityProgram } from '../config';
|
|
10
|
-
import * as Buffer from 'buffer';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Default `AccountSubscriber` implementation: tracks a single account via
|
|
14
|
-
* `connection.onAccountChange`, decoding each notification with either a supplied
|
|
15
|
-
* `decodeBuffer` function or the program's Anchor coder for `accountName`. Updates are applied
|
|
16
|
-
* only when the notification's slot is not older than the last-seen slot and the raw buffer
|
|
17
|
-
* actually changed, so `onChange` never fires twice for the same bytes. If `resubOpts.resubTimeoutMs`
|
|
18
|
-
* is set, a watchdog timer resubscribes to the WebSocket whenever no notification arrives within
|
|
19
|
-
* that window — see `ResubOpts` for tuning. This is the base class extended by
|
|
20
|
-
* `grpcAccountSubscriber` for gRPC Geyser-backed tracking.
|
|
21
|
-
*/
|
|
22
|
-
export class WebSocketAccountSubscriber<T> implements AccountSubscriber<T> {
|
|
23
|
-
dataAndSlot?: DataAndSlot<T>;
|
|
24
|
-
bufferAndSlot?: BufferAndSlot;
|
|
25
|
-
accountName: string;
|
|
26
|
-
logAccountName: string;
|
|
27
|
-
program: VelocityProgram;
|
|
28
|
-
accountPublicKey: PublicKey;
|
|
29
|
-
decodeBufferFn?: (buffer: Buffer) => T;
|
|
30
|
-
private _onChange?: (data: T) => void;
|
|
31
|
-
get onChange(): (data: T) => void {
|
|
32
|
-
if (!this._onChange) {
|
|
33
|
-
throw new Error('onChange callback function must be set');
|
|
34
|
-
}
|
|
35
|
-
return this._onChange;
|
|
36
|
-
}
|
|
37
|
-
set onChange(onChange: (data: T) => void) {
|
|
38
|
-
this._onChange = onChange;
|
|
39
|
-
}
|
|
40
|
-
listenerId?: number;
|
|
41
|
-
|
|
42
|
-
resubOpts?: ResubOpts;
|
|
43
|
-
|
|
44
|
-
commitment?: Commitment;
|
|
45
|
-
isUnsubscribing = false;
|
|
46
|
-
|
|
47
|
-
timeoutId?: ReturnType<typeof setTimeout>;
|
|
48
|
-
|
|
49
|
-
receivingData: boolean;
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* @param accountName Anchor account type name (used for logging and, absent `decodeBuffer`, for decoding via the program coder).
|
|
53
|
-
* @param program Anchor program providing the connection and coder.
|
|
54
|
-
* @param accountPublicKey Address of the account to track.
|
|
55
|
-
* @param decodeBuffer Optional custom decode function; defaults to `program.coder.accounts.decode(accountName, buffer)`.
|
|
56
|
-
* @param resubOpts Resubscription watchdog options; omit to disable the inactivity timer.
|
|
57
|
-
* @param commitment Commitment for both the initial fetch and the `onAccountChange` subscription; defaults to the provider's configured commitment.
|
|
58
|
-
*/
|
|
59
|
-
public constructor(
|
|
60
|
-
accountName: string,
|
|
61
|
-
program: VelocityProgram,
|
|
62
|
-
accountPublicKey: PublicKey,
|
|
63
|
-
decodeBuffer?: (buffer: Buffer) => T,
|
|
64
|
-
resubOpts?: ResubOpts,
|
|
65
|
-
commitment?: Commitment
|
|
66
|
-
) {
|
|
67
|
-
this.accountName = accountName;
|
|
68
|
-
this.logAccountName = `${accountName}-${accountPublicKey.toBase58()}`;
|
|
69
|
-
this.program = program;
|
|
70
|
-
this.accountPublicKey = accountPublicKey;
|
|
71
|
-
this.decodeBufferFn = decodeBuffer;
|
|
72
|
-
this.resubOpts = resubOpts;
|
|
73
|
-
if (
|
|
74
|
-
this.resubOpts?.resubTimeoutMs != null &&
|
|
75
|
-
this.resubOpts.resubTimeoutMs < 1000
|
|
76
|
-
) {
|
|
77
|
-
console.log(
|
|
78
|
-
`resubTimeoutMs should be at least 1000ms to avoid spamming resub ${this.logAccountName}`
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
this.receivingData = false;
|
|
82
|
-
this.commitment =
|
|
83
|
-
commitment ?? (this.program.provider as AnchorProvider).opts.commitment;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Seeds `dataAndSlot` with an initial `fetch()` (if not already set via `setData`) and then
|
|
88
|
-
* attaches the `onAccountChange` WebSocket listener. Returning early (no-op) if already
|
|
89
|
-
* subscribed or mid-unsubscribe.
|
|
90
|
-
* @param onChange Invoked with the newly decoded account data on each accepted update.
|
|
91
|
-
*/
|
|
92
|
-
async subscribe(onChange: (data: T) => void): Promise<void> {
|
|
93
|
-
if (this.listenerId != null || this.isUnsubscribing) {
|
|
94
|
-
if (this.resubOpts?.logResubMessages) {
|
|
95
|
-
console.log(
|
|
96
|
-
`[${this.logAccountName}] Subscribe returning early - listenerId=${this.listenerId}, isUnsubscribing=${this.isUnsubscribing}`
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
this.onChange = onChange;
|
|
103
|
-
if (!this.dataAndSlot) {
|
|
104
|
-
await this.fetch();
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
this.listenerId = this.program.provider.connection.onAccountChange(
|
|
108
|
-
this.accountPublicKey,
|
|
109
|
-
(accountInfo, context) => {
|
|
110
|
-
if (this.resubOpts?.resubTimeoutMs) {
|
|
111
|
-
this.receivingData = true;
|
|
112
|
-
clearTimeout(this.timeoutId);
|
|
113
|
-
this.handleRpcResponse(context, accountInfo);
|
|
114
|
-
this.setTimeout();
|
|
115
|
-
} else {
|
|
116
|
-
this.handleRpcResponse(context, accountInfo);
|
|
117
|
-
}
|
|
118
|
-
},
|
|
119
|
-
this.commitment
|
|
120
|
-
);
|
|
121
|
-
|
|
122
|
-
if (this.resubOpts?.resubTimeoutMs) {
|
|
123
|
-
this.receivingData = true;
|
|
124
|
-
this.setTimeout();
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Seeds or overwrites `dataAndSlot` directly, bypassing RPC. A no-op if the currently cached
|
|
130
|
-
* slot is already newer than `slot`.
|
|
131
|
-
* @param data Decoded account data to store.
|
|
132
|
-
* @param slot Slot the data was observed at; defaults to 0 (the seeded sentinel) if omitted.
|
|
133
|
-
*/
|
|
134
|
-
setData(data: T, slot?: number): void {
|
|
135
|
-
const newSlot = slot || 0;
|
|
136
|
-
if (this.dataAndSlot && this.dataAndSlot.slot > newSlot) {
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
this.dataAndSlot = {
|
|
141
|
-
data,
|
|
142
|
-
slot: newSlot,
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
protected setTimeout(): void {
|
|
147
|
-
if (!this._onChange) {
|
|
148
|
-
throw new Error('onChange callback function must be set');
|
|
149
|
-
}
|
|
150
|
-
this.timeoutId = setTimeout(
|
|
151
|
-
async () => {
|
|
152
|
-
if (this.isUnsubscribing) {
|
|
153
|
-
// If we are in the process of unsubscribing, do not attempt to resubscribe
|
|
154
|
-
if (this.resubOpts?.logResubMessages) {
|
|
155
|
-
console.log(
|
|
156
|
-
`[${this.logAccountName}] Timeout fired but isUnsubscribing=true, skipping resubscribe`
|
|
157
|
-
);
|
|
158
|
-
}
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if (this.receivingData) {
|
|
163
|
-
if (this.resubOpts?.logResubMessages) {
|
|
164
|
-
console.log(
|
|
165
|
-
`No ws data from ${this.logAccountName} in ${this.resubOpts.resubTimeoutMs}ms, resubscribing - listenerId=${this.listenerId}, isUnsubscribing=${this.isUnsubscribing}`
|
|
166
|
-
);
|
|
167
|
-
}
|
|
168
|
-
await this.unsubscribe(true);
|
|
169
|
-
this.receivingData = false;
|
|
170
|
-
await this.subscribe(this.onChange);
|
|
171
|
-
if (this.resubOpts?.logResubMessages) {
|
|
172
|
-
console.log(
|
|
173
|
-
`[${this.logAccountName}] Resubscribe completed - receivingData=${this.receivingData}, listenerId=${this.listenerId}, isUnsubscribing=${this.isUnsubscribing}`
|
|
174
|
-
);
|
|
175
|
-
}
|
|
176
|
-
} else {
|
|
177
|
-
if (this.resubOpts?.logResubMessages) {
|
|
178
|
-
console.log(
|
|
179
|
-
`[${this.logAccountName}] Timeout fired but receivingData=false, skipping resubscribe`
|
|
180
|
-
);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
},
|
|
184
|
-
this.resubOpts?.resubTimeoutMs
|
|
185
|
-
);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/** Fetches the account once via `getAccountInfoAndContext` and routes the result through `handleRpcResponse`, applying it if newer than the cached slot. */
|
|
189
|
-
async fetch(): Promise<void> {
|
|
190
|
-
const rpcResponse =
|
|
191
|
-
await this.program.provider.connection.getAccountInfoAndContext(
|
|
192
|
-
this.accountPublicKey,
|
|
193
|
-
(this.program.provider as AnchorProvider).opts.commitment
|
|
194
|
-
);
|
|
195
|
-
this.handleRpcResponse(
|
|
196
|
-
rpcResponse.context,
|
|
197
|
-
rpcResponse?.value ?? undefined
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Applies a raw RPC/WS response: decodes and stores it (updating `bufferAndSlot`/`dataAndSlot`
|
|
203
|
-
* and invoking `onChange`) only if the slot is not older than the cached one and the buffer's
|
|
204
|
-
* bytes actually changed (or this is the first observation).
|
|
205
|
-
*/
|
|
206
|
-
handleRpcResponse(context: Context, accountInfo?: AccountInfo<Buffer>): void {
|
|
207
|
-
const newSlot = context.slot;
|
|
208
|
-
let newBuffer: Buffer | undefined = undefined;
|
|
209
|
-
if (accountInfo) {
|
|
210
|
-
newBuffer = accountInfo.data;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
if (!this.bufferAndSlot) {
|
|
214
|
-
this.bufferAndSlot = {
|
|
215
|
-
buffer: newBuffer,
|
|
216
|
-
slot: newSlot,
|
|
217
|
-
};
|
|
218
|
-
if (newBuffer) {
|
|
219
|
-
const account = this.decodeBuffer(newBuffer);
|
|
220
|
-
this.dataAndSlot = {
|
|
221
|
-
data: account,
|
|
222
|
-
slot: newSlot,
|
|
223
|
-
};
|
|
224
|
-
this.onChange(account);
|
|
225
|
-
}
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
if (newSlot < this.bufferAndSlot.slot) {
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
const oldBuffer = this.bufferAndSlot.buffer;
|
|
234
|
-
if (newBuffer && (!oldBuffer || !newBuffer.equals(oldBuffer))) {
|
|
235
|
-
this.bufferAndSlot = {
|
|
236
|
-
buffer: newBuffer,
|
|
237
|
-
slot: newSlot,
|
|
238
|
-
};
|
|
239
|
-
const account = this.decodeBuffer(newBuffer);
|
|
240
|
-
this.dataAndSlot = {
|
|
241
|
-
data: account,
|
|
242
|
-
slot: newSlot,
|
|
243
|
-
};
|
|
244
|
-
this.onChange(account);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
/** Decodes a raw account buffer using the constructor-supplied `decodeBufferFn`, or the program's Anchor coder for `accountName` if none was supplied. */
|
|
249
|
-
decodeBuffer(buffer: Buffer): T {
|
|
250
|
-
if (this.decodeBufferFn) {
|
|
251
|
-
return this.decodeBufferFn(buffer);
|
|
252
|
-
} else {
|
|
253
|
-
return this.program.coder.accounts.decode(this.accountName, buffer);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Tears down the WebSocket listener and cancels any pending resub timeout.
|
|
259
|
-
* @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.
|
|
260
|
-
*/
|
|
261
|
-
unsubscribe(onResub = false): Promise<void> {
|
|
262
|
-
if (!onResub && this.resubOpts) {
|
|
263
|
-
this.resubOpts.resubTimeoutMs = undefined;
|
|
264
|
-
}
|
|
265
|
-
this.isUnsubscribing = true;
|
|
266
|
-
clearTimeout(this.timeoutId);
|
|
267
|
-
this.timeoutId = undefined;
|
|
268
|
-
|
|
269
|
-
if (this.listenerId != null) {
|
|
270
|
-
const promise = Promise.race([
|
|
271
|
-
this.program.provider.connection.removeAccountChangeListener(
|
|
272
|
-
this.listenerId
|
|
273
|
-
),
|
|
274
|
-
new Promise((_, reject) =>
|
|
275
|
-
setTimeout(
|
|
276
|
-
() =>
|
|
277
|
-
reject(
|
|
278
|
-
new Error(
|
|
279
|
-
`Unsubscribe timeout for account ${this.logAccountName}`
|
|
280
|
-
)
|
|
281
|
-
),
|
|
282
|
-
10000
|
|
283
|
-
)
|
|
284
|
-
),
|
|
285
|
-
])
|
|
286
|
-
.then(() => {
|
|
287
|
-
this.listenerId = undefined;
|
|
288
|
-
this.isUnsubscribing = false;
|
|
289
|
-
})
|
|
290
|
-
.catch((error) => {
|
|
291
|
-
console.error(
|
|
292
|
-
`[${this.logAccountName}] Unsubscribe failed, forcing cleanup - listenerId=${this.listenerId}, isUnsubscribing=${this.isUnsubscribing}`,
|
|
293
|
-
error
|
|
294
|
-
);
|
|
295
|
-
this.listenerId = undefined;
|
|
296
|
-
this.isUnsubscribing = false;
|
|
297
|
-
});
|
|
298
|
-
return promise;
|
|
299
|
-
} else {
|
|
300
|
-
this.isUnsubscribing = false;
|
|
301
|
-
return Promise.resolve();
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
}
|