@haven-fi/solauto-sdk 1.0.312 → 1.0.314
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.d.ts.map +1 -1
- package/dist/utils/jitoUtils.js +21 -23
- package/dist/utils/solanaUtils.d.ts.map +1 -1
- package/dist/utils/solanaUtils.js +17 -3
- 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 +23 -23
- package/src/utils/solanaUtils.ts +21 -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
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"jitoUtils.d.ts","sourceRoot":"","sources":["../../src/utils/jitoUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,iBAAiB,CAAC;AAGlE,OAAO,EACL,MAAM,EACN,kBAAkB,EAClB,GAAG,EAEJ,MAAM,0BAA0B,CAAC;
|
1
|
+
{"version":3,"file":"jitoUtils.d.ts","sourceRoot":"","sources":["../../src/utils/jitoUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,iBAAiB,CAAC;AAGlE,OAAO,EACL,MAAM,EACN,kBAAkB,EAClB,GAAG,EAEJ,MAAM,0BAA0B,CAAC;AAQlC,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAK9C,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,SAAS,CAAC,CAa9D;AA0GD,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,kBAAkB,EAAE,EACzB,YAAY,CAAC,EAAE,OAAO,EACtB,kBAAkB,GAAE,kBAA2C,GAC9D,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,CAyC/B"}
|
package/dist/utils/jitoUtils.js
CHANGED
@@ -30,23 +30,24 @@ async function getRandomTipAccount() {
|
|
30
30
|
async function getTipInstruction(signer, tipLamports) {
|
31
31
|
return (0, solanaUtils_1.systemTransferUmiIx)(signer, await getRandomTipAccount(), BigInt(tipLamports));
|
32
32
|
}
|
33
|
-
//
|
34
|
-
//
|
35
|
-
//
|
36
|
-
//
|
37
|
-
//
|
38
|
-
//
|
39
|
-
//
|
40
|
-
//
|
41
|
-
//
|
42
|
-
//
|
43
|
-
//
|
44
|
-
//
|
45
|
-
//
|
46
|
-
//
|
33
|
+
// TODO: fix
|
34
|
+
// async function simulateJitoBundle(umi: Umi, txs: VersionedTransaction[]) {
|
35
|
+
// const simulationResult = await axios.post(
|
36
|
+
// `${JITO_BLOCK_ENGINE}/api/v1/bundles`,
|
37
|
+
// {
|
38
|
+
// method: "simulateBundle",
|
39
|
+
// id: 1,
|
40
|
+
// jsonrpc: "2.0",
|
41
|
+
// params: [
|
42
|
+
// {
|
43
|
+
// encodedTransactions: txs.map((x) => bs58.encode(x.serialize())),
|
44
|
+
// preExecutionAccountsConfigs: txs.map((_) => ""),
|
45
|
+
// postExecutionAccountsConfigs: txs.map((_) => ""),
|
46
|
+
// skipSigVerify: true,
|
47
|
+
// },
|
48
|
+
// ],
|
47
49
|
// }
|
48
|
-
//
|
49
|
-
// return simulationResult.value.transactionResults;
|
50
|
+
// );
|
50
51
|
// }
|
51
52
|
async function umiToVersionedTransactions(umi, signer, txs, feeEstimates, computeUnitLimits) {
|
52
53
|
return await Promise.all(txs.map(async (tx, i) => {
|
@@ -81,7 +82,6 @@ async function pollBundleStatus(bundleId, interval = 1000, timeout = 40000) {
|
|
81
82
|
return [];
|
82
83
|
}
|
83
84
|
async function sendJitoBundle(transactions) {
|
84
|
-
(0, generalUtils_1.consoleLog)("Sending bundle...");
|
85
85
|
const resp = await axios_1.default.post(`${solautoConstants_1.JITO_BLOCK_ENGINE}/api/v1/bundles`, {
|
86
86
|
jsonrpc: "2.0",
|
87
87
|
id: 1,
|
@@ -89,7 +89,8 @@ async function sendJitoBundle(transactions) {
|
|
89
89
|
params: [transactions],
|
90
90
|
});
|
91
91
|
const bundleId = resp.data.result;
|
92
|
-
|
92
|
+
(0, generalUtils_1.consoleLog)("Bundle ID:", bundleId);
|
93
|
+
return bundleId ? await pollBundleStatus(bundleId) : [];
|
93
94
|
}
|
94
95
|
async function sendJitoBundledTransactions(umi, signer, txs, simulateOnly, priorityFeeSetting = types_1.PriorityFeeSetting.Min) {
|
95
96
|
(0, generalUtils_1.consoleLog)("Sending Jito bundle...");
|
@@ -98,11 +99,8 @@ async function sendJitoBundledTransactions(umi, signer, txs, simulateOnly, prior
|
|
98
99
|
txs[0] = txs[0].prepend(await getTipInstruction(signer, 150000));
|
99
100
|
const feeEstimates = await Promise.all(txs.map(async (x) => (await (0, solanaUtils_1.getComputeUnitPriceEstimate)(umi, x, priorityFeeSetting)) ??
|
100
101
|
1000000));
|
101
|
-
let builtTxs = await umiToVersionedTransactions(umi, signer, txs, feeEstimates
|
102
|
-
//
|
103
|
-
);
|
104
|
-
// // TODO: Skip over this for now, and instead don't specify a compute unit limit in the final bundle transactions
|
105
|
-
// const simulationResults = await simulateJitoBundle(builtTxs);
|
102
|
+
let builtTxs = await umiToVersionedTransactions(umi, signer, txs, feeEstimates);
|
103
|
+
// const simulationResults = await simulateJitoBundle(umi, builtTxs);
|
106
104
|
if (!simulateOnly) {
|
107
105
|
// let builtTxs = await umiToVersionedTransactions(
|
108
106
|
// client.signer,
|
@@ -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,GAClC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,
|
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,GAClC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAmC7B;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,CA+DjC"}
|
@@ -152,12 +152,11 @@ async function simulateTransaction(umi, connection, transaction) {
|
|
152
152
|
}
|
153
153
|
async function getComputeUnitPriceEstimate(umi, tx, prioritySetting) {
|
154
154
|
const web3Transaction = (0, umi_web3js_adapters_1.toWeb3JsTransaction)((await tx.setLatestBlockhash(umi, { commitment: "finalized" })).build(umi));
|
155
|
-
const serializedTransaction = bs58_1.default.encode(web3Transaction.serialize());
|
156
155
|
let feeEstimate;
|
157
156
|
try {
|
158
157
|
const resp = await umi.rpc.call("getPriorityFeeEstimate", [
|
159
158
|
{
|
160
|
-
transaction:
|
159
|
+
transaction: bs58_1.default.encode(web3Transaction.serialize()),
|
161
160
|
options: {
|
162
161
|
priorityLevel: prioritySetting.toString(),
|
163
162
|
},
|
@@ -166,7 +165,22 @@ async function getComputeUnitPriceEstimate(umi, tx, prioritySetting) {
|
|
166
165
|
feeEstimate = Math.round(resp.priorityFeeEstimate);
|
167
166
|
}
|
168
167
|
catch (e) {
|
169
|
-
|
168
|
+
try {
|
169
|
+
const resp = await umi.rpc.call("getPriorityFeeEstimate", [
|
170
|
+
{
|
171
|
+
accountKeys: tx
|
172
|
+
.getInstructions()
|
173
|
+
.flatMap((x) => x.keys.flatMap((x) => x.pubkey.toString())),
|
174
|
+
options: {
|
175
|
+
priorityLevel: prioritySetting.toString(),
|
176
|
+
},
|
177
|
+
},
|
178
|
+
]);
|
179
|
+
feeEstimate = Math.round(resp.priorityFeeEstimate);
|
180
|
+
}
|
181
|
+
catch (e) {
|
182
|
+
console.error(e);
|
183
|
+
}
|
170
184
|
}
|
171
185
|
return feeEstimate;
|
172
186
|
}
|
@@ -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
@@ -9,6 +9,7 @@ import {
|
|
9
9
|
} from "@metaplex-foundation/umi";
|
10
10
|
import {
|
11
11
|
assembleFinalTransaction,
|
12
|
+
buildIronforgeApiUrl,
|
12
13
|
getComputeUnitPriceEstimate,
|
13
14
|
systemTransferUmiIx,
|
14
15
|
} from "./solanaUtils";
|
@@ -16,6 +17,7 @@ import { consoleLog } from "./generalUtils";
|
|
16
17
|
import { PriorityFeeSetting } from "../types";
|
17
18
|
import axios from "axios";
|
18
19
|
import base58 from "bs58";
|
20
|
+
import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes";
|
19
21
|
|
20
22
|
export async function getRandomTipAccount(): Promise<PublicKey> {
|
21
23
|
const tipAccounts = [
|
@@ -43,25 +45,24 @@ async function getTipInstruction(
|
|
43
45
|
);
|
44
46
|
}
|
45
47
|
|
46
|
-
//
|
47
|
-
//
|
48
|
-
//
|
49
|
-
//
|
50
|
-
//
|
51
|
-
//
|
52
|
-
//
|
53
|
-
//
|
54
|
-
|
55
|
-
//
|
56
|
-
//
|
57
|
-
//
|
58
|
-
//
|
59
|
-
//
|
60
|
-
//
|
48
|
+
// TODO: fix
|
49
|
+
// async function simulateJitoBundle(umi: Umi, txs: VersionedTransaction[]) {
|
50
|
+
// const simulationResult = await axios.post(
|
51
|
+
// `${JITO_BLOCK_ENGINE}/api/v1/bundles`,
|
52
|
+
// {
|
53
|
+
// method: "simulateBundle",
|
54
|
+
// id: 1,
|
55
|
+
// jsonrpc: "2.0",
|
56
|
+
// params: [
|
57
|
+
// {
|
58
|
+
// encodedTransactions: txs.map((x) => bs58.encode(x.serialize())),
|
59
|
+
// preExecutionAccountsConfigs: txs.map((_) => ""),
|
60
|
+
// postExecutionAccountsConfigs: txs.map((_) => ""),
|
61
|
+
// skipSigVerify: true,
|
62
|
+
// },
|
63
|
+
// ],
|
61
64
|
// }
|
62
|
-
//
|
63
|
-
|
64
|
-
// return simulationResult.value.transactionResults;
|
65
|
+
// );
|
65
66
|
// }
|
66
67
|
|
67
68
|
async function umiToVersionedTransactions(
|
@@ -122,7 +123,6 @@ async function pollBundleStatus(
|
|
122
123
|
}
|
123
124
|
|
124
125
|
async function sendJitoBundle(transactions: string[]): Promise<string[]> {
|
125
|
-
consoleLog("Sending bundle...");
|
126
126
|
const resp = await axios.post<{ result: string }>(
|
127
127
|
`${JITO_BLOCK_ENGINE}/api/v1/bundles`,
|
128
128
|
{
|
@@ -134,7 +134,8 @@ async function sendJitoBundle(transactions: string[]): Promise<string[]> {
|
|
134
134
|
);
|
135
135
|
|
136
136
|
const bundleId = resp.data.result;
|
137
|
-
|
137
|
+
consoleLog("Bundle ID:", bundleId);
|
138
|
+
return bundleId ? await pollBundleStatus(bundleId) : [];
|
138
139
|
}
|
139
140
|
|
140
141
|
export async function sendJitoBundledTransactions(
|
@@ -165,10 +166,9 @@ export async function sendJitoBundledTransactions(
|
|
165
166
|
signer,
|
166
167
|
txs,
|
167
168
|
feeEstimates
|
168
|
-
// Array(txs.length).fill(1_400_000)
|
169
169
|
);
|
170
|
-
|
171
|
-
// const simulationResults = await simulateJitoBundle(builtTxs);
|
170
|
+
|
171
|
+
// const simulationResults = await simulateJitoBundle(umi, builtTxs);
|
172
172
|
|
173
173
|
if (!simulateOnly) {
|
174
174
|
// let builtTxs = await umiToVersionedTransactions(
|
package/src/utils/solanaUtils.ts
CHANGED
@@ -293,13 +293,12 @@ export async function getComputeUnitPriceEstimate(
|
|
293
293
|
const web3Transaction = toWeb3JsTransaction(
|
294
294
|
(await tx.setLatestBlockhash(umi, { commitment: "finalized" })).build(umi)
|
295
295
|
);
|
296
|
-
const serializedTransaction = bs58.encode(web3Transaction.serialize());
|
297
296
|
|
298
297
|
let feeEstimate: number | undefined;
|
299
298
|
try {
|
300
299
|
const resp = await umi.rpc.call("getPriorityFeeEstimate", [
|
301
300
|
{
|
302
|
-
transaction:
|
301
|
+
transaction: bs58.encode(web3Transaction.serialize()),
|
303
302
|
options: {
|
304
303
|
priorityLevel: prioritySetting.toString(),
|
305
304
|
},
|
@@ -307,7 +306,21 @@ export async function getComputeUnitPriceEstimate(
|
|
307
306
|
]);
|
308
307
|
feeEstimate = Math.round((resp as any).priorityFeeEstimate as number);
|
309
308
|
} catch (e) {
|
310
|
-
|
309
|
+
try {
|
310
|
+
const resp = await umi.rpc.call("getPriorityFeeEstimate", [
|
311
|
+
{
|
312
|
+
accountKeys: tx
|
313
|
+
.getInstructions()
|
314
|
+
.flatMap((x) => x.keys.flatMap((x) => x.pubkey.toString())),
|
315
|
+
options: {
|
316
|
+
priorityLevel: prioritySetting.toString(),
|
317
|
+
},
|
318
|
+
},
|
319
|
+
]);
|
320
|
+
feeEstimate = Math.round((resp as any).priorityFeeEstimate as number);
|
321
|
+
} catch (e) {
|
322
|
+
console.error(e);
|
323
|
+
}
|
311
324
|
}
|
312
325
|
|
313
326
|
return feeEstimate;
|
@@ -374,7 +387,11 @@ export async function sendSingleOptimizedTransaction(
|
|
374
387
|
|
375
388
|
let cuPrice: number | undefined;
|
376
389
|
if (prioritySetting !== PriorityFeeSetting.None) {
|
377
|
-
cuPrice = await getComputeUnitPriceEstimate(
|
390
|
+
cuPrice = await getComputeUnitPriceEstimate(
|
391
|
+
umi,
|
392
|
+
tx,
|
393
|
+
prioritySetting,
|
394
|
+
);
|
378
395
|
if (!cuPrice) {
|
379
396
|
cuPrice = 1000000;
|
380
397
|
}
|
@@ -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
|
);
|