@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,176 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Commitment,
|
|
3
|
-
Connection,
|
|
4
|
-
Finality,
|
|
5
|
-
SendTransactionError,
|
|
6
|
-
VersionedTransactionResponse,
|
|
7
|
-
} from '@solana/web3.js';
|
|
8
|
-
import { DEFAULT_CONFIRMATION_OPTS } from '../config';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* The new getTransaction method expects a Finality type instead of a Commitment type. The only options for Finality are 'confirmed' and 'finalized'.
|
|
12
|
-
* @param commitment
|
|
13
|
-
* @returns
|
|
14
|
-
*/
|
|
15
|
-
const commitmentToFinality = (commitment: Commitment): Finality => {
|
|
16
|
-
switch (commitment) {
|
|
17
|
-
case 'confirmed':
|
|
18
|
-
return 'confirmed';
|
|
19
|
-
case 'finalized':
|
|
20
|
-
return 'finalized';
|
|
21
|
-
default:
|
|
22
|
-
throw new Error(
|
|
23
|
-
`Invalid commitment when reporting transaction error. The commitment must be 'confirmed' or 'finalized' but was given '${commitment}'. If you're using this commitment for a specific reason, you may need to roll your own logic here.`
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const getTransactionResult = async (
|
|
29
|
-
txSig: string,
|
|
30
|
-
connection: Connection,
|
|
31
|
-
commitment?: Commitment
|
|
32
|
-
): Promise<VersionedTransactionResponse | null> => {
|
|
33
|
-
const resolvedCommitment =
|
|
34
|
-
commitment || connection.commitment || DEFAULT_CONFIRMATION_OPTS.commitment;
|
|
35
|
-
if (!resolvedCommitment) {
|
|
36
|
-
throw new Error(
|
|
37
|
-
'No commitment available when reporting transaction error. Provide a commitment, set one on the connection, or configure DEFAULT_CONFIRMATION_OPTS.'
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
const finality = commitmentToFinality(resolvedCommitment);
|
|
41
|
-
return await connection.getTransaction(txSig, {
|
|
42
|
-
maxSupportedTransactionVersion: 0,
|
|
43
|
-
commitment: finality,
|
|
44
|
-
});
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const getTransactionResultWithRetry = async (
|
|
48
|
-
txSig: string,
|
|
49
|
-
connection: Connection,
|
|
50
|
-
commitment?: Commitment
|
|
51
|
-
): Promise<VersionedTransactionResponse | null> => {
|
|
52
|
-
const start = Date.now();
|
|
53
|
-
|
|
54
|
-
const retryTimeout = 3_000; // Timeout after 3 seconds
|
|
55
|
-
const retryInterval = 800; // Retry with 800ms interval
|
|
56
|
-
const retryCount = 3; // Retry 3 times
|
|
57
|
-
|
|
58
|
-
let currentCount = 0;
|
|
59
|
-
let transactionResult = await getTransactionResult(
|
|
60
|
-
txSig,
|
|
61
|
-
connection,
|
|
62
|
-
commitment
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
// Retry 3 times or until timeout as long as we don't have a result yet
|
|
66
|
-
while (
|
|
67
|
-
!transactionResult &&
|
|
68
|
-
Date.now() - start < retryTimeout &&
|
|
69
|
-
currentCount < retryCount
|
|
70
|
-
) {
|
|
71
|
-
// Sleep for 1 second :: Do this first so that we don't run the first loop immediately after the initial fetch above
|
|
72
|
-
await new Promise((resolve) => setTimeout(resolve, retryInterval));
|
|
73
|
-
|
|
74
|
-
transactionResult = await getTransactionResult(
|
|
75
|
-
txSig,
|
|
76
|
-
connection,
|
|
77
|
-
commitment
|
|
78
|
-
);
|
|
79
|
-
currentCount++;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return transactionResult;
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* THROWS if there is an error
|
|
87
|
-
*
|
|
88
|
-
* Should only be used for a txSig that is confirmed has an error. There is a race-condition where sometimes the transaction is not instantly available to fetch after the confirmation has already failed with an error, so this method has retry logic which we don't want to do wastefully. This method will throw a generic error if it can't get the transaction result after a retry period.
|
|
89
|
-
* @param txSig - Signature of the transaction already known/confirmed to have failed.
|
|
90
|
-
* @param connection - RPC connection used to fetch the transaction (retried up to 3 times over ~3s).
|
|
91
|
-
* @param commitment - Commitment to fetch at; defaults to `connection.commitment`, then `DEFAULT_CONFIRMATION_OPTS.commitment`. Must resolve to `'confirmed'` or `'finalized'`.
|
|
92
|
-
* @returns Resolves with no value if no error could be extracted (should not normally happen for a known-failed signature).
|
|
93
|
-
* @throws SendTransactionError with the resolved on-chain error/logs — or a generic "Transaction Failed" error if the transaction result couldn't be fetched after retrying.
|
|
94
|
-
*/
|
|
95
|
-
export const throwTransactionError = async (
|
|
96
|
-
txSig: string,
|
|
97
|
-
connection: Connection,
|
|
98
|
-
commitment?: Commitment
|
|
99
|
-
): Promise<void> => {
|
|
100
|
-
const err = await getTransactionErrorFromTxSig(txSig, connection, commitment);
|
|
101
|
-
|
|
102
|
-
if (err) {
|
|
103
|
-
throw err;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return;
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* RETURNS an error if there is one
|
|
111
|
-
*
|
|
112
|
-
* Should only be used for a txSig that is confirmed has an error. There is a race-condition where sometimes the transaction is not instantly available to fetch after the confirmation has already failed with an error, so this method has retry logic which we don't want to do wastefully. This method will throw a generic error if it can't get the transaction result after a retry period.
|
|
113
|
-
* @param txSig - Signature of the transaction already known/confirmed to have failed.
|
|
114
|
-
* @param connection - RPC connection used to fetch the transaction (retried up to 3 times over ~3s).
|
|
115
|
-
* @param commitment - Commitment to fetch at; defaults to `connection.commitment`, then `DEFAULT_CONFIRMATION_OPTS.commitment`. Must resolve to `'confirmed'` or `'finalized'`.
|
|
116
|
-
* @returns The resolved `SendTransactionError` (with parsed logs/friendly message), a generic
|
|
117
|
-
* "Transaction Failed" `SendTransactionError` if the transaction couldn't be fetched after
|
|
118
|
-
* retrying, or `undefined` if the fetched transaction unexpectedly has no recorded error.
|
|
119
|
-
*/
|
|
120
|
-
export const getTransactionErrorFromTxSig = async (
|
|
121
|
-
txSig: string,
|
|
122
|
-
connection: Connection,
|
|
123
|
-
commitment?: Commitment
|
|
124
|
-
): Promise<SendTransactionError | undefined> => {
|
|
125
|
-
const transactionResult = await getTransactionResultWithRetry(
|
|
126
|
-
txSig,
|
|
127
|
-
connection,
|
|
128
|
-
commitment
|
|
129
|
-
);
|
|
130
|
-
|
|
131
|
-
if (!transactionResult) {
|
|
132
|
-
// Throw a generic error because we couldn't get the transaction result for the given txSig
|
|
133
|
-
return new SendTransactionError({
|
|
134
|
-
action: 'send',
|
|
135
|
-
signature: txSig,
|
|
136
|
-
transactionMessage: `Transaction Failed`,
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
if (!transactionResult?.meta?.err) {
|
|
141
|
-
// Assume that the transaction was successful and we are here erroneously because we have a result with no error
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
return getTransactionError(transactionResult);
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Builds a `SendTransactionError` from an already-fetched transaction response, extracting a
|
|
150
|
-
* "friendly" message from the last log line (matching `failed: <message>`) when present.
|
|
151
|
-
* @param transactionResult - A fetched `VersionedTransactionResponse`.
|
|
152
|
-
* @returns A `SendTransactionError` populated with the signature, logs, and (if parseable) a
|
|
153
|
-
* friendly failure message, or `undefined` if `transactionResult.meta.err` is not set.
|
|
154
|
-
*/
|
|
155
|
-
export const getTransactionError = (
|
|
156
|
-
transactionResult: VersionedTransactionResponse
|
|
157
|
-
): SendTransactionError | undefined => {
|
|
158
|
-
if (!transactionResult?.meta?.err) {
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
const logs = transactionResult?.meta?.logMessages ?? ['No logs'];
|
|
163
|
-
|
|
164
|
-
const lastLog = logs[logs.length - 1];
|
|
165
|
-
|
|
166
|
-
const friendlyMessage = lastLog?.match(/(failed:) (.+)/)?.[2];
|
|
167
|
-
|
|
168
|
-
return new SendTransactionError({
|
|
169
|
-
action: 'send',
|
|
170
|
-
signature: transactionResult?.transaction?.signatures?.[0],
|
|
171
|
-
transactionMessage: `Transaction Failed${
|
|
172
|
-
friendlyMessage ? `: ${friendlyMessage}` : ''
|
|
173
|
-
}`,
|
|
174
|
-
logs,
|
|
175
|
-
});
|
|
176
|
-
};
|
package/src/tx/retryTxSender.ts
DELETED
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
import { ConfirmationStrategy, TxSigAndSlot } from './types';
|
|
2
|
-
import { ConfirmOptions, Connection } from '@solana/web3.js';
|
|
3
|
-
import { BaseTxSender } from './baseTxSender';
|
|
4
|
-
import { TxHandler } from './txHandler';
|
|
5
|
-
import { IWallet } from '../types';
|
|
6
|
-
import { DEFAULT_CONFIRMATION_OPTS } from '../config';
|
|
7
|
-
|
|
8
|
-
const DEFAULT_TIMEOUT = 35000;
|
|
9
|
-
const DEFAULT_RETRY = 2000;
|
|
10
|
-
|
|
11
|
-
type ResolveReference = {
|
|
12
|
-
resolve?: () => void;
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Default `TxSender` for most clients: sends a transaction once, then keeps resending the exact
|
|
17
|
-
* same signed bytes (to `connection` and every `additionalConnections` entry) every `retrySleep`
|
|
18
|
-
* ms until it confirms or `timeout` elapses. This is client-side resend, independent of the RPC
|
|
19
|
-
* node's own forwarding — useful when relying on rebroadcast to improve inclusion odds under
|
|
20
|
-
* congestion, at the cost of extra RPC load compared to `FastSingleTxSender`.
|
|
21
|
-
*/
|
|
22
|
-
export class RetryTxSender extends BaseTxSender {
|
|
23
|
-
connection: Connection;
|
|
24
|
-
wallet: IWallet;
|
|
25
|
-
opts: ConfirmOptions;
|
|
26
|
-
timeout: number;
|
|
27
|
-
/** Interval (ms) between resend attempts of the same signed transaction. */
|
|
28
|
-
retrySleep: number;
|
|
29
|
-
additionalConnections: Connection[];
|
|
30
|
-
timoutCount = 0;
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* @param props.connection - RPC connection used for sending, resending, and confirming.
|
|
34
|
-
* @param props.wallet - Wallet used to sign transactions that aren't already `preSigned`.
|
|
35
|
-
* @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).
|
|
36
|
-
* @param props.timeout - Total time (ms) to keep resending and waiting for confirmation before giving up; defaults to 35000 (35s).
|
|
37
|
-
* @param props.retrySleep - Interval (ms) between resend attempts; defaults to 2000 (2s).
|
|
38
|
-
* @param props.additionalConnections - Extra connections to also (re)broadcast raw transactions to.
|
|
39
|
-
* @param props.confirmationStrategy - How to wait for confirmation; defaults to `ConfirmationStrategy.Combo`.
|
|
40
|
-
* @param props.additionalTxSenderCallbacks - Callbacks invoked with each (re)sent transaction's base58 encoding.
|
|
41
|
-
* @param props.txHandler - Custom `TxHandler` for signing/building transactions.
|
|
42
|
-
* @param props.trackTxLandRate - Enables land-rate tracking.
|
|
43
|
-
* @param props.txLandRateLookbackWindowMinutes - Rolling window, in minutes, for the land-rate calculation.
|
|
44
|
-
* @param props.landRateToFeeFunc - Custom mapping from land rate to priority-fee multiplier.
|
|
45
|
-
* @param props.throwOnTimeoutError - Whether confirmation timeouts throw `TxSendError`; defaults to `true`.
|
|
46
|
-
*/
|
|
47
|
-
public constructor({
|
|
48
|
-
connection,
|
|
49
|
-
wallet,
|
|
50
|
-
opts = { ...DEFAULT_CONFIRMATION_OPTS, maxRetries: 0 },
|
|
51
|
-
timeout = DEFAULT_TIMEOUT,
|
|
52
|
-
retrySleep = DEFAULT_RETRY,
|
|
53
|
-
additionalConnections = new Array<Connection>(),
|
|
54
|
-
confirmationStrategy = ConfirmationStrategy.Combo,
|
|
55
|
-
additionalTxSenderCallbacks = [],
|
|
56
|
-
txHandler,
|
|
57
|
-
trackTxLandRate,
|
|
58
|
-
txLandRateLookbackWindowMinutes,
|
|
59
|
-
landRateToFeeFunc,
|
|
60
|
-
throwOnTimeoutError = true,
|
|
61
|
-
}: {
|
|
62
|
-
connection: Connection;
|
|
63
|
-
wallet: IWallet;
|
|
64
|
-
opts?: ConfirmOptions;
|
|
65
|
-
timeout?: number;
|
|
66
|
-
retrySleep?: number;
|
|
67
|
-
additionalConnections?: Connection[];
|
|
68
|
-
confirmationStrategy?: ConfirmationStrategy;
|
|
69
|
-
additionalTxSenderCallbacks?: ((base58EncodedTx: string) => void)[];
|
|
70
|
-
txHandler?: TxHandler;
|
|
71
|
-
trackTxLandRate?: boolean;
|
|
72
|
-
txLandRateLookbackWindowMinutes?: number;
|
|
73
|
-
landRateToFeeFunc?: (landRate: number) => number;
|
|
74
|
-
throwOnTimeoutError?: boolean;
|
|
75
|
-
}) {
|
|
76
|
-
super({
|
|
77
|
-
connection,
|
|
78
|
-
wallet,
|
|
79
|
-
opts,
|
|
80
|
-
timeout,
|
|
81
|
-
additionalConnections,
|
|
82
|
-
confirmationStrategy,
|
|
83
|
-
additionalTxSenderCallbacks,
|
|
84
|
-
txHandler,
|
|
85
|
-
trackTxLandRate,
|
|
86
|
-
txLandRateLookbackWindowMinutes,
|
|
87
|
-
landRateToFeeFunc,
|
|
88
|
-
throwOnTimeoutError,
|
|
89
|
-
});
|
|
90
|
-
this.connection = connection;
|
|
91
|
-
this.wallet = wallet;
|
|
92
|
-
this.opts = opts;
|
|
93
|
-
this.timeout = timeout;
|
|
94
|
-
this.retrySleep = retrySleep;
|
|
95
|
-
this.additionalConnections = additionalConnections;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Waits `retrySleep` milliseconds, exposing an early-wake `resolve` via `reference` so the
|
|
100
|
-
* resend loop in `sendRawTransaction` can stop promptly once the transaction confirms or a
|
|
101
|
-
* resend fails.
|
|
102
|
-
* @param reference - Mutable holder `sendRawTransaction` uses to resolve this sleep early.
|
|
103
|
-
*/
|
|
104
|
-
async sleep(reference: ResolveReference): Promise<void> {
|
|
105
|
-
return new Promise((resolve) => {
|
|
106
|
-
reference.resolve = resolve;
|
|
107
|
-
setTimeout(resolve, this.retrySleep);
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Sends a raw transaction, then repeatedly resends the identical signed bytes to `connection`
|
|
113
|
-
* (and broadcasts to `additionalConnections`/`additionalTxSenderCallbacks`) every `retrySleep`
|
|
114
|
-
* ms while concurrently waiting for confirmation. The resend loop stops as soon as
|
|
115
|
-
* confirmation resolves, a resend attempt itself throws, or `timeout` elapses.
|
|
116
|
-
* @param rawTransaction - Serialized, signed transaction bytes.
|
|
117
|
-
* @param opts - Options passed to each send/resend and to confirmation; `opts.commitment` selects confirmation level.
|
|
118
|
-
* @returns The signature and confirmation slot once confirmed.
|
|
119
|
-
* @throws Whatever `confirmTransaction` or `checkConfirmationResultForError` throw (e.g.
|
|
120
|
-
* `TxSendError` on timeout, or the resolved on-chain error for a failed transaction).
|
|
121
|
-
*/
|
|
122
|
-
async sendRawTransaction(
|
|
123
|
-
rawTransaction: Buffer | Uint8Array,
|
|
124
|
-
opts: ConfirmOptions
|
|
125
|
-
): Promise<TxSigAndSlot> {
|
|
126
|
-
const startTime = this.getTimestamp();
|
|
127
|
-
|
|
128
|
-
const txid = await this.connection.sendRawTransaction(rawTransaction, opts);
|
|
129
|
-
this.txSigCache?.set(txid, false);
|
|
130
|
-
this.sendToAdditionalConnections(rawTransaction, opts);
|
|
131
|
-
|
|
132
|
-
let done = false;
|
|
133
|
-
const resolveReference: ResolveReference = {
|
|
134
|
-
resolve: undefined,
|
|
135
|
-
};
|
|
136
|
-
const stopWaiting = () => {
|
|
137
|
-
done = true;
|
|
138
|
-
if (resolveReference.resolve) {
|
|
139
|
-
resolveReference.resolve();
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
(async () => {
|
|
144
|
-
while (!done && this.getTimestamp() - startTime < this.timeout) {
|
|
145
|
-
await this.sleep(resolveReference);
|
|
146
|
-
if (!done) {
|
|
147
|
-
this.connection
|
|
148
|
-
.sendRawTransaction(rawTransaction, opts)
|
|
149
|
-
.catch((e) => {
|
|
150
|
-
console.error(e);
|
|
151
|
-
stopWaiting();
|
|
152
|
-
});
|
|
153
|
-
this.sendToAdditionalConnections(rawTransaction, opts);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
})();
|
|
157
|
-
|
|
158
|
-
let slot: number | undefined;
|
|
159
|
-
try {
|
|
160
|
-
const result = await this.confirmTransaction(txid, opts.commitment);
|
|
161
|
-
this.txSigCache?.set(txid, true);
|
|
162
|
-
|
|
163
|
-
if (result) {
|
|
164
|
-
await this.checkConfirmationResultForError(txid, result.value);
|
|
165
|
-
|
|
166
|
-
slot = result.context?.slot;
|
|
167
|
-
}
|
|
168
|
-
// eslint-disable-next-line no-useless-catch
|
|
169
|
-
} catch (e) {
|
|
170
|
-
throw e;
|
|
171
|
-
} finally {
|
|
172
|
-
stopWaiting();
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
return { txSig: txid, slot };
|
|
176
|
-
}
|
|
177
|
-
}
|