@haven-fi/solauto-sdk 1.0.70 → 1.0.72

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.
Files changed (39) hide show
  1. package/dist/clients/solautoMarginfiClient.d.ts +2 -0
  2. package/dist/clients/solautoMarginfiClient.d.ts.map +1 -1
  3. package/dist/clients/solautoMarginfiClient.js +35 -24
  4. package/dist/constants/marginfiAccounts.d.ts.map +1 -1
  5. package/dist/constants/marginfiAccounts.js +14 -4
  6. package/dist/constants/pythConstants.d.ts +2 -0
  7. package/dist/constants/pythConstants.d.ts.map +1 -1
  8. package/dist/constants/pythConstants.js +2 -0
  9. package/dist/constants/tokenConstants.d.ts +10 -4
  10. package/dist/constants/tokenConstants.d.ts.map +1 -1
  11. package/dist/constants/tokenConstants.js +21 -8
  12. package/dist/generated/errors/solauto.d.ts +2 -2
  13. package/dist/generated/errors/solauto.d.ts.map +1 -1
  14. package/dist/generated/errors/solauto.js +7 -7
  15. package/dist/marginfi-sdk/types/oracleSetup.d.ts +3 -2
  16. package/dist/marginfi-sdk/types/oracleSetup.d.ts.map +1 -1
  17. package/dist/marginfi-sdk/types/oracleSetup.js +2 -1
  18. package/dist/marginfi-sdk/types/wrappedI80F48.d.ts +1 -1
  19. package/dist/marginfi-sdk/types/wrappedI80F48.d.ts.map +1 -1
  20. package/dist/marginfi-sdk/types/wrappedI80F48.js +2 -2
  21. package/dist/types/accounts.d.ts +0 -1
  22. package/dist/types/accounts.d.ts.map +1 -1
  23. package/dist/utils/marginfiUtils.d.ts +1 -4
  24. package/dist/utils/marginfiUtils.d.ts.map +1 -1
  25. package/dist/utils/marginfiUtils.js +9 -15
  26. package/dist/utils/solauto/generalUtils.js +2 -2
  27. package/local/updateMarginfiLUT.ts +1 -1
  28. package/package.json +1 -1
  29. package/src/clients/solautoMarginfiClient.ts +46 -31
  30. package/src/constants/marginfiAccounts.ts +15 -5
  31. package/src/constants/pythConstants.ts +4 -2
  32. package/src/constants/tokenConstants.ts +26 -8
  33. package/src/generated/errors/solauto.ts +5 -5
  34. package/src/marginfi-sdk/types/oracleSetup.ts +2 -1
  35. package/src/marginfi-sdk/types/wrappedI80F48.ts +8 -3
  36. package/src/types/accounts.ts +0 -1
  37. package/src/utils/marginfiUtils.ts +13 -23
  38. package/src/utils/solauto/generalUtils.ts +3 -3
  39. package/tests/transactions/solautoMarginfi.ts +2 -2
@@ -20,6 +20,8 @@ export declare class SolautoMarginfiClient extends SolautoClient {
20
20
  marginfiGroup: PublicKey;
21
21
  marginfiSupplyAccounts: MarginfiAssetAccounts;
22
22
  marginfiDebtAccounts: MarginfiAssetAccounts;
23
+ supplyPriceOracle: PublicKey;
24
+ debtPriceOracle: PublicKey;
23
25
  intermediaryMarginfiAccountSigner?: Signer;
24
26
  intermediaryMarginfiAccountPk: PublicKey;
25
27
  intermediaryMarginfiAccount?: MarginfiAccount;
@@ -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,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;AASnE,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,sBAAsB,EAAG,qBAAqB,CAAC;IAC/C,oBAAoB,EAAG,qBAAqB,CAAC;IAG7C,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;IA0CpC,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;IA8C9B,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;IA2DrB,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;AAM1D,OAAO,EACL,kBAAkB,EAElB,aAAa,EACb,iBAAiB,EACjB,wBAAwB,EACxB,gCAAgC,EAKjC,MAAM,cAAc,CAAC;AAGtB,OAAO,EAGL,eAAe,EAYhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AASnE,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,sBAAsB,EAAG,qBAAqB,CAAC;IAC/C,oBAAoB,EAAG,qBAAqB,CAAC;IAE7C,iBAAiB,EAAG,SAAS,CAAC;IAC9B,eAAe,EAAG,SAAS,CAAC;IAG5B,iCAAiC,CAAC,EAAE,MAAM,CAAC;IAC3C,6BAA6B,EAAG,SAAS,CAAC;IAC1C,2BAA2B,CAAC,EAAE,eAAe,CAAC;IAE/C,UAAU,CAAC,IAAI,EAAE,yBAAyB;IAkD1C,8BAA8B;IA0CpC,mBAAmB,IAAI,MAAM,EAAE;IAI/B,gBAAgB,IAAI,SAAS,EAAE;IAU/B,yBAAyB,IAAI,kBAAkB;IAS/C,YAAY,CACV,aAAa,CAAC,EAAE,gCAAgC,EAChD,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IAMrB,OAAO,CAAC,sBAAsB;IA8C9B,OAAO,IAAI,kBAAkB;IAc7B,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAUhE,OAAO,CAAC,6BAA6B;IAmErC,OAAO,CAAC,oCAAoC;IA0D5C,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;IA2DrB,WAAW,CACT,gBAAgB,EAAE,gBAAgB,EAClC,uBAAuB,EAAE,SAAS,GACjC,kBAAkB;IA2BrB,UAAU,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,kBAAkB;IAgFlE,iCAAiC,IAAI,kBAAkB;IASjD,qBAAqB,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;CAiBlE"}
@@ -40,12 +40,18 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
40
40
  this.marginfiGroup = marginfiAccountData
41
41
  ? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(marginfiAccountData.group)
42
42
  : args.marginfiGroup ?? new web3_js_1.PublicKey(marginfiAccounts_1.DEFAULT_MARGINFI_GROUP);
43
- this.marginfiSupplyAccounts = (0, marginfiUtils_1.findMarginfiAccounts)({
44
- mint: this.supplyMint.toString(),
45
- });
46
- this.marginfiDebtAccounts = (0, marginfiUtils_1.findMarginfiAccounts)({
47
- mint: this.debtMint.toString(),
48
- });
43
+ this.marginfiSupplyAccounts =
44
+ marginfiAccounts_1.MARGINFI_ACCOUNTS[this.supplyMint.toString()];
45
+ this.marginfiDebtAccounts = marginfiAccounts_1.MARGINFI_ACCOUNTS[this.debtMint.toString()];
46
+ // TODO: Don't dynamically pull from bank until Marginfi sorts out their price oracle issues.
47
+ // const [supplyBank, debtBank] = await safeFetchAllBank(this.umi, [
48
+ // publicKey(this.marginfiSupplyAccounts.bank),
49
+ // publicKey(this.marginfiDebtAccounts.bank),
50
+ // ]);
51
+ // this.supplyPriceOracle = toWeb3JsPublicKey(supplyBank.config.oracleKeys[0]);
52
+ // this.debtPriceOracle = toWeb3JsPublicKey(debtBank.config.oracleKeys[0]);
53
+ this.supplyPriceOracle = new web3_js_1.PublicKey(this.marginfiSupplyAccounts.priceOracle);
54
+ this.debtPriceOracle = new web3_js_1.PublicKey(this.marginfiDebtAccounts.priceOracle);
49
55
  if (!this.initialized) {
50
56
  await this.setIntermediaryMarginfiDetails();
51
57
  }
@@ -78,7 +84,9 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
78
84
  return [
79
85
  ...super.lutAccountsToAdd(),
80
86
  this.marginfiAccountPk,
81
- ...(this.signer.publicKey.toString() === this.authority.toString() ? [this.intermediaryMarginfiAccountPk] : []),
87
+ ...(this.signer.publicKey.toString() === this.authority.toString()
88
+ ? [this.intermediaryMarginfiAccountPk]
89
+ : []),
82
90
  ];
83
91
  }
84
92
  marginfiAccountInitialize() {
@@ -141,9 +149,9 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
141
149
  marginfiGroup: (0, umi_1.publicKey)(this.marginfiGroup),
142
150
  marginfiAccount: (0, umi_1.publicKey)(this.marginfiAccount),
143
151
  supplyBank: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.bank),
144
- supplyPriceOracle: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.priceOracle),
152
+ supplyPriceOracle: (0, umi_1.publicKey)(this.supplyPriceOracle),
145
153
  debtBank: (0, umi_1.publicKey)(this.marginfiDebtAccounts.bank),
