@haven-fi/solauto-sdk 1.0.662 → 1.0.664

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"flProviderAggregator.d.ts","sourceRoot":"","sources":["../../../src/services/flashLoans/flProviderAggregator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,qBAAa,oBAAqB,SAAQ,cAAc;IACtD,OAAO,CAAC,kBAAkB,CAAsB;gBAG9C,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,SAAS,EACnB,UAAU,CAAC,EAAE,UAAU;IAanB,UAAU;IAMV,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAIvD,YAAY,IAAI,MAAM,EAAE;IAKxB,gBAAgB,IAAI,SAAS,EAAE;IAS/B,OAAO,CAAC,UAAU;IAKlB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAI7C,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM;IAI9D,WAAW,CACT,SAAS,EAAE,gBAAgB,EAC3B,gBAAgB,EAAE,SAAS,GAC1B,kBAAkB;IAOrB,UAAU,CAAC,SAAS,EAAE,gBAAgB,GAAG,kBAAkB;CAG5D"}
1
+ {"version":3,"file":"flProviderAggregator.d.ts","sourceRoot":"","sources":["../../../src/services/flashLoans/flProviderAggregator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,qBAAa,oBAAqB,SAAQ,cAAc;IACtD,OAAO,CAAC,kBAAkB,CAAsB;gBAG9C,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,SAAS,EACnB,UAAU,CAAC,EAAE,UAAU;IAanB,UAAU;IAMV,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAIvD,YAAY,IAAI,MAAM,EAAE;IAKxB,gBAAgB,IAAI,SAAS,EAAE;IAS/B,OAAO,CAAC,UAAU;IAKlB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAI7C,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM;IAI9D,WAAW,CACT,SAAS,EAAE,gBAAgB,EAC3B,gBAAgB,EAAE,SAAS,GAC1B,kBAAkB;IAOrB,UAAU,CAAC,SAAS,EAAE,gBAAgB,GAAG,kBAAkB;CAK5D"}
@@ -9,6 +9,8 @@ export declare class MarginfiFlProvider extends FlProviderBase {
9
9
  private debtBankLiquiditySource;
10
10
  private supplyImfiAccount;
11
11
  private debtImfiAccount;
12
+ private supplyRemainingAccounts;
13
+ private debtRemainingAccounts;
12
14
  initialize(): Promise<void>;
13
15
  private setAvailableBanks;
14
16
  private setIntermediaryAccount;
@@ -1 +1 @@
1
- {"version":3,"file":"marginfiFlProvider.d.ts","sourceRoot":"","sources":["../../../src/services/flashLoans/marginfiFlProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAML,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAclC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAgBlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ5C,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,OAAO,CAAC,wBAAwB,CAAqB;IACrD,OAAO,CAAC,yBAAyB,CAAQ;IACzC,OAAO,CAAC,uBAAuB,CAAQ;IACvC,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,eAAe,CAAe;IAEhC,UAAU;YAiBF,iBAAiB;IA6C/B,OAAO,CAAC,sBAAsB;IA0CxB,sBAAsB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAyC3D,gBAAgB,IAAI,SAAS,EAAE;IAY/B,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,WAAW;IAMnB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAI7C,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM;IAc9D,WAAW,CACT,SAAS,EAAE,gBAAgB,EAC3B,gBAAgB,EAAE,SAAS,GAC1B,kBAAkB;IAoCrB,UAAU,CAAC,SAAS,EAAE,gBAAgB,GAAG,kBAAkB;IA0E3D,YAAY,CACV,eAAe,EAAE,SAAS,EAC1B,IAAI,EAAE,SAAS,EACf,aAAa,EAAE,SAAS;CAW3B"}
1
+ {"version":3,"file":"marginfiFlProvider.d.ts","sourceRoot":"","sources":["../../../src/services/flashLoans/marginfiFlProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAML,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAclC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAiBlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ5C,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,OAAO,CAAC,wBAAwB,CAAqB;IACrD,OAAO,CAAC,yBAAyB,CAAQ;IACzC,OAAO,CAAC,uBAAuB,CAAQ;IAEvC,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,uBAAuB,CAAiB;IAChD,OAAO,CAAC,qBAAqB,CAAiB;IAExC,UAAU;YAiBF,iBAAiB;YA6CjB,sBAAsB;IAsD9B,sBAAsB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAyC3D,gBAAgB,IAAI,SAAS,EAAE;IAY/B,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,WAAW;IAMnB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAI7C,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM;IAc9D,WAAW,CACT,SAAS,EAAE,gBAAgB,EAC3B,gBAAgB,EAAE,SAAS,GAC1B,kBAAkB;IAoCrB,UAAU,CAAC,SAAS,EAAE,gBAAgB,GAAG,kBAAkB;IAgD3D,YAAY,CACV,eAAe,EAAE,SAAS,EAC1B,IAAI,EAAE,SAAS,EACf,aAAa,EAAE,SAAS;CAW3B"}
@@ -15,11 +15,11 @@ class MarginfiFlProvider extends flProviderBase_1.FlProviderBase {
15
15
  this.existingMarginfiAccounts = await (0, utils_1.getEmptyMarginfiAccountsByAuthority)(this.umi, (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey));
16
16
  if (this.liquidityBank(generated_1.TokenType.Supply).group.toString() !==
17
17
  this.liquidityBank(generated_1.TokenType.Debt).group.toString()) {
18
- this.setIntermediaryAccount([generated_1.TokenType.Supply]);
19
- this.setIntermediaryAccount([generated_1.TokenType.Debt]);
18
+ await this.setIntermediaryAccount([generated_1.TokenType.Supply]);
19
+ await this.setIntermediaryAccount([generated_1.TokenType.Debt]);
20
20
  }
21
21
  else {
22
- this.setIntermediaryAccount([generated_1.TokenType.Supply, generated_1.TokenType.Debt]);
22
+ await this.setIntermediaryAccount([generated_1.TokenType.Supply, generated_1.TokenType.Debt]);
23
23
  }
24
24
  }
25
25
  async setAvailableBanks() {
@@ -52,7 +52,7 @@ class MarginfiFlProvider extends flProviderBase_1.FlProviderBase {
52
52
  this.supplyBankLiquiditySource = supplyBanks[0][1];
53
53
  this.debtBankLiquiditySource = debtBanks[0][1];
54
54
  }
55
- setIntermediaryAccount(sources) {
55
+ async setIntermediaryAccount(sources) {
56
56
  const compatibleMarginfiAccounts = this.existingMarginfiAccounts.filter((x) => x.group.toString() == this.liquidityBank(sources[0]).group);
57
57
  const signer = compatibleMarginfiAccounts.length > 0
58
58
  ? undefined
@@ -66,6 +66,9 @@ class MarginfiFlProvider extends flProviderBase_1.FlProviderBase {
66
66
  if (signer) {
67
67
  this.flSigners.push(signer);
68
68
  }
69
+ const remainingAccounts = accountData
70
+ ? (await Promise.all(accountData.lendingAccount.balances.map((balance) => (0, utils_1.getRemainingAccountsForMarginfiHealthCheck)(this.umi, balance)))).flat()
71
+ : [];
69
72
  for (const s of sources) {
70
73
  const data = {
71
74
  signer,
@@ -75,9 +78,11 @@ class MarginfiFlProvider extends flProviderBase_1.FlProviderBase {
75
78
  const supply = s === generated_1.TokenType.Supply;
76
79
  if (supply) {
77
80
  this.supplyImfiAccount = data;
81
+ this.supplyRemainingAccounts = remainingAccounts;
78
82
  }
79
83
  else {
80
84
  this.debtImfiAccount = data;
85
+ this.debtRemainingAccounts = remainingAccounts;
81
86
  }
82
87
  (0, utils_1.consoleLog)(`${supply ? "Supply" : "Debt"} iMfi account:`, accountPk.toString());
83
88
  }
@@ -172,36 +177,14 @@ class MarginfiFlProvider extends flProviderBase_1.FlProviderBase {
172
177
  const associatedBankAccs = (0, utils_1.findMarginfiAccounts)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(bank.publicKey));
173
178
  const marginfiGroup = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.liquidityBank(flashLoan.liquiditySource).group);
174
179
  const iMfiAccount = this.iMfiAccount(flashLoan.liquiditySource);
175
- const remainingAccounts = [];
176
- let flBankHadPrevBalance = false;
177
- if (iMfiAccount?.accountData) {
178
- iMfiAccount.accountData.lendingAccount.balances.forEach(async (x) => {
179
- if (x.active) {
180
- if (x.bankPk.toString() === bank.publicKey.toString()) {
181
- flBankHadPrevBalance = true;
182
- }
183
- const priceOracle = (0, umi_1.publicKey)(await (0, utils_1.getMarginfiPriceOracle)(this.umi, {
184
- pk: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(x.bankPk),
185
- }));
186
- remainingAccounts.push(...[
187
- {
188
- pubkey: x.bankPk,
189
- isSigner: false,
190
- isWritable: false,
191
- },
192
- {
193
- pubkey: priceOracle,
194
- isSigner: false,
195
- isWritable: false,
196
- },
197
- ]);
198
- }
199
- });
200
- }
180
+ const remainingAccounts = flashLoan.liquiditySource === generated_1.TokenType.Supply
181
+ ? this.supplyRemainingAccounts
182
+ : this.debtRemainingAccounts;
183
+ let iMfiAccountHadPrevFlBalance = remainingAccounts.find((x) => x.pubkey.toString() === bank.publicKey.toString());
201
184
  return (0, umi_1.transactionBuilder)()
202
185
  .add((0, marginfi_sdk_1.lendingAccountRepay)(this.umi, {
203
186
  amount: flashLoan.baseUnitAmount,
204
- repayAll: !flBankHadPrevBalance,
187
+ repayAll: !iMfiAccountHadPrevFlBalance,
205
188
  bank: bank.publicKey,
206
189
  bankLiquidityVault: (0, umi_1.publicKey)(associatedBankAccs.liquidityVault),
207
190
  marginfiAccount: (0, umi_1.publicKey)(iMfiAccount.accountPk),
@@ -1 +1 @@
1
- {"version":3,"file":"solautoClient.d.ts","sourceRoot":"","sources":["../../../src/services/solauto/solautoClient.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AACxC,OAAO,EAA6B,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EACL,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,gCAAgC,EAEhC,sBAAsB,EAGvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAML,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,iBAAkB,SAAQ,wBAAwB;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,8BAAsB,aAAc,SAAQ,oBAAoB;IACvD,eAAe,EAAG,eAAe,CAAC;IAClC,KAAK,EAAG,UAAU,CAAC;IAEnB,SAAS,EAAG,SAAS,CAAC;IAEtB,GAAG,EAAG,iBAAiB,CAAC;IAExB,gBAAgB,EAAG,SAAS,CAAC;IAC7B,cAAc,EAAG,SAAS,CAAC;IAE3B,cAAc,EAAG,SAAS,CAAC;IAC3B,YAAY,EAAG,SAAS,CAAC;IAEzB,mBAAmB,EAAG,SAAS,CAAC;IAChC,iBAAiB,EAAG,SAAS,CAAC;IAE9B,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAEhC,UAAU,EAAG,oBAAoB,CAAC;IAClC,cAAc,EAAE,cAAc,CAAwB;IAE7D,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,iBAAiB,CAAqB;IAExC,UAAU,CAAC,IAAI,EAAE,iBAAiB;IA+ExC,kBAAkB,IAAI,SAAS,GAAG,SAAS;IAO3C,gBAAgB,IAAI,SAAS,GAAG,SAAS;IAOnC,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO;IAkB1C,mBAAmB,IAAI,MAAM,EAAE;IAS/B,gBAAgB,IAAI,SAAS,EAAE;IAezB,iCAAiC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAUzD,iBAAiB,IAAI,OAAO,CAC9B;QACE,EAAE,EAAE,kBAAkB,CAAC;QACvB,GAAG,EAAE,OAAO,CAAC;QACb,aAAa,EAAE,SAAS,EAAE,CAAC;KAC5B,GACD,SAAS,CACZ;IAgEK,cAAc,IAAI,OAAO,CAAC;QAC9B,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IAgBF,cAAc,CACZ,QAAQ,CAAC,EAAE,gCAAgC,EAC3C,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IA0BrB,gBAAgB,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB;IAsDlE,QAAQ,CAAC,eAAe,IAAI,kBAAkB;IAE9C,WAAW,IAAI,kBAAkB;IAgCjC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,kBAAkB;IAE5D,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAqFlE,QAAQ,CAAC,WAAW,CAClB,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,gBAAgB,GACrB,kBAAkB;CACtB"}
1
+ {"version":3,"file":"solautoClient.d.ts","sourceRoot":"","sources":["../../../src/services/solauto/solautoClient.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AACxC,OAAO,EAA6B,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EACL,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,gCAAgC,EAEhC,sBAAsB,EAGvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAML,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,iBAAkB,SAAQ,wBAAwB;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,8BAAsB,aAAc,SAAQ,oBAAoB;IACvD,eAAe,EAAG,eAAe,CAAC;IAClC,KAAK,EAAG,UAAU,CAAC;IAEnB,SAAS,EAAG,SAAS,CAAC;IAEtB,GAAG,EAAG,iBAAiB,CAAC;IAExB,gBAAgB,EAAG,SAAS,CAAC;IAC7B,cAAc,EAAG,SAAS,CAAC;IAE3B,cAAc,EAAG,SAAS,CAAC;IAC3B,YAAY,EAAG,SAAS,CAAC;IAEzB,mBAAmB,EAAG,SAAS,CAAC;IAChC,iBAAiB,EAAG,SAAS,CAAC;IAE9B,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAEhC,UAAU,EAAG,oBAAoB,CAAC;IAClC,cAAc,EAAE,cAAc,CAAwB;IAE7D,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,iBAAiB,CAAqB;IAExC,UAAU,CAAC,IAAI,EAAE,iBAAiB;IA4ExC,kBAAkB,IAAI,SAAS,GAAG,SAAS;IAO3C,gBAAgB,IAAI,SAAS,GAAG,SAAS;IAOnC,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO;IAkB1C,mBAAmB,IAAI,MAAM,EAAE;IAS/B,gBAAgB,IAAI,SAAS,EAAE;IAezB,iCAAiC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAUzD,iBAAiB,IAAI,OAAO,CAC9B;QACE,EAAE,EAAE,kBAAkB,CAAC;QACvB,GAAG,EAAE,OAAO,CAAC;QACb,aAAa,EAAE,SAAS,EAAE,CAAC;KAC5B,GACD,SAAS,CACZ;IAgEK,cAAc,IAAI,OAAO,CAAC;QAC9B,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IAgBF,cAAc,CACZ,QAAQ,CAAC,EAAE,gCAAgC,EAC3C,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IA0BrB,gBAAgB,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB;IAsDlE,QAAQ,CAAC,eAAe,IAAI,kBAAkB;IAE9C,WAAW,IAAI,kBAAkB;IAgCjC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,kBAAkB;IAE5D,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAqFlE,QAAQ,CAAC,WAAW,CAClB,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,gBAAgB,GACrB,kBAAkB;CACtB"}
@@ -19,9 +19,6 @@ class SolautoClient extends referralStateManager_1.ReferralStateManager {
19
19
  async initialize(args) {
20
20
  await super.initialize(args);
21
21
  const positionId = args.positionId ?? 0;
22
- if (positionId === 0 && !args.lpUserAccount) {
23
- throw new Error("Self managed position is missing arguments");
24
- }
25
22
  this.pos = await (0, solautoPosition_1.getOrCreatePositionEx)(this.umi, this.authority, positionId, this.programId, {
26
23
  supplyMint: args.supplyMint,
27
24
  debtMint: args.debtMint,
@@ -1,5 +1,5 @@
1
1
  import { PublicKey } from "@solana/web3.js";
2
- import { Signer, TransactionBuilder } from "@metaplex-foundation/umi";
2
+ import { Signer, TransactionBuilder, AccountMeta } from "@metaplex-foundation/umi";
3
3
  import { MarginfiAssetAccounts, RebalanceDetails } from "../../types";
4
4
  import { MarginfiProgramAccounts } from "../../constants";
5
5
  import { DCASettingsInpArgs, LendingPlatform, PriceType, RebalanceStep, SolautoActionArgs, SolautoSettingsParametersInpArgs } from "../../generated";
@@ -9,6 +9,7 @@ export declare class SolautoMarginfiClient extends SolautoClient {
9
9
  mfiAccounts: MarginfiProgramAccounts;
10
10
  marginfiAccount: PublicKey | Signer;
11
11
  marginfiAccountPk: PublicKey;
12
+ healthCheckRemainingAccounts?: AccountMeta[];
12
13
  marginfiGroup: PublicKey;
13
14
  marginfiSupplyAccounts: MarginfiAssetAccounts;
14
15
  marginfiDebtAccounts: MarginfiAssetAccounts;
@@ -1 +1 @@
1
- {"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../../src/services/solauto/solautoMarginfiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EACL,MAAM,EACN,kBAAkB,EAInB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAuB,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EACL,kBAAkB,EAClB,eAAe,EAEf,SAAS,EAET,aAAa,EACb,iBAAiB,EAEjB,gCAAgC,EAOjC,MAAM,iBAAiB,CAAC;AAgBzB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEnE,qBAAa,qBAAsB,SAAQ,aAAa;IAC/C,eAAe,kBAA4B;IAE3C,WAAW,EAAG,uBAAuB,CAAC;IAEtC,eAAe,EAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,EAAG,SAAS,CAAC;IAC9B,aAAa,EAAG,SAAS,CAAC;IAE1B,sBAAsB,EAAG,qBAAqB,CAAC;IAC/C,oBAAoB,EAAG,qBAAqB,CAAC;IAE7C,iBAAiB,EAAG,SAAS,CAAC;IAC9B,eAAe,EAAG,SAAS,CAAC;IAE7B,UAAU,CAAC,IAAI,EAAE,iBAAiB;IAiExC,mBAAmB,IAAI,MAAM,EAAE;IAO/B,gBAAgB,IAAI,SAAS,EAAE;IAI/B,yBAAyB,CAAC,eAAe,EAAE,MAAM,GAAG,kBAAkB;IAStE,cAAc,CACZ,QAAQ,CAAC,EAAE,gCAAgC,EAC3C,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IAMrB,OAAO,CAAC,sBAAsB;IA0C9B,eAAe,IAAI,kBAAkB;IAYrC,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,kBAAkB;IAenD,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAUlE,OAAO,CAAC,6BAA6B;IAmErC,OAAO,CAAC,oCAAoC;IA0D5C,WAAW,CACT,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,gBAAgB,GACrB,kBAAkB;CA0EtB"}
1
+ {"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../../src/services/solauto/solautoMarginfiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EACL,MAAM,EACN,kBAAkB,EAIlB,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAuB,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EACL,kBAAkB,EAClB,eAAe,EAEf,SAAS,EAET,aAAa,EACb,iBAAiB,EAEjB,gCAAgC,EAOjC,MAAM,iBAAiB,CAAC;AAoBzB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAMnE,qBAAa,qBAAsB,SAAQ,aAAa;IAC/C,eAAe,kBAA4B;IAE3C,WAAW,EAAG,uBAAuB,CAAC;IAEtC,eAAe,EAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,EAAG,SAAS,CAAC;IAC9B,4BAA4B,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7C,aAAa,EAAG,SAAS,CAAC;IAE1B,sBAAsB,EAAG,qBAAqB,CAAC;IAC/C,oBAAoB,EAAG,qBAAqB,CAAC;IAE7C,iBAAiB,EAAG,SAAS,CAAC;IAC9B,eAAe,EAAG,SAAS,CAAC;IAE7B,UAAU,CAAC,IAAI,EAAE,iBAAiB;IA6ExC,mBAAmB,IAAI,MAAM,EAAE;IAO/B,gBAAgB,IAAI,SAAS,EAAE;IAI/B,yBAAyB,CAAC,eAAe,EAAE,MAAM,GAAG,kBAAkB;IAStE,cAAc,CACZ,QAAQ,CAAC,EAAE,gCAAgC,EAC3C,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IAMrB,OAAO,CAAC,sBAAsB;IA0C9B,eAAe,IAAI,kBAAkB;IAYrC,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,kBAAkB;IAenD,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAUlE,OAAO,CAAC,6BAA6B;IAiFrC,OAAO,CAAC,oCAAoC;IA0D5C,WAAW,CACT,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,gBAAgB,GACrB,kBAAkB;CA4EtB"}
@@ -9,6 +9,9 @@ const generated_1 = require("../../generated");
9
9
  const utils_1 = require("../../utils");
10
10
  const marginfi_sdk_1 = require("../../marginfi-sdk");
11
11
  const solautoClient_1 = require("./solautoClient");
12
+ function isSigner(account) {
13
+ return "publicKey" in account;
14
+ }
12
15
  class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
13
16
  constructor() {
14
17
  super(...arguments);
@@ -38,13 +41,16 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
38
41
  : (0, umi_1.createSignerFromKeypair)(this.umi, this.umi.eddsa.generateKeypair());
39
42
  }
40
43
  }
41
- this.marginfiAccountPk =
42
- "publicKey" in this.marginfiAccount
43
- ? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.marginfiAccount.publicKey)
44
- : this.marginfiAccount;
45
- if ("publicKey" in this.marginfiAccount) {
44
+ this.marginfiAccountPk = isSigner(this.marginfiAccount)
45
+ ? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.marginfiAccount.publicKey)
46
+ : this.marginfiAccount;
47
+ if (isSigner(this.marginfiAccount)) {
46
48
  this.otherSigners.push(this.marginfiAccount);
47
49
  }
50
+ else if (this.pos.selfManaged) {
51
+ const accountData = await (0, marginfi_sdk_1.fetchMarginfiAccount)(this.umi, (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(this.marginfiAccount));
52
+ this.healthCheckRemainingAccounts = (await Promise.all(accountData.lendingAccount.balances.map((balance) => (0, utils_1.getRemainingAccountsForMarginfiHealthCheck)(this.umi, balance)))).flat();
53
+ }
48
54
  this.marginfiSupplyAccounts =
49
55
  this.mfiAccounts.bankAccounts[this.marginfiGroup.toString()][this.pos.supplyMint.toString()];
50
56
  this.marginfiDebtAccounts =
@@ -160,6 +166,13 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
160
166
  });
161
167
  }
162
168
  case "Borrow": {
169
+ const remainingAccounts = this.healthCheckRemainingAccounts ?? [];
170
+ if (!remainingAccounts.find((x) => x.pubkey.toString() === this.marginfiDebtAccounts.bank.toString())) {
171
+ remainingAccounts.push(...[
172
+ (0, utils_1.getAccountMeta)(new web3_js_1.PublicKey(this.marginfiDebtAccounts.bank)),
173
+ (0, utils_1.getAccountMeta)(this.debtPriceOracle),
174
+ ]);
175
+ }
163
176
  return (0, marginfi_sdk_1.lendingAccountBorrow)(this.umi, {
164
177
  amount: args.fields[0],
165
178
  signer: this.signer,
@@ -169,7 +182,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
169
182
  bank: (0, umi_1.publicKey)(this.marginfiDebtAccounts.bank),
170
183
  bankLiquidityVault: (0, umi_1.publicKey)(this.marginfiDebtAccounts.liquidityVault),
171
184
  bankLiquidityVaultAuthority: (0, umi_1.publicKey)(this.marginfiDebtAccounts.vaultAuthority),
172
- });
185
+ }).addRemainingAccounts(remainingAccounts);
173
186
  }
174
187
  case "Repay": {
175
188
  return (0, marginfi_sdk_1.lendingAccountRepay)(this.umi, {
@@ -194,7 +207,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
194
207
  bank: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.bank),
195
208
  bankLiquidityVault: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.liquidityVault),
196
209
  bankLiquidityVaultAuthority: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.vaultAuthority),
197
- });
210
+ }).addRemainingAccounts(this.healthCheckRemainingAccounts ?? []);
198
211
  }
199
212
  }
200
213
  }
@@ -1,9 +1,9 @@
1
1
  import { PublicKey } from "@solana/web3.js";
2
- import { Program, Umi } from "@metaplex-foundation/umi";
2
+ import { AccountMeta, Program, Umi } from "@metaplex-foundation/umi";
3
3
  import { ProgramEnv, MarginfiAssetAccounts } from "../types";
4
4
  import { PositionState, PriceType } from "../generated";
5
5
  import { MarginfiBankAccountsMap } from "../constants";
6
- import { Bank, MarginfiAccount } from "../marginfi-sdk";
6
+ import { Balance, Bank, MarginfiAccount } from "../marginfi-sdk";
7
7
  import { ContextUpdates } from "./solautoUtils";
8
8
  export declare function createDynamicMarginfiProgram(env?: ProgramEnv): Program;
9
9
  export declare function umiWithMarginfiProgram(umi: Umi, marginfiEnv?: ProgramEnv): Umi;
@@ -22,6 +22,7 @@ interface AllMarginfiAssetAccounts extends MarginfiAssetAccounts {
22
22
  mint: PublicKey;
23
23
  }
24
24
  export declare function findMarginfiAccounts(bank: PublicKey): AllMarginfiAssetAccounts;
25
+ export declare function getRemainingAccountsForMarginfiHealthCheck(umi: Umi, balance: Balance): Promise<AccountMeta[]>;
25
26
  export declare function calcMarginfiMaxLtvAndLiqThresholdBps(supplyBank: Bank, debtBank: Bank, supplyPrice: number): [number, number];
26
27
  export declare function getMarginfiMaxLtvAndLiqThresholdBps(umi: Umi, marginfiGroup: PublicKey, supply: {
27
28
  mint: PublicKey;
@@ -1 +1 @@
1
- {"version":3,"file":"marginfiUtils.d.ts","sourceRoot":"","sources":["../../src/utils/marginfiUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"marginfiUtils.d.ts","sourceRoot":"","sources":["../../src/utils/marginfiUtils.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ exports.getAllBankRelatedAccounts = getAllBankRelatedAccounts;
6
6
  exports.fetchBankAddresses = fetchBankAddresses;
7
7
  exports.getMarginfiPriceOracle = getMarginfiPriceOracle;
8
8
  exports.findMarginfiAccounts = findMarginfiAccounts;
9
+ exports.getRemainingAccountsForMarginfiHealthCheck = getRemainingAccountsForMarginfiHealthCheck;
9
10
  exports.calcMarginfiMaxLtvAndLiqThresholdBps = calcMarginfiMaxLtvAndLiqThresholdBps;
10
11
  exports.getMarginfiMaxLtvAndLiqThresholdBps = getMarginfiMaxLtvAndLiqThresholdBps;
11
12
  exports.getEmptyMarginfiAccountsByAuthority = getEmptyMarginfiAccountsByAuthority;
@@ -25,6 +26,7 @@ const generalUtils_1 = require("./generalUtils");
25
26
  const numberUtils_1 = require("./numberUtils");
26
27
  const accountUtils_1 = require("./accountUtils");
27
28
  const pythUtils_1 = require("./pythUtils");
29
+ const solanaUtils_1 = require("./solanaUtils");
28
30
  function createDynamicMarginfiProgram(env) {
29
31
  return {
30
32
  name: "marginfi",
@@ -119,6 +121,18 @@ function findMarginfiAccounts(bank) {
119
121
  }
120
122
  throw new Error(`Marginfi accounts not found by the bank: ${bank}`);
121
123
  }
124
+ async function getRemainingAccountsForMarginfiHealthCheck(umi, balance) {
125
+ if (!balance.active) {
126
+ return [];
127
+ }
128
+ const priceOracle = await getMarginfiPriceOracle(umi, {
129
+ pk: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(balance.bankPk),
130
+ });
131
+ return [
132
+ (0, solanaUtils_1.getAccountMeta)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(balance.bankPk)),
133
+ (0, solanaUtils_1.getAccountMeta)(priceOracle),
134
+ ];
135
+ }
122
136
  function calcMarginfiMaxLtvAndLiqThresholdBps(supplyBank, debtBank, supplyPrice) {
123
137
  let maxLtv = (0, numberUtils_1.bytesToI80F48)(supplyBank.config.assetWeightInit.value) /
124
138
  (0, numberUtils_1.bytesToI80F48)(debtBank.config.liabilityWeightInit.value);
@@ -1,5 +1,5 @@
1
1
  import { Connection, PublicKey, TransactionInstruction } from "@solana/web3.js";
2
- import { AddressLookupTableInput, Signer, TransactionBuilder, Umi, WrappedInstruction } from "@metaplex-foundation/umi";
2
+ import { AccountMeta, AddressLookupTableInput, Signer, TransactionBuilder, Umi, WrappedInstruction } from "@metaplex-foundation/umi";
3
3
  import { PriorityFeeSetting, ProgramEnv, TransactionRunType } from "../types";
4
4
  export declare function getSolanaRpcConnection(rpcUrl: string, programId?: PublicKey, lpEnv?: ProgramEnv): [Connection, Umi];
5
5
  export declare function getWrappedInstruction(signer: Signer, ix: TransactionInstruction): WrappedInstruction;
@@ -9,6 +9,7 @@ export declare function createAssociatedTokenAccountUmiIx(signer: Signer, wallet
9
9
  export declare function systemTransferUmiIx(signer: Signer, destination: PublicKey, lamports: bigint): WrappedInstruction;
10
10
  export declare function closeTokenAccountUmiIx(signer: Signer, tokenAccount: PublicKey, authority: PublicKey): WrappedInstruction;
11
11
  export declare function splTokenTransferUmiIx(signer: Signer, fromTa: PublicKey, toTa: PublicKey, authority: PublicKey, amount: bigint): WrappedInstruction;
12
+ export declare function getAccountMeta(pubkey: PublicKey, isSigner?: boolean, isWritable?: boolean): AccountMeta;
12
13
  export declare function getWalletSplBalances(conn: Connection, wallet: PublicKey, tokenMints: PublicKey[]): Promise<bigint[]>;
13
14
  export declare function getAddressLookupInputs(umi: Umi, lookupTableAddresses: string[]): Promise<AddressLookupTableInput[]>;
14
15
  export declare function addTxOptimizations(umi: Umi, tx: TransactionBuilder, computeUnitPrice?: number, computeUnitLimit?: number): TransactionBuilder;
@@ -1 +1 @@
1
- {"version":3,"file":"solanaUtils.d.ts","sourceRoot":"","sources":["../../src/utils/solanaUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,UAAU,EACV,SAAS,EAKT,sBAAsB,EAEvB,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EACL,uBAAuB,EACvB,MAAM,EACN,kBAAkB,EAClB,GAAG,EACH,kBAAkB,EAGnB,MAAM,0BAA0B,CAAC;AAOlC,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAe9E,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,SAAS,EACrB,KAAK,CAAC,EAAE,UAAU,GACjB,CAAC,UAAU,EAAE,GAAG,CAAC,CAWnB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,sBAAsB,GACzB,kBAAkB,CAMpB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,GACtB,kBAAkB,CAOpB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,kBAAkB,CAOpB;AAED,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,GACd,kBAAkB,CAUpB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,SAAS,EACtB,QAAQ,EAAE,MAAM,GACf,kBAAkB,CASpB;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,SAAS,EACvB,SAAS,EAAE,SAAS,GACnB,kBAAkB,CAKpB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,GACb,kBAAkB,CAKpB;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,SAAS,EAAE,GACtB,OAAO,CAAC,MAAM,EAAE,CAAC,CAcnB;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,oBAAoB,EAAE,MAAM,EAAE,GAC7B,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAmBpC;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,kBAAkB,EACtB,gBAAgB,CAAC,EAAE,MAAM,EACzB,gBAAgB,CAAC,EAAE,MAAM,sBAmB1B;AAED,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,GAAG,EACR,WAAW,EAAE,kBAAkB,EAC/B,gBAAgB,CAAC,EAAE,MAAM,EACzB,gBAAgB,CAAC,EAAE,MAAM,sBA2D1B;AAuBD,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,WAAW,GAAE,MAAW,GACvB,OAAO,CAAC,GAAG,CAAC,CAKd;AAED,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,kBAAkB,EACtB,eAAe,EAAE,kBAAkB,EACnC,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAwC7B;AA+CD,wBAAsB,8BAA8B,CAClD,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,kBAAkB,EACtB,MAAM,CAAC,EAAE,kBAAkB,EAC3B,eAAe,GAAE,kBAA2C,EAC5D,cAAc,CAAC,EAAE,MAAM,IAAI,GAC1B,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAoEjC"}
1
+ {"version":3,"file":"solanaUtils.d.ts","sourceRoot":"","sources":["../../src/utils/solanaUtils.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ exports.createAssociatedTokenAccountUmiIx = createAssociatedTokenAccountUmiIx;
11
11
  exports.systemTransferUmiIx = systemTransferUmiIx;
12
12
  exports.closeTokenAccountUmiIx = closeTokenAccountUmiIx;
13
13
  exports.splTokenTransferUmiIx = splTokenTransferUmiIx;
14
+ exports.getAccountMeta = getAccountMeta;
14
15
  exports.getWalletSplBalances = getWalletSplBalances;
15
16
  exports.getAddressLookupInputs = getAddressLookupInputs;
16
17
  exports.addTxOptimizations = addTxOptimizations;
@@ -75,6 +76,9 @@ function closeTokenAccountUmiIx(signer, tokenAccount, authority) {
75
76
  function splTokenTransferUmiIx(signer, fromTa, toTa, authority, amount) {
76
77
  return getWrappedInstruction(signer, (0, spl_token_1.createTransferInstruction)(fromTa, toTa, authority, amount));
77
78
  }
79
+ function getAccountMeta(pubkey, isSigner = false, isWritable = false) {
80
+ return { pubkey: (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(pubkey), isSigner, isWritable };
81
+ }
78
82
  async function getWalletSplBalances(conn, wallet, tokenMints) {
79
83
  return await Promise.all(tokenMints.map(async (mint) => {
80
84
  try {
@@ -2,6 +2,7 @@ import { Keypair, PublicKey } from "@solana/web3.js";
2
2
  import { createSignerFromKeypair } from "@metaplex-foundation/umi";
3
3
  import { fromWeb3JsKeypair } from "@metaplex-foundation/umi-web3js-adapters";
4
4
  import {
5
+ borrow,
5
6
  consoleLog,
6
7
  getClient,
7
8
  getSolanaRpcConnection,
@@ -12,7 +13,11 @@ import {
12
13
  rebalance,
13
14
  SOLAUTO_PROD_PROGRAM,
14
15
  SOLAUTO_TEST_PROGRAM,
16
+ toBaseUnit,
17
+ tokenInfo,
15
18
  TransactionsManager,
19
+ USDC,
20
+ WBTC,
16
21
  } from "../src";
17
22
  import { getSecretKey } from "./shared";
18
23
 
@@ -29,7 +34,7 @@ export async function main() {
29
34
 
30
35
  const signer = createSignerFromKeypair(
31
36
  umi,
32
- fromWeb3JsKeypair(Keypair.fromSecretKey(getSecretKey("solauto-manager")))
37
+ fromWeb3JsKeypair(Keypair.fromSecretKey(getSecretKey()))
33
38
  );
34
39
 
35
40
  const client = getClient(LendingPlatform.Marginfi, {
@@ -41,27 +46,30 @@ export async function main() {
41
46
  });
42
47
 
43
48
  await client.initialize({
44
- positionId: 1,
45
- authority: new PublicKey("5UqsR2PGzbP8pGPbXEeXx86Gjz2N2UFBAuFZUSVydAEe"),
46
- // lpUserAccount: new PublicKey(
47
- // "EyATEtRH6FQRCJCn4nVzEnKXnzyGaUV1nt4sHqBrQ2fZ"
48
- // ),
49
+ positionId: 2,
50
+ // authority: new PublicKey("5UqsR2PGzbP8pGPbXEeXx86Gjz2N2UFBAuFZUSVydAEe"),
51
+ lpUserAccount: new PublicKey(
52
+ "GEokw9jqbh6d1xUNA3qaeYFFetbSR5Y1nt7C3chwwgSz"
53
+ ),
49
54
  });
50
55
 
51
- const transactionItems = [rebalance(client)];
52
56
 
53
- const txManager = new TransactionsManager(
54
- client,
55
- undefined,
56
- payForTransaction ? "normal" : "only-simulate",
57
- PriorityFeeSetting.Min,
58
- true,
59
- undefined,
60
- { totalRetries: 5 }
61
- );
62
- const statuses = await txManager.clientSend(transactionItems);
57
+ // const transactionItems = [
58
+ // rebalance(client, 300),
59
+ // ];
60
+
61
+ // const txManager = new TransactionsManager(
62
+ // client,
63
+ // undefined,
64
+ // payForTransaction ? "normal" : "only-simulate",
65
+ // PriorityFeeSetting.Min,
66
+ // true,
67
+ // undefined,
68
+ // { totalRetries: 5 }
69
+ // );
70
+ // const statuses = await txManager.clientSend(transactionItems);
63
71
 
64
- consoleLog(statuses);
72
+ // consoleLog(statuses);
65
73
  }
66
74
 
67
75
  main();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haven-fi/solauto-sdk",
3
- "version": "1.0.662",
3
+ "version": "1.0.664",
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",
@@ -14,10 +14,10 @@
14
14
  "dependencies": {
15
15
  "@coral-xyz/anchor": "^0.30.1",
16
16
  "@jup-ag/api": "=6.0.24",
17
- "@metaplex-foundation/umi": "^0.9.1",
18
- "@metaplex-foundation/umi-bundle-defaults": "^0.9.1",
19
- "@metaplex-foundation/umi-signer-wallet-adapters": "^0.9.1",
20
- "@metaplex-foundation/umi-web3js-adapters": "^0.9.1",
17
+ "@metaplex-foundation/umi": "=0.9.1",
18
+ "@metaplex-foundation/umi-bundle-defaults": "=0.9.1",
19
+ "@metaplex-foundation/umi-signer-wallet-adapters": "=0.9.1",
20
+ "@metaplex-foundation/umi-web3js-adapters": "=0.9.1",
21
21
  "@solana/spl-token": "^0.4.0",
22
22
  "@solana/web3.js": "=1.95.8",
23
23
  "@switchboard-xyz/common": "=3.0.12",
@@ -76,6 +76,8 @@ export class FlProviderAggregator extends FlProviderBase {
76
76
  }
77
77
 
78
78
  flashRepay(flashLoan: FlashLoanDetails): TransactionBuilder {
79
- return this.flProvider(flashLoan.liquiditySource).flashRepay(flashLoan);
79
+ return this.flProvider(flashLoan.liquiditySource).flashRepay(
80
+ flashLoan
81
+ );
80
82
  }
81
83
  }
@@ -30,6 +30,7 @@ import {
30
30
  getBankLiquidityAvailableBaseUnit,
31
31
  getEmptyMarginfiAccountsByAuthority,
32
32
  getMarginfiPriceOracle,
33
+ getRemainingAccountsForMarginfiHealthCheck,
33
34
  getTokenAccount,
34
35
  rpcAccountCreated,
35
36
  safeGetPrice,
@@ -49,8 +50,11 @@ export class MarginfiFlProvider extends FlProviderBase {
49
50
  private existingMarginfiAccounts!: MarginfiAccount[];
50
51
  private supplyBankLiquiditySource!: Bank;
51
52
  private debtBankLiquiditySource!: Bank;
53
+
52
54
  private supplyImfiAccount!: IMFIAccount;
53
55
  private debtImfiAccount!: IMFIAccount;
56
+ private supplyRemainingAccounts!: AccountMeta[];
57
+ private debtRemainingAccounts!: AccountMeta[];
54
58
 
55
59
  async initialize() {
56
60
  await this.setAvailableBanks();
@@ -62,10 +66,10 @@ export class MarginfiFlProvider extends FlProviderBase {
62
66
  this.liquidityBank(TokenType.Supply).group.toString() !==
63
67
  this.liquidityBank(TokenType.Debt).group.toString()
64
68
  ) {
65
- this.setIntermediaryAccount([TokenType.Supply]);
66
- this.setIntermediaryAccount([TokenType.Debt]);
69
+ await this.setIntermediaryAccount([TokenType.Supply]);
70
+ await this.setIntermediaryAccount([TokenType.Debt]);
67
71
  } else {
68
- this.setIntermediaryAccount([TokenType.Supply, TokenType.Debt]);
72
+ await this.setIntermediaryAccount([TokenType.Supply, TokenType.Debt]);
69
73
  }
70
74
  }
71
75
 
@@ -114,7 +118,7 @@ export class MarginfiFlProvider extends FlProviderBase {
114
118
  this.debtBankLiquiditySource = debtBanks[0][1];
115
119
  }
116
120
 
117
- private setIntermediaryAccount(sources: TokenType[]) {
121
+ private async setIntermediaryAccount(sources: TokenType[]) {
118
122
  const compatibleMarginfiAccounts = this.existingMarginfiAccounts.filter(
119
123
  (x) => x.group.toString() == this.liquidityBank(sources[0]).group
120
124
  );
@@ -136,6 +140,16 @@ export class MarginfiFlProvider extends FlProviderBase {
136
140
  this.flSigners.push(signer);
137
141
  }
138
142
 
143
+ const remainingAccounts = accountData
144
+ ? (
145
+ await Promise.all(
146
+ accountData.lendingAccount.balances.map((balance) =>
147
+ getRemainingAccountsForMarginfiHealthCheck(this.umi, balance)
148
+ )
149
+ )
150
+ ).flat()
151
+ : [];
152
+
139
153
  for (const s of sources) {
140
154
  const data: IMFIAccount = {
141
155
  signer,
@@ -146,8 +160,10 @@ export class MarginfiFlProvider extends FlProviderBase {
146
160
  const supply = s === TokenType.Supply;
147
161
  if (supply) {
148
162
  this.supplyImfiAccount = data;
163
+ this.supplyRemainingAccounts = remainingAccounts;
149
164
  } else {
150
165
  this.debtImfiAccount = data;
166
+ this.debtRemainingAccounts = remainingAccounts;
151
167
  }
152
168
  consoleLog(
153
169
  `${supply ? "Supply" : "Debt"} iMfi account:`,
@@ -292,45 +308,19 @@ export class MarginfiFlProvider extends FlProviderBase {
292
308
  );
293
309
  const iMfiAccount = this.iMfiAccount(flashLoan.liquiditySource)!;
294
310
 
295
- const remainingAccounts: AccountMeta[] = [];
296
- let flBankHadPrevBalance = false;
297
-
298
- if (iMfiAccount?.accountData) {
299
- iMfiAccount.accountData.lendingAccount.balances.forEach(async (x) => {
300
- if (x.active) {
301
- if (x.bankPk.toString() === bank.publicKey.toString()) {
302
- flBankHadPrevBalance = true;
303
- }
304
-
305
- const priceOracle = publicKey(
306
- await getMarginfiPriceOracle(this.umi, {
307
- pk: toWeb3JsPublicKey(x.bankPk),
308
- })
309
- );
310
-
311
- remainingAccounts.push(
312
- ...[
313
- {
314
- pubkey: x.bankPk,
315
- isSigner: false,
316
- isWritable: false,
317
- },
318
- {
319
- pubkey: priceOracle,
320
- isSigner: false,
321
- isWritable: false,
322
- },
323
- ]
324
- );
325
- }
326
- });
327
- }
311
+ const remainingAccounts: AccountMeta[] =
312
+ flashLoan.liquiditySource === TokenType.Supply
313
+ ? this.supplyRemainingAccounts
314
+ : this.debtRemainingAccounts;
315
+ let iMfiAccountHadPrevFlBalance = remainingAccounts.find(
316
+ (x) => x.pubkey.toString() === bank.publicKey.toString()
317
+ );
328
318
 
329
319
  return transactionBuilder()
330
320
  .add(
331
321
  lendingAccountRepay(this.umi, {
332
322
  amount: flashLoan.baseUnitAmount,
333
- repayAll: !flBankHadPrevBalance,
323
+ repayAll: !iMfiAccountHadPrevFlBalance,
334
324
  bank: bank.publicKey,
335
325
  bankLiquidityVault: publicKey(associatedBankAccs.liquidityVault),
336
326
  marginfiAccount: publicKey(iMfiAccount.accountPk),
@@ -78,9 +78,6 @@ export abstract class SolautoClient extends ReferralStateManager {
78
78
  await super.initialize(args);
79
79
 
80
80
  const positionId = args.positionId ?? 0;
81
- if (positionId === 0 && !args.lpUserAccount) {
82
- throw new Error("Self managed position is missing arguments");
83
- }
84
81
  this.pos = await getOrCreatePositionEx(
85
82
  this.umi,
86
83
  this.authority,
@@ -5,8 +5,12 @@ import {
5
5
  publicKey,
6
6
  PublicKey as UmiPublicKey,
7
7
  createSignerFromKeypair,
8
+ AccountMeta,
8
9
  } from "@metaplex-foundation/umi";
9
- import { toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters";
10
+ import {
11
+ fromWeb3JsPublicKey,
12
+ toWeb3JsPublicKey,
13
+ } from "@metaplex-foundation/umi-web3js-adapters";
10
14
  import { MarginfiAssetAccounts, RebalanceDetails } from "../../types";
11
15
  import { getMarginfiAccounts, MarginfiProgramAccounts } from "../../constants";
12
16
  import {
@@ -31,18 +35,26 @@ import {
31
35
  marginfiAccountEmpty,
32
36
  getTokenAccount,
33
37
  hasFirstRebalance,
38
+ getRemainingAccountsForMarginfiHealthCheck,
39
+ getAccountMeta,
34
40
  } from "../../utils";
35
41
  import {
36
42
  Bank,
43
+ fetchMarginfiAccount,
37
44
  lendingAccountBorrow,
38
45
  lendingAccountDeposit,
39
46
  lendingAccountRepay,
40
47
  lendingAccountWithdraw,
41
48
  marginfiAccountInitialize,
42
49
  safeFetchAllMarginfiAccount,
50
+ safeFetchMarginfiAccount,
43
51
  } from "../../marginfi-sdk";
44
52
  import { SolautoClient, SolautoClientArgs } from "./solautoClient";
45
53
 
54
+ function isSigner(account: PublicKey | Signer): account is Signer {
55
+ return "publicKey" in account;
56
+ }
57
+
46
58
  export class SolautoMarginfiClient extends SolautoClient {
47
59
  public lendingPlatform = LendingPlatform.Marginfi;
48
60
 
@@ -50,6 +62,7 @@ export class SolautoMarginfiClient extends SolautoClient {
50
62
 
51
63
  public marginfiAccount!: PublicKey | Signer;
52
64
  public marginfiAccountPk!: PublicKey;
65
+ public healthCheckRemainingAccounts?: AccountMeta[];
53
66
  public marginfiGroup!: PublicKey;
54
67
 
55
68
  public marginfiSupplyAccounts!: MarginfiAssetAccounts;
@@ -97,13 +110,25 @@ export class SolautoMarginfiClient extends SolautoClient {
97
110
  );
98
111
  }
99
112
  }
100
- this.marginfiAccountPk =
101
- "publicKey" in this.marginfiAccount
102
- ? toWeb3JsPublicKey(this.marginfiAccount.publicKey)
103
- : this.marginfiAccount;
104
113
 
105
- if ("publicKey" in this.marginfiAccount) {
114
+ this.marginfiAccountPk = isSigner(this.marginfiAccount)
115
+ ? toWeb3JsPublicKey(this.marginfiAccount.publicKey)
116
+ : this.marginfiAccount;
117
+
118
+ if (isSigner(this.marginfiAccount)) {
106
119
  this.otherSigners.push(this.marginfiAccount);
120
+ } else if (this.pos.selfManaged) {
121
+ const accountData = await fetchMarginfiAccount(
122
+ this.umi,
123
+ fromWeb3JsPublicKey(this.marginfiAccount as PublicKey)
124
+ );
125
+ this.healthCheckRemainingAccounts = (
126
+ await Promise.all(
127
+ accountData.lendingAccount.balances.map((balance) =>
128
+ getRemainingAccountsForMarginfiHealthCheck(this.umi, balance)
129
+ )
130
+ )
131
+ ).flat();
107
132
  }
108
133
 
109
134
  this.marginfiSupplyAccounts =
@@ -247,6 +272,20 @@ export class SolautoMarginfiClient extends SolautoClient {
247
272
  });
248
273
  }
249
274
  case "Borrow": {
275
+ const remainingAccounts = this.healthCheckRemainingAccounts ?? [];
276
+ if (
277
+ !remainingAccounts.find(
278
+ (x) =>
279
+ x.pubkey.toString() === this.marginfiDebtAccounts.bank.toString()
280
+ )
281
+ ) {
282
+ remainingAccounts.push(
283
+ ...[
284
+ getAccountMeta(new PublicKey(this.marginfiDebtAccounts.bank)),
285
+ getAccountMeta(this.debtPriceOracle),
286
+ ]
287
+ );
288
+ }
250
289
  return lendingAccountBorrow(this.umi, {
251
290
  amount: args.fields[0],
252
291
  signer: this.signer,
@@ -260,7 +299,7 @@ export class SolautoMarginfiClient extends SolautoClient {
260
299
  bankLiquidityVaultAuthority: publicKey(
261
300
  this.marginfiDebtAccounts.vaultAuthority
262
301
  ),
263
- });
302
+ }).addRemainingAccounts(remainingAccounts);
264
303
  }
265
304
  case "Repay": {
266
305
  return lendingAccountRepay(this.umi, {
@@ -293,7 +332,7 @@ export class SolautoMarginfiClient extends SolautoClient {
293
332
  bankLiquidityVaultAuthority: publicKey(
294
333
  this.marginfiSupplyAccounts.vaultAuthority
295
334
  ),
296
- });
335
+ }).addRemainingAccounts(this.healthCheckRemainingAccounts ?? []);
297
336
  }
298
337
  }
299
338
  }
@@ -408,7 +447,9 @@ export class SolautoMarginfiClient extends SolautoClient {
408
447
  ? publicKey(getTokenAccount(this.authority, this.pos.supplyMint))
409
448
  : undefined,
410
449
  vaultSupplyTa: publicKey(this.marginfiSupplyAccounts.liquidityVault),
411
- supplyVaultAuthority: publicKey(this.marginfiSupplyAccounts.vaultAuthority),
450
+ supplyVaultAuthority: publicKey(
451
+ this.marginfiSupplyAccounts.vaultAuthority
452
+ ),
412
453
  debtBank: publicKey(this.marginfiDebtAccounts.bank),
413
454
  debtPriceOracle: publicKey(this.debtPriceOracle),
414
455
  positionDebtTa: publicKey(this.positionDebtTa),
@@ -1,5 +1,5 @@
1
1
  import { PublicKey } from "@solana/web3.js";
2
- import { Program, publicKey, Umi } from "@metaplex-foundation/umi";
2
+ import { AccountMeta, Program, publicKey, Umi } from "@metaplex-foundation/umi";
3
3
  import {
4
4
  fromWeb3JsPublicKey,
5
5
  toWeb3JsPublicKey,
@@ -16,6 +16,7 @@ import {
16
16
  USD_DECIMALS,
17
17
  } from "../constants";
18
18
  import {
19
+ Balance,
19
20
  Bank,
20
21
  deserializeMarginfiAccount,
21
22
  fetchBank,
@@ -44,6 +45,7 @@ import {
44
45
  getMostUpToDatePythOracle,
45
46
  getPythPushOracleAddress,
46
47
  } from "./pythUtils";
48
+ import { getAccountMeta } from "./solanaUtils";
47
49
 
48
50
  export function createDynamicMarginfiProgram(env?: ProgramEnv): Program {
49
51
  return {
@@ -179,6 +181,22 @@ export function findMarginfiAccounts(
179
181
  throw new Error(`Marginfi accounts not found by the bank: ${bank}`);
180
182
  }
181
183
 
184
+ export async function getRemainingAccountsForMarginfiHealthCheck(
185
+ umi: Umi,
186
+ balance: Balance
187
+ ): Promise<AccountMeta[]> {
188
+ if (!balance.active) {
189
+ return [];
190
+ }
191
+ const priceOracle = await getMarginfiPriceOracle(umi, {
192
+ pk: toWeb3JsPublicKey(balance.bankPk),
193
+ });
194
+ return [
195
+ getAccountMeta(toWeb3JsPublicKey(balance.bankPk)),
196
+ getAccountMeta(priceOracle),
197
+ ];
198
+ }
199
+
182
200
  export function calcMarginfiMaxLtvAndLiqThresholdBps(
183
201
  supplyBank: Bank,
184
202
  debtBank: Bank,
@@ -18,6 +18,7 @@ import {
18
18
  createTransferInstruction,
19
19
  } from "@solana/spl-token";
20
20
  import {
21
+ AccountMeta,
21
22
  AddressLookupTableInput,
22
23
  Signer,
23
24
  TransactionBuilder,
@@ -28,6 +29,7 @@ import {
28
29
  } from "@metaplex-foundation/umi";
29
30
  import {
30
31
  fromWeb3JsInstruction,
32
+ fromWeb3JsPublicKey,
31
33
  toWeb3JsPublicKey,
32
34
  toWeb3JsTransaction,
33
35
  } from "@metaplex-foundation/umi-web3js-adapters";
@@ -154,6 +156,14 @@ export function splTokenTransferUmiIx(
154
156
  );
155
157
  }
156
158
 
159
+ export function getAccountMeta(
160
+ pubkey: PublicKey,
161
+ isSigner: boolean = false,
162
+ isWritable: boolean = false
163
+ ): AccountMeta {
164
+ return { pubkey: fromWeb3JsPublicKey(pubkey), isSigner, isWritable };
165
+ }
166
+
157
167
  export async function getWalletSplBalances(
158
168
  conn: Connection,
159
169
  wallet: PublicKey,