@metamask-previews/perps-controller 10.0.0-preview-ec4680201 → 10.0.0-preview-0dfe3b334
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/dist/PerpsController-method-action-types.cjs.map +1 -1
- package/dist/PerpsController-method-action-types.d.cts.map +1 -1
- package/dist/PerpsController-method-action-types.d.mts.map +1 -1
- package/dist/PerpsController-method-action-types.mjs.map +1 -1
- package/dist/PerpsController.cjs +163 -163
- package/dist/PerpsController.cjs.map +1 -1
- package/dist/PerpsController.d.cts.map +1 -1
- package/dist/PerpsController.d.mts.map +1 -1
- package/dist/PerpsController.mjs.map +1 -1
- package/dist/aggregation/SubscriptionMultiplexer.cjs +12 -12
- package/dist/aggregation/SubscriptionMultiplexer.cjs.map +1 -1
- package/dist/aggregation/SubscriptionMultiplexer.d.cts.map +1 -1
- package/dist/aggregation/SubscriptionMultiplexer.d.mts.map +1 -1
- package/dist/aggregation/SubscriptionMultiplexer.mjs.map +1 -1
- package/dist/aggregation/index.cjs +2 -2
- package/dist/aggregation/index.cjs.map +1 -1
- package/dist/aggregation/index.d.cts.map +1 -1
- package/dist/aggregation/index.d.mts.map +1 -1
- package/dist/aggregation/index.mjs.map +1 -1
- package/dist/constants/hyperLiquidConfig.cjs +73 -73
- package/dist/constants/hyperLiquidConfig.cjs.map +1 -1
- package/dist/constants/hyperLiquidConfig.d.cts.map +1 -1
- package/dist/constants/hyperLiquidConfig.d.mts.map +1 -1
- package/dist/constants/hyperLiquidConfig.mjs.map +1 -1
- package/dist/constants/index.cjs.map +1 -1
- package/dist/constants/index.d.cts.map +1 -1
- package/dist/constants/index.d.mts.map +1 -1
- package/dist/constants/index.mjs.map +1 -1
- package/dist/constants/myxConfig.cjs.map +1 -1
- package/dist/constants/myxConfig.d.cts.map +1 -1
- package/dist/constants/myxConfig.d.mts.map +1 -1
- package/dist/constants/myxConfig.mjs.map +1 -1
- package/dist/index.cjs +268 -268
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/providers/AggregatedPerpsProvider.cjs +7 -7
- package/dist/providers/AggregatedPerpsProvider.cjs.map +1 -1
- package/dist/providers/AggregatedPerpsProvider.d.cts.map +1 -1
- package/dist/providers/AggregatedPerpsProvider.d.mts.map +1 -1
- package/dist/providers/AggregatedPerpsProvider.mjs.map +1 -1
- package/dist/providers/HyperLiquidProvider.cjs +312 -312
- package/dist/providers/HyperLiquidProvider.cjs.map +1 -1
- package/dist/providers/HyperLiquidProvider.d.cts.map +1 -1
- package/dist/providers/HyperLiquidProvider.d.mts.map +1 -1
- package/dist/providers/HyperLiquidProvider.mjs +1 -1
- package/dist/providers/HyperLiquidProvider.mjs.map +1 -1
- package/dist/routing/ProviderRouter.cjs.map +1 -1
- package/dist/routing/ProviderRouter.d.cts.map +1 -1
- package/dist/routing/ProviderRouter.d.mts.map +1 -1
- package/dist/routing/ProviderRouter.mjs.map +1 -1
- package/dist/routing/index.cjs +2 -2
- package/dist/routing/index.cjs.map +1 -1
- package/dist/routing/index.d.cts.map +1 -1
- package/dist/routing/index.d.mts.map +1 -1
- package/dist/routing/index.mjs.map +1 -1
- package/dist/selectors.cjs +8 -8
- package/dist/selectors.cjs.map +1 -1
- package/dist/selectors.d.cts +12 -12
- package/dist/selectors.d.cts.map +1 -1
- package/dist/selectors.d.mts +12 -12
- package/dist/selectors.d.mts.map +1 -1
- package/dist/selectors.mjs.map +1 -1
- package/dist/services/AccountService.cjs +39 -39
- package/dist/services/AccountService.cjs.map +1 -1
- package/dist/services/AccountService.d.cts.map +1 -1
- package/dist/services/AccountService.d.mts.map +1 -1
- package/dist/services/AccountService.mjs.map +1 -1
- package/dist/services/AggregatedOrderBookConnection.cjs +3 -3
- package/dist/services/AggregatedOrderBookConnection.cjs.map +1 -1
- package/dist/services/AggregatedOrderBookConnection.d.cts.map +1 -1
- package/dist/services/AggregatedOrderBookConnection.d.mts.map +1 -1
- package/dist/services/AggregatedOrderBookConnection.mjs.map +1 -1
- package/dist/services/DataLakeService.cjs +18 -18
- package/dist/services/DataLakeService.cjs.map +1 -1
- package/dist/services/DataLakeService.d.cts.map +1 -1
- package/dist/services/DataLakeService.d.mts.map +1 -1
- package/dist/services/DataLakeService.mjs.map +1 -1
- package/dist/services/DepositService.cjs +8 -8
- package/dist/services/DepositService.cjs.map +1 -1
- package/dist/services/DepositService.d.cts.map +1 -1
- package/dist/services/DepositService.d.mts.map +1 -1
- package/dist/services/DepositService.mjs.map +1 -1
- package/dist/services/DexDiscoveryCacheManager.cjs +3 -3
- package/dist/services/DexDiscoveryCacheManager.cjs.map +1 -1
- package/dist/services/DexDiscoveryCacheManager.d.cts.map +1 -1
- package/dist/services/DexDiscoveryCacheManager.d.mts.map +1 -1
- package/dist/services/DexDiscoveryCacheManager.mjs.map +1 -1
- package/dist/services/EligibilityService.cjs +4 -4
- package/dist/services/EligibilityService.cjs.map +1 -1
- package/dist/services/EligibilityService.d.cts.map +1 -1
- package/dist/services/EligibilityService.d.mts.map +1 -1
- package/dist/services/EligibilityService.mjs.map +1 -1
- package/dist/services/FeatureFlagConfigurationService.cjs +13 -13
- package/dist/services/FeatureFlagConfigurationService.cjs.map +1 -1
- package/dist/services/FeatureFlagConfigurationService.d.cts.map +1 -1
- package/dist/services/FeatureFlagConfigurationService.d.mts.map +1 -1
- package/dist/services/FeatureFlagConfigurationService.mjs.map +1 -1
- package/dist/services/HyperLiquidClientService.cjs +69 -69
- package/dist/services/HyperLiquidClientService.cjs.map +1 -1
- package/dist/services/HyperLiquidClientService.d.cts +1 -1
- package/dist/services/HyperLiquidClientService.d.cts.map +1 -1
- package/dist/services/HyperLiquidClientService.d.mts +1 -1
- package/dist/services/HyperLiquidClientService.d.mts.map +1 -1
- package/dist/services/HyperLiquidClientService.mjs.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.cjs +86 -86
- package/dist/services/HyperLiquidSubscriptionService.cjs.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.d.cts +1 -1
- package/dist/services/HyperLiquidSubscriptionService.d.cts.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.d.mts +1 -1
- package/dist/services/HyperLiquidSubscriptionService.d.mts.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.mjs +1 -1
- package/dist/services/HyperLiquidSubscriptionService.mjs.map +1 -1
- package/dist/services/HyperLiquidWalletService.cjs +14 -14
- package/dist/services/HyperLiquidWalletService.cjs.map +1 -1
- package/dist/services/HyperLiquidWalletService.d.cts.map +1 -1
- package/dist/services/HyperLiquidWalletService.d.mts.map +1 -1
- package/dist/services/HyperLiquidWalletService.mjs.map +1 -1
- package/dist/services/MarketDataService.cjs +71 -71
- package/dist/services/MarketDataService.cjs.map +1 -1
- package/dist/services/MarketDataService.d.cts.map +1 -1
- package/dist/services/MarketDataService.d.mts.map +1 -1
- package/dist/services/MarketDataService.mjs.map +1 -1
- package/dist/services/RewardsIntegrationService.cjs +12 -12
- package/dist/services/RewardsIntegrationService.cjs.map +1 -1
- package/dist/services/RewardsIntegrationService.d.cts.map +1 -1
- package/dist/services/RewardsIntegrationService.d.mts.map +1 -1
- package/dist/services/RewardsIntegrationService.mjs.map +1 -1
- package/dist/services/ServiceContext.cjs.map +1 -1
- package/dist/services/ServiceContext.d.cts.map +1 -1
- package/dist/services/ServiceContext.d.mts.map +1 -1
- package/dist/services/ServiceContext.mjs.map +1 -1
- package/dist/services/TerminalMarketService.cjs +10 -10
- package/dist/services/TerminalMarketService.cjs.map +1 -1
- package/dist/services/TerminalMarketService.d.cts.map +1 -1
- package/dist/services/TerminalMarketService.d.mts.map +1 -1
- package/dist/services/TerminalMarketService.mjs.map +1 -1
- package/dist/services/TradingService.cjs +327 -327
- package/dist/services/TradingService.cjs.map +1 -1
- package/dist/services/TradingService.d.cts.map +1 -1
- package/dist/services/TradingService.d.mts.map +1 -1
- package/dist/services/TradingService.mjs.map +1 -1
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.cts.map +1 -1
- package/dist/types/index.d.mts.map +1 -1
- package/dist/types/index.mjs.map +1 -1
- package/dist/types/perps-types.cjs +1 -1
- package/dist/types/perps-types.cjs.map +1 -1
- package/dist/types/perps-types.d.cts.map +1 -1
- package/dist/types/perps-types.d.mts.map +1 -1
- package/dist/types/perps-types.mjs.map +1 -1
- package/dist/utils/accountUtils.cjs +7 -7
- package/dist/utils/accountUtils.cjs.map +1 -1
- package/dist/utils/accountUtils.d.cts +1 -1
- package/dist/utils/accountUtils.d.cts.map +1 -1
- package/dist/utils/accountUtils.d.mts +1 -1
- package/dist/utils/accountUtils.d.mts.map +1 -1
- package/dist/utils/accountUtils.mjs.map +1 -1
- package/dist/utils/coalescePerpsRestRequest.cjs +2 -2
- package/dist/utils/coalescePerpsRestRequest.cjs.map +1 -1
- package/dist/utils/coalescePerpsRestRequest.mjs.map +1 -1
- package/dist/utils/errorUtils.cjs +2 -2
- package/dist/utils/errorUtils.cjs.map +1 -1
- package/dist/utils/errorUtils.mjs.map +1 -1
- package/dist/utils/hyperLiquidAbstraction.cjs.map +1 -1
- package/dist/utils/hyperLiquidAbstraction.d.cts.map +1 -1
- package/dist/utils/hyperLiquidAbstraction.d.mts.map +1 -1
- package/dist/utils/hyperLiquidAbstraction.mjs.map +1 -1
- package/dist/utils/hyperLiquidAdapter.cjs +9 -9
- package/dist/utils/hyperLiquidAdapter.cjs.map +1 -1
- package/dist/utils/hyperLiquidAdapter.d.cts +1 -1
- package/dist/utils/hyperLiquidAdapter.d.cts.map +1 -1
- package/dist/utils/hyperLiquidAdapter.d.mts +1 -1
- package/dist/utils/hyperLiquidAdapter.d.mts.map +1 -1
- package/dist/utils/hyperLiquidAdapter.mjs.map +1 -1
- package/dist/utils/hyperLiquidOrderBookProcessor.cjs.map +1 -1
- package/dist/utils/hyperLiquidOrderBookProcessor.d.cts.map +1 -1
- package/dist/utils/hyperLiquidOrderBookProcessor.d.mts.map +1 -1
- package/dist/utils/hyperLiquidOrderBookProcessor.mjs.map +1 -1
- package/dist/utils/hyperLiquidValidation.cjs +38 -38
- package/dist/utils/hyperLiquidValidation.cjs.map +1 -1
- package/dist/utils/hyperLiquidValidation.d.cts.map +1 -1
- package/dist/utils/hyperLiquidValidation.d.mts.map +1 -1
- package/dist/utils/hyperLiquidValidation.mjs.map +1 -1
- package/dist/utils/index.cjs +12 -12
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.cts.map +1 -1
- package/dist/utils/index.d.mts.map +1 -1
- package/dist/utils/index.mjs.map +1 -1
- package/dist/utils/marketDataTransform.cjs +11 -11
- package/dist/utils/marketDataTransform.cjs.map +1 -1
- package/dist/utils/marketDataTransform.d.cts +1 -1
- package/dist/utils/marketDataTransform.d.cts.map +1 -1
- package/dist/utils/marketDataTransform.d.mts +1 -1
- package/dist/utils/marketDataTransform.d.mts.map +1 -1
- package/dist/utils/marketDataTransform.mjs.map +1 -1
- package/dist/utils/marketSearch.cjs.map +1 -1
- package/dist/utils/marketSearch.d.cts.map +1 -1
- package/dist/utils/marketSearch.d.mts.map +1 -1
- package/dist/utils/marketSearch.mjs.map +1 -1
- package/dist/utils/marketUtils.cjs +2 -2
- package/dist/utils/marketUtils.cjs.map +1 -1
- package/dist/utils/marketUtils.d.cts.map +1 -1
- package/dist/utils/marketUtils.d.mts.map +1 -1
- package/dist/utils/marketUtils.mjs.map +1 -1
- package/dist/utils/myxAdapter.cjs +44 -44
- package/dist/utils/myxAdapter.cjs.map +1 -1
- package/dist/utils/myxAdapter.d.cts.map +1 -1
- package/dist/utils/myxAdapter.d.mts.map +1 -1
- package/dist/utils/myxAdapter.mjs.map +1 -1
- package/dist/utils/orderCalculations.cjs +17 -17
- package/dist/utils/orderCalculations.cjs.map +1 -1
- package/dist/utils/orderCalculations.d.cts +1 -1
- package/dist/utils/orderCalculations.d.cts.map +1 -1
- package/dist/utils/orderCalculations.d.mts +1 -1
- package/dist/utils/orderCalculations.d.mts.map +1 -1
- package/dist/utils/orderCalculations.mjs.map +1 -1
- package/dist/utils/perpsDiskPersistence.cjs +16 -16
- package/dist/utils/perpsDiskPersistence.cjs.map +1 -1
- package/dist/utils/perpsDiskPersistence.d.cts.map +1 -1
- package/dist/utils/perpsDiskPersistence.d.mts.map +1 -1
- package/dist/utils/perpsDiskPersistence.mjs.map +1 -1
- package/dist/utils/perpsFormatters.cjs +9 -9
- package/dist/utils/perpsFormatters.cjs.map +1 -1
- package/dist/utils/perpsFormatters.mjs.map +1 -1
- package/dist/utils/rewardsUtils.cjs +3 -3
- package/dist/utils/rewardsUtils.cjs.map +1 -1
- package/dist/utils/rewardsUtils.d.cts.map +1 -1
- package/dist/utils/rewardsUtils.d.mts.map +1 -1
- package/dist/utils/rewardsUtils.mjs.map +1 -1
- package/dist/utils/significantFigures.cjs +3 -3
- package/dist/utils/significantFigures.cjs.map +1 -1
- package/dist/utils/significantFigures.mjs.map +1 -1
- package/dist/utils/sortMarkets.cjs +8 -8
- package/dist/utils/sortMarkets.cjs.map +1 -1
- package/dist/utils/sortMarkets.d.cts.map +1 -1
- package/dist/utils/sortMarkets.d.mts.map +1 -1
- package/dist/utils/sortMarkets.mjs.map +1 -1
- package/dist/utils/standaloneInfoClient.cjs +2 -2
- package/dist/utils/standaloneInfoClient.cjs.map +1 -1
- package/dist/utils/standaloneInfoClient.d.cts.map +1 -1
- package/dist/utils/standaloneInfoClient.d.mts.map +1 -1
- package/dist/utils/standaloneInfoClient.mjs.map +1 -1
- package/package.json +3 -3
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.validateCoinExists = exports.validateOrderParams = exports.getMaxOrderValue = exports.getSupportedPaths = exports.applyPathFilters = exports.validateBalance = exports.validateAssetSupport = exports.validateDepositParams = exports.validateWithdrawalParams = exports.createErrorResult = void 0;
|
|
4
4
|
const utils_1 = require("@metamask/utils");
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
5
|
+
const hyperLiquidConfig_js_1 = require("../constants/hyperLiquidConfig.cjs");
|
|
6
|
+
const perpsConfig_js_1 = require("../constants/perpsConfig.cjs");
|
|
7
|
+
const perpsErrorCodes_js_1 = require("../perpsErrorCodes.cjs");
|
|
8
8
|
/**
|
|
9
9
|
* Validation utilities for HyperLiquid operations
|
|
10
10
|
*/
|
|
@@ -19,7 +19,7 @@ function createErrorResult(error, defaultResponse) {
|
|
|
19
19
|
return {
|
|
20
20
|
...defaultResponse,
|
|
21
21
|
success: false,
|
|
22
|
-
error: error instanceof Error ? error.message :
|
|
22
|
+
error: error instanceof Error ? error.message : perpsErrorCodes_js_1.PERPS_ERROR_CODES.UNKNOWN_ERROR,
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
25
|
exports.createErrorResult = createErrorResult;
|
|
@@ -43,48 +43,48 @@ function validateWithdrawalParams(params, debugLogger) {
|
|
|
43
43
|
// Validate required parameters
|
|
44
44
|
if (!params.assetId) {
|
|
45
45
|
debugLogger?.log('validateWithdrawalParams: Missing assetId', {
|
|
46
|
-
error:
|
|
46
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.WITHDRAW_ASSET_ID_REQUIRED,
|
|
47
47
|
params,
|
|
48
48
|
});
|
|
49
49
|
return {
|
|
50
50
|
isValid: false,
|
|
51
|
-
error:
|
|
51
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.WITHDRAW_ASSET_ID_REQUIRED,
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
54
|
// Validate amount
|
|
55
55
|
if (!params.amount) {
|
|
56
56
|
debugLogger?.log('validateWithdrawalParams: Missing amount', {
|
|
57
|
-
error:
|
|
57
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.WITHDRAW_AMOUNT_REQUIRED,
|
|
58
58
|
params,
|
|
59
59
|
});
|
|
60
60
|
return {
|
|
61
61
|
isValid: false,
|
|
62
|
-
error:
|
|
62
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.WITHDRAW_AMOUNT_REQUIRED,
|
|
63
63
|
};
|
|
64
64
|
}
|
|
65
65
|
const amount = parseFloat(params.amount);
|
|
66
66
|
if (isNaN(amount) || amount <= 0) {
|
|
67
67
|
debugLogger?.log('validateWithdrawalParams: Invalid amount', {
|
|
68
|
-
error:
|
|
68
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.WITHDRAW_AMOUNT_POSITIVE,
|
|
69
69
|
amount: params.amount,
|
|
70
70
|
parsedAmount: amount,
|
|
71
71
|
isNaN: isNaN(amount),
|
|
72
72
|
});
|
|
73
73
|
return {
|
|
74
74
|
isValid: false,
|
|
75
|
-
error:
|
|
75
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.WITHDRAW_AMOUNT_POSITIVE,
|
|
76
76
|
};
|
|
77
77
|
}
|
|
78
78
|
// Validate destination address if provided
|
|
79
79
|
if (params.destination && !(0, utils_1.isValidHexAddress)(params.destination)) {
|
|
80
80
|
debugLogger?.log('validateWithdrawalParams: Invalid destination address', {
|
|
81
|
-
error:
|
|
81
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.WITHDRAW_INVALID_DESTINATION,
|
|
82
82
|
destination: params.destination,
|
|
83
83
|
isValidHex: (0, utils_1.isValidHexAddress)(params.destination),
|
|
84
84
|
});
|
|
85
85
|
return {
|
|
86
86
|
isValid: false,
|
|
87
|
-
error:
|
|
87
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.WITHDRAW_INVALID_DESTINATION,
|
|
88
88
|
};
|
|
89
89
|
}
|
|
90
90
|
debugLogger?.log('validateWithdrawalParams: All validations passed', {
|
|
@@ -115,42 +115,42 @@ function validateDepositParams(params, debugLogger) {
|
|
|
115
115
|
// Validate required parameters
|
|
116
116
|
if (!params.assetId) {
|
|
117
117
|
debugLogger?.log('validateDepositParams: Missing assetId', {
|
|
118
|
-
error:
|
|
118
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.DEPOSIT_ASSET_ID_REQUIRED,
|
|
119
119
|
params,
|
|
120
120
|
});
|
|
121
121
|
return {
|
|
122
122
|
isValid: false,
|
|
123
|
-
error:
|
|
123
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.DEPOSIT_ASSET_ID_REQUIRED,
|
|
124
124
|
};
|
|
125
125
|
}
|
|
126
126
|
// Validate amount
|
|
127
127
|
if (!params.amount) {
|
|
128
128
|
debugLogger?.log('validateDepositParams: Missing amount', {
|
|
129
|
-
error:
|
|
129
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.DEPOSIT_AMOUNT_REQUIRED,
|
|
130
130
|
params,
|
|
131
131
|
});
|
|
132
132
|
return {
|
|
133
133
|
isValid: false,
|
|
134
|
-
error:
|
|
134
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.DEPOSIT_AMOUNT_REQUIRED,
|
|
135
135
|
};
|
|
136
136
|
}
|
|
137
137
|
const amount = parseFloat(params.amount);
|
|
138
138
|
if (isNaN(amount) || amount <= 0) {
|
|
139
139
|
debugLogger?.log('validateDepositParams: Invalid amount', {
|
|
140
|
-
error:
|
|
140
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.DEPOSIT_AMOUNT_POSITIVE,
|
|
141
141
|
amount: params.amount,
|
|
142
142
|
parsedAmount: amount,
|
|
143
143
|
isNaN: isNaN(amount),
|
|
144
144
|
});
|
|
145
145
|
return {
|
|
146
146
|
isValid: false,
|
|
147
|
-
error:
|
|
147
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.DEPOSIT_AMOUNT_POSITIVE,
|
|
148
148
|
};
|
|
149
149
|
}
|
|
150
150
|
// Check minimum deposit amount
|
|
151
151
|
const minimumAmount = params.isTestnet
|
|
152
|
-
?
|
|
153
|
-
:
|
|
152
|
+
? hyperLiquidConfig_js_1.TRADING_DEFAULTS.amount.testnet
|
|
153
|
+
: hyperLiquidConfig_js_1.TRADING_DEFAULTS.amount.mainnet;
|
|
154
154
|
debugLogger?.log('validateDepositParams: Checking minimum amount', {
|
|
155
155
|
amount,
|
|
156
156
|
minimumAmount,
|
|
@@ -159,14 +159,14 @@ function validateDepositParams(params, debugLogger) {
|
|
|
159
159
|
});
|
|
160
160
|
if (amount < minimumAmount) {
|
|
161
161
|
debugLogger?.log('validateDepositParams: Below minimum deposit', {
|
|
162
|
-
error:
|
|
162
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.DEPOSIT_MINIMUM_AMOUNT,
|
|
163
163
|
amount,
|
|
164
164
|
minimumAmount,
|
|
165
165
|
difference: minimumAmount - amount,
|
|
166
166
|
});
|
|
167
167
|
return {
|
|
168
168
|
isValid: false,
|
|
169
|
-
error:
|
|
169
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.DEPOSIT_MINIMUM_AMOUNT,
|
|
170
170
|
};
|
|
171
171
|
}
|
|
172
172
|
debugLogger?.log('validateDepositParams: All validations passed', {
|
|
@@ -200,14 +200,14 @@ function validateAssetSupport(assetId, supportedRoutes, debugLogger) {
|
|
|
200
200
|
const isSupportedCaseInsensitive = supportedAssetIds.some((supportedId) => supportedId.toLowerCase() === assetId.toLowerCase());
|
|
201
201
|
if (!isSupportedCaseInsensitive) {
|
|
202
202
|
debugLogger?.log('validateAssetSupport: Asset not supported', {
|
|
203
|
-
error:
|
|
203
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.WITHDRAW_ASSET_NOT_SUPPORTED,
|
|
204
204
|
assetId,
|
|
205
205
|
supportedAssetIds,
|
|
206
206
|
checkedCaseInsensitive: true,
|
|
207
207
|
});
|
|
208
208
|
return {
|
|
209
209
|
isValid: false,
|
|
210
|
-
error:
|
|
210
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.WITHDRAW_ASSET_NOT_SUPPORTED,
|
|
211
211
|
};
|
|
212
212
|
}
|
|
213
213
|
debugLogger?.log('⚠️ validateAssetSupport: Asset supported with case mismatch', {
|
|
@@ -238,7 +238,7 @@ function validateBalance(withdrawAmount, withdrawableBalance, debugLogger) {
|
|
|
238
238
|
if (withdrawAmount > withdrawableBalance) {
|
|
239
239
|
const shortfall = withdrawAmount - withdrawableBalance;
|
|
240
240
|
debugLogger?.log('validateBalance: Insufficient balance', {
|
|
241
|
-
error:
|
|
241
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.WITHDRAW_INSUFFICIENT_BALANCE,
|
|
242
242
|
withdrawAmount,
|
|
243
243
|
withdrawableBalance,
|
|
244
244
|
shortfall,
|
|
@@ -246,7 +246,7 @@ function validateBalance(withdrawAmount, withdrawableBalance, debugLogger) {
|
|
|
246
246
|
});
|
|
247
247
|
return {
|
|
248
248
|
isValid: false,
|
|
249
|
-
error:
|
|
249
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.WITHDRAW_INSUFFICIENT_BALANCE,
|
|
250
250
|
};
|
|
251
251
|
}
|
|
252
252
|
const remainingBalance = withdrawableBalance - withdrawAmount;
|
|
@@ -290,8 +290,8 @@ function applyPathFilters(assets, params, debugLogger) {
|
|
|
290
290
|
// `keyof typeof` for indexed access; `hasProperty` types the indexed
|
|
291
291
|
// result as `unknown` and loses the `{ testnet, mainnet }` shape.
|
|
292
292
|
/* eslint-disable-next-line no-restricted-syntax */
|
|
293
|
-
if (params.symbol && params.symbol in
|
|
294
|
-
const config =
|
|
293
|
+
if (params.symbol && params.symbol in hyperLiquidConfig_js_1.HYPERLIQUID_ASSET_CONFIGS) {
|
|
294
|
+
const config = hyperLiquidConfig_js_1.HYPERLIQUID_ASSET_CONFIGS[params.symbol];
|
|
295
295
|
const isTestnet = params.isTestnet ?? false;
|
|
296
296
|
const selectedAsset = isTestnet ? config.testnet : config.mainnet;
|
|
297
297
|
const before = filtered;
|
|
@@ -334,7 +334,7 @@ exports.applyPathFilters = applyPathFilters;
|
|
|
334
334
|
*/
|
|
335
335
|
function getSupportedPaths(params, debugLogger) {
|
|
336
336
|
const isTestnet = params?.isTestnet ?? false;
|
|
337
|
-
const assets = (0,
|
|
337
|
+
const assets = (0, hyperLiquidConfig_js_1.getSupportedAssets)(isTestnet);
|
|
338
338
|
const filteredAssets = applyPathFilters(assets, params, debugLogger);
|
|
339
339
|
debugLogger?.log('HyperLiquid: getSupportedPaths', {
|
|
340
340
|
isTestnet,
|
|
@@ -358,19 +358,19 @@ exports.getSupportedPaths = getSupportedPaths;
|
|
|
358
358
|
function getMaxOrderValue(maxLeverage, orderType) {
|
|
359
359
|
let marketLimit;
|
|
360
360
|
if (maxLeverage >= 25) {
|
|
361
|
-
marketLimit =
|
|
361
|
+
marketLimit = perpsConfig_js_1.HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.HighLeverage;
|
|
362
362
|
}
|
|
363
363
|
else if (maxLeverage >= 20) {
|
|
364
|
-
marketLimit =
|
|
364
|
+
marketLimit = perpsConfig_js_1.HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.MediumHighLeverage;
|
|
365
365
|
}
|
|
366
366
|
else if (maxLeverage >= 10) {
|
|
367
|
-
marketLimit =
|
|
367
|
+
marketLimit = perpsConfig_js_1.HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.MediumLeverage;
|
|
368
368
|
}
|
|
369
369
|
else {
|
|
370
|
-
marketLimit =
|
|
370
|
+
marketLimit = perpsConfig_js_1.HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.LowLeverage;
|
|
371
371
|
}
|
|
372
372
|
return orderType === 'limit'
|
|
373
|
-
? marketLimit *
|
|
373
|
+
? marketLimit * perpsConfig_js_1.HYPERLIQUID_ORDER_LIMITS.LimitOrderMultiplier
|
|
374
374
|
: marketLimit;
|
|
375
375
|
}
|
|
376
376
|
exports.getMaxOrderValue = getMaxOrderValue;
|
|
@@ -390,7 +390,7 @@ function validateOrderParams(params) {
|
|
|
390
390
|
if (!params.coin) {
|
|
391
391
|
return {
|
|
392
392
|
isValid: false,
|
|
393
|
-
error:
|
|
393
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.ORDER_COIN_REQUIRED,
|
|
394
394
|
};
|
|
395
395
|
}
|
|
396
396
|
// Note: Size validation removed - validateOrder handles amount validation using USD as source of truth
|
|
@@ -398,13 +398,13 @@ function validateOrderParams(params) {
|
|
|
398
398
|
if (params.orderType === 'limit' && !params.price) {
|
|
399
399
|
return {
|
|
400
400
|
isValid: false,
|
|
401
|
-
error:
|
|
401
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.ORDER_LIMIT_PRICE_REQUIRED,
|
|
402
402
|
};
|
|
403
403
|
}
|
|
404
404
|
if (params.price && parseFloat(params.price) <= 0) {
|
|
405
405
|
return {
|
|
406
406
|
isValid: false,
|
|
407
|
-
error:
|
|
407
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.ORDER_PRICE_POSITIVE,
|
|
408
408
|
};
|
|
409
409
|
}
|
|
410
410
|
return { isValid: true };
|
|
@@ -421,7 +421,7 @@ function validateCoinExists(coin, coinToAssetId) {
|
|
|
421
421
|
if (!coinToAssetId.has(coin)) {
|
|
422
422
|
return {
|
|
423
423
|
isValid: false,
|
|
424
|
-
error:
|
|
424
|
+
error: perpsErrorCodes_js_1.PERPS_ERROR_CODES.ORDER_UNKNOWN_COIN,
|
|
425
425
|
};
|
|
426
426
|
}
|
|
427
427
|
return { isValid: true };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hyperLiquidValidation.cjs","sourceRoot":"","sources":["../../src/utils/hyperLiquidValidation.ts"],"names":[],"mappings":"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","sourcesContent":["import { isValidHexAddress } from '@metamask/utils';\nimport type { CaipAssetId, Hex } from '@metamask/utils';\n\nimport {\n HYPERLIQUID_ASSET_CONFIGS,\n getSupportedAssets,\n TRADING_DEFAULTS,\n} from '../constants/hyperLiquidConfig';\nimport { HYPERLIQUID_ORDER_LIMITS } from '../constants/perpsConfig';\nimport { PERPS_ERROR_CODES } from '../perpsErrorCodes';\nimport type { GetSupportedPathsParams, PerpsDebugLogger } from '../types';\n\n/**\n * Optional debug logger for validation functions.\n * When provided, enables detailed logging for debugging.\n * When omitted, validation runs silently.\n */\nexport type ValidationDebugLogger = PerpsDebugLogger | undefined;\n\n/**\n * Validation utilities for HyperLiquid operations\n */\n\n/**\n * Create standardized error response.\n *\n * @param error - The error that occurred\n * @param defaultResponse - The default response object to use as template\n * @returns The error response with success=false and error message\n */\nexport function createErrorResult<\n TValue extends { success: boolean; error?: string },\n>(error: unknown, defaultResponse: TValue): TValue {\n return {\n ...defaultResponse,\n success: false,\n error:\n error instanceof Error ? error.message : PERPS_ERROR_CODES.UNKNOWN_ERROR,\n };\n}\n\n/**\n * Validate withdrawal parameters.\n *\n * @param params - Withdrawal parameters to validate\n * @param params.assetId - The CAIP asset ID to withdraw\n * @param params.amount - Amount to withdraw as string\n * @param params.destination - Optional destination hex address\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateWithdrawalParams(\n params: {\n assetId?: CaipAssetId;\n amount?: string;\n destination?: Hex;\n },\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateWithdrawalParams: Starting validation', {\n params,\n hasAssetId: Boolean(params.assetId),\n hasAmount: Boolean(params.amount),\n hasDestination: Boolean(params.destination),\n });\n\n // Validate required parameters\n if (!params.assetId) {\n debugLogger?.log('validateWithdrawalParams: Missing assetId', {\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_ID_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_ID_REQUIRED,\n };\n }\n\n // Validate amount\n if (!params.amount) {\n debugLogger?.log('validateWithdrawalParams: Missing amount', {\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_REQUIRED,\n };\n }\n\n const amount = parseFloat(params.amount);\n if (isNaN(amount) || amount <= 0) {\n debugLogger?.log('validateWithdrawalParams: Invalid amount', {\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_POSITIVE,\n amount: params.amount,\n parsedAmount: amount,\n isNaN: isNaN(amount),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_POSITIVE,\n };\n }\n\n // Validate destination address if provided\n if (params.destination && !isValidHexAddress(params.destination)) {\n debugLogger?.log('validateWithdrawalParams: Invalid destination address', {\n error: PERPS_ERROR_CODES.WITHDRAW_INVALID_DESTINATION,\n destination: params.destination,\n isValidHex: isValidHexAddress(params.destination),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_INVALID_DESTINATION,\n };\n }\n\n debugLogger?.log('validateWithdrawalParams: All validations passed', {\n assetId: params.assetId,\n amount: params.amount,\n destination: params.destination ?? 'will use user wallet',\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate deposit parameters.\n *\n * @param params - Deposit parameters to validate\n * @param params.assetId - The CAIP asset ID to deposit\n * @param params.amount - Amount to deposit as string\n * @param params.isTestnet - Whether this is a testnet deposit\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateDepositParams(\n params: {\n assetId?: CaipAssetId;\n amount?: string;\n isTestnet?: boolean;\n },\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateDepositParams: Starting validation', {\n params,\n hasAssetId: Boolean(params.assetId),\n hasAmount: Boolean(params.amount),\n isTestnet: params.isTestnet,\n });\n\n // Validate required parameters\n if (!params.assetId) {\n debugLogger?.log('validateDepositParams: Missing assetId', {\n error: PERPS_ERROR_CODES.DEPOSIT_ASSET_ID_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_ASSET_ID_REQUIRED,\n };\n }\n\n // Validate amount\n if (!params.amount) {\n debugLogger?.log('validateDepositParams: Missing amount', {\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_REQUIRED,\n };\n }\n\n const amount = parseFloat(params.amount);\n if (isNaN(amount) || amount <= 0) {\n debugLogger?.log('validateDepositParams: Invalid amount', {\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_POSITIVE,\n amount: params.amount,\n parsedAmount: amount,\n isNaN: isNaN(amount),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_POSITIVE,\n };\n }\n\n // Check minimum deposit amount\n const minimumAmount = params.isTestnet\n ? TRADING_DEFAULTS.amount.testnet\n : TRADING_DEFAULTS.amount.mainnet;\n\n debugLogger?.log('validateDepositParams: Checking minimum amount', {\n amount,\n minimumAmount,\n isTestnet: params.isTestnet,\n network: params.isTestnet ? 'testnet' : 'mainnet',\n });\n\n if (amount < minimumAmount) {\n debugLogger?.log('validateDepositParams: Below minimum deposit', {\n error: PERPS_ERROR_CODES.DEPOSIT_MINIMUM_AMOUNT,\n amount,\n minimumAmount,\n difference: minimumAmount - amount,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_MINIMUM_AMOUNT,\n };\n }\n\n debugLogger?.log('validateDepositParams: All validations passed', {\n assetId: params.assetId,\n amount: params.amount,\n parsedAmount: amount,\n minimumAmount,\n isTestnet: params.isTestnet,\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate asset support for withdrawals using AssetRoute arrays.\n *\n * @param assetId - The CAIP asset ID to validate\n * @param supportedRoutes - Array of supported asset routes\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateAssetSupport(\n assetId: CaipAssetId,\n supportedRoutes: { assetId: CaipAssetId }[],\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateAssetSupport: Checking asset support', {\n assetId,\n supportedRoutesCount: supportedRoutes.length,\n });\n\n const supportedAssetIds = supportedRoutes.map((route) => route.assetId);\n\n // Check if asset is supported\n const isSupported = supportedAssetIds.includes(assetId);\n\n if (!isSupported) {\n // Also check case-insensitive match for contract addresses\n const isSupportedCaseInsensitive = supportedAssetIds.some(\n (supportedId) => supportedId.toLowerCase() === assetId.toLowerCase(),\n );\n\n if (!isSupportedCaseInsensitive) {\n debugLogger?.log('validateAssetSupport: Asset not supported', {\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_NOT_SUPPORTED,\n assetId,\n supportedAssetIds,\n checkedCaseInsensitive: true,\n });\n\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_NOT_SUPPORTED,\n };\n }\n\n debugLogger?.log(\n '⚠️ validateAssetSupport: Asset supported with case mismatch',\n {\n providedAssetId: assetId,\n matchedAssetId: supportedAssetIds.find(\n (id) => id.toLowerCase() === assetId.toLowerCase(),\n ),\n },\n );\n }\n\n debugLogger?.log('validateAssetSupport: Asset is supported', {\n assetId,\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate balance against withdrawal amount.\n *\n * @param withdrawAmount - The amount to withdraw\n * @param withdrawableBalance - Max USD that can leave the venue right now\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateBalance(\n withdrawAmount: number,\n withdrawableBalance: number,\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateBalance: Checking balance sufficiency', {\n withdrawAmount,\n withdrawableBalance,\n difference: withdrawableBalance - withdrawAmount,\n });\n\n if (withdrawAmount > withdrawableBalance) {\n const shortfall = withdrawAmount - withdrawableBalance;\n\n debugLogger?.log('validateBalance: Insufficient balance', {\n error: PERPS_ERROR_CODES.WITHDRAW_INSUFFICIENT_BALANCE,\n withdrawAmount,\n withdrawableBalance,\n shortfall,\n percentageOfAvailable: `${((withdrawAmount / withdrawableBalance) * 100).toFixed(2)}%`,\n });\n\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_INSUFFICIENT_BALANCE,\n };\n }\n\n const remainingBalance = withdrawableBalance - withdrawAmount;\n debugLogger?.log('validateBalance: Balance is sufficient', {\n withdrawAmount,\n withdrawableBalance,\n remainingBalance,\n percentageUsed: `${((withdrawAmount / withdrawableBalance) * 100).toFixed(2)}%`,\n });\n\n return { isValid: true };\n}\n\n/**\n * Apply filters to asset paths with comprehensive logging.\n *\n * @param assets - Array of CAIP asset IDs to filter\n * @param params - Filter parameters including chainId, symbol, and assetId\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Filtered array of CAIP asset IDs\n */\nexport function applyPathFilters(\n assets: CaipAssetId[],\n params?: GetSupportedPathsParams,\n debugLogger?: ValidationDebugLogger,\n): CaipAssetId[] {\n if (!params) {\n debugLogger?.log(\n 'HyperLiquid: applyPathFilters - no params, returning all assets',\n { assets },\n );\n return assets;\n }\n\n let filtered = assets;\n\n debugLogger?.log('HyperLiquid: applyPathFilters - starting filter', {\n initialAssets: assets,\n filterParams: params,\n });\n\n if (params.chainId) {\n const before = filtered;\n filtered = filtered.filter((asset) =>\n asset.startsWith(params.chainId as string),\n );\n debugLogger?.log('HyperLiquid: applyPathFilters - chainId filter', {\n chainId: params.chainId,\n before,\n after: filtered,\n });\n }\n\n // Note: `in` is the idiomatic TypeScript way to narrow a string to\n // `keyof typeof` for indexed access; `hasProperty` types the indexed\n // result as `unknown` and loses the `{ testnet, mainnet }` shape.\n /* eslint-disable-next-line no-restricted-syntax */\n if (params.symbol && params.symbol in HYPERLIQUID_ASSET_CONFIGS) {\n const config =\n HYPERLIQUID_ASSET_CONFIGS[\n params.symbol as keyof typeof HYPERLIQUID_ASSET_CONFIGS\n ];\n const isTestnet = params.isTestnet ?? false;\n const selectedAsset = isTestnet ? config.testnet : config.mainnet;\n const before = filtered;\n filtered = [selectedAsset];\n debugLogger?.log('HyperLiquid: applyPathFilters - symbol filter', {\n symbol: params.symbol,\n isTestnet,\n config,\n selectedAsset,\n before,\n after: filtered,\n });\n }\n\n if (params.assetId) {\n const before = filtered;\n // Use case-insensitive comparison for asset ID matching to handle address case differences\n filtered = filtered.filter(\n (asset) => asset.toLowerCase() === params.assetId?.toLowerCase(),\n );\n debugLogger?.log('HyperLiquid: applyPathFilters - assetId filter', {\n assetId: params.assetId,\n before,\n after: filtered,\n exactMatch: before.includes(params.assetId),\n caseInsensitiveMatch: before.some(\n (asset) => asset.toLowerCase() === params.assetId?.toLowerCase(),\n ),\n });\n }\n\n debugLogger?.log('HyperLiquid: applyPathFilters - final result', {\n initialAssets: assets,\n finalFiltered: filtered,\n filterParams: params,\n });\n\n return filtered;\n}\n\n/**\n * Get supported deposit/withdrawal paths with filtering.\n *\n * @param params - Filter parameters including isTestnet, chainId, symbol\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Array of supported CAIP asset IDs\n */\nexport function getSupportedPaths(\n params?: GetSupportedPathsParams,\n debugLogger?: ValidationDebugLogger,\n): CaipAssetId[] {\n const isTestnet = params?.isTestnet ?? false;\n const assets = getSupportedAssets(isTestnet);\n const filteredAssets = applyPathFilters(assets, params, debugLogger);\n\n debugLogger?.log('HyperLiquid: getSupportedPaths', {\n isTestnet,\n requestedParams: params,\n allAssets: assets,\n filteredAssets,\n returnType: 'CaipAssetId[]',\n example: filteredAssets[0],\n });\n\n return filteredAssets;\n}\n\n/**\n * Get maximum order value based on leverage and order type.\n * Based on HyperLiquid contract specifications.\n *\n * @param maxLeverage - The maximum leverage for the market\n * @param orderType - The order type (market or limit)\n * @returns Maximum order value in USD\n */\nexport function getMaxOrderValue(\n maxLeverage: number,\n orderType: 'market' | 'limit',\n): number {\n let marketLimit: number;\n\n if (maxLeverage >= 25) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.HighLeverage;\n } else if (maxLeverage >= 20) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.MediumHighLeverage;\n } else if (maxLeverage >= 10) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.MediumLeverage;\n } else {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.LowLeverage;\n }\n\n return orderType === 'limit'\n ? marketLimit * HYPERLIQUID_ORDER_LIMITS.LimitOrderMultiplier\n : marketLimit;\n}\n\n/**\n * Validate order parameters.\n * Basic validation - checks required fields are present.\n * Amount validation (size/USD) is handled by validateOrder.\n *\n * @param params - Order parameters to validate\n * @param params.coin - The trading pair coin symbol\n * @param params.size - The order size as string\n * @param params.price - The order price as string\n * @param params.orderType - The order type (market or limit)\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateOrderParams(params: {\n coin?: string;\n size?: string;\n price?: string;\n orderType?: 'market' | 'limit';\n}): { isValid: boolean; error?: string } {\n if (!params.coin) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_COIN_REQUIRED,\n };\n }\n\n // Note: Size validation removed - validateOrder handles amount validation using USD as source of truth\n\n // Require price for limit orders\n if (params.orderType === 'limit' && !params.price) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_LIMIT_PRICE_REQUIRED,\n };\n }\n\n if (params.price && parseFloat(params.price) <= 0) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_PRICE_POSITIVE,\n };\n }\n\n return { isValid: true };\n}\n\n/**\n * Validate coin exists in asset mapping.\n *\n * @param coin - The coin symbol to validate\n * @param coinToAssetId - Map of coin symbols to asset IDs\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateCoinExists(\n coin: string,\n coinToAssetId: Map<string, number>,\n): { isValid: boolean; error?: string } {\n if (!coinToAssetId.has(coin)) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_UNKNOWN_COIN,\n };\n }\n\n return { isValid: true };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"hyperLiquidValidation.cjs","sourceRoot":"","sources":["../../src/utils/hyperLiquidValidation.ts"],"names":[],"mappings":"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","sourcesContent":["import { isValidHexAddress } from '@metamask/utils';\nimport type { CaipAssetId, Hex } from '@metamask/utils';\n\nimport {\n HYPERLIQUID_ASSET_CONFIGS,\n getSupportedAssets,\n TRADING_DEFAULTS,\n} from '../constants/hyperLiquidConfig.js';\nimport { HYPERLIQUID_ORDER_LIMITS } from '../constants/perpsConfig.js';\nimport { PERPS_ERROR_CODES } from '../perpsErrorCodes.js';\nimport type {\n GetSupportedPathsParams,\n PerpsDebugLogger,\n} from '../types/index.js';\n\n/**\n * Optional debug logger for validation functions.\n * When provided, enables detailed logging for debugging.\n * When omitted, validation runs silently.\n */\nexport type ValidationDebugLogger = PerpsDebugLogger | undefined;\n\n/**\n * Validation utilities for HyperLiquid operations\n */\n\n/**\n * Create standardized error response.\n *\n * @param error - The error that occurred\n * @param defaultResponse - The default response object to use as template\n * @returns The error response with success=false and error message\n */\nexport function createErrorResult<\n TValue extends { success: boolean; error?: string },\n>(error: unknown, defaultResponse: TValue): TValue {\n return {\n ...defaultResponse,\n success: false,\n error:\n error instanceof Error ? error.message : PERPS_ERROR_CODES.UNKNOWN_ERROR,\n };\n}\n\n/**\n * Validate withdrawal parameters.\n *\n * @param params - Withdrawal parameters to validate\n * @param params.assetId - The CAIP asset ID to withdraw\n * @param params.amount - Amount to withdraw as string\n * @param params.destination - Optional destination hex address\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateWithdrawalParams(\n params: {\n assetId?: CaipAssetId;\n amount?: string;\n destination?: Hex;\n },\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateWithdrawalParams: Starting validation', {\n params,\n hasAssetId: Boolean(params.assetId),\n hasAmount: Boolean(params.amount),\n hasDestination: Boolean(params.destination),\n });\n\n // Validate required parameters\n if (!params.assetId) {\n debugLogger?.log('validateWithdrawalParams: Missing assetId', {\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_ID_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_ID_REQUIRED,\n };\n }\n\n // Validate amount\n if (!params.amount) {\n debugLogger?.log('validateWithdrawalParams: Missing amount', {\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_REQUIRED,\n };\n }\n\n const amount = parseFloat(params.amount);\n if (isNaN(amount) || amount <= 0) {\n debugLogger?.log('validateWithdrawalParams: Invalid amount', {\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_POSITIVE,\n amount: params.amount,\n parsedAmount: amount,\n isNaN: isNaN(amount),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_POSITIVE,\n };\n }\n\n // Validate destination address if provided\n if (params.destination && !isValidHexAddress(params.destination)) {\n debugLogger?.log('validateWithdrawalParams: Invalid destination address', {\n error: PERPS_ERROR_CODES.WITHDRAW_INVALID_DESTINATION,\n destination: params.destination,\n isValidHex: isValidHexAddress(params.destination),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_INVALID_DESTINATION,\n };\n }\n\n debugLogger?.log('validateWithdrawalParams: All validations passed', {\n assetId: params.assetId,\n amount: params.amount,\n destination: params.destination ?? 'will use user wallet',\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate deposit parameters.\n *\n * @param params - Deposit parameters to validate\n * @param params.assetId - The CAIP asset ID to deposit\n * @param params.amount - Amount to deposit as string\n * @param params.isTestnet - Whether this is a testnet deposit\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateDepositParams(\n params: {\n assetId?: CaipAssetId;\n amount?: string;\n isTestnet?: boolean;\n },\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateDepositParams: Starting validation', {\n params,\n hasAssetId: Boolean(params.assetId),\n hasAmount: Boolean(params.amount),\n isTestnet: params.isTestnet,\n });\n\n // Validate required parameters\n if (!params.assetId) {\n debugLogger?.log('validateDepositParams: Missing assetId', {\n error: PERPS_ERROR_CODES.DEPOSIT_ASSET_ID_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_ASSET_ID_REQUIRED,\n };\n }\n\n // Validate amount\n if (!params.amount) {\n debugLogger?.log('validateDepositParams: Missing amount', {\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_REQUIRED,\n };\n }\n\n const amount = parseFloat(params.amount);\n if (isNaN(amount) || amount <= 0) {\n debugLogger?.log('validateDepositParams: Invalid amount', {\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_POSITIVE,\n amount: params.amount,\n parsedAmount: amount,\n isNaN: isNaN(amount),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_POSITIVE,\n };\n }\n\n // Check minimum deposit amount\n const minimumAmount = params.isTestnet\n ? TRADING_DEFAULTS.amount.testnet\n : TRADING_DEFAULTS.amount.mainnet;\n\n debugLogger?.log('validateDepositParams: Checking minimum amount', {\n amount,\n minimumAmount,\n isTestnet: params.isTestnet,\n network: params.isTestnet ? 'testnet' : 'mainnet',\n });\n\n if (amount < minimumAmount) {\n debugLogger?.log('validateDepositParams: Below minimum deposit', {\n error: PERPS_ERROR_CODES.DEPOSIT_MINIMUM_AMOUNT,\n amount,\n minimumAmount,\n difference: minimumAmount - amount,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_MINIMUM_AMOUNT,\n };\n }\n\n debugLogger?.log('validateDepositParams: All validations passed', {\n assetId: params.assetId,\n amount: params.amount,\n parsedAmount: amount,\n minimumAmount,\n isTestnet: params.isTestnet,\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate asset support for withdrawals using AssetRoute arrays.\n *\n * @param assetId - The CAIP asset ID to validate\n * @param supportedRoutes - Array of supported asset routes\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateAssetSupport(\n assetId: CaipAssetId,\n supportedRoutes: { assetId: CaipAssetId }[],\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateAssetSupport: Checking asset support', {\n assetId,\n supportedRoutesCount: supportedRoutes.length,\n });\n\n const supportedAssetIds = supportedRoutes.map((route) => route.assetId);\n\n // Check if asset is supported\n const isSupported = supportedAssetIds.includes(assetId);\n\n if (!isSupported) {\n // Also check case-insensitive match for contract addresses\n const isSupportedCaseInsensitive = supportedAssetIds.some(\n (supportedId) => supportedId.toLowerCase() === assetId.toLowerCase(),\n );\n\n if (!isSupportedCaseInsensitive) {\n debugLogger?.log('validateAssetSupport: Asset not supported', {\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_NOT_SUPPORTED,\n assetId,\n supportedAssetIds,\n checkedCaseInsensitive: true,\n });\n\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_NOT_SUPPORTED,\n };\n }\n\n debugLogger?.log(\n '⚠️ validateAssetSupport: Asset supported with case mismatch',\n {\n providedAssetId: assetId,\n matchedAssetId: supportedAssetIds.find(\n (id) => id.toLowerCase() === assetId.toLowerCase(),\n ),\n },\n );\n }\n\n debugLogger?.log('validateAssetSupport: Asset is supported', {\n assetId,\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate balance against withdrawal amount.\n *\n * @param withdrawAmount - The amount to withdraw\n * @param withdrawableBalance - Max USD that can leave the venue right now\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateBalance(\n withdrawAmount: number,\n withdrawableBalance: number,\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateBalance: Checking balance sufficiency', {\n withdrawAmount,\n withdrawableBalance,\n difference: withdrawableBalance - withdrawAmount,\n });\n\n if (withdrawAmount > withdrawableBalance) {\n const shortfall = withdrawAmount - withdrawableBalance;\n\n debugLogger?.log('validateBalance: Insufficient balance', {\n error: PERPS_ERROR_CODES.WITHDRAW_INSUFFICIENT_BALANCE,\n withdrawAmount,\n withdrawableBalance,\n shortfall,\n percentageOfAvailable: `${((withdrawAmount / withdrawableBalance) * 100).toFixed(2)}%`,\n });\n\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_INSUFFICIENT_BALANCE,\n };\n }\n\n const remainingBalance = withdrawableBalance - withdrawAmount;\n debugLogger?.log('validateBalance: Balance is sufficient', {\n withdrawAmount,\n withdrawableBalance,\n remainingBalance,\n percentageUsed: `${((withdrawAmount / withdrawableBalance) * 100).toFixed(2)}%`,\n });\n\n return { isValid: true };\n}\n\n/**\n * Apply filters to asset paths with comprehensive logging.\n *\n * @param assets - Array of CAIP asset IDs to filter\n * @param params - Filter parameters including chainId, symbol, and assetId\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Filtered array of CAIP asset IDs\n */\nexport function applyPathFilters(\n assets: CaipAssetId[],\n params?: GetSupportedPathsParams,\n debugLogger?: ValidationDebugLogger,\n): CaipAssetId[] {\n if (!params) {\n debugLogger?.log(\n 'HyperLiquid: applyPathFilters - no params, returning all assets',\n { assets },\n );\n return assets;\n }\n\n let filtered = assets;\n\n debugLogger?.log('HyperLiquid: applyPathFilters - starting filter', {\n initialAssets: assets,\n filterParams: params,\n });\n\n if (params.chainId) {\n const before = filtered;\n filtered = filtered.filter((asset) =>\n asset.startsWith(params.chainId as string),\n );\n debugLogger?.log('HyperLiquid: applyPathFilters - chainId filter', {\n chainId: params.chainId,\n before,\n after: filtered,\n });\n }\n\n // Note: `in` is the idiomatic TypeScript way to narrow a string to\n // `keyof typeof` for indexed access; `hasProperty` types the indexed\n // result as `unknown` and loses the `{ testnet, mainnet }` shape.\n /* eslint-disable-next-line no-restricted-syntax */\n if (params.symbol && params.symbol in HYPERLIQUID_ASSET_CONFIGS) {\n const config =\n HYPERLIQUID_ASSET_CONFIGS[\n params.symbol as keyof typeof HYPERLIQUID_ASSET_CONFIGS\n ];\n const isTestnet = params.isTestnet ?? false;\n const selectedAsset = isTestnet ? config.testnet : config.mainnet;\n const before = filtered;\n filtered = [selectedAsset];\n debugLogger?.log('HyperLiquid: applyPathFilters - symbol filter', {\n symbol: params.symbol,\n isTestnet,\n config,\n selectedAsset,\n before,\n after: filtered,\n });\n }\n\n if (params.assetId) {\n const before = filtered;\n // Use case-insensitive comparison for asset ID matching to handle address case differences\n filtered = filtered.filter(\n (asset) => asset.toLowerCase() === params.assetId?.toLowerCase(),\n );\n debugLogger?.log('HyperLiquid: applyPathFilters - assetId filter', {\n assetId: params.assetId,\n before,\n after: filtered,\n exactMatch: before.includes(params.assetId),\n caseInsensitiveMatch: before.some(\n (asset) => asset.toLowerCase() === params.assetId?.toLowerCase(),\n ),\n });\n }\n\n debugLogger?.log('HyperLiquid: applyPathFilters - final result', {\n initialAssets: assets,\n finalFiltered: filtered,\n filterParams: params,\n });\n\n return filtered;\n}\n\n/**\n * Get supported deposit/withdrawal paths with filtering.\n *\n * @param params - Filter parameters including isTestnet, chainId, symbol\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Array of supported CAIP asset IDs\n */\nexport function getSupportedPaths(\n params?: GetSupportedPathsParams,\n debugLogger?: ValidationDebugLogger,\n): CaipAssetId[] {\n const isTestnet = params?.isTestnet ?? false;\n const assets = getSupportedAssets(isTestnet);\n const filteredAssets = applyPathFilters(assets, params, debugLogger);\n\n debugLogger?.log('HyperLiquid: getSupportedPaths', {\n isTestnet,\n requestedParams: params,\n allAssets: assets,\n filteredAssets,\n returnType: 'CaipAssetId[]',\n example: filteredAssets[0],\n });\n\n return filteredAssets;\n}\n\n/**\n * Get maximum order value based on leverage and order type.\n * Based on HyperLiquid contract specifications.\n *\n * @param maxLeverage - The maximum leverage for the market\n * @param orderType - The order type (market or limit)\n * @returns Maximum order value in USD\n */\nexport function getMaxOrderValue(\n maxLeverage: number,\n orderType: 'market' | 'limit',\n): number {\n let marketLimit: number;\n\n if (maxLeverage >= 25) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.HighLeverage;\n } else if (maxLeverage >= 20) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.MediumHighLeverage;\n } else if (maxLeverage >= 10) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.MediumLeverage;\n } else {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.LowLeverage;\n }\n\n return orderType === 'limit'\n ? marketLimit * HYPERLIQUID_ORDER_LIMITS.LimitOrderMultiplier\n : marketLimit;\n}\n\n/**\n * Validate order parameters.\n * Basic validation - checks required fields are present.\n * Amount validation (size/USD) is handled by validateOrder.\n *\n * @param params - Order parameters to validate\n * @param params.coin - The trading pair coin symbol\n * @param params.size - The order size as string\n * @param params.price - The order price as string\n * @param params.orderType - The order type (market or limit)\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateOrderParams(params: {\n coin?: string;\n size?: string;\n price?: string;\n orderType?: 'market' | 'limit';\n}): { isValid: boolean; error?: string } {\n if (!params.coin) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_COIN_REQUIRED,\n };\n }\n\n // Note: Size validation removed - validateOrder handles amount validation using USD as source of truth\n\n // Require price for limit orders\n if (params.orderType === 'limit' && !params.price) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_LIMIT_PRICE_REQUIRED,\n };\n }\n\n if (params.price && parseFloat(params.price) <= 0) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_PRICE_POSITIVE,\n };\n }\n\n return { isValid: true };\n}\n\n/**\n * Validate coin exists in asset mapping.\n *\n * @param coin - The coin symbol to validate\n * @param coinToAssetId - Map of coin symbols to asset IDs\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateCoinExists(\n coin: string,\n coinToAssetId: Map<string, number>,\n): { isValid: boolean; error?: string } {\n if (!coinToAssetId.has(coin)) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_UNKNOWN_COIN,\n };\n }\n\n return { isValid: true };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hyperLiquidValidation.d.cts","sourceRoot":"","sources":["../../src/utils/hyperLiquidValidation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AASxD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"hyperLiquidValidation.d.cts","sourceRoot":"","sources":["../../src/utils/hyperLiquidValidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hyperLiquidValidation.d.mts","sourceRoot":"","sources":["../../src/utils/hyperLiquidValidation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AASxD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"hyperLiquidValidation.d.mts","sourceRoot":"","sources":["../../src/utils/hyperLiquidValidation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AASxD,OAAO,KAAK,EACV,uBAAuB,EACvB,gBAAgB,EACjB,2BAA0B;AAE3B;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,GAAG,SAAS,CAAC;AAEjE;;GAEG;AAEH;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,SAAS;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACnD,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE;IACN,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,GAAG,CAAC;CACnB,EACD,WAAW,CAAC,EAAE,qBAAqB,GAClC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAkEtC;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE;IACN,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,EACD,WAAW,CAAC,EAAE,qBAAqB,GAClC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAgFtC;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,WAAW,EACpB,eAAe,EAAE;IAAE,OAAO,EAAE,WAAW,CAAA;CAAE,EAAE,EAC3C,WAAW,CAAC,EAAE,qBAAqB,GAClC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA+CtC;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,cAAc,EAAE,MAAM,EACtB,mBAAmB,EAAE,MAAM,EAC3B,WAAW,CAAC,EAAE,qBAAqB,GAClC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAiCtC;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EAAE,EACrB,MAAM,CAAC,EAAE,uBAAuB,EAChC,WAAW,CAAC,EAAE,qBAAqB,GAClC,WAAW,EAAE,CA2Ef;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,CAAC,EAAE,uBAAuB,EAChC,WAAW,CAAC,EAAE,qBAAqB,GAClC,WAAW,EAAE,CAef;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,QAAQ,GAAG,OAAO,GAC5B,MAAM,CAgBR;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CAChC,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA0BvC;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAStC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hyperLiquidValidation.mjs","sourceRoot":"","sources":["../../src/utils/hyperLiquidValidation.ts"],"names":[],"mappings":"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","sourcesContent":["import { isValidHexAddress } from '@metamask/utils';\nimport type { CaipAssetId, Hex } from '@metamask/utils';\n\nimport {\n HYPERLIQUID_ASSET_CONFIGS,\n getSupportedAssets,\n TRADING_DEFAULTS,\n} from '../constants/hyperLiquidConfig';\nimport { HYPERLIQUID_ORDER_LIMITS } from '../constants/perpsConfig';\nimport { PERPS_ERROR_CODES } from '../perpsErrorCodes';\nimport type { GetSupportedPathsParams, PerpsDebugLogger } from '../types';\n\n/**\n * Optional debug logger for validation functions.\n * When provided, enables detailed logging for debugging.\n * When omitted, validation runs silently.\n */\nexport type ValidationDebugLogger = PerpsDebugLogger | undefined;\n\n/**\n * Validation utilities for HyperLiquid operations\n */\n\n/**\n * Create standardized error response.\n *\n * @param error - The error that occurred\n * @param defaultResponse - The default response object to use as template\n * @returns The error response with success=false and error message\n */\nexport function createErrorResult<\n TValue extends { success: boolean; error?: string },\n>(error: unknown, defaultResponse: TValue): TValue {\n return {\n ...defaultResponse,\n success: false,\n error:\n error instanceof Error ? error.message : PERPS_ERROR_CODES.UNKNOWN_ERROR,\n };\n}\n\n/**\n * Validate withdrawal parameters.\n *\n * @param params - Withdrawal parameters to validate\n * @param params.assetId - The CAIP asset ID to withdraw\n * @param params.amount - Amount to withdraw as string\n * @param params.destination - Optional destination hex address\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateWithdrawalParams(\n params: {\n assetId?: CaipAssetId;\n amount?: string;\n destination?: Hex;\n },\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateWithdrawalParams: Starting validation', {\n params,\n hasAssetId: Boolean(params.assetId),\n hasAmount: Boolean(params.amount),\n hasDestination: Boolean(params.destination),\n });\n\n // Validate required parameters\n if (!params.assetId) {\n debugLogger?.log('validateWithdrawalParams: Missing assetId', {\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_ID_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_ID_REQUIRED,\n };\n }\n\n // Validate amount\n if (!params.amount) {\n debugLogger?.log('validateWithdrawalParams: Missing amount', {\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_REQUIRED,\n };\n }\n\n const amount = parseFloat(params.amount);\n if (isNaN(amount) || amount <= 0) {\n debugLogger?.log('validateWithdrawalParams: Invalid amount', {\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_POSITIVE,\n amount: params.amount,\n parsedAmount: amount,\n isNaN: isNaN(amount),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_POSITIVE,\n };\n }\n\n // Validate destination address if provided\n if (params.destination && !isValidHexAddress(params.destination)) {\n debugLogger?.log('validateWithdrawalParams: Invalid destination address', {\n error: PERPS_ERROR_CODES.WITHDRAW_INVALID_DESTINATION,\n destination: params.destination,\n isValidHex: isValidHexAddress(params.destination),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_INVALID_DESTINATION,\n };\n }\n\n debugLogger?.log('validateWithdrawalParams: All validations passed', {\n assetId: params.assetId,\n amount: params.amount,\n destination: params.destination ?? 'will use user wallet',\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate deposit parameters.\n *\n * @param params - Deposit parameters to validate\n * @param params.assetId - The CAIP asset ID to deposit\n * @param params.amount - Amount to deposit as string\n * @param params.isTestnet - Whether this is a testnet deposit\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateDepositParams(\n params: {\n assetId?: CaipAssetId;\n amount?: string;\n isTestnet?: boolean;\n },\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateDepositParams: Starting validation', {\n params,\n hasAssetId: Boolean(params.assetId),\n hasAmount: Boolean(params.amount),\n isTestnet: params.isTestnet,\n });\n\n // Validate required parameters\n if (!params.assetId) {\n debugLogger?.log('validateDepositParams: Missing assetId', {\n error: PERPS_ERROR_CODES.DEPOSIT_ASSET_ID_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_ASSET_ID_REQUIRED,\n };\n }\n\n // Validate amount\n if (!params.amount) {\n debugLogger?.log('validateDepositParams: Missing amount', {\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_REQUIRED,\n };\n }\n\n const amount = parseFloat(params.amount);\n if (isNaN(amount) || amount <= 0) {\n debugLogger?.log('validateDepositParams: Invalid amount', {\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_POSITIVE,\n amount: params.amount,\n parsedAmount: amount,\n isNaN: isNaN(amount),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_POSITIVE,\n };\n }\n\n // Check minimum deposit amount\n const minimumAmount = params.isTestnet\n ? TRADING_DEFAULTS.amount.testnet\n : TRADING_DEFAULTS.amount.mainnet;\n\n debugLogger?.log('validateDepositParams: Checking minimum amount', {\n amount,\n minimumAmount,\n isTestnet: params.isTestnet,\n network: params.isTestnet ? 'testnet' : 'mainnet',\n });\n\n if (amount < minimumAmount) {\n debugLogger?.log('validateDepositParams: Below minimum deposit', {\n error: PERPS_ERROR_CODES.DEPOSIT_MINIMUM_AMOUNT,\n amount,\n minimumAmount,\n difference: minimumAmount - amount,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_MINIMUM_AMOUNT,\n };\n }\n\n debugLogger?.log('validateDepositParams: All validations passed', {\n assetId: params.assetId,\n amount: params.amount,\n parsedAmount: amount,\n minimumAmount,\n isTestnet: params.isTestnet,\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate asset support for withdrawals using AssetRoute arrays.\n *\n * @param assetId - The CAIP asset ID to validate\n * @param supportedRoutes - Array of supported asset routes\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateAssetSupport(\n assetId: CaipAssetId,\n supportedRoutes: { assetId: CaipAssetId }[],\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateAssetSupport: Checking asset support', {\n assetId,\n supportedRoutesCount: supportedRoutes.length,\n });\n\n const supportedAssetIds = supportedRoutes.map((route) => route.assetId);\n\n // Check if asset is supported\n const isSupported = supportedAssetIds.includes(assetId);\n\n if (!isSupported) {\n // Also check case-insensitive match for contract addresses\n const isSupportedCaseInsensitive = supportedAssetIds.some(\n (supportedId) => supportedId.toLowerCase() === assetId.toLowerCase(),\n );\n\n if (!isSupportedCaseInsensitive) {\n debugLogger?.log('validateAssetSupport: Asset not supported', {\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_NOT_SUPPORTED,\n assetId,\n supportedAssetIds,\n checkedCaseInsensitive: true,\n });\n\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_NOT_SUPPORTED,\n };\n }\n\n debugLogger?.log(\n '⚠️ validateAssetSupport: Asset supported with case mismatch',\n {\n providedAssetId: assetId,\n matchedAssetId: supportedAssetIds.find(\n (id) => id.toLowerCase() === assetId.toLowerCase(),\n ),\n },\n );\n }\n\n debugLogger?.log('validateAssetSupport: Asset is supported', {\n assetId,\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate balance against withdrawal amount.\n *\n * @param withdrawAmount - The amount to withdraw\n * @param withdrawableBalance - Max USD that can leave the venue right now\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateBalance(\n withdrawAmount: number,\n withdrawableBalance: number,\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateBalance: Checking balance sufficiency', {\n withdrawAmount,\n withdrawableBalance,\n difference: withdrawableBalance - withdrawAmount,\n });\n\n if (withdrawAmount > withdrawableBalance) {\n const shortfall = withdrawAmount - withdrawableBalance;\n\n debugLogger?.log('validateBalance: Insufficient balance', {\n error: PERPS_ERROR_CODES.WITHDRAW_INSUFFICIENT_BALANCE,\n withdrawAmount,\n withdrawableBalance,\n shortfall,\n percentageOfAvailable: `${((withdrawAmount / withdrawableBalance) * 100).toFixed(2)}%`,\n });\n\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_INSUFFICIENT_BALANCE,\n };\n }\n\n const remainingBalance = withdrawableBalance - withdrawAmount;\n debugLogger?.log('validateBalance: Balance is sufficient', {\n withdrawAmount,\n withdrawableBalance,\n remainingBalance,\n percentageUsed: `${((withdrawAmount / withdrawableBalance) * 100).toFixed(2)}%`,\n });\n\n return { isValid: true };\n}\n\n/**\n * Apply filters to asset paths with comprehensive logging.\n *\n * @param assets - Array of CAIP asset IDs to filter\n * @param params - Filter parameters including chainId, symbol, and assetId\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Filtered array of CAIP asset IDs\n */\nexport function applyPathFilters(\n assets: CaipAssetId[],\n params?: GetSupportedPathsParams,\n debugLogger?: ValidationDebugLogger,\n): CaipAssetId[] {\n if (!params) {\n debugLogger?.log(\n 'HyperLiquid: applyPathFilters - no params, returning all assets',\n { assets },\n );\n return assets;\n }\n\n let filtered = assets;\n\n debugLogger?.log('HyperLiquid: applyPathFilters - starting filter', {\n initialAssets: assets,\n filterParams: params,\n });\n\n if (params.chainId) {\n const before = filtered;\n filtered = filtered.filter((asset) =>\n asset.startsWith(params.chainId as string),\n );\n debugLogger?.log('HyperLiquid: applyPathFilters - chainId filter', {\n chainId: params.chainId,\n before,\n after: filtered,\n });\n }\n\n // Note: `in` is the idiomatic TypeScript way to narrow a string to\n // `keyof typeof` for indexed access; `hasProperty` types the indexed\n // result as `unknown` and loses the `{ testnet, mainnet }` shape.\n /* eslint-disable-next-line no-restricted-syntax */\n if (params.symbol && params.symbol in HYPERLIQUID_ASSET_CONFIGS) {\n const config =\n HYPERLIQUID_ASSET_CONFIGS[\n params.symbol as keyof typeof HYPERLIQUID_ASSET_CONFIGS\n ];\n const isTestnet = params.isTestnet ?? false;\n const selectedAsset = isTestnet ? config.testnet : config.mainnet;\n const before = filtered;\n filtered = [selectedAsset];\n debugLogger?.log('HyperLiquid: applyPathFilters - symbol filter', {\n symbol: params.symbol,\n isTestnet,\n config,\n selectedAsset,\n before,\n after: filtered,\n });\n }\n\n if (params.assetId) {\n const before = filtered;\n // Use case-insensitive comparison for asset ID matching to handle address case differences\n filtered = filtered.filter(\n (asset) => asset.toLowerCase() === params.assetId?.toLowerCase(),\n );\n debugLogger?.log('HyperLiquid: applyPathFilters - assetId filter', {\n assetId: params.assetId,\n before,\n after: filtered,\n exactMatch: before.includes(params.assetId),\n caseInsensitiveMatch: before.some(\n (asset) => asset.toLowerCase() === params.assetId?.toLowerCase(),\n ),\n });\n }\n\n debugLogger?.log('HyperLiquid: applyPathFilters - final result', {\n initialAssets: assets,\n finalFiltered: filtered,\n filterParams: params,\n });\n\n return filtered;\n}\n\n/**\n * Get supported deposit/withdrawal paths with filtering.\n *\n * @param params - Filter parameters including isTestnet, chainId, symbol\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Array of supported CAIP asset IDs\n */\nexport function getSupportedPaths(\n params?: GetSupportedPathsParams,\n debugLogger?: ValidationDebugLogger,\n): CaipAssetId[] {\n const isTestnet = params?.isTestnet ?? false;\n const assets = getSupportedAssets(isTestnet);\n const filteredAssets = applyPathFilters(assets, params, debugLogger);\n\n debugLogger?.log('HyperLiquid: getSupportedPaths', {\n isTestnet,\n requestedParams: params,\n allAssets: assets,\n filteredAssets,\n returnType: 'CaipAssetId[]',\n example: filteredAssets[0],\n });\n\n return filteredAssets;\n}\n\n/**\n * Get maximum order value based on leverage and order type.\n * Based on HyperLiquid contract specifications.\n *\n * @param maxLeverage - The maximum leverage for the market\n * @param orderType - The order type (market or limit)\n * @returns Maximum order value in USD\n */\nexport function getMaxOrderValue(\n maxLeverage: number,\n orderType: 'market' | 'limit',\n): number {\n let marketLimit: number;\n\n if (maxLeverage >= 25) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.HighLeverage;\n } else if (maxLeverage >= 20) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.MediumHighLeverage;\n } else if (maxLeverage >= 10) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.MediumLeverage;\n } else {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.LowLeverage;\n }\n\n return orderType === 'limit'\n ? marketLimit * HYPERLIQUID_ORDER_LIMITS.LimitOrderMultiplier\n : marketLimit;\n}\n\n/**\n * Validate order parameters.\n * Basic validation - checks required fields are present.\n * Amount validation (size/USD) is handled by validateOrder.\n *\n * @param params - Order parameters to validate\n * @param params.coin - The trading pair coin symbol\n * @param params.size - The order size as string\n * @param params.price - The order price as string\n * @param params.orderType - The order type (market or limit)\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateOrderParams(params: {\n coin?: string;\n size?: string;\n price?: string;\n orderType?: 'market' | 'limit';\n}): { isValid: boolean; error?: string } {\n if (!params.coin) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_COIN_REQUIRED,\n };\n }\n\n // Note: Size validation removed - validateOrder handles amount validation using USD as source of truth\n\n // Require price for limit orders\n if (params.orderType === 'limit' && !params.price) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_LIMIT_PRICE_REQUIRED,\n };\n }\n\n if (params.price && parseFloat(params.price) <= 0) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_PRICE_POSITIVE,\n };\n }\n\n return { isValid: true };\n}\n\n/**\n * Validate coin exists in asset mapping.\n *\n * @param coin - The coin symbol to validate\n * @param coinToAssetId - Map of coin symbols to asset IDs\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateCoinExists(\n coin: string,\n coinToAssetId: Map<string, number>,\n): { isValid: boolean; error?: string } {\n if (!coinToAssetId.has(coin)) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_UNKNOWN_COIN,\n };\n }\n\n return { isValid: true };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"hyperLiquidValidation.mjs","sourceRoot":"","sources":["../../src/utils/hyperLiquidValidation.ts"],"names":[],"mappings":"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","sourcesContent":["import { isValidHexAddress } from '@metamask/utils';\nimport type { CaipAssetId, Hex } from '@metamask/utils';\n\nimport {\n HYPERLIQUID_ASSET_CONFIGS,\n getSupportedAssets,\n TRADING_DEFAULTS,\n} from '../constants/hyperLiquidConfig.js';\nimport { HYPERLIQUID_ORDER_LIMITS } from '../constants/perpsConfig.js';\nimport { PERPS_ERROR_CODES } from '../perpsErrorCodes.js';\nimport type {\n GetSupportedPathsParams,\n PerpsDebugLogger,\n} from '../types/index.js';\n\n/**\n * Optional debug logger for validation functions.\n * When provided, enables detailed logging for debugging.\n * When omitted, validation runs silently.\n */\nexport type ValidationDebugLogger = PerpsDebugLogger | undefined;\n\n/**\n * Validation utilities for HyperLiquid operations\n */\n\n/**\n * Create standardized error response.\n *\n * @param error - The error that occurred\n * @param defaultResponse - The default response object to use as template\n * @returns The error response with success=false and error message\n */\nexport function createErrorResult<\n TValue extends { success: boolean; error?: string },\n>(error: unknown, defaultResponse: TValue): TValue {\n return {\n ...defaultResponse,\n success: false,\n error:\n error instanceof Error ? error.message : PERPS_ERROR_CODES.UNKNOWN_ERROR,\n };\n}\n\n/**\n * Validate withdrawal parameters.\n *\n * @param params - Withdrawal parameters to validate\n * @param params.assetId - The CAIP asset ID to withdraw\n * @param params.amount - Amount to withdraw as string\n * @param params.destination - Optional destination hex address\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateWithdrawalParams(\n params: {\n assetId?: CaipAssetId;\n amount?: string;\n destination?: Hex;\n },\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateWithdrawalParams: Starting validation', {\n params,\n hasAssetId: Boolean(params.assetId),\n hasAmount: Boolean(params.amount),\n hasDestination: Boolean(params.destination),\n });\n\n // Validate required parameters\n if (!params.assetId) {\n debugLogger?.log('validateWithdrawalParams: Missing assetId', {\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_ID_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_ID_REQUIRED,\n };\n }\n\n // Validate amount\n if (!params.amount) {\n debugLogger?.log('validateWithdrawalParams: Missing amount', {\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_REQUIRED,\n };\n }\n\n const amount = parseFloat(params.amount);\n if (isNaN(amount) || amount <= 0) {\n debugLogger?.log('validateWithdrawalParams: Invalid amount', {\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_POSITIVE,\n amount: params.amount,\n parsedAmount: amount,\n isNaN: isNaN(amount),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_POSITIVE,\n };\n }\n\n // Validate destination address if provided\n if (params.destination && !isValidHexAddress(params.destination)) {\n debugLogger?.log('validateWithdrawalParams: Invalid destination address', {\n error: PERPS_ERROR_CODES.WITHDRAW_INVALID_DESTINATION,\n destination: params.destination,\n isValidHex: isValidHexAddress(params.destination),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_INVALID_DESTINATION,\n };\n }\n\n debugLogger?.log('validateWithdrawalParams: All validations passed', {\n assetId: params.assetId,\n amount: params.amount,\n destination: params.destination ?? 'will use user wallet',\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate deposit parameters.\n *\n * @param params - Deposit parameters to validate\n * @param params.assetId - The CAIP asset ID to deposit\n * @param params.amount - Amount to deposit as string\n * @param params.isTestnet - Whether this is a testnet deposit\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateDepositParams(\n params: {\n assetId?: CaipAssetId;\n amount?: string;\n isTestnet?: boolean;\n },\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateDepositParams: Starting validation', {\n params,\n hasAssetId: Boolean(params.assetId),\n hasAmount: Boolean(params.amount),\n isTestnet: params.isTestnet,\n });\n\n // Validate required parameters\n if (!params.assetId) {\n debugLogger?.log('validateDepositParams: Missing assetId', {\n error: PERPS_ERROR_CODES.DEPOSIT_ASSET_ID_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_ASSET_ID_REQUIRED,\n };\n }\n\n // Validate amount\n if (!params.amount) {\n debugLogger?.log('validateDepositParams: Missing amount', {\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_REQUIRED,\n };\n }\n\n const amount = parseFloat(params.amount);\n if (isNaN(amount) || amount <= 0) {\n debugLogger?.log('validateDepositParams: Invalid amount', {\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_POSITIVE,\n amount: params.amount,\n parsedAmount: amount,\n isNaN: isNaN(amount),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_POSITIVE,\n };\n }\n\n // Check minimum deposit amount\n const minimumAmount = params.isTestnet\n ? TRADING_DEFAULTS.amount.testnet\n : TRADING_DEFAULTS.amount.mainnet;\n\n debugLogger?.log('validateDepositParams: Checking minimum amount', {\n amount,\n minimumAmount,\n isTestnet: params.isTestnet,\n network: params.isTestnet ? 'testnet' : 'mainnet',\n });\n\n if (amount < minimumAmount) {\n debugLogger?.log('validateDepositParams: Below minimum deposit', {\n error: PERPS_ERROR_CODES.DEPOSIT_MINIMUM_AMOUNT,\n amount,\n minimumAmount,\n difference: minimumAmount - amount,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_MINIMUM_AMOUNT,\n };\n }\n\n debugLogger?.log('validateDepositParams: All validations passed', {\n assetId: params.assetId,\n amount: params.amount,\n parsedAmount: amount,\n minimumAmount,\n isTestnet: params.isTestnet,\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate asset support for withdrawals using AssetRoute arrays.\n *\n * @param assetId - The CAIP asset ID to validate\n * @param supportedRoutes - Array of supported asset routes\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateAssetSupport(\n assetId: CaipAssetId,\n supportedRoutes: { assetId: CaipAssetId }[],\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateAssetSupport: Checking asset support', {\n assetId,\n supportedRoutesCount: supportedRoutes.length,\n });\n\n const supportedAssetIds = supportedRoutes.map((route) => route.assetId);\n\n // Check if asset is supported\n const isSupported = supportedAssetIds.includes(assetId);\n\n if (!isSupported) {\n // Also check case-insensitive match for contract addresses\n const isSupportedCaseInsensitive = supportedAssetIds.some(\n (supportedId) => supportedId.toLowerCase() === assetId.toLowerCase(),\n );\n\n if (!isSupportedCaseInsensitive) {\n debugLogger?.log('validateAssetSupport: Asset not supported', {\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_NOT_SUPPORTED,\n assetId,\n supportedAssetIds,\n checkedCaseInsensitive: true,\n });\n\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_NOT_SUPPORTED,\n };\n }\n\n debugLogger?.log(\n '⚠️ validateAssetSupport: Asset supported with case mismatch',\n {\n providedAssetId: assetId,\n matchedAssetId: supportedAssetIds.find(\n (id) => id.toLowerCase() === assetId.toLowerCase(),\n ),\n },\n );\n }\n\n debugLogger?.log('validateAssetSupport: Asset is supported', {\n assetId,\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate balance against withdrawal amount.\n *\n * @param withdrawAmount - The amount to withdraw\n * @param withdrawableBalance - Max USD that can leave the venue right now\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateBalance(\n withdrawAmount: number,\n withdrawableBalance: number,\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateBalance: Checking balance sufficiency', {\n withdrawAmount,\n withdrawableBalance,\n difference: withdrawableBalance - withdrawAmount,\n });\n\n if (withdrawAmount > withdrawableBalance) {\n const shortfall = withdrawAmount - withdrawableBalance;\n\n debugLogger?.log('validateBalance: Insufficient balance', {\n error: PERPS_ERROR_CODES.WITHDRAW_INSUFFICIENT_BALANCE,\n withdrawAmount,\n withdrawableBalance,\n shortfall,\n percentageOfAvailable: `${((withdrawAmount / withdrawableBalance) * 100).toFixed(2)}%`,\n });\n\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_INSUFFICIENT_BALANCE,\n };\n }\n\n const remainingBalance = withdrawableBalance - withdrawAmount;\n debugLogger?.log('validateBalance: Balance is sufficient', {\n withdrawAmount,\n withdrawableBalance,\n remainingBalance,\n percentageUsed: `${((withdrawAmount / withdrawableBalance) * 100).toFixed(2)}%`,\n });\n\n return { isValid: true };\n}\n\n/**\n * Apply filters to asset paths with comprehensive logging.\n *\n * @param assets - Array of CAIP asset IDs to filter\n * @param params - Filter parameters including chainId, symbol, and assetId\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Filtered array of CAIP asset IDs\n */\nexport function applyPathFilters(\n assets: CaipAssetId[],\n params?: GetSupportedPathsParams,\n debugLogger?: ValidationDebugLogger,\n): CaipAssetId[] {\n if (!params) {\n debugLogger?.log(\n 'HyperLiquid: applyPathFilters - no params, returning all assets',\n { assets },\n );\n return assets;\n }\n\n let filtered = assets;\n\n debugLogger?.log('HyperLiquid: applyPathFilters - starting filter', {\n initialAssets: assets,\n filterParams: params,\n });\n\n if (params.chainId) {\n const before = filtered;\n filtered = filtered.filter((asset) =>\n asset.startsWith(params.chainId as string),\n );\n debugLogger?.log('HyperLiquid: applyPathFilters - chainId filter', {\n chainId: params.chainId,\n before,\n after: filtered,\n });\n }\n\n // Note: `in` is the idiomatic TypeScript way to narrow a string to\n // `keyof typeof` for indexed access; `hasProperty` types the indexed\n // result as `unknown` and loses the `{ testnet, mainnet }` shape.\n /* eslint-disable-next-line no-restricted-syntax */\n if (params.symbol && params.symbol in HYPERLIQUID_ASSET_CONFIGS) {\n const config =\n HYPERLIQUID_ASSET_CONFIGS[\n params.symbol as keyof typeof HYPERLIQUID_ASSET_CONFIGS\n ];\n const isTestnet = params.isTestnet ?? false;\n const selectedAsset = isTestnet ? config.testnet : config.mainnet;\n const before = filtered;\n filtered = [selectedAsset];\n debugLogger?.log('HyperLiquid: applyPathFilters - symbol filter', {\n symbol: params.symbol,\n isTestnet,\n config,\n selectedAsset,\n before,\n after: filtered,\n });\n }\n\n if (params.assetId) {\n const before = filtered;\n // Use case-insensitive comparison for asset ID matching to handle address case differences\n filtered = filtered.filter(\n (asset) => asset.toLowerCase() === params.assetId?.toLowerCase(),\n );\n debugLogger?.log('HyperLiquid: applyPathFilters - assetId filter', {\n assetId: params.assetId,\n before,\n after: filtered,\n exactMatch: before.includes(params.assetId),\n caseInsensitiveMatch: before.some(\n (asset) => asset.toLowerCase() === params.assetId?.toLowerCase(),\n ),\n });\n }\n\n debugLogger?.log('HyperLiquid: applyPathFilters - final result', {\n initialAssets: assets,\n finalFiltered: filtered,\n filterParams: params,\n });\n\n return filtered;\n}\n\n/**\n * Get supported deposit/withdrawal paths with filtering.\n *\n * @param params - Filter parameters including isTestnet, chainId, symbol\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Array of supported CAIP asset IDs\n */\nexport function getSupportedPaths(\n params?: GetSupportedPathsParams,\n debugLogger?: ValidationDebugLogger,\n): CaipAssetId[] {\n const isTestnet = params?.isTestnet ?? false;\n const assets = getSupportedAssets(isTestnet);\n const filteredAssets = applyPathFilters(assets, params, debugLogger);\n\n debugLogger?.log('HyperLiquid: getSupportedPaths', {\n isTestnet,\n requestedParams: params,\n allAssets: assets,\n filteredAssets,\n returnType: 'CaipAssetId[]',\n example: filteredAssets[0],\n });\n\n return filteredAssets;\n}\n\n/**\n * Get maximum order value based on leverage and order type.\n * Based on HyperLiquid contract specifications.\n *\n * @param maxLeverage - The maximum leverage for the market\n * @param orderType - The order type (market or limit)\n * @returns Maximum order value in USD\n */\nexport function getMaxOrderValue(\n maxLeverage: number,\n orderType: 'market' | 'limit',\n): number {\n let marketLimit: number;\n\n if (maxLeverage >= 25) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.HighLeverage;\n } else if (maxLeverage >= 20) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.MediumHighLeverage;\n } else if (maxLeverage >= 10) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.MediumLeverage;\n } else {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.LowLeverage;\n }\n\n return orderType === 'limit'\n ? marketLimit * HYPERLIQUID_ORDER_LIMITS.LimitOrderMultiplier\n : marketLimit;\n}\n\n/**\n * Validate order parameters.\n * Basic validation - checks required fields are present.\n * Amount validation (size/USD) is handled by validateOrder.\n *\n * @param params - Order parameters to validate\n * @param params.coin - The trading pair coin symbol\n * @param params.size - The order size as string\n * @param params.price - The order price as string\n * @param params.orderType - The order type (market or limit)\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateOrderParams(params: {\n coin?: string;\n size?: string;\n price?: string;\n orderType?: 'market' | 'limit';\n}): { isValid: boolean; error?: string } {\n if (!params.coin) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_COIN_REQUIRED,\n };\n }\n\n // Note: Size validation removed - validateOrder handles amount validation using USD as source of truth\n\n // Require price for limit orders\n if (params.orderType === 'limit' && !params.price) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_LIMIT_PRICE_REQUIRED,\n };\n }\n\n if (params.price && parseFloat(params.price) <= 0) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_PRICE_POSITIVE,\n };\n }\n\n return { isValid: true };\n}\n\n/**\n * Validate coin exists in asset mapping.\n *\n * @param coin - The coin symbol to validate\n * @param coinToAssetId - Map of coin symbols to asset IDs\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateCoinExists(\n coin: string,\n coinToAssetId: Map<string, number>,\n): { isValid: boolean; error?: string } {\n if (!coinToAssetId.has(coin)) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_UNKNOWN_COIN,\n };\n }\n\n return { isValid: true };\n}\n"]}
|
package/dist/utils/index.cjs
CHANGED
|
@@ -24,18 +24,18 @@ exports.getEnvironment = exports.adaptHyperLiquidLedgerUpdateToUserHistoryItem =
|
|
|
24
24
|
__exportStar(require("./accountUtils.cjs"), exports);
|
|
25
25
|
__exportStar(require("./errorUtils.cjs"), exports);
|
|
26
26
|
// hyperLiquidAdapter: selective export to avoid calculatePositionSize clash with orderCalculations
|
|
27
|
-
var
|
|
28
|
-
Object.defineProperty(exports, "adaptOrderToSDK", { enumerable: true, get: function () { return
|
|
29
|
-
Object.defineProperty(exports, "adaptPositionFromSDK", { enumerable: true, get: function () { return
|
|
30
|
-
Object.defineProperty(exports, "adaptOrderFromSDK", { enumerable: true, get: function () { return
|
|
31
|
-
Object.defineProperty(exports, "adaptMarketFromSDK", { enumerable: true, get: function () { return
|
|
32
|
-
Object.defineProperty(exports, "adaptAccountStateFromSDK", { enumerable: true, get: function () { return
|
|
33
|
-
Object.defineProperty(exports, "buildAssetMapping", { enumerable: true, get: function () { return
|
|
34
|
-
Object.defineProperty(exports, "formatHyperLiquidPrice", { enumerable: true, get: function () { return
|
|
35
|
-
Object.defineProperty(exports, "formatHyperLiquidSize", { enumerable: true, get: function () { return
|
|
36
|
-
Object.defineProperty(exports, "calculateHip3AssetId", { enumerable: true, get: function () { return
|
|
37
|
-
Object.defineProperty(exports, "parseAssetName", { enumerable: true, get: function () { return
|
|
38
|
-
Object.defineProperty(exports, "adaptHyperLiquidLedgerUpdateToUserHistoryItem", { enumerable: true, get: function () { return
|
|
27
|
+
var hyperLiquidAdapter_js_1 = require("./hyperLiquidAdapter.cjs");
|
|
28
|
+
Object.defineProperty(exports, "adaptOrderToSDK", { enumerable: true, get: function () { return hyperLiquidAdapter_js_1.adaptOrderToSDK; } });
|
|
29
|
+
Object.defineProperty(exports, "adaptPositionFromSDK", { enumerable: true, get: function () { return hyperLiquidAdapter_js_1.adaptPositionFromSDK; } });
|
|
30
|
+
Object.defineProperty(exports, "adaptOrderFromSDK", { enumerable: true, get: function () { return hyperLiquidAdapter_js_1.adaptOrderFromSDK; } });
|
|
31
|
+
Object.defineProperty(exports, "adaptMarketFromSDK", { enumerable: true, get: function () { return hyperLiquidAdapter_js_1.adaptMarketFromSDK; } });
|
|
32
|
+
Object.defineProperty(exports, "adaptAccountStateFromSDK", { enumerable: true, get: function () { return hyperLiquidAdapter_js_1.adaptAccountStateFromSDK; } });
|
|
33
|
+
Object.defineProperty(exports, "buildAssetMapping", { enumerable: true, get: function () { return hyperLiquidAdapter_js_1.buildAssetMapping; } });
|
|
34
|
+
Object.defineProperty(exports, "formatHyperLiquidPrice", { enumerable: true, get: function () { return hyperLiquidAdapter_js_1.formatHyperLiquidPrice; } });
|
|
35
|
+
Object.defineProperty(exports, "formatHyperLiquidSize", { enumerable: true, get: function () { return hyperLiquidAdapter_js_1.formatHyperLiquidSize; } });
|
|
36
|
+
Object.defineProperty(exports, "calculateHip3AssetId", { enumerable: true, get: function () { return hyperLiquidAdapter_js_1.calculateHip3AssetId; } });
|
|
37
|
+
Object.defineProperty(exports, "parseAssetName", { enumerable: true, get: function () { return hyperLiquidAdapter_js_1.parseAssetName; } });
|
|
38
|
+
Object.defineProperty(exports, "adaptHyperLiquidLedgerUpdateToUserHistoryItem", { enumerable: true, get: function () { return hyperLiquidAdapter_js_1.adaptHyperLiquidLedgerUpdateToUserHistoryItem; } });
|
|
39
39
|
__exportStar(require("./hyperLiquidOrderBookProcessor.cjs"), exports);
|
|
40
40
|
__exportStar(require("./hyperLiquidValidation.cjs"), exports);
|
|
41
41
|
__exportStar(require("./idUtils.cjs"), exports);
|
package/dist/utils/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;;;;GAKG;AACH,
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;;;;GAKG;AACH,qDAAkC;AAClC,mDAAgC;AAChC,mGAAmG;AACnG,kEAYiC;AAX/B,wHAAA,eAAe,OAAA;AACf,6HAAA,oBAAoB,OAAA;AACpB,0HAAA,iBAAiB,OAAA;AACjB,2HAAA,kBAAkB,OAAA;AAClB,iIAAA,wBAAwB,OAAA;AACxB,0HAAA,iBAAiB,OAAA;AACjB,+HAAA,sBAAsB,OAAA;AACtB,8HAAA,qBAAqB,OAAA;AACrB,6HAAA,oBAAoB,OAAA;AACpB,uHAAA,cAAc,OAAA;AACd,sJAAA,6CAA6C,OAAA;AAE/C,sEAAmD;AACnD,8DAA2C;AAC3C,gDAA6B;AAC7B,4DAAyC;AACzC,qDAAkC;AAClC,oDAAiC;AACjC,0DAAuC;AACvC,6DAA0C;AAC1C,qDAAkC;AAClC,2DAAwC;AACxC,oDAAiC;AACjC,6DAA0C;AAC1C,yDAAsC;AACtC,qDAAkC;AAClC,6CAA0B;AAE1B,qFAAqF;AAC9E,MAAM,cAAc,GAAG,GAAmB,EAAE;IACjD,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,IAAI,YAAY,CAAC;IAC9D,OAAO,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/C,CAAC,CAAC;AAHW,QAAA,cAAc,kBAGzB;AACF,wDAAqC","sourcesContent":["/**\n * Barrel re-export for all portable utilities in controllers/utils/\n *\n * Note: hyperLiquidAdapter and orderCalculations both export calculatePositionSize.\n * We use selective exports to avoid the name collision.\n */\nexport * from './accountUtils.js';\nexport * from './errorUtils.js';\n// hyperLiquidAdapter: selective export to avoid calculatePositionSize clash with orderCalculations\nexport {\n adaptOrderToSDK,\n adaptPositionFromSDK,\n adaptOrderFromSDK,\n adaptMarketFromSDK,\n adaptAccountStateFromSDK,\n buildAssetMapping,\n formatHyperLiquidPrice,\n formatHyperLiquidSize,\n calculateHip3AssetId,\n parseAssetName,\n adaptHyperLiquidLedgerUpdateToUserHistoryItem,\n} from './hyperLiquidAdapter.js';\nexport * from './hyperLiquidOrderBookProcessor.js';\nexport * from './hyperLiquidValidation.js';\nexport * from './idUtils.js';\nexport * from './marketDataTransform.js';\nexport * from './marketSearch.js';\nexport * from './marketUtils.js';\nexport * from './orderCalculations.js';\nexport * from './perpsDiskPersistence.js';\nexport * from './rewardsUtils.js';\nexport * from './significantFigures.js';\nexport * from './sortMarkets.js';\nexport * from './standaloneInfoClient.js';\nexport * from './stringParseUtils.js';\nexport * from './transferData.js';\nexport * from './wait.js';\n\n// Inline from former utils.ts (getEnvironment was previously at perps/utils.ts root)\nexport const getEnvironment = (): 'DEV' | 'PROD' => {\n const env = globalThis.process?.env?.NODE_ENV ?? 'production';\n return env === 'production' ? 'PROD' : 'DEV';\n};\nexport * from './perpsFormatters.js';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,mCAAkC;AAClC,iCAAgC;AAEhC,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,6CAA6C,GAC9C,iCAAgC;AACjC,oDAAmD;AACnD,4CAA2C;AAC3C,8BAA6B;AAC7B,0CAAyC;AACzC,mCAAkC;AAClC,kCAAiC;AACjC,wCAAuC;AACvC,2CAA0C;AAC1C,mCAAkC;AAClC,yCAAwC;AACxC,kCAAiC;AACjC,2CAA0C;AAC1C,uCAAsC;AACtC,mCAAkC;AAClC,2BAA0B;AAG1B,eAAO,MAAM,cAAc,QAAO,KAAK,GAAG,MAGzC,CAAC;AACF,sCAAqC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,mCAAkC;AAClC,iCAAgC;AAEhC,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,6CAA6C,GAC9C,iCAAgC;AACjC,oDAAmD;AACnD,4CAA2C;AAC3C,8BAA6B;AAC7B,0CAAyC;AACzC,mCAAkC;AAClC,kCAAiC;AACjC,wCAAuC;AACvC,2CAA0C;AAC1C,mCAAkC;AAClC,yCAAwC;AACxC,kCAAiC;AACjC,2CAA0C;AAC1C,uCAAsC;AACtC,mCAAkC;AAClC,2BAA0B;AAG1B,eAAO,MAAM,cAAc,QAAO,KAAK,GAAG,MAGzC,CAAC;AACF,sCAAqC"}
|