@haven-fi/solauto-sdk 1.0.581 → 1.0.583

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 (268) hide show
  1. package/dist/constants/solautoConstants.d.ts +1 -0
  2. package/dist/constants/solautoConstants.d.ts.map +1 -1
  3. package/dist/constants/solautoConstants.js +4 -10
  4. package/dist/constants/switchboardConstants.d.ts.map +1 -1
  5. package/dist/constants/switchboardConstants.js +5 -5
  6. package/dist/generated/accounts/solautoPosition.js +2 -2
  7. package/dist/generated/errors/solauto.d.ts +14 -2
  8. package/dist/generated/errors/solauto.d.ts.map +1 -1
  9. package/dist/generated/errors/solauto.js +27 -5
  10. package/dist/generated/instructions/claimReferralFees.d.ts +1 -1
  11. package/dist/generated/instructions/claimReferralFees.d.ts.map +1 -1
  12. package/dist/generated/instructions/closePosition.d.ts +1 -1
  13. package/dist/generated/instructions/closePosition.d.ts.map +1 -1
  14. package/dist/generated/instructions/closePosition.js +2 -2
  15. package/dist/generated/instructions/marginfiOpenPosition.d.ts +1 -3
  16. package/dist/generated/instructions/marginfiOpenPosition.d.ts.map +1 -1
  17. package/dist/generated/instructions/marginfiOpenPosition.js +0 -1
  18. package/dist/generated/instructions/marginfiRebalance.d.ts +7 -3
  19. package/dist/generated/instructions/marginfiRebalance.d.ts.map +1 -1
  20. package/dist/generated/instructions/marginfiRebalance.js +3 -1
  21. package/dist/generated/types/index.d.ts +7 -1
  22. package/dist/generated/types/index.d.ts.map +1 -1
  23. package/dist/generated/types/index.js +7 -1
  24. package/dist/generated/types/positionData.d.ts +2 -2
  25. package/dist/generated/types/positionData.d.ts.map +1 -1
  26. package/dist/generated/types/positionData.js +1 -1
  27. package/dist/generated/types/positionState.d.ts +7 -7
  28. package/dist/generated/types/positionState.d.ts.map +1 -1
  29. package/dist/generated/types/positionState.js +3 -3
  30. package/dist/generated/types/{positionTokenUsage.d.ts → positionTokenState.d.ts} +6 -8
  31. package/dist/generated/types/positionTokenState.d.ts.map +1 -0
  32. package/dist/generated/types/{positionTokenUsage.js → positionTokenState.js} +6 -7
  33. package/dist/generated/types/rebalanceData.d.ts +7 -13
  34. package/dist/generated/types/rebalanceData.d.ts.map +1 -1
  35. package/dist/generated/types/rebalanceData.js +3 -6
  36. package/dist/generated/types/rebalanceDirection.d.ts +3 -2
  37. package/dist/generated/types/rebalanceDirection.d.ts.map +1 -1
  38. package/dist/generated/types/rebalanceDirection.js +3 -2
  39. package/dist/generated/types/rebalanceInstructionData.d.ts +27 -0
  40. package/dist/generated/types/rebalanceInstructionData.d.ts.map +1 -0
  41. package/dist/generated/types/rebalanceInstructionData.js +22 -0
  42. package/dist/generated/types/rebalanceStateValues.d.ts +27 -0
  43. package/dist/generated/types/rebalanceStateValues.d.ts.map +1 -0
  44. package/dist/generated/types/rebalanceStateValues.js +22 -0
  45. package/dist/generated/types/rebalanceStep.d.ts +15 -0
  46. package/dist/generated/types/rebalanceStep.d.ts.map +1 -0
  47. package/dist/generated/types/rebalanceStep.js +22 -0
  48. package/dist/generated/types/solautoRebalanceType.d.ts +4 -5
  49. package/dist/generated/types/solautoRebalanceType.d.ts.map +1 -1
  50. package/dist/generated/types/solautoRebalanceType.js +4 -5
  51. package/dist/generated/types/solautoSettingsParameters.d.ts +2 -15
  52. package/dist/generated/types/solautoSettingsParameters.d.ts.map +1 -1
  53. package/dist/generated/types/solautoSettingsParameters.js +1 -5
  54. package/dist/generated/types/solautoSettingsParametersInp.d.ts +1 -12
  55. package/dist/generated/types/solautoSettingsParametersInp.d.ts.map +1 -1
  56. package/dist/generated/types/solautoSettingsParametersInp.js +0 -3
  57. package/dist/generated/types/swapType.d.ts +15 -0
  58. package/dist/generated/types/swapType.d.ts.map +1 -0
  59. package/dist/generated/types/swapType.js +22 -0
  60. package/dist/generated/types/tokenBalanceChange.d.ts +21 -0
  61. package/dist/generated/types/tokenBalanceChange.d.ts.map +1 -0
  62. package/dist/generated/types/tokenBalanceChange.js +19 -0
  63. package/dist/generated/types/tokenBalanceChangeType.d.ts +18 -0
  64. package/dist/generated/types/tokenBalanceChangeType.d.ts.map +1 -0
  65. package/dist/generated/types/tokenBalanceChangeType.js +25 -0
  66. package/dist/generated/types/updatePositionData.d.ts +2 -2
  67. package/dist/generated/types/updatePositionData.d.ts.map +1 -1
  68. package/dist/generated/types/updatePositionData.js +1 -1
  69. package/dist/index.d.ts +8 -6
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +5 -5
  72. package/dist/marginfi-sdk/types/interestRateConfig.d.ts +3 -1
  73. package/dist/marginfi-sdk/types/interestRateConfig.d.ts.map +1 -1
  74. package/dist/marginfi-sdk/types/interestRateConfig.js +2 -1
  75. package/dist/services/flashLoans/flProviderAggregator.d.ts +19 -0
  76. package/dist/services/flashLoans/flProviderAggregator.d.ts.map +1 -0
  77. package/dist/services/flashLoans/flProviderAggregator.js +46 -0
  78. package/dist/services/flashLoans/flProviderBase.d.ts +23 -0
  79. package/dist/services/flashLoans/flProviderBase.d.ts.map +1 -0
  80. package/dist/services/flashLoans/flProviderBase.js +37 -0
  81. package/dist/services/flashLoans/index.d.ts +4 -0
  82. package/dist/services/flashLoans/index.d.ts.map +1 -0
  83. package/dist/services/flashLoans/index.js +19 -0
  84. package/dist/services/flashLoans/marginfiFlProvider.d.ts +25 -0
  85. package/dist/services/flashLoans/marginfiFlProvider.d.ts.map +1 -0
  86. package/dist/services/flashLoans/marginfiFlProvider.js +246 -0
  87. package/dist/services/index.d.ts +6 -0
  88. package/dist/services/index.d.ts.map +1 -0
  89. package/dist/services/index.js +21 -0
  90. package/dist/services/rebalance/index.d.ts +3 -0
  91. package/dist/services/rebalance/index.d.ts.map +1 -0
  92. package/dist/services/rebalance/index.js +18 -0
  93. package/dist/services/rebalance/rebalanceSwapManager.d.ts +30 -0
  94. package/dist/services/rebalance/rebalanceSwapManager.d.ts.map +1 -0
  95. package/dist/services/rebalance/rebalanceSwapManager.js +144 -0
  96. package/dist/services/rebalance/rebalanceTxBuilder.d.ts +22 -0
  97. package/dist/services/rebalance/rebalanceTxBuilder.d.ts.map +1 -0
  98. package/dist/services/rebalance/rebalanceTxBuilder.js +200 -0
  99. package/dist/services/rebalance/rebalanceValues.d.ts +31 -0
  100. package/dist/services/rebalance/rebalanceValues.d.ts.map +1 -0
  101. package/dist/services/rebalance/rebalanceValues.js +118 -0
  102. package/dist/services/rebalance/solautoFees.d.ts +13 -0
  103. package/dist/services/rebalance/solautoFees.d.ts.map +1 -0
  104. package/dist/services/rebalance/solautoFees.js +54 -0
  105. package/dist/services/solauto/index.d.ts +5 -0
  106. package/dist/services/solauto/index.d.ts.map +1 -0
  107. package/dist/{clients → services/solauto}/referralStateManager.d.ts +4 -5
  108. package/dist/services/solauto/referralStateManager.d.ts.map +1 -0
  109. package/dist/{clients → services/solauto}/referralStateManager.js +10 -12
  110. package/dist/services/solauto/solautoClient.d.ts +59 -0
  111. package/dist/services/solauto/solautoClient.d.ts.map +1 -0
  112. package/dist/{clients → services/solauto}/solautoClient.js +78 -109
  113. package/dist/services/solauto/solautoMarginfiClient.d.ts +34 -0
  114. package/dist/services/solauto/solautoMarginfiClient.d.ts.map +1 -0
  115. package/dist/services/solauto/solautoMarginfiClient.js +322 -0
  116. package/dist/{clients → services/solauto}/txHandler.d.ts +11 -2
  117. package/dist/services/solauto/txHandler.d.ts.map +1 -0
  118. package/dist/services/solauto/txHandler.js +38 -0
  119. package/dist/services/swap/index.d.ts +2 -0
  120. package/dist/services/swap/index.d.ts.map +1 -0
  121. package/dist/{utils/solauto → services/swap}/index.js +1 -2
  122. package/dist/services/swap/jupSwapManager.d.ts +37 -0
  123. package/dist/services/swap/jupSwapManager.d.ts.map +1 -0
  124. package/dist/services/swap/jupSwapManager.js +108 -0
  125. package/dist/services/transactions/index.d.ts.map +1 -0
  126. package/dist/{transactions → services/transactions}/transactionUtils.d.ts +3 -5
  127. package/dist/services/transactions/transactionUtils.d.ts.map +1 -0
  128. package/dist/{transactions → services/transactions}/transactionUtils.js +29 -137
  129. package/dist/{transactions → services/transactions}/transactionsManager.d.ts +4 -4
  130. package/dist/services/transactions/transactionsManager.d.ts.map +1 -0
  131. package/dist/{transactions → services/transactions}/transactionsManager.js +10 -8
  132. package/dist/solautoPosition/index.d.ts +4 -0
  133. package/dist/solautoPosition/index.d.ts.map +1 -0
  134. package/dist/solautoPosition/index.js +19 -0
  135. package/dist/solautoPosition/marginfiSolautoPositionEx.d.ts +14 -0
  136. package/dist/solautoPosition/marginfiSolautoPositionEx.d.ts.map +1 -0
  137. package/dist/solautoPosition/marginfiSolautoPositionEx.js +73 -0
  138. package/dist/solautoPosition/solautoPositionEx.d.ts +67 -0
  139. package/dist/solautoPosition/solautoPositionEx.d.ts.map +1 -0
  140. package/dist/solautoPosition/solautoPositionEx.js +143 -0
  141. package/dist/solautoPosition/utils.d.ts +17 -0
  142. package/dist/solautoPosition/utils.d.ts.map +1 -0
  143. package/dist/solautoPosition/utils.js +115 -0
  144. package/dist/types/solauto.d.ts +19 -1
  145. package/dist/types/solauto.d.ts.map +1 -1
  146. package/dist/utils/generalUtils.d.ts +1 -0
  147. package/dist/utils/generalUtils.d.ts.map +1 -1
  148. package/dist/utils/generalUtils.js +9 -1
  149. package/dist/utils/index.d.ts +1 -1
  150. package/dist/utils/index.d.ts.map +1 -1
  151. package/dist/utils/index.js +1 -1
  152. package/dist/utils/jitoUtils.d.ts.map +1 -1
  153. package/dist/utils/jupiterUtils.d.ts +3 -28
  154. package/dist/utils/jupiterUtils.d.ts.map +1 -1
  155. package/dist/utils/jupiterUtils.js +2 -73
  156. package/dist/utils/marginfiUtils.d.ts +4 -3
  157. package/dist/utils/marginfiUtils.d.ts.map +1 -1
  158. package/dist/utils/marginfiUtils.js +47 -18
  159. package/dist/utils/numberUtils.d.ts +3 -6
  160. package/dist/utils/numberUtils.d.ts.map +1 -1
  161. package/dist/utils/numberUtils.js +13 -48
  162. package/dist/utils/priceUtils.js +1 -1
  163. package/dist/utils/solanaUtils.js +2 -2
  164. package/dist/utils/{solauto/generalUtils.d.ts → solautoUtils.d.ts} +9 -16
  165. package/dist/utils/solautoUtils.d.ts.map +1 -0
  166. package/dist/utils/{solauto/generalUtils.js → solautoUtils.js} +48 -173
  167. package/dist/utils/switchboardUtils.d.ts +1 -1
  168. package/dist/utils/switchboardUtils.d.ts.map +1 -1
  169. package/dist/utils/switchboardUtils.js +10 -9
  170. package/local/createTokenAccounts.ts +1 -5
  171. package/local/logPositions.ts +22 -68
  172. package/local/shared.ts +29 -24
  173. package/local/txSandbox.ts +27 -0
  174. package/local/updateMarginfiLUT.ts +80 -4
  175. package/package.json +4 -7
  176. package/src/constants/solautoConstants.ts +4 -9
  177. package/src/constants/switchboardConstants.ts +10 -5
  178. package/src/generated/accounts/solautoPosition.ts +2 -2
  179. package/src/generated/errors/solauto.ts +45 -4
  180. package/src/generated/instructions/claimReferralFees.ts +1 -1
  181. package/src/generated/instructions/closePosition.ts +3 -3
  182. package/src/generated/instructions/marginfiOpenPosition.ts +0 -7
  183. package/src/generated/instructions/marginfiRebalance.ts +12 -3
  184. package/src/generated/types/index.ts +7 -1
  185. package/src/generated/types/positionData.ts +3 -3
  186. package/src/generated/types/positionState.ts +12 -12
  187. package/src/generated/types/{positionTokenUsage.ts → positionTokenState.ts} +13 -16
  188. package/src/generated/types/rebalanceData.ts +16 -27
  189. package/src/generated/types/rebalanceDirection.ts +1 -0
  190. package/src/generated/types/rebalanceInstructionData.ts +62 -0
  191. package/src/generated/types/rebalanceStateValues.ts +59 -0
  192. package/src/generated/types/rebalanceStep.ts +25 -0
  193. package/src/generated/types/solautoRebalanceType.ts +0 -1
  194. package/src/generated/types/solautoSettingsParameters.ts +4 -25
  195. package/src/generated/types/solautoSettingsParametersInp.ts +2 -24
  196. package/src/generated/types/swapType.ts +22 -0
  197. package/src/generated/types/tokenBalanceChange.ts +46 -0
  198. package/src/generated/types/tokenBalanceChangeType.ts +28 -0
  199. package/src/generated/types/updatePositionData.ts +3 -3
  200. package/src/index.ts +8 -8
  201. package/src/marginfi-sdk/types/interestRateConfig.ts +6 -2
  202. package/src/services/flashLoans/flProviderAggregator.ts +74 -0
  203. package/src/services/flashLoans/flProviderBase.ts +88 -0
  204. package/src/services/flashLoans/index.ts +3 -0
  205. package/src/services/flashLoans/marginfiFlProvider.ts +392 -0
  206. package/src/services/index.ts +5 -0
  207. package/src/services/rebalance/index.ts +2 -0
  208. package/src/services/rebalance/rebalanceSwapManager.ts +218 -0
  209. package/src/services/rebalance/rebalanceTxBuilder.ts +330 -0
  210. package/src/services/rebalance/rebalanceValues.ts +232 -0
  211. package/src/services/rebalance/solautoFees.ts +61 -0
  212. package/src/services/solauto/index.ts +4 -0
  213. package/src/{clients → services/solauto}/referralStateManager.ts +17 -31
  214. package/src/{clients → services/solauto}/solautoClient.ts +142 -205
  215. package/src/services/solauto/solautoMarginfiClient.ts +472 -0
  216. package/src/services/solauto/txHandler.ts +69 -0
  217. package/src/services/swap/index.ts +1 -0
  218. package/src/services/swap/jupSwapManager.ts +189 -0
  219. package/src/{transactions → services/transactions}/transactionUtils.ts +40 -280
  220. package/src/{transactions → services/transactions}/transactionsManager.ts +15 -10
  221. package/src/solautoPosition/index.ts +3 -0
  222. package/src/solautoPosition/marginfiSolautoPositionEx.ts +111 -0
  223. package/src/solautoPosition/solautoPositionEx.ts +281 -0
  224. package/src/solautoPosition/utils.ts +188 -0
  225. package/src/types/solauto.ts +30 -2
  226. package/src/utils/generalUtils.ts +9 -1
  227. package/src/utils/index.ts +2 -2
  228. package/src/utils/jitoUtils.ts +0 -4
  229. package/src/utils/jupiterUtils.ts +3 -164
  230. package/src/utils/marginfiUtils.ts +77 -43
  231. package/src/utils/numberUtils.ts +18 -77
  232. package/src/utils/solanaUtils.ts +1 -1
  233. package/src/utils/{solauto/generalUtils.ts → solautoUtils.ts} +66 -288
  234. package/src/utils/switchboardUtils.ts +15 -17
  235. package/tests/transactions/shared.ts +135 -0
  236. package/tests/transactions/solautoMarginfi.ts +8 -198
  237. package/tests/unit/accounts.ts +3 -10
  238. package/tests/unit/lookupTables.ts +23 -2
  239. package/tests/unit/rebalanceCalculations.ts +65 -343
  240. package/dist/clients/index.d.ts +0 -5
  241. package/dist/clients/index.d.ts.map +0 -1
  242. package/dist/clients/referralStateManager.d.ts.map +0 -1
  243. package/dist/clients/solautoClient.d.ts +0 -71
  244. package/dist/clients/solautoClient.d.ts.map +0 -1
  245. package/dist/clients/solautoMarginfiClient.d.ts +0 -51
  246. package/dist/clients/solautoMarginfiClient.d.ts.map +0 -1
  247. package/dist/clients/solautoMarginfiClient.js +0 -497
  248. package/dist/clients/txHandler.d.ts.map +0 -1
  249. package/dist/clients/txHandler.js +0 -23
  250. package/dist/generated/types/positionTokenUsage.d.ts.map +0 -1
  251. package/dist/transactions/index.d.ts.map +0 -1
  252. package/dist/transactions/transactionUtils.d.ts.map +0 -1
  253. package/dist/transactions/transactionsManager.d.ts.map +0 -1
  254. package/dist/utils/solauto/generalUtils.d.ts.map +0 -1
  255. package/dist/utils/solauto/index.d.ts +0 -3
  256. package/dist/utils/solauto/index.d.ts.map +0 -1
  257. package/dist/utils/solauto/rebalanceUtils.d.ts +0 -30
  258. package/dist/utils/solauto/rebalanceUtils.d.ts.map +0 -1
  259. package/dist/utils/solauto/rebalanceUtils.js +0 -287
  260. package/src/clients/index.ts +0 -4
  261. package/src/clients/solautoMarginfiClient.ts +0 -774
  262. package/src/clients/txHandler.ts +0 -38
  263. package/src/utils/solauto/index.ts +0 -2
  264. package/src/utils/solauto/rebalanceUtils.ts +0 -562
  265. package/dist/{clients → services/solauto}/index.js +2 -2
  266. /package/dist/{transactions → services/transactions}/index.d.ts +0 -0
  267. /package/dist/{transactions → services/transactions}/index.js +0 -0
  268. /package/src/{transactions → services/transactions}/index.ts +0 -0
