dexbot 1.4.25 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -0
- package/README.md +6 -2
- package/analysis/README.md +14 -7
- package/analysis/ama_fitting/package.json +1 -1
- package/analysis/analyze_derivatives.ts +1 -1
- package/analysis/bot_key_utils.ts +272 -3
- package/analysis/bot_usage/discover_bot_accounts.ts +64 -9
- package/analysis/bot_usage/kibana_bot_queries.ts +40 -1
- package/analysis/chart_utils.ts +6 -3
- package/analysis/grid_correction_check.ts +56 -20
- package/analysis/resolve_bot_accounts.ts +199 -0
- package/analysis/trade_profitability.ts +36 -8
- package/analysis/tradingview/README.md +25 -0
- package/analysis/tradingview/analyze_tradingview.ts +2 -2
- package/analysis/trend_detection/package.json +1 -1
- package/claw/modules/claw_launcher.ts +5 -4
- package/claw/modules/credit_runtime_adapter.ts +2 -1
- package/claw/modules/dexbot_profiles.ts +4 -3
- package/claw/package.json +1 -1
- package/claw/runtimes/openclaw-plugin/openclaw.plugin.json +1 -1
- package/claw/runtimes/openclaw-plugin/package.json +1 -1
- package/claw/tests/test_claw_mcp_transport.ts +2 -2
- package/dist/analysis/analyze_derivatives.js +1 -1
- package/dist/analysis/bot_key_utils.d.ts +28 -1
- package/dist/analysis/bot_key_utils.d.ts.map +1 -1
- package/dist/analysis/bot_key_utils.js +385 -3
- package/dist/analysis/bot_key_utils.js.map +1 -1
- package/dist/analysis/bot_usage/discover_bot_accounts.js +60 -10
- package/dist/analysis/bot_usage/discover_bot_accounts.js.map +1 -1
- package/dist/analysis/bot_usage/kibana_bot_queries.d.ts +45 -1
- package/dist/analysis/bot_usage/kibana_bot_queries.d.ts.map +1 -1
- package/dist/analysis/bot_usage/kibana_bot_queries.js +39 -1
- package/dist/analysis/bot_usage/kibana_bot_queries.js.map +1 -1
- package/dist/analysis/chart_utils.d.ts +2 -1
- package/dist/analysis/chart_utils.d.ts.map +1 -1
- package/dist/analysis/chart_utils.js +4 -1
- package/dist/analysis/chart_utils.js.map +1 -1
- package/dist/analysis/grid_correction_check.d.ts.map +1 -1
- package/dist/analysis/grid_correction_check.js +60 -20
- package/dist/analysis/grid_correction_check.js.map +1 -1
- package/dist/analysis/resolve_bot_accounts.d.ts +3 -0
- package/dist/analysis/resolve_bot_accounts.d.ts.map +1 -0
- package/dist/analysis/resolve_bot_accounts.js +216 -0
- package/dist/analysis/resolve_bot_accounts.js.map +1 -0
- package/dist/analysis/trade_profitability.d.ts.map +1 -1
- package/dist/analysis/trade_profitability.js +40 -8
- package/dist/analysis/trade_profitability.js.map +1 -1
- package/dist/analysis/tradingview/analyze_tradingview.js +2 -2
- package/dist/analysis/tradingview/analyze_tradingview.js.map +1 -1
- package/dist/bot.d.ts.map +1 -1
- package/dist/bot.js +2 -1
- package/dist/bot.js.map +1 -1
- package/dist/dexbot.d.ts.map +1 -1
- package/dist/dexbot.js +73 -17
- package/dist/dexbot.js.map +1 -1
- package/dist/market_adapter/ama_signal_runner.js +2 -2
- package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js +2 -1
- package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js.map +1 -1
- package/dist/market_adapter/inputs/fetch_lp_data.d.ts +4 -1
- package/dist/market_adapter/inputs/fetch_lp_data.d.ts.map +1 -1
- package/dist/market_adapter/inputs/fetch_lp_data.js +3 -2
- package/dist/market_adapter/inputs/fetch_lp_data.js.map +1 -1
- package/dist/modules/account_bots.d.ts +42 -1
- package/dist/modules/account_bots.d.ts.map +1 -1
- package/dist/modules/account_bots.js +168 -17
- package/dist/modules/account_bots.js.map +1 -1
- package/dist/modules/account_orders.d.ts +7 -1
- package/dist/modules/account_orders.d.ts.map +1 -1
- package/dist/modules/account_orders.js +34 -1
- package/dist/modules/account_orders.js.map +1 -1
- package/dist/modules/bitshares_client.d.ts +4 -1
- package/dist/modules/bitshares_client.d.ts.map +1 -1
- package/dist/modules/bitshares_client.js +12 -4
- package/dist/modules/bitshares_client.js.map +1 -1
- package/dist/modules/bot_settings.d.ts.map +1 -1
- package/dist/modules/bot_settings.js +2 -1
- package/dist/modules/bot_settings.js.map +1 -1
- package/dist/modules/cli_colors.d.ts +39 -0
- package/dist/modules/cli_colors.d.ts.map +1 -0
- package/dist/modules/cli_colors.js +42 -0
- package/dist/modules/cli_colors.js.map +1 -0
- package/dist/modules/constants.d.ts +2 -0
- package/dist/modules/constants.d.ts.map +1 -1
- package/dist/modules/constants.js +27 -11
- package/dist/modules/constants.js.map +1 -1
- package/dist/modules/credit_pricing.d.ts +61 -0
- package/dist/modules/credit_pricing.d.ts.map +1 -0
- package/dist/modules/credit_pricing.js +237 -0
- package/dist/modules/credit_pricing.js.map +1 -0
- package/dist/modules/credit_runtime.d.ts +1 -0
- package/dist/modules/credit_runtime.d.ts.map +1 -1
- package/dist/modules/credit_runtime.js +49 -107
- package/dist/modules/credit_runtime.js.map +1 -1
- package/dist/modules/dexbot_class.d.ts +3 -1
- package/dist/modules/dexbot_class.d.ts.map +1 -1
- package/dist/modules/dexbot_class.js +22 -6
- package/dist/modules/dexbot_class.js.map +1 -1
- package/dist/modules/dexbot_cow_runtime.d.ts +36 -2
- package/dist/modules/dexbot_cow_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_cow_runtime.js +434 -20
- package/dist/modules/dexbot_cow_runtime.js.map +1 -1
- package/dist/modules/dexbot_maintenance_runtime.d.ts +15 -16
- package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_maintenance_runtime.js +69 -42
- package/dist/modules/dexbot_maintenance_runtime.js.map +1 -1
- package/dist/modules/dexbot_startup_runtime.d.ts +1 -0
- package/dist/modules/dexbot_startup_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_startup_runtime.js +12 -1
- package/dist/modules/dexbot_startup_runtime.js.map +1 -1
- package/dist/modules/dexbot_state_recovery.d.ts.map +1 -1
- package/dist/modules/dexbot_state_recovery.js +7 -0
- package/dist/modules/dexbot_state_recovery.js.map +1 -1
- package/dist/modules/fund_registry.d.ts +1 -1
- package/dist/modules/fund_registry.js +1 -1
- package/dist/modules/launcher/adapter_requirement.d.ts +38 -0
- package/dist/modules/launcher/adapter_requirement.d.ts.map +1 -0
- package/dist/modules/launcher/adapter_requirement.js +141 -0
- package/dist/modules/launcher/adapter_requirement.js.map +1 -0
- package/dist/modules/launcher/bot_supervisor.d.ts +2 -2
- package/dist/modules/launcher/bot_supervisor.d.ts.map +1 -1
- package/dist/modules/launcher/bot_supervisor.js +32 -3
- package/dist/modules/launcher/bot_supervisor.js.map +1 -1
- package/dist/modules/launcher/launch_modes.d.ts.map +1 -1
- package/dist/modules/launcher/launch_modes.js +5 -4
- package/dist/modules/launcher/launch_modes.js.map +1 -1
- package/dist/modules/launcher/monolithic_runtime.d.ts +1 -1
- package/dist/modules/launcher/monolithic_runtime.d.ts.map +1 -1
- package/dist/modules/launcher/monolithic_runtime.js +12 -8
- package/dist/modules/launcher/monolithic_runtime.js.map +1 -1
- package/dist/modules/launcher/status_reporting.d.ts +6 -6
- package/dist/modules/launcher/status_reporting.d.ts.map +1 -1
- package/dist/modules/launcher/status_reporting.js +9 -6
- package/dist/modules/launcher/status_reporting.js.map +1 -1
- package/dist/modules/order/accounting.d.ts +34 -0
- package/dist/modules/order/accounting.d.ts.map +1 -1
- package/dist/modules/order/accounting.js +182 -5
- package/dist/modules/order/accounting.js.map +1 -1
- package/dist/modules/order/export.d.ts +1 -1
- package/dist/modules/order/export.js +1 -1
- package/dist/modules/order/grid.d.ts.map +1 -1
- package/dist/modules/order/grid.js +68 -28
- package/dist/modules/order/grid.js.map +1 -1
- package/dist/modules/order/grid_reconcile_internal.d.ts.map +1 -1
- package/dist/modules/order/grid_reconcile_internal.js +72 -0
- package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
- package/dist/modules/order/logger.d.ts +23 -1
- package/dist/modules/order/logger.d.ts.map +1 -1
- package/dist/modules/order/logger.js +60 -17
- package/dist/modules/order/logger.js.map +1 -1
- package/dist/modules/order/manager.d.ts +41 -1
- package/dist/modules/order/manager.d.ts.map +1 -1
- package/dist/modules/order/manager.js +186 -17
- package/dist/modules/order/manager.js.map +1 -1
- package/dist/modules/order/strategy.d.ts.map +1 -1
- package/dist/modules/order/strategy.js +17 -2
- package/dist/modules/order/strategy.js.map +1 -1
- package/dist/modules/order/sync_engine.d.ts.map +1 -1
- package/dist/modules/order/sync_engine.js +59 -9
- package/dist/modules/order/sync_engine.js.map +1 -1
- package/dist/modules/order/utils/math.d.ts +42 -1
- package/dist/modules/order/utils/math.d.ts.map +1 -1
- package/dist/modules/order/utils/math.js +91 -1
- package/dist/modules/order/utils/math.js.map +1 -1
- package/dist/modules/order/utils/order.d.ts +52 -1
- package/dist/modules/order/utils/order.d.ts.map +1 -1
- package/dist/modules/order/utils/order.js +137 -7
- package/dist/modules/order/utils/order.js.map +1 -1
- package/dist/modules/order/utils/system.d.ts +66 -4
- package/dist/modules/order/utils/system.d.ts.map +1 -1
- package/dist/modules/order/utils/system.js +156 -16
- package/dist/modules/order/utils/system.js.map +1 -1
- package/dist/modules/order/utils/validate.d.ts +30 -3
- package/dist/modules/order/utils/validate.d.ts.map +1 -1
- package/dist/modules/order/utils/validate.js +206 -11
- package/dist/modules/order/utils/validate.js.map +1 -1
- package/dist/modules/utils/chain_logs.d.ts +11 -0
- package/dist/modules/utils/chain_logs.d.ts.map +1 -0
- package/dist/modules/utils/chain_logs.js +23 -0
- package/dist/modules/utils/chain_logs.js.map +1 -0
- package/dist/modules/utils/sanitize_key.d.ts +7 -0
- package/dist/modules/utils/sanitize_key.d.ts.map +1 -1
- package/dist/modules/utils/sanitize_key.js +15 -0
- package/dist/modules/utils/sanitize_key.js.map +1 -1
- package/dist/pm2.d.ts +11 -1
- package/dist/pm2.d.ts.map +1 -1
- package/dist/pm2.js +66 -15
- package/dist/pm2.js.map +1 -1
- package/dist/scripts/analyze-credit.d.ts +4 -0
- package/dist/scripts/analyze-credit.d.ts.map +1 -0
- package/dist/scripts/analyze-credit.js +760 -0
- package/dist/scripts/analyze-credit.js.map +1 -0
- package/dist/scripts/analyze-orders.d.ts +1 -10
- package/dist/scripts/analyze-orders.d.ts.map +1 -1
- package/dist/scripts/analyze-orders.js +11 -34
- package/dist/scripts/analyze-orders.js.map +1 -1
- package/dist/scripts/test-credit-renewal.d.ts.map +1 -1
- package/dist/scripts/test-credit-renewal.js +37 -5
- package/dist/scripts/test-credit-renewal.js.map +1 -1
- package/dist/scripts/tv.d.ts +11 -0
- package/dist/scripts/tv.d.ts.map +1 -0
- package/dist/scripts/tv.js +357 -0
- package/dist/scripts/tv.js.map +1 -0
- package/dist/scripts/update.js +77 -10
- package/dist/scripts/update.js.map +1 -1
- package/dist/unlock.d.ts.map +1 -1
- package/dist/unlock.js +20 -8
- package/dist/unlock.js.map +1 -1
- package/docs/DEXBOT_COMPARISON.md +3 -3
- package/docs/EVOLUTION.md +8 -6
- package/docs/FUND_MOVEMENT_AND_ACCOUNTING.md +3 -1
- package/docs/GRID_RECONCILE.md +1 -0
- package/docs/LOGGING.md +3 -0
- package/docs/MPA_CREDIT_USAGE.md +3 -1
- package/docs/README.md +2 -2
- package/docs/WORKFLOW.md +3 -1
- package/package.json +2 -1
- package/scripts/README.md +12 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
/**
|
|
3
|
+
* modules/credit_pricing.ts — Canonical credit-pricing math (single source of truth).
|
|
4
|
+
*
|
|
5
|
+
* Pure functions only: no imports, no I/O, browser-safe. Both the live
|
|
6
|
+
* credit runtime (modules/credit_runtime.ts) and the offline analyzer
|
|
7
|
+
* (scripts/analyze-credit.ts) delegate to these helpers so offer-price
|
|
8
|
+
* orientation, conversion rates, and collateral-ratio math cannot drift
|
|
9
|
+
* apart between surfaces.
|
|
10
|
+
*
|
|
11
|
+
* Conventions (mirror the chain's credit_offer_object price layout):
|
|
12
|
+
* - A 'core' price has base == debt asset / quote == collateral asset and
|
|
13
|
+
* the conversion rate (debt per 1 collateral) is base / quote.
|
|
14
|
+
* - A 'legacy-reversed' price has base == collateral / quote == debt and
|
|
15
|
+
* the rate is quote / base. Unknown layouts default to 'core'.
|
|
16
|
+
* - Credit CR = collateralValueInDebt / debtAmount, where
|
|
17
|
+
* collateralValueInDebt = collateralAmount * conversionRate.
|
|
18
|
+
*/
|
|
19
|
+
function toFiniteOrNull(value) {
|
|
20
|
+
const num = typeof value === 'string' && value.trim() !== '' ? Number(value) : Number(value);
|
|
21
|
+
return Number.isFinite(num) ? num : null;
|
|
22
|
+
}
|
|
23
|
+
function positiveOrNull(value) {
|
|
24
|
+
const num = toFiniteOrNull(value);
|
|
25
|
+
return num !== null && num > 0 ? num : null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Tolerantly normalize an offer's acceptable_collateral map, which arrives
|
|
29
|
+
* in different shapes depending on the API path (Map, [[id, price]] pairs,
|
|
30
|
+
* [{key, value}] entries, or a plain {assetId: price} object).
|
|
31
|
+
*/
|
|
32
|
+
function normalizeCollateralMap(raw) {
|
|
33
|
+
const out = new Map();
|
|
34
|
+
if (raw instanceof Map) {
|
|
35
|
+
for (const [key, value] of raw.entries()) {
|
|
36
|
+
if (key && value)
|
|
37
|
+
out.set(String(key), value);
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
if (Array.isArray(raw)) {
|
|
42
|
+
for (const entry of raw) {
|
|
43
|
+
if (Array.isArray(entry) && entry.length >= 2 && entry[0] && entry[1]) {
|
|
44
|
+
out.set(String(entry[0]), entry[1]);
|
|
45
|
+
}
|
|
46
|
+
else if (entry && typeof entry === 'object' && entry.key && entry.value) {
|
|
47
|
+
out.set(String(entry.key), entry.value);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
if (raw && typeof raw === 'object') {
|
|
53
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
54
|
+
if (key && value)
|
|
55
|
+
out.set(String(key), value);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
function creditPriceOrientation(baseAssetId, quoteAssetId, debtAssetId, collateralAssetId) {
|
|
61
|
+
if (String(baseAssetId) === String(debtAssetId) && String(quoteAssetId) === String(collateralAssetId)) {
|
|
62
|
+
return 'core';
|
|
63
|
+
}
|
|
64
|
+
if (String(baseAssetId) === String(collateralAssetId) && String(quoteAssetId) === String(debtAssetId)) {
|
|
65
|
+
return 'legacy-reversed';
|
|
66
|
+
}
|
|
67
|
+
return 'core';
|
|
68
|
+
}
|
|
69
|
+
function priceLegToFloat(leg, precision) {
|
|
70
|
+
const raw = toFiniteOrNull(leg?.amount);
|
|
71
|
+
if (raw === null || raw <= 0 || precision === null || !Number.isFinite(precision) || precision < 0) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
const float = raw / Math.pow(10, precision);
|
|
75
|
+
return float > 0 ? float : null;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Extract the conversion rate (debt asset per 1 collateral unit) for a
|
|
79
|
+
* collateral asset from an offer's acceptable_collateral map.
|
|
80
|
+
*
|
|
81
|
+
* @param offerCollateral - Raw acceptable_collateral in any supported shape
|
|
82
|
+
* @param collateralAssetId - Collateral asset ID to look up
|
|
83
|
+
* @param debtAssetId - Debt asset ID (determines price orientation)
|
|
84
|
+
* @param precisionOf - (assetId) => precision, or null when unknown
|
|
85
|
+
* @returns Debt-per-collateral rate, or null when not listed/unresolvable
|
|
86
|
+
*/
|
|
87
|
+
function extractOfferConversionRate(offerCollateral, collateralAssetId, debtAssetId, precisionOf) {
|
|
88
|
+
const map = normalizeCollateralMap(offerCollateral);
|
|
89
|
+
const price = map.get(String(collateralAssetId));
|
|
90
|
+
if (!price)
|
|
91
|
+
return null;
|
|
92
|
+
const baseId = String(price?.base?.asset_id || '');
|
|
93
|
+
const quoteId = String(price?.quote?.asset_id || '');
|
|
94
|
+
if (!baseId || !quoteId)
|
|
95
|
+
return null;
|
|
96
|
+
const orientation = creditPriceOrientation(baseId, quoteId, String(debtAssetId), String(collateralAssetId));
|
|
97
|
+
const baseFloat = priceLegToFloat(price?.base, precisionOf(baseId));
|
|
98
|
+
const quoteFloat = priceLegToFloat(price?.quote, precisionOf(quoteId));
|
|
99
|
+
if (baseFloat === null || quoteFloat === null)
|
|
100
|
+
return null;
|
|
101
|
+
const rate = orientation === 'legacy-reversed' ? quoteFloat / baseFloat : baseFloat / quoteFloat;
|
|
102
|
+
return Number.isFinite(rate) && rate > 0 ? rate : null;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Resolve the single offer price for a collateral asset. Accepts either the
|
|
106
|
+
* full acceptable_collateral map (looked up by collateral asset ID) or the
|
|
107
|
+
* bare { base, quote } price object the runtime already selected.
|
|
108
|
+
*/
|
|
109
|
+
function asOfferPrice(collateralPriceOrMap, collateralAssetId) {
|
|
110
|
+
const hit = normalizeCollateralMap(collateralPriceOrMap).get(String(collateralAssetId));
|
|
111
|
+
if (hit)
|
|
112
|
+
return hit;
|
|
113
|
+
const raw = collateralPriceOrMap;
|
|
114
|
+
if (raw && typeof raw === 'object' && raw.base && raw.quote)
|
|
115
|
+
return raw;
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Value collateral (raw int) in debt-asset units via an offer price.
|
|
120
|
+
* Pure offer-math leg of the runtime's pool-aware valuation.
|
|
121
|
+
*/
|
|
122
|
+
function collateralValueFromOfferPrice(collateralAmountInt, collateralPrecision, collateralPriceOrMap, debtAssetId, collateralAssetId, precisionOf) {
|
|
123
|
+
const collRaw = toFiniteOrNull(collateralAmountInt);
|
|
124
|
+
const collPrec = toFiniteOrNull(collateralPrecision);
|
|
125
|
+
if (collRaw === null || collRaw <= 0 || collPrec === null)
|
|
126
|
+
return null;
|
|
127
|
+
const collateralFloat = collRaw / Math.pow(10, collPrec);
|
|
128
|
+
if (!(collateralFloat > 0))
|
|
129
|
+
return null;
|
|
130
|
+
const price = asOfferPrice(collateralPriceOrMap, collateralAssetId);
|
|
131
|
+
if (!price)
|
|
132
|
+
return null;
|
|
133
|
+
const rate = extractOfferConversionRate({ [String(collateralAssetId)]: price }, collateralAssetId, debtAssetId, precisionOf);
|
|
134
|
+
if (rate === null)
|
|
135
|
+
return null;
|
|
136
|
+
return collateralFloat * rate;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Minimum raw collateral required to borrow a raw debt amount at a price.
|
|
140
|
+
* Integer ceil so the borrow is never under-collateralized by rounding.
|
|
141
|
+
*/
|
|
142
|
+
function requiredCollateralForBorrow(borrowAmountInt, collateralPrice, debtAssetId = null, collateralAssetId = null) {
|
|
143
|
+
const borrowRaw = toFiniteOrNull(borrowAmountInt);
|
|
144
|
+
const baseAmount = toFiniteOrNull(collateralPrice?.base?.amount);
|
|
145
|
+
const quoteAmount = toFiniteOrNull(collateralPrice?.quote?.amount);
|
|
146
|
+
if (borrowRaw === null || borrowRaw <= 0 || baseAmount === null || quoteAmount === null || baseAmount <= 0 || quoteAmount <= 0) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
const orientation = creditPriceOrientation(String(collateralPrice?.base?.asset_id || ''), String(collateralPrice?.quote?.asset_id || ''), String(debtAssetId || ''), String(collateralAssetId || ''));
|
|
150
|
+
if (orientation === 'legacy-reversed') {
|
|
151
|
+
return Math.ceil((Number(borrowAmountInt) * baseAmount) / quoteAmount);
|
|
152
|
+
}
|
|
153
|
+
return Math.ceil((Number(borrowAmountInt) * quoteAmount) / baseAmount);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Raw debt yielded by raw collateral at a price. Integer floor so the
|
|
157
|
+
* borrow never exceeds what the collateral covers.
|
|
158
|
+
*/
|
|
159
|
+
function borrowAmountForCollateral(collateralAmountInt, collateralPrice, debtAssetId = null, collateralAssetId = null) {
|
|
160
|
+
const collRaw = toFiniteOrNull(collateralAmountInt);
|
|
161
|
+
const baseAmount = toFiniteOrNull(collateralPrice?.base?.amount);
|
|
162
|
+
const quoteAmount = toFiniteOrNull(collateralPrice?.quote?.amount);
|
|
163
|
+
if (collRaw === null || collRaw <= 0 || baseAmount === null || quoteAmount === null || baseAmount <= 0 || quoteAmount <= 0) {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
const orientation = creditPriceOrientation(String(collateralPrice?.base?.asset_id || ''), String(collateralPrice?.quote?.asset_id || ''), String(debtAssetId || ''), String(collateralAssetId || ''));
|
|
167
|
+
if (orientation === 'legacy-reversed') {
|
|
168
|
+
return Math.floor((Number(collateralAmountInt) * quoteAmount) / baseAmount);
|
|
169
|
+
}
|
|
170
|
+
return Math.floor((Number(collateralAmountInt) * baseAmount) / quoteAmount);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Per-deal CR from floats plus a conversion rate:
|
|
174
|
+
* (collateralFloat * rate) / debtFloat.
|
|
175
|
+
*/
|
|
176
|
+
function creditDealCollateralRatio(debtFloat, collateralFloat, rate) {
|
|
177
|
+
const debt = positiveOrNull(debtFloat);
|
|
178
|
+
const coll = toFiniteOrNull(collateralFloat);
|
|
179
|
+
const price = positiveOrNull(rate);
|
|
180
|
+
if (debt === null || coll === null || coll < 0 || price === null)
|
|
181
|
+
return null;
|
|
182
|
+
return (coll * price) / debt;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Value-weighted average CR = sum(collateral values) / sum(debts), so one
|
|
186
|
+
* large deal correctly dominates many dust deals. Unpriced entries (null
|
|
187
|
+
* debt/value) are skipped by the caller convention — entries with
|
|
188
|
+
* non-positive debt are ignored here as well.
|
|
189
|
+
*/
|
|
190
|
+
function averageCollateralRatio(entries) {
|
|
191
|
+
let debtSum = 0;
|
|
192
|
+
let valueSum = 0;
|
|
193
|
+
for (const entry of entries || []) {
|
|
194
|
+
const debt = positiveOrNull(entry?.debt);
|
|
195
|
+
const value = toFiniteOrNull(entry?.value);
|
|
196
|
+
if (debt === null || value === null || value < 0)
|
|
197
|
+
continue;
|
|
198
|
+
debtSum += debt;
|
|
199
|
+
valueSum += value;
|
|
200
|
+
}
|
|
201
|
+
if (!(debtSum > 0))
|
|
202
|
+
return null;
|
|
203
|
+
return valueSum / debtSum;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Flat offer fee prorated per day: (feeRate / denom) / (durationDays).
|
|
207
|
+
* Returns 0 for missing/non-positive inputs (matches runtime gating, where
|
|
208
|
+
* a zero daily rate never exceeds maxFeeRatePerDay).
|
|
209
|
+
*/
|
|
210
|
+
function dailyOfferFeeRate(offer, feeDenom) {
|
|
211
|
+
const feeRate = toFiniteOrNull(offer?.fee_rate);
|
|
212
|
+
const maxDurationSeconds = toFiniteOrNull(offer?.max_duration_seconds);
|
|
213
|
+
const denom = toFiniteOrNull(feeDenom);
|
|
214
|
+
if (feeRate === null || maxDurationSeconds === null || denom === null || feeRate <= 0 || maxDurationSeconds <= 0 || denom <= 0) {
|
|
215
|
+
return 0;
|
|
216
|
+
}
|
|
217
|
+
return (feeRate / denom) / (maxDurationSeconds / 86400);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Credit-deal repay fee in raw debt units, rounded up (Graphene ceil):
|
|
221
|
+
* (repay * feeRate + denom - 1) / denom. Zero when nothing is owed.
|
|
222
|
+
*/
|
|
223
|
+
function creditDealFee(repayAmountInt, feeRate, feeDenom) {
|
|
224
|
+
const repayRaw = toFiniteOrNull(repayAmountInt);
|
|
225
|
+
const rateRaw = toFiniteOrNull(feeRate);
|
|
226
|
+
const denomRaw = toFiniteOrNull(feeDenom);
|
|
227
|
+
if (repayRaw === null || rateRaw === null || denomRaw === null || denomRaw <= 0)
|
|
228
|
+
return 0;
|
|
229
|
+
const repay = BigInt(Math.max(0, Math.trunc(repayRaw)));
|
|
230
|
+
const rate = BigInt(Math.max(0, Math.trunc(rateRaw)));
|
|
231
|
+
const denom = BigInt(Math.max(1, Math.trunc(denomRaw)));
|
|
232
|
+
if (repay <= 0n || rate <= 0n)
|
|
233
|
+
return 0;
|
|
234
|
+
return Number(((repay * rate) + denom - 1n) / denom);
|
|
235
|
+
}
|
|
236
|
+
export { normalizeCollateralMap, creditPriceOrientation, extractOfferConversionRate, collateralValueFromOfferPrice, requiredCollateralForBorrow, borrowAmountForCollateral, creditDealCollateralRatio, averageCollateralRatio, dailyOfferFeeRate, creditDealFee, };
|
|
237
|
+
//# sourceMappingURL=credit_pricing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credit_pricing.js","sourceRoot":"","sources":["../../modules/credit_pricing.ts"],"names":[],"mappings":"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"}
|
|
@@ -83,6 +83,7 @@ declare class CreditRuntime {
|
|
|
83
83
|
}): Promise<any>;
|
|
84
84
|
_calculateCollateralDistribution(): Promise<void>;
|
|
85
85
|
_creditPriceOrientation(collateralPrice: any, debtAsset: any, collateralAsset: any): string;
|
|
86
|
+
_precisionOfPair(debtAsset: any, collateralAsset: any): (assetId: string) => number | null;
|
|
86
87
|
_extractRateFromCollateralMap(collateralMap: Map<string, any>, collateralAssetId: string, debtAsset: any, collateralAsset: any): number | null;
|
|
87
88
|
_calculateBorrowAmountFromCollateral(collateralAmountInt: any, collateralPrice: any, debtAsset?: any, collateralAsset?: any): number | null;
|
|
88
89
|
_enforceMaxBorrowAmount(policy: any, borrowInt: any, debtAsset: any, options?: Record<string, any>): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credit_runtime.d.ts","sourceRoot":"","sources":["../../modules/credit_runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"credit_runtime.d.ts","sourceRoot":"","sources":["../../modules/credit_runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,9 +14,10 @@ import { writeJsonFileAtomic } from './bots_file_lock.js';
|
|
|
14
14
|
import { resolveAssetByRef, nowIso } from './order/utils/system.js';
|
|
15
15
|
import { FEE_PARAMETERS, DEFAULT_TARGET_CR, TIMING, NATIVE_CLIENT } from './constants.js';
|
|
16
16
|
import { PATHS } from './paths.js';
|
|
17
|
-
import { deriveLiquidityPoolTokenValue, ensureDir as ensureDirSync, } from './order/utils/system.js';
|
|
17
|
+
import { deriveLiquidityPoolTokenValue, derivePriceWithBridges, ensureDir as ensureDirSync, } from './order/utils/system.js';
|
|
18
18
|
const storage = getStorage();
|
|
19
19
|
import { buildCollateralFallbackPlan, buildDebtFirstCrPlan, positiveOrNull, resolveMinCollateralIncreaseThreshold, resolveTargetCollateralRatio, } from './cr_planner.js';
|
|
20
|
+
import { borrowAmountForCollateral as sharedBorrowAmountForCollateral, collateralValueFromOfferPrice as sharedCollateralValueFromOfferPrice, creditDealFee as sharedCreditDealFee, creditPriceOrientation as sharedCreditPriceOrientation, dailyOfferFeeRate as sharedDailyOfferFeeRate, extractOfferConversionRate as sharedExtractOfferConversionRate, normalizeCollateralMap, requiredCollateralForBorrow as sharedRequiredCollateralForBorrow, } from './credit_pricing.js';
|
|
20
21
|
import { getErrorMessage } from './utils/errors.js';
|
|
21
22
|
const CREDIT_FEE_RATE_DENOM = FEE_PARAMETERS.GRAPHENE_FEE_RATE_DENOM;
|
|
22
23
|
const ZERO_ASSET_ID = NATIVE_CLIENT.CHAIN.CORE_ASSET_ID;
|
|
@@ -62,19 +63,6 @@ function toGrapheneCollateralRatio(value) {
|
|
|
62
63
|
const scaled = Math.round(numeric * GRAPHENE_COLLATERAL_RATIO_DENOM);
|
|
63
64
|
return Number.isInteger(scaled) && scaled > 0 && scaled <= 0xffff ? scaled : null;
|
|
64
65
|
}
|
|
65
|
-
function getMapEntries(value) {
|
|
66
|
-
if (value instanceof Map)
|
|
67
|
-
return Array.from(value.entries());
|
|
68
|
-
if (Array.isArray(value)) {
|
|
69
|
-
if (value.length > 0 && typeof value[0] === 'object' && !Array.isArray(value[0]) && value[0] !== null && 'key' in value[0] && 'value' in value[0]) {
|
|
70
|
-
return value.map((item) => [item.key, item.value]);
|
|
71
|
-
}
|
|
72
|
-
return value;
|
|
73
|
-
}
|
|
74
|
-
if (value && typeof value === 'object')
|
|
75
|
-
return Object.entries(value);
|
|
76
|
-
return [];
|
|
77
|
-
}
|
|
78
66
|
function getPriceQuoteAssetId(price) {
|
|
79
67
|
return price?.quote?.asset_id || null;
|
|
80
68
|
}
|
|
@@ -115,15 +103,6 @@ function isMaxBorrowAmountError(err) {
|
|
|
115
103
|
const message = String(err?.message || err || '');
|
|
116
104
|
return /would exceed maxBorrowAmount/.test(message) || /exceeds maxBorrowAmountPerOperation/.test(message);
|
|
117
105
|
}
|
|
118
|
-
function normalizeCollateralMap(acceptableCollateral) {
|
|
119
|
-
const result = new Map();
|
|
120
|
-
for (const [assetId, price] of getMapEntries(acceptableCollateral)) {
|
|
121
|
-
if (!assetId || !price)
|
|
122
|
-
continue;
|
|
123
|
-
result.set(String(assetId), price);
|
|
124
|
-
}
|
|
125
|
-
return result;
|
|
126
|
-
}
|
|
127
106
|
function resolveAutoRepayValue(value) {
|
|
128
107
|
if (value === true)
|
|
129
108
|
return 1;
|
|
@@ -724,13 +703,16 @@ class CreditRuntime {
|
|
|
724
703
|
}
|
|
725
704
|
}
|
|
726
705
|
// Offer map had no usable entry — fall back to pool derivation for LP
|
|
727
|
-
// shares
|
|
706
|
+
// shares, then to universal DEX pricing (direct market, else bridge
|
|
707
|
+
// hops via BTS) so every collateral/debt pair resolves a rate even
|
|
708
|
+
// when the collateral or pool is not part of the credit offer.
|
|
709
|
+
// Only attempt when cached is stale to avoid hourly
|
|
728
710
|
// deriveLiquidityPoolTokenValue failures when a fresh live-offer rate
|
|
729
711
|
// would already have returned. Reuses debtAsset/collateralAsset
|
|
730
712
|
// resolved above.
|
|
731
713
|
if (!cachedIsFresh) {
|
|
732
714
|
if (collateralAsset?.for_liquidity_pool && debtAsset?.id) {
|
|
733
|
-
const poolRate = await deriveLiquidityPoolTokenValue(BitShares, collateralAsset.id, debtAsset.id).catch((e) => {
|
|
715
|
+
const poolRate = await deriveLiquidityPoolTokenValue(BitShares, collateralAsset.id, debtAsset.id, 'auto', true).catch((e) => {
|
|
734
716
|
this.log(`credit runtime: pool token rate derivation failed for ${collateralAsset.id}/${debtAsset.id}: ${getErrorMessage(e)}`);
|
|
735
717
|
return null;
|
|
736
718
|
});
|
|
@@ -742,6 +724,20 @@ class CreditRuntime {
|
|
|
742
724
|
return options.includeSource ? { price: poolRate, source: 'pool-derived' } : poolRate;
|
|
743
725
|
}
|
|
744
726
|
}
|
|
727
|
+
if (collateralAsset?.id && debtAsset?.id) {
|
|
728
|
+
const bridged = await derivePriceWithBridges(BitShares, collateralAsset.id, debtAsset.id).catch((e) => {
|
|
729
|
+
this.log(`credit runtime: market rate derivation failed for ${collateralAsset.id}/${debtAsset.id}: ${getErrorMessage(e)}`);
|
|
730
|
+
return null;
|
|
731
|
+
});
|
|
732
|
+
if (bridged && Number.isFinite(bridged.rate) && bridged.rate > 0) {
|
|
733
|
+
if (!this.state.positions[posKey])
|
|
734
|
+
this.state.positions[posKey] = {};
|
|
735
|
+
this.state.positions[posKey].creditConversionRate = bridged.rate;
|
|
736
|
+
this.state.positions[posKey].creditConversionRateAt = Date.now();
|
|
737
|
+
const source = bridged.path === 'direct' ? 'market-direct' : `market-${bridged.path}`;
|
|
738
|
+
return options.includeSource ? { price: bridged.rate, source } : bridged.rate;
|
|
739
|
+
}
|
|
740
|
+
}
|
|
745
741
|
}
|
|
746
742
|
if (options.includeSource) {
|
|
747
743
|
return cachedIsFresh
|
|
@@ -865,42 +861,29 @@ class CreditRuntime {
|
|
|
865
861
|
}
|
|
866
862
|
}
|
|
867
863
|
_creditPriceOrientation(collateralPrice, debtAsset, collateralAsset) {
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
864
|
+
return sharedCreditPriceOrientation(String(collateralPrice?.base?.asset_id || ''), String(collateralPrice?.quote?.asset_id || ''), String(debtAsset?.id || ''), String(collateralAsset?.id || ''));
|
|
865
|
+
}
|
|
866
|
+
_precisionOfPair(debtAsset, collateralAsset) {
|
|
867
|
+
return (assetId) => {
|
|
868
|
+
if (debtAsset && String(assetId) === String(debtAsset.id))
|
|
869
|
+
return getAssetPrecision(debtAsset);
|
|
870
|
+
if (collateralAsset && String(assetId) === String(collateralAsset.id))
|
|
871
|
+
return getAssetPrecision(collateralAsset);
|
|
872
|
+
return null;
|
|
873
|
+
};
|
|
877
874
|
}
|
|
878
875
|
_extractRateFromCollateralMap(collateralMap, collateralAssetId, debtAsset, collateralAsset) {
|
|
879
|
-
const
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
return null;
|
|
887
|
-
const rate = orientation === 'legacy-reversed'
|
|
888
|
-
? quoteAmount / baseAmount
|
|
889
|
-
: baseAmount / quoteAmount;
|
|
890
|
-
if (!Number.isFinite(rate) || rate <= 0)
|
|
891
|
-
return null;
|
|
876
|
+
const rate = sharedExtractOfferConversionRate(collateralMap, String(collateralAssetId), String(debtAsset?.id || ''), this._precisionOfPair(debtAsset, collateralAsset));
|
|
877
|
+
// The offer lists this collateral but the price is unusable (missing
|
|
878
|
+
// asset precision or invalid base/quote amounts) — log it, otherwise
|
|
879
|
+
// the null is indistinguishable from "not listed" downstream.
|
|
880
|
+
if (rate === null && collateralMap?.get(String(collateralAssetId)) != null) {
|
|
881
|
+
this.log(`credit runtime: offer lists ${collateralAssetId} but its price cannot be resolved (missing precision or invalid base/quote amounts)`);
|
|
882
|
+
}
|
|
892
883
|
return rate;
|
|
893
884
|
}
|
|
894
885
|
_calculateBorrowAmountFromCollateral(collateralAmountInt, collateralPrice, debtAsset = null, collateralAsset = null) {
|
|
895
|
-
|
|
896
|
-
const quoteAmount = toFiniteNumber(collateralPrice?.quote?.amount, undefined);
|
|
897
|
-
if (!Number.isFinite(baseAmount) || !Number.isFinite(quoteAmount) || baseAmount <= 0 || quoteAmount <= 0) {
|
|
898
|
-
return null;
|
|
899
|
-
}
|
|
900
|
-
if (this._creditPriceOrientation(collateralPrice, debtAsset, collateralAsset) === 'legacy-reversed') {
|
|
901
|
-
return Math.floor((Number(collateralAmountInt) * quoteAmount) / baseAmount);
|
|
902
|
-
}
|
|
903
|
-
return Math.floor((Number(collateralAmountInt) * baseAmount) / quoteAmount);
|
|
886
|
+
return sharedBorrowAmountForCollateral(collateralAmountInt, collateralPrice, debtAsset?.id != null ? String(debtAsset.id) : null, collateralAsset?.id != null ? String(collateralAsset.id) : null);
|
|
904
887
|
}
|
|
905
888
|
_enforceMaxBorrowAmount(policy, borrowInt, debtAsset, options = {}) {
|
|
906
889
|
const maxBorrowAmountValue = positiveOrNull(policy?.maxBorrowAmount);
|
|
@@ -1002,14 +985,8 @@ class CreditRuntime {
|
|
|
1002
985
|
}
|
|
1003
986
|
}
|
|
1004
987
|
_calculateDailyFeeRate(offer) {
|
|
1005
|
-
const feeRate = toFiniteNumber(offer?.fee_rate, 0) || 0;
|
|
1006
|
-
const maxDurationSeconds = toFiniteNumber(offer?.max_duration_seconds, 0) || 0;
|
|
1007
|
-
if (feeRate <= 0 || maxDurationSeconds <= 0)
|
|
1008
|
-
return 0;
|
|
1009
988
|
const feeRateDenom = this.bot?.config?.feeParams?.GRAPHENE_FEE_RATE_DENOM ?? FEE_PARAMETERS.GRAPHENE_FEE_RATE_DENOM;
|
|
1010
|
-
|
|
1011
|
-
const durationDays = maxDurationSeconds / 86400;
|
|
1012
|
-
return flatFeePercent / durationDays;
|
|
989
|
+
return sharedDailyOfferFeeRate(offer, feeRateDenom);
|
|
1013
990
|
}
|
|
1014
991
|
_getDefaultMaxFeeRatePerDay() {
|
|
1015
992
|
return this.bot?.config?.feeParams?.DEFAULT_MAX_FEE_RATE_PER_DAY ?? FEE_PARAMETERS.DEFAULT_MAX_FEE_RATE_PER_DAY;
|
|
@@ -1046,43 +1023,21 @@ class CreditRuntime {
|
|
|
1046
1023
|
return { allow: true, reason: null };
|
|
1047
1024
|
}
|
|
1048
1025
|
async _calculateCollateralValueInDebtAsset(collateralAmountInt, collateralAsset, debtAsset, collateralPrice) {
|
|
1049
|
-
const collateralAmountFloat = blockchainToFloat(collateralAmountInt, collateralAsset.precision);
|
|
1050
|
-
if (!Number.isFinite(collateralAmountFloat) || collateralAmountFloat <= 0) {
|
|
1051
|
-
return null;
|
|
1052
|
-
}
|
|
1053
1026
|
if (collateralAsset?.for_liquidity_pool) {
|
|
1054
|
-
const
|
|
1027
|
+
const collateralAmountFloat = blockchainToFloat(collateralAmountInt, collateralAsset.precision);
|
|
1028
|
+
if (!Number.isFinite(collateralAmountFloat) || collateralAmountFloat <= 0) {
|
|
1029
|
+
return null;
|
|
1030
|
+
}
|
|
1031
|
+
const valuePerShare = await deriveLiquidityPoolTokenValue(BitShares, collateralAsset.id, debtAsset.id, 'auto', true);
|
|
1055
1032
|
if (valuePerShare == null || !Number.isFinite(valuePerShare) || valuePerShare <= 0) {
|
|
1056
1033
|
return null;
|
|
1057
1034
|
}
|
|
1058
1035
|
return collateralAmountFloat * valuePerShare;
|
|
1059
1036
|
}
|
|
1060
|
-
|
|
1061
|
-
const baseAmountFloat = blockchainAmountToFloat(collateralPrice?.base, orientation === 'legacy-reversed' ? collateralAsset : debtAsset);
|
|
1062
|
-
const quoteAmountFloat = blockchainAmountToFloat(collateralPrice?.quote, orientation === 'legacy-reversed' ? debtAsset : collateralAsset);
|
|
1063
|
-
if (baseAmountFloat == null || quoteAmountFloat == null || baseAmountFloat <= 0 || quoteAmountFloat <= 0) {
|
|
1064
|
-
return null;
|
|
1065
|
-
}
|
|
1066
|
-
if (orientation === 'legacy-reversed') {
|
|
1067
|
-
return (collateralAmountFloat * quoteAmountFloat) / baseAmountFloat;
|
|
1068
|
-
}
|
|
1069
|
-
return (collateralAmountFloat * baseAmountFloat) / quoteAmountFloat;
|
|
1037
|
+
return this._calculateCreditOfferCollateralValueInDebtAsset(collateralAmountInt, collateralAsset, debtAsset, collateralPrice);
|
|
1070
1038
|
}
|
|
1071
1039
|
_calculateCreditOfferCollateralValueInDebtAsset(collateralAmountInt, collateralAsset, debtAsset, collateralPrice) {
|
|
1072
|
-
|
|
1073
|
-
if (!Number.isFinite(collateralAmountFloat) || collateralAmountFloat <= 0) {
|
|
1074
|
-
return null;
|
|
1075
|
-
}
|
|
1076
|
-
const orientation = this._creditPriceOrientation(collateralPrice, debtAsset, collateralAsset);
|
|
1077
|
-
const baseAmountFloat = blockchainAmountToFloat(collateralPrice?.base, orientation === 'legacy-reversed' ? collateralAsset : debtAsset);
|
|
1078
|
-
const quoteAmountFloat = blockchainAmountToFloat(collateralPrice?.quote, orientation === 'legacy-reversed' ? debtAsset : collateralAsset);
|
|
1079
|
-
if (baseAmountFloat == null || quoteAmountFloat == null || baseAmountFloat <= 0 || quoteAmountFloat <= 0) {
|
|
1080
|
-
return null;
|
|
1081
|
-
}
|
|
1082
|
-
if (orientation === 'legacy-reversed') {
|
|
1083
|
-
return (collateralAmountFloat * quoteAmountFloat) / baseAmountFloat;
|
|
1084
|
-
}
|
|
1085
|
-
return (collateralAmountFloat * baseAmountFloat) / quoteAmountFloat;
|
|
1040
|
+
return sharedCollateralValueFromOfferPrice(collateralAmountInt, collateralAsset?.precision, collateralPrice, String(debtAsset?.id || ''), String(collateralAsset?.id || ''), this._precisionOfPair(debtAsset, collateralAsset));
|
|
1086
1041
|
}
|
|
1087
1042
|
async _fetchBorrowerDeals() {
|
|
1088
1043
|
if (this._borrowerDealsCache !== null)
|
|
@@ -1677,23 +1632,10 @@ class CreditRuntime {
|
|
|
1677
1632
|
return op;
|
|
1678
1633
|
}
|
|
1679
1634
|
_calculateRequiredCollateral(borrowAmountInt, collateralPrice, debtAsset = null, collateralAsset = null) {
|
|
1680
|
-
|
|
1681
|
-
const quoteAmount = toFiniteNumber(collateralPrice?.quote?.amount, undefined);
|
|
1682
|
-
if (!Number.isFinite(baseAmount) || !Number.isFinite(quoteAmount) || baseAmount <= 0 || quoteAmount <= 0) {
|
|
1683
|
-
return null;
|
|
1684
|
-
}
|
|
1685
|
-
if (this._creditPriceOrientation(collateralPrice, debtAsset, collateralAsset) === 'legacy-reversed') {
|
|
1686
|
-
return Math.ceil((Number(borrowAmountInt) * baseAmount) / quoteAmount);
|
|
1687
|
-
}
|
|
1688
|
-
return Math.ceil((Number(borrowAmountInt) * quoteAmount) / baseAmount);
|
|
1635
|
+
return sharedRequiredCollateralForBorrow(borrowAmountInt, collateralPrice, debtAsset?.id != null ? String(debtAsset.id) : null, collateralAsset?.id != null ? String(collateralAsset.id) : null);
|
|
1689
1636
|
}
|
|
1690
1637
|
_calculateCreditFee(repayAmountInt, feeRate) {
|
|
1691
|
-
|
|
1692
|
-
const rate = BigInt(Math.max(0, Math.trunc(Number(feeRate))));
|
|
1693
|
-
const denom = BigInt(CREDIT_FEE_RATE_DENOM);
|
|
1694
|
-
if (repay <= 0n || rate <= 0n)
|
|
1695
|
-
return 0;
|
|
1696
|
-
return Number(((repay * rate) + denom - 1n) / denom);
|
|
1638
|
+
return sharedCreditDealFee(repayAmountInt, feeRate, CREDIT_FEE_RATE_DENOM);
|
|
1697
1639
|
}
|
|
1698
1640
|
async buildCreditDealRepayOperation(deal, repayAmount) {
|
|
1699
1641
|
const dealSummary = typeof deal === 'object' ? parseDealSummary(deal) : null;
|