@haven-fi/solauto-sdk 1.0.58 → 1.0.60
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/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
|
@@ -4,7 +4,6 @@ import { NATIVE_MINT } from "@solana/spl-token";
|
|
|
4
4
|
import { assert } from "chai";
|
|
5
5
|
import { SolautoMarginfiClient } from "../../src/clients/solautoMarginfiClient";
|
|
6
6
|
import { setupTest } from "../shared";
|
|
7
|
-
import { MARGINFI_ACCOUNTS } from "../../src/constants/marginfiAccounts";
|
|
8
7
|
import { getRebalanceValues } from "../../src/utils/solauto/rebalanceUtils";
|
|
9
8
|
import { publicKey } from "@metaplex-foundation/umi";
|
|
10
9
|
import { SolautoClient } from "../../src/clients/solautoClient";
|
|
@@ -23,18 +22,21 @@ import {
|
|
|
23
22
|
} from "../../src/utils/numberUtils";
|
|
24
23
|
import { USD_DECIMALS } from "../../src/constants/generalAccounts";
|
|
25
24
|
import {
|
|
25
|
+
createFakePositionState,
|
|
26
26
|
eligibleForNextAutomationPeriod,
|
|
27
27
|
getAdjustedSettingsFromAutomation,
|
|
28
28
|
getSolautoFeesBps,
|
|
29
29
|
getUpdatedValueFromAutomation,
|
|
30
|
+
positionStateWithPrices,
|
|
30
31
|
} from "../../src/utils/solauto/generalUtils";
|
|
31
32
|
import {
|
|
32
33
|
currentUnixSeconds,
|
|
33
34
|
getTokenPrices,
|
|
34
35
|
} from "../../src/utils/generalUtils";
|
|
35
36
|
import { USDC_MINT } from "../../src/constants/tokenConstants";
|
|
37
|
+
import { PRICES } from "../../src/constants";
|
|
36
38
|
|
|
37
|
-
const signer = setupTest();
|
|
39
|
+
const signer = setupTest(undefined, true);
|
|
38
40
|
|
|
39
41
|
function assertAccurateRebalance(
|
|
40
42
|
client: SolautoClient,
|
|
@@ -43,7 +45,16 @@ function assertAccurateRebalance(
|
|
|
43
45
|
expectedUsdToDcaIn?: number
|
|
44
46
|
) {
|
|
45
47
|
const { increasingLeverage, debtAdjustmentUsd, amountUsdToDcaIn } =
|
|
46
|
-
getRebalanceValues(
|
|
48
|
+
getRebalanceValues(
|
|
49
|
+
client.solautoPositionState!,
|
|
50
|
+
client.solautoPositionSettings(),
|
|
51
|
+
client.solautoPositionActiveDca(),
|
|
52
|
+
client.solautoPositionData?.feeType ?? FeeType.Small,
|
|
53
|
+
currentUnixSeconds(),
|
|
54
|
+
PRICES[client.supplyMint.toString()].price,
|
|
55
|
+
PRICES[client.debtMint.toString()].price,
|
|
56
|
+
targetLiqUtilizationRateBps
|
|
57
|
+
);
|
|
47
58
|
|
|
48
59
|
let adjustmentFeeBps = 0;
|
|
49
60
|
if (increasingLeverage) {
|
|
@@ -55,7 +66,9 @@ function assertAccurateRebalance(
|
|
|
55
66
|
|
|
56
67
|
assert(
|
|
57
68
|
Math.round(amountUsdToDcaIn) === Math.round(expectedUsdToDcaIn ?? 0),
|
|
58
|
-
`Expected DCA-in amount does not match ${Math.round(
|
|
69
|
+
`Expected DCA-in amount does not match ${Math.round(
|
|
70
|
+
amountUsdToDcaIn
|
|
71
|
+
)}, ${Math.round(expectedUsdToDcaIn ?? 0)}`
|
|
59
72
|
);
|
|
60
73
|
|
|
61
74
|
const newSupply =
|
|
@@ -77,8 +90,9 @@ function assertAccurateRebalance(
|
|
|
77
90
|
client.solautoPositionState!.liqThresholdBps
|
|
78
91
|
);
|
|
79
92
|
assert(
|
|
80
|
-
Math.round(newLiqUtilizationRateBps) ===
|
|
81
|
-
|
|
93
|
+
Math.round(newLiqUtilizationRateBps) ===
|
|
94
|
+
Math.round(expectedLiqUtilizationRateBps),
|
|
95
|
+
`Expected liq utilization rate does not match ${newLiqUtilizationRateBps}, ${expectedLiqUtilizationRateBps}`
|
|
82
96
|
);
|
|
83
97
|
}
|
|
84
98
|
|
|
@@ -97,10 +111,37 @@ async function getFakePosition(
|
|
|
97
111
|
positionId: 1,
|
|
98
112
|
signer,
|
|
99
113
|
supplyMint: new PublicKey(NATIVE_MINT),
|
|
100
|
-
debtMint: new PublicKey(
|
|
114
|
+
debtMint: new PublicKey(USDC_MINT),
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const supplyUsd = 1000;
|
|
118
|
+
const maxLtvBps = 6400;
|
|
119
|
+
const liqThresholdBps = 8181;
|
|
120
|
+
client.solautoPositionState = await positionStateWithPrices({
|
|
121
|
+
state: createFakePositionState(
|
|
122
|
+
{
|
|
123
|
+
amountUsedBaseUnit: toBaseUnit(supplyUsd / supplyPrice, 9),
|
|
124
|
+
decimals: 9,
|
|
125
|
+
price: PRICES[NATIVE_MINT.toString()].price,
|
|
126
|
+
mint: NATIVE_MINT,
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
amountUsedBaseUnit: toBaseUnit(
|
|
130
|
+
(supplyUsd *
|
|
131
|
+
fromBps(liqThresholdBps) *
|
|
132
|
+
fromBps(fakeLiqUtilizationRateBps)) /
|
|
133
|
+
debtPrice,
|
|
134
|
+
6
|
|
135
|
+
),
|
|
136
|
+
decimals: 6,
|
|
137
|
+
price: 1,
|
|
138
|
+
mint: new PublicKey(USDC_MINT),
|
|
139
|
+
},
|
|
140
|
+
maxLtvBps,
|
|
141
|
+
liqThresholdBps
|
|
142
|
+
),
|
|
101
143
|
});
|
|
102
144
|
|
|
103
|
-
const state = await client.getFreshPositionState();
|
|
104
145
|
client.solautoPositionData = {
|
|
105
146
|
positionId: [1],
|
|
106
147
|
bump: [0],
|
|
@@ -129,7 +170,7 @@ async function getFakePosition(
|
|
|
129
170
|
padding1: [],
|
|
130
171
|
padding: [],
|
|
131
172
|
},
|
|
132
|
-
state:
|
|
173
|
+
state: client.solautoPositionState!,
|
|
133
174
|
rebalance: {
|
|
134
175
|
rebalanceType: SolautoRebalanceType.Regular,
|
|
135
176
|
targetLiqUtilizationRateBps: 0,
|
|
@@ -139,7 +180,7 @@ async function getFakePosition(
|
|
|
139
180
|
padding2: [],
|
|
140
181
|
padding: new Uint8Array([]),
|
|
141
182
|
},
|
|
142
|
-
feeType: FeeType.
|
|
183
|
+
feeType: FeeType.Default,
|
|
143
184
|
padding1: [],
|
|
144
185
|
padding2: [],
|
|
145
186
|
padding: [],
|
|
@@ -155,25 +196,14 @@ async function getFakePosition(
|
|
|
155
196
|
},
|
|
156
197
|
};
|
|
157
198
|
|
|
158
|
-
const supplyUsd = 1000;
|
|
159
|
-
client.livePositionUpdates.new({
|
|
160
|
-
type: "supply",
|
|
161
|
-
value: toBaseUnit(supplyUsd / supplyPrice, state!.supply.decimals),
|
|
162
|
-
});
|
|
163
|
-
client.livePositionUpdates.new({
|
|
164
|
-
type: "debt",
|
|
165
|
-
value: toBaseUnit(
|
|
166
|
-
(supplyUsd *
|
|
167
|
-
fromBps(state!.liqThresholdBps) *
|
|
168
|
-
fromBps(fakeLiqUtilizationRateBps)) /
|
|
169
|
-
debtPrice,
|
|
170
|
-
state!.debt.decimals
|
|
171
|
-
),
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
client.solautoPositionState = await client.getFreshPositionState();
|
|
175
199
|
client.solautoPositionState!.lastUpdated = BigInt(currentUnixSeconds());
|
|
176
200
|
|
|
201
|
+
assert(
|
|
202
|
+
fakeLiqUtilizationRateBps ===
|
|
203
|
+
client.solautoPositionState!.liqUtilizationRateBps,
|
|
204
|
+
"Fake position not set up correctly"
|
|
205
|
+
);
|
|
206
|
+
|
|
177
207
|
return client;
|
|
178
208
|
}
|
|
179
209
|
|
|
@@ -227,7 +257,8 @@ async function dcaRebalanceFromFakePosition(
|
|
|
227
257
|
: adjustedSettings.boostToBps;
|
|
228
258
|
|
|
229
259
|
const expectedDcaInAmount =
|
|
230
|
-
dca.debtToAddBaseUnit > 0 &&
|
|
260
|
+
dca.debtToAddBaseUnit > 0 &&
|
|
261
|
+
eligibleForNextAutomationPeriod(dca.automation, currentUnixSeconds())
|
|
231
262
|
? dca.debtToAddBaseUnit -
|
|
232
263
|
BigInt(
|
|
233
264
|
Math.round(
|
|
@@ -265,23 +296,23 @@ describe("Rebalance tests", async () => {
|
|
|
265
296
|
});
|
|
266
297
|
|
|
267
298
|
it("Standard rebalance with target rate", async () => {
|
|
268
|
-
const client =
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
299
|
+
const client = await getFakePosition(supplyPrice, debtPrice, 3450, {
|
|
300
|
+
boostToBps: 500,
|
|
301
|
+
boostGap: 100,
|
|
302
|
+
repayToBps: 7000,
|
|
303
|
+
repayGap: 250,
|
|
304
|
+
automation: {
|
|
305
|
+
targetPeriods: 0,
|
|
306
|
+
periodsPassed: 0,
|
|
307
|
+
unixStartDate: BigInt(0),
|
|
308
|
+
intervalSeconds: BigInt(0),
|
|
309
|
+
padding1: [],
|
|
310
|
+
padding: new Uint8Array([]),
|
|
311
|
+
},
|
|
312
|
+
targetBoostToBps: 0,
|
|
313
|
+
padding1: [],
|
|
314
|
+
padding: new Uint8Array([]),
|
|
282
315
|
});
|
|
283
|
-
client.solautoPositionState = await client.getFreshPositionState();
|
|
284
|
-
client.solautoPositionState!.lastUpdated = BigInt(currentUnixSeconds());
|
|
285
316
|
|
|
286
317
|
assertAccurateRebalance(client, 5000, 5000);
|
|
287
318
|
assertAccurateRebalance(client, 1000, 1000);
|
|
@@ -393,14 +424,14 @@ describe("Rebalance tests", async () => {
|
|
|
393
424
|
it("Rebalance DCA in", async () => {
|
|
394
425
|
const settings: SolautoSettingsParameters = {
|
|
395
426
|
automation: {
|
|
396
|
-
targetPeriods:
|
|
427
|
+
targetPeriods: 3,
|
|
397
428
|
periodsPassed: 0,
|
|
398
429
|
intervalSeconds: BigInt(5),
|
|
399
430
|
unixStartDate: BigInt(currentUnixSeconds()),
|
|
400
431
|
padding1: [],
|
|
401
432
|
padding: new Uint8Array([]),
|
|
402
433
|
},
|
|
403
|
-
targetBoostToBps:
|
|
434
|
+
targetBoostToBps: 5000,
|
|
404
435
|
boostGap: 1000,
|
|
405
436
|
boostToBps: 4000,
|
|
406
437
|
repayGap: 1000,
|