@@ -0,0 +1,472 @@
1
+ import { toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters";
2
+ import {
3
+ Signer,
4
+ TransactionBuilder,
5
+ publicKey,
6
+ PublicKey as UmiPublicKey,
7
+ createSignerFromKeypair,
8
+ } from "@metaplex-foundation/umi";
9
+ import { PublicKey, SYSVAR_INSTRUCTIONS_PUBKEY } from "@solana/web3.js";
10
+ import { SolautoClient, SolautoClientArgs } from "./solautoClient";
11
+ import { MarginfiAssetAccounts } from "../../types/accounts";
12
+ import {
13
+ MARGINFI_ACCOUNTS,
14
+ MARGINFI_ACCOUNTS_LOOKUP_TABLE,
15
+ } from "../../constants/marginfiAccounts";
16
+ import {
17
+ DCASettingsInpArgs,
18
+ LendingPlatform,
19
+ PositionType,
20
+ RebalanceDirection,
21
+ RebalanceStep,
22
+ SolautoActionArgs,
23
+ SolautoRebalanceType,
24
+ SolautoSettingsParametersInpArgs,
25
+ SwapType,
26
+ closePosition,
27
+ marginfiOpenPosition,
28
+ marginfiProtocolInteraction,
29
+ marginfiRebalance,
30
+ marginfiRefreshData,
31
+ } from "../../generated";
32
+ import { getTokenAccount } from "../../utils/accountUtils";
33
+ import {
34
+ MARGINFI_PROGRAM_ID,
35
+ lendingAccountBorrow,
36
+ lendingAccountDeposit,
37
+ lendingAccountRepay,
38
+ lendingAccountWithdraw,
39
+ marginfiAccountInitialize,
40
+ safeFetchAllMarginfiAccount,
41
+ } from "../../marginfi-sdk";
42
+ import {
43
+ getAllMarginfiAccountsByAuthority,
44
+ marginfiAccountEmpty,
45
+ } from "../../utils/marginfiUtils";
46
+ import { hasFirstRebalance } from "../../utils/solautoUtils";
47
+ import { RebalanceDetails } from "../../types";
48
+
49
+ export interface SolautoMarginfiClientArgs extends SolautoClientArgs {
50
+ marginfiAccount?: PublicKey | Signer;
51
+ marginfiAccountSeedIdx?: bigint;
52
+ }
53
+
54
+ export class SolautoMarginfiClient extends SolautoClient {
55
+ public lendingPlatform = LendingPlatform.Marginfi;
56
+
57
+ public marginfiProgram!: PublicKey;
58
+
59
+ public marginfiAccount!: PublicKey | Signer;
60
+ public marginfiAccountPk!: PublicKey;
61
+ public marginfiGroup!: PublicKey;
62
+
63
+ public marginfiSupplyAccounts!: MarginfiAssetAccounts;
64
+ public marginfiDebtAccounts!: MarginfiAssetAccounts;
65
+
66
+ public supplyPriceOracle!: PublicKey;
67
+ public debtPriceOracle!: PublicKey;
68
+
69
+ async initialize(args: SolautoMarginfiClientArgs) {
70
+ await super.initialize(args);
71
+
72
+ this.marginfiGroup = await this.solautoPosition.lendingPool();
73
+
74
+ if (this.selfManaged) {
75
+ this.marginfiAccount =
76
+ args.marginfiAccount ??
77
+ createSignerFromKeypair(this.umi, this.umi.eddsa.generateKeypair());
78
+ } else {
79
+ if (this.solautoPosition.exists()) {
80
+ this.marginfiAccount = this.solautoPosition.lpUserAccount!;
81
+ } else {
82
+ const accounts = await getAllMarginfiAccountsByAuthority(
83
+ this.umi,
84
+ this.solautoPosition.publicKey,
85
+ this.marginfiGroup,
86
+ false
87
+ );
88
+ const reusableAccounts =
89
+ accounts.length > 0
90
+ ? (
91
+ await safeFetchAllMarginfiAccount(
92
+ this.umi,
93
+ accounts.map((x) => publicKey(x.marginfiAccount))
94
+ )
95
+ ).filter((x) => marginfiAccountEmpty(x))
96
+ : [];
97
+ this.marginfiAccount =
98
+ reusableAccounts.length > 0
99
+ ? toWeb3JsPublicKey(reusableAccounts[0].publicKey)
100
+ : createSignerFromKeypair(
101
+ this.umi,
102
+ this.umi.eddsa.generateKeypair()
103
+ );
104
+ }
105
+ }
106
+ this.marginfiAccountPk =
107
+ "publicKey" in this.marginfiAccount
108
+ ? toWeb3JsPublicKey(this.marginfiAccount.publicKey)
109
+ : this.marginfiAccount;
110
+
111
+ if ("publicKey" in this.marginfiAccount) {
112
+ this.otherSigners.push(this.marginfiAccount);
113
+ }
114
+
115
+ this.marginfiSupplyAccounts =
116
+ MARGINFI_ACCOUNTS[this.marginfiGroup.toString()][
117
+ this.solautoPosition.supplyMint().toString()
118
+ ]!;
119
+ this.marginfiDebtAccounts =
120
+ MARGINFI_ACCOUNTS[this.marginfiGroup.toString()][
121
+ this.solautoPosition.debtMint().toString()
122
+ ]!;
123
+
124
+ // TODO: Don't dynamically pull oracle from bank until Marginfi sorts out their price oracle issues.
125
+ // const [supplyBank, debtBank] = await safeFetchAllBank(this.umi, [
126
+ // publicKey(this.marginfiSupplyAccounts.bank),
127
+ // publicKey(this.marginfiDebtAccounts.bank),
128
+ // ]);
129
+ // this.supplyPriceOracle = toWeb3JsPublicKey(supplyBank.config.oracleKeys[0]);
130
+ // this.debtPriceOracle = toWeb3JsPublicKey(debtBank.config.oracleKeys[0]);
131
+ this.supplyPriceOracle = new PublicKey(
132
+ this.marginfiSupplyAccounts.priceOracle
133
+ );
134
+ this.debtPriceOracle = new PublicKey(this.marginfiDebtAccounts.priceOracle);
135
+
136
+ this.log("Marginfi account:", this.marginfiAccountPk.toString());
137
+ }
138
+
139
+ defaultLookupTables(): string[] {
140
+ return [MARGINFI_ACCOUNTS_LOOKUP_TABLE, ...super.defaultLookupTables()];
141
+ }
142
+
143
+ lutAccountsToAdd(): PublicKey[] {
144
+ return [...super.lutAccountsToAdd(), this.marginfiAccountPk];
145
+ }
146
+
147
+ marginfiAccountInitialize(marginfiAccount: Signer): TransactionBuilder {
148
+ return marginfiAccountInitialize(this.umi, {
149
+ marginfiAccount: marginfiAccount,
150
+ marginfiGroup: publicKey(this.marginfiGroup),
151
+ authority: this.signer,
152
+ feePayer: this.signer,
153
+ });
154
+ }
155
+
156
+ openPositionIx(
157
+ settings?: SolautoSettingsParametersInpArgs,
158
+ dca?: DCASettingsInpArgs
159
+ ): TransactionBuilder {
160
+ return super
161
+ .openPositionIx(settings, dca)
162
+ .add(this.marginfiOpenPositionIx(settings, dca));
163
+ }
164
+
165
+ private marginfiOpenPositionIx(
166
+ settings?: SolautoSettingsParametersInpArgs,
167
+ dca?: DCASettingsInpArgs,
168
+ positionType?: PositionType
169
+ ): TransactionBuilder {
170
+ let signerDebtTa: UmiPublicKey | undefined = undefined;
171
+ if (dca) {
172
+ signerDebtTa = publicKey(this.signerDebtTa);
173
+ }
174
+
175
+ return marginfiOpenPosition(this.umi, {
176
+ signer: this.signer,
177
+ marginfiProgram: publicKey(MARGINFI_PROGRAM_ID),
178
+ signerReferralState: publicKey(this.referralState),
179
+ referredByState: this.referredByState
180
+ ? publicKey(this.referredByState)
181
+ : undefined,
182
+ referredBySupplyTa: this.referredBySupplyTa()
183
+ ? publicKey(this.referredBySupplyTa()!)
184
+ : undefined,
185
+ solautoPosition: publicKey(this.solautoPosition.publicKey),
186
+ marginfiGroup: publicKey(this.marginfiGroup),
187
+ marginfiAccount:
188
+ "publicKey" in this.marginfiAccount
189
+ ? (this.marginfiAccount as Signer)
190
+ : publicKey(this.marginfiAccount),
191
+ supplyMint: publicKey(this.solautoPosition.supplyMint()),
192
+ supplyBank: publicKey(this.marginfiSupplyAccounts.bank),
193
+ positionSupplyTa: publicKey(this.positionSupplyTa),
194
+ debtMint: publicKey(this.solautoPosition.debtMint()),
195
+ debtBank: publicKey(this.marginfiDebtAccounts.bank),
196
+ positionDebtTa: publicKey(this.positionDebtTa),
197
+ signerDebtTa: signerDebtTa,
198
+ positionType: positionType ?? PositionType.Leverage,
199
+ positionData: {
200
+ positionId: this.positionId!,
201
+ settings: settings ?? null,
202
+ dca: dca ?? null,
203
+ },
204
+ });
205
+ }
206
+
207
+ closePositionIx(): TransactionBuilder {
208
+ return closePosition(this.umi, {
209
+ signer: this.signer,
210
+ solautoPosition: publicKey(this.solautoPosition.publicKey),
211
+ signerSupplyTa: publicKey(this.signerSupplyTa),
212
+ positionSupplyTa: publicKey(this.positionSupplyTa),
213
+ positionDebtTa: publicKey(this.positionDebtTa),
214
+ signerDebtTa: publicKey(this.signerDebtTa),
215
+ lpUserAccount: publicKey(this.marginfiAccountPk),
216
+ });
217
+ }
218
+
219
+ refreshIx(): TransactionBuilder {
220
+ return marginfiRefreshData(this.umi, {
221
+ signer: this.signer,
222
+ marginfiProgram: publicKey(MARGINFI_PROGRAM_ID),
223
+ marginfiGroup: publicKey(this.marginfiGroup),
224
+ marginfiAccount: publicKey(this.marginfiAccount),
225
+ supplyBank: publicKey(this.marginfiSupplyAccounts.bank),
226
+ supplyPriceOracle: publicKey(this.supplyPriceOracle),
227
+ debtBank: publicKey(this.marginfiDebtAccounts.bank),
228
+ debtPriceOracle: publicKey(this.debtPriceOracle),
229
+ solautoPosition: publicKey(this.solautoPosition.publicKey),
230
+ });
231
+ }
232
+
233
+ protocolInteractionIx(args: SolautoActionArgs): TransactionBuilder {
234
+ let tx = super.protocolInteractionIx(args);
235
+
236
+ if (this.selfManaged) {
237
+ return tx.add(this.marginfiProtocolInteractionIx(args));
238
+ } else {
239
+ return tx.add(this.marginfiSolautoProtocolInteractionIx(args));
240
+ }
241
+ }
242
+
243
+ private marginfiProtocolInteractionIx(args: SolautoActionArgs) {
244
+ switch (args.__kind) {
245
+ case "Deposit": {
246
+ return lendingAccountDeposit(this.umi, {
247
+ amount: args.fields[0],
248
+ signer: this.signer,
249
+ signerTokenAccount: publicKey(this.signerSupplyTa),
250
+ marginfiAccount: publicKey(this.marginfiAccountPk),
251
+ marginfiGroup: publicKey(this.marginfiGroup),
252
+ bank: publicKey(this.marginfiSupplyAccounts.bank),
253
+ bankLiquidityVault: publicKey(
254
+ this.marginfiSupplyAccounts.liquidityVault
255
+ ),
256
+ });
257
+ }
258
+ case "Borrow": {
259
+ return lendingAccountBorrow(this.umi, {
260
+ amount: args.fields[0],
261
+ signer: this.signer,
262
+ destinationTokenAccount: publicKey(this.signerDebtTa),
263
+ marginfiAccount: publicKey(this.marginfiAccountPk),
264
+ marginfiGroup: publicKey(this.marginfiGroup),
265
+ bank: publicKey(this.marginfiDebtAccounts.bank),
266
+ bankLiquidityVault: publicKey(
267
+ this.marginfiDebtAccounts.liquidityVault
268
+ ),
269
+ bankLiquidityVaultAuthority: publicKey(
270
+ this.marginfiDebtAccounts.vaultAuthority
271
+ ),
272
+ });
273
+ }
274
+ case "Repay": {
275
+ return lendingAccountRepay(this.umi, {
276
+ amount:
277
+ args.fields[0].__kind === "Some" ? args.fields[0].fields[0] : 0,
278
+ repayAll: args.fields[0].__kind === "All" ? true : false,
279
+ signer: this.signer,
280
+ signerTokenAccount: publicKey(this.signerDebtTa),
281
+ marginfiAccount: publicKey(this.marginfiAccountPk),
282
+ marginfiGroup: publicKey(this.marginfiGroup),
283
+ bank: publicKey(this.marginfiDebtAccounts.bank),
284
+ bankLiquidityVault: publicKey(
285
+ this.marginfiDebtAccounts.liquidityVault
286
+ ),
287
+ });
288
+ }
289
+ case "Withdraw": {
290
+ return lendingAccountWithdraw(this.umi, {
291
+ amount:
292
+ args.fields[0].__kind === "Some" ? args.fields[0].fields[0] : 0,
293
+ withdrawAll: args.fields[0].__kind === "All" ? true : false,
294
+ signer: this.signer,
295
+ destinationTokenAccount: publicKey(this.signerSupplyTa),
296
+ marginfiAccount: publicKey(this.marginfiAccountPk),
297
+ marginfiGroup: publicKey(this.marginfiGroup),
298
+ bank: publicKey(this.marginfiSupplyAccounts.bank),
299
+ bankLiquidityVault: publicKey(
300
+ this.marginfiSupplyAccounts.liquidityVault
301
+ ),
302
+ bankLiquidityVaultAuthority: publicKey(
303
+ this.marginfiSupplyAccounts.vaultAuthority
304
+ ),
305
+ });
306
+ }
307
+ }
308
+ }
309
+
310
+ private marginfiSolautoProtocolInteractionIx(
311
+ args: SolautoActionArgs
312
+ ): TransactionBuilder {
313
+ let positionSupplyTa: UmiPublicKey | undefined = undefined;
314
+ let vaultSupplyTa: UmiPublicKey | undefined = undefined;
315
+ let supplyVaultAuthority: UmiPublicKey | undefined = undefined;
316
+ if (args.__kind === "Deposit" || args.__kind === "Withdraw") {
317
+ positionSupplyTa = publicKey(
318
+ args.__kind === "Withdraw" || this.selfManaged
319
+ ? this.signerSupplyTa
320
+ : this.positionSupplyTa
321
+ );
322
+ vaultSupplyTa = publicKey(this.marginfiSupplyAccounts.liquidityVault);
323
+ supplyVaultAuthority = publicKey(
324
+ this.marginfiSupplyAccounts.vaultAuthority
325
+ );
326
+ }
327
+
328
+ let positionDebtTa: UmiPublicKey | undefined = undefined;
329
+ let vaultDebtTa: UmiPublicKey | undefined = undefined;
330
+ let debtVaultAuthority: UmiPublicKey | undefined = undefined;
331
+ if (args.__kind === "Borrow" || args.__kind === "Repay") {
332
+ positionDebtTa = publicKey(
333
+ args.__kind === "Borrow" || this.selfManaged
334
+ ? this.signerDebtTa
335
+ : this.positionDebtTa
336
+ );
337
+ vaultDebtTa = publicKey(this.marginfiDebtAccounts.liquidityVault);
338
+ debtVaultAuthority = publicKey(this.marginfiDebtAccounts.vaultAuthority);
339
+ }
340
+
341
+ let supplyPriceOracle: UmiPublicKey | undefined = undefined;
342
+ let debtPriceOracle: UmiPublicKey | undefined = undefined;
343
+ if (args.__kind === "Withdraw" || args.__kind === "Borrow") {
344
+ supplyPriceOracle = publicKey(this.supplyPriceOracle);
345
+ debtPriceOracle = publicKey(this.debtPriceOracle);
346
+ }
347
+
348
+ return marginfiProtocolInteraction(this.umi, {
349
+ signer: this.signer,
350
+ marginfiProgram: publicKey(MARGINFI_PROGRAM_ID),
351
+ solautoPosition: publicKey(this.solautoPosition.publicKey),
352
+ marginfiGroup: publicKey(this.marginfiGroup),
353
+ marginfiAccount: publicKey(this.marginfiAccountPk),
354
+ supplyBank: publicKey(this.marginfiSupplyAccounts.bank),
355
+ supplyPriceOracle,
356
+ positionSupplyTa,
357
+ vaultSupplyTa,
358
+ supplyVaultAuthority,
359
+ debtBank: publicKey(this.marginfiDebtAccounts.bank),
360
+ debtPriceOracle,
361
+ positionDebtTa,
362
+ vaultDebtTa,
363
+ debtVaultAuthority,
364
+ solautoAction: args,
365
+ });
366
+ }
367
+
368
+ rebalanceIx(
369
+ rebalanceStep: RebalanceStep,
370
+ data: RebalanceDetails
371
+ ): TransactionBuilder {
372
+ const inputIsSupply = new PublicKey(data.swapQuote.inputMint).equals(
373
+ this.solautoPosition.supplyMint()
374
+ );
375
+ const outputIsSupply = new PublicKey(data.swapQuote.outputMint).equals(
376
+ this.solautoPosition.supplyMint()
377
+ );
378
+
379
+ const preSwapRebalance = rebalanceStep === RebalanceStep.PreSwap;
380
+ const postSwapRebalance = rebalanceStep === RebalanceStep.PostSwap;
381
+
382
+ const needSupplyAccounts =
383
+ (inputIsSupply && preSwapRebalance) ||
384
+ (outputIsSupply && postSwapRebalance) ||
385
+ (inputIsSupply && data.flashLoan !== undefined && postSwapRebalance);
386
+ const needDebtAccounts =
387
+ (!inputIsSupply && preSwapRebalance) ||
388
+ (!outputIsSupply && postSwapRebalance) ||
389
+ (!inputIsSupply && data.flashLoan !== undefined && postSwapRebalance);
390
+
391
+ const isFirstRebalance =
392
+ (preSwapRebalance && hasFirstRebalance(data.rebalanceType)) ||
393
+ (postSwapRebalance &&
394
+ data.rebalanceType === SolautoRebalanceType.FLSwapThenRebalance);
395
+
396
+ const addAuthorityTas =
397
+ this.selfManaged || data.values.tokenBalanceChange !== undefined;
398
+
399
+ return marginfiRebalance(this.umi, {
400
+ signer: this.signer,
401
+ marginfiProgram: publicKey(MARGINFI_PROGRAM_ID),
402
+ ixsSysvar: publicKey(SYSVAR_INSTRUCTIONS_PUBKEY),
403
+ solautoFeesTa: publicKey(
404
+ data.values.rebalanceDirection === RebalanceDirection.Boost
405
+ ? this.solautoFeesSupplyTa
406
+ : this.solautoFeesDebtTa
407
+ ),
408
+ authorityReferralState: publicKey(this.referralState),
409
+ referredByTa: this.referredByState
410
+ ? publicKey(
411
+ data.values.rebalanceDirection === RebalanceDirection.Boost
412
+ ? this.referredBySupplyTa()!
413
+ : this.referredByDebtTa()!
414
+ )
415
+ : undefined,
416
+ positionAuthority:
417
+ data.values.tokenBalanceChange !== undefined
418
+ ? publicKey(this.authority)
419
+ : undefined,
420
+ solautoPosition: publicKey(this.solautoPosition.publicKey),
421
+ marginfiGroup: publicKey(this.marginfiGroup),
422
+ marginfiAccount: publicKey(this.marginfiAccountPk),
423
+ intermediaryTa: publicKey(
424
+ getTokenAccount(
425
+ toWeb3JsPublicKey(this.signer.publicKey),
426
+ new PublicKey(data.swapQuote.inputMint)
427
+ )
428
+ ),
429
+ supplyBank: publicKey(this.marginfiSupplyAccounts.bank),
430
+ supplyPriceOracle: publicKey(this.supplyPriceOracle),
431
+ positionSupplyTa: publicKey(this.positionSupplyTa),
432
+ authoritySupplyTa: addAuthorityTas
433
+ ? publicKey(
434
+ getTokenAccount(this.authority, this.solautoPosition.supplyMint())
435
+ )
436
+ : undefined,
437
+ vaultSupplyTa: needSupplyAccounts
438
+ ? publicKey(this.marginfiSupplyAccounts.liquidityVault)
439
+ : undefined,
440
+ supplyVaultAuthority: needSupplyAccounts
441
+ ? publicKey(this.marginfiSupplyAccounts.vaultAuthority)
442
+ : undefined,
443
+ debtBank: publicKey(this.marginfiDebtAccounts.bank),
444
+ debtPriceOracle: publicKey(this.debtPriceOracle),
445
+ positionDebtTa: publicKey(this.positionDebtTa),
446
+ authorityDebtTa: addAuthorityTas
447
+ ? publicKey(
448
+ getTokenAccount(this.authority, this.solautoPosition.debtMint())
449
+ )
450
+ : undefined,
451
+ vaultDebtTa: needDebtAccounts
452
+ ? publicKey(this.marginfiDebtAccounts.liquidityVault)
453
+ : undefined,
454
+ debtVaultAuthority: needDebtAccounts
455
+ ? publicKey(this.marginfiDebtAccounts.vaultAuthority)
456
+ : undefined,
457
+ rebalanceType: data.rebalanceType,
458
+ targetLiqUtilizationRateBps: data.targetLiqUtilizationRateBps ?? null,
459
+ swapInAmountBaseUnit: isFirstRebalance
460
+ ? parseInt(data.swapQuote.inAmount)
461
+ : null,
462
+ swapType:
463
+ data.swapQuote.swapMode === "ExactOut" && isFirstRebalance
464
+ ? SwapType.ExactOut
465
+ : null,
466
+ flashLoanFeeBps:
467
+ data.flashLoan?.flFeeBps && isFirstRebalance
468
+ ? data.flashLoan.flFeeBps
469
+ : null,
470
+ });
471
+ }
472
+ }
@@ -0,0 +1,69 @@
1
+ import { Signer, signerIdentity, Umi } from "@metaplex-foundation/umi";
2
+ import { Connection, PublicKey } from "@solana/web3.js";
3
+ import { consoleLog, getSolanaRpcConnection } from "../../utils";
4
+ import { SOLAUTO_PROD_PROGRAM } from "../../constants";
5
+ import {
6
+ WalletAdapter,
7
+ walletAdapterIdentity,
8
+ } from "@metaplex-foundation/umi-signer-wallet-adapters";
9
+
10
+ export interface TxHandlerProps {
11
+ signer?: Signer;
12
+ wallet?: WalletAdapter;
13
+ rpcUrl: string;
14
+ showLogs?: boolean;
15
+ programId?: PublicKey;
16
+ wsEndpoint?: string;
17
+ }
18
+
19
+ export abstract class TxHandler {
20
+ public rpcUrl!: string;
21
+ public showLogs = false;
22
+ public programId = SOLAUTO_PROD_PROGRAM;
23
+
24
+ public connection!: Connection;
25
+ public umi!: Umi;
26
+ public signer!: Signer;
27
+ public otherSigners: Signer[] = [];
28
+
29
+ constructor(props: TxHandlerProps) {
30
+ if (props.programId !== undefined) {
31
+ this.programId = props.programId;
32
+ }
33
+
34
+ this.rpcUrl = props.rpcUrl;
35
+ const [connection, umi] = getSolanaRpcConnection(
36
+ this.rpcUrl,
37
+ this.programId,
38
+ props.wsEndpoint
39
+ );
40
+ this.connection = connection;
41
+ this.umi = umi;
42
+
43
+ if (!props.signer && !props.wallet) {
44
+ throw new Error("Signer or wallet must be provided");
45
+ }
46
+ this.umi = this.umi.use(
47
+ props.signer
48
+ ? signerIdentity(props.signer, true)
49
+ : walletAdapterIdentity(props.wallet!, true)
50
+ );
51
+ this.signer = this.umi.identity;
52
+
53
+ if (props.showLogs !== undefined) {
54
+ this.showLogs = props.showLogs;
55
+ }
56
+
57
+ if (!(globalThis as any).SHOW_LOGS && this.showLogs) {
58
+ (globalThis as any).SHOW_LOGS = Boolean(this.showLogs);
59
+ }
60
+ }
61
+
62
+ log(...args: any[]): void {
63
+ consoleLog(...args);
64
+ }
65
+
66
+ abstract defaultLookupTables(): string[];
67
+
68
+ abstract resetLiveTxUpdates(success?: boolean): Promise<void>;
69
+ }
@@ -0,0 +1 @@
1
+ export * from "./jupSwapManager";