@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,105 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
BlockhashWithExpiryBlockHeight,
|
|
3
|
-
Commitment,
|
|
4
|
-
Connection,
|
|
5
|
-
} from '@solana/web3.js';
|
|
6
|
-
import { BlockhashFetcher } from './types';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Fetches the latest blockhash and caches it for a configurable amount of time.
|
|
10
|
-
*
|
|
11
|
-
* - Prevents RPC spam by reusing cached values
|
|
12
|
-
* - Retries on failure with exponential backoff
|
|
13
|
-
* - Prevents concurrent requests for the same blockhash
|
|
14
|
-
*/
|
|
15
|
-
export class CachedBlockhashFetcher implements BlockhashFetcher {
|
|
16
|
-
private recentBlockhashCache: {
|
|
17
|
-
value: BlockhashWithExpiryBlockHeight | undefined;
|
|
18
|
-
lastUpdated: number;
|
|
19
|
-
} = { value: undefined, lastUpdated: 0 };
|
|
20
|
-
|
|
21
|
-
private blockhashFetchingPromise: Promise<void> | null = null;
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* @param connection - RPC connection to fetch the blockhash from.
|
|
25
|
-
* @param blockhashCommitment - Commitment level to request the blockhash at.
|
|
26
|
-
* @param retryCount - Maximum fetch attempts before giving up and throwing.
|
|
27
|
-
* @param retrySleepTimeMs - Base backoff delay (ms) between retries; doubles each attempt (`retrySleepTimeMs * 2^i`).
|
|
28
|
-
* @param staleCacheTimeMs - How long (ms) a cached blockhash is served before a refresh is triggered.
|
|
29
|
-
*/
|
|
30
|
-
constructor(
|
|
31
|
-
private connection: Connection,
|
|
32
|
-
private blockhashCommitment: Commitment,
|
|
33
|
-
private retryCount: number,
|
|
34
|
-
private retrySleepTimeMs: number,
|
|
35
|
-
private staleCacheTimeMs: number
|
|
36
|
-
) {}
|
|
37
|
-
|
|
38
|
-
private async fetchBlockhashWithRetry(): Promise<BlockhashWithExpiryBlockHeight> {
|
|
39
|
-
for (let i = 0; i < this.retryCount; i++) {
|
|
40
|
-
try {
|
|
41
|
-
return await this.connection.getLatestBlockhash(
|
|
42
|
-
this.blockhashCommitment
|
|
43
|
-
);
|
|
44
|
-
} catch (err) {
|
|
45
|
-
if (i === this.retryCount - 1) {
|
|
46
|
-
throw new Error('Failed to fetch blockhash after maximum retries');
|
|
47
|
-
}
|
|
48
|
-
await this.sleep(this.retrySleepTimeMs * 2 ** i);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
throw new Error('Failed to fetch blockhash after maximum retries');
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
private sleep(ms: number): Promise<void> {
|
|
55
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
private async updateBlockhashCache(): Promise<void> {
|
|
59
|
-
const result = await this.fetchBlockhashWithRetry();
|
|
60
|
-
this.recentBlockhashCache = {
|
|
61
|
-
value: result,
|
|
62
|
-
lastUpdated: Date.now(),
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Returns the cached blockhash, refreshing it first if the cache is older than
|
|
68
|
-
* `staleCacheTimeMs`. Concurrent calls during a refresh all await the same in-flight fetch
|
|
69
|
-
* rather than issuing duplicate RPC requests.
|
|
70
|
-
* @returns The latest (possibly cached) blockhash and its expiry block height.
|
|
71
|
-
* @throws If no cached value exists yet and the initial fetch fails after exhausting
|
|
72
|
-
* `retryCount` retries.
|
|
73
|
-
*/
|
|
74
|
-
public async getLatestBlockhash(): Promise<
|
|
75
|
-
BlockhashWithExpiryBlockHeight | undefined
|
|
76
|
-
> {
|
|
77
|
-
if (this.isCacheStale()) {
|
|
78
|
-
await this.refreshBlockhash();
|
|
79
|
-
}
|
|
80
|
-
return this.recentBlockhashCache.value;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
private isCacheStale(): boolean {
|
|
84
|
-
const lastUpdateTime = this.recentBlockhashCache.lastUpdated;
|
|
85
|
-
return (
|
|
86
|
-
!lastUpdateTime || Date.now() > lastUpdateTime + this.staleCacheTimeMs
|
|
87
|
-
);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Refresh the blockhash cache, await a pending refresh if it exists
|
|
92
|
-
*/
|
|
93
|
-
private async refreshBlockhash(): Promise<void> {
|
|
94
|
-
if (!this.blockhashFetchingPromise) {
|
|
95
|
-
this.blockhashFetchingPromise = this.updateBlockhashCache();
|
|
96
|
-
try {
|
|
97
|
-
await this.blockhashFetchingPromise;
|
|
98
|
-
} finally {
|
|
99
|
-
this.blockhashFetchingPromise = null;
|
|
100
|
-
}
|
|
101
|
-
} else {
|
|
102
|
-
await this.blockhashFetchingPromise;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { BlockhashWithExpiryBlockHeight } from '@solana/web3.js';
|
|
2
|
-
|
|
3
|
-
/** Strategy interface for obtaining a recent blockhash, abstracting whether it's fetched fresh every call or cached (see `BaseBlockhashFetcher`/`CachedBlockhashFetcher`). */
|
|
4
|
-
export interface BlockhashFetcher {
|
|
5
|
-
/**
|
|
6
|
-
* @returns The latest blockhash and its expiry block height, or `undefined` if unavailable.
|
|
7
|
-
*/
|
|
8
|
-
getLatestBlockhash(): Promise<BlockhashWithExpiryBlockHeight | undefined>;
|
|
9
|
-
}
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import { ConfirmationStrategy, TxSigAndSlot } from './types';
|
|
2
|
-
import {
|
|
3
|
-
ConfirmOptions,
|
|
4
|
-
TransactionSignature,
|
|
5
|
-
Connection,
|
|
6
|
-
Commitment,
|
|
7
|
-
BlockhashWithExpiryBlockHeight,
|
|
8
|
-
} from '@solana/web3.js';
|
|
9
|
-
import { BaseTxSender } from './baseTxSender';
|
|
10
|
-
import { TxHandler } from './txHandler';
|
|
11
|
-
import { IWallet } from '../types';
|
|
12
|
-
import { DEFAULT_CONFIRMATION_OPTS } from '../config';
|
|
13
|
-
|
|
14
|
-
const DEFAULT_TIMEOUT = 35000;
|
|
15
|
-
const DEFAULT_BLOCKHASH_REFRESH = 10000;
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* `TxSender` optimized for low latency: sends a transaction exactly once (no resend/retry loop —
|
|
19
|
-
* relies on the RPC node's own forwarding), and can skip confirmation entirely or confirm
|
|
20
|
-
* asynchronously in the background so `sendRawTransaction` returns as soon as the send lands.
|
|
21
|
-
* Maintains its own periodically-refreshed blockhash cache (independent of `TxHandler`'s) purely
|
|
22
|
-
* for that background-refresh convenience; it is not actually consumed by `sendRawTransaction`
|
|
23
|
-
* here. Suited to latency-sensitive keeper bots that would rather fire-and-forget than pay for
|
|
24
|
-
* `RetryTxSender`'s resend loop.
|
|
25
|
-
*/
|
|
26
|
-
export class FastSingleTxSender extends BaseTxSender {
|
|
27
|
-
connection: Connection;
|
|
28
|
-
wallet: IWallet;
|
|
29
|
-
opts: ConfirmOptions;
|
|
30
|
-
timeout: number;
|
|
31
|
-
/** How often (ms) `startBlockhashRefreshLoop` refreshes `recentBlockhash`; `0` disables the refresh loop. */
|
|
32
|
-
blockhashRefreshInterval: number;
|
|
33
|
-
additionalConnections: Connection[];
|
|
34
|
-
timoutCount = 0;
|
|
35
|
-
/** Periodically refreshed blockhash cache (see `startBlockhashRefreshLoop`); informational only — `sendRawTransaction` does not currently read this field. */
|
|
36
|
-
recentBlockhash?: BlockhashWithExpiryBlockHeight;
|
|
37
|
-
/** If `true`, `sendRawTransaction` returns immediately after sending, without waiting for or checking confirmation. */
|
|
38
|
-
skipConfirmation: boolean;
|
|
39
|
-
/** If `true` (and `skipConfirmation` is `false`), confirmation runs without being awaited — `sendRawTransaction` returns before the transaction is confirmed. */
|
|
40
|
-
confirmInBackground: boolean;
|
|
41
|
-
/** Commitment level used when refreshing `recentBlockhash`. */
|
|
42
|
-
blockhashCommitment: Commitment;
|
|
43
|
-
/** Handle for the interval timer started by `startBlockhashRefreshLoop`. */
|
|
44
|
-
blockhashIntervalId?: NodeJS.Timer;
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* @param props.connection - RPC connection used for sending, confirming, and blockhash refresh.
|
|
48
|
-
* @param props.wallet - Wallet used to sign transactions that aren't already `preSigned`.
|
|
49
|
-
* @param props.opts - Default `ConfirmOptions`; defaults to `DEFAULT_CONFIRMATION_OPTS` with `maxRetries: 0` (this sender does not retry sends itself).
|
|
50
|
-
* @param props.timeout - Confirmation timeout in milliseconds; defaults to 35000 (35s).
|
|
51
|
-
* @param props.blockhashRefreshInterval - Interval (ms) for the background blockhash refresh; defaults to 10000 (10s). `0` disables it.
|
|
52
|
-
* @param props.additionalConnections - Extra connections to also broadcast raw transactions to.
|
|
53
|
-
* @param props.skipConfirmation - Skip confirmation entirely after sending; defaults to `false`.
|
|
54
|
-
* @param props.confirmInBackground - Confirm without awaiting, so `sendRawTransaction` resolves right after send; defaults to `false`.
|
|
55
|
-
* @param props.blockhashCommitment - Commitment for the background blockhash refresh; defaults to `'finalized'`.
|
|
56
|
-
* @param props.confirmationStrategy - How to wait for confirmation; defaults to `ConfirmationStrategy.Combo`.
|
|
57
|
-
* @param props.trackTxLandRate - Enables land-rate tracking.
|
|
58
|
-
* @param props.txHandler - Custom `TxHandler` for signing/building transactions.
|
|
59
|
-
* @param props.txLandRateLookbackWindowMinutes - Rolling window, in minutes, for the land-rate calculation.
|
|
60
|
-
* @param props.landRateToFeeFunc - Custom mapping from land rate to priority-fee multiplier.
|
|
61
|
-
* @param props.throwOnTimeoutError - Whether confirmation timeouts throw `TxSendError`; defaults to `true`.
|
|
62
|
-
*/
|
|
63
|
-
public constructor({
|
|
64
|
-
connection,
|
|
65
|
-
wallet,
|
|
66
|
-
opts = { ...DEFAULT_CONFIRMATION_OPTS, maxRetries: 0 },
|
|
67
|
-
timeout = DEFAULT_TIMEOUT,
|
|
68
|
-
blockhashRefreshInterval = DEFAULT_BLOCKHASH_REFRESH,
|
|
69
|
-
additionalConnections = new Array<Connection>(),
|
|
70
|
-
skipConfirmation = false,
|
|
71
|
-
confirmInBackground = false,
|
|
72
|
-
blockhashCommitment = 'finalized',
|
|
73
|
-
confirmationStrategy = ConfirmationStrategy.Combo,
|
|
74
|
-
trackTxLandRate,
|
|
75
|
-
txHandler,
|
|
76
|
-
txLandRateLookbackWindowMinutes,
|
|
77
|
-
landRateToFeeFunc,
|
|
78
|
-
throwOnTimeoutError = true,
|
|
79
|
-
}: {
|
|
80
|
-
connection: Connection;
|
|
81
|
-
wallet: IWallet;
|
|
82
|
-
opts?: ConfirmOptions;
|
|
83
|
-
timeout?: number;
|
|
84
|
-
blockhashRefreshInterval?: number;
|
|
85
|
-
additionalConnections?: Connection[];
|
|
86
|
-
skipConfirmation?: boolean;
|
|
87
|
-
confirmInBackground?: boolean;
|
|
88
|
-
blockhashCommitment?: Commitment;
|
|
89
|
-
confirmationStrategy?: ConfirmationStrategy;
|
|
90
|
-
trackTxLandRate?: boolean;
|
|
91
|
-
txHandler?: TxHandler;
|
|
92
|
-
txLandRateLookbackWindowMinutes?: number;
|
|
93
|
-
landRateToFeeFunc?: (landRate: number) => number;
|
|
94
|
-
throwOnTimeoutError?: boolean;
|
|
95
|
-
}) {
|
|
96
|
-
super({
|
|
97
|
-
connection,
|
|
98
|
-
wallet,
|
|
99
|
-
opts,
|
|
100
|
-
timeout,
|
|
101
|
-
additionalConnections,
|
|
102
|
-
confirmationStrategy,
|
|
103
|
-
txHandler,
|
|
104
|
-
trackTxLandRate,
|
|
105
|
-
txLandRateLookbackWindowMinutes,
|
|
106
|
-
landRateToFeeFunc,
|
|
107
|
-
throwOnTimeoutError,
|
|
108
|
-
});
|
|
109
|
-
this.connection = connection;
|
|
110
|
-
this.wallet = wallet;
|
|
111
|
-
this.opts = opts;
|
|
112
|
-
this.timeout = timeout;
|
|
113
|
-
this.blockhashRefreshInterval = blockhashRefreshInterval;
|
|
114
|
-
this.additionalConnections = additionalConnections;
|
|
115
|
-
this.skipConfirmation = skipConfirmation;
|
|
116
|
-
this.confirmInBackground = confirmInBackground;
|
|
117
|
-
this.blockhashCommitment = blockhashCommitment;
|
|
118
|
-
this.startBlockhashRefreshLoop();
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Starts a `setInterval` loop (if `blockhashRefreshInterval > 0`) that refreshes
|
|
123
|
-
* `this.recentBlockhash` every `blockhashRefreshInterval` ms. Fetch errors are logged and
|
|
124
|
-
* otherwise ignored (the loop keeps running with the stale cached value).
|
|
125
|
-
*/
|
|
126
|
-
startBlockhashRefreshLoop(): void {
|
|
127
|
-
if (this.blockhashRefreshInterval > 0) {
|
|
128
|
-
this.blockhashIntervalId = setInterval(async () => {
|
|
129
|
-
try {
|
|
130
|
-
this.recentBlockhash = await this.connection.getLatestBlockhash(
|
|
131
|
-
this.blockhashCommitment
|
|
132
|
-
);
|
|
133
|
-
} catch (e) {
|
|
134
|
-
console.error('Error in startBlockhashRefreshLoop: ', e);
|
|
135
|
-
}
|
|
136
|
-
}, this.blockhashRefreshInterval);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Sends a raw transaction exactly once via `connection.sendRawTransaction` (plus a best-effort
|
|
142
|
-
* broadcast to `additionalConnections`), then confirms it unless `skipConfirmation` is set —
|
|
143
|
-
* awaited normally, or fired without awaiting if `confirmInBackground` is set (in which case
|
|
144
|
-
* the returned `slot` will be `undefined`, since it isn't known yet at return time).
|
|
145
|
-
* @param rawTransaction - Serialized, signed transaction bytes.
|
|
146
|
-
* @param opts - Options passed to `sendRawTransaction`/`confirmTransaction`; `opts.commitment` selects confirmation level.
|
|
147
|
-
* @returns The signature, and the confirmation slot if confirmation completed synchronously (`undefined` if `skipConfirmation` or `confirmInBackground` is set).
|
|
148
|
-
* @throws Whatever `connection.sendRawTransaction` or (if awaited) `confirmTransaction`/`checkConfirmationResultForError` throw.
|
|
149
|
-
*/
|
|
150
|
-
async sendRawTransaction(
|
|
151
|
-
rawTransaction: Buffer | Uint8Array,
|
|
152
|
-
opts: ConfirmOptions
|
|
153
|
-
): Promise<TxSigAndSlot> {
|
|
154
|
-
let txid: TransactionSignature;
|
|
155
|
-
try {
|
|
156
|
-
txid = await this.connection.sendRawTransaction(rawTransaction, opts);
|
|
157
|
-
this.txSigCache?.set(txid, false);
|
|
158
|
-
this.sendToAdditionalConnections(rawTransaction, opts);
|
|
159
|
-
} catch (e) {
|
|
160
|
-
console.error(e);
|
|
161
|
-
throw e;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
let slot: number | undefined;
|
|
165
|
-
if (!this.skipConfirmation) {
|
|
166
|
-
try {
|
|
167
|
-
if (this.confirmInBackground) {
|
|
168
|
-
this.confirmTransaction(txid, opts.commitment)
|
|
169
|
-
.then(async (result) => {
|
|
170
|
-
this.txSigCache?.set(txid, true);
|
|
171
|
-
if (result) {
|
|
172
|
-
await this.checkConfirmationResultForError(txid, result.value);
|
|
173
|
-
slot = result.context.slot;
|
|
174
|
-
}
|
|
175
|
-
})
|
|
176
|
-
.catch((err) => {
|
|
177
|
-
// background confirmation is fire-and-forget; surface failures
|
|
178
|
-
// in logs instead of as unhandled promise rejections
|
|
179
|
-
console.error(
|
|
180
|
-
`Error confirming transaction ${txid} in background:`,
|
|
181
|
-
err
|
|
182
|
-
);
|
|
183
|
-
});
|
|
184
|
-
} else {
|
|
185
|
-
const result = await this.confirmTransaction(txid, opts.commitment);
|
|
186
|
-
this.txSigCache?.set(txid, true);
|
|
187
|
-
if (result) {
|
|
188
|
-
await this.checkConfirmationResultForError(txid, result.value);
|
|
189
|
-
slot = result.context.slot;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
} catch (e) {
|
|
193
|
-
console.error(e);
|
|
194
|
-
throw e;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
return { txSig: txid, slot };
|
|
199
|
-
}
|
|
200
|
-
}
|
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ConfirmOptions,
|
|
3
|
-
Connection,
|
|
4
|
-
VersionedTransaction,
|
|
5
|
-
} from '@solana/web3.js';
|
|
6
|
-
import bs58 from 'bs58';
|
|
7
|
-
import { BaseTxSender } from './baseTxSender';
|
|
8
|
-
import { ConfirmationStrategy, TxSigAndSlot } from './types';
|
|
9
|
-
import { TxHandler } from './txHandler';
|
|
10
|
-
import { IWallet } from '../types';
|
|
11
|
-
import { DEFAULT_CONFIRMATION_OPTS } from '../config';
|
|
12
|
-
|
|
13
|
-
const DEFAULT_TIMEOUT = 35000;
|
|
14
|
-
const DEFAULT_RETRY = 5000;
|
|
15
|
-
|
|
16
|
-
type ResolveReference = {
|
|
17
|
-
resolve?: () => void;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* `TxSender` that never calls `connection.sendRawTransaction` itself — instead it hands the raw
|
|
22
|
-
* transaction to `additionalTxSenderCallbacks` (e.g. a Jito/third-party bundle submitter) and
|
|
23
|
-
* re-invokes those callbacks on a `retrySleep` interval until the transaction confirms or
|
|
24
|
-
* `timeout` elapses. `connection` is used only to *confirm* the transaction (via
|
|
25
|
-
* `BaseTxSender.confirmTransaction`), never to broadcast it. `additionalConnections` is always
|
|
26
|
-
* empty for this sender (the constructor doesn't accept it) since forwarding goes exclusively
|
|
27
|
-
* through the callbacks.
|
|
28
|
-
*
|
|
29
|
-
* Use this when transaction submission is delegated to an external forwarder/relay rather than
|
|
30
|
-
* this RPC connection, but you still want this SDK's confirmation/retry/land-rate machinery.
|
|
31
|
-
*/
|
|
32
|
-
export class ForwardOnlyTxSender extends BaseTxSender {
|
|
33
|
-
connection: Connection;
|
|
34
|
-
wallet: IWallet;
|
|
35
|
-
opts: ConfirmOptions;
|
|
36
|
-
timeout: number;
|
|
37
|
-
retrySleep: number;
|
|
38
|
-
additionalConnections: Connection[];
|
|
39
|
-
timoutCount = 0;
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* @param props.connection - RPC connection used only for confirmation, never for sending.
|
|
43
|
-
* @param props.wallet - Wallet used to sign transactions that aren't already `preSigned`.
|
|
44
|
-
* @param props.opts - Default `ConfirmOptions`; defaults to `DEFAULT_CONFIRMATION_OPTS` with `maxRetries: 0` (retries are handled by this sender's own re-forward loop, not the RPC node).
|
|
45
|
-
* @param props.timeout - Total time (ms) to keep re-forwarding and waiting for confirmation before giving up; defaults to 35000 (35s).
|
|
46
|
-
* @param props.retrySleep - Interval (ms) between re-invocations of `additionalTxSenderCallbacks`; defaults to 5000 (5s).
|
|
47
|
-
* @param props.confirmationStrategy - How to wait for confirmation; defaults to `ConfirmationStrategy.Combo`.
|
|
48
|
-
* @param props.additionalTxSenderCallbacks - Callbacks that actually submit the transaction (e.g. to a relay/bundler); required for this sender to do anything, since it never calls `sendRawTransaction` on `connection` itself. Defaults to an empty array (transaction is never actually broadcast anywhere).
|
|
49
|
-
* @param props.txHandler - Custom `TxHandler` for signing/building transactions.
|
|
50
|
-
* @param props.trackTxLandRate - Enables land-rate tracking.
|
|
51
|
-
* @param props.txLandRateLookbackWindowMinutes - Rolling window, in minutes, for the land-rate calculation.
|
|
52
|
-
* @param props.landRateToFeeFunc - Custom mapping from land rate to priority-fee multiplier.
|
|
53
|
-
* @param props.throwOnTimeoutError - Whether confirmation timeouts throw `TxSendError`; defaults to `true`.
|
|
54
|
-
*/
|
|
55
|
-
public constructor({
|
|
56
|
-
connection,
|
|
57
|
-
wallet,
|
|
58
|
-
opts = { ...DEFAULT_CONFIRMATION_OPTS, maxRetries: 0 },
|
|
59
|
-
timeout = DEFAULT_TIMEOUT,
|
|
60
|
-
retrySleep = DEFAULT_RETRY,
|
|
61
|
-
confirmationStrategy = ConfirmationStrategy.Combo,
|
|
62
|
-
additionalTxSenderCallbacks = [],
|
|
63
|
-
txHandler,
|
|
64
|
-
trackTxLandRate,
|
|
65
|
-
txLandRateLookbackWindowMinutes,
|
|
66
|
-
landRateToFeeFunc,
|
|
67
|
-
throwOnTimeoutError = true,
|
|
68
|
-
}: {
|
|
69
|
-
connection: Connection;
|
|
70
|
-
wallet: IWallet;
|
|
71
|
-
opts?: ConfirmOptions;
|
|
72
|
-
timeout?: number;
|
|
73
|
-
retrySleep?: number;
|
|
74
|
-
confirmationStrategy?: ConfirmationStrategy;
|
|
75
|
-
additionalTxSenderCallbacks?: ((base58EncodedTx: string) => void)[];
|
|
76
|
-
txHandler?: TxHandler;
|
|
77
|
-
trackTxLandRate?: boolean;
|
|
78
|
-
txLandRateLookbackWindowMinutes?: number;
|
|
79
|
-
landRateToFeeFunc?: (landRate: number) => number;
|
|
80
|
-
throwOnTimeoutError?: boolean;
|
|
81
|
-
}) {
|
|
82
|
-
super({
|
|
83
|
-
connection,
|
|
84
|
-
wallet,
|
|
85
|
-
opts,
|
|
86
|
-
timeout,
|
|
87
|
-
additionalConnections: [],
|
|
88
|
-
confirmationStrategy,
|
|
89
|
-
additionalTxSenderCallbacks,
|
|
90
|
-
txHandler,
|
|
91
|
-
trackTxLandRate,
|
|
92
|
-
txLandRateLookbackWindowMinutes,
|
|
93
|
-
landRateToFeeFunc,
|
|
94
|
-
throwOnTimeoutError,
|
|
95
|
-
});
|
|
96
|
-
this.connection = connection;
|
|
97
|
-
this.wallet = wallet;
|
|
98
|
-
this.opts = opts;
|
|
99
|
-
this.timeout = timeout;
|
|
100
|
-
this.retrySleep = retrySleep;
|
|
101
|
-
this.additionalConnections = [];
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Waits `retrySleep` milliseconds, exposing an early-wake `resolve` via `reference` so
|
|
106
|
-
* `sendRawTransaction`'s stop condition can cut the wait short once the transaction confirms.
|
|
107
|
-
* @param reference - Mutable holder `sendRawTransaction` uses to resolve this sleep early.
|
|
108
|
-
*/
|
|
109
|
-
async sleep(reference: ResolveReference): Promise<void> {
|
|
110
|
-
return new Promise((resolve) => {
|
|
111
|
-
reference.resolve = resolve;
|
|
112
|
-
setTimeout(resolve, this.retrySleep);
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Overrides `BaseTxSender.sendToAdditionalConnections` to skip `additionalConnections`
|
|
118
|
-
* entirely (always empty for this sender) and only invoke `additionalTxSenderCallbacks` with
|
|
119
|
-
* the base58-encoded transaction — this is this sender's *only* transaction submission path.
|
|
120
|
-
* @param rawTx - Serialized, signed transaction bytes.
|
|
121
|
-
* @param _opts - Unused (kept for `BaseTxSender` override compatibility).
|
|
122
|
-
*/
|
|
123
|
-
sendToAdditionalConnections(
|
|
124
|
-
rawTx: Buffer | Uint8Array,
|
|
125
|
-
_opts: ConfirmOptions
|
|
126
|
-
): void {
|
|
127
|
-
this.additionalTxSenderCallbacks?.map((callback) => {
|
|
128
|
-
callback(bs58.encode(rawTx));
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* "Sends" a raw transaction by repeatedly invoking `additionalTxSenderCallbacks` with it every
|
|
134
|
-
* `retrySleep` ms (never calling `connection.sendRawTransaction`) while concurrently waiting
|
|
135
|
-
* for confirmation via `confirmTransaction`. Re-forwarding stops as soon as confirmation
|
|
136
|
-
* resolves (successfully or by throwing) or `timeout` elapses.
|
|
137
|
-
* @param rawTransaction - Serialized, signed transaction bytes (must deserialize as a `VersionedTransaction`).
|
|
138
|
-
* @param opts - Confirmation options; `opts.commitment` is used for confirmation.
|
|
139
|
-
* @returns The signature and confirmation slot once confirmed.
|
|
140
|
-
* @throws Whatever `confirmTransaction` throws (e.g. `TxSendError` on timeout, or the resolved on-chain error).
|
|
141
|
-
*/
|
|
142
|
-
async sendRawTransaction(
|
|
143
|
-
rawTransaction: Buffer | Uint8Array,
|
|
144
|
-
opts: ConfirmOptions
|
|
145
|
-
): Promise<TxSigAndSlot> {
|
|
146
|
-
const deserializedTx = VersionedTransaction.deserialize(rawTransaction);
|
|
147
|
-
|
|
148
|
-
const txSig = deserializedTx.signatures[0];
|
|
149
|
-
const encodedTxSig = bs58.encode(txSig);
|
|
150
|
-
|
|
151
|
-
const startTime = this.getTimestamp();
|
|
152
|
-
|
|
153
|
-
this.sendToAdditionalConnections(rawTransaction, opts);
|
|
154
|
-
this.txSigCache?.set(encodedTxSig, false);
|
|
155
|
-
|
|
156
|
-
let done = false;
|
|
157
|
-
const resolveReference: ResolveReference = {
|
|
158
|
-
resolve: undefined,
|
|
159
|
-
};
|
|
160
|
-
const stopWaiting = () => {
|
|
161
|
-
done = true;
|
|
162
|
-
if (resolveReference.resolve) {
|
|
163
|
-
resolveReference.resolve();
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
(async () => {
|
|
168
|
-
while (!done && this.getTimestamp() - startTime < this.timeout) {
|
|
169
|
-
await this.sleep(resolveReference);
|
|
170
|
-
if (!done) {
|
|
171
|
-
this.sendToAdditionalConnections(rawTransaction, opts);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
})();
|
|
175
|
-
|
|
176
|
-
let slot: number | undefined;
|
|
177
|
-
try {
|
|
178
|
-
const result = await this.confirmTransaction(
|
|
179
|
-
encodedTxSig,
|
|
180
|
-
opts.commitment
|
|
181
|
-
);
|
|
182
|
-
slot = result?.context?.slot;
|
|
183
|
-
this.txSigCache?.set(encodedTxSig, true);
|
|
184
|
-
// eslint-disable-next-line no-useless-catch
|
|
185
|
-
} catch (e) {
|
|
186
|
-
throw e;
|
|
187
|
-
} finally {
|
|
188
|
-
stopWaiting();
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
return { txSig: encodedTxSig, slot };
|
|
192
|
-
}
|
|
193
|
-
}
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { ComputeBudgetProgram, TransactionInstruction } from '@solana/web3.js';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* This class determines whether a priority fee needs to be included in a transaction based on
|
|
5
|
-
* a recent history of timed out transactions.
|
|
6
|
-
*/
|
|
7
|
-
export class PriorityFeeCalculator {
|
|
8
|
-
lastTxTimeoutCount: number;
|
|
9
|
-
priorityFeeTriggered: boolean;
|
|
10
|
-
lastTxTimeoutCountTriggered: number;
|
|
11
|
-
priorityFeeLatchDurationMs: number; // how long to stay in triggered state before resetting
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Constructor for the PriorityFeeCalculator class.
|
|
15
|
-
* @param currentTimeMs - The current time in milliseconds.
|
|
16
|
-
* @param priorityFeeLatchDurationMs - The duration for how long to stay in triggered state before resetting. Default value is 10 seconds.
|
|
17
|
-
*/
|
|
18
|
-
constructor(
|
|
19
|
-
currentTimeMs: number,
|
|
20
|
-
priorityFeeLatchDurationMs: number = 10 * 1000
|
|
21
|
-
) {
|
|
22
|
-
this.lastTxTimeoutCount = 0;
|
|
23
|
-
this.priorityFeeTriggered = false;
|
|
24
|
-
this.lastTxTimeoutCountTriggered = currentTimeMs;
|
|
25
|
-
this.priorityFeeLatchDurationMs = priorityFeeLatchDurationMs;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Update the priority fee state based on the current time and the current timeout count.
|
|
30
|
-
* @param currentTimeMs current time in milliseconds
|
|
31
|
-
* @returns true if priority fee should be included in the next transaction
|
|
32
|
-
*/
|
|
33
|
-
public updatePriorityFee(
|
|
34
|
-
currentTimeMs: number,
|
|
35
|
-
txTimeoutCount: number
|
|
36
|
-
): boolean {
|
|
37
|
-
let triggerPriorityFee = false;
|
|
38
|
-
|
|
39
|
-
if (txTimeoutCount > this.lastTxTimeoutCount) {
|
|
40
|
-
this.lastTxTimeoutCount = txTimeoutCount;
|
|
41
|
-
this.lastTxTimeoutCountTriggered = currentTimeMs;
|
|
42
|
-
triggerPriorityFee = true;
|
|
43
|
-
} else {
|
|
44
|
-
if (!this.priorityFeeTriggered) {
|
|
45
|
-
triggerPriorityFee = false;
|
|
46
|
-
} else if (
|
|
47
|
-
currentTimeMs - this.lastTxTimeoutCountTriggered <
|
|
48
|
-
this.priorityFeeLatchDurationMs
|
|
49
|
-
) {
|
|
50
|
-
triggerPriorityFee = true;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
this.priorityFeeTriggered = triggerPriorityFee;
|
|
55
|
-
|
|
56
|
-
return triggerPriorityFee;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* This method returns a transaction instruction list that sets the compute limit on the ComputeBudget program.
|
|
61
|
-
* @param computeUnitLimit - The maximum number of compute units that can be used by the transaction.
|
|
62
|
-
* @returns An array of transaction instructions.
|
|
63
|
-
*/
|
|
64
|
-
public generateComputeBudgetIxs(
|
|
65
|
-
computeUnitLimit: number
|
|
66
|
-
): Array<TransactionInstruction> {
|
|
67
|
-
const ixs = [
|
|
68
|
-
ComputeBudgetProgram.setComputeUnitLimit({
|
|
69
|
-
units: computeUnitLimit,
|
|
70
|
-
}),
|
|
71
|
-
];
|
|
72
|
-
|
|
73
|
-
return ixs;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Calculates the compute unit price to use based on the desired additional fee to pay and the compute unit limit.
|
|
78
|
-
* @param computeUnitLimit desired CU to use
|
|
79
|
-
* @param additionalFeeMicroLamports desired additional fee to pay, in micro lamports
|
|
80
|
-
* @returns the compute unit price to use, in micro lamports
|
|
81
|
-
*/
|
|
82
|
-
public calculateComputeUnitPrice(
|
|
83
|
-
computeUnitLimit: number,
|
|
84
|
-
additionalFeeMicroLamports: number
|
|
85
|
-
): number {
|
|
86
|
-
return additionalFeeMicroLamports / computeUnitLimit;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* This method generates a list of transaction instructions for the ComputeBudget program, and includes a priority fee if it's required
|
|
91
|
-
* @param computeUnitLimit - The maximum number of compute units that can be used by the transaction.
|
|
92
|
-
* @param usePriorityFee - A boolean indicating whether to include a priority fee in the transaction, this should be from `this.updatePriorityFee()` or `this.priorityFeeTriggered`.
|
|
93
|
-
* @param additionalFeeMicroLamports - The additional fee to be paid, in micro lamports, the actual price will be calculated.
|
|
94
|
-
* @returns An array of transaction instructions.
|
|
95
|
-
*/
|
|
96
|
-
public generateComputeBudgetWithPriorityFeeIx(
|
|
97
|
-
computeUnitLimit: number,
|
|
98
|
-
usePriorityFee: boolean,
|
|
99
|
-
additionalFeeMicroLamports: number
|
|
100
|
-
): Array<TransactionInstruction> {
|
|
101
|
-
const ixs = this.generateComputeBudgetIxs(computeUnitLimit);
|
|
102
|
-
|
|
103
|
-
if (usePriorityFee) {
|
|
104
|
-
const computeUnitPrice = this.calculateComputeUnitPrice(
|
|
105
|
-
computeUnitLimit,
|
|
106
|
-
additionalFeeMicroLamports
|
|
107
|
-
);
|
|
108
|
-
ixs.push(
|
|
109
|
-
ComputeBudgetProgram.setComputeUnitPrice({
|
|
110
|
-
microLamports: computeUnitPrice,
|
|
111
|
-
})
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
return ixs;
|
|
116
|
-
}
|
|
117
|
-
}
|