@haven-fi/solauto-sdk 1.0.538 → 1.0.540
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/utils/jupiterUtils.d.ts +1 -1
- package/dist/utils/jupiterUtils.d.ts.map +1 -1
- package/dist/utils/jupiterUtils.js +6 -3
- package/dist/utils/priceUtils.d.ts.map +1 -1
- package/dist/utils/priceUtils.js +9 -2
- package/dist/utils/solauto/generalUtils.d.ts +1 -0
- package/dist/utils/solauto/generalUtils.d.ts.map +1 -1
- package/dist/utils/solauto/generalUtils.js +19 -14
- package/package.json +1 -1
- package/src/utils/jupiterUtils.ts +18 -5
- package/src/utils/priceUtils.ts +10 -2
- package/src/utils/solauto/generalUtils.ts +44 -27
- package/tests/transactions/solautoMarginfi.ts +1 -1
@@ -24,7 +24,7 @@ export interface JupSwapTransaction {
|
|
24
24
|
swapIx: TransactionBuilder;
|
25
25
|
}
|
26
26
|
export declare function getJupSwapTransaction(signer: Signer, swapDetails: JupSwapDetails, attemptNum?: number): Promise<JupSwapTransaction>;
|
27
|
-
export declare function getJupPriceData(mints: PublicKey[],
|
27
|
+
export declare function getJupPriceData(mints: PublicKey[], mayIncludeSpamTokens?: boolean): Promise<{
|
28
28
|
[key: string]: any;
|
29
29
|
}>;
|
30
30
|
//# sourceMappingURL=jupiterUtils.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"jupiterUtils.d.ts","sourceRoot":"","sources":["../../src/utils/jupiterUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAA0B,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAGL,aAAa,EACd,MAAM,aAAa,CAAC;AAUrB,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,SAAS,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,iBAAiB,EAAE,SAAS,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAgBD,wBAAsB,WAAW,CAAC,WAAW,EAAE,YAAY,0BAsB1D;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,aAAa,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,aAAa,EAAE,kBAAkB,CAAC;IAClC,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,cAAc,EAC3B,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAmF7B;AAED,wBAAsB,eAAe,
|
1
|
+
{"version":3,"file":"jupiterUtils.d.ts","sourceRoot":"","sources":["../../src/utils/jupiterUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAA0B,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAGL,aAAa,EACd,MAAM,aAAa,CAAC;AAUrB,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,SAAS,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,iBAAiB,EAAE,SAAS,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAgBD,wBAAsB,WAAW,CAAC,WAAW,EAAE,YAAY,0BAsB1D;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,aAAa,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,aAAa,EAAE,kBAAkB,CAAC;IAClC,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,cAAc,EAC3B,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAmF7B;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,SAAS,EAAE,EAClB,oBAAoB,CAAC,EAAE,OAAO;;GAwC/B"}
|
@@ -85,11 +85,11 @@ async function getJupSwapTransaction(signer, swapDetails, attemptNum) {
|
|
85
85
|
swapIx: (0, umi_1.transactionBuilder)().add((0, solanaUtils_1.getWrappedInstruction)(signer, createTransactionInstruction(instructions.swapInstruction))),
|
86
86
|
};
|
87
87
|
}
|
88
|
-
async function getJupPriceData(mints,
|
88
|
+
async function getJupPriceData(mints, mayIncludeSpamTokens) {
|
89
89
|
const data = await (0, generalUtils_1.retryWithExponentialBackoff)(async () => {
|
90
90
|
const res = await (await fetch("https://api.jup.ag/price/v2?ids=" +
|
91
91
|
mints.map((x) => x.toString()).join(",") +
|
92
|
-
|
92
|
+
"&showExtraInfo=true")).json();
|
93
93
|
const result = res.data;
|
94
94
|
if (!result || result === null || typeof result !== "object") {
|
95
95
|
throw new Error("Failed to get token prices using Jupiter");
|
@@ -101,7 +101,10 @@ async function getJupPriceData(mints, extraInfo, mayIncludeSpamTokens) {
|
|
101
101
|
if (invalidValues && !mayIncludeSpamTokens) {
|
102
102
|
throw new Error("Invalid price values");
|
103
103
|
}
|
104
|
-
|
104
|
+
const trueData = Object.entries(result).reduce((acc, [key, val]) => val.extraInfo?.quotedPrice?.sellAt === null
|
105
|
+
? { ...acc, [key]: { ...val, price: "0" } }
|
106
|
+
: { ...acc, [key]: val }, {});
|
107
|
+
return trueData;
|
105
108
|
}, 8);
|
106
109
|
return data;
|
107
110
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"priceUtils.d.ts","sourceRoot":"","sources":["../../src/utils/priceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAarE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyC5E;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,qBAwCrD;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAoDnB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,SAAS,EAAE,EAClB,oBAAoB,CAAC,EAAE,OAAO,
|
1
|
+
{"version":3,"file":"priceUtils.d.ts","sourceRoot":"","sources":["../../src/utils/priceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAarE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyC5E;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,qBAwCrD;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAoDnB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,SAAS,EAAE,EAClB,oBAAoB,CAAC,EAAE,OAAO,qBAqB/B;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,GACzC,MAAM,GAAG,SAAS,CAKpB;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,SAAS,EACrB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,oBAAoB;;;GAc/B"}
|
package/dist/utils/priceUtils.js
CHANGED
@@ -122,8 +122,15 @@ async function getJupTokenPrices(mints, mayIncludeSpamTokens) {
|
|
122
122
|
if (mints.length == 0) {
|
123
123
|
return [];
|
124
124
|
}
|
125
|
-
const data = await (0, jupiterUtils_1.getJupPriceData)(mints,
|
126
|
-
|
125
|
+
const data = await (0, jupiterUtils_1.getJupPriceData)(mints, mayIncludeSpamTokens);
|
126
|
+
const sortedData = {};
|
127
|
+
for (const mint of mints) {
|
128
|
+
const key = mint.toString();
|
129
|
+
if (data.hasOwnProperty(key)) {
|
130
|
+
sortedData[key] = data[key];
|
131
|
+
}
|
132
|
+
}
|
133
|
+
return Object.values(sortedData).map((x) => x !== null && typeof x === "object" && "price" in x
|
127
134
|
? parseFloat(x.price)
|
128
135
|
: 0);
|
129
136
|
}
|
@@ -7,6 +7,7 @@ export declare function nextAutomationPeriodTimestamp(automation: AutomationSett
|
|
7
7
|
export declare function eligibleForNextAutomationPeriod(automation: AutomationSettings, currentUnixTime: number): boolean;
|
8
8
|
export declare function getUpdatedValueFromAutomation(currValue: number, targetValue: number, automation: AutomationSettings, currentUnixTimestamp: number): number;
|
9
9
|
export declare function getAdjustedSettingsFromAutomation(settings: SolautoSettingsParameters, currentUnixTime: number): SolautoSettingsParameters;
|
10
|
+
export declare function sufficientLiquidityToBoost(positionState: PositionState, positionSettings: SolautoSettingsParameters | undefined, positionDca: DCASettings | undefined, supplyMintPrice: number, debtMintPrice: number): boolean;
|
10
11
|
export declare function eligibleForRebalance(positionState: PositionState, positionSettings: SolautoSettingsParameters | undefined, positionDca: DCASettings | undefined, currentUnixTime: number, supplyMintPrice: number, debtMintPrice: number, bpsDistanceThreshold?: number): RebalanceAction | undefined;
|
11
12
|
export declare function eligibleForRefresh(positionState: PositionState, positionSettings: SolautoSettingsParameters, currentUnixTime: number): boolean;
|
12
13
|
export declare function getSolautoManagedPositions(umi: Umi, authority?: PublicKey, positionTypeFilter?: PositionType): Promise<SolautoPositionDetails[]>;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/generalUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAGL,OAAO,EAEP,GAAG,EACJ,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAElB,aAAa,EACb,YAAY,EACZ,yBAAyB,EACzB,gCAAgC,EAChC,SAAS,EAMV,MAAM,iBAAiB,CAAC;AAsBzB,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAI9E,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAczE;AAgBD,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,kBAAkB,GAC7B,MAAM,CAKR;AAED,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,kBAAkB,EAC9B,eAAe,EAAE,MAAM,GACtB,OAAO,CAET;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,kBAAkB,EAC9B,oBAAoB,EAAE,MAAM,UAY7B;AAED,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,yBAAyB,EACnC,eAAe,EAAE,MAAM,GACtB,yBAAyB,CAgB3B;AAED,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,yBAAyB,GAAG,SAAS,EACvD,WAAW,EAAE,WAAW,GAAG,SAAS,EACpC,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,MAAM,EACrB,oBAAoB,SAAI,GACvB,eAAe,GAAG,SAAS,
|
1
|
+
{"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/generalUtils.ts"],"names":[],"mappings":"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"}
|
@@ -6,6 +6,7 @@ exports.nextAutomationPeriodTimestamp = nextAutomationPeriodTimestamp;
|
|
6
6
|
exports.eligibleForNextAutomationPeriod = eligibleForNextAutomationPeriod;
|
7
7
|
exports.getUpdatedValueFromAutomation = getUpdatedValueFromAutomation;
|
8
8
|
exports.getAdjustedSettingsFromAutomation = getAdjustedSettingsFromAutomation;
|
9
|
+
exports.sufficientLiquidityToBoost = sufficientLiquidityToBoost;
|
9
10
|
exports.eligibleForRebalance = eligibleForRebalance;
|
10
11
|
exports.eligibleForRefresh = eligibleForRefresh;
|
11
12
|
exports.getSolautoManagedPositions = getSolautoManagedPositions;
|
@@ -73,6 +74,22 @@ function getAdjustedSettingsFromAutomation(settings, currentUnixTime) {
|
|
73
74
|
boostToBps,
|
74
75
|
};
|
75
76
|
}
|
77
|
+
function sufficientLiquidityToBoost(positionState, positionSettings, positionDca, supplyMintPrice, debtMintPrice) {
|
78
|
+
const limitsUpToDate = positionState.supply.amountCanBeUsed.baseUnit > BigInt(0) ||
|
79
|
+
positionState.debt.amountCanBeUsed.baseUnit > BigInt(0);
|
80
|
+
if (limitsUpToDate) {
|
81
|
+
const values = (0, rebalanceUtils_1.getRebalanceValues)(positionState, positionSettings, positionDca, (0, generalUtils_1.currentUnixSeconds)(), supplyMintPrice, debtMintPrice);
|
82
|
+
const debtAvailable = (0, numberUtils_1.debtLiquidityUsdAvailable)(positionState);
|
83
|
+
const supplyDepositable = (0, numberUtils_1.supplyLiquidityUsdDepositable)(positionState);
|
84
|
+
const sufficientLiquidity = debtAvailable * 0.95 > values.debtAdjustmentUsd &&
|
85
|
+
supplyDepositable * 0.95 > values.debtAdjustmentUsd;
|
86
|
+
if (!sufficientLiquidity) {
|
87
|
+
(0, generalUtils_1.consoleLog)("Insufficient liquidity to further boost");
|
88
|
+
}
|
89
|
+
return sufficientLiquidity;
|
90
|
+
}
|
91
|
+
return true;
|
92
|
+
}
|
76
93
|
function eligibleForRebalance(positionState, positionSettings, positionDca, currentUnixTime, supplyMintPrice, debtMintPrice, bpsDistanceThreshold = 0) {
|
77
94
|
if (!positionSettings) {
|
78
95
|
return undefined;
|
@@ -92,20 +109,8 @@ function eligibleForRebalance(positionState, positionSettings, positionDca, curr
|
|
92
109
|
const repayFrom = positionSettings.repayToBps + positionSettings.repayGap;
|
93
110
|
const boostFrom = boostToBps - positionSettings.boostGap;
|
94
111
|
if (positionState.liqUtilizationRateBps - boostFrom <= bpsDistanceThreshold) {
|
95
|
-
const
|
96
|
-
|
97
|
-
if (limitsUpToDate && positionState.liqUtilizationRateBps < boostFrom) {
|
98
|
-
const values = (0, rebalanceUtils_1.getRebalanceValues)(positionState, positionSettings, positionDca, (0, generalUtils_1.currentUnixSeconds)(), supplyMintPrice, debtMintPrice);
|
99
|
-
const debtAvailable = (0, numberUtils_1.debtLiquidityUsdAvailable)(positionState);
|
100
|
-
const supplyDepositable = (0, numberUtils_1.supplyLiquidityUsdDepositable)(positionState);
|
101
|
-
const sufficientLiquidity = debtAvailable * 0.95 > values.debtAdjustmentUsd &&
|
102
|
-
supplyDepositable * 0.95 > values.debtAdjustmentUsd;
|
103
|
-
if (!sufficientLiquidity) {
|
104
|
-
(0, generalUtils_1.consoleLog)("Insufficient liquidity to further boost");
|
105
|
-
}
|
106
|
-
return sufficientLiquidity ? "boost" : undefined;
|
107
|
-
}
|
108
|
-
return "boost";
|
112
|
+
const sufficientLiquidity = sufficientLiquidityToBoost(positionState, positionSettings, positionDca, supplyMintPrice, debtMintPrice);
|
113
|
+
return sufficientLiquidity ? "boost" : undefined;
|
109
114
|
}
|
110
115
|
else if (repayFrom - positionState.liqUtilizationRateBps <=
|
111
116
|
bpsDistanceThreshold) {
|
package/package.json
CHANGED
@@ -171,13 +171,16 @@ export async function getJupSwapTransaction(
|
|
171
171
|
};
|
172
172
|
}
|
173
173
|
|
174
|
-
export async function getJupPriceData(
|
174
|
+
export async function getJupPriceData(
|
175
|
+
mints: PublicKey[],
|
176
|
+
mayIncludeSpamTokens?: boolean
|
177
|
+
) {
|
175
178
|
const data = await retryWithExponentialBackoff(async () => {
|
176
179
|
const res = await (
|
177
180
|
await fetch(
|
178
181
|
"https://api.jup.ag/price/v2?ids=" +
|
179
182
|
mints.map((x) => x.toString()).join(",") +
|
180
|
-
|
183
|
+
"&showExtraInfo=true"
|
181
184
|
)
|
182
185
|
).json();
|
183
186
|
const result = res.data;
|
@@ -185,7 +188,7 @@ export async function getJupPriceData(mints: PublicKey[], extraInfo?: boolean, m
|
|
185
188
|
throw new Error("Failed to get token prices using Jupiter");
|
186
189
|
}
|
187
190
|
|
188
|
-
const invalidValues =
|
191
|
+
const invalidValues =
|
189
192
|
Boolean(Object.values(result).filter((x) => x === null).length) ||
|
190
193
|
Boolean(
|
191
194
|
Object.values(result)
|
@@ -196,8 +199,18 @@ export async function getJupPriceData(mints: PublicKey[], extraInfo?: boolean, m
|
|
196
199
|
throw new Error("Invalid price values");
|
197
200
|
}
|
198
201
|
|
199
|
-
|
202
|
+
const trueData: { [key: string]: any } = Object.entries(
|
203
|
+
result as { [key: string]: any }
|
204
|
+
).reduce(
|
205
|
+
(acc, [key, val]) =>
|
206
|
+
val.extraInfo?.quotedPrice?.sellAt === null
|
207
|
+
? { ...acc, [key]: { ...val, price: "0" } }
|
208
|
+
: { ...acc, [key]: val },
|
209
|
+
{}
|
210
|
+
);
|
211
|
+
|
212
|
+
return trueData;
|
200
213
|
}, 8);
|
201
214
|
|
202
|
-
return data
|
215
|
+
return data;
|
203
216
|
}
|
package/src/utils/priceUtils.ts
CHANGED
@@ -163,9 +163,17 @@ export async function getJupTokenPrices(
|
|
163
163
|
return [];
|
164
164
|
}
|
165
165
|
|
166
|
-
const data = await getJupPriceData(mints,
|
166
|
+
const data = await getJupPriceData(mints, mayIncludeSpamTokens);
|
167
|
+
|
168
|
+
const sortedData: { [key: string]: any } = {};
|
169
|
+
for (const mint of mints) {
|
170
|
+
const key = mint.toString();
|
171
|
+
if (data.hasOwnProperty(key)) {
|
172
|
+
sortedData[key] = data[key];
|
173
|
+
}
|
174
|
+
}
|
167
175
|
|
168
|
-
return Object.values(
|
176
|
+
return Object.values(sortedData).map((x) =>
|
169
177
|
x !== null && typeof x === "object" && "price" in x
|
170
178
|
? parseFloat(x.price as string)
|
171
179
|
: 0
|
@@ -132,6 +132,42 @@ export function getAdjustedSettingsFromAutomation(
|
|
132
132
|
};
|
133
133
|
}
|
134
134
|
|
135
|
+
export function sufficientLiquidityToBoost(
|
136
|
+
positionState: PositionState,
|
137
|
+
positionSettings: SolautoSettingsParameters | undefined,
|
138
|
+
positionDca: DCASettings | undefined,
|
139
|
+
supplyMintPrice: number,
|
140
|
+
debtMintPrice: number
|
141
|
+
) {
|
142
|
+
const limitsUpToDate =
|
143
|
+
positionState.supply.amountCanBeUsed.baseUnit > BigInt(0) ||
|
144
|
+
positionState.debt.amountCanBeUsed.baseUnit > BigInt(0);
|
145
|
+
|
146
|
+
if (limitsUpToDate) {
|
147
|
+
const values = getRebalanceValues(
|
148
|
+
positionState!,
|
149
|
+
positionSettings,
|
150
|
+
positionDca,
|
151
|
+
currentUnixSeconds(),
|
152
|
+
supplyMintPrice,
|
153
|
+
debtMintPrice
|
154
|
+
);
|
155
|
+
|
156
|
+
const debtAvailable = debtLiquidityUsdAvailable(positionState);
|
157
|
+
const supplyDepositable = supplyLiquidityUsdDepositable(positionState);
|
158
|
+
const sufficientLiquidity =
|
159
|
+
debtAvailable * 0.95 > values.debtAdjustmentUsd &&
|
160
|
+
supplyDepositable * 0.95 > values.debtAdjustmentUsd;
|
161
|
+
|
162
|
+
if (!sufficientLiquidity) {
|
163
|
+
consoleLog("Insufficient liquidity to further boost");
|
164
|
+
}
|
165
|
+
return sufficientLiquidity;
|
166
|
+
}
|
167
|
+
|
168
|
+
return true;
|
169
|
+
}
|
170
|
+
|
135
171
|
export function eligibleForRebalance(
|
136
172
|
positionState: PositionState,
|
137
173
|
positionSettings: SolautoSettingsParameters | undefined,
|
@@ -171,33 +207,14 @@ export function eligibleForRebalance(
|
|
171
207
|
const boostFrom = boostToBps - positionSettings.boostGap;
|
172
208
|
|
173
209
|
if (positionState.liqUtilizationRateBps - boostFrom <= bpsDistanceThreshold) {
|
174
|
-
const
|
175
|
-
positionState
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
positionDca,
|
183
|
-
currentUnixSeconds(),
|
184
|
-
supplyMintPrice,
|
185
|
-
debtMintPrice
|
186
|
-
);
|
187
|
-
|
188
|
-
const debtAvailable = debtLiquidityUsdAvailable(positionState);
|
189
|
-
const supplyDepositable = supplyLiquidityUsdDepositable(positionState);
|
190
|
-
const sufficientLiquidity =
|
191
|
-
debtAvailable * 0.95 > values.debtAdjustmentUsd &&
|
192
|
-
supplyDepositable * 0.95 > values.debtAdjustmentUsd;
|
193
|
-
|
194
|
-
if (!sufficientLiquidity) {
|
195
|
-
consoleLog("Insufficient liquidity to further boost");
|
196
|
-
}
|
197
|
-
return sufficientLiquidity ? "boost" : undefined;
|
198
|
-
}
|
199
|
-
|
200
|
-
return "boost";
|
210
|
+
const sufficientLiquidity = sufficientLiquidityToBoost(
|
211
|
+
positionState,
|
212
|
+
positionSettings,
|
213
|
+
positionDca,
|
214
|
+
supplyMintPrice,
|
215
|
+
debtMintPrice
|
216
|
+
);
|
217
|
+
return sufficientLiquidity ? "boost" : undefined;
|
201
218
|
} else if (
|
202
219
|
repayFrom - positionState.liqUtilizationRateBps <=
|
203
220
|
bpsDistanceThreshold
|
@@ -65,7 +65,7 @@ describe("Solauto Marginfi tests", async () => {
|
|
65
65
|
await client.initialize({
|
66
66
|
signer,
|
67
67
|
positionId,
|
68
|
-
authority: new PublicKey("
|
68
|
+
authority: new PublicKey("FKYQs7KgRvaKQHxXwb8HKfoBcFdSxLL3JvHWpPdVQ16v"),
|
69
69
|
// new: true,
|
70
70
|
// marginfiAccount: new PublicKey(
|
71
71
|
// ""
|