@gearbox-protocol/sdk 17.6.0 → 17.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/onchain/accounts/intents/borrow.js +1 -1
- package/dist/cjs/onchain/accounts/intents/math.js +3 -2
- package/dist/cjs/onchain/accounts/intents/open-strategy.js +1 -1
- package/dist/cjs/onchain/accounts/intents/plan.js +6 -5
- package/dist/cjs/onchain/accounts/intents/view.js +4 -3
- package/dist/esm/onchain/accounts/intents/borrow.js +1 -1
- package/dist/esm/onchain/accounts/intents/math.js +3 -2
- package/dist/esm/onchain/accounts/intents/open-strategy.js +1 -1
- package/dist/esm/onchain/accounts/intents/plan.js +6 -5
- package/dist/esm/onchain/accounts/intents/view.js +4 -3
- package/dist/types/onchain/accounts/intents/math.d.ts +3 -1
- package/dist/types/onchain/accounts/intents/plan.d.ts +3 -0
- package/dist/types/onchain/validation/checks/checkDebtLimits.d.ts +1 -1
- package/package.json +1 -1
|
@@ -55,7 +55,7 @@ async function buildBorrowState(props) {
|
|
|
55
55
|
totalDebt: market.toUnderlyingAmount(debt),
|
|
56
56
|
netValue: market.toUnderlyingAmount(margin - debt)
|
|
57
57
|
});
|
|
58
|
-
require_onchain_accounts_intents_math.assertDebtLimits(sdk, debt, suite.creditFacade, underlying);
|
|
58
|
+
require_onchain_accounts_intents_math.assertDebtLimits(sdk, debt, suite.creditFacade, underlying, suite.maxBorrowAmount());
|
|
59
59
|
require_onchain_accounts_intents_guards.assertCanBorrow(sdk, suite, debt);
|
|
60
60
|
const account = existing ?? require_onchain_accounts_intents_utils_credit_account_slice.unopenedAccountSlice({
|
|
61
61
|
creditManager,
|
|
@@ -56,13 +56,14 @@ function assertLeverageAtLeastOne(leverage) {
|
|
|
56
56
|
* Rejects a debt the facade would revert on: zero is always fine (no loan at
|
|
57
57
|
* all), anything else has to sit inside `[minDebt, maxDebt]`.
|
|
58
58
|
*/
|
|
59
|
-
function assertDebtLimits(sdk, debt, debtLimits, underlying) {
|
|
59
|
+
function assertDebtLimits(sdk, debt, debtLimits, underlying, maxBorrowAmount) {
|
|
60
60
|
require_onchain_validation_raise.raise(require_onchain_validation_checks_checkDebtLimits.checkDebtLimits({
|
|
61
61
|
debt,
|
|
62
62
|
minDebt: debtLimits.minDebt,
|
|
63
63
|
maxDebt: debtLimits.maxDebt,
|
|
64
64
|
underlying: require_onchain_validation_helpers_token.toToken(sdk, underlying),
|
|
65
|
-
allowZero: true
|
|
65
|
+
allowZero: true,
|
|
66
|
+
maxBorrowAmount
|
|
66
67
|
}), debt > debtLimits.maxDebt ? `debt ${debt} exceeds maxDebt ${debtLimits.maxDebt}` : `debt ${debt} is below minDebt ${debtLimits.minDebt}`);
|
|
67
68
|
}
|
|
68
69
|
//#endregion
|
|
@@ -45,7 +45,7 @@ async function buildOpenStrategyState(props) {
|
|
|
45
45
|
creditFacade: suite.creditFacade.address,
|
|
46
46
|
underlying
|
|
47
47
|
});
|
|
48
|
-
require_onchain_accounts_intents_math.assertDebtLimits(sdk, debt, suite.creditFacade, underlying);
|
|
48
|
+
require_onchain_accounts_intents_math.assertDebtLimits(sdk, debt, suite.creditFacade, underlying, suite.maxBorrowAmount());
|
|
49
49
|
require_onchain_accounts_intents_guards.assertCanBorrow(sdk, suite, debt);
|
|
50
50
|
const paths = require_onchain_accounts_intents_utils_router_path.createRouterPaths({
|
|
51
51
|
sdk,
|
|
@@ -43,7 +43,7 @@ function planDeposit(intent, view) {
|
|
|
43
43
|
const aU = view.price(intent.token, U, intent.amount);
|
|
44
44
|
const debtDelta = intent.targetLeverage === void 0 ? require_onchain_accounts_intents_math.proportionalDebt(view, aU) : require_onchain_accounts_intents_math.debtForLeverage(view.collateral + aU, intent.targetLeverage) - view.debt;
|
|
45
45
|
if (debtDelta < 0n) throw new require_onchain_validation_raise.IntentPreviewError(require_model_errors_operation_errors.leverageOutOfRange(), `deposit: target leverage ${intent.targetLeverage} would require repaying debt`);
|
|
46
|
-
require_onchain_accounts_intents_math.assertDebtLimits(view.sdk, view.debt + debtDelta, view.debtLimits, U);
|
|
46
|
+
require_onchain_accounts_intents_math.assertDebtLimits(view.sdk, view.debt + debtDelta, view.debtLimits, U, view.maxBorrowAmount);
|
|
47
47
|
const T = intent.positionToken ?? positionToken(view, "deposit");
|
|
48
48
|
const depositStays = require_onchain_accounts_intents_utils_common.eq(intent.token, T);
|
|
49
49
|
return [
|
|
@@ -74,11 +74,12 @@ function planRepay(intent, view) {
|
|
|
74
74
|
if (view.debt <= 0n) throw new require_onchain_validation_raise.IntentPreviewError(require_model_errors_operation_errors.debtOutOfRange({
|
|
75
75
|
requested: require_onchain_validation_helpers_token.toTokenAmount(view.sdk, U, view.debt),
|
|
76
76
|
minDebt: require_onchain_validation_helpers_token.toTokenAmount(view.sdk, U, view.debtLimits.minDebt),
|
|
77
|
-
maxDebt: require_onchain_validation_helpers_token.toTokenAmount(view.sdk, U, view.debtLimits.maxDebt)
|
|
77
|
+
maxDebt: require_onchain_validation_helpers_token.toTokenAmount(view.sdk, U, view.debtLimits.maxDebt),
|
|
78
|
+
maxBorrowAmount: view.maxBorrowAmount
|
|
78
79
|
}), "repay: the account owes nothing");
|
|
79
80
|
const funding = everything(intent.amount) ? view.price(U, intent.token, withMargin(view.debt)) : intent.amount;
|
|
80
81
|
const repaid = min(view.price(intent.token, U, funding), view.debt);
|
|
81
|
-
require_onchain_accounts_intents_math.assertDebtLimits(view.sdk, view.debt - repaid, view.debtLimits, view.underlying);
|
|
82
|
+
require_onchain_accounts_intents_math.assertDebtLimits(view.sdk, view.debt - repaid, view.debtLimits, view.underlying, view.maxBorrowAmount);
|
|
82
83
|
return [
|
|
83
84
|
add(intent.token, funding, intent.value),
|
|
84
85
|
...fundsInU ? [] : [convert(intent.token, U, funding)],
|
|
@@ -307,7 +308,7 @@ function withdrawShape(intent, view) {
|
|
|
307
308
|
};
|
|
308
309
|
}
|
|
309
310
|
const dD = require_onchain_accounts_intents_math.proportionalDebt(view, WU);
|
|
310
|
-
require_onchain_accounts_intents_math.assertDebtLimits(view.sdk, view.debt - dD, view.debtLimits, view.underlying);
|
|
311
|
+
require_onchain_accounts_intents_math.assertDebtLimits(view.sdk, view.debt - dD, view.debtLimits, view.underlying, view.maxBorrowAmount);
|
|
311
312
|
return {
|
|
312
313
|
U,
|
|
313
314
|
T,
|
|
@@ -326,7 +327,7 @@ function leverageShape(intent, view) {
|
|
|
326
327
|
require_onchain_accounts_intents_math.assertLeverageAtLeastOne(intent.targetLeverage);
|
|
327
328
|
if (view.collateral <= 0n) throw new require_onchain_validation_raise.IntentPreviewError(require_model_errors_operation_errors.insufficientBalance(), "adjustLeverage: account has no collateral to lever");
|
|
328
329
|
const target = require_onchain_accounts_intents_math.debtForLeverage(view.collateral, intent.targetLeverage);
|
|
329
|
-
require_onchain_accounts_intents_math.assertDebtLimits(view.sdk, target, view.debtLimits, view.underlying);
|
|
330
|
+
require_onchain_accounts_intents_math.assertDebtLimits(view.sdk, target, view.debtLimits, view.underlying, view.maxBorrowAmount);
|
|
330
331
|
return {
|
|
331
332
|
U: view.underlying,
|
|
332
333
|
delta: target - view.debt
|
|
@@ -13,7 +13,7 @@ function accountView(creditAccount, sdk) {
|
|
|
13
13
|
const { underlying, creditManager } = creditAccount;
|
|
14
14
|
const oracle = sdk.marketRegister.findByCreditManager(creditManager).priceOracle;
|
|
15
15
|
const price = (from, to, amount) => oracle.safeConvert(from, to, amount).value;
|
|
16
|
-
const
|
|
16
|
+
const creditSuite = sdk.marketRegister.findCreditManager(creditManager);
|
|
17
17
|
let totalValue = 0n;
|
|
18
18
|
for (const t of creditAccount.tokens) totalValue += price(t.token, underlying, t.balance);
|
|
19
19
|
return {
|
|
@@ -23,9 +23,10 @@ function accountView(creditAccount, sdk) {
|
|
|
23
23
|
debt: creditAccount.totalDebt,
|
|
24
24
|
collateral: totalValue - creditAccount.totalDebt,
|
|
25
25
|
debtLimits: {
|
|
26
|
-
minDebt: creditFacade.minDebt,
|
|
27
|
-
maxDebt: creditFacade.maxDebt
|
|
26
|
+
minDebt: creditSuite.creditFacade.minDebt,
|
|
27
|
+
maxDebt: creditSuite.creditFacade.maxDebt
|
|
28
28
|
},
|
|
29
|
+
maxBorrowAmount: creditSuite.maxBorrowAmount(),
|
|
29
30
|
balanceOf: (token) => creditAccount.tokens.find((t) => require_onchain_accounts_intents_utils_common.eq(t.token, token))?.balance ?? 0n,
|
|
30
31
|
price,
|
|
31
32
|
fattest: (exclude) => require_onchain_accounts_intents_utils_pick_token.pickFattestNonPhantomToken({
|
|
@@ -54,7 +54,7 @@ async function buildBorrowState(props) {
|
|
|
54
54
|
totalDebt: market.toUnderlyingAmount(debt),
|
|
55
55
|
netValue: market.toUnderlyingAmount(margin - debt)
|
|
56
56
|
});
|
|
57
|
-
assertDebtLimits(sdk, debt, suite.creditFacade, underlying);
|
|
57
|
+
assertDebtLimits(sdk, debt, suite.creditFacade, underlying, suite.maxBorrowAmount());
|
|
58
58
|
assertCanBorrow(sdk, suite, debt);
|
|
59
59
|
const account = existing ?? unopenedAccountSlice({
|
|
60
60
|
creditManager,
|
|
@@ -55,13 +55,14 @@ function assertLeverageAtLeastOne(leverage) {
|
|
|
55
55
|
* Rejects a debt the facade would revert on: zero is always fine (no loan at
|
|
56
56
|
* all), anything else has to sit inside `[minDebt, maxDebt]`.
|
|
57
57
|
*/
|
|
58
|
-
function assertDebtLimits(sdk, debt, debtLimits, underlying) {
|
|
58
|
+
function assertDebtLimits(sdk, debt, debtLimits, underlying, maxBorrowAmount) {
|
|
59
59
|
raise(checkDebtLimits({
|
|
60
60
|
debt,
|
|
61
61
|
minDebt: debtLimits.minDebt,
|
|
62
62
|
maxDebt: debtLimits.maxDebt,
|
|
63
63
|
underlying: toToken(sdk, underlying),
|
|
64
|
-
allowZero: true
|
|
64
|
+
allowZero: true,
|
|
65
|
+
maxBorrowAmount
|
|
65
66
|
}), debt > debtLimits.maxDebt ? `debt ${debt} exceeds maxDebt ${debtLimits.maxDebt}` : `debt ${debt} is below minDebt ${debtLimits.minDebt}`);
|
|
66
67
|
}
|
|
67
68
|
//#endregion
|
|
@@ -44,7 +44,7 @@ async function buildOpenStrategyState(props) {
|
|
|
44
44
|
creditFacade: suite.creditFacade.address,
|
|
45
45
|
underlying
|
|
46
46
|
});
|
|
47
|
-
assertDebtLimits(sdk, debt, suite.creditFacade, underlying);
|
|
47
|
+
assertDebtLimits(sdk, debt, suite.creditFacade, underlying, suite.maxBorrowAmount());
|
|
48
48
|
assertCanBorrow(sdk, suite, debt);
|
|
49
49
|
const paths = createRouterPaths({
|
|
50
50
|
sdk,
|
|
@@ -42,7 +42,7 @@ function planDeposit(intent, view) {
|
|
|
42
42
|
const aU = view.price(intent.token, U, intent.amount);
|
|
43
43
|
const debtDelta = intent.targetLeverage === void 0 ? proportionalDebt(view, aU) : debtForLeverage(view.collateral + aU, intent.targetLeverage) - view.debt;
|
|
44
44
|
if (debtDelta < 0n) throw new IntentPreviewError(leverageOutOfRange(), `deposit: target leverage ${intent.targetLeverage} would require repaying debt`);
|
|
45
|
-
assertDebtLimits(view.sdk, view.debt + debtDelta, view.debtLimits, U);
|
|
45
|
+
assertDebtLimits(view.sdk, view.debt + debtDelta, view.debtLimits, U, view.maxBorrowAmount);
|
|
46
46
|
const T = intent.positionToken ?? positionToken(view, "deposit");
|
|
47
47
|
const depositStays = eq(intent.token, T);
|
|
48
48
|
return [
|
|
@@ -73,11 +73,12 @@ function planRepay(intent, view) {
|
|
|
73
73
|
if (view.debt <= 0n) throw new IntentPreviewError(debtOutOfRange({
|
|
74
74
|
requested: toTokenAmount(view.sdk, U, view.debt),
|
|
75
75
|
minDebt: toTokenAmount(view.sdk, U, view.debtLimits.minDebt),
|
|
76
|
-
maxDebt: toTokenAmount(view.sdk, U, view.debtLimits.maxDebt)
|
|
76
|
+
maxDebt: toTokenAmount(view.sdk, U, view.debtLimits.maxDebt),
|
|
77
|
+
maxBorrowAmount: view.maxBorrowAmount
|
|
77
78
|
}), "repay: the account owes nothing");
|
|
78
79
|
const funding = everything(intent.amount) ? view.price(U, intent.token, withMargin(view.debt)) : intent.amount;
|
|
79
80
|
const repaid = min(view.price(intent.token, U, funding), view.debt);
|
|
80
|
-
assertDebtLimits(view.sdk, view.debt - repaid, view.debtLimits, view.underlying);
|
|
81
|
+
assertDebtLimits(view.sdk, view.debt - repaid, view.debtLimits, view.underlying, view.maxBorrowAmount);
|
|
81
82
|
return [
|
|
82
83
|
add(intent.token, funding, intent.value),
|
|
83
84
|
...fundsInU ? [] : [convert(intent.token, U, funding)],
|
|
@@ -306,7 +307,7 @@ function withdrawShape(intent, view) {
|
|
|
306
307
|
};
|
|
307
308
|
}
|
|
308
309
|
const dD = proportionalDebt(view, WU);
|
|
309
|
-
assertDebtLimits(view.sdk, view.debt - dD, view.debtLimits, view.underlying);
|
|
310
|
+
assertDebtLimits(view.sdk, view.debt - dD, view.debtLimits, view.underlying, view.maxBorrowAmount);
|
|
310
311
|
return {
|
|
311
312
|
U,
|
|
312
313
|
T,
|
|
@@ -325,7 +326,7 @@ function leverageShape(intent, view) {
|
|
|
325
326
|
assertLeverageAtLeastOne(intent.targetLeverage);
|
|
326
327
|
if (view.collateral <= 0n) throw new IntentPreviewError(insufficientBalance(), "adjustLeverage: account has no collateral to lever");
|
|
327
328
|
const target = debtForLeverage(view.collateral, intent.targetLeverage);
|
|
328
|
-
assertDebtLimits(view.sdk, target, view.debtLimits, view.underlying);
|
|
329
|
+
assertDebtLimits(view.sdk, target, view.debtLimits, view.underlying, view.maxBorrowAmount);
|
|
329
330
|
return {
|
|
330
331
|
U: view.underlying,
|
|
331
332
|
delta: target - view.debt
|
|
@@ -12,7 +12,7 @@ function accountView(creditAccount, sdk) {
|
|
|
12
12
|
const { underlying, creditManager } = creditAccount;
|
|
13
13
|
const oracle = sdk.marketRegister.findByCreditManager(creditManager).priceOracle;
|
|
14
14
|
const price = (from, to, amount) => oracle.safeConvert(from, to, amount).value;
|
|
15
|
-
const
|
|
15
|
+
const creditSuite = sdk.marketRegister.findCreditManager(creditManager);
|
|
16
16
|
let totalValue = 0n;
|
|
17
17
|
for (const t of creditAccount.tokens) totalValue += price(t.token, underlying, t.balance);
|
|
18
18
|
return {
|
|
@@ -22,9 +22,10 @@ function accountView(creditAccount, sdk) {
|
|
|
22
22
|
debt: creditAccount.totalDebt,
|
|
23
23
|
collateral: totalValue - creditAccount.totalDebt,
|
|
24
24
|
debtLimits: {
|
|
25
|
-
minDebt: creditFacade.minDebt,
|
|
26
|
-
maxDebt: creditFacade.maxDebt
|
|
25
|
+
minDebt: creditSuite.creditFacade.minDebt,
|
|
26
|
+
maxDebt: creditSuite.creditFacade.maxDebt
|
|
27
27
|
},
|
|
28
|
+
maxBorrowAmount: creditSuite.maxBorrowAmount(),
|
|
28
29
|
balanceOf: (token) => creditAccount.tokens.find((t) => eq(t.token, token))?.balance ?? 0n,
|
|
29
30
|
price,
|
|
30
31
|
fattest: (exclude) => pickFattestNonPhantomToken({
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { MaxBorrowAmount } from "../../market/credit/types.js";
|
|
2
|
+
import "../../market/index.js";
|
|
1
3
|
import { OnchainSDK } from "../../OnchainSDK.js";
|
|
2
4
|
import { Address } from "viem";
|
|
3
5
|
//#region src/onchain/accounts/intents/math.d.ts
|
|
@@ -44,6 +46,6 @@ declare function assertLeverageAtLeastOne(leverage: bigint): void;
|
|
|
44
46
|
* Rejects a debt the facade would revert on: zero is always fine (no loan at
|
|
45
47
|
* all), anything else has to sit inside `[minDebt, maxDebt]`.
|
|
46
48
|
*/
|
|
47
|
-
declare function assertDebtLimits(sdk: OnchainSDK, debt: bigint, debtLimits: DebtLimits, underlying: Address): void;
|
|
49
|
+
declare function assertDebtLimits(sdk: OnchainSDK, debt: bigint, debtLimits: DebtLimits, underlying: Address, maxBorrowAmount: MaxBorrowAmount): void;
|
|
48
50
|
//#endregion
|
|
49
51
|
export { DebtLimits, Position, assertDebtLimits, assertLeverageAtLeastOne, debtForLeverage, maxProportionalWithdrawal, proportionalDebt };
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { DelayedIntent } from "../../../model/delayed-intents.js";
|
|
2
2
|
import "../../../model/index.js";
|
|
3
3
|
import { ClaimableWithdrawal } from "../withdrawal-compressor/types.js";
|
|
4
|
+
import { MaxBorrowAmount } from "../../market/credit/types.js";
|
|
5
|
+
import "../../market/index.js";
|
|
4
6
|
import { OnchainSDK } from "../../OnchainSDK.js";
|
|
5
7
|
import { AddCollateralIntent, AdjustLeverageIntent, DepositStrategyIntent, RepayStrategyIntent, WithdrawAssetIntent, WithdrawStrategyIntent } from "./types.js";
|
|
6
8
|
import { DebtLimits } from "./math.js";
|
|
@@ -109,6 +111,7 @@ interface AccountView {
|
|
|
109
111
|
/** TVL − debt, in underlying. */
|
|
110
112
|
collateral: bigint;
|
|
111
113
|
debtLimits: DebtLimits;
|
|
114
|
+
maxBorrowAmount: MaxBorrowAmount;
|
|
112
115
|
balanceOf(token: Address): bigint;
|
|
113
116
|
/** Oracle conversion; unpriceable tokens contribute 0n. */
|
|
114
117
|
price(from: Address, to: Address, amount: bigint): bigint;
|
|
@@ -17,7 +17,7 @@ interface DebtLimitsArgs {
|
|
|
17
17
|
*/
|
|
18
18
|
allowZero: boolean;
|
|
19
19
|
/** From the caller's suite; a caller that raises to throw advises nobody. */
|
|
20
|
-
maxBorrowAmount
|
|
20
|
+
maxBorrowAmount: MaxBorrowAmount;
|
|
21
21
|
}
|
|
22
22
|
/** A debt the facade would revert on. */
|
|
23
23
|
declare function checkDebtLimits(args: DebtLimitsArgs): DebtOutOfRangeError[];
|