@haven-fi/solauto-sdk 1.0.218 → 1.0.219
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/utils/numberUtils.d.ts +2 -1
- package/dist/utils/numberUtils.d.ts.map +1 -1
- package/dist/utils/numberUtils.js +2 -1
- package/dist/utils/solauto/rebalanceUtils.d.ts +2 -2
- package/dist/utils/solauto/rebalanceUtils.d.ts.map +1 -1
- package/dist/utils/solauto/rebalanceUtils.js +7 -7
- package/package.json +1 -1
- package/src/utils/numberUtils.ts +3 -2
- package/src/utils/solauto/rebalanceUtils.ts +9 -9
- package/tests/unit/rebalanceCalculations.ts +10 -12
@@ -1,3 +1,4 @@
|
|
1
|
+
import { RebalanceDirection } from "../generated";
|
1
2
|
export declare function getLiqUtilzationRateBps(supplyUsd: number, debtUsd: number, liqThresholdBps: number): number;
|
2
3
|
export declare function toBaseUnit(value: number, decimals: number): bigint;
|
3
4
|
export declare function fromBaseUnit(value: bigint, decimals: number): number;
|
@@ -6,7 +7,7 @@ export declare function toBps(value: number): number;
|
|
6
7
|
export declare function bytesToI80F48(bytes: number[]): number;
|
7
8
|
export declare function uint8ArrayToBigInt(uint8Array: Uint8Array): bigint;
|
8
9
|
export declare function getDebtAdjustmentUsd(liqThresholdBps: number, supplyUsd: number, debtUsd: number, targetLiqUtilizationRateBps: number, adjustmentFeeBps?: number): number;
|
9
|
-
export declare function getSolautoFeesBps(isReferred: boolean, targetLiqUtilizationRateBps: number | undefined, positionNetWorthUsd: number, rebalanceDirection:
|
10
|
+
export declare function getSolautoFeesBps(isReferred: boolean, targetLiqUtilizationRateBps: number | undefined, positionNetWorthUsd: number, rebalanceDirection: RebalanceDirection): {
|
10
11
|
solauto: number;
|
11
12
|
referrer: number;
|
12
13
|
total: number;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"numberUtils.d.ts","sourceRoot":"","sources":["../../src/utils/numberUtils.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"numberUtils.d.ts","sourceRoot":"","sources":["../../src/utils/numberUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,GACtB,MAAM,CAMR;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAqBrD;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAejE;AAED,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,2BAA2B,EAAE,MAAM,EACnC,gBAAgB,CAAC,EAAE,MAAM,UAW1B;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,OAAO,EACnB,2BAA2B,EAAE,MAAM,GAAG,SAAS,EAC/C,mBAAmB,EAAE,MAAM,EAC3B,kBAAkB,EAAE,kBAAkB,GACrC;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAgCA;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAER;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAKzE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAKvE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAKvE"}
|
@@ -14,6 +14,7 @@ exports.maxRepayFromBps = maxRepayFromBps;
|
|
14
14
|
exports.maxRepayToBps = maxRepayToBps;
|
15
15
|
exports.maxBoostToBps = maxBoostToBps;
|
16
16
|
const constants_1 = require("../constants");
|
17
|
+
const generated_1 = require("../generated");
|
17
18
|
function getLiqUtilzationRateBps(supplyUsd, debtUsd, liqThresholdBps) {
|
18
19
|
if (supplyUsd === 0) {
|
19
20
|
return 0;
|
@@ -73,7 +74,7 @@ function getSolautoFeesBps(isReferred, targetLiqUtilizationRateBps, positionNetW
|
|
73
74
|
const minFeeBps = 50; // Fee in basis points for maxSize (0.5%)
|
74
75
|
const k = 1.5;
|
75
76
|
let feeBps = 0;
|
76
|
-
if (targetLiqUtilizationRateBps !== undefined || rebalanceDirection ===
|
77
|
+
if (targetLiqUtilizationRateBps !== undefined || rebalanceDirection === generated_1.RebalanceDirection.Repay) {
|
77
78
|
feeBps = 25;
|
78
79
|
}
|
79
80
|
else if (positionNetWorthUsd <= minSize) {
|
@@ -1,17 +1,17 @@
|
|
1
1
|
import { PublicKey } from "@solana/web3.js";
|
2
2
|
import { SolautoClient } from "../../clients/solautoClient";
|
3
|
-
import { DCASettings, PositionState, SolautoSettingsParameters, TokenType } from "../../generated";
|
3
|
+
import { DCASettings, PositionState, RebalanceDirection, SolautoSettingsParameters, TokenType } from "../../generated";
|
4
4
|
import { QuoteResponse } from "@jup-ag/api";
|
5
5
|
import { JupSwapDetails } from "../jupiterUtils";
|
6
6
|
import { RebalanceAction } from "../../types";
|
7
7
|
export interface RebalanceValues {
|
8
|
-
increasingLeverage: boolean;
|
9
8
|
debtAdjustmentUsd: number;
|
10
9
|
repayingCloseToMaxLtv: boolean;
|
11
10
|
amountToDcaIn: number;
|
12
11
|
amountUsdToDcaIn: number;
|
13
12
|
dcaTokenType?: TokenType;
|
14
13
|
rebalanceAction: RebalanceAction;
|
14
|
+
rebalanceDirection: RebalanceDirection;
|
15
15
|
}
|
16
16
|
export declare function getRebalanceValues(state: PositionState, settings: SolautoSettingsParameters | undefined, dca: DCASettings | undefined, currentUnixTime: number, supplyPrice: number, debtPrice: number, targetLiqUtilizationRateBps?: number): RebalanceValues;
|
17
17
|
export interface FlashLoanDetails {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"rebalanceUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/rebalanceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EACL,WAAW,EACX,aAAa,EAEb,yBAAyB,EACzB,SAAS,EACV,MAAM,iBAAiB,CAAC;AAOzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAajD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAkI9C,MAAM,WAAW,eAAe;IAC9B,
|
1
|
+
{"version":3,"file":"rebalanceUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/rebalanceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EACL,WAAW,EACX,aAAa,EAEb,kBAAkB,EAClB,yBAAyB,EACzB,SAAS,EACV,MAAM,iBAAiB,CAAC;AAOzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAajD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAkI9C,MAAM,WAAW,eAAe;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,kBAAkB,EAAE,kBAAkB,CAAA;CACvC;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,yBAAyB,GAAG,SAAS,EAC/C,GAAG,EAAE,WAAW,GAAG,SAAS,EAC5B,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,2BAA2B,CAAC,EAAE,MAAM,GACnC,eAAe,CAgDjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,aAAa,GACtB,gBAAgB,GAAG,SAAS,CA0D9B;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,cAAc,CAyChB"}
|
@@ -83,21 +83,21 @@ function getRebalanceValues(state, settings, dca, currentUnixTime, supplyPrice,
|
|
83
83
|
const { targetRateBps, amountToDcaIn } = getTargetRateAndDcaAmount(state, settings, dca, currentUnixTime, targetLiqUtilizationRateBps);
|
84
84
|
const amountUsdToDcaIn = (0, numberUtils_1.fromBaseUnit)(BigInt(Math.round(amountToDcaIn ?? 0)), state.debt.decimals) *
|
85
85
|
(dca?.tokenType === generated_1.TokenType.Debt ? debtPrice : supplyPrice);
|
86
|
-
const
|
87
|
-
const adjustmentFeeBps = (0, numberUtils_1.getSolautoFeesBps)(false, targetLiqUtilizationRateBps, (0, numberUtils_1.fromBaseUnit)(state.netWorth.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS),
|
86
|
+
const rebalanceDirection = amountUsdToDcaIn > 0 || state.liqUtilizationRateBps < targetRateBps ? generated_1.RebalanceDirection.Boost : generated_1.RebalanceDirection.Repay;
|
87
|
+
const adjustmentFeeBps = (0, numberUtils_1.getSolautoFeesBps)(false, targetLiqUtilizationRateBps, (0, numberUtils_1.fromBaseUnit)(state.netWorth.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS), rebalanceDirection).total;
|
88
88
|
const supplyUsd = (0, numberUtils_1.fromBaseUnit)(state.supply.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS) +
|
89
89
|
amountUsdToDcaIn;
|
90
90
|
const debtUsd = (0, numberUtils_1.fromBaseUnit)(state.debt.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS);
|
91
91
|
let debtAdjustmentUsd = (0, numberUtils_1.getDebtAdjustmentUsd)(state.liqThresholdBps, supplyUsd, debtUsd, targetRateBps, adjustmentFeeBps);
|
92
92
|
const maxRepayTo = (0, numberUtils_1.maxRepayToBps)(state.maxLtvBps, state.liqThresholdBps);
|
93
93
|
return {
|
94
|
-
increasingLeverage,
|
95
94
|
debtAdjustmentUsd,
|
96
95
|
repayingCloseToMaxLtv: state.liqUtilizationRateBps > maxRepayTo && targetRateBps >= maxRepayTo,
|
97
96
|
amountToDcaIn: amountToDcaIn ?? 0,
|
98
97
|
amountUsdToDcaIn,
|
99
98
|
dcaTokenType: dca?.tokenType,
|
100
|
-
rebalanceAction: (amountToDcaIn ?? 0) > 0 ? "dca" :
|
99
|
+
rebalanceAction: (amountToDcaIn ?? 0) > 0 ? "dca" : rebalanceDirection === generated_1.RebalanceDirection.Boost ? "boost" : "repay",
|
100
|
+
rebalanceDirection,
|
101
101
|
};
|
102
102
|
}
|
103
103
|
function getFlashLoanDetails(client, values, jupQuote) {
|
@@ -115,7 +115,7 @@ function getFlashLoanDetails(client, values, jupQuote) {
|
|
115
115
|
(0, numberUtils_1.getMaxLiqUtilizationRateBps)(client.solautoPositionState.maxLtvBps, client.solautoPositionState.liqThresholdBps, 0.01);
|
116
116
|
let flashLoanToken = undefined;
|
117
117
|
let flashLoanTokenPrice = 0;
|
118
|
-
if (values.
|
118
|
+
if (values.rebalanceDirection === generated_1.RebalanceDirection.Boost) {
|
119
119
|
flashLoanToken = client.solautoPositionState.debt;
|
120
120
|
flashLoanTokenPrice = (0, generalUtils_2.safeGetPrice)(client.debtMint);
|
121
121
|
}
|
@@ -136,10 +136,10 @@ function getFlashLoanDetails(client, values, jupQuote) {
|
|
136
136
|
: undefined;
|
137
137
|
}
|
138
138
|
function getJupSwapRebalanceDetails(client, values, targetLiqUtilizationRateBps, attemptNum) {
|
139
|
-
const input = values.
|
139
|
+
const input = values.rebalanceDirection === generated_1.RebalanceDirection.Boost
|
140
140
|
? client.solautoPositionState.debt
|
141
141
|
: client.solautoPositionState.supply;
|
142
|
-
const output = values.
|
142
|
+
const output = values.rebalanceDirection === generated_1.RebalanceDirection.Boost
|
143
143
|
? client.solautoPositionState.supply
|
144
144
|
: client.solautoPositionState.debt;
|
145
145
|
const usdToSwap = Math.abs(values.debtAdjustmentUsd) +
|
package/package.json
CHANGED
package/src/utils/numberUtils.ts
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import { BASIS_POINTS, MIN_REPAY_GAP_BPS } from "../constants";
|
2
|
+
import { RebalanceDirection } from "../generated";
|
2
3
|
|
3
4
|
export function getLiqUtilzationRateBps(
|
4
5
|
supplyUsd: number,
|
@@ -90,7 +91,7 @@ export function getSolautoFeesBps(
|
|
90
91
|
isReferred: boolean,
|
91
92
|
targetLiqUtilizationRateBps: number | undefined,
|
92
93
|
positionNetWorthUsd: number,
|
93
|
-
rebalanceDirection:
|
94
|
+
rebalanceDirection: RebalanceDirection
|
94
95
|
): {
|
95
96
|
solauto: number;
|
96
97
|
referrer: number;
|
@@ -104,7 +105,7 @@ export function getSolautoFeesBps(
|
|
104
105
|
|
105
106
|
let feeBps: number = 0;
|
106
107
|
|
107
|
-
if (targetLiqUtilizationRateBps !== undefined || rebalanceDirection ===
|
108
|
+
if (targetLiqUtilizationRateBps !== undefined || rebalanceDirection === RebalanceDirection.Repay) {
|
108
109
|
feeBps = 25;
|
109
110
|
} else if (positionNetWorthUsd <= minSize) {
|
110
111
|
feeBps = maxFeeBps;
|
@@ -4,6 +4,7 @@ import {
|
|
4
4
|
DCASettings,
|
5
5
|
PositionState,
|
6
6
|
PositionTokenUsage,
|
7
|
+
RebalanceDirection,
|
7
8
|
SolautoSettingsParameters,
|
8
9
|
TokenType,
|
9
10
|
} from "../../generated";
|
@@ -158,13 +159,13 @@ function getTargetRateAndDcaAmount(
|
|
158
159
|
}
|
159
160
|
|
160
161
|
export interface RebalanceValues {
|
161
|
-
increasingLeverage: boolean;
|
162
162
|
debtAdjustmentUsd: number;
|
163
163
|
repayingCloseToMaxLtv: boolean;
|
164
164
|
amountToDcaIn: number;
|
165
165
|
amountUsdToDcaIn: number;
|
166
166
|
dcaTokenType?: TokenType;
|
167
167
|
rebalanceAction: RebalanceAction;
|
168
|
+
rebalanceDirection: RebalanceDirection
|
168
169
|
}
|
169
170
|
|
170
171
|
export function getRebalanceValues(
|
@@ -188,13 +189,12 @@ export function getRebalanceValues(
|
|
188
189
|
fromBaseUnit(BigInt(Math.round(amountToDcaIn ?? 0)), state.debt.decimals) *
|
189
190
|
(dca?.tokenType === TokenType.Debt ? debtPrice : supplyPrice);
|
190
191
|
|
191
|
-
const
|
192
|
-
amountUsdToDcaIn > 0 || state.liqUtilizationRateBps < targetRateBps;
|
192
|
+
const rebalanceDirection = amountUsdToDcaIn > 0 || state.liqUtilizationRateBps < targetRateBps ? RebalanceDirection.Boost : RebalanceDirection.Repay;
|
193
193
|
const adjustmentFeeBps = getSolautoFeesBps(
|
194
194
|
false,
|
195
195
|
targetLiqUtilizationRateBps,
|
196
196
|
fromBaseUnit(state.netWorth.baseAmountUsdValue, USD_DECIMALS),
|
197
|
-
|
197
|
+
rebalanceDirection
|
198
198
|
).total;
|
199
199
|
|
200
200
|
const supplyUsd =
|
@@ -214,7 +214,6 @@ export function getRebalanceValues(
|
|
214
214
|
|
215
215
|
const maxRepayTo = maxRepayToBps(state.maxLtvBps, state.liqThresholdBps);
|
216
216
|
return {
|
217
|
-
increasingLeverage,
|
218
217
|
debtAdjustmentUsd,
|
219
218
|
repayingCloseToMaxLtv:
|
220
219
|
state.liqUtilizationRateBps > maxRepayTo && targetRateBps >= maxRepayTo,
|
@@ -222,7 +221,8 @@ export function getRebalanceValues(
|
|
222
221
|
amountUsdToDcaIn,
|
223
222
|
dcaTokenType: dca?.tokenType,
|
224
223
|
rebalanceAction:
|
225
|
-
(amountToDcaIn ?? 0) > 0 ? "dca" :
|
224
|
+
(amountToDcaIn ?? 0) > 0 ? "dca" : rebalanceDirection === RebalanceDirection.Boost ? "boost" : "repay",
|
225
|
+
rebalanceDirection,
|
226
226
|
};
|
227
227
|
}
|
228
228
|
|
@@ -269,7 +269,7 @@ export function getFlashLoanDetails(
|
|
269
269
|
|
270
270
|
let flashLoanToken: PositionTokenUsage | undefined = undefined;
|
271
271
|
let flashLoanTokenPrice = 0;
|
272
|
-
if (values.
|
272
|
+
if (values.rebalanceDirection === RebalanceDirection.Boost) {
|
273
273
|
flashLoanToken = client.solautoPositionState!.debt;
|
274
274
|
flashLoanTokenPrice = safeGetPrice(client.debtMint)!;
|
275
275
|
} else {
|
@@ -301,10 +301,10 @@ export function getJupSwapRebalanceDetails(
|
|
301
301
|
targetLiqUtilizationRateBps?: number,
|
302
302
|
attemptNum?: number
|
303
303
|
): JupSwapDetails {
|
304
|
-
const input = values.
|
304
|
+
const input = values.rebalanceDirection === RebalanceDirection.Boost
|
305
305
|
? client.solautoPositionState!.debt
|
306
306
|
: client.solautoPositionState!.supply;
|
307
|
-
const output = values.
|
307
|
+
const output = values.rebalanceDirection === RebalanceDirection.Boost
|
308
308
|
? client.solautoPositionState!.supply
|
309
309
|
: client.solautoPositionState!.debt;
|
310
310
|
|
@@ -46,7 +46,7 @@ function assertAccurateRebalance(
|
|
46
46
|
targetLiqUtilizationRateBps?: number,
|
47
47
|
expectedUsdToDcaIn?: number
|
48
48
|
) {
|
49
|
-
const {
|
49
|
+
const { rebalanceDirection, debtAdjustmentUsd, amountUsdToDcaIn } =
|
50
50
|
getRebalanceValues(
|
51
51
|
client.solautoPositionState!,
|
52
52
|
client.solautoPositionSettings(),
|
@@ -58,17 +58,15 @@ function assertAccurateRebalance(
|
|
58
58
|
);
|
59
59
|
|
60
60
|
let adjustmentFeeBps = 0;
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
).total;
|
71
|
-
}
|
61
|
+
adjustmentFeeBps = getSolautoFeesBps(
|
62
|
+
client.referredBy !== undefined,
|
63
|
+
targetLiqUtilizationRateBps,
|
64
|
+
fromBaseUnit(
|
65
|
+
client.solautoPositionState?.netWorth.baseAmountUsdValue ?? BigInt(0),
|
66
|
+
USD_DECIMALS
|
67
|
+
),
|
68
|
+
rebalanceDirection
|
69
|
+
).total;
|
72
70
|
|
73
71
|
assert(
|
74
72
|
Math.round(amountUsdToDcaIn) === Math.round(expectedUsdToDcaIn ?? 0),
|