@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.
Files changed (32) hide show
  1. package/dist/clients/solautoClient.d.ts +1 -1
  2. package/dist/clients/solautoClient.d.ts.map +1 -1
  3. package/dist/clients/solautoClient.js +3 -3
  4. package/dist/clients/solautoMarginfiClient.d.ts +1 -1
  5. package/dist/clients/solautoMarginfiClient.d.ts.map +1 -1
  6. package/dist/clients/solautoMarginfiClient.js +25 -9
  7. package/dist/generated/instructions/marginfiRebalance.d.ts +1 -1
  8. package/dist/generated/instructions/marginfiRebalance.d.ts.map +1 -1
  9. package/dist/generated/instructions/marginfiRebalance.js +2 -2
  10. package/dist/transactions/transactionUtils.d.ts.map +1 -1
  11. package/dist/transactions/transactionUtils.js +15 -13
  12. package/dist/transactions/transactionsManager.d.ts +22 -1
  13. package/dist/transactions/transactionsManager.d.ts.map +1 -1
  14. package/dist/transactions/transactionsManager.js +33 -3
  15. package/dist/types/solauto.d.ts +1 -1
  16. package/dist/types/solauto.d.ts.map +1 -1
  17. package/dist/utils/generalUtils.d.ts.map +1 -1
  18. package/dist/utils/generalUtils.js +1 -1
  19. package/dist/utils/jupiterUtils.d.ts +1 -1
  20. package/dist/utils/jupiterUtils.d.ts.map +1 -1
  21. package/dist/utils/jupiterUtils.js +6 -4
  22. package/local/shared.ts +7 -6
  23. package/package.json +1 -1
  24. package/src/clients/solautoClient.ts +6 -4
  25. package/src/clients/solautoMarginfiClient.ts +31 -19
  26. package/src/generated/instructions/marginfiRebalance.ts +3 -3
  27. package/src/transactions/transactionUtils.ts +37 -18
  28. package/src/transactions/transactionsManager.ts +50 -5
  29. package/src/types/solauto.ts +1 -1
  30. package/src/utils/generalUtils.ts +2 -1
  31. package/src/utils/jupiterUtils.ts +19 -13
  32. 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":"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"}
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;IA2DD,uBAAuB,IAAI,yBAAyB,GAAG,SAAS;IAOhE,wBAAwB,IAAI,WAAW,GAAG,SAAS;IAOnD,sBAAsB,IAAI,kBAAkB;IAiB5C,mBAAmB,IAAI,kBAAkB;IAmBzC,YAAY,CACV,aAAa,CAAC,EAAE,gCAAgC,EAChD,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IAuBrB,gBAAgB,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB;IA2DlE,eAAe,IAAI,kBAAkB;IAWrC,WAAW,IAAI,kBAAkB;IA4BjC,QAAQ,CAAC,OAAO,IAAI,kBAAkB;IAEtC,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAuFhE,QAAQ,CAAC,WAAW,CAClB,gBAAgB,EAAE,gBAAgB,EAClC,uBAAuB,EAAE,SAAS,GACjC,kBAAkB;IAErB,QAAQ,CAAC,UAAU,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,kBAAkB;IAE3E,QAAQ,CAAC,SAAS,CAChB,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;IAEf,qBAAqB,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;CAYlE"}
@@ -172,9 +172,9 @@ class SolautoClient {
172
172
  addresses: accountsToAdd,
173
173
  })));
174
174
  }
175
- const addingReferredBy = accountsToAdd.length === 1;
176
- // && accountsToAdd[0].toString().toLowerCase() ===
177
- // this.referredBySupplyTa?.toString().toLowerCase();
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,EACL,SAAS,EAEV,MAAM,iBAAiB,CAAC;AACzB,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;IA2C9B,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,2BAA2B,CAAC,EAAE,MAAM,EACpC,WAAW,CAAC,EAAE,MAAM,GACnB,kBAAkB;IAgDrB,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"}
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 ? this.marginfiAccountSeedIdx : null,
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: rebalanceStep === "B"
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: (0, umi_1.publicKey)(this.marginfiSupplyBankAccounts.liquidityVault),
274
- supplyVaultAuthority: (0, umi_1.publicKey)(this.marginfiSupplyBankAccounts.vaultAuthority),
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: (0, umi_1.publicKey)(this.marginfiDebtBankAccounts.liquidityVault),
280
- debtVaultAuthority: (0, umi_1.publicKey)(this.marginfiDebtBankAccounts.vaultAuthority),
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?: PublicKey | Pda;
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,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IACzC,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"}
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: true,
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: true,
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,CAgG7B;AAmLD,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,CA4GA;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"}
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 && !(0, generalUtils_1.rpcAccountCreated)(signerSupplyTa) && !accountsGettingCreated.includes(signerSupplyTa.publicKey.toString())) {
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 && !(0, generalUtils_1.rpcAccountCreated)(signerDebtTa) && !accountsGettingCreated.includes(signerDebtTa.publicKey.toString())) {
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,EAGL,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAKzD,OAAO,EACL,aAAa,EAEd,MAAM,uBAAuB,CAAC;AAqC/B,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;AAgFD,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;IAsCrC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,MAAM;IAgB9D,IAAI;CAgJX"}
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.filter((x) => addresses.includes(x.publicKey.toString()));
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
- throw new Error(`Transaction exceeds max transaction size (${transaction.getTransactionSize(this.client.umi)})`);
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 && updateLookupTable?.needsToBeIsolated) {
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
  }