146
- debtPriceOracle: (0, umi_1.publicKey)(this.marginfiDebtAccounts.priceOracle),
154
+ debtPriceOracle: (0, umi_1.publicKey)(this.debtPriceOracle),
147
155
  solautoPosition: (0, umi_1.publicKey)(this.solautoPosition),
148
156
  });
149
157
  }
@@ -232,8 +240,8 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
232
240
  let supplyPriceOracle = undefined;
233
241
  let debtPriceOracle = undefined;
234
242
  if (args.__kind === "Withdraw" || args.__kind === "Borrow") {
235
- supplyPriceOracle = (0, umi_1.publicKey)(this.marginfiSupplyAccounts.priceOracle);
236
- debtPriceOracle = (0, umi_1.publicKey)(this.marginfiDebtAccounts.priceOracle);
243
+ supplyPriceOracle = (0, umi_1.publicKey)(this.supplyPriceOracle);
244
+ debtPriceOracle = (0, umi_1.publicKey)(this.debtPriceOracle);
237
245
  }
238
246
  return (0, generated_1.marginfiProtocolInteraction)(this.umi, {
239
247
  signer: this.signer,
@@ -277,7 +285,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
277
285
  marginfiAccount: (0, umi_1.publicKey)(this.marginfiAccountPk),
278
286
  intermediaryTa: (0, umi_1.publicKey)((0, accountUtils_1.getTokenAccount)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey), swapDetails.inputMint)),
279
287
  supplyBank: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.bank),
280
- supplyPriceOracle: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.priceOracle),
288
+ supplyPriceOracle: (0, umi_1.publicKey)(this.supplyPriceOracle),
281
289
  positionSupplyTa: (0, umi_1.publicKey)(this.positionSupplyTa),
282
290
  signerSupplyTa: this.selfManaged
283
291
  ? (0, umi_1.publicKey)(this.signerSupplyTa)
@@ -289,7 +297,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
289
297
  ? (0, umi_1.publicKey)(this.marginfiSupplyAccounts.vaultAuthority)
290
298
  : undefined,
291
299
  debtBank: (0, umi_1.publicKey)(this.marginfiDebtAccounts.bank),
292
- debtPriceOracle: (0, umi_1.publicKey)(this.marginfiDebtAccounts.priceOracle),
300
+ debtPriceOracle: (0, umi_1.publicKey)(this.debtPriceOracle),
293
301
  positionDebtTa: (0, umi_1.publicKey)(this.positionDebtTa),
294
302
  signerDebtTa: this.selfManaged ? (0, umi_1.publicKey)(this.signerDebtTa) : undefined,
295
303
  vaultDebtTa: needDebtAccounts
@@ -326,17 +334,21 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
326
334
  }));
327
335
  }
