@haven-fi/solauto-sdk 1.0.311 → 1.0.313
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.js +3 -3
- package/dist/transactions/transactionUtils.d.ts.map +1 -1
- package/dist/transactions/transactionUtils.js +4 -2
- package/dist/transactions/transactionsManager.d.ts.map +1 -1
- package/dist/transactions/transactionsManager.js +28 -13
- package/dist/utils/jitoUtils.js +3 -3
- package/dist/utils/jupiterUtils.d.ts.map +1 -1
- package/dist/utils/jupiterUtils.js +0 -6
- package/dist/utils/priceUtils.d.ts.map +1 -1
- package/dist/utils/priceUtils.js +1 -1
- package/dist/utils/solanaUtils.d.ts +1 -1
- package/dist/utils/solanaUtils.d.ts.map +1 -1
- package/dist/utils/solanaUtils.js +12 -4
- package/dist/utils/solauto/generalUtils.d.ts +1 -1
- package/dist/utils/solauto/generalUtils.d.ts.map +1 -1
- package/dist/utils/solauto/generalUtils.js +10 -2
- package/dist/utils/solauto/rebalanceUtils.d.ts.map +1 -1
- package/dist/utils/solauto/rebalanceUtils.js +18 -8
- package/package.json +1 -1
- package/src/clients/solautoClient.ts +3 -3
- package/src/transactions/transactionUtils.ts +8 -3
- package/src/transactions/transactionsManager.ts +32 -13
- package/src/utils/jitoUtils.ts +3 -3
- package/src/utils/jupiterUtils.ts +0 -6
- package/src/utils/priceUtils.ts +1 -2
- package/src/utils/solanaUtils.ts +13 -4
- package/src/utils/solauto/generalUtils.ts +23 -1
- package/src/utils/solauto/rebalanceUtils.ts +27 -14
- package/tests/transactions/solautoMarginfi.ts +4 -5
@@ -319,7 +319,7 @@ class SolautoClient extends referralStateManager_1.ReferralStateManager {
|
|
319
319
|
this.livePositionUpdates.new({
|
320
320
|
type: "supply",
|
321
321
|
value: (this.solautoPositionState?.supply.amountUsed.baseUnit ??
|
322
|
-
BigInt(0))
|
322
|
+
BigInt(0)) * BigInt(-1),
|
323
323
|
});
|
324
324
|
}
|
325
325
|
}
|
@@ -339,8 +339,8 @@ class SolautoClient extends referralStateManager_1.ReferralStateManager {
|
|
339
339
|
else {
|
340
340
|
this.livePositionUpdates.new({
|
341
341
|
type: "debt",
|
342
|
-
value: (this.solautoPositionState?.debt.amountUsed.baseUnit ?? BigInt(0))
|
343
|
-
|
342
|
+
value: (this.solautoPositionState?.debt.amountUsed.baseUnit ?? BigInt(0)) *
|
343
|
+
BigInt(-1),
|
344
344
|
});
|
345
345
|
}
|
346
346
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,kBAAkB,EAClB,GAAG,EAGJ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AAmBxE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAoCzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAOlD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AA2LjD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,EACtB,sBAAsB,EAAE,MAAM,EAAE,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAoH7B;AA2LD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,GACrB,OAAO,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CA0BnD;AAED,wBAAsB,8BAA8B,CAAC,MAAM,EAAE,aAAa,oBA2CzE;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,
|
1
|
+
{"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,kBAAkB,EAClB,GAAG,EAGJ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AAmBxE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAoCzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAOlD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AA2LjD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,EACtB,sBAAsB,EAAE,MAAM,EAAE,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAoH7B;AA2LD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,GACrB,OAAO,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CA0BnD;AAED,wBAAsB,8BAA8B,CAAC,MAAM,EAAE,aAAa,oBA2CzE;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CA2H5C;AAED,wBAAsB,gCAAgC,CACpD,eAAe,EAAE,oBAAoB,EACrC,YAAY,EAAE,SAAS,EACvB,eAAe,EAAE,SAAS,GACzB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAsC5C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG;;;;EA0DxE"}
|
@@ -355,14 +355,16 @@ async function requiresRefreshBeforeRebalance(client) {
|
|
355
355
|
}
|
356
356
|
async function buildSolautoRebalanceTransaction(client, targetLiqUtilizationRateBps, attemptNum) {
|
357
357
|
client.solautoPositionState = await client.getFreshPositionState();
|
358
|
+
const supplyPrice = (0, utils_1.safeGetPrice)(client.supplyMint) ?? 0;
|
359
|
+
const debtPrice = (0, utils_1.safeGetPrice)(client.debtMint) ?? 0;
|
358
360
|
if ((client.solautoPositionState?.supply.amountUsed.baseUnit === BigInt(0) &&
|
359
361
|
client.livePositionUpdates.supplyAdjustment === BigInt(0)) ||
|
360
362
|
(targetLiqUtilizationRateBps === undefined &&
|
361
|
-
!(0, generalUtils_2.eligibleForRebalance)(client.solautoPositionState, client.solautoPositionSettings(), client.solautoPositionActiveDca(), (0, generalUtils_1.currentUnixSeconds)()))) {
|
363
|
+
!(0, generalUtils_2.eligibleForRebalance)(client.solautoPositionState, client.solautoPositionSettings(), client.solautoPositionActiveDca(), (0, generalUtils_1.currentUnixSeconds)(), supplyPrice, debtPrice))) {
|
362
364
|
client.log("Not eligible for a rebalance");
|
363
365
|
return undefined;
|
364
366
|
}
|
365
|
-
const values = (0, rebalanceUtils_1.getRebalanceValues)(client.solautoPositionState, client.solautoPositionSettings(), client.solautoPositionActiveDca(), (0, generalUtils_1.currentUnixSeconds)(),
|
367
|
+
const values = (0, rebalanceUtils_1.getRebalanceValues)(client.solautoPositionState, client.solautoPositionSettings(), client.solautoPositionActiveDca(), (0, generalUtils_1.currentUnixSeconds)(), supplyPrice, debtPrice, targetLiqUtilizationRateBps);
|
366
368
|
client.log("Rebalance values: ", values);
|
367
369
|
const swapDetails = (0, rebalanceUtils_1.getJupSwapRebalanceDetails)(client, values, targetLiqUtilizationRateBps, attemptNum);
|
368
370
|
const { jupQuote, lookupTableAddresses, setupInstructions, tokenLedgerIx, swapIx, } = await (0, jupiterUtils_1.getJupSwapTransaction)(client.signer, swapDetails, attemptNum);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionsManager.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAMzD,OAAO,EACL,aAAa,EAEd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,kBAAkB,EAElB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAa,MAAM,YAAY,CAAC;AAW7D,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAK5B;AAqCD,qBAAa,eAAe;IAMjB,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM;IARtB,oBAAoB,EAAG,MAAM,EAAE,CAAC;IAChC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IACjB,WAAW,EAAE,OAAO,CAAS;gBAG3B,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,EACxC,IAAI,CAAC,EAAE,MAAM,YAAA;IAGhB,UAAU;IAKV,OAAO,CAAC,UAAU,EAAE,MAAM;IAMhC,cAAc,IAAI,MAAM,EAAE;CAY3B;
|
1
|
+
{"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionsManager.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAMzD,OAAO,EACL,aAAa,EAEd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,kBAAkB,EAElB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAa,MAAM,YAAY,CAAC;AAW7D,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAK5B;AAqCD,qBAAa,eAAe;IAMjB,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM;IARtB,oBAAoB,EAAG,MAAM,EAAE,CAAC;IAChC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IACjB,WAAW,EAAE,OAAO,CAAS;gBAG3B,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,EACxC,IAAI,CAAC,EAAE,MAAM,YAAA;IAGhB,UAAU;IAKV,OAAO,CAAC,UAAU,EAAE,MAAM;IAMhC,cAAc,IAAI,MAAM,EAAE;CAY3B;AAyFD,oBAAY,iBAAiB;IAC3B,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,MAAM,WAAW;IACjB,UAAU,eAAe;IACzB,MAAM,WAAW;CAClB;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EAAE,CAAC;AAEJ,qBAAa,mBAAmB;IAK5B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,MAAM,CAAC;IACf,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;IAXpB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,YAAY,CAAe;gBAGzB,SAAS,EAAE,aAAa,GAAG,oBAAoB,EAC/C,cAAc,CAAC,GAAE,CAAC,QAAQ,EAAE,0BAA0B,KAAK,IAAI,aAAA,EAC/D,MAAM,CAAC,EAAE,kBAAkB,YAAA,EAC3B,kBAAkB,GAAE,kBAA2C,EAC/D,UAAU,GAAE,OAAe,EAC3B,aAAa,CAAC,EAAE,aAAa,YAAA,EAC7B,OAAO,GAAE,MAAU,EACnB,UAAU,GAAE,MAAY;YAQpB,uBAAuB;IAwCrC,OAAO,CAAC,YAAY;YA6CN,aAAa;IAoB3B,OAAO,CAAC,4BAA4B;IAgBpC,OAAO,CAAC,mBAAmB;YAMb,SAAS;IAgBV,UAAU,CACrB,YAAY,EAAE,eAAe,EAAE,GAC9B,OAAO,CAAC,0BAA0B,CAAC;IA4FzB,IAAI,CACf,KAAK,EAAE,eAAe,EAAE,GACvB,OAAO,CAAC,0BAA0B,CAAC;YAmCxB,6BAA6B;YAyE7B,qBAAqB;YAuDrB,cAAc;YAqCd,eAAe;CAmD9B"}
|
@@ -97,6 +97,9 @@ class TransactionSet {
|
|
97
97
|
add(...items) {
|
98
98
|
this.items.push(...items.filter((x) => x.tx && x.tx.getInstructions().length > 0));
|
99
99
|
}
|
100
|
+
prepend(...items) {
|
101
|
+
this.items.unshift(...items.filter((x) => x.tx && x.tx.getInstructions().length > 0));
|
102
|
+
}
|
100
103
|
async refetchAll(attemptNum) {
|
101
104
|
await this.txHandler.resetLiveTxUpdates();
|
102
105
|
for (const item of this.items) {
|
@@ -117,7 +120,7 @@ class TransactionSet {
|
|
117
120
|
}
|
118
121
|
name() {
|
119
122
|
let names = this.items
|
120
|
-
.filter((x) => x.tx && x.name
|
123
|
+
.filter((x) => x.tx && Boolean(x.name))
|
121
124
|
.map((x) => x.name.toLowerCase());
|
122
125
|
if (names.length > 1) {
|
123
126
|
names = names.filter((x) => x !== CHORES_TX_NAME);
|
@@ -154,9 +157,9 @@ class TransactionsManager {
|
|
154
157
|
async assembleTransactionSets(items) {
|
155
158
|
let transactionSets = [];
|
156
159
|
this.txHandler.log(`Reassembling ${items.length} items`);
|
157
|
-
for (let i =
|
160
|
+
for (let i = items.length - 1; i >= 0;) {
|
158
161
|
let item = items[i];
|
159
|
-
i
|
162
|
+
i--;
|
160
163
|
if (!item.tx) {
|
161
164
|
continue;
|
162
165
|
}
|
@@ -168,16 +171,16 @@ class TransactionsManager {
|
|
168
171
|
let newSet = new TransactionSet(this.txHandler, this.lookupTables, [
|
169
172
|
item,
|
170
173
|
]);
|
171
|
-
for (let j = i; j
|
174
|
+
for (let j = i; j >= 0; j--) {
|
172
175
|
if (await newSet.fitsWith(items[j])) {
|
173
|
-
newSet.
|
174
|
-
i
|
176
|
+
newSet.prepend(items[j]);
|
177
|
+
i--;
|
175
178
|
}
|
176
179
|
else {
|
177
180
|
break;
|
178
181
|
}
|
179
182
|
}
|
180
|
-
transactionSets.
|
183
|
+
transactionSets.unshift(newSet);
|
181
184
|
}
|
182
185
|
}
|
183
186
|
return transactionSets;
|
@@ -270,7 +273,9 @@ class TransactionsManager {
|
|
270
273
|
const stale = (await (0, utils_1.getSwitchboardFeedData)(client.connection, [mint]))[0]
|
271
274
|
.stale;
|
272
275
|
if (stale) {
|
273
|
-
|
276
|
+
this.txHandler.log("Requires oracle update...");
|
277
|
+
const swbTx = new TransactionItem(async () => (0, utils_1.buildSwbSubmitResponseTx)(client.connection, client.signer, mint), "Update oracle");
|
278
|
+
await swbTx.initialize();
|
274
279
|
items.unshift(swbTx);
|
275
280
|
}
|
276
281
|
}
|
@@ -331,23 +336,33 @@ class TransactionsManager {
|
|
331
336
|
}
|
332
337
|
async processTransactionsAtomically(itemSets) {
|
333
338
|
let num = 0;
|
339
|
+
let sets = itemSets;
|
334
340
|
await (0, generalUtils_1.retryWithExponentialBackoff)(async (attemptNum) => {
|
335
341
|
num = attemptNum;
|
342
|
+
if (attemptNum > 0) {
|
343
|
+
sets = [];
|
344
|
+
for (let i = 0; i < itemSets.length; i++) {
|
345
|
+
const txSet = await this.refreshItemSet(itemSets, i, attemptNum);
|
346
|
+
if (txSet) {
|
347
|
+
sets.push(txSet);
|
348
|
+
}
|
349
|
+
}
|
350
|
+
}
|
336
351
|
let transactions = [];
|
337
|
-
for (const set of
|
352
|
+
for (const set of sets) {
|
338
353
|
transactions.push(await set.getSingleTransaction());
|
339
354
|
}
|
340
|
-
|
355
|
+
sets.forEach((x) => this.updateStatus(x.name(), TransactionStatus.Processing, attemptNum));
|
341
356
|
const txSigs = await (0, jitoUtils_1.sendJitoBundledTransactions)(this.txHandler.umi, this.txHandler.signer, transactions, false, this.priorityFeeSetting);
|
342
357
|
if (txSigs) {
|
343
|
-
|
358
|
+
sets.forEach((x, i) => this.updateStatus(x.name(), TransactionStatus.Successful, attemptNum, txSigs[i]));
|
344
359
|
}
|
345
360
|
else {
|
346
|
-
|
361
|
+
sets.forEach((x) => this.updateStatus(x.name(), TransactionStatus.Failed, attemptNum, undefined, true));
|
347
362
|
throw new Error("Unknown error");
|
348
363
|
}
|
349
364
|
}, this.retries, this.retryDelay, this.errorsToThrow).catch((e) => {
|
350
|
-
|
365
|
+
sets.forEach((x) => this.updateStatus(x.name(), TransactionStatus.Failed, num, undefined, true, e.message));
|
351
366
|
throw e;
|
352
367
|
});
|
353
368
|
}
|
package/dist/utils/jitoUtils.js
CHANGED
@@ -81,7 +81,6 @@ async function pollBundleStatus(bundleId, interval = 1000, timeout = 40000) {
|
|
81
81
|
return [];
|
82
82
|
}
|
83
83
|
async function sendJitoBundle(transactions) {
|
84
|
-
(0, generalUtils_1.consoleLog)("Sending bundle...");
|
85
84
|
const resp = await axios_1.default.post(`${solautoConstants_1.JITO_BLOCK_ENGINE}/api/v1/bundles`, {
|
86
85
|
jsonrpc: "2.0",
|
87
86
|
id: 1,
|
@@ -89,14 +88,15 @@ async function sendJitoBundle(transactions) {
|
|
89
88
|
params: [transactions],
|
90
89
|
});
|
91
90
|
const bundleId = resp.data.result;
|
92
|
-
|
91
|
+
(0, generalUtils_1.consoleLog)("Bundle ID:", bundleId);
|
92
|
+
return bundleId ? await pollBundleStatus(bundleId) : [];
|
93
93
|
}
|
94
94
|
async function sendJitoBundledTransactions(umi, signer, txs, simulateOnly, priorityFeeSetting = types_1.PriorityFeeSetting.Min) {
|
95
95
|
(0, generalUtils_1.consoleLog)("Sending Jito bundle...");
|
96
96
|
(0, generalUtils_1.consoleLog)("Transactions: ", txs.length);
|
97
97
|
(0, generalUtils_1.consoleLog)("Transaction sizes: ", txs.map((x) => x.getTransactionSize(umi)));
|
98
98
|
txs[0] = txs[0].prepend(await getTipInstruction(signer, 150000));
|
99
|
-
const feeEstimates = await Promise.all(txs.map(async (x) => (await (0, solanaUtils_1.getComputeUnitPriceEstimate)(umi, x, priorityFeeSetting)) ??
|
99
|
+
const feeEstimates = await Promise.all(txs.map(async (x) => (await (0, solanaUtils_1.getComputeUnitPriceEstimate)(umi, x, priorityFeeSetting, true)) ??
|
100
100
|
1000000));
|
101
101
|
let builtTxs = await umiToVersionedTransactions(umi, signer, txs, feeEstimates
|
102
102
|
// Array(txs.length).fill(1_400_000)
|
@@ -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;AAOrB,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,SAAS,CAAC;IACtB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAgBD,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,
|
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;AAOrB,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,SAAS,CAAC;IACtB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAgBD,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,CA6F7B"}
|
@@ -45,12 +45,6 @@ async function getJupSwapTransaction(signer, swapDetails, attemptNum) {
|
|
45
45
|
quoteResponse.inAmount = (parseInt(quoteResponse.inAmount) +
|
46
46
|
Math.ceil(parseInt(quoteResponse.inAmount) * (0, numberUtils_1.fromBps)(finalPriceSlippageBps))).toString();
|
47
47
|
}
|
48
|
-
// else {
|
49
|
-
// quoteResponse.inAmount = (
|
50
|
-
// parseInt(quoteResponse.inAmount) +
|
51
|
-
// Math.ceil(parseInt(quoteResponse.inAmount) * fromBps(priceImpactBps))
|
52
|
-
// ).toString();
|
53
|
-
// }
|
54
48
|
(0, generalUtils_1.consoleLog)("Getting jup instructions...");
|
55
49
|
const instructions = await (0, generalUtils_1.retryWithExponentialBackoff)(async () => await jupApi.swapInstructionsPost({
|
56
50
|
swapRequest: {
|
@@ -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;AAYrE,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAqCnB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,qBAwCrD;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,GACzC,MAAM,GAAG,SAAS,CAKpB;
|
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;AAYrE,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAqCnB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,qBAwCrD;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,GACzC,MAAM,GAAG,SAAS,CAKpB;AAGD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,qBAoBzD"}
|
package/dist/utils/priceUtils.js
CHANGED
@@ -68,6 +68,7 @@ function safeGetPrice(mint) {
|
|
68
68
|
}
|
69
69
|
return undefined;
|
70
70
|
}
|
71
|
+
// LEGACY, NOT USED
|
71
72
|
async function getJupTokenPrices(mints) {
|
72
73
|
if (mints.length == 0) {
|
73
74
|
return [];
|
@@ -77,7 +78,6 @@ async function getJupTokenPrices(mints) {
|
|
77
78
|
mints.map((x) => x.toString()).join(",") + "&showExtraInfo=true")).json();
|
78
79
|
return res;
|
79
80
|
}, 6);
|
80
|
-
console.log(data.data[mints[0].toString()].extraInfo.quotedPrice);
|
81
81
|
const prices = Object.values(data.data).map((x) => parseFloat(x.price));
|
82
82
|
return prices;
|
83
83
|
}
|
@@ -14,6 +14,6 @@ export declare function splTokenTransferUmiIx(signer: Signer, fromTa: PublicKey,
|
|
14
14
|
export declare function getAddressLookupInputs(umi: Umi, lookupTableAddresses: string[]): Promise<AddressLookupTableInput[]>;
|
15
15
|
export declare function addTxOptimizations(signer: Signer, transaction: TransactionBuilder, computeUnitPrice?: number, computeUnitLimit?: number): TransactionBuilder;
|
16
16
|
export declare function assembleFinalTransaction(signer: Signer, transaction: TransactionBuilder, computeUnitPrice?: number, computeUnitLimit?: number): TransactionBuilder;
|
17
|
-
export declare function getComputeUnitPriceEstimate(umi: Umi, tx: TransactionBuilder, prioritySetting: PriorityFeeSetting): Promise<number | undefined>;
|
17
|
+
export declare function getComputeUnitPriceEstimate(umi: Umi, tx: TransactionBuilder, prioritySetting: PriorityFeeSetting, simMayFail: boolean): Promise<number | undefined>;
|
18
18
|
export declare function sendSingleOptimizedTransaction(umi: Umi, connection: Connection, tx: TransactionBuilder, txType?: TransactionRunType, prioritySetting?: PriorityFeeSetting, onAwaitingSign?: () => void): Promise<Uint8Array | undefined>;
|
19
19
|
//# sourceMappingURL=solanaUtils.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solanaUtils.d.ts","sourceRoot":"","sources":["../../src/utils/solanaUtils.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,MAAM,EACN,kBAAkB,EAClB,GAAG,EACH,kBAAkB,EAGnB,MAAM,0BAA0B,CAAC;AAOlC,OAAO,EAIL,UAAU,EACV,SAAS,EAKT,sBAAsB,EAEvB,MAAM,iBAAiB,CAAC;AAgBzB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAIlE,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,UAErD;AAED,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,MAAM,UAE3D;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,SAAgC,GAC1C,CAAC,UAAU,EAAE,GAAG,CAAC,CAQnB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,sBAAsB,GACzB,kBAAkB,CAMpB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,GACtB,kBAAkB,CAOpB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,kBAAkB,CAOpB;AAED,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,GACd,kBAAkB,CAUpB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,SAAS,EACtB,QAAQ,EAAE,MAAM,GACf,kBAAkB,CASpB;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,SAAS,EACvB,SAAS,EAAE,SAAS,GACnB,kBAAkB,CAKpB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,GACb,kBAAkB,CAKpB;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,oBAAoB,EAAE,MAAM,EAAE,GAC7B,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAkBpC;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,EAC/B,gBAAgB,CAAC,EAAE,MAAM,EACzB,gBAAgB,CAAC,EAAE,MAAM,sBAa1B;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,EAC/B,gBAAgB,CAAC,EAAE,MAAM,EACzB,gBAAgB,CAAC,EAAE,MAAM,sBA2D1B;AAuBD,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,kBAAkB,EACtB,eAAe,EAAE,kBAAkB,
|
1
|
+
{"version":3,"file":"solanaUtils.d.ts","sourceRoot":"","sources":["../../src/utils/solanaUtils.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,MAAM,EACN,kBAAkB,EAClB,GAAG,EACH,kBAAkB,EAGnB,MAAM,0BAA0B,CAAC;AAOlC,OAAO,EAIL,UAAU,EACV,SAAS,EAKT,sBAAsB,EAEvB,MAAM,iBAAiB,CAAC;AAgBzB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAIlE,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,UAErD;AAED,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,MAAM,UAE3D;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,SAAgC,GAC1C,CAAC,UAAU,EAAE,GAAG,CAAC,CAQnB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,sBAAsB,GACzB,kBAAkB,CAMpB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,GACtB,kBAAkB,CAOpB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,kBAAkB,CAOpB;AAED,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,GACd,kBAAkB,CAUpB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,SAAS,EACtB,QAAQ,EAAE,MAAM,GACf,kBAAkB,CASpB;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,SAAS,EACvB,SAAS,EAAE,SAAS,GACnB,kBAAkB,CAKpB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,GACb,kBAAkB,CAKpB;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,oBAAoB,EAAE,MAAM,EAAE,GAC7B,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAkBpC;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,EAC/B,gBAAgB,CAAC,EAAE,MAAM,EACzB,gBAAgB,CAAC,EAAE,MAAM,sBAa1B;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,EAC/B,gBAAgB,CAAC,EAAE,MAAM,EACzB,gBAAgB,CAAC,EAAE,MAAM,sBA2D1B;AAuBD,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,kBAAkB,EACtB,eAAe,EAAE,kBAAkB,EACnC,UAAU,EAAE,OAAO,GAClB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA8B7B;AAiDD,wBAAsB,8BAA8B,CAClD,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,kBAAkB,EACtB,MAAM,CAAC,EAAE,kBAAkB,EAC3B,eAAe,GAAE,kBAA2C,EAC5D,cAAc,CAAC,EAAE,MAAM,IAAI,GAC1B,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CA2DjC"}
|
@@ -150,14 +150,22 @@ async function simulateTransaction(umi, connection, transaction) {
|
|
150
150
|
}
|
151
151
|
return simulationResult;
|
152
152
|
}
|
153
|
-
async function getComputeUnitPriceEstimate(umi, tx, prioritySetting) {
|
153
|
+
async function getComputeUnitPriceEstimate(umi, tx, prioritySetting, simMayFail) {
|
154
154
|
const web3Transaction = (0, umi_web3js_adapters_1.toWeb3JsTransaction)((await tx.setLatestBlockhash(umi, { commitment: "finalized" })).build(umi));
|
155
|
-
const
|
155
|
+
const transaction = simMayFail
|
156
|
+
? undefined
|
157
|
+
: bs58_1.default.encode(web3Transaction.serialize());
|
158
|
+
const accountKeys = simMayFail
|
159
|
+
? tx
|
160
|
+
.getInstructions()
|
161
|
+
.flatMap((x) => x.keys.flatMap((x) => x.pubkey.toString()))
|
162
|
+
: undefined;
|
156
163
|
let feeEstimate;
|
157
164
|
try {
|
158
165
|
const resp = await umi.rpc.call("getPriorityFeeEstimate", [
|
159
166
|
{
|
160
|
-
transaction
|
167
|
+
transaction,
|
168
|
+
accountKeys,
|
161
169
|
options: {
|
162
170
|
priorityLevel: prioritySetting.toString(),
|
163
171
|
},
|
@@ -208,7 +216,7 @@ async function sendSingleOptimizedTransaction(umi, connection, tx, txType, prior
|
|
208
216
|
(0, generalUtils_1.consoleLog)("Serialized transaction size: ", tx.getTransactionSize(umi));
|
209
217
|
let cuPrice;
|
210
218
|
if (prioritySetting !== types_1.PriorityFeeSetting.None) {
|
211
|
-
cuPrice = await getComputeUnitPriceEstimate(umi, tx, prioritySetting);
|
219
|
+
cuPrice = await getComputeUnitPriceEstimate(umi, tx, prioritySetting, false);
|
212
220
|
if (!cuPrice) {
|
213
221
|
cuPrice = 1000000;
|
214
222
|
}
|
@@ -7,7 +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 eligibleForRebalance(positionState: PositionState, positionSettings: SolautoSettingsParameters | undefined, positionDca: DCASettings | undefined, currentUnixTime: number, bpsDistanceThreshold?: number): RebalanceAction | undefined;
|
10
|
+
export declare function eligibleForRebalance(positionState: PositionState, positionSettings: SolautoSettingsParameters | undefined, positionDca: DCASettings | undefined, currentUnixTime: number, supplyMintPrice: number, debtMintPrice: number, bpsDistanceThreshold?: number): RebalanceAction | undefined;
|
11
11
|
export declare function eligibleForRefresh(positionState: PositionState, positionSettings: SolautoSettingsParameters, currentUnixTime: number): boolean;
|
12
12
|
export declare function getSolautoManagedPositions(umi: Umi, authority?: PublicKey, positionTypeFilter?: PositionType): Promise<SolautoPositionDetails[]>;
|
13
13
|
export declare function getAllReferralStates(umi: Umi): Promise<PublicKey[]>;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/generalUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,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;AAkBzB,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;
|
1
|
+
{"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/generalUtils.ts"],"names":[],"mappings":"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"}
|
@@ -25,6 +25,7 @@ const umi_web3js_adapters_1 = require("@metaplex-foundation/umi-web3js-adapters"
|
|
25
25
|
const constants_1 = require("../../constants");
|
26
26
|
const marginfiUtils_1 = require("../marginfiUtils");
|
27
27
|
const priceUtils_1 = require("../priceUtils");
|
28
|
+
const rebalanceUtils_1 = require("./rebalanceUtils");
|
28
29
|
function createDynamicSolautoProgram(programId) {
|
29
30
|
return {
|
30
31
|
name: "solauto",
|
@@ -72,7 +73,7 @@ function getAdjustedSettingsFromAutomation(settings, currentUnixTime) {
|
|
72
73
|
boostToBps,
|
73
74
|
};
|
74
75
|
}
|
75
|
-
function eligibleForRebalance(positionState, positionSettings, positionDca, currentUnixTime, bpsDistanceThreshold = 0) {
|
76
|
+
function eligibleForRebalance(positionState, positionSettings, positionDca, currentUnixTime, supplyMintPrice, debtMintPrice, bpsDistanceThreshold = 0) {
|
76
77
|
if (!positionSettings) {
|
77
78
|
return undefined;
|
78
79
|
}
|
@@ -92,7 +93,14 @@ function eligibleForRebalance(positionState, positionSettings, positionDca, curr
|
|
92
93
|
const boostFrom = boostToBps - positionSettings.boostGap;
|
93
94
|
if (Math.max(0, positionState.liqUtilizationRateBps - boostFrom) <=
|
94
95
|
bpsDistanceThreshold) {
|
95
|
-
|
96
|
+
const values = (0, rebalanceUtils_1.getRebalanceValues)(positionState, positionSettings, positionDca, (0, generalUtils_1.currentUnixSeconds)(), supplyMintPrice, debtMintPrice);
|
97
|
+
const sufficientLiquidity = (0, numberUtils_1.fromBaseUnit)(positionState.debt.amountCanBeUsed.baseAmountUsdValue, constants_1.USD_DECIMALS) *
|
98
|
+
0.95 >
|
99
|
+
values.debtAdjustmentUsd;
|
100
|
+
if (!sufficientLiquidity) {
|
101
|
+
console.log("Insufficient debt liquidity to further boost");
|
102
|
+
}
|
103
|
+
return sufficientLiquidity ? "boost" : undefined;
|
96
104
|
}
|
97
105
|
else if (Math.max(0, repayFrom - positionState.liqUtilizationRateBps) <=
|
98
106
|
bpsDistanceThreshold) {
|
@@ -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,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;AAmI9C,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,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;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,
|
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;AAmI9C,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,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;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,CAwDjB;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,CA8D9B;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,cAAc,CA2ChB"}
|
@@ -84,7 +84,9 @@ function getRebalanceValues(state, settings, dca, currentUnixTime, supplyPrice,
|
|
84
84
|
const { targetRateBps, amountToDcaIn } = getTargetRateAndDcaAmount(state, settings, dca, currentUnixTime, targetLiqUtilizationRateBps);
|
85
85
|
const amountUsdToDcaIn = (0, numberUtils_1.fromBaseUnit)(BigInt(Math.round(amountToDcaIn ?? 0)), state.debt.decimals) *
|
86
86
|
(dca?.tokenType === generated_1.TokenType.Debt ? debtPrice : supplyPrice);
|
87
|
-
const rebalanceDirection = amountUsdToDcaIn > 0 || state.liqUtilizationRateBps <= targetRateBps
|
87
|
+
const rebalanceDirection = amountUsdToDcaIn > 0 || state.liqUtilizationRateBps <= targetRateBps
|
88
|
+
? generated_1.RebalanceDirection.Boost
|
89
|
+
: generated_1.RebalanceDirection.Repay;
|
88
90
|
const adjustmentFeeBps = (0, numberUtils_1.getSolautoFeesBps)(false, targetLiqUtilizationRateBps, (0, numberUtils_1.fromBaseUnit)(state.netWorth.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS), rebalanceDirection).total;
|
89
91
|
const supplyUsd = (0, numberUtils_1.fromBaseUnit)(state.supply.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS) +
|
90
92
|
amountUsdToDcaIn;
|
@@ -97,24 +99,32 @@ function getRebalanceValues(state, settings, dca, currentUnixTime, supplyPrice,
|
|
97
99
|
amountToDcaIn: amountToDcaIn ?? 0,
|
98
100
|
amountUsdToDcaIn,
|
99
101
|
dcaTokenType: dca?.tokenType,
|
100
|
-
rebalanceAction: (amountToDcaIn ?? 0) > 0
|
102
|
+
rebalanceAction: (amountToDcaIn ?? 0) > 0
|
103
|
+
? "dca"
|
104
|
+
: rebalanceDirection === generated_1.RebalanceDirection.Boost
|
105
|
+
? "boost"
|
106
|
+
: "repay",
|
101
107
|
rebalanceDirection,
|
102
|
-
feesUsd: debtAdjustmentUsd * (0, numberUtils_1.fromBps)(adjustmentFeeBps)
|
108
|
+
feesUsd: debtAdjustmentUsd * (0, numberUtils_1.fromBps)(adjustmentFeeBps),
|
103
109
|
};
|
104
110
|
}
|
105
111
|
function getFlashLoanDetails(client, values, jupQuote) {
|
106
112
|
let supplyUsd = (0, numberUtils_1.fromBaseUnit)(client.solautoPositionState.supply.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS) +
|
107
113
|
(values.dcaTokenType === generated_1.TokenType.Supply ? values.amountUsdToDcaIn : 0);
|
108
114
|
let debtUsd = (0, numberUtils_1.fromBaseUnit)(client.solautoPositionState.debt.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS);
|
109
|
-
const
|
115
|
+
const debtAdjustmentUsdAbs = Math.abs(values.debtAdjustmentUsd);
|
110
116
|
supplyUsd =
|
111
|
-
values.
|
117
|
+
values.rebalanceDirection === generated_1.RebalanceDirection.Repay
|
118
|
+
? supplyUsd - debtAdjustmentUsdAbs
|
119
|
+
: supplyUsd;
|
112
120
|
debtUsd =
|
113
|
-
values.
|
121
|
+
values.rebalanceDirection === generated_1.RebalanceDirection.Boost
|
122
|
+
? debtUsd + debtAdjustmentUsdAbs
|
123
|
+
: debtUsd;
|
114
124
|
const tempLiqUtilizationRateBps = (0, numberUtils_1.getLiqUtilzationRateBps)(supplyUsd, debtUsd, client.solautoPositionState.liqThresholdBps);
|
115
125
|
const requiresFlashLoan = supplyUsd <= 0 ||
|
116
126
|
tempLiqUtilizationRateBps >
|
117
|
-
(0, numberUtils_1.getMaxLiqUtilizationRateBps)(client.solautoPositionState.maxLtvBps, client.solautoPositionState.liqThresholdBps, 0.
|
127
|
+
(0, numberUtils_1.getMaxLiqUtilizationRateBps)(client.solautoPositionState.maxLtvBps, client.solautoPositionState.liqThresholdBps, 0.015);
|
118
128
|
let flashLoanToken = undefined;
|
119
129
|
let flashLoanTokenPrice = 0;
|
120
130
|
if (values.rebalanceDirection === generated_1.RebalanceDirection.Boost) {
|
@@ -132,7 +142,7 @@ function getFlashLoanDetails(client, values, jupQuote) {
|
|
132
142
|
? {
|
133
143
|
baseUnitAmount: exactAmountBaseUnit
|
134
144
|
? exactAmountBaseUnit
|
135
|
-
: (0, numberUtils_1.toBaseUnit)(
|
145
|
+
: (0, numberUtils_1.toBaseUnit)(debtAdjustmentUsdAbs / flashLoanTokenPrice, flashLoanToken.decimals),
|
136
146
|
mint: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(flashLoanToken.mint),
|
137
147
|
}
|
138
148
|
: undefined;
|
package/package.json
CHANGED
@@ -517,7 +517,7 @@ export abstract class SolautoClient extends ReferralStateManager {
|
|
517
517
|
type: "supply",
|
518
518
|
value:
|
519
519
|
(this.solautoPositionState?.supply.amountUsed.baseUnit ??
|
520
|
-
BigInt(0))
|
520
|
+
BigInt(0)) * BigInt(-1),
|
521
521
|
});
|
522
522
|
}
|
523
523
|
} else if (args.__kind === "Borrow") {
|
@@ -535,8 +535,8 @@ export abstract class SolautoClient extends ReferralStateManager {
|
|
535
535
|
this.livePositionUpdates.new({
|
536
536
|
type: "debt",
|
537
537
|
value:
|
538
|
-
(this.solautoPositionState?.debt.amountUsed.baseUnit ?? BigInt(0))
|
539
|
-
|
538
|
+
(this.solautoPositionState?.debt.amountUsed.baseUnit ?? BigInt(0)) *
|
539
|
+
BigInt(-1),
|
540
540
|
});
|
541
541
|
}
|
542
542
|
}
|
@@ -646,6 +646,9 @@ export async function buildSolautoRebalanceTransaction(
|
|
646
646
|
attemptNum?: number
|
647
647
|
): Promise<TransactionItemInputs | undefined> {
|
648
648
|
client.solautoPositionState = await client.getFreshPositionState();
|
649
|
+
const supplyPrice = safeGetPrice(client.supplyMint) ?? 0;
|
650
|
+
const debtPrice = safeGetPrice(client.debtMint) ?? 0;
|
651
|
+
|
649
652
|
if (
|
650
653
|
(client.solautoPositionState?.supply.amountUsed.baseUnit === BigInt(0) &&
|
651
654
|
client.livePositionUpdates.supplyAdjustment === BigInt(0)) ||
|
@@ -654,7 +657,9 @@ export async function buildSolautoRebalanceTransaction(
|
|
654
657
|
client.solautoPositionState!,
|
655
658
|
client.solautoPositionSettings(),
|
656
659
|
client.solautoPositionActiveDca(),
|
657
|
-
currentUnixSeconds()
|
660
|
+
currentUnixSeconds(),
|
661
|
+
supplyPrice,
|
662
|
+
debtPrice
|
658
663
|
))
|
659
664
|
) {
|
660
665
|
client.log("Not eligible for a rebalance");
|
@@ -666,8 +671,8 @@ export async function buildSolautoRebalanceTransaction(
|
|
666
671
|
client.solautoPositionSettings(),
|
667
672
|
client.solautoPositionActiveDca(),
|
668
673
|
currentUnixSeconds(),
|
669
|
-
|
670
|
-
|
674
|
+
supplyPrice,
|
675
|
+
debtPrice,
|
671
676
|
targetLiqUtilizationRateBps
|
672
677
|
);
|
673
678
|
client.log("Rebalance values: ", values);
|
@@ -153,6 +153,12 @@ class TransactionSet {
|
|
153
153
|
);
|
154
154
|
}
|
155
155
|
|
156
|
+
prepend(...items: TransactionItem[]) {
|
157
|
+
this.items.unshift(
|
158
|
+
...items.filter((x) => x.tx && x.tx.getInstructions().length > 0)
|
159
|
+
);
|
160
|
+
}
|
161
|
+
|
156
162
|
async refetchAll(attemptNum: number) {
|
157
163
|
await this.txHandler.resetLiveTxUpdates();
|
158
164
|
for (const item of this.items) {
|
@@ -179,7 +185,7 @@ class TransactionSet {
|
|
179
185
|
|
180
186
|
name(): string {
|
181
187
|
let names = this.items
|
182
|
-
.filter((x) => x.tx && x.name
|
188
|
+
.filter((x) => x.tx && Boolean(x.name))
|
183
189
|
.map((x) => x.name!.toLowerCase());
|
184
190
|
if (names.length > 1) {
|
185
191
|
names = names.filter((x) => x !== CHORES_TX_NAME);
|
@@ -237,9 +243,9 @@ export class TransactionsManager {
|
|
237
243
|
let transactionSets: TransactionSet[] = [];
|
238
244
|
this.txHandler.log(`Reassembling ${items.length} items`);
|
239
245
|
|
240
|
-
for (let i =
|
246
|
+
for (let i = items.length - 1; i >= 0; ) {
|
241
247
|
let item = items[i];
|
242
|
-
i
|
248
|
+
i--;
|
243
249
|
|
244
250
|
if (!item.tx) {
|
245
251
|
continue;
|
@@ -256,15 +262,15 @@ export class TransactionsManager {
|
|
256
262
|
let newSet = new TransactionSet(this.txHandler, this.lookupTables, [
|
257
263
|
item,
|
258
264
|
]);
|
259
|
-
for (let j = i; j
|
265
|
+
for (let j = i; j >= 0; j--) {
|
260
266
|
if (await newSet.fitsWith(items[j])) {
|
261
|
-
newSet.
|
262
|
-
i
|
267
|
+
newSet.prepend(items[j]);
|
268
|
+
i--;
|
263
269
|
} else {
|
264
270
|
break;
|
265
271
|
}
|
266
272
|
}
|
267
|
-
transactionSets.
|
273
|
+
transactionSets.unshift(newSet);
|
268
274
|
}
|
269
275
|
}
|
270
276
|
|
@@ -409,11 +415,13 @@ export class TransactionsManager {
|
|
409
415
|
.stale;
|
410
416
|
|
411
417
|
if (stale) {
|
418
|
+
this.txHandler.log("Requires oracle update...");
|
412
419
|
const swbTx = new TransactionItem(
|
413
420
|
async () =>
|
414
421
|
buildSwbSubmitResponseTx(client.connection, client.signer, mint),
|
415
|
-
|
422
|
+
"Update oracle"
|
416
423
|
);
|
424
|
+
await swbTx.initialize();
|
417
425
|
items.unshift(swbTx);
|
418
426
|
}
|
419
427
|
}
|
@@ -505,17 +513,28 @@ export class TransactionsManager {
|
|
505
513
|
|
506
514
|
private async processTransactionsAtomically(itemSets: TransactionSet[]) {
|
507
515
|
let num = 0;
|
516
|
+
let sets = itemSets;
|
508
517
|
|
509
518
|
await retryWithExponentialBackoff(
|
510
519
|
async (attemptNum) => {
|
511
520
|
num = attemptNum;
|
512
521
|
|
522
|
+
if (attemptNum > 0) {
|
523
|
+
sets = [];
|
524
|
+
for (let i = 0; i < itemSets.length; i++) {
|
525
|
+
const txSet = await this.refreshItemSet(itemSets, i, attemptNum);
|
526
|
+
if (txSet) {
|
527
|
+
sets.push(txSet);
|
528
|
+
}
|
529
|
+
}
|
530
|
+
}
|
531
|
+
|
513
532
|
let transactions = [];
|
514
|
-
for (const set of
|
533
|
+
for (const set of sets) {
|
515
534
|
transactions.push(await set.getSingleTransaction());
|
516
535
|
}
|
517
536
|
|
518
|
-
|
537
|
+
sets.forEach((x) =>
|
519
538
|
this.updateStatus(x.name(), TransactionStatus.Processing, attemptNum)
|
520
539
|
);
|
521
540
|
const txSigs = await sendJitoBundledTransactions(
|
@@ -526,7 +545,7 @@ export class TransactionsManager {
|
|
526
545
|
this.priorityFeeSetting
|
527
546
|
);
|
528
547
|
if (txSigs) {
|
529
|
-
|
548
|
+
sets.forEach((x, i) =>
|
530
549
|
this.updateStatus(
|
531
550
|
x.name(),
|
532
551
|
TransactionStatus.Successful,
|
@@ -535,7 +554,7 @@ export class TransactionsManager {
|
|
535
554
|
)
|
536
555
|
);
|
537
556
|
} else {
|
538
|
-
|
557
|
+
sets.forEach((x) =>
|
539
558
|
this.updateStatus(
|
540
559
|
x.name(),
|
541
560
|
TransactionStatus.Failed,
|
@@ -551,7 +570,7 @@ export class TransactionsManager {
|
|
551
570
|
this.retryDelay,
|
552
571
|
this.errorsToThrow
|
553
572
|
).catch((e: Error) => {
|
554
|
-
|
573
|
+
sets.forEach((x) =>
|
555
574
|
this.updateStatus(
|
556
575
|
x.name(),
|
557
576
|
TransactionStatus.Failed,
|
package/src/utils/jitoUtils.ts
CHANGED
@@ -122,7 +122,6 @@ async function pollBundleStatus(
|
|
122
122
|
}
|
123
123
|
|
124
124
|
async function sendJitoBundle(transactions: string[]): Promise<string[]> {
|
125
|
-
consoleLog("Sending bundle...");
|
126
125
|
const resp = await axios.post<{ result: string }>(
|
127
126
|
`${JITO_BLOCK_ENGINE}/api/v1/bundles`,
|
128
127
|
{
|
@@ -134,7 +133,8 @@ async function sendJitoBundle(transactions: string[]): Promise<string[]> {
|
|
134
133
|
);
|
135
134
|
|
136
135
|
const bundleId = resp.data.result;
|
137
|
-
|
136
|
+
consoleLog("Bundle ID:", bundleId);
|
137
|
+
return bundleId ? await pollBundleStatus(bundleId) : [];
|
138
138
|
}
|
139
139
|
|
140
140
|
export async function sendJitoBundledTransactions(
|
@@ -155,7 +155,7 @@ export async function sendJitoBundledTransactions(
|
|
155
155
|
const feeEstimates = await Promise.all(
|
156
156
|
txs.map(
|
157
157
|
async (x) =>
|
158
|
-
(await getComputeUnitPriceEstimate(umi, x, priorityFeeSetting)) ??
|
158
|
+
(await getComputeUnitPriceEstimate(umi, x, priorityFeeSetting, true)) ??
|
159
159
|
1000000
|
160
160
|
)
|
161
161
|
);
|
@@ -94,12 +94,6 @@ export async function getJupSwapTransaction(
|
|
94
94
|
)
|
95
95
|
).toString();
|
96
96
|
}
|
97
|
-
// else {
|
98
|
-
// quoteResponse.inAmount = (
|
99
|
-
// parseInt(quoteResponse.inAmount) +
|
100
|
-
// Math.ceil(parseInt(quoteResponse.inAmount) * fromBps(priceImpactBps))
|
101
|
-
// ).toString();
|
102
|
-
// }
|
103
97
|
|
104
98
|
consoleLog("Getting jup instructions...");
|
105
99
|
const instructions = await retryWithExponentialBackoff(
|
package/src/utils/priceUtils.ts
CHANGED
@@ -103,6 +103,7 @@ export function safeGetPrice(
|
|
103
103
|
return undefined;
|
104
104
|
}
|
105
105
|
|
106
|
+
// LEGACY, NOT USED
|
106
107
|
export async function getJupTokenPrices(mints: PublicKey[]) {
|
107
108
|
if (mints.length == 0) {
|
108
109
|
return [];
|
@@ -118,8 +119,6 @@ export async function getJupTokenPrices(mints: PublicKey[]) {
|
|
118
119
|
return res;
|
119
120
|
}, 6);
|
120
121
|
|
121
|
-
console.log(data.data[mints[0].toString()].extraInfo.quotedPrice);
|
122
|
-
|
123
122
|
const prices = Object.values(data.data as { [key: string]: any }).map(
|
124
123
|
(x) => parseFloat(x.price as string) as number
|
125
124
|
);
|
package/src/utils/solanaUtils.ts
CHANGED
@@ -288,18 +288,27 @@ async function simulateTransaction(
|
|
288
288
|
export async function getComputeUnitPriceEstimate(
|
289
289
|
umi: Umi,
|
290
290
|
tx: TransactionBuilder,
|
291
|
-
prioritySetting: PriorityFeeSetting
|
291
|
+
prioritySetting: PriorityFeeSetting,
|
292
|
+
simMayFail: boolean
|
292
293
|
): Promise<number | undefined> {
|
293
294
|
const web3Transaction = toWeb3JsTransaction(
|
294
295
|
(await tx.setLatestBlockhash(umi, { commitment: "finalized" })).build(umi)
|
295
296
|
);
|
296
|
-
const
|
297
|
+
const transaction = simMayFail
|
298
|
+
? undefined
|
299
|
+
: bs58.encode(web3Transaction.serialize());
|
300
|
+
const accountKeys = simMayFail
|
301
|
+
? tx
|
302
|
+
.getInstructions()
|
303
|
+
.flatMap((x) => x.keys.flatMap((x) => x.pubkey.toString()))
|
304
|
+
: undefined;
|
297
305
|
|
298
306
|
let feeEstimate: number | undefined;
|
299
307
|
try {
|
300
308
|
const resp = await umi.rpc.call("getPriorityFeeEstimate", [
|
301
309
|
{
|
302
|
-
transaction
|
310
|
+
transaction,
|
311
|
+
accountKeys,
|
303
312
|
options: {
|
304
313
|
priorityLevel: prioritySetting.toString(),
|
305
314
|
},
|
@@ -374,7 +383,7 @@ export async function sendSingleOptimizedTransaction(
|
|
374
383
|
|
375
384
|
let cuPrice: number | undefined;
|
376
385
|
if (prioritySetting !== PriorityFeeSetting.None) {
|
377
|
-
cuPrice = await getComputeUnitPriceEstimate(umi, tx, prioritySetting);
|
386
|
+
cuPrice = await getComputeUnitPriceEstimate(umi, tx, prioritySetting, false);
|
378
387
|
if (!cuPrice) {
|
379
388
|
cuPrice = 1000000;
|
380
389
|
}
|
@@ -41,6 +41,7 @@ import {
|
|
41
41
|
} from "../marginfiUtils";
|
42
42
|
import { RebalanceAction, SolautoPositionDetails } from "../../types/solauto";
|
43
43
|
import { fetchTokenPrices } from "../priceUtils";
|
44
|
+
import { getRebalanceValues } from "./rebalanceUtils";
|
44
45
|
|
45
46
|
export function createDynamicSolautoProgram(programId: PublicKey): Program {
|
46
47
|
return {
|
@@ -132,6 +133,8 @@ export function eligibleForRebalance(
|
|
132
133
|
positionSettings: SolautoSettingsParameters | undefined,
|
133
134
|
positionDca: DCASettings | undefined,
|
134
135
|
currentUnixTime: number,
|
136
|
+
supplyMintPrice: number,
|
137
|
+
debtMintPrice: number,
|
135
138
|
bpsDistanceThreshold = 0
|
136
139
|
): RebalanceAction | undefined {
|
137
140
|
if (!positionSettings) {
|
@@ -167,7 +170,26 @@ export function eligibleForRebalance(
|
|
167
170
|
Math.max(0, positionState.liqUtilizationRateBps - boostFrom) <=
|
168
171
|
bpsDistanceThreshold
|
169
172
|
) {
|
170
|
-
|
173
|
+
const values = getRebalanceValues(
|
174
|
+
positionState!,
|
175
|
+
positionSettings,
|
176
|
+
positionDca,
|
177
|
+
currentUnixSeconds(),
|
178
|
+
supplyMintPrice,
|
179
|
+
debtMintPrice
|
180
|
+
);
|
181
|
+
const sufficientLiquidity =
|
182
|
+
fromBaseUnit(
|
183
|
+
positionState.debt.amountCanBeUsed.baseAmountUsdValue,
|
184
|
+
USD_DECIMALS
|
185
|
+
) *
|
186
|
+
0.95 >
|
187
|
+
values.debtAdjustmentUsd;
|
188
|
+
if (!sufficientLiquidity) {
|
189
|
+
console.log("Insufficient debt liquidity to further boost");
|
190
|
+
}
|
191
|
+
|
192
|
+
return sufficientLiquidity ? "boost" : undefined;
|
171
193
|
} else if (
|
172
194
|
Math.max(0, repayFrom - positionState.liqUtilizationRateBps) <=
|
173
195
|
bpsDistanceThreshold
|
@@ -191,7 +191,10 @@ export function getRebalanceValues(
|
|
191
191
|
fromBaseUnit(BigInt(Math.round(amountToDcaIn ?? 0)), state.debt.decimals) *
|
192
192
|
(dca?.tokenType === TokenType.Debt ? debtPrice : supplyPrice);
|
193
193
|
|
194
|
-
const rebalanceDirection =
|
194
|
+
const rebalanceDirection =
|
195
|
+
amountUsdToDcaIn > 0 || state.liqUtilizationRateBps <= targetRateBps
|
196
|
+
? RebalanceDirection.Boost
|
197
|
+
: RebalanceDirection.Repay;
|
195
198
|
const adjustmentFeeBps = getSolautoFeesBps(
|
196
199
|
false,
|
197
200
|
targetLiqUtilizationRateBps,
|
@@ -223,9 +226,13 @@ export function getRebalanceValues(
|
|
223
226
|
amountUsdToDcaIn,
|
224
227
|
dcaTokenType: dca?.tokenType,
|
225
228
|
rebalanceAction:
|
226
|
-
(amountToDcaIn ?? 0) > 0
|
229
|
+
(amountToDcaIn ?? 0) > 0
|
230
|
+
? "dca"
|
231
|
+
: rebalanceDirection === RebalanceDirection.Boost
|
232
|
+
? "boost"
|
233
|
+
: "repay",
|
227
234
|
rebalanceDirection,
|
228
|
-
feesUsd: debtAdjustmentUsd * fromBps(adjustmentFeeBps)
|
235
|
+
feesUsd: debtAdjustmentUsd * fromBps(adjustmentFeeBps),
|
229
236
|
};
|
230
237
|
}
|
231
238
|
|
@@ -250,11 +257,15 @@ export function getFlashLoanDetails(
|
|
250
257
|
USD_DECIMALS
|
251
258
|
);
|
252
259
|
|
253
|
-
const
|
260
|
+
const debtAdjustmentUsdAbs = Math.abs(values.debtAdjustmentUsd);
|
254
261
|
supplyUsd =
|
255
|
-
values.
|
262
|
+
values.rebalanceDirection === RebalanceDirection.Repay
|
263
|
+
? supplyUsd - debtAdjustmentUsdAbs
|
264
|
+
: supplyUsd;
|
256
265
|
debtUsd =
|
257
|
-
values.
|
266
|
+
values.rebalanceDirection === RebalanceDirection.Boost
|
267
|
+
? debtUsd + debtAdjustmentUsdAbs
|
268
|
+
: debtUsd;
|
258
269
|
|
259
270
|
const tempLiqUtilizationRateBps = getLiqUtilzationRateBps(
|
260
271
|
supplyUsd,
|
@@ -267,7 +278,7 @@ export function getFlashLoanDetails(
|
|
267
278
|
getMaxLiqUtilizationRateBps(
|
268
279
|
client.solautoPositionState!.maxLtvBps,
|
269
280
|
client.solautoPositionState!.liqThresholdBps,
|
270
|
-
0.
|
281
|
+
0.015
|
271
282
|
);
|
272
283
|
|
273
284
|
let flashLoanToken: PositionTokenUsage | undefined = undefined;
|
@@ -290,7 +301,7 @@ export function getFlashLoanDetails(
|
|
290
301
|
baseUnitAmount: exactAmountBaseUnit
|
291
302
|
? exactAmountBaseUnit
|
292
303
|
: toBaseUnit(
|
293
|
-
|
304
|
+
debtAdjustmentUsdAbs / flashLoanTokenPrice,
|
294
305
|
flashLoanToken.decimals
|
295
306
|
),
|
296
307
|
mint: toWeb3JsPublicKey(flashLoanToken.mint),
|
@@ -304,12 +315,14 @@ export function getJupSwapRebalanceDetails(
|
|
304
315
|
targetLiqUtilizationRateBps?: number,
|
305
316
|
attemptNum?: number
|
306
317
|
): JupSwapDetails {
|
307
|
-
const input =
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
318
|
+
const input =
|
319
|
+
values.rebalanceDirection === RebalanceDirection.Boost
|
320
|
+
? client.solautoPositionState!.debt
|
321
|
+
: client.solautoPositionState!.supply;
|
322
|
+
const output =
|
323
|
+
values.rebalanceDirection === RebalanceDirection.Boost
|
324
|
+
? client.solautoPositionState!.supply
|
325
|
+
: client.solautoPositionState!.debt;
|
313
326
|
|
314
327
|
const usdToSwap =
|
315
328
|
Math.abs(values.debtAdjustmentUsd) +
|
@@ -16,7 +16,6 @@ import {
|
|
16
16
|
toBaseUnit,
|
17
17
|
} from "../../src/utils/numberUtils";
|
18
18
|
import { NATIVE_MINT } from "@solana/spl-token";
|
19
|
-
import { consoleLog } from "../../src/utils/generalUtils";
|
20
19
|
import {
|
21
20
|
TransactionItem,
|
22
21
|
TransactionsManager,
|
@@ -34,9 +33,9 @@ describe("Solauto Marginfi tests", async () => {
|
|
34
33
|
const signer = setupTest();
|
35
34
|
// const signer = setupTest("solauto-manager");
|
36
35
|
|
37
|
-
const payForTransactions =
|
36
|
+
const payForTransactions = false;
|
38
37
|
const testProgram = true;
|
39
|
-
const positionId =
|
38
|
+
const positionId = 1;
|
40
39
|
|
41
40
|
it("open - deposit - borrow - rebalance to 0 - withdraw - close", async () => {
|
42
41
|
const client = new SolautoMarginfiClient(
|
@@ -52,7 +51,7 @@ describe("Solauto Marginfi tests", async () => {
|
|
52
51
|
await client.initialize({
|
53
52
|
signer,
|
54
53
|
positionId,
|
55
|
-
authority: new PublicKey("rC5dMP5dmSsfQ66rynzfFzuc122Eex9h1RJHVDkeH6D"),
|
54
|
+
authority: new PublicKey("rC5dMP5dmSsfQ66rynzfFzuc122Eex9h1RJHVDkeH6D"),
|
56
55
|
// new: true,
|
57
56
|
// marginfiAccount: new PublicKey(
|
58
57
|
// "4nNvUXF5YqHFcH2nGweSiuvy1ct7V5FXfoCLKFYUN36z"
|
@@ -123,7 +122,7 @@ describe("Solauto Marginfi tests", async () => {
|
|
123
122
|
transactionItems.push(
|
124
123
|
new TransactionItem(
|
125
124
|
async (attemptNum) =>
|
126
|
-
await buildSolautoRebalanceTransaction(client,
|
125
|
+
await buildSolautoRebalanceTransaction(client, undefined, attemptNum),
|
127
126
|
"rebalance"
|
128
127
|
)
|
129
128
|
);
|