@haven-fi/solauto-sdk 1.0.58 → 1.0.60
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/clients/solautoClient.d.ts.map +1 -1
- package/dist/transactions/transactionUtils.d.ts.map +1 -1
- package/dist/transactions/transactionUtils.js +3 -2
- package/dist/utils/solauto/generalUtils.d.ts +20 -5
- package/dist/utils/solauto/generalUtils.d.ts.map +1 -1
- package/dist/utils/solauto/generalUtils.js +72 -13
- package/dist/utils/solauto/rebalanceUtils.d.ts +3 -1
- package/dist/utils/solauto/rebalanceUtils.d.ts.map +1 -1
- package/dist/utils/solauto/rebalanceUtils.js +47 -58
- package/package.json +1 -1
- package/src/clients/solautoClient.ts +0 -3
- package/src/transactions/transactionUtils.ts +15 -3
- package/src/utils/solauto/generalUtils.ts +123 -21
- package/src/utils/solauto/rebalanceUtils.ts +91 -80
- package/tests/shared.ts +6 -3
- package/tests/unit/rebalanceCalculations.ts +77 -46
@@ -1,5 +1,5 @@
|
|
1
1
|
import { PublicKey } from "@solana/web3.js";
|
2
|
-
import { isOption, isSome, Umi } from "@metaplex-foundation/umi";
|
2
|
+
import { isOption, isSome, publicKey, Umi } from "@metaplex-foundation/umi";
|
3
3
|
import {
|
4
4
|
AutomationSettings,
|
5
5
|
DCASettings,
|
@@ -53,9 +53,10 @@ export function nextAutomationPeriodTimestamp(
|
|
53
53
|
}
|
54
54
|
|
55
55
|
export function eligibleForNextAutomationPeriod(
|
56
|
-
automation: AutomationSettings
|
56
|
+
automation: AutomationSettings,
|
57
|
+
currentUnixTime: number
|
57
58
|
): boolean {
|
58
|
-
return
|
59
|
+
return currentUnixTime >= nextAutomationPeriodTimestamp(automation);
|
59
60
|
}
|
60
61
|
|
61
62
|
export function getUpdatedValueFromAutomation(
|
@@ -78,16 +79,16 @@ export function getUpdatedValueFromAutomation(
|
|
78
79
|
|
79
80
|
export function getAdjustedSettingsFromAutomation(
|
80
81
|
settings: SolautoSettingsParameters,
|
81
|
-
|
82
|
+
currentUnixTime: number
|
82
83
|
): SolautoSettingsParameters {
|
83
84
|
const boostToBps =
|
84
85
|
settings.automation.targetPeriods > 0 &&
|
85
|
-
eligibleForNextAutomationPeriod(settings.automation)
|
86
|
+
eligibleForNextAutomationPeriod(settings.automation, currentUnixTime)
|
86
87
|
? getUpdatedValueFromAutomation(
|
87
88
|
settings.boostToBps,
|
88
89
|
settings.targetBoostToBps,
|
89
90
|
settings.automation,
|
90
|
-
|
91
|
+
currentUnixTime
|
91
92
|
)
|
92
93
|
: settings.boostToBps;
|
93
94
|
|
@@ -121,11 +122,12 @@ export function getSolautoFeesBps(
|
|
121
122
|
export function eligibleForRebalance(
|
122
123
|
positionState: PositionState,
|
123
124
|
positionSettings: SolautoSettingsParameters,
|
124
|
-
positionDca: DCASettings
|
125
|
+
positionDca: DCASettings,
|
126
|
+
currentUnixSecs: number
|
125
127
|
): RebalanceAction | undefined {
|
126
128
|
if (
|
127
129
|
positionDca.automation.targetPeriods > 0 &&
|
128
|
-
eligibleForNextAutomationPeriod(positionDca.automation)
|
130
|
+
eligibleForNextAutomationPeriod(positionDca.automation, currentUnixSecs)
|
129
131
|
) {
|
130
132
|
return "dca";
|
131
133
|
}
|
@@ -135,13 +137,13 @@ export function eligibleForRebalance(
|
|
135
137
|
}
|
136
138
|
|
137
139
|
const boostToBps =
|
138
|
-
eligibleForRefresh(positionState, positionSettings) &&
|
140
|
+
eligibleForRefresh(positionState, positionSettings, currentUnixSecs) &&
|
139
141
|
positionSettings.automation.targetPeriods > 0
|
140
142
|
? getUpdatedValueFromAutomation(
|
141
143
|
positionSettings.boostToBps,
|
142
144
|
positionSettings.targetBoostToBps,
|
143
145
|
positionSettings.automation,
|
144
|
-
|
146
|
+
currentUnixSecs
|
145
147
|
)
|
146
148
|
: positionSettings.boostToBps;
|
147
149
|
const repayFrom = positionSettings.repayToBps + positionSettings.repayGap;
|
@@ -158,10 +160,14 @@ export function eligibleForRebalance(
|
|
158
160
|
|
159
161
|
export function eligibleForRefresh(
|
160
162
|
positionState: PositionState,
|
161
|
-
positionSettings: SolautoSettingsParameters
|
163
|
+
positionSettings: SolautoSettingsParameters,
|
164
|
+
currentUnixTime: number
|
162
165
|
): boolean {
|
163
166
|
if (positionSettings.automation.targetPeriods > 0) {
|
164
|
-
return eligibleForNextAutomationPeriod(
|
167
|
+
return eligibleForNextAutomationPeriod(
|
168
|
+
positionSettings.automation,
|
169
|
+
currentUnixTime
|
170
|
+
);
|
165
171
|
} else {
|
166
172
|
return (
|
167
173
|
currentUnixSeconds() - Number(positionState.lastUpdated) >
|
@@ -319,15 +325,32 @@ export async function getAllPositionsByAuthority(
|
|
319
325
|
return allPositions;
|
320
326
|
}
|
321
327
|
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
protocolAccount
|
326
|
-
lendingPlatform
|
327
|
-
supplyPrice?: number
|
328
|
-
debtPrice?: number
|
329
|
-
|
328
|
+
interface GetLatestStateProps {
|
329
|
+
state: PositionState;
|
330
|
+
umi?: Umi;
|
331
|
+
protocolAccount?: PublicKey;
|
332
|
+
lendingPlatform?: LendingPlatform;
|
333
|
+
supplyPrice?: number;
|
334
|
+
debtPrice?: number;
|
335
|
+
}
|
336
|
+
|
337
|
+
export async function positionStateWithPrices({
|
338
|
+
state,
|
339
|
+
supplyPrice,
|
340
|
+
debtPrice,
|
341
|
+
umi,
|
342
|
+
protocolAccount,
|
343
|
+
lendingPlatform,
|
344
|
+
}: GetLatestStateProps): Promise<PositionState | undefined> {
|
330
345
|
if (currentUnixSeconds() - Number(state.lastUpdated) > 60 * 60 * 24 * 7) {
|
346
|
+
if (
|
347
|
+
umi === undefined ||
|
348
|
+
protocolAccount === undefined ||
|
349
|
+
lendingPlatform === undefined
|
350
|
+
) {
|
351
|
+
throw new Error("Missing required parameters");
|
352
|
+
}
|
353
|
+
|
331
354
|
if (lendingPlatform === LendingPlatform.Marginfi) {
|
332
355
|
return await getMarginfiAccountPositionState(
|
333
356
|
umi,
|
@@ -361,7 +384,10 @@ export async function positionStateWithPrices(
|
|
361
384
|
state.liqThresholdBps
|
362
385
|
),
|
363
386
|
netWorth: {
|
364
|
-
|
387
|
+
baseUnit: toBaseUnit(
|
388
|
+
(supplyUsd - debtUsd) / supplyPrice,
|
389
|
+
state.supply.decimals
|
390
|
+
),
|
365
391
|
baseAmountUsdValue: toBaseUnit(supplyUsd - debtUsd, USD_DECIMALS),
|
366
392
|
},
|
367
393
|
supply: {
|
@@ -381,6 +407,82 @@ export async function positionStateWithPrices(
|
|
381
407
|
};
|
382
408
|
}
|
383
409
|
|
410
|
+
interface AssetProps {
|
411
|
+
amountUsedBaseUnit: bigint;
|
412
|
+
decimals: number;
|
413
|
+
price: number;
|
414
|
+
mint: PublicKey;
|
415
|
+
}
|
416
|
+
|
417
|
+
export function createFakePositionState(
|
418
|
+
supply: AssetProps,
|
419
|
+
debt: AssetProps,
|
420
|
+
maxLtvBps: number,
|
421
|
+
liqThresholdBps: number
|
422
|
+
): PositionState {
|
423
|
+
const supplyUsd =
|
424
|
+
fromBaseUnit(supply.amountUsedBaseUnit, supply.decimals) * supply.price;
|
425
|
+
const debtUsd =
|
426
|
+
fromBaseUnit(debt.amountUsedBaseUnit, debt.decimals) * debt.price;
|
427
|
+
|
428
|
+
return {
|
429
|
+
liqUtilizationRateBps: getLiqUtilzationRateBps(
|
430
|
+
supplyUsd,
|
431
|
+
debtUsd,
|
432
|
+
liqThresholdBps
|
433
|
+
),
|
434
|
+
supply: {
|
435
|
+
amountUsed: {
|
436
|
+
baseUnit: supply.amountUsedBaseUnit,
|
437
|
+
baseAmountUsdValue: toBaseUnit(supplyUsd, USD_DECIMALS),
|
438
|
+
},
|
439
|
+
amountCanBeUsed: {
|
440
|
+
baseUnit: toBaseUnit(1000000, supply.decimals),
|
441
|
+
baseAmountUsdValue: BigInt(Math.round(1000000 * supply.price)),
|
442
|
+
},
|
443
|
+
baseAmountMarketPriceUsd: toBaseUnit(supply.price, USD_DECIMALS),
|
444
|
+
borrowFeeBps: 0,
|
445
|
+
decimals: supply.decimals,
|
446
|
+
flashLoanFeeBps: 0,
|
447
|
+
mint: publicKey(supply.mint),
|
448
|
+
padding1: [],
|
449
|
+
padding2: [],
|
450
|
+
padding: new Uint8Array([]),
|
451
|
+
},
|
452
|
+
debt: {
|
453
|
+
amountUsed: {
|
454
|
+
baseUnit: debt.amountUsedBaseUnit,
|
455
|
+
baseAmountUsdValue: toBaseUnit(debtUsd, USD_DECIMALS),
|
456
|
+
},
|
457
|
+
amountCanBeUsed: {
|
458
|
+
baseUnit: toBaseUnit(1000000, debt.decimals),
|
459
|
+
baseAmountUsdValue: BigInt(Math.round(1000000 * debt.price)),
|
460
|
+
},
|
461
|
+
baseAmountMarketPriceUsd: toBaseUnit(debt.price, USD_DECIMALS),
|
462
|
+
borrowFeeBps: 0,
|
463
|
+
decimals: debt.decimals,
|
464
|
+
flashLoanFeeBps: 0,
|
465
|
+
mint: publicKey(debt.mint),
|
466
|
+
padding1: [],
|
467
|
+
padding2: [],
|
468
|
+
padding: new Uint8Array([]),
|
469
|
+
},
|
470
|
+
netWorth: {
|
471
|
+
baseUnit: toBaseUnit(
|
472
|
+
(supplyUsd - debtUsd) / supply.price,
|
473
|
+
supply.decimals
|
474
|
+
),
|
475
|
+
baseAmountUsdValue: toBaseUnit(supplyUsd - debtUsd, USD_DECIMALS),
|
476
|
+
},
|
477
|
+
maxLtvBps,
|
478
|
+
liqThresholdBps,
|
479
|
+
lastUpdated: BigInt(currentUnixSeconds()),
|
480
|
+
padding1: [],
|
481
|
+
padding2: [],
|
482
|
+
padding: [],
|
483
|
+
};
|
484
|
+
}
|
485
|
+
|
384
486
|
type PositionAdjustment =
|
385
487
|
| { type: "supply"; value: bigint }
|
386
488
|
| { type: "debt"; value: bigint }
|
@@ -1,6 +1,12 @@
|
|
1
1
|
import { PublicKey } from "@solana/web3.js";
|
2
2
|
import { SolautoClient } from "../../clients/solautoClient";
|
3
|
-
import {
|
3
|
+
import {
|
4
|
+
DCASettings,
|
5
|
+
FeeType,
|
6
|
+
PositionState,
|
7
|
+
PositionTokenUsage,
|
8
|
+
SolautoSettingsParameters,
|
9
|
+
} from "../../generated";
|
4
10
|
import {
|
5
11
|
eligibleForNextAutomationPeriod,
|
6
12
|
getAdjustedSettingsFromAutomation,
|
@@ -26,15 +32,12 @@ import {
|
|
26
32
|
PRICES,
|
27
33
|
} from "../../constants/solautoConstants";
|
28
34
|
|
29
|
-
function getAdditionalAmountToDcaIn(
|
30
|
-
const dca = client.solautoPositionActiveDca()!;
|
35
|
+
function getAdditionalAmountToDcaIn(dca: DCASettings): number {
|
31
36
|
if (dca.debtToAddBaseUnit === BigInt(0)) {
|
32
37
|
return 0;
|
33
38
|
}
|
34
39
|
|
35
|
-
const debtBalance =
|
36
|
-
Number(client.solautoPositionData?.position.dca.debtToAddBaseUnit ?? 0) +
|
37
|
-
Number(client.livePositionUpdates.debtTaBalanceAdjustment ?? 0);
|
40
|
+
const debtBalance = Number(dca.debtToAddBaseUnit);
|
38
41
|
const updatedDebtBalance = getUpdatedValueFromAutomation(
|
39
42
|
debtBalance,
|
40
43
|
0,
|
@@ -45,44 +48,44 @@ function getAdditionalAmountToDcaIn(client: SolautoClient): number {
|
|
45
48
|
return debtBalance - updatedDebtBalance;
|
46
49
|
}
|
47
50
|
|
48
|
-
function getStandardTargetLiqUtilizationRateBps(
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
function getStandardTargetLiqUtilizationRateBps(
|
52
|
+
state: PositionState,
|
53
|
+
settings: SolautoSettingsParameters
|
54
|
+
): number {
|
55
|
+
const adjustedSettings = getAdjustedSettingsFromAutomation(
|
56
|
+
settings,
|
57
|
+
currentUnixSeconds()
|
58
|
+
);
|
59
|
+
|
60
|
+
const repayFrom = adjustedSettings.repayToBps - adjustedSettings.repayGap;
|
61
|
+
const boostFrom = adjustedSettings.boostToBps + adjustedSettings.boostGap;
|
54
62
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
repayFrom - client.solautoPositionState!.liqUtilizationRateBps <
|
63
|
-
repayFrom * 0.015
|
64
|
-
) {
|
65
|
-
return adjustedSettings.repayToBps;
|
66
|
-
} else {
|
67
|
-
throw new Error("Invalid rebalance condition");
|
68
|
-
}
|
63
|
+
if (state.liqUtilizationRateBps < boostFrom) {
|
64
|
+
return adjustedSettings.boostToBps;
|
65
|
+
} else if (
|
66
|
+
state.liqUtilizationRateBps > repayFrom ||
|
67
|
+
repayFrom - state.liqUtilizationRateBps < repayFrom * 0.015
|
68
|
+
) {
|
69
|
+
return adjustedSettings.repayToBps;
|
69
70
|
} else {
|
70
|
-
throw new Error(
|
71
|
-
"This is a self-managed position, a targetLiqUtilizationRateBps must be provided initiate a rebalance"
|
72
|
-
);
|
71
|
+
throw new Error("Invalid rebalance condition");
|
73
72
|
}
|
74
73
|
}
|
75
74
|
|
76
|
-
function targetLiqUtilizationRateBpsFromDCA(
|
75
|
+
function targetLiqUtilizationRateBpsFromDCA(
|
76
|
+
state: PositionState,
|
77
|
+
settings: SolautoSettingsParameters,
|
78
|
+
dca: DCASettings
|
79
|
+
) {
|
77
80
|
const adjustedSettings = getAdjustedSettingsFromAutomation(
|
78
|
-
|
81
|
+
settings,
|
79
82
|
currentUnixSeconds()
|
80
83
|
);
|
81
84
|
|
82
85
|
let targetRateBps = 0;
|
83
|
-
if (
|
86
|
+
if (dca.debtToAddBaseUnit > BigInt(0)) {
|
84
87
|
targetRateBps = Math.max(
|
85
|
-
|
88
|
+
state.liqUtilizationRateBps,
|
86
89
|
adjustedSettings.boostToBps
|
87
90
|
);
|
88
91
|
} else {
|
@@ -91,32 +94,29 @@ function targetLiqUtilizationRateBpsFromDCA(client: SolautoClient) {
|
|
91
94
|
return targetRateBps;
|
92
95
|
}
|
93
96
|
|
94
|
-
function isDcaRebalance(
|
95
|
-
|
97
|
+
function isDcaRebalance(
|
98
|
+
state: PositionState,
|
99
|
+
settings: SolautoSettingsParameters,
|
100
|
+
dca: DCASettings | undefined,
|
101
|
+
currentUnixTime: number
|
102
|
+
): boolean {
|
103
|
+
if (dca === undefined || dca.automation.targetPeriods === 0) {
|
96
104
|
return false;
|
97
105
|
}
|
98
106
|
|
99
107
|
const adjustedSettings = getAdjustedSettingsFromAutomation(
|
100
|
-
|
108
|
+
settings,
|
101
109
|
currentUnixSeconds()
|
102
110
|
);
|
103
111
|
|
104
112
|
if (
|
105
|
-
|
113
|
+
state.liqUtilizationRateBps >
|
106
114
|
adjustedSettings.repayToBps + adjustedSettings.repayGap
|
107
115
|
) {
|
108
116
|
return false;
|
109
117
|
}
|
110
118
|
|
111
|
-
if (
|
112
|
-
return false;
|
113
|
-
}
|
114
|
-
|
115
|
-
if (
|
116
|
-
!eligibleForNextAutomationPeriod(
|
117
|
-
client.solautoPositionActiveDca()!.automation
|
118
|
-
)
|
119
|
-
) {
|
119
|
+
if (!eligibleForNextAutomationPeriod(dca.automation, currentUnixTime)) {
|
120
120
|
return false;
|
121
121
|
}
|
122
122
|
|
@@ -124,7 +124,10 @@ function isDcaRebalance(client: SolautoClient): boolean {
|
|
124
124
|
}
|
125
125
|
|
126
126
|
function getTargetRateAndDcaAmount(
|
127
|
-
|
127
|
+
state: PositionState,
|
128
|
+
settings: SolautoSettingsParameters | undefined,
|
129
|
+
dca: DCASettings | undefined,
|
130
|
+
currentUnixTime: number,
|
128
131
|
targetLiqUtilizationRateBps?: number
|
129
132
|
): { targetRateBps: number; amountToDcaIn?: number } {
|
130
133
|
if (targetLiqUtilizationRateBps !== undefined) {
|
@@ -133,10 +136,19 @@ function getTargetRateAndDcaAmount(
|
|
133
136
|
};
|
134
137
|
}
|
135
138
|
|
136
|
-
if (
|
137
|
-
|
138
|
-
|
139
|
-
|
139
|
+
if (settings === undefined) {
|
140
|
+
throw new Error(
|
141
|
+
"If rebalancing a self-managed position, settings, and DCA should be provided"
|
142
|
+
);
|
143
|
+
}
|
144
|
+
|
145
|
+
if (isDcaRebalance(state, settings, dca, currentUnixTime)) {
|
146
|
+
const amountToDcaIn = getAdditionalAmountToDcaIn(dca!);
|
147
|
+
const targetLiqUtilizationRateBps = targetLiqUtilizationRateBpsFromDCA(
|
148
|
+
state,
|
149
|
+
settings,
|
150
|
+
dca!
|
151
|
+
);
|
140
152
|
|
141
153
|
return {
|
142
154
|
targetRateBps: targetLiqUtilizationRateBps,
|
@@ -144,7 +156,7 @@ function getTargetRateAndDcaAmount(
|
|
144
156
|
};
|
145
157
|
} else {
|
146
158
|
return {
|
147
|
-
targetRateBps: getStandardTargetLiqUtilizationRateBps(
|
159
|
+
targetRateBps: getStandardTargetLiqUtilizationRateBps(state, settings),
|
148
160
|
};
|
149
161
|
}
|
150
162
|
}
|
@@ -152,17 +164,24 @@ function getTargetRateAndDcaAmount(
|
|
152
164
|
export interface RebalanceValues {
|
153
165
|
increasingLeverage: boolean;
|
154
166
|
debtAdjustmentUsd: number;
|
167
|
+
amountToDcaIn: number;
|
155
168
|
amountUsdToDcaIn: number;
|
156
169
|
}
|
157
170
|
|
158
171
|
export function getRebalanceValues(
|
159
|
-
|
172
|
+
state: PositionState,
|
173
|
+
settings: SolautoSettingsParameters | undefined,
|
174
|
+
dca: DCASettings | undefined,
|
175
|
+
feeType: FeeType,
|
176
|
+
currentUnixTime: number,
|
177
|
+
supplyPrice: number,
|
178
|
+
debtPrice: number,
|
160
179
|
targetLiqUtilizationRateBps?: number,
|
161
180
|
limitGapBps?: number
|
162
181
|
): RebalanceValues {
|
163
182
|
if (
|
164
|
-
|
165
|
-
|
183
|
+
state === undefined ||
|
184
|
+
state.lastUpdated <
|
166
185
|
BigInt(
|
167
186
|
Math.round(currentUnixSeconds() - MIN_POSITION_STATE_FRESHNESS_SECS)
|
168
187
|
)
|
@@ -171,50 +190,41 @@ export function getRebalanceValues(
|
|
171
190
|
}
|
172
191
|
|
173
192
|
const { targetRateBps, amountToDcaIn } = getTargetRateAndDcaAmount(
|
174
|
-
|
193
|
+
state,
|
194
|
+
settings,
|
195
|
+
dca,
|
196
|
+
currentUnixTime,
|
175
197
|
targetLiqUtilizationRateBps
|
176
198
|
);
|
177
199
|
|
178
200
|
const amountUsdToDcaIn =
|
179
|
-
fromBaseUnit(
|
180
|
-
|
181
|
-
client.solautoPositionState!.debt.decimals
|
182
|
-
) * PRICES[client.debtMint.toString()].price;
|
201
|
+
fromBaseUnit(BigInt(Math.round(amountToDcaIn ?? 0)), state.debt.decimals) *
|
202
|
+
debtPrice;
|
183
203
|
|
184
204
|
const increasingLeverage =
|
185
|
-
amountUsdToDcaIn > 0 ||
|
186
|
-
client.solautoPositionState!.liqUtilizationRateBps < targetRateBps;
|
205
|
+
amountUsdToDcaIn > 0 || state.liqUtilizationRateBps < targetRateBps;
|
187
206
|
let adjustmentFeeBps = 0;
|
188
207
|
if (increasingLeverage) {
|
189
|
-
adjustmentFeeBps = getSolautoFeesBps(
|
190
|
-
client.referredByState !== undefined,
|
191
|
-
client.solautoPositionData?.feeType ?? FeeType.Small
|
192
|
-
).total;
|
208
|
+
adjustmentFeeBps = getSolautoFeesBps(false, feeType).total;
|
193
209
|
}
|
194
210
|
|
195
211
|
const supplyUsd =
|
196
|
-
fromBaseUnit(
|
197
|
-
|
198
|
-
USD_DECIMALS
|
199
|
-
) + amountUsdToDcaIn;
|
212
|
+
fromBaseUnit(state.supply.amountUsed.baseAmountUsdValue, USD_DECIMALS) +
|
213
|
+
amountUsdToDcaIn;
|
200
214
|
const debtUsd = fromBaseUnit(
|
201
|
-
|
215
|
+
state.debt.amountUsed.baseAmountUsdValue,
|
202
216
|
USD_DECIMALS
|
203
217
|
);
|
204
218
|
let debtAdjustmentUsd = getDebtAdjustmentUsd(
|
205
|
-
|
219
|
+
state.liqThresholdBps,
|
206
220
|
supplyUsd,
|
207
221
|
debtUsd,
|
208
222
|
targetRateBps,
|
209
223
|
adjustmentFeeBps
|
210
224
|
);
|
211
225
|
|
212
|
-
const input = increasingLeverage
|
213
|
-
|
214
|
-
: client.solautoPositionState!.supply;
|
215
|
-
const inputMarketPrice = increasingLeverage
|
216
|
-
? PRICES[client.debtMint.toString()].price
|
217
|
-
: PRICES[client.supplyMint.toString()].price;
|
226
|
+
const input = increasingLeverage ? state.debt : state.supply;
|
227
|
+
const inputMarketPrice = increasingLeverage ? debtPrice : supplyPrice;
|
218
228
|
|
219
229
|
const limitGap = limitGapBps
|
220
230
|
? fromBps(limitGapBps)
|
@@ -235,6 +245,7 @@ export function getRebalanceValues(
|
|
235
245
|
return {
|
236
246
|
increasingLeverage,
|
237
247
|
debtAdjustmentUsd,
|
248
|
+
amountToDcaIn: amountToDcaIn ?? 0,
|
238
249
|
amountUsdToDcaIn,
|
239
250
|
};
|
240
251
|
}
|
@@ -269,7 +280,7 @@ export function getFlashLoanDetails(
|
|
269
280
|
values.debtAdjustmentUsd > 0
|
270
281
|
? debtUsd + debtAdjustmentWithSlippage
|
271
282
|
: debtUsd;
|
272
|
-
|
283
|
+
|
273
284
|
const tempLiqUtilizationRateBps = getLiqUtilzationRateBps(
|
274
285
|
supplyUsd,
|
275
286
|
debtUsd,
|
@@ -342,7 +353,7 @@ export function getJupSwapRebalanceDetails(
|
|
342
353
|
inputMint: toWeb3JsPublicKey(input.mint),
|
343
354
|
outputMint: toWeb3JsPublicKey(output.mint),
|
344
355
|
destinationWallet: client.solautoPosition,
|
345
|
-
slippageBpsIncFactor: 0.25 + (
|
356
|
+
slippageBpsIncFactor: 0.25 + (attemptNum ?? 0) * 0.2,
|
346
357
|
amount: rebalancingToZero
|
347
358
|
? client.solautoPositionState!.debt.amountUsed.baseUnit +
|
348
359
|
BigInt(
|
package/tests/shared.ts
CHANGED
@@ -1,14 +1,17 @@
|
|
1
1
|
import { Signer, createSignerFromKeypair } from "@metaplex-foundation/umi";
|
2
|
-
import { Connection, clusterApiUrl } from "@solana/web3.js";
|
2
|
+
import { Connection, Keypair, clusterApiUrl } from "@solana/web3.js";
|
3
3
|
import { createUmi } from "@metaplex-foundation/umi-bundle-defaults";
|
4
4
|
import { getSecretKey } from "../local/shared";
|
5
|
+
import { fromWeb3JsKeypair } from "@metaplex-foundation/umi-web3js-adapters";
|
5
6
|
|
6
|
-
export function setupTest(keypairFilename?: string): Signer {
|
7
|
+
export function setupTest(keypairFilename?: string, random?: boolean): Signer {
|
7
8
|
const umi = createUmi(
|
8
9
|
new Connection(clusterApiUrl("mainnet-beta"), "confirmed")
|
9
10
|
);
|
10
11
|
const secretKey = getSecretKey(keypairFilename);
|
11
|
-
const signerKeypair =
|
12
|
+
const signerKeypair = random
|
13
|
+
? fromWeb3JsKeypair(Keypair.generate())
|
14
|
+
: umi.eddsa.createKeypairFromSecretKey(secretKey);
|
12
15
|
const signer = createSignerFromKeypair(umi, signerKeypair);
|
13
16
|
|
14
17
|
return signer;
|