@haven-fi/solauto-sdk 1.0.41 → 1.0.43
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/clients/solautoMarginfiClient.d.ts +3 -3
- package/dist/clients/solautoMarginfiClient.d.ts.map +1 -1
- package/dist/clients/solautoMarginfiClient.js +43 -41
- package/dist/constants/marginfiAccounts.d.ts +2 -2
- package/dist/generated/instructions/marginfiRebalance.js +2 -2
- package/dist/transactions/transactionsManager.d.ts.map +1 -1
- package/dist/transactions/transactionsManager.js +4 -5
- package/dist/types/accounts.d.ts +1 -1
- package/dist/utils/generalUtils.js +1 -1
- package/dist/utils/jupiterUtils.js +1 -1
- package/dist/utils/marginfiUtils.d.ts +10 -4
- package/dist/utils/marginfiUtils.d.ts.map +1 -1
- package/dist/utils/marginfiUtils.js +43 -22
- package/package.json +1 -1
- package/src/clients/solautoMarginfiClient.ts +52 -49
- package/src/constants/marginfiAccounts.ts +2 -2
- package/src/generated/instructions/marginfiRebalance.ts +2 -2
- package/src/transactions/transactionsManager.ts +4 -11
- package/src/types/accounts.ts +1 -1
- package/src/utils/generalUtils.ts +1 -1
- package/src/utils/jupiterUtils.ts +2 -2
- package/src/utils/marginfiUtils.ts +76 -36
- package/tests/transactions/solautoMarginfi.ts +2 -2
@@ -1,7 +1,7 @@
|
|
1
1
|
import { Signer, TransactionBuilder } from "@metaplex-foundation/umi";
|
2
2
|
import { PublicKey } from "@solana/web3.js";
|
3
3
|
import { SolautoClient, SolautoClientArgs } from "./solautoClient";
|
4
|
-
import {
|
4
|
+
import { MarginfiAssetAccounts } from "../types/accounts";
|
5
5
|
import { DCASettingsInpArgs, PositionState, SolautoActionArgs, SolautoRebalanceTypeArgs, SolautoSettingsParametersInpArgs } from "../generated";
|
6
6
|
import { MarginfiAccount } from "../marginfi-sdk";
|
7
7
|
import { JupSwapDetails } from "../utils/jupiterUtils";
|
@@ -18,8 +18,8 @@ export declare class SolautoMarginfiClient extends SolautoClient {
|
|
18
18
|
marginfiAccount: PublicKey | Signer;
|
19
19
|
marginfiAccountPk: PublicKey;
|
20
20
|
marginfiGroup: PublicKey;
|
21
|
-
|
22
|
-
|
21
|
+
marginfiSupplyAccounts: MarginfiAssetAccounts;
|
22
|
+
marginfiDebtAccounts: MarginfiAssetAccounts;
|
23
23
|
intermediaryMarginfiAccountSigner?: Signer;
|
24
24
|
intermediaryMarginfiAccountPk: PublicKey;
|
25
25
|
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;AAQnE,MAAM,WAAW,yBAA0B,SAAQ,iBAAiB;IAClE,eAAe,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACrC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,qBAAa,qBAAsB,SAAQ,aAAa;IACtD,OAAO,CAAC,WAAW,CAAkB;IAE9B,eAAe,EAAG,SAAS,CAAC;IAE5B,sBAAsB,EAAE,MAAM,CAAa;IAC3C,eAAe,EAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,EAAG,SAAS,CAAC;IAC9B,aAAa,EAAG,SAAS,CAAC;IAE1B,
|
1
|
+
{"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoMarginfiClient.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,MAAM,EACN,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAK1D,OAAO,EACL,kBAAkB,EAElB,aAAa,EACb,iBAAiB,EACjB,wBAAwB,EACxB,gCAAgC,EAKjC,MAAM,cAAc,CAAC;AAGtB,OAAO,EAEL,eAAe,EAUhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAQnE,MAAM,WAAW,yBAA0B,SAAQ,iBAAiB;IAClE,eAAe,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACrC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,qBAAa,qBAAsB,SAAQ,aAAa;IACtD,OAAO,CAAC,WAAW,CAAkB;IAE9B,eAAe,EAAG,SAAS,CAAC;IAE5B,sBAAsB,EAAE,MAAM,CAAa;IAC3C,eAAe,EAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,EAAG,SAAS,CAAC;IAC9B,aAAa,EAAG,SAAS,CAAC;IAE1B,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;IA6C9B,OAAO,IAAI,kBAAkB;IAc7B,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAUhE,OAAO,CAAC,6BAA6B;IAmErC,OAAO,CAAC,oCAAoC;IA8D5C,SAAS,CACP,aAAa,EAAE,GAAG,GAAG,GAAG,EACxB,WAAW,EAAE,cAAc,EAC3B,aAAa,EAAE,wBAAwB,EACvC,SAAS,CAAC,EAAE,gBAAgB,EAC5B,2BAA2B,CAAC,EAAE,MAAM,EACpC,WAAW,CAAC,EAAE,MAAM,GACnB,kBAAkB;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"}
|
@@ -39,10 +39,10 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
39
39
|
this.marginfiGroup = marginfiAccountData
|
40
40
|
? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(marginfiAccountData.group)
|
41
41
|
: args.marginfiGroup ?? new web3_js_1.PublicKey(marginfiAccounts_1.DEFAULT_MARGINFI_GROUP);
|
42
|
-
this.
|
42
|
+
this.marginfiSupplyAccounts = (0, marginfiUtils_1.findMarginfiAccounts)({
|
43
43
|
mint: this.supplyMint.toString(),
|
44
44
|
});
|
45
|
-
this.
|
45
|
+
this.marginfiDebtAccounts = (0, marginfiUtils_1.findMarginfiAccounts)({
|
46
46
|
mint: this.debtMint.toString(),
|
47
47
|
});
|
48
48
|
if (!this.initialized) {
|
@@ -51,7 +51,9 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
51
51
|
this.initialized = true;
|
52
52
|
}
|
53
53
|
async setIntermediaryMarginfiDetails() {
|
54
|
-
const existingMarginfiAccounts = (await (0, marginfiUtils_1.getAllMarginfiAccountsByAuthority)(this.umi, (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey), false))
|
54
|
+
const existingMarginfiAccounts = (await (0, marginfiUtils_1.getAllMarginfiAccountsByAuthority)(this.umi, (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey), false))
|
55
|
+
.filter((x) => !x.marginfiAccount.equals(this.marginfiAccountPk))
|
56
|
+
.sort((a, b) => a.marginfiAccount.toString().localeCompare(b.marginfiAccount.toString()));
|
55
57
|
const emptyMarginfiAccounts = existingMarginfiAccounts.length > 0
|
56
58
|
? (await (0, marginfi_sdk_1.safeFetchAllMarginfiAccount)(this.umi, existingMarginfiAccounts.map((x) => (0, umi_1.publicKey)(x.marginfiAccount)))).filter((x) => x.lendingAccount.balances.find((y) => y.bankPk.toString() !== web3_js_1.PublicKey.default.toString() &&
|
57
59
|
(Math.round((0, numberUtils_1.bytesToI80F48)(y.assetShares.value)) != 0 ||
|
@@ -114,10 +116,10 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
114
116
|
? this.marginfiAccount
|
115
117
|
: (0, umi_1.publicKey)(this.marginfiAccount),
|
116
118
|
supplyMint: (0, umi_1.publicKey)(this.supplyMint),
|
117
|
-
supplyBank: (0, umi_1.publicKey)(this.
|
119
|
+
supplyBank: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.bank),
|
118
120
|
positionSupplyTa: (0, umi_1.publicKey)(this.positionSupplyTa),
|
119
121
|
debtMint: (0, umi_1.publicKey)(this.debtMint),
|
120
|
-
debtBank: (0, umi_1.publicKey)(this.
|
122
|
+
debtBank: (0, umi_1.publicKey)(this.marginfiDebtAccounts.bank),
|
121
123
|
positionDebtTa: (0, umi_1.publicKey)(this.positionDebtTa),
|
122
124
|
signerDebtTa: signerDebtTa,
|
123
125
|
positionData: {
|
@@ -136,10 +138,10 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
136
138
|
marginfiProgram: (0, umi_1.publicKey)(marginfi_sdk_1.MARGINFI_PROGRAM_ID),
|
137
139
|
marginfiGroup: (0, umi_1.publicKey)(this.marginfiGroup),
|
138
140
|
marginfiAccount: (0, umi_1.publicKey)(this.marginfiAccount),
|
139
|
-
supplyBank: (0, umi_1.publicKey)(this.
|
140
|
-
supplyPriceOracle: (0, umi_1.publicKey)(this.
|
141
|
-
debtBank: (0, umi_1.publicKey)(this.
|
142
|
-
debtPriceOracle: (0, umi_1.publicKey)(this.
|
141
|
+
supplyBank: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.bank),
|
142
|
+
supplyPriceOracle: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.priceOracle),
|
143
|
+
debtBank: (0, umi_1.publicKey)(this.marginfiDebtAccounts.bank),
|
144
|
+
debtPriceOracle: (0, umi_1.publicKey)(this.marginfiDebtAccounts.priceOracle),
|
143
145
|
solautoPosition: (0, umi_1.publicKey)(this.solautoPosition),
|
144
146
|
});
|
145
147
|
}
|
@@ -161,8 +163,8 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
161
163
|
signerTokenAccount: (0, umi_1.publicKey)(this.signerSupplyTa),
|
162
164
|
marginfiAccount: (0, umi_1.publicKey)(this.marginfiAccountPk),
|
163
165
|
marginfiGroup: (0, umi_1.publicKey)(this.marginfiGroup),
|
164
|
-
bank: (0, umi_1.publicKey)(this.
|
165
|
-
bankLiquidityVault: (0, umi_1.publicKey)(this.
|
166
|
+
bank: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.bank),
|
167
|
+
bankLiquidityVault: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.liquidityVault),
|
166
168
|
});
|
167
169
|
}
|
168
170
|
case "Borrow": {
|
@@ -172,9 +174,9 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
172
174
|
destinationTokenAccount: (0, umi_1.publicKey)(this.signerDebtTa),
|
173
175
|
marginfiAccount: (0, umi_1.publicKey)(this.marginfiAccountPk),
|
174
176
|
marginfiGroup: (0, umi_1.publicKey)(this.marginfiGroup),
|
175
|
-
bank: (0, umi_1.publicKey)(this.
|
176
|
-
bankLiquidityVault: (0, umi_1.publicKey)(this.
|
177
|
-
bankLiquidityVaultAuthority: (0, umi_1.publicKey)(this.
|
177
|
+
bank: (0, umi_1.publicKey)(this.marginfiDebtAccounts.bank),
|
178
|
+
bankLiquidityVault: (0, umi_1.publicKey)(this.marginfiDebtAccounts.liquidityVault),
|
179
|
+
bankLiquidityVaultAuthority: (0, umi_1.publicKey)(this.marginfiDebtAccounts.vaultAuthority),
|
178
180
|
});
|
179
181
|
}
|
180
182
|
case "Repay": {
|
@@ -185,8 +187,8 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
185
187
|
signerTokenAccount: (0, umi_1.publicKey)(this.signerDebtTa),
|
186
188
|
marginfiAccount: (0, umi_1.publicKey)(this.marginfiAccountPk),
|
187
189
|
marginfiGroup: (0, umi_1.publicKey)(this.marginfiGroup),
|
188
|
-
bank: (0, umi_1.publicKey)(this.
|
189
|
-
bankLiquidityVault: (0, umi_1.publicKey)(this.
|
190
|
+
bank: (0, umi_1.publicKey)(this.marginfiDebtAccounts.bank),
|
191
|
+
bankLiquidityVault: (0, umi_1.publicKey)(this.marginfiDebtAccounts.liquidityVault),
|
190
192
|
});
|
191
193
|
}
|
192
194
|
case "Withdraw": {
|
@@ -197,9 +199,9 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
197
199
|
destinationTokenAccount: (0, umi_1.publicKey)(this.signerSupplyTa),
|
198
200
|
marginfiAccount: (0, umi_1.publicKey)(this.marginfiAccountPk),
|
199
201
|
marginfiGroup: (0, umi_1.publicKey)(this.marginfiGroup),
|
200
|
-
bank: (0, umi_1.publicKey)(this.
|
201
|
-
bankLiquidityVault: (0, umi_1.publicKey)(this.
|
202
|
-
bankLiquidityVaultAuthority: (0, umi_1.publicKey)(this.
|
202
|
+
bank: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.bank),
|
203
|
+
bankLiquidityVault: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.liquidityVault),
|
204
|
+
bankLiquidityVaultAuthority: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.vaultAuthority),
|
203
205
|
});
|
204
206
|
}
|
205
207
|
}
|
@@ -212,8 +214,8 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
212
214
|
positionSupplyTa = (0, umi_1.publicKey)(args.__kind === "Withdraw" || this.selfManaged
|
213
215
|
? this.signerSupplyTa
|
214
216
|
: this.positionSupplyTa);
|
215
|
-
vaultSupplyTa = (0, umi_1.publicKey)(this.
|
216
|
-
supplyVaultAuthority = (0, umi_1.publicKey)(this.
|
217
|
+
vaultSupplyTa = (0, umi_1.publicKey)(this.marginfiSupplyAccounts.liquidityVault);
|
218
|
+
supplyVaultAuthority = (0, umi_1.publicKey)(this.marginfiSupplyAccounts.vaultAuthority);
|
217
219
|
}
|
218
220
|
let positionDebtTa = undefined;
|
219
221
|
let vaultDebtTa = undefined;
|
@@ -222,14 +224,14 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
222
224
|
positionDebtTa = (0, umi_1.publicKey)(args.__kind === "Borrow" || this.selfManaged
|
223
225
|
? this.signerDebtTa
|
224
226
|
: this.positionDebtTa);
|
225
|
-
vaultDebtTa = (0, umi_1.publicKey)(this.
|
226
|
-
debtVaultAuthority = (0, umi_1.publicKey)(this.
|
227
|
+
vaultDebtTa = (0, umi_1.publicKey)(this.marginfiDebtAccounts.liquidityVault);
|
228
|
+
debtVaultAuthority = (0, umi_1.publicKey)(this.marginfiDebtAccounts.vaultAuthority);
|
227
229
|
}
|
228
230
|
let supplyPriceOracle = undefined;
|
229
231
|
let debtPriceOracle = undefined;
|
230
232
|
if (args.__kind === "Withdraw" || args.__kind === "Borrow") {
|
231
|
-
supplyPriceOracle = (0, umi_1.publicKey)(this.
|
232
|
-
debtPriceOracle = (0, umi_1.publicKey)(this.
|
233
|
+
supplyPriceOracle = (0, umi_1.publicKey)(this.marginfiSupplyAccounts.priceOracle);
|
234
|
+
debtPriceOracle = (0, umi_1.publicKey)(this.marginfiDebtAccounts.priceOracle);
|
233
235
|
}
|
234
236
|
return (0, generated_1.marginfiProtocolInteraction)(this.umi, {
|
235
237
|
signer: this.signer,
|
@@ -237,12 +239,12 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
237
239
|
solautoPosition: (0, umi_1.publicKey)(this.solautoPosition),
|
238
240
|
marginfiGroup: (0, umi_1.publicKey)(this.marginfiGroup),
|
239
241
|
marginfiAccount: (0, umi_1.publicKey)(this.marginfiAccountPk),
|
240
|
-
supplyBank: (0, umi_1.publicKey)(this.
|
242
|
+
supplyBank: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.bank),
|
241
243
|
supplyPriceOracle,
|
242
244
|
positionSupplyTa,
|
243
245
|
vaultSupplyTa,
|
244
246
|
supplyVaultAuthority,
|
245
|
-
debtBank: (0, umi_1.publicKey)(this.
|
247
|
+
debtBank: (0, umi_1.publicKey)(this.marginfiDebtAccounts.bank),
|
246
248
|
debtPriceOracle,
|
247
249
|
positionDebtTa,
|
248
250
|
vaultDebtTa,
|
@@ -265,34 +267,34 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
265
267
|
ixsSysvar: (0, umi_1.publicKey)(web3_js_1.SYSVAR_INSTRUCTIONS_PUBKEY),
|
266
268
|
solautoFeesSupplyTa: rebalanceStep === "B" ? (0, umi_1.publicKey)(this.solautoFeesSupplyTa) : undefined,
|
267
269
|
authorityReferralState: (0, umi_1.publicKey)(this.authorityReferralState),
|
268
|
-
referredBySupplyTa:
|
270
|
+
referredBySupplyTa: this.referredBySupplyTa
|
269
271
|
? (0, umi_1.publicKey)(this.referredBySupplyTa)
|
270
272
|
: undefined,
|
271
273
|
solautoPosition: (0, umi_1.publicKey)(this.solautoPosition),
|
272
274
|
marginfiGroup: (0, umi_1.publicKey)(this.marginfiGroup),
|
273
275
|
marginfiAccount: (0, umi_1.publicKey)(this.marginfiAccountPk),
|
274
276
|
intermediaryTa: (0, umi_1.publicKey)((0, accountUtils_1.getTokenAccount)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey), swapDetails.inputMint)),
|
275
|
-
supplyBank: (0, umi_1.publicKey)(this.
|
276
|
-
supplyPriceOracle: (0, umi_1.publicKey)(this.
|
277
|
+
supplyBank: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.bank),
|
278
|
+
supplyPriceOracle: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.priceOracle),
|
277
279
|
positionSupplyTa: (0, umi_1.publicKey)(this.positionSupplyTa),
|
278
280
|
signerSupplyTa: this.selfManaged
|
279
281
|
? (0, umi_1.publicKey)(this.signerSupplyTa)
|
280
282
|
: undefined,
|
281
283
|
vaultSupplyTa: needSupplyAccounts
|
282
|
-
? (0, umi_1.publicKey)(this.
|
284
|
+
? (0, umi_1.publicKey)(this.marginfiSupplyAccounts.liquidityVault)
|
283
285
|
: undefined,
|
284
286
|
supplyVaultAuthority: needSupplyAccounts
|
285
|
-
? (0, umi_1.publicKey)(this.
|
287
|
+
? (0, umi_1.publicKey)(this.marginfiSupplyAccounts.vaultAuthority)
|
286
288
|
: undefined,
|
287
|
-
debtBank: (0, umi_1.publicKey)(this.
|
288
|
-
debtPriceOracle: (0, umi_1.publicKey)(this.
|
289
|
+
debtBank: (0, umi_1.publicKey)(this.marginfiDebtAccounts.bank),
|
290
|
+
debtPriceOracle: (0, umi_1.publicKey)(this.marginfiDebtAccounts.priceOracle),
|
289
291
|
positionDebtTa: (0, umi_1.publicKey)(this.positionDebtTa),
|
290
292
|
signerDebtTa: this.selfManaged ? (0, umi_1.publicKey)(this.signerDebtTa) : undefined,
|
291
293
|
vaultDebtTa: needDebtAccounts
|
292
|
-
? (0, umi_1.publicKey)(this.
|
294
|
+
? (0, umi_1.publicKey)(this.marginfiDebtAccounts.liquidityVault)
|
293
295
|
: undefined,
|
294
296
|
debtVaultAuthority: needDebtAccounts
|
295
|
-
? (0, umi_1.publicKey)(this.
|
297
|
+
? (0, umi_1.publicKey)(this.marginfiDebtAccounts.vaultAuthority)
|
296
298
|
: undefined,
|
297
299
|
rebalanceType,
|
298
300
|
targetLiqUtilizationRateBps: targetLiqUtilizationRateBps ?? null,
|
@@ -301,8 +303,8 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
301
303
|
}
|
302
304
|
flashBorrow(flashLoanDetails, destinationTokenAccount) {
|
303
305
|
const bank = flashLoanDetails.mint.equals(this.supplyMint)
|
304
|
-
? this.
|
305
|
-
: this.
|
306
|
+
? this.marginfiSupplyAccounts
|
307
|
+
: this.marginfiDebtAccounts;
|
306
308
|
return (0, umi_1.transactionBuilder)()
|
307
309
|
.add((0, marginfi_sdk_1.lendingAccountStartFlashloan)(this.umi, {
|
308
310
|
endIndex: 0,
|
@@ -323,8 +325,8 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
323
325
|
}
|
324
326
|
flashRepay(flashLoanDetails) {
|
325
327
|
const bank = flashLoanDetails.mint.equals(this.supplyMint)
|
326
|
-
? this.
|
327
|
-
: this.
|
328
|
+
? this.marginfiSupplyAccounts
|
329
|
+
: this.marginfiDebtAccounts;
|
328
330
|
const remainingAccounts = [];
|
329
331
|
let includedFlashLoanToken = false;
|
330
332
|
if (this.intermediaryMarginfiAccount) {
|
@@ -340,7 +342,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
340
342
|
isWritable: false,
|
341
343
|
},
|
342
344
|
{
|
343
|
-
pubkey: (0, umi_1.publicKey)((0, marginfiUtils_1.
|
345
|
+
pubkey: (0, umi_1.publicKey)((0, marginfiUtils_1.findMarginfiAccounts)({ bank: x.bankPk.toString() })
|
344
346
|
.priceOracle),
|
345
347
|
isSigner: false,
|
346
348
|
isWritable: false,
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import {
|
1
|
+
import { MarginfiAssetAccounts } from "../types/accounts";
|
2
2
|
export declare const DEFAULT_MARGINFI_GROUP = "4qp6Fx6tnZkY5Wropq9wUYgtFxXKwE6viZxFHg3rdAG8";
|
3
3
|
export declare const MARGINFI_ACCOUNTS: {
|
4
|
-
[key: string]:
|
4
|
+
[key: string]: MarginfiAssetAccounts;
|
5
5
|
};
|
6
6
|
export declare const MARGINFI_ACCOUNTS_LOOKUP_TABLE = "GAjmWmBPcH5Gxbiykasydj6RsCEaCLyHEvK6kHdFigc6";
|
7
7
|
//# sourceMappingURL=marginfiAccounts.d.ts.map
|
@@ -114,7 +114,7 @@ function marginfiRebalance(context, input) {
|
|
114
114
|
},
|
115
115
|
supplyVaultAuthority: {
|
116
116
|
index: 17,
|
117
|
-
isWritable:
|
117
|
+
isWritable: true,
|
118
118
|
value: input.supplyVaultAuthority ?? null,
|
119
119
|
},
|
120
120
|
debtBank: {
|
@@ -144,7 +144,7 @@ function marginfiRebalance(context, input) {
|
|
144
144
|
},
|
145
145
|
debtVaultAuthority: {
|
146
146
|
index: 23,
|
147
|
-
isWritable:
|
147
|
+
isWritable: true,
|
148
148
|
value: input.debtVaultAuthority ?? null,
|
149
149
|
},
|
150
150
|
};
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionsManager.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EAGvB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAKzD,OAAO,EACL,aAAa,EAEd,MAAM,uBAAuB,CAAC;AAK/B,cAAM,YAAY;IAIJ,OAAO,CAAC,MAAM;IAH1B,WAAW,EAAE,MAAM,EAAE,CAAM;IAC3B,KAAK,EAAE,uBAAuB,EAAE,CAAM;gBAElB,MAAM,EAAE,aAAa;IAInC,YAAY,CAChB,mBAAmB,EAAE,MAAM,EAAE,GAC5B,OAAO,CAAC,uBAAuB,EAAE,CAAC;CAqBtC;AAED,qBAAa,eAAe;IAKjB,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CACV;QAAE,EAAE,EAAE,kBAAkB,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CACxE;IACM,IAAI,CAAC;IATd,oBAAoB,EAAG,MAAM,EAAE,CAAC;IAChC,EAAE,CAAC,EAAE,kBAAkB,CAAC;gBAGf,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CACV;QAAE,EAAE,EAAE,kBAAkB,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CACxE,EACM,IAAI,CAAC,oBAAQ;IAGhB,UAAU;IAIV,OAAO,CAAC,UAAU,EAAE,MAAM;IAMhC,cAAc,IAAI,MAAM,EAAE;CAY3B;AAED,cAAM,cAAc;IAEhB,OAAO,CAAC,MAAM;IACP,YAAY,EAAE,YAAY;IAC1B,KAAK,EAAE,eAAe,EAAE;gBAFvB,MAAM,EAAE,aAAa,EACtB,YAAY,EAAE,YAAY,EAC1B,KAAK,GAAE,eAAe,EAAO;IAGhC,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BvD,GAAG,CAAC,GAAG,KAAK,EAAE,eAAe,EAAE;IAMzB,UAAU,CAAC,UAAU,EAAE,MAAM;IAO7B,oBAAoB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAYzD,YAAY,IAAI,MAAM,EAAE;IAMxB,IAAI,IAAI,MAAM;CAYf;AAED,oBAAY,iBAAiB;IAC3B,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,MAAM,WAAW;IACjB,UAAU,eAAe;CAC1B;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EAAE,CAAC;AAEJ,qBAAa,mBAAmB;IAK5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,aAAa,CAAC;IATxB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,YAAY,CAAe;gBAGzB,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,eAAe,EAAE,EACxB,cAAc,CAAC,6CAA4C,IAAI,aAAA,EAC/D,YAAY,CAAC,qBAAS,EACtB,YAAY,CAAC,qBAAS,EACtB,aAAa,CAAC,2BAAe;YAKzB,uBAAuB;IA0CrC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,MAAM;IAiB9D,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,kBAAkB;
|
1
|
+
{"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionsManager.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EAGvB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAKzD,OAAO,EACL,aAAa,EAEd,MAAM,uBAAuB,CAAC;AAK/B,cAAM,YAAY;IAIJ,OAAO,CAAC,MAAM;IAH1B,WAAW,EAAE,MAAM,EAAE,CAAM;IAC3B,KAAK,EAAE,uBAAuB,EAAE,CAAM;gBAElB,MAAM,EAAE,aAAa;IAInC,YAAY,CAChB,mBAAmB,EAAE,MAAM,EAAE,GAC5B,OAAO,CAAC,uBAAuB,EAAE,CAAC;CAqBtC;AAED,qBAAa,eAAe;IAKjB,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CACV;QAAE,EAAE,EAAE,kBAAkB,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CACxE;IACM,IAAI,CAAC;IATd,oBAAoB,EAAG,MAAM,EAAE,CAAC;IAChC,EAAE,CAAC,EAAE,kBAAkB,CAAC;gBAGf,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CACV;QAAE,EAAE,EAAE,kBAAkB,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CACxE,EACM,IAAI,CAAC,oBAAQ;IAGhB,UAAU;IAIV,OAAO,CAAC,UAAU,EAAE,MAAM;IAMhC,cAAc,IAAI,MAAM,EAAE;CAY3B;AAED,cAAM,cAAc;IAEhB,OAAO,CAAC,MAAM;IACP,YAAY,EAAE,YAAY;IAC1B,KAAK,EAAE,eAAe,EAAE;gBAFvB,MAAM,EAAE,aAAa,EACtB,YAAY,EAAE,YAAY,EAC1B,KAAK,GAAE,eAAe,EAAO;IAGhC,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BvD,GAAG,CAAC,GAAG,KAAK,EAAE,eAAe,EAAE;IAMzB,UAAU,CAAC,UAAU,EAAE,MAAM;IAO7B,oBAAoB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAYzD,YAAY,IAAI,MAAM,EAAE;IAMxB,IAAI,IAAI,MAAM;CAYf;AAED,oBAAY,iBAAiB;IAC3B,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,MAAM,WAAW;IACjB,UAAU,eAAe;CAC1B;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EAAE,CAAC;AAEJ,qBAAa,mBAAmB;IAK5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,aAAa,CAAC;IATxB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,YAAY,CAAe;gBAGzB,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,eAAe,EAAE,EACxB,cAAc,CAAC,6CAA4C,IAAI,aAAA,EAC/D,YAAY,CAAC,qBAAS,EACtB,YAAY,CAAC,qBAAS,EACtB,aAAa,CAAC,2BAAe;YAKzB,uBAAuB;IA0CrC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,MAAM;IAiB9D,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,kBAAkB;IAsB7D,IAAI;CAyJX"}
|
@@ -191,13 +191,12 @@ class TransactionsManager {
|
|
191
191
|
for (const ix of tx.getInstructions()) {
|
192
192
|
const ixAccounts = ix.keys.map((x) => x.pubkey);
|
193
193
|
const accountsNotInLut = ixAccounts.filter((x) => !lutAccounts.includes(x));
|
194
|
-
|
194
|
+
this.client.log(`Program ${ix.programId}, data len: ${ix.data.length}, LUT accounts data: ${ix.keys.filter((x) => lutAccounts.includes(x.pubkey)).length * 3}`);
|
195
195
|
if (accountsNotInLut.length > 0) {
|
196
|
-
|
196
|
+
this.client.log(`${accountsNotInLut.length} accounts not in LUT:`);
|
197
197
|
for (const key of accountsNotInLut) {
|
198
|
-
|
198
|
+
this.client.log(key.toString());
|
199
199
|
}
|
200
|
-
console.log(ix.keys.length);
|
201
200
|
}
|
202
201
|
}
|
203
202
|
}
|
@@ -290,7 +289,7 @@ class TransactionsManager {
|
|
290
289
|
const txSig = await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.client.umi, this.client.connection, tx, this.simulateOnly, attemptNum);
|
291
290
|
this.updateStatus(itemSet.name(), TransactionStatus.Successful, txSig ? bs58_1.default.encode(txSig) : undefined);
|
292
291
|
}
|
293
|
-
},
|
292
|
+
}, 4, 150, this.errorsToThrow);
|
294
293
|
}
|
295
294
|
}
|
296
295
|
if (!this.simulateOnly) {
|
package/dist/types/accounts.d.ts
CHANGED
@@ -94,7 +94,7 @@ function retryWithExponentialBackoff(fn, retries = 5, delay = 150, errorsToThrow
|
|
94
94
|
return;
|
95
95
|
}
|
96
96
|
if (attemptNum < retries) {
|
97
|
-
console.log(error
|
97
|
+
console.log(error);
|
98
98
|
setTimeout(() => {
|
99
99
|
console.log("Retrying...");
|
100
100
|
return attempt(attemptNum);
|
@@ -34,7 +34,7 @@ async function getJupSwapTransaction(signer, swapDetails, attemptNum) {
|
|
34
34
|
slippageBps: 10,
|
35
35
|
maxAccounts: 60,
|
36
36
|
}), 3);
|
37
|
-
const finalPriceSlippageBps = Math.round(Math.max(quoteResponse.slippageBps
|
37
|
+
const finalPriceSlippageBps = Math.round(Math.max(quoteResponse.slippageBps, Math.round((0, numberUtils_1.toBps)(parseFloat(quoteResponse.priceImpactPct))) + 1) *
|
38
38
|
(1 + (swapDetails.slippageBpsIncFactor ?? 0)));
|
39
39
|
quoteResponse.slippageBps = finalPriceSlippageBps;
|
40
40
|
console.log(quoteResponse);
|
@@ -1,14 +1,20 @@
|
|
1
1
|
import { PublicKey } from "@solana/web3.js";
|
2
2
|
import { Umi } from "@metaplex-foundation/umi";
|
3
3
|
import { Bank } from "../marginfi-sdk";
|
4
|
-
import {
|
4
|
+
import { MarginfiAssetAccounts } from "../types/accounts";
|
5
5
|
import { PositionState } from "../generated";
|
6
6
|
import { LivePositionUpdates } from "./solauto/generalUtils";
|
7
|
-
export declare function
|
7
|
+
export declare function findMarginfiAccounts({ mint, bank, }: {
|
8
8
|
mint?: string;
|
9
9
|
bank?: string;
|
10
|
-
}):
|
11
|
-
export declare function getMaxLtvAndLiqThreshold(
|
10
|
+
}): MarginfiAssetAccounts;
|
11
|
+
export declare function getMaxLtvAndLiqThreshold(umi: Umi, supply: {
|
12
|
+
mint: PublicKey;
|
13
|
+
bank: Bank | null;
|
14
|
+
}, debt: {
|
15
|
+
mint: PublicKey;
|
16
|
+
bank: Bank | null;
|
17
|
+
}, supplyPrice?: number): Promise<[number, number]>;
|
12
18
|
export declare function getAllMarginfiAccountsByAuthority(umi: Umi, authority: PublicKey, compatibleWithSolauto?: boolean): Promise<{
|
13
19
|
marginfiAccount: PublicKey;
|
14
20
|
supplyMint?: PublicKey;
|
@@ -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,
|
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,EAAE,IAAI,GAAG,IAAI,CAAC;CACnB,EACD,IAAI,EAAE;IACJ,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CACnB,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,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.getUpToDateShareValues = exports.getMarginfiAccountPositionState = exports.getAllMarginfiAccountsByAuthority = exports.getMaxLtvAndLiqThreshold = exports.
|
3
|
+
exports.getUpToDateShareValues = exports.getMarginfiAccountPositionState = exports.getAllMarginfiAccountsByAuthority = exports.getMaxLtvAndLiqThreshold = exports.findMarginfiAccounts = void 0;
|
4
4
|
const web3_js_1 = require("@solana/web3.js");
|
5
5
|
const umi_1 = require("@metaplex-foundation/umi");
|
6
6
|
const umi_web3js_adapters_1 = require("@metaplex-foundation/umi-web3js-adapters");
|
@@ -11,7 +11,7 @@ const solautoConstants_1 = require("../constants/solautoConstants");
|
|
11
11
|
const marginfiAccounts_1 = require("../constants/marginfiAccounts");
|
12
12
|
const generalAccounts_1 = require("../constants/generalAccounts");
|
13
13
|
const solanaUtils_1 = require("./solanaUtils");
|
14
|
-
function
|
14
|
+
function findMarginfiAccounts({ mint, bank, }) {
|
15
15
|
for (const key in marginfiAccounts_1.MARGINFI_ACCOUNTS) {
|
16
16
|
const account = marginfiAccounts_1.MARGINFI_ACCOUNTS[key];
|
17
17
|
if (mint && account.mint.toString().toLowerCase() === mint.toLowerCase()) {
|
@@ -23,24 +23,36 @@ function findMarginfiBankAccounts({ mint, bank, }) {
|
|
23
23
|
}
|
24
24
|
throw new Error(`Marginfi accounts not found by the mint: ${mint}`);
|
25
25
|
}
|
26
|
-
exports.
|
27
|
-
async function getMaxLtvAndLiqThreshold(
|
26
|
+
exports.findMarginfiAccounts = findMarginfiAccounts;
|
27
|
+
async function getMaxLtvAndLiqThreshold(umi, supply, debt, supplyPrice) {
|
28
|
+
if (!supply.bank) {
|
29
|
+
supply.bank = await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(findMarginfiAccounts({
|
30
|
+
mint: supply.mint.toString(),
|
31
|
+
}).bank));
|
32
|
+
}
|
33
|
+
if (!debt.bank && !debt.mint.equals(web3_js_1.PublicKey.default)) {
|
34
|
+
debt.bank = await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(findMarginfiAccounts({
|
35
|
+
mint: debt.mint.toString(),
|
36
|
+
}).bank));
|
37
|
+
}
|
28
38
|
if (!supplyPrice) {
|
29
|
-
const [price] = await (0, generalUtils_1.getTokenPrices)([
|
39
|
+
const [price] = await (0, generalUtils_1.getTokenPrices)([
|
40
|
+
(0, umi_web3js_adapters_1.toWeb3JsPublicKey)(supply.bank.mint),
|
41
|
+
]);
|
30
42
|
supplyPrice = price;
|
31
43
|
}
|
32
|
-
if (
|
44
|
+
if (debt.bank === null) {
|
33
45
|
return [0, 0];
|
34
46
|
}
|
35
|
-
let maxLtv = (0, numberUtils_1.bytesToI80F48)(
|
36
|
-
(0, numberUtils_1.bytesToI80F48)(
|
37
|
-
const liqThreshold = (0, numberUtils_1.bytesToI80F48)(
|
38
|
-
(0, numberUtils_1.bytesToI80F48)(
|
39
|
-
const totalDepositedUsdValue = (0, numberUtils_1.fromBaseUnit)(BigInt(Math.round((0, numberUtils_1.bytesToI80F48)(
|
40
|
-
(0, numberUtils_1.bytesToI80F48)(
|
41
|
-
if (
|
42
|
-
totalDepositedUsdValue >
|
43
|
-
const discount = Number(
|
47
|
+
let maxLtv = (0, numberUtils_1.bytesToI80F48)(supply.bank.config.assetWeightInit.value) /
|
48
|
+
(0, numberUtils_1.bytesToI80F48)(debt.bank.config.liabilityWeightInit.value);
|
49
|
+
const liqThreshold = (0, numberUtils_1.bytesToI80F48)(supply.bank.config.assetWeightMaint.value) /
|
50
|
+
(0, numberUtils_1.bytesToI80F48)(debt.bank.config.liabilityWeightMaint.value);
|
51
|
+
const totalDepositedUsdValue = (0, numberUtils_1.fromBaseUnit)(BigInt(Math.round((0, numberUtils_1.bytesToI80F48)(supply.bank.totalAssetShares.value) *
|
52
|
+
(0, numberUtils_1.bytesToI80F48)(supply.bank.assetShareValue.value))), supply.bank.mintDecimals) * supplyPrice;
|
53
|
+
if (supply.bank.config.totalAssetValueInitLimit !== BigInt(0) &&
|
54
|
+
totalDepositedUsdValue > supply.bank.config.totalAssetValueInitLimit) {
|
55
|
+
const discount = Number(supply.bank.config.totalAssetValueInitLimit) /
|
44
56
|
totalDepositedUsdValue;
|
45
57
|
maxLtv = Math.round(maxLtv * Number(discount));
|
46
58
|
}
|
@@ -106,13 +118,16 @@ async function getTokenUsage(umi, bank, isAsset, shares, amountUsedAdjustment) {
|
|
106
118
|
decimals: bank?.mintDecimals ?? 0,
|
107
119
|
amountUsed: {
|
108
120
|
baseUnit: BigInt(Math.round(amountUsed)),
|
109
|
-
baseAmountUsdValue: bank
|
110
|
-
|
121
|
+
baseAmountUsdValue: bank
|
122
|
+
? (0, numberUtils_1.toBaseUnit)((0, numberUtils_1.fromBaseUnit)(BigInt(Math.round(amountUsed)), bank.mintDecimals) *
|
123
|
+
marketPrice, generalAccounts_1.USD_DECIMALS)
|
124
|
+
: BigInt(0),
|
111
125
|
},
|
112
126
|
amountCanBeUsed: {
|
113
127
|
baseUnit: BigInt(Math.round(amountCanBeUsed)),
|
114
|
-
baseAmountUsdValue: bank
|
115
|
-
|
128
|
+
baseAmountUsdValue: bank
|
129
|
+
? (0, numberUtils_1.toBaseUnit)((0, numberUtils_1.fromBaseUnit)(BigInt(Math.round(amountCanBeUsed)), bank.mintDecimals) * marketPrice, generalAccounts_1.USD_DECIMALS)
|
130
|
+
: BigInt(0),
|
116
131
|
},
|
117
132
|
baseAmountMarketPriceUsd: (0, numberUtils_1.toBaseUnit)(marketPrice, generalAccounts_1.USD_DECIMALS),
|
118
133
|
flashLoanFeeBps: 0,
|
@@ -125,10 +140,10 @@ async function getTokenUsage(umi, bank, isAsset, shares, amountUsedAdjustment) {
|
|
125
140
|
async function getMarginfiAccountPositionState(umi, marginfiAccountPk, supplyMint, debtMint, livePositionUpdates) {
|
126
141
|
let marginfiAccount = await (0, marginfi_sdk_1.safeFetchMarginfiAccount)(umi, (0, umi_1.publicKey)(marginfiAccountPk));
|
127
142
|
let supplyBank = supplyMint && supplyMint !== web3_js_1.PublicKey.default
|
128
|
-
? await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(
|
143
|
+
? await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(findMarginfiAccounts({ mint: supplyMint.toString() }).bank))
|
129
144
|
: null;
|
130
145
|
let debtBank = debtMint && debtMint !== web3_js_1.PublicKey.default
|
131
|
-
? await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(
|
146
|
+
? await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(findMarginfiAccounts({ mint: debtMint.toString() }).bank))
|
132
147
|
: null;
|
133
148
|
let supplyUsage = undefined;
|
134
149
|
let debtUsage = undefined;
|
@@ -169,7 +184,13 @@ async function getMarginfiAccountPositionState(umi, marginfiAccountPk, supplyMin
|
|
169
184
|
debtUsage = await getTokenUsage(umi, debtBank, false, 0, livePositionUpdates?.debtAdjustment);
|
170
185
|
}
|
171
186
|
const supplyPrice = solautoConstants_1.PRICES[supplyMint.toString()].price;
|
172
|
-
let [maxLtv, liqThreshold] = await getMaxLtvAndLiqThreshold(
|
187
|
+
let [maxLtv, liqThreshold] = await getMaxLtvAndLiqThreshold(umi, {
|
188
|
+
mint: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(supplyBank.mint),
|
189
|
+
bank: supplyBank,
|
190
|
+
}, {
|
191
|
+
mint: debtBank ? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(debtBank.mint) : web3_js_1.PublicKey.default,
|
192
|
+
bank: debtBank,
|
193
|
+
}, supplyPrice);
|
173
194
|
const supplyUsd = (0, numberUtils_1.fromBaseUnit)(supplyUsage.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS);
|
174
195
|
const debtUsd = (0, numberUtils_1.fromBaseUnit)(debtUsage?.amountUsed?.baseAmountUsdValue ?? BigInt(0), generalAccounts_1.USD_DECIMALS);
|
175
196
|
return {
|
package/package.json
CHANGED
@@ -13,7 +13,7 @@ import {
|
|
13
13
|
} from "@metaplex-foundation/umi";
|
14
14
|
import { PublicKey, SYSVAR_INSTRUCTIONS_PUBKEY } from "@solana/web3.js";
|
15
15
|
import { SolautoClient, SolautoClientArgs } from "./solautoClient";
|
16
|
-
import {
|
16
|
+
import { MarginfiAssetAccounts } from "../types/accounts";
|
17
17
|
import {
|
18
18
|
DEFAULT_MARGINFI_GROUP,
|
19
19
|
MARGINFI_ACCOUNTS_LOOKUP_TABLE,
|
@@ -48,7 +48,7 @@ import {
|
|
48
48
|
import { JupSwapDetails } from "../utils/jupiterUtils";
|
49
49
|
import { FlashLoanDetails } from "../utils/solauto/rebalanceUtils";
|
50
50
|
import {
|
51
|
-
|
51
|
+
findMarginfiAccounts,
|
52
52
|
getAllMarginfiAccountsByAuthority,
|
53
53
|
getMarginfiAccountPositionState,
|
54
54
|
} from "../utils/marginfiUtils";
|
@@ -70,8 +70,8 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
70
70
|
public marginfiAccountPk!: PublicKey;
|
71
71
|
public marginfiGroup!: PublicKey;
|
72
72
|
|
73
|
-
public
|
74
|
-
public
|
73
|
+
public marginfiSupplyAccounts!: MarginfiAssetAccounts;
|
74
|
+
public marginfiDebtAccounts!: MarginfiAssetAccounts;
|
75
75
|
|
76
76
|
// For flash loans
|
77
77
|
public intermediaryMarginfiAccountSigner?: Signer;
|
@@ -107,10 +107,10 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
107
107
|
? toWeb3JsPublicKey(marginfiAccountData.group)
|
108
108
|
: args.marginfiGroup ?? new PublicKey(DEFAULT_MARGINFI_GROUP);
|
109
109
|
|
110
|
-
this.
|
110
|
+
this.marginfiSupplyAccounts = findMarginfiAccounts({
|
111
111
|
mint: this.supplyMint.toString(),
|
112
112
|
})!;
|
113
|
-
this.
|
113
|
+
this.marginfiDebtAccounts = findMarginfiAccounts({
|
114
114
|
mint: this.debtMint.toString(),
|
115
115
|
})!;
|
116
116
|
|
@@ -127,7 +127,11 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
127
127
|
toWeb3JsPublicKey(this.signer.publicKey),
|
128
128
|
false
|
129
129
|
)
|
130
|
-
)
|
130
|
+
)
|
131
|
+
.filter((x) => !x.marginfiAccount.equals(this.marginfiAccountPk))
|
132
|
+
.sort((a, b) =>
|
133
|
+
a.marginfiAccount.toString().localeCompare(b.marginfiAccount.toString())
|
134
|
+
);
|
131
135
|
const emptyMarginfiAccounts =
|
132
136
|
existingMarginfiAccounts.length > 0
|
133
137
|
? (
|
@@ -216,10 +220,10 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
216
220
|
? (this.marginfiAccount as Signer)
|
217
221
|
: publicKey(this.marginfiAccount),
|
218
222
|
supplyMint: publicKey(this.supplyMint),
|
219
|
-
supplyBank: publicKey(this.
|
223
|
+
supplyBank: publicKey(this.marginfiSupplyAccounts.bank),
|
220
224
|
positionSupplyTa: publicKey(this.positionSupplyTa),
|
221
225
|
debtMint: publicKey(this.debtMint),
|
222
|
-
debtBank: publicKey(this.
|
226
|
+
debtBank: publicKey(this.marginfiDebtAccounts.bank),
|
223
227
|
positionDebtTa: publicKey(this.positionDebtTa),
|
224
228
|
signerDebtTa: signerDebtTa,
|
225
229
|
positionData: {
|
@@ -239,10 +243,10 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
239
243
|
marginfiProgram: publicKey(MARGINFI_PROGRAM_ID),
|
240
244
|
marginfiGroup: publicKey(this.marginfiGroup),
|
241
245
|
marginfiAccount: publicKey(this.marginfiAccount),
|
242
|
-
supplyBank: publicKey(this.
|
243
|
-
supplyPriceOracle: publicKey(this.
|
244
|
-
debtBank: publicKey(this.
|
245
|
-
debtPriceOracle: publicKey(this.
|
246
|
+
supplyBank: publicKey(this.marginfiSupplyAccounts.bank),
|
247
|
+
supplyPriceOracle: publicKey(this.marginfiSupplyAccounts.priceOracle),
|
248
|
+
debtBank: publicKey(this.marginfiDebtAccounts.bank),
|
249
|
+
debtPriceOracle: publicKey(this.marginfiDebtAccounts.priceOracle),
|
246
250
|
solautoPosition: publicKey(this.solautoPosition),
|
247
251
|
});
|
248
252
|
}
|
@@ -266,9 +270,9 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
266
270
|
signerTokenAccount: publicKey(this.signerSupplyTa),
|
267
271
|
marginfiAccount: publicKey(this.marginfiAccountPk),
|
268
272
|
marginfiGroup: publicKey(this.marginfiGroup),
|
269
|
-
bank: publicKey(this.
|
273
|
+
bank: publicKey(this.marginfiSupplyAccounts.bank),
|
270
274
|
bankLiquidityVault: publicKey(
|
271
|
-
this.
|
275
|
+
this.marginfiSupplyAccounts.liquidityVault
|
272
276
|
),
|
273
277
|
});
|
274
278
|
}
|
@@ -279,12 +283,12 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
279
283
|
destinationTokenAccount: publicKey(this.signerDebtTa),
|
280
284
|
marginfiAccount: publicKey(this.marginfiAccountPk),
|
281
285
|
marginfiGroup: publicKey(this.marginfiGroup),
|
282
|
-
bank: publicKey(this.
|
286
|
+
bank: publicKey(this.marginfiDebtAccounts.bank),
|
283
287
|
bankLiquidityVault: publicKey(
|
284
|
-
this.
|
288
|
+
this.marginfiDebtAccounts.liquidityVault
|
285
289
|
),
|
286
290
|
bankLiquidityVaultAuthority: publicKey(
|
287
|
-
this.
|
291
|
+
this.marginfiDebtAccounts.vaultAuthority
|
288
292
|
),
|
289
293
|
});
|
290
294
|
}
|
@@ -297,9 +301,9 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
297
301
|
signerTokenAccount: publicKey(this.signerDebtTa),
|
298
302
|
marginfiAccount: publicKey(this.marginfiAccountPk),
|
299
303
|
marginfiGroup: publicKey(this.marginfiGroup),
|
300
|
-
bank: publicKey(this.
|
304
|
+
bank: publicKey(this.marginfiDebtAccounts.bank),
|
301
305
|
bankLiquidityVault: publicKey(
|
302
|
-
this.
|
306
|
+
this.marginfiDebtAccounts.liquidityVault
|
303
307
|
),
|
304
308
|
});
|
305
309
|
}
|
@@ -312,12 +316,12 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
312
316
|
destinationTokenAccount: publicKey(this.signerSupplyTa),
|
313
317
|
marginfiAccount: publicKey(this.marginfiAccountPk),
|
314
318
|
marginfiGroup: publicKey(this.marginfiGroup),
|
315
|
-
bank: publicKey(this.
|
319
|
+
bank: publicKey(this.marginfiSupplyAccounts.bank),
|
316
320
|
bankLiquidityVault: publicKey(
|
317
|
-
this.
|
321
|
+
this.marginfiSupplyAccounts.liquidityVault
|
318
322
|
),
|
319
323
|
bankLiquidityVaultAuthority: publicKey(
|
320
|
-
this.
|
324
|
+
this.marginfiSupplyAccounts.vaultAuthority
|
321
325
|
),
|
322
326
|
});
|
323
327
|
}
|
@@ -336,9 +340,9 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
336
340
|
? this.signerSupplyTa
|
337
341
|
: this.positionSupplyTa
|
338
342
|
);
|
339
|
-
vaultSupplyTa = publicKey(this.
|
343
|
+
vaultSupplyTa = publicKey(this.marginfiSupplyAccounts.liquidityVault);
|
340
344
|
supplyVaultAuthority = publicKey(
|
341
|
-
this.
|
345
|
+
this.marginfiSupplyAccounts.vaultAuthority
|
342
346
|
);
|
343
347
|
}
|
344
348
|
|
@@ -351,9 +355,9 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
351
355
|
? this.signerDebtTa
|
352
356
|
: this.positionDebtTa
|
353
357
|
);
|
354
|
-
vaultDebtTa = publicKey(this.
|
358
|
+
vaultDebtTa = publicKey(this.marginfiDebtAccounts.liquidityVault);
|
355
359
|
debtVaultAuthority = publicKey(
|
356
|
-
this.
|
360
|
+
this.marginfiDebtAccounts.vaultAuthority
|
357
361
|
);
|
358
362
|
}
|
359
363
|
|
@@ -361,9 +365,9 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
361
365
|
let debtPriceOracle: UmiPublicKey | undefined = undefined;
|
362
366
|
if (args.__kind === "Withdraw" || args.__kind === "Borrow") {
|
363
367
|
supplyPriceOracle = publicKey(
|
364
|
-
this.
|
368
|
+
this.marginfiSupplyAccounts.priceOracle
|
365
369
|
);
|
366
|
-
debtPriceOracle = publicKey(this.
|
370
|
+
debtPriceOracle = publicKey(this.marginfiDebtAccounts.priceOracle);
|
367
371
|
}
|
368
372
|
|
369
373
|
return marginfiProtocolInteraction(this.umi, {
|
@@ -372,12 +376,12 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
372
376
|
solautoPosition: publicKey(this.solautoPosition),
|
373
377
|
marginfiGroup: publicKey(this.marginfiGroup),
|
374
378
|
marginfiAccount: publicKey(this.marginfiAccountPk),
|
375
|
-
supplyBank: publicKey(this.
|
379
|
+
supplyBank: publicKey(this.marginfiSupplyAccounts.bank),
|
376
380
|
supplyPriceOracle,
|
377
381
|
positionSupplyTa,
|
378
382
|
vaultSupplyTa,
|
379
383
|
supplyVaultAuthority,
|
380
|
-
debtBank: publicKey(this.
|
384
|
+
debtBank: publicKey(this.marginfiDebtAccounts.bank),
|
381
385
|
debtPriceOracle,
|
382
386
|
positionDebtTa,
|
383
387
|
vaultDebtTa,
|
@@ -392,7 +396,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
392
396
|
rebalanceType: SolautoRebalanceTypeArgs,
|
393
397
|
flashLoan?: FlashLoanDetails,
|
394
398
|
targetLiqUtilizationRateBps?: number,
|
395
|
-
limitGapBps?: number
|
399
|
+
limitGapBps?: number
|
396
400
|
): TransactionBuilder {
|
397
401
|
const inputIsSupply = swapDetails.inputMint.equals(this.supplyMint);
|
398
402
|
const outputIsSupply = swapDetails.outputMint.equals(this.supplyMint);
|
@@ -412,10 +416,9 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
412
416
|
solautoFeesSupplyTa:
|
413
417
|
rebalanceStep === "B" ? publicKey(this.solautoFeesSupplyTa) : undefined,
|
414
418
|
authorityReferralState: publicKey(this.authorityReferralState),
|
415
|
-
referredBySupplyTa:
|
416
|
-
|
417
|
-
|
418
|
-
: undefined,
|
419
|
+
referredBySupplyTa: this.referredBySupplyTa
|
420
|
+
? publicKey(this.referredBySupplyTa)
|
421
|
+
: undefined,
|
419
422
|
solautoPosition: publicKey(this.solautoPosition),
|
420
423
|
marginfiGroup: publicKey(this.marginfiGroup),
|
421
424
|
marginfiAccount: publicKey(this.marginfiAccountPk),
|
@@ -425,27 +428,27 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
425
428
|
swapDetails.inputMint
|
426
429
|
)
|
427
430
|
),
|
428
|
-
supplyBank: publicKey(this.
|
429
|
-
supplyPriceOracle: publicKey(this.
|
431
|
+
supplyBank: publicKey(this.marginfiSupplyAccounts.bank),
|
432
|
+
supplyPriceOracle: publicKey(this.marginfiSupplyAccounts.priceOracle),
|
430
433
|
positionSupplyTa: publicKey(this.positionSupplyTa),
|
431
434
|
signerSupplyTa: this.selfManaged
|
432
435
|
? publicKey(this.signerSupplyTa)
|
433
436
|
: undefined,
|
434
437
|
vaultSupplyTa: needSupplyAccounts
|
435
|
-
? publicKey(this.
|
438
|
+
? publicKey(this.marginfiSupplyAccounts.liquidityVault)
|
436
439
|
: undefined,
|
437
440
|
supplyVaultAuthority: needSupplyAccounts
|
438
|
-
? publicKey(this.
|
441
|
+
? publicKey(this.marginfiSupplyAccounts.vaultAuthority)
|
439
442
|
: undefined,
|
440
|
-
debtBank: publicKey(this.
|
441
|
-
debtPriceOracle: publicKey(this.
|
443
|
+
debtBank: publicKey(this.marginfiDebtAccounts.bank),
|
444
|
+
debtPriceOracle: publicKey(this.marginfiDebtAccounts.priceOracle),
|
442
445
|
positionDebtTa: publicKey(this.positionDebtTa),
|
443
446
|
signerDebtTa: this.selfManaged ? publicKey(this.signerDebtTa) : undefined,
|
444
447
|
vaultDebtTa: needDebtAccounts
|
445
|
-
? publicKey(this.
|
448
|
+
? publicKey(this.marginfiDebtAccounts.liquidityVault)
|
446
449
|
: undefined,
|
447
450
|
debtVaultAuthority: needDebtAccounts
|
448
|
-
? publicKey(this.
|
451
|
+
? publicKey(this.marginfiDebtAccounts.vaultAuthority)
|
449
452
|
: undefined,
|
450
453
|
rebalanceType,
|
451
454
|
targetLiqUtilizationRateBps: targetLiqUtilizationRateBps ?? null,
|
@@ -458,8 +461,8 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
458
461
|
destinationTokenAccount: PublicKey
|
459
462
|
): TransactionBuilder {
|
460
463
|
const bank = flashLoanDetails.mint.equals(this.supplyMint)
|
461
|
-
? this.
|
462
|
-
: this.
|
464
|
+
? this.marginfiSupplyAccounts
|
465
|
+
: this.marginfiDebtAccounts;
|
463
466
|
return transactionBuilder()
|
464
467
|
.add(
|
465
468
|
lendingAccountStartFlashloan(this.umi, {
|
@@ -485,8 +488,8 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
485
488
|
|
486
489
|
flashRepay(flashLoanDetails: FlashLoanDetails): TransactionBuilder {
|
487
490
|
const bank = flashLoanDetails.mint.equals(this.supplyMint)
|
488
|
-
? this.
|
489
|
-
: this.
|
491
|
+
? this.marginfiSupplyAccounts
|
492
|
+
: this.marginfiDebtAccounts;
|
490
493
|
|
491
494
|
const remainingAccounts: AccountMeta[] = [];
|
492
495
|
let includedFlashLoanToken = false;
|
@@ -507,7 +510,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
507
510
|
},
|
508
511
|
{
|
509
512
|
pubkey: publicKey(
|
510
|
-
|
513
|
+
findMarginfiAccounts({ bank: x.bankPk.toString() })
|
511
514
|
.priceOracle
|
512
515
|
),
|
513
516
|
isSigner: false,
|
@@ -1,10 +1,10 @@
|
|
1
1
|
import { NATIVE_MINT } from "@solana/spl-token";
|
2
2
|
import { USDC_MINT } from "./tokenConstants";
|
3
|
-
import {
|
3
|
+
import { MarginfiAssetAccounts } from "../types/accounts";
|
4
4
|
|
5
5
|
export const DEFAULT_MARGINFI_GROUP = "4qp6Fx6tnZkY5Wropq9wUYgtFxXKwE6viZxFHg3rdAG8";
|
6
6
|
|
7
|
-
export const MARGINFI_ACCOUNTS: { [key: string]:
|
7
|
+
export const MARGINFI_ACCOUNTS: { [key: string]: MarginfiAssetAccounts } = {
|
8
8
|
SOL: {
|
9
9
|
mint: NATIVE_MINT.toString(),
|
10
10
|
bank: "CCKtUs6Cgwo4aaQUmBPmyoApH2gUDErxNZCAntD6LYGh",
|
@@ -206,7 +206,7 @@ export function marginfiRebalance(
|
|
206
206
|
},
|
207
207
|
supplyVaultAuthority: {
|
208
208
|
index: 17,
|
209
|
-
isWritable:
|
209
|
+
isWritable: true as boolean,
|
210
210
|
value: input.supplyVaultAuthority ?? null,
|
211
211
|
},
|
212
212
|
debtBank: {
|
@@ -236,7 +236,7 @@ export function marginfiRebalance(
|
|
236
236
|
},
|
237
237
|
debtVaultAuthority: {
|
238
238
|
index: 23,
|
239
|
-
isWritable:
|
239
|
+
isWritable: true as boolean,
|
240
240
|
value: input.debtVaultAuthority ?? null,
|
241
241
|
},
|
242
242
|
} satisfies ResolvedAccountsWithIndices;
|
@@ -265,19 +265,12 @@ export class TransactionsManager {
|
|
265
265
|
const accountsNotInLut = ixAccounts.filter(
|
266
266
|
(x) => !lutAccounts.includes(x)
|
267
267
|
);
|
268
|
-
|
269
|
-
"Program",
|
270
|
-
ix.programId,
|
271
|
-
" data ",
|
272
|
-
ix.data.length,
|
273
|
-
ix.keys.filter((x) => lutAccounts.includes(x.pubkey)).length * 3
|
274
|
-
);
|
268
|
+
this.client.log(`Program ${ix.programId}, data len: ${ix.data.length}, LUT accounts data: ${ix.keys.filter((x) => lutAccounts.includes(x.pubkey)).length * 3}`);
|
275
269
|
if (accountsNotInLut.length > 0) {
|
276
|
-
|
270
|
+
this.client.log(`${accountsNotInLut.length} accounts not in LUT:`);
|
277
271
|
for (const key of accountsNotInLut) {
|
278
|
-
|
272
|
+
this.client.log(key.toString());
|
279
273
|
}
|
280
|
-
console.log(ix.keys.length);
|
281
274
|
}
|
282
275
|
}
|
283
276
|
}
|
@@ -424,7 +417,7 @@ export class TransactionsManager {
|
|
424
417
|
);
|
425
418
|
}
|
426
419
|
},
|
427
|
-
|
420
|
+
4,
|
428
421
|
150,
|
429
422
|
this.errorsToThrow
|
430
423
|
);
|
package/src/types/accounts.ts
CHANGED
@@ -73,8 +73,8 @@ export async function getJupSwapTransaction(
|
|
73
73
|
|
74
74
|
const finalPriceSlippageBps = Math.round(
|
75
75
|
Math.max(
|
76
|
-
quoteResponse.slippageBps
|
77
|
-
Math.round(toBps(parseFloat(quoteResponse.priceImpactPct)))
|
76
|
+
quoteResponse.slippageBps,
|
77
|
+
Math.round(toBps(parseFloat(quoteResponse.priceImpactPct))) + 1
|
78
78
|
) *
|
79
79
|
(1 + (swapDetails.slippageBpsIncFactor ?? 0))
|
80
80
|
);
|
@@ -17,19 +17,19 @@ import {
|
|
17
17
|
} from "./numberUtils";
|
18
18
|
import { PRICES } from "../constants/solautoConstants";
|
19
19
|
import { MARGINFI_ACCOUNTS } from "../constants/marginfiAccounts";
|
20
|
-
import {
|
20
|
+
import { MarginfiAssetAccounts } from "../types/accounts";
|
21
21
|
import { PositionState, PositionTokenUsage } from "../generated";
|
22
22
|
import { USD_DECIMALS } from "../constants/generalAccounts";
|
23
23
|
import { LivePositionUpdates } from "./solauto/generalUtils";
|
24
24
|
import { currentUnixSecondsSolana } from "./solanaUtils";
|
25
25
|
|
26
|
-
export function
|
26
|
+
export function findMarginfiAccounts({
|
27
27
|
mint,
|
28
28
|
bank,
|
29
29
|
}: {
|
30
30
|
mint?: string;
|
31
31
|
bank?: string;
|
32
|
-
}):
|
32
|
+
}): MarginfiAssetAccounts {
|
33
33
|
for (const key in MARGINFI_ACCOUNTS) {
|
34
34
|
const account = MARGINFI_ACCOUNTS[key];
|
35
35
|
if (mint && account.mint.toString().toLowerCase() === mint.toLowerCase()) {
|
@@ -43,42 +43,73 @@ export function findMarginfiBankAccounts({
|
|
43
43
|
}
|
44
44
|
|
45
45
|
export async function getMaxLtvAndLiqThreshold(
|
46
|
-
|
47
|
-
|
46
|
+
umi: Umi,
|
47
|
+
supply: {
|
48
|
+
mint: PublicKey;
|
49
|
+
bank: Bank | null;
|
50
|
+
},
|
51
|
+
debt: {
|
52
|
+
mint: PublicKey;
|
53
|
+
bank: Bank | null;
|
54
|
+
},
|
48
55
|
supplyPrice?: number
|
49
56
|
): Promise<[number, number]> {
|
57
|
+
if (!supply.bank) {
|
58
|
+
supply.bank = await safeFetchBank(
|
59
|
+
umi,
|
60
|
+
publicKey(
|
61
|
+
findMarginfiAccounts({
|
62
|
+
mint: supply.mint.toString(),
|
63
|
+
}).bank
|
64
|
+
)
|
65
|
+
);
|
66
|
+
}
|
67
|
+
|
68
|
+
if (!debt.bank && !debt.mint.equals(PublicKey.default)) {
|
69
|
+
debt.bank = await safeFetchBank(
|
70
|
+
umi,
|
71
|
+
publicKey(
|
72
|
+
findMarginfiAccounts({
|
73
|
+
mint: debt.mint.toString(),
|
74
|
+
}).bank
|
75
|
+
)
|
76
|
+
);
|
77
|
+
}
|
78
|
+
|
50
79
|
if (!supplyPrice) {
|
51
|
-
const [price] = await getTokenPrices([
|
80
|
+
const [price] = await getTokenPrices([
|
81
|
+
toWeb3JsPublicKey(supply.bank!.mint),
|
82
|
+
]);
|
52
83
|
supplyPrice = price;
|
53
84
|
}
|
54
85
|
|
55
|
-
if (
|
86
|
+
if (debt.bank === null) {
|
56
87
|
return [0, 0];
|
57
88
|
}
|
58
89
|
|
59
90
|
let maxLtv =
|
60
|
-
bytesToI80F48(
|
61
|
-
bytesToI80F48(
|
91
|
+
bytesToI80F48(supply.bank!.config.assetWeightInit.value) /
|
92
|
+
bytesToI80F48(debt.bank.config.liabilityWeightInit.value);
|
62
93
|
const liqThreshold =
|
63
|
-
bytesToI80F48(
|
64
|
-
bytesToI80F48(
|
94
|
+
bytesToI80F48(supply.bank!.config.assetWeightMaint.value) /
|
95
|
+
bytesToI80F48(debt.bank.config.liabilityWeightMaint.value);
|
65
96
|
|
66
97
|
const totalDepositedUsdValue =
|
67
98
|
fromBaseUnit(
|
68
99
|
BigInt(
|
69
100
|
Math.round(
|
70
|
-
bytesToI80F48(
|
71
|
-
bytesToI80F48(
|
101
|
+
bytesToI80F48(supply.bank!.totalAssetShares.value) *
|
102
|
+
bytesToI80F48(supply.bank!.assetShareValue.value)
|
72
103
|
)
|
73
104
|
),
|
74
|
-
|
105
|
+
supply.bank!.mintDecimals
|
75
106
|
) * supplyPrice!;
|
76
107
|
if (
|
77
|
-
|
78
|
-
totalDepositedUsdValue >
|
108
|
+
supply.bank!.config.totalAssetValueInitLimit !== BigInt(0) &&
|
109
|
+
totalDepositedUsdValue > supply.bank!.config.totalAssetValueInitLimit
|
79
110
|
) {
|
80
111
|
const discount =
|
81
|
-
Number(
|
112
|
+
Number(supply.bank!.config.totalAssetValueInitLimit) /
|
82
113
|
totalDepositedUsdValue;
|
83
114
|
maxLtv = Math.round(maxLtv * Number(discount));
|
84
115
|
}
|
@@ -158,7 +189,7 @@ async function getTokenUsage(
|
|
158
189
|
);
|
159
190
|
const shareValue = isAsset ? assetShareValue : liabilityShareValue;
|
160
191
|
amountUsed = shares * shareValue + Number(amountUsedAdjustment ?? 0);
|
161
|
-
|
192
|
+
|
162
193
|
const totalDeposited =
|
163
194
|
bytesToI80F48(bank.totalAssetShares.value) * assetShareValue;
|
164
195
|
amountCanBeUsed = isAsset
|
@@ -172,19 +203,25 @@ async function getTokenUsage(
|
|
172
203
|
decimals: bank?.mintDecimals ?? 0,
|
173
204
|
amountUsed: {
|
174
205
|
baseUnit: BigInt(Math.round(amountUsed)),
|
175
|
-
baseAmountUsdValue: bank
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
206
|
+
baseAmountUsdValue: bank
|
207
|
+
? toBaseUnit(
|
208
|
+
fromBaseUnit(BigInt(Math.round(amountUsed)), bank.mintDecimals) *
|
209
|
+
marketPrice,
|
210
|
+
USD_DECIMALS
|
211
|
+
)
|
212
|
+
: BigInt(0),
|
180
213
|
},
|
181
214
|
amountCanBeUsed: {
|
182
215
|
baseUnit: BigInt(Math.round(amountCanBeUsed)),
|
183
|
-
baseAmountUsdValue: bank
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
216
|
+
baseAmountUsdValue: bank
|
217
|
+
? toBaseUnit(
|
218
|
+
fromBaseUnit(
|
219
|
+
BigInt(Math.round(amountCanBeUsed)),
|
220
|
+
bank.mintDecimals
|
221
|
+
) * marketPrice,
|
222
|
+
USD_DECIMALS
|
223
|
+
)
|
224
|
+
: BigInt(0),
|
188
225
|
},
|
189
226
|
baseAmountMarketPriceUsd: toBaseUnit(marketPrice, USD_DECIMALS),
|
190
227
|
flashLoanFeeBps: 0,
|
@@ -211,18 +248,14 @@ export async function getMarginfiAccountPositionState(
|
|
211
248
|
supplyMint && supplyMint !== PublicKey.default
|
212
249
|
? await safeFetchBank(
|
213
250
|
umi,
|
214
|
-
publicKey(
|
215
|
-
findMarginfiBankAccounts({ mint: supplyMint.toString() }).bank
|
216
|
-
)
|
251
|
+
publicKey(findMarginfiAccounts({ mint: supplyMint.toString() }).bank)
|
217
252
|
)
|
218
253
|
: null;
|
219
254
|
let debtBank: Bank | null =
|
220
255
|
debtMint && debtMint !== PublicKey.default
|
221
256
|
? await safeFetchBank(
|
222
257
|
umi,
|
223
|
-
publicKey(
|
224
|
-
findMarginfiBankAccounts({ mint: debtMint.toString() }).bank
|
225
|
-
)
|
258
|
+
publicKey(findMarginfiAccounts({ mint: debtMint.toString() }).bank)
|
226
259
|
)
|
227
260
|
: null;
|
228
261
|
|
@@ -306,8 +339,15 @@ export async function getMarginfiAccountPositionState(
|
|
306
339
|
|
307
340
|
const supplyPrice = PRICES[supplyMint!.toString()].price;
|
308
341
|
let [maxLtv, liqThreshold] = await getMaxLtvAndLiqThreshold(
|
309
|
-
|
310
|
-
|
342
|
+
umi,
|
343
|
+
{
|
344
|
+
mint: toWeb3JsPublicKey(supplyBank.mint),
|
345
|
+
bank: supplyBank,
|
346
|
+
},
|
347
|
+
{
|
348
|
+
mint: debtBank ? toWeb3JsPublicKey(debtBank.mint) : PublicKey.default,
|
349
|
+
bank: debtBank,
|
350
|
+
},
|
311
351
|
supplyPrice
|
312
352
|
);
|
313
353
|
const supplyUsd = fromBaseUnit(
|
@@ -111,11 +111,11 @@ describe("Solauto Marginfi tests", async () => {
|
|
111
111
|
// };
|
112
112
|
// }, "deposit")
|
113
113
|
// );
|
114
|
-
|
114
|
+
|
115
115
|
transactionItems.push(
|
116
116
|
new TransactionItem(
|
117
117
|
async (attemptNum) =>
|
118
|
-
await buildSolautoRebalanceTransaction(client,
|
118
|
+
await buildSolautoRebalanceTransaction(client, 5500, attemptNum),
|
119
119
|
"rebalance"
|
120
120
|
)
|
121
121
|
);
|