328
336
  flashRepay(flashLoanDetails) {
329
- const bank = flashLoanDetails.mint.equals(this.supplyMint)
330
- ? this.marginfiSupplyAccounts
331
- : this.marginfiDebtAccounts;
337
+ const accounts = flashLoanDetails.mint.equals(this.supplyMint)
338
+ ? { data: this.marginfiSupplyAccounts, oracle: this.supplyPriceOracle }
339
+ : { data: this.marginfiDebtAccounts, oracle: this.debtPriceOracle };
332
340
  const remainingAccounts = [];
333
341
  let includedFlashLoanToken = false;
334
342
  if (this.intermediaryMarginfiAccount) {
335
- this.intermediaryMarginfiAccount.lendingAccount.balances.forEach((x) => {
343
+ this.intermediaryMarginfiAccount.lendingAccount.balances.forEach(async (x) => {
336
344
  if (x.active) {
337
- if (x.bankPk === bank.bank) {
345
+ if (x.bankPk === accounts.data.bank) {
338
346
  includedFlashLoanToken = true;
339
347
  }
348
+ // TODO: Don't dynamically pull from bank until Marginfi sorts out their price oracle issues.
349
+ // const bankData = await safeFetchBank(this.umi, publicKey(accounts.data.bank));
350
+ // const priceOracle = bankData!.config.oracleKeys[0];
351
+ const priceOracle = (0, umi_1.publicKey)((0, marginfiUtils_1.findMarginfiAccounts)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(x.bankPk)).priceOracle);
340
352
  remainingAccounts.push(...[
341
353
  {
342
354
  pubkey: x.bankPk,
@@ -344,8 +356,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
344
356
  isWritable: false,
345
357
  },
346
358
  {
347
- pubkey: (0, umi_1.publicKey)((0, marginfiUtils_1.findMarginfiAccounts)({ bank: x.bankPk.toString() })
348
- .priceOracle),
359
+ pubkey: priceOracle,
349
360
  isSigner: false,
350
361
  isWritable: false,
351
362
  },
@@ -356,12 +367,12 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
356
367
  if (!this.intermediaryMarginfiAccount || !includedFlashLoanToken) {
357
368
  remainingAccounts.push(...[
358
369
  {
359
- pubkey: (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(new web3_js_1.PublicKey(bank.bank)),
370
+ pubkey: (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(new web3_js_1.PublicKey(accounts.data.bank)),
360
371
  isSigner: false,
361
372
  isWritable: false,
362
373
  },
363
374
  {
364
- pubkey: (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(new web3_js_1.PublicKey(bank.priceOracle)),
375
+ pubkey: (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(new web3_js_1.PublicKey(accounts.oracle)),
365
376
  isSigner: false,
366
377
  isWritable: false,
367
378
  },
@@ -371,8 +382,8 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
371
382
  .add((0, marginfi_sdk_1.lendingAccountRepay)(this.umi, {
372
383
  amount: flashLoanDetails.baseUnitAmount,
373
384
  repayAll: null,
374
- bank: (0, umi_1.publicKey)(bank.bank),
375
- bankLiquidityVault: (0, umi_1.publicKey)(bank.liquidityVault),
385
+ bank: (0, umi_1.publicKey)(accounts.data.bank),
386
+ bankLiquidityVault: (0, umi_1.publicKey)(accounts.data.liquidityVault),
376
387
  marginfiAccount: (0, umi_1.publicKey)(this.intermediaryMarginfiAccountPk),
377
388
  marginfiGroup: (0, umi_1.publicKey)(marginfiAccounts_1.DEFAULT_MARGINFI_GROUP),
378
389
  signer: this.signer,
@@ -1 +1 @@
1
- {"version":3,"file":"marginfiAccounts.d.ts","sourceRoot":"","sources":["../../src/constants/marginfiAccounts.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,eAAO,MAAM,sBAAsB,iDAAiD,CAAC;AAErF,eAAO,MAAM,iBAAiB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,CAAA;CAerE,CAAC;AAEF,eAAO,MAAM,8BAA8B,iDAAiD,CAAC"}
1
+ {"version":3,"file":"marginfiAccounts.d.ts","sourceRoot":"","sources":["../../src/constants/marginfiAccounts.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,eAAO,MAAM,sBAAsB,iDAAiD,CAAC;AAErF,eAAO,MAAM,iBAAiB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,CAAA;CAyBrE,CAAC;AAEF,eAAO,MAAM,8BAA8B,iDAAiD,CAAC"}
@@ -5,19 +5,29 @@ const spl_token_1 = require("@solana/spl-token");
5
5
  const tokenConstants_1 = require("./tokenConstants");
6
6
  exports.DEFAULT_MARGINFI_GROUP = "4qp6Fx6tnZkY5Wropq9wUYgtFxXKwE6viZxFHg3rdAG8";
7
7
  exports.MARGINFI_ACCOUNTS = {
8
- SOL: {
9
- mint: spl_token_1.NATIVE_MINT.toString(),
8
+ [spl_token_1.NATIVE_MINT.toString()]: {
10
9
  bank: "CCKtUs6Cgwo4aaQUmBPmyoApH2gUDErxNZCAntD6LYGh",
11
10
  liquidityVault: "2eicbpitfJXDwqCuFAmPgDP7t2oUotnAzbGzRKLMgSLe",
12
11
  vaultAuthority: "DD3AeAssFvjqTvRTrRAtpfjkBF8FpVKnFuwnMLN9haXD",
13
12
  priceOracle: "7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE"
14
13
  },
15
- USDC: {
16
- mint: tokenConstants_1.USDC_MINT,
14
+ [tokenConstants_1.USDC_MINT]: {
17
15
  bank: "2s37akK2eyBbp8DZgCm7RtsaEz8eJP3Nxd4urLHQv7yB",
18
16
  liquidityVault: "7jaiZR5Sk8hdYN9MxTpczTcwbWpb5WEoxSANuUwveuat",
19
17
  vaultAuthority: "3uxNepDbmkDNq6JhRja5Z8QwbTrfmkKP8AKZV5chYDGG",
20
18
  priceOracle: "Dpw1EAVrSB1ibxiDQyTAW6Zip3J4Btk2x4SgApQCeFbX"
19
+ },
20
+ [tokenConstants_1.B_SOL]: {
21
+ bank: "6hS9i46WyTq1KXcoa2Chas2Txh9TJAVr6n1t3tnrE23K",
22
+ liquidityVault: "2WMipeKDB2CENxbzdmnVrRbsxCA2LY6kCtBe6AAqDP9p",
23
+ vaultAuthority: "8RcZHucpVHkHWRRdMhJZsxBK9mqKSYnMKGqtF84U8YEo",
24
+ priceOracle: "5cN76Xm2Dtx9MnrQqBDeZZRsWruTTcw37UruznAdSvvE",
25
+ },
26
+ [tokenConstants_1.JUP]: {
27
+ bank: "Guu5uBc8k1WK1U2ihGosNaCy57LSgCkpWAabtzQqrQf8",
28
+ liquidityVault: "4w49W4fNDn778wsBa6TNq9hvebZKU17ymsptrEZ8zrsm",
29
+ vaultAuthority: "2MBwwAhL3c73Jy7HkWd9ofzh1bU39JBabrZCFQR2tUof",
30
+ priceOracle: "7dbob1psH1iZBS7qPsm3Kwbf5DzSXK8Jyg31CTgTnxH5",
21
31
  }
22
32
  };
23
33
  exports.MARGINFI_ACCOUNTS_LOOKUP_TABLE = "GAjmWmBPcH5Gxbiykasydj6RsCEaCLyHEvK6kHdFigc6";
@@ -1,5 +1,7 @@
1
1
  export declare const PYTH_PRICE_FEED_IDS: {
2
2
  [x: string]: string;
3
3
  EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v: string;
4
+ bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1: string;
5
+ JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN: string;
4
6
  };
5
7
  //# sourceMappingURL=pythConstants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pythConstants.d.ts","sourceRoot":"","sources":["../../src/constants/pythConstants.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,mBAAmB;;;CAK/B,CAAC"}
1
+ {"version":3,"file":"pythConstants.d.ts","sourceRoot":"","sources":["../../src/constants/pythConstants.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,mBAAmB;;;;;CAO/B,CAAC"}
@@ -7,4 +7,6 @@ const tokenConstants_1 = require("./tokenConstants");
7
7
  exports.PYTH_PRICE_FEED_IDS = {
8
8
  [spl_token_1.NATIVE_MINT.toString()]: "0xef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d",
9
9
  [tokenConstants_1.USDC_MINT]: "0xeaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a",
10
+ [tokenConstants_1.B_SOL]: "0x89875379e70f8fbadc17aef315adf3a8d5d160b811435537e03c97e8aac97d9c",
11
+ [tokenConstants_1.JUP]: "0x0a0408d619e9380abad35060f9192039ed5042fa6f82301d0e48bb52be830996",
10
12
  };
@@ -1,8 +1,14 @@
1
1
  export declare const USDC_MINT = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
2
+ export declare const B_SOL = "bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1";
3
+ export declare const JUP = "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN";
2
4
  export declare const ALL_SUPPORTED_TOKENS: string[];
3
- export declare const TOKEN_DECIMALS: {
4
- [x: string]: number;
5
- EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v: number;
5
+ interface TokenInfo {
6
+ decimals: number;
7
+ isStableCoin?: boolean;
8
+ isLST?: boolean;
9
+ }
10
+ export declare const TOKEN_INFO: {
11
+ [key: string]: TokenInfo;
6
12
  };
7
- export declare const STABLECOINS: string[];
13
+ export {};
8
14
  //# sourceMappingURL=tokenConstants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokenConstants.d.ts","sourceRoot":"","sources":["../../src/constants/tokenConstants.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS,iDAAiD,CAAC;AAGxE,eAAO,MAAM,oBAAoB,UAGhC,CAAC;AAEF,eAAO,MAAM,cAAc;;;CAG1B,CAAC;AAEF,eAAO,MAAM,WAAW,UAEvB,CAAC"}
1
+ {"version":3,"file":"tokenConstants.d.ts","sourceRoot":"","sources":["../../src/constants/tokenConstants.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS,iDAAiD,CAAC;AACxE,eAAO,MAAM,KAAK,gDAAgD,CAAC;AACnE,eAAO,MAAM,GAAG,gDAAgD,CAAC;AAGjE,eAAO,MAAM,oBAAoB,UAKhC,CAAC;AAEF,UAAU,SAAS;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,UAAU,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAelD,CAAC"}
@@ -1,17 +1,30 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.STABLECOINS = exports.TOKEN_DECIMALS = exports.ALL_SUPPORTED_TOKENS = exports.USDC_MINT = void 0;
3
+ exports.TOKEN_INFO = exports.ALL_SUPPORTED_TOKENS = exports.JUP = exports.B_SOL = exports.USDC_MINT = void 0;
4
4
  const spl_token_1 = require("@solana/spl-token");
5
- // When adding token ensure a price feed is provided in pythConstants.ts & the token is added to the necessary lists below
5
+ // When adding token ensure a price feed is provided in pythConstants.ts & the token is in TOKEN_INFO
6
6
  exports.USDC_MINT = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
7
+ exports.B_SOL = "bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1";
8
+ exports.JUP = "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN";
7
9
  exports.ALL_SUPPORTED_TOKENS = [
8
10
  spl_token_1.NATIVE_MINT.toString(),
9
11
  exports.USDC_MINT,
12
+ exports.B_SOL,
13
+ exports.JUP,
10
14
  ];
11
- exports.TOKEN_DECIMALS = {
12
- [spl_token_1.NATIVE_MINT.toString()]: 9,
13
- [exports.USDC_MINT]: 6
15
+ exports.TOKEN_INFO = {
16
+ [spl_token_1.NATIVE_MINT.toString()]: {
17
+ decimals: 9,
18
+ },
19
+ [exports.USDC_MINT]: {
20
+ decimals: 6,
21
+ isStableCoin: true
22
+ },
23
+ [exports.B_SOL]: {
24
+ decimals: 9,
25
+ isLST: true
26
+ },
27
+ [exports.JUP]: {
28
+ decimals: 6
29
+ }
14
30
  };
15
- exports.STABLECOINS = [
16
- exports.USDC_MINT
17
- ];
@@ -42,8 +42,8 @@ export declare class StaleProtocolDataError extends ProgramError {
42
42
  readonly code: number;
43
43
  constructor(program: Program, cause?: Error);
44
44
  }
45
- /** UnableToReposition: Unable to adjust position to the desired utilization rate */
46
- export declare class UnableToRepositionError extends ProgramError {
45
+ /** UnableToRebalance: Unable to adjust position to the desired utilization rate */
46
+ export declare class UnableToRebalanceError extends ProgramError {
47
47
  readonly name: string;
48
48
  readonly code: number;
49
49
  constructor(program: Program, cause?: Error);
@@ -1 +1 @@
1
- {"version":3,"file":"solauto.d.ts","sourceRoot":"","sources":["../../../src/generated/errors/solauto.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"solauto.d.ts","sourceRoot":"","sources":["../../../src/generated/errors/solauto.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AASjE,0FAA0F;AAC1F,qBAAa,sBAAuB,SAAQ,YAAY;IACtD,SAAkB,IAAI,EAAE,MAAM,CAAuB;IAErD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAO;gBAEhB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK;CAO5C;AAID,2GAA2G;AAC3G,qBAAa,iCAAkC,SAAQ,YAAY;IACjE,SAAkB,IAAI,EAAE,MAAM,CAAkC;IAEhE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAO;gBAEhB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK;CAO5C;AAOD,+DAA+D;AAC/D,qBAAa,4BAA6B,SAAQ,YAAY;IAC5D,SAAkB,IAAI,EAAE,MAAM,CAA6B;IAE3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAO;gBAEhB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK;CAG5C;AAID,qDAAqD;AACrD,qBAAa,uBAAwB,SAAQ,YAAY;IACvD,SAAkB,IAAI,EAAE,MAAM,CAAwB;IAEtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAO;gBAEhB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK;CAG5C;AAID,2DAA2D;AAC3D,qBAAa,0BAA2B,SAAQ,YAAY;IAC1D,SAAkB,IAAI,EAAE,MAAM,CAA2B;IAEzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAO;gBAEhB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK;CAG5C;AAID,kHAAkH;AAClH,qBAAa,sBAAuB,SAAQ,YAAY;IACtD,SAAkB,IAAI,EAAE,MAAM,CAAuB;IAErD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAO;gBAEhB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK;CAO5C;AAID,mFAAmF;AACnF,qBAAa,sBAAuB,SAAQ,YAAY;IACtD,SAAkB,IAAI,EAAE,MAAM,CAAuB;IAErD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAO;gBAEhB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK;CAO5C;AAID,oGAAoG;AACpG,qBAAa,iCAAkC,SAAQ,YAAY;IACjE,SAAkB,IAAI,EAAE,MAAM,CAAkC;IAEhE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAO;gBAEhB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK;CAO5C;AAOD,yEAAyE;AACzE,qBAAa,8BAA+B,SAAQ,YAAY;IAC9D,SAAkB,IAAI,EAAE,MAAM,CAA+B;IAE7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAO;gBAEhB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK;CAG5C;AAID,mEAAmE;AACnE,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,SAAkB,IAAI,EAAE,MAAM,CAAsB;IAEpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAO;gBAEhB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK;CAG5C;AAID,yFAAyF;AACzF,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,SAAkB,IAAI,EAAE,MAAM,CAAoB;IAElD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAO;gBAEhB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK;CAO5C;AAID,8EAA8E;AAC9E,qBAAa,0BAA2B,SAAQ,YAAY;IAC1D,SAAkB,IAAI,EAAE,MAAM,CAA2B;IAEzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAO;gBAEhB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK;CAG5C;AAID;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,KAAK,CAAC,EAAE,KAAK,GACZ,YAAY,GAAG,IAAI,CAGrB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,KAAK,CAAC,EAAE,KAAK,GACZ,YAAY,GAAG,IAAI,CAGrB"}
@@ -7,7 +7,7 @@
7
7
  * @see https://github.com/metaplex-foundation/kinobi
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.IncorrectInstructionsError = exports.RebalanceAbuseError = exports.InstructionIsCPIError = exports.InvalidRebalanceConditionError = exports.ExceededValidUtilizationRateError = exports.UnableToRepositionError = exports.StaleProtocolDataError = exports.InvalidAutomationDataError = exports.InvalidDCASettingsError = exports.InvalidPositionSettingsError = exports.FailedAccountDeserializationError = exports.IncorrectAccountsError = void 0;
10
+ exports.IncorrectInstructionsError = exports.RebalanceAbuseError = exports.InstructionIsCPIError = exports.InvalidRebalanceConditionError = exports.ExceededValidUtilizationRateError = exports.UnableToRebalanceError = exports.StaleProtocolDataError = exports.InvalidAutomationDataError = exports.InvalidDCASettingsError = exports.InvalidPositionSettingsError = exports.FailedAccountDeserializationError = exports.IncorrectAccountsError = void 0;
11
11
  exports.getSolautoErrorFromCode = getSolautoErrorFromCode;
12
12
  exports.getSolautoErrorFromName = getSolautoErrorFromName;
13
13
  const umi_1 = require("@metaplex-foundation/umi");
@@ -79,17 +79,17 @@ class StaleProtocolDataError extends umi_1.ProgramError {
79
79
  exports.StaleProtocolDataError = StaleProtocolDataError;
80
80
  codeToErrorMap.set(0x5, StaleProtocolDataError);
81
81
  nameToErrorMap.set('StaleProtocolData', StaleProtocolDataError);
82
- /** UnableToReposition: Unable to adjust position to the desired utilization rate */
83
- class UnableToRepositionError extends umi_1.ProgramError {
82
+ /** UnableToRebalance: Unable to adjust position to the desired utilization rate */
83
+ class UnableToRebalanceError extends umi_1.ProgramError {
84
84
  constructor(program, cause) {
85
85
  super('Unable to adjust position to the desired utilization rate', program, cause);
86
- this.name = 'UnableToReposition';
86
+ this.name = 'UnableToRebalance';
87
87
  this.code = 0x6; // 6
88
88
  }
89
89
  }
90
- exports.UnableToRepositionError = UnableToRepositionError;
91
- codeToErrorMap.set(0x6, UnableToRepositionError);
92
- nameToErrorMap.set('UnableToReposition', UnableToRepositionError);
90
+ exports.UnableToRebalanceError = UnableToRebalanceError;
91
+ codeToErrorMap.set(0x6, UnableToRebalanceError);
92
+ nameToErrorMap.set('UnableToRebalance', UnableToRebalanceError);
93
93
  /** ExceededValidUtilizationRate: Desired action brought the utilization rate to an unsafe amount */
94
94
  class ExceededValidUtilizationRateError extends umi_1.ProgramError {
95
95
  constructor(program, cause) {
@@ -9,8 +9,9 @@ import { Serializer } from '@metaplex-foundation/umi/serializers';
9
9
  export declare enum OracleSetup {
10
10
  None = 0,
11
11
  PythLegacy = 1,
12
- SwitchboardV2 = 2,
13
- PythPushOracle = 3
12
+ SwitchboardLegacy = 2,
13
+ PythPushOracle = 3,
14
+ SwitchboardPull = 4
14
15
  }
15
16
  export type OracleSetupArgs = OracleSetup;
16
17
  export declare function getOracleSetupSerializer(): Serializer<OracleSetupArgs, OracleSetup>;
@@ -1 +1 @@
1
- {"version":3,"file":"oracleSetup.d.ts","sourceRoot":"","sources":["../../../src/marginfi-sdk/types/oracleSetup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAc,MAAM,sCAAsC,CAAC;AAE9E,oBAAY,WAAW;IACrB,IAAI,IAAA;IACJ,UAAU,IAAA;IACV,aAAa,IAAA;IACb,cAAc,IAAA;CACf;AAED,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC;AAE1C,wBAAgB,wBAAwB,IAAI,UAAU,CACpD,eAAe,EACf,WAAW,CACZ,CAIA"}
1
+ {"version":3,"file":"oracleSetup.d.ts","sourceRoot":"","sources":["../../../src/marginfi-sdk/types/oracleSetup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAc,MAAM,sCAAsC,CAAC;AAE9E,oBAAY,WAAW;IACrB,IAAI,IAAA;IACJ,UAAU,IAAA;IACV,iBAAiB,IAAA;IACjB,cAAc,IAAA;IACd,eAAe,IAAA;CAChB;AAED,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC;AAE1C,wBAAgB,wBAAwB,IAAI,UAAU,CACpD,eAAe,EACf,WAAW,CACZ,CAIA"}
@@ -14,8 +14,9 @@ var OracleSetup;
14
14
  (function (OracleSetup) {
15
15
  OracleSetup[OracleSetup["None"] = 0] = "None";
16
16
  OracleSetup[OracleSetup["PythLegacy"] = 1] = "PythLegacy";
17
- OracleSetup[OracleSetup["SwitchboardV2"] = 2] = "SwitchboardV2";
17
+ OracleSetup[OracleSetup["SwitchboardLegacy"] = 2] = "SwitchboardLegacy";
18
18
  OracleSetup[OracleSetup["PythPushOracle"] = 3] = "PythPushOracle";
19
+ OracleSetup[OracleSetup["SwitchboardPull"] = 4] = "SwitchboardPull";
19
20
  })(OracleSetup || (exports.OracleSetup = OracleSetup = {}));
20
21
  function getOracleSetupSerializer() {
21
22
  return (0, serializers_1.scalarEnum)(OracleSetup, {
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * @see https://github.com/metaplex-foundation/kinobi
7
7
  */
8
- import { Serializer } from '@metaplex-foundation/umi/serializers';
8
+ import { Serializer } from "@metaplex-foundation/umi/serializers";
9
9
  export type WrappedI80F48 = {
10
10
  value: number[];
11
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"wrappedI80F48.d.ts","sourceRoot":"","sources":["../../../src/marginfi-sdk/types/wrappedI80F48.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAqB,MAAM,sCAAsC,CAAC;AAErF,MAAM,MAAM,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEhD,MAAM,MAAM,iBAAiB,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEpD,wBAAgB,0BAA0B,IAAI,UAAU,CACtD,iBAAiB,EACjB,aAAa,CACd,CAIA"}
1
+ {"version":3,"file":"wrappedI80F48.d.ts","sourceRoot":"","sources":["../../../src/marginfi-sdk/types/wrappedI80F48.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,UAAU,EAIX,MAAM,sCAAsC,CAAC;AAE9C,MAAM,MAAM,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEhD,MAAM,MAAM,iBAAiB,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEpD,wBAAgB,0BAA0B,IAAI,UAAU,CACtD,iBAAiB,EACjB,aAAa,CACd,CAIA"}
@@ -10,7 +10,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.getWrappedI80F48Serializer = getWrappedI80F48Serializer;
11
11
  const serializers_1 = require("@metaplex-foundation/umi/serializers");
12
12
  function getWrappedI80F48Serializer() {
13
- return (0, serializers_1.struct)([['value', (0, serializers_1.array)((0, serializers_1.u8)(), { size: 16 })]], {
14
- description: 'WrappedI80F48',
13
+ return (0, serializers_1.struct)([["value", (0, serializers_1.array)((0, serializers_1.u8)(), { size: 16 })]], {
14
+ description: "WrappedI80F48",
15
15
  });
16
16
  }
@@ -1,5 +1,4 @@
1
1
  export interface MarginfiAssetAccounts {
2
- mint: string;
3
2
  bank: string;
4
3
  liquidityVault: string;
5
4
  vaultAuthority: string;
@@ -1 +1 @@
1
- {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../src/types/accounts.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB"}
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../src/types/accounts.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB"}
@@ -4,10 +4,7 @@ import { Bank } from "../marginfi-sdk";
4
4
  import { MarginfiAssetAccounts } from "../types/accounts";
5
5
  import { PositionState } from "../generated";
6
6
  import { LivePositionUpdates } from "./solauto/generalUtils";
7
- export declare function findMarginfiAccounts({ mint, bank, }: {
8
- mint?: string;
9
- bank?: string;
10
- }): MarginfiAssetAccounts;
7
+ export declare function findMarginfiAccounts(bank: PublicKey): MarginfiAssetAccounts;
11
8
  export declare function getMaxLtvAndLiqThreshold(umi: Umi, supply: {
12
9
  mint: PublicKey;
13
10
  bank?: Bank | null;
@@ -1 +1 @@
1
- {"version":3,"file":"marginfiUtils.d.ts","sourceRoot":"","sources":["../../src/utils/marginfiUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EACL,IAAI,EAKL,MAAM,iBAAiB,CAAC;AAUzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAsB,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAG7D,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,IAAI,GACL,EAAE;IACD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,qBAAqB,CAWxB;AAED,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,GAAG,EACR,MAAM,EAAE;IACN,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,EACD,IAAI,EAAE;IACJ,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,EACD,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA8D3B;AAED,wBAAsB,iCAAiC,CACrD,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,qBAAqB,CAAC,EAAE,OAAO,GAC9B,OAAO,CACR;IAAE,eAAe,EAAE,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,EAAE,CAC/E,CA6CA;AAgED,wBAAsB,+BAA+B,CACnD,GAAG,EAAE,GAAG,EACR,iBAAiB,EAAE,SAAS,EAC5B,UAAU,CAAC,EAAE,SAAS,EACtB,QAAQ,CAAC,EAAE,SAAS,EACpB,mBAAmB,CAAC,EAAE,mBAAmB,GACxC,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA+IpC;AA+DD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA0B3B"}
1
+ {"version":3,"file":"marginfiUtils.d.ts","sourceRoot":"","sources":["../../src/utils/marginfiUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EACL,IAAI,EAKL,MAAM,iBAAiB,CAAC;AAUzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAsB,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAG7D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,qBAAqB,CAU3E;AAED,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,GAAG,EACR,MAAM,EAAE;IACN,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,EACD,IAAI,EAAE;IACJ,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,EACD,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA2D3B;AAED,wBAAsB,iCAAiC,CACrD,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,qBAAqB,CAAC,EAAE,OAAO,GAC9B,OAAO,CACR;IAAE,eAAe,EAAE,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,EAAE,CAC/E,CA6CA;AAgED,wBAAsB,+BAA+B,CACnD,GAAG,EAAE,GAAG,EACR,iBAAiB,EAAE,SAAS,EAC5B,UAAU,CAAC,EAAE,SAAS,EACtB,QAAQ,CAAC,EAAE,SAAS,EACpB,mBAAmB,CAAC,EAAE,mBAAmB,GACxC,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA+IpC;AA+DD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA0B3B"}
@@ -15,28 +15,22 @@ const solautoConstants_1 = require("../constants/solautoConstants");
15
15
  const marginfiAccounts_1 = require("../constants/marginfiAccounts");
16
16
  const generalAccounts_1 = require("../constants/generalAccounts");
17
17
  const solanaUtils_1 = require("./solanaUtils");
18
- function findMarginfiAccounts({ mint, bank, }) {
18
+ function findMarginfiAccounts(bank) {
19
19
  for (const key in marginfiAccounts_1.MARGINFI_ACCOUNTS) {
20
20
  const account = marginfiAccounts_1.MARGINFI_ACCOUNTS[key];
21
- if (mint && account.mint.toString().toLowerCase() === mint.toLowerCase()) {
22
- return account;
23
- }
24
- if (bank && account.bank.toString().toLowerCase() === bank.toLowerCase()) {
21
+ if (account.bank.toString().toLowerCase() === bank.toString().toLowerCase()) {
25
22
  return account;
26
23
  }
27
24
  }
28
- throw new Error(`Marginfi accounts not found by the mint: ${mint}`);
25
+ throw new Error(`Marginfi accounts not found by the bank: ${bank}`);
29
26
  }
30
27
  async function getMaxLtvAndLiqThreshold(umi, supply, debt, supplyPrice) {
31
28
  if (!supply.bank || supply.bank === null) {
32
- supply.bank = await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(findMarginfiAccounts({
33
- mint: supply.mint.toString(),
34
- }).bank));
29
+ supply.bank = await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(marginfiAccounts_1.MARGINFI_ACCOUNTS[supply.mint.toString()].bank));
35
30
  }
36
- if ((!debt.bank || debt.bank === null) && !debt.mint.equals(web3_js_1.PublicKey.default)) {
37
- debt.bank = await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(findMarginfiAccounts({
38
- mint: debt.mint.toString(),
39
- }).bank));
31
+ if ((!debt.bank || debt.bank === null) &&
32
+ !debt.mint.equals(web3_js_1.PublicKey.default)) {
33
+ debt.bank = await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(marginfiAccounts_1.MARGINFI_ACCOUNTS[debt.mint.toString()].bank));
40
34
  }
41
35
  if (!supplyPrice) {
42
36
  const [price] = await (0, generalUtils_1.getTokenPrices)([
@@ -141,10 +135,10 @@ async function getTokenUsage(umi, bank, isAsset, shares, amountUsedAdjustment) {
141
135
  async function getMarginfiAccountPositionState(umi, marginfiAccountPk, supplyMint, debtMint, livePositionUpdates) {
142
136
  let marginfiAccount = await (0, marginfi_sdk_1.safeFetchMarginfiAccount)(umi, (0, umi_1.publicKey)(marginfiAccountPk));
143
137
  let supplyBank = supplyMint && supplyMint !== web3_js_1.PublicKey.default
144
- ? await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(findMarginfiAccounts({ mint: supplyMint.toString() }).bank))
138
+ ? await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(marginfiAccounts_1.MARGINFI_ACCOUNTS[supplyMint.toString()].bank))
145
139
  : null;
146
140
  let debtBank = debtMint && debtMint !== web3_js_1.PublicKey.default
147
- ? await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(findMarginfiAccounts({ mint: debtMint.toString() }).bank))
141
+ ? await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(marginfiAccounts_1.MARGINFI_ACCOUNTS[debtMint.toString()].bank))
148
142
  : null;
149
143
  let supplyUsage = undefined;
150
144
  let debtUsage = undefined;
@@ -235,8 +235,8 @@ async function positionStateWithLatestPrices(state, supplyPrice, debtPrice) {
235
235
  };
236
236
  }
237
237
  function createFakePositionState(supply, debt, maxLtvBps, liqThresholdBps) {
238
- const supplyDecimals = constants_1.TOKEN_DECIMALS[supply.mint.toString()];
239
- const debtDecimals = constants_1.TOKEN_DECIMALS[debt.mint.toString()];
238
+ const supplyDecimals = constants_1.TOKEN_INFO[supply.mint.toString()].decimals;
239
+ const debtDecimals = constants_1.TOKEN_INFO[debt.mint.toString()].decimals;
240
240
  const supplyUsd = supply.amountUsed * supply.price;
241
241
  const debtUsd = debt.amountUsed * debt.price;
242
242
  return {
@@ -14,7 +14,7 @@ async function addBanks() {
14
14
  const accounts = MARGINFI_ACCOUNTS[key];
15
15
  await updateLookupTable(
16
16
  [
17
- accounts.mint,
17
+ key,
18
18
  accounts.bank,
19
19
  accounts.liquidityVault,
20
20
  accounts.vaultAuthority,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haven-fi/solauto-sdk",
3
- "version": "1.0.70",
3
+ "version": "1.0.72",
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",
@@ -16,6 +16,7 @@ import { SolautoClient, SolautoClientArgs } from "./solautoClient";
16
16
  import { MarginfiAssetAccounts } from "../types/accounts";
17
17
  import {
18
18
  DEFAULT_MARGINFI_GROUP,
19
+ MARGINFI_ACCOUNTS,
19
20
  MARGINFI_ACCOUNTS_LOOKUP_TABLE,
20
21
  } from "../constants/marginfiAccounts";
21
22
  import {
@@ -33,6 +34,7 @@ import {
33
34
  import { getMarginfiAccountPDA, getTokenAccount } from "../utils/accountUtils";
34
35
  import { generateRandomU64 } from "../utils/generalUtils";
35
36
  import {
37
+ Bank,
36
38
  MARGINFI_PROGRAM_ID,
37
39
  MarginfiAccount,
38
40
  lendingAccountBorrow,
@@ -42,7 +44,9 @@ import {
42
44
  lendingAccountStartFlashloan,
43
45
  lendingAccountWithdraw,
44
46
  marginfiAccountInitialize,
47
+ safeFetchAllBank,
45
48
  safeFetchAllMarginfiAccount,
49
+ safeFetchBank,
46
50
  safeFetchMarginfiAccount,
47
51
  } from "../marginfi-sdk";
48
52
  import { JupSwapDetails } from "../utils/jupiterUtils";
@@ -74,6 +78,9 @@ export class SolautoMarginfiClient extends SolautoClient {
74
78
  public marginfiSupplyAccounts!: MarginfiAssetAccounts;
75
79
  public marginfiDebtAccounts!: MarginfiAssetAccounts;
76
80
 
81
+ public supplyPriceOracle!: PublicKey;
82
+ public debtPriceOracle!: PublicKey;
83
+
77
84
  // For flash loans
78
85
  public intermediaryMarginfiAccountSigner?: Signer;
79
86
  public intermediaryMarginfiAccountPk!: PublicKey;
@@ -108,12 +115,20 @@ export class SolautoMarginfiClient extends SolautoClient {
108
115
  ? toWeb3JsPublicKey(marginfiAccountData.group)
109
116
  : args.marginfiGroup ?? new PublicKey(DEFAULT_MARGINFI_GROUP);
110
117
 
111
- this.marginfiSupplyAccounts = findMarginfiAccounts({
112
- mint: this.supplyMint.toString(),
113
- })!;
114
- this.marginfiDebtAccounts = findMarginfiAccounts({
115
- mint: this.debtMint.toString(),
116
- })!;
118
+ this.marginfiSupplyAccounts =
119
+ MARGINFI_ACCOUNTS[this.supplyMint.toString()]!;
120
+ this.marginfiDebtAccounts = MARGINFI_ACCOUNTS[this.debtMint.toString()]!;
121
+
122
+ // TODO: Don't dynamically pull from bank until Marginfi sorts out their price oracle issues.
123
+ // const [supplyBank, debtBank] = await safeFetchAllBank(this.umi, [
124
+ // publicKey(this.marginfiSupplyAccounts.bank),
125
+ // publicKey(this.marginfiDebtAccounts.bank),
126
+ // ]);
127
+ // this.supplyPriceOracle = toWeb3JsPublicKey(supplyBank.config.oracleKeys[0]);
128
+ // this.debtPriceOracle = toWeb3JsPublicKey(debtBank.config.oracleKeys[0]);
129
+
130
+ this.supplyPriceOracle = new PublicKey(this.marginfiSupplyAccounts.priceOracle);
131
+ this.debtPriceOracle = new PublicKey(this.marginfiDebtAccounts.priceOracle);
117
132
 
118
133
  if (!this.initialized) {
119
134
  await this.setIntermediaryMarginfiDetails();
@@ -171,7 +186,9 @@ export class SolautoMarginfiClient extends SolautoClient {
171
186
  return [
172
187
  ...super.lutAccountsToAdd(),
173
188
  this.marginfiAccountPk,
174
- ...(this.signer.publicKey.toString() === this.authority.toString() ? [this.intermediaryMarginfiAccountPk] : []),
189
+ ...(this.signer.publicKey.toString() === this.authority.toString()
190
+ ? [this.intermediaryMarginfiAccountPk]
191
+ : []),
175
192
  ];
176
193
  }
177
194
 
@@ -246,9 +263,9 @@ export class SolautoMarginfiClient extends SolautoClient {
246
263
  marginfiGroup: publicKey(this.marginfiGroup),
247
264
  marginfiAccount: publicKey(this.marginfiAccount),
248
265
  supplyBank: publicKey(this.marginfiSupplyAccounts.bank),
249
- supplyPriceOracle: publicKey(this.marginfiSupplyAccounts.priceOracle),
266
+ supplyPriceOracle: publicKey(this.supplyPriceOracle),
250
267
  debtBank: publicKey(this.marginfiDebtAccounts.bank),
251
- debtPriceOracle: publicKey(this.marginfiDebtAccounts.priceOracle),
268
+ debtPriceOracle: publicKey(this.debtPriceOracle),
252
269
  solautoPosition: publicKey(this.solautoPosition),
253
270
  });
254
271
  }
@@ -358,18 +375,14 @@ export class SolautoMarginfiClient extends SolautoClient {
358
375
  : this.positionDebtTa
359
376
  );
360
377
  vaultDebtTa = publicKey(this.marginfiDebtAccounts.liquidityVault);
361
- debtVaultAuthority = publicKey(
362
- this.marginfiDebtAccounts.vaultAuthority
363
- );
378
+ debtVaultAuthority = publicKey(this.marginfiDebtAccounts.vaultAuthority);
364
379
  }
365
380
 
366
381
  let supplyPriceOracle: UmiPublicKey | undefined = undefined;
367
382
  let debtPriceOracle: UmiPublicKey | undefined = undefined;
368
383
  if (args.__kind === "Withdraw" || args.__kind === "Borrow") {
369
- supplyPriceOracle = publicKey(
370
- this.marginfiSupplyAccounts.priceOracle
371
- );
372
- debtPriceOracle = publicKey(this.marginfiDebtAccounts.priceOracle);
384
+ supplyPriceOracle = publicKey(this.supplyPriceOracle);
385
+ debtPriceOracle = publicKey(this.debtPriceOracle);
373
386
  }
374
387
 
375
388
  return marginfiProtocolInteraction(this.umi, {
@@ -431,7 +444,7 @@ export class SolautoMarginfiClient extends SolautoClient {
431
444
  )
432
445
  ),
433
446
  supplyBank: publicKey(this.marginfiSupplyAccounts.bank),
434
- supplyPriceOracle: publicKey(this.marginfiSupplyAccounts.priceOracle),
447
+ supplyPriceOracle: publicKey(this.supplyPriceOracle),
435
448
  positionSupplyTa: publicKey(this.positionSupplyTa),
436
449
  signerSupplyTa: this.selfManaged
437
450
  ? publicKey(this.signerSupplyTa)
@@ -443,7 +456,7 @@ export class SolautoMarginfiClient extends SolautoClient {
443
456
  ? publicKey(this.marginfiSupplyAccounts.vaultAuthority)
444
457
  : undefined,
445
458
  debtBank: publicKey(this.marginfiDebtAccounts.bank),
446
- debtPriceOracle: publicKey(this.marginfiDebtAccounts.priceOracle),
459
+ debtPriceOracle: publicKey(this.debtPriceOracle),
447
460
  positionDebtTa: publicKey(this.positionDebtTa),
448
461
  signerDebtTa: this.selfManaged ? publicKey(this.signerDebtTa) : undefined,
449
462
  vaultDebtTa: needDebtAccounts
@@ -489,20 +502,25 @@ export class SolautoMarginfiClient extends SolautoClient {
489
502
  }
490
503
 
491
504
  flashRepay(flashLoanDetails: FlashLoanDetails): TransactionBuilder {
492
- const bank = flashLoanDetails.mint.equals(this.supplyMint)
493
- ? this.marginfiSupplyAccounts
494
- : this.marginfiDebtAccounts;
505
+ const accounts = flashLoanDetails.mint.equals(this.supplyMint)
506
+ ? { data: this.marginfiSupplyAccounts, oracle: this.supplyPriceOracle }
507
+ : { data: this.marginfiDebtAccounts, oracle: this.debtPriceOracle };
495
508
 
496
509
  const remainingAccounts: AccountMeta[] = [];
497
510
  let includedFlashLoanToken = false;
498
511
 
499
512
  if (this.intermediaryMarginfiAccount) {
500
- this.intermediaryMarginfiAccount.lendingAccount.balances.forEach((x) => {
513
+ this.intermediaryMarginfiAccount.lendingAccount.balances.forEach(async (x) => {
501
514
  if (x.active) {
502
- if (x.bankPk === bank.bank) {
515
+ if (x.bankPk === accounts.data.bank) {
503
516
  includedFlashLoanToken = true;
504
517
  }
505
518
 
519
+ // TODO: Don't dynamically pull from bank until Marginfi sorts out their price oracle issues.
520
+ // const bankData = await safeFetchBank(this.umi, publicKey(accounts.data.bank));
521
+ // const priceOracle = bankData!.config.oracleKeys[0];
522
+ const priceOracle = publicKey(findMarginfiAccounts(toWeb3JsPublicKey(x.bankPk)).priceOracle);
523
+
506
524
  remainingAccounts.push(
507
525
  ...[
508
526
  {
@@ -511,10 +529,7 @@ export class SolautoMarginfiClient extends SolautoClient {
511
529
  isWritable: false,
512
530
  },
513
531
  {
514
- pubkey: publicKey(
515
- findMarginfiAccounts({ bank: x.bankPk.toString() })
516
- .priceOracle
517
- ),
532
+ pubkey: priceOracle,
518
533
  isSigner: false,
519
534
  isWritable: false,
520
535
  },
@@ -527,12 +542,12 @@ export class SolautoMarginfiClient extends SolautoClient {
527
542
  remainingAccounts.push(
528
543
  ...[
529
544
  {
530
- pubkey: fromWeb3JsPublicKey(new PublicKey(bank.bank)),
545
+ pubkey: fromWeb3JsPublicKey(new PublicKey(accounts.data.bank)),
531
546
  isSigner: false,
532
547
  isWritable: false,
533
548
  },
534
549
  {
535
- pubkey: fromWeb3JsPublicKey(new PublicKey(bank.priceOracle)),
550
+ pubkey: fromWeb3JsPublicKey(new PublicKey(accounts.oracle)),
536
551
  isSigner: false,
537
552
  isWritable: false,
538
553
  },
@@ -545,8 +560,8 @@ export class SolautoMarginfiClient extends SolautoClient {
545
560
  lendingAccountRepay(this.umi, {
546
561
  amount: flashLoanDetails.baseUnitAmount,
547
562
  repayAll: null,
548
- bank: publicKey(bank.bank),
549
- bankLiquidityVault: publicKey(bank.liquidityVault),
563
+ bank: publicKey(accounts.data.bank),
564
+ bankLiquidityVault: publicKey(accounts.data.liquidityVault),
550
565
  marginfiAccount: publicKey(this.intermediaryMarginfiAccountPk),
551
566
  marginfiGroup: publicKey(DEFAULT_MARGINFI_GROUP),
552
567
  signer: this.signer,
@@ -1,23 +1,33 @@
1
1
  import { NATIVE_MINT } from "@solana/spl-token";
2
- import { USDC_MINT } from "./tokenConstants";
2
+ import { B_SOL, JUP, USDC_MINT } from "./tokenConstants";
3
3
  import { MarginfiAssetAccounts } from "../types/accounts";
4
4
 
5
5
  export const DEFAULT_MARGINFI_GROUP = "4qp6Fx6tnZkY5Wropq9wUYgtFxXKwE6viZxFHg3rdAG8";
6
6
 
7
7
  export const MARGINFI_ACCOUNTS: { [key: string]: MarginfiAssetAccounts } = {
8
- SOL: {
9
- mint: NATIVE_MINT.toString(),
8
+ [NATIVE_MINT.toString()]: {
10
9
  bank: "CCKtUs6Cgwo4aaQUmBPmyoApH2gUDErxNZCAntD6LYGh",
11
10
  liquidityVault: "2eicbpitfJXDwqCuFAmPgDP7t2oUotnAzbGzRKLMgSLe",
12
11
  vaultAuthority: "DD3AeAssFvjqTvRTrRAtpfjkBF8FpVKnFuwnMLN9haXD",
13
12
  priceOracle: "7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE"
14
13
  },
15
- USDC: {
16
- mint: USDC_MINT,
14
+ [USDC_MINT]: {
17
15
  bank: "2s37akK2eyBbp8DZgCm7RtsaEz8eJP3Nxd4urLHQv7yB",
18
16
  liquidityVault: "7jaiZR5Sk8hdYN9MxTpczTcwbWpb5WEoxSANuUwveuat",
19
17
  vaultAuthority: "3uxNepDbmkDNq6JhRja5Z8QwbTrfmkKP8AKZV5chYDGG",
20
18
  priceOracle: "Dpw1EAVrSB1ibxiDQyTAW6Zip3J4Btk2x4SgApQCeFbX"
19
+ },
20
+ [B_SOL]: {
21
+ bank: "6hS9i46WyTq1KXcoa2Chas2Txh9TJAVr6n1t3tnrE23K",
22
+ liquidityVault: "2WMipeKDB2CENxbzdmnVrRbsxCA2LY6kCtBe6AAqDP9p",
23
+ vaultAuthority: "8RcZHucpVHkHWRRdMhJZsxBK9mqKSYnMKGqtF84U8YEo",
24
+ priceOracle: "5cN76Xm2Dtx9MnrQqBDeZZRsWruTTcw37UruznAdSvvE",
25
+ },
26
+ [JUP]: {
27
+ bank: "Guu5uBc8k1WK1U2ihGosNaCy57LSgCkpWAabtzQqrQf8",
28
+ liquidityVault: "4w49W4fNDn778wsBa6TNq9hvebZKU17ymsptrEZ8zrsm",
29
+ vaultAuthority: "2MBwwAhL3c73Jy7HkWd9ofzh1bU39JBabrZCFQR2tUof",
30
+ priceOracle: "7dbob1psH1iZBS7qPsm3Kwbf5DzSXK8Jyg31CTgTnxH5",
21
31
  }
22
32
  };
23
33
 
@@ -1,5 +1,5 @@
1
1
  import { NATIVE_MINT } from "@solana/spl-token";
2
- import { USDC_MINT } from "./tokenConstants";
2
+ import { B_SOL, JUP, USDC_MINT } from "./tokenConstants";
3
3
 
4
4
  // https://pyth.network/developers/price-feed-ids#solana-stable
5
5
  export const PYTH_PRICE_FEED_IDS = {
@@ -7,4 +7,6 @@ export const PYTH_PRICE_FEED_IDS = {
7
7
  "0xef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d",
8
8
  [USDC_MINT]:
9
9
  "0xeaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a",
10
- };
10
+ [B_SOL]: "0x89875379e70f8fbadc17aef315adf3a8d5d160b811435537e03c97e8aac97d9c",
11
+ [JUP]: "0x0a0408d619e9380abad35060f9192039ed5042fa6f82301d0e48bb52be830996",
12
+ };
@@ -1,19 +1,37 @@
1
1
  import { NATIVE_MINT } from "@solana/spl-token";
2
2
 
3
- // When adding token ensure a price feed is provided in pythConstants.ts & the token is added to the necessary lists below
3
+ // When adding token ensure a price feed is provided in pythConstants.ts & the token is in TOKEN_INFO
4
4
  export const USDC_MINT = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
5
+ export const B_SOL = "bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1";
6
+ export const JUP = "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN";
5
7
 
6
8
 
7
9
  export const ALL_SUPPORTED_TOKENS = [
8
10
  NATIVE_MINT.toString(),
9
11
  USDC_MINT,
12
+ B_SOL,
13
+ JUP,
10
14
  ];
11
15
 
12
- export const TOKEN_DECIMALS = {
13
- [NATIVE_MINT.toString()]: 9,
14
- [USDC_MINT]: 6
15
- };
16
+ interface TokenInfo {
17
+ decimals: number;
18
+ isStableCoin?: boolean;
19
+ isLST?: boolean;
20
+ }
16
21
 
17
- export const STABLECOINS = [
18
- USDC_MINT
19
- ];
22
+ export const TOKEN_INFO: { [key: string]: TokenInfo } = {
23
+ [NATIVE_MINT.toString()]: {
24
+ decimals: 9,
25
+ },
26
+ [USDC_MINT]: {
27
+ decimals: 6,
28
+ isStableCoin: true
29
+ },
30
+ [B_SOL]: {
31
+ decimals: 9,
32
+ isLST: true
33
+ },
34
+ [JUP]: {
35
+ decimals: 6
36
+ }
37
+ };
@@ -108,9 +108,9 @@ export class StaleProtocolDataError extends ProgramError {
108
108
  codeToErrorMap.set(0x5, StaleProtocolDataError);
109
109
  nameToErrorMap.set('StaleProtocolData', StaleProtocolDataError);
110
110
 
111
- /** UnableToReposition: Unable to adjust position to the desired utilization rate */
112
- export class UnableToRepositionError extends ProgramError {
113
- override readonly name: string = 'UnableToReposition';
111
+ /** UnableToRebalance: Unable to adjust position to the desired utilization rate */
112
+ export class UnableToRebalanceError extends ProgramError {
113
+ override readonly name: string = 'UnableToRebalance';
114
114
 
115
115
  readonly code: number = 0x6; // 6
116
116
 
@@ -122,8 +122,8 @@ export class UnableToRepositionError extends ProgramError {
122
122
  );
123
123
  }
124
124
  }
125
- codeToErrorMap.set(0x6, UnableToRepositionError);
126
- nameToErrorMap.set('UnableToReposition', UnableToRepositionError);
125
+ codeToErrorMap.set(0x6, UnableToRebalanceError);
126
+ nameToErrorMap.set('UnableToRebalance', UnableToRebalanceError);
127
127
 
128
128
  /** ExceededValidUtilizationRate: Desired action brought the utilization rate to an unsafe amount */
129
129
  export class ExceededValidUtilizationRateError extends ProgramError {
@@ -11,8 +11,9 @@ import { Serializer, scalarEnum } from '@metaplex-foundation/umi/serializers';
11
11
  export enum OracleSetup {
12
12
  None,
13
13
  PythLegacy,
14
- SwitchboardV2,
14
+ SwitchboardLegacy,
15
15
  PythPushOracle,
16
+ SwitchboardPull,
16
17
  }
17
18
 
18
19
  export type OracleSetupArgs = OracleSetup;
@@ -6,7 +6,12 @@
6
6
  * @see https://github.com/metaplex-foundation/kinobi
7
7
  */
8
8
 
9
- import { Serializer, array, struct, u8 } from '@metaplex-foundation/umi/serializers';
9
+ import {
10
+ Serializer,
11
+ array,
12
+ struct,
13
+ u8,
14
+ } from "@metaplex-foundation/umi/serializers";
10
15
 
11
16
  export type WrappedI80F48 = { value: number[] };
12
17
 
@@ -16,7 +21,7 @@ export function getWrappedI80F48Serializer(): Serializer<
16
21
  WrappedI80F48Args,
17
22
  WrappedI80F48
18
23
  > {
19
- return struct<WrappedI80F48>([['value', array(u8(), { size: 16 })]], {
20
- description: 'WrappedI80F48',
24
+ return struct<WrappedI80F48>([["value", array(u8(), { size: 16 })]], {
25
+ description: "WrappedI80F48",
21
26
  }) as Serializer<WrappedI80F48Args, WrappedI80F48>;
22
27
  }
@@ -1,5 +1,4 @@
1
1
  export interface MarginfiAssetAccounts {
2
- mint: string;
3
2
  bank: string;
4
3
  liquidityVault: string;
5
4
  vaultAuthority: string;
@@ -23,23 +23,16 @@ import { USD_DECIMALS } from "../constants/generalAccounts";
23
23
  import { LivePositionUpdates } from "./solauto/generalUtils";
24
24
  import { currentUnixSecondsSolana } from "./solanaUtils";
25
25
 
26
- export function findMarginfiAccounts({
27
- mint,
28
- bank,
29
- }: {
30
- mint?: string;
31
- bank?: string;
32
- }): MarginfiAssetAccounts {
26
+ export function findMarginfiAccounts(bank: PublicKey): MarginfiAssetAccounts {
33
27
  for (const key in MARGINFI_ACCOUNTS) {
34
28
  const account = MARGINFI_ACCOUNTS[key];
35
- if (mint && account.mint.toString().toLowerCase() === mint.toLowerCase()) {
36
- return account;
37
- }
38
- if (bank && account.bank.toString().toLowerCase() === bank.toLowerCase()) {
29
+ if (
30
+ account.bank.toString().toLowerCase() === bank.toString().toLowerCase()
31
+ ) {
39
32
  return account;
40
33
  }
41
34
  }
42
- throw new Error(`Marginfi accounts not found by the mint: ${mint}`);
35
+ throw new Error(`Marginfi accounts not found by the bank: ${bank}`);
43
36
  }
44
37
 
45
38
  export async function getMaxLtvAndLiqThreshold(
@@ -57,21 +50,18 @@ export async function getMaxLtvAndLiqThreshold(
57
50
  if (!supply.bank || supply.bank === null) {
58
51
  supply.bank = await safeFetchBank(
59
52
  umi,
60
- publicKey(
61
- findMarginfiAccounts({
62
- mint: supply.mint.toString(),
63
- }).bank
64
- )
53
+ publicKey(MARGINFI_ACCOUNTS[supply.mint.toString()].bank)
65
54
  );
66
55
  }
67
56
 
68
- if ((!debt.bank || debt.bank === null) && !debt.mint.equals(PublicKey.default)) {
57
+ if (
58
+ (!debt.bank || debt.bank === null) &&
59
+ !debt.mint.equals(PublicKey.default)
60
+ ) {
69
61
  debt.bank = await safeFetchBank(
70
62
  umi,
71
63
  publicKey(
72
- findMarginfiAccounts({
73
- mint: debt.mint.toString(),
74
- }).bank
64
+ MARGINFI_ACCOUNTS[debt.mint.toString()].bank
75
65
  )
76
66
  );
77
67
  }
@@ -248,14 +238,14 @@ export async function getMarginfiAccountPositionState(
248
238
  supplyMint && supplyMint !== PublicKey.default
249
239
  ? await safeFetchBank(
250
240
  umi,
251
- publicKey(findMarginfiAccounts({ mint: supplyMint.toString() }).bank)
241
+ publicKey(MARGINFI_ACCOUNTS[supplyMint.toString()].bank)
252
242
  )
253
243
  : null;
254
244
  let debtBank: Bank | null =
255
245
  debtMint && debtMint !== PublicKey.default
256
246
  ? await safeFetchBank(
257
247
  umi,
258
- publicKey(findMarginfiAccounts({ mint: debtMint.toString() }).bank)
248
+ publicKey(MARGINFI_ACCOUNTS[debtMint.toString()].bank)
259
249
  )
260
250
  : null;
261
251
 
@@ -23,7 +23,7 @@ import { getReferralState } from "../accountUtils";
23
23
  import { toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters";
24
24
  import {
25
25
  ALL_SUPPORTED_TOKENS,
26
- TOKEN_DECIMALS,
26
+ TOKEN_INFO,
27
27
  USD_DECIMALS,
28
28
  } from "../../constants";
29
29
  import {
@@ -368,8 +368,8 @@ export function createFakePositionState(
368
368
  maxLtvBps: number,
369
369
  liqThresholdBps: number
370
370
  ): PositionState {
371
- const supplyDecimals = TOKEN_DECIMALS[supply.mint.toString()];
372
- const debtDecimals = TOKEN_DECIMALS[debt.mint.toString()];
371
+ const supplyDecimals = TOKEN_INFO[supply.mint.toString()].decimals;
372
+ const debtDecimals = TOKEN_INFO[debt.mint.toString()].decimals;
373
373
 
374
374
  const supplyUsd = supply.amountUsed * supply.price;
375
375
  const debtUsd = debt.amountUsed * debt.price;
@@ -20,8 +20,8 @@ import { PublicKey } from "@solana/web3.js";
20
20
  import { USDC_MINT } from "../../src/constants";
21
21
 
22
22
  describe("Solauto Marginfi tests", async () => {
23
- const signer = setupTest();
24
- // const signer = setupTest("solauto-manager");
23
+ // const signer = setupTest();
24
+ const signer = setupTest("solauto-manager");
25
25
 
26
26
  const payForTransactions = false;
27
27
  const useJitoBundle = false;