@haven-fi/solauto-sdk 1.0.312 → 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 +1 -1
- 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/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/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 +1 -2
- package/src/transactions/transactionsManager.ts +32 -13
- package/src/utils/jitoUtils.ts +3 -3
- package/src/utils/solanaUtils.ts +13 -4
- 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"}
|
@@ -360,7 +360,7 @@ async function buildSolautoRebalanceTransaction(client, targetLiqUtilizationRate
|
|
360
360
|
if ((client.solautoPositionState?.supply.amountUsed.baseUnit === BigInt(0) &&
|
361
361
|
client.livePositionUpdates.supplyAdjustment === BigInt(0)) ||
|
362
362
|
(targetLiqUtilizationRateBps === undefined &&
|
363
|
-
!(0, generalUtils_2.eligibleForRebalance)(client.solautoPositionState, client.solautoPositionSettings(), client.solautoPositionActiveDca(), (0, generalUtils_1.currentUnixSeconds)(), supplyPrice, debtPrice
|
363
|
+
!(0, generalUtils_2.eligibleForRebalance)(client.solautoPositionState, client.solautoPositionSettings(), client.solautoPositionActiveDca(), (0, generalUtils_1.currentUnixSeconds)(), supplyPrice, debtPrice))) {
|
364
364
|
client.log("Not eligible for a rebalance");
|
365
365
|
return undefined;
|
366
366
|
}
|
@@ -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)
|
@@ -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
|
}
|
@@ -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
|
}
|
@@ -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
|
);
|
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
|
}
|
@@ -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
|
);
|