@haven-fi/solauto-sdk 1.0.39 → 1.0.41
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/clients/solautoClient.d.ts +1 -1
- package/dist/clients/solautoClient.d.ts.map +1 -1
- package/dist/clients/solautoClient.js +3 -3
- package/dist/clients/solautoMarginfiClient.d.ts +1 -1
- package/dist/clients/solautoMarginfiClient.d.ts.map +1 -1
- package/dist/clients/solautoMarginfiClient.js +25 -9
- package/dist/generated/instructions/marginfiRebalance.d.ts +1 -1
- package/dist/generated/instructions/marginfiRebalance.d.ts.map +1 -1
- package/dist/generated/instructions/marginfiRebalance.js +2 -2
- package/dist/transactions/transactionUtils.d.ts.map +1 -1
- package/dist/transactions/transactionUtils.js +15 -13
- package/dist/transactions/transactionsManager.d.ts +22 -1
- package/dist/transactions/transactionsManager.d.ts.map +1 -1
- package/dist/transactions/transactionsManager.js +33 -3
- package/dist/types/solauto.d.ts +1 -1
- package/dist/types/solauto.d.ts.map +1 -1
- package/dist/utils/generalUtils.d.ts.map +1 -1
- package/dist/utils/generalUtils.js +1 -1
- package/dist/utils/jupiterUtils.d.ts +1 -1
- package/dist/utils/jupiterUtils.d.ts.map +1 -1
- package/dist/utils/jupiterUtils.js +6 -4
- package/local/shared.ts +7 -6
- package/package.json +1 -1
- package/src/clients/solautoClient.ts +6 -4
- package/src/clients/solautoMarginfiClient.ts +31 -19
- package/src/generated/instructions/marginfiRebalance.ts +3 -3
- package/src/transactions/transactionUtils.ts +37 -18
- package/src/transactions/transactionsManager.ts +50 -5
- package/src/types/solauto.ts +1 -1
- package/src/utils/generalUtils.ts +2 -1
- package/src/utils/jupiterUtils.ts +19 -13
- package/tests/transactions/solautoMarginfi.ts +6 -6
@@ -69,7 +69,7 @@ export declare abstract class SolautoClient {
|
|
69
69
|
protocolInteraction(args: SolautoActionArgs): TransactionBuilder;
|
70
70
|
abstract flashBorrow(flashLoanDetails: FlashLoanDetails, destinationTokenAccount: PublicKey): TransactionBuilder;
|
71
71
|
abstract flashRepay(flashLoanDetails: FlashLoanDetails): TransactionBuilder;
|
72
|
-
abstract rebalance(rebalanceStep: "A" | "B", swapDetails: JupSwapDetails, rebalanceType: SolautoRebalanceTypeArgs, targetLiqUtilizationRateBps?: number, limitGapBps?: number): TransactionBuilder;
|
72
|
+
abstract rebalance(rebalanceStep: "A" | "B", swapDetails: JupSwapDetails, rebalanceType: SolautoRebalanceTypeArgs, flashLoan?: FlashLoanDetails, targetLiqUtilizationRateBps?: number, limitGapBps?: number): TransactionBuilder;
|
73
73
|
getFreshPositionState(): Promise<PositionState | undefined>;
|
74
74
|
}
|
75
75
|
//# sourceMappingURL=solautoClient.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solautoClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoClient.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AACxC,OAAO,EAEL,UAAU,EACV,SAAS,EACV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,MAAM,EACN,kBAAkB,EAClB,GAAG,EAQJ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,aAAa,EAEd,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,EAChC,sBAAsB,EASvB,MAAM,cAAc,CAAC;AAOtB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAMvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAInE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,aAAa,CAAC;IAEvB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB,oBAAoB,CAAC,EAAE,SAAS,CAAC;IACjC,mBAAmB,CAAC,EAAE,SAAS,CAAC;CACjC;AAED,8BAAsB,aAAa;IAyCxB,SAAS,CAAC;IAxCZ,GAAG,EAAG,GAAG,CAAC;IACV,UAAU,EAAG,UAAU,CAAC;IACxB,eAAe,EAAG,eAAe,CAAC;IAElC,SAAS,EAAG,SAAS,CAAC;IACtB,MAAM,EAAG,MAAM,CAAC;IAEhB,UAAU,EAAG,MAAM,CAAC;IACpB,WAAW,EAAG,OAAO,CAAC;IACtB,eAAe,EAAG,SAAS,CAAC;IAC5B,mBAAmB,EAAG,eAAe,GAAG,IAAI,CAAC;IAC7C,oBAAoB,EAAG,aAAa,GAAG,SAAS,CAAC;IAEjD,UAAU,EAAG,SAAS,CAAC;IACvB,gBAAgB,EAAG,SAAS,CAAC;IAC7B,cAAc,EAAG,SAAS,CAAC;IAE3B,QAAQ,EAAG,SAAS,CAAC;IACrB,cAAc,EAAG,SAAS,CAAC;IAC3B,YAAY,EAAG,SAAS,CAAC;IAEzB,sBAAsB,EAAG,SAAS,CAAC;IACnC,0BAA0B,EAAG,aAAa,GAAG,IAAI,CAAC;IAClD,6BAA6B,EAAG,SAAS,CAAC;IAC1C,uBAAuB,EAAG,SAAS,CAAC;IAEpC,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAChC,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAE/B,iBAAiB,EAAG,SAAS,CAAC;IAC9B,mBAAmB,EAAG,SAAS,CAAC;IAEhC,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAChC,mBAAmB,EAAG,SAAS,EAAE,CAAC;IAElC,mBAAmB,EAAE,mBAAmB,CAA6B;gBAG1E,YAAY,EAAE,MAAM,EACb,SAAS,CAAC,qBAAS;IAWtB,UAAU,CAAC,IAAI,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe;IAmH1E,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAMnB,wBAAwB;IAoB9B,mBAAmB,IAAI,MAAM,EAAE;IAK/B,gBAAgB,IAAI,SAAS,EAAE;IAiBzB,iCAAiC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAUzD,iBAAiB,IAAI,OAAO,CAChC;QAAE,WAAW,EAAE,kBAAkB,CAAC;QAAC,iBAAiB,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAC5E;
|
1
|
+
{"version":3,"file":"solautoClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoClient.ts"],"names":[],"mappings":"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"}
|
@@ -172,9 +172,9 @@ class SolautoClient {
|
|
172
172
|
addresses: accountsToAdd,
|
173
173
|
})));
|
174
174
|
}
|
175
|
-
const addingReferredBy = accountsToAdd.length === 1
|
176
|
-
|
177
|
-
|
175
|
+
const addingReferredBy = accountsToAdd.length === 1 &&
|
176
|
+
accountsToAdd[0].toString().toLowerCase() ===
|
177
|
+
this.referredBySupplyTa?.toString().toLowerCase();
|
178
178
|
if (tx.getInstructions().length > 0) {
|
179
179
|
this.log("Updating authority lookup table...");
|
180
180
|
}
|
@@ -34,7 +34,7 @@ export declare class SolautoMarginfiClient extends SolautoClient {
|
|
34
34
|
protocolInteraction(args: SolautoActionArgs): TransactionBuilder;
|
35
35
|
private marginfiProtocolInteractionIx;
|
36
36
|
private marginfiSolautoProtocolInteractionIx;
|
37
|
-
rebalance(rebalanceStep: "A" | "B", swapDetails: JupSwapDetails, rebalanceType: SolautoRebalanceTypeArgs, targetLiqUtilizationRateBps?: number, limitGapBps?: number): TransactionBuilder;
|
37
|
+
rebalance(rebalanceStep: "A" | "B", swapDetails: JupSwapDetails, rebalanceType: SolautoRebalanceTypeArgs, flashLoan?: FlashLoanDetails, targetLiqUtilizationRateBps?: number, limitGapBps?: number): TransactionBuilder;
|
38
38
|
flashBorrow(flashLoanDetails: FlashLoanDetails, destinationTokenAccount: PublicKey): TransactionBuilder;
|
39
39
|
flashRepay(flashLoanDetails: FlashLoanDetails): TransactionBuilder;
|
40
40
|
createIntermediaryMarginfiAccount(): TransactionBuilder;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoMarginfiClient.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,MAAM,EACN,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,
|
1
|
+
{"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoMarginfiClient.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,MAAM,EACN,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAK1D,OAAO,EACL,kBAAkB,EAElB,aAAa,EACb,iBAAiB,EACjB,wBAAwB,EACxB,gCAAgC,EAKjC,MAAM,cAAc,CAAC;AAGtB,OAAO,EAEL,eAAe,EAUhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAQnE,MAAM,WAAW,yBAA0B,SAAQ,iBAAiB;IAClE,eAAe,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACrC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,qBAAa,qBAAsB,SAAQ,aAAa;IACtD,OAAO,CAAC,WAAW,CAAkB;IAE9B,eAAe,EAAG,SAAS,CAAC;IAE5B,sBAAsB,EAAE,MAAM,CAAa;IAC3C,eAAe,EAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,EAAG,SAAS,CAAC;IAC9B,aAAa,EAAG,SAAS,CAAC;IAE1B,0BAA0B,EAAG,qBAAqB,CAAC;IACnD,wBAAwB,EAAG,qBAAqB,CAAC;IAGjD,iCAAiC,CAAC,EAAE,MAAM,CAAC;IAC3C,6BAA6B,EAAG,SAAS,CAAC;IAC1C,2BAA2B,CAAC,EAAE,eAAe,CAAC;IAE/C,UAAU,CAAC,IAAI,EAAE,yBAAyB;IA0C1C,8BAA8B;IAsCpC,mBAAmB,IAAI,MAAM,EAAE;IAI/B,gBAAgB,IAAI,SAAS,EAAE;IAQ/B,yBAAyB,IAAI,kBAAkB;IAS/C,YAAY,CACV,aAAa,CAAC,EAAE,gCAAgC,EAChD,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IAMrB,OAAO,CAAC,sBAAsB;IA6C9B,OAAO,IAAI,kBAAkB;IAc7B,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAUhE,OAAO,CAAC,6BAA6B;IAmErC,OAAO,CAAC,oCAAoC;IA8D5C,SAAS,CACP,aAAa,EAAE,GAAG,GAAG,GAAG,EACxB,WAAW,EAAE,cAAc,EAC3B,aAAa,EAAE,wBAAwB,EACvC,SAAS,CAAC,EAAE,gBAAgB,EAC5B,2BAA2B,CAAC,EAAE,MAAM,EACpC,WAAW,CAAC,EAAE,MAAM,GACnB,kBAAkB;IA4DrB,WAAW,CACT,gBAAgB,EAAE,gBAAgB,EAClC,uBAAuB,EAAE,SAAS,GACjC,kBAAkB;IA2BrB,UAAU,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,kBAAkB;IA8ElE,iCAAiC,IAAI,kBAAkB;IASjD,qBAAqB,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;CAiBlE"}
|
@@ -125,7 +125,9 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
125
125
|
settingParams: settingParams ?? null,
|
126
126
|
dca: dca ?? null,
|
127
127
|
},
|
128
|
-
marginfiAccountSeedIdx: !this.selfManaged
|
128
|
+
marginfiAccountSeedIdx: !this.selfManaged
|
129
|
+
? this.marginfiAccountSeedIdx
|
130
|
+
: null,
|
129
131
|
});
|
130
132
|
}
|
131
133
|
refresh() {
|
@@ -248,15 +250,21 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
248
250
|
solautoAction: args,
|
249
251
|
});
|
250
252
|
}
|
251
|
-
rebalance(rebalanceStep, swapDetails, rebalanceType, targetLiqUtilizationRateBps, limitGapBps) {
|
253
|
+
rebalance(rebalanceStep, swapDetails, rebalanceType, flashLoan, targetLiqUtilizationRateBps, limitGapBps) {
|
254
|
+
const inputIsSupply = swapDetails.inputMint.equals(this.supplyMint);
|
255
|
+
const outputIsSupply = swapDetails.outputMint.equals(this.supplyMint);
|
256
|
+
const needSupplyAccounts = (inputIsSupply && rebalanceStep === "A") ||
|
257
|
+
(outputIsSupply && rebalanceStep === "B") ||
|
258
|
+
(inputIsSupply && flashLoan !== undefined && rebalanceStep == "B");
|
259
|
+
const needDebtAccounts = (!inputIsSupply && rebalanceStep === "A") ||
|
260
|
+
(!outputIsSupply && rebalanceStep === "B") ||
|
261
|
+
(!inputIsSupply && flashLoan !== undefined && rebalanceStep == "B");
|
252
262
|
return (0, generated_1.marginfiRebalance)(this.umi, {
|
253
263
|
signer: this.signer,
|
254
264
|
marginfiProgram: (0, umi_1.publicKey)(marginfi_sdk_1.MARGINFI_PROGRAM_ID),
|
255
265
|
ixsSysvar: (0, umi_1.publicKey)(web3_js_1.SYSVAR_INSTRUCTIONS_PUBKEY),
|
256
266
|
solautoFeesSupplyTa: rebalanceStep === "B" ? (0, umi_1.publicKey)(this.solautoFeesSupplyTa) : undefined,
|
257
|
-
authorityReferralState:
|
258
|
-
? (0, umi_1.publicKey)(this.authorityReferralState)
|
259
|
-
: undefined,
|
267
|
+
authorityReferralState: (0, umi_1.publicKey)(this.authorityReferralState),
|
260
268
|
referredBySupplyTa: rebalanceStep === "B" && this.referredBySupplyTa
|
261
269
|
? (0, umi_1.publicKey)(this.referredBySupplyTa)
|
262
270
|
: undefined,
|
@@ -270,14 +278,22 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
270
278
|
signerSupplyTa: this.selfManaged
|
271
279
|
? (0, umi_1.publicKey)(this.signerSupplyTa)
|
272
280
|
: undefined,
|
273
|
-
vaultSupplyTa:
|
274
|
-
|
281
|
+
vaultSupplyTa: needSupplyAccounts
|
282
|
+
? (0, umi_1.publicKey)(this.marginfiSupplyBankAccounts.liquidityVault)
|
283
|
+
: undefined,
|
284
|
+
supplyVaultAuthority: needSupplyAccounts
|
285
|
+
? (0, umi_1.publicKey)(this.marginfiSupplyBankAccounts.vaultAuthority)
|
286
|
+
: undefined,
|
275
287
|
debtBank: (0, umi_1.publicKey)(this.marginfiDebtBankAccounts.bank),
|
276
288
|
debtPriceOracle: (0, umi_1.publicKey)(this.marginfiDebtBankAccounts.priceOracle),
|
277
289
|
positionDebtTa: (0, umi_1.publicKey)(this.positionDebtTa),
|
278
290
|
signerDebtTa: this.selfManaged ? (0, umi_1.publicKey)(this.signerDebtTa) : undefined,
|
279
|
-
vaultDebtTa:
|
280
|
-
|
291
|
+
vaultDebtTa: needDebtAccounts
|
292
|
+
? (0, umi_1.publicKey)(this.marginfiDebtBankAccounts.liquidityVault)
|
293
|
+
: undefined,
|
294
|
+
debtVaultAuthority: needDebtAccounts
|
295
|
+
? (0, umi_1.publicKey)(this.marginfiDebtBankAccounts.vaultAuthority)
|
296
|
+
: undefined,
|
281
297
|
rebalanceType,
|
282
298
|
targetLiqUtilizationRateBps: targetLiqUtilizationRateBps ?? null,
|
283
299
|
limitGapBps: limitGapBps ?? null,
|
@@ -15,7 +15,7 @@ export type MarginfiRebalanceInstructionAccounts = {
|
|
15
15
|
tokenProgram?: PublicKey | Pda;
|
16
16
|
ixsSysvar: PublicKey | Pda;
|
17
17
|
solautoFeesSupplyTa?: PublicKey | Pda;
|
18
|
-
authorityReferralState
|
18
|
+
authorityReferralState: PublicKey | Pda;
|
19
19
|
referredBySupplyTa?: PublicKey | Pda;
|
20
20
|
solautoPosition: PublicKey | Pda;
|
21
21
|
marginfiGroup: PublicKey | Pda;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"marginfiRebalance.d.ts","sourceRoot":"","sources":["../../../src/generated/instructions/marginfiRebalance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,OAAO,EACP,MAAM,EACN,gBAAgB,EAChB,GAAG,EACH,SAAS,EACT,MAAM,EACN,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,UAAU,EAMX,MAAM,sCAAsC,CAAC;AAM9C,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EAEzB,MAAM,UAAU,CAAC;AAGlB,MAAM,MAAM,oCAAoC,GAAG;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,SAAS,GAAG,GAAG,CAAC;IACjC,aAAa,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IAChC,YAAY,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IAC/B,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;IAC3B,mBAAmB,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IACtC,sBAAsB,
|
1
|
+
{"version":3,"file":"marginfiRebalance.d.ts","sourceRoot":"","sources":["../../../src/generated/instructions/marginfiRebalance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,OAAO,EACP,MAAM,EACN,gBAAgB,EAChB,GAAG,EACH,SAAS,EACT,MAAM,EACN,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,UAAU,EAMX,MAAM,sCAAsC,CAAC;AAM9C,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EAEzB,MAAM,UAAU,CAAC;AAGlB,MAAM,MAAM,oCAAoC,GAAG;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,SAAS,GAAG,GAAG,CAAC;IACjC,aAAa,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IAChC,YAAY,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IAC/B,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;IAC3B,mBAAmB,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IACtC,sBAAsB,EAAE,SAAS,GAAG,GAAG,CAAC;IACxC,kBAAkB,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IACrC,eAAe,EAAE,SAAS,GAAG,GAAG,CAAC;IACjC,aAAa,EAAE,SAAS,GAAG,GAAG,CAAC;IAC/B,eAAe,EAAE,SAAS,GAAG,GAAG,CAAC;IACjC,cAAc,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IACjC,UAAU,EAAE,SAAS,GAAG,GAAG,CAAC;IAC5B,iBAAiB,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IACpC,gBAAgB,EAAE,SAAS,GAAG,GAAG,CAAC;IAClC,cAAc,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IACjC,aAAa,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IAChC,oBAAoB,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IACvC,QAAQ,EAAE,SAAS,GAAG,GAAG,CAAC;IAC1B,eAAe,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IAClC,cAAc,EAAE,SAAS,GAAG,GAAG,CAAC;IAChC,YAAY,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IAC/B,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IAC9B,kBAAkB,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;CACtC,CAAC;AAGF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,oBAAoB,CAAC;IACpC,2BAA2B,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG;IACjD,aAAa,EAAE,wBAAwB,CAAC;IACxC,2BAA2B,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtD,WAAW,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;CACvC,CAAC;AAEF,wBAAgB,6CAA6C,IAAI,UAAU,CACzE,oCAAoC,EACpC,gCAAgC,CACjC,CAoBA;AAGD,MAAM,MAAM,gCAAgC,GAC1C,oCAAoC,CAAC;AAGvC,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAClC,KAAK,EAAE,oCAAoC,GAAG,gCAAgC,GAC7E,kBAAkB,CA6KpB"}
|
@@ -114,7 +114,7 @@ function marginfiRebalance(context, input) {
|
|
114
114
|
},
|
115
115
|
supplyVaultAuthority: {
|
116
116
|
index: 17,
|
117
|
-
isWritable:
|
117
|
+
isWritable: false,
|
118
118
|
value: input.supplyVaultAuthority ?? null,
|
119
119
|
},
|
120
120
|
debtBank: {
|
@@ -144,7 +144,7 @@ function marginfiRebalance(context, input) {
|
|
144
144
|
},
|
145
145
|
debtVaultAuthority: {
|
146
146
|
index: 23,
|
147
|
-
isWritable:
|
147
|
+
isWritable: false,
|
148
148
|
value: input.debtVaultAuthority ?? null,
|
149
149
|
},
|
150
150
|
};
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,kBAAkB,EAClB,GAAG,EAGJ,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAGL,OAAO,IAAI,eAAe,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,aAAa,EASd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAqMzD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,EACtB,sBAAsB,EAAE,MAAM,EAAE,GAC/B,OAAO,CAAC,kBAAkB,CAAC,
|
1
|
+
{"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,kBAAkB,EAClB,GAAG,EAGJ,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAGL,OAAO,IAAI,eAAe,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,aAAa,EASd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAqMzD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,EACtB,sBAAsB,EAAE,MAAM,EAAE,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAgH7B;AAkLD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,GACrB,OAAO,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CA4BnD;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CACN;IACE,EAAE,EAAE,kBAAkB,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC,GACD,SAAS,CACZ,CAgHA;AAED,wBAAsB,gCAAgC,CACpD,GAAG,EAAE,GAAG,EACR,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,eAAe,GAC5B,OAAO,CAAC,CAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC,CAAC,CA8BzC"}
|
@@ -115,8 +115,7 @@ async function rebalanceChoresBefore(client, tx, accountsGettingCreated) {
|
|
115
115
|
if (rebalanceInstructions.length === 0) {
|
116
116
|
return (0, umi_1.transactionBuilder)();
|
117
117
|
}
|
118
|
-
const usesAccount = (key) => rebalanceInstructions
|
119
|
-
.some((t) => t.keys.some((k) => (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(k.pubkey).equals(key)));
|
118
|
+
const usesAccount = (key) => rebalanceInstructions.some((t) => t.keys.some((k) => (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(k.pubkey).equals(key)));
|
120
119
|
const checkReferralSupplyTa = client.referredBySupplyTa && usesAccount(client.referredBySupplyTa);
|
121
120
|
const checkSolautoFeesTa = usesAccount(client.solautoFeesSupplyTa);
|
122
121
|
const checkIntermediaryMfiAccount = client.lendingPlatform === generated_1.LendingPlatform.Marginfi &&
|
@@ -134,7 +133,7 @@ async function rebalanceChoresBefore(client, tx, accountsGettingCreated) {
|
|
134
133
|
...[checkSignerSupplyTa ? client.signerSupplyTa : web3_js_1.PublicKey.default],
|
135
134
|
...[checkSignerDebtTa ? client.signerDebtTa : web3_js_1.PublicKey.default],
|
136
135
|
];
|
137
|
-
const [referredBySupplyTa, solautoFeesSupplyTa, intermediaryMarginfiAccount, signerSupplyTa, signerDebtTa] = await client.umi.rpc.getAccounts(accountsNeeded.map((x) => (0, umi_1.publicKey)(x ?? web3_js_1.PublicKey.default)));
|
136
|
+
const [referredBySupplyTa, solautoFeesSupplyTa, intermediaryMarginfiAccount, signerSupplyTa, signerDebtTa,] = await client.umi.rpc.getAccounts(accountsNeeded.map((x) => (0, umi_1.publicKey)(x ?? web3_js_1.PublicKey.default)));
|
138
137
|
let chores = (0, umi_1.transactionBuilder)();
|
139
138
|
if (checkReferralSupplyTa && !(0, generalUtils_1.rpcAccountCreated)(referredBySupplyTa)) {
|
140
139
|
client.log("Creating referred-by TA for ", client.supplyMint.toString());
|
@@ -148,12 +147,16 @@ async function rebalanceChoresBefore(client, tx, accountsGettingCreated) {
|
|
148
147
|
!(0, generalUtils_1.rpcAccountCreated)(intermediaryMarginfiAccount)) {
|
149
148
|
chores = chores.add(client.createIntermediaryMarginfiAccount());
|
150
149
|
}
|
151
|
-
if (checkSignerSupplyTa &&
|
150
|
+
if (checkSignerSupplyTa &&
|
151
|
+
!(0, generalUtils_1.rpcAccountCreated)(signerSupplyTa) &&
|
152
|
+
!accountsGettingCreated.includes(signerSupplyTa.publicKey.toString())) {
|
152
153
|
client.log("Creating signer supply token account");
|
153
154
|
chores = chores.add((0, solanaUtils_1.createAssociatedTokenAccountUmiIx)(client.signer, (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(client.signer.publicKey), client.supplyMint));
|
154
155
|
accountsGettingCreated.push(signerSupplyTa.publicKey.toString());
|
155
156
|
}
|
156
|
-
if (checkSignerDebtTa &&
|
157
|
+
if (checkSignerDebtTa &&
|
158
|
+
!(0, generalUtils_1.rpcAccountCreated)(signerDebtTa) &&
|
159
|
+
!accountsGettingCreated.includes(signerDebtTa.publicKey.toString())) {
|
157
160
|
client.log("Creating signer debt token account");
|
158
161
|
chores = chores.add((0, solanaUtils_1.createAssociatedTokenAccountUmiIx)(client.signer, (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(client.signer.publicKey), client.debtMint));
|
159
162
|
accountsGettingCreated.push(signerDebtTa.publicKey.toString());
|
@@ -177,7 +180,7 @@ function getRebalanceInstructions(tx) {
|
|
177
180
|
const discriminator = serializer.serialize({
|
178
181
|
limitGapBps: 0,
|
179
182
|
rebalanceType: generated_1.SolautoRebalanceType.None,
|
180
|
-
targetLiqUtilizationRateBps: 0
|
183
|
+
targetLiqUtilizationRateBps: 0,
|
181
184
|
})[0];
|
182
185
|
const [data, _] = serializer.deserialize(x.data);
|
183
186
|
if (data.discriminator === discriminator) {
|
@@ -195,8 +198,7 @@ function getSolautoActions(tx) {
|
|
195
198
|
if (x.programId === generated_1.SOLAUTO_PROGRAM_ID) {
|
196
199
|
try {
|
197
200
|
const serializer = (0, generated_1.getMarginfiProtocolInteractionInstructionDataSerializer)();
|
198
|
-
const discriminator = serializer
|
199
|
-
.serialize({
|
201
|
+
const discriminator = serializer.serialize({
|
200
202
|
solautoAction: (0, generated_1.solautoAction)("Deposit", [BigInt(0)]),
|
201
203
|
})[0];
|
202
204
|
const [data, _] = serializer.deserialize(x.data);
|
@@ -328,7 +330,7 @@ async function buildSolautoRebalanceTransaction(client, targetLiqUtilizationRate
|
|
328
330
|
const values = (0, rebalanceUtils_1.getRebalanceValues)(client, targetLiqUtilizationRateBps);
|
329
331
|
client.log("Rebalance values: ", values);
|
330
332
|
const swapDetails = (0, rebalanceUtils_1.getJupSwapRebalanceDetails)(client, values, targetLiqUtilizationRateBps, attemptNum);
|
331
|
-
const { jupQuote, lookupTableAddresses, setupInstructions, tokenLedgerIx, swapIx, } = await (0, jupiterUtils_1.getJupSwapTransaction)(client.signer, swapDetails);
|
333
|
+
const { jupQuote, lookupTableAddresses, setupInstructions, tokenLedgerIx, swapIx, } = await (0, jupiterUtils_1.getJupSwapTransaction)(client.signer, swapDetails, attemptNum);
|
332
334
|
const flashLoan = (0, rebalanceUtils_1.getFlashLoanDetails)(client, values, jupQuote);
|
333
335
|
let tx = (0, umi_1.transactionBuilder)();
|
334
336
|
if (flashLoan) {
|
@@ -343,11 +345,11 @@ async function buildSolautoRebalanceTransaction(client, targetLiqUtilizationRate
|
|
343
345
|
client.flashBorrow(flashLoan, (0, accountUtils_1.getTokenAccount)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(client.signer.publicKey), swapDetails.inputMint)),
|
344
346
|
...(addFirstRebalance
|
345
347
|
? [
|
346
|
-
client.rebalance("A", swapDetails, rebalanceType, targetLiqUtilizationRateBps),
|
348
|
+
client.rebalance("A", swapDetails, rebalanceType, flashLoan, targetLiqUtilizationRateBps),
|
347
349
|
]
|
348
350
|
: []),
|
349
351
|
swapIx,
|
350
|
-
client.rebalance("B", swapDetails, rebalanceType, targetLiqUtilizationRateBps),
|
352
|
+
client.rebalance("B", swapDetails, rebalanceType, flashLoan, targetLiqUtilizationRateBps),
|
351
353
|
client.flashRepay(flashLoan),
|
352
354
|
]);
|
353
355
|
}
|
@@ -356,9 +358,9 @@ async function buildSolautoRebalanceTransaction(client, targetLiqUtilizationRate
|
|
356
358
|
tx = tx.add([
|
357
359
|
setupInstructions,
|
358
360
|
tokenLedgerIx,
|
359
|
-
client.rebalance("A", swapDetails, rebalanceType, targetLiqUtilizationRateBps),
|
361
|
+
client.rebalance("A", swapDetails, rebalanceType, undefined, targetLiqUtilizationRateBps),
|
360
362
|
swapIx,
|
361
|
-
client.rebalance("B", swapDetails, rebalanceType, targetLiqUtilizationRateBps),
|
363
|
+
client.rebalance("B", swapDetails, rebalanceType, undefined, targetLiqUtilizationRateBps),
|
362
364
|
]);
|
363
365
|
}
|
364
366
|
if (client.solautoPositionState.liqUtilizationRateBps >
|
@@ -1,6 +1,13 @@
|
|
1
|
-
import { TransactionBuilder } from "@metaplex-foundation/umi";
|
1
|
+
import { AddressLookupTableInput, TransactionBuilder } from "@metaplex-foundation/umi";
|
2
2
|
import { SolautoClient } from "../clients/solautoClient";
|
3
3
|
import { ErrorsToThrow } from "../utils/generalUtils";
|
4
|
+
declare class LookupTables {
|
5
|
+
private client;
|
6
|
+
defaultLuts: string[];
|
7
|
+
cache: AddressLookupTableInput[];
|
8
|
+
constructor(client: SolautoClient);
|
9
|
+
getLutInputs(additionalAddresses: string[]): Promise<AddressLookupTableInput[]>;
|
10
|
+
}
|
4
11
|
export declare class TransactionItem {
|
5
12
|
fetchTx: (attemptNum: number) => Promise<{
|
6
13
|
tx: TransactionBuilder;
|
@@ -17,6 +24,18 @@ export declare class TransactionItem {
|
|
17
24
|
refetch(attemptNum: number): Promise<void>;
|
18
25
|
uniqueAccounts(): string[];
|
19
26
|
}
|
27
|
+
declare class TransactionSet {
|
28
|
+
private client;
|
29
|
+
lookupTables: LookupTables;
|
30
|
+
items: TransactionItem[];
|
31
|
+
constructor(client: SolautoClient, lookupTables: LookupTables, items?: TransactionItem[]);
|
32
|
+
fitsWith(item: TransactionItem): Promise<boolean>;
|
33
|
+
add(...items: TransactionItem[]): void;
|
34
|
+
refetchAll(attemptNum: number): Promise<void>;
|
35
|
+
getSingleTransaction(): Promise<TransactionBuilder>;
|
36
|
+
lutAddresses(): string[];
|
37
|
+
name(): string;
|
38
|
+
}
|
20
39
|
export declare enum TransactionStatus {
|
21
40
|
Skipped = "Skipped",
|
22
41
|
Processing = "Processing",
|
@@ -40,6 +59,8 @@ export declare class TransactionsManager {
|
|
40
59
|
constructor(client: SolautoClient, items: TransactionItem[], statusCallback?: ((statuses: TransactionManagerStatuses) => void) | undefined, simulateOnly?: boolean | undefined, mustBeAtomic?: boolean | undefined, errorsToThrow?: ErrorsToThrow | undefined);
|
41
60
|
private assembleTransactionSets;
|
42
61
|
updateStatus(name: string, status: TransactionStatus, txSig?: string): void;
|
62
|
+
debugAccounts(itemSet: TransactionSet, tx: TransactionBuilder): Promise<void>;
|
43
63
|
send(): Promise<void>;
|
44
64
|
}
|
65
|
+
export {};
|
45
66
|
//# sourceMappingURL=transactionsManager.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionsManager.ts"],"names":[],"mappings":"AACA,OAAO,
|
1
|
+
{"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionsManager.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EAGvB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAKzD,OAAO,EACL,aAAa,EAEd,MAAM,uBAAuB,CAAC;AAK/B,cAAM,YAAY;IAIJ,OAAO,CAAC,MAAM;IAH1B,WAAW,EAAE,MAAM,EAAE,CAAM;IAC3B,KAAK,EAAE,uBAAuB,EAAE,CAAM;gBAElB,MAAM,EAAE,aAAa;IAInC,YAAY,CAChB,mBAAmB,EAAE,MAAM,EAAE,GAC5B,OAAO,CAAC,uBAAuB,EAAE,CAAC;CAqBtC;AAED,qBAAa,eAAe;IAKjB,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CACV;QAAE,EAAE,EAAE,kBAAkB,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CACxE;IACM,IAAI,CAAC;IATd,oBAAoB,EAAG,MAAM,EAAE,CAAC;IAChC,EAAE,CAAC,EAAE,kBAAkB,CAAC;gBAGf,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CACV;QAAE,EAAE,EAAE,kBAAkB,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CACxE,EACM,IAAI,CAAC,oBAAQ;IAGhB,UAAU;IAIV,OAAO,CAAC,UAAU,EAAE,MAAM;IAMhC,cAAc,IAAI,MAAM,EAAE;CAY3B;AAED,cAAM,cAAc;IAEhB,OAAO,CAAC,MAAM;IACP,YAAY,EAAE,YAAY;IAC1B,KAAK,EAAE,eAAe,EAAE;gBAFvB,MAAM,EAAE,aAAa,EACtB,YAAY,EAAE,YAAY,EAC1B,KAAK,GAAE,eAAe,EAAO;IAGhC,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BvD,GAAG,CAAC,GAAG,KAAK,EAAE,eAAe,EAAE;IAMzB,UAAU,CAAC,UAAU,EAAE,MAAM;IAO7B,oBAAoB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAYzD,YAAY,IAAI,MAAM,EAAE;IAMxB,IAAI,IAAI,MAAM;CAYf;AAED,oBAAY,iBAAiB;IAC3B,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,MAAM,WAAW;IACjB,UAAU,eAAe;CAC1B;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EAAE,CAAC;AAEJ,qBAAa,mBAAmB;IAK5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,aAAa,CAAC;IATxB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,YAAY,CAAe;gBAGzB,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,eAAe,EAAE,EACxB,cAAc,CAAC,6CAA4C,IAAI,aAAA,EAC/D,YAAY,CAAC,qBAAS,EACtB,YAAY,CAAC,qBAAS,EACtB,aAAa,CAAC,2BAAe;YAKzB,uBAAuB;IA0CrC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,MAAM;IAiB9D,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,kBAAkB;IA6B7D,IAAI;CAyJX"}
|
@@ -29,7 +29,7 @@ class LookupTables {
|
|
29
29
|
const additionalInputs = await (0, solanaUtils_1.getAdressLookupInputs)(this.client.umi, missingAddresses);
|
30
30
|
this.cache.push(...additionalInputs);
|
31
31
|
}
|
32
|
-
return this.cache
|
32
|
+
return this.cache;
|
33
33
|
}
|
34
34
|
}
|
35
35
|
class TransactionItem {
|
@@ -141,7 +141,11 @@ class TransactionsManager {
|
|
141
141
|
}
|
142
142
|
const transaction = item.tx.setAddressLookupTables(await this.lookupTables.getLutInputs(item.lookupTableAddresses));
|
143
143
|
if (!transaction.fitsInOneTransaction(this.client.umi)) {
|
144
|
-
|
144
|
+
// TODO: revert me
|
145
|
+
// throw new Error(
|
146
|
+
// `Transaction exceeds max transaction size (${transaction.getTransactionSize(this.client.umi)})`
|
147
|
+
// );
|
148
|
+
transactionSets.push(new TransactionSet(this.client, this.lookupTables, [item]));
|
145
149
|
}
|
146
150
|
else {
|
147
151
|
let newSet = new TransactionSet(this.client, this.lookupTables, [item]);
|
@@ -176,9 +180,32 @@ class TransactionsManager {
|
|
176
180
|
this.client.log(`${name} is ${status.toString().toLowerCase()}`);
|
177
181
|
this.statusCallback?.(this.statuses);
|
178
182
|
}
|
183
|
+
// TODO remove me
|
184
|
+
async debugAccounts(itemSet, tx) {
|
185
|
+
const lutInputs = await itemSet.lookupTables.getLutInputs([]);
|
186
|
+
const lutAccounts = lutInputs.map((x) => x.addresses).flat();
|
187
|
+
const keys = tx
|
188
|
+
.getInstructions()
|
189
|
+
.map((x) => x.keys)
|
190
|
+
.flat();
|
191
|
+
for (const ix of tx.getInstructions()) {
|
192
|
+
const ixAccounts = ix.keys.map((x) => x.pubkey);
|
193
|
+
const accountsNotInLut = ixAccounts.filter((x) => !lutAccounts.includes(x));
|
194
|
+
console.log("Program", ix.programId, " data ", ix.data.length, ix.keys.filter((x) => lutAccounts.includes(x.pubkey)).length * 3);
|
195
|
+
if (accountsNotInLut.length > 0) {
|
196
|
+
console.log("Accounts not in LUT:");
|
197
|
+
for (const key of accountsNotInLut) {
|
198
|
+
console.log(key.toString());
|
199
|
+
}
|
200
|
+
console.log(ix.keys.length);
|
201
|
+
}
|
202
|
+
}
|
203
|
+
}
|
179
204
|
async send() {
|
180
205
|
const updateLookupTable = await this.client.updateLookupTable();
|
181
|
-
if (updateLookupTable &&
|
206
|
+
if (updateLookupTable &&
|
207
|
+
updateLookupTable.updateLutTx.getInstructions().length > 0 &&
|
208
|
+
updateLookupTable?.needsToBeIsolated) {
|
182
209
|
this.updateStatus("update lookup table", TransactionStatus.Processing);
|
183
210
|
await (0, generalUtils_1.retryWithExponentialBackoff)(async (attemptNum) => await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.client.umi, this.client.connection, updateLookupTable.updateLutTx, this.simulateOnly, attemptNum), 3, 150, this.errorsToThrow);
|
184
211
|
this.updateStatus("update lookup table", TransactionStatus.Successful);
|
@@ -257,6 +284,9 @@ class TransactionsManager {
|
|
257
284
|
}
|
258
285
|
else {
|
259
286
|
this.updateStatus(itemSet.name(), TransactionStatus.Processing);
|
287
|
+
if (this.client.localTest) {
|
288
|
+
await this.debugAccounts(itemSet, tx);
|
289
|
+
}
|
260
290
|
const txSig = await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.client.umi, this.client.connection, tx, this.simulateOnly, attemptNum);
|
261
291
|
this.updateStatus(itemSet.name(), TransactionStatus.Successful, txSig ? bs58_1.default.encode(txSig) : undefined);
|
262
292
|
}
|
package/dist/types/solauto.d.ts
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
import { PublicKey } from "@solana/web3.js";
|
2
2
|
import { LendingPlatform } from "../generated";
|
3
3
|
export interface SolautoPositionDetails {
|
4
|
-
publicKey
|
4
|
+
publicKey?: PublicKey;
|
5
5
|
authority: PublicKey;
|
6
6
|
positionId: number;
|
7
7
|
lendingPlatform: LendingPlatform;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solauto.d.ts","sourceRoot":"","sources":["../../src/types/solauto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,SAAS,CAAC;
|
1
|
+
{"version":3,"file":"solauto.d.ts","sourceRoot":"","sources":["../../src/types/solauto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../src/utils/generalUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;
|
1
|
+
{"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../src/utils/generalUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAM3E,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAO1C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAEnE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAU1E;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiD1E;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,KAAK,CAAC,CAAC;AAEjE,wBAAgB,2BAA2B,CAAC,CAAC,EAC3C,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,OAAO,GAAE,MAAU,EACnB,KAAK,GAAE,MAAY,EACnB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,CAAC,CAAC,CA8BZ"}
|
@@ -94,7 +94,7 @@ function retryWithExponentialBackoff(fn, retries = 5, delay = 150, errorsToThrow
|
|
94
94
|
return;
|
95
95
|
}
|
96
96
|
if (attemptNum < retries) {
|
97
|
-
console.log(error);
|
97
|
+
console.log(error.message);
|
98
98
|
setTimeout(() => {
|
99
99
|
console.log("Retrying...");
|
100
100
|
return attempt(attemptNum);
|
@@ -17,5 +17,5 @@ export interface JupSwapTransaction {
|
|
17
17
|
tokenLedgerIx: TransactionBuilder;
|
18
18
|
swapIx: TransactionBuilder;
|
19
19
|
}
|
20
|
-
export declare function getJupSwapTransaction(signer: Signer, swapDetails: JupSwapDetails): Promise<JupSwapTransaction>;
|
20
|
+
export declare function getJupSwapTransaction(signer: Signer, swapDetails: JupSwapDetails, attemptNum?: number): Promise<JupSwapTransaction>;
|
21
21
|
//# sourceMappingURL=jupiterUtils.d.ts.map
|
@@ -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;
|
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;AAMrB,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,SAAS,CAAC;IACtB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAgBD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,aAAa,CAAC;IACxB,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,CAsE7B"}
|
@@ -7,6 +7,7 @@ const solanaUtils_1 = require("./solanaUtils");
|
|
7
7
|
const numberUtils_1 = require("./numberUtils");
|
8
8
|
const api_1 = require("@jup-ag/api");
|
9
9
|
const accountUtils_1 = require("./accountUtils");
|
10
|
+
const generalUtils_1 = require("./generalUtils");
|
10
11
|
const jupApi = (0, api_1.createJupiterApiClient)();
|
11
12
|
function createTransactionInstruction(instruction) {
|
12
13
|
return new web3_js_1.TransactionInstruction({
|
@@ -19,9 +20,9 @@ function createTransactionInstruction(instruction) {
|
|
19
20
|
data: Buffer.from(instruction.data, "base64"),
|
20
21
|
});
|
21
22
|
}
|
22
|
-
async function getJupSwapTransaction(signer, swapDetails) {
|
23
|
+
async function getJupSwapTransaction(signer, swapDetails, attemptNum) {
|
23
24
|
console.log("Getting jup quote...");
|
24
|
-
const quoteResponse = await jupApi.quoteGet({
|
25
|
+
const quoteResponse = await (0, generalUtils_1.retryWithExponentialBackoff)(async () => await jupApi.quoteGet({
|
25
26
|
amount: Number(swapDetails.amount),
|
26
27
|
inputMint: swapDetails.inputMint.toString(),
|
27
28
|
outputMint: swapDetails.outputMint.toString(),
|
@@ -30,8 +31,9 @@ async function getJupSwapTransaction(signer, swapDetails) {
|
|
30
31
|
: swapDetails.exactIn
|
31
32
|
? "ExactIn"
|
32
33
|
: undefined,
|
33
|
-
slippageBps: 10
|
34
|
-
|
34
|
+
slippageBps: 10,
|
35
|
+
maxAccounts: 60,
|
36
|
+
}), 3);
|
35
37
|
const finalPriceSlippageBps = Math.round(Math.max(quoteResponse.slippageBps ?? 10, Math.round((0, numberUtils_1.toBps)(parseFloat(quoteResponse.priceImpactPct)))) *
|
36
38
|
(1 + (swapDetails.slippageBpsIncFactor ?? 0)));
|
37
39
|
quoteResponse.slippageBps = finalPriceSlippageBps;
|
package/local/shared.ts
CHANGED
@@ -8,7 +8,7 @@ import {
|
|
8
8
|
VersionedTransaction,
|
9
9
|
PublicKey,
|
10
10
|
} from "@solana/web3.js";
|
11
|
-
import {
|
11
|
+
import { getSolanaRpcConnection } from "../src/utils/solanaUtils";
|
12
12
|
|
13
13
|
function loadSecretKey(keypairPath: string) {
|
14
14
|
const secretKey = JSON.parse(fs.readFileSync(keypairPath, "utf8"));
|
@@ -22,9 +22,10 @@ export function getSecretKey(keypairFilename: string = "id"): Uint8Array {
|
|
22
22
|
}
|
23
23
|
|
24
24
|
const keypair = Keypair.fromSecretKey(getSecretKey());
|
25
|
+
const [connection, _] = getSolanaRpcConnection(process.env.HELIUS_API_KEY ?? "");
|
25
26
|
|
26
27
|
async function createAndSendV0Tx(txInstructions: TransactionInstruction[]) {
|
27
|
-
let latestBlockhash = await
|
28
|
+
let latestBlockhash = await connection.getLatestBlockhash("finalized");
|
28
29
|
|
29
30
|
const messageV0 = new TransactionMessage({
|
30
31
|
payerKey: keypair.publicKey,
|
@@ -35,11 +36,11 @@ async function createAndSendV0Tx(txInstructions: TransactionInstruction[]) {
|
|
35
36
|
|
36
37
|
transaction.sign([keypair]);
|
37
38
|
|
38
|
-
const txid = await
|
39
|
+
const txid = await connection.sendTransaction(transaction, {
|
39
40
|
maxRetries: 5,
|
40
41
|
});
|
41
42
|
|
42
|
-
const confirmation = await
|
43
|
+
const confirmation = await connection.confirmTransaction({
|
43
44
|
signature: txid,
|
44
45
|
blockhash: latestBlockhash.blockhash,
|
45
46
|
lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
|
@@ -76,13 +77,13 @@ export async function updateLookupTable(
|
|
76
77
|
lookupTableAddress?: PublicKey
|
77
78
|
) {
|
78
79
|
let lookupTable = lookupTableAddress
|
79
|
-
? await
|
80
|
+
? await connection.getAddressLookupTable(lookupTableAddress)
|
80
81
|
: null;
|
81
82
|
if (lookupTable === null) {
|
82
83
|
const [createLutIx, addr] = AddressLookupTableProgram.createLookupTable({
|
83
84
|
authority: keypair.publicKey,
|
84
85
|
payer: keypair.publicKey,
|
85
|
-
recentSlot: await
|
86
|
+
recentSlot: await connection.getSlot({ commitment: "finalized" }),
|
86
87
|
});
|
87
88
|
lookupTableAddress = addr;
|
88
89
|
console.log("Lookup Table Address:", lookupTableAddress.toString());
|
package/package.json
CHANGED
@@ -347,9 +347,10 @@ export abstract class SolautoClient {
|
|
347
347
|
);
|
348
348
|
}
|
349
349
|
|
350
|
-
const addingReferredBy =
|
351
|
-
|
352
|
-
|
350
|
+
const addingReferredBy =
|
351
|
+
accountsToAdd.length === 1 &&
|
352
|
+
accountsToAdd[0].toString().toLowerCase() ===
|
353
|
+
this.referredBySupplyTa?.toString().toLowerCase();
|
353
354
|
|
354
355
|
if (tx.getInstructions().length > 0) {
|
355
356
|
this.log("Updating authority lookup table...");
|
@@ -632,8 +633,9 @@ export abstract class SolautoClient {
|
|
632
633
|
rebalanceStep: "A" | "B",
|
633
634
|
swapDetails: JupSwapDetails,
|
634
635
|
rebalanceType: SolautoRebalanceTypeArgs,
|
636
|
+
flashLoan?: FlashLoanDetails,
|
635
637
|
targetLiqUtilizationRateBps?: number,
|
636
|
-
limitGapBps?: number
|
638
|
+
limitGapBps?: number,
|
637
639
|
): TransactionBuilder;
|
638
640
|
|
639
641
|
async getFreshPositionState(): Promise<PositionState | undefined> {
|
@@ -11,10 +11,7 @@ import {
|
|
11
11
|
createSignerFromKeypair,
|
12
12
|
AccountMeta,
|
13
13
|
} from "@metaplex-foundation/umi";
|
14
|
-
import {
|
15
|
-
PublicKey,
|
16
|
-
SYSVAR_INSTRUCTIONS_PUBKEY,
|
17
|
-
} from "@solana/web3.js";
|
14
|
+
import { PublicKey, SYSVAR_INSTRUCTIONS_PUBKEY } from "@solana/web3.js";
|
18
15
|
import { SolautoClient, SolautoClientArgs } from "./solautoClient";
|
19
16
|
import { MarginfiTokenAccounts } from "../types/accounts";
|
20
17
|
import {
|
@@ -216,7 +213,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
216
213
|
marginfiGroup: publicKey(this.marginfiGroup),
|
217
214
|
marginfiAccount:
|
218
215
|
"publicKey" in this.marginfiAccount
|
219
|
-
? this.marginfiAccount as Signer
|
216
|
+
? (this.marginfiAccount as Signer)
|
220
217
|
: publicKey(this.marginfiAccount),
|
221
218
|
supplyMint: publicKey(this.supplyMint),
|
222
219
|
supplyBank: publicKey(this.marginfiSupplyBankAccounts.bank),
|
@@ -230,7 +227,9 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
230
227
|
settingParams: settingParams ?? null,
|
231
228
|
dca: dca ?? null,
|
232
229
|
},
|
233
|
-
marginfiAccountSeedIdx: !this.selfManaged
|
230
|
+
marginfiAccountSeedIdx: !this.selfManaged
|
231
|
+
? this.marginfiAccountSeedIdx
|
232
|
+
: null,
|
234
233
|
});
|
235
234
|
}
|
236
235
|
|
@@ -391,19 +390,28 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
391
390
|
rebalanceStep: "A" | "B",
|
392
391
|
swapDetails: JupSwapDetails,
|
393
392
|
rebalanceType: SolautoRebalanceTypeArgs,
|
393
|
+
flashLoan?: FlashLoanDetails,
|
394
394
|
targetLiqUtilizationRateBps?: number,
|
395
|
-
limitGapBps?: number
|
395
|
+
limitGapBps?: number,
|
396
396
|
): TransactionBuilder {
|
397
|
+
const inputIsSupply = swapDetails.inputMint.equals(this.supplyMint);
|
398
|
+
const outputIsSupply = swapDetails.outputMint.equals(this.supplyMint);
|
399
|
+
const needSupplyAccounts =
|
400
|
+
(inputIsSupply && rebalanceStep === "A") ||
|
401
|
+
(outputIsSupply && rebalanceStep === "B") ||
|
402
|
+
(inputIsSupply && flashLoan !== undefined && rebalanceStep == "B");
|
403
|
+
const needDebtAccounts =
|
404
|
+
(!inputIsSupply && rebalanceStep === "A") ||
|
405
|
+
(!outputIsSupply && rebalanceStep === "B") ||
|
406
|
+
(!inputIsSupply && flashLoan !== undefined && rebalanceStep == "B");
|
407
|
+
|
397
408
|
return marginfiRebalance(this.umi, {
|
398
409
|
signer: this.signer,
|
399
410
|
marginfiProgram: publicKey(MARGINFI_PROGRAM_ID),
|
400
411
|
ixsSysvar: publicKey(SYSVAR_INSTRUCTIONS_PUBKEY),
|
401
412
|
solautoFeesSupplyTa:
|
402
413
|
rebalanceStep === "B" ? publicKey(this.solautoFeesSupplyTa) : undefined,
|
403
|
-
authorityReferralState:
|
404
|
-
rebalanceStep === "B"
|
405
|
-
? publicKey(this.authorityReferralState)
|
406
|
-
: undefined,
|
414
|
+
authorityReferralState: publicKey(this.authorityReferralState),
|
407
415
|
referredBySupplyTa:
|
408
416
|
rebalanceStep === "B" && this.referredBySupplyTa
|
409
417
|
? publicKey(this.referredBySupplyTa)
|
@@ -423,18 +431,22 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
423
431
|
signerSupplyTa: this.selfManaged
|
424
432
|
? publicKey(this.signerSupplyTa)
|
425
433
|
: undefined,
|
426
|
-
vaultSupplyTa:
|
427
|
-
|
428
|
-
|
429
|
-
|
434
|
+
vaultSupplyTa: needSupplyAccounts
|
435
|
+
? publicKey(this.marginfiSupplyBankAccounts.liquidityVault)
|
436
|
+
: undefined,
|
437
|
+
supplyVaultAuthority: needSupplyAccounts
|
438
|
+
? publicKey(this.marginfiSupplyBankAccounts.vaultAuthority)
|
439
|
+
: undefined,
|
430
440
|
debtBank: publicKey(this.marginfiDebtBankAccounts.bank),
|
431
441
|
debtPriceOracle: publicKey(this.marginfiDebtBankAccounts.priceOracle),
|
432
442
|
positionDebtTa: publicKey(this.positionDebtTa),
|
433
443
|
signerDebtTa: this.selfManaged ? publicKey(this.signerDebtTa) : undefined,
|
434
|
-
vaultDebtTa:
|
435
|
-
|
436
|
-
|
437
|
-
|
444
|
+
vaultDebtTa: needDebtAccounts
|
445
|
+
? publicKey(this.marginfiDebtBankAccounts.liquidityVault)
|
446
|
+
: undefined,
|
447
|
+
debtVaultAuthority: needDebtAccounts
|
448
|
+
? publicKey(this.marginfiDebtBankAccounts.vaultAuthority)
|
449
|
+
: undefined,
|
438
450
|
rebalanceType,
|
439
451
|
targetLiqUtilizationRateBps: targetLiqUtilizationRateBps ?? null,
|
440
452
|
limitGapBps: limitGapBps ?? null,
|
@@ -43,7 +43,7 @@ export type MarginfiRebalanceInstructionAccounts = {
|
|
43
43
|
tokenProgram?: PublicKey | Pda;
|
44
44
|
ixsSysvar: PublicKey | Pda;
|
45
45
|
solautoFeesSupplyTa?: PublicKey | Pda;
|
46
|
-
authorityReferralState
|
46
|
+
authorityReferralState: PublicKey | Pda;
|
47
47
|
referredBySupplyTa?: PublicKey | Pda;
|
48
48
|
solautoPosition: PublicKey | Pda;
|
49
49
|
marginfiGroup: PublicKey | Pda;
|
@@ -206,7 +206,7 @@ export function marginfiRebalance(
|
|
206
206
|
},
|
207
207
|
supplyVaultAuthority: {
|
208
208
|
index: 17,
|
209
|
-
isWritable:
|
209
|
+
isWritable: false as boolean,
|
210
210
|
value: input.supplyVaultAuthority ?? null,
|
211
211
|
},
|
212
212
|
debtBank: {
|
@@ -236,7 +236,7 @@ export function marginfiRebalance(
|
|
236
236
|
},
|
237
237
|
debtVaultAuthority: {
|
238
238
|
index: 23,
|
239
|
-
isWritable:
|
239
|
+
isWritable: false as boolean,
|
240
240
|
value: input.debtVaultAuthority ?? null,
|
241
241
|
},
|
242
242
|
} satisfies ResolvedAccountsWithIndices;
|
@@ -103,7 +103,7 @@ async function transactionChoresBefore(
|
|
103
103
|
client: SolautoClient,
|
104
104
|
accountsGettingCreated: string[],
|
105
105
|
solautoActions?: SolautoAction[],
|
106
|
-
initiatingDcaIn?: bigint
|
106
|
+
initiatingDcaIn?: bigint
|
107
107
|
): Promise<TransactionBuilder> {
|
108
108
|
let chores = transactionBuilder();
|
109
109
|
|
@@ -233,8 +233,9 @@ export async function rebalanceChoresBefore(
|
|
233
233
|
}
|
234
234
|
|
235
235
|
const usesAccount = (key: PublicKey) =>
|
236
|
-
rebalanceInstructions
|
237
|
-
|
236
|
+
rebalanceInstructions.some((t) =>
|
237
|
+
t.keys.some((k) => toWeb3JsPublicKey(k.pubkey).equals(key))
|
238
|
+
);
|
238
239
|
|
239
240
|
const checkReferralSupplyTa =
|
240
241
|
client.referredBySupplyTa && usesAccount(client.referredBySupplyTa);
|
@@ -244,8 +245,10 @@ export async function rebalanceChoresBefore(
|
|
244
245
|
usesAccount(
|
245
246
|
(client as SolautoMarginfiClient).intermediaryMarginfiAccountPk
|
246
247
|
);
|
247
|
-
const checkSignerSupplyTa =
|
248
|
-
|
248
|
+
const checkSignerSupplyTa =
|
249
|
+
client.selfManaged && usesAccount(client.signerSupplyTa);
|
250
|
+
const checkSignerDebtTa =
|
251
|
+
client.selfManaged && usesAccount(client.signerSupplyTa);
|
249
252
|
|
250
253
|
const accountsNeeded = [
|
251
254
|
...[checkReferralSupplyTa ? client.referredBySupplyTa : PublicKey.default],
|
@@ -259,10 +262,15 @@ export async function rebalanceChoresBefore(
|
|
259
262
|
...[checkSignerDebtTa ? client.signerDebtTa : PublicKey.default],
|
260
263
|
];
|
261
264
|
|
262
|
-
const [
|
263
|
-
|
264
|
-
|
265
|
-
|
265
|
+
const [
|
266
|
+
referredBySupplyTa,
|
267
|
+
solautoFeesSupplyTa,
|
268
|
+
intermediaryMarginfiAccount,
|
269
|
+
signerSupplyTa,
|
270
|
+
signerDebtTa,
|
271
|
+
] = await client.umi.rpc.getAccounts(
|
272
|
+
accountsNeeded.map((x) => publicKey(x ?? PublicKey.default))
|
273
|
+
);
|
266
274
|
|
267
275
|
let chores = transactionBuilder();
|
268
276
|
|
@@ -297,7 +305,11 @@ export async function rebalanceChoresBefore(
|
|
297
305
|
);
|
298
306
|
}
|
299
307
|
|
300
|
-
if (
|
308
|
+
if (
|
309
|
+
checkSignerSupplyTa &&
|
310
|
+
!rpcAccountCreated(signerSupplyTa) &&
|
311
|
+
!accountsGettingCreated.includes(signerSupplyTa.publicKey.toString())
|
312
|
+
) {
|
301
313
|
client.log("Creating signer supply token account");
|
302
314
|
chores = chores.add(
|
303
315
|
createAssociatedTokenAccountUmiIx(
|
@@ -309,7 +321,11 @@ export async function rebalanceChoresBefore(
|
|
309
321
|
accountsGettingCreated.push(signerSupplyTa.publicKey.toString());
|
310
322
|
}
|
311
323
|
|
312
|
-
if (
|
324
|
+
if (
|
325
|
+
checkSignerDebtTa &&
|
326
|
+
!rpcAccountCreated(signerDebtTa) &&
|
327
|
+
!accountsGettingCreated.includes(signerDebtTa.publicKey.toString())
|
328
|
+
) {
|
313
329
|
client.log("Creating signer debt token account");
|
314
330
|
chores = chores.add(
|
315
331
|
createAssociatedTokenAccountUmiIx(
|
@@ -358,7 +374,7 @@ function getRebalanceInstructions(tx: TransactionBuilder): Instruction[] {
|
|
358
374
|
const discriminator = serializer.serialize({
|
359
375
|
limitGapBps: 0,
|
360
376
|
rebalanceType: SolautoRebalanceType.None,
|
361
|
-
targetLiqUtilizationRateBps: 0
|
377
|
+
targetLiqUtilizationRateBps: 0,
|
362
378
|
})[0];
|
363
379
|
const [data, _] = serializer.deserialize(x.data);
|
364
380
|
if (data.discriminator === discriminator) {
|
@@ -378,10 +394,9 @@ function getSolautoActions(tx: TransactionBuilder): SolautoAction[] {
|
|
378
394
|
try {
|
379
395
|
const serializer =
|
380
396
|
getMarginfiProtocolInteractionInstructionDataSerializer();
|
381
|
-
const discriminator = serializer
|
382
|
-
|
383
|
-
|
384
|
-
})[0];
|
397
|
+
const discriminator = serializer.serialize({
|
398
|
+
solautoAction: solautoAction("Deposit", [BigInt(0)]),
|
399
|
+
})[0];
|
385
400
|
const [data, _] = serializer.deserialize(x.data);
|
386
401
|
if (data.discriminator === discriminator) {
|
387
402
|
solautoActions?.push(data.solautoAction);
|
@@ -518,7 +533,7 @@ export async function getTransactionChores(
|
|
518
533
|
solautoActions,
|
519
534
|
client.livePositionUpdates.debtTaBalanceAdjustment > 0
|
520
535
|
? client.livePositionUpdates.debtTaBalanceAdjustment
|
521
|
-
: undefined
|
536
|
+
: undefined
|
522
537
|
),
|
523
538
|
await rebalanceChoresBefore(client, tx, accountsGettingCreated),
|
524
539
|
]);
|
@@ -576,7 +591,7 @@ export async function buildSolautoRebalanceTransaction(
|
|
576
591
|
setupInstructions,
|
577
592
|
tokenLedgerIx,
|
578
593
|
swapIx,
|
579
|
-
} = await getJupSwapTransaction(client.signer, swapDetails);
|
594
|
+
} = await getJupSwapTransaction(client.signer, swapDetails, attemptNum);
|
580
595
|
const flashLoan = getFlashLoanDetails(client, values, jupQuote);
|
581
596
|
|
582
597
|
let tx = transactionBuilder();
|
@@ -604,6 +619,7 @@ export async function buildSolautoRebalanceTransaction(
|
|
604
619
|
"A",
|
605
620
|
swapDetails,
|
606
621
|
rebalanceType,
|
622
|
+
flashLoan,
|
607
623
|
targetLiqUtilizationRateBps
|
608
624
|
),
|
609
625
|
]
|
@@ -613,6 +629,7 @@ export async function buildSolautoRebalanceTransaction(
|
|
613
629
|
"B",
|
614
630
|
swapDetails,
|
615
631
|
rebalanceType,
|
632
|
+
flashLoan,
|
616
633
|
targetLiqUtilizationRateBps
|
617
634
|
),
|
618
635
|
client.flashRepay(flashLoan),
|
@@ -626,6 +643,7 @@ export async function buildSolautoRebalanceTransaction(
|
|
626
643
|
"A",
|
627
644
|
swapDetails,
|
628
645
|
rebalanceType,
|
646
|
+
undefined,
|
629
647
|
targetLiqUtilizationRateBps
|
630
648
|
),
|
631
649
|
swapIx,
|
@@ -633,6 +651,7 @@ export async function buildSolautoRebalanceTransaction(
|
|
633
651
|
"B",
|
634
652
|
swapDetails,
|
635
653
|
rebalanceType,
|
654
|
+
undefined,
|
636
655
|
targetLiqUtilizationRateBps
|
637
656
|
),
|
638
657
|
]);
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import bs58 from "bs58";
|
2
2
|
import {
|
3
3
|
AddressLookupTableInput,
|
4
|
+
Instruction,
|
4
5
|
transactionBuilder,
|
5
6
|
TransactionBuilder,
|
6
7
|
} from "@metaplex-foundation/umi";
|
@@ -14,6 +15,7 @@ import {
|
|
14
15
|
retryWithExponentialBackoff,
|
15
16
|
} from "../utils/generalUtils";
|
16
17
|
import { getTransactionChores } from "./transactionUtils";
|
18
|
+
import { toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters";
|
17
19
|
// import { sendJitoBundledTransactions } from "../utils/jitoUtils";
|
18
20
|
|
19
21
|
class LookupTables {
|
@@ -45,7 +47,7 @@ class LookupTables {
|
|
45
47
|
this.cache.push(...additionalInputs);
|
46
48
|
}
|
47
49
|
|
48
|
-
return this.cache
|
50
|
+
return this.cache;
|
49
51
|
}
|
50
52
|
}
|
51
53
|
|
@@ -89,7 +91,7 @@ export class TransactionItem {
|
|
89
91
|
class TransactionSet {
|
90
92
|
constructor(
|
91
93
|
private client: SolautoClient,
|
92
|
-
|
94
|
+
public lookupTables: LookupTables,
|
93
95
|
public items: TransactionItem[] = []
|
94
96
|
) {}
|
95
97
|
|
@@ -210,8 +212,12 @@ export class TransactionsManager {
|
|
210
212
|
await this.lookupTables.getLutInputs(item.lookupTableAddresses)
|
211
213
|
);
|
212
214
|
if (!transaction.fitsInOneTransaction(this.client.umi)) {
|
213
|
-
|
214
|
-
|
215
|
+
// TODO: revert me
|
216
|
+
// throw new Error(
|
217
|
+
// `Transaction exceeds max transaction size (${transaction.getTransactionSize(this.client.umi)})`
|
218
|
+
// );
|
219
|
+
transactionSets.push(
|
220
|
+
new TransactionSet(this.client, this.lookupTables, [item])
|
215
221
|
);
|
216
222
|
} else {
|
217
223
|
let newSet = new TransactionSet(this.client, this.lookupTables, [item]);
|
@@ -246,9 +252,43 @@ export class TransactionsManager {
|
|
246
252
|
this.statusCallback?.(this.statuses);
|
247
253
|
}
|
248
254
|
|
255
|
+
// TODO remove me
|
256
|
+
async debugAccounts(itemSet: TransactionSet, tx: TransactionBuilder) {
|
257
|
+
const lutInputs = await itemSet.lookupTables.getLutInputs([]);
|
258
|
+
const lutAccounts = lutInputs.map((x) => x.addresses).flat();
|
259
|
+
const keys = tx
|
260
|
+
.getInstructions()
|
261
|
+
.map((x) => x.keys)
|
262
|
+
.flat();
|
263
|
+
for (const ix of tx.getInstructions()) {
|
264
|
+
const ixAccounts = ix.keys.map((x) => x.pubkey);
|
265
|
+
const accountsNotInLut = ixAccounts.filter(
|
266
|
+
(x) => !lutAccounts.includes(x)
|
267
|
+
);
|
268
|
+
console.log(
|
269
|
+
"Program",
|
270
|
+
ix.programId,
|
271
|
+
" data ",
|
272
|
+
ix.data.length,
|
273
|
+
ix.keys.filter((x) => lutAccounts.includes(x.pubkey)).length * 3
|
274
|
+
);
|
275
|
+
if (accountsNotInLut.length > 0) {
|
276
|
+
console.log("Accounts not in LUT:");
|
277
|
+
for (const key of accountsNotInLut) {
|
278
|
+
console.log(key.toString());
|
279
|
+
}
|
280
|
+
console.log(ix.keys.length);
|
281
|
+
}
|
282
|
+
}
|
283
|
+
}
|
284
|
+
|
249
285
|
async send() {
|
250
286
|
const updateLookupTable = await this.client.updateLookupTable();
|
251
|
-
if (
|
287
|
+
if (
|
288
|
+
updateLookupTable &&
|
289
|
+
updateLookupTable.updateLutTx.getInstructions().length > 0 &&
|
290
|
+
updateLookupTable?.needsToBeIsolated
|
291
|
+
) {
|
252
292
|
this.updateStatus("update lookup table", TransactionStatus.Processing);
|
253
293
|
await retryWithExponentialBackoff(
|
254
294
|
async (attemptNum) =>
|
@@ -365,6 +405,11 @@ export class TransactionsManager {
|
|
365
405
|
this.updateStatus(itemSet.name(), TransactionStatus.Skipped);
|
366
406
|
} else {
|
367
407
|
this.updateStatus(itemSet.name(), TransactionStatus.Processing);
|
408
|
+
|
409
|
+
if (this.client.localTest) {
|
410
|
+
await this.debugAccounts(itemSet, tx);
|
411
|
+
}
|
412
|
+
|
368
413
|
const txSig = await sendSingleOptimizedTransaction(
|
369
414
|
this.client.umi,
|
370
415
|
this.client.connection,
|
package/src/types/solauto.ts
CHANGED
@@ -2,7 +2,7 @@ import { PublicKey } from "@solana/web3.js";
|
|
2
2
|
import { LendingPlatform } from "../generated";
|
3
3
|
|
4
4
|
export interface SolautoPositionDetails {
|
5
|
-
publicKey
|
5
|
+
publicKey?: PublicKey;
|
6
6
|
authority: PublicKey;
|
7
7
|
positionId: number;
|
8
8
|
lendingPlatform: LendingPlatform;
|
@@ -3,6 +3,7 @@ import { MaybeRpcAccount, publicKey, Umi } from "@metaplex-foundation/umi";
|
|
3
3
|
import { PYTH_PRICE_FEED_IDS } from "../constants/pythConstants";
|
4
4
|
import { fromBaseUnit, toBaseUnit } from "./numberUtils";
|
5
5
|
import { PRICES } from "../constants/solautoConstants";
|
6
|
+
import { ResponseError } from "@jup-ag/api";
|
6
7
|
|
7
8
|
export function generateRandomU8(): number {
|
8
9
|
return Math.floor(Math.random() * 255 + 1);
|
@@ -120,7 +121,7 @@ export function retryWithExponentialBackoff<T>(
|
|
120
121
|
}
|
121
122
|
|
122
123
|
if (attemptNum < retries) {
|
123
|
-
console.log(error);
|
124
|
+
console.log(error.message);
|
124
125
|
setTimeout(() => {
|
125
126
|
console.log("Retrying...");
|
126
127
|
return attempt(attemptNum);
|
@@ -12,6 +12,7 @@ import {
|
|
12
12
|
QuoteResponse,
|
13
13
|
} from "@jup-ag/api";
|
14
14
|
import { getTokenAccount } from "./accountUtils";
|
15
|
+
import { retryWithExponentialBackoff } from "./generalUtils";
|
15
16
|
|
16
17
|
const jupApi = createJupiterApiClient();
|
17
18
|
|
@@ -49,21 +50,26 @@ export interface JupSwapTransaction {
|
|
49
50
|
|
50
51
|
export async function getJupSwapTransaction(
|
51
52
|
signer: Signer,
|
52
|
-
swapDetails: JupSwapDetails
|
53
|
+
swapDetails: JupSwapDetails,
|
54
|
+
attemptNum?: number
|
53
55
|
): Promise<JupSwapTransaction> {
|
54
56
|
console.log("Getting jup quote...");
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
57
|
+
const quoteResponse = await retryWithExponentialBackoff(
|
58
|
+
async () =>
|
59
|
+
await jupApi.quoteGet({
|
60
|
+
amount: Number(swapDetails.amount),
|
61
|
+
inputMint: swapDetails.inputMint.toString(),
|
62
|
+
outputMint: swapDetails.outputMint.toString(),
|
63
|
+
swapMode: swapDetails.exactOut
|
64
|
+
? "ExactOut"
|
65
|
+
: swapDetails.exactIn
|
66
|
+
? "ExactIn"
|
67
|
+
: undefined,
|
68
|
+
slippageBps: 10,
|
69
|
+
maxAccounts: 60,
|
70
|
+
}),
|
71
|
+
3
|
72
|
+
);
|
67
73
|
|
68
74
|
const finalPriceSlippageBps = Math.round(
|
69
75
|
Math.max(
|
@@ -24,7 +24,7 @@ describe("Solauto Marginfi tests", async () => {
|
|
24
24
|
|
25
25
|
const payForTransactions = false;
|
26
26
|
const useJitoBundle = false;
|
27
|
-
const positionId =
|
27
|
+
const positionId = 0;
|
28
28
|
|
29
29
|
it("open - deposit - borrow - rebalance to 0 - withdraw - close", async () => {
|
30
30
|
const client = new SolautoMarginfiClient(process.env.HELIUS_API_KEY!, true);
|
@@ -37,11 +37,11 @@ describe("Solauto Marginfi tests", async () => {
|
|
37
37
|
{
|
38
38
|
signer,
|
39
39
|
positionId,
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
40
|
+
marginfiAccount: new PublicKey(
|
41
|
+
"4nNvUXF5YqHFcH2nGweSiuvy1ct7V5FXfoCLKFYUN36z"
|
42
|
+
),
|
43
|
+
supplyMint: NATIVE_MINT,
|
44
|
+
debtMint: new PublicKey(USDC_MINT),
|
45
45
|
}
|
46
46
|
);
|
47
47
|
|