@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,213 +0,0 @@
|
|
|
1
|
-
import { Connection, Keypair, PublicKey } from '@solana/web3.js';
|
|
2
|
-
import dotenv from 'dotenv';
|
|
3
|
-
import {
|
|
4
|
-
VelocityClient,
|
|
5
|
-
VelocityClientConfig,
|
|
6
|
-
Wallet,
|
|
7
|
-
UserMap,
|
|
8
|
-
VELOCITY_PROGRAM_ID,
|
|
9
|
-
getMarketsAndOraclesForSubscription,
|
|
10
|
-
BulkAccountLoader,
|
|
11
|
-
BN,
|
|
12
|
-
PerpPosition,
|
|
13
|
-
} from '../src';
|
|
14
|
-
import { TransactionSignature } from '@solana/web3.js';
|
|
15
|
-
import fs from 'fs';
|
|
16
|
-
import os from 'os';
|
|
17
|
-
import path from 'path';
|
|
18
|
-
|
|
19
|
-
async function main() {
|
|
20
|
-
dotenv.config({ path: '../' });
|
|
21
|
-
// Simple CLI parsing
|
|
22
|
-
interface CliOptions {
|
|
23
|
-
mode: 'list' | 'one' | 'all';
|
|
24
|
-
targetUser?: string;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function parseCliArgs(): CliOptions {
|
|
28
|
-
const args = process.argv.slice(2);
|
|
29
|
-
let mode: CliOptions['mode'] = 'list';
|
|
30
|
-
let targetUser: string | undefined = undefined;
|
|
31
|
-
for (let i = 0; i < args.length; i++) {
|
|
32
|
-
const arg = args[i];
|
|
33
|
-
if (arg === '--mode' && i + 1 < args.length) {
|
|
34
|
-
const next = args[i + 1] as CliOptions['mode'];
|
|
35
|
-
if (next === 'list' || next === 'one' || next === 'all') {
|
|
36
|
-
mode = next;
|
|
37
|
-
}
|
|
38
|
-
i++;
|
|
39
|
-
} else if ((arg === '--user' || arg === '--target') && i + 1 < args.length) {
|
|
40
|
-
targetUser = args[i + 1];
|
|
41
|
-
i++;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return { mode, targetUser };
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const { mode, targetUser } = parseCliArgs();
|
|
48
|
-
|
|
49
|
-
const RPC_ENDPOINT =
|
|
50
|
-
process.env.RPC_ENDPOINT ?? 'https://api.mainnet-beta.solana.com';
|
|
51
|
-
|
|
52
|
-
const connection = new Connection(RPC_ENDPOINT);
|
|
53
|
-
const keypairPath =
|
|
54
|
-
process.env.SOLANA_KEYPAIR ??
|
|
55
|
-
path.join(os.homedir(), '.config', 'solana', 'id.json');
|
|
56
|
-
const secret = JSON.parse(fs.readFileSync(keypairPath, 'utf-8')) as number[];
|
|
57
|
-
const wallet = new Wallet(Keypair.fromSecretKey(Uint8Array.from(secret)));
|
|
58
|
-
|
|
59
|
-
const { perpMarketIndexes, spotMarketIndexes, oracleInfos } =
|
|
60
|
-
getMarketsAndOraclesForSubscription('mainnet-beta');
|
|
61
|
-
|
|
62
|
-
const accountLoader = new BulkAccountLoader(connection, 'confirmed', 60_000);
|
|
63
|
-
|
|
64
|
-
const clientConfig: VelocityClientConfig = {
|
|
65
|
-
connection,
|
|
66
|
-
wallet,
|
|
67
|
-
programID: new PublicKey(VELOCITY_PROGRAM_ID),
|
|
68
|
-
accountSubscription: {
|
|
69
|
-
type: 'polling',
|
|
70
|
-
accountLoader,
|
|
71
|
-
},
|
|
72
|
-
perpMarketIndexes,
|
|
73
|
-
spotMarketIndexes,
|
|
74
|
-
oracleInfos,
|
|
75
|
-
env: 'mainnet-beta',
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
const client = new VelocityClient(clientConfig);
|
|
79
|
-
await client.subscribe();
|
|
80
|
-
|
|
81
|
-
const userMap = new UserMap({
|
|
82
|
-
velocityClient: client,
|
|
83
|
-
subscriptionConfig: {
|
|
84
|
-
type: 'polling',
|
|
85
|
-
frequency: 60_000,
|
|
86
|
-
commitment: 'confirmed',
|
|
87
|
-
},
|
|
88
|
-
includeIdle: false,
|
|
89
|
-
syncConfig: { type: 'paginated' },
|
|
90
|
-
throwOnFailedSync: false,
|
|
91
|
-
});
|
|
92
|
-
await userMap.subscribe();
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const flaggedUsers: Array<{
|
|
96
|
-
userPubkey: string;
|
|
97
|
-
authority: string;
|
|
98
|
-
flags: Array<{ marketIndex: number; flag: number; isolatedPositionScaledBalance: BN }>;
|
|
99
|
-
}> = [];
|
|
100
|
-
|
|
101
|
-
console.log(`User map size: ${Array.from(userMap.entries()).length}`);
|
|
102
|
-
|
|
103
|
-
for (const [userPubkey, user] of userMap.entries()) {
|
|
104
|
-
const userAccount = user.getUserAccount();
|
|
105
|
-
const flaggedPositions = userAccount.perpPositions
|
|
106
|
-
.filter((p) => p.positionFlag >= 1 || p.isolatedPositionScaledBalance.toString() !== '0')
|
|
107
|
-
.map((p) => ({ marketIndex: p.marketIndex, flag: p.positionFlag, isolatedPositionScaledBalance: p.isolatedPositionScaledBalance, fullPosition: p }));
|
|
108
|
-
|
|
109
|
-
if (flaggedPositions.length > 0) {
|
|
110
|
-
if(mode === 'one' && userPubkey === targetUser) {
|
|
111
|
-
console.log(`flagged positions on user ${userPubkey}`);
|
|
112
|
-
console.log(flaggedPositions.map((p) => `mkt=${p.marketIndex}, flag=${p.flag}, isolatedPositionScaledBalance=${p.isolatedPositionScaledBalance.toString()}, fullPosition=${fullLogPerpPosition(p.fullPosition)}`).join('\n\n; '));
|
|
113
|
-
}
|
|
114
|
-
flaggedUsers.push({
|
|
115
|
-
userPubkey,
|
|
116
|
-
authority: userAccount.authority.toBase58(),
|
|
117
|
-
flags: flaggedPositions,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Mode 1: list flagged users (default)
|
|
123
|
-
if (mode === 'list') {
|
|
124
|
-
console.log(`Flagged users (positionFlag >= 1 || isolatedPositionScaledBalance > 0): ${flaggedUsers.length}`);
|
|
125
|
-
for (const u of flaggedUsers) {
|
|
126
|
-
const flagsStr = u.flags
|
|
127
|
-
.map((f) => `mkt=${f.marketIndex}, flag=${f.flag}, isolatedPositionScaledBalance=${f.isolatedPositionScaledBalance.toString()}`)
|
|
128
|
-
.join('; ');
|
|
129
|
-
console.log(
|
|
130
|
-
`- authority=${u.authority} userAccount=${u.userPubkey} -> [${flagsStr}]`
|
|
131
|
-
);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// Helper to invoke updateUserIdle
|
|
136
|
-
async function updateUserIdleFor(userAccountPubkeyStr: string): Promise<TransactionSignature | undefined> {
|
|
137
|
-
const userObj = userMap.get(userAccountPubkeyStr);
|
|
138
|
-
if (!userObj) {
|
|
139
|
-
console.warn(`User ${userAccountPubkeyStr} not found in userMap`);
|
|
140
|
-
return undefined;
|
|
141
|
-
}
|
|
142
|
-
try {
|
|
143
|
-
const sig = await client.updateUserIdle(
|
|
144
|
-
new PublicKey(userAccountPubkeyStr),
|
|
145
|
-
userObj.getUserAccount()
|
|
146
|
-
);
|
|
147
|
-
console.log(`updateUserIdle sent for userAccount=${userAccountPubkeyStr} -> tx=${sig}`);
|
|
148
|
-
return sig;
|
|
149
|
-
} catch (e) {
|
|
150
|
-
console.error(`Failed updateUserIdle for userAccount=${userAccountPubkeyStr}`, e);
|
|
151
|
-
return undefined;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// Mode 2: updateUserIdle on a single flagged user
|
|
156
|
-
if (mode === 'one') {
|
|
157
|
-
if (flaggedUsers.length === 0) {
|
|
158
|
-
console.log('No flagged users to update.');
|
|
159
|
-
} else {
|
|
160
|
-
const chosen =
|
|
161
|
-
(targetUser && flaggedUsers.find((u) => u.userPubkey === targetUser)) ||
|
|
162
|
-
flaggedUsers[0];
|
|
163
|
-
console.log(
|
|
164
|
-
`Updating single flagged userAccount=${chosen.userPubkey} authority=${chosen.authority}`
|
|
165
|
-
);
|
|
166
|
-
await updateUserIdleFor(chosen.userPubkey);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// Mode 3: updateUserIdle on all flagged users
|
|
171
|
-
if (mode === 'all') {
|
|
172
|
-
if (flaggedUsers.length === 0) {
|
|
173
|
-
console.log('No flagged users to update.');
|
|
174
|
-
} else {
|
|
175
|
-
console.log(`Updating all ${flaggedUsers.length} flagged users...`);
|
|
176
|
-
for (const u of flaggedUsers) {
|
|
177
|
-
await updateUserIdleFor(u.userPubkey);
|
|
178
|
-
}
|
|
179
|
-
console.log('Finished updating all flagged users.');
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
await userMap.unsubscribe();
|
|
184
|
-
await client.unsubscribe();
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
main().catch((e) => {
|
|
188
|
-
console.error(e);
|
|
189
|
-
process.exit(1);
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
function fullLogPerpPosition(position: PerpPosition) {
|
|
194
|
-
|
|
195
|
-
return `
|
|
196
|
-
[PERP POSITION]
|
|
197
|
-
baseAssetAmount=${position.baseAssetAmount.toString()}
|
|
198
|
-
quoteAssetAmount=${position.quoteAssetAmount.toString()}
|
|
199
|
-
quoteBreakEvenAmount=${position.quoteBreakEvenAmount.toString()}
|
|
200
|
-
quoteEntryAmount=${position.quoteEntryAmount.toString()}
|
|
201
|
-
openBids=${position.openBids.toString()}
|
|
202
|
-
openAsks=${position.openAsks.toString()}
|
|
203
|
-
settledPnl=${position.settledPnl.toString()}
|
|
204
|
-
remainderBaseAssetAmount=${position.remainderBaseAssetAmount}
|
|
205
|
-
maxMarginRatio=${position.maxMarginRatio}
|
|
206
|
-
marketIndex=${position.marketIndex}
|
|
207
|
-
openOrders=${position.openOrders}
|
|
208
|
-
positionFlag=${position.positionFlag}
|
|
209
|
-
isolatedPositionScaledBalance=${position.isolatedPositionScaledBalance.toString()}
|
|
210
|
-
`;
|
|
211
|
-
|
|
212
|
-
}
|
|
213
|
-
|
|
@@ -1,372 +0,0 @@
|
|
|
1
|
-
import { VelocityClient } from '../src/velocityClient';
|
|
2
|
-
import { grpcVelocityClientAccountSubscriberV2 } from '../src/accounts/grpcVelocityClientAccountSubscriberV2';
|
|
3
|
-
import { grpcVelocityClientAccountSubscriber } from '../src/accounts/grpcVelocityClientAccountSubscriber';
|
|
4
|
-
import { Connection, Keypair, PublicKey } from '@solana/web3.js';
|
|
5
|
-
import { VelocityClientConfig } from '../src/velocityClientConfig';
|
|
6
|
-
import {
|
|
7
|
-
VELOCITY_PROGRAM_ID,
|
|
8
|
-
PerpMarketAccount,
|
|
9
|
-
SpotMarketAccount,
|
|
10
|
-
Wallet,
|
|
11
|
-
OracleInfo,
|
|
12
|
-
} from '../src';
|
|
13
|
-
import { CommitmentLevel } from '@triton-one/yellowstone-grpc';
|
|
14
|
-
import dotenv from 'dotenv';
|
|
15
|
-
import {
|
|
16
|
-
AnchorProvider,
|
|
17
|
-
Idl,
|
|
18
|
-
Program,
|
|
19
|
-
ProgramAccount,
|
|
20
|
-
} from '@coral-xyz/anchor';
|
|
21
|
-
import velocityIDL from '../src/idl/velocity.json';
|
|
22
|
-
import assert from 'assert';
|
|
23
|
-
|
|
24
|
-
const GRPC_ENDPOINT = process.env.GRPC_ENDPOINT;
|
|
25
|
-
const TOKEN = process.env.TOKEN;
|
|
26
|
-
const RPC_ENDPOINT = process.env.RPC_ENDPOINT;
|
|
27
|
-
|
|
28
|
-
async function initializeGrpcVelocityClientV2VersusV1() {
|
|
29
|
-
const connection = new Connection(RPC_ENDPOINT);
|
|
30
|
-
const wallet = new Wallet(new Keypair());
|
|
31
|
-
dotenv.config({ path: '../' });
|
|
32
|
-
|
|
33
|
-
const programId = new PublicKey(VELOCITY_PROGRAM_ID);
|
|
34
|
-
const provider = new AnchorProvider(
|
|
35
|
-
connection,
|
|
36
|
-
// @ts-ignore
|
|
37
|
-
wallet,
|
|
38
|
-
{
|
|
39
|
-
commitment: 'processed',
|
|
40
|
-
}
|
|
41
|
-
);
|
|
42
|
-
|
|
43
|
-
const program = new Program(velocityIDL as Idl, programId, provider);
|
|
44
|
-
|
|
45
|
-
const allPerpMarketProgramAccounts =
|
|
46
|
-
(await program.account.perpMarket.all()) as ProgramAccount<PerpMarketAccount>[];
|
|
47
|
-
const perpMarketProgramAccounts = allPerpMarketProgramAccounts.filter((val) =>
|
|
48
|
-
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15].includes(
|
|
49
|
-
val.account.marketIndex
|
|
50
|
-
)
|
|
51
|
-
);
|
|
52
|
-
const perpMarketIndexes = perpMarketProgramAccounts.map(
|
|
53
|
-
(val) => val.account.marketIndex
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
const allSpotMarketProgramAccounts =
|
|
57
|
-
(await program.account.spotMarket.all()) as ProgramAccount<SpotMarketAccount>[];
|
|
58
|
-
const spotMarketProgramAccounts = allSpotMarketProgramAccounts.filter((val) =>
|
|
59
|
-
[0, 1, 2, 3, 4, 5].includes(val.account.marketIndex)
|
|
60
|
-
);
|
|
61
|
-
const spotMarketIndexes = spotMarketProgramAccounts.map(
|
|
62
|
-
(val) => val.account.marketIndex
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
const seen = new Set<string>();
|
|
66
|
-
const oracleInfos: OracleInfo[] = [];
|
|
67
|
-
for (const acct of perpMarketProgramAccounts) {
|
|
68
|
-
const key = `${acct.account.amm.oracle.toBase58()}-${
|
|
69
|
-
Object.keys(acct.account.amm.oracleSource)[0]
|
|
70
|
-
}`;
|
|
71
|
-
if (!seen.has(key)) {
|
|
72
|
-
seen.add(key);
|
|
73
|
-
oracleInfos.push({
|
|
74
|
-
publicKey: acct.account.amm.oracle,
|
|
75
|
-
source: acct.account.amm.oracleSource,
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
for (const acct of spotMarketProgramAccounts) {
|
|
80
|
-
const key = `${acct.account.oracle.toBase58()}-${
|
|
81
|
-
Object.keys(acct.account.oracleSource)[0]
|
|
82
|
-
}`;
|
|
83
|
-
if (!seen.has(key)) {
|
|
84
|
-
seen.add(key);
|
|
85
|
-
oracleInfos.push({
|
|
86
|
-
publicKey: acct.account.oracle,
|
|
87
|
-
source: acct.account.oracleSource,
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const baseAccountSubscription = {
|
|
93
|
-
type: 'grpc' as const,
|
|
94
|
-
grpcConfigs: {
|
|
95
|
-
endpoint: GRPC_ENDPOINT,
|
|
96
|
-
token: TOKEN,
|
|
97
|
-
commitmentLevel: CommitmentLevel.PROCESSED,
|
|
98
|
-
channelOptions: {
|
|
99
|
-
grpcKeepAliveTimeout: 1_000,
|
|
100
|
-
grpcTcpKeepalive: 10_000,
|
|
101
|
-
},
|
|
102
|
-
},
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
const configV2: VelocityClientConfig = {
|
|
106
|
-
connection,
|
|
107
|
-
wallet,
|
|
108
|
-
programID: new PublicKey(VELOCITY_PROGRAM_ID),
|
|
109
|
-
accountSubscription: {
|
|
110
|
-
...baseAccountSubscription,
|
|
111
|
-
velocityClientAccountSubscriber: grpcVelocityClientAccountSubscriberV2,
|
|
112
|
-
},
|
|
113
|
-
perpMarketIndexes,
|
|
114
|
-
spotMarketIndexes,
|
|
115
|
-
oracleInfos,
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
const configV1: VelocityClientConfig = {
|
|
119
|
-
connection,
|
|
120
|
-
wallet,
|
|
121
|
-
programID: new PublicKey(VELOCITY_PROGRAM_ID),
|
|
122
|
-
accountSubscription: {
|
|
123
|
-
...baseAccountSubscription,
|
|
124
|
-
velocityClientAccountSubscriber: grpcVelocityClientAccountSubscriber,
|
|
125
|
-
},
|
|
126
|
-
perpMarketIndexes,
|
|
127
|
-
spotMarketIndexes,
|
|
128
|
-
oracleInfos,
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
const clientV2 = new VelocityClient(configV2);
|
|
132
|
-
const clientV1 = new VelocityClient(configV1);
|
|
133
|
-
|
|
134
|
-
await Promise.all([clientV1.subscribe(), clientV2.subscribe()]);
|
|
135
|
-
const compare = () => {
|
|
136
|
-
try {
|
|
137
|
-
// 1. Test getStateAccountAndSlot
|
|
138
|
-
const state1 = clientV1.accountSubscriber.getStateAccountAndSlot();
|
|
139
|
-
const state2 = clientV2.accountSubscriber.getStateAccountAndSlot();
|
|
140
|
-
assert.deepStrictEqual(
|
|
141
|
-
state1.data,
|
|
142
|
-
state2.data,
|
|
143
|
-
'State accounts should match'
|
|
144
|
-
);
|
|
145
|
-
if (
|
|
146
|
-
state1.slot !== undefined &&
|
|
147
|
-
state2.slot !== undefined &&
|
|
148
|
-
state2.slot < state1.slot
|
|
149
|
-
) {
|
|
150
|
-
console.error(
|
|
151
|
-
`State account slot regression: v2 slot ${state2.slot} < v1 slot ${state1.slot}`
|
|
152
|
-
);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// 2. Test getMarketAccountsAndSlots (all perp markets) - sorted comparison
|
|
156
|
-
const allPerpMarkets1 = clientV1.accountSubscriber
|
|
157
|
-
.getMarketAccountsAndSlots()
|
|
158
|
-
.sort((a, b) => a.data.marketIndex - b.data.marketIndex);
|
|
159
|
-
const allPerpMarkets2 = clientV2.accountSubscriber
|
|
160
|
-
.getMarketAccountsAndSlots()
|
|
161
|
-
.sort((a, b) => a.data.marketIndex - b.data.marketIndex);
|
|
162
|
-
assert.strictEqual(
|
|
163
|
-
allPerpMarkets1.length,
|
|
164
|
-
allPerpMarkets2.length,
|
|
165
|
-
'Number of perp markets should match'
|
|
166
|
-
);
|
|
167
|
-
|
|
168
|
-
// Compare each perp market in the sorted arrays
|
|
169
|
-
for (let i = 0; i < allPerpMarkets1.length; i++) {
|
|
170
|
-
const market1 = allPerpMarkets1[i];
|
|
171
|
-
const market2 = allPerpMarkets2[i];
|
|
172
|
-
assert.strictEqual(
|
|
173
|
-
market1.data.marketIndex,
|
|
174
|
-
market2.data.marketIndex,
|
|
175
|
-
`Perp market at position ${i} should have same marketIndex`
|
|
176
|
-
);
|
|
177
|
-
// assert.deepStrictEqual(
|
|
178
|
-
// market1.data,
|
|
179
|
-
// market2.data,
|
|
180
|
-
// `Perp market ${market1.data.marketIndex} (from getMarketAccountsAndSlots) should match`
|
|
181
|
-
// );
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// 3. Test getMarketAccountAndSlot for each perp market
|
|
185
|
-
for (const idx of perpMarketIndexes) {
|
|
186
|
-
const market1 = clientV1.accountSubscriber.getMarketAccountAndSlot(idx);
|
|
187
|
-
const market2 = clientV2.accountSubscriber.getMarketAccountAndSlot(idx);
|
|
188
|
-
// assert.deepStrictEqual(
|
|
189
|
-
// market1?.data,
|
|
190
|
-
// market2?.data,
|
|
191
|
-
// `Perp market ${idx} data should match`
|
|
192
|
-
// );
|
|
193
|
-
// assert.strictEqual(
|
|
194
|
-
// market1?.slot,
|
|
195
|
-
// market2?.slot,
|
|
196
|
-
// `Perp market ${idx} slot should match`
|
|
197
|
-
// );
|
|
198
|
-
if (
|
|
199
|
-
market1?.slot !== undefined &&
|
|
200
|
-
market2?.slot !== undefined &&
|
|
201
|
-
market2.slot < market1.slot
|
|
202
|
-
) {
|
|
203
|
-
console.error(
|
|
204
|
-
`Perp market ${idx} slot regression: v2 slot ${market2.slot} < v1 slot ${market1.slot}`
|
|
205
|
-
);
|
|
206
|
-
} else if (
|
|
207
|
-
market1?.slot !== undefined &&
|
|
208
|
-
market2?.slot !== undefined &&
|
|
209
|
-
market2.slot > market1.slot
|
|
210
|
-
) {
|
|
211
|
-
console.info(
|
|
212
|
-
`Perp market ${idx} slot is FASTER! v2: ${market2.slot}, v1: ${market1.slot}`
|
|
213
|
-
);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// 4. Test getSpotMarketAccountsAndSlots (all spot markets) - sorted comparison
|
|
218
|
-
const allSpotMarkets1 = clientV1.accountSubscriber
|
|
219
|
-
.getSpotMarketAccountsAndSlots()
|
|
220
|
-
.sort((a, b) => a.data.marketIndex - b.data.marketIndex);
|
|
221
|
-
const allSpotMarkets2 = clientV2.accountSubscriber
|
|
222
|
-
.getSpotMarketAccountsAndSlots()
|
|
223
|
-
.sort((a, b) => a.data.marketIndex - b.data.marketIndex);
|
|
224
|
-
assert.strictEqual(
|
|
225
|
-
allSpotMarkets1.length,
|
|
226
|
-
allSpotMarkets2.length,
|
|
227
|
-
'Number of spot markets should match'
|
|
228
|
-
);
|
|
229
|
-
|
|
230
|
-
// Compare each spot market in the sorted arrays
|
|
231
|
-
for (let i = 0; i < allSpotMarkets1.length; i++) {
|
|
232
|
-
const market1 = allSpotMarkets1[i];
|
|
233
|
-
const market2 = allSpotMarkets2[i];
|
|
234
|
-
assert.strictEqual(
|
|
235
|
-
market1.data.marketIndex,
|
|
236
|
-
market2.data.marketIndex,
|
|
237
|
-
`Spot market at position ${i} should have same marketIndex`
|
|
238
|
-
);
|
|
239
|
-
// assert.deepStrictEqual(
|
|
240
|
-
// market1.data,
|
|
241
|
-
// market2.data,
|
|
242
|
-
// `Spot market ${market1.data.marketIndex} (from getSpotMarketAccountsAndSlots) should match`
|
|
243
|
-
// );
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
// 5. Test getSpotMarketAccountAndSlot for each spot market
|
|
247
|
-
for (const idx of spotMarketIndexes) {
|
|
248
|
-
const market1 =
|
|
249
|
-
clientV1.accountSubscriber.getSpotMarketAccountAndSlot(idx);
|
|
250
|
-
const market2 =
|
|
251
|
-
clientV2.accountSubscriber.getSpotMarketAccountAndSlot(idx);
|
|
252
|
-
// assert.deepStrictEqual(
|
|
253
|
-
// market1?.data,
|
|
254
|
-
// market2?.data,
|
|
255
|
-
// `Spot market ${idx} data should match`
|
|
256
|
-
// );
|
|
257
|
-
// assert.strictEqual(
|
|
258
|
-
// market1?.slot,
|
|
259
|
-
// market2?.slot,
|
|
260
|
-
// `Spot market ${idx} slot should match`
|
|
261
|
-
// );
|
|
262
|
-
if (
|
|
263
|
-
market1?.slot !== undefined &&
|
|
264
|
-
market2?.slot !== undefined &&
|
|
265
|
-
market2.slot < market1.slot
|
|
266
|
-
) {
|
|
267
|
-
console.error(
|
|
268
|
-
`Spot market ${idx} slot regression: v2 slot ${market2.slot} < v1 slot ${market1.slot}`
|
|
269
|
-
);
|
|
270
|
-
} else if (
|
|
271
|
-
market1?.slot !== undefined &&
|
|
272
|
-
market2?.slot !== undefined &&
|
|
273
|
-
market2.slot > market1.slot
|
|
274
|
-
) {
|
|
275
|
-
console.info(
|
|
276
|
-
`Spot market ${idx} slot is FASTER! v2: ${market2.slot}, v1: ${market1.slot}`
|
|
277
|
-
);
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// 6. Test getOraclePriceDataAndSlotForPerpMarket
|
|
282
|
-
for (const idx of perpMarketIndexes) {
|
|
283
|
-
const oracle1 =
|
|
284
|
-
clientV1.accountSubscriber.getOraclePriceDataAndSlotForPerpMarket(
|
|
285
|
-
idx
|
|
286
|
-
);
|
|
287
|
-
const oracle2 =
|
|
288
|
-
clientV2.accountSubscriber.getOraclePriceDataAndSlotForPerpMarket(
|
|
289
|
-
idx
|
|
290
|
-
);
|
|
291
|
-
// assert.deepStrictEqual(
|
|
292
|
-
// oracle1?.data,
|
|
293
|
-
// oracle2?.data,
|
|
294
|
-
// `Perp market ${idx} oracle data should match`
|
|
295
|
-
// );
|
|
296
|
-
// Note: slots might differ slightly due to timing, so we can optionally skip this check or be lenient
|
|
297
|
-
// assert.strictEqual(oracle1?.slot, oracle2?.slot, `Perp market ${idx} oracle slot should match`);
|
|
298
|
-
if (
|
|
299
|
-
oracle1?.slot !== undefined &&
|
|
300
|
-
oracle2?.slot !== undefined &&
|
|
301
|
-
oracle2.slot < oracle1.slot
|
|
302
|
-
) {
|
|
303
|
-
console.error(
|
|
304
|
-
`Perp market ${idx} oracle slot regression: v2 slot ${oracle2.slot} < v1 slot ${oracle1.slot}`
|
|
305
|
-
);
|
|
306
|
-
} else if (
|
|
307
|
-
oracle1?.slot !== undefined &&
|
|
308
|
-
oracle2?.slot !== undefined &&
|
|
309
|
-
oracle2.slot > oracle1.slot
|
|
310
|
-
) {
|
|
311
|
-
console.info(
|
|
312
|
-
`Perp market ${idx} oracle slot is FASTER! v2: ${oracle2.slot}, v1: ${oracle1.slot}`
|
|
313
|
-
);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
// 7. Test getOraclePriceDataAndSlotForSpotMarket
|
|
318
|
-
for (const idx of spotMarketIndexes) {
|
|
319
|
-
const oracle1 =
|
|
320
|
-
clientV1.accountSubscriber.getOraclePriceDataAndSlotForSpotMarket(
|
|
321
|
-
idx
|
|
322
|
-
);
|
|
323
|
-
const oracle2 =
|
|
324
|
-
clientV2.accountSubscriber.getOraclePriceDataAndSlotForSpotMarket(
|
|
325
|
-
idx
|
|
326
|
-
);
|
|
327
|
-
// assert.deepStrictEqual(
|
|
328
|
-
// oracle1?.data,
|
|
329
|
-
// oracle2?.data,
|
|
330
|
-
// `Spot market ${idx} oracle data should match`
|
|
331
|
-
// );
|
|
332
|
-
// Note: slots might differ slightly due to timing
|
|
333
|
-
// assert.strictEqual(oracle1?.slot, oracle2?.slot, `Spot market ${idx} oracle slot should match`);
|
|
334
|
-
if (
|
|
335
|
-
oracle1?.slot !== undefined &&
|
|
336
|
-
oracle2?.slot !== undefined &&
|
|
337
|
-
oracle2.slot < oracle1.slot
|
|
338
|
-
) {
|
|
339
|
-
console.error(
|
|
340
|
-
`Spot market ${idx} oracle slot regression: v2 slot ${oracle2.slot} < v1 slot ${oracle1.slot}`
|
|
341
|
-
);
|
|
342
|
-
} else if (
|
|
343
|
-
oracle1?.slot !== undefined &&
|
|
344
|
-
oracle2?.slot !== undefined &&
|
|
345
|
-
oracle2.slot > oracle1.slot
|
|
346
|
-
) {
|
|
347
|
-
console.info(
|
|
348
|
-
`Spot market ${idx} oracle slot is FASTER! v2: ${oracle2.slot}, v1: ${oracle1.slot}`
|
|
349
|
-
);
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
console.log('✓ All comparisons passed');
|
|
354
|
-
} catch (error) {
|
|
355
|
-
console.error('✗ Comparison failed:', error);
|
|
356
|
-
}
|
|
357
|
-
};
|
|
358
|
-
|
|
359
|
-
compare();
|
|
360
|
-
const interval = setInterval(compare, 1000);
|
|
361
|
-
|
|
362
|
-
const cleanup = async () => {
|
|
363
|
-
clearInterval(interval);
|
|
364
|
-
await Promise.all([clientV1.unsubscribe(), clientV2.unsubscribe()]);
|
|
365
|
-
process.exit(0);
|
|
366
|
-
};
|
|
367
|
-
|
|
368
|
-
process.on('SIGINT', cleanup);
|
|
369
|
-
process.on('SIGTERM', cleanup);
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
initializeGrpcVelocityClientV2VersusV1().catch(console.error);
|