@@ -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: 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;IACrB,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
+ {"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;AAK3E,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"}
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;AAKrB,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,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CAkE7B"}
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 { CONNECTION } from "../src/constants/solautoConstants";
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 CONNECTION.getLatestBlockhash("finalized");
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 CONNECTION.sendTransaction(transaction, {
39
+ const txid = await connection.sendTransaction(transaction, {
39
40
  maxRetries: 5,
40
41
  });
41
42
 
42
- const confirmation = await CONNECTION.confirmTransaction({
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 CONNECTION.getAddressLookupTable(lookupTableAddress)
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 CONNECTION.getSlot({ commitment: "finalized" }),
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haven-fi/solauto-sdk",
3
- "version": "1.0.39",
3
+ "version": "1.0.41",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "description": "Typescript SDK for the Solauto program on the Solana blockchain",
@@ -347,9 +347,10 @@ export abstract class SolautoClient {
347
347
  );
348
348
  }
349
349
 
350
- const addingReferredBy = accountsToAdd.length === 1;
351
- // && accountsToAdd[0].toString().toLowerCase() ===
352
- // this.referredBySupplyTa?.toString().toLowerCase();
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 ? this.marginfiAccountSeedIdx : null,
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: publicKey(this.marginfiSupplyBankAccounts.liquidityVault),
427
- supplyVaultAuthority: publicKey(
428
- this.marginfiSupplyBankAccounts.vaultAuthority
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: publicKey(this.marginfiDebtBankAccounts.liquidityVault),
435
- debtVaultAuthority: publicKey(
436
- this.marginfiDebtBankAccounts.vaultAuthority
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?: PublicKey | Pda;
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: true as boolean,
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: true as boolean,
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
- .some((t) => t.keys.some((k) => toWeb3JsPublicKey(k.pubkey).equals(key)));
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 = client.selfManaged && usesAccount(client.signerSupplyTa);
248
- const checkSignerDebtTa = client.selfManaged && usesAccount(client.signerSupplyTa);
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 [referredBySupplyTa, solautoFeesSupplyTa, intermediaryMarginfiAccount, signerSupplyTa, signerDebtTa] =
263
- await client.umi.rpc.getAccounts(
264
- accountsNeeded.map((x) => publicKey(x ?? PublicKey.default))
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 (checkSignerSupplyTa && !rpcAccountCreated(signerSupplyTa) && !accountsGettingCreated.includes(signerSupplyTa.publicKey.toString())) {
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 (checkSignerDebtTa && !rpcAccountCreated(signerDebtTa) && !accountsGettingCreated.includes(signerDebtTa.publicKey.toString())) {
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
- .serialize({
383
- solautoAction: solautoAction("Deposit", [BigInt(0)]),
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.filter((x) => addresses.includes(x.publicKey.toString()));
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
- private lookupTables: LookupTables,
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
- throw new Error(
214
- `Transaction exceeds max transaction size (${transaction.getTransactionSize(this.client.umi)})`
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 (updateLookupTable && updateLookupTable?.needsToBeIsolated) {
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,
@@ -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: 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
- const quoteResponse = await jupApi.quoteGet({
57
- amount: Number(swapDetails.amount),
58
- inputMint: swapDetails.inputMint.toString(),
59
- outputMint: swapDetails.outputMint.toString(),
60
- swapMode: swapDetails.exactOut
61
- ? "ExactOut"
62
- : swapDetails.exactIn
63
- ? "ExactIn"
64
- : undefined,
65
- slippageBps: 10
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 = 1;
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
- // marginfiAccount: new PublicKey(
41
- // "4nNvUXF5YqHFcH2nGweSiuvy1ct7V5FXfoCLKFYUN36z"
42
- // ),
43
- // supplyMint: NATIVE_MINT,
44
- // debtMint: new PublicKey(USDC_MINT),
40
+ marginfiAccount: new PublicKey(
41
+ "4nNvUXF5YqHFcH2nGweSiuvy1ct7V5FXfoCLKFYUN36z"
42
+ ),
43
+ supplyMint: NATIVE_MINT,
44
+ debtMint: new PublicKey(USDC_MINT),
45
45
  }
46
46
  );
47
47