@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,377 +0,0 @@
|
|
|
1
|
-
import { ConfirmationStrategy, TxSigAndSlot } from './types';
|
|
2
|
-
import {
|
|
3
|
-
ConfirmOptions,
|
|
4
|
-
Connection,
|
|
5
|
-
SendTransactionError,
|
|
6
|
-
Signer,
|
|
7
|
-
Transaction,
|
|
8
|
-
VersionedTransaction,
|
|
9
|
-
} from '@solana/web3.js';
|
|
10
|
-
import { BaseTxSender } from './baseTxSender';
|
|
11
|
-
import bs58 from 'bs58';
|
|
12
|
-
import { TxHandler } from './txHandler';
|
|
13
|
-
import { IWallet } from '../types';
|
|
14
|
-
import { DEFAULT_CONFIRMATION_OPTS } from '../config';
|
|
15
|
-
|
|
16
|
-
const DEFAULT_RETRY = 2000;
|
|
17
|
-
|
|
18
|
-
type ResolveReference = {
|
|
19
|
-
resolve?: () => void;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* `TxSender` that (like `RetryTxSender`) resends the same signed transaction to `connection`
|
|
24
|
-
* every `retrySleep` ms until confirmation or timeout, additionally recording each in-flight
|
|
25
|
-
* signature's blockhash/`lastValidBlockHeight` in `untilValid` and detecting solana-core's
|
|
26
|
-
* blockhash-height-offset behavior via `useBlockHeightOffset`. Note: as currently implemented,
|
|
27
|
-
* `sendRawTransaction`'s resend/timeout loop uses the same wall-clock `this.timeout` as
|
|
28
|
-
* `RetryTxSender` and does not itself consult `untilValid`/`useBlockHeightOffset` to stop
|
|
29
|
-
* resending once a transaction's blockhash has actually expired — those fields are populated for
|
|
30
|
-
* callers/subclasses that want to inspect per-transaction validity, not consumed internally here.
|
|
31
|
-
* Prefer this sender when you build transactions via this class's `prepareTx`/`sendVersionedTransaction`
|
|
32
|
-
* (which populate `untilValid`) and need that bookkeeping available.
|
|
33
|
-
*/
|
|
34
|
-
export class WhileValidTxSender extends BaseTxSender {
|
|
35
|
-
/** Interval (ms) between resend attempts of the same signed transaction. */
|
|
36
|
-
retrySleep: number;
|
|
37
|
-
timoutCount = 0;
|
|
38
|
-
/** Tracks each currently in-flight transaction signature's blockhash and `lastValidBlockHeight`, populated by `prepareTx`/`sendVersionedTransaction` and cleared once `sendRawTransaction` finishes. */
|
|
39
|
-
untilValid = new Map<
|
|
40
|
-
string,
|
|
41
|
-
{ blockhash: string; lastValidBlockHeight: number }
|
|
42
|
-
>();
|
|
43
|
-
|
|
44
|
-
/** Whether the connected cluster's solana-core version (`< 2`) requires the legacy block-height offset when checking blockhash validity; refreshed asynchronously by `checkAndSetUseBlockHeightOffset`. */
|
|
45
|
-
useBlockHeightOffset = true;
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Queries `connection.getVersion()` and sets `useBlockHeightOffset` based on the cluster's
|
|
49
|
-
* solana-core major version (`true` for `< 2`, `false` for `>= 2`). Fire-and-forget: errors
|
|
50
|
-
* and unparseable versions are silently ignored, leaving `useBlockHeightOffset` at its current value.
|
|
51
|
-
*/
|
|
52
|
-
private async checkAndSetUseBlockHeightOffset() {
|
|
53
|
-
this.connection.getVersion().then((version) => {
|
|
54
|
-
const solanaCoreVersion = version['solana-core'];
|
|
55
|
-
|
|
56
|
-
if (!solanaCoreVersion) return;
|
|
57
|
-
|
|
58
|
-
const majorVersion = solanaCoreVersion.split('.')[0];
|
|
59
|
-
|
|
60
|
-
if (!majorVersion) return;
|
|
61
|
-
|
|
62
|
-
const parsedMajorVersion = parseInt(majorVersion);
|
|
63
|
-
|
|
64
|
-
if (isNaN(parsedMajorVersion)) return;
|
|
65
|
-
|
|
66
|
-
if (parsedMajorVersion >= 2) {
|
|
67
|
-
this.useBlockHeightOffset = false;
|
|
68
|
-
} else {
|
|
69
|
-
this.useBlockHeightOffset = true;
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* @param props.connection - RPC connection used for sending, resending, and confirming.
|
|
76
|
-
* @param props.wallet - Wallet used to sign transactions that aren't already `preSigned`.
|
|
77
|
-
* @param props.opts - Default `ConfirmOptions`; defaults to `DEFAULT_CONFIRMATION_OPTS` with `maxRetries: 0` (retries are handled by this sender's own resend loop, not the RPC node).
|
|
78
|
-
* @param props.retrySleep - Interval (ms) between resend attempts; defaults to 2000 (2s).
|
|
79
|
-
* @param props.additionalConnections - Extra connections to also (re)broadcast raw transactions to.
|
|
80
|
-
* @param props.confirmationStrategy - How to wait for confirmation; defaults to `ConfirmationStrategy.Combo`.
|
|
81
|
-
* @param props.additionalTxSenderCallbacks - Callbacks invoked with each (re)sent transaction's base58 encoding.
|
|
82
|
-
* @param props.txHandler - Custom `TxHandler` for signing/building transactions.
|
|
83
|
-
* @param props.trackTxLandRate - Enables land-rate tracking.
|
|
84
|
-
* @param props.txLandRateLookbackWindowMinutes - Rolling window, in minutes, for the land-rate calculation.
|
|
85
|
-
* @param props.landRateToFeeFunc - Custom mapping from land rate to priority-fee multiplier.
|
|
86
|
-
* @param props.throwOnTimeoutError - Whether confirmation timeouts throw `TxSendError`; defaults to `true`.
|
|
87
|
-
* @param props.throwOnTransactionError - Whether a failed on-chain result throws; defaults to `true`.
|
|
88
|
-
*/
|
|
89
|
-
public constructor({
|
|
90
|
-
connection,
|
|
91
|
-
wallet,
|
|
92
|
-
opts = { ...DEFAULT_CONFIRMATION_OPTS, maxRetries: 0 },
|
|
93
|
-
retrySleep = DEFAULT_RETRY,
|
|
94
|
-
additionalConnections = new Array<Connection>(),
|
|
95
|
-
confirmationStrategy = ConfirmationStrategy.Combo,
|
|
96
|
-
additionalTxSenderCallbacks = [],
|
|
97
|
-
txHandler,
|
|
98
|
-
trackTxLandRate,
|
|
99
|
-
txLandRateLookbackWindowMinutes,
|
|
100
|
-
landRateToFeeFunc,
|
|
101
|
-
throwOnTimeoutError = true,
|
|
102
|
-
throwOnTransactionError = true,
|
|
103
|
-
}: {
|
|
104
|
-
connection: Connection;
|
|
105
|
-
wallet: IWallet;
|
|
106
|
-
opts?: ConfirmOptions;
|
|
107
|
-
retrySleep?: number;
|
|
108
|
-
additionalConnections?: Connection[];
|
|
109
|
-
additionalTxSenderCallbacks?: ((base58EncodedTx: string) => void)[];
|
|
110
|
-
confirmationStrategy?: ConfirmationStrategy;
|
|
111
|
-
txHandler?: TxHandler;
|
|
112
|
-
trackTxLandRate?: boolean;
|
|
113
|
-
txLandRateLookbackWindowMinutes?: number;
|
|
114
|
-
landRateToFeeFunc?: (landRate: number) => number;
|
|
115
|
-
throwOnTimeoutError?: boolean;
|
|
116
|
-
throwOnTransactionError?: boolean;
|
|
117
|
-
}) {
|
|
118
|
-
super({
|
|
119
|
-
connection,
|
|
120
|
-
wallet,
|
|
121
|
-
opts,
|
|
122
|
-
additionalConnections,
|
|
123
|
-
additionalTxSenderCallbacks,
|
|
124
|
-
txHandler,
|
|
125
|
-
trackTxLandRate,
|
|
126
|
-
txLandRateLookbackWindowMinutes,
|
|
127
|
-
confirmationStrategy,
|
|
128
|
-
landRateToFeeFunc,
|
|
129
|
-
throwOnTimeoutError,
|
|
130
|
-
throwOnTransactionError,
|
|
131
|
-
});
|
|
132
|
-
this.retrySleep = retrySleep;
|
|
133
|
-
|
|
134
|
-
this.checkAndSetUseBlockHeightOffset();
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Waits `retrySleep` milliseconds, exposing an early-wake `resolve` via `reference` so the
|
|
139
|
-
* resend loop in `sendRawTransaction` can stop promptly once the transaction confirms or a
|
|
140
|
-
* resend fails.
|
|
141
|
-
* @param reference - Mutable holder `sendRawTransaction` uses to resolve this sleep early.
|
|
142
|
-
*/
|
|
143
|
-
async sleep(reference: ResolveReference): Promise<void> {
|
|
144
|
-
return new Promise((resolve) => {
|
|
145
|
-
reference.resolve = resolve;
|
|
146
|
-
setTimeout(resolve, this.retrySleep);
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Prepares (blockhash + signs, unless `preSigned`) a legacy `Transaction` using a fresh
|
|
152
|
-
* blockhash from `txHandler.getLatestBlockhashForTransaction()` (rather than `BaseTxSender`'s
|
|
153
|
-
* `prepareTx`, which would resolve one via `TxHandler.prepareTx`'s own path), and records the
|
|
154
|
-
* resulting signature's blockhash/expiry in `untilValid`.
|
|
155
|
-
* @param tx - Transaction to prepare.
|
|
156
|
-
* @param additionalSigners - Extra signers to co-sign alongside the wallet.
|
|
157
|
-
* @param opts - Confirmation options passed through to `TxHandler.prepareTx`.
|
|
158
|
-
* @param preSigned - If `true`, skip signing; if the transaction carries a
|
|
159
|
-
* `SIGNATURE_BLOCK_AND_EXPIRY` marker (see `TxHandler`), that blockhash is used for `untilValid`
|
|
160
|
-
* instead of a freshly fetched one.
|
|
161
|
-
* @returns The prepared (and signed, unless `preSigned`) transaction.
|
|
162
|
-
* @throws Error if a blockhash can't be fetched/resolved, or the (pre)signed transaction has no signature.
|
|
163
|
-
*/
|
|
164
|
-
async prepareTx(
|
|
165
|
-
tx: Transaction,
|
|
166
|
-
additionalSigners: Array<Signer>,
|
|
167
|
-
opts: ConfirmOptions,
|
|
168
|
-
preSigned?: boolean
|
|
169
|
-
): Promise<Transaction> {
|
|
170
|
-
let latestBlockhash =
|
|
171
|
-
await this.txHandler.getLatestBlockhashForTransaction();
|
|
172
|
-
|
|
173
|
-
if (!latestBlockhash) {
|
|
174
|
-
throw new Error(
|
|
175
|
-
'WhileValidTxSender: failed to fetch latest blockhash for transaction'
|
|
176
|
-
);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// handle tx
|
|
180
|
-
let signedTx = tx;
|
|
181
|
-
if (!preSigned) {
|
|
182
|
-
signedTx = await this.txHandler.prepareTx(
|
|
183
|
-
tx,
|
|
184
|
-
additionalSigners,
|
|
185
|
-
undefined,
|
|
186
|
-
opts,
|
|
187
|
-
false,
|
|
188
|
-
latestBlockhash
|
|
189
|
-
);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// See SIGNATURE_BLOCK_AND_EXPIRY explanation in txHandler.ts if this is confusing
|
|
193
|
-
// @ts-ignore
|
|
194
|
-
if (preSigned && tx.SIGNATURE_BLOCK_AND_EXPIRY) {
|
|
195
|
-
// @ts-ignore
|
|
196
|
-
latestBlockhash = tx.SIGNATURE_BLOCK_AND_EXPIRY;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// handle subclass-specific side effects
|
|
200
|
-
const signature = signedTx?.signature || signedTx.signatures[0]?.signature;
|
|
201
|
-
if (!signature) {
|
|
202
|
-
throw new Error(
|
|
203
|
-
'WhileValidTxSender: signed transaction is missing a signature'
|
|
204
|
-
);
|
|
205
|
-
}
|
|
206
|
-
const txSig = bs58.encode(signature);
|
|
207
|
-
if (!latestBlockhash) {
|
|
208
|
-
throw new Error(
|
|
209
|
-
'WhileValidTxSender: failed to resolve latest blockhash for transaction'
|
|
210
|
-
);
|
|
211
|
-
}
|
|
212
|
-
this.untilValid.set(txSig, latestBlockhash);
|
|
213
|
-
|
|
214
|
-
return signedTx;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Signs (unless `preSigned`) and sends a `VersionedTransaction`, always overwriting its
|
|
219
|
-
* `recentBlockhash` with a freshly fetched one first (unless `preSigned` with a
|
|
220
|
-
* `SIGNATURE_BLOCK_AND_EXPIRY` marker, in which case that recorded blockhash is used for
|
|
221
|
-
* `untilValid` instead) — records the signature's blockhash/expiry in `untilValid` before
|
|
222
|
-
* delegating to `sendRawTransaction`.
|
|
223
|
-
* @param tx - Transaction to send; mutated in place (blockhash, signatures) unless `preSigned`.
|
|
224
|
-
* @param additionalSigners - Extra signers to co-sign alongside the wallet.
|
|
225
|
-
* @param opts - Confirmation options; defaults to `this.opts`.
|
|
226
|
-
* @param preSigned - If `true`, skip signing (blockhash/`untilValid` bookkeeping still applies).
|
|
227
|
-
* @returns The result of `sendRawTransaction` on the serialized, signed transaction.
|
|
228
|
-
* @throws Error if a blockhash can't be fetched/resolved, or the (pre)signed transaction has no signature.
|
|
229
|
-
*/
|
|
230
|
-
async sendVersionedTransaction(
|
|
231
|
-
tx: VersionedTransaction,
|
|
232
|
-
additionalSigners?: Array<Signer>,
|
|
233
|
-
opts?: ConfirmOptions,
|
|
234
|
-
preSigned?: boolean
|
|
235
|
-
): Promise<TxSigAndSlot> {
|
|
236
|
-
let latestBlockhash =
|
|
237
|
-
await this.txHandler.getLatestBlockhashForTransaction();
|
|
238
|
-
|
|
239
|
-
if (!latestBlockhash) {
|
|
240
|
-
throw new Error(
|
|
241
|
-
'WhileValidTxSender: failed to fetch latest blockhash for transaction'
|
|
242
|
-
);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
let signedTx;
|
|
246
|
-
if (preSigned) {
|
|
247
|
-
signedTx = tx;
|
|
248
|
-
|
|
249
|
-
// See SIGNATURE_BLOCK_AND_EXPIRY explanation in txHandler.ts if this is confusing
|
|
250
|
-
// @ts-ignore
|
|
251
|
-
if (tx.SIGNATURE_BLOCK_AND_EXPIRY) {
|
|
252
|
-
// @ts-ignore
|
|
253
|
-
latestBlockhash = tx.SIGNATURE_BLOCK_AND_EXPIRY;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// @ts-ignore
|
|
257
|
-
} else if (this.wallet.payer) {
|
|
258
|
-
tx.message.recentBlockhash = latestBlockhash.blockhash;
|
|
259
|
-
// @ts-ignore
|
|
260
|
-
tx.sign((additionalSigners ?? []).concat(this.wallet.payer));
|
|
261
|
-
signedTx = tx;
|
|
262
|
-
} else {
|
|
263
|
-
tx.message.recentBlockhash = latestBlockhash.blockhash;
|
|
264
|
-
additionalSigners
|
|
265
|
-
?.filter((s): s is Signer => s !== undefined)
|
|
266
|
-
.forEach((kp) => {
|
|
267
|
-
tx.sign([kp]);
|
|
268
|
-
});
|
|
269
|
-
signedTx = await this.txHandler.signVersionedTx(
|
|
270
|
-
tx,
|
|
271
|
-
additionalSigners ?? [],
|
|
272
|
-
latestBlockhash
|
|
273
|
-
);
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
if (opts === undefined) {
|
|
277
|
-
opts = this.opts;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
const signature = signedTx.signatures[0];
|
|
281
|
-
if (!signature) {
|
|
282
|
-
throw new Error(
|
|
283
|
-
'WhileValidTxSender: signed transaction is missing a signature'
|
|
284
|
-
);
|
|
285
|
-
}
|
|
286
|
-
const txSig = bs58.encode(signature);
|
|
287
|
-
if (!latestBlockhash) {
|
|
288
|
-
throw new Error(
|
|
289
|
-
'WhileValidTxSender: failed to resolve latest blockhash for transaction'
|
|
290
|
-
);
|
|
291
|
-
}
|
|
292
|
-
this.untilValid.set(txSig, latestBlockhash);
|
|
293
|
-
|
|
294
|
-
return this.sendRawTransaction(signedTx.serialize(), opts);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
/**
|
|
298
|
-
* Sends a raw transaction, then repeatedly resends the identical signed bytes to `connection`
|
|
299
|
-
* (and broadcasts to `additionalConnections`/`additionalTxSenderCallbacks`) every `retrySleep`
|
|
300
|
-
* ms while concurrently waiting for confirmation, like `RetryTxSender`. Additionally: if
|
|
301
|
-
* confirmation resolves with an on-chain error and `checkConfirmationResultForError` doesn't
|
|
302
|
-
* itself throw (e.g. the detailed error couldn't be resolved), throws a generic
|
|
303
|
-
* `SendTransactionError` as a fallback when `throwOnTransactionError` is set; and always removes
|
|
304
|
-
* `txid` from `untilValid` once done, regardless of outcome.
|
|
305
|
-
* @param rawTransaction - Serialized, signed transaction bytes.
|
|
306
|
-
* @param opts - Options passed to each send/resend and to confirmation; `opts.commitment` selects confirmation level.
|
|
307
|
-
* @returns The signature and confirmation slot once confirmed.
|
|
308
|
-
* @throws Whatever `confirmTransaction` or `checkConfirmationResultForError` throw, or the
|
|
309
|
-
* fallback `SendTransactionError` described above.
|
|
310
|
-
*/
|
|
311
|
-
async sendRawTransaction(
|
|
312
|
-
rawTransaction: Buffer | Uint8Array,
|
|
313
|
-
opts: ConfirmOptions
|
|
314
|
-
): Promise<TxSigAndSlot> {
|
|
315
|
-
const startTime = this.getTimestamp();
|
|
316
|
-
|
|
317
|
-
const txid = await this.connection.sendRawTransaction(rawTransaction, opts);
|
|
318
|
-
this.txSigCache?.set(txid, false);
|
|
319
|
-
this.sendToAdditionalConnections(rawTransaction, opts);
|
|
320
|
-
|
|
321
|
-
let done = false;
|
|
322
|
-
const resolveReference: ResolveReference = {
|
|
323
|
-
resolve: undefined,
|
|
324
|
-
};
|
|
325
|
-
const stopWaiting = () => {
|
|
326
|
-
done = true;
|
|
327
|
-
if (resolveReference.resolve) {
|
|
328
|
-
resolveReference.resolve();
|
|
329
|
-
}
|
|
330
|
-
};
|
|
331
|
-
|
|
332
|
-
(async () => {
|
|
333
|
-
while (!done && this.getTimestamp() - startTime < this.timeout) {
|
|
334
|
-
await this.sleep(resolveReference);
|
|
335
|
-
if (!done) {
|
|
336
|
-
this.connection
|
|
337
|
-
.sendRawTransaction(rawTransaction, opts)
|
|
338
|
-
.catch((e) => {
|
|
339
|
-
console.error(e);
|
|
340
|
-
stopWaiting();
|
|
341
|
-
});
|
|
342
|
-
this.sendToAdditionalConnections(rawTransaction, opts);
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
})();
|
|
346
|
-
|
|
347
|
-
let slot: number | undefined;
|
|
348
|
-
try {
|
|
349
|
-
const result = await this.confirmTransaction(txid, opts.commitment);
|
|
350
|
-
|
|
351
|
-
this.txSigCache?.set(txid, true);
|
|
352
|
-
|
|
353
|
-
if (result) {
|
|
354
|
-
await this.checkConfirmationResultForError(txid, result.value);
|
|
355
|
-
|
|
356
|
-
if (result.value?.err && this.throwOnTransactionError) {
|
|
357
|
-
// Fallback error handling if there's a problem reporting the error in checkConfirmationResultForError
|
|
358
|
-
throw new SendTransactionError({
|
|
359
|
-
action: 'send',
|
|
360
|
-
signature: txid,
|
|
361
|
-
transactionMessage: `Transaction Failed`,
|
|
362
|
-
});
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
slot = result.context.slot;
|
|
366
|
-
}
|
|
367
|
-
// eslint-disable-next-line no-useless-catch
|
|
368
|
-
} catch (e) {
|
|
369
|
-
throw e;
|
|
370
|
-
} finally {
|
|
371
|
-
stopWaiting();
|
|
372
|
-
this.untilValid.delete(txid);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
return { txSig: txid, slot };
|
|
376
|
-
}
|
|
377
|
-
}
|